fortran 学习记录2
PROGRAM MainIMPLICIT NONEINTEGER Students !学生人数REAL,ALLOCATABLE ::Mark(:)INTEGER IWRITE(*,'(A)',ADVANCE='NO') 'How many students:'READ*,StudentsALLOCATE(Mark(Students))DO I=1,StudentsWRITE(*,"('No.',I5,'''s mark:')",ADVANCE='NO')IREAD*,Mark(I)END DOPRINT*,MarkDEALLOCATE(Mark) !释放内存
END PROGRAM
这里WRITE函数参数里面I后面要指定宽度,否则出现nonnegative width required in format。比如指定I5
PROGRAM PointerIMPLICIT NONEINTEGER,POINTER ::p,qINTEGER,TARGET ::n=5INTEGER ::mp=>nq=>pALLOCATE(p)p=4WRITE(6,'(3I9)')p,q,n
!I后面数字为宽度
!I前面数字为一行输出的数字个数DEALLOCATE(p)
END
PROGRAM LowerTriangularIMPLICIT NONETYPE ROWREAL,DIMENSION(:),POINTER ::REND TYPEINTEGER,PARAMETER ::N=4TYPE(ROW),DIMENSION(N) ::TINTEGER IDO I=1,NALLOCATE(T(I)%R(1:I))T(I)%R(1:I)=1END DODO I=1,NPRINT*,T(I)%R(1:I)END DODO I=1,NDEALLOCATE(T(I)%R)END DO
END
%在fortran中是成员操作符
program main
implicit noneinteger,dimension(10) ::x,y,zinteger ::i,j,k
do 2 i=1,10x(i)=i
do 2 j=1,10y(i)=j*10
do 2 k=1,10z(k)=k*100+x(i)+y(j)
2 continuedo i=1,10write(*,*)z(i)
end doend
以上代码输出结果位210,310,410,510,。。1110
三个do循环共用了label为2的语句相当于三句end do。这里相当于do循环的三重嵌套
fortran定义字符串变量
字符型变量也可以这样定义
CHARACTER*len C等价于CHARACTER(len) C
len代表字符的长度
CHARACTER*len C这样的定义方式使人不由得想起C语言中的指针。
program main
implicit none
character*5 ch1
character(5) ch2
ch1="fggg"
ch2="chinese"
write(*,*) ch1
write(*,*) ch2!ch2只输出chine,因为定义的字符串长度为5,过长的部分被截断
end
F77程序到F90程序的迁移
http://owen.sj.ca.us/~rk/howto/slides/f90model/slides/modcomm.html
Modules can provide an extremely robust alternative to the Fortran 77 COMMON BLOCK
f77中的common block与equivalence语句
f77的common block用modules来代替
Common statement – use modules
在fortran90文件中
不要使用COMMON 公共块:使用Modules 参数列表代替公共块向子程序传递数据;
不要使用EQUIVALENCE 等价语句:Fortran90 中,由于模块、动态存储、指针、数据结构以及固有函数transfer 的引用,没有必要继续使用EQUIVALENCE 语句;
F77的格式,既为F90/95中的固定格式。
(cite fromhttp://micro.ustc.edu.cn/Fortran/ZJDing/Sec1-3.htm)
f77中有goto语句,在f90及以上版本时尽量不要使用,goto语句破坏了语句顺序执行的正常情况,不符合结构化规则
fortran运算符
大于: >或者.gt.
大于等于:>= 或者.ge.
小于:<或者.lt.
小于等于 .le. 或者<=
相等
.eq. 或者==
不相等
.ne. 或者/=
之前以为fortran不能直接像其他编程语言一样直接使用>,<,>=,<=原来是理解错了
fortran循环的控制
可以使用exit跳出循环,如同C语言的break那样
使用cycle,跳过cycle后面的循环中的语句,跳到循环的下一次迭代的执行
比如下例输出1,2,3,5,6
1 program main2 implicit none3 integer ::i4 do i=1,65 if(i .eq. 4)cycle6 print*,i7 end do8 end
fortran如下错误的解决方案
module文件中定义指定大小的数组
A specification expression object must be a dummy argument, a COMMON block object, or an object accessible through host or use association
An automatic object must not appear in the specification part of a module
实例如下
比如我在module文件中定义了一个
integer :: size=100
integer, dimension(size) :: arr
由于编译器编译的时候size的大小是未知的,所以就会报出以上错误,可以将数组大小的变量定义为parameter即可
比如
integer,parameter ::size=100
integer,dimension(size) ::arr
这与C++中其实是一样的
试图将一个kind=4的real类型实参来调用
子程序参数为kind=8的real类型将会出现严重的错误
或者是用形参为integer类型的用real类型的实参都会出现严重错误
总之调用的实参与形参之间类型要完全匹配
与此相反的是,普通的赋值语句之间类型要求并不是那么严
例子如下
下列子程序中输出的a会出现严重错误
直接赋值给y倒是没有出现太大的错误
可以使用real函数进行转换
比如y=real(x,8)
program main2 implicit none3 real(kind=4) ::x=0.64 real(kind=8) ::y5 y=x6 print*,y7 call func(x)8 end9 10 subroutine func(a)11 implicit none12 real(kind=8) a13 print*,a14 end
fortran如何在指定字节处读取文件
比如要从输入文件中读取单精度浮点(real(kind=4))的数据
需使用文件的直接读取访问,在open的access属性中指定为direct
首先先把文件中模块单元的长度设为4,在open的recl属性中指定,
然后在read语句中指定在哪一个数据段读取,比如要读取第10000个数据,则指定rec=10000.
例子如下(在fortran90下验证通过)
implicit none
real(kind=4) ::temp
integer ::i
integer ::pos=160*8print*,posopen(14,file='input.dat',access='direct',recl=4,form='unformatted')
do i=1,5
read(14,rec=pos+i)temp
print*,temp
end do
close(14)
end
fortran pause语句
pause语句会暂停当前程序的执行,输入enter键后程序会继续执行
看到有的程序写的pause 1
这个1其实就是程序执行pause语句给出的提示,pause 1会输出1的提示字符
如果pause 'warning'则会输出warning字符
有时在引用模块中的变量的时候,可能局部变量与模块中定义的变量之间存在冲突,
这时可以对模块中的变量改名
引用自:http://micro.ustc.edu.cn/Fortran/ZJDing/Sec6-3.htm
模块内的变量改名:
如果需要对多个模块进行访问,而在不同的模块中可能用到了相同的名字,因此允许USE语句对被访问的实体重新命名,以解决局部实体和模块中访问实体之间的名字冲突问题。要重新命名时,USE语句具有下列形式:
USE 模块名 [,改名列表]
其中,改名列表的形式为:局部名1=>块中名1, 局部名2=>块中名2, …。其中,局部名是使用USE语句的程序单元中用的名字,块中名是待改的模块内部使用的变量名。
如模块中定义的变量名是A、B,程序单元中同名变量A、B与之共享,但若要在程序单元中把变量名改为C、D,则只需在单元内把引用语句写成:
USE模块名, C=>A, D=>B
即可,而无需修改模块。
FORTRAN格式编辑符
编辑符重复
在格式输出的时候,有事需要重复使用格式编辑符
比如6F8.2
6代表重复的次数,F8.2以为宽度为8,小数点后为2位,输出的6个数都是F8.2格式
fortran77程序向fortran90的迁移
比如下程序do while处原来是个语句标号
比如30,在30之后的有多条语句在若干条件满足的时候有goto 30的语句
此时可以将30语句改为do while(.true.)
然后goto 30语句改为cycle即可
1 program main2 integer ::i3 i =14 do while(.true.)5 i=i+16 if(i<5)then7 print*,'i=',i-8 cycle9 end if10 print*,'ii=',i11 cycle12 end do13 end-
Fortran单精度浮点数(即4字节real)与双精度浮点数(即8字节real)之间的转换
若把4字节real赋值给一个8字节real,或者运算的时候4字节real与8字节real混合运算不会产生问题。也可以用real函数进行转换。
但是如何调用subroutine的时候,把4字节的real赋值给参数中的8字节real或者把8字节的real赋值给4字节的real就会产生重大错误。
因为fortran中subroutine的参数传递是按引用传递(pass by reference)。传递的是参数的地址,所以参数类型不一致时会产生较大错误
以下文字引用自
http://www.stanford.edu/class/me200c/tutorial_77/12_arrays2.html
Fortran subprogram calls are based on call by reference. This means that the calling parameters are not copied to the called subprogram, but rather that the addresses of the parameters (variables) are passed. This saves a lot of memory space when dealing with arrays. No extra storage is needed as the subroutine operates on the same memory locations as the calling (sub-)program. However, you as a programmer have to know about this and take it into account.
program main3 implicit none4 real(kind=4) ::a5 real(kind=8) ::b6 7 a=0.18 b=0.29 print*,a,b10 b=a11 print*,b12 a=b13 print*,a14 a=b*0.515 print*,a16 b=a*217 print*,b18 b=0.119 print*,b20 a=0.121 b=0.222 23 call test1(b,a)24 25 end-26 27 subroutine test1(a,b)28 implicit none29 real(kind=4) ::a30 real(kind=8) ::b31 print*,'in sub=','a=',a,'b=',b32 end subroutine
程序输出
0.1000000 0.200000002980232
0.100000001490116
0.1000000
5.0000001E-02
0.100000001490116
0.100000001490116
in sub=a= -1.0842022E-19 b= 5.122630465115234E-315
fortran 学习记录2相关推荐
- FORTRAN学习记录(持续更新)
FORTRAN: .f的后缀,表示固定格式: .f90的后缀,表示自由格式. 固定格式用'C'开头(必须在行首)表示注释+C后面用tab缩进,否则编译错误. 自由格式用'!'开头表示注释,!后面不用缩 ...
- Fortran学习记录1(Fortran数据类型)
Fortran中的字符 Fortran中的常量 Fortran中的变量 Fortran的I-N规则 Fortran中的有效位数 Fortran中的申明 Fortran中的表达式 Fortran中的语句 ...
- Fortran语言学习记录
Fortran语言学习记录** ** 今天是2020年4月1日,上午终于把微软的Visual Studio 2013(https://blog.csdn.net/wobckr/article/deta ...
- Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)
Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...
- HTML5与CSS3权威指南之CSS3学习记录
title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) ...
- springboot @cacheable不起作用_Springboot学习记录13 使用缓存:整合redis
本学习记录的代码,部分参考自gitee码云的如下工程.这个工程有详尽的Spingboot1.x教程.鸣谢! https://gitee.com/didispace/SpringBoot-Learnin ...
- 【Cmake】Cmake学习记录
Cmake学习记录 1.1 常例 add_library(gen_reference_infogen_reference_info/gen_reference_info.hgen_reference_ ...
- ASP.NETCore学习记录(一)
ASP.NETCore学习记录(一) asp.net core介绍 Startup.cs ConfigureServices Configure 0. ASP.NETCore 介绍 ASP.N ...
- Android开发技术周报176学习记录
Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...
- add函数 pytorch_Pytorch学习记录-Pytorch可视化使用tensorboardX
Pytorch学习记录-Pytorch可视化使用tensorboardX 在很早很早以前(至少一个半月),我做过几节关于tensorboard的学习记录. https://www.jianshu.co ...
最新文章
- android 白天和夜间模式切换时闪屏问题处理方法
- python四则运算_四则运算 python
- 最大的矩形(ccf)
- 27个提升效率的iOS开源库推荐
- linux命令总结:cat
- js里用append()和appendChild有什么区别?
- PVID、Access、Trunk、Hybrid三种不同端口收发规则、Vlan中tagged端口和untagged端口的区别
- java 坦克大战设计论文,java坦克大战毕业设计论文
- 一句powershell调用mimikatz抓密码
- html5 在线留言,html5实现手机弹窗留言对话框
- 【斗鱼直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)
- Adobe Photoshop简介
- 冯诺曼伊体系 计算机五大逻辑,科学网—再谈冯·诺伊曼结构 - 姜咏江的博文
- Vue中的this.$nextTick方法的使用 [前端][Vue框架]
- python 函数式编程及递归
- Python实现xbox手柄控制Tello无人机
- 带你走进程序猿的内心世界
- 基本磁盘和动态磁盘是硬盘的两种配置类型,Win10可识别动态磁盘
- 阿里云对象云存储oss
- Google spdy协议
热门文章
- 用linux运行vasp,科学网—VASP使用 - 李继存的博文
- html5双日期时间选择控件,bootstrap daterangepicker双日历时间段选择控件详解
- esxi6.7封装nvme驱动
- 超市管理系统连接服务器失败,国内超市管理系统的使用现状
- SAP UI5 控件库里 Form 控件和 SimpleForm 控件的区别和联系讲解试读版
- android java语言_android可以用java语言开发吗
- 【MCM-2017】2017年数学建模美赛题目原文及翻译-A (个人思路)
- SpringBoot+Vue项目个性化音乐推荐系统
- i印通校园自助打印系统
- xp系统qq安装不上网络连接服务器,xp系统安装QQ提示“安装文件失败”如何解决...