main Program

program~~main~~UsesGraph program~main main module~external external module~external->program~main module~square square module~square->program~main module~square->module~external iso_fortran_env iso_fortran_env iso_fortran_env->program~main iso_fortran_env->module~external iso_fortran_env->module~square
Help


Calls

program~~main~~CallsGraph program~main main proc~squarefun squareFun program~main->proc~squarefun proc~squarewrapperinternal squareWrapperInternal program~main->proc~squarewrapperinternal proc~funwrapper funWrapper program~main->proc~funwrapper proc~squarewrapperexternal squareWrapperExternal program~main->proc~squarewrapperexternal proc~square_local square_local program~main->proc~square_local proc~squarewrapperinternal->proc~squarefun proc~executefun executeFun proc~funwrapper->proc~executefun proc~squarewrapperexternal->proc~squarefun proc~square_local->proc~squarefun
Help

Source Code


Variables

Type AttributesNameInitial
real(kind=wp) :: x(5) =[1., 2., 3., 4., 5.]
real(kind=wp) :: y(5)

Functions

function executeFun(myfun, x) result(y)

Arguments

Type IntentOptional AttributesName
procedure(fun_interf) :: myfun
real(kind=wp), intent(in), dimension(:):: x

Return Value real(kind=wp), dimension(size(x))


Subroutines

subroutine funWrapper(myfun, x, y)

Arguments

Type IntentOptional AttributesName
procedure(fun_interf) :: myfun
real(kind=wp), intent(in), dimension(:):: x
real(kind=wp), intent(out), dimension(:):: y

subroutine squareWrapperInternal(x, y)

Arguments

Type IntentOptional AttributesName
real(kind=wp), intent(in), dimension(:):: x
real(kind=wp), intent(out), dimension(:):: y

Source Code

program main
  use iso_fortran_env, only: wp=>real64
  ! use square, only: fun_interf, &
  !                 & squareFun, &
  !                 & square_local
  ! use external, only: squareWrapperExternal
  use square
  use external
  implicit none

  real(wp) :: x(5) = [1., 2., 3., 4., 5.]
  real(wp) :: y(5)

  ! Call squareFun directly
  y = squareFun(x)
  print '(1x,5(1x,f6.2))', y

  ! Call squareFun using a 'local' wrapper, which exists in same module
  y = square_local(x)
  print '(1x,5(1x,f6.2))', y

  ! Call squareFun using an internal wrapper that calls squareFun directly
  call squareWrapperInternal(x, y)
  print '(1x,5(1x,f6.2))', y

  ! Call squareFun using an external wrapper that calls squareFun directly
  call squareWrapperExternal(x, y)
  print '(1x,5(1x,f6.2))', y

  ! Send squareFun to a 'general' function wrapper - uses a procedure interface
  call funWrapper(squareFun, x, y)
  print '(1x,5(1x,f6.2))', y

contains

  subroutine funWrapper(myfun, x, y)
    real(wp), intent(in),   dimension(:)  :: x
    real(wp), intent(out),  dimension(:)  :: y
    procedure(fun_interf)                 :: myfun

    y = executeFun(myfun, x)

    return
  end subroutine funWrapper

  function executeFun(myfun, x) result(y)
    real(wp), intent(in),   dimension(:)  :: x
    real(wp),             dimension(size(x))  :: y
    procedure(fun_interf)                 :: myfun

    y = myfun(x)

    return
  end function executeFun

  subroutine squareWrapperInternal(x, y)
    real(wp), intent(in),   dimension(:)  :: x
    real(wp), intent(out),  dimension(:)  :: y

    y = squareFun(x)

    return
  end subroutine squareWrapperInternal

end program main