00001 subroutine flgrad_type0(fnc,fnc_rs,dfdx,dfdy,dfdz,irf,itf,ipf)
00002 use phys_constant, only : long
00003 use coordinate_grav_r, only : hrginv, drginv
00004 use coordinate_grav_theta, only : dthginv
00005 use coordinate_grav_phi, only : dphiginv
00006 use trigonometry_grav_theta, only : hsinthg, hcosthg, hcosecthg
00007 use trigonometry_grav_phi, only : hsinphig, hcosphig
00008 implicit none
00009 real(long), intent(in) :: fnc(0:1,0:1,0:1), fnc_rs(0:1,0:1)
00010 real(long), intent(out) :: dfdx, dfdy, dfdz
00011 real(long) :: gr1, gr2, gr3, hrs, hrsinv
00012 real(long) :: dfncdr, dfncdth, dfncdphi, drsdth, drsdphi
00013 integer, intent(in) :: irf, itf, ipf
00014
00015
00016
00017
00018
00019
00020 dfncdr = 0.25d0 &
00021 & *(fnc(1,1,1) - fnc(0,1,1) &
00022 & + fnc(1,0,1) - fnc(0,0,1) &
00023 & + fnc(1,1,0) - fnc(0,1,0) &
00024 & + fnc(1,0,0) - fnc(0,0,0))*drginv(irf)
00025 dfncdth = 0.25d0 &
00026 & *(fnc(1,1,1) - fnc(1,0,1) &
00027 & + fnc(0,1,1) - fnc(0,0,1) &
00028 & + fnc(1,1,0) - fnc(1,0,0) &
00029 & + fnc(0,1,0) - fnc(0,0,0))*dthginv
00030 dfncdphi = 0.25d0 &
00031 & *(fnc(1,1,1) - fnc(1,1,0) &
00032 & + fnc(0,1,1) - fnc(0,1,0) &
00033 & + fnc(1,0,1) - fnc(1,0,0) &
00034 & + fnc(0,0,1) - fnc(0,0,0))*dphiginv
00035 drsdth = 0.5d0 &
00036 & *(fnc_rs(1,1) - fnc_rs(0,1) &
00037 & + fnc_rs(1,0) - fnc_rs(0,0))*dthginv
00038 drsdphi = 0.5d0 &
00039 & *(fnc_rs(1,1) - fnc_rs(1,0) &
00040 & + fnc_rs(0,1) - fnc_rs(0,0))*dphiginv
00041 hrs = 0.25d0 &
00042 & *(fnc_rs(1,1) + fnc_rs(0,1) &
00043 & + fnc_rs(1,0) + fnc_rs(0,0))
00044 hrsinv = 1.0d0/hrs
00045
00046
00047
00048 gr1 = dfncdr*hrsinv
00049 gr2 = dfncdth*hrginv(irf)*hrsinv &
00050 & - drsdth*hrsinv*gr1
00051 gr3 = dfncdphi*hrginv(irf)*hrsinv*hcosecthg(itf) &
00052 & - drsdphi*hrsinv*hcosecthg(itf)*gr1
00053
00054 dfdx = gr1 * hsinthg(itf) * hcosphig(ipf) &
00055 & + gr2 * hcosthg(itf) * hcosphig(ipf) &
00056 & - gr3 * hsinphig(ipf)
00057 dfdy = gr1 * hsinthg(itf) * hsinphig(ipf) &
00058 & + gr2 * hcosthg(itf) * hsinphig(ipf) &
00059 & + gr3 * hcosphig(ipf)
00060 dfdz = gr1 * hcosthg(itf) &
00061 & - gr2 * hsinthg(itf)
00062
00063 end subroutine flgrad_type0