00001 subroutine poisson_solver_AHfinder(sou,pot)
00002   use phys_constant, only : long, pi
00003   use grid_parameter, only : nlg, npg, ntg
00004   use legendre_fn_grav, only : plmg, hplmg, facnmg, epsig
00005   use trigonometry_grav_theta
00006   use trigonometry_grav_phi, only : sinmpg, cosmpg, hsinmpg, hcosmpg
00007   use weight_midpoint_grav,  only :  hwdtg, hwdpg
00008   use make_array_2d
00009   implicit none
00010   integer :: im, il, nlgtmp
00011   integer :: it, itt, ip, ipp       
00012   real(long) :: pef, wok, pi4inv, ell, facl
00013   real(long), pointer :: sou(:,:), pot(:,:)
00014   real(long), pointer :: work1c(:,:), work2c(:,:), work4c(:,:), 
00015                         work1s(:,:), work2s(:,:), work4s(:,:)
00016 
00017   call alloc_array2d(work1c, 1, ntg, 0, nlg)
00018   call alloc_array2d(work1s, 1, ntg, 0, nlg)
00019   call alloc_array2d(work2c, 0, nlg, 0, nlg)
00020   call alloc_array2d(work2s, 0, nlg, 0, nlg)
00021   call alloc_array2d(work4c, 0, nlg, 0, ntg)
00022   call alloc_array2d(work4s, 0, nlg, 0, ntg)
00023 
00024   work1c = 0.0d0
00025   work1s = 0.0d0
00026   do im = 0, nlg
00027     do itt = 1, ntg
00028       do ipp = 1, npg
00029         wok = hwdtg(itt)*hwdpg(ipp)*sou(itt,ipp)
00030         work1c(itt,im) = work1c(itt,im) + wok*hcosmpg(im,ipp)
00031         work1s(itt,im) = work1s(itt,im) + wok*hsinmpg(im,ipp)
00032       end do
00033     end do
00034   end do
00035 
00036   work2c = 0.0d0
00037   work2s = 0.0d0
00038   do il = 0, nlg
00039     do im = 0, nlg
00040       pef  = epsig(im)*facnmg(il,im)
00041       do itt = 1, ntg
00042         wok = pef*hplmg(il,im,itt)
00043         work2c(il,im) = work2c(il,im) + wok*work1c(itt,im)
00044         work2s(il,im) = work2s(il,im) + wok*work1s(itt,im)
00045       end do
00046     end do
00047   end do
00048 
00049   work4c = 0.0d0
00050   work4s = 0.0d0
00051   do it = 0, ntg
00052     do im = 0, nlg
00053       do il = 0, nlg
00054         ell = dble(il)
00055         facl = (2.0d0*ell+1.0d0)/(ell*(ell+1.0d0)+2.0d0)
00056         wok = plmg(il,im,it)*facl
00057         work4c(im,it) = work4c(im,it) + wok*work2c(il,im)
00058         work4s(im,it) = work4s(im,it) + wok*work2s(il,im)
00059       end do
00060     end do
00061   end do
00062 
00063   pot = 0.0d0
00064   do ip = 0, npg
00065     do it = 0, ntg
00066       do im = 0, nlg
00067         pot(it,ip) = pot(it,ip)&
00068         &          + work4c(im,it)*cosmpg(im,ip) &
00069         &          + work4s(im,it)*sinmpg(im,ip)
00070       end do
00071     end do
00072   end do
00073 
00074   pi4inv = 1.0d0/4.0d0/pi
00075   pot(0:ntg,0:npg) = - pi4inv*pot(0:ntg,0:npg)
00076 
00077 end subroutine poisson_solver_AHfinder