C ACLJ      SOURCE    MB234859  26/01/22    21:15:05     12459          

        SUBROUTINE ACLJ    (WRK52, WRK53, WRK54,NVARI,IECOU)
        IMPLICIT REAL*8(a-H, o-Z)
        IMPLICIT INTEGER (i-N)
         

-INC PPARAM
-INC CCOPTIO 
-INC SMEVOLL 
-INC SMLREEL 
-INC DECHE

C  'Cont: Initial stress'
        CONT = SIG0(1)
C  'Normal stresses'
        CON2 = SIG0(2)
        CON3 = SIG0(3) 

C  'Gliss: Initial slip'
        GLISS = EPST0(1)
C  'EPSI 1-2: Initial normal disp'
        EPSI2 = EPST0(2) 
        EPSI3 = EPST0(3)

C  'DGLIS: imposed disp in tangent'
        DGLIS = DEPST(1)
C  'DEPS 2-3: imposed disp in normals'
        DEPS2 = DEPST(2)
        DEPS3 = DEPST(3)

C  'GMAXP: Max slip in + direction'
C  'GMAXN: Max slip in - direction'
C  'CMAXP: Stress at GMAXP'
C  'CMAXN: Stress at GMAXN'
        GMAXP = VAR0(1)
        GMAXN = VAR0(2)
        CMAXP = VAR0(3)
        CMAXN = VAR0(4)

        MEVOLL = INT(VALMAT(3))
        SEGACT MEVOLL
        KEVOLL = IEVOLL(1)
        SEGACT KEVOLL

C  'ADHENSION LAW'
        MLREE1 = IPROGX
        MLREE2 = IPROGY
        SEGACT MLREE1, MLREE2

C  'GLISSEMENTS/DEPLACEMENTS'
C  'GTOT: Final slip'
        GTOT = GLISS + DGLIS
C  'GABS: Absolute value of GTOT'
        GABS = ABS(GTOT)
C  'EPSN1-2: Final disp in normal directions'
        EPSN1 = EPSI2 + DEPS2
        EPSN2 = EPSI3 + DEPS3
C  'CP1 = Last stress value of adhesion graph'        
        CP1 = MLREE2.PROG(MLREE2.PROG(/1))
        CN1 = (-1.D0)*CP1
C  'GP1 = Second disp value of adhesion graph'
        GP1 = MLREE1.PROG(2)
        GN1 = (-1.D0)*GP1
        CCP1 = MLREE2.PROG(2)
        CCN1 = (-1.D0)*CCP1
C  'Difference between fist 2 points in adhesion graph'
C  'GP2 = Difference of displacement'
C  'CP2 = Difference of stress'
C  'TAN0 = Tangent of elastic part'
        GP2 = MLREE1.PROG(2) - MLREE1.PROG(1)
        CP2 = MLREE2.PROG(2) - MLREE2.PROG(1)
        TAN0 = CP2/GP2

        DO I = 2, MLREE1.PROG(/1)
        C1 = MLREE2.PROG(I-1)
                IF (CP1.GT.C1) THEN
                G1 = MLREE1.PROG(I-1)
                G2 = MLREE1.PROG(I)
                C1 = MLREE2.PROG(I-1)
                C2 = MLREE2.PROG(I)
                TAN1 = (G2-G1)/(C2-C1)
                GGP1 = G1+(CP1-C1)*TAN1
                GGN1 = (-1.D0)*GGP1 
                END IF
        END DO      

        GLIM1 = GLISS-(CONT+CP1)/TAN0
        GLIM2 = GLISS+(CP1-CONT)/TAN0  
    
        GLIM1 = MIN(GLIM1,GLIM2)
        GLIM2 = MAX(GLIM1,GLIM2)

        GLIMP1 = GMAXP-(CP1+CMAXP)/TAN0 
        GLIMP2 = GMAXP+(CP1-CMAXP)/TAN0

        GLIMN1 = GMAXN-(CP1+CMAXN)/TAN0
        GLIMN2 = GMAXN+(CP1-CMAXN)/TAN0

        IF (DGLIS.GE.0.D0) THEN
c        WRITE(6,*) 'LOADING'
                IF (GTOT.GE.GMAXP) THEN
c        WRITE(6,*) 'Case 10:Monotonic Loading in Plastic Region'
                INDC = 10
                ELSE IF (GTOT.LE.GMAXP) THEN
                     IF (GTOT.GE.GLISS.AND.GTOT.LE.GLIM2) THEN
c                     WRITE(6,*) 'Case 1' 
                     INDC = 1
                     ELSE IF (GTOT.GT.GLIM2.AND.GTOT.LT.GLIMP2) THEN
c                     WRITE(6,*) 'Case 3'
                     INDC = 3
                     ELSE IF (GTOT.GE.GLIMP2.AND.GTOT.LE.GMAXP) THEN
c                     WRITE(6,*) 'Case 5'
                     INDC = 5
                     END IF
                END IF
        ELSE IF (DGLIS.LE.0.D0)THEN
c        WRITE(6,*) 'UNLOADING'
                IF (GTOT.LE.GMAXN) THEN 
c        WRITE(6,*) 'Case 20:Monotonic Unloading in Plastic Region'
                INDC = 20
                ELSE IF (GTOT.GE.GMAXN) THEN
                     IF (GTOT.GE.GLIM1.AND.GTOT.LE.GLISS) THEN 
