PageRenderTime 48ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/external/io_grib1/WGRIB/ensemble.c

http://github.com/jbeezley/wrf-fire
C | 103 lines | 62 code | 17 blank | 24 comment | 52 complexity | 9fd31a082ce8abe133151d9c38bc19b8 MD5 | raw file
Possible License(s): AGPL-1.0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stddef.h>
  4. #include <string.h>
  5. #include "grib.h"
  6. #include "pds4.h"
  7. #include "cnames.h"
  8. /*
  9. * ensemble.c v0.1 wesley ebisuzaki
  10. *
  11. * prints ensemble meta-data
  12. *
  13. * only for NCEP and ECMWF
  14. *
  15. * output format:
  16. *
  17. * ECMWF
  18. * ens=n/N: n: 0=ctl, +/-ve
  19. * N: total number of members
  20. *
  21. * NCEP
  22. * ens=n/type: n: 0=ctl, +/-ve, CLUST, PROD/
  23. * type: Mn, WtdMn, SDev, NSDev
  24. */
  25. extern int ncep_ens;
  26. void ensemble(unsigned char *pds, int mode) {
  27. int pdslen;
  28. unsigned char ctmp;
  29. char char_end;
  30. pdslen = PDS_LEN(pds);
  31. char_end = mode == 2 ? ' ' : ':';
  32. if ((PDS_Center(pds) == NMC || ncep_ens) && pdslen >= 45 && pds[40] == 1) {
  33. /* control run */
  34. if (pds[41] == 1) {
  35. if (mode != 2) {
  36. printf("ens%c0:", pds[42] == 1 ? '+' : '-');
  37. }
  38. else {
  39. printf("%s-res_ens_control ", pds[42] == 1 ? "hi" : "low");
  40. }
  41. }
  42. /* perturbation run */
  43. else if (pds[41] == 2 || pds[41] == 3) {
  44. if (mode != 2) {
  45. printf("ens%c%d:", pds[41] == 3 ? '+' : '-', pds[42]);
  46. }
  47. else {
  48. printf("ens_perturbation=%c%d ",pds[41] == 3 ? '+' : '-',
  49. pds[42]);
  50. }
  51. }
  52. /* ensemble mean */
  53. else if (pds[41] == 5) {
  54. /* makes no sense to say "ensemble mean" for prob forecasts */
  55. if (PDS_PARAM(pds) != 191 && PDS_PARAM(pds) != 192) {
  56. if (mode != 2 || pdslen < 61) {
  57. printf("ens-mean%c", char_end);
  58. }
  59. else {
  60. printf("ensemble-mean(%d members) ",pds[60]);
  61. }
  62. }
  63. }
  64. /* other case .. debug code */
  65. else {
  66. printf("ens %d/%d/%d/%d:", pds[41],pds[42],pds[43],pds[44]);
  67. }
  68. /* NCEP probability limits */
  69. if ((PDS_PARAM(pds) == 191 || PDS_PARAM(pds) == 192) && pdslen >= 47) {
  70. ctmp = PDS_PARAM(pds);
  71. PDS_PARAM(pds) = pds[45];
  72. if (pds[46] == 1 && pdslen >= 51) {
  73. printf("prob(%s<%f)%c", k5toa(pds), ibm2flt(pds+47),char_end);
  74. }
  75. else if (pds[46] == 2 && pdslen >= 54) {
  76. printf("prob(%s>%f)%c", k5toa(pds), ibm2flt(pds+51), char_end);
  77. }
  78. else if (pds[46] == 3 && pdslen >= 54) {
  79. printf("prob(%f<%s<%f)%c", ibm2flt(pds+47), k5toa(pds),
  80. ibm2flt(pds+51), char_end);
  81. }
  82. PDS_PARAM(pds) = ctmp;
  83. }
  84. }
  85. /* ECMWF test should go here */
  86. }