Fortran - 显式接口

2023-12-01

我对 Fortran 非常陌生,为了我的研究,我需要运行一个庞大的模型,所以我一边学习一边学习。所以如果我问了一个“愚蠢”的问题,我很抱歉。 我正在尝试编译(Mac OSX,从命令行)并且我已经设法解决了一些问题,但现在我遇到了一些我不确定如何修复的问题。我想我明白了错误背后的想法,但同样不知道如何修复。

该模型很大,所以我只会发布我认为相关的代码部分(尽管我可能是错的)。我有一个包含多个子例程的文件,其开头为:

    !==========================================================================================!
!    This subroutine simply updates the budget variables.                                  !
!------------------------------------------------------------------------------------------!
subroutine update_budget(csite,lsl,ipaa,ipaz)

   use ed_state_vars, only : sitetype     ! ! structure
   implicit none

   !----- Arguments -----------------------------------------------------------------------!
   type(sitetype)  , target     :: csite
   integer         , intent(in) :: lsl
   integer         , intent(in) :: ipaa
   integer         , intent(in) :: ipaz
   !----- Local variables. ----------------------------------------------------------------!
   integer                      :: ipa
   !----- External functions. -------------------------------------------------------------!
   real            , external   :: compute_water_storage
   real            , external   :: compute_energy_storage
   real            , external   :: compute_co2_storage
   !---------------------------------------------------------------------------------------!


   do ipa=ipaa,ipaz
      !------------------------------------------------------------------------------------!
      !      Computing the storage terms for CO2, energy, and water budgets.               !
      !------------------------------------------------------------------------------------!
      csite%co2budget_initialstorage(ipa) = compute_co2_storage(csite,ipa)
      csite%wbudget_initialstorage(ipa)   = compute_water_storage(csite,lsl,ipa)
      csite%ebudget_initialstorage(ipa)   = compute_energy_storage(csite,lsl,ipa)
   end do

   return
end subroutine update_budget
!==========================================================================================!
!==========================================================================================!

我收到如下错误消息

Budget_utils.f90:20.54:

真实的,外部的::compute_co2_storage 1
错误:(1) 处过程“compute_co2_storage”的虚拟参数“csite”具有一个需要此过程的显式接口的属性

(我得到了一堆,但它们本质上都是一样的)。现在,查看 ed_state_vars.f90 (在子例程中“使用”),我发现

!============================================================================!
!============================================================================!
  !---------------------------------------------------------------------------!  
  ! Site type:
  ! The following are the patch level arrays that populate the current site.
  !---------------------------------------------------------------------------!  

type sitetype


     integer :: npatches

     !  The global index of the first cohort in all patches
     integer,pointer,dimension(:) :: paco_id

     ! The number of cohorts in each patch
     integer,pointer,dimension(:) :: paco_n

     ! Global index of the first patch in this vector, across all patches
     ! on the grid

     integer :: paglob_id

     ! The patches containing the cohort arrays
     type(patchtype),pointer,dimension(:) :: patch

等等——这又是 500 行左右。 因此,言归正传,原始子例程似乎需要为其过程提供显式接口,以便能够使用(虚拟)参数 csite。再说一次,我对 Fortran 很陌生,但我真的很想理解它是如何“思考”的。我一直在搜索拥有显式接口意味着什么、何时(以及如何!)使用它等。但我不知道它如何应用于我的情况。我应该使用不同的编译器(英特尔?)。有什么提示吗?

编辑:所以csite被宣布为target在所有程序和声明中type(site type)包含一大堆pointers,如指定sitetype. But sitetype正在正确地used 来自另一个模块(ed_state_vars.f90)在所有程序中。所以我仍然很困惑为什么它会给我显式接口错误?


“显式接口”是指向编译器声明过程(子例程或函数)的接口。这允许编译器检查过程调用和实际过程之间参数的一致性。这样可以发现很多程序员的错误。您可以使用以下方法写出接口:interface语句,但有一个更简单的方法:将过程放入模块中并use该模块来自任何其他调用它的实体——来自主程序或任何本身不在模块中的过程。但你不use同一模块中的另一个过程的过程——它们自动彼此了解。

