00001
00002
00003 subroutine grgrad_midpoint_type0(fnc,dfdx,dfdy,dfdz,irg,itg,ipg)
00004 use phys_constant, only : long
00005 use grid_parameter, only : nrg, ntg, npg
00006 use coordinate_grav_r, only : hrginv, drginv
00007 use coordinate_grav_theta, only : dthginv
00008 use coordinate_grav_phi, only : dphiginv
00009 use coordinate_grav_extended, only : rgex, hrgex, irgex_r, itgex_r, ipgex_r
00010 use trigonometry_grav_theta, only : hsinthg, hcosthg, hcosecthg
00011 use trigonometry_grav_phi, only : hsinphig, hcosphig
00012 implicit none
00013 real(long), pointer :: fnc(:,:,:)
00014 real(long) :: gr1, gr2, gr3, dfncdr, dfncdth, dfncdphi
00015 real(long) :: dfdx, dfdy, dfdz, dfncdr_tp(0:1,0:1)
00016 real(long) :: rv, r4(4), fr4(4)
00017 integer :: irg, itg, ipg, irgex, itgex, ipgex
00018 integer :: ir0, irg0, ii, ith, iph
00019 real(long), external :: dfdx_3rd
00020
00021
00022
00023
00024
00025
00026
00027 ir0 = min0(max0(0,irg-2),nrg-3)
00028
00029 do iph = 0, 1
00030 do ith = 0, 1
00031 do ii = 1, 4
00032 irg0 = ir0 + ii - 1
00033 r4(ii)= rgex(irg0)
00034 irgex = irgex_r(irg0)
00035 itgex = itgex_r(itg-1+ith,irg0)
00036 ipgex = ipgex_r(ipg-1+iph,irg0)
00037 fr4(ii) = fnc(irgex,itgex,ipgex)
00038 end do
00039 rv = hrgex(irg)
00040 dfncdr_tp(ith,iph) = dfdx_3rd(r4,fr4,rv)
00041 end do
00042 end do
00043
00044 dfncdr = 0.25d0 &
00045 & *(dfncdr_tp(1,1) + dfncdr_tp(0,1) &
00046 & + dfncdr_tp(1,0) + dfncdr_tp(0,0))
00047 dfncdth = 0.25d0 &
00048 & *(fnc(irg ,itg,ipg ) - fnc(irg ,itg-1,ipg ) &
00049 & + fnc(irg-1,itg,ipg ) - fnc(irg-1,itg-1,ipg ) &
00050 & + fnc(irg ,itg,ipg-1) - fnc(irg ,itg-1,ipg-1) &
00051 & + fnc(irg-1,itg,ipg-1) - fnc(irg-1,itg-1,ipg-1))*dthginv
00052 dfncdphi = 0.25d0 &
00053 & *(fnc(irg ,itg ,ipg) - fnc(irg ,itg ,ipg-1) &
00054 & + fnc(irg-1,itg ,ipg) - fnc(irg-1,itg ,ipg-1) &
00055 & + fnc(irg ,itg-1,ipg) - fnc(irg ,itg-1,ipg-1) &
00056 & + fnc(irg-1,itg-1,ipg) - fnc(irg-1,itg-1,ipg-1))*dphiginv
00057
00058
00059
00060 gr1 = dfncdr
00061 gr2 = dfncdth*hrginv(irg)
00062 gr3 = dfncdphi*hrginv(irg)*hcosecthg(itg)
00063 dfdx = gr1 * hsinthg(itg) * hcosphig(ipg) &
00064 & + gr2 * hcosthg(itg) * hcosphig(ipg) &
00065 & - gr3 * hsinphig(ipg)
00066 dfdy = gr1 * hsinthg(itg) * hsinphig(ipg) &
00067 & + gr2 * hcosthg(itg) * hsinphig(ipg) &
00068 & + gr3 * hcosphig(ipg)
00069 dfdz = gr1 * hcosthg(itg) &
00070 & - gr2 * hsinthg(itg)
00071
00072 end subroutine grgrad_midpoint_type0