00001 subroutine dadbscalar_3rd2nd_type0(fnc,d2f,irg,itg,ipg,cobj)
00002 use phys_constant, only : long
00003 use grid_parameter, only : nrg, ntg, npg, ntgxy, npgyzp
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 implicit none
00011 real(long), pointer :: fnc(:,:,:)
00012 real(long) :: d2f(1:3,1:3)
00013 real(long) :: dfdx, dfdy, dfdz
00014 real(long) :: gr1, gr2, gr3, rv, tv, pv
00015 real(long) :: r4(4), th4(4), phi4(4), fr4(4), ft4(4), fp4(4)
00016 real(long) :: dfncdx(0:1,0:1,0:1), dfncdy(0:1,0:1,0:1), dfncdz(0:1,0:1,0:1)
00017 real(long) :: d2fdxdx, d2fdxdy, d2fdxdz,
00018 d2fdydx, d2fdydy, d2fdydz, &
00019 d2fdzdx, d2fdzdy, d2fdzdz
00020 integer :: irg, itg, ipg, irgex, itgex, ipgex
00021 integer :: ir0, it0, ip0, irg0 , itg0 , ipg0, ii
00022 integer :: ip, ir, it, irg8, itg8, ipg8
00023 real(long), external :: dfdx_3rd
00024 character(len=2), intent(in) :: cobj
00025
00026
00027
00028
00029
00030
00031 if (cobj.eq.'bh') ir0 = min0(max0(0,irg-2),nrg-3)
00032 if (cobj.eq.'ns') ir0 = min0(irg-2,nrg-3)
00033 it0 = itg-2
00034 ip0 = ipg-2
00035
00036 do ip = 0, 1
00037 ipg8 = ipg - 1 + ip
00038 do it = 0, 1
00039 itg8 = itg - 1 + it
00040 do ir = 0, 1
00041 irg8 = irg - 1 + ir
00042
00043 do ii = 1, 4
00044 irg0 = ir0 + ii - 1
00045 itg0 = it0 + ii - 1
00046 ipg0 = ip0 + ii - 1
00047
00048 r4(ii) = rgex(irg0)
00049 th4(ii) = thgex(itg0)
00050 phi4(ii) = phigex(ipg0)
00051
00052 if (irg8.eq.0) then
00053 irgex = irgex_r(irg0)
00054 itgex = ntgxy
00055 ipgex = ipgex_r(0,irg0)
00056 fr4(ii) = fnc(irgex,itgex,ipgex)
00057 irgex = irgex_r(irg0)
00058 itgex = ntgxy
00059 ipgex = ipgex_r(npgyzp,irg0)
00060 ft4(ii) = fnc(irgex,itgex,ipgex)
00061 irgex = irgex_r(irg0)
00062 itgex = itgex_r(0,irg0)
00063 ipgex = 0
00064 fp4(ii) = fnc(irgex,itgex,ipgex)
00065 else
00066 if (itg8.eq.0.or.itg8.eq.ntg) then
00067 irgex = irg8
00068 itgex = itgex_th(itg0)
00069 ipgex = ipgex_th(0,itg0)
00070 fr4(ii) = fnc(irgex,itgex,ipgex)
00071 irgex = irg8
00072 itgex = itgex_th(itg0)
00073 ipgex = ipgex_th(npgyzp,itg0)
00074 ft4(ii) = fnc(irgex,itgex,ipgex)
00075 irgex = irgex_r(irg0)
00076 itgex = itgex_r(itg,irg0)
00077 ipgex = 0
00078 fp4(ii) = fnc(irgex,itgex,ipgex)
00079 else
00080 irgex = irgex_r(irg0)
00081 itgex = itgex_r(itg8,irg0)
00082 ipgex = ipgex_r(ipg8,irg0)
00083 fr4(ii) = fnc(irgex,itgex,ipgex)
00084 irgex = irg8
00085 itgex = itgex_th(itg0)
00086 ipgex = ipgex_th(ipg8,itg0)
00087 ft4(ii) = fnc(irgex,itgex,ipgex)
00088 irgex = irg8
00089 itgex = itg8
00090 ipgex = ipgex_phi(ipg0)
00091 fp4(ii) = fnc(irgex,itgex,ipgex)
00092 end if
00093 end if
00094 end do
00095
00096
00097
00098 rv = rg(irg8)
00099 tv = thg(itg8)
00100 pv = phig(ipg8)
00101
00102 if (irg8.eq.0) then
00103 dfdx = dfdx_3rd(r4,fr4,rv)
00104 dfdy = dfdx_3rd(r4,ft4,rv)
00105 dfdz = dfdx_3rd(r4,fp4,rv)
00106 else
00107 if (itg8.eq.0) then
00108 dfdx = dfdx_3rd(th4,fr4,tv)*rginv(irg8)
00109 dfdy = dfdx_3rd(th4,ft4,tv)*rginv(irg8)
00110 dfdz = dfdx_3rd(r4,fp4,rv)
00111 else if (itg8.eq.ntg) then
00112 dfdx = - dfdx_3rd(th4,fr4,tv)*rginv(irg8)
00113 dfdy = - dfdx_3rd(th4,ft4,tv)*rginv(irg8)
00114 dfdz = - dfdx_3rd(r4,fp4,rv)
00115 else
00116 gr1 = dfdx_3rd(r4,fr4,rv)
00117 gr2 = dfdx_3rd(th4,ft4,tv)*rginv(irg8)
00118 gr3 = dfdx_3rd(phi4,fp4,pv)*rginv(irg8)*cosecthg(itg8)
00119 dfdx = gr1*sinthg(itg8)*cosphig(ipg8) &
00120 & + gr2*costhg(itg8)*cosphig(ipg8) &
00121 & - gr3*sinphig(ipg8)
00122 dfdy = gr1*sinthg(itg8)*sinphig(ipg8) &
00123 & + gr2*costhg(itg8)*sinphig(ipg8) &
00124 & + gr3*cosphig(ipg8)
00125 dfdz = gr1*costhg(itg8) &
00126 & - gr2*sinthg(itg8)
00127 end if
00128 end if
00129
00130 dfncdx(ir,it,ip) = dfdx
00131 dfncdy(ir,it,ip) = dfdy
00132 dfncdz(ir,it,ip) = dfdz
00133 end do
00134 end do
00135 end do
00136
00137 call grgrad_type0(dfncdx,d2fdxdx,d2fdxdy,d2fdxdz,irg,itg,ipg)
00138 call grgrad_type0(dfncdy,d2fdydx,d2fdydy,d2fdydz,irg,itg,ipg)
00139 call grgrad_type0(dfncdz,d2fdzdx,d2fdzdy,d2fdzdz,irg,itg,ipg)
00140 d2f(1,1) = d2fdxdx
00141 d2f(1,2) = d2fdxdy
00142 d2f(1,3) = d2fdxdz
00143 d2f(2,1) = d2fdydx
00144 d2f(2,2) = d2fdydy
00145 d2f(2,3) = d2fdydz
00146 d2f(3,1) = d2fdzdx
00147 d2f(3,2) = d2fdzdy
00148 d2f(3,3) = d2fdzdz
00149
00150 end subroutine dadbscalar_3rd2nd_type0