UMAT-ABAQUS
A general framework to develop material models (UMAT) in ABAQUS
spectral.for
Go to the documentation of this file.
1  SUBROUTINE spectral(A,D,V)
2 C> EIGENVALUES AND EIGENVECTOR OF A 3X3 MATRIX
3 C THIS SUBROUTINE CALCULATES THE EIGENVALUES AND EIGENVECTORS OF
4 C A SYMMETRIC 3X3 MATRIX A.
5 C
6 C THE OUTPUT CONSISTS OF A VECTOR D CONTAINING THE THREE
7 C EIGENVALUES IN ASCENDING ORDER, AND A MATRIX V WHOSE
8 C COLUMNS CONTAIN THE CORRESPONDING EIGENVECTORS.
9 C
10  IMPLICIT NONE
11 C
12  INTEGER NP,NROT
13  parameter(np=3)
14 C
15  DOUBLE PRECISION D(3),V(3,3),A(3,3),E(3,3)
16 C
17  e = a
18 C
19  CALL jacobi(e,3,np,d,v,nrot)
20  CALL eigsrt(d,v,3,np)
21 C
22  RETURN
23  END SUBROUTINE spectral
24 
25 C***********************************************************************
26 
27  SUBROUTINE jacobi(A,N,NP,D,V,NROT)
28 C
29 C COMPUTES ALL EIGENVALUES AND EIGENVECTORS OF A REAL SYMMETRIC
30 C MATRIX A, WHICH IS OF SIZE N BY N, STORED IN A PHYSICAL
31 C NP BY NP ARRAY. ON OUTPUT, ELEMENTS OF A ABOVE THE DIAGONAL
32 C ARE DESTROYED, BUT THE DIAGONAL AND SUB-DIAGONAL ARE UNCHANGED
33 C AND GIVE FULL INFORMATION ABOUT THE ORIGINAL SYMMETRIC MATRIX.
34 C VECTOR D RETURNS THE EIGENVALUES OF A IN ITS FIRST N ELEMENTS.
35 C V IS A MATRIX WITH THE SAME LOGICAL AND PHYSICAL DIMENSIONS AS
36 C A WHOSE COLUMNS CONTAIN, UPON OUTPUT, THE NORMALIZED
37 C EIGENVECTORS OF A. NROT RETURNS THE NUMBER OF JACOBI ROTATION
38 C WHICH WERE REQUIRED.
39 C
40 C THIS SUBROUTINE IS TAKEN FROM 'NUMERICAL RECIPES.'
41 C
42  IMPLICIT NONE
43  include 'PARAM_UMAT.INC'
44 C
45  INTEGER IP,IQ,N,NMAX,NP,NROT,I,J
46  parameter(nmax=100)
47 C
48  DOUBLE PRECISION A(np,np),D(np),V(np,np),B(nmax),Z(nmax),
49  + sm,tresh,g,t,h,theta,s,c,tau
50 
51 
52 C INITIALIZE V TO THE IDENTITY MATRIX
53  DO i=1,3
54  v(i,i)=one
55  DO j=1,3
56  IF (i.NE.j)THEN
57  v(i,j)=zero
58  ENDIF
59  END DO
60  END DO
61 C INITIALIZE B AND D TO THE DIAGONAL OF A, AND Z TO ZERO.
62 C THE VECTOR Z WILL ACCUMULATE TERMS OF THE FORM T*A_PQ AS
63 C IN EQUATION (11.1.14)
64 C
65  DO ip = 1,n
66  b(ip) = a(ip,ip)
67  d(ip) = b(ip)
68  z(ip) = 0.d0
69  END DO
70 
71 
72 C BEGIN ITERATION
73 C
74  nrot = 0
75  DO i=1,50
76 C
77 C SUM OFF-DIAGONAL ELEMENTS
78 C
79  sm = 0.d0
80  DO ip=1,n-1
81  DO iq=ip+1,n
82  sm = sm + dabs(a(ip,iq))
83  END DO
84  END DO
85 C
86 C IF SM = 0., THEN RETURN. THIS IS THE NORMAL RETURN,
87 C WHICH RELIES ON QUADRATIC CONVERGENCE TO MACHINE
88 C UNDERFLOW.
89 C
90  IF (sm.EQ.0.d0) RETURN
91 C
92 C IN THE FIRST THREE SWEEPS CARRY OUT THE PQ ROTATION ONLY IF
93 C |A_PQ| > TRESH, WHERE TRESH IS SOME THRESHOLD VALUE,
94 C SEE EQUATION (11.1.25). THEREAFTER TRESH = 0.
95 C
96  IF (i.LT.4) THEN
97  tresh = 0.2d0*sm/n**2
98  ELSE
99  tresh = 0.d0
100  END IF
101 C
102  DO ip=1,n-1
103  DO iq=ip+1,n
104  g = 100.d0*dabs(a(ip,iq))
105 C
106 C AFTER FOUR SWEEPS, SKIP THE ROTATION IF THE
107 C OFF-DIAGONAL ELEMENT IS SMALL.
108 C
109  IF ((i.GT.4).AND.(dabs(d(ip))+g.EQ.dabs(d(ip)))
110  + .AND.(dabs(d(iq))+g.EQ.dabs(d(iq)))) THEN
111  a(ip,iq) = 0.d0
112  ELSE IF (dabs(a(ip,iq)).GT.tresh) THEN
113  h = d(iq) - d(ip)
114  IF (dabs(h)+g.EQ.dabs(h)) THEN
115 C
116 C T = 1./(2.*THETA), EQUATION (11.1.10)
117 C
118  t =a(ip,iq)/h
119  ELSE
120  theta = 0.5d0*h/a(ip,iq)
121  t =1.d0/(dabs(theta)+dsqrt(1.d0+theta**2.d0))
122  IF (theta.LT.0.d0) t = -t
123  END IF
124  c = 1.d0/dsqrt(1.d0 + t**2.d0)
125  s = t*c
126  tau = s/(1.d0 + c)
127  h = t*a(ip,iq)
128  z(ip) = z(ip) - h
129  z(iq) = z(iq) + h
130  d(ip) = d(ip) - h
131  d(iq) = d(iq) + h
132  a(ip,iq) = 0.d0
133 C
134 C CASE OF ROTATIONS 1 <= J < P
135 C
136  DO j=1,ip-1
137  g = a(j,ip)
138  h = a(j,iq)
139  a(j,ip) = g - s*(h + g*tau)
140  a(j,iq) = h + s*(g - h*tau)
141  END DO
142 C
143 C CASE OF ROTATIONS P < J < Q
144 C
145  DO j=ip+1,iq-1
146  g = a(ip,j)
147  h = a(j,iq)
148  a(ip,j) = g - s*(h + g*tau)
149  a(j,iq) = h + s*(g - h*tau)
150  END DO
151 C
152 C CASE OF ROTATIONS Q < J <= N
153 C
154  DO j=iq+1,n
155  g = a(ip,j)
156  h = a(iq,j)
157  a(ip,j) = g - s*(h + g*tau)
158  a(iq,j) = h + s*(g - h*tau)
159  END DO
160  DO j = 1,n
161  g = v(j,ip)
162  h = v(j,iq)
163  v(j,ip) = g - s*(h + g*tau)
164  v(j,iq) = h + s*(g - h*tau)
165  END DO
166  nrot = nrot + 1
167  END IF
168  END DO
169  END DO
170 C
171 C UPDATE D WITH THE SUM OF T*A_PQ, AND REINITIALIZE Z
172 C
173  DO ip=1,n
174  b(ip) = b(ip) + z(ip)
175  d(ip) = b(ip)
176  z(ip) = 0.d0
177  END DO
178  END DO
179 C
180 C IF THE ALGORITHM HAS REACHED THIS STAGE, THEN THERE
181 C ARE TOO MANY SWEEPS. PRINT A DIAGNOSTIC AND CUT THE
182 C TIME INCREMENT.
183 C
184  WRITE (*,'(/1X,A/)') '50 ITERATIONS IN JACOBI SHOULD NEVER HAPPEN'
185 C
186  RETURN
187  END SUBROUTINE jacobi
188 
189 C**********************************************************************
190  SUBROUTINE eigsrt(D,V,N,NP)
191 C
192 C GIVEN THE EIGENVALUES D AND EIGENVECTORS V AS OUTPUT FROM
193 C JACOBI, THIS SUBROUTINE SORTS THE EIGENVALUES INTO ASCENDING
194 C ORDER AND REARRANGES THE COLMNS OF V ACCORDINGLY.
195 C
196 C THE SUBROUTINE WAS TAKEN FROM 'NUMERICAL RECIPES.'
197 C
198  IMPLICIT NONE
199 C
200  INTEGER N,NP,I,J,K
201 C
202  DOUBLE PRECISION D(np),V(np,np),P
203 C
204  DO i=1,n-1
205  k = i
206  p = d(i)
207  DO j=i+1,n
208  IF (d(j).GE.p) THEN
209  k = j
210  p = d(j)
211  END IF
212  END DO
213  IF (k.NE.i) THEN
214  d(k) = d(i)
215  d(i) = p
216  DO j=1,n
217  p = v(j,i)
218  v(j,i) = v(j,k)
219  v(j,k) = p
220  END DO
221  END IF
222  END DO
223 C
224  RETURN
225  END SUBROUTINE eigsrt
subroutine jacobi(A, N, NP, D, V, NROT)
Definition: spectral.for:28
subroutine spectral(A, D, V)
Definition: spectral.for:2
subroutine eigsrt(D, V, N, NP)
Definition: spectral.for:191