00001 subroutine flgrad_4th_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) :: r5(5), th5(5), phi5(5), fr5(5), ft5(5), fp5(5)
00014 real(long) :: rs_t5(5), rs_p5(5)
00015 integer :: irf, itf, ipf, irgex, itgex, ipgex
00016 integer :: ir0, it0, ip0, irf0 , itf0 , ipf0, ii
00017 real(long), external :: dfdx_4th
00018
00019
00020
00021
00022
00023
00024 ir0 = min0(irf-2,nrf-4)
00025 it0 = itf-2
00026 ip0 = ipf-2
00027 rsinv = 1.0d0/rs(itf,ipf)
00028
00029 do ii = 1, 5
00030 irf0 = ir0 + ii - 1
00031 itf0 = it0 + ii - 1
00032 ipf0 = ip0 + ii - 1
00033
00034 th5(ii) = thgex(itf0)
00035 phi5(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 r5(ii) = rs(itgex,ipgex)*rgex(irf0)
00042 fr5(ii) = fnc(irgex,itgex,ipgex)
00043 irgex = irgex_r(irf0)
00044 itgex = ntfeq
00045 ipgex = ipgex_r(npfyzp,irf0)
00046 th5(ii) = rs(itgex,ipgex)*rgex(irf0)
00047 ft5(ii) = fnc(irgex,itgex,ipgex)
00048 irgex = irgex_r(irf0)
00049 itgex = itgex_r(0,irf0)
00050 ipgex = 0
00051 phi5(ii)= rs(itgex,ipgex)*rgex(irf0)
00052 fp5(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 fr5(ii) = fnc(irgex,itgex,ipgex)
00059 rs_t5(ii) = rs(itgex,ipgex)
00060 irgex = irf
00061 itgex = itgex_th(itf0)
00062 ipgex = ipgex_th(npfyzp,itf0)
00063 ft5(ii) = fnc(irgex,itgex,ipgex)
00064 rs_p5(ii) = rs(itgex,ipgex)
00065 irgex = irgex_r(irf0)
00066 itgex = itgex_r(itf,irf0)
00067 ipgex = 0
00068 r5(ii) = rs(itgex,ipgex)*rgex(irf0)
00069 fp5(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 r5(ii) = rs(itgex,ipgex)*rgex(irf0)
00075 fr5(ii) = fnc(irgex,itgex,ipgex)
00076 irgex = irf
00077 itgex = itgex_th(itf0)
00078 ipgex = ipgex_th(ipf,itf0)
00079 ft5(ii) = fnc(irgex,itgex,ipgex)
00080 rs_t5(ii) = rs(itgex,ipgex)
00081 irgex = irf
00082 itgex = itf
00083 ipgex = ipgex_phi(ipf0)
00084 fp5(ii) = fnc(irgex,itgex,ipgex)
00085 rs_p5(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_4th(r5,fr5,rv)
00098 dfdy = dfdx_4th(r5,ft5,rv)
00099 dfdz = dfdx_4th(r5,fp5,rv)
00100 else
00101 if (itf.eq.0.or.itf.eq.ntf) then
00102 dfdrR= dfdx_4th(r5,fp5,rv)
00103 dfdx = dfdx_4th(th5,fr5,tv)*rginv(irf)*rsinv &
00104 & - dfdx_4th(th5,rs_t5,tv)*rsinv*dfdrR
00105 dfdy = dfdx_4th(th5,ft5,tv)*rginv(irf)*rsinv &
00106 & - dfdx_4th(th5,rs_p5,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_4th(r5,fr5,rv)
00115 gr2 = dfdx_4th(th5,ft5,tv)*rginv(irf)*rsinv &
00116 & - dfdx_4th(th5,rs_t5,tv)*rsinv*gr1
00117 gr3 = dfdx_4th(phi5,fp5,pv)*rginv(irf)*rsinv*cosecthg(itf) &
00118 & - dfdx_4th(phi5,rs_p5,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_4th_gridpoint