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