G.2.3 Valid_State_ELL_Matrix Procedure

The main documentation of the Valid_State_ELL_Matrix Procedure contains additional explanation of this code listing.

  function Valid_State_ELL_Matrix (ELLM) result(Valid)

    ! Use association information.

    use Caesar_Numbers_Module, only: zero

    ! Input variables.

    ! Variable to be checked.
    type(ELL_Matrix_type), intent(in) :: ELLM  

    ! Output variables.

    type(logical) :: Valid             ! Logical state.

    ! Internal variables.

    type(real) :: N, M                 ! Dimensions of the ELLM.

    !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    ! Start out true.

    Valid = .true.

    ! Check for association of pointered internals.

    Valid = Valid .and. ASSOCIATED(ELLM%Row_Structure)
    Valid = Valid .and. ASSOCIATED(ELLM%Column_Structure)
    if (.not.Valid) return

    ! Check for validity of internals.

    Valid = Valid .and. Initialized(ELLM)
    Valid = Valid .and. Valid_State(ELLM%Average)
    Valid = Valid .and. Valid_State(ELLM%Average_is_Updated)
    Valid = Valid .and. Valid_State(ELLM%Column_Structure)
    Valid = Valid .and. Valid_State(ELLM%Frobenius_Norm)
    Valid = Valid .and. Valid_State(ELLM%Frobenius_Norm_is_Updated)
    Valid = Valid .and. Valid_State(ELLM%Infinity_Norm)
    Valid = Valid .and. Valid_State(ELLM%Infinity_Norm_is_Updated)
    Valid = Valid .and. Valid_State(ELLM%Max_Nonzeros)
    Valid = Valid .and. Valid_State(ELLM%Maximum)
    Valid = Valid .and. Valid_State(ELLM%Maximum_is_Updated)
    Valid = Valid .and. Valid_State(ELLM%Minimum)
    Valid = Valid .and. Valid_State(ELLM%Minimum_is_Updated)
    Valid = Valid .and. Valid_State(ELLM%Name)
    Valid = Valid .and. Valid_State(ELLM%One_Norm)
    Valid = Valid .and. Valid_State(ELLM%One_Norm_is_Updated)
    Valid = Valid .and. Valid_State(ELLM%Row_Structure)
    Valid = Valid .and. Valid_State(ELLM%Sum)
    Valid = Valid .and. Valid_State(ELLM%Sum_is_Updated)
    Valid = Valid .and. Valid_State(ELLM%Two_Norm_Estimate)
    Valid = Valid .and. Valid_State(ELLM%Two_Norm_is_Updated)
    if (.not.Valid) return

    ! Checks on the validity of ELL_Matrix.

    N = changetype(real, Length_Total(ELLM%Row_Structure))
    M = changetype(real, Length_Total(ELLM%Column_Structure))
    Valid = Valid .and. ALL(ELLM%Columns >= 0)
    Valid = Valid .and. ELLM%Infinity_Norm >= zero
    Valid = Valid .and. ELLM%One_Norm >= zero
    Valid = Valid .and. ELLM%Frobenius_Norm >= zero
    Valid = Valid .and. ELLM%Two_Norm_Estimate >= zero
    if (ELLM%Two_Norm_is_Updated) then
      Valid = Valid .and. &
              (ELLM%Two_Norm_Estimate .InInterval. ELLM%Two_Norm_Range)
    end if
    if (ELLM%Average_is_updated .and. ELLM%Sum_is_updated) then
      Valid = Valid .and. &
              (ELLM%Average .VeryClose. ELLM%Sum/changetype(real,(N*M)))
    end if
    if (ELLM%Maximum_is_updated .and. ELLM%Minimum_is_updated) then
      Valid = Valid .and. ELLM%Maximum >= ELLM%Minimum
    end if
    if (.not.Valid) return

    ! Mathematic relationship checks.

    !if (ELLM%One_Norm_is_updated .and. ELLM%Two_Norm_is_updated) then
    !  Valid = Valid .and. ELLM%One_Norm >= ELLM%Two_Norm
    !  Valid = Valid .and. ELLM%Two_Norm * SQRT(N) >= ELLM%One_Norm
    !end if
    !if (ELLM%Infinity_Norm_is_updated .and. ELLM%Two_Norm_is_updated) then
    !  Valid = Valid .and. ELLM%Two_Norm >= ELLM%Infinity_Norm
    !  Valid = Valid .and. ELLM%Infinity_Norm * SQRT(N) >= ELLM%Two_Norm
    !end if
    !if (ELLM%Infinity_Norm_is_updated .and. ELLM%One_Norm_is_updated) then
    !  Valid = Valid .and. ELLM%One_Norm >= ELLM%Infinity_Norm
    !  Valid = Valid .and. ELLM%Infinity_Norm * N >= ELLM%One_Norm
    !end if

    return
  end function Valid_State_ELL_Matrix



Michael L. Hall