main.f Source File


Contents

Source Code


Source Code

!> solve double mach reflection problem
      program main
        !> パラメータ等設定 includeを用いるのは本来好ましくない
        include "parameters.f"
        !> 最大反復数
        parameter(ilmt = 1000)
        !> 終了時間
        parameter(tfin = 0.2d0)
        !> 格子点座標 0とmax+1は便宜上 計算領域は0-max
        common /mesh/ x(0:jmax+1,0:kmax+1),y(0:jmax+1,0:kmax+1)
        !>  \(\Delta x, \Delta y\)
        !!@todo 逆数を定義しておく intgがちょっと速くなるはず
        common /dlxy/ dltx,dlty
        !> 保存量 \(\rho,\rho u,\rho v,e \)
        common /cons/ cons(4,0:jmax+1,0:kmax+1)
        !> 基本量 \(\rho,u,v,p \)
        common /pris/ pris(4,0:jmax+1,0:kmax+1)
        !> t:現在時間, tt:サブステップの時間
        common /time/ tn,tt
        !> 反復数
        common /loop/ im
        !> before shock state
        common /stt0/ r0,p0,u0,v0,ru0,rv0,e0
        !> after shock state
        common /stt1/ r1,p1,u1,v1,ru1,rv1,e1
        !> 非粘性流束
        common /flux/ xflx(4,jmax,kmax),yflx(4,jmax,kmax)
        !> 流束評価面に補間された値 l:left, r:right
        common /sval/ pxl(4,0:jmax+1,0:kmax+1),pxr(4,0:jmax+1,0:kmax+1),
     &                pyl(4,0:jmax+1,0:kmax+1),pyr(4,0:jmax+1,0:kmax+1)
        !> 時間増分
        common /dflx/ df(4,jmax,kmax)
        !> 非粘性流束評価で用いる値
        common /sflr/ conL(4), conR(4),dnflx(4)
        !> 流束評価面の法線ベクトル
        common /nvec/ dnx,dny
        !> n stepの保存量の一時的置き場
        double precision conn(4,0:jmax+1,0:kmax+1)

! pre-process
        ! 格子生成
        call grid
        ! 初期条件代入
        call init
        im = 0
        tn = 0.0d0
        df = 0.0d0
        conn = cons
        ! 書き出し
        call outf
! main iteration
        do im=1,ilmt
!         runge kutta
!         (1)
          tt = tn+dt
          ! 境界条件代入
          call stbc
          ! 保存量から基本量へ変換
          call c2p
          ! 界面まで補間
          call intp
          ! 非粘性流束評価
          call iflx
          ! 時間増分の計算
          call intg
          do k=1,kmax
            do j=1,jmax
              cons(1,j,k) = conn(1,j,k)-dt*df(1,j,k)
              cons(2,j,k) = conn(2,j,k)-dt*df(2,j,k)
              cons(3,j,k) = conn(3,j,k)-dt*df(3,j,k)
              cons(4,j,k) = conn(4,j,k)-dt*df(4,j,k)
            end do
          end do
!         (2)
          tt = tn+0.5d0*dt
          call stbc
          call c2p
          call intp
          call iflx
          call intg
          do k=1,kmax
            do j=1,jmax
              cons(1,j,k) = 0.75* conn(1,j,k)
     &                     +0.25*(cons(1,j,k)-dt*df(1,j,k))
              cons(2,j,k) = 0.75* conn(2,j,k)
     &                     +0.25*(cons(2,j,k)-dt*df(2,j,k))
              cons(3,j,k) = 0.75* conn(3,j,k)
     &                     +0.25*(cons(3,j,k)-dt*df(3,j,k))
              cons(4,j,k) = 0.75* conn(4,j,k)
     &                     +0.25*(cons(4,j,k)-dt*df(4,j,k))
            end do
          end do
 
