D.4.3 Valid_State_Data_Index Procedure

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

  function Valid_State_Data_Index (Index) result(Valid)

    ! Input variables.

    ! Variable to be checked.
    type(Data_Index_type), intent(in) :: Index 

    ! Output variables.

    type(logical) :: Valid  ! Logical state.

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

    ! Start out true.

    Valid = .true.

    ! Check for association of pointered internals.

    Valid = Valid .and. ASSOCIATED(Index%Many_Structure)
    Valid = Valid .and. ASSOCIATED(Index%One_Structure)
    if (.not.Valid) return

    ! Check for validity of internals.

    Valid = Valid .and. Initialized(Index)
    Valid = Valid .and. Valid_State(Index%One_Structure)
    Valid = Valid .and. Valid_State(Index%Many_Structure)
    select case (Index%Dimensionality)
    case (1)
      Valid = Valid .and. Valid_State(Index%Index1)
    case (2)                        
      Valid = Valid .and. Valid_State(Index%Index2)
    !case (-1)                      
    !  Valid = Valid .and. Valid_State(Index%IndexRR)
    end select
    Valid = Valid .and. Valid_State(Index%Off_PE_Index)
    if (.not.Valid) return

    ! Checks on the validity of Index.

    Valid = Valid .and. Index%NOff_PE == SIZE(Index%Off_PE_Index)
    select case (Index%Dimensionality)
    case (1)
      Valid = Valid .and. &
              SIZE(Index%Index1,1) == Length_PE(Index%One_Structure)
    case (2)                        
      Valid = Valid .and. &
              SIZE(Index%Index2,1) == Length_PE(Index%One_Structure)
    !case (-1)                      
    !  Valid = Valid .and. &
    !          SIZE(Index%IndexRR,1) == Length_PE(Index%One_Structure)
    end select

    ! All off-PE indices are really off-PE.

    Valid = Valid .and. &
            (Index%Off_PE_Index .NotInInterval. Range_PE(Index%Many_Structure))

    ! All positive indices are on-PE. (Negative ones pass this test also.)

    select case (Index%Dimensionality)
    case (1)
      Valid = Valid .and. &
              (ALL(Index%Index1 <= Length_PE(Index%Many_Structure)))
    case (2)                        
      Valid = Valid .and. &
              (ALL(Index%Index2 <= Length_PE(Index%Many_Structure)))
    !case (-1)                      
    !  Valid = Valid .and. &
    !          (ALL((Index%IndexRR <= Last_PE(Index%One_Structure) .and. &
    !                Index%IndexRR >= First_PE(Index%One_Structure)) .or. &
    !                Index%IndexRR < 0))
    end select

    return
  end function Valid_State_Data_Index



Michael L. Hall