Ticket 827: Update pydocumentation for wrwp andersFeatureBranch master jenkins-wrwp-55 jenkins-wrwp-56 jenkins-wrwp-57 jenkins-wrwp-58 jenkins-wrwp-59 jenkins-wrwp-60 jenkins-wrwp-61 jenkins-wrwp-62 jenkins-wrwp-63 jenkins-wrwp-64 jenkins-wrwp-65 jenkins-wrwp-66 jenkins-wrwp-67 jenkins-wrwp-68 jenkins-wrwp-69 jenkins-wrwp-70
authorAnders Henja <anders@baltrad.eu>
Mon, 24 Feb 2020 08:33:25 +0000 (09:33 +0100)
committerAnders Henja <anders@baltrad.eu>
Mon, 24 Feb 2020 08:33:25 +0000 (09:33 +0100)
lib/wrwp.c
lib/wrwp.h
pywrwp/pywrwp.c
test/pytest/WrwpTest.py

index 62c06fb..2e67cc6 100644 (file)
@@ -77,23 +77,24 @@ struct _Wrwp_t
 /**
  * Constructor
  */
+
 static int Wrwp_constructor(RaveCoreObject* obj)
 {
   Wrwp_t* wrwp = (Wrwp_t*)obj;
-  wrwp->dz = 0;
-  wrwp->hmax = 0; 
-  wrwp->dmin = 0;
-  wrwp->dmax = 0;
-  wrwp->nmin_wnd = 0;
-  wrwp->nmin_ref = 0;
-  wrwp->emin = 0.0;
-  wrwp->emax = 0.0;
-  wrwp->ff_max = 0.0;
-  wrwp->vmin = 0.0;
-  wrwp->nodata_VP = 0;
-  wrwp->gain_VP = 1.0; /* The gain cannot be initialized to 0.0! */
-  wrwp->offset_VP = 0.0;
-  wrwp->undetect_VP = 0;
+  wrwp->dmin = DMIN;
+  wrwp->dmax = DMAX;
+  wrwp->nmin_wnd = NMIN_WND;
+  wrwp->nmin_ref = NMIN_REF;
+  wrwp->emin = EMIN;
+  wrwp->emax = EMAX;
+  wrwp->vmin = VMIN;
+  wrwp->ff_max = FF_MAX;
+  wrwp->dz = DZ;
+  wrwp->hmax = HMAX;
+  wrwp->nodata_VP = NODATA_VP;
+  wrwp->undetect_VP = UNDETECT_VP;
+  wrwp->gain_VP = GAIN_VP; /* The gain cannot be initialized to 0.0! */
+  wrwp->offset_VP = OFFSET_VP;
   return 1;
 }
 
index ccb4e17..6d583f8 100644 (file)
@@ -62,6 +62,24 @@ along with baltrad-wrwp.  If not, see <http://www.gnu.org/licenses/>.
 #define LDA         NOC             /* Leading dimension of the array specified for a */
 #define LDB         NRHS            /* Leading dimension of the array specified for b */
 
+/******************************************************************************/
+/* Defines of default values in the wrwp instance                             */
+/******************************************************************************/
+#define DMIN        5000            /* Minimum distance for deriving a profile [m] */
+#define DMAX        25000           /* Maximum distance for deriving a profile [m] */
+#define NMIN_WND    40              /* Minimum sample size wind */
+#define NMIN_REF    40              /* Minimum sample size reflectivity */
+#define EMIN        0.5             /* Minimum elevation angle [deg] */
+#define EMAX        45.0            /* Maximum elevation angle [deg] */
+#define VMIN        2.0             /* Radial velocity threshold [m/s] */
+#define FF_MAX      60.0            /* Maximum allowed layer velocity [m/s] */
+#define DZ          200             /* Height interval for deriving a profile [m] */
+#define HMAX        12000           /* Maximum height of the profile [m] */
+#define NODATA_VP   -9999           /* Nodata value used in the vertical profile */
+#define UNDETECT_VP -9999           /* Undetect value used in the vertical profile */
+#define GAIN_VP     1.0             /* Gain value for the fields UWND and VWND */
+#define OFFSET_VP   0.0             /* Offset value for the fields UWND and VWND */
+
 /**
  * Defines a weather radar wind product generator
  */
