问题标签 [fortran2008]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1940 浏览

fortran - Fortran 2003-2008 中是否有 GETCWD() 的替代方法

GNU Fortran 编译器的 GNU 扩展提供了GETCWD()很好的子例程,可以获取当前工作目录。但是,我的代码必须可移植到ifortandnagfor器,并且我使用 F2003 功能。

那么,是否有替代方案GETCWD()那么,对于 F2003 及更高版本

我这里有标准,但它相当大,我已经经历了一段时间,没有发现任何有用的东西......

0 投票
2 回答
327 浏览

fortran - Fortran 2003 中的常量函数指针数组

亲爱的 Fortran 程序员,

有人知道,是否可以在 Fortran 2003 或更高版本中声明一个常量(参数)过程指针数组?

如下所示,我有一个切换器函数,它根据传入的整数参数调用不同的函数。它使用一组过程指针(包装在派生中)类型。该数组必须在运行时init()通过例程进行初始化,然后才能使用。有什么方法可以在编译期间初始化这个数组并避免这种初始化例程的必要性?然后它也可以定义为,因为它的值在运行期间不会改变。parameter

0 投票
1 回答
423 浏览

fortran - 具有私有组件的结构构造函数

我在以下示例中定义了一个带有私有组件的结构:

以 1 作为参数调用结构构造函数。据我了解,这应该是不可能的,因为nr是私人的。但是,这是由 编译的Intel(R) Visual Fortran Compiler XE 14.0.5.239 [IA-32],而不是gfortran 4.9.3using编译的cygwin。此外,该print语句显示nr输出中的值。Fortran使用最新标准以这种方式定义具有私有组件的结构是否有效?或者这是英特尔编译器的错误?

0 投票
0 回答
154 浏览

dll - 如何为 fortran 2003 类创建 dll

我有一个大型的 fortran 代码库,我想将其中的一些部分移动到 dll 中。在做了一些研究之后,我知道如何使用我选择的 IDE(code::blocks)构建一个普通的fortran dll,以及如何在另一个fortran程序中使用它。然而,我撞到了墙角。只要我只需要把程序放在 dll 中,一切都很好。但是,我想做的是包含一个 Fortran 2003 类,以便我也可以在我的 fortran 程序中使用该类。第一个问题是需要将类嵌入到模块中(这与 dll 的普通 fortran 文件略有不同但重要的是)。就其本身而言,这对于构建 dll 来说并不是一个大问题,但在尝试访问子例程或类时却是这样。

我目前有一个权宜之计的解决方案,它需要在我的程序中包含一个 use 语句:use mydllmodule; 并将模块文件 mydllmodule.mod 放在我程序的模块目录中。

有没有更好的方法来创建包含 fortran 类的 fortran dll,并允许在主程序中访问它们(不使用编译器特定的编译指示,因为此代码是在我的本地 Windows 机器上编译和运行以进行开发的,并且在 HPC 上编译并运行以用于生产)。我正在寻找一种设置,其中用户的生活可以尽可能简单(即只需将 dll 放在某处,也许使用 use 语句)

谢谢

0 投票
1 回答
186 浏览

fortran - 重载分配的自动 LHS 重新分配

我有一个代码,当使用 RHS 上的结构构造函数对 LHS 上的未分配可分配对象进行分配时,我手头的所有编译器都会出现段错误。结构(派生类型)本身具有重载赋值。我认为,LHS 的自动重新分配应该在调用分配例程之前发生,但似乎并非如此。

在代码下方,演示了问题。取消注释分配语句使一切正常,但我不明白为什么在这种情况下需要显式分配。有趣的是,如果我删除了重载的分配,事情也会正常进行。

有什么提示吗?

0 投票
1 回答
357 浏览

fortran - 过程指针数组的自动初始化

有没有办法自动初始化过程指针的常量数组?

我有一堆例程,必须根据整数变量的值来调用它们。我不想使用select case语句,而是想使用下面给出的过程指针。但是,如果我可以跳过过程指针数组的显式初始化,并将其定义为包装过程指针的常量数组,那就太好了。下面的代码演示了我找到的解决方案,注释行表示目标,我想实现:

0 投票
1 回答
396 浏览

pointers - 在fortran中指向一维目标数组的非连续指针数组的性能

