各自具有不同派生类型和关联过程的单独模块如何相互使用?

时间:2018-09-08 16:34:16

标签: fortran derived-types

自由格式程序的模块采用以Global_Module开头的层次结构。然后,Channel_Module和Mode_Module都使用Global,并且工作正常。所有模块都使用IMPLICIT NONE。 我已将下面的编译器错误隔离到Modes_Module中与Modes类型相关的初始化过程中的USE Channel_Module语句。

我确定DT旨在通过相关过程彼此共享数据,但是由于未知原因,在这种情况下它不起作用。全局和通道均使用0错误和警告进行编译。通道和模式以前都可以从其全局父级访问数据。一切都是公开的。但是,我现在需要这两个同级组件通过不传递TYPE或CLASS来跨模块边界访问选择的组件。我尝试将USE限制为ONLY通道的DT,但这对编译结果没有影响。我想知道我是否缺少有关如何执行此操作的信息。 在这种情况下如何实现派生类型的交叉引用?

  

使用Intel(R)Visual Fortran编译器XE 12.0.4.196进行编译   [IA-32] ... ifort / nologo / debug:full / Od / fpscomp:filesfromcmd   / warn:声明/ warn:未使用/ warn:truncated_source   / warn:interfaces / module:“ Debug \” / object:“ Debug \”   /Fd"Debug\vc90.pdb“ / traceback / check:bounds / libs:static / threads   / dbglibs / c / Qvc9 / Qlocation,link,“ c:\ Program Files(x86)\ Microsoft   Visual Studio 9.0 \ VC \ bin“” C:\ Users \ username \ Documents \ Visual Studio   2008 \ Projects \ ELA \ ELA \ Modes_Mdl.f90“

我认为以下伪代码应有助于阐明此问题。首先初始化通道,然后是模式。在成功进行Modes初始化之后,然后打算通过Channel%calculatemyArray填充Channel%myArray。

在Channel_mdl.f90文件中:

MODULE Channel_MODULE
   USE GLOBAL_MODULE !omitted for clarity
   TYPE Channel_TYPE
      ! some vars
      REAL, DIMENSION(3,12) :: myArray
      LOGICAL :: populated = .false. !set to true in initChannel_Type
      CONTAINS
         PROCEDURE :: initialize => initChannel_Type !omitted for clarity
         PROCEDURE :: calculatemyArray !to be Called following successful init of Modes, thus need to share info between these objects.
   END TYPE Channel_TYPE
CONTAINS
   LOGICAL FUNCTION calculatemyArray(this, Mds) !populate myArray
      USE Modes_Module !need access to Modes%Qty array
      IMPLICIT NONE
      CLASS(Channel_Type), INTENT(INOUT) :: this
      TYPE (Mode_Type), INTENT(IN) :: Mds
      calculatemyArray = .true. !unless error occurs herein
!     initialization process ...
   END FUNCTION calculatemyArray
END MODULE Channel_Module

在文件Modes_Mdl.f90

MODULE Modes_MODULE
   USE GLOBAL_MODULE !omitted for clarity
   TYPE Modes_TYPE
      ! some vars
      INT(int16), ALLOCATABLE, DIMENSION(:) :: Qty
      LOGICAL :: populated = .false.
      CONTAINS
         PROCEDURE :: initialize => initializeModes
   END TYPE Modes_TYPE
CONTAINS
   SUBROUTINE initializeModes(this, Srcs)
      USE Channel_Module !need access to Srcs%Count to allocate Qty array
      IMPLICIT NONE
      CLASS(Modes_Type), INTENT(INOUT) :: this
      TYPE (Channel_Type), INTENT(IN) :: Srcs
!     initialization process ...
      ALLOCATE(Qty(Srcs%Count))
      populated = .true.
   END SUBROUTINE initializeModes
END MODULE Modes_Module

在文件myPgm.f90

Program foo
   USE Channel_Module
   USE Modes_Module
   IMPLICIT NONE
   TYPE (Channel_Type) :: Channels
   TYPE (Mode_Type) :: Modes
   Call Channels%initialize()
   IF (Channels%populated) THEN
      Call Modes%initialize(Channels)
!  other statements & functions
   END IF
END Program foo

您知道同时有什么悲伤和好事吗?发现我想要的东西使我无法获得所需的东西。在上述情况下,如果仅传递Channel的Count子组件值(一个INT)而不传递整个Channel对象(我认为自己想要的),我认为整个问题都会消失。 我仍然非常想知道如何在DT过程之间传递DT对象。这样做的方法似乎难以捉摸...

0 个答案:

没有答案