00001 subroutine helmholtz_solver_binary_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 grid_points_binary_excision, only : ihpg_exin, ihpg_exout
00016 use weight_midpoint_binary_excision, only : hwrtpg_ex
00017 use make_array_3d
00018 implicit none
00019
00020 integer :: im, il, nlgtmp
00021 integer :: ir, irr, it, itt, ip, ipp, ipin, ipout
00022
00023 real(long) :: pef, wok, pi4inv
00024 real(long), pointer :: sou(:,:,:),pot(:,:,:)
00025 real(long), pointer :: work1c(:,:,:)
00026 real(long), pointer :: work2c(:,:,:)
00027 real(long), pointer :: work3c(:,:,:)
00028 real(long), pointer :: work4c(:,:,:)
00029 real(long), pointer :: work1s(:,:,:)
00030 real(long), pointer :: work2s(:,:,:)
00031 real(long), pointer :: work3s(:,:,:)
00032 real(long), pointer :: work4s(:,:,:)
00033
00034 call alloc_array3d(work1c, 1, ntg, 1, nrg, 0, nlg)
00035 call alloc_array3d(work1s, 1, ntg, 1, nrg, 0, nlg)
00036 call alloc_array3d(work2c, 1, nrg, 0, nlg, 0, nlg)
00037 call alloc_array3d(work2s, 1, nrg, 0, nlg, 0, nlg)
00038 call alloc_array3d(work3c, 0, nlg, 0, nlg, 0, nrg)
00039 call alloc_array3d(work3s, 0, nlg, 0, nlg, 0, nrg)
00040 call alloc_array3d(work4c, 0, nlg, 0, nrg, 0, ntg)
00041 call alloc_array3d(work4s, 0, nlg, 0, nrg, 0, ntg)
00042
00043 work1c(:,:,:) = 0.0d0
00044 work1s(:,:,:) = 0.0d0
00045 do im = 0, nlg
00046 do irr = 1, nrg
00047 do itt = 1, ntg
00048 ipin = ihpg_exin(irr,itt)
00049 ipout = ihpg_exout(irr,itt)
00050 do ipp = ipin, ipout
00051 wok = hwrtpg_ex(irr,itt,ipp)*sou(irr,itt,ipp)
00052 work1c(itt,irr,im) = work1c(itt,irr,im) + wok*hcosmpg(im,ipp)
00053 work1s(itt,irr,im) = work1s(itt,irr,im) + wok*hsinmpg(im,ipp)
00054 end do
00055 end do
00056 end do
00057 end do
00058
00059 work2c = 0.0d0
00060 work2s = 0.0d0
00061 do il = 0, nlg
00062 do im = 0, nlg
00063 pef = epsig(im)*facnmg(il,im)
00064 do irr = 1, nrg
00065 do itt = 1, ntg
00066 wok = pef*hplmg(il,im,itt)
00067 work2c(irr,il,im) = work2c(irr,il,im) + wok*work1c(itt,irr,im)
00068 work2s(irr,il,im) = work2s(irr,il,im) + wok*work1s(itt,irr,im)
00069 end do
00070 end do
00071 end do
00072 end do
00073
00074 work3c = 0.0d0
00075 work3s = 0.0d0
00076 do ir = 0, nrg
00077 do il = 0, nlg
00078 do im = 0, nlg
00079 do irr = 1, nrg
00080 work3c(il,im,ir) = work3c(il,im,ir) &
00081 & + work2c(irr,il,im)*bsjy(irr,il,im,ir)
00082 work3s(il,im,ir) = work3s(il,im,ir) &
00083 & + work2s(irr,il,im)*bsjy(irr,il,im,ir)
00084
00085 end do
00086 end do
00087 end do
00088 end do
00089
00090 work4c = 0.0d0
00091 work4s = 0.0d0
00092 do it = 0, ntg
00093 do ir = 0, nrg
00094 do im = 0, nlg
00095 do il = 0, nlg
00096 work4c(im,ir,it) = work4c(im,ir,it) &
00097 & + work3c(il,im,ir)*plmg(il,im,it)
00098 work4s(im,ir,it) = work4s(im,ir,it) &
00099 & + work3s(il,im,ir)*plmg(il,im,it)
00100 end do
00101 end do
00102 end do
00103 end do
00104
00105 pot = 0.0d0
00106 do ip = 0, npg
00107 do it = 0, ntg
00108 do ir = 0, nrg
00109 do im = 0, nlg
00110 pot(ir,it,ip) = pot(ir,it,ip) &
00111 & + work4c(im,ir,it)*cosmpg(im,ip) &
00112 & + work4s(im,ir,it)*sinmpg(im,ip)
00113 end do
00114 end do
00115 end do
00116 end do
00117
00118 pi4inv = 1.0d0/4.0d0/pi
00119 pot = - pi4inv*pot
00120
00121 deallocate(work1c)
00122 deallocate(work1s)
00123 deallocate(work2c)
00124 deallocate(work2s)
00125 deallocate(work3c)
00126 deallocate(work3s)
00127 deallocate(work4c)
00128 deallocate(work4s)
00129
00130 end subroutine helmholtz_solver_binary_vol_int