39
40
41
42
43
44
45#include "implicit_f.inc"
46
47
48
49#include "mvsiz_p.inc"
50
51
52
53
54
55 INTEGER, INTENT(IN) :: NEL
56 INTEGER, INTENT (OUT) :: IFCTL
57 INTEGER, DIMENSION(MVSIZ), INTENT(OUT) :: IFCE
58 my_real,
INTENT(IN) :: tol_e,dt1
59 my_real,
DIMENSION(MVSIZ),
INTENT(IN) :: ll
60 DOUBLE PRECISION, DIMENSION(MVSIZ,10), INTENT(IN) ::
61 . XX, YY, ZZ,
62 . XX0,YY0,ZZ0
63 my_real,
DIMENSION(MVSIZ),
INTENT(INOUT) ::sti,sti_c
64 my_real,
DIMENSION(MVSIZ,3),
INTENT (INOUT) :: for_t10,
65 . for_t1, for_t2, for_t3,
66 . for_t4, for_t5, for_t6,
67 . for_t7, for_t8, for_t9
68 my_real,
DIMENSION(MVSIZ,10),
INTENT(IN) ::
69 . vx, vy, vz
70 my_real,
DIMENSION(NEL),
INTENT(INOUT) :: e_distor
71
72
73
75 . stif(mvsiz),dmin(mvsiz),dmin2(mvsiz),fn(mvsiz,6),
76 . xm(mvsiz,6),ym(mvsiz,6),zm(mvsiz,6),ks(mvsiz),
77 . njx(mvsiz,6),njy(mvsiz,6),njz(mvsiz,6),fact,
78 . vxm(mvsiz,6),vym(mvsiz,6),vzm(mvsiz,6),
79 . dx,dy,dz,d_max,lam,s2,
norm,lam0,f_q,fac,leng,
80 . nx,ny,nz,fx,fy,fz,f_t,ds2(mvsiz,6),tol2,kts,fnj,
81 . ddx,ddy,ddz,ddn
82 INTEGER I,J,JJ,IFC2(MVSIZ,6),IFF
83
84
85
86
87
88
89
90 ifctl = 0
91 DO i=1,nel
92 IF (sti_c(i)==zero) cycle
93 xm(i,1) = half*(xx(i,1)+xx(i,2))
94 ym(i,1) = half*(yy(i,1)+yy(i,2))
95 zm(i,1) = half*(zz(i,1)+zz(i,2))
96 xm(i,2) = half*(xx(i,3)+xx(i,2))
97 ym(i,2) = half*(yy(i,3)+yy(i,2))
98 zm(i,2) = half*(zz(i,3)+zz(i,2))
99 xm(i,3) = half*(xx(i,3)+xx(i,1))
100 ym(i,3) = half*(yy(i,3)+yy(i,1))
101 zm(i,3) = half*(zz(i,3)+zz(i,1))
102 xm(i,4) = half*(xx(i,4)+xx(i,1))
103 ym(i,4) = half*(yy(i,4)+yy(i,1))
104 zm(i,4) = half*(zz(i,4)+zz(i,1))
105 xm(i,5) = half*(xx(i,4)+xx(i,2))
106 ym(i,5) = half*(yy(i,4)+yy(i,2))
107 zm(i,5) = half*(zz(i,4)+zz(i,2))
108 xm(i,6) = half*(xx(i,4)+xx(i,3))
109 ym(i,6) = half*(yy(i,4)+yy(i,3))
110 zm(i,6) = half*(zz(i,4)+zz(i,3))
111 stif(i) = sti_c(i)
112 dmin(i) = tol_e*ll(i)
113 dmin2(i) = dmin(i)*dmin(i)
114 ifce(i)=0
115 ENDDO
116
117 iff = 0
118 ifc2 = 0
119 DO j=1,6
120 jj = j + 4
121 DO i=1,nel
122 IF (sti_c(i)==zero) cycle
123 dx = xx(i,jj) - xm(i,j)
124 dy = yy(i,jj) - ym(i,j)
125 dz = zz(i,jj) - zm(i,j)
126 d_max = two*
max(abs(dx),abs(dy),abs(dz))
127 IF (d_max>dmin(i)) THEN
128 ifc2(i,j) = 1
129 iff = 1
130 END IF
131 ENDDO
132 ENDDO
133 IF (iff >0) THEN
134 DO i=1,nel
135 IF (sti_c(i)==zero) cycle
136 vxm(i,1) = half*(vx(i,1)+vx(i,2))
137 vym(i,1) = half*(vy(i,1)+vy(i,2))
138 vzm(i,1) = half*(vz(i,1)+vz(i,2))
139 vxm(i,2) = half*(vx(i,3)+vx(i,2))
140 vym(i,2) = half*(vy(i,3)+vy(i,2))
141 vzm(i,2) = half*(vz(i,3)+vz(i,2))
142 vxm(i,3) = half*(vx(i,3)+vx(i,1))
143 vym(i,3) = half*(vy(i,3)+vy(i,1))
144 vzm(i,3) = half*(vz(i,3)+vz(i,1))
145 vxm(i,4) = half*(vx(i,4)+vx(i,1))
146 vym(i,4) = half*(vy(i,4)+vy(i,1))
147 vzm(i,4) = half*(vz(i,4)+vz(i,1))
148 vxm(i,5) = half*(vx(i,4)+vx(i,2))
149 vym(i,5) = half*(vy(i,4)+vy(i,2))
150 vzm(i,5) = half*(vz(i,4)+vz(i,2))
151 vxm(i,6) = half*(vx(i,4)+vx(i,3))
152 vym(i,6) = half*(vy(i,4)+vy(i,3))
153 vzm(i,6) = half*(vz(i,4)+vz(i,3))
154 ENDDO
155 tol2 = tol_e*tol_e
156
157 DO i=1,nel
158 IF (ifc2(i,1)==0) cycle
159 dx = xx0(i,1)-xx0(i,2)
160 dy = yy0(i,1)-yy0(i,2)
161 dz = zz0(i,1)-zz0(i,2)
162 ds2(i,1) = dx*dx+dy*dy+dz*dz
163 ENDDO
164 DO i=1,nel
165 IF (ifc2(i,2)==0) cycle
166 dx = xx0(i,3)-xx0(i,2)
167 dy = yy0(i,3)-yy0(i,2)
168 dz = zz0(i,3)-zz0(i,2)
169 ds2(i,2) = dx*dx+dy*dy+dz*dz
170 ENDDO
171 DO i=1,nel
172 IF (ifc2(i,3)==0) cycle
173 dx = xx0(i,1)-xx0(i,3)
174 dy = yy0(i,1)-yy0(i,3)
175 dz = zz0(i,1)-zz0(i,3)
176 ds2(i,3) = dx*dx+dy*dy+dz*dz
177 ENDDO
178 DO i=1,nel
179 IF (ifc2(i,4)==0) cycle
180 dx = xx0(i,1)-xx0(i,4)
181 dy = yy0(i,1)-yy0(i,4)
182 dz = zz0(i,1)-zz0(i,4)
183 ds2(i,4) = dx*dx+dy*dy+dz*dz
184 ENDDO
185 DO i=1,nel
186 IF (ifc2(i,5)==0) cycle
187 dx = xx0(i,4)-xx0(i,2)
188 dy = yy0(i,4)-yy0(i,2)
189 dz = zz0(i,4)-zz0(i,2)
190 ds2(i,5) = dx*dx+dy*dy+dz*dz
191 ENDDO
192 DO i=1,nel
193 IF (ifc2(i,6)==0) cycle
194 dx = xx0(i,3)-xx0(i,4)
195 dy = yy0(i,3)-yy0(i,4)
196 dz = zz0(i,3)-zz0(i,4)
197 ds2(i,6) = dx*dx+dy*dy+dz*dz
198 END DO
199
200 fn = zero
201 f_t = three
202 f_q = 0.67
203 lam0 = tol_e
204 DO j=1,6
205 jj = j + 4
206 DO i=1,nel
207 IF (ifc2(i,j)==0) cycle
208 dx = xx(i,jj) - xm(i,j)
209 dy = yy(i,jj) - ym(i,j)
210 dz = zz(i,jj) - zm(i,j)
211 s2 = dx*dx+dy*dy+dz*dz
212 IF (s2>tol2*ds2(i,j)) THEN
213 ifctl = 1
214 lam = sqrt(s2/ds2(i,j))
219 leng = sqrt(ds2(i,j))
220 fac = f_q*(lam+one)*(lam+one)
221 kts = f_t*(fac+one)*sti_c(i)
222 fn(i,j) = kts*(lam-lam0)*leng
223 fact = f_t*(three*fac+one)
224 stif(i) =
max(stif(i),fact*sti_c(i))
225
226 ddx = vx(i,jj) - vxm(i,j)
227 ddy = vy(i,jj) - vym(i,j)
228 ddz = vz(i,jj) - vzm(i,j)
229 ddn = dt1*(ddx*njx(i,j)+ddy*njy(i,j)+ddz*njz(i,j))
230 e_distor(i) = e_distor(i) - fn(i,j)*ddn
231 END IF
232 ENDDO
233 ENDDO
234
235 j = 1
236 DO i=1,nel
237 IF (fn(i,j)==zero) cycle
238 fnj = half*fn(i,j)
239 nx = njx(i,j)
240 ny = njy(i,j)
241 nz = njz(i,j)
242 fx = fnj*nx
243 fy = fnj*ny
244 fz = fnj*nz
245 for_t1(i,1) = for_t1(i,1) + fx
246 for_t1(i,2) = for_t1(i,2) + fy
247 for_t1(i,3) = for_t1(i,3) + fz
248 for_t2(i,1) = for_t2(i,1) + fx
249 for_t2(i,2) = for_t2(i,2) + fy
250 for_t2(i,3) = for_t2(i,3) + fz
251
252 for_t5(i,1) = for_t5(i,1) - two*fx
253 for_t5(i,2) = for_t5(i,2) - two*fy
254 for_t5(i,3) = for_t5(i,3) - two*fz
255 ifce(i)=j
256 ENDDO
257
258 j = 2
259 DO i=1,nel
260 IF (fn(i,j)==zero) cycle
261 fnj = half*fn(i,j)
262 nx = njx(i,j)
263 ny = njy(i,j)
264 nz = njz(i,j)
265 fx = fnj*nx
266 fy = fnj*ny
267 fz = fnj*nz
268 for_t3(i,1) = for_t3(i,1) + fx
269 for_t3(i,2) = for_t3(i,2) + fy
270 for_t3(i,3) = for_t3(i,3) + fz
271 for_t2(i,1) = for_t2(i,1) + fx
272 for_t2(i,2) = for_t2(i,2) + fy
273 for_t2(i,3) = for_t2(i,3) + fz
274
275 for_t6(i,1) = for_t6(i,1) - two*fx
276 for_t6(i,2) = for_t6(i,2) - two*fy
277 for_t6(i,3) = for_t6(i,3) - two*fz
278 ifce(i)=j
279 ENDDO
280
281 j = 3
282 DO i=1,nel
283 IF (fn(i,j)==zero) cycle
284 fnj = half*fn(i,j)
285 nx = njx(i,j)
286 ny = njy(i,j)
287 nz = njz(i,j)
288 fx = fnj*nx
289 fy = fnj*ny
290 fz = fnj*nz
291 for_t3(i,1) = for_t3(i,1) + fx
292 for_t3(i,2) = for_t3(i,2) + fy
293 for_t3(i,3) = for_t3(i,3) + fz
294 for_t1(i,1) = for_t1(i,1) + fx
295 for_t1(i,2) = for_t1(i,2) + fy
296 for_t1(i,3) = for_t1(i,3) + fz
297 for_t7(i,1) = for_t7(i,1) - two*fx
298 for_t7(i,2) = for_t7(i,2) - two*fy
299 for_t7(i,3) = for_t7(i,3) - two*fz
300 ifce(i)=j
301 ENDDO
302
303 j = 4
304 DO i=1,nel
305 IF (fn(i,j)==zero) cycle
306 fnj = half*fn(i,j)
307 nx = njx(i,j)
308 ny = njy(i,j)
309 nz = njz(i,j)
310 fx = fnj*nx
311 fy = fnj*ny
312 fz = fnj*nz
313 for_t1(i,1) = for_t1(i,1) + fx
314 for_t1(i,2) = for_t1(i,2) + fy
315 for_t1(i,3) = for_t1(i,3) + fz
316 for_t4(i,1) = for_t4(i,1) + fx
317 for_t4(i,2) = for_t4(i,2) + fy
318 for_t4(i,3) = for_t4(i,3) + fz
319 for_t8(i,1) = for_t8(i,1) - two*fx
320 for_t8(i,2) = for_t8(i,2) - two*fy
321 for_t8(i,3) = for_t8(i,3) - two*fz
322 ifce(i)=j
323 ENDDO
324
325 j = 5
326 DO i=1,nel
327 IF (fn(i,j)==zero) cycle
328 fnj = half*fn(i,j)
329 nx = njx(i,j)
330 ny = njy(i,j)
331 nz = njz(i,j)
332 fx = fnj*nx
333 fy = fnj*ny
334 fz = fnj*nz
335 for_t4(i,1) = for_t4(i,1) + fx
336 for_t4(i,2) = for_t4(i,2) + fy
337 for_t4(i,3) = for_t4(i,3) + fz
338 for_t2(i,1) = for_t2(i,1) + fx
339 for_t2(i,2) = for_t2(i,2) + fy
340 for_t2(i,3) = for_t2(i,3) + fz
341 for_t9(i,1) = for_t9(i,1) - two*fx
342 for_t9(i,2) = for_t9(i,2) - two*fy
343 for_t9(i,3) = for_t9(i,3) - two*fz
344 ifce(i)=j
345 ENDDO
346
347 j = 6
348 DO i=1,nel
349 IF (fn(i,j)==zero) cycle
350 fnj = half*fn(i,j)
351 nx = njx(i,j)
352 ny = njy(i,j)
353 nz = njz(i,j)
354 fx = fnj*nx
355 fy = fnj*ny
356 fz = fnj*nz
357 for_t4(i,1) = for_t4(i,1) + fx
358 for_t4(i,2) = for_t4(i,2) + fy
359 for_t4(i,3) = for_t4(i,3) + fz
360 for_t3(i,1) = for_t3(i,1) + fx
361 for_t3(i,2) = for_t3(i,2) + fy
362 for_t3(i,3) = for_t3(i,3) + fz
363 for_t10(i,1) = for_t10(i,1) - two*fx
364 for_t10(i,2) = for_t10(i,2) - two*fy
365 for_t10(i,3) = for_t10(i,3) - two*fz
366 ifce(i)=j
367 ENDDO
368 DO i=1,nel
369 IF (sti_c(i)==zero) cycle
370 sti(i) =
max(sti(i),stif(i))
371 ENDDO
372 END IF
373
374
375 RETURN
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB