FPL
FPL copied to clipboard
Fortran Parameter List. A fortran dictionary where to put the parameters of your application.
FPL
Fortran Parameter List
License
What is FPL?
FPL is pure fortran 2003 library that can manage the parameters of your program from a single point.
FPL is an extendible container (dictionary) of <Key, Value> pairs, where the Key is a character string and the Value can be, by the default, of the following data types:
- Integer (kinds 1, 2, 4, 8)
- Real (kinds 4, 8)
- Logical
- String
Value can be a scalar or an array of any dimension.
FPL stores copies of the passed data by assignment.
FPL is based in Teuchos::ParameterList of the Trilinos project.
How to get FPL
git clone --recursive https://github.com/victorsndvg/FPL.git
Compilation
FPL compile with GNU Fortran compiler 5.1 (and newer versions) and Intel Fortran compiler 15.0.1 (and newer versions).
Note: Due to an issue with IBM XLF 14.0.1 Fortran compiler, if you want to use this compiler use the branch XLF_workaround
FPL uses CMake as a portable compilation system.
The easiest way to compile FPL under Linux is:
$ cd FPL
$ mkdir build
$ cd build
$ cmake ../
$ make
To compile FPL under Windows use de equivalent commands
Getting started with FPL
Notes:
- Source code documentation
- FPL cannot handle non-allocated variables while calling
Set(Key, Value)orGet(Key, Value)procedures. - To succesfull get a stored value into your target variable, data type and shape of both variables must agree.
Using FPL in your program
USE FPL
type(ParameterList_t) :: My_List
call FPL_Init()
call My_List%Init()
... [Program body]
call My_List%Free()
call FPL_Finalize()
Setting parameters
FPLError = My_List%Set(Key='Max Iters', Value=1500)
FPLError = My_List%Set(Key='Tolerance', Value=1.e-10)
FPLError = My_List%Set(Key='Solver', Value='GMRES')
Getting parameters
integer :: MaxIters
FPLError = My_List%Get(Key='Max Iters', Value=MaxIters)
Getting parameters as strings
character(len=:), allocatable :: MaxItersString
FPLError = My_List%GetAsString(Key='Max Iters', String=MaxItersString)
Check if you can assign a parameter to your variable
Check if the target variable has the same type and shape as the stored variable :bangbang:
integer :: MaxIters
if(My_List%isAssignable(Key='Max Iters', Value=MaxIters)) then
FPLError = My_List%Get(Key='Max Iters', Value=MaxIters)
endif
Deleting parameters
call My_List%Del(Key='Max Iters')
Checking if a parameter is present
logical :: solver_defined
solver_defined = My_List%isPresent(Key='Solver')
Checking if a parameter is of the expected data type
logical :: has_same_type
real :: Tolerance
has_same_type = My_List%isOfDataType(Key='Tolerance', Mold=Tolerance)
Checking the shape of a parameter
logical :: has_same_type
integer, allocatable :: Shape(:)
FPLError = My_List%GetShape(Key='Tolerance', Shape=Shape)
Working with parameter sublists
Every parameter list can recursively store parameter sublists.
type(ParameterList_t), pointer :: Prec_List
Prec_List => My_List%NewSubList(Key='Preconditioner')
call Prec_List%Set(Key='Type', Value='ILU')
call Prec_List%Set(Key='Drop Tolerance', Value=1.e-3)
Checking if it is a parameter sublist
logical :: prec_defined
prec_defined = My_List%isSubList(Key='Preconditioner')
Print (recursive) the content of a parameter list
call My_List%Print()
Iterate on a ParameterList
ParameterList also includes a derived type that works like an iterator to go through all stored parameters without asking for the key.
ParameterList_Iterator interface is almost the same than ParameterList interface plus some procedures like HasFinished() and Next() to manage the advance of the iterator.
The example below iterates on a ParameterList containing integer vectors and getting the stored values.
type(ParameterListIterator_t) :: Iterator
integer,allocatable :: array(:)
integer,allocatable :: shape(:)
Iterator = Parameters%GetIterator()
do while (.not. Iterator%HasFinished())
if(Iterator%GetDimensions() /= 1) stop -1
if(Iterator%GetShape(Shape=shape) /= 0) stop -1
if(.not. Iterator%IsOfDataType(Mold=array)) stop -1
if(allocated(array)) deallocate(array)
allocate(array(shape(1)))
if(Iterator%Get(array) /= 0) stop -1
print*, ' Key = '//Iterator%GetKey()
print*, ' Bytes = ', Iterator%DataSizeInBytes()
print*, ' Dimensions = ', Iterator%GetDimensions()
print*, ' Value = ', array)
call Iterator%Next()
enddo