00001 subroutine interpo_fl2cgr_4th(fnc,cfn,xc,yc,zc)
00002   use phys_constant, only : long, pi
00003   use grid_parameter, only : nrf, ntg, npg
00004   use coordinate_grav_extended
00005   use def_matter, only : rs
00006   use interface_modules_cartesian
00007   use interface_interpo_lag4th_2Dsurf
00008   implicit none
00009   real(long), pointer     :: fnc(:,:,:)
00010   real(long), intent(out) :: cfn
00011   real(long) ::  rsca, rc_gr
00012   real(long) ::  xc, yc, zc, rc, thc, phic, varpic
00013   real(long) ::  r4(4), th4(4), phi4(4), fr4(4), ft4(4), fp4(4)
00014   integer :: irg, itg, ipg, irgex, itgex, ipgex
00015   integer :: ir0, it0, ip0, irg0 , itg0 , ipg0, ii, jj, kk
00016   real(long), external :: lagint_4th
00017 
00018 
00019 
00020 
00021   cfn = 0.0d0
00022 
00023   rc_gr  = dsqrt(dabs(xc**2 + yc**2 + zc**2))
00024   varpic = dsqrt(dabs(xc**2 + yc**2))
00025   thc  = dmod(2.0d0*pi + datan2(varpic,zc),2.0d0*pi)
00026   phic = dmod(2.0d0*pi + datan2(    yc,xc),2.0d0*pi)
00027 
00028   call interpo_lag4th_2Dsurf(rsca,rs,thc,phic)
00029   rc = rc_gr/rsca
00030   if (rc.gt.1.0d0) return
00031 
00032   do irg = 0, nrf+1
00033     if (rc.lt.rgex(irg).and.rc.ge.rgex(irg-1)) ir0 = min0(irg-2,nrf-3)
00034   end do
00035   do itg = 0, ntg+1
00036     if (thc.lt.thgex(itg).and.thc.ge.thgex(itg-1)) it0 = itg-2
00037   end do
00038   do ipg = 0, npg+1
00039     if (phic.lt.phigex(ipg).and.phic.ge.phigex(ipg-1)) ip0 = ipg-2
00040   end do
00041 
00042   do ii = 1, 4
00043     irg0 = ir0 + ii - 1
00044     itg0 = it0 + ii - 1
00045     ipg0 = ip0 + ii - 1
00046     r4(ii) = rgex(irg0)
00047     th4(ii) = thgex(itg0)
00048     phi4(ii) = phigex(ipg0)
00049   end do
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059   do kk = 1, 4
00060     ipg0 = ip0 + kk - 1
00061     do jj = 1, 4
00062       itg0 = it0 + jj - 1
00063       do ii = 1, 4
00064         irg0 = ir0 + ii - 1
00065         irgex = irgex_r(irg0)
00066         itgex = itgex_r(itgex_th(itg0),irg0)
00067         ipgex = ipgex_r(ipgex_th(ipgex_phi(ipg0),itg0),irg0)
00068         fr4(ii) = fnc(irgex,itgex,ipgex)
00069       end do
00070       ft4(jj) = lagint_4th(r4,fr4,rc)
00071     end do
00072     fp4(kk) = lagint_4th(th4,ft4,thc)
00073   end do
00074   cfn = lagint_4th(phi4,fp4,phic)
00075 
00076 end subroutine interpo_fl2cgr_4th