00001 subroutine flgrad_2nd_gridpoint(fnc,dfdx,dfdy,dfdz,irf,itf,ipf)
00002   use phys_constant, only : long
00003   use grid_parameter, only : nrf, ntf, npf, ntfeq, npfyzp
00004   use coordinate_grav_r, only : rginv
00005   use coordinate_grav_extended
00006   use trigonometry_grav_theta, only : sinthg, costhg, cosecthg
00007   use trigonometry_grav_phi, only : sinphig, cosphig
00008   use def_matter, only : rs
00009   implicit none
00010   real(long), pointer     :: fnc(:,:,:)
00011   real(long), intent(out) :: dfdx, dfdy, dfdz
00012   real(long) ::  gr1, gr2, gr3, rv, tv, pv, rsinv, dfdrR
00013   real(long) ::  r3(3), th3(3), phi3(3), fr3(3), ft3(3), fp3(3)
00014   real(long) ::  rs_t3(3), rs_p3(3)
00015   integer :: irf, itf, ipf, irgex, itgex, ipgex
00016   integer :: ir0, it0, ip0, irf0 , itf0 , ipf0, ii
00017   real(long), external :: dfdx_2nd
00018 
00019 
00020 
00021 
00022 
00023 
00024   ir0 = min0(irf-1,nrf-2)
00025   it0 = itf-1
00026   ip0 = ipf-1
00027   rsinv = 1.0d0/rs(itf,ipf)
00028 
00029   do ii = 1, 3
00030     irf0 = ir0 + ii - 1
00031     itf0 = it0 + ii - 1
00032     ipf0 = ip0 + ii - 1
00033 
00034     th3(ii) = thgex(itf0)
00035     phi3(ii) = phigex(ipf0)
00036 
00037     if (irf.eq.0) then
00038       irgex = irgex_r(irf0)
00039       itgex = ntfeq
00040       ipgex = ipgex_r(0,irf0)
00041       r3(ii)  = rs(itgex,ipgex)*rgex(irf0)
00042       fr3(ii) = fnc(irgex,itgex,ipgex)
00043       irgex = irgex_r(irf0)
00044       itgex = ntfeq
00045       ipgex = ipgex_r(npfyzp,irf0)
00046       th3(ii) = rs(itgex,ipgex)*rgex(irf0)
00047       ft3(ii) = fnc(irgex,itgex,ipgex)
00048       irgex = irgex_r(irf0)
00049       itgex = itgex_r(0,irf0)
00050       ipgex = 0
00051       phi3(ii)= rs(itgex,ipgex)*rgex(irf0)
00052       fp3(ii) = fnc(irgex,itgex,ipgex)
00053     else
00054       if (itf.eq.0.or.itf.eq.ntf) then
00055         irgex = irf
00056         itgex = itgex_th(itf0)
00057         ipgex = ipgex_th(0,itf0)
00058         fr3(ii) = fnc(irgex,itgex,ipgex)
00059         rs_t3(ii) = rs(itgex,ipgex)
00060         irgex = irf
00061         itgex = itgex_th(itf0)
00062         ipgex = ipgex_th(npfyzp,itf0)
00063         ft3(ii) = fnc(irgex,itgex,ipgex)
00064         rs_p3(ii) = rs(itgex,ipgex)
00065         irgex = irgex_r(irf0)
00066         itgex = itgex_r(itf,irf0)
00067         ipgex = 0
00068         r3(ii)  = rs(itgex,ipgex)*rgex(irf0)
00069         fp3(ii) = fnc(irgex,itgex,ipgex)
00070       else
00071         irgex = irgex_r(irf0)
00072         itgex = itgex_r(itf,irf0)
00073         ipgex = ipgex_r(ipf,irf0)
00074         r3(ii)  = rs(itgex,ipgex)*rgex(irf0)
00075         fr3(ii) = fnc(irgex,itgex,ipgex)
00076         irgex = irf
00077         itgex = itgex_th(itf0)
00078         ipgex = ipgex_th(ipf,itf0)
00079         ft3(ii) = fnc(irgex,itgex,ipgex)
00080         rs_t3(ii) = rs(itgex,ipgex)
00081         irgex = irf
00082         itgex = itf
00083         ipgex = ipgex_phi(ipf0)
00084         fp3(ii) = fnc(irgex,itgex,ipgex)
00085         rs_p3(ii) = rs(itgex,ipgex)
00086       end if
00087     end if
00088   end do
00089 
00090 
00091 
00092   rv = rg(irf)*rs(itf,ipf)
00093   tv = thg(itf)
00094   pv = phig(ipf)
00095 
00096   if (irf.eq.0) then
00097     dfdx = dfdx_2nd(r3,fr3,rv)
00098     dfdy = dfdx_2nd(th3,ft3,rv)
00099     dfdz = dfdx_2nd(phi3,fp3,rv)
00100   else
00101     if (itf.eq.0.or.itf.eq.ntf) then
00102       dfdrR= dfdx_2nd(r3,fp3,rv)
00103       dfdx = dfdx_2nd(th3,fr3,tv)*rginv(irf)*rsinv &
00104       &    - dfdx_2nd(th3,rs_t3,tv)*rsinv*dfdrR  
00105       dfdy = dfdx_2nd(th3,ft3,tv)*rginv(irf)*rsinv &
00106       &    - dfdx_2nd(th3,rs_p3,tv)*rsinv*dfdrR  
00107       dfdz = dfdrR
00108       if (itf.eq.ntf) then
00109         dfdx = - dfdx
00110         dfdy = - dfdy
00111         dfdz = - dfdz
00112       end if
00113     else
00114       gr1  = dfdx_2nd(r3,fr3,rv)
00115       gr2  = dfdx_2nd(th3,ft3,tv)*rginv(irf)*rsinv &
00116       &    - dfdx_2nd(th3,rs_t3,tv)*rsinv*gr1
00117       gr3  = dfdx_2nd(phi3,fp3,pv)*rginv(irf)*rsinv*cosecthg(itf) &
00118       &    - dfdx_2nd(phi3,rs_p3,pv)*rsinv*cosecthg(itf)*gr1
00119       dfdx = gr1*sinthg(itf)*cosphig(ipf) &
00120     &      + gr2*costhg(itf)*cosphig(ipf) &
00121     &      - gr3*sinphig(ipf)
00122       dfdy = gr1*sinthg(itf)*sinphig(ipf) &
00123     &      + gr2*costhg(itf)*sinphig(ipf) &
00124     &      + gr3*cosphig(ipf)
00125       dfdz = gr1*costhg(itf)  &
00126     &      - gr2*sinthg(itf)
00127     end if
00128   end if
00129 end subroutine flgrad_2nd_gridpoint