• VTF
  • FSI
  • AMROC
  • SFC
  • Motion
  • STLIB
  • Main Page
  • src/charx.f

    c     *****************************************************************
    c     SPLITTING IN THE X-DIRECTION
    c     *****************************************************************
          SUBROUTINE  CHARX 
    
          IMPLICIT REAL*8 (A-H,O-Z),INTEGER*4 (I-N)
    
     
          COMMON/CELL/ ROCELL(2001,2001),UCELL(2001,2001),VCELL(2001,2001),
         &     ETCELL(2001,2001),EICELL(2001,2001)
             
          COMMON/GXN/UXN(2001,2001),VXN(2001,2001),ROXN(2001,2001)
         &     ,PXN(2001,2001)
    
          COMMON/GX/UX(2001,2001),VX(2001,2001),ROX(2001,2001),PX(2001,2001)
          COMMON/GY/UY(2001,2001),VY(2001,2001),ROY(2001,2001),PY(2001,2001)
          COMMON/XY/X(2001),Y(2001)
            
          COMMON/D1X/PN(2001),UN(2001),RON(2001),VN(2001)
          COMMON/EPS/EPS1,EPS2
            
          COMMON/BAL/NX,NY,CFL,EPS,GAM,DT
          COMMON/FON/ROFONL,EIFONL,PFONL,UFONL,VFONL
         &     ,ROFONR,EIFONR,PFONR,UFONR,VFONR
     
    c  *****************************************************************
    
          DO 1 J=1,NY-1
    
             HY=Y(J+1)-Y(J)
    
             I=1
    
             UR=UX(I+1,J)
             UL=UX(I,J)
    
             VR=VX(I+1,J)
             VL=VX(I,J)
             
             PR=PX(I+1,J)
             PL=PX(I,J)
             
             ROR=ROX(I+1,J)
             ROL=ROX(I,J)
             
             EIR=PR/(ROR*(GAM-1))
             EIL=PL/(ROL*(GAM-1))
             
    c     ------------------------------------------------          
                    
             UT=UY(I,J+1)
             UB=UY(I,J)
             
             VT=VY(I,J+1)
             VB=VY(I,J)
    
             PT=PY(I,J+1)
             PB=PY(I,J)
             
             ROT=ROY(I,J+1)
             ROB=ROY(I,J)
            
             EIT=PT/(ROT*(GAM-1))
             EIB=PB/(ROB*(GAM-1))
             
    c     ------------------------------------------------          
                    
             ROC=ROCELL(I,J)
             UC=UCELL(I,J)
             VC=VCELL(I,J)
             ETC=ETCELL(I,J)
             EIC=EICELL(I,J)
             PC=(GAM-1)*ROC*EIC
             SOUND=DSQRT(GAM*PC/ROC)
                    
             SAR=PC/ROC**GAM
             AR=2*DSQRT(GAM)/(GAM-1)*SAR**(1/(2*GAM))
             CC=PC**((GAM-1)/(2*GAM))
             CL=PL**((GAM-1)/(2*GAM))
             CR=PR**((GAM-1)/(2*GAM))
            
    c     -------------------------------------------------
    
    c       PRIMARY VAR, AY
    
             AY11=VC
             AY12=0
             AY13=ROC
             AY14=0
             
             AY21=0
             AY22=AY11
             AY23=0
             AY24=0
    
             AY31=0
             AY32=0
             AY33=AY11
             AY34=1/AY13
    
             AY41=0
             AY42=0
             AY43=GAM*PC
             AY44=AY11
    
             DFIDY1=(ROT-ROB)/HY
             DFIDY2=(UT-UB)/HY
             DFIDY3=(VT-VB)/HY
             DFIDY4=(PT-PB)/HY
    
             FX1=-(AY11*DFIDY1+AY12*DFIDY2+AY13*DFIDY3+AY14*DFIDY4)
             FX2=-(AY21*DFIDY1+AY22*DFIDY2+AY23*DFIDY3+AY24*DFIDY4)
             FX3=-(AY31*DFIDY1+AY32*DFIDY2+AY33*DFIDY3+AY34*DFIDY4)
             FX4=-(AY41*DFIDY1+AY42*DFIDY2+AY43*DFIDY3+AY44*DFIDY4)
    
    c     CHAR VAR, OMEGAX
    
             G=2./DSQRT(GAM*ROC)
    
             OX11=0
             OX12=1
             OX13=0
             OX14=G/(2*DSQRT(PC))
    
             OX21=0
             OX22=1
             OX23=0
             OX24=-OX14
    
             OX31=0
             OX32=0
             OX33=1
             OX34=0
    
             OX41=-GAM/ROC
             OX42=0
             OX43=0
             OX44=1/PC
    
             GX1=(OX11*FX1+OX12*FX2+OX13*FX3+OX14*FX4)
             GX2=(OX21*FX1+OX22*FX2+OX23*FX3+OX24*FX4)
             GX3=(OX31*FX1+OX32*FX2+OX33*FX3+OX34*FX4)
             GX4=(OX41*FX1+OX42*FX2+OX43*FX3+OX44*FX4)
    
             RR=UR+AR*CR
             RL=UL+AR*CL
             RC=UC+AR*CC
    
             QR=UR-AR*CR
             QL=UL-AR*CL
             QC=UC-AR*CC
    
             SR=DLOG(PR/ROR**GAM)
             SL=DLOG(PL/ROL**GAM)
             SC=DLOG(PC/ROC**GAM)
    
             RMAX=MAX(RR,RL,RC)+DT*GX1
             RMIN=MIN(RR,RL,RC)+DT*GX1
    
             QMAX=MAX(QR,QL,QC)+DT*GX2
             QMIN=MIN(QR,QL,QC)+DT*GX2
             
             VMAX=MAX(VR,VL,VC)+DT*GX3
             VMIN=MIN(VR,VL,VC)+DT*GX3
    
             SMAX=MAX(SR,SL,SC)+DT*GX4
             SMIN=MIN(SR,SL,SC)+DT*GX4
    
    c     *****************************************************************
                    
             RMAX=RMAX+EPS2*DABS(RMAX)
             RMIN=RMIN-EPS2*DABS(RMIN)
    
             QMAX=QMAX+EPS2*DABS(QMAX)
             QMIN=QMIN-EPS2*DABS(QMIN)
    
             VMAX=VMAX+EPS2*DABS(VMAX)
             VMIN=VMIN-EPS2*DABS(VMIN)
    
             SMAX=SMAX+EPS2*DABS(SMAX)
             SMIN=SMIN-EPS2*DABS(SMIN)
    
    c     *****************************************************************
            
             RLN=2*RC-RR
             QLN=2*QC-QR
             SLN=2*SC-SR
             VLN=2*VC-VR
    
    c       ------------------------------------------
                    
             IF(RLN.GT.RMAX) RLN=RMAX
             IF(RLN.LT.RMIN) RLN=RMIN
    
             IF(QLN.GT.QMAX) QLN=QMAX
             IF(QLN.LT.QMIN) QLN=QMIN
    
             IF(VLN.GT.VMAX) VLN=VMAX
             IF(VLN.LT.VMIN) VLN=VMIN
             
             IF(SLN.GT.SMAX) SLN=SMAX
             IF(SLN.LT.SMIN) SLN=SMIN
    
             RRN=2*RC-RL
             QRN=2*QC-QL
             SRN=2*SC-SL
             VRN=2*VC-VL
            
             IF(RRN.GT.RMAX) RRN=RMAX
             IF(RRN.LT.RMIN) RRN=RMIN
    
             IF(QRN.GT.QMAX) QRN=QMAX           
             IF(QRN.LT.QMIN) QRN=QMIN
    
             IF(VRN.GT.VMAX) VRN=VMAX
             IF(VRN.LT.VMIN) VRN=VMIN
            
             IF(SRN.GT.SMAX) SRN=SMAX
             IF(SRN.LT.SMIN) SRN=SMIN
    
    !       RRNL=RRN
    !       QRNL=QRN
    !       VRNL=VRN
    !       SRNL=SRN
    
    !       GL=G
             AL=AR
             SOUNDL=SOUND
             UCL=UC
    
             DO 2 I=1,NX-1
    
    c       -------------------------------------------
                UR=UX(I+1,J)
                UL=UX(I,J)
                
                VR=VX(I+1,J)
                VL=VX(I,J)
    
                PR=PX(I+1,J)
                PL=PX(I,J)
                
                ROR=ROX(I+1,J)
                ROL=ROX(I,J)
    
                EIR=PR/(ROR*(GAM-1))
                EIL=PL/(ROL*(GAM-1))
             
    c     ------------------------------------------------          
                    
                UT=UY(I,J+1)
                UB=UY(I,J)
                
                VT=VY(I,J+1)
                VB=VY(I,J)
                
                PT=PY(I,J+1)
                PB=PY(I,J)
    
                ROT=ROY(I,J+1)
                ROB=ROY(I,J)
            
                EIT=PT/(ROT*(GAM-1))
                EIB=PB/(ROB*(GAM-1))
             
    c     ------------------------------------------------                  
                    
                ROC=ROCELL(I,J)
                UC=UCELL(I,J)
                VC=VCELL(I,J)
                ETC=ETCELL(I,J)
                EIC=EICELL(I,J)
                PC=(GAM-1)*ROC*EIC
                SOUND=DSQRT(GAM*PC/ROC)
    
                SAR=PC/ROC**GAM
                AR=2*DSQRT(GAM)/(GAM-1)*SAR**(1/(2*GAM))
                CC=PC**((GAM-1)/(2*GAM))
                CL=PL**((GAM-1)/(2*GAM))
                CR=PR**((GAM-1)/(2*GAM))
    c     -------------------------------------------------
                HX=X(I+1)-X(I)
                    
    c     -------------------------------------------------
    
    c     PRIMARY VAR, AY
    
                AY11=VC
                AY12=0
                AY13=ROC
                AY14=0
    
                AY21=0
                AY22=AY11
                AY23=0
                AY24=0
    
                AY31=0
                AY32=0
                AY33=AY11
                AY34=1/AY13
            
                AY41=0
                AY42=0
                AY43=GAM*PC
                AY44=AY11
    
                DFIDY1=(ROT-ROB)/HY
                DFIDY2=(UT-UB)/HY
                DFIDY3=(VT-VB)/HY
                DFIDY4=(PT-PB)/HY
    
                FX1=-(AY11*DFIDY1+AY12*DFIDY2+AY13*DFIDY3+AY14*DFIDY4)
                FX2=-(AY21*DFIDY1+AY22*DFIDY2+AY23*DFIDY3+AY24*DFIDY4)
                FX3=-(AY31*DFIDY1+AY32*DFIDY2+AY33*DFIDY3+AY34*DFIDY4)
                FX4=-(AY41*DFIDY1+AY42*DFIDY2+AY43*DFIDY3+AY44*DFIDY4)
                
    c     CHAR VAR, OMEGAX
    
                G=2./DSQRT(GAM*ROC)
    
                OX11=0
                OX12=1
                OX13=0
                OX14=G/(2*DSQRT(PC))
                
                OX21=0
                OX22=1
                OX23=0
                OX24=-OX14
                
                OX31=0
                OX32=0
                OX33=1
                OX34=0
    
                OX41=-GAM/ROC
                OX42=0
                OX43=0
                OX44=1/PC
    
                GX1=(OX11*FX1+OX12*FX2+OX13*FX3+OX14*FX4)
                GX2=(OX21*FX1+OX22*FX2+OX23*FX3+OX24*FX4)
                GX3=(OX31*FX1+OX32*FX2+OX33*FX3+OX34*FX4)
                GX4=(OX41*FX1+OX42*FX2+OX43*FX3+OX44*FX4)
    
                RR=UR+AR*CR
                RL=UL+AR*CL
                RC=UC+AR*CC
                
                QR=UR-AR*CR
                QL=UL-AR*CL
                QC=UC-AR*CC
    
                SR=DLOG(PR/ROR**GAM)
                SL=DLOG(PL/ROL**GAM)
                SC=DLOG(PC/ROC**GAM)
             
                RMAX=MAX(RR,RL,RC)+DT*GX1
                RMIN=MIN(RR,RL,RC)+DT*GX1
    
                QMAX=MAX(QR,QL,QC)+DT*GX2
                QMIN=MIN(QR,QL,QC)+DT*GX2
    
                VMAX=MAX(VR,VL,VC)+DT*GX3
                VMIN=MIN(VR,VL,VC)+DT*GX3
                
                SMAX=MAX(SR,SL,SC)+DT*GX4
                SMIN=MIN(SR,SL,SC)+DT*GX4
                
    c     *****************************************************************
    
                RMAX=RMAX+EPS2*DABS(RMAX)
                RMIN=RMIN-EPS2*DABS(RMIN)
                
                QMAX=QMAX+EPS2*DABS(QMAX)
                QMIN=QMIN-EPS2*DABS(QMIN)
                
                VMAX=VMAX+EPS2*DABS(VMAX)
                VMIN=VMIN-EPS2*DABS(VMIN)
                
                SMAX=SMAX+EPS2*DABS(SMAX)
                SMIN=SMIN-EPS2*DABS(SMIN)
    
    c     *****************************************************************
                RLN=2*RC-RR
                QLN=2*QC-QR
                SLN=2*SC-SR
                VLN=2*VC-VR
    
    c     ------------------------------------------
                    
                IF(RLN.GT.RMAX) RLN=RMAX
                IF(RLN.LT.RMIN) RLN=RMIN
                
                IF(QLN.GT.QMAX) QLN=QMAX
                IF(QLN.LT.QMIN) QLN=QMIN
                
                IF(VLN.GT.VMAX) VLN=VMAX
                IF(VLN.LT.VMIN) VLN=VMIN
    
                IF(SLN.GT.SMAX) SLN=SMAX
                IF(SLN.LT.SMIN) SLN=SMIN
    
    
    c     CHAR DIRECTIONS
    
                UCH=UC+UCL          !-UL
                SCH=SOUND+SOUNDL    !-DSQRT(GAM*PL/ROL)
    
                CHAR3=UCH
                CHAR4=UCH
                CHAR1=UCH+SCH
                CHAR2=UCH-SCH
    
    c     UPDATE PRIMARY VAR
     
                IF(CHAR1.GT.0.AND.CHAR2.LE.0.AND.CHAR3.GT.0) THEN
                   
                   PN(I)=((RRN-QLN)/(AR+AL))**(2*GAM/(GAM-1))
                   UN(I)=(AR*RRN+AL*QLN)/(AR+AL)
    
                   RON(I)=(PN(I)/DEXP(SRN))**(1/GAM)
                   VN(I)=VRN
    
                   GOTO 20
                ENDIF
    
                IF(CHAR1.GT.0.AND.CHAR2.LE.0.AND.CHAR3.LE.0) THEN
    
                   PN(I)=((RRN-QLN)/(AR+AL))**(2*GAM/(GAM-1))
                   UN(I)=(AR*RRN+AL*QLN)/(AR+AL)
                   RON(I)=(PN(I)/DEXP(SLN))**(1/GAM)
                   VN(I)=VLN
    
                   GOTO 20
                ENDIF
    
                IF(CHAR1.GT.0.AND.CHAR2.GT.0.AND.CHAR3.GT.0) THEN
    
                   PN(I)=((RRN-QRN)/(AL+AL))**(2*GAM/(GAM-1))
                   UN(I)=(AL*RRN+AL*QRN)/(AL+AL)
                   RON(I)=(PN(I)/DEXP(SRN))**(1/GAM)
                   VN(I)=VRN
    
                   GOTO 20
                ENDIF
    
                IF(CHAR1.LE.0.AND.CHAR2.LE.0.AND.CHAR3.LE.0) THEN
    
                   PN(I)=((RLN-QLN)/(AR+AR))**(2*GAM/(GAM-1))
                   UN(I)=(AR*RLN+AR*QLN)/(AR+AR)
                   RON(I)=(PN(I)/DEXP(SLN))**(1/GAM)
                   VN(I)=VLN
    
                   GOTO 20
                ENDIF
    
     20         CONTINUE
    
                RRN=2*RC-RL
                QRN=2*QC-QL
                SRN=2*SC-SL
                VRN=2*VC-VL
            
                IF(RRN.GT.RMAX) RRN=RMAX
                IF(RRN.LT.RMIN) RRN=RMIN
                
                IF(QRN.GT.QMAX) QRN=QMAX
                IF(QRN.LT.QMIN) QRN=QMIN
                
                IF(VRN.GT.VMAX) VRN=VMAX
                IF(VRN.LT.VMIN) VRN=VMIN
                
                IF(SRN.GT.SMAX) SRN=SMAX
                IF(SRN.LT.SMIN) SRN=SMIN
    
                AL=AR
                SOUNDL=SOUND
                UCL=UC
                    
     2       CONTINUE
    
             DO 3 I=1,NX-1
    
                PXN(I,J)=PN(I)
                UXN(I,J)=UN(I)
                ROXN(I,J)=RON(I)
                IF(ROXN(I,J).LT.EPS) ROXN(I,J)=EPS
                VXN(I,J)=VN(I)
    
                PN(I)=0
                UN(I)=0
                RON(I)=0
                VN(I)=0
    
     3       CONTINUE
    
    !     -----------------------------------------------------------------
     1    CONTINUE
    
          RETURN
          END
    

<