diff --git a/Makefile b/Makefile index 3b3355d9e..19be45a80 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,7 @@ SWIFTEST_MODULES = swiftest_globals.f90 \ module_swiftestalloc.f90 \ io.f90 \ module_interfaces.f90 \ + lambda_function.f90\ swiftest.f90 include Makefile.Defines diff --git a/src/modules/lambda_function.f90 b/src/modules/lambda_function.f90 new file mode 100644 index 000000000..fcd8c2783 --- /dev/null +++ b/src/modules/lambda_function.f90 @@ -0,0 +1,50 @@ +module lambda_function + !! Defines a class that can enable objects that behave like lambda functions. + use swiftest_globals + implicit none + + type, public :: lambda_obj + private + procedure(lambda0), pointer, nopass :: lambdaptr => null() + contains + generic :: init => lambda_init_0 + procedure :: eval => lambda_eval_0 + procedure :: lambda_init_0 + end type + + abstract interface + function lambda0(x) + ! Template for a 0 argument function + import DP + real(DP), intent(in) :: x + real(DP) :: lambda + end function + end interface + + contains + subroutine lambda_init_0(self, lambda) + implicit none + ! Arguments + class(lambda_obj), intent(out) :: self + procedure(lambda0) :: lambda + + self%lambdaptr => lambda + end subroutine lambda_init_0 + + function lambda_eval_0(self, x) result(y) + implicit none + ! Arguments + class(lambda_obj), intent(in) :: self + real(DP), intent(in) :: x + ! Result + real(DP) :: y + + if (associated(self%lambdaptr)) then + y = self%lambdaptr(x) + else + error stop "Initialize the object (call init) before computing values (call exec)!" + end if + end function lambda_eval_0 + +end module lambda_function + diff --git a/src/modules/swiftest.f90 b/src/modules/swiftest.f90 index 50102b7e2..1e1652690 100644 --- a/src/modules/swiftest.f90 +++ b/src/modules/swiftest.f90 @@ -7,6 +7,7 @@ module swiftest use swiftest_data_structures use io use user + use lambda_function !$ use omp_lib implicit none public