00001 subroutine sourceterm_MoC_CF_with_divshift_peos_spin(souvec)
00002 use phys_constant, only : long, pi
00003 use grid_parameter, only : nrg, ntg, npg
00004 use def_metric
00005 use def_bh_parameter, only : ome_bh
00006 use def_matter, only : emdg, omeg, vepxg, vepyg, vepzg, jomeg_int
00007 use def_matter_parameter, only : ome, ber, radi
00008 use def_vector_x
00009 use def_vector_phi
00010 use def_velocity_rot
00011 use make_array_3d
00012 use make_array_4d
00013 use interface_interpo_linear_type0
00014 use interface_grgrad_4th_gridpoint
00015 use interface_grgrad_midpoint_r3rd_nsbh
00016 use interface_grgrad_midpoint_r3rd_type0_ns
00017 use interface_dadbscalar_3rd2nd_type0
00018
00019 implicit none
00020 real(long), pointer :: souvec(:,:,:,:), ddivBeta(:,:,:,:)
00021 real(long), pointer :: fnc2(:,:,:), divBeta(:,:,:), gradtrK(:,:,:,:)
00022 real(long), pointer :: grad2x(:,:,:), grad2y(:,:,:), grad2z(:,:,:)
00023 real(long) :: vphig(3), san, san2, san4, ovdgc(3), lam
00024 real(long) :: emdgc, rhogc, pregc, hhgc, utgc, oterm, zfac, rjj
00025 real(long) :: psigc, alpgc, fnc2gc, afnc2inv, dxafn, dyafn, dzafn
00026 real(long) :: bvxdgc, bvydgc, bvzdgc, tfkax, tfkay, tfkaz, dtrK, ene
00027 real(long) :: omegc, jomeg_intgc
00028
00029 real(long) :: ovxu, ovyu, ovzu, vepxgc, vepygc, vepzgc
00030 real(long) :: dbxdx,dbxdy,dbxdz, dbydx,dbydy,dbydz, dbzdx,dbzdy,dbzdz
00031 real(long) :: d2bvx(3,3), d2bvy(3,3), d2bvz(3,3)
00032 integer :: ii, irg, itg, ipg, impt
00033 real(long) :: wxgc, wygc, wzgc, psigc4, psigcp, alpgc2, dvep2, wdvep, w2,
00034 wterm, uih2, hut
00035
00036 call alloc_array3d(fnc2,0,nrg,0,ntg,0,npg)
00037 call alloc_array3d(grad2x,1,nrg,1,ntg,1,npg)
00038 call alloc_array3d(grad2y,1,nrg,1,ntg,1,npg)
00039 call alloc_array3d(grad2z,1,nrg,1,ntg,1,npg)
00040 call alloc_array3d(divBeta,0,nrg,0,ntg,0,npg)
00041 call alloc_array4d(ddivBeta,1,nrg,1,ntg,1,npg,1,3)
00042 call alloc_array4d(gradtrK,1,nrg,1,ntg,1,npg,1,3)
00043
00044 san = 1.0d0/3.0d0
00045 san2= 2.0d0/3.0d0
00046 san4= 4.0d0/3.0d0
00047
00048
00049
00050
00051 call grgrad_midpoint(trk_grid,grad2x,grad2y,grad2z)
00052 gradtrK(1:nrg,1:ntg,1:npg,1) = grad2x(1:nrg,1:ntg,1:npg)
00053 gradtrK(1:nrg,1:ntg,1:npg,2) = grad2y(1:nrg,1:ntg,1:npg)
00054 gradtrK(1:nrg,1:ntg,1:npg,3) = grad2z(1:nrg,1:ntg,1:npg)
00055
00056 do ipg = 0, npg
00057 do itg = 0, ntg
00058 do irg = 0, nrg
00059
00060
00061 psigc = psi(irg,itg,ipg)
00062 alpgc = alph(irg,itg,ipg)
00063 if (alpgc.le.0.0d0) alpgc = 1.0d-20
00064 fnc2(irg,itg,ipg) = psi(irg,itg,ipg)**6/alpgc
00065 call grgrad_4th_gridpoint(bvxd,dbxdx,dbxdy,dbxdz,irg,itg,ipg)
00066 call grgrad_4th_gridpoint(bvyd,dbydx,dbydy,dbydz,irg,itg,ipg)
00067 call grgrad_4th_gridpoint(bvzd,dbzdx,dbzdy,dbzdz,irg,itg,ipg)
00068
00069 divBeta(irg,itg,ipg) = dbxdx + dbydy + dbzdz
00070
00071
00072
00073
00074
00075
00076 end do
00077 end do
00078 end do
00079
00080 call grgrad_midpoint_r3rd_nsbh(fnc2,grad2x,grad2y,grad2z,'ns')
00081
00082 do ipg = 1, npg
00083 do itg = 1, ntg
00084 do irg = 1, nrg
00085 call grgrad_midpoint_r3rd_type0_ns(divBeta,dxafn,dyafn,dzafn,irg,itg,ipg)
00086 ddivBeta(irg,itg,ipg,1) = dxafn
00087 ddivBeta(irg,itg,ipg,2) = dyafn
00088 ddivBeta(irg,itg,ipg,3) = dzafn
00089
00090
00091
00092
00093
00094
00095 end do
00096 end do
00097 end do
00098
00099 do ii = 1, 3
00100 do ipg = 1, npg
00101 do itg = 1, ntg
00102 do irg = 1, nrg
00103 call interpo_linear_type0(emdgc,emdg,irg,itg,ipg)
00104 call interpo_linear_type0(vepxgc ,vepxg ,irg,itg,ipg)
00105 call interpo_linear_type0(vepygc ,vepyg ,irg,itg,ipg)
00106 call interpo_linear_type0(vepzgc ,vepzg ,irg,itg,ipg)
00107 call interpo_linear_type0(omegc,omeg,irg,itg,ipg)
00108 call interpo_linear_type0(jomeg_intgc,jomeg_int,irg,itg,ipg)
00109 call interpo_linear_type0(psigc,psi,irg,itg,ipg)
00110 call interpo_linear_type0(alpgc,alph,irg,itg,ipg)
00111 call interpo_linear_type0(fnc2gc,fnc2,irg,itg,ipg)
00112 call interpo_linear_type0(bvxdgc,bvxd,irg,itg,ipg)
00113 call interpo_linear_type0(bvydgc,bvyd,irg,itg,ipg)
00114 call interpo_linear_type0(bvzdgc,bvzd,irg,itg,ipg)
00115 call interpo_linear_type0(wxgc,wxspg,irg,itg,ipg)
00116 call interpo_linear_type0(wygc,wyspg,irg,itg,ipg)
00117 call interpo_linear_type0(wzgc,wzspg,irg,itg,ipg)
00118 afnc2inv = alpgc/fnc2gc
00119
00120 dxafn = grad2x(irg,itg,ipg)
00121 dyafn = grad2y(irg,itg,ipg)
00122 dzafn = grad2z(irg,itg,ipg)
00123 tfkax = tfkij(irg,itg,ipg,ii,1)
00124 tfkay = tfkij(irg,itg,ipg,ii,2)
00125 tfkaz = tfkij(irg,itg,ipg,ii,3)
00126 dtrK = gradtrK(irg,itg,ipg,ii)
00127
00128 zfac = 1.0d0
00129 if (emdgc <= 1.0d-15) then
00130 emdgc = 1.0d-15
00131 zfac = 0.0d0
00132 end if
00133 call peos_q2hprho(emdgc, hhgc, pregc, rhogc, ene)
00134
00135 vphig(1) = hvec_phig(irg,itg,ipg,1)
00136 vphig(2) = hvec_phig(irg,itg,ipg,2)
00137 vphig(3) = hvec_phig(irg,itg,ipg,3)
00138 ovdgc(1) = bvxdgc + ome*vphig(1)
00139 ovdgc(2) = bvydgc + ome*vphig(2)
00140 ovdgc(3) = bvzdgc + ome*vphig(3)
00141 lam = ber + ovdgc(1)*vepxgc + ovdgc(2)*vepygc + ovdgc(3)*vepzgc
00142 psigc4 = psigc**4
00143 psigcp = psigc**confpow
00144 alpgc2 = alpgc**2
00145
00146 dvep2 = (vepxgc**2 + vepygc**2 + vepzgc**2)/psigc4
00147 wdvep = (wxgc*vepxgc + wygc*vepygc + wzgc*vepzgc)*psigcp
00148 w2 = psigc4*(wxgc*wxgc + wygc*wygc + wzgc*wzgc)*psigcp**2.0d0
00149
00150 wterm = wdvep + w2
00151 uih2 = dvep2 + 2.0d0*wdvep + w2
00152
00153 if ( (lam*lam + 4.0d0*alpgc2*wterm)<0.0d0 ) then
00154 write(6,*) "hut imaginary....exiting"
00155 stop
00156 end if
00157 hut = (lam + sqrt(lam*lam + 4.0d0*alpgc2*wterm))/(2.0d0*alpgc2)
00158
00159 utgc = hut/hhgc
00160
00161 oterm = 0.0d0
00162 if (ii == 1) oterm = vepxgc/psigc4 + psigcp*wxgc
00163 if (ii == 2) oterm = vepygc/psigc4 + psigcp*wygc
00164 if (ii == 3) oterm = vepzgc/psigc4 + psigcp*wzgc
00165
00166 rjj = rhogc*alpgc*utgc*oterm
00167
00168 souvec(irg,itg,ipg,ii) = - 2.0d0*afnc2inv &
00169 & *(tfkax*dxafn + tfkay*dyafn + tfkaz*dzafn) &
00170 & + san4*alpgc*dtrK &
00171 & - san*ddivBeta(irg,itg,ipg,ii) &
00172 & + radi**2*16.0d0*pi*alpgc*psigc4*rjj*zfac
00173
00174 end do
00175 end do
00176 end do
00177 end do
00178
00179 deallocate(fnc2)
00180 deallocate(grad2x)
00181 deallocate(grad2y)
00182 deallocate(grad2z)
00183 deallocate(divBeta)
00184 deallocate(ddivBeta)
00185 deallocate(gradtrK)
00186
00187 end subroutine sourceterm_MoC_CF_with_divshift_peos_spin