!$Id: empart.f90,v 1.3 2012/08/22 06:33:54 zjcao Exp $
!including advection term in this routine
  function compute_rhs_empart(ext, X, Y, Z,                                          &
               chi    ,   dxx    ,   dxy    ,   dxz    ,   dyy    ,   dyz    ,   dzz,&
               Lap    ,  betax   ,  betay   ,  betaz   , trK,                        &
               Ex, Ey, Ez, Bx, By, Bz, Kpsi, Kphi,Jx,Jy,Jz,qchar,                    &
               Ex_rhs, Ey_rhs, Ez_rhs, Bx_rhs, By_rhs, Bz_rhs, Kpsi_rhs, Kphi_rhs,   &
               rho,Sx,Sy,Sz,Sxx,Sxy,Sxz,Syy,Syz,Szz,                                 &
               Symmetry,Lev,eps)  result(gont)
  implicit none

!~~~~~~> Input parameters:

  integer,intent(in ):: ext(1:3), Symmetry,Lev
  real*8, intent(in ):: X(1:ext(1)),Y(1:ext(2)),Z(1:ext(3))
  real*8, dimension(ext(1),ext(2),ext(3)),intent(in ) :: chi,Jx,Jy,Jz,qchar
  real*8, dimension(ext(1),ext(2),ext(3)),intent(in ) :: dxx,dxy,dxz,dyy,dyz,dzz
  real*8, dimension(ext(1),ext(2),ext(3)),intent(in ) :: Lap, betax, betay, betaz, trK
  real*8, dimension(ext(1),ext(2),ext(3)),intent(in ) :: Ex,Ey,Ez,Bx,By,Bz,Kpsi,Kphi
  real*8, dimension(ext(1),ext(2),ext(3)),intent(out) :: Ex_rhs, Ey_rhs, Ez_rhs 
  real*8, dimension(ext(1),ext(2),ext(3)),intent(out) :: Bx_rhs, By_rhs, Bz_rhs, Kpsi_rhs, Kphi_rhs
  real*8, dimension(ext(1),ext(2),ext(3)),intent(out) :: rho,Sx,Sy,Sz
  real*8, dimension(ext(1),ext(2),ext(3)),intent(out) :: Sxx,Sxy,Sxz,Syy,Syz,Szz
  real*8,intent(in) :: eps
!  gont = 0: success; gont = 1: something wrong
  integer::gont

!~~~~~~> Other variables:

  real*8, dimension(ext(1),ext(2),ext(3)) :: gxx,gyy,gzz,gxy,gxz,gyz
  real*8, dimension(ext(1),ext(2),ext(3)) :: chix,chiy,chiz,chi3o2
  real*8, dimension(ext(1),ext(2),ext(3)) :: gxxx,gxyx,gxzx,gyyx,gyzx,gzzx
  real*8, dimension(ext(1),ext(2),ext(3)) :: gxxy,gxyy,gxzy,gyyy,gyzy,gzzy
  real*8, dimension(ext(1),ext(2),ext(3)) :: gxxz,gxyz,gxzz,gyyz,gyzz,gzzz
  real*8, dimension(ext(1),ext(2),ext(3)) :: Lapx,Lapy,Lapz
  real*8, dimension(ext(1),ext(2),ext(3)) :: betaxx,betaxy,betaxz
  real*8, dimension(ext(1),ext(2),ext(3)) :: betayx,betayy,betayz
  real*8, dimension(ext(1),ext(2),ext(3)) :: betazx,betazy,betazz
  real*8, dimension(ext(1),ext(2),ext(3)) :: alpn1,chin1
  real*8, dimension(ext(1),ext(2),ext(3)) :: gupxx,gupxy,gupxz
  real*8, dimension(ext(1),ext(2),ext(3)) :: gupyy,gupyz,gupzz
  real*8, dimension(ext(1),ext(2),ext(3)) :: Exx,Exy,Exz,Eyx,Eyy,Eyz,Ezx,Ezy,Ezz
  real*8, dimension(ext(1),ext(2),ext(3)) :: Bxx,Bxy,Bxz,Byx,Byy,Byz,Bzx,Bzy,Bzz
  real*8, dimension(ext(1),ext(2),ext(3)) :: Kpsix,Kpsiy,Kpsiz
  real*8, dimension(ext(1),ext(2),ext(3)) :: Kphix,Kphiy,Kphiz
  real*8, dimension(ext(1),ext(2),ext(3)) :: lEx,lEy,lEz,lBx,lBy,lBz

  real*8,dimension(3) ::SSS,AAS,ASA,SAA,ASS,SAS,SSA
  real*8            :: dX, dY, dZ, PI
  real*8, parameter :: ONE = 1.D0, TWO = 2.D0, FOUR = 4.D0
  real*8, parameter :: SYM = 1.D0, ANTI= - 1.D0
  real*8, parameter :: F3o2=1.5d0,EIT=8.d0
  real*8,parameter  :: kappa = 1.d0
