]> Pileus Git - ~andy/rsl/blobdiff - volume.c
Changes from Bart (2009-10-28)
[~andy/rsl] / volume.c
index 4c17f95c4d438ac00570c4c44c5bdf37a4946403..2ff6aa9650a06e1e38a6be432d9f725e0ff58a01 100644 (file)
--- a/volume.c
+++ b/volume.c
@@ -99,6 +99,10 @@ extern int radar_verbose_flag;
 #define F_DZ_RANGE_OFFSET 32
 #endif
 
+/* #define F_VR_OFFSET 63.5 */
+#define F_VR_OFFSET 127.0
+#define F_DR_OFFSET 12.0
+
 /* IMPORTANT: This is the offset from reserved values. This
  *            number must be exactly (or >=) the number of
  *            reserved values in XX_F and XX_INVF.
@@ -121,7 +125,7 @@ float DZ_F(Range x) {
 float VR_F(Range x) {
   float val;
   if (x >= F_OFFSET) { /* This test works when Range is unsigned. */
-       val = (((float)x-F_OFFSET)/F_FACTOR - 63.5);  /* Default wsr88d coding. */
+       val = (((float)x-F_OFFSET)/F_FACTOR - F_VR_OFFSET);  /* Default wsr88d coding. */
        /*      fprintf(stderr, "x=%d, val=%f\n", x, val); */
        return val;
   }
@@ -135,7 +139,7 @@ float VR_F(Range x) {
 float DR_F(Range x) {    /* Differential reflectivity */
   float val;
   if (x >= F_OFFSET) { /* This test works when Range is unsigned. */
-       val = (((float)x-F_OFFSET)/F_DR_FACTOR - 12.0);
+       val = (((float)x-F_OFFSET)/F_DR_FACTOR - F_DR_OFFSET);
        return val;
   }
   if (x == 0) return BADVAL;
@@ -155,6 +159,11 @@ float LR_F(Range x) {/* From MCTEX */
   return BADVAL;
  }
 
+float HC_F(Range x) {  /* HydroClass (Sigmet) */
+  if (x == 0) return BADVAL;
+  return (float)x;
+}
+
 /****************************
  Sigmet RhoHV : one_byte values
 > RohHV = sqrt((N-1)/253)
@@ -167,8 +176,9 @@ float LR_F(Range x) {/* From MCTEX */
 *******************************/
 float RH_F(Range x) {
   if (x == 0) return BADVAL;
-  return (float)(sqrt((double)((x-1.0)/253.0)));
- }
+  /* return (float)(sqrt((double)((x-1.0)/253.0))); */
+  return (float)(x-1) / 65533.;
+}
 
 /***************************** 
   Sigmet PhiDP : one_byte values
@@ -182,42 +192,51 @@ float RH_F(Range x) {
 ******************************/
 float PH_F(Range x) {
   if (x == 0) return BADVAL;
-  return (float)(180.0*((x-1.0)/254.0));
+  /*return (float)(180.0*((x-1.0)/254.0));*/ 
+  return (360.*(x-1.))/65534.;
  }
 
+/* TODO: Should this be 5. cm. instead of 0.5?  Or maybe 10. cm.? */
 float rsl_kdp_wavelen = 0.5; /* Default radar wavelen = .5 cm.  See
                               * nsig_to_radar.c for the code that sets this.
-                                                         */
+                              */
+/* KD_F for 1 or 2 byte. */
 float KD_F(Range x)
 {
+/****** Commented-out code for 1-byte Sigmet native data format.
   if (x >= F_OFFSET) {
-       x -= F_OFFSET;
-       if (rsl_kdp_wavelen == 0.0) return BADVAL;
-       if (x < 128)
-         return (float)(
-                                        -0.25 * pow((double)600.0,(double)((127-x)/126.0))
-                                        )/rsl_kdp_wavelen;
-       else if (x > 128)
-         return (float)(
-                                         0.25 * pow((double)600.0,(double)((x-129)/126.0))
-                                        )/rsl_kdp_wavelen;
-       else
-         return 0.0;
+    x -= F_OFFSET;
+    if (rsl_kdp_wavelen == 0.0) return BADVAL;
+    if (x < 128)
+      return (float)(
+                     -0.25 * pow((double)600.0,(double)((127-x)/126.0))
+                     )/rsl_kdp_wavelen;
+    else if (x > 128)
+      return (float)(
+                      0.25 * pow((double)600.0,(double)((x-129)/126.0))
+                     )/rsl_kdp_wavelen;
+    else
+      return 0.0;
   }
-  if (x == 0) return BADVAL;
   if (x == 1) return RFVAL;
   if (x == 2) return APFLAG;
   if (x == 3) return NOECHO;
   return BADVAL;
+******/
+
+  if (x == 0) return BADVAL;
+  return (x-32768.)/100.;
+}
+
+float NP_F(Range x) {  /* Normalized Coherent Power (DORADE) */
+  if (x == 0) return BADVAL;
+  return (float)x / 100.;
 }
 
+/* Signal Quality Index */
 float SQ_F(Range x) {
-  if (x >= F_OFFSET) return (float)((x - F_OFFSET)/10000.);
   if (x == 0) return BADVAL;
-  if (x == 1) return RFVAL;
-  if (x == 2) return APFLAG;
-  if (x == 3) return NOECHO;
-  return BADVAL;  /* Can't get here, but quiets the compiler. */
+  return (float)(x-1) / 65533.;
 }
 
 float TI_F(Range x)
@@ -246,6 +265,11 @@ float CH_F(Range x) {  return DZ_F(x); }
 float AH_F(Range x) {  return DZ_F(x); }
 float CV_F(Range x) {  return DZ_F(x); }
 float AV_F(Range x) {  return DZ_F(x); }
+float VS_F(Range x) {  return VR_F(x); }
+float VL_F(Range x) {  return VR_F(x); }
+float VG_F(Range x) {  return VR_F(x); }
+float VT_F(Range x) {  return VR_F(x); }
+float VC_F(Range x) {  return VR_F(x); }
 
 
 
@@ -260,6 +284,7 @@ Range DZ_INVF(float x)
   if (x == RFVAL)  return (Range)1;
   if (x == APFLAG)  return (Range)2;
   if (x == NOECHO)  return (Range)3;
+  if (x < -F_DZ_RANGE_OFFSET) return (Range)0;
   return (Range)(F_FACTOR*(x+F_DZ_RANGE_OFFSET)+.5 + F_OFFSET); /* Default wsr88d. */
 }
 
