只适用于二维情况下的矩形,超级简单的程序,带的参数也少,是自己写的第一个程序~哈哈
初温为0,边界条件自己设定
PROGRAM HEATTRANSFER_2D IMPLICIT NONE CHARACTER :: FILENAME*30,STEP*6 INTEGER :: XMAX,YMAX,ZMAX,N,NMAX,STEPD INTEGER :: I,J,K,S(4) REAL :: DX,DY,DT,DT0,Kr,T0(1:4),A,B,T REAL,ALLOCATABLE :: X(:,:,:),Y(:,:,:),Z(:,:,:),TEMP(:,:,:) WRITE(*,*) "PLEASE INPUT FILENAME:" READ(*,*) FILENAME !----------------------------------------------------读取网格文件-------------------------------------------------------------------------- OPEN(10,FILE=TRIM(FILENAME)) !Read Mesh File READ(10,*) XMAX,YMAX !Get Mesh Size ZMAX=1 ALLOCATE(X(XMAX,YMAX,ZMAX),Y(XMAX,YMAX,ZMAX),Z(XMAX,YMAX,ZMAX)) !生成网格坐标存储空间 ALLOCATE(TEMP(XMAX,YMAX,ZMAX)) !生成温度存储空间 READ(10,*) (((X(I,J,K),I=1,XMAX),J=1,YMAX),K=1,ZMAX),(((Y(I,J,K),I=1,XMAX),J=1,YMAX),K=1,ZMAX),(((Z(I,J,K),I=1,XMAX),J=1,YMAX),K=1,ZMAX) CLOSE(10) !-----------------------------------------------------确定步长时间------------------------------------------------------------------------ DX=(MAXVAL(X)-MINVAL(X))/XMAX DY=(MAXVAL(Y)-MINVAL(Y))/YMAX WRITE(*,*) 'Please input the rate of heat transfer k' READ(*,*) Kr DT0=(1/2.0/K)/(1/DX**2+1/DY**2)/2.0 WRITE(*,*) 'Please input the step time, suggest it smaller than ',DT0 READ(*,*) DT !------------------------------------------------------确定边界\初值条件----------------------------------------------------------------------- TEMP(1:XMAX,1:YMAX,1:ZMAX)=0 !------------------确定边界条件类型------------------ DO I=1,4 WRITE(*,*) "Select Boundary Condition Type For" SELECT CASE(I) CASE (1) WRITE(*,*) "Left side" CASE (2) WRITE(*,*) "Bottom" CASE (3) WRITE(*,*) "Right side" CASE (4) WRITE(*,*) "Top" END SELECT WRITE(*,*) "1\Temperature" WRITE(*,*) "2\Rate of Temperatur Spread" READ(*,*) S(I) END DO !-----------------确定边界条件数值------------------- WRITE(*,*) "Please input the number for boundaries of left, bottom, right and up,use comma to seperate./The number should be wrote in 7 chracter and 3 float number(including comma)" READ(*,"(F7.2,','F7.3,',',F7.3,','F7.3)") T0(1:4) !----------------------------------------------------------------输入迭代次数\显示代数------------------------------------------------------------ WRITE(*,*) 'Please input the number of steps' READ(*,*) NMAX WRITE(*,*) "Please input the number between two steps to show" READ(*,*) STEPD N=0 T=0 100 N=N+1 T=T+DT SELECT CASE(S(1)) CASE(1) TEMP(1,1:YMAX,1:ZMAX)=T0(1) CASE(2) TEMP(1,1:YMAX,1:ZMAX)=(0-T0(1)*2*DX-TEMP(3,1:YMAX,1:ZMAX)+4*TEMP(2,1:YMAX,1:ZMAX))/3 END SELECT SELECT CASE(S(2)) CASE(1) TEMP(1:XMAX,1,1:ZMAX)=T0(2) CASE(2) TEMP(1:XMAX,1,1:ZMAX)=(0-T0(2)*2*DY-TEMP(1:XMAX,3,1:ZMAX)+4*TEMP(1:XMAX,2,1:ZMAX))/3 END SELECT SELECT CASE(S(3)) CASE(1) TEMP(XMAX,1:YMAX,1:ZMAX)=T0(3) CASE(2) TEMP(XMAX,1:YMAX,1:ZMAX)=(0-T0(3)*2*DX-TEMP(XMAX-2,1:YMAX,1:ZMAX)+4*TEMP(XMAX-1,1:YMAX,1:ZMAX))/3 END SELECT SELECT CASE(S(4)) CASE(1) TEMP(1:XMAX,YMAX,1:ZMAX)=T0(4) CASE(2) TEMP(1:XMAX,YMAX,1:ZMAX)=(0-T0(1)*2*DY-TEMP(1:XMAX,YMAX-2,1:ZMAX)+4*TEMP(1:XMAX,YMAX-3,1:ZMAX))/3 END SELECT !-----------------------------------------------------二阶中心差分格式显式推进计算--------------------------------------------------------------------------- A=Kr*DT/DX**2 B=Kr*DT/DY**2 K=1 XDO:DO I=2,XMAX-1 YDO:DO J=2,YMAX-1 TEMP(I,J,K)=A*(TEMP(I+1,J,K)+TEMP(I-1,J,K))+B*(TEMP(I,J+1,K)+TEMP(I,J-1,K))+(1-2*(A+B))*TEMP(I,J,K) END DO YDO END DO XDO !------------------------------------------------------收敛之判断----------------------------------------------------------------------------------- IF (MOD(N,STEPD) == 0) THEN WRITE(STEP,"(I6)") N OPEN (1,FILE='OUTPUT'//STEP//'_'//TRIM(FILENAME)) WRITE(1,*) 'VARIABLES=','"X","Y","T"' WRITE(1,*) 'ZONE,I=',XMAX,',J=',YMAX,',F=POINT' DO I=1,XMAX DO J=1,YMAX WRITE(1,*) X(I,J,K),Y(I,J,K),TEMP(I,J,K) END DO END DO CLOSE(1) ENDIF WRITE(6,*) 'TIME=',T,',TEMPERATURE=',TEMP(XMAX/2,YMAX/2,K) IF(N < NMAX) GOTO 100 IF(N == NMAX) GOTO 101 101 WRITE(*,*) "THE COMPUTATION IS OVER!" WRITE(STEP,'(I6)') NMAX OPEN (2,FILE='OUTPUT'//STEP//'_'//TRIM(FILENAME)) WRITE(2,*) 'VARIABLES=','"X","Y","T"' WRITE(2,*) 'ZONE,I=',XMAX,',J=',YMAX,',F=POINT' DO I=1,XMAX DO J=1,YMAX WRITE(2,*) X(I,J,K),Y(I,J,K),TEMP(I,J,K) END DO END DO CLOSE(2) STOP END PROGRAM
PLot3D是一种在CFD领域很常见的格式。几乎所有的网格生成软件都支持这种格式的输出,因此搞清楚这种文件的格式的读入和输出对CFD研究人员的工作带来很大的帮助。这里给出的都是读入ASCII格式文件的代码,输出方式类似。
PLot3D的网格文件后缀名为"xyz",可能是二进制(bin)格式或者文本文件格式(ASCII)。
1.单块网格(Single Grid)
读入3维单块网格
2.多块网格(Multiple Grids)
读入3维多块网格(似乎GRIDGEN读入网格时需采用这种格式的文件,你可以将其改成输出程序,所输出的网格就可以用GRIDGEN读入了)