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