Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 在公共位置收集变量-fortran90_Module_Fortran - Fatal编程技术网

Module 在公共位置收集变量-fortran90

Module 在公共位置收集变量-fortran90,module,fortran,Module,Fortran,谢谢你的建议。请原谅我说得不够清楚。让我尽我所能再描述一遍 有两种型号-A和B。型号A有一个子程序(它不是模块的一部分)compns.f,由主程序调用。下面是compns.f代码: 公司f:(A型) 包含子例程compns\u var\u dump(用于收集变量)的另一个模块是 var_repos.f90: MODULE var_repos IMPLICIT NONE PUBLIC :: compns_var_dump PUBLIC :: tstep_var_dump

谢谢你的建议。请原谅我说得不够清楚。让我尽我所能再描述一遍

有两种型号-A和B。型号A有一个子程序(它不是模块的一部分)
compns.f
,由主程序调用。下面是
compns.f
代码:

公司f:(A型)

包含子例程compns\u var\u dump(用于收集变量)的另一个模块是
var_repos.f90

MODULE var_repos

  IMPLICIT NONE

  PUBLIC :: compns_var_dump

  PUBLIC :: tstep_var_dump       !!! to dump variables from another place

  REAL, PUBLIC :: d_time    ! dummy variable

! declare the variables which will go public here:

  REAL,    PUBLIC :: deltim, fhout

CONTAINS

  SUBROUTINE compns_var_dump(deltim , fhout)

  REAL,    INTENT(inout) :: deltim , fhout

  d_time = deltim

  WRITE(*,*)'Inside var_repos: deltim = ',deltim,d_time

  END SUBROUTINE compns_var_dump

  SUBROUTINE tstep_var_dump

  ...

  END SUBROUTINE tstep_var_dump

END MODULE var_repos
现在,我需要模型B中
var_repos.f90
中的变量。模型B中需要这些变量的模块如下:

mo\U time\U control.f90:(型号B)

运行模型后的输出如下:

'Inside var_repos: deltim = ' 360.000 360.000

'Inside function get_delta_time(): deltim= ' 0.00000E+00 0.00000E+00 0.00000E+00
我希望在这篇文章中我是清楚的。有没有更好的方法来完成上述任务?我的理念是通过不同的子例程调用将模型A中所需的变量收集到一个模块中,从而将此模块用作存储库,并让模型B将其用于所需的变量。这个方法正确吗?

试试这个例子:

MODULE var_repos

  IMPLICIT NONE

  PUBLIC :: compns_var_dump

  REAL,    PUBLIC :: deltim, var2

CONTAINS

  SUBROUTINE compns_var_dump(deltim , fhout)

  REAL,    INTENT(in) :: deltim , fhout

  WRITE(*,*)'Inside var_repos: args = ', deltim, fhout
  var2 = fhout

  END SUBROUTINE compns_var_dump

END MODULE var_repos


program test

use var_repos

call compns_var_dump ( 2.0, 3.0 )

write (*, *) "in main:", deltim, var2

end program test
输出为:

 Inside var_repos: args =    2.00000000       3.00000000    
 in main:   0.00000000       3.00000000    
我相信答案是子程序的参数deltim和同名的模块变量是不同的变量。创建与模块变量同名的子例程伪参数会屏蔽模块,而不是自动将值复制到模块变量。因此,主要模块变量deltim没有收到值2,并且未定义。对于编译器,我使用它的随机值为零;不同编译器上的值可能不同。另一方面,变量fhout和var2是不同的,伪参数fhout被主动复制到var2。因此,模块var2的值被设置并可用于使用该模块的任何例程(此处为主程序)

编辑:解决方案是我为参数fhout和模块变量var2显示的。调用伪参数ARG_varX和模块变量GBL_varX。在子例程内部,使用赋值语句将每个ARG_varX复制到GBL_varX。然后,任何使用该模块的过程都可以访问变量GBL_varX,该变量的值将被发送到子例程中。这能解决你的问题吗

编辑2:这是您的新代码的一个版本。它似乎起作用了。如果有一个bug,要么我修复了它,要么它超出了您显示的代码范围:

MODULE var_repos

   IMPLICIT NONE

   PUBLIC :: compns_var_dump

   ! declare the variables which will go public here:

   REAL,    PUBLIC :: GBL_deltim, GBL_fhout

