Output has NAN value in fortran

Viewed 45

i have a problem in runtime program that generating NAN value. After i traced back the script i found the root is in STG variables, to be more specific in the ( stg(:,:) / stg (1,i) ). i wrote the code in Fortran90 format.

Here is the code

SUBROUTINE HALBAN(STG, GLO, GDI, NDOM, NDOS, MBA, MBAC, ISOL)
IMPLICIT NONE

! INPUT OUTPUT VARIABLE
INTEGER, INTENT(IN) :: NDOM ,MBA ,MBAC ,ISOL ,NDOS
REAL(KIND=8), DIMENSION(NDOM,MBAC), INTENT(INOUT):: STG
REAL(KIND=8),DIMENSION(NDOS), INTENT(INOUT) :: GLO
REAL(KIND=8),DIMENSION(NDOS), INTENT(INOUT) :: GDI

! LOCAL VARIABLE
INTEGER :: NDOM1 ,I ,JT ,JB ,KL ,KR ,K ,J ,II
REAL(KIND=8) :: SUM

!MULTI DEGREES OF FREEDOM

NDOM1 = NDOM - 1

GO TO (10 ,50 ,10) ,ISOL

!TRIANGULATION AND SOLUTION
10 CONTINUE

PRINT*, "NDOM :"  !CHECK NDOM
PRINT*, NDOM
PRINT*, 'MBAC' !CHECK MBA
PRINT*, MBAC
PRINT*, 'NDOS' !CHECK NDOS
PRINT*, NDOS

 PRINT*, 'CHECK STG'
 DO I = 1,MBAC
 PRINT*, STG(:,I)
 END DO

DO I=1 ,NDOM1
    !UPPER TRIANGULATION OF STIFFNESS MATRIX, ESTABLISH TRIANGULATION LIMITS
    JT = I + 1
    JB = I + MBA
    IF(JB.GT.NDOM) JB = NDOM
    
    !COLUMN OPERATION
    DO J = JT, JB
        KL = J
        KR = I + MBA
        IF(KR.GT.NDOM) KR = NDOM
        DO K = KL ,KR
            STG(J ,K-J+1) = STG(J ,K-J+1) - STG(I ,J-I+1) * STG(I ,K-I+1) / STG(I ,1)
            !STG(J ,K-J+1) =   STG(I ,1)
        END DO
    END DO
END DO

PRINT*,'----------'
!CHECKING STG TRIAL 1
PRINT*,'CHECK STG(I ,1)'
DO I = 1, MBAC
    PRINT*, STG(:,I)
END DO

IF(ISOL.EQ.1) GO TO 110

!REDUCTION OF GLOBAL LOAD VECTOR
50 CONTINUE

DO I=1 ,NDOM1
    
    !ESTABLISH REDUCTION LIMITS
    JT = I + 1
    JB = I + MBA
    IF(JB.GT.NDOM) JB = NDOM
    
    !LOWER ROW OPERATION
    DO J=JT ,JB
        ! PRINT*, '(J)', J
        ! PRINT*, 'GLO(J)', GLO(J)
        ! PRINT*, 'GLO(I)', GLO(I)
        ! PRINT*, 'STG(I ,J-I+1)', STG(I ,J-I+1)
        ! PRINT*, 'STG(I ,1)', STG(I ,1)
        GLO(J) = GLO(J) - GLO(I) * STG(I ,J-I+1) / STG(I ,1)
        ! IF (GLO(J).LT.1.D-10) GLO(J) = 0.D0
        ! PRINT*, 'GLO(J)', GLO(J)
    END DO
END DO

!CHECK GLO
PRINT*,'CHECKING GLO'
DO I = 1, NDOS
PRINT*, GLO(I)
END DO

!COMPUTE DISPLACEMENT
DO II=1 ,NDOM
    
    !ESTABLISH REDUCTION LIMITS
    I   = NDOM - II + 1
    SUM = GLO(I)
    JT  = I + 1
    JB = I + MBA
    IF(JT.GT.NDOM) JT = NDOM
    IF(JB.GT.NDOM) JB = NDOM
    
    IF(I.EQ.NDOM) GO TO 90
    
    !BACK SUBSTITUTION
    DO J = JT ,JB
    !    PRINT*, 'J', J
    !    PRINT*, 'STG(I ,J-I+1)', STG(I ,J-I+1)
    !    PRINT*, 'GDI(J)', GDI(J)
        SUM = SUM - STG(I ,J-I+1) * GDI(J)
    END DO
    90 CONTINUE
    !    PRINT*, 'GLO(I)', GLO(I) !Check GLO value
    !   PRINT*, 'SUM', SUM !Check Sum Value
    !   PRINT*, 'STG(I,1)', STG(I,1) !Check STG Value
    GDI(I) = SUM / STG(I,1)
    !   IF (GDI(I).LT.1.D-19) GDI(I) = 0.D0
END DO

110 CONTINUE
PRINT*, 'GLO' !Check GLO Value
PRINT*, GLO !Check GLO Value
! PRINT*, 'GDI'
! PRINT*, GDI
RETURN
END SUBROUTINE

The problems start from here

STG(J ,K-J+1) = STG(J ,K-J+1) - STG(I ,J-I+1) * STG(I ,K-I+1) / STG(I ,1)

the dividing operations to be exact

My question is, how do i get over this problem and generated the true value? to be precise, how do i fix the NAN stuff?

0 Answers
Related