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