00001 subroutine helmholtz_solver_binary_surf_int(sou_surf,dsou_surf, pot)
00002 use phys_constant, only : long, pi
00003 use grid_parameter, only : nrg, npg, ntg, nlg
00004 use legendre_fn_grav, only : plmg, hplmg, facnmg, epsig
00005 use trigonometry_grav_phi, only : hsinmpg, hcosmpg
00006 use grid_parameter_binary_excision, only : ex_radius
00007 use grid_points_binary_excision, only : rb, thb, phib, irg_exin, irg_exout
00008 use weight_midpoint_binary_excision, only : hwtpg_ex
00009 use def_matter_parameter, only : ome
00010 use make_array_1d
00011 use make_array_2d
00012 implicit none
00013
00014 integer :: irg, irr, itg, itt, ipg, ipp
00015 integer :: im, il, mm, nn, kk
00016
00017 real(long) :: pi4inv = 1.0d0/4.0d0/pi
00018 real(long) :: pef, wok, wokc, woks
00019 real(long) :: q1, q2, cc1, ss1, fmm, fkk
00020 real(long) :: w1c, gw1c, w1s, gw1s, gwok
00021 real(long) :: rra1, rra1l
00022 real(long) :: work41c, gwork41c, work41s, gwork41s
00023 real(long) :: omega, omegam, omegam_rg, omegam_hrg, sj, sy, sbj, sby
00024 real(long) :: dxsj, dxsbj, dxsy
00025
00026 real(long), pointer :: sou_surf(:,:),dsou_surf(:,:),pot(:,:,:)
00027 real(long), pointer :: sj_ex_radius(:,:), dxsj_ex_radius(:,:)
00028 real(long), pointer :: work11c(:,:), gwork11c(:,:)
00029 real(long), pointer :: work11s(:,:), gwork11s(:,:)
00030 real(long), pointer :: work21c(:,:), gwork21c(:,:)
00031 real(long), pointer :: work21s(:,:), gwork21s(:,:)
00032 real(long), pointer :: work31(:,:), gwork31(:,:)
00033 real(long), pointer :: plm_ex(:,:), fac(:)
00034 real(long), pointer :: sinmp1(:), cosmp1(:)
00035
00036 call alloc_array2d(sj_ex_radius, 0, nlg, 0, nlg)
00037 call alloc_array2d(dxsj_ex_radius, 0, nlg, 0, nlg)
00038 call alloc_array2d( work11c, 1, ntg, 0, nlg)
00039 call alloc_array2d(gwork11c, 1, ntg, 0, nlg)
00040 call alloc_array2d( work11s, 1, ntg, 0, nlg)
00041 call alloc_array2d(gwork11s, 1, ntg, 0, nlg)
00042 call alloc_array2d( work21c, 0, nlg, 0, nlg)
00043 call alloc_array2d(gwork21c, 0, nlg, 0, nlg)
00044 call alloc_array2d( work21s, 0, nlg, 0, nlg)
00045 call alloc_array2d(gwork21s, 0, nlg, 0, nlg)
00046 call alloc_array2d( work31, 0, nlg, 0, nlg)
00047 call alloc_array2d(gwork31, 0, nlg, 0, nlg)
00048 call alloc_array2d(plm_ex, 0, nlg, 0, nlg)
00049 call alloc_array1d(fac, 0, nlg)
00050 call alloc_array1d(sinmp1, 0, nlg)
00051 call alloc_array1d(cosmp1, 0, nlg)
00052
00053 fac(0) = 1.0d0
00054 do mm = 1, nlg
00055 fmm = dble(mm)
00056 fac(mm) = (2.0d0*fmm-1.0d0) * fac(mm-1)
00057 end do
00058
00059
00060 work11c(:,:) = 0.0d0
00061 gwork11c(:,:) = 0.0d0
00062 work11s(:,:) = 0.0d0
00063 gwork11s(:,:) = 0.0d0
00064 do im = 0, nlg
00065 do itt = 1, ntg
00066 do ipp = 1, npg
00067 wokc = hwtpg_ex(itt,ipp)*hcosmpg(im,ipp)
00068 woks = hwtpg_ex(itt,ipp)*hsinmpg(im,ipp)
00069 work11c(itt,im) = work11c(itt,im) + wokc*dsou_surf(itt,ipp)
00070 gwork11c(itt,im) = gwork11c(itt,im) + wokc*sou_surf(itt,ipp)
00071 work11s(itt,im) = work11s(itt,im) + woks*dsou_surf(itt,ipp)
00072 gwork11s(itt,im) = gwork11s(itt,im) + woks*sou_surf(itt,ipp)
00073 end do
00074 end do
00075 end do
00076
00077 work21c(:,:) = 0.0d0
00078 gwork21c(:,:) = 0.0d0
00079 work21s(:,:) = 0.0d0
00080 gwork21s(:,:) = 0.0d0
00081 do il = 0, nlg
00082 do im = 0, nlg
00083 pef = epsig(im)*facnmg(il,im)
00084 do itt = 1, ntg
00085 wok = pef*hplmg(il,im,itt)
00086 work21c(il,im) = work21c(il,im) + wok*work11c(itt,im)
00087 gwork21c(il,im) = gwork21c(il,im) + wok*gwork11c(itt,im)
00088 work21s(il,im) = work21s(il,im) + wok*work11s(itt,im)
00089 gwork21s(il,im) = gwork21s(il,im) + wok*gwork11s(itt,im)
00090 end do
00091 end do
00092 end do
00093
00094
00095 work31 = 0.0d0
00096 gwork31 = 0.0d0
00097 pot = 0.0d0
00098
00099 sj_ex_radius(:,:) = 0.0d0
00100 dxsj_ex_radius(:,:) = 0.0d0
00101 omega = ome
00102 do il = 0, nlg
00103 do im = 0, il
00104 if (im.ne.0) then
00105 omegam = dble(im)*omega
00106 omegam_hrg = omegam*ex_radius
00107 call sphbess_and_dx(omegam_hrg,il,sj,sy,dxsj,dxsy)
00108 sj_ex_radius(im,il) = sj
00109 dxsj_ex_radius(im,il) = dxsj
00110 end if
00111 end do
00112 end do
00113
00114 do ipg = 0, npg
00115 do itg = 0, ntg
00116 do irg = 0, nrg
00117 if (irg.gt.irg_exin(itg,ipg).and. &
00118 & irg.lt.irg_exout(itg,ipg)) cycle
00119
00120 plm_ex(:,:) = 0.0d0
00121 cc1 = dcos(thb(irg,itg,ipg))
00122 ss1 = dsin(thb(irg,itg,ipg))
00123
00124 plm_ex(0,0) = 1.0d0
00125 do mm = 1, nlg
00126 plm_ex(mm,mm) = fac(mm) * (-ss1)**mm
00127 end do
00128
00129 do mm = 0, nlg-1
00130 fmm = dble(mm)
00131 plm_ex(mm+1,mm) = (2.d0*fmm + 1.d0)*cc1*plm_ex(mm,mm)
00132 end do
00133
00134 do mm = 0, nlg-2
00135 fmm = dble(mm)
00136 do kk = 2, nlg-mm
00137 fkk = dble(kk)
00138 q1 = ( 2.0d0 * fmm + 2.0d0 * fkk - 1.0d0 ) / fkk
00139 q2 = ( 2.0d0 * fmm + fkk - 1.0d0 ) / fkk
00140 plm_ex(mm+kk,mm) = q1 * cc1 * plm_ex(mm+kk-1,mm) &
00141 & - q2 * plm_ex(mm+kk-2,mm)
00142 end do
00143 end do
00144
00145 do im = 0, nlg
00146 cosmp1(im) = dcos(dble(im)*phib(irg,itg,ipg))
00147 sinmp1(im) = dsin(dble(im)*phib(irg,itg,ipg))
00148 end do
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 omega = ome
00162 do il = 0, nlg
00163 do im = 0, il
00164 if(im.eq.0)then
00165 work31(il,im) = - ex_radius*(ex_radius/rb(irg,itg,ipg))**(il+1)
00166 gwork31(il,im) = - dble(il)*(ex_radius/rb(irg,itg,ipg))**(il+1)
00167 else
00168 omegam = dble(im)*omega
00169
00170
00171
00172
00173 sbj = sj_ex_radius(im,il)
00174 dxsbj = dxsj_ex_radius(im,il)
00175 omegam_rg = omegam*rb(irg,itg,ipg)
00176 call sphbess(omegam_rg,il,sj,sy)
00177 sby=sy
00178 wok = ex_radius**2*omegam*(2.d0*dble(il)+1.d0)
00179 work31(il,im) = wok*sbj*sby
00180 gwork31(il,im)= omegam*wok*dxsbj*sby
00181 endif
00182 end do
00183 end do
00184
00185 work41c = 0.0d0
00186 gwork41c = 0.0d0
00187 work41s = 0.0d0
00188 gwork41s = 0.0d0
00189 do im = 0, nlg
00190 w1c = 0.0d0
00191 gw1c = 0.0d0
00192 w1s = 0.0d0
00193 gw1s = 0.0d0
00194 do il = 0, nlg
00195 wok = work31(il,im)*plm_ex(il,im)
00196 gwok = gwork31(il,im)*plm_ex(il,im)
00197 w1c = w1c + wok* work21c(il,im)
00198 gw1c = gw1c + gwok*gwork21c(il,im)
00199 w1s = w1s + wok* work21s(il,im)
00200 gw1s = gw1s + gwok*gwork21s(il,im)
00201 end do
00202 work41c = work41c + w1c*cosmp1(im)
00203 gwork41c = gwork41c + gw1c*cosmp1(im)
00204 work41s = work41s + w1s*sinmp1(im)
00205 gwork41s = gwork41s + gw1s*sinmp1(im)
00206 end do
00207
00208 pot(irg,itg,ipg) = pi4inv*(work41c + work41s) &
00209 & - pi4inv*(gwork41c +gwork41s)
00210
00211 end do
00212 end do
00213 end do
00214
00215 deallocate(sj_ex_radius)
00216 deallocate(dxsj_ex_radius)
00217 deallocate( work11c)
00218 deallocate(gwork11c)
00219 deallocate( work11s)
00220 deallocate(gwork11s)
00221 deallocate( work21c)
00222 deallocate(gwork21c)
00223 deallocate( work21s)
00224 deallocate(gwork21s)
00225 deallocate( work31)
00226 deallocate(gwork31)
00227 deallocate(plm_ex)
00228 deallocate(fac)
00229 deallocate(sinmp1)
00230 deallocate(cosmp1)
00231
00232 end subroutine helmholtz_solver_binary_surf_int