R我有一个代码,其中使用了一个包含3N元素的一维数组。您可以将其视为N粒子的位置向量,例如R=[r1x,r1y,r1z,r2x,r2y,...]。请注意,为了简洁地使用数组,应将模式定义为 this。

在部分代码中,我只需要在 x 坐标上执行一些操作。我目前正在使用这样的东西:

Rx随后在操作中使用。这使得访问不连续,但我想知道我是否可以希望有一种方法来矢量化操作。或者,可以使用在粒子上带有循环的 OMP。我想了解专家对此事的看法,尤其是在性能方面的最佳实践。

0 投票
1 回答
343 浏览

fortran - 基准测试 fortran 循环

我需要对 fortran 程序的一部分进行基准测试,以了解和量化特定更改的影响(为了使代码更易于维护,我们希望使其更 OO,例如利用函数指针)。

我有一个循环多次调用相同的子例程来对有限元执行计算。我想看看使用函数指针而不是硬编码函数的影响。

获取此类循环的执行时间并以 nic 方式对其进行格式化的简单方法是什么?

0 投票
1 回答
2432 浏览

fortran - 使用 SOURCE= 一次分配多个变量

我现在正在尝试更新包含 (*) 等行的旧 Fortran 代码

最初,我将它们更改为

但这显然不是很简单。所以我试着把它们结合起来

我没想到它会起作用,但它实际上适用于 gfortran >=4.8 和 Sun fortran 8.7(而不适用于 ifort-14)。所以我浏览了F2003F2008文档的 ALLOCATE 部分,似乎在 F2008 中删除了“如果出现 SOURCE=,则分配列表应仅包含一个分配对象”的限制。这是否意味着上述第 1 行在 F2008 中没有问题,而不同的行为仅仅是由于 F2008 的支持程度不同?

(*) 在实际代码中,我试图分配派生类型的几个数组组件,allocate( conf% crd(3,N), conf% vel(3,N), conf% frc(3,N), blah, blah,... )同时为每个组件分配零。所以我想知道是否可以稍微简化这些行。

0 投票
1 回答
293 浏览

oop - 将多态数组的子集复制到目标多态数组中

我在子例程中有两个派生类型多态数组(obj1 和 obj2)。基于子程序的使用,虽然两个数组的类型可能不同,但两个数组是相同的类型;例如,A 型或 B 型。在下面的示例代码中,我只展示了抽象类(模型)的一个子类型,而实际上,我希望它适用于多个子类型。此外,在生产代码中,model1 的元素在此副本之前已被修改。

给定 obj1、obj2(类型 A)(在示例代码中给出的 model1、model2 类型为 linearDivisionMode)和一组索引,我想将指定的元素从 obj1 转移到 obj2,在此过程中分配 obj2。

我已经尝试了很多方法来做到这一点,但似乎都没有奏效。

首先,我尝试使用向量下标直接赋值;这失败了,抱怨不支持直接分配可分配多态数组。

结果:

其次,我尝试使用源分配。如果我用数组切片表示法尝试这个,它可以工作(但我的问题不能仅仅用这样的范围来表达)。如果我尝试对源数组进行矢量索引,它会编译,但在运行时我会因内存不足而出错(考虑到系统,这不现实)。

运行时结果:

有效,但不足以满足我的目的。

第三,我已经能够分配多态数组以希望手动传输子元素:但是,当我尝试这样做时,我收到了多态对象和内在赋值的抱怨,我将在本文后面讨论。

我尝试使用类型选择语句来删除多态上下文,但错误仍然存​​在。

结果:

作为一种解决方法,我希望使用一个中间指针对象,并从中获取分配。由于 f2008 标准(此处强制执行),我无法将指针分配给向量索引数组。有趣的是,如果我创建一个指针,向量索引该指针,编译器会出现段错误,这表明发生了一些奇怪的事情。

为了解决编译器对内在赋值的抱怨,我考虑过编写赋值例程;然而,这引起了一系列新的担忧:这两个例程继承自的父类型都是抽象的,我似乎无法在该类中指定通用延迟赋值运算符,导致复杂的父类需要相当多的私有方法复制,因为它没有指定私有变量。此外,子类 A 和 B 之间的转换定义不明确。这似乎仍然是唯一剩下的出路,而且看起来很复杂。

如何有效地传输指定的多态子数组?

我正在使用 gfortran 6.1.1 版。