MatrixMarketModule.F90 Source File


Contents


Source Code

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!> This module contains helpers for processing matrix market files.
MODULE MatrixMarketModule
  IMPLICIT NONE
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  ENUM, BIND(c)
    !> Sparse coordinate file.
    ENUMERATOR :: MM_COORDINATE=1
    !> Dense array file.
    ENUMERATOR :: MM_ARRAY=2
    !> Real data being read in.
    ENUMERATOR :: MM_REAL=1
    !> Integer data being read in.
    ENUMERATOR :: MM_INTEGER=2
    !>Complex numbers being read in.
    ENUMERATOR :: MM_COMPLEX=3
    !> Just a pattern of non zeros.
    ENUMERATOR :: MM_PATTERN=4
    !> File lacks symmetry.
    ENUMERATOR :: MM_GENERAL=1
    !> File is symmetric
    ENUMERATOR :: MM_SYMMETRIC=2
    !> File is skew symmetric.
    ENUMERATOR :: MM_SKEW_SYMMETRIC=3
    !> File is hermitian.
    ENUMERATOR :: MM_HERMITIAN=4
  END ENUM
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  PUBLIC :: ParseMMHeader
CONTAINS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !> Parse a matrix market header.
  FUNCTION ParseMMHeader(line,sparsity_type,data_type,pattern_type) &
       & RESULT(no_error)
    !> String to parse.
    CHARACTER(len=*), INTENT(IN) :: line
    !> If coordinate or array type.
    INTEGER, INTENT(OUT) :: sparsity_type
    !> If real, integer, complex, pattern.
    INTEGER, INTENT(OUT) :: data_type
    !> If general, symmetric, skew_symmetric, hermitian.
    INTEGER, INTENT(OUT) :: pattern_type
    !> True if no errors.
    LOGICAL :: no_error
    !! Local Data
    INTEGER :: pos1, pos2

    no_error = .TRUE.

    !! This part is just "MatrixMarket".
    pos1 = 1
    pos2 = INDEX(line(pos1:), ' ')

    !! This part is just "matrix".
    pos1 = pos2+pos1
    pos2 = INDEX(line(pos1:), ' ')

    !! This part is coordinate or array.
    pos1 = pos2+pos1
    pos2 = INDEX(line(pos1:), ' ')
    SELECT CASE(TRIM(line(pos1:pos1+pos2-1)))
    CASE('coordinate')
       sparsity_type = MM_COORDINATE
    CASE('array')
       sparsity_type = MM_ARRAY
    CASE DEFAULT
       no_error = .FALSE.
    END SELECT

    !! This part is real, integer, complex, pattern.
    pos1 = pos2+pos1
    pos2 = INDEX(line(pos1:), ' ')
    SELECT CASE(TRIM(line(pos1:pos1+pos2-1)))
    CASE('real')
       data_type = MM_REAL
    CASE('array')
       data_type = MM_INTEGER
    CASE('complex')
       data_type = MM_COMPLEX
    CASE('pattern')
       data_type = MM_PATTERN
    CASE DEFAULT
       no_error = .FALSE.
    END SELECT

    !! This part is general, symmetric, skew-symmetric, hermitian.
    pos1 = pos2+pos1
    SELECT CASE(TRIM(line(pos1:)))
    CASE('general')
       pattern_type = MM_GENERAL
    CASE('symmetric')
       pattern_type = MM_SYMMETRIC
    CASE('skew-symmetric')
       pattern_type = MM_SKEW_SYMMETRIC
    CASE('hermitian')
       pattern_type = MM_HERMITIAN
    CASE DEFAULT
       no_error = .FALSE.
    END SELECT

  END FUNCTION ParseMMHeader
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
END MODULE MatrixMarketModule