Namelists
| Define a namelist | |
| Read one | |
| Write one | |
| Config-file pattern |
Define a namelist
A namelist groups several variables under one name so they can be read and written together. Declare the variables first, then list them in a namelist statement. The group name sits between slashes, as in /cfg/.
program cfg_demo
implicit none
integer :: nx = 100
real :: tol = 1.0e-6
character(len=32) :: title = "run1"
namelist /cfg/ nx, tol, title
end program cfg_demo
Read one
Open the text file, read it with the nml selector, then close the file. Every name found in the file is stored into the matching variable. Names that are missing simply keep their current values.
program cfg_read
implicit none
integer :: nx = 100
real :: tol = 1.0e-6
character(len=32) :: title = "run1"
namelist /cfg/ nx, tol, title
integer :: u
open(newunit=u, file="cfg.nml", status="old", action="read")
read(u, nml=cfg)
close(u)
end program cfg_read
Write one
Write the whole group with the nml selector to print every name and value. This is handy for logging the exact settings that a run has used.
program cfg_write
implicit none
integer :: nx = 100
real :: tol = 1.0e-6
character(len=32) :: title = "run1"
namelist /cfg/ nx, tol, title
write(*, nml=cfg)
end program cfg_write
Config-file pattern
A common pattern is to set safe defaults in the code and let a short config file override them. Ship a default cfg.nml file with the program and read it at startup. Unknown names stop the program with an error, so keep the file and the namelist in sync.
&cfg
nx = 200
tol = 1.0e-8
title = "big"
/
Next: IEEE arithmetic
Article author: Arthur Isaev