fortran传递已分配的数组到主程序

时间:2014-06-04 07:43:57

标签: arrays fortran allocation

我有一个带有函数的模块,它接受起点和终点并读入.txt一些浮点值。 我希望该函数返回一个表,我不知道它在启动之前会有多大。

我希望在主程序中使用此函数两次来制作第三个真实数组。但Fortran并不喜欢它。

这是我的函数代码:

module ReadData
    !in this part, you need to know :
!       -the starting (cannot be the first or second point)
!       -end point
!       -the file name (here : cham/comp or flow)
!               change line 40 in case it is not AL026_Pd anymore
!       -where it is on the file
    implicit none

    INTERFACE ReadP
        MODULE PROCEDURE ReadDataPressure
    END INTERFACE

    private :: ReadDataPressure

    contains

    function ReadDataPressure (whereabout,StartingPoint,EndingPoint) result (P1)
        !**********************
        !**decla in variables**
        character(50) :: whereabout !needed : cham/comp or flow
        real(8)       :: StartingPoint,EndingPoint

        !************************
        !**decla used variables**
        character(50) :: FileNameConstructed
        real(8)       :: deltat,CurrentTime,pressure
        integer(8)    :: i,k

        !**********************
        !**decla out variable**
        real(8),allocatable :: P1(:)

        !start of the programe itself
        write (FileNameConstructed,'(a,a,a)') "AL026_pd",whereabout,".txt"
        open(20,file=FileNameConstructed,status='old',action='read')

        read (20,*) deltat,pressure
        read (20,*) CurrentTime,pressure
        deltat=CurrentTime-deltat
        !now deltaT is the loop counter, but we "lost" two usable line in the process
        allocate (P1(1:int(((EndingPoint-StartingPoint)/deltat+1))))

        k=1
        do i=0,int((EndingPoint-2*deltat)/deltat)
            read (20,*) CurrentTime,pressure
            if (CurrentTime>StartingPoint) then
                P1(k)=pressure
                k=k+1
                write(*,*) p1(k)
            end if
        end do
    end function ReadDataPressure
End module

我希望在主程序中做这样的事情

a=ReadP(comp,350,750)
b=ReadP(flow,350,750)
do i=1; lenght_of_a
    m_ox(i)=squarreroot(a(i)-b(i))
end do

结束然后将其写入另一个文件。

我找到了:Share allocatable Arrays
FORTRAN - allocatable array in subroutine

但他们没有帮助我。

也许有人想 http://www.stanford.edu/class/me200c/tutorial_90/09_modules.html 更接近解决方案。

但是他们最后不想要一张桌子,他们使用Prod_A = PRODUCT(A)所以你不知道a的维度,但可以做产品或总和。但我想保持整体。

2 个答案:

答案 0 :(得分:1)

在主程序中,您应该能够声明可分配的数组A,如果您有Fortran 2003编译器,请执行以下操作:

A = ReadDataPressure

这是你想要的。这是赋值的分配,它是Fortran 2003的一部分。 为什么你说“fortran不喜欢它”?具体的错误消息是什么?

对于不支持此编译器的编译器,将该过程设置为子例程将更容易但更不优雅。在主程序和子程序中将数组声明为可分配的。使它成为intent (out)参数并在子例程中分配它。

P.S。除非您没有显示其他方面,否则为单个过程设置模块过程似乎毫无意义。我将省略接口和模块程序并使ReadDataPressure公开,以便直接调用它。

答案 1 :(得分:0)

错误是:

  

character(50):: whereabout

因为有

  

写(FileNameConstructed,'(a,a,a)')" AL026_pd",whereabout," .txt"

除了FileNameConstructed也是一个字符(50)。 (所以我尝试将8 + 50 + 4装入50)。 但是在删除私有之前我无法看到它。 所以,谢谢MSB。你帮助了我很多。我改变了角色(4)的位置(因为它完全符合我的需要),所以它正在运行