00001 subroutine violation_midpoint_MoC_CF_peos_spin(MoC_vio,cobj)
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_4th_gridpoint_bhex
00016 use interface_grgrad_midpoint_r3rd_nsbh
00017 use interface_grgrad_midpoint_r3rd_type0_ns
00018 use interface_grgrad_midpoint_r3rd_type0_bh
00019 use interface_dadbscalar_3rd2nd_type0
00020
00021 implicit none
00022 real(long), pointer :: MoC_vio(:,:,:,:), ddivBeta(:,:,:,:), Lapla_beta(:,:,:,:)
00023 real(long), pointer :: fnc2(:,:,:), divBeta(:,:,:)
00024 real(long), pointer :: grad2x(:,:,:), grad2y(:,:,:), grad2z(:,:,:)
00025 real(long), pointer :: dbvxddx(:,:,:), dbvxddy(:,:,:), dbvxddz(:,:,:)
00026 real(long), pointer :: dbvyddx(:,:,:), dbvyddy(:,:,:), dbvyddz(:,:,:)
00027 real(long), pointer :: dbvzddx(:,:,:), dbvzddy(:,:,:), dbvzddz(:,:,:)
00028
00029 real(long) :: d2bxdxx, d2bxdxy, d2bxdxz
00030 real(long) :: d2bxdyx, d2bxdyy, d2bxdyz
00031 real(long) :: d2bxdzx, d2bxdzy, d2bxdzz
00032 real(long) :: d2bydxx, d2bydxy, d2bydxz
00033 real(long) :: d2bydyx, d2bydyy, d2bydyz
00034 real(long) :: d2bydzx, d2bydzy, d2bydzz
00035 real(long) :: d2bzdxx, d2bzdxy, d2bzdxz
00036 real(long) :: d2bzdyx, d2bzdyy, d2bzdyz
00037 real(long) :: d2bzdzx, d2bzdzy, d2bzdzz
00038
00039 real(long) :: vphig(3), san, san2, ovdgc(3), lam
00040 real(long) :: emdgc, rhogc, pregc, hhgc, utgc, oterm, zfac, rjj
00041 real(long) :: psigc, alpgc, fnc2gc, afnc2inv, dxafn, dyafn, dzafn
00042 real(long) :: bvxdgc, bvydgc, bvzdgc, tfkax, tfkay, tfkaz, ene
00043 real(long) :: omegc, jomeg_intgc
00044
00045 real(long) :: ovxu, ovyu, ovzu, vepxgc, vepygc, vepzgc
00046 real(long) :: dbxdx,dbxdy,dbxdz, dbydx,dbydy,dbydz, dbzdx,dbzdy,dbzdz
00047 integer :: ii, irg, itg, ipg, impt
00048 real(long) :: wxgc, wygc, wzgc, psigc4, psigcp, alpgc2, dvep2, wdvep, w2,
00049 wterm, uih2, hut
00050 character(len=2), intent(in) :: cobj
00051
00052 call alloc_array3d(fnc2 ,0,nrg,0,ntg,0,npg)
00053 call alloc_array3d(grad2x ,1,nrg,1,ntg,1,npg)
00054 call alloc_array3d(grad2y ,1,nrg,1,ntg,1,npg)
00055 call alloc_array3d(grad2z ,1,nrg,1,ntg,1,npg)
00056 call alloc_array3d(divBeta,0,nrg,0,ntg,0,npg)
00057
00058 call alloc_array3d(dbvxddx,0,nrg,0,ntg,0,npg)
00059 call alloc_array3d(dbvxddy,0,nrg,0,ntg,0,npg)
00060 call alloc_array3d(dbvxddz,0,nrg,0,ntg,0,npg)
00061
00062 call alloc_array3d(dbvyddx,0,nrg,0,ntg,0,npg)
00063 call alloc_array3d(dbvyddy,0,nrg,0,ntg,0,npg)
00064 call alloc_array3d(dbvyddz,0,nrg,0,ntg,0,npg)
00065
00066 call alloc_array3d(dbvzddx,0,nrg,0,ntg,0,npg)
00067 call alloc_array3d(dbvzddy,0,nrg,0,ntg,0,npg)
00068 call alloc_array3d(dbvzddz,0,nrg,0,ntg,0,npg)
00069
00070 call alloc_array4d(Lapla_beta,1,nrg,1,ntg,1,npg,1,3)
00071 call alloc_array4d(ddivBeta ,1,nrg,1,ntg,1,npg,1,3)
00072
00073 san = 1.0d0/3.0d0
00074 san2= 2.0d0/3.0d0
00075
00076
00077
00078
00079 if(cobj=='ns') then
00080
00081 do ipg = 0, npg
00082 do itg = 0, ntg
00083 do irg = 0, nrg
00084
00085
00086 psigc = psi(irg,itg,ipg)
00087 alpgc = alph(irg,itg,ipg)
00088 if (alpgc.le.0.0d0) alpgc = 1.0d-20
00089 fnc2(irg,itg,ipg) = psi(irg,itg,ipg)**6/alpgc
00090 call grgrad_4th_gridpoint(bvxd,dbxdx,dbxdy,dbxdz,irg,itg,ipg)
00091 call grgrad_4th_gridpoint(bvyd,dbydx,dbydy,dbydz,irg,itg,ipg)
00092 call grgrad_4th_gridpoint(bvzd,dbzdx,dbzdy,dbzdz,irg,itg,ipg)
00093
00094 divBeta(irg,itg,ipg) = dbxdx + dbydy + dbzdz
00095
00096 dbvxddx(irg,itg,ipg) = dbxdx
00097 dbvxddy(irg,itg,ipg) = dbxdy
00098 dbvxddz(irg,itg,ipg) = dbxdz
00099
00100 dbvyddx(irg,itg,ipg) = dbydx
00101 dbvyddy(irg,itg,ipg) = dbydy
00102 dbvyddz(irg,itg,ipg) = dbydz
00103
00104 dbvzddx(irg,itg,ipg) = dbzdx
00105 dbvzddy(irg,itg,ipg) = dbzdy
00106 dbvzddz(irg,itg,ipg) = dbzdz
00107 end do
00108 end do
00109 end do
00110
00111 call grgrad_midpoint_r3rd_nsbh(fnc2,grad2x,grad2y,grad2z,'ns')
00112
00113 do ipg = 1, npg
00114 do itg = 1, ntg
00115 do irg = 1, nrg
00116 call grgrad_midpoint_r3rd_type0_ns(divBeta,dxafn,dyafn,dzafn,irg,itg,ipg)
00117 ddivBeta(irg,itg,ipg,1) = dxafn
00118 ddivBeta(irg,itg,ipg,2) = dyafn
00119 ddivBeta(irg,itg,ipg,3) = dzafn
00120
00121 call grgrad_midpoint_r3rd_type0_ns(dbvxddx,d2bxdxx,d2bxdxy,d2bxdxz,irg,itg,ipg)
00122 call grgrad_midpoint_r3rd_type0_ns(dbvxddy,d2bxdyx,d2bxdyy,d2bxdyz,irg,itg,ipg)
00123 call grgrad_midpoint_r3rd_type0_ns(dbvxddz,d2bxdzx,d2bxdzy,d2bxdzz,irg,itg,ipg)
00124 Lapla_beta(irg,itg,ipg,1) = d2bxdxx + d2bxdyy + d2bxdzz
00125
00126 call grgrad_midpoint_r3rd_type0_ns(dbvyddx,d2bydxx,d2bydxy,d2bydxz,irg,itg,ipg)
00127 call grgrad_midpoint_r3rd_type0_ns(dbvyddy,d2bydyx,d2bydyy,d2bydyz,irg,itg,ipg)
00128 call grgrad_midpoint_r3rd_type0_ns(dbvyddz,d2bydzx,d2bydzy,d2bydzz,irg,itg,ipg)
00129 Lapla_beta(irg,itg,ipg,2) = d2bydxx + d2bydyy + d2bydzz
00130
00131 call grgrad_midpoint_r3rd_type0_ns(dbvzddx,d2bzdxx,d2bzdxy,d2bzdxz,irg,itg,ipg)
00132 call grgrad_midpoint_r3rd_type0_ns(dbvzddy,d2bzdyx,d2bzdyy,d2bzdyz,irg,itg,ipg)
00133 call grgrad_midpoint_r3rd_type0_ns(dbvzddz,d2bzdzx,d2bzdzy,d2bzdzz,irg,itg,ipg)
00134 Lapla_beta(irg,itg,ipg,3) = d2bzdxx + d2bzdyy + d2bzdzz
00135 end do
00136 end do
00137 end do
00138
00139 else
00140
00141 do ipg = 0, npg
00142 do itg = 0, ntg
00143 do irg = 0, nrg
00144 psigc = psi(irg,itg,ipg)
00145 alpgc = alph(irg,itg,ipg)
00146 if (alpgc.le.0.0d0) alpgc = 1.0d-20
00147 fnc2(irg,itg,ipg) = psi(irg,itg,ipg)**6/alpgc
00148 call grgrad_4th_gridpoint_bhex(bvxd,dbxdx,dbxdy,dbxdz,irg,itg,ipg)
00149 call grgrad_4th_gridpoint_bhex(bvyd,dbydx,dbydy,dbydz,irg,itg,ipg)
00150 call grgrad_4th_gridpoint_bhex(bvzd,dbzdx,dbzdy,dbzdz,irg,itg,ipg)
00151
00152 divBeta(irg,itg,ipg) = dbxdx + dbydy + dbzdz
00153
00154 dbvxddx(irg,itg,ipg) = dbxdx
00155 dbvxddy(irg,itg,ipg) = dbxdy
00156 dbvxddz(irg,itg,ipg) = dbxdz
00157
00158 dbvyddx(irg,itg,ipg) = dbydx
00159 dbvyddy(irg,itg,ipg) = dbydy
00160 dbvyddz(irg,itg,ipg) = dbydz
00161
00162 dbvzddx(irg,itg,ipg) = dbzdx
00163 dbvzddy(irg,itg,ipg) = dbzdy
00164 dbvzddz(irg,itg,ipg) = dbzdz
00165 end do
00166 end do
00167 end do
00168
00169 call grgrad_midpoint_r3rd_nsbh(fnc2,grad2x,grad2y,grad2z,'bh')
00170
00171 do ipg = 1, npg
00172 do itg = 1, ntg
00173 do irg = 1, nrg
00174 call grgrad_midpoint_r3rd_type0_bh(divBeta,dxafn,dyafn,dzafn,irg,itg,ipg)
00175 ddivBeta(irg,itg,ipg,1) = dxafn
00176 ddivBeta(irg,itg,ipg,2) = dyafn
00177 ddivBeta(irg,itg,ipg,3) = dzafn
00178
00179 call grgrad_midpoint_r3rd_type0_bh(dbvxddx,d2bxdxx,d2bxdxy,d2bxdxz,irg,itg,ipg)
00180 call grgrad_midpoint_r3rd_type0_bh(dbvxddy,d2bxdyx,d2bxdyy,d2bxdyz,irg,itg,ipg)
00181 call grgrad_midpoint_r3rd_type0_bh(dbvxddz,d2bxdzx,d2bxdzy,d2bxdzz,irg,itg,ipg)
00182 Lapla_beta(irg,itg,ipg,1) = d2bxdxx + d2bxdyy + d2bxdzz
00183
00184 call grgrad_midpoint_r3rd_type0_bh(dbvyddx,d2bydxx,d2bydxy,d2bydxz,irg,itg,ipg)
00185 call grgrad_midpoint_r3rd_type0_bh(dbvyddy,d2bydyx,d2bydyy,d2bydyz,irg,itg,ipg)
00186 call grgrad_midpoint_r3rd_type0_bh(dbvyddz,d2bydzx,d2bydzy,d2bydzz,irg,itg,ipg)
00187 Lapla_beta(irg,itg,ipg,2) = d2bydxx + d2bydyy + d2bydzz
00188
00189 call grgrad_midpoint_r3rd_type0_bh(dbvzddx,d2bzdxx,d2bzdxy,d2bzdxz,irg,itg,ipg)
00190 call grgrad_midpoint_r3rd_type0_bh(dbvzddy,d2bzdyx,d2bzdyy,d2bzdyz,irg,itg,ipg)
00191 call grgrad_midpoint_r3rd_type0_bh(dbvzddz,d2bzdzx,d2bzdzy,d2bzdzz,irg,itg,ipg)
00192 Lapla_beta(irg,itg,ipg,3) = d2bzdxx + d2bzdyy + d2bzdzz
00193 end do
00194 end do
00195 end do
00196 end if
00197
00198 do ii = 1, 3
00199 do ipg = 1, npg
00200 do itg = 1, ntg
00201 do irg = 1, nrg
00202 call interpo_linear_type0(emdgc,emdg,irg,itg,ipg)
00203 call interpo_linear_type0(vepxgc ,vepxg ,irg,itg,ipg)
00204 call interpo_linear_type0(vepygc ,vepyg ,irg,itg,ipg)
00205 call interpo_linear_type0(vepzgc ,vepzg ,irg,itg,ipg)
00206 call interpo_linear_type0(omegc,omeg,irg,itg,ipg)
00207 call interpo_linear_type0(jomeg_intgc,jomeg_int,irg,itg,ipg)
00208 call interpo_linear_type0(psigc,psi,irg,itg,ipg)
00209 call interpo_linear_type0(alpgc,alph,irg,itg,ipg)
00210 call interpo_linear_type0(fnc2gc,fnc2,irg,itg,ipg)
00211 call interpo_linear_type0(bvxdgc,bvxd,irg,itg,ipg)
00212 call interpo_linear_type0(bvydgc,bvyd,irg,itg,ipg)
00213 call interpo_linear_type0(bvzdgc,bvzd,irg,itg,ipg)
00214 call interpo_linear_type0(wxgc,wxspg,irg,itg,ipg)
00215 call interpo_linear_type0(wygc,wyspg,irg,itg,ipg)
00216 call interpo_linear_type0(wzgc,wzspg,irg,itg,ipg)
00217 afnc2inv = alpgc/fnc2gc
00218
00219 dxafn = grad2x(irg,itg,ipg)
00220 dyafn = grad2y(irg,itg,ipg)
00221 dzafn = grad2z(irg,itg,ipg)
00222 tfkax = tfkij(irg,itg,ipg,ii,1)
00223 tfkay = tfkij(irg,itg,ipg,ii,2)
00224 tfkaz = tfkij(irg,itg,ipg,ii,3)
00225
00226 zfac = 1.0d0
00227 if (emdgc <= 1.0d-15) then
00228 emdgc = 1.0d-15
00229 zfac = 0.0d0
00230 end if
00231 call peos_q2hprho(emdgc, hhgc, pregc, rhogc, ene)
00232
00233 vphig(1) = hvec_phig(irg,itg,ipg,1)
00234 vphig(2) = hvec_phig(irg,itg,ipg,2)
00235 vphig(3) = hvec_phig(irg,itg,ipg,3)
00236 ovdgc(1) = bvxdgc + ome*vphig(1)
00237 ovdgc(2) = bvydgc + ome*vphig(2)
00238 ovdgc(3) = bvzdgc + ome*vphig(3)
00239 lam = ber + ovdgc(1)*vepxgc + ovdgc(2)*vepygc + ovdgc(3)*vepzgc
00240 psigc4 = psigc**4
00241 psigcp = psigc**confpow
00242 alpgc2 = alpgc**2
00243
00244 dvep2 = (vepxgc**2 + vepygc**2 + vepzgc**2)/psigc4
00245 wdvep = (wxgc*vepxgc + wygc*vepygc + wzgc*vepzgc)*psigcp
00246 w2 = psigc4*(wxgc*wxgc + wygc*wygc + wzgc*wzgc)*psigcp**2.0d0
00247
00248 wterm = wdvep + w2
00249 uih2 = dvep2 + 2.0d0*wdvep + w2
00250
00251 if ( (lam*lam + 4.0d0*alpgc2*wterm)<0.0d0 ) then
00252 write(6,*) "hut imaginary....exiting"
00253 stop
00254 end if
00255 hut = (lam + sqrt(lam*lam + 4.0d0*alpgc2*wterm))/(2.0d0*alpgc2)
00256
00257 utgc = hut/hhgc
00258
00259 oterm = 0.0d0
00260 if (ii == 1) oterm = vepxgc/psigc4 + psigcp*wxgc
00261 if (ii == 2) oterm = vepygc/psigc4 + psigcp*wygc
00262 if (ii == 3) oterm = vepzgc/psigc4 + psigcp*wzgc
00263
00264 rjj = rhogc*alpgc*utgc*oterm
00265
00266 MoC_vio(irg,itg,ipg,ii) = - 2.0d0*afnc2inv &
00267 & *(tfkax*dxafn + tfkay*dyafn + tfkaz*dzafn) &
00268 & - san*ddivBeta(irg,itg,ipg,ii) &
00269 & + radi**2*16.0d0*pi*alpgc*psigc4*rjj*zfac &
00270 & - Lapla_beta(irg,itg,ipg,ii)
00271 MoC_vio(irg,itg,ipg,ii) = MoC_vio(irg,itg,ipg,ii)/(2.0d0*alpgc*psigc**4)
00272
00273 end do
00274 end do
00275 end do
00276 end do
00277
00278 deallocate(fnc2)
00279 deallocate(grad2x)
00280 deallocate(grad2y)
00281 deallocate(grad2z)
00282 deallocate(divBeta)
00283
00284 deallocate(dbvxddx)
00285 deallocate(dbvxddy)
00286 deallocate(dbvxddz)
00287
00288 deallocate(dbvyddx)
00289 deallocate(dbvyddy)
00290 deallocate(dbvyddz)
00291
00292 deallocate(dbvzddx)
00293 deallocate(dbvzddy)
00294 deallocate(dbvzddz)
00295
00296 deallocate(Lapla_beta)
00297 deallocate(ddivBeta)
00298
00299 end subroutine violation_midpoint_MoC_CF_peos_spin