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