UFO
SCATRetMW.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2020 UCAR
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  */
7 
9 
10 #include <algorithm>
11 #include <cmath>
12 #include <iomanip>
13 #include <iostream>
14 #include <set>
15 #include <string>
16 #include <vector>
17 
18 #include "ioda/ObsDataVector.h"
19 #include "oops/util/IntSetParser.h"
20 #include "ufo/filters/Variable.h"
21 #include "ufo/utils/Constants.h"
22 
23 namespace ufo {
24 
26 
27 SCATRetMW::SCATRetMW(const eckit::LocalConfiguration & conf)
28  : invars_() {
29  // Initialize options
30  options_.deserialize(conf);
31 
32  // Check required parameters
33  // Get variable group types for scattering index retrieval from option
34  ASSERT(options_.varGroup.value().size() == 1 || options_.varGroup.value().size() == 2);
35 
36  // Get channels for CLW retrieval from options
37  const std::vector<int> channels_ = {options_.ch238.value(), options_.ch314.value(),
38  options_.ch890.value()};
39  ASSERT(options_.ch238 != 0 && options_.ch314 != 0 && options_.ch890 != 0 &&
40  channels_.size() == 3);
41 
42  // Include list of required data from ObsSpace
43  for (size_t igrp = 0; igrp < options_.varGroup.value().size(); ++igrp) {
44  invars_ += Variable("brightness_temperature@" + options_.varGroup.value()[igrp], channels_);
45  }
46  invars_ += Variable("brightness_temperature@" + options_.testBias.value(), channels_);
47 
48  // Include list of required data from GeoVaLs
49  invars_ += Variable("water_area_fraction@GeoVaLs");
50 }
51 
52 // -----------------------------------------------------------------------------
53 
55 
56 // -----------------------------------------------------------------------------
57 
59  ioda::ObsDataVector<float> & out) const {
60  // Get dimension
61  const size_t nlocs = in.nlocs();
62  const size_t ngrps = options_.varGroup.value().size();
63 
64  // Get required parameters
65  const std::vector<std::string> &vargrp = options_.varGroup.value();
66  const std::vector<int> channels_ = {options_.ch238.value(), options_.ch314.value(),
67  options_.ch890.value()};
68 
69  // Get area fraction of each surface type from GeoVaLs
70  std::vector<float> water_frac(nlocs);
71  in.get(Variable("water_area_fraction@GeoVaLs"), water_frac);
72 
73  // Get observation, bias correction and HofX from ObsSpace
74  std::vector<float> bt238(nlocs), bt314(nlocs), bt890(nlocs);
75  for (size_t igrp = 0; igrp < ngrps; ++igrp) {
76  // Get data based on group type
77  in.get(Variable("brightness_temperature@"+vargrp[igrp], channels_)[0], bt238);
78  in.get(Variable("brightness_temperature@"+vargrp[igrp], channels_)[1], bt314);
79  in.get(Variable("brightness_temperature@"+vargrp[igrp], channels_)[2], bt890);
80  // Get bias based on group type
81  if (options_.addBias.value() == vargrp[igrp]) {
82  std::vector<float> bias238(nlocs), bias314(nlocs), bias890(nlocs);
83  in.get(Variable("brightness_temperature@"+options_.testBias.value(), channels_)[0], bias238);
84  in.get(Variable("brightness_temperature@"+options_.testBias.value(), channels_)[1], bias314);
85  in.get(Variable("brightness_temperature@"+options_.testBias.value(), channels_)[2], bias890);
86  // Add bias correction to the assigned group
87  if (options_.addBias.value() == "ObsValue") {
88  for (size_t iloc = 0; iloc < nlocs; ++iloc) {
89  bt238[iloc] = bt238[iloc] - bias238[iloc];
90  bt314[iloc] = bt314[iloc] - bias314[iloc];
91  bt890[iloc] = bt890[iloc] - bias890[iloc];
92  }
93  } else {
94  for (size_t iloc = 0; iloc < nlocs; ++iloc) {
95  bt238[iloc] = bt238[iloc] + bias238[iloc];
96  bt314[iloc] = bt314[iloc] + bias314[iloc];
97  bt890[iloc] = bt890[iloc] + bias890[iloc];
98  }
99  }
100  }
101  // Retrieve scattering index
102  for (size_t iloc = 0; iloc < nlocs; ++iloc) {
103  if (water_frac[iloc] >= 0.99) {
104  out[igrp][iloc] = -113.2 + (2.41 - 0.0049 * bt238[iloc]) * bt238[iloc]
105  + 0.454 * bt314[iloc] - bt890[iloc];
106  out[igrp][iloc] = std::max(0.f, out[igrp][iloc]);
107  }
108  }
109  }
110 }
111 
112 // -----------------------------------------------------------------------------
113 
115  return invars_;
116 }
117 
118 // -----------------------------------------------------------------------------
119 
120 } // namespace ufo
ufo::ObsFilterData::nlocs
size_t nlocs() const
Returns number of locations.
Definition: ObsFilterData.cc:66
ufo::Variables
Definition: src/ufo/filters/Variables.h:24
ufo::makerSCATRetMW_
static ObsFunctionMaker< SCATRetMW > makerSCATRetMW_("SCATRetMW")
ufo::SCATRetMWParameters::ch238
oops::RequiredParameter< int > ch238
Definition: SCATRetMW.h:38
SCATRetMW.h
ufo
Definition: RunCRTM.h:27
ufo::ObsFunctionMaker
Definition: ObsFunctionBase.h:60
ufo::SCATRetMWParameters::ch890
oops::RequiredParameter< int > ch890
Definition: SCATRetMW.h:50
ufo::SCATRetMW::requiredVariables
const ufo::Variables & requiredVariables() const
geovals required to compute the function
Definition: SCATRetMW.cc:114
ufo::SCATRetMW::SCATRetMW
SCATRetMW(const eckit::LocalConfiguration &=eckit::LocalConfiguration())
Definition: SCATRetMW.cc:27
ioda::ObsDataVector
Definition: BackgroundCheck.h:26
ufo::SCATRetMWParameters::testBias
oops::Parameter< std::string > testBias
Definition: SCATRetMW.h:70
ufo::SCATRetMWParameters::ch314
oops::RequiredParameter< int > ch314
Definition: SCATRetMW.h:44
ufo::SCATRetMW::~SCATRetMW
~SCATRetMW()
Definition: SCATRetMW.cc:54
ufo::SCATRetMW::invars_
ufo::Variables invars_
Definition: SCATRetMW.h:94
ufo::SCATRetMWParameters::varGroup
oops::RequiredParameter< std::vector< std::string > > varGroup
Definition: SCATRetMW.h:58
Constants.h
ufo::ObsFilterData::get
void get(const Variable &, std::vector< float > &) const
Gets requested data from ObsFilterData.
Definition: ObsFilterData.cc:130
ufo::SCATRetMWParameters::addBias
oops::Parameter< std::string > addBias
Definition: SCATRetMW.h:65
ufo::SCATRetMW::options_
SCATRetMWParameters options_
Definition: SCATRetMW.h:95
ufo::Variable
Definition: Variable.h:23
ufo::ObsFilterData
ObsFilterData provides access to all data related to an ObsFilter.
Definition: src/ufo/filters/ObsFilterData.h:40
conf
Definition: conf.py:1
Variable.h
ufo::SCATRetMW::compute
void compute(const ObsFilterData &, ioda::ObsDataVector< float > &) const
compute the result of the function
Definition: SCATRetMW.cc:58