Fortran 编译注意事项
高精度运算
如果要做精度要求很高的计算,一般在声明实数型变量的时候就要指定是单精度还是双精度,用real(kind=4)
便表示单精度,相应地还可以改为8,10,12
分别表示双精度及更高的精度。
在学习Fortran的过程中应该是注意到,算式2/3
和2.0/3.0
计算结果是不一样的,前者是以整型数据计算后者是按浮点数计算。但是!后者的计算精度有时候还是不够,比如在计算1.0/3.0
并赋值给一个双精度变量的时候,计算结果并不是0.3333333333333333
,这里要改写成1.0D0/3.0D0
才能得到想要的结果。还有在调用Fortran自己的一些数学小函数的时候,一般会有两种写法,一种是一般的方法比如SIN() LOG()
这样返回的结果是单精度的(但是在vs studio里面如果编译就开了更高精度则返回更高精度结果!)另一种就是在前面加一个字母D返回双精度的结果比如DSIN() DLOG()
。
在Fortran里面是没有内置
π
\pi
π的值的,如果要用的话可以自己定义一个并声明为参数或者common变量,定义的时候有几种方法:
pi = DACOS(-1.D0)
pi = 4*DATAN(1.0D0)
最后记一下在vs studio中利用long double进行编译的方法:
- 在右侧解决方案资源管理器,右击自己的项目并选择
属性
配置属性
=>Fortran
=>Data
- 选择前两个
Default Integer KIND
和Default Real KIND
进行调整即可 - 还需要将声明变量时候写的双精度标识
real(kind=8)
给去掉,仅保留real
Fortran 读写txt文件
写文件的话就是先用字符串把文件名写好,如果是分段的字符串可以用//
来连接,比如下面这段:
filename = 'result' // trim(adjustl(cTemp1)) // '_' // trim(adjustl(cTemp2)) // '.txt'
这一段代码里面用到两个字符串变量character( len = 3 ) :: cTemp1, cTemp2
他们是根据代码里面的两个整型数据改来的:
write(cTemp2,'(i3)') N
write(cTemp1,'(i2)') k
再注意到两个函数trim() adjustl()
,这是因为在write变量cTemp1,cTemp2
的时候多多少少会存在空格,这两个函数合起来可以去掉这些字符前后的空格。
创建文件名之后是打开文件:
open(unit = fileid, file = filename)
其中fileid
可以定义为整型变量,并赋予一个值(一般是7~11或更高),或者直接给一个整数就行,只需要注意最后把它关掉close(fileid)
写进txt文件的格式就是参考格式化输出,比如这里要输出一个矩阵,我们对矩阵的行进行循环,每次打印一行。
完整的代码:
open(unit = fileid, file = filename)
do i=1,N
write(fileid,fmt=100) rho(i,:)
100 format(f20.16, ',', f20.16, ',' , f20.16, ',', f20.16 ';')
enddo
close(fileid)
如果是按上述方法写的文件,则可以用下面这段代码去读取
filename = 'result' // trim(adjustl(cTemp1)) // '_' // trim(adjustl(cTemp2)) // '.txt'
Open( fileid , File = filename )
do i=1,N
read(fileid, *) rho(i,:)
end do