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