!         (3)
          tt = tn+dt
          call stbc
          call c2p
          call intp
          call iflx
          call intg
          do k=1,kmax
            do j=1,jmax
              cons(1,j,k) = onethird* conn(1,j,k)
     &               +2.0d0*onethird*(cons(1,j,k)-dt*df(1,j,k))
              cons(2,j,k) = onethird* conn(2,j,k)
     &               +2.0d0*onethird*(cons(2,j,k)-dt*df(2,j,k))
              cons(3,j,k) = onethird* conn(3,j,k)
     &               +2.0d0*onethird*(cons(3,j,k)-dt*df(3,j,k))
              cons(4,j,k) = onethird* conn(4,j,k)
     &               +2.0d0*onethird*(cons(4,j,k)-dt*df(4,j,k))
            end do
          end do
          conn = cons
          tn = dt*im
          !call stbc
          if(mod(im,100)==0) then
            call stbc
            call outf
          endif
          if(tn>=tfin) then
            call stbc
            call outf
            exit
          end if
        end do
! post-process

      end program main

      subroutine grid
        include "parameters.f"
        parameter (xmin=0.00d0,xmax=4.00d0)
        parameter (ymin=0.00d0,ymax=1.00d0)
        common /mesh/ x(0:jmax+1,0:kmax+1),y(0:jmax+1,0:kmax+1)
        common /dlxy/ dltx,dlty

        write(*,*) jmax,kmax
        dltx=(xmax-xmin)/(jmax-1)
        dlty=(ymax-ymin)/(kmax-1)
        write(*,*) 'dx,dy: ', dltx,dlty
        cfl = 10.0d0*dt/dmax1(dltx,dlty)
        write(*,*) 'cfl: ', cfl

        do k=0,kmax+1
          do j=0,jmax+1
            x(j,k) = (j-1)*dltx
            y(j,k) = (k-1)*dlty
          end do
        end do

        open(7,form='unformatted',file='grid.xyz')
        write(7) jmax,kmax
        write(7) ((x(j,k),j=1,jmax),k=1,kmax),
     &             ((y(j,k),j=1,jmax),k=1,kmax) 
        close(7)

      end subroutine grid

      subroutine init
        include "parameters.f"
        common /stt0/ r0,p0,u0,v0,ru0,rv0,e0
        common /stt1/ r1,p1,u1,v1,ru1,rv1,e1
        common /mesh/ x(0:jmax+1,0:kmax+1),y(0:jmax+1,0:kmax+1)
        common /cons/ cons(4,0:jmax+1,0:kmax+1)
        common /pris/ pris(4,0:jmax+1,0:kmax+1)

        r0 = 1.40d0
        p0 = 1.00d0
        u0 = 0.00d0
        v0 = 0.00d0
        ru0 = r0*u0
        rv0 = r0*v0
        e0 = p0*gm1i+0.5d0*r0*(u0*u0+v0*v0)

        r1 = 8.0d0
        p1 = 116.5d0
        u1 = 4.125d0*dsqrt(3.0d0)
        v1 = -4.125d0
        ru1 = r1*u1
        rv1 = r1*v1
        e1 = p1*gm1i+0.5d0*r1*(u1*u1+v1*v1)

        sqr3 = dsqrt(3.0d0)
        sqr3x2i = 1.0d0/(sqr3*2.0d0)
        do k=0,kmax+1
          do j=0,jmax+1
            xn = x(j,k)
            yn = y(j,k)
            yl = sqr3*xn-sqr3x2i
            if(yn>=yl) then
              cons(1,j,k) = r1
              cons(2,j,k) = ru1
              cons(3,j,k) = rv1
              cons(4,j,k) = e1
              pris(1,j,k) = r1
              pris(2,j,k) = u1
              pris(3,j,k) = v1
              pris(4,j,k) = p1
            else
              cons(1,j,k) = r0
              cons(2,j,k) = ru0
              cons(3,j,k) = rv0
              cons(4,j,k) = e0
              pris(1,j,k) = r0
              pris(2,j,k) = u0
              pris(3,j,k) = v0
              pris(4,j,k) = p0
            end if
          end do
        end do

!       b.c.
! j=1 (inflow)
        j=1
        do k=1,kmax
          cons(1,j-1,k) = cons(1,j,k)
          cons(2,j-1,k) = cons(2,j,k)
          cons(3,j-1,k) = cons(3,j,k)
          cons(4,j-1,k) = cons(4,j,k)
        end do
