
fortran代码转python技巧.docx
10页fortran代码转python技巧Fortran中的 I/O 格式化用法格式化:用来指定程序打印输出变量的具体形式,如位置、有效位数等READ(* , *)和WRITE(* , *)括号中第二个*号均表示采用自由格式,此时输出中经常有多个额外的空格,且格式往往不统一因此,可以采用格式化输出模式(采用格式描述符),来指定具体样式1.用法(READ和WRITE一致)采用FORMAT语句,并且结合语句标号(行号)来使用,如:INTEGER:: a = 123WRITE(*,100) a100 FORMAT( ' ' , I5 ) ! 100是语句标号,将a变量用I5形式输出; ' '前面放置空格,实际上可以不要直接在第二个*号中指定具体样式,如:INTEGER:: a = 123WRITE(*,"(I5)") a ! 单引号也可以,如 WRITE(*,'(I5)')2.格式描述符3.WRITE使用对象1) 整数输出(I)具体使用格式为:rIw 或 rIw.m,具体用法见上述须注意:整数在输出域内为右对齐;字符个数超出域宽,输出时会用*号填充;I0是特殊描述符,可以输出任意整数,而不需担心域宽不足。
具体例子:PROGRAM my_testIMPLICIT NONEINTEGER:: a = -123 , b , c = 5 , d = 12345b = a+123WRITE(,100) a , b , c , d WRITE(,101) a , b , c , d WRITE(,200) a , b , c , d WRITE(,201) a , b , c , d WRITE(,300) a , b , c , d WRITE(,400) a , b , c , d100 FORMAT( ’ ’ , I5 , I5 , I6 , I10) 101 FORMAT( ’ ’ , 2I5 , I6 , I10) ! 用了rIw中的r 200 FORMAT( ’ ’ , 2I5.0 , I6 , I10.6) ! 用了rIw.m中的r和m,m是至少显示的位数,这里是0,则输出必须要≥0位,由于b的数值为0,因此没有显示值 201 FORMAT( ’ ’ , 2I5.2 , I6 , I10.6) ! 输出必须≥1位,b要显示出“00” 300 FORMAT( ’ ’ , 2I5 , I6 , I3) ! d的数值有5位,但域宽只有3位,装不下,因此输出“ * ”作为警告s 400 FORMAT( ’ ’ , 4I0) ! 特殊零长度描述符,使整数完整显示出来,此时的域宽w就是整数的长度,总是能够容纳进去STOP END PROGRAM my_test相应结果为:-123 0 5 12345 -123 0 5 12345 -123 5 012345 -123 00 5 012345 -123 0 5***-12305123452) 实数输出(F)具体使用格式为:rFw.d ,具体用法见上述。
须注意:实数在输出域内为右对齐;字符个数超出域宽,输出时会用*号填充;当字符小于域宽时,整数部分在左侧用空格填充,小数部分在右侧用0填充具体例子:PROGRAM my_test_FIMPLICIT NONEREAL:: a = -123. , b , c = 5.2456b = a+123.WRITE(,100) a , b , c WRITE(,200) a , b , c WRITE(,300) a , b , c WRITE(,400) a , b , c100 FORMAT( ’ ’ , F5.0 , F6.0 , F6.4) ! a、b变量,右对齐,左侧填空格;所有变量均使用了rFw.d中的d,即小数位数 200 FORMAT( ’ ’ , F5.0 , F6.0 , F6.3) ! c变量,由于只要求输出3位小数,因此四舍五入了 300 FORMAT( ’ ’ , F5.0 , 2F6.3) ! b变量,即使0没有小数,但也要补充完整;同时,使用了rFw.d中的r 400 FORMAT( ’ ’ , F5.0 , F6.3 , F3.2) ! c变量,由于需要输出2位小数,但域宽为3,而包含小数在内要4个字符宽(5.25),因此超出域宽,用*号填充STOP END PROGRAM my_test_F相应结果为:-123. 0.5.2456 -123. 0. 5.246 -123. 0.000 5.246 -123. 0.000***3) 实数输出(E)具体使用格式为:rEw.d ,具体用法见上述。
须注意:不是标准的科学计数法,代表(0.1~1)×10n;域宽需要满足一定的条件:w≥d+7,如精确至2位小数则有±0.ddE±aa,共9位字符;精确至5位小数则有±0.dddddE±aa,共12位字符特殊时候,数字前面的±和0在某种情况下可以省略(见下述具体例子),因此该条件不是硬性条件,但由于能够满足所有情况且可视化效果较好,建议使用该条件;同理,字符位数超出域宽时,会用*号填充具体例子:PROGRAM my_test_EIMPLICIT NONEREAL:: a = -123. , b , c = 52456.b = a+123.WRITE(,100) a , b , c WRITE(,200) a , b , c WRITE(*,300) a , b , c100 FORMAT( ’ ’ , 2E9.2 , E11.4) ! rEw.d,最好要满足 w≥d+7,a,b变量是2位小数,c变量是4位 200 FORMAT( ’ ’ , E8.2 , E8.2 , E13.6) ! a变量, w<d+7,但是不影响,因为正负符号或者整数位上的0可以省略 300 FORMAT( ’ ’ , E7.2 , E7.2 , E13.6) ! 域宽条件:负数可以为w≥d+6,正数可以为w≥d+5(针对整数位为0),否则会用 * 号填充STOP END PROGRAM my_test_E相应结果为:-0.12E+03 0.00E+00 0.5246E+05 -.12E+030.00E+00 0.524560E+05 *******.00E+00 0.524560E+054) 实数输出(ES)具体使用格式为:rESw.d ,具体用法见上述。
须注意:标准的科学计数法,代表(1~10)×10n;具体用法与E相同,域宽满足一定条件:w≥d+7,该条件同样不是十分严格,但是均能避免不利情况,因此建议使用该条件;同理,字符位数超出域宽时,会用*号填充具体例子:PROGRAM my_test_ESIMPLICIT NONEREAL:: a = -123. , b , c = 52456.b = a+123.WRITE(,100) a , b , c WRITE(,200) a , b , c WRITE(*,300) a , b , c100 FORMAT( ’ ’ , 2ES9.2 , ES11.4) ! rEw.d,最好要满足 w≥d+7,a,b变量是2位有效数字(小数),c变量是4位 200 FORMAT( ’ ’ , ES8.2 , ES8.2 , ES13.6) ! w<d+7,a变量,域宽已经受限,b变量不影响,因为开始的符号或者整数位上的0可以省略 300 FORMAT( ’ ’ , ES7.2 , ES7.2 , ES13.6) ! 如果负数必须为w≥d+7,正数可以为w≥d+6(对于整数位为0,则可以w≥d+5),否则会用 * 号填充STOP END PROGRAM my_test_ES相应结果为:-1.23E+02 0.00E+00 5.2456E+04 ********0.00E+00 5.245600E+04 *******.00E+00 5.245600E+045) 逻辑输出(L)具体使用格式为:rLw ,具体用法见上述。
须注意:输出结果为T或F;L0会报错,因此总是可以输出结果具体例子:PROGRAM my_test_LIMPLICIT NONELOGICAL:: a =.TRUE. , b = .FALSE.WRITE(,100) a , b WRITE(,200) a , b100 FORMAT( ’ ’ , 2L5) ! 意义明确,不过过多解释 200 FORMAT( ’ ’ , 2L1)STOP END PROGRAM my_test_L相应结果为:T FTF6) 字符输出(A)具体使用格式为:rA 或 rAw,具体用法见上述须注意:输出结果为整个字符或切片后的字符;A0会报错,因此总是可以输出结果具体例子:PROGRAM my_test_AIMPLICIT NONECHARACTER(len=18):: a = "This is my_test_A."WRITE(,100) a WRITE(,200) a WRITE(*,300) a100 FORMAT( ’ ’ , A) ! 输出定义的字符串 200 FORMAT( ’ ’ , A25) ! 设置域宽为25,域宽大于定义长度,右对齐,左侧填充空格 300 FORMAT( ’ ’ , A6) ! 设置域宽为6,域宽小于定义长度,只显示局部相当于切片STOP END PROGRAM my_test_A相应结果为:This is my_test_A. This is my_test_A.This i7) 水平定位(X和T)具体使用格式为:nX 和 Tc,具体用法见上述。
须注意:nX表示在变量间插入n个空格;Tc表示将输出位置移动到本行中的第c个字节具体例子:PROGRAM my_test_X_TIMPLICIT NONEINTEGER::a = 123 , b = 55CHARACTER(len=5)::c = 'abcde'CHARACTER(len=3)::d = 'KJH'WRITE(,100) a , b , c WRITE(,200) a100 FORMAT( ’ ’ , T1 ,I3 , 1X , I2 , 1X , A5 , 1X , A3) ! 先跳到本行中第1个字符位置,然后逐一输出,每个变量用1个空格分隔 200 FORMAT( ’ ’ , T10 , I3) ! 先跳到本行中第10个字符位置,然后输出a变量STOP END PROGRAM my_test_X_T相应结果为:123 55 abcde 1238) 垂直定位(/)换行符,使用:可以或不使用逗号分隔换行符;多个/表示多次换行具体例子:PROGRAM my_test_1IMPLICIT NONEINTEGER::a = 123 , b = 55CHARACTER(len=5)::c = 'abcde'WRITE(,10。