问题标签 [fortran2003]

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 投票
1 回答
345 浏览

oop - 避免在 Fortran 中复制/粘贴的良好 OOP 设计

鉴于下面的最小工作示例,我想对其进行修改以避免复制/粘贴

main_func_problem1main_func_problem2中。理想情况下,我希望有一个函数main_func对类型t_parameters_problem1t_parameters_problem2. 我可以将其par参数声明为 base type class(t_parameters_base),但是根据实际参数类型(使用select type)在该函数内部进行开关在架构上并不好。

为了解决这个问题,我尝试创建一个procedurein type t_parameters_base,它正在调用这些例程,以实现类似这样的东西(C++ 语法):

但问题是这些例程正在使用这种类型的输入参数,这会导致循环依赖。如何解决这个问题?

更新:请注意,我真的想保留不同文件(模数/类)的实现func_some_calc1func_some_calc2因为它们使用类中的一些私有函数实现了非常不同的逻辑。

0 投票
1 回答
768 浏览

fortran - 让 fortran 中的函数返回一个可以放在赋值左侧的引用

如标题所述,我想直接修改通过从函数中检索的指针访问的数据。在 C++ 中,出现在赋值(=)的 lhs 上的函数返回的引用是没有问题的,但以下 fortran 错误中的最小示例:

有没有办法完成这种行为;也许我缺少一些属性?我想绕过编写任何设置器例程,例如

因为它应该模仿数组的外观。在我的应用程序中,成员变量a,b,c实际上是不同大小的数组

我希望吸气剂get(i,j)模仿一个指针矩阵

我们XX将引用null().

更新: 我正在使用 gfortran(版本 5.2.0),部署机器只有从 4.6.x 及更高版本开始的版本。因此,很遗憾我无法使用建议的 fortran 2008 标准功能。是否可以在没有开箱即用的编译器支持的情况下模仿上述行为?

更新2: 所以我最终实现了一个结构如下

我这样初始化(我在最后提到的三角矩阵应用程序)

我通过它访问并写入它

这不正是我所追求的,但对于我的申请来说已经足够了。

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 回答
95 浏览

oop - 为不同的(曲线制作)类编写一个可移植的(root-finder)求解器类

我非常热衷于实现 FORTRAN 2003 (F2003) 的面向对象编程 (OOP) 功能。我的问题更多是关于程序的设计。假设我有一个求解器,例如函数f(x)=0的根查找器;以 FORTRAN 中最简单的格式,它会得到

在 F95 等 FORTRAN 的早期版本中,为了获得可移植性,代码被单独编译,并将外部函数传递给求解器。现在从 F2003 OOP 的角度来看,一般情况下我们有一个求解器类

和我们曲线的另一类

并且会有更多不同的曲线类别(类型)。现在,我如何以编译求解器类(不知道曲线类/类型)的方式连接这两个概念,并且每当我编写新的不同曲线类(如 2nd_order_polynomial_curve , 3rd_order_polynomial_curve, log_curve, exp_curve,...)。我的意思是,最后,不知何故,我得到了曲线的根源。

0 投票
0 回答
155 浏览

oop - Fortran .mod 文件变得太大

在我们的 Fortran 项目中,我们广泛使用模块,因为我们在 Fortran 2003 中进行面向对象的编程。我们现在有大约 7 个不同级别的对象层次结构。对我们来说,问题是高层的模块和文件需要很长时间才能编译,即使它们只包含几行。

查看创建的文件,我认为可能的原因是正在编写的非常大的 .mod 文件。探索这些文件(例如对于 gfortran 4.6),我可以看到所有递归使用的对象和模块的完整接口都包含在每个高级 .mod 文件中。这些文件在 gfortran 4.9 中要小得多,它们以压缩格式存储,但它们仍然很大并且减慢了编译时间。

我们已经尝试在每个模块中使用私有语句(这样底层使用的模块不能仅通过使用当前模块来查看),但这不会影响生成的 .mod 文件的大小。

是否有任何编程实践或编译器指令可以解决这个问题?

0 投票
1 回答
186 浏览

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

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

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

有什么提示吗?

0 投票
2 回答
2240 浏览

fortran - 如何使用可分配组件设置派生类型命名常量的值?

这编译正确:

我想写这样的东西,除了它不编译:

gfortran 错误信息

没有给我任何关于正确语法的线索。

我没有收到任何关于尝试使用可分配类型声明参数变量的抱怨,所以我认为必须有某种方法来初始化它!

0 投票
1 回答
357 浏览

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

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

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

0 投票
1 回答
368 浏览

fortran - 当类型在编译时已知时,是否有额外的开销调用具有多态派生类型的子例程?

我有两个派生类型(child1 和 child2),它们都从同一个抽象类型 ( type, abstract :: parent) 扩展而来。抽象类型有一个延迟绑定过程。

我想调用一个子程序来执行一些事情(性能关键),具体取决于作为输入移交的孩子的类型。我可以想到两个选择:

  • 子例程将class(parent), intent(inout) :: type_in输入作为输入。然后在select type (type_in)构造中完成子项的实现。
  • 我编写了两个子例程,一个 withtype(child1), intent(inout) :: type_in和一个 with,type(child2), intent(inout) :: type_in并提供了一个显式接口来重载例程名称。

第一个选项允许在编译时不知道父级扩展的实现,但在我的情况下这不是必需的。它还节省了一些代码行,因为只有一部分代码对孩子来说是不同的。

我的问题是:选项一中是否有额外的开销,因为我在编译时知道类型时将输入实现为多态数据?

0 投票
1 回答
202 浏览

fortran - Intel Fortran Compiler 14.0.3 支持延迟长度字符

英特尔 Fortran 编译器是否支持 Fortran 2003 功能“延迟长度字符”?如果是这样,编译器版本 14.0.3 是否已经支持它?(*)

这个页面, Fortran 2003 Features,Intel Developer Zone,说

“完全支持 Fortran 2003,包括以下功能:”

但随后的清单包括

  • 可分配的标量变量(非延迟长度字符)

这似乎并没有说明“延迟长度字符”是否是受支持的功能。此外,该页面似乎引用了最新版本 16。

我得到一个提示,它支持如下。我尝试编译该版本的代码,该代码似乎在IanH对问题“ 使用延迟长度字符串读取用户输入”的回答中使用了延迟长度字符ifort并且运行成功。不过,我想知道在哪里可以找到英特尔关于每个版本的编译器的 Fortran 标准实施状态的一些官方文档。我以为这样的文档可能会包含在产品的文档目录中,但我找不到。


(*) 2015-11-15 编辑

问题的第一段最初的内容如下:“英特尔 Fortran 编译器是否支持所有 Fortran 2003 功能?如果支持,从什么时候开始?更具体地说,如果我想知道编译器版本 14.0.3 是否支持 'deferred-长度字符'。” 我根据 francescalus 的评论重写了它。