00001
00002
00003 module weight_midpoint_fluid
00004 use phys_constant, only : nnrf, nntf, nnpf, long
00005 use grid_parameter, only : nrf, ntf, npf, nrg, ntg, npg
00006 use coordinate_grav_r, only : drg, rg, hrg
00007 use coordinate_grav_theta, only : dthg
00008 use coordinate_grav_phi, only : dphig
00009 use trigonometry_grav_theta, only : hsinthg, sinthg
00010 use make_array_3d
00011 implicit none
00012
00013 Real(long) :: hwdrf(nnrf), hwdtf(nntf), hwdpf(nnpf)
00014 Real(long) :: tzwdrf(0:nnrf), siwdrf(0:nnrf)
00015 Real(long) :: siwdtf(0:nntf), tzwdpf(0:nnpf)
00016 Real(long) :: wdxf(0:nnrf)
00017 Real(long), pointer :: hwrtpf(:,:,:), tzwrtpf(:,:,:)
00018 Real(long), pointer :: siwrtpf(:,:,:), rtsiwrtpf(:,:,:)
00019 contains
00020 subroutine allocate_weight_midpoint_fluid
00021 implicit none
00022 call alloc_array3d(hwrtpf,1,nrf,1,ntf,1,npf)
00023 call alloc_array3d(tzwrtpf,0,nrf,1,ntf,1,npf)
00024 call alloc_array3d(siwrtpf,0,nrf,1,ntf,1,npf)
00025 call alloc_array3d(rtsiwrtpf,0,nrf,0,ntf,0,npf)
00026 end subroutine allocate_weight_midpoint_fluid
00027 subroutine weight_calc_midpoint_fluid
00028 implicit none
00029 integer :: ir, it, ip
00030 hwdrf(1:nrf) = hrg(1:nrf)**2*drg(1:nrf)
00031 hwdtf(1:ntf) = hsinthg(1:ntf)*dthg
00032 hwdpf(1:npf) = dphig
00033
00034 tzwdrf(1:nrf-1) = rg(1:nrf-1)**2*0.5d0*(drg(1:nrf-1) + drg(2:nrf))
00035 tzwdrf(0) = 0.5d0*rg(0)**2*drg(1)
00036 tzwdrf(nrf) = 0.5d0*rg(nrf)**2*drg(nrf)
00037
00038 wdxf(1:nrf-1) = 0.5d0*(drg(1:nrf-1) + drg(2:nrf))
00039 wdxf(0) = 0.5d0*drg(1)
00040 wdxf(nrf) = 0.5d0*drg(nrf)
00041
00042 siwdrf(0) = 0.0d0
00043 do ir = 0, nrf-2, 2
00044 siwdrf(ir) = siwdrf(ir) &
00045 & + rg(ir )**2*(2.0d0*drg(ir+1)-drg(ir+2)) &
00046 & *(drg(ir+1)+drg(ir+2))/(6.0d0*drg(ir+1))
00047 siwdrf(ir+1) = rg(ir+1)**2*(drg(ir+1)+drg(ir+2))**3 &
00048 & /(6.0d0*drg(ir+1)*drg(ir+2))
00049 siwdrf(ir+2) = rg(ir+2)**2*(2.0d0*drg(ir+2)-drg(ir+1)) &
00050 & *(drg(ir+1)+drg(ir+2))/(6.0d0*drg(ir+2))
00051 end do
00052
00053 siwdtf(0) = 1.0d0/3.0d0*sinthg(0)*dthg
00054 siwdtf(1:ntf-1:2) = 4.0d0/3.0d0*sinthg(1:ntf-1:2)*dthg
00055 siwdtf(2:ntf-2:2) = 2.0d0/3.0d0*sinthg(2:ntf-2:2)*dthg
00056 siwdtf(ntf) = 1.0d0/3.0d0*sinthg(ntf)*dthg
00057
00058 tzwdpf(1:npf-1) = dphig
00059 tzwdpf(0) = 0.5d0*dphig
00060 tzwdpf(npf) = 0.5d0*dphig
00061
00062 do ip = 1, npf
00063 do it = 1, ntf
00064 tzwrtpf(0,it,ip) = tzwdrf(0)*hwdtf(it)*hwdpf(ip)
00065 siwrtpf(0,it,ip) = siwdrf(0)*hwdtf(it)*hwdpf(ip)
00066 do ir = 1, nrf
00067 hwrtpf(ir,it,ip) = hwdrf(ir)*hwdtf(it)*hwdpf(ip)
00068 tzwrtpf(ir,it,ip) = tzwdrf(ir)*hwdtf(it)*hwdpf(ip)
00069 siwrtpf(ir,it,ip) = siwdrf(ir)*hwdtf(it)*hwdpf(ip)
00070 end do
00071 end do
00072 end do
00073 do ip = 0, npf
00074 do it = 0, ntf
00075 do ir = 0, nrf
00076 rtsiwrtpf(ir,it,ip) = siwdrf(ir)*siwdtf(it)*tzwdpf(ip)
00077 end do
00078 end do
00079 end do
00080
00081 end subroutine weight_calc_midpoint_fluid
00082 end module weight_midpoint_fluid