• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Open-Sn / opensn / 16821314466

07 Aug 2025 04:57PM UTC coverage: 74.527% (+1.0%) from 73.488%
16821314466

push

github

web-flow
Merge pull request #708 from wdhawkins/curvilinear_warning

Adding experimental warning to curvilinear solver

3 of 3 new or added lines in 1 file covered. (100.0%)

250 existing lines in 17 files now uncovered.

17543 of 23539 relevant lines covered (74.53%)

44793362.81 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

38.72
/framework/parameters/input_parameters.cc
1
// SPDX-FileCopyrightText: 2024 The OpenSn Authors <https://open-sn.github.io/opensn/>
2
// SPDX-License-Identifier: MIT
3

4
#include "framework/parameters/input_parameters.h"
5
#include "framework/runtime.h"
6
#include "framework/logging/log.h"
7
#include <sstream>
8
#include <algorithm>
9
#include <utility>
10

11
namespace opensn
12
{
13

14
namespace
15
{
16

17
std::string
18
InputErrorStr(const std::string& error_scope,
×
19
              const std::string& object_type,
20
              const std::string& err_msg)
21
{
22
  return (error_scope.empty() ? "" : error_scope + "\n") + "Input error: " + object_type + "\n" +
×
23
         err_msg;
×
24
}
25

26
std::string
27
ParamNotPresentErrorStr(const std::string& function_name, const std::string& param_name)
×
28
{
29
  return std::string(__PRETTY_FUNCTION__) + ": Parameter \"" + param_name +
×
30
         "\" not present in list of parameters.";
×
31
}
32

33
} // namespace
34

35
const std::vector<std::string> InputParameters::system_ignored_param_names_ = {"obj_type"};
36

37
InputParameters&
UNCOV
38
InputParameters::operator+=(InputParameters other)
×
39
{
UNCOV
40
  for (const auto& param : other)
×
UNCOV
41
    AddParameter(param);
×
42

43
  // Copy maps
UNCOV
44
  {
×
UNCOV
45
    auto& other_map = other.parameter_class_tags_;
×
UNCOV
46
    auto& this_map = parameter_class_tags_;
×
UNCOV
47
    for (const auto& [param_name, tag] : other_map)
×
48
    {
UNCOV
49
      OpenSnLogicalErrorIf(this_map.count(param_name) != 0, "Duplicate tags detected.");
×
UNCOV
50
      this_map[param_name] = tag;
×
51
    }
52
  }
UNCOV
53
  {
×
UNCOV
54
    auto& other_map = other.parameter_doc_string_;
×
UNCOV
55
    auto& this_map = parameter_doc_string_;
×
UNCOV
56
    for (const auto& [param_name, tag] : other_map)
×
57
    {
UNCOV
58
      OpenSnLogicalErrorIf(this_map.count(param_name) != 0, "Duplicate tags detected.");
×
UNCOV
59
      this_map[param_name] = tag;
×
60
    }
61
  }
UNCOV
62
  {
×
UNCOV
63
    auto& other_map = other.deprecation_warning_tags_;
×
UNCOV
64
    auto& this_map = deprecation_warning_tags_;
×
UNCOV
65
    for (const auto& [param_name, tag] : other_map)
×
66
    {
67
      OpenSnLogicalErrorIf(this_map.count(param_name) != 0, "Duplicate tags detected.");
×
68
      this_map[param_name] = tag;
×
69
    }
70
  }
UNCOV
71
  {
×
UNCOV
72
    auto& other_map = other.deprecation_error_tags_;
×
UNCOV
73
    auto& this_map = deprecation_error_tags_;
×
UNCOV
74
    for (const auto& [param_name, tag] : other_map)
×
75
    {
76
      OpenSnLogicalErrorIf(this_map.count(param_name) != 0, "Duplicate tags detected.");
×
77
      this_map[param_name] = tag;
×
78
    }
79
  }
UNCOV
80
  {
×
UNCOV
81
    auto& other_map = other.renamed_error_tags_;
×
UNCOV
82
    auto& this_map = renamed_error_tags_;
×
UNCOV
83
    for (const auto& [param_name, tag] : other_map)
×
84
    {
85
      OpenSnLogicalErrorIf(this_map.count(param_name) != 0, "Duplicate tags detected.");
×
86
      this_map[param_name] = tag;
×
87
    }
88
  }
UNCOV
89
  {
×
UNCOV
90
    auto& other_map = other.type_mismatch_allowed_tags_;
×
UNCOV
91
    auto& this_map = type_mismatch_allowed_tags_;
×
UNCOV
92
    for (const auto& [param_name, tag] : other_map)
×
93
    {
UNCOV
94
      OpenSnLogicalErrorIf(this_map.count(param_name) != 0, "Duplicate tags detected.");
×
UNCOV
95
      this_map[param_name] = tag;
×
96
    }
97
  }
UNCOV
98
  {
×
UNCOV
99
    auto& other_map = other.parameter_link_;
×
UNCOV
100
    auto& this_map = parameter_link_;
×
UNCOV
101
    for (const auto& [param_name, tag] : other_map)
×
102
    {
103
      OpenSnLogicalErrorIf(this_map.count(param_name) != 0, "Duplicate tags detected.");
×
104
      this_map[param_name] = tag;
×
105
    }
106
  }
UNCOV
107
  {
×
UNCOV
108
    auto& other_map = other.constraint_tags_;
×
UNCOV
109
    auto& this_map = constraint_tags_;
×
UNCOV
110
    for (auto& [param_name, tag] : other_map)
×
111
    {
112
      OpenSnLogicalErrorIf(this_map.count(param_name) != 0, "Duplicate tags detected.");
×
113
      this_map[param_name] = std::move(tag);
×
114
    }
115
  }
116

UNCOV
117
  return *this;
×
118
}
119

120
void
121
InputParameters::SetObjectType(const std::string& obj_type)
2,373✔
122
{
123
  class_name_ = obj_type;
2,373✔
124
}
2,373✔
125

126
std::string
127
InputParameters::GetObjectType() const
×
128
{
129
  return class_name_;
×
130
}
131

132
void
133
InputParameters::LinkParameterToBlock(const std::string& param_name, const std::string& block_name)
1,202✔
134
{
135
  OpenSnInvalidArgumentIf(not this->Has(param_name),
1,202✔
136
                          "Parameter \"" + param_name + "\" not present in block");
137
  parameter_link_[param_name] = block_name;
1,202✔
138
}
1,202✔
139

140
std::string
141
InputParameters::GetParameterDocumentationLink(const std::string& param_name) const
×
142
{
143
  if (parameter_link_.count(param_name) > 0)
×
144
    return parameter_link_.at(param_name);
×
145
  return {};
×
146
}
147

148
std::string
149
InputParameters::GetParameterDocString(const std::string& param_name)
×
150
{
151
  OpenSnInvalidArgumentIf(parameter_doc_string_.count(param_name) == 0,
×
152
                          "Invalid parameter \"" + param_name + "\".");
153
  return parameter_doc_string_.at(param_name);
×
154
}
155

156
bool
157
InputParameters::IsParameterIgnored(const std::string& param_name)
70,628✔
158
{
159
  bool ignored = false;
70,628✔
160

161
  {
70,628✔
162
    auto& list = system_ignored_param_names_;
70,628✔
163
    if (std::find(list.begin(), list.end(), param_name) != list.end())
70,628✔
164
      ignored = true;
×
165
  }
166

167
  return ignored;
70,628✔
168
}
169

170
void
171
InputParameters::AddOptionalParameterBlock(const std::string& name,
312✔
172
                                           const ParameterBlock& block,
173
                                           const std::string& doc_string)
174
{
175
  auto new_block = block;
312✔
176
  new_block.SetBlockName(name);
312✔
177
  AddParameter(new_block);
312✔
178
  parameter_class_tags_[name] = InputParameterTag::OPTIONAL;
312✔
179
  parameter_doc_string_[name] = doc_string;
312✔
180
}
312✔
181

182
void
183
InputParameters::AddOptionalParameterArray(const std::string& name,
604✔
184
                                           const std::vector<ParameterBlock>& array,
185
                                           const std::string& doc_string)
186
{
187
  ParameterBlock new_block(name);
604✔
188
  new_block.ChangeToArray();
604✔
189
  for (auto& block : array)
604✔
190
    new_block.AddParameter(block);
×
191

192
  AddParameter(new_block);
604✔
193
  parameter_class_tags_[name] = InputParameterTag::OPTIONAL;
604✔
194
  parameter_doc_string_[name] = doc_string;
604✔
195
}
604✔
196

197
void
198
InputParameters::AddRequiredParameterBlock(const std::string& name, const std::string& doc_string)
24✔
199
{
200
  ParameterBlock new_block(name);
24✔
201
  AddParameter(new_block);
24✔
202
  parameter_class_tags_[name] = InputParameterTag::REQUIRED;
24✔
203
  parameter_doc_string_[name] = doc_string;
24✔
204
}
24✔
205

206
void
207
InputParameters::AddRequiredParameterArray(const std::string& name, const std::string& doc_string)
1,546✔
208
{
209
  ParameterBlock new_block(name);
1,546✔
210
  new_block.ChangeToArray();
1,546✔
211
  AddParameter(new_block);
1,546✔
212
  parameter_class_tags_[name] = InputParameterTag::REQUIRED;
1,546✔
213
  parameter_doc_string_[name] = doc_string;
1,546✔
214
}
1,546✔
215

216
void
217
InputParameters::AssignParameters(const ParameterBlock& params)
4,006✔
218
{
219
  param_block_at_assignment_ = params;
4,006✔
220
  std::stringstream err_stream;
4,006✔
221

222
  if (log.GetVerbosity() >= 2)
4,006✔
223
    log.Log0Verbose2() << "Number of parameters " << params.GetNumParameters();
×
224

225
  // Check required parameters
226
  // Loops over all input-parameters that have been
227
  // classed as being required. Input-parameters that
228
  // have any form of deprecation is ignored.
229
  for (const auto& [param_index, tag] : parameter_class_tags_)
40,253✔
230
  {
231
    if (tag != InputParameterTag::REQUIRED)
36,247✔
232
      continue;
31,847✔
233

234
    const auto& req_param = GetParam(param_index);
4,400✔
235
    const auto& req_param_name = req_param.GetName();
4,400✔
236

237
    if (deprecation_warning_tags_.count(req_param_name) > 0 or
4,400✔
238
        deprecation_error_tags_.count(req_param_name) > 0 or
4,400✔
239
        renamed_error_tags_.count(req_param_name) > 0)
4,400✔
240
      continue;
×
241

242
    if (not params.Has(req_param_name))
4,400✔
243
      err_stream << "Required param \"" << req_param_name
×
244
                 << "\" not supplied.\ndoc-string: " << GetParameterDocString(req_param_name)
×
245
                 << "\nEnsure the parameter given is supplied or not nil";
×
246
  }
4,400✔
247

248
  if (not err_stream.str().empty())
4,006✔
249
    throw std::invalid_argument(
×
250
      InputErrorStr(GetErrorOriginScope(), GetObjectType(), err_stream.str()));
×
251

252
  // Check unused parameters
253
  // Loops over all candidate-parameters and
254
  // checks whether they have an assignable
255
  // input-parameter or if they have been renamed.
256
  {
4,006✔
257
    for (const auto& param : params.GetParameters())
21,663✔
258
    {
259
      const auto& param_name = param.GetName();
17,657✔
260
      if (IsParameterIgnored(param_name))
17,657✔
261
        continue;
×
262
      if (not this->Has(param_name))
17,657✔
263
        err_stream << "Invalid param \"" << param_name << "\" supplied.\n";
×
264
      else if (renamed_error_tags_.count(param_name) > 0)
35,314✔
265
      {
266
        err_stream << "Invalid param \"" << param_name << "\" supplied. ";
×
267
        err_stream << "The parameter has been renamed. ";
×
268
        err_stream << renamed_error_tags_.at(param_name);
17,657✔
269
      }
270
    }
17,657✔
271

272
    if (not err_stream.str().empty())
4,006✔
273
      throw std::invalid_argument(
×
274
        InputErrorStr(GetErrorOriginScope(), GetObjectType(), err_stream.str()));
×
275
  }
276

277
  // Check deprecation warnings
278
  // Loops over all candidate-parameters and
279
  // checks whether they have deprecation warnings.
280
  {
4,006✔
281
    const auto& dep_warns = deprecation_warning_tags_;
4,006✔
282
    for (const auto& param : params.GetParameters())
21,663✔
283
    {
284
      const auto& param_name = param.GetName();
17,657✔
285

286
      if (IsParameterIgnored(param_name))
17,657✔
287
        continue;
×
288

289
      if (this->Has(param_name) and (dep_warns.count(param_name) > 0))
35,314✔
290
        log.Log0Warning() << "Parameter \"" << param_name << "\" has been deprecated "
×
291
                          << "and will be removed soon.\n"
×
292
                          << dep_warns.at(param_name);
×
293
    }
17,657✔
294
  }
295

296
  // Check deprecation errors
297
  // Loops over all candidate-parameters and
298
  // checks whether they have deprecation errors.
299
  {
4,006✔
300
    const auto& dep_errs = deprecation_error_tags_;
4,006✔
301
    for (const auto& param : params.GetParameters())
21,663✔
302
    {
303
      const auto& param_name = param.GetName();
17,657✔
304

305
      if (IsParameterIgnored(param_name))
17,657✔
306
        continue;
×
307

308
      if (this->Has(param_name) and (dep_errs.count(param_name) > 0))
35,314✔
309
      {
310
        std::ostringstream oss;
×
311
        oss << "Parameter \"" << param_name << "\" has been deprecated.\n"
×
312
            << dep_errs.at(param_name);
×
313
        throw std::runtime_error(oss.str());
×
314
      }
×
315
    }
17,657✔
316
  }
317

318
  // Now attempt to assign values
319
  for (auto& param : params.GetParameters())
21,663✔
320
  {
321
    const auto& param_name = param.GetName();
17,657✔
322

323
    if (IsParameterIgnored(param_name))
17,657✔
324
      continue;
×
325

326
    auto& input_param = GetParam(param_name);
17,657✔
327

328
    // Check types match
329
    if (param.GetType() != input_param.GetType())
17,657✔
330
    {
331
      if (type_mismatch_allowed_tags_.count(param_name) == 0)
×
332
      {
333
        err_stream << "Invalid parameter type \"" << ParameterBlockTypeName(param.GetType())
×
334
                   << "\" for parameter \"" << param_name << "\". Expecting type \""
335
                   << ParameterBlockTypeName(input_param.GetType()) << "\".\n"
×
336
                   << "doc-string: " << GetParameterDocString(param_name);
×
337
        continue;
×
338
      } // if not mismatch allowed
339
    } // if type mismatch
340

341
    // Check constraint
342
    if (constraint_tags_.count(input_param.GetName()) != 0)
35,314✔
343
    {
344
      const auto& constraint = constraint_tags_.at(input_param.GetName());
3,391✔
345
      if (not constraint->IsAllowable(param.GetValue()))
3,391✔
346
      {
347
        err_stream << constraint->OutOfRangeString(input_param.GetName(), param.GetValue());
×
348
        err_stream << "\n";
×
349
        continue;
×
350
      }
351
    } // if constraint
352

353
    if (log.GetVerbosity() >= 2)
17,657✔
354
      log.Log0Verbose2() << "Setting parameter " << param_name;
×
355
    input_param = param;
17,657✔
356
    parameter_valid_[param_name] = true;
17,657✔
357
  } // for input params
17,657✔
358

359
  if (not err_stream.str().empty())
4,006✔
360
    throw std::invalid_argument(
×
361
      InputErrorStr(GetErrorOriginScope(), GetObjectType(), err_stream.str()));
×
362
}
4,006✔
363

364
void
365
InputParameters::MarkParameterDeprecatedWarning(const std::string& param_name,
×
366
                                                const std::string& deprecation_message)
367
{
368
  if (Has(param_name))
×
369
    deprecation_warning_tags_[param_name] = deprecation_message;
×
370
  else
371
    throw std::logic_error(ParamNotPresentErrorStr(__PRETTY_FUNCTION__, param_name));
×
372
}
×
373

374
void
375
InputParameters::MarkParameterDeprecatedError(const std::string& param_name,
×
376
                                              const std::string& deprecation_message)
377
{
378
  if (Has(param_name))
×
379
    deprecation_error_tags_[param_name] = deprecation_message;
×
380
  else
381
    throw std::logic_error(ParamNotPresentErrorStr(__PRETTY_FUNCTION__, param_name));
×
382
}
×
383

384
void
385
InputParameters::MarkParameterRenamed(const std::string& param_name,
×
386
                                      const std::string& renaming_description)
387
{
388
  if (Has(param_name))
×
389
    renamed_error_tags_[param_name] = renaming_description;
×
390
  else
391
    throw std::logic_error(ParamNotPresentErrorStr(__PRETTY_FUNCTION__, param_name));
×
392
}
×
393

394
void
395
InputParameters::ConstrainParameterRange(const std::string& param_name,
5,285✔
396
                                         std::shared_ptr<AllowableRange> allowable_range)
397
{
398
  if (Has(param_name))
5,285✔
399
  {
400
    const auto& param_type = GetParam(param_name).GetType();
5,285✔
401
    OpenSnInvalidArgumentIf(
5,285✔
402
      param_type == ParameterBlockType::BLOCK or param_type == ParameterBlockType::ARRAY,
403
      std::string("Parameter \"") + param_name + "\" is of type " +
404
        ParameterBlockTypeName(param_type) + " to which constraints cannot be applied");
405
    constraint_tags_[param_name] = allowable_range;
5,285✔
406
  }
407
  else
408
    throw std::logic_error(ParamNotPresentErrorStr(__PRETTY_FUNCTION__, param_name));
×
409
}
5,285✔
410

411
void
UNCOV
412
InputParameters::SetParameterTypeMismatchAllowed(const std::string& param_name)
×
413
{
UNCOV
414
  OpenSnInvalidArgumentIf(not Has(param_name), "Parameter \"" + param_name + "\" not present.");
×
UNCOV
415
  type_mismatch_allowed_tags_[param_name] = true;
×
UNCOV
416
}
×
417

418
void
419
InputParameters::DumpParameters() const
×
420
{
421
  log.Log() << "CLASS_NAME " << class_name_;
×
422

423
  log.Log() << "DESCRIPTION_BEGIN";
×
424
  std::cout << GetGeneralDescription() << "\n";
×
425
  log.Log() << "DESCRIPTION_END\n";
×
426

427
  log.Log() << "DOC_GROUP " << doc_group_;
×
428
  const std::string sp2 = "  ";
×
429
  const std::string sp4 = "    ";
×
430
  const auto params = GetParameters();
×
431
  for (const auto& param : params)
×
432
  {
433
    const auto& param_name = param.GetName();
×
434
    log.Log() << sp2 << "PARAM_BEGIN " << param_name;
×
435

436
    const auto type = param.GetType();
×
437

438
    log.Log() << sp4 << "TYPE " << ParameterBlockTypeName(type);
×
439

440
    if (parameter_class_tags_.at(param_name) == InputParameterTag::OPTIONAL)
×
441
    {
442
      log.Log() << sp4 << "TAG OPTIONAL";
×
443
      if (type != ParameterBlockType::BLOCK and type != ParameterBlockType::ARRAY)
×
444
        log.Log() << sp4 << "DEFAULT_VALUE " << param.GetValue().PrintStr();
×
445
      else if (type == ParameterBlockType::ARRAY)
×
446
      {
447
        std::stringstream outstr;
×
448
        outstr << sp4 << "DEFAULT_VALUE ";
×
449
        for (size_t k = 0; k < param.GetNumParameters(); ++k)
×
450
        {
451
          const auto& sub_param = param.GetParam(k);
×
452
          outstr << sub_param.GetValue().PrintStr() << ", ";
×
453
        }
454
        log.Log() << outstr.str();
×
455
      }
×
456
    }
457
    else
458
      log.Log() << sp4 << "TAG REQUIRED";
×
459

460
    if (constraint_tags_.count(param_name) != 0)
×
461
      log.Log() << sp4 << "CONSTRAINTS " << constraint_tags_.at(param_name)->PrintRange();
×
462

463
    if (parameter_doc_string_.count(param_name) != 0)
×
464
    {
465
      log.Log() << sp4 << "DOC_STRING_BEGIN";
×
466
      std::cout << parameter_doc_string_.at(param_name) << "\n";
×
467
      log.Log() << sp4 << "DOC_STRING_END";
×
468
    }
469

470
    const auto& linkage = GetParameterDocumentationLink(param_name);
×
471
    if (not linkage.empty())
×
472
    {
473
      log.Log() << sp4 << "LINKS " << linkage;
×
474
    }
475

476
    log.Log() << sp2 << "PARAM_END";
×
477
  }
×
478
}
×
479

480
bool
481
InputParameters::IsParameterValid(const std::string& param_name) const
2,072✔
482
{
483
  auto it = parameter_valid_.find(param_name);
2,072✔
484
  if (it != parameter_valid_.end())
2,072✔
485
    return it->second;
1,680✔
486
  else
487
    return false;
488
}
489

490
} // namespace opensn
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc