📄 read.f90
字号:
! Scan the input file, counting the number of NAMELIST entries!ALLOCATE(TRANS(NMESHES))!MESH_LOOP: DO NM=1,NMESHES M => MESHES(NM) T => TRANS(NM)! DO N=1,3 T%NOC(N) = 0 TRNLOOP: DO SELECT CASE (N) CASE(1) CALL CHECKREAD('TRNX',LU_INPUT,IOS) IF (IOS==1) EXIT TRNLOOP MESH_NUMBER = 1 READ(LU_INPUT,NML=TRNX,END=17,ERR=18,IOSTAT=IOS) IF (MESH_NUMBER/=NM) CYCLE TRNLOOP CASE(2) CALL CHECKREAD('TRNY',LU_INPUT,IOS) IF (IOS==1) EXIT TRNLOOP MESH_NUMBER = 1 READ(LU_INPUT,NML=TRNY,END=17,ERR=18,IOSTAT=IOS) IF (MESH_NUMBER/=NM) CYCLE TRNLOOP CASE(3) CALL CHECKREAD('TRNZ',LU_INPUT,IOS) IF (IOS==1) EXIT TRNLOOP MESH_NUMBER = 1 READ(LU_INPUT,NML=TRNZ,END=17,ERR=18,IOSTAT=IOS) IF (MESH_NUMBER/=NM) CYCLE TRNLOOP END SELECT T%NOC(N) = T%NOC(N) + 1 18 IF (IOS>0) CALL SHUTDOWN('ERROR: Problem with TRN* line') ENDDO TRNLOOP 17 REWIND(LU_INPUT) ENDDO! T%NOCMAX = MAX(T%NOC(1),T%NOC(2),T%NOC(3)) ALLOCATE(A(T%NOCMAX+1,T%NOCMAX+1)) ALLOCATE(XX(T%NOCMAX+1,3)) ALLOCATE(ND(T%NOCMAX+1,3)) ALLOCATE(T%C1(0:T%NOCMAX+1,3)) T%C1 = 0._EB T%C1(1,1:3) = 1._EB ALLOCATE(T%C2(0:T%NOCMAX+1,3)) ALLOCATE(T%C3(0:T%NOCMAX+1,3)) ALLOCATE(T%CCSTORE(T%NOCMAX,3)) ALLOCATE(T%PCSTORE(T%NOCMAX,3)) ALLOCATE(T%IDERIVSTORE(T%NOCMAX,3))! T%ITRAN = 0! DO IC=1,3 NLOOP: DO N=1,T%NOC(IC) IDERIV = -1 IF (IC==1) THEN LOOP1: DO CALL CHECKREAD('TRNX',LU_INPUT,IOS) IF (IOS==1) EXIT NLOOP MESH_NUMBER = 1 READ(LU_INPUT,TRNX,END=1,ERR=2) IF (MESH_NUMBER==NM) EXIT LOOP1 ENDDO LOOP1 ENDIF IF (IC==2) THEN LOOP2: DO CALL CHECKREAD('TRNY',LU_INPUT,IOS) IF (IOS==1) EXIT NLOOP MESH_NUMBER = 1 READ(LU_INPUT,TRNY,END=1,ERR=2) IF (MESH_NUMBER==NM) EXIT LOOP2 ENDDO LOOP2 ENDIF IF (IC==3) THEN LOOP3: DO CALL CHECKREAD('TRNZ',LU_INPUT,IOS) IF (IOS==1) EXIT NLOOP MESH_NUMBER = 1 READ(LU_INPUT,TRNZ,END=1,ERR=2) IF (MESH_NUMBER==NM) EXIT LOOP3 ENDDO LOOP3 ENDIF T%CCSTORE(N,IC) = CC T%PCSTORE(N,IC) = PC T%IDERIVSTORE(N,IC) = IDERIV IF (IDERIV>=0) T%ITRAN(IC) = 1 IF (IDERIV<0) T%ITRAN(IC) = 2 2 CONTINUE ENDDO NLOOP 1 REWIND(LU_INPUT) ENDDO ICLOOP: DO IC=1,3 SELECT CASE (T%ITRAN(IC)) CASE (1) ! polynomial transformation ND(1,IC) = 0 SELECT CASE(IC) CASE(1) XX(1,IC) = M%XF-M%XS T%C1(1,IC) = M%XF-M%XS CASE(2) XX(1,IC) = M%YF-M%YS T%C1(1,IC) = M%YF-M%YS CASE(3) XX(1,IC) = M%ZF-M%ZS T%C1(1,IC) = M%ZF-M%ZS END SELECT NNLOOP: DO N=2,T%NOC(IC)+1 IDERIV = T%IDERIVSTORE(N-1,IC) IF (IC==1) CC = T%CCSTORE(N-1,IC)-M%XS IF (IC==2) CC = T%CCSTORE(N-1,IC)-M%YS IF (IC==3) CC = T%CCSTORE(N-1,IC)-M%ZS IF (IC==1 .AND. IDERIV==0) PC = T%PCSTORE(N-1,IC)-M%XS IF (IC==2 .AND. IDERIV==0) PC = T%PCSTORE(N-1,IC)-M%YS IF (IC==3 .AND. IDERIV==0) PC = T%PCSTORE(N-1,IC)-M%ZS IF (IC==1 .AND. IDERIV>0) PC = T%PCSTORE(N-1,IC) IF (IC==2 .AND. IDERIV>0) PC = T%PCSTORE(N-1,IC) IF (IC==3 .AND. IDERIV>0) PC = T%PCSTORE(N-1,IC) ND(N,IC) = IDERIV XX(N,IC) = CC T%C1(N,IC) = PC ENDDO NNLOOP DO K=1,T%NOC(IC)+1 DO N=1,T%NOC(IC)+1 COEF = IFAC(K,ND(N,IC)) IEXP = K-ND(N,IC) IF (IEXP<0) A(N,K) = 0._EB IF (IEXP==0) A(N,K) = COEF IF (IEXP>0) A(N,K) = COEF*XX(N,IC)**IEXP ENDDO ENDDO IERROR = 0 CALL GAUSSJ(A,T%NOC(IC)+1,T%NOCMAX+1,T%C1(1:T%NOCMAX+1,IC),1,1,IERROR) IF (IERROR/=0)CALL SHUTDOWN('ERROR: Problem with grid transformation') CASE (2) ! linear transformation T%C1(0,IC) = 0._EB T%C2(0,IC) = 0._EB DO N=1,T%NOC(IC) IF (IC==1) CC = T%CCSTORE(N,IC)-M%XS IF (IC==2) CC = T%CCSTORE(N,IC)-M%YS IF (IC==3) CC = T%CCSTORE(N,IC)-M%ZS IF (IC==1) PC = T%PCSTORE(N,IC)-M%XS IF (IC==2) PC = T%PCSTORE(N,IC)-M%YS IF (IC==3) PC = T%PCSTORE(N,IC)-M%ZS T%C1(N,IC) = CC T%C2(N,IC) = PC ENDDO SELECT CASE(IC) CASE(1) T%C1(T%NOC(1)+1,1) = M%XF-M%XS T%C2(T%NOC(1)+1,1) = M%XF-M%XS CASE(2) T%C1(T%NOC(2)+1,2) = M%YF-M%YS T%C2(T%NOC(2)+1,2) = M%YF-M%YS CASE(3) T%C1(T%NOC(3)+1,3) = M%ZF-M%ZS T%C2(T%NOC(3)+1,3) = M%ZF-M%ZS END SELECT DO N=1,T%NOC(IC)+1 T%C3(N,IC) = (T%C2(N,IC)-T%C2(N-1,IC))/(T%C1(N,IC)-T%C1(N-1,IC)) ENDDO END SELECT ENDDO ICLOOP DEALLOCATE(A) DEALLOCATE(XX) DEALLOCATE(ND)!! Set up grid stretching arrays! ALLOCATE(M%R(0:M%IBAR),STAT=IZERO) CALL ChkMemErr('READ','R',IZERO) ALLOCATE(M%RC(0:M%IBAR+1),STAT=IZERO) CALL ChkMemErr('READ','RC',IZERO) M%RC = 1._EB ALLOCATE(M%RRN(0:M%IBP1),STAT=IZERO) CALL ChkMemErr('READ','RRN',IZERO) M%RRN = 1._EB ALLOCATE(M%X(0:M%IBAR),STAT=IZERO) CALL ChkMemErr('READ','X',IZERO) ALLOCATE(M%XC(0:M%IBP1),STAT=IZERO) CALL ChkMemErr('READ','XC',IZERO) ALLOCATE(M%HX(0:M%IBP1),STAT=IZERO) CALL ChkMemErr('READ','HX',IZERO) ALLOCATE(M%DX(0:M%IBP1),STAT=IZERO) CALL ChkMemErr('READ','DX',IZERO) ALLOCATE(M%RDX(0:M%IBP1),STAT=IZERO) CALL ChkMemErr('READ','RDX',IZERO) ALLOCATE(M%DXN(0:M%IBAR),STAT=IZERO) CALL ChkMemErr('READ','DXN',IZERO) ALLOCATE(M%RDXN(0:M%IBAR),STAT=IZERO) CALL ChkMemErr('READ','RDXN',IZERO) ALLOCATE(M%Y(0:M%JBAR),STAT=IZERO) CALL ChkMemErr('READ','Y',IZERO) ALLOCATE(M%YC(0:M%JBP1),STAT=IZERO) CALL ChkMemErr('READ','YC',IZERO) ALLOCATE(M%HY(0:M%JBP1),STAT=IZERO) CALL ChkMemErr('READ','HY',IZERO) ALLOCATE(M%DY(0:M%JBP1),STAT=IZERO) CALL ChkMemErr('READ','DY',IZERO) ALLOCATE(M%RDY(0:M%JBP1),STAT=IZERO) CALL ChkMemErr('READ','RDY',IZERO) ALLOCATE(M%DYN(0:M%JBAR),STAT=IZERO) CALL ChkMemErr('READ','DYN',IZERO) ALLOCATE(M%RDYN(0:M%JBAR),STAT=IZERO) CALL ChkMemErr('READ','RDYN',IZERO) ALLOCATE(M%Z(0:M%KBAR),STAT=IZERO) CALL ChkMemErr('READ','Z',IZERO) ALLOCATE(M%ZC(0:M%KBP1),STAT=IZERO) CALL ChkMemErr('READ','ZC',IZERO) ALLOCATE(M%HZ(0:M%KBP1),STAT=IZERO) CALL ChkMemErr('READ','HZ',IZERO) ALLOCATE(M%DZ(0:M%KBP1),STAT=IZERO) CALL ChkMemErr('READ','DZ',IZERO) ALLOCATE(M%RDZ(0:M%KBP1),STAT=IZERO) CALL ChkMemErr('READ','RDZ',IZERO) ALLOCATE(M%DZN(0:M%KBAR),STAT=IZERO) CALL ChkMemErr('READ','DZN',IZERO) ALLOCATE(M%RDZN(0:M%KBAR),STAT=IZERO) CALL ChkMemErr('READ','RDZN',IZERO)!! Define X grid stretching terms! M%DXMIN = 1000._EB DO I=1,M%IBAR XI = (REAL(I,EB)-.5)*M%DXI M%HX(I) = GP(XI,1,NM) M%DX(I) = M%HX(I)*M%DXI M%DXMIN = MIN(M%DXMIN,M%DX(I)) IF (M%HX(I)<=0._EB) THEN WRITE(MESSAGE,'(A,I2)') 'ERROR: x transformation not monotonic, mesh ',NM CALL SHUTDOWN(MESSAGE) ENDIF M%RDX(I) = 1._EB/M%DX(I) ENDDO! M%HX(0) = M%HX(1) M%HX(M%IBP1) = M%HX(M%IBAR) M%DX(0) = M%DX(1) M%DX(M%IBP1) = M%DX(M%IBAR) M%RDX(0) = 1._EB/M%DX(1) M%RDX(M%IBP1) = 1._EB/M%DX(M%IBAR)! DO I=0,M%IBAR XI = I*M%DXI M%X(I) = M%XS + G(XI,1,NM) IF (CYLINDRICAL) THEN M%R(I) = M%X(I) ELSE M%R(I) = 1._EB ENDIF M%DXN(I) = 0.5_EB*(M%DX(I)+M%DX(I+1)) M%RDXN(I) = 1._EB/M%DXN(I) ENDDO M%X(0) = M%XS M%X(M%IBAR) = M%XF! DO I=1,M%IBAR M%XC(I) = 0.5_EB*(M%X(I)+M%X(I-1)) ENDDO M%XC(0) = M%XS - 0.5_EB*M%DX(0) M%XC(M%IBP1) = M%XF + 0.5_EB*M%DX(M%IBP1)! IF (CYLINDRICAL) THEN DO I=1,M%IBAR M%RRN(I) = 2._EB/(M%R(I)+M%R(I-1)) M%RC(I) = 0.5_EB*(M%R(I)+M%R(I-1)) ENDDO M%RRN(0) = M%RRN(1) M%RRN(M%IBP1) = M%RRN(M%IBAR) ENDIF!! Define Y grid stretching terms! M%DYMIN = 1000._EB DO J=1,M%JBAR ETA = (REAL(J,EB)-.5)*M%DETA M%HY(J) = GP(ETA,2,NM) M%DY(J) = M%HY(J)*M%DETA M%DYMIN = MIN(M%DYMIN,M%DY(J)) IF (M%HY(J)<=0._EB) THEN WRITE(MESSAGE,'(A,I2)') 'ERROR: y transformation not monotonic, mesh ',NM CALL SHUTDOWN(MESSAGE) ENDIF M%RDY(J) = 1._EB/M%DY(J) ENDDO! M%HY(0) = M%HY(1) M%HY(M%JBP1) = M%HY(M%JBAR) M%DY(0) = M%DY(1) M%DY(M%JBP1) = M%DY(M%JBAR) M%RDY(0) = 1._EB/M%DY(1) M%RDY(M%JBP1) = 1._EB/M%DY(M%JBAR)! DO J=0,M%JBAR ETA = J*M%DETA M%Y(J) = M%YS + G(ETA,2,NM) M%DYN(J) = 0.5_EB*(M%DY(J)+M%DY(J+1)) M%RDYN(J) = 1._EB/M%DYN(J) ENDDO! M%Y(0) = M%YS M%Y(M%JBAR) = M%YF! DO J=1,M%JBAR M%YC(J) = 0.5_EB*(M%Y(J)+M%Y(J-1)) ENDDO M%YC(0) = M%YS - 0.5_EB*M%DY(0) M%YC(M%JBP1) = M%YF + 0.5_EB*M%DY(M%JBP1)!! Define Z grid stretching terms! M%DZMIN = 1000._EB DO K=1,M%KBAR ZETA = (REAL(K,EB)-.5)*M%DZETA M%HZ(K) = GP(ZETA,3,NM) M%DZ(K) = M%HZ(K)*M%DZETA M%DZMIN = MIN(M%DZMIN,M%DZ(K)) IF (M%HZ(K)<=0._EB) THEN WRITE(MESSAGE,'(A,I2)') 'ERROR: z transformation not monotonic, mesh ',NM CALL SHUTDOWN(MESSAGE) ENDIF M%RDZ(K) = 1._EB/M%DZ(K) ENDDO! M%HZ(0) = M%HZ(1) M%HZ(M%KBP1) = M%HZ(M%KBAR) M%DZ(0) = M%DZ(1) M%DZ(M%KBP1) = M%DZ(M%KBAR) M%RDZ(0) = 1._EB/M%DZ(1) M%RDZ(M%KBP1) = 1._EB/M%DZ(M%KBAR)! DO K=0,M%KBAR ZETA = K*M%DZETA M%Z(K) = M%ZS + G(ZETA,3,NM) M%DZN(K) = 0.5_EB*(M%DZ(K)+M%DZ(K+1)) M%RDZN(K) = 1._EB/M%DZN(K) ENDDO! M%Z(0) = M%ZS M%Z(M%KBAR) = M%ZF! DO K=1,M%KBAR M%ZC(K) = 0.5_EB*(M%Z(K)+M%Z(K-1)) ENDDO M%ZC(0) = M%ZS - 0.5_EB*M%DZ(0) M%ZC(M%KBP1) = M%ZF + 0.5_EB*M%DZ(M%KBP1)!! Set up arrays that will return coordinate positions! NIPX = 100*M%IBAR NIPY = 100*M%JBAR NIPZ = 100*M%KBAR NIPXS = NINT(NIPX*M%DX(0)/(M%XF-M%XS)) NIPXF = NINT(NIPX*M%DX(M%IBP1)/(M%XF-M%XS)) NIPYS = NINT(NIPY*M%DY(0)/(M%YF-M%YS)) NIPYF = NINT(NIPY*M%DY(M%JBP1)/(M%YF-M%YS)) NIPZS = NINT(NIPZ*M%DZ(0)/(M%ZF-M%ZS)) NIPZF = NINT(NIPZ*M%DZ(M%KBP1)/(M%ZF-M%ZS)) M%RDXINT = REAL(NIPX,EB)/(M%XF-M%XS) M%RDYINT = REAL(NIPY,EB)/(M%YF-M%YS) M%RDZINT = REAL(NIPZ,EB)/(M%ZF-M%ZS)! ALLOCATE(M%CELLSI(-NIPXS:NIPX+NIPXF),STAT=IZERO) CALL ChkMemErr('READ','CELLSI',IZERO) ALLOCATE(M%CELLSJ(-NIPYS:NIPY+NIPYF),STAT=IZERO) CALL ChkMemErr('READ','CELLSJ',IZERO) ALLOCATE(M%CELLSK(-NIPZS:NIPZ+NIPZF),STAT=IZERO) CALL ChkMemErr('READ','CELLSK',IZERO)! DO I=-NIPXS,NIPX+NIPXF M%CELLSI(I) = GINV(REAL(I,EB)/M%RDXINT,1,NM)*M%RDXI M%CELLSI(I) = MAX(M%CELLSI(I),-0.9_EB) M%CELLSI(I) = MIN(M%CELLSI(I),REAL(M%IBAR)+0.9_EB) ENDDO DO J=-NIPYS,NIPY+NIPYF M%CELLSJ(J) = GINV(REAL(J,EB)/M%RDYINT,2,NM)*M%RDETA M%CELLSJ(J) = MAX(M%CELLSJ(J),-0.9_EB) M%CELLSJ(J) = MIN(M%CELLSJ(J),REAL(M%JBAR)+0.9_EB) ENDDO DO K=-NIPZS,NIPZ+NIPZF M%CELLSK(K) = GINV(REAL(K,EB)/M%RDZINT,3,NM)*M%RDZETA M%CELLSK(K) = MAX(M%CELLSK(K),-0.9_EB) M%CELLSK(K) = MIN(M%CELLSK(K),REAL(M%KBAR)+0.9_EB) ENDDO ENDDO MESH_LOOP CONTAINS INTEGER FUNCTION IFAC(II,N)INTEGER II,NIFAC = 1DO I=II-N+1,II IFAC = IFAC*IENDDOEND FUNCTION IFACEND SUBROUTINE READ_TRAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -