00001 
00002 
00003 module coordinate_grav_extended
00004   use phys_constant, only : nnrg, nntg, nnpg, long
00005   use coordinate_grav_r, only : rg, hrg
00006   use coordinate_grav_theta, only : thg, hthg
00007   use coordinate_grav_phi, only : phig, hphig
00008   use grid_parameter, only : nrg, ntg, npg
00009   implicit none
00010   real(long) :: rgex(-2:nnrg+2), 
00011                thgex(-2:nntg+2), & 
00012                phigex(-2:nnpg+2)
00013   integer :: irgex_r(-2:nnrg+2), 
00014             itgex_r(0:nntg,-2:nnrg+2), &
00015             ipgex_r(0:nnpg,-2:nnrg+2)
00016   integer :: itgex_th(-2:nntg+2), 
00017             ipgex_th(0:nnpg,-2:nntg+2)
00018   integer :: ipgex_phi(-2:nnpg+2)
00019 
00020   real(long) :: hrgex(-2:nnrg+2), 
00021                hthgex(-2:nntg+2), &
00022                hphigex(-2:nnpg+2)
00023   integer :: irgex_hr(-2:nnrg+2), 
00024             itgex_hr(1:nntg,-2:nnrg+2), &
00025             ipgex_hr(1:nnpg,-2:nnrg+2)
00026   integer :: itgex_hth(-2:nntg+2), 
00027             ipgex_hth(1:nnpg,-2:nntg+2)
00028   integer :: ipgex_hphi(-2:nnpg+2)
00029 
00030 contains
00031 subroutine grid_extended
00032   implicit none
00033   integer  :: irg, itg, ipg
00034   rgex(0:nrg) = rg(0:nrg)
00035   thgex(0:ntg) = thg(0:ntg)
00036   phigex(0:npg) = phig(0:npg)
00037   rgex(-1) = rg(0) - (rg(1) - rg(0))
00038   rgex(-2) = rg(0) - (rg(2) - rg(0))
00039   rgex(nrg+1) = rg(nrg) + (rg(nrg) - rg(nrg-1))
00040   rgex(nrg+2) = rg(nrg) + 2.0d0*(rg(nrg) - rg(nrg-1))
00041   thgex(-1) = - thg(1)
00042   thgex(-2) = - thg(2)
00043   thgex(ntg+1) =  2.0d0*thg(ntg) - thg(ntg-1)
00044   thgex(ntg+2) =  2.0d0*thg(ntg) - thg(ntg-2)
00045   phigex(-1) = phig(npg-1) - phig(npg)
00046   phigex(-2) = phig(npg-2) - phig(npg)
00047   phigex(npg+1) =  phig(npg) + phig(1)
00048   phigex(npg+2) =  phig(npg) + phig(2)
00049 
00050   do irg = -2, nrg
00051     if (irg.ge.0.and.irg.le.nrg) irgex_r(irg) = irg
00052     if (irg.le.-1)    irgex_r(irg) = iabs(irg)
00053   end do
00054   do itg = -2, ntg + 2 
00055     if (itg.ge.0.and.itg.le.ntg) itgex_th(itg) = itg
00056     if (itg.le.-1)    itgex_th(itg) = iabs(itg)
00057     if (itg.ge.ntg+1) itgex_th(itg) = 2*ntg - itg
00058   end do
00059   do ipg = -2, npg + 2
00060     if (ipg.ge.0.and.ipg.le.npg) ipgex_phi(ipg) = ipg
00061     if (ipg.le.-1)    ipgex_phi(ipg) = npg + ipg
00062     if (ipg.ge.npg+1) ipgex_phi(ipg) = ipg - npg
00063   end do
00064 
00065   do irg = -2, nrg
00066     do itg = 0, ntg
00067       if (irg.ge. 0) itgex_r(itg,irg) = itg
00068       if (irg.le.-1) itgex_r(itg,irg) = ntg - itg
00069     end do
00070   end do
00071   do irg = -2, nrg
00072     do ipg = 0, npg
00073       if (irg.ge. 0) ipgex_r(ipg,irg) = ipg
00074       if (irg.le.-1) ipgex_r(ipg,irg) = mod(ipg + npg/2,npg)
00075     end do
00076   end do
00077   do itg = -2, ntg + 2 
00078     do ipg = 0, npg
00079       if (itg.ge.0.and.itg.le.ntg  ) ipgex_th(ipg,itg) = ipg
00080       if (itg.le.-1.or.itg.ge.ntg+1) ipgex_th(ipg,itg) = mod(ipg + npg/2,npg)
00081     end do
00082   end do
00083 
00084 
00085 
00086   hrgex(1:nrg) = hrg(1:nrg)
00087   hthgex(1:ntg) = hthg(1:ntg)
00088   hphigex(1:npg) = hphig(1:npg)
00089   hrgex(0) =  rg(0) - hrg(1)
00090   hrgex(-1) = rg(0) - hrg(2)
00091   hrgex(-2) = rg(0) - hrg(3)
00092   hrgex(nrg+1) = 0.5d0*(rg(nrg+1) + rg(nrg))
00093   hrgex(nrg+2) = 0.5d0*(rg(nrg+2) + rg(nrg+1))
00094   hthgex(0) = - hthg(1)
00095   hthgex(-1) = - hthg(2)
00096   hthgex(-2) = - hthg(3)
00097   hthgex(ntg+1) =  2.0d0*hthg(ntg) - hthg(ntg-1)
00098   hthgex(ntg+2) =  2.0d0*hthg(ntg) - hthg(ntg-2)
00099   hphigex(0) = - hphig(1)
00100   hphigex(-1) = - hphig(2)
00101   hphigex(-2) = - hphig(3)
00102   hphigex(npg+1) =  hphig(npg) + phig(1)
00103   hphigex(npg+2) =  hphig(npg) + phig(2)
00104 
00105   do irg = -2, nrg
00106     if (irg.ge.1) irgex_hr(irg) = irg
00107     if (irg.le.0) irgex_hr(irg) = iabs(irg) + 1
00108   end do
00109   do irg = -2, nrg
00110     do itg = 1, ntg
00111       if (irg.ge.1) itgex_hr(itg,irg) = itg
00112       if (irg.le.0) itgex_hr(itg,irg) = ntg - itg + 1
00113     end do
00114   end do
00115   do irg = -2, nrg
00116     do ipg = 1, npg
00117       if (irg.ge.1) ipgex_hr(ipg,irg) = ipg
00118       if (irg.le.0) ipgex_hr(ipg,irg) = mod(ipg + npg/2,npg)
00119     end do
00120   end do
00121 
00122   do itg = -2, ntg + 2 
00123     if (itg.ge.1.and.itg.le.ntg) itgex_hth(itg) = itg
00124     if (itg.le.0)    itgex_hth(itg) = iabs(itg) + 1
00125     if (itg.ge.ntg+1) itgex_hth(itg) = 2*ntg - itg + 1
00126   end do
00127   do itg = -2, ntg + 2 
00128     do ipg = 0, npg
00129       if (itg.ge.1.and.itg.le.ntg)  ipgex_hth(ipg,itg) = ipg
00130       if (itg.le.0.or.itg.ge.ntg+1) ipgex_hth(ipg,itg) = mod(ipg + npg/2,npg)
00131     end do
00132   end do
00133 
00134   do ipg = -2, npg + 2
00135     if (ipg.ge.1.and.ipg.le.npg) ipgex_hphi(ipg) = ipg
00136     if (ipg.le.0)     ipgex_hphi(ipg) = npg + ipg
00137     if (ipg.ge.npg+1) ipgex_hphi(ipg) = ipg - npg
00138   end do
00139 
00140 end subroutine grid_extended
00141 end module coordinate_grav_extended