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, alph, bvxu, bvyu, bvzu
00007 use def_shift_derivatives, only : cdivbv
00008 use def_vector_x, only : hvec_xg
00009 use interface_poisson_solver_1bh_homosol
00010 use make_array_2d
00011 use make_array_3d
00012 use interface_grgrad_4th_gridpoint
00013 use interface_grgrad_midpoint_type0
00014 use interface_interpo_linear_type0
00015 implicit none
00016 real(long), pointer :: sou(:,:,:), gauge(:,:,:)
00017 real(long), pointer :: sou_bhsurf(:,:), dsou_bhsurf(:,:)
00018 real(long), pointer :: sou_outsurf(:,:), dsou_outsurf(:,:)
00019 real(long) :: psigc, alphgc, bvxgc, bvygc, bvzgc, alphinv, alpsinv,
00020 divbv, dxpsi, dypsi, dzpsi, bvudpsi, x, y, z, traceK, &
00021 psi6inv
00022 real(long) :: dgadx, dgady, dgadz
00023 integer :: irg, itg, ipg
00024
00025 call alloc_array3d(sou,0,nrg,0,ntg,0,npg)
00026 call alloc_array3d(gauge,0,nrg,0,ntg,0,npg)
00027 call alloc_array2d(sou_bhsurf,0,ntg,0,npg)
00028 call alloc_array2d(dsou_bhsurf,0,ntg,0,npg)
00029 call alloc_array2d(sou_outsurf,0,ntg,0,npg)
00030 call alloc_array2d(dsou_outsurf,0,ntg,0,npg)
00031
00032
00033
00034 do ipg = 1, npg
00035 do itg = 1, ntg
00036 do irg = 1, nrg
00037
00038 call interpo_linear_type0(psigc,psi,irg,itg,ipg)
00039 call interpo_linear_type0(alphgc,alph,irg,itg,ipg)
00040 call interpo_linear_type0(bvxgc,bvxu,irg,itg,ipg)
00041 call interpo_linear_type0(bvygc,bvyu,irg,itg,ipg)
00042 call interpo_linear_type0(bvzgc,bvzu,irg,itg,ipg)
00043 call grgrad_midpoint_type0(psi,dxpsi,dypsi,dzpsi,irg,itg,ipg)
00044 x = hvec_xg(irg,itg,ipg,1)
00045 y = hvec_xg(irg,itg,ipg,2)
00046 z = hvec_xg(irg,itg,ipg,3)
00047 call kerr_schild_traceK(x,y,z,traceK)
00048 divbv = cdivbv(irg,itg,ipg)
00049 bvudpsi = bvxgc*dxpsi + bvygc*dypsi + bvzgc*dzpsi
00050 sou(irg,itg,ipg)=psigc**6*(alphgc*traceK-divbv-6.0d0/psigc*bvudpsi)
00051
00052
00053
00054
00055
00056
00057
00058 end do
00059 end do
00060 end do
00061
00062 sou_bhsurf( 0:ntg,0:npg) = 0.0d0
00063 dsou_bhsurf( 0:ntg,0:npg) = 0.0d0
00064 sou_outsurf(0:ntg,0:npg) = 0.0d0
00065 dsou_outsurf(0:ntg,0:npg) = 0.0d0
00066 call poisson_solver_1bh_homosol('nd',sou, &
00067 & sou_bhsurf,dsou_bhsurf, &
00068 & sou_outsurf,dsou_outsurf,gauge)
00069
00070 do ipg = 0, npg
00071 do itg = 0, ntg
00072 do irg = 0, nrg
00073
00074 psi6inv = 1.0d0/psi(irg,itg,ipg)**6
00075 call grgrad_4th_gridpoint(gauge,dgadx,dgady,dgadz,irg,itg,ipg)
00076
00077 bvxu(irg,itg,ipg) = bvxu(irg,itg,ipg) + psi6inv*dgadx
00078 bvyu(irg,itg,ipg) = bvyu(irg,itg,ipg) + psi6inv*dgady
00079 bvzu(irg,itg,ipg) = bvzu(irg,itg,ipg) + psi6inv*dgadz
00080
00081 end do
00082 end do
00083 end do
00084
00085 deallocate(sou)
00086 deallocate(gauge)
00087 deallocate(sou_bhsurf)
00088 deallocate(dsou_bhsurf)
00089 deallocate(sou_outsurf)
00090 deallocate(dsou_outsurf)
00091 end subroutine gauge_shift