C语言变量函数和Fortran的互操作性
是否有一种方法可以声明C变化函数并从Fortran调用它? 我需要调用此功能来计算用字符串标记的向量之间的一些点产品. 我的想法是声明以下内容,其中的变量列表包含字符串文字.如果参数的变量列表为空,则我将在标准标签中进行查找并执行计算.如果用户指定了两个标签,我将检索这两个向量并获取其点产品: extern "C" void compute_dot_product(double * dot_product, ...) { va_list args; va_start(args, NULL); char * label1 = va_arg(args, char *); if (!label1) { // Do standard label lookup and compute dot product } else { // Compute dot product between the vec
0 2024-04-08
编程技术问答社区
在C++/Fortran中对贝塞尔函数进行整合
如何在fortran或/和c中从" 0"到" infinity"的数字函数集成一个方程? 我在MATLAB中做到了,但是对于较大的输入而言并非如此,在特定值之后,Bessel函数给出了完全错误的结果(MATLAB中存在限制) 解决方案 您几乎可以Google,并找到C中已实现的许多Bessel功能. /computing/software/gipsy/sub/bessel.c 最后,这些使用内置类型,并且将仅限于它们可以代表的范围(就像MATLAB一样).充其量,使用双精度浮点表示形式期望15位精度.因此,对于大量数字,它们似乎会被舍入.例如. 123784646412345000000000000.00000 ,当然,堆栈溢出上的其他人都对此进行了研究. c ++ bessel功能的复数数字 其他解决方案 贝塞尔功能的各种积分有大量的分析结果(请参阅其他解决方案 上次我必须与这样的事情进行处理,这是对由零交叉定义的间隔进行简单整合的状态.在大多
4 2024-04-07
编程技术问答社区
从Fortran/C调用Python函数
我正在编写Fortran代码,我想使用Python库中的一些特殊功能和方法.这是一个Python代码: from mpmath import * from scipy.optimize import * def g(A,B,t): return newton(lambda x: (x - A*polylog(1.5, B*exp(-t*x))), 0.0) 在Fortran代码中,我想传递真实值A,B,T并获得G(A,B,T)(可能复杂)的值.这也可以在c. 中完成 我想提到,将Python与其他语言混合对我来说是新事物. 解决方案 解决方案 如果有人有兴趣,我解决了这个问题.以下非常有帮助: stackoverflow =" http://www.yolinux.com/tutorials/linuxtutorialmixingfortranandc.html" rel =" nofollow noreferrer"> yolinux .
0 2024-04-06
编程技术问答社区
Fortran可以直接从二进制文件中读取字节吗?
我有一个二进制文件,我想用fortran阅读.问题是它不是由Fortran编写的,因此没有记录长度指标.因此,通常的未形式的fortran读取将无法使用. 我以为我可以偷偷摸摸,并将文件读为格式的文件,字节字节(或4个字节确实是4个字节,实际上是4个字节)中的字符数组,然后将字符的内容转换为整数并通过转移功能或可怕的等效语句浮动.但这不起作用:我尝试一次读取4个字节,并且根据inquire语句的POS输出,读取大约6000个字节左右,并且字符阵列带有垃圾. 所以没关系.我忘记了这种方法中有一些细节吗?还是在Fortran中有根本不同的方法可以做到这一点? (顺便说一句,我还尝试读取integer*1数组和一个字节数组.尽管这些代码会编译,但在读取语句时,代码也崩溃了.) 解决方案 是. Fortran 2003将流访问引入了该语言.在此之前,大多数处理器都支持等效的某些扩展名,也许称为"二进制"或类似的东西. 未格式化的流访问在文件上不施加记录结构.例如,要从
0 2024-04-05
编程技术问答社区
什么是 "真实*8"?
用fortran 90编写的程序的手册说:"所有实际变量和参数均以64位精度指定(即real*8)." 根据 wikipedia ,单个精度对应于32-折的精度,而双重精度对应于双重精度64位精度,因此显然该程序使用双重精度. 但是real*8是什么意思? 我认为8意味着8位数遵循小数点.但是, wikipedia 似乎说单精度通常提供6-9位,而 double Precision 通常提供15-17位数字.这是否意味着" 64位精度"与real*8不一致? 解决方案 如注释中所示,real*8不是标准 fortran. 8个数据类型使用的字节的数量. 因此,一个32位整数是integer*4沿相同的行. (但也不是标准.) 快速搜索找到 " Real 4"语句指定变量名为单个精度4字节实数,该数字具有7位准确性数字,幅度范围从-38到+38.几乎所有32位计算机中的"真实"语句与" Real 4"语句相同. 和 " REAL 8"语句
2 2024-03-31
编程技术问答社区
将存储在Fortran 90二进制文件中的数据转换为人类可读的格式
根据您的经验,在Fortran 90中,将大型数组存储在输出文件中的最佳方法是什么?以前,我一直在尝试将大型阵列写入ASCII文本文件.例如,我会做这样的事情(感谢页面底部的推荐 - 在fortran 90中,通道到write-an-and-array-to-a-text-file-low-wise> ): PROGRAM testing1 IMPLICIT NONE INTEGER :: i, j, k INTEGER, DIMENSION(4,10) :: a k=1 DO i=1,4 DO j=1,10 a(i,j)=k k=k+1 END DO END DO OPEN(UNIT=12, FILE="output.txt", ACTION="WRITE", STATUS="REPLACE") DO i=1,4 DO j=1,10 WRITE(12, "(i2,x)", ADVANC
0 2024-03-30
编程技术问答社区
在matlab中读取未格式化的fortran文件--哪种精度?
我刚刚写出一个文件: real*8 :: vol_cel real*8, dimension(256,256,256) :: dense [... some operations] open(unit=8,file=fname,form="unformatted") write(8)dense(:,:,:)/vol_cell close(8) 我的代码以在matlab中读取此信息: fid = fopen(fname,'r'); mesh_raw = fread(fid,256*256*256,'double'); fclose(fid); 最小值和最大值清楚地表明,它没有正确读取它(最小为0,最大值是一个巨大的正真实*8). min = 3.3622e+38 max = -3.3661e+38 我需要在matlab中设置什么精度才能使其在未形式的fortran文件中读取? 一个有点相关
0 2024-03-30
编程技术问答社区
从Shell-Script向Fortran 90程序传递变量
我陷入了这个小问题.我想知道是否可以将Bash-Shell脚本的变量传递给F90代码? 解决方案 我很确定它以前是在这里讨论的,但是我找不到精确的重复. 您可以直接将参数作为参数传递给程序 ./program arg1 arg2 您可以使用子例子在较旧的fortran中,您必须使用非标准扩展名,例如子例程 GETARG 和 IARGC .. 您还可以读取脚本中设置的环境变量 VAR1 = ... VAR2 = ... ./program 使用Fortran 2003 subroutine /a>. 您还可以将文件重定向到程序的标准输入,并使用READ语句读取数据. 其他解决方案 您可以在以下可能性之间进行选择: 在bash中使用变量的导出 myvar="example"; export myvar 将它们作为参数添加到Fortran调用 myFortran "${myvar}" 将它们写入文件并读取文件 最糟糕的解
4 2024-03-28
编程技术问答社区
f90 读取.txt文件 返回NaN
我试图读取带有fortran程序的多个数组的.txt文件. 看起来该程序正在找到该文件,但仅返回NAN值... ! INTEGER :: T, RH, i, j, ierror ! REAL, DIMENSION(3,3) :: AFILE ! LOGICAL :: dir_e inquire(file='PSR_FAB.txt', exist=dir_e) if ( dir_e ) then print*, "dir exists!" else print*, 'nope' end if OPEN (UNIT = 1234 , FILE = 'PSR_FAB.txt', STATUS = 'OLD', ACTION = 'READ') DO i=1,3 READ(1234,*, IOSTAT=ie
12 2024-03-07
编程技术问答社区
在fortran中修改一个数组
我有以下问题.我有一个我必须的文件: 在细胞中分开以创建NxN网格; 计数每个单元格中的粒子; 以特定方式写出结果数. 问题是第三点:我必须编写一个nxn数组,每个数字代表每个单元格中的粒子总数,但是我不知道如何在NxN array中写文件. program eccen implicit none integer, parameter:: grid=200 integer::i,j,k,n,m real*8,allocatable::f(:,:) real*8::xx(grid),yy(grid),mval,Mxval real*8,allocatable::x(:),y(:) open(10,file='coordXY.txt') n=0 DO READ(10,*,END=100) n=n+1 END DO 100 continue
4 2024-03-07
编程技术问答社区
FORTRAN: 保存数组并在另一个程序中使用
是否可以在一个程序中创建数组,然后在其他程序中使用它?我想要创建的数组非常大,它的创建将需要一段时间,因此我不想每次运行主程序时都会重新重新制作,而是在另一个程序中创建一次后才使用它.由于它的尺寸,我不确定是否将其打印为归档,然后将其重新阅读也不会效率低下? 它是尺寸1:300 000和100的整数阵列. 解决方案 长评论: 有许多格式可以保存数据:fortran未形成的顺序,未格式化的直接,fortran fortran未形成的流,netcdf,hdf5,vtk,...真的很难用任何确定的答案来回答这个问题.我们真的不知道计算它是多么耗时,因此我们不能判断储蓄是否会更耗时. 绝对应该寻找unformatted或binary格式. 编辑:您的数组实际上并不大.节省和阅读将很快.只需使用未格式化的文件表格即可.
0 2024-03-07
编程技术问答社区
Fortran子程序中的数组分配
我的问题是关于fortran中的数组分配. 我有一个子例程,例如 ReadParams ,我想在其中阅读一些动态尺寸的数组.这些也用于子例程之外. 处理此问题的最佳方法是什么? 在F95中,似乎不可能在子例程中分配并传递充满值的数组,回到主要程序. 但是,如果我在主要程序中分配它,并在子例程中使用"意图(INOUT)",它也会在此处进行交易. (我在这里使用F90/95,但是由于代码不大,我也可以将其修改为较新的版本...我是Fortran的新手处理是值得的时间投资^^ 编辑感谢您的提示.我不是想在子例程中 deallocation 我的数组. 问题是:我有一个数组,我需要在我的 main 程序中分配 .仅在我从子例程 readargs 中读取输入后才知道阵列.因此,我将数组"可分配". 一旦分配了该状态,就必须再也无法改变. 该数组在子例程 readparams 中填充了值. 我是在 main 还是在 readparams 中分配最好的? ...我现
2 2024-03-06
编程技术问答社区
声明数组的不同语法:有和无维度语句
我正在使用gfortran版本7.2.0.我是Fortran的新手.我知道有不同版本的Fortran.在下面的代码中,我使用不同的语法声明数组(或实际张量) program arrays implicit none integer :: m(3, 4) integer, dimension(3, 4) :: n print *, "m = ", m print *, "n = ", n end program arrays 在一种情况下,我使用的是dimension语句,而另一个则不是.该程序编译(没有错误).我正在使用gfortran的标志-g和-fbounds-check.上面程序的文件扩展名为f.90. 为什么显然有不同的语法来声明fortran中的数组?哪些版本的fortran支持语法,或者有可能声明 stark ,形状和 extents 数组的m只是一个编译器的扩展? 解决方案 语句 integer :
2 2024-03-06
编程技术问答社区
Fortran90数组读取空白值为空
我正在读取数据框架一个外部文本文件(30行,7列),每行都用""分开.我缺少的值表示为",".当我将数据读取到二维数组中时,丢失的值被0.00替换,但是我的数据也有0.00值.当我计算平均值时,计数(项目数(n))显示为计数 - (缺少值的数量).我如何动态选择缺失值. 谢谢 Sri 数据 337.60,220.40,0.00,0.00,200.42,216.61,261.04 323.00,249.20,65.30,0.00,201.93,210.91,309.98 116.80,474.80,0.00,0.00,203.43,215.76,234.93 72.10,505.90,0.00,0.00,204.93,215.72,233.47 148.30,771.70,0.00,0.00,206.44,217.00,239.05 90.70,287.20,0.00,0.00,207.94,215.43,216.85 337.20,334.50,10.20,0.00,2
2 2024-03-06
编程技术问答社区
在Fortran 90中,双精度的最大阵列尺寸是多少?
对不起,如果这不是做这个问题的正确场所,那么这不是关于程序的技术问题. 我需要以两倍精度的2D矢量尺寸阵列,其中1000万个aprox.但是,在其他程序中,我遇到了这种数组的内存问题.我的问题是,是否以双重精度的数组大小有某种限制. 我在Linux,Intel两个核心,32位工作. 谢谢 解决方案 好吧,我将解释为什么字节数不仅有限,不仅是元素计数.在数组索引期间,必须计算元素的地址.当然,它必须适合intptr_t c变量.同样,字节中数组的大小必须适合size_t c变量.这些在32位和现代机器上的64位程序上均为32位或64位.对于可以通过程序寻址的虚拟内存也相同!以及OS和CPU可寻址的内存,尽管即使程序为32位,它们也可以是64位. 这是32位程序和操作系统无法解决4 GB内存的基本原因.即使您可以使用fortran变量以某种方式计算地址,而不是所选的CPU单词大小,CPU也无法访问它. 最后,我以32位模式在Intel Fortran中生气,带有32
2 2024-03-06
编程技术问答社区
Fortran 90-"分段故障-无效的内存引用 "与可扩展的三维阵列
我已经与Gfortran编辑了一个Fortran 90程序,该程序以我想要的方式构建了一个可扩展的3D阵列.运行后,我会收到以下错误: Program received signal SIGSEGV: Segmentation fault - invalid memory reference. Backtrace for this error: #0 0x10542ee42 #1 0x10542f60e #2 0x7fff8d7895a9 #3 0x10542575e #4 0x105425975 #5 0x105425d0e Segmentation fault: 11 我相信这是大型3D数组的内存问题,因为如果我降低了尺寸,它可以工作,但是无论如何是否可以解决这个问题?这是我的代码: PROGRAM phantomtest IMPLICIT NONE INTEGER, PARAMETER:: columns=34, rows=34, diags=((
6 2024-03-05
编程技术问答社区
在一条语句中求和并构建一个数组
我正在准备考试,并解决一些练习问题,不幸的是,这些问题没有提供解决方案.我想使用总和函数,阵列构造函数和隐含的do-loop编程: 总和从n = 2到100,(1+2*n)*log10(n) 我尝试过: WRITE(*,*) SUM(real:: x(99) = (/ ( (1+2*N)*LOG10(REAL(N)) , N=2,100 ) /)) ,但所有IDE都说该声明未被认可.我尝试了多种其他方式,但没有运气. 解决方案 不允许在语句中显示x的声明.另外,不需要,您可以直接处理隐含的循环: program test implicit none integer :: n WRITE(*,*) SUM( (/ ( (1+2*N)*LOG10(REAL(N)) , N=2,100 ) /)) end program 这给出 18187.0469
6 2024-03-05
编程技术问答社区
如何在Fortran90中对带有数字、单词和空白的字符串进行迭代?
文件的描述:STL文件由 组成 solid facet normal n1 n2 n3 (the triangles normal vector) outerloop (one of the markers I want to read) v1 x1 y1 z1 v2 x2 y2 z2 (three vertex of the triangle/facet) v3 x3 y3 z3 endloop end facet endsolid 这个想法是阅读每行中的信息.首先,我正在尝试!阅读第一行:solid program Leitura !use, intrinsic :: trim implicit none integer ilo, ier
0 2024-03-05
编程技术问答社区
用fortran语言写成数组格式
我尝试使用 nxn 矩阵格式编写输出文件. 我写代码,但输出是值f. 的一列 现在的问题是:如何更改文件的输出格式写? 来自: 1 2 4 5 ... to:1,2,3,4// 5,6,8,..// program eccen implicit none integer, parameter:: grid=800 integer::i,j,k,n,m real*8,allocatable::f(:,:) real*8::xx(grid),yy(grid),mval,Mxval real*8,allocatable::x(:),y(:) open(10,file='3d_disk.txt') n=0 DO READ(10,*,END=100) n=n+1 END DO 100 continu
0 2024-03-05
编程技术问答社区