Fortran Parameter List
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:
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.
git clone --recursive https://github.com/victorsndvg/FPL.git
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
Notes:
- Source code documentation
- FPL cannot handle non-allocated variables while calling Set(Key, Value)
or Get(Key, Value)
procedures.
- To succesfull get a stored value into your target variable, data type and shape of both variables must agree.
USE FPL type(ParameterList_t) :: My_List call FPL_Init() call My_List%Init() ... [Program body] call My_List%Free() call FPL_Finalize()
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')
integer :: MaxIters FPLError = My_List%Get(Key='Max Iters', Value=MaxIters)
character(len=:), allocatable :: MaxItersString FPLError = My_List%GetAsString(Key='Max Iters', String=MaxItersString)
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
call My_List%Del(Key='Max Iters')
logical :: solver_defined solver_defined = My_List%isPresent(Key='Solver')
logical :: has_same_type real :: Tolerance has_same_type = My_List%isOfDataType(Key='Tolerance', Mold=Tolerance)
logical :: has_same_type integer, allocatable :: Shape(:) FPLError = My_List%GetShape(Key='Tolerance', Shape=Shape)
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)
logical :: prec_defined prec_defined = My_List%isSubList(Key='Preconditioner')
call My_List%Print()
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