00001 subroutine helmholtz_solver_surf_int_hret_mi_hadv(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)*sinmpg(im,ip) &
00131 & - work4s(im,ir,it)*cosmpg(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_hret_mi_hadv