!
        k=1
        onesix=onethird*0.5d0
        do j=1,jmax
          if(x(j,k)>onesix) then
            vl1 = dsqrt(pris(2,j,k+1)*pris(2,j,k+1)
     &                 +pris(3,j,k+1)*pris(3,j,k+1))
            vl0 = dsign(vl1,cons(2,j,k))
            rho = cons(1,j,k+1)
            cons(1,j,k) = rho
            cons(2,j,k) = rho*vl0
            cons(3,j,k) = 0.0d0
            cons(4,j,k) = cons(4,j,k+1)
            cons(1,j,k-1) = rho
            cons(2,j,k-1) = cons(2,j,k+1)
            cons(3,j,k-1) =-cons(3,j,k+1)
            cons(4,j,k-1) = cons(4,j,k+1)
          end if
        end do

      end subroutine init

      subroutine outf
        include "parameters.f"
        common /cons/ cons(4,0:jmax+1,0:kmax+1)
        common /time/ tn,tt
        common /loop/ im
        character(len=50) fnam

        write(fnam,'("flowfield_",i5.5,".q")'),im
        open(8,form='unformatted',file=fnam)
        write(8) jmax,kmax
        write(8) 10.0d0,0.0d0,1.0d15,tn
        write(8) (((cons(n,j,k),j=1,jmax),k=1,kmax),n=1,4)
        close(8)
        write(*,*) 'output',tn,im

      end subroutine outf

      subroutine stbc
        include "parameters.f"
        common /stt0/ r0,p0,u0,v0,ru0,rv0,e0
        common /stt1/ r1,p1,u1,v1,ru1,rv1,e1
        common /mesh/ x(0:jmax+1,0:kmax+1),y(0:jmax+1,0:kmax+1)
        common /cons/ cons(4,0:jmax+1,0:kmax+1)
        common /time/ tn,tt
        common /loop/ im
! j=jmax (subsonic outflow)
        j=jmax
        do k=1,kmax
          cons(1,j,k) = cons(1,j-1,k)
          cons(2,j,k) = cons(2,j-1,k)
          cons(3,j,k) = cons(3,j-1,k)
          dke = 0.5d0*(cons(2,j,k)**2+cons(3,j,k)**2)/cons(1,j,k)
          pout =gmm1*( cons(4,j-1,k)-dke)
          cons(4,j,k) = gm1i*pout+dke
          cons(1,j+1,k) = cons(1,j,k)
          cons(2,j+1,k) = cons(2,j,k)
          cons(3,j+1,k) = cons(3,j,k)
          cons(4,j+1,k) = cons(4,j,k)
        end do
