mod_config Module

Module that allows working with a configuration file


Variables

Type Visibility Attributes Name Initial
integer, public, parameter :: CFG_integer_type = 1

Integer type

integer, public, parameter :: CFG_logic_type = 4

Boolean/logical type

integer, public, parameter :: CFG_max_array_size = 20

Maximum number of entries in a variable (if it's an array)

integer, public, parameter :: CFG_name_len = 80

Maximum length of variable names

integer, public, parameter :: CFG_real_type = 2

Real number type

integer, public, parameter :: CFG_string_len = 200

Fixed length of string type

integer, public, parameter :: CFG_string_type = 3

String type

character(len=10), public, parameter :: CFG_type_names(0:CFG_num_types) = [character(len=10)::"storage", "integer", "real", "string ", "logical"]

Names of the types

character(len=*), private, parameter :: CFG_category_separator = "%"

The separator for categories (stored in var_name)

integer, private, parameter :: CFG_num_types = 4

Number of variable types

character(len=*), private, parameter :: CFG_separators = " ,'"""//char(9)

The separator(s) for array-like variables (space, comma, ', ", and tab)

integer, private, parameter :: CFG_unknown_type = 0

Used before a variable is created

integer, private, parameter :: dp = kind(0.0d0)

The double precision kind-parameter


Interfaces

public interface CFG_add

Interface to add variables to the configuration

  • private subroutine add_real(cfg, var_name, real_data, comment)

    Add a configuration variable with a real value

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    real(kind=dp), intent(in) :: real_data
    character(len=*), intent(in) :: comment
  • private subroutine add_real_array(cfg, var_name, real_data, comment, dynamic_size)

    Add a configuration variable with an array of type

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    real(kind=dp), intent(in) :: real_data(:)
    character(len=*), intent(in) :: comment
    logical, intent(in), optional :: dynamic_size
  • private subroutine add_int(cfg, var_name, int_data, comment)

    Add a configuration variable with an integer value

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    integer, intent(in) :: int_data
    character(len=*), intent(in) :: comment
  • private subroutine add_int_array(cfg, var_name, int_data, comment, dynamic_size)

    Add a configuration variable with an array of type integer

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    integer, intent(in) :: int_data(:)
    character(len=*), intent(in) :: comment
    logical, intent(in), optional :: dynamic_size
  • private subroutine add_string(cfg, var_name, char_data, comment)

    Add a configuration variable with an character value

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    character(len=*), intent(in) :: char_data
    character(len=*), intent(in) :: comment
  • private subroutine add_string_array(cfg, var_name, char_data, comment, dynamic_size)

    Add a configuration variable with an array of type character

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    character(len=*), intent(in) :: char_data(:)
    character(len=*), intent(in) :: comment
    logical, intent(in), optional :: dynamic_size
  • private subroutine add_logic(cfg, var_name, logic_data, comment)

    Add a configuration variable with an logical value

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    logical, intent(in) :: logic_data
    character(len=*), intent(in) :: comment
  • private subroutine add_logic_array(cfg, var_name, logic_data, comment, dynamic_size)

    Add a configuration variable with an array of type logical

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    logical, intent(in) :: logic_data(:)
    character(len=*), intent(in) :: comment
    logical, intent(in), optional :: dynamic_size

public interface CFG_add_get

Interface to get variables from the configuration

  • private subroutine add_get_real(cfg, var_name, real_data, comment)

    Get or add a real value of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    real(kind=dp), intent(inout) :: real_data
    character(len=*), intent(in) :: comment
  • private subroutine add_get_real_array(cfg, var_name, real_data, comment, dynamic_size)

    Get or add a real array of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    real(kind=dp), intent(inout) :: real_data(:)
    character(len=*), intent(in) :: comment
    logical, intent(in), optional :: dynamic_size
  • private subroutine add_get_int(cfg, var_name, int_data, comment)

    Get or add a integer value of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    integer, intent(inout) :: int_data
    character(len=*), intent(in) :: comment
  • private subroutine add_get_int_array(cfg, var_name, int_data, comment, dynamic_size)

    Get or add a integer array of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    integer, intent(inout) :: int_data(:)
    character(len=*), intent(in) :: comment
    logical, intent(in), optional :: dynamic_size
  • private subroutine add_get_logic(cfg, var_name, logical_data, comment)

    Get or add a logical value of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    logical, intent(inout) :: logical_data
    character(len=*), intent(in) :: comment
  • private subroutine add_get_logic_array(cfg, var_name, logic_data, comment, dynamic_size)

    Get or add a logical array of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    logical, intent(inout) :: logic_data(:)
    character(len=*), intent(in) :: comment
    logical, intent(in), optional :: dynamic_size
  • private subroutine add_get_string(cfg, var_name, string_data, comment)

    Get a character value of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    character(len=*), intent(inout) :: string_data
    character(len=*), intent(in) :: comment
  • private subroutine add_get_string_array(cfg, var_name, char_data, comment, dynamic_size)

    Get or add a character array of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    character(len=*), intent(inout) :: char_data(:)
    character(len=*), intent(in) :: comment
    logical, intent(in), optional :: dynamic_size

public interface CFG_get

Interface to get variables from the configuration

  • private subroutine get_real(cfg, var_name, res)

    Get a real value of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    real(kind=dp), intent(out) :: res
  • private subroutine get_real_array(cfg, var_name, real_data)

    Get a real array of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    real(kind=dp), intent(inout) :: real_data(:)
  • private subroutine get_int(cfg, var_name, res)

    Get a integer value of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    integer, intent(inout) :: res
  • private subroutine get_int_array(cfg, var_name, int_data)

    Get a integer array of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    integer, intent(inout) :: int_data(:)
  • private subroutine get_logic(cfg, var_name, res)

    Get a logical value of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    logical, intent(out) :: res
  • private subroutine get_logic_array(cfg, var_name, logic_data)

    Get a logical array of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    logical, intent(inout) :: logic_data(:)
  • private subroutine get_string(cfg, var_name, res)

    Get a character value of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    character(len=*), intent(out) :: res
  • private subroutine get_string_array(cfg, var_name, char_data)

    Get a character array of a given name

    Arguments

    Type IntentOptional Attributes Name
    type(CFG_t), intent(inout) :: cfg
    character(len=*), intent(in) :: var_name
    character(len=*), intent(inout) :: char_data(:)

Derived Types

type, public ::  CFG_t

The configuration that contains all the variables

Components

Type Visibility Attributes Name Initial
integer, public :: num_vars = 0
logical, public :: sorted = .false.
type(CFG_var_t), public, allocatable :: vars(:)

type, private ::  CFG_var_t

The type of a configuration variable

Components

Type Visibility Attributes Name Initial
character(len=CFG_string_len), private, allocatable :: char_data(:)
character(len=CFG_string_len), private :: description

Description of variable

logical, private :: dynamic_size

Whether the variable size is flexible

integer, private, allocatable :: int_data(:)
logical, private, allocatable :: logic_data(:)
real(kind=dp), private, allocatable :: real_data(:)
character(len=CFG_string_len), private :: stored_data

Data that has been read in for this variable

logical, private :: used

Whether the variable's value has been requested

character(len=CFG_name_len), private :: var_name

Name of the variable

integer, private :: var_size

Size of variable, 1 means scalar, > 1 means array

integer, private :: var_type

Type of variable


Subroutines

public subroutine CFG_check(cfg)

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(in) :: cfg

public subroutine CFG_get_size(cfg, var_name, res)

Get the size of a variable

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(in) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(out) :: res

public subroutine CFG_get_type(cfg, var_name, res)

Get the type of a given variable of a configuration type

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(in) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(out) :: res

public subroutine CFG_read_file(cfg, filename)

Update the variables in the configartion with the values found in 'filename'

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: filename

public subroutine CFG_sort(cfg)

Sort the variables for faster lookup

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg

public subroutine CFG_update_from_arguments(cfg)

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg

public subroutine CFG_write(cfg_in, filename, hide_unused)

This routine writes the current configuration to a file with descriptions

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(in) :: cfg_in
character(len=*), intent(in) :: filename
logical, intent(in), optional :: hide_unused

public subroutine CFG_write_markdown(cfg_in, filename, hide_unused)

This routine writes the current configuration to a markdown file

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(in) :: cfg_in
character(len=*), intent(in) :: filename
logical, intent(in), optional :: hide_unused

private subroutine add_get_int(cfg, var_name, int_data, comment)

Get or add a integer value of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(inout) :: int_data
character(len=*), intent(in) :: comment

private subroutine add_get_int_array(cfg, var_name, int_data, comment, dynamic_size)

Get or add a integer array of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(inout) :: int_data(:)
character(len=*), intent(in) :: comment
logical, intent(in), optional :: dynamic_size

private subroutine add_get_logic(cfg, var_name, logical_data, comment)

Get or add a logical value of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
logical, intent(inout) :: logical_data
character(len=*), intent(in) :: comment

private subroutine add_get_logic_array(cfg, var_name, logic_data, comment, dynamic_size)

Get or add a logical array of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
logical, intent(inout) :: logic_data(:)
character(len=*), intent(in) :: comment
logical, intent(in), optional :: dynamic_size

private subroutine add_get_real(cfg, var_name, real_data, comment)

Get or add a real value of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
real(kind=dp), intent(inout) :: real_data
character(len=*), intent(in) :: comment

private subroutine add_get_real_array(cfg, var_name, real_data, comment, dynamic_size)

Get or add a real array of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
real(kind=dp), intent(inout) :: real_data(:)
character(len=*), intent(in) :: comment
logical, intent(in), optional :: dynamic_size

private subroutine add_get_string(cfg, var_name, string_data, comment)

Get a character value of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
character(len=*), intent(inout) :: string_data
character(len=*), intent(in) :: comment

private subroutine add_get_string_array(cfg, var_name, char_data, comment, dynamic_size)

Get or add a character array of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
character(len=*), intent(inout) :: char_data(:)
character(len=*), intent(in) :: comment
logical, intent(in), optional :: dynamic_size

private subroutine add_int(cfg, var_name, int_data, comment)

Add a configuration variable with an integer value

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(in) :: int_data
character(len=*), intent(in) :: comment

private subroutine add_int_array(cfg, var_name, int_data, comment, dynamic_size)

Add a configuration variable with an array of type integer

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(in) :: int_data(:)
character(len=*), intent(in) :: comment
logical, intent(in), optional :: dynamic_size

private subroutine add_logic(cfg, var_name, logic_data, comment)

Add a configuration variable with an logical value

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
logical, intent(in) :: logic_data
character(len=*), intent(in) :: comment

private subroutine add_logic_array(cfg, var_name, logic_data, comment, dynamic_size)

Add a configuration variable with an array of type logical

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
logical, intent(in) :: logic_data(:)
character(len=*), intent(in) :: comment
logical, intent(in), optional :: dynamic_size

private subroutine add_real(cfg, var_name, real_data, comment)

Add a configuration variable with a real value

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
real(kind=dp), intent(in) :: real_data
character(len=*), intent(in) :: comment

private subroutine add_real_array(cfg, var_name, real_data, comment, dynamic_size)

Add a configuration variable with an array of type

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
real(kind=dp), intent(in) :: real_data(:)
character(len=*), intent(in) :: comment
logical, intent(in), optional :: dynamic_size

private subroutine add_string(cfg, var_name, char_data, comment)

Add a configuration variable with an character value

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
character(len=*), intent(in) :: char_data
character(len=*), intent(in) :: comment

private subroutine add_string_array(cfg, var_name, char_data, comment, dynamic_size)

Add a configuration variable with an array of type character

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
character(len=*), intent(in) :: char_data(:)
character(len=*), intent(in) :: comment
logical, intent(in), optional :: dynamic_size

private subroutine binary_search_variable(cfg, var_name, ix)

Performa a binary search for the variable 'var_name'

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(in) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(out) :: ix

private subroutine ensure_free_storage(cfg)

Routine to ensure that enough storage is allocated for the configuration type. If not the new size will be twice as much as the current size. If no storage is allocated yet a minumum amount of starage is allocated.

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg

private subroutine get_fields_string(line, delims, n_max, n_found, ixs_start, ixs_end)

Routine to find the indices of entries in a string

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: line

The line from which we want to read

character(len=*), intent(in) :: delims

A string with delimiters. For example delims = " ,'"""//char(9)

integer, intent(in) :: n_max

Maximum number of entries to read in

integer, intent(inout) :: n_found

Number of entries found

integer, intent(inout) :: ixs_start(n_max)

On return, ix_start(i) holds the starting point of entry i

integer, intent(inout) :: ixs_end(n_max)

On return, ix_end(i) holds the end point of entry i

private subroutine get_int(cfg, var_name, res)

Get a integer value of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(inout) :: res

private subroutine get_int_array(cfg, var_name, int_data)

Get a integer array of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(inout) :: int_data(:)

private subroutine get_logic(cfg, var_name, res)

Get a logical value of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
logical, intent(out) :: res

private subroutine get_logic_array(cfg, var_name, logic_data)

Get a logical array of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
logical, intent(inout) :: logic_data(:)

private subroutine get_real(cfg, var_name, res)

Get a real value of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
real(kind=dp), intent(out) :: res

private subroutine get_real_array(cfg, var_name, real_data)

Get a real array of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
real(kind=dp), intent(inout) :: real_data(:)

private subroutine get_string(cfg, var_name, res)

Get a character value of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
character(len=*), intent(out) :: res

private subroutine get_string_array(cfg, var_name, char_data)

Get a character array of a given name

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
character(len=*), intent(inout) :: char_data(:)

private subroutine get_var_index(cfg, var_name, ix)

Return the index of the variable with name 'var_name', or -1 if not found.

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(in) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(out) :: ix

private subroutine handle_error(err_string)

This routine will be called if an error occurs in one of the subroutines of this module.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: err_string

private subroutine parition_var_list(list, marker)

Helper routine for quicksort, to perform partitioning

Arguments

Type IntentOptional Attributes Name
type(CFG_var_t), intent(inout) :: list(:)
integer, intent(out) :: marker

private subroutine prepare_get_var(cfg, var_name, var_type, var_size, ix)

Helper routine to get variables. This is useful because a lot of the same code is executed for the different types of variables.

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(in) :: var_type
integer, intent(in) :: var_size
integer, intent(out) :: ix

private subroutine prepare_store_var(cfg, var_name, var_type, var_size, description, ix, dynamic_size)

Helper routine to store variables. This is useful because a lot of the same code is executed for the different types of variables.

Arguments

Type IntentOptional Attributes Name
type(CFG_t), intent(inout) :: cfg
character(len=*), intent(in) :: var_name
integer, intent(in) :: var_type
integer, intent(in) :: var_size
character(len=*), intent(in) :: description
integer, intent(out) :: ix

Index of variable

logical, intent(in), optional :: dynamic_size

private recursive subroutine qsort_config(list)

Simple implementation of quicksort algorithm to sort the variable list alphabetically.

Arguments

Type IntentOptional Attributes Name
type(CFG_var_t), intent(inout) :: list(:)

private subroutine read_variable(var)

Arguments

Type IntentOptional Attributes Name
type(CFG_var_t), intent(inout) :: var

private subroutine resize_storage(variable)

Resize the storage size of variable, which can be of type integer, logical, real or character

Arguments

Type IntentOptional Attributes Name
type(CFG_var_t), intent(inout) :: variable

private subroutine split_category(variable, category, var_name)

Arguments

Type IntentOptional Attributes Name
type(CFG_var_t), intent(in) :: variable
character(len=CFG_name_len), intent(out) :: category
character(len=CFG_name_len), intent(out) :: var_name

private subroutine trim_comment(line, comment_chars)

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(inout) :: line
character(len=*), intent(in) :: comment_chars