CONTAINS

   SUBROUTINE compns_var_dump(ARG_deltim, ARG_fhout)

      REAL,    INTENT(in) :: ARG_deltim , ARG_fhout

      GBL_deltim = ARG_deltim
      GBL_fhout = ARG_fhout

      WRITE(*,*)'Inside compns_var_dump:', ARG_deltim, GBL_deltim, GBL_fhout

   END SUBROUTINE compns_var_dump

END MODULE var_repos

! ------------------------------------------------------------

module my_b

contains

   subroutine compns ()
      use var_repos, only: compns_var_dump

      real :: deltim, fhout

      deltim = 360.0
      fhout  = 6.0


      write (*, *) "compns:", deltim, fhout

      CALL compns_var_dump(deltim,fhout)  ! calls the subroutine and passes the variables

   end subroutine compns

end module my_b

! ------------------------------------------------------------

MODULE time_control

   PUBLIC :: get_delta_time

CONTAINS

   FUNCTION get_delta_time()

      USE var_repos,      ONLY: GBL_deltim

      IMPLICIT NONE

      real :: get_delta_time

      REAL :: a_time            ! Testing

      get_delta_time = GBL_deltim

      a_time = GBL_deltim           ! Testing

      WRITE(*,*)'Inside function get_delta_time(): deltim= ', GBL_deltim, get_delta_time, a_time

   END FUNCTION get_delta_time

END MODULE time_control

! ------------------------------------------------------------

program main

   use var_repos, only: GBL_deltim, GBL_fhout
   use my_b, only: compns
   use time_control, only: get_delta_time

   real :: local_var

   call compns ()

   local_var = get_delta_time ()

   write (*, *) "main:", local_var, GBL_deltim, GBL_fhout

end program main

谢谢我已经编辑了我的问题,以提供更好的澄清,请通过它,并提供解决方案。再次提前感谢。我已经实现了对两个变量所说的内容,但仍然没有得到答案…这次不是0.000,而是3.85156500(完全出乎意料,出乎意料)。出乎意料的值表明类型不一致,可能是子例程的伪参数和调用中的变量之间的不一致。变量是否在一个位置声明为纯实数,在其他位置声明为“实数(DP)”呢?如果子例程在一个模块中并且被“使用”,编译器会发现这个猜测问题。非常感谢M.S.B!罪魁祸首是类型不一致。我已经花了将近一个星期的时间弄清楚了。无论如何,对我来说,这仍然是一个很长的路要走到这个模型的发展,我会继续张贴我的查询。再次感谢亲爱的:)请格式化源代码。
 Inside var_repos: args =    2.00000000       3.00000000    
 in main:   0.00000000       3.00000000    
MODULE var_repos

   IMPLICIT NONE

   PUBLIC :: compns_var_dump

   ! declare the variables which will go public here:

   REAL,    PUBLIC :: GBL_deltim, GBL_fhout

CONTAINS

   SUBROUTINE compns_var_dump(ARG_deltim, ARG_fhout)

      REAL,    INTENT(in) :: ARG_deltim , ARG_fhout

      GBL_deltim = ARG_deltim
      GBL_fhout = ARG_fhout

      WRITE(*,*)'Inside compns_var_dump:', ARG_deltim, GBL_deltim, GBL_fhout

   END SUBROUTINE compns_var_dump

END MODULE var_repos

! ------------------------------------------------------------

module my_b

contains

   subroutine compns ()
      use var_repos, only: compns_var_dump

      real :: deltim, fhout

      deltim = 360.0
      fhout  = 6.0


      write (*, *) "compns:", deltim, fhout

      CALL compns_var_dump(deltim,fhout)  ! calls the subroutine and passes the variables

   end subroutine compns

end module my_b

! ------------------------------------------------------------

MODULE time_control

   PUBLIC :: get_delta_time

CONTAINS

   FUNCTION get_delta_time()

      USE var_repos,      ONLY: GBL_deltim

      IMPLICIT NONE

      real :: get_delta_time

      REAL :: a_time            ! Testing

      get_delta_time = GBL_deltim

      a_time = GBL_deltim           ! Testing

      WRITE(*,*)'Inside function get_delta_time(): deltim= ', GBL_deltim, get_delta_time, a_time

   END FUNCTION get_delta_time

END MODULE time_control

! ------------------------------------------------------------

program main

   use var_repos, only: GBL_deltim, GBL_fhout
   use my_b, only: compns
   use time_control, only: get_delta_time

   real :: local_var

   call compns ()

   local_var = get_delta_time ()

   write (*, *) "main:", local_var, GBL_deltim, GBL_fhout

end program main