The main documentation of the Set_0_Diagonal_to_1_ELL_Matrix Procedure contains additional explanation of this code listing.
subroutine Set_0_Diagonal_to_1_ELL_Matrix (ELLM) ! Use association information. use Caesar_Numbers_Module, only: zero, one ! Input variables - none. ! Input/Output variable. type(ELL_Matrix_type), intent(inout) :: ELLM ! Variable to be set. ! Internal variables. type(integer) :: Row ! Row number. type(integer) :: shift ! Index shift. !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Verify requirements. VERIFY(Valid_State(ELLM),5) ! ELLM is valid. ! Set the diagonal to unity if the equation is missing (row is all zero). shift = -First_PE(ELLM%Row_Structure) + 1 do Row = 1, Length_PE(ELLM%Row_Structure) if (ALL(ELLM%Values(Row,:) == zero) .AND. & ALL(ELLM%Columns(Row,:) == 0)) then ELLM%Values(Row,1) = one ELLM%Columns(Row,1) = Row - shift ! Must convert column number end if ! from local to global. end do ! Unset the updated? variables. call Set_Not_Up_to_Date (ELLM) ! Verify guarantees. VERIFY(Valid_State(ELLM),5) ! ELLM is still valid. return end subroutine Set_0_Diagonal_to_1_ELL_Matrix