!!! sanity check
  dX = sum(Ex)+sum(Ey)+sum(Ez)+sum(Bx)+sum(By)+sum(Bz)+sum(Kpsi)+sum(Kphi)
  if(dX.ne.dX) then
     if(sum(Ex).ne.sum(Ex))write(*,*)"empart.f90: find NaN in Ex"
     if(sum(Ey).ne.sum(Ey))write(*,*)"empart.f90: find NaN in Ey"
     if(sum(Ez).ne.sum(Ez))write(*,*)"empart.f90: find NaN in Ez"
     if(sum(Bx).ne.sum(Bx))write(*,*)"empart.f90: find NaN in Bx"
     if(sum(By).ne.sum(By))write(*,*)"empart.f90: find NaN in By"
     if(sum(Bz).ne.sum(Bz))write(*,*)"empart.f90: find NaN in Bz"
     if(sum(Kpsi).ne.sum(Kpsi))write(*,*)"empart.f90: find NaN in Kpsi"
     if(sum(Kphi).ne.sum(Kphi))write(*,*)"empart.f90: find NaN in Kphi"
     gont = 1
     return
  endif

  PI = dacos(-ONE)

  dX = X(2) - X(1)
  dY = Y(2) - Y(1)
  dZ = Z(2) - Z(1)

  alpn1 = Lap + ONE
  chin1 = chi + ONE
  chi3o2  = dsqrt(chin1)**3
  gxx = dxx + ONE
  gyy = dyy + ONE
  gzz = dzz + ONE
  gxy = dxy
  gxz = dxz
  gyz = dyz

  call fderivs(ext,Lap,Lapx,Lapy,Lapz,X,Y,Z,SYM,SYM,SYM,Symmetry,Lev)
  call fderivs(ext,betax,betaxx,betaxy,betaxz,X,Y,Z,ANTI, SYM, SYM,Symmetry,Lev)
  call fderivs(ext,betay,betayx,betayy,betayz,X,Y,Z, SYM,ANTI, SYM,Symmetry,Lev)
  call fderivs(ext,betaz,betazx,betazy,betazz,X,Y,Z, SYM, SYM,ANTI,Symmetry,Lev)
 
  call fderivs(ext,chi,chix,chiy,chiz,X,Y,Z,SYM,SYM,SYM,symmetry,Lev)

  call fderivs(ext,dxx,gxxx,gxxy,gxxz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,Lev)
  call fderivs(ext,gxy,gxyx,gxyy,gxyz,X,Y,Z,ANTI,ANTI,SYM ,Symmetry,Lev)
  call fderivs(ext,gxz,gxzx,gxzy,gxzz,X,Y,Z,ANTI,SYM ,ANTI,Symmetry,Lev)
  call fderivs(ext,dyy,gyyx,gyyy,gyyz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,Lev)
  call fderivs(ext,gyz,gyzx,gyzy,gyzz,X,Y,Z,SYM ,ANTI,ANTI,Symmetry,Lev)
  call fderivs(ext,dzz,gzzx,gzzy,gzzz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,Lev)

  call fderivs(ext,Kpsi,Kpsix,Kpsiy,Kpsiz,X,Y,Z,SYM,SYM,SYM,Symmetry,Lev)
  call fderivs(ext,Kphi,Kphix,Kphiy,Kphiz,X,Y,Z,SYM,SYM,SYM,Symmetry,Lev)

  call fderivs(ext,Ex,Exx,Exy,Exz,X,Y,Z,ANTI,SYM,SYM ,Symmetry,Lev)
  call fderivs(ext,Ey,Eyx,Eyy,Eyz,X,Y,Z,SYM,ANTI,SYM ,Symmetry,Lev)
  call fderivs(ext,Ez,Ezx,Ezy,Ezz,X,Y,Z,SYM,SYM,ANTI ,Symmetry,Lev)

  call fderivs(ext,Bx,Bxx,Bxy,Bxz,X,Y,Z,SYM,ANTI,ANTI ,Symmetry,Lev)
  call fderivs(ext,By,Byx,Byy,Byz,X,Y,Z,ANTI,SYM,ANTI ,Symmetry,Lev)
  call fderivs(ext,Bz,Bzx,Bzy,Bzz,X,Y,Z,ANTI,ANTI,SYM ,Symmetry,Lev)

! physical gij
  gxx = gxx/chin1
  gxy = gxy/chin1
  gxz = gxz/chin1
  gyy = gyy/chin1
  gyz = gyz/chin1
  gzz = gzz/chin1
!physical gij,k  
  gxxx = (gxxx-gxx*chix)/chin1
  gxxy = (gxxy-gxx*chiy)/chin1
  gxxz = (gxxz-gxx*chiz)/chin1
  gxyx = (gxyx-gxy*chix)/chin1
  gxyy = (gxyy-gxy*chiy)/chin1
  gxyz = (gxyz-gxy*chiz)/chin1
  gxzx = (gxzx-gxz*chix)/chin1
  gxzy = (gxzy-gxz*chiy)/chin1
  gxzz = (gxzz-gxz*chiz)/chin1
  gyyx = (gyyx-gyy*chix)/chin1
  gyyy = (gyyy-gyy*chiy)/chin1
  gyyz = (gyyz-gyy*chiz)/chin1
  gyzx = (gyzx-gyz*chix)/chin1
  gyzy = (gyzy-gyz*chiy)/chin1
  gyzz = (gyzz-gyz*chiz)/chin1
  gzzx = (gzzx-gzz*chix)/chin1
  gzzy = (gzzy-gzz*chiy)/chin1
  gzzz = (gzzz-gzz*chiz)/chin1

