lambda_function Module

Defines a class that can enable objects that behave like lambda functions.

To use this class, define a type of either lambda_obj or lambda_obj_err, or extend the lambda_obj class as necessary, such that an interface that matches the function you wish to lambdafy. Once defined, the lambda object can evaluate itself by calling the type-bound procedure eval. e.g. f%eval(x) (or f%eval(x, lerr), f%eval(x, [argument list], etc))


Example - Defining a lambda function f(x,rval,ival) where rval and ival are a real and integer argument, respectively. This implementation uses an abstract interface, though this is not strictly necessary unless you want to bind more than one function with the same interface.


module lambda_new use swiftest ! This will bring in the lambda_function module ! Define types in a module

type, extends(lambda_obj) :: lambda_obj_ri_args procedure(abstract_lambda_ri_args), pointer, nopass :: lambdaptr_ri_args => null() real(DP) :: rval !! Real parameter integer(I4B) :: ival !! Integer paramete contains generic :: init => lambda_ri_args_init procedure :: eval => lambda_ri_args_eval procedure, nopass :: lambda_ri_args_init final :: lambda_ri_args_destroy end type interface lambda_obj module procedure lambda_ri_args_init end interface

abstract interface function abstract_lambda_ri_args(x, rval, ival) result(y) !Template for the lambda function import DP, I4B real(DP), dimension(:), intent(in) :: x !! Dependent variable real(DP), intent(in) :: rval !! Real parameter integer(I4B), intent(in) :: ival !! Integer parameter real(DP) :: y !! Real result end function end interface

contains type(lambda_obj_ri_args) function lambda_ri_args_init(lambda, rval, ival) !! Initializes the lambda function parameters (can be used as a structure constructor) implicit none procedure(abstract_lambda_ri_args) :: lambda !! The lambda function that will be passed real(DP), intent(in) :: rval !! Real parameter integer(I4B), intent(in) :: ival !! Integer parameter

  ! Assign the procedure passed to this function to the procedure pointer 
  lambda_ri_args_init%lambdaptr_ri_args => lambda

  ! Assign the argument values
  lambda_ri_args_init%rval = rval 
  lambda_ri_args_init%ival = ival
  return

end function lambda_ri_args_init

function lambda_ri_args_eval(self, x) result(y) !! Defines the evaluation method, allowing the lambda function to be called with a single argument implicit none class(lambda_obj_ri_args), intent(inout) :: self real(DP), dimension(:), intent(in) :: x real(DP) :: y

 if (associated(self%lambdaptr_ri_args)) then
    y = self%lambdaptr_ri_args(x, self%rval, self%ival)
     self%lastval = y
     if (allocated(self%lastarg)) deallocate(self%lastarg)
     allocate(self%lastarg, source=x)
  else
     stop "Lambda function was not initialized"
  end if

end function lambda_ri_args_eval

subroutine lambda_ri_args_destroy(self) !! Finalizer method. Use this as a template for cleaning up the object upon destruction, such as nullifying pointers implicit none type(lambda_obj_ri_args) :: self if (associated(self%lambdaptr_ri_args)) nullify(self%lambdaptr_ri_args) end subroutine lambda_ri_args_destroy

function example_function(x, rval, ival) result(y) ! This is the actual function you are going to use as the lambda function. Its interface must match the abstract ! interface previously defined implicit none ! Arguments real(DP), dimension(:), intent(in) :: x real(DP), intent(in) :: rval integer(I4B), intent(in) :: ival ! Result real(DP) :: y ! Internals integer(I4B) :: i, n n = size(x) y = 42._DP * ival do i = 1, n y = y + x(i)**2 end do return end function example_function end module lambda_new

program usage use swiftest use lambda_new implicit none type(lambda_obj_ri_args) :: f real(DP) :: sigma_par integer(I4B) :: iwonky, i,j real(DP), dimension(12) :: xarr

sigma_par = 3.14_DP iwonky = 13