! k=kmax (pre/post shock state)
        sqrt3 = dsqrt(3.0d0)
        xshock = tt*20.0d0/sqrt3+0.5d0*onethird+1.0d0/sqrt3
        k=kmax
        do j=1,jmax
          if(x(j,k)<=xshock) then
              cons(1,j,k) = r1
              cons(2,j,k) = ru1
              cons(3,j,k) = rv1
              cons(4,j,k) = e1
              cons(1,j,k+1) = cons(1,j,k)
              cons(2,j,k+1) = cons(2,j,k)
              cons(3,j,k+1) = cons(3,j,k)
              cons(4,j,k+1) = cons(4,j,k)
            else
              cons(1,j,k) = r0
              cons(2,j,k) = ru0
              cons(3,j,k) = rv0
              cons(4,j,k) = e0
              cons(1,j,k+1) = cons(1,j,k)
              cons(2,j,k+1) = cons(2,j,k)
              cons(3,j,k+1) = cons(3,j,k)
              cons(4,j,k+1) = cons(4,j,k)
            end if
        end do

        k=1
        do j=1,jmax
          if(x(j,k)>0.5d0*onethird) then
            vl1 = dsqrt(cons(2,j,k+1)*cons(2,j,k+1)
     &                 +cons(3,j,k+1)*cons(3,j,k+1))/cons(1,j,k+1)
            vl0 = dsign(vl1,cons(2,j,k))
            rho = cons(1,j,k+1)
            cons(1,j,k) = rho
            cons(2,j,k) = rho*vl0
            cons(3,j,k) = 0.0d0
            cons(4,j,k) = cons(4,j,k+1)
            cons(1,j,k-1) = rho
            cons(2,j,k-1) = cons(2,j,k+1)
            cons(3,j,k-1) =-cons(3,j,k+1)
            cons(4,j,k-1) = cons(4,j,k+1)
          end if
        end do


      end subroutine stbc

      subroutine c2p
        include "parameters.f"
        common /cons/ cons(4,0:jmax+1,0:kmax+1)
        common /pris/ pris(4,0:jmax+1,0:kmax+1)
 
        do k=0,kmax+1
          do j=0,jmax+1
            rho = cons(1,j,k)
            rhoi = 1.0d0/rho
            u = cons(2,j,k)*rhoi
            v = cons(3,j,k)*rhoi
            p = gmm1*(cons(4,j,k)-0.5d0*rho*(u*u+v*v))
            pris(1,j,k) = rho
            pris(2,j,k) = u
            pris(3,j,k) = v
            pris(4,j,k) = p
          end do
        end do

      end subroutine c2p

      subroutine intp
        include "parameters.f"
        common /pris/ pris(4,0:jmax+1,0:kmax+1)
        common /sval/ pxl(4,0:jmax+1,0:kmax+1),pxr(4,0:jmax+1,0:kmax+1),
     &                pyl(4,0:jmax+1,0:kmax+1),pyr(4,0:jmax+1,0:kmax+1)
        parameter(eps = 1.0d0,dkpa=onethird)
        parameter(b=(3.0d0-dkpa)/(1.0d0-dkpa))
! 1st order
!       x
!        do k=2,kmax-1
!          do j=1,jmax-1
!            pxl(1,j,k) = pris(1,j,k)
!            pxl(2,j,k) = pris(2,j,k)
!            pxl(3,j,k) = pris(3,j,k)
!            pxl(4,j,k) = pris(4,j,k)
!            pxr(1,j,k) = pris(1,j+1,k)
!            pxr(2,j,k) = pris(2,j+1,k)
!            pxr(3,j,k) = pris(3,j+1,k)
!            pxr(4,j,k) = pris(4,j+1,k)
!          end do
!        end do         
!!       y
!        do j=2,jmax-1
!          do k=1,kmax-1
!            pyl(1,j,k) = pris(1,j,k)
!            pyl(2,j,k) = pris(2,j,k)
!            pyl(3,j,k) = pris(3,j,k)
!            pyl(4,j,k) = pris(4,j,k)
!            pyr(1,j,k) = pris(1,j,k+1)
!            pyr(2,j,k) = pris(2,j,k+1)
!            pyr(3,j,k) = pris(3,j,k+1)
!            pyr(4,j,k) = pris(4,j,k+1)
!          end do
!        end do
! high(3rd) order
!       x
        do k=2,kmax-1
          do j=1,jmax
            dm1 = -pris(1,j-1,k)+pris(1,j  ,k)
            dp1 = -pris(1,j  ,k)+pris(1,j+1,k)
            dm2 = -pris(2,j-1,k)+pris(2,j  ,k)
            dp2 = -pris(2,j  ,k)+pris(2,j+1,k)
            dm3 = -pris(3,j-1,k)+pris(3,j  ,k)
            dp3 = -pris(3,j  ,k)+pris(3,j+1,k)
            dm4 = -pris(4,j-1,k)+pris(4,j  ,k)
            dp4 = -pris(4,j  ,k)+pris(4,j+1,k)

            bdm1 = dsign(1.0d0,dm1)*dmax1(0.0d0,
     &              dmin1(dabs(dm1),dsign(b,dm1)*dp1))
            bdm2 = dsign(1.0d0,dm2)*dmax1(0.0d0,
     &              dmin1(dabs(dm2),dsign(b,dm2)*dp2))
            bdm3 = dsign(1.0d0,dm3)*dmax1(0.0d0,
     &              dmin1(dabs(dm3),dsign(b,dm3)*dp3))
            bdm4 = dsign(1.0d0,dm4)*dmax1(0.0d0,
     &              dmin1(dabs(dm4),dsign(b,dm4)*dp4))

            bdp1 = dsign(1.0d0,dp1)*dmax1(0.0d0,
     &              dmin1(dabs(dp1),dsign(b,dp1)*dm1))
            bdp2 = dsign(1.0d0,dp2)*dmax1(0.0d0,
     &              dmin1(dabs(dp2),dsign(b,dp2)*dm2))
            bdp3 = dsign(1.0d0,dp3)*dmax1(0.0d0,
     &              dmin1(dabs(dp3),dsign(b,dp3)*dm3))
            bdp4 = dsign(1.0d0,dp4)*dmax1(0.0d0,
     &              dmin1(dabs(dp4),dsign(b,dp4)*dm4))

            pxl(1,j,k) = pris(1,j,k)+0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdm1+(1.0d0+dkpa)*bdp1)
            pxl(2,j,k) = pris(2,j,k)+0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdm2+(1.0d0+dkpa)*bdp2)
            pxl(3,j,k) = pris(3,j,k)+0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdm3+(1.0d0+dkpa)*bdp3)
            pxl(4,j,k) = pris(4,j,k)+0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdm4+(1.0d0+dkpa)*bdp4)

            pxr(1,j-1,k) = pris(1,j,k)-0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdp1+(1.0d0+dkpa)*bdm1)
            pxr(2,j-1,k) = pris(2,j,k)-0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdp2+(1.0d0+dkpa)*bdm2)
            pxr(3,j-1,k) = pris(3,j,k)-0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdp3+(1.0d0+dkpa)*bdm3)
            pxr(4,j-1,k) = pris(4,j,k)-0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdp4+(1.0d0+dkpa)*bdm4)
          end do
        end do         
