Elaboradar 0.1
Caricamento in corso...
Ricerca in corso...
Nessun risultato
dbz.cpp
1#include "dbz.h"
2#include "volume.h"
3
4//#define aMP 316.
5//#define bMP 1.5
6#define aMP_conv 500.0
7#define bMP_conv 1.5
8#define aMP_strat 250.
9#define bMP_strat 1.5
10#define aMP_SNOW 400.0
11#define bMP_SNOW 2.0
12#define aMP_class 200.
13#define bMP_class 1.6
14
15#define THRES_ATT 0 /* minimo valore di Z in dBZ per calcolare att rate */
16
17namespace radarelab {
18namespace algo {
19
20using namespace std;
21
22DBZ::DBZ(const Volume<double>& volume)
23{
24 // --- ricavo il mese x definizione first_level e aMP bMP ---------
25 time_t Time = volume.load_info->acq_date;
26 struct tm* tempo = gmtime(&Time);
27 init(tempo->tm_mon+1, volume[0].cell_size);
28}
29
30DBZ::DBZ(int month, double base_cell_size)
31{
32 init(month, base_cell_size);
33}
34
35void DBZ::init(int month, double base_cell_size)
36{
37 this->base_cell_size = base_cell_size;
38
39 if (month > 4 && month < 10)
40 {
41 aMP = aMP_conv;
42 bMP = bMP_conv;
43 }
44 else
45 {
46 aMP = aMP_strat;
47 bMP = bMP_strat;
48 }
49}
50
51double DBZ::attenuation(unsigned char DBZbyte, double PIA) /* Doviak,Zrnic,1984 for rain as reported in cost 717 final document*/
52{
53 double Zhh,att_rate,R;/* PIA diventa att_tot devo decidere infatti se PIA sarà 3d percio' temp. uso nomi diversi*/
54 double att_tot;
55
56 //---ricevo in ingresso il dato e l'attenuazione fino quel punto
57 //---la formula recita che l'attenuazione è pari una funzione di Z reale (quindi corretta dell'attenuazione precedente). ovviamente devo avere un segnale per correggere.
58 //--------- CALCOL
59 att_tot=PIA;
60 Zhh= (BYTEtoZ(DBZbyte));
61 if (10*log10(Zhh) > THRES_ATT )
62 {
63 Zhh=pow(10., (log10(Zhh)+ 0.1*att_tot));
64 R=pow((Zhh/aMP),(1.0/bMP));
65 att_rate=0.0018*pow(R,1.05);
66 // TODO: to compute scan by scan?
67 att_tot=att_tot+2.*att_rate*0.001 * base_cell_size;
68 if (att_tot>BYTEtoDB(254)) att_tot=BYTEtoDB(254);
69 }
70 return att_tot;
71}
72double DBZ::attenuation(double DBZvalue, double PIA) /* Doviak,Zrnic,1984 for rain as reported in cost 717 final document*/
73{
74 double Zhh,att_rate,R;/* PIA diventa att_tot devo decidere infatti se PIA sarà 3d percio' temp. uso nomi diversi*/
75 double att_tot;
76
77 //---ricevo in ingresso il dato e l'attenuazione fino quel punto
78 //---la formula recita che l'attenuazione è pari una funzione di Z reale (quindi corretta dell'attenuazione precedente). ovviamente devo avere un segnale per correggere.
79 //--------- CALCOL
80 att_tot=PIA;
81 Zhh=(DBZtoZ(DBZvalue));
82 if (DBZvalue > THRES_ATT )
83 {
84 //Zhh=pow(10., (log10(Zhh)+ 0.1*att_tot));
85 Zhh=DBZtoZ(DBZvalue+ att_tot);
86 R=pow((Zhh/aMP),(1.0/bMP));
87 att_rate=0.0018*pow(R,1.05);
88 // TODO: to compute scan by scan?
89 att_tot=att_tot+2.*att_rate*0.001 * base_cell_size;
90 if (att_tot>BYTEtoDB(254)) att_tot=BYTEtoDB(254);
91 }
92 return att_tot;
93}
94
95double DBZ::RtoDBZ(double rain) const
96{
97 return RtoDBZ(rain, aMP, bMP);
98}
99
100double DBZ::DBZtoR(double dbz) const
101{
102 return DBZtoR(dbz, aMP, bMP);
103}
104
105double DBZ::DBZ_snow(double dbz) const
106{
107 return RtoDBZ(DBZtoR(dbz, aMP_SNOW, bMP_SNOW), aMP_class, bMP_class);
108}
109
110double DBZ::DBZ_conv(double dbz) const
111{
112 return RtoDBZ(DBZtoR(dbz, aMP_conv, bMP_conv), aMP_class, bMP_class);
113}
114
115double DBZ::RtoDBZ_class(double R) const
116{
117 return RtoDBZ(R, aMP_class, bMP_class);
118}
119
120double DBZ::DBZ_to_mp_func(double sample) const
121{
122 return DBZtoR(sample, aMP, bMP);
123}
124
125double DBZ::BYTEtoZ(unsigned char byte)
126{
127 const double gain = 80. / 255.;
128 const double offset = -20.;
129 static bool precomputed = false;
130 static double Z[256];
131
132 if (!precomputed)
133 {
134 for (unsigned i=0; i < 256; ++i)
135 Z[i] = pow(10., (i * gain + offset) * 0.1);
136 precomputed = true;
137 }
138
139 return Z[byte];
140}
141
142}
143}
double attenuation(unsigned char DBZbyte, double PIA)
funzione che calcola l'attenuazione totale
Definition dbz.cpp:51
static double BYTEtoZ(unsigned char byte)
funzione che converte byte in Z
Definition dbz.cpp:125
static constexpr double DBZtoZ(double DBZ)
funzione che converte dBZ in Z
Definition dbz.h:119
static constexpr double BYTEtoDB(unsigned char DBZbyte, double gain=80./255., double offset=-20.)
funzione che converte Z unsigned char in DBZ
Definition dbz.h:82
double base_cell_size
cella size dimension
Definition dbz.h:28
String functions.
Definition cart.cpp:4
Definisce le principali strutture che contengono i dati.