00001 subroutine source_ang_mom_WL(soug,souf)
00002 use phys_constant, only : long
00003 use grid_parameter, only : nrg, ntg, npg, nrf, ntf, npf, ntgeq
00004 use coordinate_grav_r, only : rg, hrg
00005 use trigonometry_grav_theta, only : sinthg, costhg, hsinthg, hcosthg
00006 use trigonometry_grav_phi, only : sinphig, cosphig, hsinphig, hcosphig
00007 use def_matter, only : emd, rs, utf, omef
00008 use def_matter_parameter
00009 use def_metric, only : psi, alph, bvxd, bvyd, bvzd, tfkij, tfkijkij
00010 use def_metric_hij, only : hxxu, hxyu, hxzu, hyyu, hyzu, hzzu, &
00011 & hxxd, hxyd, hxzd, hyyd, hyzd, hzzd
00012 use def_metric_on_SFC_CF
00013 use def_metric_on_SFC_WL
00014 use def_dvphi
00015 use make_array_3d
00016 use interface_interpo_gr2fl
00017 use interface_interpo_linear_type0
00018 use interface_grgrad1g_midpoint
00019 use def_vector_phi, only : hvec_phig, vec_phif
00020 implicit none
00021 real(long), pointer :: soug(:,:,:), souf(:,:,:)
00022 integer :: ir,it,ip
00023 real(long) :: emdw, alphw, psiw, rhow, prew, hhw, utw, omew, ene
00024 real(long) :: rjjx, rjjy, rjjz, rjjphi
00025 real(long) :: zfac, small = 1.0d-15
00026 real(long) :: vphif(1:3)
00027 real(long) :: otermx, otermy, otermz, bvxdfw, bvydfw, bvzdfw
00028 real(long) :: hhxxdf, hhxydf, hhxzdf, hhyxdf, hhyydf, hhyzdf,
00029 hhzxdf, hhzydf, hhzzdf
00030 real(long) :: hxxuc, hxyuc, hxzuc, hyyuc, hyzuc, hzzuc
00031 real(long) :: gamu(3,3)
00032 real(long) :: aijvpp, aij(1:3,1:3), vphig(1:3), grad1(1:3),
00033 dhu(1:3,1:3,1:3), psigc
00034 integer :: ipg, itg, irg, ia, ib
00035
00036 dphiu(1:3,1:3) = 0.0d0
00037 dphiu(1,2) =-1.0d0
00038 dphiu(2,1) = 1.0d0
00039
00040 do ipg = 1, npg
00041 do itg = 1, ntg
00042 do irg = 1, nrg
00043 call interpo_linear_type0(hxxuc,hxxu,irg,itg,ipg)
00044 call interpo_linear_type0(hxyuc,hxyu,irg,itg,ipg)
00045 call interpo_linear_type0(hxzuc,hxzu,irg,itg,ipg)
00046 call interpo_linear_type0(hyyuc,hyyu,irg,itg,ipg)
00047 call interpo_linear_type0(hyzuc,hyzu,irg,itg,ipg)
00048 call interpo_linear_type0(hzzuc,hzzu,irg,itg,ipg)
00049 gamu(1,1) = hxxuc + 1.0d0
00050 gamu(1,2) = hxyuc
00051 gamu(1,3) = hxzuc
00052 gamu(2,2) = hyyuc + 1.0d0
00053 gamu(2,3) = hyzuc
00054 gamu(3,3) = hzzuc + 1.0d0
00055 gamu(2,1) = gamu(1,2)
00056 gamu(3,1) = gamu(1,3)
00057 gamu(3,2) = gamu(2,3)
00058 call interpo_linear_type0(psigc,psi,irg,itg,ipg)
00059 aij(1:3,1:3) = tfkij(irg,itg,ipg,1:3,1:3)
00060 vphig(1) = hvec_phig(irg,itg,ipg,1)
00061 vphig(2) = hvec_phig(irg,itg,ipg,2)
00062 vphig(3) = hvec_phig(irg,itg,ipg,3)
00063 call grgrad1g_midpoint(hxxu,grad1,irg,itg,ipg)
00064 dhu(1,1,1:3) = grad1(1:3)
00065 call grgrad1g_midpoint(hxyu,grad1,irg,itg,ipg)
00066 dhu(1,2,1:3) = grad1(1:3)
00067 dhu(2,1,1:3) = grad1(1:3)
00068 call grgrad1g_midpoint(hxzu,grad1,irg,itg,ipg)
00069 dhu(1,3,1:3) = grad1(1:3)
00070 dhu(3,1,1:3) = grad1(1:3)
00071 call grgrad1g_midpoint(hyyu,grad1,irg,itg,ipg)
00072 dhu(2,2,1:3) = grad1(1:3)
00073 call grgrad1g_midpoint(hyzu,grad1,irg,itg,ipg)
00074 dhu(2,3,1:3) = grad1(1:3)
00075 dhu(3,2,1:3) = grad1(1:3)
00076 call grgrad1g_midpoint(hzzu,grad1,irg,itg,ipg)
00077 dhu(3,3,1:3) = grad1(1:3)
00078 aijvpp = 0.0d0
00079 do ib = 1, 3
00080 do ia = 1, 3
00081 aijvpp = aijvpp - 0.5d0*( aij(ia,ib)*vphig(1)*dhu(ia,ib,1) &
00082 & + aij(ia,ib)*vphig(2)*dhu(ia,ib,2) &
00083 & + aij(ia,ib)*vphig(3)*dhu(ia,ib,3) ) &
00084 & + aij(ia,ib)*gamu(ia,1)*dphiu(ib,1) &
00085 & + aij(ia,ib)*gamu(ia,2)*dphiu(ib,2) &
00086 & + aij(ia,ib)*gamu(ia,3)*dphiu(ib,3)
00087 end do
00088 end do
00089 soug(irg,itg,ipg) = aijvpp*psigc**6
00090 end do
00091 end do
00092 end do
00093
00094 do ip = 0, npf
00095 do it = 0, ntf
00096 do ir = 0, nrf
00097 emdw = emd(ir,it,ip)
00098 if (emdw <= small) emdw = small
00099 psiw = psif(ir,it,ip)
00100 alphw = alphf(ir,it,ip)
00101 bvxdfw = bvxdf(ir,it,ip)
00102 bvydfw = bvydf(ir,it,ip)
00103 bvzdfw = bvzdf(ir,it,ip)
00104 call peos_q2hprho(emdw, hhw, prew, rhow, ene)
00105
00106 utw = utf(ir,it,ip)
00107 omew = omef(ir,it,ip)
00108
00109 vphif(1) = vec_phif(ir,it,ip,1)
00110 vphif(2) = vec_phif(ir,it,ip,2)
00111 vphif(3) = vec_phif(ir,it,ip,3)
00112
00113 hhxxdf = hxxdf(ir,it,ip)
00114 hhxydf = hxydf(ir,it,ip)
00115 hhxzdf = hxzdf(ir,it,ip)
00116 hhyydf = hyydf(ir,it,ip)
00117 hhyzdf = hyzdf(ir,it,ip)
00118 hhzzdf = hzzdf(ir,it,ip)
00119 hhyxdf = hhxydf
00120 hhzxdf = hhxzdf
00121 hhzydf = hhyzdf
00122
00123 otermx = bvxdfw + omew*vphif(1) &
00124 & + hhxxdf*omew*vphif(1) &
00125 & + hhxydf*omew*vphif(2) &
00126 & + hhxzdf*omew*vphif(3)
00127 otermy = bvydfw + omew*vphif(2) &
00128 & + hhyxdf*omew*vphif(1) &
00129 & + hhyydf*omew*vphif(2) &
00130 & + hhyzdf*omew*vphif(3)
00131 otermz = bvzdfw + omew*vphif(3) &
00132 & + hhzxdf*omew*vphif(1) &
00133 & + hhzydf*omew*vphif(2) &
00134 & + hhzzdf*omew*vphif(3)
00135
00136 zfac = 1.0d0
00137 if (emdw <= small) zfac = 0.0d0
00138 rjjx = hhw*rhow*alphw*utw**2*psiw**4*otermx
00139 rjjy = hhw*rhow*alphw*utw**2*psiw**4*otermy
00140 rjjz = hhw*rhow*alphw*utw**2*psiw**4*otermz
00141
00142 rjjphi = rjjx*vphif(1) + rjjy*vphif(2) + rjjz*vphif(3)
00143 souf(ir,it,ip) = rjjphi*psiw**6*zfac
00144
00145 end do
00146 end do
00147 end do
00148
00149 end subroutine source_ang_mom_WL