00001 subroutine interpo_fl2gr(flv,grv)
00002 use phys_constant, only : long
00003 use grid_parameter, only : nrg, ntg, npg, nrf, ntf, npf
00004 use coordinate_grav_r, only : rg
00005 use coordinate_grav_extended
00006 use def_matter, only : rs
00007 implicit none
00008 real(long), external :: lagint_4th, lagint_2nd
00009 real(long), pointer :: grv(:,:,:), flv(:,:,:)
00010 real(long) :: x(4), f(4), x2(2), f2(2)
00011 real(long) :: rrff, rrgg, small = 1.0d-14
00012 integer :: irf, irg, itg, ipg, ir0, irf0, ii
00013 integer :: irgex, itgex, ipgex
00014
00015 grv(0:nrg,0:ntg,0:npg) = 0.0d0
00016
00017 do ipg = 0, npg
00018 do itg = 0, ntg
00019 do irg = 0, nrg
00020 rrff = rs(itg,ipg)
00021 if (rg(irg).gt.rrff*rg(nrf)) exit
00022 do irf = 0, nrf
00023 if (rg(irg).le.rrff*rg(irf)) then
00024 irf0= irf-1
00025 ir0 = min0(irf-2,nrf-3)
00026 exit
00027 end if
00028 end do
00029 if (irf0.eq.nrf-1) then
00030 x2(1:2) = rrff*rg(irf0:irf0+1)
00031 f2(1:2) = flv(irf0:irf0+1,itg,ipg)
00032 rrgg = rg(irg)
00033 grv(irg,itg,ipg) = lagint_2nd(x2,f2,rrgg)
00034 else
00035 do ii = 1, 4
00036 irf0 = ir0 + ii - 1
00037 irgex = irgex_r(irf0)
00038 itgex = itgex_r(itg,irf0)
00039 ipgex = ipgex_r(ipg,irf0)
00040 x(ii) = rs(itgex,ipgex)*rgex(irf0)
00041 f(ii) = flv(irgex,itgex,ipgex)
00042 rrgg = rg(irg)
00043 grv(irg,itg,ipg) = lagint_4th(x,f,rrgg)
00044 end do
00045 end if
00046 end do
00047 end do
00048 end do
00049
00050 end subroutine interpo_fl2gr