index be81c1b..0eb6746 100644 (file)
@@ -183,7 +183,27 @@ done:
  */
 static struct PyMethodDef _pywrwp_methods[] =
 {
-  {"generate", (PyCFunction)_pywrwp_generate, 1},
+  {"dz", NULL},
+  {"hmax", NULL},
+  {"dmin", NULL},
+  {"dmax", NULL},
+  {"emin", NULL},
+  {"emax", NULL},
+  {"vmin", NULL},
+  {"nmin_wnd", NULL},
+  {"nmin_ref", NULL},
+  {"ff_max", NULL},
+  {"nodata_VP", NULL},
+  {"undetect_VP", NULL},
+  {"gain_VP", NULL},
+  {"offset_VP", NULL},
+  {"generate", (PyCFunction)_pywrwp_generate, 1,
+    "generate(pvol,fields) -> vp\n\n"
+    "Function for deriving wind and reflectivity profiles from polar volume data\n\n"
+    "pvol   - A polar volume\n"
+    "fields - A comma separated list of fields to be generated. Currently, the following fields can be generated\n"
+    "         NV,HGHT,UWND,VWND,ff,ff_dev,dd,DBZH,DBZH_dev,NZ. If None, then a default setup will be generated."
+  },
   {NULL, NULL } /* sentinel */
 };
 
@@ -338,6 +358,34 @@ done:
 }
 /*@} End of Weather radar wind profiles */
 
