问题标签 [fortran]

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 投票
10 回答
14731 浏览

fortran - 在现代学习 FORTRAN

我最近来维护大量的科学计算密集型 FORTRAN 代码。尽管有 google 和两本入门级书籍,但我很难掌握一种 40 年历史的语言的所有细微差别。该代码充斥着“性能增强改进”。是否有人对将FORTRAN优化为 CS 101 级别有任何指南或实用建议?有谁知道 FORTRAN 代码优化是如何运作的?Java/C++/.NET 开发人员接管 FORTRAN 77/90 代码库时,是否有任何典型的 FORTRAN “陷阱”?

0 投票
14 回答
15854 浏览

compiler-construction - 有哪些 Fortran 编译器?

当今时代有哪些 Fortran 编译器,您会推荐哪些?请列出它支持的 Fortran 版本、它工作的平台(例如 *nix / Windows)以及它是否需要花钱。

(标准操作系统每个答案一个等)

0 投票
3 回答
62197 浏览

.net - 从 64 位进程调用 32 位代码

我有一个我们正在尝试从 32 位迁移到 64 位的应用程序。它是 .NET,使用 x64 标志编译。但是,我们有大量用 FORTRAN 90 编写的 DLL,为 32 位编译。FORTRAN DLL 中的函数相当简单:你把数据放进去,你把数据拉出来;没有任何状态。我们也不会花很多时间在那里,总共可能 3%,但它执行的计算逻辑是无价的。

我可以以某种方式从 64 位代码调用 32 位 DLL 吗?MSDN 建议我不能,期间。我做了一些简单的黑客攻击并验证了这一点。一切都会抛出一个无效的入口点异常。到目前为止,我发现的唯一可能的解决方案是为所有 32 位 DLL 函数创建 COM+ 包装器并从 64 位进程调用 COM。这似乎很让人头疼。我们也可以在 WoW 仿真中运行该过程,但内存上限不会增加,上限约为 1.6gb。

有没有其他方法可以从 64 位 CLR 进程调用 32 位 DLL?

0 投票
23 回答
156995 浏览

c - 对于繁重的计算,Fortran 比 C 更容易优化吗?

我不时读到 Fortran 在繁重的计算中比 C 更快或可以更快。这是真的吗?我必须承认我几乎不了解 Fortran,但到目前为止我看到的 Fortran 代码并没有表明该语言具有 C 所没有的特性。

如果是真的,请告诉我为什么。请不要告诉我哪些语言或库对数字运算有好处,我不打算编写应用程序或库来做到这一点,我只是好奇。

0 投票
4 回答
15521 浏览

fortran - Fortran 中的私有函数

如何在 Fortran 中声明私有函数?

0 投票
5 回答
5072 浏览

c# - 从 C# 调用 FORTRAN DLL 的受保护内存冲突

我正在尝试调用从 FORTRAN 代码编译的旧版 dll。我是 Interop 的新手,但我已经阅读了一些关于它的文章,看起来我的案例应该相当简单。

我真正想调用的方法有一个复杂的方法签名,但我什至不能调用这个简单的 GetVersion 方法而不会得到受保护的内存冲突。

这是我的 DllImport 代码:

这是 FORTRAN 代码:

这是我失败的单元测试:

这是我收到的错误消息:

我尝试过的其他事情:

  • 使用默认编组
  • 传递 char[] 而不是字符串(改为获取方法签名错误)
0 投票
3 回答
3867 浏览

c# - 在 C# 中匹配 FORTRAN 舍入

FORTRAN 提供了几个函数来将双精度数转换为整数值。用于截断/舍入的方法不同。我正在转换使用这些的复杂科学算法。

根据 FORTRAN 文档:
aint(x)返回 x 和 0 之间的整数值,最接近 x。
anint(x)返回最接近 x 的整数值,除非中途情况舍入到幅度较大的整数值。
nint(x)将 x 转换为 int 格式,舍入到最接近的 int 值,除非中途情况舍入到幅度较大的 int 值。

有没有人在 C# 中实现了这些? 把它做好可能会很棘手。

(int)x 似乎匹配 aint()
Convert.ToInt32(x) 不匹配上述任何一个。
Trunc(x) 与上述任何一个都不匹配。
Round(x) 可能匹配 anint 或 nint。

anint 和 nint 的区别似乎在于返回类型,其中 anint 返回一个双精度值,但 nint 返回一个整数。两者都被使用(实际样本):
双精度 A、B、C、D、E、F、G
... 此处设置的值 ...
F = ANINT(AB) + ANINT(CD) + ANINT(B+DE)
G = NINT(F) + 1D0;
也许 FORTRAN 专家可以帮助澄清为什么作者选择使用两者(我假设这是故意的)。

0 投票
4 回答
2061 浏览

c - 用于 fortran 程序的 mtrace

我正在尝试用于mtrace检测 fortran 程序中的内存泄漏。我正在使用 gfortran 编译器。有关 mtrace 的(工作)C 示例,请参阅维基百科条目:http ://en.wikipedia.org/wiki/Mtrace

我尝试了两种方法,即包装 mtrace() 和 muntrace() 并从 fortran 程序中调用它们,以及创建一个直接调用 mtrace() 和 muntrace() 的 C 程序,除了中间的泄漏 fortran 代码。这两种方法都无法检测到内存泄漏,但这里我只介绍后者。

例子.c

泄漏的.f90

我编译:

然后我运行:

然后我解析raw.txt mtrace输出:

并得到:

没有内存泄漏。

有什么我做错了,或者我可以做些什么来mtrace找到泄漏的fortran内存分配?我猜 gfortran 正在使用不同的malloc调用,它mtrace不会跟踪......事实上,正如我在上面所写的,如果我编写一个调用 (wrapped)mtrace()muntrace().

已编辑:我考虑了其他选项(包括此处尚未提及的一些选项),但正在调试的实际代码在 P6/AIX 上运行,因此 Valgrind 将“只是”不方便(它需要在不同的机器上运行),而 Forcheck 将是不方便(它需要在不同的机器上运行)和昂贵的(〜3k $)。目前 mtrace 将是最好的解决方案,如果它有效的话。

再次编辑:我的猜测

我猜 gfortran 正在使用不同的malloc调用,它mtrace不会跟踪......

是正确的。查看可执行文件(使用nmreadelf)没有任何malloc()调用,而是调用_gfortran_allocate_array- 可能会调用 malloc)。还有其他想法吗?

再次编辑:我发布了答案,但我不能接受(访问http://stackoverflow.uservoice.com/pages/general/suggestions/39426并请求该功能,它确实需要 - 不需要获得声誉)

0 投票
6 回答
10633 浏览

c++ - Fortran 77 代码到 C++ 的转换

有没有人将 Fortran 77 代码的大型(我们的是 550,000 行)程序转换为 C++?你遇到了什么陷阱?转换成功了吗?您是否使用过for_chttp://www.cobalt-blue.com/fc/fcmain.htm)之类的工具?生成的 C++ 代码是明显更快还是更慢?

0 投票
5 回答
430 浏览

c - 如何找出给定对象所在的库?

我在运行 Irix 6.5 的 SGI 上用 FORTRAN 和 C 编程,但这应该适用于所有类 Unix 系统。当我收到“未解析的文本符号”链接错误时,如何找到需要链接到我的程序的库?这是我从链接器看到的示例:

我只需要知道需要哪些库,还是有一些工具或命令可以帮助我解决这个问题?