Need help with a fortran-routine that calculates the associated Laguerre function

  1. Hi!
    Im trying to do some rather easy QM-calculations in Fortran.
    To do that i need a routine that calculates the generalized Laguerre polynomials.

    I just did the simplest implementation of the equation:
    [tex]L^l_n(x)=\sum_{k=0}^n\frac{(n+l)!(-x^2)^k}{(n-k)!k!}[/tex]

    I implemented this in the following way:
    Code (Text):

          SUBROUTINE LAGUERRE(n,l,r,u,arraylength)
          Implicit none
          INTEGER, INTENT(IN) :: arraylength,n
          real(kind=kind(0.d0)), INTENT(IN) :: l
          REAL(kind=kind(0.d0)), INTENT(IN),DIMENSION(arraylength) :: r
          REAL(kind=kind(0.d0)), INTENT(OUT),DIMENSION(arraylength) :: u
          REAL(kind=kind(0.d0)), DIMENSION(arraylength) :: temp
          Integer :: m
       
          temp=0.d0
          do m=0,n
             temp=temp+gamma(real(n)+l+1.0)*(-r)**m/
         +        (gamma(real(n)-real(m)+1.0)*gamma(l+real(m)+1.0)
         +        *gamma(real(m)+1.0))
          end do
          u=temp
          END SUBROUTINE LAGUERRE
     
    The code is running and i do get results, but when i compare them with the results given in for example Mathematica, they seems quite strange.
    So my questions are: Do you see some obvious mistakes? Do you think there are possibilities for numerical errors? (In such a case, do you have any advices on improvments?)

    When i have been googling around, it looks like alot of the numerical implementations are using recursive relations. What are the pro's and con's for doing this kind of calculation in such a manner?
     
  2. jcsd
  3. SteamKing

    SteamKing 9,133
    Staff Emeritus
    Science Advisor
    Homework Helper

    What is gamma? Is it an array, a function, a subroutine?
     
  4. uart

    uart 2,776
    Science Advisor

    It looks like he's using it for factorial so it must the special function gamma (which reduces to factorial for integer values of the argument : gamma(n+1) = n! ).


    I just did the simplest implementation of the equation:
    [tex]L^l_n(x)=\sum_{k=0}^n\frac{(n+l)!(-x^2)^k}{(n-k)!k!}[/tex]

    I implemented this in the following way:
    Code (Text):

          SUBROUTINE LAGUERRE(n,l,r,u,arraylength)
          Implicit none
          INTEGER, INTENT(IN) :: arraylength,n
          real(kind=kind(0.d0)), INTENT(IN) :: l
          REAL(kind=kind(0.d0)), INTENT(IN),DIMENSION(arraylength) :: r
          REAL(kind=kind(0.d0)), INTENT(OUT),DIMENSION(arraylength) :: u
          REAL(kind=kind(0.d0)), DIMENSION(arraylength) :: temp
          Integer :: m
       
          temp=0.d0
          do m=0,n
             temp=temp+gamma(real(n)+l+1.0)*(-r)**m/
         +        (gamma(real(n)-real(m)+1.0)*gamma(l+real(m)+1.0)
         +        *gamma(real(m)+1.0))
          end do
          u=temp
          END SUBROUTINE LAGUERRE
     
    Why are "r" and "u" declared as arrays yet you don't index them like arrays?

    Where did the (l+k)! term come from?
    Why isn't "r" squared.
     
    Last edited: Aug 12, 2011
Know someone interested in this topic? Share a link to this question via email, Google+, Twitter, or Facebook

Have something to add?
Similar discussions for: Need help with a fortran-routine that calculates the associated Laguerre function
Loading...