00001 subroutine sourceterm_MoC_CF_with_divshift_r3rd(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_4th_gridpoint_bhex
00010 use interface_grgrad_midpoint_r3rd_nsbh
00011 use interface_grgrad_midpoint_r3rd_type0_bh
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_4th_gridpoint_bhex(bvxd,dbxdx,dbxdy,dbxdz,irg,itg,ipg)
00049 call grgrad_4th_gridpoint_bhex(bvyd,dbydx,dbydy,dbydz,irg,itg,ipg)
00050 call grgrad_4th_gridpoint_bhex(bvzd,dbzdx,dbzdy,dbzdz,irg,itg,ipg)
00051 divBeta(irg,itg,ipg) = dbxdx + dbydy + dbzdz
00052 end do
00053 end do
00054 end do
00055
00056 call grgrad_midpoint_r3rd_nsbh(fnc2,grad2x,grad2y,grad2z,'bh')
00057
00058 do ipg = 1, npg
00059 do itg = 1, ntg
00060 do irg = 1, nrg
00061 call grgrad_midpoint_r3rd_type0_bh(divBeta,dxafn,dyafn,dzafn,irg,itg,ipg)
00062 ddivBeta(irg,itg,ipg,1) = dxafn
00063 ddivBeta(irg,itg,ipg,2) = dyafn
00064 ddivBeta(irg,itg,ipg,3) = dzafn
00065 end do
00066 end do
00067 end do
00068
00069 do ii = 1, 3
00070 do ipg = 1, npg
00071 do itg = 1, ntg
00072 do irg = 1, nrg
00073 call interpo_linear_type0(alpgc,alph,irg,itg,ipg)
00074 call interpo_linear_type0(fnc2gc,fnc2,irg,itg,ipg)
00075 afnc2inv = alpgc/fnc2gc
00076
00077
00078
00079 dxafn = grad2x(irg,itg,ipg)
00080 dyafn = grad2y(irg,itg,ipg)
00081 dzafn = grad2z(irg,itg,ipg)
00082 tfkax = tfkij(irg,itg,ipg,ii,1)
00083 tfkay = tfkij(irg,itg,ipg,ii,2)
00084 tfkaz = tfkij(irg,itg,ipg,ii,3)
00085
00086 souvec(irg,itg,ipg,ii) = - 2.0d0*afnc2inv &
00087 & *(tfkax*dxafn + tfkay*dyafn + tfkaz*dzafn) &
00088 & - san*ddivBeta(irg,itg,ipg,ii)
00089
00090 end do
00091 end do
00092 end do
00093 end do
00094
00095 deallocate(fnc2)
00096 deallocate(grad2x)
00097 deallocate(grad2y)
00098 deallocate(grad2z)
00099 deallocate(divBeta)
00100 deallocate(ddivBeta)
00101
00102 end subroutine sourceterm_MoC_CF_with_divshift_r3rd