! physical inverse metric
  gupzz =  gxx * gyy * gzz + gxy * gyz * gxz + gxz * gxy * gyz - &
           gxz * gyy * gxz - gxy * gxy * gzz - gxx * gyz * gyz
  gupxx =   ( gyy * gzz - gyz * gyz ) / gupzz
  gupxy = - ( gxy * gzz - gyz * gxz ) / gupzz
  gupxz =   ( gxy * gyz - gyy * gxz ) / gupzz
  gupyy =   ( gxx * gzz - gxz * gxz ) / gupzz
  gupyz = - ( gxx * gyz - gxy * gxz ) / gupzz
  gupzz =   ( gxx * gyy - gxy * gxy ) / gupzz

  Ex_rhs = alpn1*trK*Ex-(Ex*betaxx+Ey*betaxy+Ez*betaxz)                  &
          -FOUR*PI*alpn1*Jx-alpn1*(gupxx*Kpsix+gupxy*Kpsiy+gupxz*Kpsiz)  &
          +chi3o2*(                                                      &
          ((gxz*Bx+gyz*By+gzz*Bz)*Lapy+alpn1*(gxz*Bxy+gyz*Byy+gzz*Bzy)+alpn1*(Bx*gxzy+By*gyzy+Bz*gzzy))-&
          ((gxy*Bx+gyy*By+gyz*Bz)*Lapz+alpn1*(gxy*Bxz+gyy*Byz+gyz*Bzz)+alpn1*(Bx*gxyz+By*gyyz+Bz*gyzz)))
  Ey_rhs = alpn1*trK*Ey-(Ex*betayx+Ey*betayy+Ez*betayz)                  &
          -FOUR*PI*alpn1*Jy-alpn1*(gupxy*Kpsix+gupyy*Kpsiy+gupyz*Kpsiz)  &
          +chi3o2*(                                                      &
          ((gxx*Bx+gxy*By+gxz*Bz)*Lapz+alpn1*(gxx*Bxz+gxy*Byz+gxz*Bzz)+alpn1*(Bx*gxxz+By*gxyz+Bz*gxzz))-&
          ((gxz*Bx+gyz*By+gzz*Bz)*Lapx+alpn1*(gxz*Bxx+gyz*Byx+gzz*Bzx)+alpn1*(Bx*gxzx+By*gyzx+Bz*gzzx)))
  Ez_rhs = alpn1*trK*Ez-(Ex*betazx+Ey*betazy+Ez*betazz)                  &
          -FOUR*PI*alpn1*Jz-alpn1*(gupxz*Kpsix+gupyz*Kpsiy+gupzz*Kpsiz)  &
          +chi3o2*(                                                      &
          ((gxy*Bx+gyy*By+gyz*Bz)*Lapx+alpn1*(gxy*Bxx+gyy*Byx+gyz*Bzx)+alpn1*(Bx*gxyx+By*gyyx+Bz*gyzx))-&
          ((gxx*Bx+gxy*By+gxz*Bz)*Lapy+alpn1*(gxx*Bxy+gxy*Byy+gxz*Bzy)+alpn1*(Bx*gxxy+By*gxyy+Bz*gxzy)))

  Bx_rhs = alpn1*trK*Bx-(Bx*betaxx+By*betaxy+Bz*betaxz)                  &
                           -alpn1*(gupxx*Kphix+gupxy*Kphiy+gupxz*Kphiz)  &
          -chi3o2*(                                                      &
          ((gxz*Ex+gyz*Ey+gzz*Ez)*Lapy+alpn1*(gxz*Exy+gyz*Eyy+gzz*Ezy)+alpn1*(Ex*gxzy+Ey*gyzy+Ez*gzzy))-&
          ((gxy*Ex+gyy*Ey+gyz*Ez)*Lapz+alpn1*(gxy*Exz+gyy*Eyz+gyz*Ezz)+alpn1*(Ex*gxyz+Ey*gyyz+Ez*gyzz)))
  By_rhs = alpn1*trK*By-(Bx*betayx+By*betayy+Bz*betayz)                  &
                           -alpn1*(gupxy*Kphix+gupyy*Kphiy+gupyz*Kphiz)  &
          -chi3o2*(                                                      &
          ((gxx*Ex+gxy*Ey+gxz*Ez)*Lapz+alpn1*(gxx*Exz+gxy*Eyz+gxz*Ezz)+alpn1*(Ex*gxxz+Ey*gxyz+Ez*gxzz))-&
          ((gxz*Ex+gyz*Ey+gzz*Ez)*Lapx+alpn1*(gxz*Exx+gyz*Eyx+gzz*Ezx)+alpn1*(Ex*gxzx+Ey*gyzx+Ez*gzzx)))
  Bz_rhs = alpn1*trK*Bz-(Bx*betazx+By*betazy+Bz*betazz)                  &
                           -alpn1*(gupxz*Kphix+gupyz*Kphiy+gupzz*Kphiz)  &
          -chi3o2*(                                                      &
          ((gxy*Ex+gyy*Ey+gyz*Ez)*Lapx+alpn1*(gxy*Exx+gyy*Eyx+gyz*Ezx)+alpn1*(Ex*gxyx+Ey*gyyx+Ez*gyzx))-&
          ((gxx*Ex+gxy*Ey+gxz*Ez)*Lapy+alpn1*(gxx*Exy+gxy*Eyy+gxz*Ezy)+alpn1*(Ex*gxxy+Ey*gxyy+Ez*gxzy)))

  Kpsi_rhs = FOUR*PI*alpn1*qchar-alpn1*kappa*Kpsi - &
            alpn1*(Exx+Eyy+Ezz-F3o2/chin1*(chix*Ex+chiy*Ey+chiz*Ez)) 
  Kphi_rhs =                    -alpn1*kappa*Kphi - &
            alpn1*(Bxx+Byy+Bzz-F3o2/chin1*(chix*Bx+chiy*By+chiz*Bz)) 

  SSS(1)=SYM
  SSS(2)=SYM
  SSS(3)=SYM

  AAS(1)=ANTI
  AAS(2)=ANTI
  AAS(3)=SYM

  ASA(1)=ANTI
  ASA(2)=SYM
  ASA(3)=ANTI

  SAA(1)=SYM
  SAA(2)=ANTI
  SAA(3)=ANTI

  ASS(1)=ANTI
  ASS(2)=SYM
  ASS(3)=SYM

  SAS(1)=SYM
  SAS(2)=ANTI
  SAS(3)=SYM

  SSA(1)=SYM
  SSA(2)=SYM
  SSA(3)=ANTI

