00001 subroutine interpo_flsfc2flsph_midpoint(flv,flsphv)
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, only : irgex_hr, itgex_hr, ipgex_hr
00006 use def_matter, only : rs
00007 implicit none
00008 real(long), external :: lagint_4th
00009 real(long), pointer :: flsphv(:,:,:), 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, irg0, itg0, ipg0
00013
00014
00015
00016
00017 flsphv(1:nrf,1:ntf,1:npf) = 0.0d0
00018
00019 do ipg = 1, npg
00020 do itg = 1, ntg
00021 call interpo_linear_type0_2Dsurf(rrff,rs,itg,ipg)
00022 do irg = 1, nrf
00023 if (hrg(irg).gt.rrff*rg(nrf)) exit
00024 if (hrg(irg).gt.rrff*hrg(nrf-1) then
00025 ir0 = nrf-1
00026 do ii = 1, 2
00027 irf0 = ir0 + ii - 1
00028 irg0 = irgex_hr(irf0)
00029 itg0 = itgex_hr(itg,irf0)
00030 ipg0 = ipgex_hr(ipg,irf0)
00031 call interpo_linear_type0_2Dsurf(rrff,rs,itg0,ipg0)
00032 x2(ii) = rrff*hrgex(irf0)
00033 f2(ii) = flv(irg0,itg0,ipg0)
00034 end do
00035 rrgg = hrg(irg)
00036 flsphv(irg,itg,ipg) = lagint_2nd(x,f,rrgg)
00037 exit
00038 end if
00039
00040 do irf = 1, nrf
00041 if (hrg(irg).le.rrff*hrg(irf)) then
00042 ir0 = min0(irf-2,nrf-3)
00043 exit
00044 end if
00045 end do
00046 do ii = 1, 4
00047 irf0 = ir0 + ii - 1
00048 irg0 = irgex_hr(irf0)
00049 itg0 = itgex_hr(itg,irf0)
00050 ipg0 = ipgex_hr(ipg,irf0)
00051 call interpo_linear_type0_2Dsurf(rrff,rs,itg0,ipg0)
00052 x(ii) = rrff*hrgex(irf0)
00053 f(ii) = flv(irg0,itg0,ipg0)
00054 end do
00055 rrgg = hrg(irg)
00056 flsphv(irg,itg,ipg) = lagint_4th(x,f,rrgg)
00057 end do
00058 end do
00059 end do
00060
00061 end subroutine interpo_flsfc2flsph_midpoint