00001 subroutine dadbscalar_type0(fnc,d2f,irf,itf,ipf)
00002 use phys_constant, only : long
00003 use grid_parameter, only : nrf, ntf, npf, ntfxy, npfyzp
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 use def_matter, only : rs
00011 implicit none
00012 real(long), pointer :: fnc(:,:,:)
00013 real(long) :: d2f(1:3,1:3)
00014 real(long) :: dfdx, dfdy, dfdz
00015 real(long) :: gr1, gr2, gr3, rv, tv, pv
00016 real(long) :: r4(4), th4(4), phi4(4), fr4(4), ft4(4), fp4(4)
00017 real(long) :: rs_t4(4), rs_p4(4)
00018 real(long) :: dfncdx(0:1,0:1,0:1), dfncdy(0:1,0:1,0:1), dfncdz(0:1,0:1,0:1)
00019 real(long) :: fnc_rs(0:1,0:1)
00020 real(long) :: d2fdxdx, d2fdxdy, d2fdxdz,
00021 d2fdydx, d2fdydy, d2fdydz, &
00022 d2fdzdx, d2fdzdy, d2fdzdz
00023 integer :: irf, itf, ipf, irgex, itgex, ipgex
00024 integer :: ir0, it0, ip0, irf0 , itf0 , ipf0, ii
00025 integer :: ip, ir, it, irf8, itf8, ipf8
00026 real(long), external :: dfdx_3rd
00027
00028
00029
00030
00031
00032
00033 ir0 = min0(irf-2,nrf-3)
00034 it0 = itf-2
00035 ip0 = ipf-2
00036
00037 do ip = 0, 1
00038 ipf8 = ipf - 1 + ip
00039 do it = 0, 1
00040 itf8 = itf - 1 + it
00041 do ir = 0, 1
00042 irf8 = irf - 1 + ir
00043
00044 do ii = 1, 4
00045 irf0 = ir0 + ii - 1
00046 itf0 = it0 + ii - 1
00047 ipf0 = ip0 + ii - 1
00048
00049 r4(ii) = rgex(irf0)
00050 th4(ii) = thgex(itf0)
00051 phi4(ii) = phigex(ipf0)
00052
00053 if (irf8.eq.0) then
00054 irgex = irgex_r(irf0)
00055 itgex = ntfxy
00056 ipgex = ipgex_r(0,irf0)
00057 r4(ii) = rs(itgex,ipgex)*rgex(irf0)
00058 fr4(ii) = fnc(irgex,itgex,ipgex)
00059 irgex = irgex_r(irf0)
00060 itgex = ntfxy
00061 ipgex = ipgex_r(npfyzp,irf0)
00062 th4(ii) = rs(itgex,ipgex)*rgex(irf0)
00063 ft4(ii) = fnc(irgex,itgex,ipgex)
00064 irgex = irgex_r(irf0)
00065 itgex = itgex_r(0,irf0)
00066 ipgex = 0
00067 phi4(ii)= rs(itgex,ipgex)*rgex(irf0)
00068 fp4(ii) = fnc(irgex,itgex,ipgex)
00069 else
00070 if (itf8.eq.0.or.itf8.eq.ntf) then
00071 irgex = irf8
00072 itgex = itgex_th(itf0)
00073 ipgex = ipgex_th(0,itf0)
00074 fr4(ii) = fnc(irgex,itgex,ipgex)
00075 rs_t4(ii) = rs(itgex,ipgex)
00076 irgex = irf8
00077 itgex = itgex_th(itf0)
00078 ipgex = ipgex_th(npfyzp,itf0)
00079 ft4(ii) = fnc(irgex,itgex,ipgex)
00080 rs_p4(ii) = rs(itgex,ipgex)
00081 irgex = irgex_r(irf0)
00082 itgex = itgex_r(itf,irf0)
00083 ipgex = 0
00084 r4(ii)= rs(itgex,ipgex)*rgex(irf0)
00085 fp4(ii) = fnc(irgex,itgex,ipgex)
00086 else
00087 irgex = irgex_r(irf0)
00088 itgex = itgex_r(itf8,irf0)
00089 ipgex = ipgex_r(ipf8,irf0)
00090 r4(ii)= rs(itgex,ipgex)*rgex(irf0)
00091 fr4(ii) = fnc(irgex,itgex,ipgex)
00092 irgex = irf8
00093 itgex = itgex_th(itf0)
00094 ipgex = ipgex_th(ipf8,itf0)
00095 ft4(ii) = fnc(irgex,itgex,ipgex)
00096 rs_t4(ii) = rs(itgex,ipgex)
00097 irgex = irf8
00098 itgex = itf8
00099 ipgex = ipgex_phi(ipf0)
00100 fp4(ii) = fnc(irgex,itgex,ipgex)
00101 rs_p4(ii) = rs(itgex,ipgex)
00102 end if
00103 end if
00104 end do
00105
00106
00107
00108 rv = rg(irf8)*rs(itf8,ipf8)
00109 tv = thg(itf8)
00110 pv = phig(ipf8)
00111 rsinv = 1.0d0/rs(itf8,ipf8)
00112
00113 if (irf8.eq.0) then
00114 dfdx = dfdx_3rd(r4,fr4,rv)
00115 dfdy = dfdx_3rd(r4,ft4,rv)
00116 dfdz = dfdx_3rd(r4,fp4,rv)
00117 else
00118 if (itf8.eq.0.or.itf8.eq.ntf) then
00119 dfdrR= dfdx_3rd(r4,fp4,rv)
00120 dfdx = dfdx_3rd(th4,fr4,tv)*rginv(irf8)*rsinv &
00121 & - dfdx_3rd(th4,rs_t4,tv)*rsinv*dfdrR
00122 dfdy = dfdx_3rd(th4,ft4,tv)*rginv(irf8)*rsinv &
00123 & - dfdx_3rd(th4,rs_p4,tv)*rsinv*dfdrR
00124 dfdz = dfdrR
00125 if (itf8.eq.ntf) then
00126 dfdx = - dfdx
00127 dfdy = - dfdy
00128 dfdz = - dfdz
00129 end if
00130 else
00131 gr1 = dfdx_3rd(r4,fr4,rv)
00132 gr2 = dfdx_3rd(th4,ft4,tv)*rginv(irf8)*rsinv &
00133 & - dfdx_3rd(th4,rs_t4,tv)*rsinv*gr1
00134 gr3 = dfdx_3rd(phi4,fp4,pv)*rginv(irf8)*cosecthg(itf8) &
00135 & - dfdx_3rd(phi4,rs_p4,pv)*rsinv*cosecthg(itf8)*gr1
00136 dfdx = gr1*sinthg(itf8)*cosphig(ipf8) &
00137 & + gr2*costhg(itf8)*cosphig(ipf8) &
00138 & - gr3*sinphig(ipf8)
00139 dfdy = gr1*sinthg(itf8)*sinphig(ipf8) &
00140 & + gr2*costhg(itf8)*sinphig(ipf8) &
00141 & + gr3*cosphig(ipf8)
00142 dfdz = gr1*costhg(itf8) &
00143 & - gr2*sinthg(itf8)
00144 end if
00145 end if
00146
00147 dfncdx(ir,it,ip) = dfdx
00148 dfncdy(ir,it,ip) = dfdy
00149 dfncdz(ir,it,ip) = dfdz
00150 end do
00151 fnc_rs(it,ip) = rs(itf8,ipf8)
00152 end do
00153 end do
00154
00155 call flgrad_type0(dfncdx,fnc_rs,d2fdxdx,d2fdxdy,d2fdxdz,irf,itf,ipf)
00156 call flgrad_type0(dfncdy,fnc_rs,d2fdydx,d2fdydy,d2fdydz,irf,itf,ipf)
00157 call flgrad_type0(dfncdz,fnc_rs,d2fdzdx,d2fdzdy,d2fdzdz,irf,itf,ipf)
00158 d2f(1,1) = d2fdxdx
00159 d2f(1,2) = d2fdxdy
00160 d2f(1,3) = d2fdxdz
00161 d2f(2,1) = d2fdydx
00162 d2f(2,2) = d2fdydy
00163 d2f(2,3) = d2fdydz
00164 d2f(3,1) = d2fdzdx
00165 d2f(3,2) = d2fdzdy
00166 d2f(3,3) = d2fdzdz
00167
00168 end subroutine dadbscalar_fluid_type0