我试图读取一些Fortran代码,但无法确定%(百分号)的作用.
这是一个像:
x = a%rho * g * (-g*a%sigma + m%gb * m%ca * (1.6 * a%rho+g))
Run Code Online (Sandbox Code Playgroud)
它有什么作用?
在Fortran 90中,我们可以通过接口重载功能.但是,根据此站点,我们无法使用相同的参数名称定义这些函数.使用gfortran,它似乎不是一个问题,因为以下代码运行良好:
interface check
module procedure check_int, check_real
end interface
contains
subroutine check_int(cur, dname, func_name, fname)
integer, allocatable, intent(in) :: cur(:)
character(*) :: dname, func_name, fname
...
end subroutine
subroutine check_real(cur, dname, func_name, fname)
real, allocatable, intent(in) :: cur(:)
character(*) :: dname, func_name, fname
...
end subroutine
Run Code Online (Sandbox Code Playgroud)
那么,这样做是不好的做法吗?
编辑:使用关键字调用函数不会改变任何内容.
我认为这个问题已在某个地方得到解决,但我花了大量时间寻找答案,包括深入研究源代码.我试图把问题放在第一段.其余部分显示了问题的基本示例.
我正在尝试编译一个包含USE指向另一个更通用的模块的语句的模块.我更希望将使用过的模块保持独立,以便可以将它作为一组常规设置用于多个"包"中.当我使用f2py编译这两个模块时,一切都像fortran那样宣传,但是从python那边USE看起来似乎被忽略了.如果我允许f2py生成签名文件,则该文件包含USE适当的语句,但如果我完成编译并从结果库导入,则使用模块中的参数在包含use语句的模块中不可用.以下是说明情况的两个模块:
MODULE test
INTEGER, PARAMETER :: a = 1
END MODULE test
MODULE test2
USE test
INTEGER, PARAMETER :: b = 2
END MODULE test2
Run Code Online (Sandbox Code Playgroud)
为了显示我跑的中间步骤f2py -h test.pyf test.f90 test2.f90.生成以下签名文件; 请注意"test2"模块包含"use test":
! -*- f90 -*-
! Note: the context of this file is case sensitive.
python module test ! in
interface ! in :test
module test ! in :test:test.f90
integer, parameter,optional :: a=1
end module test
module test2 ! in …Run Code Online (Sandbox Code Playgroud) 我想知道将大型fortran数组(5000 x 5000实数单精度数字)写入文件的最佳方法.我试图保存数值计算的结果供以后使用,因此不需要重复.从计算5000 x 5000 x 4bytes每个数字是100 Mb,是否可以以100Mb的形式保存?有没有办法将fortran数组保存为二进制文件并将其读回以供以后使用?
我注意到将数字保存到文本文件会产生比保存的数据类型大得多的文件.这是因为数字被保存为字符吗?
我熟悉写入文件的唯一方法是
open (unit=41, file='outfile.txt')
do i=1,len
do j=1,len
write(41,*) Array(i,j)
end do
end do
Run Code Online (Sandbox Code Playgroud)
虽然我认为有更好的方法可以做到这一点.如果有人能指出我的一些资源或例子来批准我有效地(在内存方面)编写和阅读更大文件的能力,这将是很好的.谢谢!
我正在寻找一个库来处理fortran 90/95中的稀疏矩阵.我只需要非常基本的操作,如矩阵向量乘法.你建议我用什么?
我已经搜索过了一个扩展名(?)到BLAS,称为"稀疏blas",在爆炸技术论坛规范的第3章中有记录:
http://www.netlib.org/blas/blast-forum/ ,
看起来很理想 根据该文档,库应该有一个fortran 95接口.但是,我无法在任何可以下载的地方找到该规范的实际实现.我有点认为fortran 95稀疏blas规范并没有在任何地方真正实现?反正不是开源的.
我还找到了一个名为sparsekit的库:
http://people.sc.fsu.edu/~jburkardt/f_src/sparsekit/sparsekit.html
任何人都有这两个中的任何一个的经验,或任何其他稀疏矩阵库为fortran 90/95?我想建议使用哪一个,以及从哪里获取它(在sparsekit的情况下,源代码可通过上面的链接获得).对于稀疏矩阵,有没有类似"标准"的东西,比如BLAS用于密集矩阵?
干杯,
阿恩
我的程序向终端输出计算状态,并包含相当多的信息.我想,如果可能的话,颜色代码文本的部分.
我已经看到如何通过引用此站点上的线程在Bash和C++中完成它.但是,我无法使用其中任何一个来在Fortran(现代)中实现相同的结果.例如,我尝试了这个示例代码,我认为应该可以使用:
PROGRAM test
PRINT*, 'A great color is \033[95m pink \033[0m.'
END PROGRAM test
Run Code Online (Sandbox Code Playgroud)
我原本预计输出会是"粉红色的粉红色".相反,我得到"一个伟大的颜色是\ 033 [95米粉红色\ 033 [0m." 我不明白我错过了什么.
如果我用以下代码替换代码中的打印行:CALL EXECUTE_COMMAND_LINE("echo"一个很好的颜色是\ 033 [95m pink\033 [0m.'"))然后我根据需要得到输出.但是我不想继续从我的代码中调用echo.有什么方法可以获得彩色输出吗?
谢谢!
我想有一个Fortran写语句格式化依赖于某些变量.例如,我可以写:
write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari)
Run Code Online (Sandbox Code Playgroud)
哪里nvari = 3.但是,如果在某些情况下,我实际上有4个变量(即nvari = 4).我想写这样的东西:
write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari)
Run Code Online (Sandbox Code Playgroud)
现在,nvari可以是任何东西,输出将按我喜欢的方式工作.我怎样才能做出类似这样的工作?
声明变量时使用双冒号有区别吗?
real(8) :: a
real(8) b
Run Code Online (Sandbox Code Playgroud)
这两个显然都做同样的事情.这些除了风格之间有什么区别吗?
我知道我们可以初始化变量并添加属性,如下所示
real(8), intent(in), parameter :: a = 4, b = 2
Run Code Online (Sandbox Code Playgroud)
但除此之外,只是声明一个普通的旧的real或integer没有属性而不是初始化是否有任何区别?
此外,这与SAVE属性有关吗?在我的一些代码中有一段时间出现意外行为,我在调用之间保存函数的结果,这迫使我每次调用函数时显式地将变量设置为零,即使该SAVE属性不是由我设置的.
我正在调试我添加的更大的数字程序.它是用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的正确标志,以确保程序在到达浮点异常时停止运行(理想情况下是回溯)?我尝试按照这里的说明进行操作,但似乎没有改变任何内容.
如果要从用户读取的字符串包含空格,则在Fortran中使用read(星号,星号)似乎不起作用.请考虑以下代码:
character(Len = 1000) :: input = ' '
read(*,*) input
Run Code Online (Sandbox Code Playgroud)
如果用户输入字符串"Hello,我的名字是John Doe",则只有"Hello"将存储在输入中; 空间被忽视后的一切.我的假设是编译器假定"Hello"是第一个参数,而"my"是第二个,所以要捕获其他单词,我们必须使用read(,)input1,input2,input3之类的东西. ......这种方法的问题是我们需要为每个输入创建大字符数组,并且需要确切地知道将输入多少个单词.有没有办法解决??有些功能会实际读取整个句子,空格和所有内容吗?非常感谢!