00001 subroutine source_vep_CF_peos_spin(souv)
00002 use phys_constant, only : long
00003 use grid_parameter, only : nrf, ntf, npf
00004 use def_metric_on_SFC_CF
00005 use def_matter
00006 use def_matter_parameter, only : ome, ber
00007 use def_vector_phi, only : hvec_phif, vec_phif
00008 use def_velocity_rot
00009 use def_velocity_potential
00010 use interface_interpo_linear_type0
00011 use interface_flgrad_midpoint_type0
00012 use interface_flgrad_4th_gridpoint
00013 use interface_flgrad_2nd_gridpoint
00014 use make_array_3d
00015 implicit none
00016 real(long), pointer :: souv(:,:,:)
00017 real(long), pointer :: hut(:,:,:), aloh(:,:,:)
00018 real(long) :: psifc, alpfc, bvxdfc, bvydfc, bvzdfc
00019 real(long) :: rotshx, rotshy, rotshz
00020 real(long) :: emdfc, utfc, hhfc, prefc, rhofc, enefc, abin, abct
00021 real(long) :: hhut, pfinv, pf2inv, pf4
00022 real(long) :: dxemd, dyemd, dzemd, dxpsi, dypsi, dzpsi
00023 real(long) :: dxvpd, dyvpd, dzvpd, hwx, hwy, hwz
00024 real(long) :: dxhut, dyhut, dzhut, wdpsi, wdaloh, divw
00025 real(long) :: dxaloh, dyaloh, dzaloh
00026 real(long) :: dxwx, dywx, dzwx, dxwy, dywy, dzwy, dxwz, dywz, dzwz
00027 real(long) :: dxbvxd, dybvxd, dzbvxd, dxbvyd, dybvyd, dzbvyd,
00028 dxbvzd, dybvzd, dzbvzd, divbvf
00029 real(long) :: vphif(3)
00030 real(long) :: ovdfc(3), ovdfc2
00031 real(long) :: dxvep, dyvep, dzvep, lam, alpfc2
00032 real(long) :: dvep2, psifc4, psifcp, uih2,w2,wdvep,wterm,wx,wy,wz
00033
00034
00035 integer :: ir, it, ip, irf,itf,ipf
00036
00037 call alloc_array3d(hut , 0, nrf, 0, ntf, 0, npf)
00038 call alloc_array3d(aloh, 0, nrf, 0, ntf, 0, npf)
00039
00040 do ip = 0, npf
00041 do it = 0, ntf
00042 do ir = 0, nrf
00043 psifc = psif(ir,it,ip)
00044 alpfc= alphf(ir,it,ip)
00045 emdfc = emd(ir,it,ip)
00046
00047 call peos_q2hprho(emdfc, hhfc, prefc, rhofc, enefc)
00048 vphif(1) = vec_phif(ir,it,ip,1)
00049 vphif(2) = vec_phif(ir,it,ip,2)
00050 vphif(3) = vec_phif(ir,it,ip,3)
00051 ovdfc(1) = bvxdf(ir,it,ip) + ome*vphif(1)
00052 ovdfc(2) = bvydf(ir,it,ip) + ome*vphif(2)
00053 ovdfc(3) = bvzdf(ir,it,ip) + ome*vphif(3)
00054 call flgrad_2nd_gridpoint(vep,dxvep,dyvep,dzvep,ir,it,ip)
00055 wx = wxspf(ir,it,ip)
00056 wy = wyspf(ir,it,ip)
00057 wz = wzspf(ir,it,ip)
00058
00059 psifc4 = psifc**4
00060 psifcp = psifc**confpow
00061 alpfc2 = alpfc**2
00062 lam = ber + ovdfc(1)*dxvep + ovdfc(2)*dyvep + ovdfc(3)*dzvep
00063
00064 dvep2 = (dxvep**2 + dyvep**2 + dzvep**2)/psifc4
00065 wdvep = (wx*dxvep + wy*dyvep + wz*dzvep)*psifcp
00066 w2 = psifc4*(wx*wx + wy*wy + wz*wz)*psifcp**2.0d0
00067
00068 wterm = wdvep + w2
00069 uih2 = dvep2 + 2.0d0*wdvep + w2
00070
00071 if ( (lam*lam + 4.0d0*alpfc2*wterm)<0.0d0 ) then
00072 write(6,*) "hut imaginary....exiting"
00073 stop
00074 end if
00075 hut(ir,it,ip) = (lam + sqrt(lam*lam + 4.0d0*alpfc2*wterm))/(2.0d0*alpfc2)
00076
00077 utf(ir,it,ip) = hut(ir,it,ip)/hhfc
00078
00079 aloh(ir,it,ip) = dlog(alpfc*rhofc/hhfc)
00080 end do
00081 end do
00082 end do
00083
00084
00085
00086
00087
00088
00089
00090
00091 souv(1:nrf,1:ntf,1:npf) = 0.0d0
00092
00093 do ip = 1, npf
00094 do it = 1, ntf
00095 do ir = 1, nrf-1
00096 call interpo_linear_type0(bvxdfc,bvxdf,ir,it,ip)
00097 call interpo_linear_type0(bvydfc,bvydf,ir,it,ip)
00098 call interpo_linear_type0(bvzdfc,bvzdf,ir,it,ip)
00099
00100 rotshx = bvxdfc + ome*hvec_phif(ir,it,ip,1)
00101 rotshy = bvydfc + ome*hvec_phif(ir,it,ip,2)
00102 rotshz = bvzdfc + ome*hvec_phif(ir,it,ip,3)
00103
00104 call interpo_linear_type0(hhut,hut,ir,it,ip)
00105 call interpo_linear_type0(psifc,psif,ir,it,ip)
00106 pfinv = 1.0d0/psifc
00107 pf2inv = pfinv**2
00108 pf4 = psifc**4
00109
00110 call flgrad_midpoint_type0(psif,dxpsi, dypsi, dzpsi, ir,it,ip)
00111 call flgrad_midpoint_type0( vep,dxvpd, dyvpd, dzvpd, ir,it,ip)
00112 call flgrad_midpoint_type0( hut,dxhut, dyhut, dzhut, ir,it,ip)
00113 call flgrad_midpoint_type0(aloh,dxaloh,dyaloh,dzaloh,ir,it,ip)
00114
00115 call interpo_linear_type0(hwx,wxspf,ir,it,ip)
00116 call interpo_linear_type0(hwy,wyspf,ir,it,ip)
00117 call interpo_linear_type0(hwz,wzspf,ir,it,ip)
00118
00119 wdpsi = hwx*dxpsi + hwy*dypsi + hwz*dzpsi
00120 wdaloh= hwx*dxaloh + hwy*dyaloh + hwz*dzaloh
00121
00122 call flgrad_midpoint_type0(wxspf,dxwx,dywx,dzwx,ir,it,ip)
00123 call flgrad_midpoint_type0(wyspf,dxwy,dywy,dzwy,ir,it,ip)
00124 call flgrad_midpoint_type0(wzspf,dxwz,dywz,dzwz,ir,it,ip)
00125 divw = dxwx + dywy + dzwz
00126
00127
00128
00129 souv(ir,it,ip) = - 2.0d0*pfinv*(dxvpd*dxpsi + dyvpd*dypsi + dzvpd*dzpsi) &
00130 & + pf4*(rotshx*dxhut + rotshy*dyhut + rotshz*dzhut) &
00131 & + (pf4*hhut*rotshx - dxvpd)*dxaloh &
00132 & + (pf4*hhut*rotshy - dyvpd)*dyaloh &
00133 & + (pf4*hhut*rotshz - dzvpd)*dzaloh &
00134 & - psifc**(4.0d0+confpow)*( (confpow+6.0d0)*wdpsi/psifc + divw + wdaloh )
00135 end do
00136 end do
00137 end do
00138
00139 do ip = 1, npf
00140 do it = 1, ntf
00141 souv(nrf,it,ip) = 2.0d0*souv(nrf-1,it,ip) - souv(nrf-2,it,ip)
00142 end do
00143 end do
00144
00145 deallocate(hut)
00146 deallocate(aloh)
00147
00148 end subroutine source_vep_CF_peos_spin