2014-03-31 50 views
2
.... 
    abstract interface 
    pure function fi(t,u) result (fu) 
     use NumberKinds 
     real(kp), dimension(:), intent(in) :: u 
     real(kp), intent(in) :: t 
     real(kp), dimension(size(u)) :: fu 
    end function fi 
    end interface 


contains 

    pure function rk4_step(u,f,dt) result(un) 
    use NumberKinds 
    real(kp), intent(in) :: dt 
    real(kp), intent(in), dimension(:) :: u 
    real(kp), dimension(size(u)) :: k1,k2,k3,k4,un 
    procedure(fi) :: f 
    integer :: N 
    ... 

    end function rk4_step 
    ... 

我收到此錯誤信息與G95:G95(GCC 4.0.3(G95 0.94)2013年1月17日!)G95 VS gfortran:在PURE過程的啞過程 'F'(1)也必須是PURE

In file src/integrators.f95:34 

    pure function rk4_step(u,f,dt) result(un) 
          1 
Error: Dummy procedure 'f' of PURE procedure at (1) must also be PURE 
Makefile:28: recipe for target 'test_rk4' failed 

我不gfortran得到它:GNU的Fortran(GCC)4.8.2 20140206(預發佈) 和程序編譯沒有進一步的問題

+0

很高興知道,但你爲什麼要編寫自己的龍格庫塔?只是好奇。 – ja72

+0

因爲我必須。我知道..這有點愚蠢,但它是大學任務的一部分 – tgoossens

+1

無論如何,這是一個很好的練習。除非你知道它是如何工作的,否則你不能使用它。祝你好運! – ja72

回答

2

只是一個編譯器錯誤。當Fortran 2003剛開始在編譯器中實現時,g95非常古老。它具有體面的C互操作性,流式訪問等等,但許多其他功能根本沒有實現。

如果您需要現代功能支持,請勿使用長時間未更新的編譯器(最近有一個小例外)。

您可以試用rk4_step內的接口塊,而不是abstract interface,即Fortran 90,它適用於g95。

pure function rk4_step(u,f,dt) result(un) 
    use NumberKinds 
    real(kp), intent(in) :: dt 
    real(kp), intent(in), dimension(:) :: u 
    real(kp), dimension(size(u)) :: k1,k2,k3,k4,un 
    integer :: N 

    interface 
     pure function f(t,u) result (fu) 
     use NumberKinds 
     real(kp), dimension(:), intent(in) :: u 
     real(kp), intent(in) :: t 
     real(kp), dimension(size(u)) :: fu 
     end function f 
    end interface 
    end function rk4_step