Questions tagged «fortran»

Fortran是科学计算社区广泛使用的通用编程语言。

3
使用带指针的派生类型数组时,fortran中的内存使用情况
在此示例程序中,我以两种不同的方式做同样的事情(至少我是这样认为的)。我在Linux PC上运行此程序,并通过top监视内存使用情况。使用gfortran,我发现第一种方式(“ 1”和“ 2”之间)使用的内存为8.2GB,而第二种方式(“ 2”和“ 3”之间)使用的内存为3.0GB。使用英特尔编译器,两者之间的差异更大:10GB与3GB。对于使用指针,这似乎是一个过度的惩罚。为什么会这样? program test implicit none type nodesType integer:: nnodes integer,dimension(:),pointer:: nodes end type nodesType type nodesType2 integer:: nnodes integer,dimension(4):: nodes end type nodesType2 type(nodesType),dimension(:),allocatable:: FaceList type(nodesType2),dimension(:),allocatable:: FaceList2 integer:: n,i n = 100000000 print *, '1' read(*,*) allocate(FaceList(n)) do i=1,n FaceList(i)%nnodes = 4 allocate(FaceList(i)%nodes(4)) FaceList(i)%nodes(1:4) = …

4
在频谱规范枪战中(使用gcc,intel和其他编译器),C是否比Fortran慢?
结论如下: Fortran编译器真的好多少? gfortran和gcc对于简单的代码一样快。所以我想尝试一些更复杂的事情。我以频谱规范枪战为例。我首先预先计算2D矩阵A(:, :),然后计算范数。(我认为枪战决不允许这种解决方案。)我已经实现了Fortran和C版本。这是代码: https://github.com/certik/spectral_norm 最快的gfortran版本是Spectrum_norm2.f90和Spectrum_norm6.f90(一个使用Fortran的内置matmul和dot_product,另一个使用代码实现这两个功能-速度没有差异)。我能够编写的最快的C / C ++代码是Spectrum_norm7.cpp。从我的笔记本电脑上的git版本457d9d9开始的时间是: $ time ./spectral_norm6 5500 1.274224153 real 0m2.675s user 0m2.520s sys 0m0.132s $ time ./spectral_norm7 5500 1.274224153 real 0m2.871s user 0m2.724s sys 0m0.124s 因此,gfortran的版本要快一些。这是为什么?如果您使用更快的C实现发送请求请求(或仅粘贴代码),我将更新存储库。 在Fortran中,我传递了一个2D数组,而在CI中,则传递了一个1D数组。随意使用2D阵列或您认为合适的任何其他方式。 对于编译器,让我们比较一下gcc与gfortran,icc与ifort等。(与点选页面不同,点选页面比较了ifort和gcc。) 更新:使用版本179dae2,该版本在我的C版本中改进了matmul3(),它们现在速度一样快: $ time ./spectral_norm6 5500 1.274224153 real 0m2.669s user 0m2.500s sys 0m0.144s $ time ./spectral_norm7 5500 …
13 fortran  c 

