elliptic_nome_auto_real64 Function

public elemental function elliptic_nome_auto_real64(k) result(q)

Calculate the elliptic nome for the given elliptic modulus

Note

  • The elliptic modulus should satisfy .
  • If the calculation does not converge, it returns NaN.

Arguments

Type IntentOptional Attributes Name
real(kind=real64), intent(in) :: k

elliptic modulus

Return Value real(kind=real64)

elliptic nome


Calls

proc~~elliptic_nome_auto_real64~~CallsGraph proc~elliptic_nome_auto_real64 elliptic_nome_auto_real64 proc~calculate_pw04_epsilon~3 calculate_pw04_epsilon proc~elliptic_nome_auto_real64->proc~calculate_pw04_epsilon~3 proc~elliptic_nome_by_epsilon_05~3 elliptic_nome_by_epsilon_05 proc~elliptic_nome_auto_real64->proc~elliptic_nome_by_epsilon_05~3 proc~elliptic_nome_by_epsilon_09~3 elliptic_nome_by_epsilon_09 proc~elliptic_nome_auto_real64->proc~elliptic_nome_by_epsilon_09~3 proc~elliptic_nome_by_epsilon_13~3 elliptic_nome_by_epsilon_13 proc~elliptic_nome_auto_real64->proc~elliptic_nome_by_epsilon_13~3 proc~elliptic_nome_by_epsilon_17~3 elliptic_nome_by_epsilon_17 proc~elliptic_nome_auto_real64->proc~elliptic_nome_by_epsilon_17~3 proc~elliptic_nome_by_epsilon_21~3 elliptic_nome_by_epsilon_21 proc~elliptic_nome_auto_real64->proc~elliptic_nome_by_epsilon_21~3 proc~elliptic_nome_by_epsilon_25~3 elliptic_nome_by_epsilon_25 proc~elliptic_nome_auto_real64->proc~elliptic_nome_by_epsilon_25~3 proc~elliptic_nome_by_epsilon_29~3 elliptic_nome_by_epsilon_29 proc~elliptic_nome_auto_real64->proc~elliptic_nome_by_epsilon_29~3 proc~elliptic_nome_by_epsilon_33~3 elliptic_nome_by_epsilon_33 proc~elliptic_nome_auto_real64->proc~elliptic_nome_by_epsilon_33~3 proc~evaluate_modulus~3 evaluate_modulus proc~elliptic_nome_auto_real64->proc~evaluate_modulus~3 proc~calculate_pw01_epsilon~3 calculate_pw01_epsilon proc~calculate_pw04_epsilon~3->proc~calculate_pw01_epsilon~3 proc~elliptic_nome_by_epsilon_05_horner~3 elliptic_nome_by_epsilon_05_horner proc~elliptic_nome_by_epsilon_05~3->proc~elliptic_nome_by_epsilon_05_horner~3 proc~elliptic_nome_by_epsilon_09_horner~3 elliptic_nome_by_epsilon_09_horner proc~elliptic_nome_by_epsilon_09~3->proc~elliptic_nome_by_epsilon_09_horner~3 proc~elliptic_nome_by_epsilon_13_horner~3 elliptic_nome_by_epsilon_13_horner proc~elliptic_nome_by_epsilon_13~3->proc~elliptic_nome_by_epsilon_13_horner~3 proc~elliptic_nome_by_epsilon_17_horner~3 elliptic_nome_by_epsilon_17_horner proc~elliptic_nome_by_epsilon_17~3->proc~elliptic_nome_by_epsilon_17_horner~3 proc~elliptic_nome_by_epsilon_21_horner~3 elliptic_nome_by_epsilon_21_horner proc~elliptic_nome_by_epsilon_21~3->proc~elliptic_nome_by_epsilon_21_horner~3 proc~elliptic_nome_by_epsilon_25_horner~3 elliptic_nome_by_epsilon_25_horner proc~elliptic_nome_by_epsilon_25~3->proc~elliptic_nome_by_epsilon_25_horner~3 proc~elliptic_nome_by_epsilon_29_horner~3 elliptic_nome_by_epsilon_29_horner proc~elliptic_nome_by_epsilon_29~3->proc~elliptic_nome_by_epsilon_29_horner~3 proc~elliptic_nome_by_epsilon_33_horner~3 elliptic_nome_by_epsilon_33_horner proc~elliptic_nome_by_epsilon_33~3->proc~elliptic_nome_by_epsilon_33_horner~3 proc~elliptic_nome_by_epsilon_09_horner~3->proc~elliptic_nome_by_epsilon_05_horner~3 proc~elliptic_nome_by_epsilon_13_horner~3->proc~elliptic_nome_by_epsilon_09_horner~3 proc~elliptic_nome_by_epsilon_17_horner~3->proc~elliptic_nome_by_epsilon_13_horner~3 proc~elliptic_nome_by_epsilon_21_horner~3->proc~elliptic_nome_by_epsilon_17_horner~3 proc~elliptic_nome_by_epsilon_25_horner~3->proc~elliptic_nome_by_epsilon_21_horner~3 proc~elliptic_nome_by_epsilon_29_horner~3->proc~elliptic_nome_by_epsilon_25_horner~3 proc~elliptic_nome_by_epsilon_33_horner~3->proc~elliptic_nome_by_epsilon_29_horner~3

