00001 subroutine poisson_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 radial_green_fn_grav, only : hgfn
00005   use legendre_fn_grav, only : plmg, hplmg, facnmg, epsig
00006   use trigonometry_grav_phi, only : hsinmpg, hcosmpg
00007   use grid_parameter_binary_excision, only : ex_radius
00008   use grid_points_binary_excision, only : rb, thb, phib, irg_exin, irg_exout
00009   use weight_midpoint_binary_excision,  only : hwtpg_ex
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 
00024   real(long), pointer :: sou_surf(:,:),dsou_surf(:,:),pot(:,:,:)
00025 
00026   real(long), pointer :: work11c(:,:), gwork11c(:,:)
00027   real(long), pointer :: work11s(:,:), gwork11s(:,:)
00028   real(long), pointer :: work21c(:,:), gwork21c(:,:)
00029   real(long), pointer :: work21s(:,:), gwork21s(:,:)
00030   real(long), pointer :: work31(:), gwork31(:)
00031   real(long), pointer :: plm_ex(:,:), fac(:)
00032   real(long), pointer :: sinmp1(:), cosmp1(:)
00033 
00034   call alloc_array2d( work11c, 1, ntg, 0, nlg)
00035   call alloc_array2d(gwork11c, 1, ntg, 0, nlg)
00036   call alloc_array2d( work11s, 1, ntg, 0, nlg)
00037   call alloc_array2d(gwork11s, 1, ntg, 0, nlg)
00038   call alloc_array2d( work21c, 0, nlg, 0, nlg)
00039   call alloc_array2d(gwork21c, 0, nlg, 0, nlg)
00040   call alloc_array2d( work21s, 0, nlg, 0, nlg)
00041   call alloc_array2d(gwork21s, 0, nlg, 0, nlg)
00042   call alloc_array1d( work31, 0, nlg)
00043   call alloc_array1d(gwork31, 0, nlg)
00044   call alloc_array2d(plm_ex, 0, nlg, 0, nlg)
00045   call alloc_array1d(fac, 0, nlg)
00046   call alloc_array1d(sinmp1, 0, nlg)
00047   call alloc_array1d(cosmp1, 0, nlg)
00048 
00049   fac(0) = 1.0d0
00050   do mm = 1, nlg
00051     fmm = dble(mm)
00052     fac(mm) = (2.0d0*fmm-1.0d0) * fac(mm-1)
00053   end do
00054 
00055 
00056    work11c(:,:) = 0.0d0
00057   gwork11c(:,:) = 0.0d0
00058    work11s(:,:) = 0.0d0
00059   gwork11s(:,:) = 0.0d0
00060   do im = 0, nlg
00061     do itt = 1, ntg
00062       do ipp = 1, npg
00063         wokc = hwtpg_ex(itt,ipp)*hcosmpg(im,ipp)
00064         woks = hwtpg_ex(itt,ipp)*hsinmpg(im,ipp)
00065         work11c(itt,im)  = work11c(itt,im) + wokc*dsou_surf(itt,ipp)
00066         gwork11c(itt,im) = gwork11c(itt,im) + wokc*sou_surf(itt,ipp)
00067         work11s(itt,im)  = work11s(itt,im) + woks*dsou_surf(itt,ipp)
00068         gwork11s(itt,im) = gwork11s(itt,im) + woks*sou_surf(itt,ipp)
00069       end do
00070     end do
00071   end do
00072 
00073    work21c(:,:) = 0.0d0
00074   gwork21c(:,:) = 0.0d0
00075    work21s(:,:) = 0.0d0
00076   gwork21s(:,:) = 0.0d0
00077   do il = 0, nlg
00078     do im = 0, nlg
00079       pef  = epsig(im)*facnmg(il,im)
00080       do itt = 1, ntg
00081         wok = pef*hplmg(il,im,itt)
00082         work21c(il,im)  = work21c(il,im) + wok*work11c(itt,im)
00083         gwork21c(il,im) = gwork21c(il,im) + wok*gwork11c(itt,im)
00084         work21s(il,im)  = work21s(il,im) + wok*work11s(itt,im)
00085         gwork21s(il,im) = gwork21s(il,im) + wok*gwork11s(itt,im)
00086       end do
00087     end do
00088   end do
00089 
00090 
00091   work31 = 0.0d0
00092   gwork31 = 0.0d0
00093   pot = 0.0d0
00094 
00095   do ipg = 0, npg
00096     do itg = 0, ntg
00097       do irg = 0, nrg
00098       if (irg.gt.irg_exin(itg,ipg).and. &
00099      &    irg.lt.irg_exout(itg,ipg)) cycle
00100 
00101       plm_ex(:,:)  = 0.0d0
00102       cc1 = dcos(thb(irg,itg,ipg))
00103       ss1 = dsin(thb(irg,itg,ipg))
00104 
00105       plm_ex(0,0) = 1.0d0
00106       do mm = 1, nlg
00107         plm_ex(mm,mm) = fac(mm) * (-ss1)**mm 
00108       end do
00109 
00110       do mm = 0, nlg-1
00111         fmm = dble(mm)
00112         plm_ex(mm+1,mm) = (2.d0*fmm + 1.d0)*cc1*plm_ex(mm,mm)
00113       end do
00114 
00115       do mm = 0, nlg-2
00116         fmm = dble(mm)
00117         do kk = 2, nlg-mm
00118           fkk = dble(kk)
00119           q1 = ( 2.0d0 * fmm + 2.0d0 * fkk - 1.0d0 ) / fkk
00120           q2 = ( 2.0d0 * fmm + fkk - 1.0d0 ) / fkk
00121           plm_ex(mm+kk,mm) = q1 * cc1 * plm_ex(mm+kk-1,mm) &
00122          &                 - q2       * plm_ex(mm+kk-2,mm)
00123         end do
00124       end do
00125 
00126       do im = 0, nlg
00127         cosmp1(im) = dcos(dble(im)*phib(irg,itg,ipg))
00128         sinmp1(im) = dsin(dble(im)*phib(irg,itg,ipg))
00129       end do
00130 
00131       rra1 = ex_radius/rb(irg,itg,ipg)
00132       rra1l = 1.0d0
00133       do il = 0, nlg
00134         rra1l = rra1l*rra1
00135         work31(il) = - ex_radius*rra1l
00136         gwork31(il) = - dble(il)*rra1l
00137       end do
00138 
00139        work41c = 0.0d0
00140       gwork41c = 0.0d0
00141        work41s = 0.0d0
00142       gwork41s = 0.0d0
00143       do im = 0, nlg
00144          w1c = 0.0d0
00145         gw1c = 0.0d0
00146          w1s = 0.0d0
00147         gw1s = 0.0d0
00148         do il = 0, nlg
00149            wok =  work31(il)*plm_ex(il,im)
00150           gwok = gwork31(il)*plm_ex(il,im)
00151            w1c =  w1c +  wok* work21c(il,im)
00152           gw1c = gw1c + gwok*gwork21c(il,im)
00153            w1s =  w1s +  wok* work21s(il,im)
00154           gw1s = gw1s + gwok*gwork21s(il,im)
00155         end do
00156          work41c =  work41c +  w1c*cosmp1(im)
00157         gwork41c = gwork41c + gw1c*cosmp1(im)
00158          work41s =  work41s +  w1s*sinmp1(im)
00159         gwork41s = gwork41s + gw1s*sinmp1(im)
00160       end do
00161 
00162       pot(irg,itg,ipg) = pi4inv*(work41c + work41s) &
00163       &                - pi4inv*(gwork41c +gwork41s)
00164 
00165       end do
00166     end do
00167   end do
00168 
00169   deallocate( work11c)
00170   deallocate(gwork11c)
00171   deallocate( work11s)
00172   deallocate(gwork11s)
00173   deallocate( work21c)
00174   deallocate(gwork21c)
00175   deallocate( work21s)
00176   deallocate(gwork21s)
00177   deallocate( work31)
00178   deallocate(gwork31)
00179   deallocate(plm_ex)
00180   deallocate(fac)
00181   deallocate(sinmp1)
00182   deallocate(cosmp1)
00183 
00184 end subroutine poisson_solver_binary_surf_int