00001
00002
00003 module radial_green_fn_grav_bhex_nd
00004 use phys_constant, only : long
00005 use grid_parameter, only : nrg, nlg, rgin, rgout
00006 use coordinate_grav_r, only : rg, rginv, hrg, hrginv
00007 use make_array_3d
00008 implicit none
00009 real(long), pointer :: hgfn_nd(:,:,:), gfnsf_nd(:,:,:)
00010 contains
00011 subroutine allocate_hgfn_bhex_nd
00012 implicit none
00013 call alloc_array3d(hgfn_nd,1,nrg,0,nlg,0,nrg)
00014 call alloc_array3d(gfnsf_nd,0,nlg,0,nrg,1,4)
00015 end subroutine allocate_hgfn_bhex_nd
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 subroutine calc_hgfn_bhex_nd
00027 implicit none
00028 integer :: ir, irr, il
00029 real(long) :: bhrad, bhradinv, bhsq
00030 real(long) :: radext, radextinv, radsq
00031 real(long) :: fac1, fac2, fac3, dil1, dil2
00032
00033 do ir = 0, nrg
00034 do il = 0, nlg
00035 do irr = 1, nrg
00036 hgfn_nd(irr,il,ir) = 0.d0
00037 end do
00038 end do
00039 end do
00040
00041
00042
00043 bhrad = rgin
00044 bhradinv = 1.0d0/rgin
00045 radext = rgout
00046 radextinv = 1.0d0/rgout
00047
00048 do ir = 0, nrg
00049 do irr = 1, nrg
00050 if (hrg(irr).lt.rg(ir)) then
00051 do il = 0, nlg
00052 dil1 = dble(il)/dble(il+1)
00053 fac1 = 1.0d0/(1.0d0 + dil1*(bhrad*radextinv)**(2*il+1))
00054 fac2 = (bhrad*radextinv)**il*radextinv
00055 hgfn_nd(irr,il,ir) = fac1*fac2 &
00056 & *((hrg(irr)*bhradinv)**il + dil1*(bhrad*hrginv(irr))**(il+1)) &
00057 & *((radext*rginv(ir))**(il+1) - (rg(ir)*radextinv)**il)
00058 end do
00059 end if
00060 if (hrg(irr).ge.rg(ir)) then
00061 do il = 0, nlg
00062 dil1 = dble(il)/dble(il+1)
00063 fac1 = 1.0d0/(1.0d0 + dil1*(bhrad*radextinv)**(2*il+1))
00064 fac2 = (bhrad*radextinv)**il*radextinv
00065 hgfn_nd(irr,il,ir) = fac1*fac2 &
00066 & *((rg(ir)*bhradinv)**il + dil1*(bhrad*rginv(ir))**(il+1)) &
00067 & *((radext*hrginv(irr))**(il+1) - (hrg(irr)*radextinv)**il)
00068 end do
00069 end if
00070 end do
00071 end do
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 bhrad = rgin
00082 bhradinv = 1.0d0/rgin
00083 radext = rgout
00084 radextinv = 1.0d0/rgout
00085 bhsq = bhrad**2
00086 radsq = radext**2
00087
00088 do ir = 0, nrg
00089 il = 0
00090
00091 dil1 = dble(il)/dble(il+1)
00092 dil2 = dble(2*il+1)/dble(il+1)
00093 fac1 = 1.0d0/(1.0d0 + dil1*(bhrad*radextinv)**(2*il+1))
00094 fac2 = dil2*(bhrad*radextinv)**il*radextinv
00095 fac3 = dble(2*il+1)*bhrad**il*radextinv**(il+2)
00096 gfnsf_nd(il,ir,1) = - fac1*fac2*(radext*rginv(ir) - 1.0d0)*bhsq
00097 gfnsf_nd(il,ir,2) = - 0.0d0
00098 gfnsf_nd(il,ir,3) = 0.0d0
00099 gfnsf_nd(il,ir,4) = - fac1*fac3 &
00100 & *(1.0d0 + dil1*bhrad*rginv(ir))*radsq
00101
00102 do il = 1, nlg
00103
00104 dil1 = dble(il)/dble(il+1)
00105 dil2 = dble(2*il+1)/dble(il+1)
00106 fac1 = 1.0d0/(1.0d0 + dil1*(bhrad*radextinv)**(2*il+1))
00107 fac2 = dil2*(bhrad*radextinv)**il*radextinv
00108 fac3 = dble(2*il+1)*bhrad**il*radextinv**(il+2)
00109 gfnsf_nd(il,ir,1) = - fac1*fac2 &
00110 & *((radext*rginv(ir))**(il+1)-(rg(ir)*radextinv)**il)*bhsq
00111 gfnsf_nd(il,ir,2) = - 0.0d0
00112 gfnsf_nd(il,ir,3) = 0.0d0
00113 gfnsf_nd(il,ir,4) = - fac1*fac3 &
00114 & *((rg(ir)*bhradinv)**il+dil1*(bhrad*rginv(ir))**(il+1))*radsq
00115
00116 end do
00117 end do
00118
00119 end subroutine calc_hgfn_bhex_nd
00120 end module radial_green_fn_grav_bhex_nd