00001 subroutine gauge_shift
00002 use phys_constant, only : long
00003 use grid_parameter, only : nrg, ntg, npg
00004 use coordinate_grav_r, only : rg
00005 use def_matter, only : rs
00006 use def_metric, only : psi, bvxu, bvyu, bvzu
00007 use interface_poisson_solver
00008 use make_array_3d
00009 use interface_interpo_linear_type0
00010 use interface_grgrad_4th_gridpoint
00011 use interface_grgrad_midpoint_type0
00012 implicit none
00013
00014 real(long), pointer :: sou(:,:,:), gauge(:,:,:)
00015 real(long) :: psigc, bvxgc, bvygc, bvzgc,
00016 & divbv, dxpsi, dypsi, dzpsi, bvudpsi, psi6inv
00017 real(long) :: dgadx, dgady, dgadz
00018 integer :: irg, itg, ipg
00019
00020 call alloc_array3d(sou,0,nrg,0,ntg,0,npg)
00021 call alloc_array3d(gauge,0,nrg,0,ntg,0,npg)
00022
00023
00024
00025 do ipg = 1, npg
00026 do itg = 1, ntg
00027 do irg = 1, nrg
00028
00029 call interpo_linear_type0(psigc,psi,irg,itg,ipg)
00030 call interpo_linear_type0(bvxgc,bvxu,irg,itg,ipg)
00031 call interpo_linear_type0(bvygc,bvyu,irg,itg,ipg)
00032 call interpo_linear_type0(bvzgc,bvzu,irg,itg,ipg)
00033 call grgrad_midpoint_type0(psi,dxpsi,dypsi,dzpsi,irg,itg,ipg)
00034 divbv = cdivbv(irg,itg,ipg)
00035 bvudpsi = bvxgc*dxpsi + bvygc*dypsi + bvzgc*dzpsi
00036 sou(irg,itg,ipg)=psigc**6*(-divbv-6.0d0/psigc*bvudpsi)
00037
00038 end do
00039 end do
00040 end do
00041
00042 call poisson_solver(sou,gauge)
00043
00044 do ipg = 0, npg
00045 do itg = 0, ntg
00046 do irg = 0, nrg
00047
00048 psi6inv = 1.0d0/psi(irg,itg,ipg)**6
00049 call grgrad_4th_gridpoint(gauge,dgadx,dgady,dgadz,irg,itg,ipg)
00050
00051 bvxu(irg,itg,ipg) = bvxu(irg,itg,ipg) + psi6inv*dgadx
00052 bvyu(irg,itg,ipg) = bvyu(irg,itg,ipg) + psi6inv*dgady
00053 bvzu(irg,itg,ipg) = bvzu(irg,itg,ipg) + psi6inv*dgadz
00054
00055 end do
00056 end do
00057 end do
00058
00059 deallocate(sou)
00060 deallocate(gauge)
00061 end subroutine gauge_shift