!       y
        do j=2,jmax-1
          do k=1,kmax
            dm1 = -pris(1,j,k-1)+pris(1,j,k  )
            dp1 = -pris(1,j,k  )+pris(1,j,k+1)
            dm2 = -pris(2,j,k-1)+pris(2,j,k  )
            dp2 = -pris(2,j,k  )+pris(2,j,k+1)
            dm3 = -pris(3,j,k-1)+pris(3,j,k  )
            dp3 = -pris(3,j,k  )+pris(3,j,k+1)
            dm4 = -pris(4,j,k-1)+pris(4,j,k  )
            dp4 = -pris(4,j,k  )+pris(4,j,k+1)

            bdm1 = dsign(1.0d0,dm1)*dmax1(0.0d0,
     &              dmin1(dabs(dm1),dsign(b,dm1)*dp1))
            bdm2 = dsign(1.0d0,dm2)*dmax1(0.0d0,
     &              dmin1(dabs(dm2),dsign(b,dm2)*dp2))
            bdm3 = dsign(1.0d0,dm3)*dmax1(0.0d0,
     &              dmin1(dabs(dm3),dsign(b,dm3)*dp3))
            bdm4 = dsign(1.0d0,dm4)*dmax1(0.0d0,
     &              dmin1(dabs(dm4),dsign(b,dm4)*dp4))
            bdp1 = dsign(1.0d0,dp1)*dmax1(0.0d0,
     &              dmin1(dabs(dp1),dsign(b,dp1)*dm1))
            bdp2 = dsign(1.0d0,dp2)*dmax1(0.0d0,
     &              dmin1(dabs(dp2),dsign(b,dp2)*dm2))
            bdp3 = dsign(1.0d0,dp3)*dmax1(0.0d0,
     &              dmin1(dabs(dp3),dsign(b,dp3)*dm3))
            bdp4 = dsign(1.0d0,dp4)*dmax1(0.0d0,
     &              dmin1(dabs(dp4),dsign(b,dp4)*dm4))

            pyl(1,j,k) = pris(1,j,k)+0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdm1+(1.0d0+dkpa)*bdp1)
            pyl(2,j,k) = pris(2,j,k)+0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdm2+(1.0d0+dkpa)*bdp2)
            pyl(3,j,k) = pris(3,j,k)+0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdm3+(1.0d0+dkpa)*bdp3)
            pyl(4,j,k) = pris(4,j,k)+0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdm4+(1.0d0+dkpa)*bdp4)

            pyr(1,j,k-1) = pris(1,j,k)-0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdp1+(1.0d0+dkpa)*bdm1)
            pyr(2,j,k-1) = pris(2,j,k)-0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdp2+(1.0d0+dkpa)*bdm2)
            pyr(3,j,k-1) = pris(3,j,k)-0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdp3+(1.0d0+dkpa)*bdm3)
            pyr(4,j,k-1) = pris(4,j,k)-0.25d0*eps*
     &                    ((1.0d0-dkpa)*bdp4+(1.0d0+dkpa)*bdm4)
 
          end do
        end do



      end subroutine intp

      subroutine slau
        implicit double precision(a-h,o-z)
        common /sflr/ conL(4), conR(4),dnflx(4)
        common /nvec/ dnx,dny
        parameter(gmma = 1.4d0, gmm1 = gmma-1.0d0, gm1i = 1.0d0/gmm1)

