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