@@ -69,150 +69,60 @@ inline long replaceTable(size_t table, long paramid) {
6969
7070template <typename REQUEST_T, typename AXIS_T>
7171void ParamID::normalise (const REQUEST_T& request, std::vector<Param>& req, const AXIS_T& axis, bool & windConversion,
72- bool fullTableDropping, bool useParamId ) {
72+ bool fullTableDropping, bool forceUseGRIBParamId ) {
7373
7474 static const bool useGRIBParamID = eckit::Resource<bool >(" useGRIBParamID" , false );
7575
76- const std::vector<WindFamily>& windFamilies (getWindFamilies ());
77-
78-
79- if (useGRIBParamID || useParamId) {
80-
81-
82- std::set<Param> inAxis;
83- for (typename AXIS_T::const_iterator j = axis.begin (); j != axis.end (); ++j) {
84- inAxis.insert ((*j));
85- }
86-
87- std::vector<Param> newreq;
88- newreq.reserve (req.size ());
89-
90- for (std::vector<Param>::const_iterator k = req.begin (); k != req.end (); ++k) {
91- const Param& p = (*k);
92-
93- Param alt;
94-
95- if (p.table ()) {
96- alt = Param (0 , (p.table () == 128 ? 0 : p.table ()) * 1000 + p.value ()); // No '.' version
97- }
98- else {
99- size_t t = p.value () / 1000 ;
100- size_t v = p.value () % 1000 ;
101- alt = Param (t == 0 ? 128 : t, v); // '.' version
102- }
103-
104- if (inAxis.find (p) != inAxis.end ()) {
105- newreq.push_back (p);
106- }
107- else if (inAxis.find (alt) != inAxis.end ()) {
108- newreq.push_back (alt);
109- }
110- else {
111- newreq.push_back (p);
112- }
113-
114- LOG_DEBUG_LIB (LibMetkit) << " useGRIBParamID p=" << p << " , alt=" << alt << " , choice=" << newreq.back ()
115- << std::endl;
116- }
117-
118-
119- req = newreq;
120-
121- for (eckit::Ordinal w = 0 ; w < windFamilies.size (); w++) {
76+ bool useParamId = useGRIBParamID || forceUseGRIBParamId;
12277
123- const Param windU (windFamilies[w].u_ );
124- const Param windV (windFamilies[w].v_ );
125- const Param windVO (windFamilies[w].vo_ );
126- const Param windD (windFamilies[w].d_ );
127-
128- bool wantU = false ;
129- bool wantV = false ;
130- bool wantVO = false ;
131- bool wantD = false ;
132-
133- // Check if wind is requested
134- for (eckit::Ordinal i = 0 ; i < req.size (); i++) {
135- if (req[i] == windU)
136- wantU = true ;
137- if (req[i] == windV)
138- wantV = true ;
139- if (req[i] == windVO)
140- wantVO = true ;
141- if (req[i] == windD)
142- wantD = true ;
143- }
144-
145- // Check if we have got it, axis should be sorted
146- bool gotU = false ;
147- bool gotV = false ;
148-
149- if (wantU)
150- gotU = std::binary_search (axis.begin (), axis.end (), windU);
151-
152- if (wantV)
153- gotV = std::binary_search (axis.begin (), axis.end (), windV);
78+ const std::vector<WindFamily>& windFamilies (getWindFamilies ());
15479
80+ std::vector<std::pair<Param, Param> > tableDropped;
15581
156- if ((wantU && !gotU) || (wantV && !gotV)) {
157- // Push VO and D if needed
158- if (!wantVO)
159- req.push_back (windVO);
160- if (!wantD)
161- req.push_back (windD);
82+ std::set<Param> inAxis;
83+ std::map<long , Param> inAxisParamID;
84+ std::set<Param> wind;
16285
163- LOG_DEBUG_LIB (LibMetkit) << " U/V conversion requested U=" << windU << " , V=" << windV
164- << " , VO=" << windVO << " , D=" << windD << std::endl;
165- windConversion = true ;
166- }
167- }
86+ for (typename AXIS_T::const_iterator j = axis.begin (); j != axis.end (); ++j) {
87+ inAxis.emplace (*j);
88+ inAxisParamID[j->paramId ()] = *j;
16889 }
169- else {
17090
171- std::vector<std::pair<Param, Param> > tableDropped;
91+ std::vector<Param> newreq;
92+ newreq.reserve (req.size ());
17293
173- std::set<Param> inAxis;
174- std::map<long , Param> inAxisParamID;
175- std::set<Param> wind;
176-
177- for (typename AXIS_T::const_iterator j = axis.begin (); j != axis.end (); ++j) {
178- inAxis.emplace (*j);
179- inAxisParamID[j->paramId ()] = *j;
94+ for (auto r : req) {
95+ if (inAxis.find (r) != inAxis.end ()) { // Perfect match - look no further
96+ newreq.push_back (r);
18097 }
181-
182- std::vector<Param> newreq;
183- newreq.reserve (req.size ());
184-
185- for (auto r : req) {
186- if (inAxis.find (r) != inAxis.end ()) { // Perfect match - look no further
187- newreq.push_back (r);
98+ else { // r is normalised to ParamID
99+ long paramid = r.paramId ();
100+ auto ap = inAxisParamID.find (paramid);
101+ if (ap != inAxisParamID.end ()) { // ParamID representation matching - look no further
102+ newreq.push_back (ap->second );
188103 }
189- else { // r is normalised to ParamID
190- long paramid = r.paramId ();
191- auto ap = inAxisParamID.find (paramid);
192- if (ap != inAxisParamID.end ()) { // ParamID representation matching - look no further
193- newreq.push_back (ap->second );
194- }
195- else { // Special case for U/V - exact match
196- bool ok = false ;
197- for (eckit::Ordinal w = 0 ; w < windFamilies.size (); w++) {
198- if ((paramid == windFamilies[w].u_ .paramId () || paramid == windFamilies[w].u_ .grib1value () ||
199- paramid == windFamilies[w].v_ .paramId () || paramid == windFamilies[w].v_ .grib1value ()) &&
200- inAxis.find (windFamilies[w].vo_ ) != inAxis.end () &&
201- inAxis.find (windFamilies[w].d_ ) != inAxis.end ()) {
202-
203- if (paramid == windFamilies[w].u_ .paramId () || paramid == windFamilies[w].u_ .grib1value ())
204- newreq.push_back (windFamilies[w].u_ );
205- else
206- newreq.push_back (windFamilies[w].v_ );
207-
208- wind.emplace (windFamilies[w].vo_ );
209- wind.emplace (windFamilies[w].d_ );
210- windConversion = true ;
211-
212- ok = true ;
213- break ;
214- }
104+ else { // Special case for U/V - exact match
105+ bool ok = false ;
106+ for (eckit::Ordinal w = 0 ; w < windFamilies.size (); w++) {
107+ if ((paramid == windFamilies[w].u_ .paramId () || (!useParamId && paramid == windFamilies[w].u_ .grib1value ()) ||
108+ paramid == windFamilies[w].v_ .paramId () || (!useParamId && paramid == windFamilies[w].v_ .grib1value ())) &&
109+ inAxis.find (windFamilies[w].vo_ ) != inAxis.end () &&
110+ inAxis.find (windFamilies[w].d_ ) != inAxis.end ()) {
111+
112+ if (paramid == windFamilies[w].u_ .paramId () || paramid == windFamilies[w].u_ .grib1value ())
113+ newreq.push_back (windFamilies[w].u_ );
114+ else
115+ newreq.push_back (windFamilies[w].v_ );
116+
117+ wind.emplace (windFamilies[w].vo_ );
118+ wind.emplace (windFamilies[w].d_ );
119+ windConversion = true ;
120+
121+ ok = true ;
122+ break ;
215123 }
124+ }
125+ if (!useParamId) {
216126 if (!ok && r.table () == 0 &&
217127 paramid < 1000 ) { // Partial match (only it table has not been specified by user)
218128 const std::vector<size_t >& dropTables = ParamID::getDropTables ();
@@ -237,10 +147,10 @@ void ParamID::normalise(const REQUEST_T& request, std::vector<Param>& req, const
237147 bool grib1 = vo->second .table () > 0 ;
238148 if (paramid == windFamilies[w].u_ .paramId ())
239149 newreq.push_back (grib1 ? Param (t, paramid)
240- : Param (0 , replaceTable (t, paramid)));
150+ : Param (0 , replaceTable (t, paramid)));
241151 else
242152 newreq.push_back (grib1 ? Param (t, paramid)
243- : Param (0 , replaceTable (t, paramid)));
153+ : Param (0 , replaceTable (t, paramid)));
244154
245155 wind.emplace (vo->second );
246156 wind.emplace (d->second );
@@ -270,31 +180,31 @@ void ParamID::normalise(const REQUEST_T& request, std::vector<Param>& req, const
270180 }
271181 }
272182 }
273- req = newreq;
274-
275- for (auto w : wind) {
276- bool exist = false ;
277- for (eckit::Ordinal i = 0 ; i < req.size (); i++)
278- if (req[i] == w) {
279- exist = true ;
280- break ;
281- }
282- if (!exist) {
283- req.push_back (w);
183+ }
184+ req = newreq;
185+
186+ for (auto w : wind) {
187+ bool exist = false ;
188+ for (eckit::Ordinal i = 0 ; i < req.size (); i++)
189+ if (req[i] == w) {
190+ exist = true ;
191+ break ;
284192 }
193+ if (!exist) {
194+ req.push_back (w);
285195 }
286- if (tableDropped. size () > 0 ) {
287- eckit::MetricsPrefix prefix ( " paramid_normalisation " );
288- {
289- std::ostringstream oss;
290- oss << request ;
291- eckit::Metrics::set ( " user_request " , oss. str ()) ;
292- }
293- {
294- std::ostringstream oss;
295- oss << tableDropped ;
296- eckit::Metrics::set ( " params " , oss. str ()) ;
297- }
196+ }
197+ if (tableDropped. size () > 0 ) {
198+ eckit::MetricsPrefix prefix ( " paramid_normalisation " );
199+ {
200+ std::ostringstream oss;
201+ oss << request ;
202+ eckit::Metrics::set ( " user_request " , oss. str ());
203+ }
204+ {
205+ std::ostringstream oss;
206+ oss << tableDropped ;
207+ eckit::Metrics::set ( " params " , oss. str ());
298208 }
299209 }
300210}
0 commit comments