From f8cf61706c8f12edac0bf0e23205c6f7d6cf8953 Mon Sep 17 00:00:00 2001
From: Mohib <mohib.mustafa@gmail.com>
Date: Fri, 19 Apr 2024 09:32:42 +0200
Subject: [PATCH] [Refractor] - Numerical Tangent as an exteral function call

---
 .../FiniteStrain/Finite_VEVP/umat.f           | 220 ++++++++++++++----
 1 file changed, 172 insertions(+), 48 deletions(-)

diff --git a/MaterialModels/FiniteStrain/Finite_VEVP/umat.f b/MaterialModels/FiniteStrain/Finite_VEVP/umat.f
index 8ebe81a..dd24885 100644
--- a/MaterialModels/FiniteStrain/Finite_VEVP/umat.f
+++ b/MaterialModels/FiniteStrain/Finite_VEVP/umat.f
@@ -33,7 +33,7 @@ C     !--------------------------------------------------------------
 C     !                     UMAT SUBROUTINE
 C     !--------------------------------------------------------------
 
-      SUBROUTINE umat_vevp(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,
+      SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,
      1           RPL,DDSDDT,DRPLDE,DRPLDT,
      2           STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,
      3           DPRED,CMNAME,
@@ -42,24 +42,33 @@ C     !--------------------------------------------------------------
      6           CELENT,DFGRD0,DFGRD1,NOEL,NPT,
      7           LAYER,KSPT,KSTEP,KINC)
 
-C      INCLUDE 'ABA_PARAM.INC'
+      INCLUDE 'ABA_PARAM.INC'
 
       CHARACTER*80 CMNAME
       REAL*8 STRESS(NTENS),STATEV(NSTATV),
      1     DDSDDE(NTENS,NTENS),DDSDDT(NTENS),DRPLDE(NTENS),
      2     STRAN(NTENS),DSTRAN(NTENS),TIME(2),PREDEF(1),DPRED(1),
-     3     PROPS(NPROPS),DFGRD0(3,3), DFGRD1(3,3)
+     3     PROPS(NPROPS), COORDS(3),DROT(3,3),DFGRD0(3,3),
+     4     DFGRD1(3,3)
      
       REAL*8 SSE, SPD, SCD, RPL, DTIME, TEMP, CELENT, DRPLDT
       REAL*8 PNEWDT, DTEMP, R, dR, ddR
+
+      IF (PROPS(1) .GT. 2.D0) THEN
       
