类结构/动态数组

时间:2014-02-01 15:07:57

标签: fortran fortran90

我刚刚从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

1 个答案:

答案 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属性,就像您在程序中一样。此外,您已在之前的行中声明了xyz。 [另请注意,除非您使用这些变量的分配状态,否则不需要使用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