20#include "../base/base_uses.f90"
24 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'fparser'
37 INTEGER,
PARAMETER,
PRIVATE :: is = selected_int_kind(1)
38 INTEGER(is),
PARAMETER :: cimmed = 1, &
65 CHARACTER(LEN=1),
DIMENSION(cAdd:cPow),
PARAMETER :: ops = [
'+', &
70 CHARACTER(LEN=5),
DIMENSION(cAbs:cErfc),
PARAMETER :: funcs = [
'abs ', &
89 INTEGER,
DIMENSION(cAbs:cErfc),
PARAMETER :: funcsargcnt = [1, &
110 INTEGER(is),
DIMENSION(:),
POINTER :: bytecode => null()
111 INTEGER :: bytecodesize = -1
112 REAL(rn),
DIMENSION(:),
POINTER :: immed => null()
113 INTEGER :: immedsize = -1
114 REAL(rn),
DIMENSION(:),
POINTER :: stack => null()
115 INTEGER :: stacksize = -1, &
118 TYPE(tcomp),
DIMENSION(:),
POINTER ::
comp => null()
119 INTEGER,
DIMENSION(:),
ALLOCATABLE :: ipos
136 IF (
ASSOCIATED(
comp(i)%ByteCode))
THEN
137 DEALLOCATE (
comp(i)%ByteCode)
139 IF (
ASSOCIATED(
comp(i)%Immed))
THEN
140 DEALLOCATE (
comp(i)%Immed)
142 IF (
ASSOCIATED(
comp(i)%Stack))
THEN
143 DEALLOCATE (
comp(i)%Stack)
159 INTEGER,
INTENT(in) :: n
174 INTEGER,
INTENT(in) :: i
175 CHARACTER(LEN=*),
INTENT(in) :: funcstr
176 CHARACTER(LEN=*),
DIMENSION(:),
INTENT(in) :: var
178 CHARACTER(LEN=LEN(FuncStr)) :: func
183 IF (i < 1 .OR. i >
SIZE(
comp))
THEN
184 cpabort(
"Function number is out of range")
186 IF (
SIZE(var) > huge(0_is))
THEN
187 cpabort(
"Too many variables")
189 ALLOCATE (ipos(len_trim(funcstr)))
191 CALL replace(
'**',
'^ ', func)
192 CALL removespaces(func)
193 CALL checksyntax(func, funcstr, var)
195 CALL compile(i, func, var)
209 INTEGER,
INTENT(in) :: i
210 REAL(rn),
DIMENSION(:),
INTENT(in) :: val
213 REAL(rn),
PARAMETER :: zero = 0._rn
215 INTEGER ::
dp, ip, ipow,
sp
227 DO ip = 1,
comp(i)%ByteCodeSize
228 SELECT CASE (
comp(i)%ByteCode(ip))
235 CASE (cdiv);
IF (
comp(i)%Stack(
sp) == 0._rn) then;
evalerrtype = 1; res = zero; return;
END IF
239 IF (
comp(i)%Stack(
sp - 1) < 0.0_rn)
THEN
240 ipow = floor(
comp(i)%Stack(
sp))
241 IF (mod(
comp(i)%Stack(
sp), real(ipow, kind=rn)) == 0.0_rn)
THEN
244 cpabort(
"Negative floating-point value raised to a real power!")
254 CASE (clog10);
IF (
comp(i)%Stack(
sp) <= 0._rn) then;
evalerrtype = 3; res = zero; return;
END IF
256 CASE (clog);
IF (
comp(i)%Stack(
sp) <= 0._rn) then;
evalerrtype = 3; res = zero; return;
END IF
258 CASE (csqrt);
IF (
comp(i)%Stack(
sp) < 0._rn) then;
evalerrtype = 3; res = zero; return;
END IF
260 CASE (csinh);
comp(i)%Stack(
sp) = sinh(
comp(i)%Stack(
sp))
261 CASE (ccosh);
comp(i)%Stack(
sp) = cosh(
comp(i)%Stack(
sp))
262 CASE (ctanh);
comp(i)%Stack(
sp) = tanh(
comp(i)%Stack(
sp))
266 CASE (casin);
IF ((
comp(i)%Stack(
sp) < -1._rn) .OR. (
comp(i)%Stack(
sp) > 1._rn))
THEN
269 CASE (cacos);
IF ((
comp(i)%Stack(
sp) < -1._rn) .OR. (
comp(i)%Stack(
sp) > 1._rn))
THEN
273 CASE (catan);
comp(i)%Stack(
sp) = atan(
comp(i)%Stack(
sp))
275 CASE (cerfc);
comp(i)%Stack(
sp) = erfc(
comp(i)%Stack(
sp))
276 CASE DEFAULT;
sp =
sp + 1;
comp(i)%Stack(
sp) = val(
comp(i)%ByteCode(ip) - varbegin + 1)
280 res =
comp(i)%Stack(1)
289 SUBROUTINE checksyntax(Func, FuncStr, Var)
293 CHARACTER(LEN=*),
INTENT(in) :: func, funcstr
294 CHARACTER(LEN=*),
DIMENSION(:),
INTENT(in) :: var
296 INTEGER :: ib, in, j, lfunc, parcnt
297 CHARACTER(LEN=1) :: c
310 lfunc = len_trim(func)
312 IF (j > lfunc)
CALL parseerrmsg(j, funcstr)
317 IF (c ==
'-' .OR. c ==
'+')
THEN
319 IF (j > lfunc)
CALL parseerrmsg(j, funcstr,
'Missing operand')
321 IF (any(c == ops))
CALL parseerrmsg(j, funcstr,
'Multiple operators')
323 n = mathfunctionindex(func(j:))
325 j = j + len_trim(funcs(n))
326 IF (j > lfunc)
CALL parseerrmsg(j, funcstr,
'Missing function argument')
328 IF (c /=
'(')
CALL parseerrmsg(j, funcstr,
'Missing opening parenthesis')
329 CALL checkfuncargcnt(func, funcstr, j, lfunc, n)
336 IF (scan(c,
'0123456789.') > 0)
THEN
337 r = realnum(func(j:), ib, in, err)
338 IF (err)
CALL parseerrmsg(j, funcstr,
'Invalid number format: '//func(j + ib - 1:j + in - 2))
340 IF (j > lfunc)
EXIT step
343 n = variableindex(func(j:), var, ib, in)
344 IF (n == 0)
CALL parseerrmsg(j, funcstr,
'Invalid element: '//func(j + ib - 1:j + in - 2))
346 IF (j > lfunc)
EXIT step
351 IF (parcnt < 0)
CALL parseerrmsg(j, funcstr,
'Mismatched parenthesis')
352 IF (func(j - 1:j - 1) ==
'(')
CALL parseerrmsg(j - 1, funcstr,
'Empty parentheses')
360 IF (j > lfunc)
EXIT step
361 IF (any(c == ops))
THEN
362 IF (j + 1 > lfunc)
CALL parseerrmsg(j, funcstr)
363 IF (any(func(j + 1:j + 1) == ops))
CALL parseerrmsg(j + 1, funcstr,
'Multiple operators')
364 ELSE IF (c ==
',')
THEN
365 IF (parcnt == 0)
CALL parseerrmsg(j, funcstr,
'Comma outside function')
366 IF (func(j + 1:j + 1) ==
',')
CALL parseerrmsg(j, funcstr,
'Multiple commas')
368 CALL parseerrmsg(j, funcstr,
'Missing operator')
376 IF (parcnt > 0)
CALL parseerrmsg(j, funcstr,
'Missing )')
377 END SUBROUTINE checksyntax
387 SUBROUTINE checkfuncargcnt(Func, FuncStr, b, e, FuncId)
391 CHARACTER(LEN=*),
INTENT(in) :: func, funcstr
392 INTEGER,
INTENT(in) :: b, e
393 INTEGER(is),
INTENT(in) :: funcid
395 CHARACTER(len=40) :: msg
396 INTEGER :: argcnt, argpos, j, parcnt
408 IF (func(j:j) ==
'(')
THEN
410 ELSEIF (func(j:j) ==
')')
THEN
412 IF (parcnt == 0)
EXIT
413 ELSEIF (parcnt == 1 .AND. func(j:j) ==
',')
THEN
418 IF (argcnt /= funcsargcnt(funcid))
THEN
419 IF (argcnt < funcsargcnt(funcid)) argpos = j
420 WRITE (msg,
'(I0,A,A,A,I0)') argcnt,
' argument(s) in ', trim(funcs(funcid)),
' instead of ', funcsargcnt(funcid)
421 CALL parseerrmsg(argpos, funcstr, msg)
423 END SUBROUTINE checkfuncargcnt
429 FUNCTION evalerrmsg()
RESULT(msg)
433 CHARACTER(LEN=*),
DIMENSION(4),
PARAMETER :: m = [
'Division by zero ', &
434 'Argument of SQRT negative ',
'Argument of LOG negative ', &
435 'Argument of ASIN or ACOS illegal']
436 CHARACTER(LEN=LEN(m)) :: msg
445 END FUNCTION evalerrmsg
453 SUBROUTINE parseerrmsg(j, FuncStr, Msg)
457 INTEGER,
INTENT(in) :: j
458 CHARACTER(LEN=*),
INTENT(in) :: funcstr
459 CHARACTER(LEN=*),
INTENT(in),
OPTIONAL :: msg
461 CHARACTER(LEN=default_string_length) :: message
466 IF (
PRESENT(msg))
THEN
467 WRITE (unit=message, fmt=
"(A)")
"Syntax error in function string: "//msg
469 WRITE (unit=message, fmt=
"(A)")
"Syntax error in function string"
471 WRITE (*,
'(/,T2,A)') trim(funcstr)
472 IF ((j > lbound(ipos, dim=1)) .AND. (j <= ubound(ipos, dim=1)))
THEN
473 WRITE (*,
'(A)') repeat(
" ", ipos(j))//
"?"
475 WRITE (*,
'(A)') repeat(
" ",
SIZE(ipos) + 1)//
"?"
477 cpabort(trim(message))
479 END SUBROUTINE parseerrmsg
486 FUNCTION operatorindex(c)
RESULT(n)
490 CHARACTER(LEN=1),
INTENT(in) :: c
499 IF (c == ops(j))
THEN
504 END FUNCTION operatorindex
511 FUNCTION mathfunctionindex(str)
RESULT(n)
515 CHARACTER(LEN=*),
INTENT(in) :: str
518 CHARACTER(LEN=LEN(Funcs)) :: fun
526 k = min(len_trim(funcs(j)), len(str))
527 CALL lowcase(str(1:k), fun)
528 IF (fun == funcs(j))
THEN
533 END FUNCTION mathfunctionindex
543 FUNCTION variableindex(str, Var, ibegin, inext)
RESULT(n)
547 CHARACTER(LEN=*),
INTENT(in) :: str
548 CHARACTER(LEN=*),
DIMENSION(:),
INTENT(in) :: var
549 INTEGER,
INTENT(out),
OPTIONAL :: ibegin, inext
552 INTEGER :: ib, in, j, lstr
565 IF (str(ib:ib) /=
' ')
EXIT
568 IF (scan(str(in:in),
'+-*/^) ,') > 0)
EXIT
571 IF (str(ib:in - 1) == var(j))
THEN
577 IF (
PRESENT(ibegin)) ibegin = ib
578 IF (
PRESENT(inext)) inext = in
579 END FUNCTION variableindex
585 SUBROUTINE removespaces(str)
589 CHARACTER(LEN=*),
INTENT(inout) :: str
596 ipos(:) = [(k, k=1, lstr)]
598 DO WHILE (str(k:lstr) /=
' ')
599 IF (str(k:k) ==
' ')
THEN
600 str(k:lstr) = str(k + 1:lstr)//
' '
601 ipos(k:lstr) = [ipos(k + 1:lstr), 0]
606 END SUBROUTINE removespaces
614 SUBROUTINE replace(ca, cb, str)
618 CHARACTER(LEN=*),
INTENT(in) :: ca
619 CHARACTER(LEN=LEN(ca)),
INTENT(in) :: cb
620 CHARACTER(LEN=*),
INTENT(inout) :: str
628 DO j = 1, len_trim(str) - lca + 1
629 IF (str(j:j + lca - 1) == ca) str(j:j + lca - 1) = cb
631 END SUBROUTINE replace
639 SUBROUTINE compile(i, F, Var)
643 INTEGER,
INTENT(in) :: i
644 CHARACTER(LEN=*),
INTENT(in) :: f
645 CHARACTER(LEN=*),
DIMENSION(:),
INTENT(in) :: var
652 IF (
ASSOCIATED(
comp(i)%ByteCode))
DEALLOCATE (
comp(i)%ByteCode, &
655 comp(i)%ByteCodeSize = 0
656 comp(i)%ImmedSize = 0
657 comp(i)%StackSize = 0
659 CALL compilesubstr(i, f, 1, len_trim(f), var)
660 ALLOCATE (
comp(i)%ByteCode(
comp(i)%ByteCodeSize), &
663 comp(i)%ByteCodeSize = 0
664 comp(i)%ImmedSize = 0
665 comp(i)%StackSize = 0
667 CALL compilesubstr(i, f, 1, len_trim(f), var)
669 END SUBROUTINE compile
676 SUBROUTINE addcompiledbyte(i, b)
680 INTEGER,
INTENT(in) :: i
681 INTEGER(is),
INTENT(in) :: b
687 comp(i)%ByteCodeSize =
comp(i)%ByteCodeSize + 1
688 IF (
ASSOCIATED(
comp(i)%ByteCode))
comp(i)%ByteCode(
comp(i)%ByteCodeSize) = b
689 END SUBROUTINE addcompiledbyte
698 FUNCTION mathitemindex(i, F, Var)
RESULT(n)
702 INTEGER,
INTENT(in) :: i
703 CHARACTER(LEN=*),
INTENT(in) :: f
704 CHARACTER(LEN=*),
DIMENSION(:),
INTENT(in) :: var
714 IF (scan(f(1:1),
'0123456789.') > 0)
THEN
715 comp(i)%ImmedSize =
comp(i)%ImmedSize + 1
716 IF (
ASSOCIATED(
comp(i)%Immed))
comp(i)%Immed(
comp(i)%ImmedSize) = realnum(f)
719 n = variableindex(f, var)
720 IF (n > 0) n = varbegin + n - 1_is
722 END FUNCTION mathitemindex
731 FUNCTION completelyenclosed(F, b, e)
RESULT(res)
735 CHARACTER(LEN=*),
INTENT(in) :: f
736 INTEGER,
INTENT(in) :: b, e
746 IF (f(b:b) ==
'(' .AND. f(e:e) ==
')')
THEN
749 IF (f(j:j) ==
'(')
THEN
751 ELSEIF (f(j:j) ==
')')
THEN
756 IF (k == 0) res = .true.
758 END FUNCTION completelyenclosed
768 RECURSIVE SUBROUTINE compilesubstr(i, F, b, e, Var)
772 INTEGER,
INTENT(in) :: i
773 CHARACTER(LEN=*),
INTENT(in) :: f
774 INTEGER,
INTENT(in) :: b, e
775 CHARACTER(LEN=*),
DIMENSION(:),
INTENT(in) :: var
777 CHARACTER(LEN=*),
PARAMETER :: &
778 calpha =
'abcdefghijklmnopqrstuvwxyz'//
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
780 INTEGER :: b2, io, j, k
791 IF (f(b:b) ==
'+')
THEN
793 CALL compilesubstr(i, f, b + 1, e, var)
795 ELSEIF (completelyenclosed(f, b, e))
THEN
797 CALL compilesubstr(i, f, b + 1, e - 1, var)
799 ELSEIF (scan(f(b:b), calpha) > 0)
THEN
800 n = mathfunctionindex(f(b:e))
802 b2 = b + index(f(b:e),
'(') - 1
803 IF (completelyenclosed(f, b2, e))
THEN
805 CALL compilefuncargssubstr(i, f, b2 + 1, e - 1, var)
806 CALL addcompiledbyte(i, n)
810 ELSEIF (f(b:b) ==
'-')
THEN
811 IF (completelyenclosed(f, b + 1, e))
THEN
813 CALL compilesubstr(i, f, b + 2, e - 1, var)
814 CALL addcompiledbyte(i, cneg)
816 ELSEIF (scan(f(b + 1:b + 1), calpha) > 0)
THEN
817 n = mathfunctionindex(f(b + 1:e))
819 b2 = b + index(f(b + 1:e),
'(')
820 IF (completelyenclosed(f, b2, e))
THEN
822 CALL compilefuncargssubstr(i, f, b2 + 1, e - 1, var)
823 CALL addcompiledbyte(i, n)
824 CALL addcompiledbyte(i, cneg)
836 IF (f(j:j) ==
')')
THEN
838 ELSEIF (f(j:j) ==
'(')
THEN
841 IF (k == 0 .AND. f(j:j) == ops(io) .AND. isbinaryop(j, f))
THEN
842 IF (any(f(j:j) == ops(cmul:cpow)) .AND. f(b:b) ==
'-')
THEN
844 CALL compilesubstr(i, f, b + 1, e, var)
845 CALL addcompiledbyte(i, cneg)
849 CALL compilesubstr(i, f, b, j - 1, var)
850 CALL compilesubstr(i, f, j + 1, e, var)
851 CALL addcompiledbyte(i, operatorindex(ops(io)))
852 comp(i)%StackPtr =
comp(i)%StackPtr - 1
862 IF (f(b:b) ==
'-') b2 = b2 + 1
863 n = mathitemindex(i, f(b2:e), var)
865 CALL addcompiledbyte(i, n)
866 comp(i)%StackPtr =
comp(i)%StackPtr + 1
867 IF (
comp(i)%StackPtr >
comp(i)%StackSize)
comp(i)%StackSize =
comp(i)%StackSize + 1
868 IF (b2 > b)
CALL addcompiledbyte(i, cneg)
869 END SUBROUTINE compilesubstr
879 RECURSIVE SUBROUTINE compilefuncargssubstr(i, F, b, e, Var)
883 INTEGER,
INTENT(in) :: i
884 CHARACTER(LEN=*),
INTENT(in) :: f
885 INTEGER,
INTENT(in) :: b, e
886 CHARACTER(LEN=*),
DIMENSION(:),
INTENT(in) :: var
888 INTEGER :: b2, j, parcnt
901 IF (f(j:j) ==
'(')
THEN
903 ELSEIF (f(j:j) ==
')')
THEN
905 ELSEIF (parcnt == 0 .AND. f(j:j) ==
',')
THEN
906 CALL compilesubstr(i, f, b2, j - 1, var)
910 CALL compilesubstr(i, f, b2, e, var)
911 END SUBROUTINE compilefuncargssubstr
919 FUNCTION isbinaryop(j, F)
RESULT(res)
925 INTEGER,
INTENT(in) :: j
926 CHARACTER(LEN=*),
INTENT(in) :: f
930 LOGICAL :: dflag, pflag
938 IF (f(j:j) ==
'+' .OR. f(j:j) ==
'-')
THEN
941 ELSEIF (scan(f(j - 1:j - 1),
'+-*/^(,') > 0)
THEN
943 ELSEIF (scan(f(j + 1:j + 1),
'0123456789') > 0 .AND. &
944 scan(f(j - 1:j - 1),
'eEdD') > 0)
THEN
945 dflag = .false.; pflag = .false.
949 IF (scan(f(k:k),
'0123456789') > 0)
THEN
951 ELSEIF (f(k:k) ==
'.')
THEN
961 IF (dflag .AND. (k == 1 .OR. scan(f(k:k),
'+-*/^(') > 0)) res = .false.
964 END FUNCTION isbinaryop
974 FUNCTION realnum(str, ibegin, inext, error)
RESULT(res)
978 CHARACTER(LEN=*),
INTENT(in) :: str
979 INTEGER,
INTENT(out),
OPTIONAL :: ibegin, inext
980 LOGICAL,
INTENT(out),
OPTIONAL :: error
983 INTEGER :: ib, in, istat
984 LOGICAL :: bflag, dinexp, dinman, eflag, err, &
1002 bflag = .true.; inman = .false.; pflag = .false.; eflag = .false.; inexp = .false.
1003 dinman = .false.; dinexp = .false.
1006 DO WHILE (in <= len_trim(str))
1007 SELECT CASE (str(in:in))
1010 IF (inman .OR. eflag .OR. inexp)
EXIT
1013 inman = .true.; bflag = .false.
1015 inexp = .true.; eflag = .false.
1021 inman = .true.; bflag = .false.
1023 inexp = .true.; eflag = .false.
1025 IF (inman) dinman = .true.
1026 IF (inexp) dinexp = .true.
1030 inman = .true.; bflag = .false.
1031 ELSEIF (inman .AND. .NOT. pflag)
THEN
1036 CASE (
'e',
'E',
'd',
'D')
1038 eflag = .true.; inman = .false.
1047 err = (ib > in - 1) .OR. (.NOT. dinman) .OR. ((eflag .OR. inexp) .AND. .NOT. dinexp)
1051 READ (str(ib:in - 1), *, iostat=istat) res
1054 IF (
PRESENT(ibegin)) ibegin = ib
1055 IF (
PRESENT(inext)) inext = in
1056 IF (
PRESENT(error)) error = err
1057 END FUNCTION realnum
1064 SUBROUTINE lowcase(str1, str2)
1068 CHARACTER(LEN=*),
INTENT(in) :: str1
1069 CHARACTER(LEN=*),
INTENT(out) :: str2
1071 CHARACTER(LEN=*),
PARAMETER :: lc =
'abcdefghijklmnopqrstuvwxyz', &
1072 uc =
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
1079 DO j = 1, len_trim(str1)
1080 k = index(uc, str1(j:j))
1081 IF (k > 0) str2(j:j) = lc(k:k)
1083 END SUBROUTINE lowcase
1096 FUNCTION evalfd(id_fun, ipar, vals, h, err)
RESULT(derivative)
1097 INTEGER,
INTENT(IN) :: id_fun, ipar
1098 REAL(kind=rn),
DIMENSION(:),
INTENT(INOUT) :: vals
1099 REAL(kind=rn),
INTENT(IN) :: h
1100 REAL(kind=rn),
INTENT(OUT) :: err
1101 REAL(kind=rn) :: derivative
1103 INTEGER,
PARAMETER :: ntab = 10
1104 REAL(kind=rn),
PARAMETER :: big_error = 1.0e30_rn, con = 1.4_rn, &
1105 con2 = con*con, safe = 2.0_rn
1108 REAL(kind=rn) :: a(ntab, ntab), errt,
fac, funcm, funcp, &
1111 derivative = huge(0.0_rn)
1112 IF (h /= 0._rn)
THEN
1115 vals(ipar) = xval + hh
1116 funcp =
evalf(id_fun, vals)
1117 vals(ipar) = xval - hh
1118 funcm =
evalf(id_fun, vals)
1119 a(1, 1) = (funcp - funcm)/(2.0_rn*hh)
1123 vals(ipar) = xval + hh
1124 funcp =
evalf(id_fun, vals)
1125 vals(ipar) = xval - hh
1126 funcm =
evalf(id_fun, vals)
1127 a(1, i) = (funcp - funcm)/(2.0_rn*hh)
1130 a(j, i) = (a(j - 1, i)*
fac - a(j - 1, i - 1))/(
fac - 1.0_rn)
1132 errt = max(abs(a(j, i) - a(j - 1, i)), abs(a(j, i) - a(j - 1, i - 1)))
1133 IF (errt <= err)
THEN
1135 derivative = a(j, i)
1138 IF (abs(a(i, i) - a(i - 1, i - 1)) >= safe*err)
RETURN
1141 cpabort(
"DX provided equals zero!")
1154 CHARACTER(LEN=:),
ALLOCATABLE :: doc
1160 doc =
"A functional form is specified. Mathematical Operators recognized are "
1162 IF (i > cadd) doc = doc//
", "
1165 doc = doc//
" or alternatively **, whereas symbols for brackets must be (). The function"// &
1166 " parser recognizes the Fortran 90 intrinsic functions "
1168 IF (i > cabs) doc = doc//
", "
1169 doc = doc//trim(funcs(i))
1171 doc = doc//
". Parsing for intrinsic functions is not case sensitive."
static GRID_HOST_DEVICE double fac(const int i)
Factorial function, e.g. fac(5) = 5! = 120.
This public domain function parser module is intended for applications where a set of mathematical ex...
subroutine, public parsef(i, funcstr, var)
Parse ith function string FuncStr and compile it into bytecode.
real(rn) function, public evalf(i, val)
...
integer, public evalerrtype
real(kind=rn) function, public evalfd(id_fun, ipar, vals, h, err)
Evaluates derivatives.
character(len=:) function, allocatable, public docf()
...
type(tcomp), dimension(:), pointer comp
subroutine, public finalizef()
...
subroutine, public initf(n)
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public sp