-      call VEVP(STRESS,STATEV,DDSDDE,STRAN,NTENS,NSTATV,PROPS,
+        call VEVP(STRESS,STATEV,DDSDDE,STRAN,NTENS,NSTATV,PROPS,
      &         NPROPS,DTIME,DSTRAN,KINC,KSTEP,NOEL,DFGRD0,DFGRD1,
      &         PNEWDT)
 
-      return
-      end
+        return
+
+      ELSE
+        call NEOHOOK(STRESS,STATEV,DDSDDE,STRAN,NTENS,NSTATV,PROPS,
+     &         NPROPS,DTIME,DSTRAN,KINC,KSTEP,NOEL,DFGRD0,DFGRD1)
+        return
 
+      END IF
+      end
 
 
 C     !--------------------------------------------------------------
@@ -83,7 +92,7 @@ C     !--------------------------------------------------------------
          REAL(prec), INTENT(IN)   :: DFGRD0(3,3), DFGRD1(3,3)
          REAL(prec), INTENT(INOUT) :: statev(nstatv)
          REAL(prec), INTENT(OUT)   :: stress(ntens)
-         REAL(prec), INTENT(OUT)   :: ddsdde(ntens,ntens), PNEWDT    
+         REAL(prec), INTENT(OUT)   :: ddsdde(ntens,ntens), PNEWDT   
 
          !Declaration of local variables
          INTEGER    :: ii, jj, O6, order
@@ -101,7 +110,8 @@ C     !--------------------------------------------------------------
          ! VE  trial variables
          REAL(prec) :: F_ve_tr(3, 3), C_ve_tr(3, 3), D_ve_tr(3, 3)
          REAL(prec) :: E_ve_tr(3, 3), dlogC_ve_tr(3,3,3,3)
-         REAL(prec) :: ddlogC_ve_tr(3,3,3,3,3,3), AA_tr(8,3,3)
+         !REAL(prec) :: ddlogC_ve_tr(3,3,3,3,3,3)
+         REAL(prec) :: AA_tr(8,3,3)
          REAL(prec) :: BB_tr(8),GGe, KKe, kappa_tr(3, 3), S_tr(3, 3)
          REAL(prec) :: temp1(3,3), tau_tr(3, 3)
          ! Variables for trial yield
@@ -111,7 +121,7 @@ C     !--------------------------------------------------------------
          REAL(prec) :: F_hat(6, 3, 3), J, F_ve_tr_hat(6, 3, 3)
          REAL(prec) :: C_ve_tr_hat(6, 3, 3), D_ve_tr_hat(6,3,3)
          REAL(prec) :: E_ve_tr_hat(6,3,3), dlogC_ve_tr_hat(6,3,3,3,3)
-         REAL(prec) :: ddlogC_ve_tr_hat(6,3,3,3,3,3,3)
+         !REAL(prec) :: ddlogC_ve_tr_hat(6,3,3,3,3,3,3)
          REAL(prec) :: AA_tr_hat(6,8,3,3)
          REAL(prec) :: BB_tr_hat(6, 8), GGe_hat(6), KKe_hat(6)
          REAL(prec) :: kappa_tr_hat(6, 3, 3), S_tr_hat(6, 3, 3)
@@ -124,7 +134,8 @@ C     !--------------------------------------------------------------
          REAL(prec) :: exp_GQ(3, 3), F_vp(3,3), F_vp_inv(3,3)
          ! VE corrected variables
          REAL(prec) :: F_ve(3, 3), C_ve(3, 3), D_ve(3, 3), E_ve(3, 3)
-         REAL(prec) :: dlogC_ve(3,3,3,3), ddlogC_ve(3,3,3,3,3,3)
+         REAL(prec) :: dlogC_ve(3,3,3,3)
+         !REAL(prec) :: ddlogC_ve(3,3,3,3,3,3)
          REAL(prec) :: AA(8,3,3), BB(8), kappa(3, 3), b(3, 3)
          REAL(prec) :: S(3, 3), temp2(3, 3), tau(3, 3)
          ! VP variables perturbated
@@ -143,14 +154,15 @@ C     !--------------------------------------------------------------
          REAL(prec) :: F_ve_hat(6,3,3), C_ve_hat(6,3,3)
          REAL(prec) :: D_ve_hat(6,3,3), E_ve_hat(6,3,3)
          REAL(prec) :: dlogC_ve_hat(6,3,3,3,3)
-         REAL(prec) :: ddlogC_ve_hat(6,3,3,3,3,3,3), AA_hat(6,8,3,3)
+         REAL(prec) ::  AA_hat(6,8,3,3)
+         !REAL(prec) :: ddlogC_ve_hat(6,3,3,3,3,3,3)
          REAL(prec) :: BB_hat(6,8), kappa_hat(6,3,3), S_hat(6,3,3)
          REAL(prec) :: temp2_hat(6,3,3), tau_hat(6,3,3)
          REAL(prec) :: tau_hat_v(6,6)
 
         ! Tollerances
-         REAL(prec), PARAMETER :: TOLL=0.001D0, TOLL_G=0.999D-11
-         INTEGER, PARAMETER :: MAX_i=500
+         REAL(prec), PARAMETER :: TOLL=0.0001D0, TOLL_G=0.999D-6
+         INTEGER, PARAMETER :: MAX_i=100
 
         !Define 2nd order identity tensor
          data I_mat(1,:) /1.D0, 0.D0, 0.D0/
@@ -161,11 +173,11 @@ C     !--------------------------------------------------------------
         ! for the first time step (initial condition) in FFTMAD.
         ! Can be commented out for ABAQUS, If you comment out, then
         ! in abaqus use the inp file to set initial values for F_vp.
-C         IF ((KINC .EQ. 1) .AND. (KSTEP .EQ. 1)) THEN
-C          STATEV(1) = 1.D0
-C          STATEV(2) = 1.D0
-C          STATEV(3) = 1.D0
-C         END IF
+         IF ((KINC .EQ. 1) .AND. (KSTEP .EQ. 1)) THEN
+          STATEV(1) = 1.D0
+          STATEV(2) = 1.D0
+          STATEV(3) = 1.D0
+         END IF
 
          ! State variables at previous time step
          CALL voit2mat(STATEV(1:9), F_vp_n(:,:))
@@ -255,7 +267,7 @@ C         END IF
          ! Approximate VE log Strain (power series) at trial state 
          D_ve_tr(:,:) = C_ve_tr(:, :) - I_mat(:,:)
          CALL approx_log(D_ve_tr(:,:), order, E_ve_tr(:, :),
-     1               dlogC_ve_tr(:,:,:,:), ddlogC_ve_tr(:,:,:,:,:,:))
+     1               dlogC_ve_tr(:,:,:,:))
          E_ve_tr(:, :) = 0.5D0 * E_ve_tr(:, :)
 
          ! Calculate the corotated kirchoff stress at trial state along 