@@ -269,7 +294,8 @@ Range VR_INVF(float x)
   if (x == RFVAL)  return (Range)1;
   if (x == APFLAG)  return (Range)2;
   if (x == NOECHO)  return (Range)3;
-  return (Range)(F_FACTOR*(x+63.5)+.5 + F_OFFSET); /* Default wsr88d coding. */
+  if (x < -F_VR_OFFSET)    return (Range)0;
+  return (Range)(F_FACTOR*(x+F_VR_OFFSET)+.5 + F_OFFSET); /* Default wsr88d coding. */
 }
 
 Range DR_INVF(float x)     /* Differential reflectivity */
@@ -278,7 +304,14 @@ Range DR_INVF(float x)     /* Differential reflectivity */
   if (x == RFVAL)  return (Range)1;
   if (x == APFLAG) return (Range)2;
   if (x == NOECHO) return (Range)3;
-  return (Range)(F_DR_FACTOR*(x + 12.0) + F_OFFSET + 0.5);
+  if (x < -F_DR_OFFSET)    return (Range)0;
+  return (Range)(F_DR_FACTOR*(x + F_DR_OFFSET) + F_OFFSET + 0.5);
+}
+
+Range HC_INVF(float x)  /* HydroClass (Sigmet) */
+{
+  if (x == BADVAL) return (Range)0;
+  return (Range)(x + 0.5); /* Round */
 }
 
 Range LR_INVF(float x) /* MCTEX */
@@ -300,9 +333,11 @@ Range LR_INVF(float x) /* MCTEX */
 > 253   0.9980
 > 254   1.0000
 ****************************/
+/* RH_INVF for 1 or 2 byte data. */
 Range RH_INVF(float x) {
   if (x == BADVAL) return (Range)0;
-  return (Range)(x * x * 253.0 + 1.0 + 0.5);
+  /* return (Range)(x * x * 253.0 + 1.0 + 0.5); */
+  return (Range)(x * 65533. + 1. +.5);
 }
 
 /******************************
@@ -317,11 +352,15 @@ Range RH_INVF(float x) {
 *******************************/
 Range PH_INVF(float x) {
   if (x == BADVAL) return (Range)0;
-  return (Range)((x / 180.0) * 254.0 + 1.0 + 0.5);
+  /* return (Range)((x / 180.0) * 254.0 + 1.0 + 0.5); */
+  return (Range)(x*65534./360. + 1.0 + 0.5);
 }
 
+
+/* KD_INVF for 1 or 2 byte data. */
 Range KD_INVF(float x) {
   if (x == BADVAL) return (Range)0;
+/****** Commented-out code for 1-byte Sigmet native data format.
   if (x == RFVAL)  return (Range)1;
   if (x == APFLAG)  return (Range)2;
   if (x == NOECHO)  return (Range)3;
@@ -340,17 +379,23 @@ Range KD_INVF(float x) {
        x = 128;
   }
   x += F_OFFSET;
-  return (Range) x;
+******/
+  return (Range)(x * 100. + 32768. + 0.5);
   
 }
 
-Range SQ_INVF(float x)  /* Signal Quality Index */
+/* Signal Quality Index */
+Range SQ_INVF(float x)
 {
   if (x == BADVAL) return (Range)0;
-  if (x == RFVAL)  return (Range)1;
-  if (x == APFLAG) return (Range)2;
-  if (x == NOECHO) return (Range)3;
-  return (Range)(x * 10000. + F_OFFSET);
+  return (Range)(x * 65533. + 1. +.5);
+}
+
+
+Range NP_INVF(float x) /* Normalized Coherent Power (DORADE) */
+{
+  if (x == BADVAL) return (0);
+  return (Range)(x * 100.);
 }
 
 Range TI_INVF(float x) /* MCTEX */
@@ -379,6 +424,11 @@ Range CH_INVF(float x) {  return DZ_INVF(x); }
 Range AH_INVF(float x) {  return DZ_INVF(x); }
 Range CV_INVF(float x) {  return DZ_INVF(x); }
 Range AV_INVF(float x) {  return DZ_INVF(x); }
+Range VS_INVF(float x) {  return VR_INVF(x); }
+Range VL_INVF(float x) {  return VR_INVF(x); }
+Range VG_INVF(float x) {  return VR_INVF(x); }
+Range VT_INVF(float x) {  return VR_INVF(x); }
+Range VC_INVF(float x) {  return VR_INVF(x); }
 
 
 
@@ -1332,7 +1382,9 @@ int rsl_qfield[MAX_RADAR_VOLUMES] = {
   1, 1, 1, 1, 1,
   1, 1, 1, 1, 1,
   1, 1, 1, 1, 1,
-  1, 1, 1, 1, 1
+  1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1,
+  1, 1
  };