The main documentation of the Convert_ELL_to_LAMG Procedure contains additional explanation of this code listing.
ifdef([USE_LAMG],[ subroutine Convert_ELL_to_LAMG (LAMG_Matrix, ELLM, LAMG_Communicator, & LAMG_Options, status) ! Use association information. use Caesar_Numbers_Module, only: zero use LAMG_Module ! Input variables. type(ELL_Matrix_type), intent(in) :: ELLM ! Matrix in ELL format. type(lamg_comm), intent(in) :: LAMG_Communicator ! Communicator. type(LAMG_LS_Options), intent(in) :: LAMG_Options ! LAMG options. ! Output variables. type(LAMG_Matrix_dcsr_r), intent(out) :: LAMG_Matrix ! LAMG formt matrix. type(status_type), intent(out),optional :: status ! Output status. ! Internal variables. type(integer) :: NNonzeros_PE ! Number of nonzeros on this PE. type(integer) :: LAMG_Status ! LAMG status. type(integer,2) :: Columns_BNA ! Matrix columns bare naked array. type(real,2) :: Values_BNA ! Matrix values bare naked array. type(LAMG_Matrix_csr_r) :: LAMG_BR_Matrix ! LAMG block-row format matrix. type(integer) :: BR_Location ! Location in the block-row matrix. type(integer) :: ELL_Location ! Location in the ELL matrix. type(integer) :: row ! Row loop counter. type(Status_type), dimension(10) :: allocate_status ! Allocation Status. type(Status_type) :: consolidated_status ! Consolidated Status. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(ELLM),5) ! ELLM is valid. ! Initializations. call Initialize (allocate_status) call Initialize (consolidated_status) ! Pull ELLM matrix values and columns out in BNAs. call Initialize (Values_BNA, NRows_PE(ELLM), Max_Nonzeros(ELLM), & allocate_status(1)) call Initialize (Columns_BNA, NRows_PE(ELLM), Max_Nonzeros(ELLM), & allocate_status(2)) Values_BNA = ELLM Columns_BNA = ELLM NNonzeros_PE = COUNT(Values_BNA/=zero) ! Convert ELLM into LAMG matrix. LAMG_BR_Matrix%nrow = NRows_PE(ELLM) LAMG_BR_Matrix%ncol = NRows_Total(ELLM) LAMG_BR_Matrix%nnz = NNonzeros_PE ! Initialize LAMG block-row matrix. call Initialize (LAMG_BR_Matrix%ia, LAMG_BR_Matrix%nrow+1, & allocate_status(3)) call Initialize (LAMG_BR_Matrix%ja, LAMG_BR_Matrix%nnz , & allocate_status(4)) call Initialize (LAMG_BR_Matrix% a, LAMG_BR_Matrix%nnz , & allocate_status(5)) ! Fill the LAMG block-row matrix. BR_location = 0 do row = 1, NRows_PE(ELLM) LAMG_BR_Matrix%ia(row) = BR_location + 1 do ELL_location = 1, Max_Nonzeros(ELLM) if (Values_BNA(row,ELL_location) /= zero) then BR_location = BR_location + 1 LAMG_BR_Matrix% a(BR_location) = Values_BNA(row,ELL_location) LAMG_BR_Matrix%ja(BR_location) = Columns_BNA(row,ELL_location) end if end do end do LAMG_BR_Matrix%ia(NRows_PE(ELLM) + 1) = BR_location + 1 VERIFY(BR_location==NNonzeros_PE,4) ! Finalize BNA matrix. call Finalize (Values_BNA, allocate_status(6)) call Finalize (Columns_BNA, allocate_status(7)) ! Transform matrix into LAMG internal format. call LAMG_Transform_Matrix (LAMG_Matrix, LAMG_BR_Matrix, & LAMG_Communicator, LAMG_Options, LAMG_Status) ! Finalize LAMG block-row matrix. call Finalize (LAMG_BR_Matrix%ia, allocate_status(8)) call Finalize (LAMG_BR_Matrix%ja, allocate_status(9)) call Finalize (LAMG_BR_Matrix% a, allocate_status(10)) ! Process status variables. consolidated_status = allocate_status if (PRESENT(status)) then WARN_IF(Error(consolidated_status), 5) status = consolidated_status else VERIFY(Normal(consolidated_status), 5) end if call Finalize (consolidated_status) call Finalize (allocate_status) ! Verify guarantees - none. return end subroutine Convert_ELL_to_LAMG ])