@@ -296,8 +308,7 @@ C         END IF
             ! Approximate VE log Strain at trial state 
             D_ve_tr_hat(O6, :,:) = C_ve_tr_hat(O6, :, :) - I_mat(:,:)
             CALL approx_log(D_ve_tr_hat(O6, :,:), order,
-     1        E_ve_tr_hat(O6, :, :), dlogC_ve_tr_hat(O6,:,:,:,:),
-     2        ddlogC_ve_tr_hat(O6,:,:,:,:,:,:))
+     1        E_ve_tr_hat(O6, :, :), dlogC_ve_tr_hat(O6,:,:,:,:))
             E_ve_tr_hat(O6,:, :) = 0.5D0 * E_ve_tr_hat(O6, :, :)
 
             ! Calculate the corotated kirchoff stress at trial state
@@ -375,7 +386,7 @@ C         END IF
           DO ii = 1, 6
             DO jj = 1, 6
               DDSDDE(ii, jj) = (1.D0 / (J * TOLL))
-     1                     *  (tau_tr_hat_v(jj, ii) - J*STRESS(ii)) 
+     1                     *  (tau_tr_hat_v(jj, ii) - J*STRESS(ii))
             END DO
           END DO
 
@@ -400,14 +411,14 @@ C         END IF
           GQ(:,:) = GAMMA * Q(:,:)
           CALL approx_exp(GQ(:,:), order, exp_GQ(:,:))
           CALL mat2dot(exp_GQ(:,:), F_vp_n(:,:), F_vp(:,:))
-          CALL matInv(F_vp(:,:), F_vp_inv(:,:))
+          CALL matInverse(F_vp(:,:), F_vp_inv(:,:))
           CALL mat2dot(DFGRD1(:,:), F_vp_inv(:,:), F_ve(:, :))
           CALL mat2Tdot(F_ve(:,:), F_ve(:,:), C_ve(:,:))
 
           ! Approximate VE log Strain (power series) at the corrected state
           D_ve(:,:) = C_ve(:, :) - I_mat(:,:)
           CALL approx_log(D_ve(:,:), order, E_ve(:, :),
-     1                     dlogC_ve(:,:,:,:), ddlogC_ve(:,:,:,:,:,:))
+     1                     dlogC_ve(:,:,:,:))
           E_ve(:, :) = 0.5D0 * E_ve(:, :)
 
           ! Calculate the corotated kirchoff stress at corrected state along 
@@ -513,7 +524,7 @@ C         END IF
           CALL approx_exp(GQ_hat(O6,:,:), order, exp_GQ_hat(O6,:,:))
           CALL mat2dot(exp_GQ_hat(O6, :,:), F_vp_n(:,:),
      1                  F_vp_hat(O6,:,:))
-          CALL matInv(F_vp_hat(O6,:,:), F_vp_inv_hat(O6,:,:))
+          CALL matInverse(F_vp_hat(O6,:,:), F_vp_inv_hat(O6,:,:))
           CALL mat2dot(F_hat(O6, :,:), F_vp_inv_hat(O6,:,:),
      1      F_ve_hat(O6, :, :))
           CALL mat2Tdot(F_ve_hat(O6,:,:), F_ve_hat(O6,:,:),
@@ -523,8 +534,7 @@ C         END IF
           ! Approximate VE log Strain (power series) at the purturbated state
           D_ve_hat(O6,:,:) = C_ve_hat(O6,:, :) - I_mat(:,:)
           CALL approx_log(D_ve_hat(O6,:,:), order, E_ve_hat(O6,:, :),
-     1                     dlogC_ve_hat(O6,:,:,:,:),
-     2                ddlogC_ve_hat(O6,:,:,:,:,:,:))
+     1                     dlogC_ve_hat(O6,:,:,:,:))
           E_ve_hat(O6,:, :) = 0.5D0 * E_ve_hat(O6,:, :)
 
           ! Calculate the corotated kirchoff stress at purturbed state along 
