我刚刚从C ++切换到Fortran。正如你可能猜到的那样,我有一些语法成长的痛苦。
我想要完成的是使用动态数组定义一个类。然后我需要将一个类变量传递给一个子例程,但是我无法弄清楚如何声明(这里是正确的词吗?我还在思考C ++),子例程中的数组。
以下是我的代码中适用的部分。
program lennard
implicit none
type list
integer :: M,ncell !! m is number of cells per dimension. ncell is the total number of cells
double precision :: rn !! length per dimension of cell
double precision, allocatable :: HOC(:), ll(:),nlist(:)
double precision, allocatable :: verlet(:,:)
end type list
type(list) :: listvar
double precision, allocatable :: x(:), y(:), z(:)
integer :: N
allocate (x(np),y(np),z(np))
listvar%rn = box/int(box/rcut)
listvar%ncell = vol/(listvar%rn**3)
listvar%M = listvar%ncell**(1.0/3.0)
allocate (listvar%HOC(listvar%ncell), listvar%ll(np), listvar%nlist(np))
allocate (listvar%verlet(np,np))
stop
end program lennard
这是子程序
subroutine nlist(np,x,y,z,listvar)
implicit none
type list
integer :: M,ncell !! m is number of cells per dimension. ncell is the total number of cells
double precision :: rn !! length per dimension of cell
double precision :: HOC(:), ll(:),nlist(:)
double precision :: verlet(:,:)
end type list
integer :: i
integer :: icel, M,ncell
integer :: np
type(list) :: listvar
double precision :: x(np),y(np),z(np)
double precision,allocatable :: listvar%ll(np),x(np),y(np),z(np)
double precision,allocatable :: listvar%HOC(listvar%ncell)
do i=1,ncell
listvar%hoc(i)=0.0
enddo
do i=1,np
icel = int(x(i)/listvar%rn)+M*int(y(i)/listvar%rn)+M*M*int(z(i)/listvar%rn)
listvar%ll(i) = listvar%hoc(icel)
listvar%hoc(icel) = i
enddo
return
end subroutine nlist
答案 0 :(得分:1)
在回答我认为你的问题之前,我会注意到一些事情。子例程中的类型list
和程序中的类型list
是不是相同的东西,即使它们具有相同的名称和组件。相反,您只需要一种类型定义。由于子程序nlist
不是程序的内部程序,因此您可以使用模块执行此操作,然后在程序中use
。
此外,您可能希望将子例程nlist
也放在此模块中(在contains
之后),因为这是一种为程序提供显式接口的简便方法。如果模块中没有nlist
,那么您也需要use
模块。
这样就可以了
double precision,allocatable :: listvar%ll(np),x(np),y(np),z(np)
double precision,allocatable :: listvar%HOC(listvar%ncell)
毫无意义。一旦有了类型定义,就不需要声明组件。实际上,它是错误的,并且必须在类型定义中给出allocatable
属性,就像您在程序中一样。此外,您已在之前的行中声明了x
,y
和z
。 [另请注意,除非您使用这些变量的分配状态,否则不需要使用allocatable
属性声明它们。]
你有一个模块,然后像:
module listmod
implicit none
type list
integer :: M,ncell
double precision :: rn !! length per dimension of cell
double precision, allocatable :: HOC(:), ll(:),nlist(:)
double precision, allocatable :: verlet(:,:)
end type list
contains
subroutine nlist(np,x,y,z,listvar)
! Declarations for np, x, y, z
type(list), intent(inout) :: listvar ! A sensible assumption of intent
! Declaration of local variables
! Work
end subroutine
end module