00001 subroutine sourceterm_MoC_CF_with_divshift(souvec)
00002 use phys_constant, only : long
00003 use grid_parameter, only : nrg, ntg, npg
00004 use def_metric
00005 use def_bh_parameter, only : ome_bh
00006 use make_array_3d
00007 use make_array_4d
00008 use interface_interpo_linear_type0
00009 use interface_grgrad_midpoint
00010 use interface_grgrad_midpoint_type0
00011 use interface_grgrad_gridpoint_type0
00012 use interface_dadbscalar_3rd2nd_type0
00013 use def_vector_phi, only : vec_phig
00014 implicit none
00015 real(long), pointer :: souvec(:,:,:,:), ddivBeta(:,:,:,:)
00016 real(long), pointer :: fnc2(:,:,:), divBeta(:,:,:)
00017 real(long), pointer :: grad2x(:,:,:), grad2y(:,:,:), grad2z(:,:,:)
00018 real(long) :: san, san2
00019 real(long) :: alpgc, psigc, fnc2gc, afnc2inv, dxafn, dyafn, dzafn
00020 real(long) :: ovxu, ovyu, ovzu
00021 real(long) :: tfkax, tfkay, tfkaz
00022 real(long) :: dbxdx,dbxdy,dbxdz, dbydx,dbydy,dbydz, dbzdx,dbzdy,dbzdz
00023 real(long) :: d2bvx(3,3), d2bvy(3,3), d2bvz(3,3)
00024 integer :: ii, irg, itg, ipg, impt
00025
00026 call alloc_array3d(fnc2,0,nrg,0,ntg,0,npg)
00027 call alloc_array3d(grad2x,1,nrg,1,ntg,1,npg)
00028 call alloc_array3d(grad2y,1,nrg,1,ntg,1,npg)
00029 call alloc_array3d(grad2z,1,nrg,1,ntg,1,npg)
00030 call alloc_array3d(divBeta,0,nrg,0,ntg,0,npg)
00031 call alloc_array4d(ddivBeta,1,nrg,1,ntg,1,npg,1,3)
00032
00033 san = 1.0d0/3.0d0
00034 san2= 2.0d0/3.0d0
00035
00036
00037
00038
00039 do ipg = 0, npg
00040 do itg = 0, ntg
00041 do irg = 0, nrg
00042
00043
00044 psigc = psi(irg,itg,ipg)
00045 alpgc = alph(irg,itg,ipg)
00046 if (alpgc.le.0.0d0) alpgc = 1.0d-20
00047 fnc2(irg,itg,ipg) = psi(irg,itg,ipg)**6/alpgc
00048 call grgrad_gridpoint_type0(bvxd,dbxdx,dbxdy,dbxdz,irg,itg,ipg)
00049 call grgrad_gridpoint_type0(bvyd,dbydx,dbydy,dbydz,irg,itg,ipg)
00050 call grgrad_gridpoint_type0(bvzd,dbzdx,dbzdy,dbzdz,irg,itg,ipg)
00051 divBeta(irg,itg,ipg) = dbxdx + dbydy + dbzdz
00052
00053
00054
00055
00056
00057
00058 end do
00059 end do
00060 end do
00061
00062 call grgrad_midpoint(fnc2,grad2x,grad2y,grad2z)
00063
00064 do ipg = 1, npg
00065 do itg = 1, ntg
00066 do irg = 1, nrg
00067 call grgrad_midpoint_type0(divBeta,dxafn,dyafn,dzafn,irg,itg,ipg)
00068 ddivBeta(irg,itg,ipg,1) = dxafn
00069 ddivBeta(irg,itg,ipg,2) = dyafn
00070 ddivBeta(irg,itg,ipg,3) = dzafn
00071
00072
00073
00074
00075
00076
00077 end do
00078 end do
00079 end do
00080
00081 do ii = 1, 3
00082 do ipg = 1, npg
00083 do itg = 1, ntg
00084 do irg = 1, nrg
00085 call interpo_linear_type0(alpgc,alph,irg,itg,ipg)
00086 call interpo_linear_type0(fnc2gc,fnc2,irg,itg,ipg)
00087 afnc2inv = alpgc/fnc2gc
00088
00089
00090
00091 dxafn = grad2x(irg,itg,ipg)
00092 dyafn = grad2y(irg,itg,ipg)
00093 dzafn = grad2z(irg,itg,ipg)
00094 tfkax = tfkij(irg,itg,ipg,ii,1)
00095 tfkay = tfkij(irg,itg,ipg,ii,2)
00096 tfkaz = tfkij(irg,itg,ipg,ii,3)
00097
00098 souvec(irg,itg,ipg,ii) = - 2.0d0*afnc2inv &
00099 & *(tfkax*dxafn + tfkay*dyafn + tfkaz*dzafn) &
00100 & - san*ddivBeta(irg,itg,ipg,ii)
00101
00102 end do
00103 end do
00104 end do
00105 end do
00106
00107 deallocate(fnc2)
00108 deallocate(grad2x)
00109 deallocate(grad2y)
00110 deallocate(grad2z)
00111 deallocate(divBeta)
00112 deallocate(ddivBeta)
00113
00114 end subroutine sourceterm_MoC_CF_with_divshift