elliptic_nome_auto_real32 Function

public elemental function elliptic_nome_auto_real32(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=real32), intent(in) :: k

elliptic modulus

Return Value real(kind=real32)

elliptic nome


Calls

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

Called by

proc~~elliptic_nome_auto_real32~~CalledByGraph proc~elliptic_nome_auto_real32 elliptic_nome_auto_real32 interface~elliptic_nome_auto elliptic_nome_auto interface~elliptic_nome_auto->proc~elliptic_nome_auto_real32

Variables

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

real(kind=real32), private :: pw01_eps

auxiliary parameter

real(kind=real32), private :: pw02_k

real(kind=real32), private :: pw04_eps

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


Source Code

    elemental function elliptic_nome_auto_real32(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(real32), intent(in) :: k !! elliptic modulus \( k \)



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



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

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

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

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

        real(real32) :: q_ref

        real(real32) :: 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_real32