Reference documentation for deal.II version 9.1.1
|
#include <deal.II/base/parameter_acceptor.h>
Public Member Functions | |
ParameterAcceptor (const std::string §ion_name="") | |
virtual | ~ParameterAcceptor () override |
virtual void | declare_parameters (ParameterHandler &prm) |
virtual void | parse_parameters (ParameterHandler &prm) |
std::string | get_section_name () const |
std::vector< std::string > | get_section_path () const |
template<class ParameterType > | |
void | add_parameter (const std::string &entry, ParameterType ¶meter, const std::string &documentation="", ParameterHandler &prm_=prm, const Patterns::PatternBase &pattern= *Patterns::Tools::Convert< ParameterType >::to_pattern()) |
void | enter_my_subsection (ParameterHandler &prm) |
void | leave_my_subsection (ParameterHandler &prm) |
Public Member Functions inherited from Subscriptor | |
Subscriptor () | |
Subscriptor (const Subscriptor &) | |
Subscriptor (Subscriptor &&) noexcept | |
virtual | ~Subscriptor () |
Subscriptor & | operator= (const Subscriptor &) |
Subscriptor & | operator= (Subscriptor &&) noexcept |
void | subscribe (std::atomic< bool > *const validity, const std::string &identifier="") const |
void | unsubscribe (std::atomic< bool > *const validity, const std::string &identifier="") const |
unsigned int | n_subscriptions () const |
template<typename StreamType > | |
void | list_subscribers (StreamType &stream) const |
void | list_subscribers () const |
template<class Archive > | |
void | serialize (Archive &ar, const unsigned int version) |
Static Public Member Functions | |
static void | initialize (const std::string &filename="", const std::string &output_filename="", const ParameterHandler::OutputStyle output_style_for_prm_format=ParameterHandler::ShortText, ParameterHandler &prm=ParameterAcceptor::prm) |
static void | initialize (std::istream &input_stream, ParameterHandler &prm=ParameterAcceptor::prm) |
static void | clear () |
static void | parse_all_parameters (ParameterHandler &prm=ParameterAcceptor::prm) |
static void | declare_all_parameters (ParameterHandler &prm=ParameterAcceptor::prm) |
Static Public Member Functions inherited from Subscriptor | |
static ::ExceptionBase & | ExcInUse (int arg1, std::string arg2, std::string arg3) |
static ::ExceptionBase & | ExcNoSubscriber (std::string arg1, std::string arg2) |
Public Attributes | |
boost::signals2::signal< void()> | declare_parameters_call_back |
boost::signals2::signal< void()> | parse_parameters_call_back |
Static Public Attributes | |
static ParameterHandler | prm |
Protected Attributes | |
const std::string | section_name |
Private Attributes | |
const unsigned int | acceptor_id |
Static Private Attributes | |
static std::vector< SmartPointer< ParameterAcceptor > > | class_list |
static const char | sep = '/' |
A parameter acceptor base class. This class is used to define a public interface for classes which want to use a single global ParameterHandler to handle parameters. This class declares one static ParameterHandler, and two static functions (declare_all_parameters() and parse_all_parameters()) that manage all of the derived classes.
The basic interface provides two subscription mechanisms: a global subscription mechanism and a local subscription mechanism.
The global subscription mechanism is such that whenever an object of a class derived from ParameterAcceptor is created, then a pointer to that object-of-derived-type is registered, together with a path in the parameter file.
Such registry is traversed upon invocation of the single function ParameterAcceptor::initialize(file.prm) which in turn calls the method ParameterAcceptor::declare_parameters() for each of the registered classes, reads the file file.prm
and subsequently calls the method ParameterAcceptor::parse_parameters(), again for each of the registered classes. The method log_info() can be used to extract information about the classes that have been derived from ParameterAcceptor, and that will be parsed when calling ParameterAcceptor::initialize().
ParameterAcceptor can be used in three different ways: by overloading the ParameterAcceptor::declare_parameters() and ParameterAcceptor::parse_parameters() methods, by calling its ParameterAcceptor::add_parameter() method for each parameter we want to have, or by constructing a ParameterAcceptorProxy class with your own class, provided that your class implements the declare_parameters
and parse_parameters
functions (the first can be a static member in this case).
By using the add_parameter method, ParameterAcceptor makes sure that the given parameter is registered in the global parameter handler (by calling ParameterHandler::add_parameter()), at the correct path. If you define all your parameters using the ParameterAcceptor::add_parameter() method, then you don't need to overload any of the virtual methods of this class.
If some post processing is required on the parsed values, the user can attach a signal to ParameterAcceptor::declare_parameters_call_back and ParameterAcceptor::parse_parameters_call_back, that are called just after the declare_parameters() and parse_parameters() functions of each derived class.
A typical usage of this class is the following:
An implementation that uses user defined declare and parse functions is given by the following example:
Parameter files can be organised into section/subsection/subsubsection. To do so, the std::string passed to ParameterAcceptor within the constructor of the derived class needs to contain the separator "/". In fact, "first/second/third/My Class" will organize the parameters as follows
In the following examples, we propose some use cases with increasing complexities.
MyClass is derived from ParameterAcceptor and has a member object that is derived itself from ParameterAcceptor.
In this case, the structure of the parameters will be
Now suppose that in the main file we need two or more objects of MyClass
What we will read in the parameter file looks like
Note that there is only one section "Forcing term", this is because both objects have defined the same name for the section of their SomeParsedClass. There are two strategies to change this behaviour. The first one (not recommended) would be to change the name of the section of SomeParsedClass such that it contains also the string passed to the constructor of MyClass:
The other way to proceed (recommended) is to use exploit the /section/subsection approach in the main class.
Now, in the parameter file we can find
Note the "/" at the begin of the string name. This is interpreted by ParameterAcceptor like the root folder in Unix systems. The sections "Class A" and "Class B" will not be nested under any section. On the other hand, if the string does not begin with a "/" as in the previous cases the section will be created under the current path, which depends on the previously defined sections/subsections/subsubsections. Indeed, the section "Forcing term" is nested under "Class A" or "Class B". To make things more clear. let's consider the following two examples
The parameter file will have the following structure
If instead one of the paths ends with "/" instead of just a name of the class, subsequent classes will interpret this as a full path, interpreting the class name as a directory name:
The parameter file will have the following structure
As a final remark, in order to allow a proper management of all the sections/subsections, the instantiation of objects and the call to ParameterAcceptor::initialize() cannot be done on multiple, concurrently running threads.
If you pass an empty name, the boost::core::demangle() function is used to fill the section name with a human readable version of the class name itself.
See the tutorial program step-60 for an example on how to use this class.
Definition at line 350 of file parameter_acceptor.h.
ParameterAcceptor::ParameterAcceptor | ( | const std::string & | section_name = "" | ) |
The constructor adds derived classes to the list of acceptors. If a section name is specified, then this is used to scope the parameters in the given section, otherwise a pretty printed version of the derived class is used.
Definition at line 32 of file parameter_acceptor.cc.
|
overridevirtual |
Destructor.
Definition at line 42 of file parameter_acceptor.cc.
|
static |
Call declare_all_parameters(), read the parameters from filename
(only if filename
is a non-empty string), and then call parse_all_parameters().
If the parameter filename
is the empty string, then no attempt to read a parameter file is done. This may be useful if you are ok with using default values, and don't want to read external files to use a class derived from ParameterAcceptor.
If outfilename is not the empty string, then write the content that was read in to the outfilename. The format of both input and output files are selected using the extensions of the files themselves. This can be either prm
or xml
for input, and prm
, xml
, or tex/latex
for output. If the output format is prm
, then output_style_for_prm_format
is used to decide whether we write the full documentation as well, or only the parameters.
If the input file does not exist, a default one with the same name is created for you, and an exception is thrown.
filename | Input file name |
output_filename | Output file name |
output_style_for_prm_format | How to write the output file if format is prm |
prm | The ParameterHandler to use |
Definition at line 56 of file parameter_acceptor.cc.
|
static |
Call declare_all_parameters(), read the parameters from the input_stream
in prm
format, and then call parse_all_parameters().
An exception is thrown if the input_stream
is invalid.
input_stream | Input stream |
prm | The ParameterHandler to use |
Definition at line 143 of file parameter_acceptor.cc.
|
static |
Clear class list and global parameter file.
Definition at line 153 of file parameter_acceptor.cc.
|
virtual |
Derived classes can use this method to declare their parameters. ParameterAcceptor::initialize() calls it for each derived class. The default implementation is empty.
Reimplemented in ParameterAcceptorProxy< SourceClass >.
Definition at line 162 of file parameter_acceptor.cc.
|
virtual |
Derived classes can use this method to parse their parameters. ParameterAcceptor::initialize() calls it for each derived class. The default implementation is empty.
Reimplemented in ParameterAcceptorProxy< SourceClass >.
Definition at line 168 of file parameter_acceptor.cc.
|
static |
Parse the given ParameterHandler. This function enters the subsection returned by get_section_name() for each derived class, and parses all parameters that were added using add_parameter().
Definition at line 174 of file parameter_acceptor.cc.
|
static |
Initialize the global ParameterHandler with all derived classes parameters.This function enters the subsection returned by get_section_name() for each derived class, and declares all parameters that were added using add_parameter().
Definition at line 187 of file parameter_acceptor.cc.
std::string ParameterAcceptor::get_section_name | ( | ) | const |
Return the section name of this class. If a name was provided at construction time, then that name is returned, otherwise it returns the demangled name of this class.
Definition at line 48 of file parameter_acceptor.cc.
std::vector< std::string > ParameterAcceptor::get_section_path | ( | ) | const |
Traverse all registered classes, and figure out what subsections we need to enter.
Definition at line 201 of file parameter_acceptor.cc.
void ParameterAcceptor::add_parameter | ( | const std::string & | entry, |
ParameterType & | parameter, | ||
const std::string & | documentation = "" , |
||
ParameterHandler & | prm_ = prm , |
||
const Patterns::PatternBase & | pattern = *Patterns::Tools::Convert<ParameterType>::to_pattern() |
||
) |
Add a parameter in the correct path. This method forwards all arguments to the prm.add_parameter() method, after entering the correct section path. By default it uses the ParameterAcceptor::prm variable as ParameterHandler.
See the documentation of ParameterHandler::add_parameter() for more information.
Definition at line 628 of file parameter_acceptor.h.
void ParameterAcceptor::enter_my_subsection | ( | ParameterHandler & | prm = ParameterAcceptor::prm | ) |
Make sure we enter the right subsection of the given parameter.
Definition at line 242 of file parameter_acceptor.cc.
void ParameterAcceptor::leave_my_subsection | ( | ParameterHandler & | prm = ParameterAcceptor::prm | ) |
This function undoes what the enter_my_subsection() function did. It only makes sense if enter_my_subsection() was called on prm
before this one.
Definition at line 253 of file parameter_acceptor.cc.
boost::signals2::signal<void()> ParameterAcceptor::declare_parameters_call_back |
Declare parameter call back. This signal is triggered right after declare_parameters() has been called, to allow users to prepare their variables right after parameters have been decalred. The default implementation is empty.
Definition at line 434 of file parameter_acceptor.h.
boost::signals2::signal<void()> ParameterAcceptor::parse_parameters_call_back |
Parse parameter call back. This function is called at the end of parse_parameters(), to allow users to process their parameters right after they have been parsed. The default implementation is empty.
You can use this function, for example, to create a quadrature rule after you have read how many quadrature points you wanted to use from the parameter file.
Definition at line 453 of file parameter_acceptor.h.
|
static |
The global parameter handler.
Definition at line 508 of file parameter_acceptor.h.
|
staticprivate |
A list containing all constructed classes of type ParameterAcceptor.
Definition at line 528 of file parameter_acceptor.h.
|
private |
The index of this specific class within the class list.
Definition at line 531 of file parameter_acceptor.h.
|
staticprivate |
Separator between sections.
Definition at line 536 of file parameter_acceptor.h.
|
protected |
The subsection name for this class.
Definition at line 540 of file parameter_acceptor.h.