为了调试我的应用程序(fortran 90),我想将所有NaN转换为信令NaN.
使用默认设置,我的程序无需任何信号即可工作,只输出文件中的NaN数据.我想找到生成NaN的点.如果我可以用信号NaN重新编译程序,我会SIGFPE在第一个错误的浮动操作所在的第一点得到一个信号.
目前是否可以覆盖Fortran中的结构构造函数?我已经看到过像这样的提议示例(例如在Fortran 2003规范中):
module mymod
type mytype
integer :: x
! Other stuff
end type
interface mytype
module procedure init_mytype
end interface
contains
type(mytype) function init_mytype(i)
integer, intent(in) :: i
if(i > 0) then
init_mytype%x = 1
else
init_mytype%x = 2
end if
end function
end
program test
use mymod
type(mytype) :: x
x = mytype(0)
end program
Run Code Online (Sandbox Code Playgroud)
由于冗余变量名称(例如,'mytype'的错误:DERIVED属性与(1)处的PROCEDURE属性冲突),这基本上会产生一堆错误.fortran 2003示例的逐字副本会产生类似的错误.我在gfortran 4.4,ifort 10.1和11.1中尝试了这个,它们都产生了相同的错误.
我的问题:这只是2003年fortran的一个未实现的功能吗?或者我是否错误地实施了这个?
编辑:我遇到过一个错误报告和gfortran关于这个问题的公告补丁.但是,我尝试使用11月版的gcc46没有运气和类似的错误.
编辑2:上述代码似乎可以使用英特尔Fortran 12.1.0.
假设我有一个Fortran派生类型
type :: atype
integer :: n
integer :: a(10)
integer, allocatable :: b(:)
end type
Run Code Online (Sandbox Code Playgroud)
我有两个这种类型的实例
type(atype) :: t1, t2
Run Code Online (Sandbox Code Playgroud)
当我做以下任务时到底发生了什么?
t2 = t1
Run Code Online (Sandbox Code Playgroud)
我对此感兴趣,因为我想正确地创建派生类型变量的副本意味着,标量组件应该相等,数组组件的每个元素应该相等,并且可分配的数组应该具有相同的分配大小,并且元素应该相等.目前我只想写一个子程序,它正确地复制和分配组件.
subroutine copy_atype(from, to)
type(atype) :: from, to
to%n = from%n
to%a = from%a
if (allocated(to%b)) deallocate(to%b)
if (allocated(from%b) then
allocate(to%b(size(from%b)))
to%b = from%b
end if
end subroutine
Run Code Online (Sandbox Code Playgroud)
我希望指导标准中的相应部分.
我正在使用gfortran 4.7.
我在我的机器上安装了Theano,但是nosetests打破了Numpy/Fortran相关的错误消息.对我来说,看起来像Numpy编译的是与Theano不同的Fortran版本.我已经重新安装了Theano(sudo pip uninstall theano+ sudo pip install --upgrade --no-deps theano)和Numpy/Scipy(apt-get install --reinstall python-numpy python-scipy),但这没有帮助.
你会推荐什么步骤?
ImportError: ('/home/Nick/.theano/compiledir_Linux-2.6.35-31-generic-x86_64-with-Ubuntu-10.10-maverick--2.6.6/tmpIhWJaI/0c99c52c82f7ddc775109a06ca04b360.so: undefined symbol: _gfortran_st_write_done'
Run Code Online (Sandbox Code Playgroud)
有关错误的安装SciPy/BuildingGeneral页面undefined symbol: _gfortran_st_write_done':
如果您看到错误消息
ImportError: /usr/lib/atlas/libblas.so.3gf: undefined symbol: _gfortran_st_write_done
在构建SciPy时,这意味着NumPy在构建期间选择了错误的Fortran编译器(例如ifort).
使用以下方法重新编译NumPy:
python setup.py build --fcompiler=gnu95
或以适当者为准(见python setup.py build --help-fcompiler).
但:
Nick@some-serv2:/usr/local/lib/python2.6/dist-packages/numpy$ python setup.py build --help-fcompiler
This is the wrong setup.py file to run
Run Code Online (Sandbox Code Playgroud)
undefined symbol: _gfortran_st_write_done')我正在调试我添加的更大的数字程序.它是用fortran90编写的,用gfortran编译(最新版本适用于Mac),我正在使用gdb进行调试(同样是Mac的最新版本).
我的添加有一个错误,我试图找到它,这是明确的,因为运行该程序不会产生预期的结果.当我在gdb中运行它时,我在结尾处得到以下输出:
Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG IEEE_DIVIDE_BY_ZERO IEEE_UNDERFLOW_FLAG IEEE_DENORMAL
[Inferior 1 (process 83843) exited normally]
我想确定这个FPE的确切位置,但似乎浮点异常不会导致程序崩溃.我通过在我的代码中明确地除以0来测试它 - 它不会导致程序停止运行,但会导致意外行为.
什么是gdb或gfortran的正确标志,以确保程序在到达浮点异常时停止运行(理想情况下是回溯)?我尝试按照这里的说明进行操作,但似乎没有改变任何内容.
我试图从源代码安装R包,但收到错误:
* installing *source* package ‘mclust’ ...
** package ‘mclust’ successfully unpacked and MD5 sums checked
** libs
gfortran-4.8 -fPIC -g -O2 -c mclust.f -o mclust.o
gfortran-4.8 -fPIC -g -O2 -c mclustaddson.f -o mclustaddson.o
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o mclust.so mclust.o mclustaddson.o -L/Library/Frameworks/R.framework/Resources/lib -lRlapack -L/Library/Frameworks/R.framework/Resources/lib -lRblas -L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2 -lgfortran -lquadmath -lm -L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2 -lgfortran -lquadmath -lm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
ld: warning: directory not found for option '-L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2'
ld: warning: directory not found for option …Run Code Online (Sandbox Code Playgroud) 我刚刚度假一个月,所以无法说明发生这种情况的确切点,但是R从官方的Arch repos现在无法启动,引用
/usr/lib64/R/bin/exec/R: error while loading shared libraries:
libgfortran.so.3: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我认为也许一个符号链接被错误地放置或销毁,所以我查看了/ usr/lib来尝试找到它:
ls -halt /usr/lib/libgfortran.so.*
lrwxrwxrwx 1 root root 20 May 16 03:01 /usr/lib/libgfortran.so.4 -> libgfortran.so.4.0.0
-rwxr-xr-x 1 root root 7.1M May 16 03:01 /usr/lib/libgfortran.so.4.0.0
Run Code Online (Sandbox Code Playgroud)
已libfortran.so.3被libgfortran.so.4Arch 取代?如果是这样,是否有任何可能的解决方法R来运行旧版本?
pacman -Qi r
Name : r
Version : 3.4.0-2
Description : Language and environment for statistical computing and graphics
Architecture : x86_64
URL : http://www.r-project.org/
Licenses …Run Code Online (Sandbox Code Playgroud) 这是我第一次尝试使用makefile编译FORTRAN代码.操作系统是Ubuntu 12.04 LTS 64位.我遇到了以下错误:
gfortran -o przm3123.exe canopy.o chem.o cnfuns.o cropdate.o datemod.o debug.o debug_cn.o f2kcli.o floatcmp.o furrow.o general.o i_errchk.o infnan.o inivar.o ioluns.o iosubs.o lambertw.o m_readvars.o utils.o wind.o fcscnc.o przm3.o rsexec.o rsinp1.o rsinp2.o rsinp3.o rsmcar.o rsmisc.o rsprz1.o rsprz2.o rsprz3.o rsprzn.o rsutil.o rsvado.o -L ../libanne4.0/lib -lwdm -ladwdm -lutil
/usr/bin/ld: cannot find -lwdm
/usr/bin/ld: cannot find -ladwdm
collect2: ld returned 1 exit status
make: *** [przm3123.exe] Error 1
Run Code Online (Sandbox Code Playgroud)
makefile中的关键元素是:
przm2_LIBS = -L ../libanne4.0/lib -lwdm -ladwdm -lutil
Run Code Online (Sandbox Code Playgroud)
我有什么办法可以解决这个错误吗?我应该尝试其他编译器吗?
由于Apple已停止使用Xcode分发gfortran,我应该如何编译独立于架构的Fortran代码?我安装了Mac OS X Mountain Lion(10.8)和XCode 4.4,并安装了Command Line Tools软件包.
据我所知,Xcode C/C++/ObjC编译器使用GNU编译器集合的fork ,llvm作为后端; 后者我认为可以为英特尔和PPC架构编译和优化"通用"二进制文件.
我只找到一个网站,专门为Mountain Lion分发一个二进制版本的gfortran:HPC网站.但是,我没有把它编译成SciPy,后来在SciPy的自述文件中看到它"已知会产生错误的scipy二进制文件".
SciPy推荐的(免费)Fortran编译器是CRAN R服务器上的编译器,但尚未针对Mountain Lion进行更新.它们提供了构建通用编译器的说明和脚本,但同样,尚未针对Mountain Lion更新它.
在G95项目一直没有自2010年以来的更新,所以我没有尝试..任何人试图在此山狮?
我想这将是安装gfortran的最简单的方法,但是port search gfortran没有任何结果,而且我过去对MacPorts没有任何喜悦(对MacPorts没有任何冒犯;它看起来像一个非常活跃的项目,但我已经被Linux软件包管理员宠坏了,我最喜欢的经理是aptitude)所以在Mac OS X上,我从过去的源代码编译了软件和库.从来没有一个问题'直到现在......
在过去的几天里,我在互联网上挖了很多东西,我找到了其他的Fortran编译器,但我没有得到任何交叉编译通用二进制文件,或编译SciPy.
我编译了整个GCC集合(v4.6.3),包括autotools,automake,libtool和m4 - 就像GCC wiki和这个博客描述的那样 - 但是由此产生的编译器没有编译通用二进制文件,可能是因为LLVM没有被用作后端.
DragonEgg是一个"gcc插件,取代了GCC的优化器和代码生成器......与LLVM".这看起来很有趣,但我不知道我怎么会用它来编译"LLVM-gfortran-4.x版".可以这样做吗?
Xcode附带的编译器是(C的一个分支)GCC v4.2.但GCC目前的发布和开发分支机构分别是版本4.6和4.7.显然,GNU许可证的更改或某些东西阻止了Apple更新到更现代版本的GCC.那么,如果我要构建使用GCC的gfortran v4.6制作的动态库,那么它们是否可以与Xcode的本机编译器编译的C代码链接?至少,我认为产生的Mach-O二进制文件需要x86_64和i386代码路径.GCC是否向后兼容Apple的(forks of?)GCC?我知道gfortran有-ff2c旗帜,但这两个版本是否稳定?
我从源代码构建的GCC Fortran编译器不支持使用 …
我们最近发现我们正在为Fortran中的未分配数组进行分配.GNU gfortran编译器没有捕获错误,代码在OSX和Linux下运行.但是,IBM Power PC上的代码分段错误相同.
我的问题是,以下代码是否正确?似乎分配给的数组array在某些体系结构上自动分配内存,但在其他体系结构上则不然.是否有实施具体细节在这里工作?
代码是混合的C/Fortran代码:
#include <stdlib.h>
void assign_array_(double x[], int* n);
void print_array_();
int main()
{
int n,i;
double *x;
n = 5;
x = (double*) malloc(sizeof(double)*n);
for (i = 0; i < n; i++)
x[i] = (double) i;
assign_array_(x,&n);
print_array_();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和Fortran代码:
MODULE test_mod
DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: array
integer :: nsize
END MODULE test_mod
SUBROUTINE assign_array(x,n)
USE test_mod
IMPLICIT NONE
INTEGER :: n
DOUBLE PRECISION :: x(n)
CALL test_allocated()
array = …Run Code Online (Sandbox Code Playgroud)