00001 subroutine sourceterm_MoC(souvec,sou)
00002   use phys_constant, only : long, pi
00003   use grid_parameter, only : nrg, ntg, npg
00004   use coordinate_grav_r, only : hrg, rg
00005   use trigonometry_grav_theta, only : hsinthg,  hcosthg
00006   use trigonometry_grav_phi,   only : hsinphig, hcosphig
00007   use def_metric, only : psi, alph, tfkijkij, bvxd, bvyd, bvzd, tfkij
00008   use def_matter, only : emdg
00009   use def_matter_parameter, only : ome, ber, radi, pinx
00010   use def_vector_x,   only : hvec_xg
00011   use def_vector_phi, only : hvec_phig
00012   use make_array_3d
00013   use interface_grgrad_midpoint
00014   use interface_interpo_linear_type0
00015   implicit none
00016   real(long), pointer :: sou(:,:,:) 
00017   real(long), pointer :: souvec(:,:,:,:)
00018   real(long), pointer :: fnc2(:,:,:)
00019   real(long), pointer :: grad2x(:,:,:), grad2y(:,:,:), grad2z(:,:,:)
00020   real(long) :: vphig(3), xxx, yyy, zzz, san, san2
00021   real(long) :: emdgc, rhogc, pregc, hhgc, utgc, oterm, zfac, rjj
00022   real(long) :: psigc, alpgc, fnc2gc, afnc2inv, dxafn, dyafn, dzafn
00023   real(long) :: bvxdgc, bvydgc, bvzdgc, tfkax, tfkay, tfkaz
00024   integer :: ii, irg, itg, ipg
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 
00031   san = 1.0d0/3.0d0
00032   san2= 2.0d0/3.0d0
00033 
00034 
00035 
00036 
00037   do ipg = 0, npg
00038     do itg = 0, ntg
00039       do irg = 0, nrg
00040         fnc2(irg,itg,ipg) = psi(irg,itg,ipg)**6/alph(irg,itg,ipg)
00041       end do
00042     end do
00043   end do
00044 
00045   call grgrad_midpoint(fnc2,grad2x,grad2y,grad2z)
00046 
00047   do ii = 1, 3
00048     do ipg = 1, npg
00049       do itg = 1, ntg
00050         do irg = 1, nrg
00051           call interpo_linear_type0(emdgc,emdg,irg,itg,ipg)
00052           call interpo_linear_type0(psigc,psi,irg,itg,ipg)
00053           call interpo_linear_type0(alpgc,alph,irg,itg,ipg)
00054           call interpo_linear_type0(fnc2gc,fnc2,irg,itg,ipg)
00055           call interpo_linear_type0(bvxdgc,bvxd,irg,itg,ipg)
00056           call interpo_linear_type0(bvydgc,bvyd,irg,itg,ipg)
00057           call interpo_linear_type0(bvzdgc,bvzd,irg,itg,ipg)
00058           afnc2inv = alpgc/fnc2gc
00059           dxafn = grad2x(irg,itg,ipg)
00060           dyafn = grad2y(irg,itg,ipg)
00061           dzafn = grad2z(irg,itg,ipg)
00062           tfkax  = tfkij(irg,itg,ipg,ii,1)
00063           tfkay  = tfkij(irg,itg,ipg,ii,2)
00064           tfkaz  = tfkij(irg,itg,ipg,ii,3)
00065 
00066           zfac = 1.0d0
00067           if (emdgc <= 1.0d-15) then
00068             emdgc = 1.0d-15
00069             zfac  = 0.0d0
00070           end if
00071           rhogc = emdgc**pinx
00072           pregc = rhogc*emdgc
00073           hhgc  = 1.0d0 + (pinx+1.0d0)*emdgc
00074           utgc  = hhgc/ber
00075           vphig(1) = hvec_phig(irg,itg,ipg,1)
00076           vphig(2) = hvec_phig(irg,itg,ipg,2)
00077           vphig(3) = hvec_phig(irg,itg,ipg,3)
00078           oterm = 0.0d0
00079           if (ii == 1) oterm = bvxdgc + ome*vphig(1)
00080           if (ii == 2) oterm = bvydgc + ome*vphig(2)
00081           if (ii == 3) oterm = bvzdgc + ome*vphig(3)
00082           rjj = hhgc*rhogc*alpgc*utgc**2*psigc**4*oterm
00083 
00084           souvec(irg,itg,ipg,ii) = - 2.0d0*afnc2inv &
00085         &   *(tfkax*dxafn + tfkay*dyafn + tfkaz*dzafn) &
00086         &   + radi**2*16.0d0*pi*alpgc*rjj*zfac
00087         end do
00088       end do
00089     end do
00090   end do     
00091 
00092 
00093 
00094   do ipg = 1, npg
00095     do itg = 1, ntg
00096       do irg = 1, nrg
00097         xxx = hvec_xg(irg,itg,ipg,1)
00098         yyy = hvec_xg(irg,itg,ipg,2)
00099         zzz = hvec_xg(irg,itg,ipg,3)
00100         sou(irg,itg,ipg) = xxx*souvec(irg,itg,ipg,1)  &
00101       &                  + yyy*souvec(irg,itg,ipg,2)  &
00102       &                  + zzz*souvec(irg,itg,ipg,3)
00103       end do
00104     end do
00105   end do
00106 
00107   deallocate(fnc2)
00108   deallocate(grad2x)
00109   deallocate(grad2y)
00110   deallocate(grad2z)
00111 end subroutine sourceterm_MoC