texas
texas

Reputation: 45

fortran pass allocated array to main procedure

I have a module with a function which takes a starting and ending point and reads in a .txt some float value. I wish that function to return a table which I do not know how large it will be before it starts.

I wish to use this function twice in the main program to make a third real array. But Fortran doesn't like it much.

Here is my code for the function :

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

and I wish to do something like this in the main program

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

end then write it in another file.

I found : Share allocatable Arrays
FORTRAN - allocatable array in subroutine

but they did not help me.

One thinks perhaps http://www.stanford.edu/class/me200c/tutorial_90/09_modules.html is closer to the solution.

But they don't want a table at the end, they use Prod_A = PRODUCT(A) so you do not know the dimension of a, but can do product or sum. But I want to keep it whole.

Upvotes: 0

Views: 333

Answers (2)

M. S. B.
M. S. B.

Reputation: 29381

In the main program you should be able to declare an allocatable array A and, if you have a Fortran 2003 compiler, do:

A = ReadDataPressure

Which is what you wish. This is allocation on assignment, which is part of Fortran 2003. Why do you say that "fortran doesn't like it"? What are the specific error messages?

With compilers that don't support this it will be easier though less elegant to make the procedure a subroutine. Declare the array as allocatable in both the main program and the subroutine. Make it an intent (out) argument and allocate it in the subroutine.

P.S. Unless there are other aspects that you are not showing, setting up a module procedure for a single procedure seems pointless. I would leave off the interface and module procedure and make ReadDataPressure public so that it is directly called.

Upvotes: 2

texas
texas

Reputation: 45

the mistake was :

character(50) :: whereabout

because there was

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

except that FileNameConstructed is also a character(50). (So i try to fit a 8+50+4 into 50). But I was not able to see it before removing the private. So thank MSB. You helped me a lot. I change whereabout in character(4) (since it feet my need perfectly) and so it is running

Upvotes: 0

Related Questions