1
有没有一种工具可以通过解析Fortran(或C)代码来生成Fortran(或C)函数的间隔扩展?
在我的博士学位论文中,案例研究要求我在CHEMKIN-II中有Fortran子例程的间隔扩展(对此表示歉意;这是我能从Sandia国家实验室不再分发的软件包中找到的最好的)。CHEMKIN-II是用于燃烧化学的化学软件包。因为它是燃烧中使用的标准包装,所以我不能(或者更愿意不使用)。 为了获得所需的间隔扩展,我一直使用内部开发的称为DAEPACK的工具。我以前使用的旧二进制文件能够生成我在32位OS(版本对应于gcc 2.95的libstdc版本)上所需的CHEMKIN-II子例程的所需间隔扩展,但是几年前就淘汰了的使用,这是一个巨大的考验(因为我必须找到我使用的所有其他软件的32位版本)。该软件包的源代码也是专有的,但是由于它最初是由MIT开发的,而我是在MIT工作的,因此我能够(经过大量的努力)获得DAEPACK的源代码。使用我拥有的源代码,我能够编译与64位版本的Linux兼容的DAEPACK版本以及与gcc 4.xx相对应的libstdc版本。但是,我怀疑此源代码已经过时,编译成无法成功生成我需要的区间扩展代码才能完成论文的可执行文件。我已与开发人员联系,以寻求他的修复源代码方面的帮助,但是从以前与开发人员的联系中,我知道如果他愿意的话,修复源代码将花费一些时间。 这是个大问题:我有6个月的时间才能毕业,因为我用光了资金。我不能依靠开发人员足够快地修复DAEPACK,而无法成功完成我的博士学位论文,而这正是你们的用武之地。 我需要执行以下操作的软件包: 生成间隔扩展,泰勒模型(使用间隔算法)以及几乎任意的Fortran 77代码的派生;我认为DAEPACK不能解析的唯一结构是DO循环和IF语句。由于我需要泰勒模型,因此代码还必须具有自动微分(AD)功能。 通过Fortran 77代码的源到源转换生成这些间隔扩展和Taylor模型(即,它像编译器一样解析源代码,以生成计算间隔扩展和Taylor模型的源代码)。 紧急情况下,我可以使用对C代码而不是Fortran 77代码执行上述两项操作的软件,然后将所有内容传递给f2c。我真的不喜欢这样,因为我不知道是否通过所有操作f2c都可以,但是我非常绝望。 你们可以帮助绝望的博士生吗? 在有时间限制的情况下,为了预料到一些可能的建议,以下是对我不起作用的方法: 努力使DAEPACK工作;相信我,我已经尝试过。而且我经常向开发人员投诉。 使用面向对象(或类似于对象的)方法计算区间扩展或泰勒模型的工具。我没有时间用新的类型重新编码CHEMKIN-II(或任何其他类似的大型库)。这个太大了。 使用除Fortran 77/90或C之外的任何其他语言。CHEMKIN-II代码位于Fortran中。我可以使用f2c,也可以根据需要使用CHEMKIN-II的基于Sandia的克隆TChem 将其转换为C。我以前的结果是使用CHEMKIN-II;我的新结果应该复制我的旧结果,并且我已经知道Cantera将不会根据案例研究和单元测试复制CHEMKIN-II的功能。此外,我之前的研究生对CHEMKIN-II源代码进行了一些不可思议的操作,以使区间运算特别有效。对于我来说,很难在其他任何软件包中复制它。

4
带有Fortran 95和LAPACK的倾斜Hermitian矩阵的矩阵指数
我只是迷上了fortran 95,进行了一些量子力学模拟。老实说,我被Octave宠坏了,所以我认为矩阵求幂是理所当然的。给定大小为的(小,)个斜度-厄密矩阵,使用LAPACK解决此问题的最有效方法是什么?我没有使用LAPACK95包装器,只是直接调用LAPACK。n≤36n≤36n\leq 36n×nn×nn\times n
11 fortran  lapack 

2
如何在科学程序中使用Fortran中的函数指针
这是C中函数指针的典型用法。我想在Fortran中做类似的事情。我有一些想法,但是我想知道是否有一些规范的方法可以做到。 用户传递的函数指针和上下文将被存储,然后在以后调用。 typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*); PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx); 在以后的不同时间使用他们的上下文来回调用户的功能。 在PETSc中,它们也大量使用字符串->函数指针表。一切都是插件,因此用户可以注册自己的实现,并且是一流的。 #define PCGAMG "gamg" PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG); 这会将创建例程注册在“ FList”中,然后PCSetFromOptions()可以选择此方法,而不是其他任何选择。如果系统支持动态加载,则可以跳过对PCCreate_GAMG符号的编译时依赖性,而只传递NULL,则将在运行时在共享库中查找该符号。 请注意,这一步骤超出了“工厂”的范围,它是一种类似于马丁·福勒(Martin Fowler)称之为“服务定位器”的控制设备的倒置。 注意:这是在我与杰德·布朗的私人通信中提出的,他在那儿向我提出了这个问题。我决定将其外包,看看人们能提出什么答案。
11 petsc  fortran 