!  Left state
        rl = conL(1)
        ul = conL(2)/conL(1)
        vl = conL(3)/conL(1)
        pl = gmm1*( conL(4) - 0.5d0*rL*(uL*uL+vL*vL) )
        al = dsqrt(gmma*pL/rL)
        dhl = ( conL(4) + pL ) / rL
        vnp = ul*dnx+vl*dny
!  Right state
        rr = conR(1)
        ur = conR(2)/conR(1)
        vr = conR(3)/conR(1)
        pr = gmm1*( conR(4) - 0.5d0*rR*(uR*uR+vR*vR) )
        ar = dsqrt(gmma*pR/rR)
        dhr = ( conR(4) + pR ) / rR
        vnm = ur*dnx+vr*dny
        
        cbar = 0.5d0*(al+ar)
        cbi = 1.0d0/cbar
        dmp = vnp*cbi
        dmm = vnm*cbi
        g = -dmax1(dmin1(dmp,0.0d0),-1.0d0)*
     &       dmin1(dmax1(dmm,0.0d0), 1.0d0)
        dmht = dmin1(1.0d0,cbi*dsqrt(0.5d0*(ul*ul+vl*vl+ur*ur+vr*vr)))
        xi = (1.0d0-dmht)*(1.0d0-dmht)
        absbv = (rl*dabs(vnp)+rr*dabs(vnm))/(rl+rr)
        dmdt = 0.5d0*(rl*vnp+rr*vnm-absbv*(rr-rl))*(1.0d0-g)
     &          -xi*0.5d0*cbi*(pr-pl)
        admd = dabs(dmdt)

        if(dabs(dmp)<1.0d0) then
          bp = 0.25d0*(2.0d0-dmp)*(dmp+1.0d0)*(dmp+1.0d0)
        else
          bp = 0.5d0*(1.0d0+dsign(1.0d0, dmp))
        end if
        if(dabs(dmm)<1.0d0) then
          bm = 0.25d0*(2.0d0+dmm)*(dmm-1.0d0)*(dmm-1.0d0)
        else
          bm = 0.5d0*(1.0d0+dsign(1.0d0,-dmm))
        end if

        ptld = 0.5d0*( (pl+pr)+(bp-bm)*(pl-pr)
     &                +(1.0d0-xi)*(bp+bm-1.0d0)*(pl+pr))

        dm1 = dmdt+admd
        dm2 = dmdt-admd
        dnflx(1) = dmdt
        dnflx(2) = 0.5d0*(dm1* ul+dm2* ur)+ptld*dnx
        dnflx(3) = 0.5d0*(dm1* vl+dm2* vr)+ptld*dny
        dnflx(4) = 0.5d0*(dm1*dhl+dm2*dhr)


      end subroutine slau

      subroutine iflx
        include "parameters.f"
        common /sval/ pxl(4,0:jmax+1,0:kmax+1),pxr(4,0:jmax+1,0:kmax+1),
     &                pyl(4,0:jmax+1,0:kmax+1),pyr(4,0:jmax+1,0:kmax+1)
        common /flux/ xflx(4,jmax,kmax),yflx(4,jmax,kmax)
