--- /dev/null
+Fixed: The function ParamerHandler::add_parameter() used to
+call the internal action. Within that step, the action
+converts the default value to a string and back afterwards.
+This can lead to round-off errors so that the default
+values might change in the case of floating-point numbers.
+The action is not called any more during ParamerHandler::add_parameter(),
+fixing the problem.
+<br>
+(Peter Munch, Magdalena Schreter, 2022/12/11)
*
* The action is executed in three different circumstances:
* - With the default value of the parameter with name @p name, at
- * the end of the current function. This is useful because it allows
- * for the action to execute whatever it needs to do at least once
- * for each parameter, even those that are not actually specified in
- * the input file (and thus remain at their default values).
+ * the end of the current function if @p execute_action is set to
+ * true. This is useful because it allows for the action to execute
+ * whatever it needs to do at least once for each parameter, even
+ * those that are not actually specified in the input file (and
+ * thus remain at their default values). Note that if the action
+ * is executed, it converts the default value to a string and back
+ * afterwards. This can lead to round-off errors so that the default
+ * values might change in the case of floating-point numbers.
* - Within the ParameterHandler::set() functions that explicitly
* set a value for a parameter.
* - Within the parse_input() function and similar functions such
*/
void
add_action(const std::string & entry,
- const std::function<void(const std::string &value)> &action);
+ const std::function<void(const std::string &value)> &action,
+ const bool execute_action = true);
/**
* Declare a new entry name @p entry, set its default value to the content of
parameter = Patterns::Tools::Convert<ParameterType>::to_value(
val, *patterns[pattern_index]);
};
- add_action(entry, action);
+ add_action(entry, action, false);
}
DEAL_II_NAMESPACE_CLOSE
void
ParameterHandler::add_action(
const std::string & entry,
- const std::function<void(const std::string &)> &action)
+ const std::function<void(const std::string &)> &action,
+ const bool execute_action)
{
actions.push_back(action);
entries->put(get_current_full_path(entry) + path_separator + "actions",
Utilities::int_to_string(actions.size() - 1));
-
- // as documented, run the action on the default value at the very end
- const std::string default_value = entries->get<std::string>(
- get_current_full_path(entry) + path_separator + "default_value");
- action(default_value);
+ if (execute_action)
+ {
+ const std::string default_value = entries->get<std::string>(
+ get_current_full_path(entry) + path_separator + "default_value");
+ action(default_value);
+ }
}
--- /dev/null
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2022 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// The deal.II library is free software; you can use it, redistribute
+// it, and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// The full text of the license can be found in the file LICENSE.md at
+// the top level directory of deal.II.
+//
+// ---------------------------------------------------------------------
+
+
+
+// check that ParameterHandler::add_parameter() does not modify the
+// default value
+
+#include <deal.II/base/parameter_handler.h>
+
+#include "../tests.h"
+
+using namespace dealii;
+
+int
+main()
+{
+ initlog();
+
+ double a = std::numeric_limits<double>::lowest();
+
+ AssertThrow(a == std::numeric_limits<double>::lowest(), ExcInternalError());
+
+ ParameterHandler prm;
+ prm.add_parameter("test", a);
+
+ AssertThrow(a == std::numeric_limits<double>::lowest(), ExcInternalError());
+
+ deallog << "OK!" << std::endl;
+}
--- /dev/null
+
+DEAL::OK!