求大神帮助转换一下,把fortran语言转换为c/c++ - 爱问答

(爱问答)

求大神帮助转换一下,把fortran语言转换为c/c++

program xadi use AVDef use DFLib parameter(n=19) real ai(n),bi(n),ci(n),r(n),u(n) real aj(n),bj(n),cj(n) integer status real T(0:n,0:n),TT(0:n,0:n) real lamda,Tu,Td,Tl,Tr,dx,dy,dt,ka Tu=100.;Tl=75.;Tr=50.;Td=0.;dx=1.;dy=1.;kmax=10; dt=1;ka=0.835; lamda=ka*dt/(dx*dx) write(*,*) 'lamda=',lamda T = 0.;T(0,:) = Tl;  T(n,:) =Tr T(:,0) = Td;  T(:,n) =Tu T(0,0)=0.5*(Td+Tl);T(0,n)=0.5*(Tl+Tu) T(n,n)=0.5*(Tu+Tr);T(n,0)=0.5*(Tr+Td)       ! 系数矩阵赋值 aj(:)=-lamda; ai(:)=lamda bj(:)= 2.*(1.+lamda); bi(:)=2.*(1-lamda) cj(:)=-lamda; ci(:)=lamda call faglStartWatch(T, status) do k=1,kmax do i=1,n-1     do j=1,n-1       r(j)=ai(i)*T(i-1,j)+bi(i)*T(i,j)+ci(i)*T(i+1,j)     end do     r(1)=r(1)-aj(1)*T(i,0);r(n-1)=r(n-1)-cj(n-1)*T(i,n)     call tridag(aj,bj,cj,r,u,n-1)     do j=1,n-1         T(i,j)=u(j)     end do end do ! 将矩阵 T 转置计算 x 方向  call reverse(n,T,TT) do i=1,n-1  do j=1,n-1   r(j)=ai(i)*TT(i-1,j)+bi(i)*TT(i,j)+ci(i)*TT(i+1,j) end do r(1)=r(1)-aj(1)*TT(i,0);r(n-1)=r(n-1)-cj(n-1)*TT(i,n) call tridag(aj,bj,cj,r,u,n-1) do j=1,n-1  TT(i,j)=u(j) end do end do    call reverse(n,TT,T);call faglUpdate(T, status)    call faglShow(T, status) end do call faglClose(T, status);call faglEndWatch(T, status) end

1 引言
 Fortran语言作为最为古老的高级程序设计语言,现在仍然在高性能科学计算领域中广泛使用。一方面Fortran语言适合数值计算,提供了高效的性能;另一方面,许多基础数学包如netlib中的lapack、linpack、blas等都是用Fortran语言编写的,将这些数学包翻译成其他编程语言的工作量十分巨大。
 在开发软件系统时,Fortran语言由于缺乏类似mfc、.NET Framework、GTK这样的系统框架而很少被采用。软件开发者通常使用C/C++、C#、java等程序设计语言编写软件。这样就带来了一个问题,当软件系统中需要使用只有用Fortran语言实现的数学函数时,存在着如何集成的问题。
 一种方法采用多语言混合编程的方式,即用每种语言相应的编译器(compiler)编译成目标文件,然后由连接器(linker)处理这些目标文件生成二进制程序代码。由于目标文件的内部格式复杂,这就要求不同编译器厂商的编译器之间相互兼容,但这谈何容易?因此实际中最好使用同一厂商的编译器。如在Linux下面使用GCC中的gcc和gfortran,或者Intel的icc和ifort。一般不混合使用。但当今开发Fortran编译器的厂商已经很少了。特别是在Windows平台下,只有Intel和PGI Group提供Fortran编译器,而且均价格不菲。
 另一种方法是把用Fortran语言编写的程序代码翻译软件系统开发语言(如C/C++、C#等)。但这需要即懂数学算法、又懂Fortran语言的专家,而且这种翻译代码的工作量十分巨大。幸运的是,有一个叫做f2c的小程序可以帮我们做这件事。
2 f2c的下载和安装使用
2.1 下载
f2c该主页上(http://www.netlib.org/f2c/)提供了f2c程序代码文件的下载链接,但一个一个地下载几十个小文件过于繁琐,不如用FTP客户端软件(如Filezilla)直接到FTP站点(ftp.netlib.org/f2c)下载。

2.2 安装
在Unix中的终端下,进入到src目录下面,键入:
$ make -f makefile.u
在Windows的命令提示符(Command Prompt)下面,键入:
> nmake /f makefile.vc

2.3 使用
f2c是一个不带图形界面的命令行程序。它提供了众多程序参数,下面的表格给出了其中一些比较重要的参数说明。
参数 说明
-A 生成ANSI C代码,如不指定此参数则默认生成K&R形式代码。
-a 将函数定义中的变量设定为自动类型(automatic)而不是静态类型(static)。建议使用此参数。
-C++ 生成C++代码。如果你的项目开发语言是C++而不是C的话,建议使用此参数。实际上f2c在代码中加入如下预编译宏:
#ifdef __cplusplus
extern “C” {
#endif

#ifdef __cplusplus
}
#endif
如果使用该参数,最好把生成文件的扩展名从.c改为.cpp。
-c 将原Fortran代码作为注释放到C源代码文件中。
-P 对每一个输入Fortran源代码文件file.f,将函数定义的原型(ANSI C prototype)写入file.P文件中。可以将file.P改名为file.h以便导出函数定义。
-r8 将单精度浮点型变量提升为双精度浮点型。

f2c支持Unix命令参数标准,因此下面两种形式是等价的。
$ f2c -P -A -a -c -r8 *.f
$ f2c -PAacr8 *.f
此外,利用Unix的管道(pipe)功能,可以把多个Fortran源代码文件转换为一个C源代码文件。
$ cat *.f | f2c > mystuff.c
f2c生成的函数定义原型文件的扩展名是.P,在Linux下面可以用如下命令将所有的.P文件的扩展名改为.h。
$ for f in *.P; do mv “$f” “${f%.P}.h”; done


相关标签:大神

下一篇:大数据时代与个人隐私之间的关系与矛盾

上一篇:txt文件每行有多列数据,能不能把所有行同列的数据存入数组中,对其进行相关处理,最后再按行数据输出?

热门标签:
excel 网盘 破解 word dll
最新更新:
微软重新评估新的Outlook的使用时机 联想推出搭载联发科Helio G80芯片组的Tab M9平板 英特尔创新大赛时间确定! 微软Edge浏览器在稳定渠道中推出Workspaces功能 英伟达RTX4060TiGPU推出MaxSun动漫主题! 谷歌地图为用户提供了街景服务! GameSir 在T4 Kaleid中推出了一款出色的控制器! 微软开始在Windows 11 中测试其画图应用程序的新深色模式! LG电子推出全球首款无线OLED电视 英伟达人工智能芯片崭露头角! Steam Deck可以玩什么游戏-Steam Deck价格限时优惠 雷蛇推出CobraPro鼠标 Kindle电子阅读器可以访问谷歌商店吗 Windows10如何加入组策略 window10图片查看器怎么没有了?