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