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
00166
00167 end do
00168 end do
00169 end do
00170
00171 deallocate( work11c)
00172 deallocate(gwork11c)
00173 deallocate( work11s)
00174 deallocate(gwork11s)
00175 deallocate( work21c)
00176 deallocate(gwork21c)
00177 deallocate( work21s)
00178 deallocate(gwork21s)
00179 deallocate( work31)
00180 deallocate(gwork31)
00181 deallocate(plm_ex)
00182 deallocate(fac)
00183 deallocate(sinmp1)
00184 deallocate(cosmp1)
00185
00186 end subroutine poisson_solver_binary_surf_int