+/*@{ Documentation about the type */
+PyDoc_STRVAR(_pywrwp_type_doc,
+  "Function for deriving weather radar wind and reflectivity profiles. The profile only works on polar volumes.\n"
+  "\n"
+  "There are a number of member attributes that can be set to tune the profile generation.\n"
+  "dmin       - Minimum distance for deriving a profile [m], default 5000\n"
+  "dmax       - Maximum distance for deriving a profile [m], default 25000\n"
+  "nmin_wnd   - Minimum sample size wind, default 40\n"
+  "nmin_ref   - Minimum sample size reflectivity, default 40\n"
+  "emin       - Minimum elevation angle [deg], default 0.5\n"
+  "emax       - Maximum elevation angle [deg], default 45.0\n"
+  "vmin       - Radial velocity threshold [m/s], default 2.0\n"
+  "ff_max     - Maximum allowed layer velocity [m/s], default 60.0\n"
+  "dz         - Height interval for deriving a profile [m], default 200\n"
+  "hmax       - Maximum height of the profile [m], default 12000\n"
+  "nodata_VP  - Nodata value used in the vertical profile, default -9999\n"
+  "undetect_VP- Undetect value used in the vertical profile, default -9999\n"
+  "gain_VP    - Gain value for the fields UWND and VWND, default 1.0\n"
+  "offset_VP  - Offset value for the fields UWND and VWND, default 0.0\n"
+  "\n"
+  "Usage:\n"
+  "import _wrwp\n"
+  "a = _wrwp.new()\n"
+  "a.dz = 250.0\n"
+  "result = a.generate(_raveio.open(\"somepvol.h5\").object)\n"
+);
+/*@} End of Documentation about the type */
+
 /*@{ Type definitions */
 PyTypeObject PyWrwp_Type =
 {
@@ -362,7 +410,7 @@ PyTypeObject PyWrwp_Type =
   (setattrofunc)_pywrwp_setattro, /*tp_setattro*/
   0,                            /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT, /*tp_flags*/
-  0,                            /*tp_doc*/
+  _pywrwp_type_doc,             /*tp_doc*/
   (traverseproc)0,              /*tp_traverse*/
   (inquiry)0,                   /*tp_clear*/
   0,                            /*tp_richcompare*/
@@ -391,7 +439,10 @@ PyTypeObject PyWrwp_Type =
 /// --------------------------------------------------------------------
 /*@{ Module setup */
 static PyMethodDef functions[] = {
-  {"new", (PyCFunction)_pywrwp_new, 1},
+  {"new", (PyCFunction)_pywrwp_new, 1,
+     "new() -> new instance of the WrwpCore object\n\n"
+     "Creates a new instance of the WrwpCore object"
+  },
   {NULL,NULL} /*Sentinel*/
 };
 
@@ -405,7 +456,7 @@ MOD_INIT(_wrwp)
 
   MOD_INIT_VERIFY_TYPE_READY(&PyWrwp_Type);
 
-  MOD_INIT_DEF(module, "_wrwp", NULL/*doc*/, functions);
+  MOD_INIT_DEF(module, "_wrwp", _pywrwp_type_doc, functions);
   if (module == NULL) {
     return MOD_INIT_ERROR;
   }
index 681510c..d4b81dd 100644 (file)
@@ -118,9 +118,22 @@ class WrwpTest(unittest.TestCase):
     obj = _wrwp.new()
     self.assertNotEqual(-1, str(type(obj)).find("WrwpCore"))
 
-  def test_dz(self):
+  def test_load_wrwp_defaults_to_obj(self):
     obj = load_wrwp_defaults_to_obj()
     self.assertEqual(200, obj.dz)
+    self.assertEqual(12000, obj.hmax)
+    self.assertEqual(5000, obj.dmin)
+    self.assertEqual(25000, obj.dmax)
+    self.assertAlmostEqual(0.5, obj.emin, 4)
+    self.assertAlmostEqual(45.0, obj.emax, 4)
+    self.assertAlmostEqual(2.0, obj.vmin, 4)
+    self.assertAlmostEqual(60.0, obj.ff_max, 4)
+    self.assertEqual(40, obj.nmin_wnd, 4)
+    self.assertEqual(40, obj.nmin_ref, 4)
+    
+  def test_dz(self):
+    obj = _wrwp.new()
+    self.assertEqual(200, obj.dz)
     obj.dz = 100
     self.assertEqual(100, obj.dz)
     try:
@@ -131,7 +144,7 @@ class WrwpTest(unittest.TestCase):
     self.assertEqual(100, obj.dz)
 
   def test_hmax(self):
-    obj = load_wrwp_defaults_to_obj()
+    obj = _wrwp.new()
     self.assertEqual(12000, obj.hmax)
     obj.hmax = 100
     self.assertEqual(100, obj.hmax)
@@ -143,7 +156,7 @@ class WrwpTest(unittest.TestCase):
     self.assertEqual(100, obj.hmax)
 
   def test_dmin(self):
-    obj = load_wrwp_defaults_to_obj()
+    obj = _wrwp.new()
     self.assertEqual(5000, obj.dmin)
     obj.dmin = 100
     self.assertEqual(100, obj.dmin)
@@ -155,7 +168,7 @@ class WrwpTest(unittest.TestCase):
     self.assertEqual(100, obj.dmin)
     
   def test_dmax(self):
-    obj = load_wrwp_defaults_to_obj()
+    obj = _wrwp.new()
     self.assertEqual(25000, obj.dmax)
     obj.dmax = 100
     self.assertEqual(100, obj.dmax)
@@ -167,7 +180,7 @@ class WrwpTest(unittest.TestCase):
     self.assertEqual(100, obj.dmax)
 
   def test_emin(self):
-    obj = load_wrwp_defaults_to_obj()
+    obj = _wrwp.new()
     self.assertAlmostEqual(0.5, obj.emin, 4)
     obj.emin = 3.5
     self.assertAlmostEqual(3.5, obj.emin, 4)
@@ -175,7 +188,7 @@ class WrwpTest(unittest.TestCase):
     self.assertAlmostEqual(4.0, obj.emin, 4)
 
   def test_emax(self):
-    obj = load_wrwp_defaults_to_obj()
+    obj = _wrwp.new()
     self.assertAlmostEqual(45.0, obj.emax, 4)
     obj.emax = 35.0
     self.assertAlmostEqual(35.0, obj.emax, 4)
@@ -183,7 +196,7 @@ class WrwpTest(unittest.TestCase):
     self.assertAlmostEqual(4.0, obj.emax, 4)
 
   def test_vmin(self):
-    obj = load_wrwp_defaults_to_obj()
+    obj = _wrwp.new()
     self.assertAlmostEqual(2.0, obj.vmin, 4)
     obj.vmin = 3.5
     self.assertAlmostEqual(3.5, obj.vmin, 4)
@@ -191,7 +204,7 @@ class WrwpTest(unittest.TestCase):
     self.assertAlmostEqual(4.0, obj.vmin, 4)
 
   def test_ff_max(self):
-    obj = load_wrwp_defaults_to_obj()
+    obj = _wrwp.new()
     self.assertAlmostEqual(60.0, obj.ff_max, 4)
     obj.ff_max = 3.5
     self.assertAlmostEqual(3.5, obj.ff_max, 4)
@@ -199,7 +212,7 @@ class WrwpTest(unittest.TestCase):
     self.assertAlmostEqual(90.0, obj.ff_max, 4)
 
   def test_nmin_wnd(self):
-    obj = load_wrwp_defaults_to_obj()
+    obj = _wrwp.new()
     self.assertEqual(40, obj.nmin_wnd, 4)
     obj.nmin_wnd = 70
     self.assertEqual(70, obj.nmin_wnd, 4)
@@ -207,7 +220,7 @@ class WrwpTest(unittest.TestCase):
     self.assertEqual(20, obj.nmin_wnd, 4)
 
   def test_nmin_ref(self):
-    obj = load_wrwp_defaults_to_obj()
+    obj = _wrwp.new()
     self.assertEqual(40, obj.nmin_ref, 4)
     obj.nmin_ref = 70
     self.assertEqual(70, obj.nmin_ref, 4)