!!!!!!!!!advection term part  
  call lopsided(ext,X,Y,Z,KPsi,KPsi_rhs,betax,betay,betaz,Symmetry,SSS)
  call lopsided(ext,X,Y,Z,KPhi,KPhi_rhs,betax,betay,betaz,Symmetry,SSS)

  call lopsided(ext,X,Y,Z,Ex,Ex_rhs,betax,betay,betaz,Symmetry,ASS)
  call lopsided(ext,X,Y,Z,Ey,Ey_rhs,betax,betay,betaz,Symmetry,SAS)
  call lopsided(ext,X,Y,Z,Ez,Ez_rhs,betax,betay,betaz,Symmetry,SSA)

  call lopsided(ext,X,Y,Z,Bx,Bx_rhs,betax,betay,betaz,Symmetry,SAA)
  call lopsided(ext,X,Y,Z,By,By_rhs,betax,betay,betaz,Symmetry,ASA)
  call lopsided(ext,X,Y,Z,Bz,Bz_rhs,betax,betay,betaz,Symmetry,AAS)

! numerical dissipation part
  if(eps>0)then 
! usual Kreiss-Oliger dissipation 

  call kodis(ext,X,Y,Z,Kpsi,Kpsi_rhs,SSS,Symmetry,eps)
  call kodis(ext,X,Y,Z,Kphi,Kphi_rhs,SSS,Symmetry,eps)
  call kodis(ext,X,Y,Z,Ex,Ex_rhs,ASS,Symmetry,eps)
  call kodis(ext,X,Y,Z,Ey,Ey_rhs,SAS,Symmetry,eps)
  call kodis(ext,X,Y,Z,Ez,Ez_rhs,SSA,Symmetry,eps)
  call kodis(ext,X,Y,Z,Bx,Bx_rhs,SAA,Symmetry,eps)
  call kodis(ext,X,Y,Z,By,By_rhs,ASA,Symmetry,eps)
  call kodis(ext,X,Y,Z,Bz,Bz_rhs,AAS,Symmetry,eps)

  endif
! stress-energy tensor
  rho = (gxx*(Ex*Ex+Bx*Bx)+gyy*(Ey*Ey+By*By)+gzz*(Ez*Ez+Bz*Bz) + &
      +TWO*(gxy*(Ex*Ey+Bx*By)+gxz*(Ex*Ez+Bx*Bz)+gyz*(Ey*Ez+By*Bz)))/EIT/PI
  Sx = (Ey*Bz-Ez*By)/FOUR/PI/chi3o2
  Sy = (Ez*Bx-Ex*Bz)/FOUR/PI/chi3o2
  Sz = (Ex*By-Ey*Bx)/FOUR/PI/chi3o2
  lEx = gxx*Ex+gxy*Ey+gxz*Ez
  lEy = gxy*Ex+gyy*Ey+gyz*Ez
  lEz = gxz*Ex+gyz*Ey+gzz*Ez
  lBx = gxx*Bx+gxy*By+gxz*Bz
  lBy = gxy*Bx+gyy*By+gyz*Bz
  lBz = gxz*Bx+gyz*By+gzz*Bz
  Sxx = rho*gxx-(lEx*lEx+lBx*lBx)/FOUR/PI
  Sxy = rho*gxy-(lEx*lEy+lBx*lBy)/FOUR/PI
  Sxz = rho*gxz-(lEx*lEz+lBx*lBz)/FOUR/PI
  Syy = rho*gyy-(lEy*lEy+lBy*lBy)/FOUR/PI
  Syz = rho*gyz-(lEy*lEz+lBy*lBz)/FOUR/PI
  Szz = rho*gzz-(lEz*lEz+lBz*lBz)/FOUR/PI

  gont = 0

  return

  end function compute_rhs_empart
!including advection term in this routine
! for shell
  function compute_rhs_empart_ss(ext,crho,sigma,R,x,y,z,                       &
               drhodx, drhody, drhodz,                                         &
               dsigmadx,dsigmady,dsigmadz,                                     &
               dRdx,dRdy,dRdz,                                                 &
               drhodxx,drhodxy,drhodxz,drhodyy,drhodyz,drhodzz,                &
               dsigmadxx,dsigmadxy,dsigmadxz,dsigmadyy,dsigmadyz,dsigmadzz,    &
               dRdxx,dRdxy,dRdxz,dRdyy,dRdyz,dRdzz,                            &
               chi    ,   dxx    ,   dxy    ,   dxz    ,   dyy    ,   dyz    ,   dzz,&
               Lap    ,  betax   ,  betay   ,  betaz   , trK,                        &
               Ex, Ey, Ez, Bx, By, Bz, Kpsi, Kphi,Jx,Jy,Jz,qchar,                    &
               Ex_rhs, Ey_rhs, Ez_rhs, Bx_rhs, By_rhs, Bz_rhs, Kpsi_rhs, Kphi_rhs,   &
               rho,Sx,Sy,Sz,Sxx,Sxy,Sxz,Syy,Syz,Szz,                                 &
               Symmetry,Lev,eps,sst)  result(gont)
  implicit none

