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 use make_array_2d
00012 implicit none
00013
00014 Real(long) :: hwdrf(nnrf), hwdtf(nntf), hwdpf(nnpf)
00015 Real(long) :: tzwdrf(0:nnrf), siwdrf(0:nnrf)
00016 Real(long) :: siwdtf(0:nntf), tzwdpf(0:nnpf)
00017 Real(long) :: wdxf(0:nnrf)
00018 Real(long), pointer :: hwrtpf(:,:,:), tzwrtpf(:,:,:), hwtpfsf(:,:)
00019 Real(long), pointer :: siwrtpf(:,:,:), rtsiwrtpf(:,:,:)
00020 contains
00021 subroutine allocate_weight_midpoint_fluid
00022 implicit none
00023 call alloc_array2d(hwtpfsf,1,ntf,1,npf)
00024 call alloc_array3d(hwrtpf,1,nrf,1,ntf,1,npf)
00025 call alloc_array3d(tzwrtpf,0,nrf,1,ntf,1,npf)
00026 call alloc_array3d(siwrtpf,0,nrf,1,ntf,1,npf)
00027 call alloc_array3d(rtsiwrtpf,0,nrf,0,ntf,0,npf)
00028 end subroutine allocate_weight_midpoint_fluid
00029 subroutine weight_calc_midpoint_fluid
00030 implicit none
00031 integer :: ir, it, ip
00032 hwdrf(1:nrf) = hrg(1:nrf)**2*drg(1:nrf)
00033 hwdtf(1:ntf) = hsinthg(1:ntf)*dthg
00034 hwdpf(1:npf) = dphig
00035
00036 tzwdrf(1:nrf-1) = rg(1:nrf-1)**2*0.5d0*(drg(1:nrf-1) + drg(2:nrf))
00037 tzwdrf(0) = 0.5d0*rg(0)**2*drg(1)
00038 tzwdrf(nrf) = 0.5d0*rg(nrf)**2*drg(nrf)
00039
00040 wdxf(1:nrf-1) = 0.5d0*(drg(1:nrf-1) + drg(2:nrf))
00041 wdxf(0) = 0.5d0*drg(1)
00042 wdxf(nrf) = 0.5d0*drg(nrf)
00043
00044 siwdrf(0) = 0.0d0
00045 do ir = 0, nrf-2, 2
00046 siwdrf(ir) = siwdrf(ir) &
00047 & + rg(ir )**2*(2.0d0*drg(ir+1)-drg(ir+2)) &
00048 & *(drg(ir+1)+drg(ir+2))/(6.0d0*drg(ir+1))
00049 siwdrf(ir+1) = rg(ir+1)**2*(drg(ir+1)+drg(ir+2))**3 &
00050 & /(6.0d0*drg(ir+1)*drg(ir+2))
00051 siwdrf(ir+2) = rg(ir+2)**2*(2.0d0*drg(ir+2)-drg(ir+1)) &
00052 & *(drg(ir+1)+drg(ir+2))/(6.0d0*drg(ir+2))
00053 end do
00054
00055 siwdtf(0) = 1.0d0/3.0d0*sinthg(0)*dthg
00056 siwdtf(1:ntf-1:2) = 4.0d0/3.0d0*sinthg(1:ntf-1:2)*dthg
00057 siwdtf(2:ntf-2:2) = 2.0d0/3.0d0*sinthg(2:ntf-2:2)*dthg
00058 siwdtf(ntf) = 1.0d0/3.0d0*sinthg(ntf)*dthg
00059
00060 tzwdpf(1:npf-1) = dphig
00061 tzwdpf(0) = 0.5d0*dphig
00062 tzwdpf(npf) = 0.5d0*dphig
00063
00064 do ip = 1, npf
00065 do it = 1, ntf
00066 hwtpfsf(it,ip) = hwdtf(it)*hwdpf(ip)
00067 tzwrtpf(0,it,ip) = tzwdrf(0)*hwdtf(it)*hwdpf(ip)
00068 siwrtpf(0,it,ip) = siwdrf(0)*hwdtf(it)*hwdpf(ip)
00069 do ir = 1, nrf
00070 hwrtpf(ir,it,ip) = hwdrf(ir)*hwdtf(it)*hwdpf(ip)
00071 tzwrtpf(ir,it,ip) = tzwdrf(ir)*hwdtf(it)*hwdpf(ip)
00072 siwrtpf(ir,it,ip) = siwdrf(ir)*hwdtf(it)*hwdpf(ip)
00073 end do
00074 end do
00075 end do
00076 do ip = 0, npf
00077 do it = 0, ntf
00078 do ir = 0, nrf
00079 rtsiwrtpf(ir,it,ip) = siwdrf(ir)*siwdtf(it)*tzwdpf(ip)
00080 end do
00081 end do
00082 end do
00083
00084 end subroutine weight_calc_midpoint_fluid
00085 end module weight_midpoint_fluid