Arrays 通过fortran中的子例程传递未知大小的数组(在子例程中分配的数组)
下面有一个程序,它在第一个子例程(CALCONE)中创建了一个数组,然后我想把它传递到下一个子例程(CALCTWO)中,然后将它输出到主程序中的文件中。我不知道把INTENT(IN)、INTENT(OUT)语句放在哪里,因为数组需要在子程序CALCONE中分配(因为在我的程序中,长度是在CALCONE中确定的)——我已经放弃了我的尝试,以避免混淆。有人能帮我把它们放在正确的地方吗。一旦我有了一个模板,我将了解它在未来是如何工作的。谢谢 我简化了程序,变量表示其他不能移动的东西。我只需要一种方法,在子程序之间移动一个数组,然后在主程序的末尾写出它Arrays 通过fortran中的子例程传递未知大小的数组(在子例程中分配的数组),arrays,fortran,allocation,subroutine,Arrays,Fortran,Allocation,Subroutine,下面有一个程序,它在第一个子例程(CALCONE)中创建了一个数组,然后我想把它传递到下一个子例程(CALCTWO)中,然后将它输出到主程序中的文件中。我不知道把INTENT(IN)、INTENT(OUT)语句放在哪里,因为数组需要在子程序CALCONE中分配(因为在我的程序中,长度是在CALCONE中确定的)——我已经放弃了我的尝试,以避免混淆。有人能帮我把它们放在正确的地方吗。一旦我有了一个模板,我将了解它在未来是如何工作的。谢谢 我简化了程序,变量表示其他不能移动的东西。我只需要一种方法,
program TEST
implicit none
integer a,b,c,d,reclen
a = 1
b = 2
c = 3
d = 4
call CALCONE(a,b,c,d,array)
call CALCTWO(e,f,g,h,array)
inquire(iolength=reclen)array
open(unit=8,file='array_output.dat', &
form="unformatted",access="stream")
write(unit=8)array
close(unit=8)
END PROGRAM TEST
SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
IMPLICIT NONE
integer i,j,k
integer e,f,g,h,N
!ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
real*8, allocatable :: arraydummy(:,:)
e = a + 1
f = b + 1
g = c + 1
h = d + 1
! N can only be is calculated here
allocate(arraydummy(1:N,1:3))
!POPULATE 'arraydummy'
!PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
END SUBROUTINE CALCTWO
SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
IMPLICIT NONE
integer e,f,g,h
!DEFINE HERE ALSO? i.e.
!real*8, allocatable :: arraydummy(:,:)
e = a + 1
f = b + 1
g = c + 1
h = d + 1
arraydummy = arraydummy*e*f*g*h
END SUBROUTINE CALCTWO
您不必在主程序中分配数组,但您肯定必须在那里声明它,并且必须将它作为参数传递(您可以这样做)。请注意,主程序中未定义符号
数组
program TEST
implicit none
integer a,b,c,d,reclen
a = 1
b = 2
c = 3
d = 4
call CALCONE(a,b,c,d,array)
call CALCTWO(e,f,g,h,array)
inquire(iolength=reclen)array
open(unit=8,file='array_output.dat', &
form="unformatted",access="stream")
write(unit=8)array
close(unit=8)
END PROGRAM TEST
SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
IMPLICIT NONE
integer i,j,k
integer e,f,g,h,N
!ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
real*8, allocatable :: arraydummy(:,:)
e = a + 1
f = b + 1
g = c + 1
h = d + 1
! N can only be is calculated here
allocate(arraydummy(1:N,1:3))
!POPULATE 'arraydummy'
!PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
END SUBROUTINE CALCTWO
SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
IMPLICIT NONE
integer e,f,g,h
!DEFINE HERE ALSO? i.e.
!real*8, allocatable :: arraydummy(:,:)
e = a + 1
f = b + 1
g = c + 1
h = d + 1
arraydummy = arraydummy*e*f*g*h
END SUBROUTINE CALCTWO
确保为SUB提供显式接口。因为您使用高级特性(可分配的伪参数),所以这是必要的。最好是将它们放在一个模块中
在这两种情况下,数组都必须定义为伪参数。我在第一个声明中将其声明为intent(out),因为它是在开始时分配的。这并不是绝对必要的
另一个选项是在模块中声明数组,并让模块过程共享它
免责声明:我没有试图编译它
module subs
integer,parameter :: rp = kind(1d0)
contains
SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
IMPLICIT NONE
integer i,j,k
integer e,f,g,h,N
!ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
real(rp), allocatable, intent(out) :: arraydummy(:,:)
e = a + 1
f = b + 1
g = c + 1
h = d + 1
!N can only be is calculated here
allocate(arraydummy(1:N,1:3))
!POPULATE 'arraydummy'
!PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
END SUBROUTINE CALCTWO
SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
IMPLICIT NONE
integer e,f,g,h
!DEFINE HERE ALSO? i.e.
real(rp), allocatable, intent(inout) :: arraydummy(:,:)
e = a + 1
f = b + 1
g = c + 1
h = d + 1
arraydummy = arraydummy*e*f*g*h
END SUBROUTINE CALCTWO
end module subs
program TEST
use subs
implicit none
integer a,b,c,d,reclen
real(rp),allocatable :: array
a = 1
b = 2
c = 3
d = 4
call CALCONE(a,b,c,d,array)
call CALCTWO(e,f,g,h,array)
inquire(iolength=reclen)array
open(unit=8,file='array_output.dat', &
form="unformatted",access="stream")
write(unit=8)array
close(unit=8)
END PROGRAM TEST
您不必在主程序中分配数组,但您肯定必须在那里声明它,并且必须将它作为参数传递(您可以这样做)。请注意,主程序中未定义符号
数组
program TEST
implicit none
integer a,b,c,d,reclen
a = 1
b = 2
c = 3
d = 4
call CALCONE(a,b,c,d,array)
call CALCTWO(e,f,g,h,array)
inquire(iolength=reclen)array
open(unit=8,file='array_output.dat', &
form="unformatted",access="stream")
write(unit=8)array
close(unit=8)
END PROGRAM TEST
SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
IMPLICIT NONE
integer i,j,k
integer e,f,g,h,N
!ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
real*8, allocatable :: arraydummy(:,:)
e = a + 1
f = b + 1
g = c + 1
h = d + 1
! N can only be is calculated here
allocate(arraydummy(1:N,1:3))
!POPULATE 'arraydummy'
!PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
END SUBROUTINE CALCTWO
SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
IMPLICIT NONE
integer e,f,g,h
!DEFINE HERE ALSO? i.e.
!real*8, allocatable :: arraydummy(:,:)
e = a + 1
f = b + 1
g = c + 1
h = d + 1
arraydummy = arraydummy*e*f*g*h
END SUBROUTINE CALCTWO
确保为SUB提供显式接口。因为您使用高级特性(可分配的伪参数),所以这是必要的。最好是将它们放在一个模块中
在这两种情况下,数组都必须定义为伪参数。我在第一个声明中将其声明为intent(out),因为它是在开始时分配的。这并不是绝对必要的
另一个选项是在模块中声明数组,并让模块过程共享它
免责声明:我没有试图编译它
module subs
integer,parameter :: rp = kind(1d0)
contains
SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
IMPLICIT NONE
integer i,j,k
integer e,f,g,h,N
!ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
real(rp), allocatable, intent(out) :: arraydummy(:,:)
e = a + 1
f = b + 1
g = c + 1
h = d + 1
!N can only be is calculated here
allocate(arraydummy(1:N,1:3))
!POPULATE 'arraydummy'
!PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
END SUBROUTINE CALCTWO
SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
IMPLICIT NONE
integer e,f,g,h
!DEFINE HERE ALSO? i.e.
real(rp), allocatable, intent(inout) :: arraydummy(:,:)
e = a + 1
f = b + 1
g = c + 1
h = d + 1
arraydummy = arraydummy*e*f*g*h
END SUBROUTINE CALCTWO
end module subs
program TEST
use subs
implicit none
integer a,b,c,d,reclen
real(rp),allocatable :: array
a = 1
b = 2
c = 3
d = 4
call CALCONE(a,b,c,d,array)
call CALCTWO(e,f,g,h,array)
inquire(iolength=reclen)array
open(unit=8,file='array_output.dat', &
form="unformatted",access="stream")
write(unit=8)array
close(unit=8)
END PROGRAM TEST