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