f = lambda_obj(example_function, sigma_par, iwonky) do i = 1, 10 xarr(:) = [(j * 0.25_DP / i, j=1, 12)] write(,) i,f%eval(xarr) end do end program usage



Uses

    • globals
  • module~~lambda_function~~UsesGraph module~lambda_function lambda_function globals globals module~lambda_function->globals

Used by

  • module~~lambda_function~~UsedByGraph module~lambda_function lambda_function module~swiftest swiftest module~swiftest->module~lambda_function module~solver solver module~swiftest->module~solver module~solver->module~lambda_function module~tides tides module~tides->module~lambda_function module~s_collision_check s_collision_check module~s_collision_check->module~swiftest module~symba symba module~s_collision_check->module~symba module~s_swiftest_orbel s_swiftest_orbel module~s_swiftest_orbel->module~swiftest module~s_helio_kick s_helio_kick module~s_helio_kick->module~swiftest module~helio helio module~s_helio_kick->module~helio module~s_fraggle_generate s_fraggle_generate module~s_fraggle_generate->module~swiftest module~fraggle fraggle module~s_fraggle_generate->module~fraggle module~s_fraggle_generate->module~symba module~s_operator_cross s_operator_cross module~s_operator_cross->module~swiftest module~s_symba_gr s_symba_gr module~s_symba_gr->module~swiftest module~s_symba_gr->module~symba module~s_tides_step_rot s_tides_step_rot module~s_tides_step_rot->module~swiftest module~s_tides_step_rot->module~tides module~fraggle->module~swiftest module~symba->module~swiftest module~symba->module~helio module~shgrav shgrav module~shgrav->module~swiftest module~whm whm module~whm->module~swiftest module~rmvs rmvs module~rmvs->module~swiftest module~rmvs->module~whm module~s_symba_step s_symba_step module~s_symba_step->module~swiftest module~s_symba_step->module~symba module~s_swiftest_user s_swiftest_user module~s_swiftest_user->module~swiftest module~s_symba_util s_symba_util module~s_symba_util->module~swiftest module~s_symba_util->module~fraggle module~s_symba_util->module~symba module~s_rmvs_encounter_check s_rmvs_encounter_check module~s_rmvs_encounter_check->module~swiftest module~s_rmvs_encounter_check->module~rmvs module~s_coarray_collect s_coarray_collect module~s_coarray_collect->module~swiftest module~s_swiftest_gr s_swiftest_gr module~s_swiftest_gr->module~swiftest module~s_swiftest_io s_swiftest_io module~s_swiftest_io->module~swiftest module~s_swiftest_io->module~symba module~s_fraggle_util s_fraggle_util module~s_fraggle_util->module~swiftest module~s_fraggle_util->module~fraggle module~s_symba_kick s_symba_kick module~s_symba_kick->module~swiftest module~s_symba_kick->module~symba module~s_swiftest_discard s_swiftest_discard module~s_swiftest_discard->module~swiftest module~s_symba_encounter_check s_symba_encounter_check module~s_symba_encounter_check->module~swiftest module~s_symba_encounter_check->module~symba module~s_symba_drift s_symba_drift module~s_symba_drift->module~swiftest module~s_symba_drift->module~symba module~s_swiftest_drift s_swiftest_drift module~s_swiftest_drift->module~swiftest module~bindings_module bindings_module module~bindings_module->module~swiftest module~s_collision_regime s_collision_regime module~s_collision_regime->module~swiftest module~s_swiftest_coarray s_swiftest_coarray module~s_swiftest_coarray->module~swiftest module~s_rmvs_step s_rmvs_step module~s_rmvs_step->module~swiftest module~s_rmvs_step->module~rmvs module~s_rmvs_discard s_rmvs_discard module~s_rmvs_discard->module~swiftest module~s_rmvs_discard->module~rmvs module~s_swiftest_driver s_swiftest_driver module~s_swiftest_driver->module~swiftest module~s_shgrav_accel s_shgrav_accel module~s_shgrav_accel->module~swiftest module~s_shgrav_accel->module~shgrav module~s_encounter_util s_encounter_util module~s_encounter_util->module~swiftest module~s_swiftest_obl s_swiftest_obl module~s_swiftest_obl->module~swiftest module~s_swiftest_obl->module~shgrav module~s_rmvs_kick s_rmvs_kick module~s_rmvs_kick->module~swiftest module~s_rmvs_kick->module~rmvs program~main main program~main->module~swiftest module~s_helio_gr s_helio_gr module~s_helio_gr->module~swiftest module~s_helio_gr->module~helio module~s_collision_util s_collision_util module~s_collision_util->module~swiftest module~s_helio_util s_helio_util module~s_helio_util->module~swiftest module~s_helio_util->module~helio module~s_shgrav_pot s_shgrav_pot module~s_shgrav_pot->module~swiftest module~s_shgrav_pot->module~shgrav module~s_walltime s_walltime module~s_walltime->module~swiftest module~s_rmvs_util s_rmvs_util module~s_rmvs_util->module~swiftest module~s_rmvs_util->module~rmvs module~s_helio_step s_helio_step module~s_helio_step->module~swiftest module~s_helio_step->module~helio module~helio->module~swiftest module~helio->module~whm module~s_symba_discard s_symba_discard module~s_symba_discard->module~swiftest module~s_symba_discard->module~symba module~s_whm_coord s_whm_coord module~s_whm_coord->module~swiftest module~s_whm_coord->module~whm module~s_whm_gr s_whm_gr module~s_whm_gr->module~swiftest module~s_whm_gr->module~whm module~s_encounter_io s_encounter_io module~s_encounter_io->module~swiftest module~s_coarray_clone s_coarray_clone module~s_coarray_clone->module~swiftest module~whm_drift whm_drift module~whm_drift->module~swiftest module~whm_drift->module~whm module~s_whm_util s_whm_util module~s_whm_util->module~swiftest module~s_whm_util->module~whm module~s_whm_step s_whm_step module~s_whm_step->module~swiftest module~s_whm_step->module~whm module~s_swiftest_util s_swiftest_util module~s_swiftest_util->module~swiftest module~s_swiftest_util->module~fraggle module~s_swiftest_util->module~symba module~s_swiftest_util->module~whm module~s_swiftest_util->module~rmvs module~s_swiftest_util->module~helio module~s_helio_drift s_helio_drift module~s_helio_drift->module~swiftest module~s_helio_drift->module~helio module~s_swiftest_kick s_swiftest_kick module~s_swiftest_kick->module~swiftest module~s_encounter_check s_encounter_check module~s_encounter_check->module~swiftest module~s_whm_kick s_whm_kick module~s_whm_kick->module~swiftest module~s_whm_kick->module~whm module~s_collision_generate s_collision_generate module~s_collision_generate->module~swiftest module~s_collision_io s_collision_io module~s_collision_io->module~swiftest module~s_collision_resolve s_collision_resolve module~s_collision_resolve->module~swiftest module~s_tides_kick_getacch s_tides_kick_getacch module~s_tides_kick_getacch->module~swiftest module~s_tides_kick_getacch->module~tides

