00001
00002
00003 module legendre_fn_irbns_grav
00004 use phys_constant, only : long
00005 implicit none
00006 real(long), pointer :: plmg(:,:,:), hplmg(:,:,:)
00007 real(long), pointer :: dtplmg(:,:,:), hdtplmg(:,:,:)
00008 real(long), pointer :: yplmg(:,:,:), hyplmg(:,:,:)
00009 real(long), pointer :: dtyplmg(:,:,:), hdtyplmg(:,:,:)
00010 real(long), pointer :: facnmg(:,:), epsig(:)
00011 contains
00012 SUBROUTINE legendre_irbns
00013 use phys_constant, only : nnlg, long, pi
00014 use grid_parameter, only : ntg, nlg
00015 use coordinate_grav_theta, only : thg, hthg
00016 use make_array_3d
00017 use make_array_2d
00018 use make_array_1d
00019 implicit none
00020 integer :: it, mm, nn
00021 real(long) :: fmm, fnn, fnmfm, yplm_fac, theta
00022 real(long) :: pnag(0:nnlg,0:nnlg), dtpnag(0:nnlg,0:nnlg)
00023
00024
00025
00026 call alloc_array3d(plmg, 0, nlg, 0, nlg, 0, ntg)
00027 call alloc_array3d(hplmg, 0, nlg, 0, nlg, 1, ntg)
00028 call alloc_array3d(dtplmg, 0, nlg, 0, nlg, 0, ntg)
00029 call alloc_array3d(hdtplmg, 0, nlg, 0, nlg, 1, ntg)
00030 call alloc_array3d(yplmg, 0, nlg, 0, nlg, 0, ntg)
00031 call alloc_array3d(hyplmg, 0, nlg, 0, nlg, 1, ntg)
00032 call alloc_array3d(dtyplmg, 0, nlg, 0, nlg, 0, ntg)
00033 call alloc_array3d(hdtyplmg, 0, nlg, 0, nlg, 1, ntg)
00034 do it = 0, ntg
00035 theta = thg(it)
00036 call legendre_irbns_theta(pnag,dtpnag,theta)
00037 plmg(0:nlg,0:nlg,it) = pnag(0:nlg,0:nlg)
00038 dtplmg(0:nlg,0:nlg,it) = dtpnag(0:nlg,0:nlg)
00039 end do
00040 do it = 1, ntg
00041 theta = hthg(it)
00042 call legendre_irbns_theta(pnag,dtpnag,theta)
00043 hplmg(0:nlg,0:nlg,it) = pnag(0:nlg,0:nlg)
00044 hdtplmg(0:nlg,0:nlg,it) = dtpnag(0:nlg,0:nlg)
00045 end do
00046
00047
00048
00049 call alloc_array2d(facnmg, 0, nlg, 0, nlg)
00050 do nn = 0, nlg
00051 do mm = 0, nlg
00052 facnmg(nn,mm) = 0.0d+0
00053 end do
00054 end do
00055
00056 facnmg(0,0) = 1.0d0
00057 do nn = 1, nlg
00058 fnn = real(nn)
00059 facnmg(nn,0) = 1.0d0
00060 do mm = 1, nn
00061 fmm = real(mm)
00062 fnmfm= fnn-fmm + 1.0d0
00063 facnmg(nn,mm) = facnmg(nn,mm-1)/(fnn+fmm)/fnmfm
00064 end do
00065 end do
00066
00067 call alloc_array1d(epsig, 0, nlg)
00068 do mm = 0, nlg
00069 epsig(mm) = 2.0d+0
00070 if (mm == 0) epsig(mm) = 1.0d+0
00071 end do
00072
00073 do nn = 0, nlg
00074 do mm = 0, nn
00075 do it = 0, nt
00076 yplm_fac = (epsig(mm)*(2.0d0*dble(nn)+1.0d0)/(4.0d0*pi)* &
00077 & facnmg(nn,mm))**0.5d0
00078 yplmg(nn,mm,it) = yplm_fac* plmg(nn,mm,it)
00079 dtyplmg(nn,mm,it) = yplm_fac* dtplmg(nn,mm,it)
00080 if (it.eq.0) cycle
00081 hyplmg(nn,mm,it) = yplm_fac* hplmg(nn,mm,it)
00082 hdtyplmg(nn,mm,it) = yplm_fac*hdtplmg(nn,mm,it)
00083 end do
00084 end do
00085 end do
00086
00087 end subroutine legendre_irbns
00088 SUBROUTINE legendre_irbns_theta(pnag,dtpnag,theta)
00089 use phys_constant, only : nnlg, long
00090 use grid_parameter, only : nlg
00091 implicit none
00092 integer :: it, mm, nn, kk
00093 real(long) :: fmm, fkk, cc, ss, q1, q2
00094 real(long) :: pnag(0:nnlg,0:nnlg), dtpnag(0:nnlg,0:nnlg)
00095 real(long) :: theta, fac(0:nnlg)
00096
00097 cc = cos(theta)
00098 ss = sin(theta)
00099
00100 pnag(0:nlg,0:nlg) = 0.0d0
00101 dtpnag(0:nlg,0:nlg) = 0.0d0
00102
00103 fac(0) = 1.0d0
00104 do mm = 1, nlg
00105 fmm = real(mm)
00106 fac(mm) = (2.0d0*fmm-1.0d0) * fac(mm-1)
00107 end do
00108
00109 pnag(0,0) = 1.d0
00110 dtpnag(0,0) = 0.d0
00111 do mm = 1, nlg
00112 pnag(mm,mm) = fac(mm) * (-ss)**mm
00113 end do
00114
00115 mm = 1
00116 dtpnag(mm,mm) = fac(mm) * dble(mm)*(-cc)
00117 do mm = 2, nla
00118 dtpnag(mm,mm) = fac(mm) * dble(mm)*(-ss)**(mm-1)*(-cc)
00119 end do
00120
00121 do mm = 0, nlg-1
00122 fmm = real(mm)
00123 pnag(mm+1,mm) = (2.0d0*fmm + 1.0d0)* cc* pnag(mm,mm)
00124 dtpnag(mm+1,mm) = (2.0d0*fmm + 1.0d0)*(cc*dtpnag(mm,mm) &
00125 & -ss* pnag(mm,mm))
00126 end do
00127
00128 do mm = 0, nlg-2
00129 fmm = real(mm)
00130 do kk = 2, nlg-mm
00131 fkk = real(kk)
00132 q1 = ( 2.0d0 * fmm + 2.0d0 * fkk - 1.0d0 ) / fkk
00133 q2 = ( 2.0d0 * fmm + fkk - 1.0d0 ) / fkk
00134 pnag(mm+kk,mm) = q1* cc* pnag(mm+kk-1,mm) - q2* pnag(mm+kk-2,mm)
00135 dtpnag(mm+kk,mm) = q1*(cc*dtpnag(mm+kk-1,mm) - ss * pnag(mm+kk-1,mm)) &
00136 & - q2*dtpnag(mm+kk-2,mm)
00137 end do
00138 end do
00139 end subroutine legendre_irbns_theta
00140 end module legendre_fn_irbns_grav