Skip to content
Snippets Groups Projects
Commit 19990cc6 authored by Jonny Schäfer's avatar Jonny Schäfer
Browse files

Add Reflectivity function

parent 3badb514
No related branches found
No related tags found
No related merge requests found
...@@ -11,11 +11,17 @@ type DBZ float64 ...@@ -11,11 +11,17 @@ type DBZ float64
type RVP6 float64 type RVP6 float64
// PrecipitationRate returns the estimated precipitation rate in mm/h for the given // PrecipitationRate returns the estimated precipitation rate in mm/h for the given
// reflectivity factor. The used Z-R relation is descibed in [6]. // reflectivity factor. The used Z-R relation is described in [6].
func (z DBZ) PrecipitationRate() float64 { func (z DBZ) PrecipitationRate() float64 {
return math.Pow(math.Pow(10, float64(z)/10)/256, 1/1.42) return math.Pow(math.Pow(10, float64(z)/10)/256, 1/1.42)
} }
// Reflectivity returns the estimated reflectivity factor for the given precipitation
// rate (mm/h). The used Z-R relation is described in [6].
func Reflectivity(rate float64) DBZ {
return DBZ(10 * math.Log10(256 * math.Pow(rate, 1.42)))
}
// ToDBZ converts the given radar video processor values (rvp-6) to radar reflectivity // ToDBZ converts the given radar video processor values (rvp-6) to radar reflectivity
// factors in decibel relative to Z (dBZ). // factors in decibel relative to Z (dBZ).
func (r RVP6) ToDBZ() DBZ { func (r RVP6) ToDBZ() DBZ {
......
...@@ -9,7 +9,7 @@ func TestConversion(t *testing.T) { ...@@ -9,7 +9,7 @@ func TestConversion(t *testing.T) {
testcases := []struct { testcases := []struct {
rvp RVP6 rvp RVP6
dbz DBZ dbz DBZ
rate float64 zr float64
}{ }{
{0, -32.5, 0.0001}, {0, -32.5, 0.0001},
{65, 0, 0.0201}, {65, 0, 0.0201},
...@@ -19,7 +19,8 @@ func TestConversion(t *testing.T) { ...@@ -19,7 +19,8 @@ func TestConversion(t *testing.T) {
for _, test := range testcases { for _, test := range testcases {
dbz := test.rvp.ToDBZ() dbz := test.rvp.ToDBZ()
rate := dbz.PrecipitationRate() zr := dbz.PrecipitationRate()
rz := Reflectivity(zr)
rvp := dbz.ToRVP6() rvp := dbz.ToRVP6()
if dbz != test.dbz { if dbz != test.dbz {
...@@ -28,8 +29,12 @@ func TestConversion(t *testing.T) { ...@@ -28,8 +29,12 @@ func TestConversion(t *testing.T) {
if rvp != test.rvp { if rvp != test.rvp {
t.Errorf("RVP6(%f).ToDBZ().ToRVP6() = %f; expected: %f", test.rvp, rvp, test.rvp) t.Errorf("RVP6(%f).ToDBZ().ToRVP6() = %f; expected: %f", test.rvp, rvp, test.rvp)
} }
if math.Abs(test.rate-rate) > 0.0001 { if math.Abs(test.zr-zr) > 0.0001 {
t.Errorf("RVP6(%f).ToDBZ().PrecipitationRate() = %f; expected: %f", test.rvp, rate, test.rate) t.Errorf("RVP6(%f).ToDBZ().PrecipitationRate() = %f; expected: %f", test.rvp, zr, test.zr)
}
if math.Abs(float64(test.dbz - rz)) > 0.0000001 {
t.Errorf("Reflectivity(RVP6(%f).ToDBZ().PrecipitationRate()) = %f; expected: %f",
test.rvp, rz, test.dbz)
} }
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment