主题:[转帖]Fortran写txt 文件,每行输出个数不确定
原文链接:
http://blog.sina.com.cn/cuiocean
在Fortran中有的时候要输出一个二维或三维数组,比如流速等。这个时候我们希望每一行能够写入多个数据。
加入我们有二维流场u(i,j). i=1,imax. j=1,jmax. 输出的时候我们希望文件中每一行输出u中的每一行或每一列。一般情况下,我们可以用 write(fid,'(10f12.6)', u(i,:)这种方法输出。但这个是数字10,必须是已知的。因为write里面的fmt部分,不允许用变量名。比如不能写成 write(fid,'(jmaxf12.6)', u(i,:)
解决办法就是先将数字写成string,然后拼接成我们需要的fmt格式。例子如下:
PROGRAM test_write
IMPLICIT NONE
INTEGER :: i,j, imax,jmax
CHARACTER(50) :: xstring
REAL(KIND=8),DIMENSION(:,:), ALLOCATABLE :: u
! u为流场,先定义它的大小,imax,jmax
imax = 100;
jmax = 10;
ALLOCATE(u(imax,jmax)) !分配空间
! Define the array u,这里随意给了几个值
DO i=1,100
DO j=1,10
u(i,j) = i+j
ENDDO
ENDDO
! Open the file to output,分四种情况,对比输出结果
OPEN(11,file='test_output1.txt')
OPEN(12,file='test_output2.txt')
OPEN(13,file='test_output3.txt')
OPEN(14,file='test_output4.txt')
!Method 1: Two loops
! 循环两次,每次输出u(i,j), 输出结果是一竖列的值,
DO i = 1, imax
DO j= 1, jmax
WRITE(11,'(f12.6)') u(i,j)
ENDDO
ENDDO
!Method 2: inner loop
!输出的时候,循环可以写到write这句里面
DO i = 1, imax
WRITE(12,'(f12.6)') (u(i,j),j=1,jmax)
ENDDO
!Method 3: Already know the size of the array
!如果已知每行要输出的个数,可按如下输出,每行10个
DO i = 1, imax
WRITE(13,'(10f12.6)') (u(i,j),j=1,jmax)
ENDDO
!Method 4: The size of the array varies
!当事先不知道每行要输出多少个,或者说数组大小会一直变,又不想每次都去更改程序的输出语句的时候,利用下面的方法
DO i = 1, imax
WRITE (xstring,1000) jmax !把数字转换为字符串
1000 FORMAT(I3)
xstring = '('//trim(ADJUSTL(xstring))//'f12.6)' !拼接为要求的format格式
xstring = TRIM(ADJUSTL(xstring))
WRITE(14,xstring) (u(i,j),j=1,jmax) !利用此格式输出。
ENDDO
END
原文链接:
http://blog.sina.com.cn/s/blog_618af1950100k24a.html
http://blog.sina.com.cn/cuiocean
在Fortran中有的时候要输出一个二维或三维数组,比如流速等。这个时候我们希望每一行能够写入多个数据。
加入我们有二维流场u(i,j). i=1,imax. j=1,jmax. 输出的时候我们希望文件中每一行输出u中的每一行或每一列。一般情况下,我们可以用 write(fid,'(10f12.6)', u(i,:)这种方法输出。但这个是数字10,必须是已知的。因为write里面的fmt部分,不允许用变量名。比如不能写成 write(fid,'(jmaxf12.6)', u(i,:)
解决办法就是先将数字写成string,然后拼接成我们需要的fmt格式。例子如下:
PROGRAM test_write
IMPLICIT NONE
INTEGER :: i,j, imax,jmax
CHARACTER(50) :: xstring
REAL(KIND=8),DIMENSION(:,:), ALLOCATABLE :: u
! u为流场,先定义它的大小,imax,jmax
imax = 100;
jmax = 10;
ALLOCATE(u(imax,jmax)) !分配空间
! Define the array u,这里随意给了几个值
DO i=1,100
DO j=1,10
u(i,j) = i+j
ENDDO
ENDDO
! Open the file to output,分四种情况,对比输出结果
OPEN(11,file='test_output1.txt')
OPEN(12,file='test_output2.txt')
OPEN(13,file='test_output3.txt')
OPEN(14,file='test_output4.txt')
!Method 1: Two loops
! 循环两次,每次输出u(i,j), 输出结果是一竖列的值,
DO i = 1, imax
DO j= 1, jmax
WRITE(11,'(f12.6)') u(i,j)
ENDDO
ENDDO
!Method 2: inner loop
!输出的时候,循环可以写到write这句里面
DO i = 1, imax
WRITE(12,'(f12.6)') (u(i,j),j=1,jmax)
ENDDO
!Method 3: Already know the size of the array
!如果已知每行要输出的个数,可按如下输出,每行10个
DO i = 1, imax
WRITE(13,'(10f12.6)') (u(i,j),j=1,jmax)
ENDDO
!Method 4: The size of the array varies
!当事先不知道每行要输出多少个,或者说数组大小会一直变,又不想每次都去更改程序的输出语句的时候,利用下面的方法
DO i = 1, imax
WRITE (xstring,1000) jmax !把数字转换为字符串
1000 FORMAT(I3)
xstring = '('//trim(ADJUSTL(xstring))//'f12.6)' !拼接为要求的format格式
xstring = TRIM(ADJUSTL(xstring))
WRITE(14,xstring) (u(i,j),j=1,jmax) !利用此格式输出。
ENDDO
END
原文链接:
http://blog.sina.com.cn/s/blog_618af1950100k24a.html