2
Fortran中的Octree代码
我是科学计算的新手。我正在寻找Octree的Fortran(最好是f90)实现。 我的问题需要一个Octree来划分我的域,直到在任何框中不超过N个粒子(或我知道密度值的源,可以将其插入积分方程法来求解类似Laplace方程的方程)。 我所能找到的就是这个C ++实现。我想知道是否已经可以使用现有的Fortran库。 此外,将对关于Fortran中Octree实施的好的论文建议可以使用,以便在计算盒上应用快速积分方程方法变得容易,我们将不胜感激!

3
使用Fortran 95和LAPACK的实数不对称矩阵的矩阵指数
最近,我对倾斜的Hermitian矩阵提出了同样的问题。受此问题的成功启发,在将我的头撞在墙上几个小时之后,我正在研究真实的非对称矩阵的矩阵指数。寻找特征值和特征向量的方法似乎有些复杂,我怕迷路了。 背景:前段时间,我在理论物理学SE上问了这个问题。结果使我可以将主方程式表达为真实的非对称矩阵。在与时间无关的情况下,通过对该矩阵求幂来求解主方程。在与时间有关的情况下,将需要集成。我现在只关心时间独立性。 看完我认为应该调用的各种子例程(?gehrd,?orghr,?hseqr ...),尚不清楚将矩阵从转换real*8为complex*16并进行这些例程的复杂双精度版本是否更简单,或坚持使用real*8,将数组的数量加倍,然后再制成一个复杂的矩阵。 那么,我应该调用哪些例程(以什么顺序),并且应该使用实数双精度版本还是复数双精度版本?下面是使用真正的双重版本进行此操作的尝试。我陷入了寻找的特征值和特征向量的困境L*t。 function time_indep_master(s,L,t) ! s is the length of a side of L, which is square. ! L is a real*8, asymmetric square matrix. ! t is a real*8 value corresponding to time. ! This function (will) compute expm(L*t). integer, intent(in) :: s real*8, intent(in) :: …

2
如何在Fortran中设置双精度值
最近,我在FORTRAN95中遇到了一个奇怪的问题。我将变量X和Y初始化如下: X=1.0 Y=0.1 后来我将它们加在一起并打印结果: 1.10000000149012 在检查了变量之后,似乎没有以完全精度的双精度表示0.1。有什么办法可以避免这种情况?

4
学习Fortran
我想知道学习Fortran编程的最佳方法是什么? 我一直在寻找书籍,对我来说似乎不错的例子是“ Fortran 95/2003 Explained”和“ Fortran for Scientists and Engineers”。 我不知道你们如何看待这些? 我想知道的另一件事是我应该使用哪个编译器?我在Windows 7计算机(64位)上工作。 我希望你们能在这一方面帮助我! 因此,根据我的编程经验: Matlab和Maple是我对编程世界的第一次介绍。Matlab是一个我实际上非常擅长的程序,我掌握了使用循环以及如何将其组合以创建更高效​​的程序的习惯。Maple处于基础阶段(我知道如何搜索简单积分的解等)。 一年后,我们在Visual Basic中对C ++进行了介绍。实际上,这位教授很快就开始讨论这个问题,两个月后,我们已经在讨论指针和继承。我能够用这种语言编写简单的程序,只有使用类仍然困难,但是我相信这只是实践问题。 一年后,我需要学习Mathematica 8,如今我也真的很不错。 所以我有一点编程经验,但是我不会说这是一个不可思议的数量! 我要学习Fortran的原因主要是因为您无法独自完成理论物理学,您需要测试您的理论,并且因此您需要能够编写可能能够对这些理论进行数字测试的程序。我听说Fortran是一种用于数值数学的语言,所以我认为了解这种语言会很方便。 ps:Fortran95和Fortran 2003有什么区别?
9 fortran 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.