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