Default Values, Arrays and Constants
Default Values
When initialising a simulation from a configuration file it is, in many cases, desirable to specify reasonable default values for some of the parameters. This means that the end user does not have to specify every last value. This helps keep configuration files manageable. Recall the code from the First Example.
class SimulationBlock : public Block { private: int size; double dx; std::string info; protected: void initParameters(BlockParameters ¶meters) { parameters.addParameter("size", &size); parameters.addParameter("dx", &dx); parameters.addParameter("info", &info); } };
The corresponding configuration file needs to specify values for all three parameters. If you omit only one of them you will get an error when trying to evaluate the parameters with a call to evaluateParameters
. However, Schnek let’s you easily define default values for the parameters by simply passing them to the addParameter
function. The following code shows how.
class SimulationBlock : public Block { private: int size; double dx; std::string info; protected: void initParameters(BlockParameters ¶meters) { parameters.addParameter("size", &size, 100); parameters.addParameter("dx", &dx, 0.01); parameters.addParameter("info", &info, std::string("No information supplied.")); } };
Now you are free to leave any of the three parameters from the configuration file in which case the default values will be set.
The code for this example can be found here. An example setup file is given by example_setup_defaults01.setup.
Arrays
If some of your parameters are arrays, Schnek provides an easy to use function for adding those as well. Look at the following example.
class SimulationBlock : public Block { private: Array<double, 3> pos; protected: void initParameters(BlockParameters ¶meters) { parameters.addArrayParameter("pos", pos); } };
This code will register three individual parameters posx
, posy
and posy
for the three components of the array. The corresponding configuration file will look like this.
posx = 0.5; posy = 1.5; posz = 2.5;
Of course you can specify a default value that you want the array to be filled with if no value is specified in the configuration file. Modifying the line in the code above to
parameters.addArrayParameter("pos", pos, -1.0);
will set the default value to -1.0
. The configuration file is now free to specify only some of the values.
posx = 0.5; posz = 2.5;
This will result in the array being initialised with the following values.
pos = (0.5, -1.0, 2.5)
The code for this example is available here. An example setup file is given by example_setup_array.setup.
Constants
Finally, you might want to help the user of your simulation code to quickly create configuration files by supplying useful constants. These values should be available to be used inside expressions. On the other hand the user should not be able to modify the values of these constants. The addConstant
function does exactly that. Given the code above you can simply add the following line to the initParameters
function.
parameters.addConstant("pi", M_PI);
Assuming that M_PI
is defined and holds the value of π, this will allow the use of pi
in the configuration file, such as
dx = 2*pi;
Attempting to change the value of pi
on the other hand will result in an error.
The code for this example is available here. An example setup file is given by example_setup_constant.setup.