Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

Nested dummy procedures

Intel_C_Intel
Employee
361 Views
Hello,
Does any body know how make code below more smart? Do not look whta functions do -- it's example.
Code:
module Parameters
    implicit none
    
    integer, parameter :: K = 10, L = 10
    
end module Parameters
Code:
program DummyProcedures
    use Parameters
    
    implicit none
    
    real(8) X(L)
    
    X = Newton( MyFunc, X )
    
contains
    function Newton( Func, Xi ) result(X)
        real(8) :: X(L)
        interface
            function Func( V )
                use Parameters
                real(8), intent(in) :: V(L)
                real(8) Func(K)
            end
        end interface
        real(8), intent(in) :: Xi(L)
        
        real(8) M(K, L)
            
        M = DiffVectorByVector( Func, Xi )
        X = M(1, :)
    end function Newton
    
    function DiffVectorByVector( Func, V ) result(M)
        interface
            function Func( V )
                use Parameters
                real(8), intent(in) :: V(L)
                real(8) Func(K)
            end
        end interface
        real(8), intent(in) :: V(L)
        real(8) :: M(K, L)
        
        M(1:K, 1) = Func( V )
    end function DiffVectorByVector
    
    function MyFunc( V )
        real(8), intent(in) :: V(L)
        real(8) MyFunc(K)
        
        MyFunc = V(1:Min( K, L ))
    end function MyFunc
end program DummyProcedures
I mean, when dummy function returns scalar all looking good.
Code:
program DummyScalarProcedure
    
    implicit none
    
    integer, parameter :: K = 10, L = 10
    real(8) X(L)
    
    X = Newton( MyFunc, X )
    
contains
    function Newton( Func, Xi ) result(X)
        real(8) :: X(L)
        real(8) Func
        real(8), intent(in) :: Xi(L)
        
        real(8) M(K, L)
            
        M = DiffVectorByVector( Func, Xi )
        X = M(1, :)
    end function Newton
    
    function DiffVectorByVector( Func, V ) result(M)
        real(8) Func
        real(8), intent(in) :: V(L)
        real(8) :: M(K, L)
        
        M(K, 1) = Func( V )
    end function DiffVectorByVector
    
    function MyFunc( V )
        real(8), intent(in) :: V(L)
        real(8) MyFunc
        
        MyFunc = V(Min( K, L ))
    end function MyFunc
end program DummyScalarProcedure
It seems that when I declare dummy function as real(8) Func(K) compiler thinks that it can be only array, but not a function which returns array of length K! But real(8) Func -- can be function wich returns scalar. So I had to use interfaces => module or triple declaration of K and L. May be there is a way of writing more smart code in this case. I'll be glad any help.
0 Kudos
0 Replies
Reply