Fortran程序错误,如何定位到错误行

Fortran程序错误,如何定位到错误行,第1张

通常,编译器会指出出错的行号,有的还能标记出具体的语法错误位置。

例如:

另外一种情形是,语法正确,但是存在不能解析的变量名或子过程,如下图:

还有一种情形,编译通过,执行的时候出错,程序会给出错误类型。有时候定位不了出错的行号,需要通过插入调试代码来查找。例如下图:

MPI(message passing interface),是一个消息传递接口。MPI的函数总共有287个。

想实现一个MPI并行计算的程序的话,只要掌握MPI的工作机理和6个简单的MPI函数便可以了,本文介绍4个简单MPI函数:MPI_INIT、MPI_COMM_RANK、MPI_COMM_SIZE和MPI_FINALIZE。

注意:以下调用格式为Fortran格式,大部分教程都是C语言的MPI介绍,这里以及以后的文章都是以Fortran为基础,尤其要注意Fortran不分大小写。

先给出一个最简单的Hello_world的Fortran + MPI的程序,在此基础上来分析MPI的4个最简单的函数——MPI_INIT、MPI_COMM_RANK、MPI_COMM_SIZE和MPI_FINALIZE。

MPI_Init用来初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备。

MPI_Finalize则是结束MPI执行环境。

MPI_Comm_rank就是来标识各个MPI进程的,告诉调用该函数的进程“我是谁?”。

MPI_COMM_SIZE用来标识相应进程组中有多少个进程。

21 将以上内容保存为hello_worldf90,上传到服务器的文件夹/home/xldeng/mpi里面:

22 编译hello_worldf90为hello_world,并用ls查看内容:

23 使用服务器里面的命令来调用不同的节点上面的核来计算:

31 注意程序中的一个小细节:

含义为调用mpi的库函数,因为使用的是Intel MPI + Fortran90,所以调用的方式为:use mpi。Fortran77可能需要 include "mpifh"。

32 在22节中的mpiifort是ifort的并行使用方法,检验mpiifort的用法:which mpiifort或者是mpiifort -v。

33 在23节中的说明:本程序的运行平台为服务器上,所以使用的是 MPI使用指南 | 武汉大学超算中心 中提供的提交方法。如果在单台服务器上面,可以使用如下命令:

来运行程序。

double randomz (int ia, int ib)

{

double x; //返回值

static int initial[15]={0};

static double iz,iy[15]={00};

//使用static类型,为下次调用保留值,不然每次都要从头开始

switch(ia)

{

case 1: //ia参数为1,从键盘输入种子初始化随机数生成器

iz=1000000010

read(5,'(5i8)') initial 这句话直接翻成C很难,

//意思就是从键盘(5号设备)连续读入5个整数(难道不是15?

// 我怀疑源码写错了,应该是15i8),存入整型数组 initial ;

//而且Fortran的格式描述符i8强制每个整数都是8位(千万位),

//如果输入不足8位就切换到下一个数进行输入,则Fortran会

//自动在不足8位的数的右侧补上足够的0,以放大到千万位

iy=dble(initial) 这句话直接翻成C很难,

//本句用到Fortran90/95特色的数组整体 *** 作,C/C++要用循环;

//是把整型数组initial逐项复制给double数组iy,转换成double型

x = iy[ib]10E-8 ;

case 2: //ia参数为2,继续使用已经初始化好了的生成器

iy[ib] = 3290 iy[ib] % iz ;

x = iy[ib]10E-8 ;

case 3: //ia参数为3,重新初始化,但还使用原先的种子

iy=dble(initial) 这句话直接翻成C很难,用循环完成。

}

//switch结束

return x;

}

=================================

算法的主要思想就是“线性同余法”,

linear-congruential method

其基本迭代公式为

X[n+1] = ( A X[n] + B )% C

X的初始值随便取

在你给的源代码里:

A= 3290

B= 0

C= 1000000010

源代码中的关键是 iy[ib] = 3290 iy[ib] % iz

另外 x = iy[ib]10E-8 是为了将结果归一化到0~1之间再返回

你可以自己手工算几个数,就能看出这个算法的奥妙了。

另外需要指出的是——源代码里用static就是为了每次case 2时候的调用,都是在对上一次的结果进行迭代。而ib参数的用处就是保持有几组不同的独立迭代序列可用,防止不同用途的几处“生成伪随机数”调用互相干扰。

以上就是关于Fortran程序错误,如何定位到错误行全部的内容,包括:Fortran程序错误,如何定位到错误行、【Fortran并行科学计算】——Hello World程序、fortran程序解读等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9767290.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存