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