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