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