00001 subroutine source_virial_gravity_WL(sou_Wgra)
00002 use phys_constant, only : long, pi
00003 use grid_parameter, only : nrg, ntg, npg
00004 use def_metric, only : psi, alph, tfkijkij, trk, &
00005 & bvxu, bvyu, bvzu, bvxd, bvyd, bvzd
00006 use def_metric_hij, only : hxxu, hxyu, hxzu, hyyu, hyzu, hzzu
00007 use def_ricci_tensor, only : rab
00008 use interface_grgrad_midpoint
00009 use interface_interpo_linear_type0
00010 use make_array_3d
00011 use make_array_4d
00012 implicit none
00013 integer :: ia, ib, irg, itg, ipg
00014 real(long) :: pi4inv
00015 real(long) :: alpgc, psigc, bvxgc, bvygc, bvzgc, gamu(3,3),
00016 hhxxu, hhxyu, hhxzu, hhyxu, hhyyu, hhyzu, &
00017 hhzxu, hhzyu, hhzzu, ric(3,3), ricsc, &
00018 psigc2, psigc6, alp2inv, psal2inv, aijaij, trkgc, &
00019 dapsi(3), daalph(3), dpsi2, dalph2, bvdal, fac23
00020 real(long), pointer :: sou_Wgra(:,:,:)
00021 real(long), pointer :: dfdx(:,:,:), dfdy(:,:,:), dfdz(:,:,:)
00022 real(long), pointer :: grada(:,:,:,:), gradp(:,:,:,:)
00023
00024
00025
00026
00027 call alloc_array3d(dfdx,1,nrg,1,ntg,1,npg)
00028 call alloc_array3d(dfdy,1,nrg,1,ntg,1,npg)
00029 call alloc_array3d(dfdz,1,nrg,1,ntg,1,npg)
00030 call alloc_array4d(grada,1,nrg,1,ntg,1,npg,1,3)
00031 call alloc_array4d(gradp,1,nrg,1,ntg,1,npg,1,3)
00032
00033 call grgrad_midpoint(psi,dfdx,dfdy,dfdz)
00034 gradp(1:nrg,1:ntg,1:npg,1) = dfdx(1:nrg,1:ntg,1:npg)
00035 gradp(1:nrg,1:ntg,1:npg,2) = dfdy(1:nrg,1:ntg,1:npg)
00036 gradp(1:nrg,1:ntg,1:npg,3) = dfdz(1:nrg,1:ntg,1:npg)
00037 call grgrad_midpoint(alph,dfdx,dfdy,dfdz)
00038 grada(1:nrg,1:ntg,1:npg,1) = dfdx(1:nrg,1:ntg,1:npg)
00039 grada(1:nrg,1:ntg,1:npg,2) = dfdy(1:nrg,1:ntg,1:npg)
00040 grada(1:nrg,1:ntg,1:npg,3) = dfdz(1:nrg,1:ntg,1:npg)
00041 pi4inv = 1.0d0/(4.0d0*pi)
00042
00043 fac23 = 2.0d0/3.0d0
00044 do ipg = 1, npg
00045 do itg = 1, ntg
00046 do irg = 1, nrg
00047
00048 call interpo_linear_type0(psigc,psi,irg,itg,ipg)
00049 call interpo_linear_type0(alpgc,alph,irg,itg,ipg)
00050 call interpo_linear_type0(bvxgc,bvxu,irg,itg,ipg)
00051 call interpo_linear_type0(bvygc,bvyu,irg,itg,ipg)
00052 call interpo_linear_type0(bvzgc,bvzu,irg,itg,ipg)
00053 call interpo_linear_type0(hhxxu,hxxu,irg,itg,ipg)
00054 call interpo_linear_type0(hhxyu,hxyu,irg,itg,ipg)
00055 call interpo_linear_type0(hhxzu,hxzu,irg,itg,ipg)
00056 call interpo_linear_type0(hhyyu,hyyu,irg,itg,ipg)
00057 call interpo_linear_type0(hhyzu,hyzu,irg,itg,ipg)
00058 call interpo_linear_type0(hhzzu,hzzu,irg,itg,ipg)
00059 hhyxu = hhxyu
00060 hhzxu = hhxzu
00061 hhzyu = hhyzu
00062 gamu(1,1) = hhxxu + 1.0d0
00063 gamu(1,2) = hhxyu
00064 gamu(1,3) = hhxzu
00065 gamu(2,2) = hhyyu + 1.0d0
00066 gamu(2,3) = hhyzu
00067 gamu(3,3) = hhzzu + 1.0d0
00068 gamu(2,1) = gamu(1,2)
00069 gamu(3,1) = gamu(1,3)
00070 gamu(3,2) = gamu(2,3)
00071 psigc2 = psigc**2
00072 psigc6 = psigc**6
00073 alp2inv = 1.0d0/alpgc**2
00074 psal2inv= (psigc/alpgc)**2
00075 aijaij = tfkijkij(irg,itg,ipg)
00076 trkgc = trk(irg,itg,ipg)
00077 ric(1,1) = rab(irg,itg,ipg,1)
00078 ric(1,2) = rab(irg,itg,ipg,2)
00079 ric(1,3) = rab(irg,itg,ipg,3)
00080 ric(2,2) = rab(irg,itg,ipg,4)
00081 ric(2,3) = rab(irg,itg,ipg,5)
00082 ric(3,3) = rab(irg,itg,ipg,6)
00083 ric(2,1) = ric(1,2)
00084 ric(3,1) = ric(1,3)
00085 ric(3,2) = ric(2,3)
00086 dapsi(1:3) = gradp(irg,itg,ipg,1:3)
00087 daalph(1:3) = grada(irg,itg,ipg,1:3)
00088
00089 dpsi2 = 0.0d0
00090 dalph2 = 0.0d0
00091 ricsc = 0.0d0
00092 do ib = 1, 3
00093 do ia = 1, 3
00094 dpsi2 = dpsi2 + gamu(ia,ib)*dapsi( ia)*dapsi( ib)
00095 dalph2 = dalph2+ gamu(ia,ib)*daalph(ia)*daalph(ib)
00096 ricsc = ricsc + gamu(ia,ib)*ric(ia,ib)
00097 end do
00098 end do
00099 bvdal = bvxgc*daalph(1) + bvygc*daalph(2) + bvzgc*daalph(3)
00100
00101 sou_Wgra(irg,itg,ipg) = pi4inv*(2.0d0*dpsi2 - psal2inv*dalph2 &
00102 & + 0.75d0*psigc6*(aijaij - fac23*trkgc**2) &
00103 & + psigc6*alp2inv*trkgc*bvdal + 0.25*ricsc*psigc2)
00104
00105 end do
00106 end do
00107 end do
00108
00109 deallocate(dfdx)
00110 deallocate(dfdy)
00111 deallocate(dfdz)
00112 deallocate(grada)
00113 deallocate(gradp)
00114
00115 end subroutine source_virial_gravity_WL