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