【问题标题】:Fortran Mismatch in components of derived type派生类型的组件中的 Fortran 不匹配
【发布时间】:2021-09-07 13:41:50
【问题描述】:

我目前正在用 Fortran 开发软件。我已经有好几次遇到下面的错误了。以前我只是设法撤消这些更改并再次重写代码,因为我无法理解这个问题。

显然,问题又回来了。所以我想知道为什么会这样。我在触发它的代码中做了什么。

使用的编译器是 gfortran-9。我还尝试在 gfortran-10 (ubuntu 20.04) 中编译,希望这是一个已经解决的编译器错误:/。显示的错误相同,但元素不同。

这部分软件包含在一个库(以 SIO_... 开头的模块)中,该库正在使用另一个库(以 SHR_... 开头的模块)。

项目结构:

  • soulio(库文件夹)
    • 源代码
    • 测试/单元
    • soulshared(外部库)

编译时触发错误的文件是soulio/tests/unit/ncSpatialFile.F90。它具有以下导入:

module ncSpatialFile_test

  use netcdf

  use SHR_file_mod, only: removeIfExists
  use SHR_testSuite_mod, only: testSuite
  use SHR_datetime_mod, only: datetime, timedelta, clock
  
  use SIO_ncSpatialFile_mod, only: ncSpatialFile_abs <- gfortran-9 complains about this line
  ...

从 soulio/src/ncSpatialFile_abs.F90 导入

module SIO_ncSpatialFile_abs

!  use netcdf
  use SHR_datetime_mod, only: clock, datetime, timedelta
  use SHR_strings_mod, only: string
  use SHR_precision_mod, only: sp
  use SHR_array_mod, only: initArrayRange
  use SHR_error_mod, only: raiseError

  use SIO_ncfile_mod, only: ncfile
  use SIO_ncDimensions_mod, only: ncDimensions
  use SIO_ncVariables_mod, only: ncVariables
  use SIO_grid_mod, only: grid
  use SIO_parallel_mod, only: mpiContext_type
  use SIO_ncSlimSpatialDims_mod, only: ncSlimSpatialDims
  use SIO_ncFullSpatialDims_mod, only: ncFullSpatialDims
  use SIO_ncSpatialDims_abs, only: ncSpatialDims

  use SIO_ncParams_mod, only: NC_TIME_DIM_NAME, NC_SPATIAL_DIM_NAME!, SIO_NC_GLOBAL_ATTR
  use SIO_ncOtherDim_mod, only: ncOtherDim
  use SIO_ncTimeDim_mod, only: ncTimeDim
  use SIO_ncVar_mod, only: ncVar
  use SIO_ncDim_mod, only: ncDim, ncDimHolder
  use SIO_ncTime_mod, only: ncTime
  use SIO_ncDimensionsRequest_mod, only: ncDimensionsRequest
  use SIO_ncVariableBounds_mod, only: ncVariableBounds
  use SIO_ncAttributes_mod, only: ncAttributes

  ... (too many imports?)

  type, abstract :: ncSpatialFile_abs
    ! netcdf file interface
    class(ncfile), allocatable :: ncfile

    ! time series
    class(clock), allocatable :: ncClock

soulio/soulshared/src/datetime_mod.F90

module SHR_datetime_mod

  use iso_fortran_env, only: real32, real64
  use iso_c_binding, only: c_char, c_int, c_null_char
  use SHR_error_mod, only: raiseError

  implicit none

  private

  public :: datetime, timedelta, clock, calendar
  ...

gfortran-10 中的错误:

soulio/tests/unit/ncSpatialFile_test.F90:20:7:

   20 |   use SIO_ncSpatialFile_mod, only: ncSpatialFile_abs
      |       1
Fatal Error: Mismatch in components of derived type ‘__vtype_shr_datetime_mod_Calendar’ from ‘shr_datetime_mod’ at (1): expecting ‘calendar_assign’, but got ‘getdaysinmonth’
compilation terminated.
make[2]: *** [tests/unit/CMakeFiles/soulio_test.dir/build.make:232: tests/unit/CMakeFiles/soulio_test.dir/ncSpatialFile_test.F90.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:260: tests/unit/CMakeFiles/soulio_test.dir/all] Error 2

gfortran-9 中的错误:

soulio/tests/unit/ncSpatialFile_test.F90:20:6:

   20 |   use SIO_ncSpatialFile_mod, only: ncSpatialFile_abs
      |      1
Fatal Error: Mismatch in components of derived type ‘__vtype_shr_datetime_mod_Clock’ from ‘shr_datetime_mod’ at (1): expecting ‘currenttickintervals’, but got ‘clock_assign’
compilation terminated.
make[2]: *** [tests/unit/CMakeFiles/soulio_test.dir/build.make:232: tests/unit/CMakeFiles/soulio_test.dir/ncSpatialFile_test.F90.o] Error 1

修改 ncSpatialFile_test 但不是 datetime 后出现错误。

我发现这个错误令人困惑。关于编译器想说什么的任何想法?关于如何进一步挖掘的任何其他建议?

编辑:

Datetime_mod 文件取自 https://github.com/wavebitscientific/datetime-fortran。有一些修改,但结构相同。

时钟声明:

type :: clock
    type(datetime) :: startTime
    type(datetime) :: stopTime
    type(datetime) :: currentTime
    type(datetime) :: prevTime !> currentTime - 1 timestep
    type(datetime) :: nextTime !> currentTime + 1 timestep
    type(timedelta) :: tickInterval
    logical :: alarm = .false.
    logical :: started = .false.
    logical :: stopped = .false.
    logical :: nullified = .false. !< it is considered not defined
  contains
    procedure :: getStartTime
    procedure :: getStopTime
    procedure :: reset
    procedure :: tick
    procedure :: toString => toString_clock
    procedure :: isStopped
    procedure :: isNull
    ! true  when the condition is satisfied for the current time step
    procedure :: isBeginYear, isEndYear
    procedure :: isBeginMonth, isEndMonth
    procedure :: isBeginDay, isEndDay
    procedure :: isBeginClock, isEndClock
    procedure :: getTickIntervals
    procedure :: totalTickIntervals
    procedure :: currentTickIntervals
    !
    procedure, private :: clock_assign
    procedure, private, pass(from) :: clock_assign_tickInterval

    generic :: assignment(=) => clock_assign,   clock_assign_tickInterval

    procedure :: findEquivalentCurrentTime
    procedure :: getCalendarType => getCalendarType_clock

    procedure, private :: equiv_clock
    generic :: operator(==) => equiv_clock

    procedure :: isInAbsoluteBounds
  end type clock

【问题讨论】:

  • 如果我们能在datetime_mod.F90 中看到Clock 类型的声明将会很有帮助。
  • 您是否尝试过运行make clean; make 或同等功能?这可能是缓存问题。
  • 您确定您的项目中没有两个名为Clock 的类吗?
  • 项目由cmake管理。我通常删除构建文件夹,然后重新编译整个项目。一定有什么遗漏(?)

标签: cmake fortran gfortran


【解决方案1】:

正如@veryreverie 在 cmets 部分所建议的那样,这是缓存的问题。

cmake 项目将其 mod 文件放入树项目/lib 中。当我清理构建文件夹时,这些文件不会被删除。因此,出现了一些不一致的情况。

【讨论】:

    猜你喜欢
    • 2014-10-18
    • 2020-03-17
    • 2012-10-23
    • 2019-03-02
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多