00001 subroutine interpo_3D_initial_4th_surface(fnc)
00002 use phys_constant, only : long
00003 use grid_parameter, only : ntg, npg
00004 use coordinate_grav_theta, only : thg
00005 use coordinate_grav_phi, only : phig
00006 use grid_temporary, only : ntftmp, npftmp, thgtmp, phigtmp
00007 use make_array_2d
00008 implicit none
00009 real(long), pointer :: fnc(:,:)
00010 real(long), pointer :: fnctmp(:,:)
00011 real(long) :: thc, phic
00012 real(long) :: th4(4), phi4(4), ft4(4), fp4(4)
00013 integer :: itg, ipg, it, ip
00014 integer :: it0, ip0, itg0, ipg0, ii, jj, kk
00015 real(long), external :: lagint_4th
00016
00017
00018
00019
00020 call alloc_array2d(fnctmp,0,ntftmp,0,npftmp)
00021
00022 fnctmp(0:ntftmp,0:npftmp) = 0.0d0
00023 fnctmp(0:ntftmp,0:npftmp) = fnc(0:ntftmp,0:npftmp)
00024
00025 do ipg = 0, npg
00026 phic = phig(ipg)
00027 do ip = 0, npftmp
00028 if (phic.le.phigtmp(ip)) then
00029 ip0 = min0(max0(0,ip-2),npftmp-3)
00030 exit
00031 end if
00032 end do
00033 do itg = 0, ntg
00034 thc = thg(itg)
00035 do it = 0, ntftmp
00036 if (thc.le.thgtmp(it)) then
00037 it0 = min0(max0(0,it-2),ntftmp-3)
00038 exit
00039 end if
00040 end do
00041
00042 do ii = 1, 4
00043 itg0 = it0 + ii - 1
00044 ipg0 = ip0 + ii - 1
00045 th4(ii) = thgtmp(itg0)
00046 phi4(ii) = phigtmp(ipg0)
00047 end do
00048
00049 do kk = 1, 4
00050 ipg0 = ip0 + kk - 1
00051 do jj = 1, 4
00052 itg0 = it0 + jj - 1
00053 ft4(jj) = fnctmp(itg0,ipg0)
00054 end do
00055 fp4(kk) = lagint_4th(th4,ft4,thc)
00056 end do
00057 fnc(itg,ipg) = lagint_4th(phi4,fp4,phic)
00058
00059 end do
00060 end do
00061
00062 deallocate(fnctmp)
00063
00064 end subroutine interpo_3D_initial_4th_surface