绪论
计算物理的起源与发展
¾1981年3月, 哈佛大学W. H. Press教授等向美国NSF等提交了发展计算物理学的计划书, 标志着计算物理学进入成熟发展阶段;
计算物理的应用
数值分析与数值模拟;
符号计算( Mathematica, Matlab, Maple等);
利用计算机的符号处理系统进行解析计算、公式推导和高
精度的数值计算;
物理实验的计算机模拟;
利用计算机模拟物理实验, 已成为继理论和实验方法外物
理学研究的第三种手段;
计算机实时控制
控制系统运行
仪器状态监视
第一性原理方法
上世纪20 年代,在Schrodinger 给出非相对性波动方程后,原则上应该可以计算出原子和分子的电子态。但是,可以解析求解的系统仅限于氢原子,而由两个氢原子的氢分子和两个电子加两个质子组成的氦原子就已经无法求解了。在统计物理的平均场近似的思路下,Hartree 和Fock 提出了广泛应用于物理化学的Hartree-Fock 方法。它利用自洽理论,在大量迭代中得到收敛的结果,是处理分子中的多电子体系的实用而成功的数值方法。但随着电子数的增加,该方法的计算难度也大大增加。
Hohenberg 和Sham 在1964 年提出了一个重要的计算思想,证明了电子能量由电子密度决定。因而可以通过电子密度得到所有电子结构的信息而无需处理复杂的多体电子波函数,只用三个空间变量就可描述电子结构,该方法称为电子密度泛函理论。按照该理论,粒子的Hamilton 量由局域的电子密度决定,由此导出局域密度近似方法。多年来,该方法是计算固体结构和电子性质的主要方法,将基于该方法的自洽计算称为第一性原理方法。
三位计算机设计大师的贡献
H. Aiken (1900-1973)
哈佛大学的博士研究生毕业。因做博士论文涉及到空间电荷传导问题的计算,1937年提出方案,1939年得到IBM资助,1944年建成投入使用。
这是继电式计算机-Mark I
J. W. Manchly (1907-1980)
宾夕法尼亚物理博士,因从事天气预报需要想设计计算机,1942年提出计算机方案,1945年底竣工。
这就是世界上第一台电子计算机-ENIAC机。
J. Von Neumann (1903-1956)
普林斯顿高级研究所,1945年在普林斯顿研制成MANIAC机,有力地支持美国研制,称为计算机之父。
第一章 Fortran语言程序设计初步
第一节 Fortran语言的发展概况
1958年FORTRAN II
1962年FORTRAN IV(Fortran 66)单个字符视为长度为1的字符串
1978年Fortran 77
1991年8月,Fortran90标准终于问世。
最新标准是 Fortran95
FORRAN95不象FORTRAN90在FORTRAN77添加很多内容,只能视为90的修正版,加强了并行运算方面的支持。
下一代则是完全面向对象的 Fortran2000
第二节Fortran程序的基本组成
2.1 Fortran程序简介
为了对Fortran程序有一个初步了解,下面先介绍几个简单的Fortran源程序。
[例1.1] 输入两个数,求算数平均和几何平均值。
C------求两种平均値------ PROGRAM Example_1_1 ! 求两种平均値PROGRAM Example_1_1 REAL :: a, b, av1, av2
REAL a, b, av1, av2 READ *, a, b
READ (*,*) a, b av1 = (a + b)/2; av2 = (a*b)**0.5
av1 = (a + b)/2 PRINT *, av1, av2
av2 = sqrt(a*b) END
WRITE(*,*) av1, av2
END
[计算例]
1.0
2.0 ←键盘输入(a,b)值
1.500000 1.414214 ←计算结果输出至屏幕
程序説明:
程序中第1行是注释行,对程序起说明作用。F77注释行是以“C”或“*”作为该行第一个字符的,F90可在任意一行末以“!”开始作为注释符。第2行是主程序名,第3行是变量类型定义,第4行是输入语句,第5-6行是赋值部分,第7行是打印输出语句,最后是程序结束。注意F77的固定书写格式和F90的自由格式。F90中用“;”将两行并为一行。
PROGRAM语句:宣布程序开始,其后跟程序名。可省略。
REAL语句:定义a,b,...等变量为实数型数据。如为整数型,则用INTEGER定义。
变量名:可用a,b等无具体意义的文字,或用average_value等英文缩写。使用的字符和文字长度有具体规定。
输入输出语句:可以用以下任一种默认格式,注意星号(*)和逗号(,)。星号意指默认的输入输出硬件(键盘和屏幕)及格式。
READ *, 变量名
READ(*,*) 变量名
PRINT *, 变量或常数,关系式
WRITE(*,*) 变量或常数,关系式
赋值语句:将等式右边的变量取值赋予左边的变量。
变量 =变量、常数、关系式
例:sum = sum + x
算术运算:
2项运算:加(+),减(-),乘(*),除(/),乘方(**)。
运算的优先顺序:加,减<乘,除<乘方,括号中优先()。
单项运算:(例 -a)
数据类型:按定义有整数、实数、复数、双精度数等。
数据的输入:READ * 语句执行时进入等待数据输入的状态。数个数据输入时以英文逗号、空格或换行符作区别,单个数据中间不能有空格。
字符的输出:在执行READ语句时,计算机已经进入等待数据输入的状态,但它不会给出任何提示。除了程序员以外,谁也不会知道需要输入什么数据,即使是程序员自己可能也会忘记。另外,PRINT 语句打印的数据到到底是什么物理含义也需指明。因此,需要输出文字内容。
PRINT *, 字符常量
WRITE(*,*) 字符常量
字符常量:用''或""括起来的文字字符。
2.2 Fortran程序的特点
从以上例子中可以看到:
1. 一个Fortran程序由一个或若干个程序单位组成。主程序和辅程序分别是一个独立的程序单位。主程序单元起整体控制作用,各辅程序单元完成总问题中的一个子问题。
2. 每一个程序单位都是以END语句结束的。END既是一个程序单位的结束标志,又是一个独立的语句(结束语句)。主程序中的END语句的作用是使程序“停止运行”。辅程序中的END语句是“使流程返回调用程序”。
3. 一个程序单位包括若干行。
F77行分为下面两类。F77规定,一行只能写一个语句,一行中不能写几个语句。如果一个语句太长,一行内写不下的话,可以写在继续行(要用“续行标志”)
4. 语句行。由一个Fortran语句组成, Fortran语句分为执行语句和非执行语句。执行语句使计算机在运行时产生某些操作,如赋值语句、打印语句等。非执行语句(包括说明语句,数据语句等)将有关信息通知编译系统,以便在编译时作出相应的处理,例如类型说明语句、函数子程序语句等。Fortran 程序的基本成份是语句。
5. 非语句行,即注释行。它不是Fortran语句,它不被翻译成机器目标指令。不产生任何机器操作。
它仅仅是为了人们阅读程序的方便而加到程序中的。一个程序中注释行的数目不受限制,根据需要而定。但一个程序单位不能只由注释行组成。注释行的内容完全是根据程序设计人员需要而写的,一般是为程序(或程序中一部分)的作用作注释以易于理解程序。
6. F90行不分类。注释可以写在任一行末尾,而且一行不限语句数,可以将几个F77行合并写入一行。这样,极大地简化了程序写法,使得程序可以编写得更为清晰。因此F90的格式较F77有柔软性。
7. Fortran程序中的语句可以有标号。一个语句有否标号是根据需要而定,其作用是标志一个语句以便被其它语句引用。在同一个程序单元中不能有两个相同标号的语句。标号不影响语句的执行顺序。但在F90中因为提倡结构化程序设计,一般不使用标号。
8. 一个程序单位中各类语句的位置是有一定规定的。例如PROGRAM语句应是主程序的第一个语句。FUNCTION语句是函数子程序的第一个语句,END语句只能是程序单位中最后一行。程序中语句执行的顺序一般依照它们在程序中的先后位置而定。
9. F77源程序必须按固定格式书写,即源程序中哪些内容应写在一行中的哪一列(或哪几列上)有严格的规定。而F90可采用自由格式。
2.3 字符集
Fortran允许使用的字符如下:
英文字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
阿拉伯数字:0 1 2 3 4 5 6 7 8 9
特殊符号:空格= + - * / ( ) , . ': " ! % & ; < > $ ? _ (F90中新增的字符)
其中“$”和“?”号在程序中没有确切意义。应当注意,在F77语句中不区分大小写字母,例如写READ和read或Read是一样的,其它变量名和函数名中,大、小写字母也是等价的。但早期的Fortran 卡片不允许小写,故老的程序代码都是大写的,很多人也养成了大写的习惯。
在每一种计算机系统所用的Fortran编译器中,可能对字符集或其功能作某些扩充。因此在使用某一具体的计算机时,应了解它的规定。例如“$”号可用于从屏幕上连接输出输入字符于同一行。标准还允许F90扩充进各国文字,各种专业用符号,这要看厂商装入的编译系统是否支持这些字符的使用。某些系统还可以用这些字符作为字符常数或注释,注意这类字符是2字节长度,在计算字符串长时要加倍。
2.4 固定格式
Fortran作为历史上第一种高级语言,其程序编写的规则与当时使用的计算机系统有很大的关系。早期的计算机系统须用卡片将源程序输入,一张卡片相应于源程序的一行。由于卡片物理宽度的限制,因此一行程序允许的字符数也是有限的。由此决定了F77的格式,既为F90/95中的固定格式。
早期编写F77程序使用如上图的F77程序纸,一行有80列,每行一条程序语句。这80列分为四个区,分别书写不同的内容:
标号区:第l—5列
可以写l至5位整数。也可以没有标号。标号区中的空格不起作用。如lOO与100 或1 0 0作用相同。标号应是无符号整数(无正负号或小数点)。标号大小顺序没有任何要求。假如第二行的标号为1000,第三行的标号可以是10,也可以是99999。
标号区内不得出现标号以外的内容,但注释行例外。注释行的内容可以写在标号区内,一行中第一列
为C或*的,该行即被认为注释行,编译时对该行内容不作翻译,对程序运行不产生任何影响。如果在第一列上出现的不是数字、空格或C和*的字符,编译时按出错处理。
续行区:第6列
如果在一行的第6列上写一个非空格和非零的字符,则该行作为其上一行的续行。
语句区:第7—72列
不要求一定从第7列开始写语句,可以从第7列以后(72列以前)的任何一列开始写,但一行只能写一个语句。如果写满了72列,一旦在终端上修改程序时在该行又插入了一些字符,就会使本行最后几个字符超出语句区而引起意料不到的错误。特别注意到语句最后的空格将可能溢出72列,在某些计算机系统上将导致难以查出的错误。应注意,引号内的字符串中所包括的空格是有效的,不能忽略。
注释区:第73—80列
在卡片输入法时代,程序员一般利用此8列为程序行编序号以便查。注释区只对程序员提供辨别信息,不是语句的一部分,在编译时不对72—80列作处理。
2.5 自由格式
在F90中,用自由格式编写程序有很大的自由度。与固定格式相比,不易产生键入位置的错误,而且易读易懂。
行:一行为132列。可以有复数条程序语句,语句间用分号“;”分开。语句没有位置规定。
注释行:起始用注释符“!”号,此行其后的所有字符均作为注释(字符串中的!号除外,如 print *,’help!!!!’)。
续行:当一个语句非常长以至于132列都书写不下时,允许有39个续行。在语句行最后加上续行符“&”号。如果字符串跨2行以上,则在续行的开始位置也要加&号。注意语句的有效字符是从“&”前和续行符“&”之后的位置算起。[e_132_04.f90]
空格:在语句名和变量名中间不能有空格。需要空格的地方必须有一个以上空格(GOTO和GO TO,ELSEIF和ELSE IF,END构造名(构造名有:DO, PROGRAM, FUNCTION, MODULE, SUBROUTINE)等有两种写法的除外),如关系运算符 ==,<= 不能写成 ==,< =。这与F77有很大不同之处,因为F77的设计中将编译源程序的空格忽略。
当程序员要将自己编写的F90程序与现有的用F77编写的子程序库在源码级结合起来的话,需要特别注意格式的差别。
文件名
以上两种格式的源程序在编译时可以用选项来指定,对应的默认文件扩展名为:
固定格式: .for或 .f[fixed.for]
自由格式: .f90 [free.f90]
2.6 程序体和语句顺序
各程序单位(除模块程序单位外)的程序体形式相同,共分两部分:前面是说明部分,后面是执行部分(模块程序单位只有说明部分),两部分之间没有确切的分界,紧密衔接,但不准彼此穿插。即:程序单位=单位起始语句+程序体+单位结束语句。程序体=说明部分+执行部分。
Fortran要求严格的语句顺序。在每个程序单位中,根据语句种类按如下的次序排列。F77中的顺序可简单归纳为:
PROGRAM,FUNCTION,SUBROUTINE,BLOCK DATA等程序单位开始语句
变量类型和语句函数等定义语句 (说明部分)
执行语句,DATA语句,FORMAT语句 (执行部分)
END语句
标号
可在语句开头加上标号或标签,用于指定特定的语句。有效范围限于一个程序单位内。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论