时间数组在建模中超出范围?

2024-04-20

这些天我正在尝试使用新的气象数据(以 netcdf 格式而不是旧的 cray 格式给出)运行我的气候模型。模型编译顺利,但是当进行模拟时,模型在第一天运行良好,但在模拟的第二天就停止了,总是在同一时间步长,无论我使用哪个开始日期。错误是:

forrtl: strict (408): fort: (2): 数组 TIMEVALS 的下标 #1 的值为 141,该值大于上限 140。

所以我做了一些研究,浏览了我的源代码,看看 timevals 指的是什么样的数组,我发现它指的是这个具有时间维度的新气象数据,而这样的时间数组由 140 个元素组成。每个元素都是模型应该用于模拟的气象数据的特定日期和时间......所以我开始相信这是我的代码的问题,但我的同事已经能够在没有任何情况下运行模型问题,这对我来说很奇怪。他在 Makefile 中使用一些不同的设置编译了模型,我不知道这是否重要,我对 fortran 等还不是很熟悉。但是下面是使用这个 TIMEVALS 数组的代码部分:

           CASE(2)        ! nudging data is in netcdf-format

           cfile = str_filter(ndg_file_nc,yr,mo,dy,hr,mi,se,ndgblock)
           CALL message('   Adjust date using file: ',TRIM(cfile))

           IF (p_parallel_io) THEN
             INQUIRE(file=cfile,exist=found)
             IF (.NOT.found) &
                CALL finish('NudgingInit','Nudging data file not found.')
             ndgfile%format = NETCDF
             CALL IO_open (cfile, ndgfile, IO_READ)
             CALL IO_INQ_DIMID(ndgfile%file_id, 'time', ndimid)
             CALL IO_INQ_DIMLEN(ndgfile%file_id, ndimid, nts)
             CALL IO_INQ_VARID(ndgfile%file_id, 'time', nvarid)
             ALLOCATE (timevals(nts))
             CALL IO_GET_VAR_DOUBLE (ndgfile%file_id, nvarid, timevals)
             ihead_nc(1) = FLOOR(timevals(1))                          ! ihead_nc(1) is YYYYMMDD
             ihead_nc(2) = INT((timevals(1)-ihead_nc(1))*24._dp)       ! ihead_nc(2) is HH
             DEALLOCATE (timevals)
           ENDIF

           IF (p_parallel) CALL p_bcast(ihead_nc, p_io)
           CALL inp_convert_date(ihead_nc(1),ihead_nc(2)*10000, ndg_date0)

             IF (p_parallel_io) THEN
             ! skip first record and read second header
             ALLOCATE (timevals(nts))
             CALL IO_GET_VAR_DOUBLE (ndgfile%file_id, nvarid, timevals)
             ihead_nc(1) = FLOOR(timevals(2))                          ! ihead_nc(1) is YYYYMMDD
             ihead_nc(2) = INT((timevals(2)-ihead_nc(1))*24._dp)       ! ihead_nc(2) is HH
             DEALLOCATE (timevals)
             CALL IO_close(ndgfile)
           ENDIF

           IF (p_parallel) CALL p_bcast(ihead_nc, p_io)
           CALL inp_convert_date(ihead_nc(1),ihead_nc(2)*10000, ndg_date1)

ndg_file and ndg_date参考微推(气象数据) 你们知道什么可能会导致这个错误吗?


我现在有一些时间来详细阐述我之前的评论。 (请注意,我使用斜体表示您可能想阅读的术语。)

您报告的错误是运行时错误,而不是编译器在编译时能够看到的错误。如果您不明白两者之间的区别run-time(即当代码执行时)和编译时(即当编译器将您的源代码转换为可执行代码时)进行一些研究。此外,很明显,您(或某人)已指示编译器创建一个代码版本,用于检查数组元素访问是否在数组范围内。在测试新软件时,这是一个非常重要的安全功能,但是当代码执行时,一旦通过测试,就在没有进行此检查的情况下编译了如此多的代码,从而造成了性能损失。

我不知道您使用的是什么编译器,但请查看其文档以找到打开的选项数组边界检查在运行时。

