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