1

作为更大程序的一部分,我需要在 Fortran 中求解一个非常简单的 ODE。为了避免自己实现求解器(并且在我做对之前肯定会引入一些错误),我想我会使用一个库,如果有的话 - 但我找不到任何有用的东西。

我查看了ODEPACK并找到了重新打包它的人,但原始发行版是作为非常多毛的源代码分发的,并且重新打包并没有构建在我的笔记本电脑上 - 它发出一堆关于转换INTEGER(8)REAL(8)转换的警告在停下来INTEGER(4)之前REAL(4)

gfortran -shared -o libodepack.so opkda1.o opkda2.o opkdmain.o
/usr/bin/ld: opkda1.o: relocation R_X86_64_32 against `dls001_' can not be used when making a shared object; recompile with -fPIC
opkda1.o: could not read symbols: Bad value
collect2: error: ld returned 1 exit status
make: *** [odepack.so] Error 1

所以我认为这是一个 32/64 位不兼容问题(我有一个 64 位处理器)。添加-fPIC标志作为建议的错误消息没有帮助 - 无论如何我得到了相同的消息。

ODEPACK 或类似的东西是否可以以更易于安装的形式用于现代 Ubuntu 发行版?

4

2 回答 2

2

使 ODEPACK 在 fortran 代码中工作的一种简单方法是使用源代码对其进行编译,而不是尝试制作 .a 文件等。使用这三个文件,您可以从 Netlib 下载: opkdmain.f opkda1.f opkda2.f 你可以使用 -c 命令在 gfortran 中编译它们,然后将创建的 .o 文件链接在一起。

您将收到来自 gfortran 编译器的警告消息,显示“已删除功能:...”(您不会使用 ifort 收到这些消息)。这是因为 ODEPACK 是用 fortran 77 编写的,并且使用诸如 GO TO 语句之类的东西。Fortran90 仍然可以识别这些语句,但建议您不要使用它们。但是,当您使用 gfortran 或 ifort 编译器执行代码时,该代码仍应运行。

于 2016-01-20T15:23:16.360 回答
-1

为什么你需要一个包呢?对于简单的 ODE,您可以在 10 分钟内编写自己的简单 RK 函数。这样做可以避免程序中不必要的依赖,并学习一些非常有用的算法。如果您不喜欢这个想法,只要您的程序许可允许,就从其他任何地方获取一些代码。Fe 看看 John Burkardt 先生的收藏。如果您正在编写 fortran 代码,您应该知道它,但无论如何我在这里给出两个链接。 http://people.sc.fsu.edu/~jburkardt/f_src/rk4/rk4.html http://people.sc.fsu.edu/~jburkardt/f_src/rkf45/rkf45.html

于 2013-05-17T17:10:50.050 回答