!        double precision conl(4),conr(4),dnflx(4)
        common /sflr/ conL(4), conR(4),dnflx(4)
        common /nvec/ dnx,dny
 
        one = 1.0d0
        zero = 0.0d0
!       x flux
        dnx = 1.0d0
        dny = 0.0d0
        do k=2,kmax-1
          do j=1,jmax-1
!           left state            
            rl = pxl(1,j,k)
            ul = pxl(2,j,k)
            vl = pxl(3,j,k)
            pl = pxl(4,j,k)
            conl(1) = rl 
            conl(2) = rl*ul 
            conl(3) = rl*vl 
            conl(4) = gm1i*pl+0.5d0*rl*(ul*ul+vl*vl)
!           right state
            rr = pxr(1,j,k)
            ur = pxr(2,j,k)
            vr = pxr(3,j,k)
            pr = pxr(4,j,k) 
            conr(1) = rr
            conr(2) = rr*ur 
            conr(3) = rr*vr 
            conr(4) = gm1i*pr+0.5d0*rr*(ur*ur+vr*vr)
            call slau
            xflx(1,j,k) = dnflx(1)
            xflx(2,j,k) = dnflx(2)
            xflx(3,j,k) = dnflx(3)
            xflx(4,j,k) = dnflx(4)
          end do
        end do        
!       y flux
        dnx = 0.0d0
        dny = 1.0d0
        do j=2,jmax-1
          do k=1,kmax-1
!           left state            
            rl = pyl(1,j,k)
            ul = pyl(2,j,k)
            vl = pyl(3,j,k)
            pl = pyl(4,j,k)
            conl(1) = rl 
            conl(2) = rl*ul 
            conl(3) = rl*vl 
            conl(4) = gm1i*pl+0.5d0*rl*(ul*ul+vl*vl)
!           right state
            rr = pyr(1,j,k)
            ur = pyr(2,j,k)
            vr = pyr(3,j,k)
            pr = pyr(4,j,k) 
            conr(1) = rr
            conr(2) = rr*ur 
            conr(3) = rr*vr 
            conr(4) = gm1i*pr+0.5d0*rr*(ur*ur+vr*vr)
            call slau
            yflx(1,j,k) = dnflx(1)
            yflx(2,j,k) = dnflx(2)
            yflx(3,j,k) = dnflx(3)
            yflx(4,j,k) = dnflx(4)
          end do
        end do
        !stop
      end subroutine iflx

      subroutine intg
        include "parameters.f"
        common /flux/ xflx(4,jmax,kmax),yflx(4,jmax,kmax)
        common /cons/ cons(4,0:jmax+1,0:kmax+1)
        common /dflx/ df(4,jmax,kmax)
        common /dlxy/ dltx,dlty


        do k=2,kmax-1
          do j=2,jmax-1
 
            df(1,j,k) = (-xflx(1,j-1,k)+xflx(1,j,k))/dltx
            df(2,j,k) = (-xflx(2,j-1,k)+xflx(2,j,k))/dltx
            df(3,j,k) = (-xflx(3,j-1,k)+xflx(3,j,k))/dltx
            df(4,j,k) = (-xflx(4,j-1,k)+xflx(4,j,k))/dltx
            df(1,j,k) = df(1,j,k)+(-yflx(1,j,k-1)+yflx(1,j,k))/dlty
            df(2,j,k) = df(2,j,k)+(-yflx(2,j,k-1)+yflx(2,j,k))/dlty
            df(3,j,k) = df(3,j,k)+(-yflx(3,j,k-1)+yflx(3,j,k))/dlty
            df(4,j,k) = df(4,j,k)+(-yflx(4,j,k-1)+yflx(4,j,k))/dlty

          end do
        end do

      end subroutine intg