错误消息非常明确——在代码中的某个时刻,它尝试访问只有 140 个元素的数组的第 141 个元素。我们无法告诉您这是如何发生的,即使我们看到了您的整个代码,也可能无法告诉您。当加载的数据不符合程序员的期望时,这种事情经常发生。当程序员制作时也经常发生这种情况差一编写循环时出错。我们可能会通过查看您的整个代码来发现这一点,但您比我们处于更有利的位置。

你写

但我的同事能够毫无问题地运行该模型,这对我来说很奇怪。他在 Makefile 中使用一些不同的设置编译了模型,我不知道这是否重要,

嗯,是的,这很重要,非常重要。如果您编写的代码访问具有 140 个元素的数组的元素 141,则 Fortran 与许多其他编译语言一样,将很乐意访问内存中元素 140 之后的下一个位置。通常,您不知道程序正在干扰哪些数据。如果幸运的话,内存中的下一个位置位于操作系统分配给程序的地址空间之外,操作系统会立即停止程序并报告分段错误。

如果你运气不好,程序会继续愉快地读取和写入元素 141,无论它是什么。

我推测您的同事尚未对其代码版本实现数组边界检查。是否告诉他他的代码(很可能)被破坏了,这取决于你。

那么你该怎么办呢?你debug该程序。您可以通过多种方式执行此操作,其中最简单的方法是(在我看来)插入一些write语句在代码中的关键点打印出变量值,以测试您对它们可能、可以或实际采用的值的假设。更困难,但在未来解决问题方面值得付出最初的努力,那就是在一个人的控制下运行代码debugger。有几个很好的调试器可用于所有主要平台上的 Fortran 程序。

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

时间数组在建模中超出范围? 的相关文章

  • 如何获取 ios 日期数组中的所有星期日

    我只想要一个数组 它以 NSDate 的形式包含一年中的所有星期一 但速度很快 我在 Objective c 中使用以下代码 但不知道如何在 swift 中使用它 NSDate pickerDate NSDate date NSLog pi
  • 如何使用 Vue.js 向数组(数据)中的所有对象添加属性?

    背景 我在 data 中有一个数组 其中填充了来自后端的对象 如果 GET 请求检索 6 个对象 这 6 个对象将在数组中更新 Problem 我已经了解需要 vm set 来向对象添加属性 但是如何为数组中的所有对象添加属性呢 我想改变
  • Java 数组操作

    我有一个名为 resize 的函数 它接受源数组 并将大小调整为新的宽度和高度 我认为我正在使用的方法效率低下 我听说有更好的方法可以做到这一点 无论如何 当scale是一个int时 下面的代码有效 然而 还有第二个函数称为 half 它使
  • Java中如何对对象数组进行排序?

    我的数组不包含任何字符串 但它包含对象引用 每个对象引用都通过 toString 方法返回名称 id 作者和发布者 public String toString return name n id n author n publisher n
  • 保存和恢复陷阱状态?管理多个陷阱处理程序的简单方法?

    有什么好的方法可以覆盖bash陷阱处理程序不会永久破坏可能已设置或尚未设置的现有处理程序 动态管理任意陷阱例程链怎么样 有没有办法保存陷阱处理程序的当前状态 以便以后可以恢复 在 Bash 中保存和恢复陷阱处理程序状态 我将提交以下堆栈实现
  • 数组匹配值过滤器 PHP [重复]

    这个问题在这里已经有答案了 我尝试在数组中搜索 但根本没有得到任何结果 假设我有一个包含一些值的数组 所以当我想搜索它们时 它总是返回 null 不知道为什么 假设这是我的数组 data Array 0 gt Array id gt 122
  • 如何将两个不同的哈希数组中的值添加在一起?

    我有两个哈希数组 哈希值的键不同 player scores1 first name gt Bruce score gt 43 time gt 50 first name gt Clark score gt 45 minutes gt 20
  • 将数组与其自身连接起来以复制它

    In Python gt gt gt 1 2 3 4 2 1 2 3 4 1 2 3 4 走什么路JavaScript 目前使用 var data 1 2 3 4 data concat data 1 2 3 4 1 2 3 4 JavaS
  • 将构造函数传递给 Array.map?

    我怎样才能做这样的事情 var a 1 2 3 4 a map Date constructor 此代码在 Google V8 上引发错误 SyntaxError Unexpected number 我也尝试过 a map Date con
  • 在 Scala 中将元素追加到列表末尾

    我无法添加 type 元素T到一个列表中List T 我尝试过myList myElement但它似乎创建了一个奇怪的对象并访问myList last始终返回放入列表中的第一个元素 我怎么解决这个问题 List 1 2 3 4 Result
  • foreach 循环中 current() 的意外行为[重复]

    这个问题在这里已经有答案了 这是一个简单的循环 list array A B C D foreach list as var print current list Output demo http 3v4l org sBDjl BBBB O
  • 如何使用 Jersey 将嵌套列表封送为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

    我正在开发一个使用 Jersey 将对象转换为 JSON 的项目 我希望能够写出嵌套列表 如下所示 data one two three a b c 我想要转换的对象首先将数据表示为 gt gt 我认为 Jersey 会做正确的事情 以上输
  • ArraySlice 中的 Swift [重复]

    这个问题在这里已经有答案了 在数组上使用 prefix 方法后 我得到了所谓的 arraySlice 我怎样才能将其转换为数组 我试图从 FacebookGraphApi 获取 Ints 然后请求前 3 个 前缀 3 并尝试将它们添加到新数
  • JavaScript 数组对 2 个属性进行排序

    我有一个 JSON 对象数组 如下所示 var garments name Garment 1 isDesignable false priority 3 name Garment 2 isDesignable false priority
  • 为什么对于小数组,for-of 循​​环比标准 for 循环快,而对于大数组则慢?

    在 JavaScript 中 我注意到 ES6for of循环的性能与传统的有很大不同for start stop step loop 基准 const n 10000 const arr Array n fill map e i gt i
  • Fortran 在 gdb 中打印可分配数组

    我正在向开源科学代码添加一些功能 我使用很多可分配项 但在正确打印它们时遇到一些问题 例如 我声明并分配 然后使用 real dp allocatable psi n phi some other stuff here allocate p
  • postgresql中数组的区别

    我有两个数组 1 2 3 4 7 6 and 2 3 7 在 PostgreSQL 中可能有共同的元素 我想做的是从第一个数组中排除第二个数组中存在的所有元素 到目前为止我已经取得了以下成果 SELECT array SELECT unne
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我
  • 来自索引范围 Swift 的新数组

    我怎样才能做这样的事情 从数组中取出前 n 个元素 newNumbers numbers 0 n 目前出现以下错误 error could not find an overload for subscript that accepts th
  • 二维数组的 MPI 数据类型

    我需要将一个整数数组的数组 基本上是一个二维数组 从根传递给所有处理器 我在 C 程序中使用 MPI 如何声明二维数组的 MPI 数据类型以及如何发送消息 我应该使用广播还是分散 你需要使用播送 http www netlib org ut

