逻辑运算
数学符号 | 关系运算符 |
---|---|
> (大于) | .GT. |
≥ (大于或等于) | .GE. |
< (小于) | .LT. |
≤ (小于或等于) | .LE. |
= (等于) | .EQ. |
≠ (不等于) | .NE. |
含义 | 逻辑运算符 |
---|---|
与 | .AND. |
或 | .OR. |
非 | .NOT. |
数组
- 数组的保存规则
不管数组有几维,在计算机内存中都存成一个连续模块。
从低维到高维(左到右)存放,与C语言相反。
注意:维数越小使用越内层的循环可以提高运行效率!
do i=1,5
do j=1,5
do k=1,5
write(*,*) a(k,j,i)
end do
end do
end do
-
可变大小的数组
声明:allocatable 如integer, allocatable :: a(:,:)
数组的大小不用在声明时给出,可以等到程序运行到可知数组大小的那一步之后再给出。但是必须分配完内存空间才可以使用,否则计算机不知道要分给它多大地方。分配完内存空间的可变大小数组就跟普通数组没什么区别了。
使用:allocate 如allocate(a(5,5))
释放空间:deallocate 如deallocate(a)
-
其他
- 可以在allocate命令中加stat来得知内存配置是否成功。
- allocated函数返回一个逻辑值,用于检查可变大小的数组是否已经配置内存。
文件
-
基本概念
-
读取文件的操作:
顺序读取(一步步读取)、直接读取(跳到任何一个位置读写) -
保存格式:
文本文件(好处:易懂)、二进制文件(好处:读取速度快、省空间) -
文件基本操作
-
打开/创建文件:
open(unit=文件编号,file=‘文件名称’)
例:open(unit=10,file='hello.txt')
open的其他参数:
form=‘FORMATTED’(文本文件,默认)/ ‘UNFORMATTED’(二进制文件)
status=‘NEW’(第一次打开的文件)/ ‘OLD’(原本已经存在的文件)/ ‘SCRATCH’(打开一个暂存盘,在程序结束后自动删除)/ ‘REPLACE’ (若文件不存在则新建一个文件,若已经存在则覆盖原文件,通常编译器的默认状态)
access=‘SEQUENTIAL’(顺序读取,默认)/ ‘DIRECT’(直接读取)
recl=长度(顺序读取:一次可以读写多大容量的数据;直接读取:每一个模块单元的分区长度)
err=label(当文件打开错误时,程序跳跃到label所指代码处继续执行程序)
iostat=一个整型变量var(var>0 读取发生错误,var=0正常,var<0文件终了)
position=‘ASIS’(文件打开时的读取位置,通常是开头,默认)/ ‘REWIND’(文件打开时的读取位置移到开头)/ ‘APPEND’(读取位置移到结尾)
ACTION=‘READWRITE’(可读可写,默认)/ ‘READ’(只读)/ ‘WRITE’(只写)
PAD=‘YES’ (格式化输入时,前面不足的字段会以空格填满,默认)/ ‘NO’(不会)
DELIM=‘NONE’ (纯输出字符串内容)/ ‘QUOTE’(前后加双引号)/ ‘APOSTROPHE’(前后加单引号) -
写入:write(文件编号,*) 默认命令完成后自动向下移一行
例:write(10,*) "Hello"
把Hello写入10号文件中 -
读取:read(文件编号,*)
-
输出到屏幕:print *, 要输出的量
-
读取文件
ACCESS=‘APPEND’ 表示文件读取位置在文件的尾部
READ 命令每读一次会自动把读取位置移动到下一行。
函数
- 数值函数
函数名 | 说明 |
---|---|
ABS (A) | 绝对值 |
CONJG (Z) | 求共轭复数 |
DBLE (A) | 转换为双精度实数类型 |
- FFT函数
三种常用的谱空间与物理空间转换的FFT函数:
fftw_execute_dft(const fftw_plan p, fftw_complex *in, fftw_complex *out)
fftw_execute_dft_r2c(const fftw_plan p,double *in, fftw_complex *out)
fftw_execute_dft_c2r(const fftw_plan p,fftw_complex *in, double *out)
三个变量:plan,输入,输出
FFTW使用手册:
http://www.fftw.org/fftw3_doc/FFTW-Reference.html#FFTW-Reference
MODULE
作用:封装,调用之后不用在子程序里再一次声明了
调用:use 模块名
可以封装:
a) 变量:默认为局部变量,加save变为全局变量 (如 integer,save::a)
b) 类型:自己定义type,类似C语言中的struct
c) 函数:封装在同一个module里函数会自动互相认识,不需要经过声明;函数也可以直接使用同一个module里所声明的变量。
其他
Fortran 不区分大小写