将过程放入模块会自动使其接口为编译器所知,并可在调用时进行交叉检查use编辑。这比编写接口更容易并且更不容易出错。对于接口,您必须复制过程参数列表。然后,如果您修改程序,您还必须修改调用(当然!)以及接口。

显式接口(interface当您使用“高级”参数时,需要使用语句或模块。否则编译器不知道生成正确的调用

如果您有一个程序useed,你不应该用external。用途很少external在现代 Fortran 中——所以,删除external属性,将所有过程放入一个模块中,并且use them.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fortran - 显式接口 的相关文章

  • 如何包装 fortran write 语句

    我想包装 fortran写语句 http software intel com sites products documentation doclib stdxe 2013 composerxe compiler fortran lin 在
  • 如何使用 GCC 在 C 上编译库?

    我用这些文件创建了一个库pila h and pila c 我编译文件pila c with gcc pila c c这个库运行良好 我已经测试过了 然后我又做了一个图书馆 这个库有文件pila funciones extra h and
  • 如何在 conda 中静音或抑制 gfortran (或 clang?)后端?

    我一直致力于构建一个非常特殊的 conda 环境 专为python and R与串扰使用rpy2 我想出的方法可以安装正确的R包如下 install main environment sh now date T echo Start Tim
  • 不必要的包含文件是否会产生开销?

    我看到了几个关于如何检测 C 项目中不必要的 include 文件的问题 这个问题经常引起我的兴趣 但我一直没有找到满意的答案 如果包含一些未在 C 项目中使用的头文件 这是一种开销吗 我理解这意味着在编译之前 所有头文件的内容将被复制到包
  • 如何在 Visual Studio Code 中编译和运行 Java 代码

    我下载了 Visual Studio Code 并安装了 Java扩展包 https marketplace visualstudio com items itemName vscjava vscode java pack 由微软 之后我下
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • f951 错误:无法识别的命令行选项

    我在linux上 正在编译以下内容 mpif90 shared source F90 object1 o object2 o L some path Qoption link rpath some path I some path lhdf
  • 无法在 Windows 上使用 Gnustep 编译 Objective C

    嗨 我是初学者 学习目标c 我发现错误 hello m 1 34 Foundation Foundation h 没有这样的文件或目录 我开始知道我需要制作一个 make 文件 我可以知道如何制作 make 文件吗 无需创建 makefil
  • 识别操作系统

    我在 Intel 编译器上的 Fortran 90 代码取决于它运行的操作系统 例如 if OS win7 then do X else if OS linux then do y end if 我如何以编程方式执行此操作 您可以使用预处理
  • 所有编程语言都是按顺序读取的吗?

    我似乎无法找到对此的直接答案 使用多个搜索引擎给我的结果非常模糊 或者只回答了一半的问题 那么 详细来说 当您编写一个程序并对其进行编译 解释时 计算机是按时间顺序顺序读取每一行还是默认情况下跳过 Example 使用 C 风格的源代码 因
  • gfortran 支持尾调用消除吗?

    我编写了这个小程序来测试 gfortran 是否执行尾调用消除 program tailrec implicit none print tailrecsum 5 0 contains recursive function tailrecsu
  • 不同的 JDK 更新会产生不同的 Java 字节码吗?

    假设场景 我有一个项目 其源合规性级别指定为 1 5 现在 我使用两种不同的 JDK 编译此项目 首先使用 JDK 6 Update 7 然后使用 JDK 6 Update 20 这两个不同的 JDK 是否会生成不同的 Java 字节代码
  • 如何在不执行Python脚本的情况下检查它的语法?

    我以前用过perl c programfile检查 Perl 程序的语法 然后退出而不执行它 对于 Python 脚本 是否有等效的方法来执行此操作 您可以通过编译来检查语法 python m py compile script py
  • GO TO 语句 - Fortran 到 Matlab

    我一直在努力将此网格搜索代码从 Fortran 转换为 Matlab 但是我无法正确合并 GO TO 语句 我正在尝试使用 while 循环 但我认为我需要其他东西来结束搜索 任何帮助将不胜感激 vmax 1 0E 15 amax G 1
  • Fortran的性能

    Fortran 的表现计算机语言基准游戏 http shootout alioth debian org 出奇的糟糕 今天的结果显示 Fortran 在两项四核测试中分别排名第 14 和第 11 在单核测试中排名第 7 和第 10 现在 我
  • 在 GNU C++ 编译器中运行具有多个源文件的程序

    我在 Windows 7 操作系统上使用 DEV GNU c 编译器 我需要知道如何编译具有多个源文件的程序 这是例子 FILE1 void f1 printf this is another file under same program
  • 使用 jar 依赖项构建 Android 库项目

    我已经被一个问题困扰了几天 但我不知道如何解决这个问题 我正在处理一个 Android 库项目 该项目正在使用 android sdk 提供的 Android 工具进行编译 在项目内部 我遵循 Android 项目的标准结构 我的 jar
  • 为什么Eclipse不需要我配置JDK?

    我最近将 Eclipse 下载到 Windows 7 计算机上 该机器已经有 JRE 但我注意到它没有 JDK 我担心我必须下载 JDK 然后将 Eclipse 连接到它 当我能够在 Eclipse 中直接进行编码 编译和运行时 我感到 愉
  • Fortran 内部计时例程,哪个更好? cpu_time 或 system_clock

    当对 FORTRAN 程序进行计时时 我通常只使用命令call cpu time t 然后我偶然发现call system clock count count rate count max 这似乎做了同样的事情 然而 在更加困难的庄园里 我
  • 这些双精度值如何精确到小数点后 20 位?

    当精度是一个问题时 我正在测试一些非常简单的等价错误 并希望以扩展双精度执行操作 这样我就知道答案在 19位数字中 然后以双精度执行相同的操作 其中第 16 位会有舍入误差 但不知何故 我的双精度算术保持了 19 位精度 当我在扩展双精度中

随机推荐

  • 构造函数中的 C++ 引用

    我有一个类 其构造函数采用对字符串的 const 引用 该字符串充当对象的名称 因此在类实例的整个生命周期中都需要该字符串 现在想象一下如何使用这个类 class myclass public myclass const std strin
  • 尝试生成 9 位数字,每个数字都唯一

    我正在尝试获取 9 位数字 这些数字都有唯一的数字 我的第一种方法似乎有点太复杂 写起来很乏味 include
  • Facebook Open Graph 单页应用程序

    我使用主干js构建了一个单页面应用程序 我对各种应用程序状态和动态内容 例如书籍 有单独的骨干 url 路由 但本质上 Facebook 只会看到索引页面 以下问题似乎提供了一种有趣的方法来为动态内容提供物理开放图 URL 同一页面上有多个
  • 通过命令行调用laravel控制器

    在 kohana 框架中 我可以使用命令行通过命令行调用控制器 php5 index php uri controller method var1 var2 是否可以通过 cli 在 Laravel 5 中调用我想要的控制器 如果是 该怎么
  • 通过 BigCommerce API 访问 Google 购物字段

    我正在与第三方零件供应商创建自定义集成 以在 BigCommerce 的库存中创建产品 我需要能够为导入的产品打开 Google 购物并添加 MPN 和类别 但我不知道如何在 API 中修改它 如果有人有任何反馈 请告诉我 因此 在联系 B
  • 更新对象的嵌套数据数组(Redux)

    我在更新不可变的 redux 和相当嵌套的数据时遇到问题 这是我的数据结构和我想要更改的内容的示例 如果有人可以向我展示使用 ES6 和扩展运算符访问此更新的模式 我将不胜感激 const formCanvasInit id guid fi
  • 如何正确关闭客户端和服务器中的套接字(python)

    我正在用 python 编写 2 个脚本 客户端 py 服务器 py 客户端和服务器之间有一个套接字 场景是这样的 我有一个客户端要求关闭程序 因此它应该通知服务器 然后服务器将通知另一个客户端 因此我需要关闭从客户端 1 到服务器的套接字
  • Angular2 HTTP 使用 observables 订阅显示数据未定义

    我不知道我做错了什么 但不知怎的 我无法读取数据 尽管数据来自服务器响应 甚至当我放置控制台时数据也显示在服务 extractData 方法中 但是在订阅函数内的组件中 它给了我未定义的信息 帮我看看我做错了什么 我假设这是异步的问题 但是
  • 使用 WCF 服务返回 MembershipUser

    我有 WCF 服务从 ActiveDirectory 获取用户 我从请求 用户名 接收参数并使用 MembershipUser 属性创建响应 由于某种原因 联系变得紧密 服务操作找到用户并成功创建响应 执行行时 返回响应 我在客户端遇到异常
  • 无法使用 CreateJS 预加载和显示 SVG

    我正在尝试预加载一组 SVG 对象并使用 CreateJS PreloadJS 显示它们 到目前为止 我能够在不预加载的情况下显示 SVG 对象 但是一旦我使用 PreloadJS 中的 LoadQueue 我就无法让我的示例工作 有人知道
  • 在tableview中延迟加载图像

    我试图以惰性模式加载我的 uitableviewcells 的图像 我试图以最简单的方式做到这一点 我看到了很多例子 但它们超出了我的目的 这就是我目前正在做的事情 但它不起作用 Configure the cell Info info s
  • 创建 TRESTClient 时出错:“没有注册具有 guid [{}] 接口的对等点”

    我已经创建了我的类来使用 REST 我在运行时遇到 TRESTClient 组件问题 TFrwWebServiceREST class TInterfacedObject IRESTWebServiceProxy private FClie
  • 仅从 DateTime 对象获取日期或时间

    我有一个DateTime具有日期和时间的实例 如何仅提取日期或仅提取时间 var day value Date a DateTime that will just be whole days var time value TimeOfDay
  • 我应该如何在 MongoDB 中实现这个模式?

    我正在尝试编写一个跟踪脚本 但在弄清楚数据库应该如何工作方面遇到了麻烦 在 MySQL 中 我创建一个类似于以下的表 User username name string Campaign title string description s
  • 最多应用一次交换操作以获得严格递增序列

    我正在网上的各个网站上做一些 DS A 问题进行练习 我遇到了这个问题 给定一个非负整数数组 您可以从此数组中选择任何数字并交换其中的任意两位数字 如果在交换操作之后数字包含前导零 则可以省略它们并且不考虑它们 您的任务是检查是否可以最多应
  • 如何找到 tibble 列中最长的重复序列?

    我更新了我的问题 因为我的输出表还需要一列 我有以下内容 library tibble my tbl lt tribble year event id winner id 2011 A 4322 2012 A 4322 2013 A 432
  • 外部源文件中不会发生重新定义错误

    下面是我的代码 main c int t double t 0 int main return 0 我们可以看到上面的代码没有编译 gcc 抛出一个错误 t redefinition different basic types 这很公平 但
  • 为什么我的 UITableView 在 5 行之后重复行?

    我的数据库中有 7 行 我确认所有数据都通过 NSLog postArray 成功传输到 iOS 端 它给出了 7 但是 当我运行我的应用程序时 它只会显示前 5 行 然后是前 2 行 而不是第 6 行和我的数据库中的第七行 另外 当我 N
  • 将大型 csv 文件加载到 neo4j 中

    我想加载一个 csv 其中包含维基百科类别 rels csv 之间的关系 类别之间有 400 万个关系 我尝试通过更改以下参数值来修改设置文件 dbms memory heap initial size 8G dbms memory hea
  • Fortran - 显式接口

    我对 Fortran 非常陌生 为了我的研究 我需要运行一个庞大的模型 所以我一边学习一边学习 所以如果我问了一个 愚蠢 的问题 我很抱歉 我正在尝试编译 Mac OSX 从命令行 并且我已经设法解决了一些问题 但现在我遇到了一些我不确定如