main.f90 Source File

This File Depends On

sourcefile~~main.f90~~EfferentGraph sourcefile~main.f90 main.f90 sourcefile~external.f90 external.f90 sourcefile~external.f90->sourcefile~main.f90 sourcefile~square.f90 square.f90 sourcefile~square.f90->sourcefile~main.f90 sourcefile~square.f90->sourcefile~external.f90
Help

Source Code


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