Performing parameter sweeps the easy way
See phantom-config for a Python package to parse, convert, modify, and generate Phantom config files, i.e. .in and .setup files.
Loops in the .in file
Phantom input files have some nice features, namely a “loop syntax” that can be used to perform parameter sweeps on ANY real or integer variable defined in the input file. For example, to perform a set of calculations using different values of the artificial viscosity parameter, edit the relevant line in the .in file (in this example called blast.in) from
alpha = 1.0000 ! art. viscosity parameter
to
alpha = 0.1 to 1.0 step 0.1 ! art. viscosity parameter
then run either phantom or phantomsetup on the modified input file:
./phantom blast.in
and you get the following output:
__
/ \
| LOOP DETECTED IN VARIABLE alpha in input file on line 29
\--->
WRITING 10 INPUT FILES VARYING alpha
---------------blast_alpha_0.10.in---------------
alpha = 0.1000 ! art. viscosity parameter
---------------blast_alpha_0.20.in---------------
alpha = 0.2000 ! art. viscosity parameter
---------------blast_alpha_0.30.in---------------
alpha = 0.3000 ! art. viscosity parameter
---------------blast_alpha_0.40.in---------------
alpha = 0.4000 ! art. viscosity parameter
---------------blast_alpha_0.50.in---------------
alpha = 0.5000 ! art. viscosity parameter
---------------blast_alpha_0.60.in---------------
alpha = 0.6000 ! art. viscosity parameter
---------------blast_alpha_0.70.in---------------
alpha = 0.7000 ! art. viscosity parameter
---------------blast_alpha_0.80.in---------------
alpha = 0.8000 ! art. viscosity parameter
---------------blast_alpha_0.90.in---------------
alpha = 0.9000 ! art. viscosity parameter
---------------blast_alpha_1.00.in---------------
alpha = 1.0000 ! art. viscosity parameter
and you should have a sequence of input files in the current directory, including the original “master” file:
$ ls *.in
blast.in blast_alpha_0.30.in blast_alpha_0.60.in blast_alpha_0.90.in
blast_alpha_0.10.in blast_alpha_0.40.in blast_alpha_0.70.in blast_alpha_1.00.in
blast_alpha_0.20.in blast_alpha_0.50.in blast_alpha_0.80.in
To set up a sequence of calculations, use the stagerun.sh script in the phantom/scripts directory:
$ ~/phantom/scripts/stageruns.sh blast_alpha*.in
This creates a directory corresponding to each input file, writes a local Makefile in each directory using the writemake.sh script, compiles phantom in each directory, and even writes a pbs/sge job submission script using the customisable “[[qscript|make qscript]]” functionality in the Phantom Makefile (customise the output of this script via the SYSTEM block in build/phantom/Makefile).
Loop syntax reference
The example given above shows the basic loop syntax with linear steps. You can also use logarithmic steps:
alpha = 0.1 to 1.0 logstep 0.1 ! art. viscosity parameter
which increments alpha in logarithmic intervals:
/ \
| LOOP DETECTED IN VARIABLE alpha in input file on line 29
\--->
WRITING 11 INPUT FILES VARYING alpha
---------------blast_alpha_0.10.in---------------
alpha = 0.1000 ! art. viscosity parameter
---------------blast_alpha_0.13.in---------------
alpha = 0.1259 ! art. viscosity parameter
---------------blast_alpha_0.16.in---------------
alpha = 0.1585 ! art. viscosity parameter
---------------blast_alpha_0.20.in---------------
alpha = 0.1995 ! art. viscosity parameter
---------------blast_alpha_0.25.in---------------
alpha = 0.2512 ! art. viscosity parameter
---------------blast_alpha_0.32.in---------------
alpha = 0.3162 ! art. viscosity parameter
---------------blast_alpha_0.40.in---------------
alpha = 0.3981 ! art. viscosity parameter
---------------blast_alpha_0.50.in---------------
alpha = 0.5012 ! art. viscosity parameter
---------------blast_alpha_0.63.in---------------
alpha = 0.6310 ! art. viscosity parameter
---------------blast_alpha_0.79.in---------------
alpha = 0.7943 ! art. viscosity parameter
---------------blast_alpha_1.00.in---------------
alpha = 1.0000 ! art. viscosity parameter
You can also specify the number of steps rather than the step interval:
alpha = 0.1 to 1.0 nstep 3 ! art. viscosity parameter
producing:
/ \
| LOOP DETECTED IN VARIABLE alpha in input file on line 29
\--->
WRITING 3 INPUT FILES VARYING alpha
---------------blast_alpha_0.10.in---------------
alpha = 0.1000 ! art. viscosity parameter
---------------blast_alpha_0.55.in---------------
alpha = 0.5500 ! art. viscosity parameter
---------------blast_alpha_1.00.in---------------
alpha = 1.0000 ! art. viscosity parameter
And similarly the number of logarithmic steps:
alpha = 0.1 to 1.0 nlogstep 3 ! art. viscosity parameter
giving:
__
/ \
| LOOP DETECTED IN VARIABLE alpha in input file on line 29
\--->
WRITING 3 INPUT FILES VARYING alpha
---------------blast_alpha_0.10.in---------------
alpha = 0.1000 ! art. viscosity parameter
---------------blast_alpha_0.32.in---------------
alpha = 0.3162 ! art. viscosity parameter
---------------blast_alpha_1.00.in---------------
alpha = 1.0000 ! art. viscosity parameter
Integer variables
Loop syntax also works with integer quantities in the input file. For example:
ishock_heating = 0 to 1 step 1 ! shock heating (0=off, 1=on)
produces:
__
/ \
| LOOP DETECTED IN VARIABLE ishock_heating in input file on line 35
\--->
---------------blast_ishock_heating_0.in---------------
ishock_heating = 0 ! shock heating (0=off, 1=on)
---------------blast_ishock_heating_1.in---------------
ishock_heating = 1 ! shock heating (0=off, 1=on)