00001 subroutine sourceterm_insurf_asymptotic_patch(impt_bin,impt_apt, &
00002   &                                           fnc,sou_in,dsou_in)
00003   use phys_constant, only : long, nnrg
00004   use grid_parameter, only : nrg, ntg, npg, npgxzm
00005   use coordinate_grav_extended, only : rgex
00006 
00007   use trigonometry_grav_theta, only  : hsinthg
00008   use trigonometry_grav_phi, only : hcosmpg
00009 
00010   use make_array_2d
00011   use interface_interpo_binary_to_asymptotic_patch
00012   use interface_interpo_linear_type0_2Dsurf
00013 
00014   implicit none
00015   real(long), pointer :: fnc(:,:,:), sou_in(:,:), dsou_in(:,:)
00016   real(long), pointer :: fnc_insurf(:,:), dfnc_insurf(:,:)
00017   integer, intent(IN) :: impt_bin, impt_apt
00018   real(long) :: deriv, val, r5(5), fr5(5), rv
00019   real(long) :: rgex_apt(-2:nnrg+2)
00020   integer :: irg, itg, ipg, ir0, irg0, ii
00021   integer :: ntg_apt, npg_apt, npgxzm_apt
00022   real(long), external :: dfdx_4th
00023 
00024   call copy_grid_parameter_from_mpt(impt_apt)
00025   call copy_coordinate_grav_extended_from_mpt(impt_apt)
00026   ntg_apt = ntg
00027   npg_apt = npg
00028   npgxzm_apt = npgxzm
00029   rgex_apt(-2:nrg+2) = rgex(-2:nrg+2)
00030   call copy_grid_parameter_from_mpt(impt_bin)
00031   call copy_coordinate_grav_extended_from_mpt(impt_bin)
00032 
00033   call alloc_array2d(fnc_insurf, 0, ntg_apt, 0, npg_apt)
00034   call alloc_array2d(dfnc_insurf, 0, ntg_apt, 0, npg_apt)
00035 
00036   do ipg = 0, npg_apt
00037     do itg = 0, ntg_apt
00038       irg = 0
00039       ir0 = irg - 2
00040       do ii = 1, 5
00041         irg0 = ir0 + ii - 1
00042         call interpo_binary_to_asymptotic_patch(fnc,val,irg0,itg,ipg)
00043         r5(ii) = rgex_apt(irg0)
00044         fr5(ii) = val
00045       end do
00046       rv = rgex_apt(irg)
00047       deriv = dfdx_4th(r5,fr5,rv)
00048       fnc_insurf(itg,ipg) = fr5(3)
00049       dfnc_insurf(itg,ipg) = deriv
00050     end do
00051   end do
00052 
00053   do ipg = 1, npg_apt
00054     do itg = 1, ntg_apt
00055 
00056 
00057       call interpo_linear_type0_2Dsurf(val,fnc_insurf,itg,ipg)
00058       sou_in(itg,ipg) = val
00059 
00060       call interpo_linear_type0_2Dsurf(val,dfnc_insurf,itg,ipg)
00061       dsou_in(itg,ipg) = val
00062     end do
00063   end do
00064 
00065   deallocate(fnc_insurf)
00066   deallocate(dfnc_insurf)
00067 end subroutine sourceterm_insurf_asymptotic_patch