!~~~~~~> Input parameters:

  integer,intent(in ):: ext(1:3), Symmetry,Lev,sst
  double precision,intent(in),dimension(ext(1))::crho
  double precision,intent(in),dimension(ext(2))::sigma
  double precision,intent(in),dimension(ext(3))::R
  double precision,intent(in),dimension(ext(1),ext(2),ext(3))::x,y,z
  double precision,intent(in),dimension(ext(1),ext(2),ext(3))::drhodx, drhody, drhodz
  double precision,intent(in),dimension(ext(1),ext(2),ext(3))::dsigmadx,dsigmady,dsigmadz
  double precision,intent(in),dimension(ext(1),ext(2),ext(3))::dRdx,dRdy,dRdz
  double precision,intent(in),dimension(ext(1),ext(2),ext(3))::drhodxx,drhodxy,drhodxz,drhodyy,drhodyz,drhodzz
  double precision,intent(in),dimension(ext(1),ext(2),ext(3))::dsigmadxx,dsigmadxy,dsigmadxz,dsigmadyy,dsigmadyz,dsigmadzz
  double precision,intent(in),dimension(ext(1),ext(2),ext(3))::dRdxx,dRdxy,dRdxz,dRdyy,dRdyz,dRdzz
  real*8, dimension(ext(1),ext(2),ext(3)),intent(in ) :: chi,Jx,Jy,Jz,qchar
  real*8, dimension(ext(1),ext(2),ext(3)),intent(in ) :: dxx,dxy,dxz,dyy,dyz,dzz
  real*8, dimension(ext(1),ext(2),ext(3)),intent(in ) :: Lap, betax, betay, betaz, trK
  real*8, dimension(ext(1),ext(2),ext(3)),intent(in ) :: Ex,Ey,Ez,Bx,By,Bz,Kpsi,Kphi
  real*8, dimension(ext(1),ext(2),ext(3)),intent(out) :: Ex_rhs, Ey_rhs, Ez_rhs 
  real*8, dimension(ext(1),ext(2),ext(3)),intent(out) :: Bx_rhs, By_rhs, Bz_rhs, Kpsi_rhs, Kphi_rhs
  real*8, dimension(ext(1),ext(2),ext(3)),intent(out) :: rho,Sx,Sy,Sz
  real*8, dimension(ext(1),ext(2),ext(3)),intent(out) :: Sxx,Sxy,Sxz,Syy,Syz,Szz
  real*8,intent(in) :: eps
!  gont = 0: success; gont = 1: something wrong
  integer::gont

!~~~~~~> Other variables:

  real*8, dimension(ext(1),ext(2),ext(3)) :: gxx,gyy,gzz,gxy,gxz,gyz
  real*8, dimension(ext(1),ext(2),ext(3)) :: chix,chiy,chiz,chi3o2
  real*8, dimension(ext(1),ext(2),ext(3)) :: gxxx,gxyx,gxzx,gyyx,gyzx,gzzx
  real*8, dimension(ext(1),ext(2),ext(3)) :: gxxy,gxyy,gxzy,gyyy,gyzy,gzzy
  real*8, dimension(ext(1),ext(2),ext(3)) :: gxxz,gxyz,gxzz,gyyz,gyzz,gzzz
  real*8, dimension(ext(1),ext(2),ext(3)) :: Lapx,Lapy,Lapz
  real*8, dimension(ext(1),ext(2),ext(3)) :: betaxx,betaxy,betaxz
  real*8, dimension(ext(1),ext(2),ext(3)) :: betayx,betayy,betayz
  real*8, dimension(ext(1),ext(2),ext(3)) :: betazx,betazy,betazz
  real*8, dimension(ext(1),ext(2),ext(3)) :: alpn1,chin1
  real*8, dimension(ext(1),ext(2),ext(3)) :: gupxx,gupxy,gupxz
  real*8, dimension(ext(1),ext(2),ext(3)) :: gupyy,gupyz,gupzz
  real*8, dimension(ext(1),ext(2),ext(3)) :: Exx,Exy,Exz,Eyx,Eyy,Eyz,Ezx,Ezy,Ezz
  real*8, dimension(ext(1),ext(2),ext(3)) :: Bxx,Bxy,Bxz,Byx,Byy,Byz,Bzx,Bzy,Bzz
  real*8, dimension(ext(1),ext(2),ext(3)) :: Kpsix,Kpsiy,Kpsiz
  real*8, dimension(ext(1),ext(2),ext(3)) :: Kphix,Kphiy,Kphiz
  real*8, dimension(ext(1),ext(2),ext(3)) :: lEx,lEy,lEz,lBx,lBy,lBz

  real*8,dimension(3) ::SSS,AAS,ASA,SAA,ASS,SAS,SSA
  real*8            :: dX, dY, dZ, PI
  real*8, parameter :: ONE = 1.D0, TWO = 2.D0, FOUR = 4.D0
  real*8, parameter :: SYM = 1.D0, ANTI= - 1.D0
  real*8, parameter :: F3o2=1.5d0,EIT=8.d0
  real*8,parameter  :: kappa = 1.d0

