NCEPLIBS-bufr
11.7.0
|
Read/write an entire sequence of data values from/to a data subset. More...
Go to the source code of this file.
Functions/Subroutines | |
subroutine | ufbseq (LUNIN, USR, I1, I2, IRET, STR) |
This subroutine reads or writes an entire sequence of data values from or to the BUFR data subset that is currently open within the BUFRLIB internal arrays. More... | |
Read/write an entire sequence of data values from/to a data subset.
Definition in file ufbseq.f.
subroutine ufbseq | ( | LUNIN, | |
real*8, dimension(i1,i2) | USR, | ||
I1, | |||
I2, | |||
IRET, | |||
character*(*) | STR | ||
) |
This subroutine reads or writes an entire sequence of data values from or to the BUFR data subset that is currently open within the BUFRLIB internal arrays.
The direction of the data transfer is determined by the context of ABS(LUNIN):
This subroutine is specifically designed for use with a single Table A or Table D mnemonic. In the latter case, the mnemonic may be replicated within the overall subset definition, and in which case the subroutine will return all data values within all replications of the sequence defined by the mnemonic. But in either case, the mnemonic itself may contain, within its own sequence definition, any number of data values defined by Table B mnemonics and/or subsequences of data values defined by other Table D mnemonics, and any such subsequences may themselves be replicated using any manner of fixed or delayed replication. See DX BUFR Tables for more details including an example use case, and see also subroutines ufbint(), ufbrep() and ufbstp() which are also used to read/write one or more data values from/to a data subset but cannot themselves be directly used with Table A or Table D mnemonics.
[in] | LUNIN | – integer: Absolute value is Fortran logical unit number for BUFR file |
[in,out] | USR | – real*8(*,*): Data values
|
[in] | I1 | – integer: Actual first dimension of USR as allocated within the calling program |
[in] | I2 | – integer:
|
[out] | IRET | – integer: Number of replications of STR that were actually read/written from/to the data subset |
[in] | STR | – character*(*): String consisting of a single Table A or Table D mnemonic whose sequence definition is in one-to-one correspondence with the number of data values that will be read/written from/to the data subset within the first dimension of USR (see DX BUFR Tables for further information about Table A and Table D mnemonics) |
It is the user's responsibility to ensure that USR is dimensioned sufficiently large enough to accommodate the number of data values that are to be read from or written to the data subset. Note also that USR is an array of real*8 values; therefore, any data that are to be written out as character (i.e. CCITT IA5) values in BUFR must be converted from character into real*8 format within the application program before calling this subroutine. Conversely, when this subroutine is being used to read character values from a data subset, the value that is returned will be in real*8 format and must be converted back into character format by the application program before it can be used as such. Alternatively, there are different subroutines such as readlc() and writlc() which can be used to read/write character data directly from/to a data subset without the need to convert from/to real*8 format as an intermediate step.
Numeric (i.e. non-character) data values within USR are always in the exact units specified for the corresponding mnemonic within the relevant DX or master BUFR table, without any scale or reference values applied. Specifically, this means that, when writing data values into an output subset, the user only needs to store each respective value into USR using the units specified within the table, and the BUFRLIB software will take care of any necessary scaling or referencing of the value before it is actually encoded into BUFR. Conversely, when reading data values from an input subset, the values returned in USR are already de-scaled and de-referenced and, thus, are already in the exact units that were defined for the corresponding mnemonics within the table.
"Missing" values in USR are always denoted by a unique placeholder value. This placeholder value is initially set to a default value of 10E10_8, but it can be reset to any substitute value of the user's choice via a separate call to subroutine setbmiss(). In any case, and whenever this subroutine is used to read data values from an input subset, any returned value in USR can be easily checked for equivalence to the current placeholder value via a call to function ibfms(), and a positive result means that the value for the corresponding mnemonic was encoded as "missing" in BUFR (i.e. all bits set to 1) within the original data subset. Conversely, whenever this subroutine is used to write data values to an output subset, the current placeholder value can be obtained via a separate call to function getbmiss(), and the resulting value can then be stored into the USR array whereever the user desires a BUFR "missing" value (i.e. all bits set to 1) to be encoded for the corresponding mnemonic within the output subset.
Program history log:
Date | Programmer | Comments |
---|---|---|
2000-09-19 | J. Woollen | Original author |
2002-05-14 | J. Woollen | Improved generality; previously ufbseq would not recognize compressed delayed replication as a legitimate data structure |
2003-05-19 | J. Woollen | Corrected the logic array of exit conditions for the subroutine; previously, in some cases, proper exits were missed, generating bogus error messages |
2003-11-04 | S. Bender | Added remarks and routine interdependencies |
2003-11-04 | D. Keyser | Unified/portable for WRF; added documentation; outputs more complete diagnostic info when routine terminates abnormally |
2004-08-18 | J. Ator | Added SAVE for IFIRST1 and IFIRST2 flags |
2007-01-19 | J. Ator | Replaced call to parseq with call to parstr() |
2009-04-21 | J. Ator | Use errwrt() |
2014-09-10 | J. Ator | Fix bug involving nested delayed replication where first replication of outer sequence does not contain a replication of the inner sequence |
2014-12-10 | J. Ator | Use modules instead of COMMON blocks |
2020-03-06 | J. Ator | No longer abort when reading data and number of available levels is greater than I2; instead just return first I2 levels and print a diagnostic message |
Definition at line 142 of file ufbseq.f.
References bort(), errwrt(), invtag(), invwin(), parstr(), and status().