00001 subroutine grgrad_4th_gridpoint_bhex(fnc,dfdx,dfdy,dfdz,irg,itg,ipg)
00002   use phys_constant, only : long, pi
00003   use grid_parameter, only : nrg, ntg, npg, ntgeq, npgyzp
00004   use coordinate_grav_r, only : rginv
00005   use coordinate_grav_theta, only : dthginv
00006   use coordinate_grav_phi, only : dphiginv
00007   use coordinate_grav_extended
00008   use trigonometry_grav_theta, only : sinthg, costhg, cosecthg
00009   use trigonometry_grav_phi, only : sinphig, cosphig
00010   implicit none
00011   real(long), pointer     :: fnc(:,:,:)
00012   real(long) :: dfdx, dfdy, dfdz
00013   real(long) ::  gr1, gr2, gr3, rv, tv, pv
00014   real(long) ::  r5(5), th5(5), phi5(5), fr5(5), ft5(5), fp5(5)
00015   integer :: irg, itg, ipg, irgex, itgex, ipgex
00016   integer :: ir0, it0, ip0, irg0 , itg0 , ipg0, ii
00017   real(long), external :: dfdx_4th
00018 
00019 
00020 
00021 
00022 
00023 
00024   ir0 = min0(max0(0,irg-2),nrg-4)
00025   it0 = itg-2
00026   ip0 = ipg-2
00027 
00028   do ii = 1, 5
00029     irg0 = ir0 + ii - 1
00030     itg0 = it0 + ii - 1
00031     ipg0 = ip0 + ii - 1
00032 
00033     r5(ii) = rgex(irg0)
00034     th5(ii) = thgex(itg0)
00035     phi5(ii) = phigex(ipg0)
00036 
00037     if (itg.eq.0.or.itg.eq.ntg) then
00038       irgex = irg
00039       itgex = itgex_th(itg0)
00040       ipgex = ipgex_th(0,itg0)
00041       fr5(ii) = fnc(irgex,itgex,ipgex)
00042       irgex = irg
00043       itgex = itgex_th(itg0)
00044       ipgex = ipgex_th(npgyzp,itg0)
00045       ft5(ii) = fnc(irgex,itgex,ipgex)
00046       irgex = irgex_r(irg0)
00047       itgex = itgex_r(itg,irg0)
00048       ipgex = 0
00049       fp5(ii) = fnc(irgex,itgex,ipgex)
00050     else
00051       irgex = irgex_r(irg0)
00052       itgex = itgex_r(itg,irg0)
00053       ipgex = ipgex_r(ipg,irg0)
00054       fr5(ii) = fnc(irgex,itgex,ipgex)
00055       irgex = irg
00056       itgex = itgex_th(itg0)
00057       ipgex = ipgex_th(ipg,itg0)
00058       ft5(ii) = fnc(irgex,itgex,ipgex)
00059       irgex = irg
00060       itgex = itg
00061       ipgex = ipgex_phi(ipg0)
00062       fp5(ii) = fnc(irgex,itgex,ipgex)
00063     end if
00064   end do
00065 
00066 
00067 
00068   rv = rg(irg)
00069   tv = thg(itg)
00070   pv = phig(ipg)
00071 
00072   if (itg.eq.0) then
00073     dfdx = dfdx_4th(th5,fr5,tv)*rginv(irg)
00074     dfdy = dfdx_4th(th5,ft5,tv)*rginv(irg)
00075     dfdz = dfdx_4th(r5,fp5,rv)
00076   else if (itg.eq.ntg) then
00077     dfdx = - dfdx_4th(th5,fr5,tv)*rginv(irg)
00078     dfdy = - dfdx_4th(th5,ft5,tv)*rginv(irg)
00079     dfdz = - dfdx_4th(r5,fp5,rv)
00080   else
00081     gr1  = dfdx_4th(r5,fr5,rv)
00082     gr2  = dfdx_4th(th5,ft5,tv)*rginv(irg)
00083     gr3  = dfdx_4th(phi5,fp5,pv)*rginv(irg)*cosecthg(itg)
00084     dfdx = gr1*sinthg(itg)*cosphig(ipg) &
00085   &      + gr2*costhg(itg)*cosphig(ipg) &
00086   &      - gr3*sinphig(ipg)
00087     dfdy = gr1*sinthg(itg)*sinphig(ipg) &
00088   &      + gr2*costhg(itg)*sinphig(ipg) &
00089   &      + gr3*cosphig(ipg)
00090     dfdz = gr1*costhg(itg)  &
00091   &      - gr2*sinthg(itg)
00092   end if
00093 end subroutine grgrad_4th_gridpoint_bhex