Template in Fortran?

前端 未结 1 1651
抹茶落季
抹茶落季 2020-12-04 02:43

I have a module that defines three types and and some operations on them.

In a separate module, I want to define an algorithm that operates on either one of these

相关标签:
1条回答
  • 2020-12-04 02:57

    Fortran does not have templates, but you can put the code common to the functions handling different types in an include file as a kludge to simulate templates, as shown in this code:

    ! file "cumul.inc"
    ! function cumul(xx) result(yy)
    ! return in yy(:) the cumulative sum of xx(:)
    ! type, intent(in) :: xx(:)
    ! type             :: yy(size(xx))
    integer :: i,n
    yy = 0
    n  = size(xx)
    if (n < 1) return
    yy(1) = xx(1)
    do i=2,n
       yy(i) = yy(i-1) + xx(i)
    end do
    return
    ! end function cumul
    ! end file "cumul.inc"
    
    module foo
    implicit none
    integer, parameter :: sp = kind(1.0), dp = kind(1.0d0)
    interface cumul
       module procedure cumul_double,cumul_real,cumul_int
    end interface cumul
    contains
    !
    function cumul_double(xx) result(yy)
    real(kind=dp), intent(in) :: xx(:)
    real(kind=dp)             :: yy(size(xx))
    include "cumul.inc"
    end function cumul_double
    !
    function cumul_real(xx) result(yy)
    real(kind=sp), intent(in) :: xx(:)
    real(kind=sp)             :: yy(size(xx))
    include "cumul.inc"
    end function cumul_real
    !
    function cumul_int(xx) result(yy)
    integer, intent(in) :: xx(:)
    integer             :: yy(size(xx))
    include "cumul.inc"
    end function cumul_int
    end module foo
    
    program xcumul
    use foo, only: cumul
    print*,cumul([10,20,30])
    print*,cumul(sin([10.0,20.0,30.0]))
    print*,cumul(sin([10.0d0,20.0d0,30.0d0]))
    end program xcumul
    ! output:
    ! 10 30 60
    ! -0.5440211 0.36892414 -0.6191075
    ! -0.5440211108893698 0.3689241398382579 -0.6191074842546039
    

    The tool mentioned in the paper

    Car, David and Michael List (2010). PyF95++: A Templating Capability for the Fortran 95/2003 Language. ACM Fortran Forum 29(1), 2-20.

    may interest you. I have not tried it.

    0 讨论(0)
提交回复
热议问题