Fortran实用编程 基础篇——语法之标准函数_第1页
Fortran实用编程 基础篇——语法之标准函数_第2页
Fortran实用编程 基础篇——语法之标准函数_第3页
Fortran实用编程 基础篇——语法之标准函数_第4页
Fortran实用编程 基础篇——语法之标准函数_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Fortran 实用编程Fortran Coder 研讨团队系列视频教程关于 Fortran CoderFortran Coder 始于2006年,是一个以科学计算编程为主题的非盈利性研讨团体。大多数由各行业高等学府学生,研究人员及生产一线的工作人员组成。研讨内容涉及:Fortran77/90/95/2003/2008语法规范,各平台32位及64位编译器,IMSL,MKL,Lapack 等数学函数库,MPI,OpenMP,Coarray 并行及高性能计算,winteracter / DisLin / Matfor / GTKFortran 等绘图及界面库。关于本套视频本套视频以解决实际问题为主

2、要目的,旨在为您解答课本上较少涉及到的实际问题。通过本套视频,您会更容易了解:如何查找错误?如何解决错误?如何学习 Fortran2003 和 Fortran2008 语法?如何用最通俗易懂的写法解决实际问题?如何看懂别人的优秀代码并为自己所用?如何让自己的代码更优美、更普适?本套视频由 Fortran Coder 研讨团队录制,供所有 Fortran 程序员和学习者免费自由的观看,您可随意的传播它。但请保证视频完整性。我们将会不定期的更新本套视频,请持续关注我们的网站、QQ群!同时,如果您对 Fortran 相关有自己的见解,并愿意通过录制视频的方式与其他人分享,请联系我们!上节要点回顾文件

3、只有两种:文本文件和二进制文件,这是文件的本质读取二进制文件三种方式:顺序、直接、流文件读取顺序读取每笔记录可以不同长度,前后各4字节表示长度。是fortran特殊的文件格式。直接读取每笔记录必须一样长,适合规则的数据格式。流文件集各种优势于一身。简单,方便,快捷,完全可以替代前两种读写方式。第十二讲基础篇 第十二讲语法之标准函数讲解人:雪球gao讨论QQ群:23380211标准函数的一般问题2数学数值函数3字符串和数组函数目 录4其他函数标准函数的一般问题Fortran是一门编译型语言,虽然设计初衷是用于科学数值计算。但它是较底层的,因此仅提供了非常底层的数学函数。绝大多数高层的数学问题,我

4、们需要独立书写代码来实现。语法内的函数虽然不多,但各有各的用法,与Excel / C / Matlab等也有差异。因此,手边尽量备一个文档待查。(例如编译器的帮助文档)下面简单介绍一下 IVF 帮助文档的查阅。标准函数的一般问题Fortran的函数,有严格的参数类型和返回值类型!虽然很多语法内的函数提供了不同数据类型的版本,但并不是每一种都有!比如 exp 函数,他提供了real(4) / real(8) / real(16)complex(4) / complex(8) / complex(16)但并没有提供 integer 的版本,因此:y = exp( 2 ) 是错误的写法应该写为: y

5、 = exp( 2.0 )在IVF帮助文档中,绿色通常表示不规范写法标准函数的一般问题Fortran多数内部的数值函数有 Generic Name ,也有 Specific Name 绝大多数情况下,用 Generic Name 就足够了。比如 sqrt 函数,他提供了real 4/8/16 complex4/8/16分别的名字叫 DSQRT/CSQRT 等但实际上,只要对应的实参是real8编译器就会选择用DSQRT来计算: y = SQRT( 4.0d0 )只有极少数情况下,才必须使用Specific Name例如,输入和输出的类型不一致,或者多个参数类型不一致。标准函数的一般问题Fort

