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