/wrfv2_fire/external/io_grib1/WGRIB/ensemble.c
C | 103 lines | 62 code | 17 blank | 24 comment | 52 complexity | 9fd31a082ce8abe133151d9c38bc19b8 MD5 | raw file
Possible License(s): AGPL-1.0
- #include <stdio.h>
- #include <stdlib.h>
- #include <stddef.h>
- #include <string.h>
- #include "grib.h"
- #include "pds4.h"
- #include "cnames.h"
- /*
- * ensemble.c v0.1 wesley ebisuzaki
- *
- * prints ensemble meta-data
- *
- * only for NCEP and ECMWF
- *
- * output format:
- *
- * ECMWF
- * ens=n/N: n: 0=ctl, +/-ve
- * N: total number of members
- *
- * NCEP
- * ens=n/type: n: 0=ctl, +/-ve, CLUST, PROD/
- * type: Mn, WtdMn, SDev, NSDev
- */
- extern int ncep_ens;
- void ensemble(unsigned char *pds, int mode) {
- int pdslen;
- unsigned char ctmp;
- char char_end;
- pdslen = PDS_LEN(pds);
- char_end = mode == 2 ? ' ' : ':';
- if ((PDS_Center(pds) == NMC || ncep_ens) && pdslen >= 45 && pds[40] == 1) {
- /* control run */
- if (pds[41] == 1) {
- if (mode != 2) {
- printf("ens%c0:", pds[42] == 1 ? '+' : '-');
- }
- else {
- printf("%s-res_ens_control ", pds[42] == 1 ? "hi" : "low");
- }
- }
- /* perturbation run */
- else if (pds[41] == 2 || pds[41] == 3) {
- if (mode != 2) {
- printf("ens%c%d:", pds[41] == 3 ? '+' : '-', pds[42]);
- }
- else {
- printf("ens_perturbation=%c%d ",pds[41] == 3 ? '+' : '-',
- pds[42]);
- }
- }
- /* ensemble mean */
- else if (pds[41] == 5) {
- /* makes no sense to say "ensemble mean" for prob forecasts */
- if (PDS_PARAM(pds) != 191 && PDS_PARAM(pds) != 192) {
- if (mode != 2 || pdslen < 61) {
- printf("ens-mean%c", char_end);
- }
- else {
- printf("ensemble-mean(%d members) ",pds[60]);
- }
- }
- }
- /* other case .. debug code */
- else {
- printf("ens %d/%d/%d/%d:", pds[41],pds[42],pds[43],pds[44]);
- }
- /* NCEP probability limits */
- if ((PDS_PARAM(pds) == 191 || PDS_PARAM(pds) == 192) && pdslen >= 47) {
- ctmp = PDS_PARAM(pds);
- PDS_PARAM(pds) = pds[45];
- if (pds[46] == 1 && pdslen >= 51) {
- printf("prob(%s<%f)%c", k5toa(pds), ibm2flt(pds+47),char_end);
- }
- else if (pds[46] == 2 && pdslen >= 54) {
- printf("prob(%s>%f)%c", k5toa(pds), ibm2flt(pds+51), char_end);
- }
- else if (pds[46] == 3 && pdslen >= 54) {
- printf("prob(%f<%s<%f)%c", ibm2flt(pds+47), k5toa(pds),
- ibm2flt(pds+51), char_end);
- }
- PDS_PARAM(pds) = ctmp;
- }
- }
- /* ECMWF test should go here */
- }