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