!!! sanity check
  dX = sum(Ex)+sum(Ey)+sum(Ez)+sum(Bx)+sum(By)+sum(Bz)+sum(Kpsi)+sum(Kphi)
  if(dX.ne.dX) then
     if(sum(Ex).ne.sum(Ex))write(*,*)"empart.f90: find NaN in Ex"
     if(sum(Ey).ne.sum(Ey))write(*,*)"empart.f90: find NaN in Ey"
     if(sum(Ez).ne.sum(Ez))write(*,*)"empart.f90: find NaN in Ez"
     if(sum(Bx).ne.sum(Bx))write(*,*)"empart.f90: find NaN in Bx"
     if(sum(By).ne.sum(By))write(*,*)"empart.f90: find NaN in By"
     if(sum(Bz).ne.sum(Bz))write(*,*)"empart.f90: find NaN in Bz"
     if(sum(Kpsi).ne.sum(Kpsi))write(*,*)"empart.f90: find NaN in Kpsi"
     if(sum(Kphi).ne.sum(Kphi))write(*,*)"empart.f90: find NaN in Kphi"
     gont = 1
     return
  endif

  PI = dacos(-ONE)

  dX = crho(2) - crho(1)
  dY = sigma(2) - sigma(1)
  dZ = R(2) - R(1)

  alpn1 = Lap + ONE
  chin1 = chi + ONE
  chi3o2  = dsqrt(chin1)**3
  gxx = dxx + ONE
  gyy = dyy + ONE
  gzz = dzz + ONE
  gxy = dxy
  gxz = dxz
  gyz = dyz

  call fderivs_shc(ext,Lap,Lapx,Lapy,Lapz,crho,sigma,R, SYM, SYM,SYM,Symmetry,Lev,sst,          &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,betax,betaxx,betaxy,betaxz,crho,sigma,R,ANTI, SYM, SYM,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,betay,betayx,betayy,betayz,crho,sigma,R, SYM,ANTI, SYM,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,betaz,betazx,betazy,betazz,crho,sigma,R, SYM, SYM,ANTI,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
 
  call fderivs_shc(ext,chi,chix,chiy,chiz,crho,sigma,R, SYM, SYM,SYM,Symmetry,Lev,sst,          &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)

  call fderivs_shc(ext,dxx,gxxx,gxxy,gxxz,crho,sigma,R, SYM, SYM,SYM,Symmetry,Lev,sst,          &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,gxy,gxyx,gxyy,gxyz,crho,sigma,R,ANTI,ANTI,SYM,Symmetry,Lev,sst,          &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,gxz,gxzx,gxzy,gxzz,crho,sigma,R,ANTI,SYM ,ANTI,Symmetry,Lev,sst,         &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,dyy,gyyx,gyyy,gyyz,crho,sigma,R, SYM, SYM,SYM,Symmetry,Lev,sst,          &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,gyz,gyzx,gyzy,gyzz,crho,sigma,R,SYM ,ANTI,ANTI,Symmetry,Lev,sst,         &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,dzz,gzzx,gzzy,gzzz,crho,sigma,R, SYM, SYM,SYM,Symmetry,Lev,sst,          &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)

  call fderivs_shc(ext,Kpsi,Kpsix,Kpsiy,Kpsiz,crho,sigma,R, SYM, SYM,SYM,Symmetry,Lev,sst,          &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,Kphi,Kphix,Kphiy,Kphiz,crho,sigma,R, SYM, SYM,SYM,Symmetry,Lev,sst,          &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)

  call fderivs_shc(ext,Ex,Exx,Exy,Exz,crho,sigma,R,ANTI, SYM, SYM,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,Ey,Eyx,Eyy,Eyz,crho,sigma,R, SYM,ANTI, SYM,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,Ez,Ezx,Ezy,Ezz,crho,sigma,R, SYM, SYM,ANTI,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)

#if 1    
  call fderivs_shc(ext,Bx,Bxx,Bxy,Bxz,crho,sigma,R, SYM,ANTI,ANTI,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,By,Byx,Byy,Byz,crho,sigma,R,ANTI, SYM,ANTI,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,Bz,Bzx,Bzy,Bzz,crho,sigma,R,ANTI,ANTI, SYM,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
#else 
  call fderivs_shc(ext,Bx,Bxx,Bxy,Bxz,crho,sigma,R,ANTI, SYM, SYM,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,By,Byx,Byy,Byz,crho,sigma,R, SYM,ANTI, SYM,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
  call fderivs_shc(ext,Bz,Bzx,Bzy,Bzz,crho,sigma,R, SYM, SYM,ANTI,Symmetry,Lev,sst, &
                       drhodx, drhody, drhodz,                                                 &
                       dsigmadx,dsigmady,dsigmadz,                                             &
                       dRdx,dRdy,dRdz)
#endif
! check axal vector
! physical gij
  gxx = gxx/chin1
  gxy = gxy/chin1
  gxz = gxz/chin1
  gyy = gyy/chin1
  gyz = gyz/chin1
  gzz = gzz/chin1
!physical gij,k  
  gxxx = (gxxx-gxx*chix)/chin1
  gxxy = (gxxy-gxx*chiy)/chin1
  gxxz = (gxxz-gxx*chiz)/chin1
  gxyx = (gxyx-gxy*chix)/chin1
  gxyy = (gxyy-gxy*chiy)/chin1
  gxyz = (gxyz-gxy*chiz)/chin1
  gxzx = (gxzx-gxz*chix)/chin1
  gxzy = (gxzy-gxz*chiy)/chin1
  gxzz = (gxzz-gxz*chiz)/chin1
  gyyx = (gyyx-gyy*chix)/chin1
  gyyy = (gyyy-gyy*chiy)/chin1
  gyyz = (gyyz-gyy*chiz)/chin1
  gyzx = (gyzx-gyz*chix)/chin1
  gyzy = (gyzy-gyz*chiy)/chin1
  gyzz = (gyzz-gyz*chiz)/chin1
  gzzx = (gzzx-gzz*chix)/chin1
  gzzy = (gzzy-gzz*chiy)/chin1
  gzzz = (gzzz-gzz*chiz)/chin1

! physical inverse metric
  gupzz =  gxx * gyy * gzz + gxy * gyz * gxz + gxz * gxy * gyz - &
           gxz * gyy * gxz - gxy * gxy * gzz - gxx * gyz * gyz
  gupxx =   ( gyy * gzz - gyz * gyz ) / gupzz
  gupxy = - ( gxy * gzz - gyz * gxz ) / gupzz
  gupxz =   ( gxy * gyz - gyy * gxz ) / gupzz
  gupyy =   ( gxx * gzz - gxz * gxz ) / gupzz
  gupyz = - ( gxx * gyz - gxy * gxz ) / gupzz
  gupzz =   ( gxx * gyy - gxy * gxy ) / gupzz

  Ex_rhs = alpn1*trK*Ex-(Ex*betaxx+Ey*betaxy+Ez*betaxz)                  &
          -FOUR*PI*alpn1*Jx-alpn1*(gupxx*Kpsix+gupxy*Kpsiy+gupxz*Kpsiz)  &
          +chi3o2*(                                                      &
          ((gxz*Bx+gyz*By+gzz*Bz)*Lapy+alpn1*(gxz*Bxy+gyz*Byy+gzz*Bzy)+alpn1*(Bx*gxzy+By*gyzy+Bz*gzzy))-&
          ((gxy*Bx+gyy*By+gyz*Bz)*Lapz+alpn1*(gxy*Bxz+gyy*Byz+gyz*Bzz)+alpn1*(Bx*gxyz+By*gyyz+Bz*gyzz)))
  Ey_rhs = alpn1*trK*Ey-(Ex*betayx+Ey*betayy+Ez*betayz)                  &
          -FOUR*PI*alpn1*Jy-alpn1*(gupxy*Kpsix+gupyy*Kpsiy+gupyz*Kpsiz)  &
          +chi3o2*(                                                      &
          ((gxx*Bx+gxy*By+gxz*Bz)*Lapz+alpn1*(gxx*Bxz+gxy*Byz+gxz*Bzz)+alpn1*(Bx*gxxz+By*gxyz+Bz*gxzz))-&
          ((gxz*Bx+gyz*By+gzz*Bz)*Lapx+alpn1*(gxz*Bxx+gyz*Byx+gzz*Bzx)+alpn1*(Bx*gxzx+By*gyzx+Bz*gzzx)))
  Ez_rhs = alpn1*trK*Ez-(Ex*betazx+Ey*betazy+Ez*betazz)                  &
          -FOUR*PI*alpn1*Jz-alpn1*(gupxz*Kpsix+gupyz*Kpsiy+gupzz*Kpsiz)  &
          +chi3o2*(                                                      &
          ((gxy*Bx+gyy*By+gyz*Bz)*Lapx+alpn1*(gxy*Bxx+gyy*Byx+gyz*Bzx)+alpn1*(Bx*gxyx+By*gyyx+Bz*gyzx))-&
          ((gxx*Bx+gxy*By+gxz*Bz)*Lapy+alpn1*(gxx*Bxy+gxy*Byy+gxz*Bzy)+alpn1*(Bx*gxxy+By*gxyy+Bz*gxzy)))

  Bx_rhs = alpn1*trK*Bx-(Bx*betaxx+By*betaxy+Bz*betaxz)                  &
                           -alpn1*(gupxx*Kphix+gupxy*Kphiy+gupxz*Kphiz)  &
          -chi3o2*(                                                      &
          ((gxz*Ex+gyz*Ey+gzz*Ez)*Lapy+alpn1*(gxz*Exy+gyz*Eyy+gzz*Ezy)+alpn1*(Ex*gxzy+Ey*gyzy+Ez*gzzy))-&
          ((gxy*Ex+gyy*Ey+gyz*Ez)*Lapz+alpn1*(gxy*Exz+gyy*Eyz+gyz*Ezz)+alpn1*(Ex*gxyz+Ey*gyyz+Ez*gyzz)))
  By_rhs = alpn1*trK*By-(Bx*betayx+By*betayy+Bz*betayz)                  &
                           -alpn1*(gupxy*Kphix+gupyy*Kphiy+gupyz*Kphiz)  &
          -chi3o2*(                                                      &
          ((gxx*Ex+gxy*Ey+gxz*Ez)*Lapz+alpn1*(gxx*Exz+gxy*Eyz+gxz*Ezz)+alpn1*(Ex*gxxz+Ey*gxyz+Ez*gxzz))-&
          ((gxz*Ex+gyz*Ey+gzz*Ez)*Lapx+alpn1*(gxz*Exx+gyz*Eyx+gzz*Ezx)+alpn1*(Ex*gxzx+Ey*gyzx+Ez*gzzx)))
  Bz_rhs = alpn1*trK*Bz-(Bx*betazx+By*betazy+Bz*betazz)                  &
                           -alpn1*(gupxz*Kphix+gupyz*Kphiy+gupzz*Kphiz)  &
          -chi3o2*(                                                      &
          ((gxy*Ex+gyy*Ey+gyz*Ez)*Lapx+alpn1*(gxy*Exx+gyy*Eyx+gyz*Ezx)+alpn1*(Ex*gxyx+Ey*gyyx+Ez*gyzx))-&
          ((gxx*Ex+gxy*Ey+gxz*Ez)*Lapy+alpn1*(gxx*Exy+gxy*Eyy+gxz*Ezy)+alpn1*(Ex*gxxy+Ey*gxyy+Ez*gxzy)))

  Kpsi_rhs = FOUR*PI*alpn1*qchar-alpn1*kappa*Kpsi - &
            alpn1*(Exx+Eyy+Ezz-F3o2/chin1*(chix*Ex+chiy*Ey+chiz*Ez)) 
  Kphi_rhs =                    -alpn1*kappa*Kphi - &
            alpn1*(Bxx+Byy+Bzz-F3o2/chin1*(chix*Bx+chiy*By+chiz*Bz)) 

  SSS(1)=SYM
  SSS(2)=SYM
  SSS(3)=SYM

  AAS(1)=ANTI
  AAS(2)=ANTI
  AAS(3)=SYM

  ASA(1)=ANTI
  ASA(2)=SYM
  ASA(3)=ANTI

  SAA(1)=SYM
  SAA(2)=ANTI
  SAA(3)=ANTI

  ASS(1)=ANTI
  ASS(2)=SYM
  ASS(3)=SYM

  SAS(1)=SYM
  SAS(2)=ANTI
  SAS(3)=SYM

  SSA(1)=SYM
  SSA(2)=SYM
  SSA(3)=ANTI

!!!!!!!!!advection term part
  Kpsi_rhs = Kpsi_rhs + betax*Kpsix+betay*Kpsiy+betaz*Kpsiz
  Kphi_rhs = Kphi_rhs + betax*Kphix+betay*Kphiy+betaz*Kphiz

  Ex_rhs = Ex_rhs + betax*Exx+betay*Exy+betaz*Exz
  Ey_rhs = Ey_rhs + betax*Eyx+betay*Eyy+betaz*Eyz
  Ez_rhs = Ez_rhs + betax*Ezx+betay*Ezy+betaz*Ezz

  Bx_rhs = Bx_rhs + betax*Bxx+betay*Bxy+betaz*Bxz
  By_rhs = By_rhs + betax*Byx+betay*Byy+betaz*Byz
  Bz_rhs = Bz_rhs + betax*Bzx+betay*Bzy+betaz*Bzz

! numerical dissipation part
  if(eps>0)then 
! usual Kreiss-Oliger dissipation 

  call kodis_sh(ext,crho,sigma,R,Kpsi,Kpsi_rhs,SSS,Symmetry,eps,sst)
  call kodis_sh(ext,crho,sigma,R,Kphi,Kphi_rhs,SSS,Symmetry,eps,sst)
  call kodis_sh(ext,crho,sigma,R,Ex,Ex_rhs,ASS,Symmetry,eps,sst)
  call kodis_sh(ext,crho,sigma,R,Ey,Ey_rhs,SAS,Symmetry,eps,sst)
  call kodis_sh(ext,crho,sigma,R,Ez,Ez_rhs,SSA,Symmetry,eps,sst)
  call kodis_sh(ext,crho,sigma,R,Bx,Bx_rhs,SAA,Symmetry,eps,sst)
  call kodis_sh(ext,crho,sigma,R,By,By_rhs,ASA,Symmetry,eps,sst)
  call kodis_sh(ext,crho,sigma,R,Bz,Bz_rhs,AAS,Symmetry,eps,sst)

  endif
! stress-energy tensor
  rho = (gxx*(Ex*Ex+Bx*Bx)+gyy*(Ey*Ey+By*By)+gzz*(Ez*Ez+Bz*Bz) + &
      +TWO*(gxy*(Ex*Ey+Bx*By)+gxz*(Ex*Ez+Bx*Bz)+gyz*(Ey*Ez+By*Bz)))/EIT/PI
  Sx = (Ey*Bz-Ez*By)/FOUR/PI/chi3o2
  Sy = (Ez*Bx-Ex*Bz)/FOUR/PI/chi3o2
  Sz = (Ex*By-Ey*Bx)/FOUR/PI/chi3o2
  lEx = gxx*Ex+gxy*Ey+gxz*Ez
  lEy = gxy*Ex+gyy*Ey+gyz*Ez
  lEz = gxz*Ex+gyz*Ey+gzz*Ez
  lBx = gxx*Bx+gxy*By+gxz*Bz
  lBy = gxy*Bx+gyy*By+gyz*Bz
  lBz = gxz*Bx+gyz*By+gzz*Bz
  Sxx = rho*gxx-(lEx*lEx+lBx*lBx)/FOUR/PI
  Sxy = rho*gxy-(lEx*lEy+lBx*lBy)/FOUR/PI
  Sxz = rho*gxz-(lEx*lEz+lBx*lBz)/FOUR/PI
  Syy = rho*gyy-(lEy*lEy+lBy*lBy)/FOUR/PI
  Syz = rho*gyz-(lEy*lEz+lBy*lBz)/FOUR/PI
  Szz = rho*gzz-(lEz*lEz+lBz*lBz)/FOUR/PI

  gont = 0

  return

  end function compute_rhs_empart_ss