00001 subroutine poisson_solver_no_lm1(sou, 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_theta
00007 use trigonometry_grav_phi, only : sinmpg, cosmpg, hsinmpg, hcosmpg
00008 use weight_midpoint_grav, only : hwrtpg
00009 use make_array_1d
00010 use make_array_3d
00011 implicit none
00012
00013 integer :: im, il, nlgtmp
00014 integer :: ir, irr, it, itt, ip, ipp
00015
00016 real(long) :: pef, wok, pi4inv
00017 real(long), pointer :: sou(:,:,:),pot(:,:,:)
00018 real(long), pointer :: work1c(:,:,:)
00019 real(long), pointer :: work2c(:,:,:)
00020 real(long), pointer :: work3c(:,:,:)
00021 real(long), pointer :: work4c(:,:,:)
00022 real(long), pointer :: work1s(:,:,:)
00023 real(long), pointer :: work2s(:,:,:)
00024 real(long), pointer :: work3s(:,:,:)
00025 real(long), pointer :: work4s(:,:,:)
00026 real(long), pointer :: fac_l1(:)
00027 real(long), pointer :: fac_m1(:)
00028
00029
00030 call alloc_array3d(work1c, 1, ntg, 1, nrg, 0, nlg)
00031 call alloc_array3d(work1s, 1, ntg, 1, nrg, 0, nlg)
00032 call alloc_array3d(work2c, 1, nrg, 0, nlg, 0, nlg)
00033 call alloc_array3d(work2s, 1, nrg, 0, nlg, 0, nlg)
00034 call alloc_array3d(work3c, 0, nlg, 0, nlg, 0, nrg)
00035 call alloc_array3d(work3s, 0, nlg, 0, nlg, 0, nrg)
00036 call alloc_array3d(work4c, 0, nlg, 0, nrg, 0, ntg)
00037 call alloc_array3d(work4s, 0, nlg, 0, nrg, 0, ntg)
00038 call alloc_array1d(fac_l1, 0, nlg)
00039 call alloc_array1d(fac_m1, 0, nlg)
00040
00041 fac_l1(0:nlg) = 1.0d0
00042 fac_m1(0:nlg) = 1.0d0
00043
00044 fac_l1(1) = 0.0d0
00045 fac_m1(1) = 0.0d0
00046
00047
00048
00049
00050
00051
00052
00053 work1c = 0.0
00054 work1s = 0.0
00055 do im = 0, nlg
00056 do irr = 1, nrg
00057 do itt = 1, ntg
00058 do ipp = 1, npg
00059 work1c(itt,irr,im) = work1c(itt,irr,im) &
00060 + hwrtpg(irr,itt,ipp)*sou(irr,itt,ipp)*hcosmpg(im,ipp)
00061 work1s(itt,irr,im) = work1s(itt,irr,im) &
00062 + hwrtpg(irr,itt,ipp)*sou(irr,itt,ipp)*hsinmpg(im,ipp)
00063 end do
00064 end do
00065 end do
00066 end do
00067
00068 work2c = 0.0d0
00069 work2s = 0.0d0
00070 do il = 0, nlg
00071 do im = 0, nlg
00072 pef = epsig(im)*facnmg(il,im)*fac_l1(il)*fac_m1(im)
00073 do irr = 1, nrg
00074 do itt = 1, ntg
00075 wok = pef*hplmg(il,im,itt)
00076 work2c(irr,il,im) = work2c(irr,il,im) + wok*work1c(itt,irr,im)
00077 work2s(irr,il,im) = work2s(irr,il,im) + wok*work1s(itt,irr,im)
00078 end do
00079 end do
00080 end do
00081 end do
00082
00083 work3c = 0.0d0
00084 work3s = 0.0d0
00085 do ir = 0, nrg
00086 do il = 0, nlg
00087 do im = 0, nlg
00088 do irr = 1, nrg
00089 work3c(il,im,ir) = work3c(il,im,ir) &
00090 + work2c(irr,il,im)*hgfn(irr,il,ir)
00091 work3s(il,im,ir) = work3s(il,im,ir) &
00092 + work2s(irr,il,im)*hgfn(irr,il,ir)
00093 end do
00094 end do
00095 end do
00096 end do
00097
00098 work4c = 0.0d0
00099 work4s = 0.0d0
00100 do it = 0, ntg
00101 do ir = 0, nrg
00102 do im = 0, nlg
00103 do il = 0, nlg
00104 work4c(im,ir,it) = work4c(im,ir,it) &
00105 + work3c(il,im,ir)*plmg(il,im,it)
00106 work4s(im,ir,it) = work4s(im,ir,it) &
00107 + work3s(il,im,ir)*plmg(il,im,it)
00108 end do
00109 end do
00110 end do
00111 end do
00112
00113 pot = 0.0d0
00114 do ip = 0, npg
00115 do it = 0, ntg
00116 do ir = 0, nrg
00117 do im = 0, nlg
00118 pot(ir,it,ip) = pot(ir,it,ip) &
00119 + work4c(im,ir,it)*cosmpg(im,ip) &
00120 + work4s(im,ir,it)*sinmpg(im,ip)
00121 end do
00122 end do
00123 end do
00124 end do
00125
00126 pi4inv = 1.0d0/4.0d0/pi
00127 pot = - pi4inv*pot
00128
00129 deallocate(work1c)
00130 deallocate(work1s)
00131 deallocate(work2c)
00132 deallocate(work2s)
00133 deallocate(work3c)
00134 deallocate(work3s)
00135 deallocate(work4c)
00136 deallocate(work4s)
00137 deallocate(fac_l1)
00138 deallocate(fac_m1)
00139
00140 end subroutine poisson_solver_no_lm1
00141