c                     WRITE(6,*) 'Case 2'
                     INDC = 2
                     ELSE IF (GTOT.GT.GLIMN1.AND.GTOT.LT.GLIM1) THEN
c                     WRITE(6,*) 'Case 4'
                     INDC = 4
                     ELSE IF (GTOT.LE.GLIMN1.AND.GTOT.GE.GMAXN) THEN
c                     WRITE(6,*) 'Case 6' 
                     INDC = 6
                     END IF 
                END IF 
        END IF 

        IF (INDC.EQ.1) THEN
                TAN1 = TAN0
                CTOT = CONT+(GTOT-GLISS)*TAN1
                GMAXPF = GMAXP
                GMAXNF = GMAXN
                CMAXPF = CMAXP
                CMAXNF = CMAXN  
        ELSE IF (INDC.EQ.2) THEN
                TAN1 = TAN0
                CTOT = CONT+(GTOT-GLISS)*TAN1
                GMAXPF = GMAXP
                GMAXNF = GMAXN
                CMAXPF = CMAXP
                CMAXNF = CMAXN  
        ELSE IF (INDC.EQ.3) THEN
                TAN1 = 0.D0
                CTOT = CP1
                GMAXP = MAX(GGP1,GMAXP)
                GMAXPF = GMAXP
                GMAXNF = GMAXN
                CMAXPF = CMAXP
                CMAXNF = CMAXN  
        ELSE IF (INDC.EQ.4) THEN 
                TAN1 = 0.D0
                CTOT = CN1
                GMAXN = MIN(GGN1,GMAXN)
                GMAXPF = GMAXP
                GMAXNF = GMAXN
                CMAXPF = CMAXP
                CMAXNF = CMAXN  
        ELSE IF (INDC.EQ.5) THEN                
                TAN1 = TAN0
                CTOT = CP1+(GTOT-GLIMP2)*TAN1
                GMAXPF = GMAXP
                GMAXNF = GMAXN
                CMAXPF = CMAXP
                CMAXNF = CMAXN  
        ELSE IF (INDC.EQ.6) THEN
                TAN1 = TAN0
                CTOT = CN1+(GTOT-GLIMN1)*TAN1
                GMAXPF = GMAXP
                GMAXNF = GMAXN
                CMAXPF = CMAXP
                CMAXNF = CMAXN        
        ELSE IF (INDC.EQ.10.) THEN
            DO I = 2, MLREE1.PROG(/1)
                G1 = MLREE1.PROG(I-1)
                G2 = MLREE1.PROG(I)
                IF (GTOT.LE.G2.AND.GTOT.GE.G1) THEN
                G1 = MLREE1.PROG(I-1)
                G2 = MLREE1.PROG(I)
                C1 = MLREE2.PROG(I-1)
                C2 = MLREE2.PROG(I)
                TAN1 = (C2-C1)/(G2-G1)
                CTOT = C1+(GTOT-G1)*TAN1
                GMAXPF = GTOT
                GMAXNF = GMAXN
                CMAXPF = CTOT
                CMAXNF = CMAXN
                END IF
            END DO
        ELSE IF (INDC.EQ.20.) THEN
            DO I = 2, MLREE1.PROG(/1)
                G1 = MLREE1.PROG(I-1) 
                G2 = MLREE1.PROG(I)
                IF (GABS.LE.G2.AND.GABS.GE.G1) THEN
                G1 = (-1.D0)*MLREE1.PROG(I-1)
                G2 = (-1.D0)*MLREE1.PROG(I)
                C1 = (-1.D0)*MLREE2.PROG(I-1)
                C2 = (-1.D0)*MLREE2.PROG(I)
                TAN1 = (C2-C1)/(G2-G1)
                CTOT = C1+(GTOT-G1)*TAN1
                GMAXPF = GMAXP
                GMAXNF = GTOT
                CMAXPF = CMAXP
                CMAXNF = CTOT        
                END IF
            END DO       
        END IF

        SIGF(1) = CTOT
        SIGF(2) = VALMAT(2)*EPSN1        
        SIGF(3) = VALMAT(2)*EPSN2
        VARF(1) = GMAXPF
        VARF(2) = GMAXNF
        VARF(3) = CMAXPF
        VARF(4) = CMAXNF
        VARF(5) = TAN1

c        WRITE(6,*) 'SIGF(1):', SIGF(1) 
c        WRITE(6,*) 'SIGF(2):', SIGF(2), 'SIGF(3):', SIGF(3)
c        WRITE(6,*) 'VALMAT2:', VALMAT(2), 'VALMAT3:', VALMAT(3)  
C        WRITE(6,*) 'EPSN1:',  EPSN1, 'EPSN2:', EPSN2 
c        WRITE(6,*) 'EPSI2', EPSI2, 'DEPS2', DEPS2
c        WRITE(6,*) 'EPSI3', EPSI3, 'DEPS3', DEPS3



*        WRITE(6,*) 'GLISS', GLISS, 'CONT', CONT
*        WRITE(6,*) 'GTOT', GTOT, 'CTOT', CTOT
*        WRITE(6,*) 'GMAXP', GMAXP, 'CMAXP', CMAXP
*        WRITE(6,*) 'GMAXPF', GMAXPF, 'CMAXPF', CMAXPF
*        WRITE(6,*) 'GMAXN', GMAXN, 'CMAXN', CMAXN
*        WRITE(6,*) 'GMAXNF', GMAXNF, 'CMAXNF', CMAXNF
         
        RETURN
        END 

 
 
 
 