6、ran的大多数内部函数,还是逐元函数(Elemental)。所谓逐元,简单理解,就是但凡参数是单变量的,都可以是任意维度的数组y = sin( x )Do i = 1 , N y(i) = sin( x(i) )End DoReal : x(3,5) , y(3,5)y = sin( x )y(1:2,:) = sin( x(1:2,:) )标准函数的一般问题举例: a = a * 25 关于优化:优秀的编译器提供优秀的优化方案,优化的作用是,使得计算方法通过一定的变换实现更快的执行。b = a * 4 + aa = b * 4 + b优化水平的高低是不同编译器的主要差别体现!对于同一个数学问

7、题,我们自己写代码实现,往往不如编译器厂家优化效果好。因此,绝大多数问题,如果能用语法内的函数,就不要自己写代码。1标准函数的一般问题2数学数值函数3字符串和数组函数目 录4其他函数数学数值函数类型转换函数:r = real( x ) 把 x 转换成 real 类型r = real( x ,kind=8) 把 x 转换成 kind=8 的real类型(双精度)r = float( x ) / r = dble( x )r = int( x ) 把 x 转换成 integer 类型r = int( x , kind=8) 把 x 转换成 kind=8 的integer类型(长整型)r = nin

8、t( x ) 四舍五入并转换c = cmplx( a , b ) 把 a 和 b 转换为复数,分别为实部/虚部r = cmplx(a,b,kind=8)如果 a b 都是常数,也可写为 c = (1.0,2.0)数学数值函数内部文件转换:write( 字符串 , * ) 其他数值其他类型转字符串read( 字符串 , * ) 其他数值字符串转其他类型write( str , * ) 9.0!/ str = 9.000000read( str , * ) i!/ i = 9.0本系列视频教程有专门的内部文件介绍数学数值函数一般数值函数:i = ceilng( r ) 天花板函数,返回大于等于x的

9、最小整数(kind)i = floor( r ) 地板函数,返回小于等于x的最大整数(kind)ri = abs( ri ) 绝对值函数c = conjg( c ) 复数取共轭ri = max( ri1 , ri2 , ri3 . ) 最大值函数ri = min( ri1 , ri2 , ri3 . ) 最小值函数ri = mod( a , b ) 取余数函数.数学数值函数三角函数(标准都是弧度值):r = sin( r ) 正弦函数r = cos( r ) 余弦函数r = tan( r ) 正切函数r = asin( r ) 反正弦函数r = cos( r ) 反余弦函数r = atan(

10、r ) 反正切函数r = atan2( r ) 反正切函数2在上述函数后面加 h ,便是双曲三角函数在上述函数后面加 D,便是角度制的三角函数,但不标准,不建议使用。数学数值函数其他数学函数:r = log( r ) 自然对数函数r = log10( r ) 对数10为底函数(换底公式)r = exp( r ) 自然对数指数函数向量矩阵数学函数:c = dot_product( a , b ) 内积函数b = transpose( a ) 把m*n矩阵转置为n*m矩阵c = matmul( a , b ) m*n矩阵与n*l矩阵相乘,得m*l矩阵在这里,我们不列举所有数学函数了。朋友们如有疑问

11、,请别忘记“文档”是最好的老师1标准函数的一般问题2数学数值函数3字符串和数组函数目 录4其他函数字符串和数组函数灵活的使用字符串函数,可以实现很多类似批量化处理的功能。语法中的:文件名,格式符,都是字符串。并且允许使用变量因此动态的变化字符串变量,可以实现动态的文件名和格式符。str = trim( str ) “Hello” = “Hello”去掉字符串尾部的空格(返回短的字符串)str = adjustl( str ) “Hello” = “Hello”左对齐字符串(返回字符串长度不变)str = adjustr( str ) “Hello” = “Hello”右对齐字符串(返回字符串长

12、度不变)New_line() 返回一个回车符(不同操作系统不同)字符串和数组函数c = char( i ) 返回编码为 i 的字符 c = achar( i )i = ichar( c ) 返回c的编码 i = iachar( c )i = len( c )返回字符串的长度(定义长度)i = len_trim( c )返回字符串的长度(trim长度)i = index( c , cf , back ) 在字符串c中查找 cf第一次出现的位置,可指定 back=.true. 从后面查询例如:c = My NAME is fcodei = index( c , is)write(*,*) c(i+

13、3:) !/ 输出 fcode再例如:filename= D:mydata201520150314.txti = index( filename , , back=.true. )write(*,*) filename(i+1:) !/ 输出 20150314.txt字符串和数组函数i = scan( c , cf , back ) 在字符串c中查找 cf中的每一个字符,返回第一次出现的位置可指定 back=.true. 从后面查询例如:c = 3*4=12i = scan( c , =*) !/ i = 2,第二个字符是等号或星号i = Verify( c , cf , back ) 在字符