@@ -570,6 +580,119 @@ C         END IF
           RETURN
        END SUBROUTINE VEVP
 
+C     !--------------------------------------------------------------
+C     !   UMAT SUBROUTINE FOR ISOTROPIC NEO HOOKIAN MATERIAL MODEL
+C     !--------------------------------------------------------------
+
+      SUBROUTINE NEOHOOK(STRESS,STATEV,DDSDDE,STRAN,NTENS,NSTATV,
+     1   PROPS,NPROPS,DTIME,DSTRAN,KINC,KSTEP,NOEL,DFGRD0,DFGRD1)
+
+
+        IMPLICIT NONE
+
+        INTEGER, PARAMETER :: double=kind(1.d0)
+        INTEGER, PARAMETER :: prec=double
+       
+        INTEGER, INTENT(IN)      :: ntens,nprops,nstatv
+        INTEGER, INTENT(IN)      :: kinc,kstep,noel
+        REAL(prec), INTENT(IN)   :: stran(ntens), dstran(ntens)
+        REAL(prec), INTENT(IN)   :: props(nprops), dtime
+        REAL(prec), INTENT(IN)   :: DFGRD0(3,3), DFGRD1(3,3)
+        REAL(prec), INTENT(INOUT) :: statev(nstatv)
+        REAL(prec), INTENT(OUT)   :: stress(ntens)
+        REAL(prec), INTENT(OUT)   :: ddsdde(ntens,ntens)
+
+        !List of internal variables
+        INTEGER    :: ii, jj, mm, K1, ll, m2v(3, 3)
+        REAL(prec) :: I(6), B(6), B_bar(6), dev_B_bar(6)
+        REAL(prec) :: F_inv(3, 3)
+        REAL(prec) :: J, I_bar, fac1, fac2, fac3, fac4, cE, cnu
+        
+        !Decleration of constants
+        REAL(prec), PARAMETER :: ZERO=0.D0, ONE=1.D0, TWO=2.D0
+        REAL(prec), PARAMETER :: THREE=3.D0, FOUR= 4.D0, SIX=6.D0
+        REAL(prec), PARAMETER :: NINE=9.D0
+
+
+        !Declare matrix to voit mapping
+        data m2v/ 1, 4, 5,
+     1            4, 2, 6,
+     2            5, 6, 3/
+
+        !2nd Order Identity
+        data I/ ONE, ONE, ONE, ZERO, ZERO, ZERO/
+                   
+        !Get material properties
+        cE=PROPS(1)
+        cnu=PROPS(2)
+
+        !Calculate determinant of deformation gradient
+        CALL determinant(DFGRD1(:,:), J)
+
+        !Calculate inverse of deformation gradient
+        CALL matInverse(DFGRD1(:,:), F_inv(:, :))
+
+        !Calculate finger tensor B
+        B(:) = ZERO
+        DO K1 = 1, 3
+          DO ii = 1, 3
+            DO jj = 1, 3
+              IF (ii .EQ. jj) THEN
+                B(m2v(ii, jj)) = B(m2v(ii, jj)) +  DFGRD1(ii, K1) 
+     1                         * DFGRD1(jj, K1)
+              ELSE
+                B(m2v(ii, jj)) = B(m2v(ii, jj)) + 0.5d0 
+     1                         * DFGRD1(ii, K1) * DFGRD1(jj, K1)
+              END IF
+            END DO
+         END DO
+        END DO
+
+        B_bar(:) = B(:) *  J ** (-TWO / THREE)
+        I_bar = B_bar(1) + B_bar(2) + B_bar(3)
+        dev_B_bar(:) = B_bar(:) - (ONE / THREE) * I_bar * I(:)
+
+        !Return Cauchy stress to Abaqus
+        STRESS(:) = 2 * cE * (J - ONE) * J * I(:)
+     1          + 2 * cnu * dev_B_bar(:)
+
+        !Algorithmic constants for the Tangent
+        fac1 = -(FOUR / THREE) * cnu * J ** (-ONE)
+        fac2 = -(TWO * cE * (J - ONE) * J 
+     1       - (TWO/THREE) * cnu * I_bar) * J ** (-ONE)
+        fac3 =  (TWO * cE * (J - ONE) * J 
+     1       + (FOUR / NINE) * cnu * I_bar + TWO * cE * J ** TWO) 
+     2       * J ** (-ONE)
+        fac4 = TWO * cnu * J ** (-ONE)
+
+        !Tangent for ABAQUS
+        DDSDDE(:,:) = ZERO
+        DO ii = 1, 3
+          DO jj = 1, 3
+            DO ll = 1, 3
+              DO mm = 1, 3
+                DDSDDE(m2v(ii, jj), m2v(ll, mm)) = 
+     1            DDSDDE(m2v(ii, jj), m2v(ll, mm))
+     2            + fac1 * (B_bar(m2v(ii, jj)) * I(m2v(ll, mm)) 
+     3            + I(m2v(ii, jj)) * B_bar(m2v(ll, mm)))
+     4            + (fac4 - TWO * cnu * J**(-ONE)) 
+     5            * B_bar(m2v(ii, ll)) * I(m2v(jj, mm))
+     6            + TWO * cnu * (dev_B_bar(m2v(ii, ll)) 
+     7            * I(m2v(jj, mm)) 
+     8            + I(m2v(ii, ll)) * dev_B_bar(m2v(jj, mm)))
+     9            + fac2 * I(m2v(ii, mm)) * I(m2v(ll, jj))
+     1            + fac3 * I(m2v(ii, jj)) * I(m2v(ll, mm))
+     2            + (fac2 + FOUR * cE * (J - ONE)) 
+     3            * I(m2v(ii, ll)) * I(m2v(jj, mm))
+              END DO
+            END DO
+          END DO
+        END DO
+
+
+      RETURN
+      END SUBROUTINE NEOHOOK
+
       !--------------------------------------------------------------
       !     Helper function to convert a voit array to matrix 
       !--------------------------------------------------------------
