Ticket 703: Add possibility to select what fields that should be included in the...
[baltrad-wrwp.git] / lib / wrwp.h
1 /* --------------------------------------------------------------------
2 Copyright (C) 2011 Swedish Meteorological and Hydrological Institute, SMHI
3
4 This is free software: you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
8
9 This software is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public License
15 along with HLHDF.  If not, see <http://www.gnu.org/licenses/>.
16 ------------------------------------------------------------------------*/
17
18 /** Header file for deriving weather radar wind and reflectivity profiles
19  * @file
20  * @author Gunther Haase, SMHI
21  * @date 2013-02-06
22  *
23  * @author Ulf E. Nordh, SMHI
24  * @date 2017-02-23, started overhaul of the code to achieve better
25  * resemblance with N2 and requirements from customer E-profile
26  */
27 #ifndef WRWP_H
28 #define WRWP_H
29 #include <stdio.h>
30 #include <string.h>
31 #include <stdlib.h>
32 #include <math.h>
33 #include <float.h>
34 #include <lapacke.h>
35 #include <cblas.h>
36
37 #include "rave_io.h"
38 #include "rave_attribute.h"
39 #include "cartesian.h"
40 #include "polarvolume.h"
41 #include "vertical_profile.h"
42 #include "projectionregistry.h"
43 #include "arearegistry.h"
44 #include "projection.h"
45 #include "area.h"
46 #include "rave_object.h"
47 #include "rave_types.h"
48 #include "rave_alloc.h"
49 #include "polarnav.h"
50 #include "raveutil.h"
51
52
53 /******************************************************************************/
54 /*Definition of standard parameters.                                          */
55 /******************************************************************************/
56
57 #define DEG2RAD     DEG_TO_RAD      /* Degrees to radians. From PROJ.4 */
58 #define RAD2DEG     RAD_TO_DEG      /* Radians to degrees. From PROJ.4 */
59 #define NOR         20000           /* Number of rows in matrix A used in the computation */
60 #define NOC         3               /* Number of columns in matrix A used in the computation */
61 #define NRHS        1               /* Number of right-hand sides; that is, the number of columns in matrix B used in the computation */
62 #define LDA         NOC             /* Leading dimension of the array specified for a */
63 #define LDB         NRHS            /* Leading dimension of the array specified for b */
64 #define DMIN        4000            /* Minimum distance for deriving a profile [m] */
65 #define DMAX        40000           /* Maximum distance for deriving a profile [m] */
66 #define NMIN        36              /* Minimum sample size */
67 #define EMIN        2.5             /* Minimum elevation angle [deg] */
68 #define VMIN        2.0             /* Radial velocity threshold [m/s] */
69 #define DZ          200             /* Height interval for deriving a profile [m] */
70 #define HMAX        12000           /* Maximum height of the profile [m] */
71 #define NODATA_VP   -9999           /* Nodata value used in the vertical profile */
72 #define UNDETECT_VP -9999           /* Undetect value used in the vertical profile */         
73 #define GAIN_VP     1.0             /* Gain value for the fields UWND and VWND */
74 #define OFFSET_VP   0.0             /* Offset value for the fields UWND and VWND */
75
76 /**
77  * Defines a weather radar wind product generator
78  */
79 typedef struct _Wrwp_t Wrwp_t;
80
81 /**
82  * Type definition to use when creating a rave object.
83  */
84 extern RaveCoreObjectType Wrwp_TYPE;
85
86 /**
87  * Sets the height interval for deriving a profile [m]
88  * @param[in] self - self
89  * @param[in] dz - the height interval
90  */
91 void Wrwp_setDZ(Wrwp_t* self, int dz);
92
93 /**
94  * Returns the nodata value used for vertical profiles
95  * @param[in] self - self
96  * @return the nodata value
97  */
98 int Wrwp_getNODATA_VP(Wrwp_t* self);
99
100 /**
101  * Sets the nodata value for the profile
102  * @param[in] self - self
103  * @param[in] nodata_VP - the nodata value
104  */
105 void Wrwp_setNODATA_VP(Wrwp_t* self, int nodata_vp);
106
107 /**
108  * Returns the undetect value used for vertical profiles
109  * @param[in] self - self
110  * @return the undetect value
111  */
112 int Wrwp_getUNDETECT_VP(Wrwp_t* self);
113
114 /**
115  * Sets the undetect value for the profile
116  * @param[in] self - self
117  * @param[in] undetect_VP - the nodata value
118  */
119 void Wrwp_setUNDETECT_VP(Wrwp_t* self, int nodata_vp);
120
121 /**
122  * Returns the gain value used for vertical profiles
123  * @param[in] self - self
124  * @return the gain value
125  */
126 int Wrwp_getGAIN_VP(Wrwp_t* self);
127
128 /**
129  * Sets the gain value for the vertical profile
130  * @param[in] self - self
131  * @param[in] gain_VP - the gain value
132  */
133 void Wrwp_setGAIN_VP(Wrwp_t* self, int nodata_vp);
134
135 /**
136  * Returns the offset value used for vertical profiles
137  * @param[in] self - self
138  * @return the offset value
139  */
140 int Wrwp_getOFFSET_VP(Wrwp_t* self);
141
142 /**
143  * Sets the offset value for the profile
144  * @param[in] self - self
145  * @param[in] offset_VP - the offset value
146  */
147 void Wrwp_setOFFSET_VP(Wrwp_t* self, int nodata_vp);
148
149 /**
150  * Returns the height interval for deriving a profile [m]
151  * @param[in] self - self
152  * @return the height interval (default value is DZ)
153  */
154 int Wrwp_getDZ(Wrwp_t* self);
155
156 /**
157  * Sets maximum height of the profile [m]
158  * @param[in] self - self
159  * @param[in] hmax - maximum height of the profile [m]
160  */
161 void Wrwp_setHMAX(Wrwp_t* self, int hmax);
162
163 /**
164  * Returns maximum height of the profile [m]
165  * @param[in] self - self
166  * @return maximum height of the profile (default is HMAX)
167  */
168 int Wrwp_getHMAX(Wrwp_t* self);
169
170 /**
171  * Sets minimum distance for deriving a profile [m]
172  * @param[in] self - self
173  * @param[in] dmin - minimum distance for deriving a profile [m]
174  */
175 void Wrwp_setDMIN(Wrwp_t* self, int dmin);
176
177 /**
178  * Returns minimum distance for deriving a profile [m]
179  * @param[in] self - self
180  * @return minimum distance for deriving a profile [m] (default DMIN)
181  */
182 int Wrwp_getDMIN(Wrwp_t* self);
183
184 /**
185  * Sets maximum distance for deriving a profile [m]
186  * @param[in] self - self
187  * @param[in] dmax - maximum distance for deriving a profile [m]
188  */
189 void Wrwp_setDMAX(Wrwp_t* self, int dmax);
190
191 /**
192  * Returns maximum distance for deriving a profile [m]
193  * @param[in] self - self
194  * @return maximum distance for deriving a profile [m] (default DMAX)
195  */
196 int Wrwp_getDMAX(Wrwp_t* self);
197
198 /**
199  * Sets minimum elevation angle [deg]
200  * @param[in] self - self
201  * @param[in] emin - minimum elevation angle [deg]
202  */
203 void Wrwp_setEMIN(Wrwp_t* self, double emin);
204
205 /**
206  * Returns minimum elevation angle [deg]
207  * @param[in] self - self
208  * @return Minimum elevation angle [deg] (default EMIN)
209  */
210 double Wrwp_getEMIN(Wrwp_t* self);
211
212 /**
213  * Sets radial velocity threshold [m/s]
214  * @param[in] self - self
215  * @param[in] vmin - radial velocity threshold [m/s]
216  */
217 void Wrwp_setVMIN(Wrwp_t* self, double vmin);
218
219 /**
220  * Returns radial velocity threshold [m/s]
221  * @param[in] self - self
222  * @return Radial velocity threshold [m/s] (default VMIN)
223  */
224 double Wrwp_getVMIN(Wrwp_t* self);
225
226 /**
227  * Function for deriving wind and reflectivity profiles from polar volume data
228  * @param[in] self - self
229  * @param[in] iobj - input volume
230  * @param[in] fieldsToGenerate - an comma-separated list of quantities. If NULL, then default
231  * behaviour is to add ff,ff_dev,dd,dbzh and dbzh_dev
232  * @returns the wind profile
233  */
234 VerticalProfile_t* Wrwp_generate(Wrwp_t* self, PolarVolume_t* inobj, const char* fieldsToGenerate);
235
236 #endif