圆柱面展开为平面的Fortran 程序

本文介绍了一款使用Fortran编写的程序,该程序能够将圆柱面上的参数转换为平面坐标,便于在Tecplot中进行数据可视化,如云图和流线图的绘制。程序详细介绍了从输入文件读取数据、坐标变换到输出处理后的数据的过程。

在CFD后处理过程中,有时需要将一个圆柱面上的参数展开为一个平面并导入到Tecplot中进行出云图或流线图,这就需要坐标变换,下面的程序就是采用Fortran编写的柱面展开程序。如果有建议,欢迎大家共同交流。

program main

implicit none

integer::i,j,k,n,stat
real*8::theta

character(len=100)str(500000)

real*8,allocatable::x(:),y(:),z(:),L(:),p(:),wv(:),av(:),vr(:),vc(:)    ! 定义几个所需量:x,y,z为圆柱面上点的笛卡尔坐标,

open (11,file='cylinder_tec.dat')      ! 'cylinder.dat_tec'为由fluent输出的tecplot格式的圆柱面参数文件

!跳过前2行,因为tecplot格式的圆柱面参数文件中前2行为头文件,包括:TITLE、VARUABLES
      do i=1,2
           read(11,*) 
      end do

!读取第3行中的N=?,即点的个数,34X可能需要根据N=?所在列的位置而进行改动,n为柱面上点的个数
  read(11,"(34X,i10)")n 
  write(*,*)n
  close(11)
  allocate(x(n),y(n),z(n),L(n),p(n),wv(n),av(n),vr(n),vc(n))  !定义向量的长度
  
  open(11,file='cylinder_tec.dat')     
     do  i=1,4   !跳过前4行,因为tecplot格式输出的文件前3行分别为:TITLE、VARUABLES、ZONE,第4行为空行
        read(11,*) 
     end do
     
    read(11,*)x    !读第1个BLOCK,为x坐标
    read(11,*)      !读空行
    read(11,*)y    !读第2个BLOCK,为y坐标
    read(11,*)      !读空行
    read(11,*)z    !读第3个BLOCK,为z坐标
    read(11,*)      !读空行
    read(11,*)av    !读第4个BLOCK,为相VOF
    read(11,*)      !读空行
    
    read(11,*)p    !读第5个BLOCK,为压力pressure
    write(*,*)x(1),y(1),z(1)  
    
 rewind(11)
 
    j=0
  do while(.true.)
     read(11,*,iostat=stat)
     if(stat.lt.0)  exit
     j=j+1
  end do

  write(*,*) "line=",j
  close(11)
  
    
!坐标变化 
    do i=1,n
       if(abs(z(i))<0.0000001d0.and.x(i)<0) then    !避免z(i)特别小等于0时,atan(x(i)/z(i))计算出错
           theta=-3.1415926d0/2.d0
           write(*,*)x(i),y(i),z(i)
       else if (abs(z(i))<0.0000001d0.and.x(i)>0) then    !避免z(i)特别小等于0时,atan(x(i)/z(i))计算出错
           theta=3.1415926d0/2.d0
           write(*,*)x(i),y(i),z(i)
       else if (z(i)<0.and.x(i)<0) then   !-90度~-180度
           theta=atan(x(i)/z(i))-3.1415926d0
       else if (z(i)<0.and.x(i)>0) then   !90度~180度
           theta=atan(x(i)/z(i))+3.1415926d0   
       else if (z(i)>0)  then   !-90度~90度
           theta=atan(x(i)/z(i))
       end if
   L(i)=theta*sqrt(x(i)**2.d0+z(i)**2.d0)    !弧长L
   end do

   k=CEILING(n/5.d0)   !因为'cylinder.dat_tec'中每一个BLOCK为5列,这里k为每一个BLOCK的行数
   k=5*k+8    !8为前面空的4行+每个BLOCK之间的空行共4行,BLOCK包括:x,y,z,av,p共5个BLOCK

  open(11,file='cylinder_tec.dat')       
  open(12,file='cylinder_tec-post.dat')     !变化之后的输出文件名字


  !将原始文件中的头文件原样书写
  do i=1,4
     read(11,'(a)') str(i)
     write(12,'(a)') str(i)
  end do

  rewind(11)

write(12,'(5(E18.9))') L    !写弧长L的BLOCK
write(12,*)     !写空行
write(12,'(5(E18.9))') y    !写y的BLOCK
write(12,*)     !写空行
write(12,'(5(E18.9))') z    !写z的BLOCK
write(12,*)     !写空行
write(12,'(5(F18.9))') av    !写air-vof的BLOCK
write(12,*)     !写空行
write(12,'(5(E18.9))') p    !写pressure的BLOCK
 
    do i=1,k
    read(11,*)
    end do


    do i=k+1,j
      read(11,'(a)') str(i)
      write(12,'(a)') str(i)
  end  do


  close(12)
  close(11) 
  write(*,*)'over'
  write(*,*)x(1),y(1),z(1)  
 end

 最后将输出的cylinder_tec-post.dat文件导入到tecplot中采用3D绘图并调整为XY视图,这样就完成了柱面展开为平面的操作。
  

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值