00001 subroutine poisson_solver_no_lm1(sou, pot)
00002   use phys_constant,  only : long, pi
00003   use grid_parameter, only : nrg, npg, ntg, nlg
00004   use radial_green_fn_grav, only : hgfn
00005   use legendre_fn_grav, only : plmg, hplmg, facnmg, epsig  
00006   use trigonometry_grav_theta
00007   use trigonometry_grav_phi, only : sinmpg, cosmpg, hsinmpg, hcosmpg
00008   use weight_midpoint_grav,  only : hwrtpg
00009   use make_array_1d
00010   use make_array_3d
00011   implicit none
00012 
00013   integer :: im, il, nlgtmp
00014   integer :: ir, irr, it, itt, ip, ipp       
00015 
00016   real(long) :: pef, wok, pi4inv
00017   real(long), pointer :: sou(:,:,:),pot(:,:,:)
00018   real(long), pointer :: work1c(:,:,:)
00019   real(long), pointer :: work2c(:,:,:)
00020   real(long), pointer :: work3c(:,:,:)
00021   real(long), pointer :: work4c(:,:,:)
00022   real(long), pointer :: work1s(:,:,:)
00023   real(long), pointer :: work2s(:,:,:)
00024   real(long), pointer :: work3s(:,:,:)
00025   real(long), pointer :: work4s(:,:,:)
00026   real(long), pointer :: fac_l1(:)
00027   real(long), pointer :: fac_m1(:)
00028 
00029 
00030   call alloc_array3d(work1c, 1, ntg, 1, nrg, 0, nlg)
00031   call alloc_array3d(work1s, 1, ntg, 1, nrg, 0, nlg)
00032   call alloc_array3d(work2c, 1, nrg, 0, nlg, 0, nlg)
00033   call alloc_array3d(work2s, 1, nrg, 0, nlg, 0, nlg)
00034   call alloc_array3d(work3c, 0, nlg, 0, nlg, 0, nrg)
00035   call alloc_array3d(work3s, 0, nlg, 0, nlg, 0, nrg)
00036   call alloc_array3d(work4c, 0, nlg, 0, nrg, 0, ntg)
00037   call alloc_array3d(work4s, 0, nlg, 0, nrg, 0, ntg)
00038   call alloc_array1d(fac_l1, 0, nlg)
00039   call alloc_array1d(fac_m1, 0, nlg)
00040 
00041   fac_l1(0:nlg) = 1.0d0
00042   fac_m1(0:nlg) = 1.0d0
00043 
00044   fac_l1(1) = 0.0d0
00045   fac_m1(1) = 0.0d0
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053   work1c = 0.0
00054   work1s = 0.0
00055   do im = 0, nlg
00056     do irr = 1, nrg
00057       do itt = 1, ntg
00058         do ipp = 1, npg
00059           work1c(itt,irr,im) = work1c(itt,irr,im) & 
00060         + hwrtpg(irr,itt,ipp)*sou(irr,itt,ipp)*hcosmpg(im,ipp)
00061           work1s(itt,irr,im) = work1s(itt,irr,im) & 
00062         + hwrtpg(irr,itt,ipp)*sou(irr,itt,ipp)*hsinmpg(im,ipp)
00063         end do
00064       end do
00065     end do
00066   end do
00067 
00068   work2c = 0.0d0
00069   work2s = 0.0d0
00070   do il = 0, nlg
00071     do im = 0, nlg
00072       pef = epsig(im)*facnmg(il,im)*fac_l1(il)*fac_m1(im)
00073       do irr = 1, nrg
00074         do itt = 1, ntg
00075           wok = pef*hplmg(il,im,itt)
00076           work2c(irr,il,im) = work2c(irr,il,im) + wok*work1c(itt,irr,im)
00077           work2s(irr,il,im) = work2s(irr,il,im) + wok*work1s(itt,irr,im)
00078         end do
00079       end do
00080     end do
00081   end do
00082 
00083   work3c = 0.0d0
00084   work3s = 0.0d0
00085   do ir = 0, nrg
00086     do il = 0, nlg
00087       do im = 0, nlg
00088         do irr = 1, nrg
00089           work3c(il,im,ir) = work3c(il,im,ir) &
00090         + work2c(irr,il,im)*hgfn(irr,il,ir)
00091           work3s(il,im,ir) = work3s(il,im,ir) &
00092         + work2s(irr,il,im)*hgfn(irr,il,ir)
00093         end do
00094       end do
00095     end do
00096   end do
00097 
00098   work4c = 0.0d0
00099   work4s = 0.0d0
00100   do it = 0, ntg 
00101     do ir = 0, nrg 
00102       do im = 0, nlg
00103         do il = 0, nlg
00104           work4c(im,ir,it) = work4c(im,ir,it) &
00105         + work3c(il,im,ir)*plmg(il,im,it)
00106           work4s(im,ir,it) = work4s(im,ir,it) &
00107         + work3s(il,im,ir)*plmg(il,im,it)
00108         end do
00109       end do
00110     end do
00111   end do
00112 
00113   pot = 0.0d0
00114   do ip = 0, npg
00115     do it = 0, ntg
00116       do ir = 0, nrg
00117         do im = 0, nlg
00118           pot(ir,it,ip) = pot(ir,it,ip) &
00119         + work4c(im,ir,it)*cosmpg(im,ip) &
00120         + work4s(im,ir,it)*sinmpg(im,ip)
00121         end do
00122       end do
00123     end do
00124   end do
00125 
00126   pi4inv = 1.0d0/4.0d0/pi
00127   pot = - pi4inv*pot
00128 
00129   deallocate(work1c)
00130   deallocate(work1s)
00131   deallocate(work2c)
00132   deallocate(work2s)
00133   deallocate(work3c)
00134   deallocate(work3s)
00135   deallocate(work4c)
00136   deallocate(work4s)
00137   deallocate(fac_l1)
00138   deallocate(fac_m1)
00139 
00140 end subroutine poisson_solver_no_lm1
00141