44
45
46
47 USE my_alloc_mod
49 USE elbufdef_mod
50 USE matparam_def_mod
51
52
53
54#include "implicit_f.inc"
55
56
57
58#include "mvsiz_p.inc"
59
60#include "com01_c.inc"
61#include "com04_c.inc"
62#include "com_xfem1.inc"
63#include "param_c.inc"
64#include "task_c.inc"
65
66
67
68 INTEGER IPARG(NPARG,*),ITENS,INVERT(*),INDX_CRK(*),
69 . EL2FA(*),IXC(NIXC,*),IGEO(NPROPGI,*),
70 . NBF,IADP(*),NBF_L,NBPART,IADG(NSPMD,*),
71 . IXTG(NIXTG,*),LEN,IEL_CRK(*),IADC_CRK(*),
72 . IPM(NPROPMI,*)
73
75 . epsdot(6,*),x(3,*)
76 TYPE (ELBUF_STRUCT_), DIMENSION(NGROUP), TARGET :: ELBUF_TAB
77 TYPE (ELBUF_STRUCT_), DIMENSION(NGROUP,NXEL), TARGET :: XFEM_TAB
78 TYPE (XFEM_EDGE_) , DIMENSION(*) :: CRKEDGE
79 TYPE (MATPARAM_STRUCT_) ,DIMENSION(NUMMAT) ,INTENT(IN) :: MAT_PARAM
80
81
82
83
85 . a1,a2,a3,thk,sige(mvsiz,5)
86 my_real,
DIMENSION(:,:),
ALLOCATABLE :: tens
87 REAL (18)
88 INTEGER I,NI,NG,NEL,NFT,ITY,LFT,NPT,IPT,
89 . N,J,LLT,MLW,ISTRAIN,
90 . IPID,I1,I2,ISTRE,NNI,N0,
91 . KK,IHBE,IREP,BUF,NEL_CRK,
92 . NLAY,NPTT,IXEL,ILAY,NUVARV,IVISC,
93 . IPMAT,IGTYP,MATLY,NLEVXF,NPG,ICRK,JJ(8)
94
95 INTEGER IXFEM,K,CRKS,ITG,IA,NN1,NN2,
96 . NN3,NN4,NN5,NN6
97 REAL, DIMENSION(:,:), ALLOCATABLE :: WA
98 INTEGER, DIMENSION(:), ALLOCATABLE :: NELCRK
99 INTEGER, DIMENSION(:), ALLOCATABLE :: IE
100 INTEGER ILAYCRK,ELCRK,NPT0
101 INTEGER PID(MVSIZ),MAT(MVSIZ)
102
103 TYPE() ,POINTER :: BUFLY
104 TYPE(G_BUFEL_) ,POINTER :: GBUF
105 TYPE(L_BUFEL_) ,POINTER :: LBUF
106
107 TYPE(G_BUFEL_) ,POINTER :: XGBUF
108 TYPE(L_BUFEL_) ,POINTER :: XLBUF
109C
111 . DIMENSION(:), POINTER :: dir_a
112
113
114 CALL my_alloc(tens,3,len)
115 CALL my_alloc(wa,3,nbf_l)
116 CALL my_alloc(nelcrk,ncrkpart)
117 CALL my_alloc(ie,ncrkpart)
118
119 nel_crk = 0
120 itg = 1 + 4*ecrkxfec
121 tens = zero
122
123 DO crks = 1,ncrkpart
124 icrk = indx_crk(crks)
125 nelcrk(crks) = nel_crk
127 ie(icrk) = 0
128 ENDDO
129
130 DO j=1,18
131 r4(j) = zero
132 ENDDO
133
134 nn1 = 1
135 nn2 = nn1
136 nn3 = nn2
137 nn4 = nn3 + numelq
138 nn5 = nn4 + numelc
139 nn6 = nn5 + numeltg
140
141
142 DO ng=1,ngroup
143 mlw = iparg(1,ng)
144 nel = iparg(2,ng)
145 nft = iparg(3,ng)
146 ity
147 npt = iabs(iparg(6,ng))
148 istrain= iparg(44,ng)
149 ihbe = iparg(23,ng)
150 igtyp = iparg(38,ng)
151 ixfem = iparg(54,ng)
152 nlevxf = iparg(65,ng)
153 lft=1
154 llt=nel
155
156 DO i=1,8
157 jj(i) = nel*(i-1)
158 ENDDO
159
160 DO i=lft,llt
161 DO j=1,5
162 sige(i,j) = zero
163 ENDDO
164 ENDDO
165
166 IF (ihbe == 11) cycle
167 IF (ixfem /= 1 .AND. ixfem /= 2) cycle
168 IF (ity /= 3 .AND. ity /= 7) cycle
169
170
171
172 gbuf => elbuf_tab(ng)%GBUF
173
174
175
176 IF (ity == 3) THEN
177 n0 = 0
178 nni = nn4
179 ni = nft
180 ELSE
181 n0 = numelc
182 nni = nn5
183 ni = nft + numelc
184 ENDIF
185
186 npg = 0
187 npt0 = npt
188
189
190 IF (ixfem == 1) npt = 1
191
192
193 a1 = zero
194 a2 = zero
195 a3 = zero
196 istre = 1
197
198
199
200
201 IF (itens == 1) THEN
202 a1 = one
203 a2 = zero
204 ELSEIF (itens == 2) THEN
205 a1 = zero
206 a2 = one
207 ELSEIF (itens == 3) THEN
208 IF (mlw == 1) THEN
209 a1 = one
210 a2
211 ELSEIF (mlw == 2 .OR. mlw == 19 .OR.
212 . mlw == 15 .OR.
213 . mlw == 22 .OR. mlw == 25 .OR.
214 . mlw == 27 .OR. mlw == 32 .OR.
215 . mlw >= 28) THEN
216 a1 = one
217 a2 = zero
218 ipt = npt
219 ELSEIF (mlw == 3 .OR. mlw == 23) THEN
220 a1 = one
221 a2 = zero
222 ENDIF
223 ELSEIF (itens == 4) THEN
224 IF (mlw == 1) THEN
225 a1 = one
226 a2 = -six
227 ELSEIF (mlw == 2 .OR. mlw == 19 .OR.
228 . mlw == 15 .OR.
229 . mlw == 22 .OR. mlw == 25.OR.
230 . mlw == 27 .OR. mlw == 32.OR.
231 . mlw >= 28) THEN
232 ipt = 1
233 a1 = one
234 a2 = zero
235 ELSEIF (mlw == 3 .OR. mlw == 23) THEN
236 a1 = one
237 a2 = zero
238 ENDIF
239 ELSEIF (itens >= 101 .AND. itens <= 200) THEN
240 IF (mlw == 1 .OR. mlw == 3 .OR. mlw == 23) THEN
241 a1 = one
242 a2 = zero
243 ELSEIF (mlw == 2 .OR. mlw == 19 .OR.
244 . mlw == 15 .OR.
245 . mlw == 22 .OR. mlw == 25 .OR.
246 . mlw == 27 .OR. mlw == 32 .OR.
247 . mlw >= 28) THEN
248 ipt =
min(npt,itens-100)
249 a1 = one
250 a2 = zero
251 ENDIF
252
253
254
255 ELSEIF (itens == 5) THEN
256 istre = 0
257 a1 = zero
258 a2 = zero
259 IF (istrain == 1) THEN
260 a1 = one
261 ENDIF
262 ELSEIF (itens == 6) THEN
263 istre = 0
264 a1 =
265 a2 = zero
266 IF (istrain == 1) THEN
267 a2 = one
268 ENDIF
269 ELSEIF (itens == 7) THEN
270 istre = 0
271 a1 = zero
272 a2 = zero
273 IF (istrain == 1) THEN
274 a1 = one
275 a2 = half
276 ENDIF
277 ELSEIF (itens == 8) THEN
278 istre = 0
279 a1 = zero
280 a2 = zero
281 IF (istrain == 1) THEN
282 a1 = one
283 a2 = -half
284 ENDIF
285 ELSEIF (itens >= 201 .AND. itens <= 300) THEN
286 istre = 0
287 a1 = zero
288 a2 = zero
289 IF (istrain == 1 .AND. npt /= 0) THEN
290 ipt =
min(npt,itens - 200)
291 a1 = one
292
293 a2 = half*(((2*ipt-one)/npt)-one
294 ENDIF
295
296
297
298 ELSEIF (itens == 91) THEN
299 istre = 2
300 a1 = one
301 a2 = zero
302 ELSEIF (itens == 92) THEN
303 istre = 2
304 a1 = zero
305 a2 = one
306 ELSEIF (itens == 93) THEN
307 istre = 2
308 a1 = one
309 a2 = half
310 ELSEIF (itens == 94) THEN
311 istre = 2
312 a1 = one
313 a2 = -half
314 ELSEIF (itens >= 301 .AND. itens <= 400) THEN
315 IF (npt /= 0) THEN
316 istre = 2
317 ipt =
min(npt,itens - 300)
318 a1 = one
319
320 a2 = half*(((2*ipt-one)/npt)-one)
321 ELSE
322 istre = 2
323 a1 = one
324 a2 = zero
325 ENDIF
326 ENDIF
327
328
329
330
331
332 DO ixel=1,nxel
333 xgbuf => xfem_tab(ng,ixel)%GBUF
334 nlay = xfem_tab(ng,ixel)%NLAY
335 DO ilay=1,nlay
336
337 icrk = nxel*(ilay-1) + ixel
338
339 IF (mlw == 0) THEN
340 DO i=lft,llt
341 n = i + ni
342 IF (iel_crk(n) > 0) THEN
343 ie(icrk) = ie(icrk) + 1
344 tens(1,el2fa(nelcrk(icrk) + ie(icrk))) = zero
345 tens(2,el2fa(nelcrk(icrk) + ie(icrk))) = zero
346 tens(3,el2fa(nelcrk(icrk) + ie(icrk))) = zero
347 ENDIF
348 ENDDO
349 cycle
350 ENDIF
351
352 IF (istre == 1) THEN
353
354
355
356 IF (ity == 3) THEN
357 ipid = ixc(6,nft+1)
358 igtyp = igeo(11,ixc(6,nft+1))
359 DO i=lft,llt
360 mat(i)=ixc(1,nft+i)
361 pid(i)=ixc(6,nft+i)
362 ENDDO
363 ELSE
364 ipid = ixtg(5,nft+1)
365 igtyp = igeo(11,ixtg(5,nft+1))
366 DO i=lft,llt
367 mat(i)=ixtg(1,nft+i)
368 pid(i)=ixtg(5,nft+i)
369 ENDDO
370 ENDIF
371
372 irep = igeo(6,ipid)
373 ivisc = 0
374 nuvarv = 0
375 IF (mlw == 25) THEN
376 IF (igtyp == 11) THEN
377 ipmat = 100
378 DO i=1,nel
379 matly = igeo(ipmat+ilay,pid(i))
380 IF (mat_param(matly)%IVISC > 0 ) ivisc = 1
381 ENDDO
382
383
384 ENDIF
385 ENDIF
386
387 IF (((itens >= 101.AND.itens <= 200).OR.itens==3.OR.itens==4)
388 . .AND.(mlw == 25.OR.mlw == 15.OR.(mlw>=28 .AND.
389 . igtyp==11)).AND.irep == 1) THEN
391 1 lft ,llt ,nft ,ilay ,nel ,
392 2 ity ,iel_crk,iadc_crk,iadc_crk(itg),ixfem,
393 3 icrk ,nlay ,sige ,ivisc ,crkedge )
394 DO i=lft,llt
395 n = i + ni
396 IF (iel_crk(n) > 0) THEN
397 ie(icrk) = ie(icrk) + 1
398 DO j = 1,3
399 r4(j) = sige(i,j)
400 ENDDO
401
402 tens(1,el2fa(nelcrk(icrk) + ie(icrk))) = r4(1)
403 tens(2,el2fa(nelcrk(icrk) + ie(icrk))) = r4(2)
404 tens(3,el2fa(nelcrk(icrk) + ie(icrk))) = r4(3)
405 ENDIF
406 ENDDO
407 ELSEIF (((itens >= 101.AND.itens <= 200).OR.itens==3.OR.
408 . itens==4).AND.(mlw == 25.OR.mlw == 15.OR.(mlw>=28 .AND.
409 . igtyp==11)).AND.irep == 0) THEN
410
411 IF (nlay > 1) THEN
412 lbuf => elbuf_tab(ng)%BUFLY(ilay)%LBUF(1,1,1)
413 xlbuf => xfem_tab(ng,ixel)%BUFLY(ilay)%LBUF(1,1,1)
414 ELSE
415 lbuf => elbuf_tab(ng)%BUFLY(1)%LBUF(1,1,ilay)
416 xlbuf => xfem_tab(ng,ixel)%BUFLY(1)%LBUF(1,1,ilay)
417 ENDIF
418
419 DO i=lft,llt
420 n = i + ni
421 elcrk = iel_crk(n)
422 IF (elcrk > 0) THEN
423 ilaycrk = crkedge(ilay)%LAYCUT(elcrk)
424 IF (ilaycrk == 0 .OR.abs(ilaycrk) == 1) THEN
425 IF (nlay > 1) THEN
426 DO j=1,5
427 sige(i,j) = gbuf%FOR(jj(j)+i)
428 ENDDO
429 ELSEIF (nlay == 1) THEN
430 DO j=1,5
431 sige(i,j) = gbuf%FOR(jj(j)+i)
432 ENDDO
433 ENDIF
434 ELSE
435 IF (nlay > 1) THEN
436 DO j=1,5
437 sige(i,j) = xlbuf%FOR(jj(j)+i)
438 ENDDO
439 ELSEIF (nlay == 1) THEN
440 DO j=1,5
441 sige(i,j) = xgbuf%FOR(jj(j)+i)
442 ENDDO
443 ENDIF
444 ENDIF
445 ENDIF
446 ENDDO
447
448 IF (ivisc > 0) THEN
449 DO i=lft,llt
450 n = i + ni
451 elcrk = iel_crk(n)
452 IF (elcrk > 0) THEN
453 ilaycrk = crkedge(ilay)%LAYCUT(elcrk)
454 IF (ilaycrk == 0 .OR. abs(ilaycrk) == 1) THEN
455 DO j=1,5
456 sige(i,j) = sige(i,j) + lbuf%VISC(jj(j)+i)
457 ENDDO
458 ELSE
459 DO j=1,5
460 sige(i,j) = sige(i,j) + xlbuf%VISC(jj(j)+i)
461 ENDDO
462 ENDIF
463 ENDIF
464 ENDDO
465 ENDIF
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489 IF (nlay > 1) THEN
490 dir_a => xfem_tab(ng,ixel)%BUFLY(ilay)%DIRA
491 ELSE
492
493 ENDIF
494 CALL urotov(lft,llt,sige,dir_a,nel)
495
496
497
498
499 DO i=lft,llt
500 n = i + ni
501 IF (iel_crk(n) > 0) THEN
502 ie(icrk) = ie(icrk) + 1
503 DO j = 1,3
504 r4(j) = sige(i,j)
505 ENDDO
506 tens(1,el2fa(nelcrk(icrk) + ie(icrk))) = r4(1)
507 tens(2,el2fa(nelcrk(icrk) + ie(icrk))) = r4(2)
508 tens(3,el2fa(nelcrk(icrk) + ie(icrk))) = r4(3)
509 ENDIF
510 ENDDO
511
512 ELSE
513 IF (nlay > 1) THEN
514 xlbuf => xfem_tab
515 ELSE
516 xlbuf => xfem_tab(ng,ixel)%BUFLY(1)%LBUF(1,1,ilay)
517 ENDIF
518 DO i=lft,llt
519 n = i + ni
520 elcrk = iel_crk(n)
521 ie(icrk) = ie(icrk) + 1
522 IF (elcrk > 0) THEN
523 ilaycrk = crkedge(ilay)%LAYCUT(elcrk)
524 IF (ilaycrk == 0 .OR. abs(ilaycrk) == 1) THEN
525 DO j=1,3
526 r4(j) = a1 * gbuf%FOR(jj(j)+i) + a2 * gbuf%MOM(jj(j)+i)
527 ENDDO
528 ELSE
529 IF (nlay > 1) THEN
530 DO j=1,3
531 r4(j) = a1 * xlbuf%FOR(jj(j
532 ENDDO
533 ELSEIF (nlay == 1) THEN
534 DO j=1,3
535
536 ENDDO
537 ENDIF
538 ENDIF
539 ENDIF
540 tens(1,el2fa(nelcrk(icrk) + ie(icrk))) = r4(1)
541 tens(2,el2fa(nelcrk(icrk) + ie(icrk))) = r4(2)
542 tens(3,el2fa(nelcrk(icrk) + ie(icrk))) = r4(3)
543 ENDDO
544 ENDIF
545 ELSEIF (istre == 0 .AND. gbuf%G_STRA > 0) THEN
546
547
548
549 IF (nlay > 1) THEN
550 xlbuf => xfem_tab(ng,ixel)%BUFLY(ilay)%LBUF(1,1,1)
551 ELSE
552 xlbuf => xfem_tab(ng,ixel)%BUFLY(1)%LBUF(1,1,ilay)
553 ENDIF
554 DO i=lft,llt
555 n = i + ni
556 elcrk = iel_crk(n)
557 IF (elcrk > 0) THEN
558 ilaycrk = crkedge(ilay)%LAYCUT(elcrk)
559 IF (ilaycrk == 0 .OR. abs(ilaycrkTHEN
560 thk = gbuf%THK(i)
561 IF (itens /= 6) THEN
562 DO j=1,3
563 r4(j) = a1 * gbuf%STRA(jj(j)+i) +
564 . a2 * gbuf%STRA(jj(j)+i) * thk
565 ENDDO
566 ELSE
567 DO j=1,3
568 r4(j) = gbuf%STRA(jj(j
569 ENDDO
570 ENDIF
571 ELSE
572 IF (itens /= 6) THEN
573 IF (nlay > 1) THEN
574 thk = xlbuf%THK(i)
575 DO j=1,3
576 r4(j) = a1 * xlbuf%STRA(jj(j)+i) +
577 . a2 * xlbuf%STRA(jj(j)+i) * thk
578 ENDDO
579 ELSEIF (nlay == 1) THEN
580 thk = xgbuf%THK(i)
581 DO j=1,3
582 r4(j) = a1 * xgbuf%STRA(jj(j)+i) +
583 . a2 * xgbuf%STRA(jj(j)+i) * thk
584 ENDDO
585 ENDIF
586 ELSE
587 IF (nlay > 1) THEN
588 DO j=1,3
589 r4(j) = xlbuf%STRA(jj(j)+i)
590 ENDDO
591 ELSEIF (nlay == 1) THEN
592 DO j=1,3
593 r4(j) = xgbuf%STRA(jj(j)+i)
594 ENDDO
595 ENDIF
596 ENDIF
597 ENDIF
598
599 ie(icrk) = ie(icrk) + 1
600
601 r4(3) = r4(3) * half
602 tens(1,el2fa(nelcrk(icrk) + ie(icrk))) = r4(1)
603 tens(2,el2fa(nelcrk(icrk) + ie(icrk))) = r4(2)
604 tens(3,el2fa(nelcrk(icrk) + ie(icrk))) = r4(3)
605 ENDIF
606 ENDDO
607 ELSEIF (istre == 2) THEN
608
609
610
611 DO i=lft,llt
612 n = i + ni
613 IF (iel_crk(n) > 0) THEN
614 thk
615 IF (itens /= 92) THEN
616 DO j=1,3
617 r4(j) = a1*epsdot(j,n+n0) + a2*epsdot(j+3,n+n0)*thk
618 ENDDO
619 ELSE
620 DO j = 1,3
621 r4(j) = epsdot(j+3,n+n0)
622 ENDDO
623 ENDIF
624
625 r4(3) = r4(3) * half
626
627 tens(1,el2fa(nelcrk(icrk) + ie(icrk))) = r4(1)
628 tens(2,el2fa(nelcrk(icrk) + ie(icrk))) = r4(2)
629 tens(3,el2fa(nelcrk(icrk) + ie(icrk))) = r4(3)
630 ENDIF
631 ENDDO
632 ENDIF
633
634 ENDDO
635 ENDDO
636 ENDDO
637
638 DO crks = 1,ncrkpart
639 icrk = indx_crk(crks)
640
641 nel_crk = nelcrk(icrk)
642
643 IF (nspmd == 1)THEN
644 DO i=1,ie(icrk)
645 n = el2fa(nel_crk + i)
646 r4(1) = tens(1,n)
647 r4(2) = tens(2,n)
648 r4(3) = tens(3,n)
650 ENDDO
651 ELSE
652 DO i=1,ie(icrk)
653 n = el2fa(nel_crk + i)
654 wa(1,i+nel_crk) = tens
655 wa(2,i+nel_crk) = tens(2,n)
656 wa(3,i+nel_crk) = tens(3,n)
657 ENDDO
658 ENDIF
659 ENDDO
660
661 IF (nspmd > 1) THEN
662 IF (ispmd == 0) THEN
663 buf = nbf*3
664 ELSE
665 buf = 1
666 ENDIF
668 ENDIF
669
670 IF (ALLOCATED(tens)) DEALLOCATE(tens)
671 IF (ALLOCATED(wa)) DEALLOCATE(wa)
672 IF (ALLOCATED(nelcrk)) DEALLOCATE(nelcrk)
673 IF (ALLOCATED(ie)) DEALLOCATE(ie)
674 RETURN
type(xfem_shell_), dimension(:), allocatable crkshell
subroutine sigrota_xfe(elbuf_str, xfem_str, jft, jlt, nft, ilay, nel, ity, iel_crk, iadc_crk, iadtg_crk, ixfem, icrk, nlay, sig, ivisc, crkedge)
subroutine spmd_r4get_partn(size, nbf_l, nbpart, iadg, wal, buf)
subroutine urotov(jft, jlt, sig, dir, nel)
void write_r_c(float *w, int *len)