@@ -643,7 +766,7 @@ C         END IF
       !--------------------------------------------------------------
       !      Helper function to compute inverse of 3x3 matrix
       !--------------------------------------------------------------
-      SUBROUTINE matInv(matrix, inv)
+      SUBROUTINE matInverse(matrix, inv)
         IMPLICIT NONE
         
         INTEGER, PARAMETER :: double=kind(1.d0)
@@ -668,7 +791,7 @@ C         END IF
         inv(:, :) = inv(:, :)/ J
 
         RETURN
-      END SUBROUTINE matInv
+      END SUBROUTINE matInverse
 
       
       !------------------------------------------------------------
@@ -843,7 +966,7 @@ C         END IF
 
 
         ! Compute inverse of int variable F_vp
-        CALL matInv(F_vp(:, :), F_vp_inv(:, :))
+        CALL matInverse(F_vp(:, :), F_vp_inv(:, :))
 
         ! Compute F_ve
         CALL mat2dot(F(:, :), F_vp_inv(:, :), F_ve(:, :))
@@ -929,7 +1052,7 @@ C         END IF
       !      Power series approximation
       !--------------------------------------------------------------
 
-      SUBROUTINE approx_log(AA, order, logAA, dlogAA, ddlogAA)
+      SUBROUTINE approx_log(AA, order, logAA, dlogAA)!, ddlogAA)
         IMPLICIT NONE
         INTEGER, PARAMETER :: double=kind(1.d0)
         INTEGER, PARAMETER :: prec=double
@@ -937,13 +1060,14 @@ C         END IF
         INTEGER, INTENT(IN)      :: order
         REAL(prec), INTENT(IN)   :: AA(3, 3)
         REAL(prec), INTENT(OUT)  :: logAA(3, 3), dlogAA(3, 3, 3, 3)
-        REAL(prec), INTENT(OUT)  :: ddlogAA(3, 3, 3, 3, 3, 3)
+        !REAL(prec), INTENT(OUT)  :: ddlogAA(3, 3, 3, 3, 3, 3)
 
         ! List of internal variables
