38
39
40
42 USE elbufdef_mod
43
44
45
46#include "implicit_f.inc"
47
48
49
50#include "parit_c.inc"
51#include "com20_c.inc"
52#include "com08_c.inc"
53#include "scr02_c.inc"
54#include "scr18_c.inc"
55
56
57
58 INTEGER, INTENT(IN) :: NFT
59 INTEGER :: NEL,IMAT,NDDL,ITASK
60 INTEGER, DIMENSION(NEL) :: NC1,NC2,NC3
61 my_real,
DIMENSION(NEL,NDDL),
INTENT(INOUT)::
62 . var_reg
63 my_real,
DIMENSION(NEL),
INTENT(IN) ::
64 .
area,off,px2,py2,px3,py3,thk,le,thk0,area0
66 . dt2t
67 TYPE(NLOCAL_STR_), TARGET :: NLOC_DMG
68 TYPE(BUF_NLOC_) , TARGET :: BUFNL
69
70
71
72 INTEGER I,K,N1,N2,N3,L_NLOC,II,J,NDNOD
74 . l2,ntn,ntn_unl,ntn_vnl,xi,ntvar,a,
75 . b1,b2,b3,zeta,sspnl,
76 . nth1,nth2,bth1,bth2,k1,k2,k12,
77 . dtnl_th,dtnl,le_max,maxstif,
78 . dtnod,dt2p
79 my_real,
DIMENSION(:,:),
ALLOCATABLE ::
80 . f1,f2,f3,sti1,sti2,sti3
81 my_real,
DIMENSION(:) ,
ALLOCATABLE ::
82 . btb11,btb12,btb13,btb22,btb23,btb33,vol
83 INTEGER, DIMENSION(:), ALLOCATABLE ::
84 . POS1,POS2,POS3
85 my_real,
POINTER,
DIMENSION(:) ::
86 . vnl,fnl,unl,stifnl,mass,mass0,vnl0
87 my_real,
POINTER,
DIMENSION(:,:) ::
88 . massth,unlth,vnlth,fnlth
89 my_real,
DIMENSION(:,:),
ALLOCATABLE ::
90 . stifnlth,dtn
91
92
93 my_real,
PARAMETER :: csta = 40.0d0
94
95 my_real,
PARAMETER :: cdamp = 0.7d0
96
97
98
99
100
101 l2 = nloc_dmg%LEN(imat)**2
102 xi = nloc_dmg%DAMP(imat)
103 zeta = nloc_dmg%DENS(imat)
104 sspnl = nloc_dmg%SSPNL(imat)
105 l_nloc = nloc_dmg%L_NLOC
106 le_max = nloc_dmg%LE_MAX(imat)
107
108 ALLOCATE(f1(nel,nddl),f2(nel,nddl),f3(nel,nddl))
109
110 IF (nodadt > 0) THEN
111
112 ALLOCATE(sti1(nel,nddl),sti2(nel,nddl),sti3(nel,nddl))
113
114 mass => nloc_dmg%MASS(1:l_nloc)
115
116 mass0 => nloc_dmg%MASS0(1:l_nloc)
117 ENDIF
118 ALLOCATE(btb11(nel),btb12(nel),btb13(nel),btb22(nel),
119 . btb23(nel),btb33(nel),vol(nel),pos1(nel),
120 . pos2(nel),pos3(nel))
121
122 vnl => nloc_dmg%VNL(1:l_nloc)
123 vnl0 => nloc_dmg%VNL_OLD(1:l_nloc)
124 unl => nloc_dmg%UNL(1:l_nloc)
125
126 ntn = three*three
127
128
129
130
131
132# include "vectorize.inc"
133 DO i=1,nel
134
135
136 n1 = nloc_dmg%IDXI(nc1(i))
137 n2 = nloc_dmg%IDXI(nc2(i))
138 n3 = nloc_dmg%IDXI(nc3(i))
139
140
141 pos1(i) = nloc_dmg%POSI(n1)
142 pos2(i) = nloc_dmg%POSI(n2)
143 pos3(i) = nloc_dmg%POSI(n3)
144
145
146 vol(i) =
area(i)*thk(i)
147
148
149 btb11(i) = (-px3(i)-px2(i))**2 + (-py2(i)-py3(i))**2
150 btb12(i) = (-px3(i)-px2(i))*px2(i) + (-py2(i)-py3(i))*py2(i)
151 btb13(i) = (-px3(i)-px2(i))*px3(i) + (-py2(i)-py3(i))*py3(i)
152 btb22(i) = px2(i)**2 + py2(i)**2
153 btb23(i) = px2(i)*px3(i) + py2(i)*py3(i)
154 btb33(i) = px3(i)**2 + py3(i)**2
155
156 ENDDO
157
158
159
160
161
162 IF ((nddl > 1).AND.(l2>zero)) THEN
163
164
165 IF (nddl > 2) THEN
166 IF (nodadt > 0) THEN
167 ALLOCATE(stifnlth(nel,nddl+1))
168 ALLOCATE(dtn(nel,nddl+1))
169 ENDIF
170 ndnod = nddl+1
171 ELSE
172 IF (nodadt > 0) THEN
173 ALLOCATE(stifnlth(nel,nddl))
174 ALLOCATE(dtn(nel,nddl))
175 ENDIF
176 ndnod = nddl
177 ENDIF
178
179
180 massth => bufnl%MASSTH(1:nel,1:ndnod)
181 unlth => bufnl%UNLTH(1:nel,1:ndnod)
182 vnlth => bufnl%VNLTH(1:nel,1:ndnod)
183 fnlth => bufnl%FNLTH(1:nel,1:ndnod)
184
185 DO k = 1,ndnod
186 DO i = 1,nel
187
188 fnlth(i,k) = zero
189
190 IF (nodadt > 0) THEN
191 stifnlth(i,k) = em20
192 ENDIF
193 ENDDO
194 ENDDO
195
196
197 DO k = 1, nddl
198
199
200 IF ((nddl==2).AND.(k==2)) THEN
201 nth1 = (z0(k,nddl) - zth(k,nddl)) / (zth(k-1,nddl) - zth(k,nddl))
202 nth2 = (z0(k,nddl) - zth(k-1,nddl)) / (zth(k,nddl) - zth(k-1,nddl))
203 ELSE
204 nth1 = (z0(k,nddl) - zth(k+1,nddl)) / (zth(k,nddl) - zth(k+1,nddl))
205 nth2 = (z0(k,nddl) - zth(k,nddl)) / (zth(k+1,nddl) - zth(k,nddl))
206 ENDIF
207
208
209 DO i = 1,nel
210 ! computation of b-matrix values
211 IF ((nddl==2).AND.(k==2)) THEN
212 bth1 = (one/(zth(k-1,nddl) - zth(k,nddl)))*(one/thk(i))
213 bth2 = (one/(zth(k,nddl) - zth(k-1,nddl)))*(one/thk(i))
214 ELSE
215 bth1 = (one/(zth(k,nddl) - zth(k+1,nddl)))*(one/thk(i))
216 bth2 = (one/(zth(k+1,nddl) - zth(k,nddl)))*(one/thk(i))
217 ENDIF
218
219
220 k1 = l2*(bth1**2) + nth1**2
221 k12 = l2*(bth1*bth2)+ (nth1*nth2)
222 k2 = l2*(bth2**2) + nth2**2
223
224
225 IF ((nddl==2).AND.(k==2)) THEN
226 fnlth(i,k-1) = fnlth(i,k-1) + (k1*unlth(i,k-1) + k12*unlth(i,k)
227 . + xi*((nth1**2)*vnlth(i,k-1)
228 . + (nth1*nth2)*vnlth(i,k))
229 . - (nth1*var_reg(i,k)))*vol(i)*wf(k,nddl)
230 fnlth(i,k) = fnlth(i,k) + (k12*unlth(i,k-1) + k2*unlth(i,k)
231 . + xi*(nth1*nth2*vnlth(i,k-1)
232 . + (nth2**2)*vnlth(i,k))
233 . - nth2*var_reg(i,k))*vol(i)*wf(k,nddl)
234 ELSE
235 fnlth(i,k) = fnlth(i,k) + (k1*unlth(i,k) + k12*unlth(i,k+1)
236 . + xi*((nth1**2)*vnlth(i,k)
237 . + (nth1*nth2)*vnlth(i,k+1))
238 . - (nth1*var_reg(i,k)))*vol(i)*wf(k,nddl)
239 fnlth(i,k+1) = fnlth(i,k+1) + (k12*unlth(i,k) + k2*unlth(i,k+1)
240 . + xi*(nth1*nth2*vnlth(i,k)
241 . + (nth2**2)*vnlth(i,k+1))
242 . - nth2*var_reg(i,k))*vol(i)*wf(k,nddl)
243 ENDIF
244
245
246 IF (nodadt > 0) THEN
247 IF ((nddl==2).AND.(k==2)) THEN
248 stifnlth(i,k-1) = stifnlth(i,k-1) +
max(abs(k1)+abs(k12),abs(k12)+abs(k2))*vol(i)*wf(k,nddl)
249 stifnlth(i,k) = stifnlth(i,k) +
max(abs(k1)+abs(k12),abs(k12)+abs(k2))*vol(i)*wf(k,nddl)
250 ELSE
251 stifnlth(i,k) = stifnlth(i,k) +
max(abs(k1)+abs(k12),abs(k12)+abs(k2))*vol(i)*wf(k,nddl)
252 stifnlth(i,k+1) = stifnlth(i,k+1) +
max(abs(k1)+abs(k12),abs(k12)+abs(k2))*vol(i)*wf(k,nddl)
253 ENDIF
254 ENDIF
255
256 ENDDO
257 ENDDO
258
259
260 IF (nodadt > 0) THEN
261
262
263 dtnod = ep20
264 DO k = 1,ndnod
265 DO i = 1,nel
266 dtn(i,k) = dtfac1(11)*cdamp*sqrt(two*massth(i,k)/
max(stifnlth(i,k),em20))
267 dtnod =
min(dtn(i,k),dtnod)
268 ENDDO
269 ENDDO
270
271
272 IF ((idtmin(11)==3).OR.(idtmin(11)==4).OR.(idtmin(11)==8)) THEN
273
274 IF (dtnod < dtmin1(11)*(sqrt(csta))) THEN
275 DO k = 1,ndnod
276 DO i = 1,nel
277 IF (dtn(i,k) < dtmin1(11)) THEN
278 dt2p = dtmin1(11)/(dtfac1(11)*cdamp)
279 massth(i,k) =
max(massth(i,k),csta*half*stifnlth(i,k)*dt2p*dt2p*onep00001)
280 ENDIF
281 ENDDO
282 ENDDO
283 ENDIF
284 dtnod = dtmin1(11)*(sqrt(csta))
285 ENDIF
286
287
288 IF (dtnod < dt2t) THEN
289 dt2t =
min(dt2t,dtnod)
290 ENDIF
291 ENDIF
292
293 DO k = 1,ndnod
294 DO i = 1,nel
295
296 vnlth(i,k) = vnlth(i,k) - (fnlth(i,k)/massth(i,k))*dt12
297 ENDDO
298 ENDDO
299
300 DO k = 1,ndnod
301 DO i = 1,nel
302
303 unlth(i,k) = unlth(i,k) + vnlth(i,k)*dt1
304 ENDDO
305 ENDDO
306
307
308 DO k = 1, nddl
309
310 IF ((nddl==2).AND.(k==2)) THEN
311 nth1 = (z0(k,nddl) - zth(k,nddl))/(zth(k-1,nddl) - zth(k,nddl))
312 nth2 = (z0(k,nddl) - zth(k-1,nddl)) /(zth(k,nddl) - zth(k-1,nddl))
313 ELSE
314 nth1 = (z0(k,nddl) - zth(k+1,nddl))/(zth(k,nddl) - zth(k+1,nddl))
315 nth2 = (z0(k,nddl) - zth(k,nddl)) /(zth(k+1,nddl) - zth(k,nddl))
316 ENDIF
317
318 DO i = 1,nel
319
320 IF ((nddl==2).AND.(k==2)) THEN
321 var_reg(i,k) = nth1*unlth(i,k-1) + nth2*unlth(i,k)
322 ELSE
323 var_reg(i,k) = nth1*unlth(i,k) + nth2*unlth(i,k+1)
324 ENDIF
325 ENDDO
326 ENDDO
327 ENDIF
328
329
330
331
332
333 DO k = 1, nddl
334
335
336# include "vectorize.inc"
337 DO i=1,nel
338
339
340 IF (off(i)/=zero) THEN
341
342 b1 = (l2 * vol(i)) * wf(k,nddl)*(btb11(i)*unl(pos1(i)+k-1) + btb12(i)*unl(pos2(i)+k-1)
343 . + btb13(i)*unl(pos3(i)+k-1))
344
345 b2 = (l2 * vol(i)) * wf(k,nddl)*(btb12(i)*unl(pos1(i)+k-1) + btb22(i)*unl(pos2(i)+k-1)
346 . + btb23(i)*unl(pos3(i)+k-1))
347
348 b3 = (l2 * vol(i)) * wf(k,nddl)*(btb13(i)*unl(pos1(i)+k-1) + btb23(i)*unl(pos2(i)+k-1)
349 . + btb33(i)*unl(pos3(i)+k-1))
350
351
352 ntn_unl = (unl(pos1(i)+k-1) + unl(pos2(i)+k-1) + unl(pos3(i)+k-1))/ntn
353
354
355 ntn_vnl = (vnl(pos1(i)+k-1) + vnl(pos2(i)+k-1) + vnl(pos3(i)+k-1))/ntn
356 IF (nodadt > 0) THEN
357 ntn_vnl =
min(sqrt(mass(pos1(i)+k-1)/mass0(pos1(i)+k-1)),
358 . sqrt(mass(pos2(i)+k-1)/mass0(pos2(i)+k-1)),
359 . sqrt(mass(pos3(i)+k-1)/mass0(pos3(i)+k-1)))*ntn_vnl
360 ENDIF
361
362
363 ntn_unl = ntn_unl * vol(i) * wf(k,nddl)
364 ntn_vnl = ntn_vnl * xi * vol(i) * wf(k,nddl)
365
366
367 ntvar = var_reg(i,k)*third*vol(i)*wf(k,nddl)
368
369
370 a = ntn_unl + ntn_vnl - ntvar
371 f1(i,k) = a + b1
372 f2(i,k) = a + b2
373 f3(i,k) = a + b3
374
375
376 IF (nodadt > 0) THEN
377 sti1(i,k) = (abs(l2*btb11(i) + one/ntn) + abs(l2*btb12(i) + one/ntn) +
378 . abs(l2*btb13(i) + one/ntn))* vol(i) * wf(k,nddl)
379 sti2(i,k) = (abs(l2*btb12(i) + one/ntn) + abs(l2*btb22(i) + one/ntn) +
380 . abs(l2*btb23(i) + one/ntn))* vol(i) * wf(k,nddl)
381 sti3(i,k) = (abs(l2*btb13(i) + one/ntn) + abs(l2*btb23(i) + one/ntn) +
382 . abs(l2*btb33(i) + one/ntn))* vol(i) * wf(k,nddl)
383 ENDIF
384
385
386 ELSE
387 IF (nodadt > 0) THEN
388
389 f1(i,k) = wf(k,nddl)*sqrt(mass(pos1(i)+k-1)/mass0(pos1(i)+k-1))*zeta*sspnl*
390 . half*(vnl(pos1(i)+k-1)+vnl0(pos1(i)+k-1))*sqrt((four/sqrt(three))*(area0(i)))*thk0(i)
391 f2(i,k) = wf(k,nddl)*sqrt(mass(pos2(i)+k-1)/mass0(pos2(i)+k-1))*zeta*sspnl*
392 . half*(vnl(pos2(i)+k-1)+vnl0(pos2(i)+k-1))*sqrt((four/sqrt(three))*(area0(i)))*thk0(i)
393 f3(i,k) = wf(k,nddl)*sqrt(mass(pos3(i)+k-1)/mass0(pos3(i)+k-1))*zeta*sspnl
394 . half*(vnl(pos3(i)+k-1)+vnl0(pos3(i)+k-1))*sqrt((four/sqrt(three))*(area0(i)))*thk0(i)
395
396 sti1(i,k) = em20
397 sti2(i,k) = em20
398 sti3(i,k) = em20
399 ELSE
400
401 f1(i,k) = wf(k,nddl)*zeta*sspnl*half*(vnl(pos1(i)+k-1)+vnl0(pos1(i)+k-1))*
402 . sqrt((four/sqrt(three))*(area0(i)))*thk0(i)
403 f2(i,k) = wf(k,nddl)*zeta*sspnl*half*(vnl(pos2(i)+k-1)+vnl0(pos2(i)+k-1))*
404 . sqrt((four/sqrt(three))*(area0(i)))*thk0(i)
405 f3(i,k) = wf(k,nddl)*zeta*sspnl*half*(vnl(pos3(i)+k-1)+vnl0(pos3(i)+k-1))*
406 . sqrt((four/sqrt(three))*(area0(i)))*thk0(i)
407 ENDIF
408 ENDIF
409 ENDDO
410 ENDDO
411
412
413
414
415
416
417 IF (iparit == 0) THEN
418
419 fnl => nloc_dmg%FNL(1:l_nloc,itask+1)
420 IF (nodadt > 0) stifnl => nloc_dmg%STIFNL(1:l_nloc,itask+1)
421
422 DO i=1,nel
423
424#include "vectorize.inc"
425 DO k = 1,nddl
426
427 fnl(pos1(i)+k-1) = fnl(pos1(i)+k-1) - f1(i,k)
428 fnl(pos2(i)+k-1) = fnl(pos2(i)+k-1) - f2(i,k)
429 fnl(pos3(i)+k-1) = fnl(pos3(i)+k-1) - f3(i,k)
430 IF (nodadt > 0) THEN
431
432 maxstif =
max(sti1(i,k),sti2(i,k),sti3(i,k))
433
434 stifnl(pos1(i)+k-1) = stifnl(pos1(i)+k-1) + maxstif
435 stifnl(pos2(i)+k-1) = stifnl(pos2(i)+k-1) + maxstif
436 stifnl(pos3(i)+k-1) = stifnl(pos3(i)+k-1) + maxstif
437 ENDIF
438 ENDDO
439 ENDDO
440
441
442 ELSE
443
444 DO j = 1,nddl
445
446
447 DO i=1,nel
448 ii = i + nft
449
450
451 IF (nodadt > 0) THEN
452 maxstif =
max(sti1(i,j),sti2(i,j),sti3(i,j))
453 ENDIF
454
455 k = nloc_dmg%IADTG(1,ii)
456 nloc_dmg%FSKY(k,j) = -f1(i,j)
457 IF (nodadt > 0) nloc_dmg%STSKY(k,j) = maxstif
458
459 k = nloc_dmg%IADTG(2,ii)
460 nloc_dmg%FSKY(k,j) = -f2(i,j)
461 IF (nodadt > 0) nloc_dmg%STSKY(k,j) = maxstif
462
463 k = nloc_dmg%IADTG(3,ii)
464 nloc_dmg%FSKY(k,j) = -f3(i,j)
465 IF (nodadt > 0) nloc_dmg%STSKY(k,j) = maxstif
466
467 ENDDO
468
469 ENDDO
470 ENDIF
471
472
473
474
475 IF (nodadt == 0) THEN
476 DO i = 1,nel
477
478 IF (off(i)/=zero) THEN
479
480 dtnl = (two*(
min(le(i),le_max))*sqrt(three*zeta))/
481 . sqrt(twelve*l2 + (
min(le(i),le_max))**2)
482
483 IF (nddl>1) THEN
484 IF (nddl > 2) THEN
485 dtnl_th = (two*(
min(thk(i)/nddl,le_max))*sqrt(three*zeta))/
486 . sqrt(twelve*l2 + (
min(thk(i)/nddl,le_max))**2)
487 ELSE
488 dtnl_th = (two*(
min(thk(i),le_max))*sqrt(three*zeta))/
489 . sqrt(twelve*l2 + (
min(thk(i),le_max))**2)
490 ENDIF
491 ELSE
492 dtnl_th = ep20
493 ENDIF
494
495 dt2t =
min(dt2t,dtfac1(1)*cdamp*dtnl_th,dtfac1(1)*cdamp*dtnl)
496 ENDIF
497 ENDDO
498 ENDIF
499
500
501 IF (ALLOCATED(f1)) DEALLOCATE(f1)
502 IF (ALLOCATED(f2)) DEALLOCATE(f2)
503 IF (ALLOCATED(f3)) DEALLOCATE(f3)
504 IF (ALLOCATED(sti1)) DEALLOCATE(sti1)
505 IF (ALLOCATED(sti2)) DEALLOCATE(sti2)
506 IF (ALLOCATED(sti3)) DEALLOCATE(sti3)
507 IF (ALLOCATED(btb11)) DEALLOCATE(btb11)
508 IF (ALLOCATED(btb12)) DEALLOCATE(btb12)
509 IF (ALLOCATED(btb13)) DEALLOCATE(btb13)
510 IF (ALLOCATED(btb22)) DEALLOCATE(btb22)
511 IF (ALLOCATED(btb23)) DEALLOCATE(btb23)
512 IF (ALLOCATED(btb33)) DEALLOCATE(btb33)
513 IF (ALLOCATED(stifnlth)) DEALLOCATE(stifnlth)
514 IF (ALLOCATED(pos1)) DEALLOCATE(pos1)
515 IF (ALLOCATED(pos2)) DEALLOCATE(pos2)
516 IF (ALLOCATED(pos3)) DEALLOCATE(pos3)
517 IF (ALLOCATED(vol)) DEALLOCATE(vol)
subroutine area(d1, x, x2, y, y2, eint, stif0)