随机推荐

  • 仅当 gradle 中另一个任务不是最新时才运行任务

    我想在 Gradle 中进行功能测试时自动添加 serverRun 任务 因此我添加了一个依赖项 funcTestTask dependsOn serverRun 无论 funcTestTask 是否运行 任务都会运行 compile se
  • 如何使用敏感数据运行 cron 作业?

    I read 在哪里可以设置 crontab 将使用的环境变量 https stackoverflow com questions 2229825 where can i set environment variables that cro
  • 如何正确使用CGPathApply

    我尝试使用 CGPathApply 迭代 CGPathRef 对象中的每个 CGPathElement 主要是编写一种自定义方法来保存 CGPath 数据 问题是 每次调用 CGPathApply 时 我的程序都会崩溃 根本没有任何信息 我
  • WebLogic Server 10.3.6 中的 JPA 2.0

    我需要使用 JPA 2 0 带有 EclipseLink 实现 问题是我还需要在实现 Java EE 5 规范的 WebLogic 10 3 6 服务器中部署此应用程序 因此不需要支持 JPA 2 我知道有可用于在此版本中添加对 JPA 2
  • 参数列表中的 void_t 可以工作,但不能作为返回类型

    cppreference 上有一个关于使用别名的示例 这个例子失败是因为int没有会员foo template
  • 使用 Apache2 的 NodeJS 应用程序有时会返回 503 服务器不可用

    风景 我有一个乌班图18 04DigitalOcean 中的服务器具有以下规格 1 vCPUs 1GB and 25GB磁盘 在这个服务器 我们称之为 API SERVER 中 我使用 PHP 和 NodeJS 在由 apache 管理的代
  • 何时处置?

    我对所有有关 IDispose 和 使用 语句的讨论感到困惑 我想知道是否有人可以告诉我在下面的测试示例中是否需要使用 using 语句或 IDispose 的某种实现 public class Main MyFile myFile new
  • resharper 单元测试继承

    有人有 Resharper 单元测试层次结构的策略吗 我通常使用 TestDriven Net 和 Resharper 的测试运行器以及 NUnit 测试 TestDriven 对所有事情都很棒 但很快就会从批量运行 可能是数千个 中找到一
  • WordPress 博客文章未显示 Facebook 预览图像

    我有一篇博客文章here http gingerslist com blog 62 smiles and understanding 2 当我在 Facebook 上分享此内容时 预览图像不显示 我尝试过重新抓取Facebook 开发者工具
  • 使用 SQLAlchemy 批量更新插入 [重复]

    这个问题在这里已经有答案了 我正在使用 SQLAlchemy 1 1 0b 将大量数据批量插入到 PostgreSQL 中 并且遇到了重复的键错误 from sqlalchemy import from sqlalchemy orm imp
  • 何时应使用以下各项:Amazon EC2、Google App Engine、Microsoft Azure 和 Salesforce.com? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是在非常普遍的意义上问这个问题 无论是从云提供商还是云消费者的角度来看 此外 问题不针对任何特定类型的应用程序 实际上 目的是了解哪种类型的应
  • 在 iPhone 中的应用程序中评价我在 iTunes 中的应用程序

    我必须在我的应用程序中提供一个链接 用户点击它就会将我带到应用程序的 itunes Appstore 页面 用户可以在其中对应用程序进行评分 我认为其他应用程序尝试访问设备中的Appstore应用程序并在itunes中传递该应用程序的相应u
  • PowerShell 5 中的写入主机与写入信息

    众所周知 Write Host是邪恶的 在PowerShell 5 Write Information被添加并被考虑替换Write Host 但是 说实话 哪个更好呢 Write Host是邪恶的 因为它不使用管道 因此输入消息无法被重用
  • 如何使用Android KeyStore安全存储任意字符串?

    我希望能够在 Android KeyStore 中安全地存储一些敏感字符串 我从服务器获取字符串 但我有一个用例需要我保留它们 KeyStore 只允许从与分配给我的应用程序相同的 UID 进行访问 并且它将使用设备主密码对数据进行加密 因
  • R Shiny Memory Leak - 有关如何查找的建议?

    我正在寻找有关如何识别 R 闪亮程序中内存泄漏的一般想法 我正在努力确定泄漏的确切位置 因此很难重新创建 而且我的代码已经超过 1000 行 我确信它与观察和观察事件有关 但我无法准确指出它 我实际上很喜欢 bborgeser 在这里提出的
  • 如何根据iOS上的touchMove事件在屏幕上绘制动态矩形

    矩形将被视为两个点 第一个点将是 touchBegan 点 在 touchMove 上将是第二个点 矩形将根据用户手指的移动动态绘制 就像当您单击桌面并移动桌面时 鼠标您将获得动态矩形 Thanks 好的 这是你如何绘制矩形的方法touch
  • 如何展平嵌套的Python字典?

    我正在尝试展平嵌套字典 dict1 Bob shepherd 4 6 3 collie 23 3 45 poodle 2 0 6 Sarah shepherd 1 2 3 collie 3 31 4 poodle 21 5 6 Ann sh
  • 尽管确实存在,但“不存在具有给定标识符的行”

    我正在使用 Hibernate 并得到 线程 main 中的异常 org hibernate ObjectNotFoundException 不存在具有给定标识符的行 271 这个错误的奇怪之处在于 具有给定 id 的对象存在于数据库中 我
  • 子进程超时失败

    我想在子进程上使用超时 from subprocess32 import check output output check output sleep 30 shell True timeout 1 不幸的是 虽然这会引发超时错误 但它会在
  • 时间数组在建模中超出范围?

    这些天我正在尝试使用新的气象数据 以 netcdf 格式而不是旧的 cray 格式给出 运行我的气候模型 模型编译顺利 但是当进行模拟时 模型在第一天运行良好 但在模拟的第二天就停止了 总是在同一时间步长 无论我使用哪个开始日期 错误是 f