-        INTEGER    :: ii, jj, nn, mm, ll, rr, ss, pp, qq
+        INTEGER    :: ii, jj, nn, mm, ll, rr, ss
         REAL(prec) :: coeffs(order + 1), I_mat(3, 3)
         REAL(prec) :: FF(3, 3), dFF(3, 3, 3, 3)
-        REAL(prec) :: ddFF(3, 3, 3, 3, 3, 3), II_mat(3, 3, 3, 3)
+        !REAL(prec) :: ddFF(3, 3, 3, 3, 3, 3)
+        REAL(prec) :: II_mat(3, 3, 3, 3)
         REAL(prec) :: temp1(3, 3, 3, 3), temp2(3, 3, 3, 3)
 
         ! Define 2nd order identity tensor
@@ -990,12 +1114,12 @@ C         END IF
         END DO
 
         dlogAA(:, :, :, :) = 0.D0
-        ddlogAA(:, :, :, :, :, :) = 0.D0
+        !ddlogAA(:, :, :, :, :, :) = 0.D0
 
         DO ii = 1, order
         FF(:, :) = 0.D0
         dFF(:, :, :, :) = 0.D0
-        ddFF(:, :, :, :, :, :) = 0.D0
+        !ddFF(:, :, :, :, :, :) = 0.D0
 
         nn = order + 1 - ii
 
@@ -1012,14 +1136,14 @@ C         END IF
      1             + dlogAA(jj, ll, rr, ss) * AA(ll, mm) 
      2             + logAA(jj, ll) * II_mat(ll, mm, rr, ss)
                   
-                  DO pp = 1, 3
-                    DO qq = 1, 3
-            ddFF(jj, mm, rr, ss, pp, qq) = ddFF(jj, mm, rr, ss, pp, qq)
-     1               + ddlogAA(jj, ll, rr, ss, pp, qq) * AA(ll, mm)
-     2               + dlogAA(jj, ll, rr, ss) * II_mat(ll, mm, pp, qq)
-     3               + dlogAA(jj, ll, pp, qq) * II_mat(ll, mm, rr, ss)
-                  END DO
-                END DO
+    !               DO pp = 1, 3
+    !                 DO qq = 1, 3
+    !     ddFF(jj, mm, rr, ss, pp, qq) = ddFF(jj, mm, rr, ss, pp, qq)
+    !  1             + ddlogAA(jj, ll, rr, ss, pp, qq) * AA(ll, mm)
+    !  2             + dlogAA(jj, ll, rr, ss) * II_mat(ll, mm, pp, qq)
+    !  3             + dlogAA(jj, ll, pp, qq) * II_mat(ll, mm, rr, ss)
+    !               END DO
+    !             END DO
               
               END DO
             END DO
@@ -1030,7 +1154,7 @@ C         END IF
         END DO
         logAA(:, :) = FF(:, :)
         dlogAA(:,:,:,:) = dFF(:,:,:,:)
-        ddlogAA(:,:,:,:,:,:) = ddFF(:, :, :, :, :, :)
+        !ddlogAA(:,:,:,:,:,:) = ddFF(:, :, :, :, :, :)
       END DO
 
       END SUBROUTINE approx_log
@@ -1399,8 +1523,8 @@ C         END IF
             gma_i = gma + Dgma
 
             ! Update hardening variables on gma_i
-            CALL hardn(PROPS, NPROPS, gma_0, gma_i, sigma_c, sigma_t,
-     1        HHc, HHt, HHb)
+            CALL hardn(PROPS, NPROPS, gma_0, gma_i, sigma_c,
+     1        sigma_t, HHc, HHt, HHb)
             ! Update Drucker Pragger coefficients along with ecc factor m
             CALL DPcoeff(alpha, sigma_c, sigma_t, m, a0, a1, a2)
 
@@ -1421,7 +1545,7 @@ C         END IF
           
 
           gma = gma_i
-          ! Debuging statements for N.R. Comment out for big sims
+          ! !Debuging statements for N.R. Comment out for big sims
           ! WRITE(*,*) "Iter : ", iter_G
           ! WRITE(*,*) "GAMMA : ", GAMMA
           ! WRITE(*,*) "RESI : ", ABS(F)
-- 
GitLab