在我们写程序的时候,经常需要重复实现某个功能,这就涉及到代码的重复使用。如果每次都重新写一遍,显然是很憨憨的,所以我们可以通过函数的思想来实现这样的需求,具体到Fortran程序中,就是函数(function)和子程序(subroutine)的使用。下面我们通过实例简单介绍一下它们的基本概念和使用。
首先,Fortran内置了很多函数,可以直接使用,例如大家非常熟悉的三角函数:
内置函数的使用,通常内置函数会被高亮
此外,我们还可以通过下列语句自定义函数,例如这个R_cor1函数就是根据后面的输入参数求得的一个实空间x轴坐标。
自定义函数的定义
函数定义好后,即可在程序中直接调用,无需任何额外指令,例如最上面调用COS函数,直接写入相应参数即可,例如我们下面调用R_cor1函数计算一个相位信息:
只需将定义函数时要求的参数信息输入即可。
说完函数,再简单说一下子程序,我们来看这一个子程序,它实现的功能是,将一个万尼尔函数归一化:
因为需求是需要将多个万尼尔函数都实现归一化,所以可以通过子程序来避免重复撰写代码,在调用子程序时,需要加入call命令:
部分结果如下:
最后简单提一下,虽然理论上函数和子程序中的任意一个都可以实现我们需求的功能,但什么时候适合用函数,什么时候适合用子程序,其实是有一些说法的,我的体会总结如下:
当你需要一个“y=f(x)类型的返回值”的时候,用函数,例如我们上面的COS函数和R_cor1函数,本质上我们的需求都是:我输入一些参数,最后得到一个返回的数值。它的本质是,我没有改变我输入的变量,而是将我输入的变量通过函数关系转化了出来。
所以什么时候用子程序就很自然了:当你需要改变一个变量,就用子程序。例如我们上面的万尼尔函数变量wan,在调用子程序前,它是没有归一化的,但调用完子程序后,它就是归一化的了。而我在调用子程序后再使用的wan,是一个归一化的wan。
总结:需要一个数值,不改变输入变量,使用函数;希望改变一个变量以方便后续使用,使用子程序。