14、串c中查找不属于 cf 中的字符,返回第一次出现的位置可指定 back=.true. 从后面查询例如:c = 500?0919851216775Xi = Verify( c , 1234567890X) !/ i = 4 第4个字符非法字符串和数组函数数组函数,灵活使用可减少很多循环代码。b = reshape( array , shape )重新设置数组的外形例如:integer : a(6) = 1,2,3,-5,3,0 , b(3,2)b = reshape( a , shape(b) )b = reshape( a , 3,2 ) !/ shape(b) = 3,2!/ b = 1,2

15、,3-5,3,0integer : b(3,2) = 1,2,3,-5,3,0integer : b(3,2) = reshape(1,2,3,-5,3,0,3,2)字符串和数组函数b = all( array , dim )判断逻辑数组元素是否全是真数组整体操作做判断,结果正是逻辑数组。例如:integer : a(5) = 1,2,3,-5,3if ( all( a 0 ) ) then!/判断是否 a 全部大于 0a 1,2,3,-5,3a0.true.,.true.,.true.,.false.,.true.all(a0).false.字符串和数组函数b = any( array ,

16、dim )判断逻辑数组元素是否至少有一个是真例如:integer : a(5) = 1,2,3,-5,3if ( any( a = 0 ) ) then!/判断 a 中是否有至少一个小于等于0?a 1,2,3,-5,3a=0.false.,.false.,.false.,.true.,.false.any(a=0).true.all 和 any 可以相互转换:if ( all( 满足 ) ) 等效于if( .Not.any( .Not.满足 ) ) 字符串和数组函数any , all 带 dim 维度他们可以用来把一个多维数组按低一级维度来分别处理。Program www_fcode_cn I

17、mplicit None Integer : a(3,3) = & reshape(11,2,3,14,5,6,7,8,9,3,3) write(*,*) all(a 0 ) !/输出 a 数组中大于 0 的元素个数a 1,2,3,-5,3a0.true.,.true.,.true.,.false.,.true.count(a0)4字符串和数组函数n = maxval( array , dim ,mask )获得数组中最大值,可附带条件,也可指定 dim 维度(同前面all的dim)例如:integer : a(5) = 1,2,3,-5,3maxval( a , mask=(a3) ) !/

18、求a中所有小于3的最大值a 1,2,3,-5,3a3.true.,.true.,.false.,.true.,.false.maxval(a)2n = minval( array , dim ,mask )获得数组中最小值,可附带条件字符串和数组函数m,n,. = maxloc( array , dim ,mask )获得数组中最大值的下标,可附带条件,也可指定 dim 维度例如:integer : a(5) = 1,2,3,-5,3maxloc( a , mask=(a3) ) !/求a中所有小于3的最大值的位置a 1,2,3,-5,3a3.true.,.true.,.false.,.tru

19、e.,.false.maxloc(a)2n = minloc( array , dim ,mask )获得数组中最小值的下标,可附带条件n = sum(maxloc(a)字符串和数组函数array = cshift( array , n , dim )对数组进行圆周平移例如:integer : a(5) = 1,2,3,-5,3a = cshift( a , 2 ) !/ 平移后 a 为 3,-5,3,1,2可以使用 dim 指定按列平移,按行平移等1114725836971114825936cshift( a , -1 , dim=1 )类似的 eoshift 进行单向的平移,超出的部分不循环填充1标准函数的一般问题2数学数值函数3字符串和数组函数目 录4其他函数其他函数其他函数主要是功能性的i = Command_Argument_Count

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论