Contents


Interfaces

public interface lambda_obj


Abstract Interfaces

abstract interface

  • public function lambda0(x) result(y)

    Arguments

    TypeIntentOptionalAttributesName
    real(kind=DP), intent(in), dimension(:):: x

    Return Value real(kind=DP)

abstract interface

  • public function lambda0err(x, lerr) result(y)

    Arguments

    TypeIntentOptionalAttributesName
    real(kind=DP), intent(in), dimension(:):: x
    logical, intent(out) :: lerr

    Return Value real(kind=DP)

abstract interface

  • public function lambda0tvar(x, t) result(y)

    Arguments

    TypeIntentOptionalAttributesName
    real(kind=DP), intent(in), dimension(:):: x
    real(kind=DP), intent(in) :: t

    Return Value real(kind=DP),dimension(:), allocatable


Derived Types

type, public :: lambda_obj

Base class for an lambda function object. This object takes no additional arguments other than the dependent variable x, an array of real numbers

Components

TypeVisibilityAttributesNameInitial
procedure(lambda0), public, pointer, nopass:: lambdaptr=> null()
real(kind=DP), public, dimension(:), allocatable:: lastarg
real(kind=DP), public :: lastval

Constructor

public function lambda_init_0(lambda)
public function lambda_init_0_err(lambda, lerr)
public function lambda_init_tvar(lambda, t)

