00001 subroutine poisson_solver_bhex_surf_int(char_io,sou_iosurf,pot)
00002   use phys_constant,  only : long, pi
00003   use grid_parameter, only : nrg, npg, ntg, nlg
00004   use radial_green_fn_grav, only : gfnsf
00005   use legendre_fn_grav, only : plmg, hplmg, facnmg, epsig  
00006   use trigonometry_grav_theta
00007   use trigonometry_grav_phi, only : sinmpg, cosmpg, hsinmpg, hcosmpg
00008   use weight_midpoint_grav,  only : hwtpgsf
00009   use make_array_3d
00010   implicit none
00011   character(len=2), intent(in) :: char_io
00012 
00013   integer :: ia, im, il, nlgtmp, ia13, ia24
00014   integer :: ir, irr, it, itt, ip, ipp
00015 
00016   real(long) :: pef, wok, pi4inv
00017   real(long), pointer :: pot(:,:,:)
00018   real(long), pointer :: sou_iosurf(:,:,:)
00019   real(long), pointer :: work1c(:,:,:)
00020   real(long), pointer :: work2c(:,:,:)
00021   real(long), pointer :: work3c(:,:,:)
00022   real(long), pointer :: work4c(:,:,:)
00023   real(long), pointer :: work1s(:,:,:)
00024   real(long), pointer :: work2s(:,:,:)
00025   real(long), pointer :: work3s(:,:,:)
00026   real(long), pointer :: work4s(:,:,:)
00027 
00028 
00029   if (char_io.eq.'in') then ; ia13 = 1 ; ia24 = 2 ; end if
00030   if (char_io.eq.'ou') then ; ia13 = 3 ; ia24 = 4 ; end if
00031 
00032   call alloc_array3d(work1c, 1, ntg, 0, nlg, ia13, ia24)
00033   call alloc_array3d(work1s, 1, ntg, 0, nlg, ia13, ia24)
00034   call alloc_array3d(work2c, 0, nlg, 0, nlg, ia13, ia24)
00035   call alloc_array3d(work2s, 0, nlg, 0, nlg, ia13, ia24)
00036   call alloc_array3d(work3c, 0, nlg, 0, nlg, 0, nrg)
00037   call alloc_array3d(work3s, 0, nlg, 0, nlg, 0, nrg)
00038   call alloc_array3d(work4c, 0, nlg, 0, nrg, 0, ntg)
00039   call alloc_array3d(work4s, 0, nlg, 0, nrg, 0, ntg)
00040 
00041   work1c = 0.0
00042   work1s = 0.0
00043   irr = 0
00044   do ia = ia13, ia24
00045     do im = 0, nlg
00046       do itt = 1, ntg
00047         do ipp = 1, npg
00048           wok = hwtpgsf(itt,ipp)*sou_iosurf(itt,ipp,ia)
00049           work1c(itt,im,ia) = work1c(itt,im,ia) + wok*hcosmpg(im,ipp)
00050           work1s(itt,im,ia) = work1s(itt,im,ia) + wok*hsinmpg(im,ipp)
00051         end do
00052       end do
00053     end do
00054   end do
00055 
00056   work2c = 0.0d0
00057   work2s = 0.0d0
00058   do ia = ia13, ia24
00059     do il = 0, nlg
00060       do im = 0, nlg
00061         pef = epsig(im)*facnmg(il,im)
00062         do itt = 1, ntg
00063           wok = pef*hplmg(il,im,itt)
00064           work2c(il,im,ia) = work2c(il,im,ia) + wok*work1c(itt,im,ia)
00065           work2s(il,im,ia) = work2s(il,im,ia) + wok*work1s(itt,im,ia)
00066         end do
00067       end do
00068     end do
00069   end do
00070 
00071   work3c = 0.0d0
00072   work3s = 0.0d0
00073   do ir = 0, nrg
00074     do il = 0, nlg
00075       do im = 0, nlg
00076         work3c(il,im,ir) = &
00077         &                + work2c(il,im,ia13)*gfnsf(il,ir,ia13) &
00078         &                - work2c(il,im,ia24)*gfnsf(il,ir,ia24)
00079         work3s(il,im,ir) = &
00080         &                + work2s(il,im,ia13)*gfnsf(il,ir,ia13) &
00081         &                - work2s(il,im,ia24)*gfnsf(il,ir,ia24)
00082       end do
00083     end do
00084   end do
00085 
00086   work4c = 0.0d0
00087   work4s = 0.0d0
00088   do it = 0, ntg 
00089     do ir = 0, nrg 
00090       do im = 0, nlg
00091         do il = 0, nlg
00092           work4c(im,ir,it) = work4c(im,ir,it) &
00093           &                + work3c(il,im,ir)*plmg(il,im,it)
00094           work4s(im,ir,it) = work4s(im,ir,it) &
00095           &                + work3s(il,im,ir)*plmg(il,im,it)
00096         end do
00097       end do
00098     end do
00099   end do
00100 
00101   pot = 0.0d0
00102   do ip = 0, npg
00103     do it = 0, ntg
00104       do ir = 0, nrg
00105         do im = 0, nlg
00106           pot(ir,it,ip) = pot(ir,it,ip) &
00107           &             + work4c(im,ir,it)*cosmpg(im,ip) &
00108           &             + work4s(im,ir,it)*sinmpg(im,ip)
00109         end do
00110       end do
00111     end do
00112   end do
00113 
00114   pi4inv = 1.0d0/4.0d0/pi
00115   pot = pi4inv*pot
00116 
00117   deallocate(work1c)
00118   deallocate(work1s)
00119   deallocate(work2c)
00120   deallocate(work2s)
00121   deallocate(work3c)
00122   deallocate(work3s)
00123   deallocate(work4c)
00124   deallocate(work4s)
00125 
00126 end subroutine poisson_solver_bhex_surf_int