Called by

proc~~elliptic_nome_auto_real64~~CalledByGraph proc~elliptic_nome_auto_real64 elliptic_nome_auto_real64 interface~elliptic_nome_auto elliptic_nome_auto interface~elliptic_nome_auto->proc~elliptic_nome_auto_real64

Variables

Type Visibility Attributes Name Initial
real(kind=real64), private :: comp_k

real(kind=real64), private :: pw01_eps

auxiliary parameter

real(kind=real64), private :: pw02_k

real(kind=real64), private :: pw04_eps

real(kind=real64), private :: q_ref
real(kind=real64), private :: sqrt_comp_k


Source Code

    elemental function elliptic_nome_auto_real64(k) result(q)
        !! Calculate the elliptic nome \( q \) 
        !! for the given elliptic modulus \( k \)
        !! @note
        !! - The elliptic modulus \( k \) should satisfy \( { k }^{ 2 } \le 1/2 \).
        !! - If the calculation does not converge, it returns NaN.
        !! @endnote

        real(real64), intent(in) :: k !! elliptic modulus \( k \)



        real(real64) :: q !! elliptic nome \( q \)



        real(real64) :: comp_k !! \( { k }^{ \prime } \)

        real(real64) :: pw01_eps !! auxiliary parameter \( \varepsilon \)

        real(real64) :: pw02_k !! \( { k }^{ 2 } \)

        real(real64) :: pw04_eps !! \( { \varepsilon }^{ 4 } \)

        real(real64) :: q_ref

        real(real64) :: sqrt_comp_k !! \( \sqrt{ { k }^{ \prime } } \)



        call evaluate_modulus(k = k, pw02_k = pw02_k, comp_k = comp_k)

        call calculate_pw04_epsilon( &!
        &        pw02_k   =      pw02_k   , &!
        &        comp_k   =      comp_k   , &!
        &   sqrt_comp_k   = sqrt_comp_k   , &!
        &        pw01_eps =      pw01_eps , &!
        &        pw04_eps =      pw04_eps   &!
        )



        q_ref = pw01_eps

        q = &!
            elliptic_nome_by_epsilon_05( &!
                pw01_eps = pw01_eps , &!
                pw04_eps = pw04_eps   &!
            )

        if ( abs(q - q_ref) .lt. q_err ) return



        q_ref = q

        q = &!
            elliptic_nome_by_epsilon_09( &!
                pw01_eps = pw01_eps , &!
                pw04_eps = pw04_eps   &!
            )

        if ( abs(q - q_ref) .lt. q_err ) return



        q_ref = q

        q = &!
            elliptic_nome_by_epsilon_13( &!
                pw01_eps = pw01_eps , &!
                pw04_eps = pw04_eps   &!
            )

        if ( abs(q - q_ref) .lt. q_err ) return



        q_ref = q

        q = &!
            elliptic_nome_by_epsilon_17( &!
                pw01_eps = pw01_eps , &!
                pw04_eps = pw04_eps   &!
            )

        if ( abs(q - q_ref) .lt. q_err ) return



        q_ref = q

        q = &!
            elliptic_nome_by_epsilon_21( &!
                pw01_eps = pw01_eps , &!
                pw04_eps = pw04_eps   &!
            )

        if ( abs(q - q_ref) .lt. q_err ) return



        q_ref = q

        q = &!
            elliptic_nome_by_epsilon_25( &!
                pw01_eps = pw01_eps , &!
                pw04_eps = pw04_eps   &!
            )

        if ( abs(q - q_ref) .lt. q_err ) return



        q_ref = q

        q = &!
            elliptic_nome_by_epsilon_29( &!
                pw01_eps = pw01_eps , &!
                pw04_eps = pw04_eps   &!
            )

        if ( abs(q - q_ref) .lt. q_err ) return



        q_ref = q

        q = &!
            elliptic_nome_by_epsilon_33( &!
                pw01_eps = pw01_eps , &!
                pw04_eps = pw04_eps   &!
            )

        if ( abs(q - q_ref) .lt. q_err ) return




        q = ieee_value(q, ieee_quiet_nan)

    end function elliptic_nome_auto_real64