Finalizations Procedures

final :: lambda_destroy

Type-Bound Procedures

procedure, public :: eval => lambda_eval_0
generic, public :: init => lambda_init_0
procedure, public, nopass :: lambda_init_0

type, public, extends(lambda_obj) :: lambda_obj_err

Extended class for an lambda function object. This object takes allows for the return of a logical error flag during evaluation of the function.

Components

TypeVisibilityAttributesNameInitial
procedure(lambda0), public, pointer, nopass:: lambdaptr=> null()
procedure(lambda0err), public, pointer, nopass:: lambdaptr_err=> null()
real(kind=DP), public, dimension(:), allocatable:: lastarg
real(kind=DP), public :: lastval
logical, public :: lerr

Type-Bound Procedures

procedure, public :: eval => lambda_eval_0_err
generic, public :: init => lambda_init_0, lambda_init_0_err
procedure, public, nopass :: lambda_init_0
procedure, public, nopass :: lambda_init_0_err

type, public, extends(lambda_obj) :: lambda_obj_tvar

Base class for an lambda function object. This object takes no additional arguments other than the dependent variable x, an array of real numbers

Components

TypeVisibilityAttributesNameInitial
procedure(lambda0), public, pointer, nopass:: lambdaptr=> null()
procedure(lambda0tvar), public, pointer, nopass:: lambdaptr_tvar=> null()
real(kind=DP), public, dimension(:), allocatable:: lastarg
real(kind=DP), public :: lastval
real(kind=DP), public :: t

Type-Bound Procedures

procedure, public :: eval => lambda_eval_0
procedure, public :: evalt => lambda_eval_tvar
generic, public :: init => lambda_init_0, lambda_init_tvar
procedure, public, nopass :: lambda_init_0
procedure, public, nopass :: lambda_init_tvar

Functions

public function lambda_eval_0(self, x) result(y)

Arguments

TypeIntentOptionalAttributesName
class(lambda_obj), intent(inout) :: self
real(kind=DP), intent(in), dimension(:):: x

Return Value real(kind=DP)

public function lambda_eval_0_err(self, x) result(y)

Arguments

TypeIntentOptionalAttributesName
class(lambda_obj_err), intent(inout) :: self
real(kind=DP), intent(in), dimension(:):: x

Return Value real(kind=DP)

public function lambda_eval_tvar(self, x, t) result(y)

Arguments

TypeIntentOptionalAttributesName
class(lambda_obj_tvar), intent(inout) :: self
real(kind=DP), intent(in), dimension(:):: x
real(kind=DP), intent(in) :: t

Return Value real(kind=DP),dimension(:), allocatable

public function lambda_init_0(lambda)

Arguments

TypeIntentOptionalAttributesName
procedure(lambda0) :: lambda

Return Value type(lambda_obj)

public function lambda_init_0_err(lambda, lerr)

Arguments

TypeIntentOptionalAttributesName
procedure(lambda0err) :: lambda
logical, intent(in) :: lerr

Return Value type(lambda_obj_err)

public function lambda_init_tvar(lambda, t)

Arguments

TypeIntentOptionalAttributesName
procedure(lambda0tvar) :: lambda
real(kind=DP), intent(in) :: t

Return Value type(lambda_obj_tvar)


Subroutines

public subroutine lambda_destroy(self)

Arguments

TypeIntentOptionalAttributesName
type(lambda_obj) :: self