00001 subroutine poisson_solver_binary_surf_int_plmex(impt,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 : hplmg, facnmg, epsig
00006 use legendre_fn_grav_plmex
00007 use trigonometry_grav_phi, only : hsinmpg, hcosmpg
00008 use grid_parameter_binary_excision, only : ex_radius
00009 use grid_points_binary_excision, only : rb, thb, phib, irg_exin, irg_exout
00010 use weight_midpoint_binary_excision, only : hwtpg_ex
00011 use make_array_1d
00012 use make_array_2d
00013 implicit none
00014
00015 integer :: irg, irr, itg, itt, ipg, ipp, impt
00016 integer :: im, il, mm, nn, kk
00017
00018 real(long) :: pi4inv = 1.0d0/4.0d0/pi
00019 real(long) :: pef, wok, wokc, woks
00020 real(long) :: q1, q2, cc1, ss1, fmm, fkk
00021 real(long) :: w1c, gw1c, w1s, gw1s, gwok
00022 real(long) :: rra1, rra1l
00023 real(long) :: work41c, gwork41c, work41s, gwork41s
00024
00025 real(long), pointer :: sou_surf(:,:),dsou_surf(:,:),pot(:,:,:)
00026
00027 real(long), pointer :: work11c(:,:), gwork11c(:,:)
00028 real(long), pointer :: work11s(:,:), gwork11s(:,:)
00029 real(long), pointer :: work21c(:,:), gwork21c(:,:)
00030 real(long), pointer :: work21s(:,:), gwork21s(:,:)
00031
00032 call alloc_array2d( work11c, 1, ntg, 0, nlg)
00033 call alloc_array2d(gwork11c, 1, ntg, 0, nlg)
00034 call alloc_array2d( work11s, 1, ntg, 0, nlg)
00035 call alloc_array2d(gwork11s, 1, ntg, 0, nlg)
00036 call alloc_array2d( work21c, 0, nlg, 0, nlg)
00037 call alloc_array2d(gwork21c, 0, nlg, 0, nlg)
00038 call alloc_array2d( work21s, 0, nlg, 0, nlg)
00039 call alloc_array2d(gwork21s, 0, nlg, 0, nlg)
00040
00041
00042
00043 work11c(:,:) = 0.0d0
00044 gwork11c(:,:) = 0.0d0
00045 work11s(:,:) = 0.0d0
00046 gwork11s(:,:) = 0.0d0
00047 do im = 0, nlg
00048 do itt = 1, ntg
00049 do ipp = 1, npg
00050 wokc = hwtpg_ex(itt,ipp)*hcosmpg(im,ipp)
00051 woks = hwtpg_ex(itt,ipp)*hsinmpg(im,ipp)
00052 work11c(itt,im) = work11c(itt,im) + wokc*dsou_surf(itt,ipp)
00053 gwork11c(itt,im) = gwork11c(itt,im) + wokc*sou_surf(itt,ipp)
00054 work11s(itt,im) = work11s(itt,im) + woks*dsou_surf(itt,ipp)
00055 gwork11s(itt,im) = gwork11s(itt,im) + woks*sou_surf(itt,ipp)
00056 end do
00057 end do
00058 end do
00059
00060 work21c(:,:) = 0.0d0
00061 gwork21c(:,:) = 0.0d0
00062 work21s(:,:) = 0.0d0
00063 gwork21s(:,:) = 0.0d0
00064 do il = 0, nlg
00065 do im = 0, nlg
00066 pef = epsig(im)*facnmg(il,im)
00067 do itt = 1, ntg
00068 wok = pef*hplmg(il,im,itt)
00069 work21c(il,im) = work21c(il,im) + wok*work11c(itt,im)
00070 gwork21c(il,im) = gwork21c(il,im) + wok*gwork11c(itt,im)
00071 work21s(il,im) = work21s(il,im) + wok*work11s(itt,im)
00072 gwork21s(il,im) = gwork21s(il,im) + wok*gwork11s(itt,im)
00073 end do
00074 end do
00075 end do
00076
00077
00078 pot = 0.0d0
00079
00080 do ipg = 0, npg
00081 do itg = 0, ntg
00082 do irg = 0, nrg
00083 if (irg.gt.irg_exin(itg,ipg).and. &
00084 & irg.lt.irg_exout(itg,ipg)) cycle
00085
00086 work41c = 0.0d0
00087 gwork41c = 0.0d0
00088 work41s = 0.0d0
00089 gwork41s = 0.0d0
00090 do im = 0, nlg
00091 w1c = 0.0d0
00092 gw1c = 0.0d0
00093 w1s = 0.0d0
00094 gw1s = 0.0d0
00095 do il = 0, nlg
00096 wok = - ex_radius*plm_ex(impt,irg,itg,ipg,il,im)
00097 gwok = - dble(il)*plm_ex(impt,irg,itg,ipg,il,im)
00098 w1c = w1c + wok* work21c(il,im)
00099 gw1c = gw1c + gwok*gwork21c(il,im)
00100 w1s = w1s + wok* work21s(il,im)
00101 gw1s = gw1s + gwok*gwork21s(il,im)
00102 end do
00103 work41c = work41c + w1c*dcos(dble(im)*phib(irg,itg,ipg))
00104 gwork41c = gwork41c + gw1c*dcos(dble(im)*phib(irg,itg,ipg))
00105 work41s = work41s + w1s*dsin(dble(im)*phib(irg,itg,ipg))
00106 gwork41s = gwork41s + gw1s*dsin(dble(im)*phib(irg,itg,ipg))
00107 end do
00108
00109 pot(irg,itg,ipg) = pi4inv*(work41c + work41s) &
00110 & - pi4inv*(gwork41c +gwork41s)
00111
00112
00113
00114 end do
00115 end do
00116 end do
00117
00118 deallocate( work11c)
00119 deallocate(gwork11c)
00120 deallocate( work11s)
00121 deallocate(gwork11s)
00122 deallocate( work21c)
00123 deallocate(gwork21c)
00124 deallocate( work21s)
00125 deallocate(gwork21s)
00126
00127 end subroutine poisson_solver_binary_surf_int_plmex