47
48
49
50 USE elbufdef_mod
53
54
55
56#include "implicit_f.inc"
57
58
59
60#include "mvsiz_p.inc"
61#include "param_c.inc"
62
63
64
65#include "drape_c.inc"
66#include "com20_c.inc"
67
68
69
70 INTEGER JFT,JLT,NPT,NEL,IGTYP,ISUBSTACK,NLAY,IXLAY,IXFEM,NFT
71 INTEGER , INTENT(IN) :: SEDRAPE,NUMEL_DRAPE
72 INTEGER MAT(*), PID(*), MATLY(*), IGEO(NPROPGI,*)
73 my_real geo(npropg,*),posly(mvsiz,*),thkly(*),ratio_thkly(nel,*),
74 . thk(*)
75 INTEGER, DIMENSION(SEDRAPE) :: INDX_DRAPE
76 TYPE(ELBUF_STRUCT_), TARGET :: ELBUF_STR
77 TYPE (STACK_PLY) :: STACK
78 TYPE (DRAPE_), DIMENSION(NUMEL_DRAPE), TARGET :: DRAPE
79
80
81
82 INTEGER I, J, N, IADR, IPTHK, IPMAT, IPPOS ,IPPID, IPID,
83 . IPANG,MAT_LY(MVSIZ),IT,ITL,ILAY,NPTT,MAX_NPTT,IPT,JMLY,IINT,
84 . IPID_LY,IPT_ALL,MAT_LAY,IDX,IE,NSLICE,IP,IDRAPE,IPOS
86 . zshift,thk_nptt,thickt_drape,
87 . thkl,pos_nptt,pos_0,thickt,thinning,thk_ly(mvsiz),pos_ly(mvsiz)
88 my_real ,
DIMENSION(:,:),
ALLOCATABLE :: thk_it
89
90 TYPE (DRAPE_PLY_), POINTER :: DRAPE_PLY
91 TYPE(L_BUFEL_) ,POINTER :: LBUF
92
94 . a_gauss(9,9),w_gauss(9,9)
95
96 DATA a_gauss /
97 1 0. ,0. ,0. ,
98 1 0. ,0. ,0. ,
99 1 0. ,0. ,0. ,
100 2 -.577350269189626,0.577350269189626,0. ,
101 2 0. ,0. ,0. ,
102 2 0. ,0. ,0. ,
103 3 -.774596669241483,0. ,0.774596669241483,
104 3 0. ,0. ,0. ,
105 3 0. ,0. ,0. ,
106 4 -.861136311594053,-.339981043584856,0.339981043584856,
107 4 0.861136311594053,0. ,0. ,
108 4 0. ,0. ,0. ,
109 5 -.906179845938664,-.538469310105683,0. ,
110 5 0.538469310105683,0.906179845938664,0. ,
111 5 0. ,0. ,0. ,
112 6 -.932469514203152,-.661209386466265,-.238619186083197,
113 6 0.238619186083197,0.661209386466265,0.932469514203152,
114 6 0. ,0. ,0. ,
115 7 -.949107912342759,-.741531185599394,-.405845151377397,
116 7 0. ,0.405845151377397,0.741531185599394,
117 7 0.949107912342759,0. ,0. ,
118 8 -.960289856497536,-.796666477413627,-.525532409916329,
119 8 -.183434642495650,0.183434642495650,0.525532409916329,
120 8 0.796666477413627,0.960289856497536,0. ,
121 9 -.968160239507626,-.836031107326636,-.613371432700590,
122 9 -.324253423403809,0. ,0.324253423403809,
123 9 0.613371432700590,0.836031107326636,0.968160239507626/
124 DATA w_gauss /
125 1 2. ,0. ,0. ,
126 1 0. ,0. ,0. ,
127 1 0. ,0. ,0. ,
128 2 1. ,1. ,0. ,
129 2 0. ,0. ,0. ,
130 2 0. ,0. ,0. ,
131 3 0.555555555555556,0.888888888888889,0.555555555555556,
132 3 0. ,0. ,0. ,
133 3 0. ,0. ,0. ,
134 4 0.347854845137454,0.652145154862546,0.652145154862546,
135 4 0.347854845137454,0. ,0. ,
136 4 0. ,0. ,0. ,
137 5 0.236926885056189,0.478628670499366,0.568888888888889,
138 5 0.478628670499366,0.236926885056189,0. ,
139 5 0. ,0. ,0. ,
140 6 0.171324492379170,0.360761573048139,0.467913934572691,
141 6 0.467913934572691,0.360761573048139,0.171324492379170,
142 6 0. ,0. ,0. ,
143 7 0.129484966168870,0.279705391489277,0.381830050505119,
144 7 0.417959183673469,0.381830050505119,0.279705391489277,
145 7 0.129484966168870,0. ,0. ,
146 8 0.101228536290376,0.222381034453374,0.313706645877887,
147 8 0.362683783378362,0.362683783378362,0.313706645877887,
148 8 0.222381034453374,0.101228536290376,0. ,
149 9 0.081274388361574,0.180648160694857,0.260610696402935,
150 9 0.312347077040003,0.330239355001260,0.312347077040003,
151 9 0.260610696402935,0.180648160694857,0.081274388361574/
152
153 ipthk = 300
154 ippos = 400
155 ipmat = 100
156 idrape = elbuf_str%IDRAPE
157 max_nptt = 0
158 IF(igtyp == 51 .OR. igtyp == 52) THEN
159 DO ilay=1,nlay
160 max_nptt = max_nptt + elbuf_str%BUFLY(ilay)%NPTT
161 ENDDO
162 ENDIF
163 IF(max_nptt > 0 ) THEN
164 ALLOCATE(thk_it(max_nptt,mvsiz))
165 ELSE
166 ALLOCATE(thk_it(0,0))
167 ENDIF
168
169
170 IF (ixfem == 1 .and. ixlay > 0) THEN
171
172
173 SELECT CASE (igtyp)
174
175 CASE (11)
176
177 DO ilay=1,elbuf_str%NLAY
178 iadr = (ilay-1)*jlt
179 DO i=jft,jlt
180 j = iadr + i
181 thkly(j) = one
182
183 posly(i,ilay) = zero
184 matly(j) = igeo(ipmat+ixlay,pid(1))
185 ENDDO
186 ENDDO
187
188
189 CASE (51,52)
190
191 ipang = 1
192 ippid = 2
193 ipmat = ippid + elbuf_str%NLAY
194 ipthk = ipang + elbuf_str%NLAY
195 ippos = ipthk + elbuf_str%NLAY
196
197 nptt = elbuf_str%BUFLY(ixlay)%NPTT
198 iint = igeo(47,pid(1))
199
200 IF(iint == 1 ) THEN
201 DO i=jft,jlt
202 thk_ly(i) = stack%GEO(ipthk + ixlay,isubstack)
203 pos_ly(i) = stack%GEO(ippos + ixlay,isubstack)
204 mat_ly(i) = stack%IGEO(ipmat + ixlay,isubstack)
205 ratio_thkly(i,ixlay) = thk_ly(i)
206 jmly = (ixlay - 1)*jlt + i
207 DO it=1,nptt
208 j = (it-1)*jlt + i
209 thk_it(it,i) = one/nptt
210 thkly(j) = thk_it(it,i)
211 matly(jmly) = mat_ly(i)
212 posly(i,it) = zero
213 ENDDO
214 ENDDO
215 ELSEIF(iint == 2)THEN
216 DO i=jft,jlt
217 thk_ly(i) = stack%GEO(ipthk + ixlay,isubstack)
218 pos_ly(i) = stack%GEO(ippos + ixlay,isubstack)
219 mat_ly(i) = stack%IGEO(ipmat + ixlay,isubstack)
220 ratio_thkly(i,ixlay) = thk_ly(i)
221 jmly = (ixlay - 1)*jlt + i
222 DO it=1,nptt
223 j = (it-1)*jlt + i
224 thk_it(it,i) = half*w_gauss(it,nptt)
225 thkly(j) = thk_it(it,i)
226 matly(jmly) = mat_ly(i)
227 posly(i,it) = zero
228 ENDDO
229 ENDDO
230 ENDIF
231
232 END SELECT
233
234
235 ELSE
236
237
238 SELECT CASE (igtyp)
239
240 CASE (1,9)
241
242 zshift = geo(199, pid(1))
243 DO n=1,npt
244 iadr = (n-1)*jlt
245 DO i = jft,jlt
246 j = iadr+i
247 thkly(j) = wf(n,npt)
248 posly(i,n) = z0(n,npt)+zshift
249 matly(j) = mat(1)
250 ENDDO
251 ENDDO
252
253 CASE (10)
254
255 DO n=1,npt
256 iadr = (n-1)*jlt
257 pos_0 = geo(ippos+n,pid(1))
258 thk_nptt = geo(ipthk+n,pid(1))
259 DO i = jft,jlt
260 j = iadr+i
261 thkly(j) = thk_nptt
262 posly(i,n) = pos_0
263 matly(j) = mat(1)
264 ENDDO
265 ENDDO
266
267 CASE (11, 16)
268
269 DO n=1,npt
270 iadr = (n-1)*jlt
271 thk_nptt = geo(ipthk+n,pid(1))
272 pos_0 = geo(ippos+n,pid(1))
273 mat_lay = igeo(ipmat+n,pid(1))
274 DO i=jft,jlt
275 j = iadr+i
276 thkly(j) = thk_nptt
277 posly(i,n) = pos_0
278 matly(j) = mat_lay
279 ENDDO
280 ENDDO
281
282 CASE (17)
283
284 ippid = 2
285 ipmat = ippid + npt
286 ipang = 1
287 ipthk = ipang + npt
288 ippos = ipthk + npt
289 ipos = igeo(99,pid(1))
290 thickt = stack%GEO(1,isubstack)
291 zshift = geo(199, pid(1))
292 IF (ipos == 2 ) zshift = zshift /
max(thickt,em20)
293 IF(idrape == 0) THEN
294 DO n=1,npt
295 iadr = (n-1)*jlt
296 DO i=jft,jlt
297 j = iadr+i
298 matly(j) = stack%IGEO(ipmat + n ,isubstack)
299 thkly(j) = stack%GEO (ipthk + n ,isubstack)
300 posly(i,n) = stack%GEO (ippos + n ,isubstack)
301 ENDDO
302 ENDDO
303 ELSE
304 thickt = stack%GEO(1,isubstack)
305 DO n=1,npt
306 iadr = (n-1)*jlt
307 DO i=jft,jlt
308 j = iadr+i
309 matly(j) = stack%IGEO(ipmat + n ,isubstack)
310 ie = indx_drape(nft + i)
311 IF (ie == 0) THEN
312 thkly(j) = stack%GEO (ipthk + n ,isubstack)
313 posly(i,n) = stack%GEO (ippos + n ,isubstack)
314 ELSE
315 thickt_drape = drape(ie)%THICK
316 ip = drape(ie)%INDX_PLY(n)
317 IF (ip == 0) THEN
318 thkly(j) = stack%GEO (ipthk + n ,isubstack)*thickt
319 ratio_thkly(i,n) = thkly(j)/thickt_drape
320 IF (n == 1) THEN
321 posly(i,n) = zshift + half*ratio_thkly(i,n)
322 ELSE
323 posly(i,n) = posly(i,n-1)
324 . + half*(ratio_thkly(i,n)+ratio_thkly(i,n-1))
325 ENDIF
326 pos_ly(i) = posly(i,n)
327 ELSE
328 drape_ply => drape(ie)%DRAPE_PLY(ip)
329 thinning = drape_ply%RDRAPE(1,1)
330 thkly(j) = stack%GEO(ipthk + n,isubstack)*thickt
331 thkly(j) = thkly(j)*thinning ! new thkly(/drape thinning)
332 thkly(j) = thkly(j)/thickt_drape
333 ratio_thkly(i,n) = thkly(j)
334 IF (n == 1) THEN
335 posly(i,n) = zshift + half*ratio_thkly(i,n)
336 ELSE
337 posly(i,n) = posly(i,n-1)
338 . + half*(ratio_thkly(i,n)+ratio_thkly(i,n-1))
339 ENDIF
340 ENDIF
341 ENDIF
342 ENDDO
343 ENDDO
344
345 ENDIF
346
347 CASE (51, 52)
348
349 ipt_all = 0
350
351 ipang = 1
352 ippid = 2
353 ipmat = ippid + nlay
354 ipthk = ipang + nlay
355 ippos = ipthk + nlay
356
357 ipos = igeo(99,pid(1))
358 thickt = stack%GEO(1,isubstack)
359 zshift = geo(199, pid(1))
360 IF (ipos == 2 ) zshift = zshift /
max(thickt,em20)
361 IF(idrape == 0) THEN
362 ipt_all = 0
363 DO ilay=1,nlay
364 nptt = elbuf_str%BUFLY(ilay)%NPTT
365 iint = igeo(47,pid(1))
366 IF(iint == 1) THEN
367 DO i=jft,jlt
368 mat_ly(i) = stack%IGEO(ipmat + ilay,isubstack)
369 thickt = stack%GEO(1,isubstack)
370 thk_ly(i) = stack%GEO(ipthk + ilay,isubstack)
371 pos_ly(i) = stack%GEO(ippos + ilay,isubstack)
372 ratio_thkly(i,ilay) = thk_ly(i)
373 jmly = (ilay-1)*jlt + i
374 DO it=1,nptt
375 ipt = ipt_all + it
376 j = (ipt-1)*jlt + i
377 thk_it(ipt,i) = thk_ly(i)/nptt
378 IF (ipt == 1) THEN
379 posly(i,ipt) = zshift + half*thk_it(ipt,i)
380 ELSE
381 posly(i,ipt) = posly(i,ipt - 1)
382 . + half*(thk_it(ipt,i) + thk_it(ipt-1,i))
383 ENDIF
384 thkly(j) = thk_it(ipt,i)
385 ENDDO
386 matly(jmly) = mat_ly(i)
387 ENDDO
388 ipt_all = ipt_all + nptt
389 ELSEIF (iint == 2) THEN
390 DO i=jft,jlt
391 mat_ly(i) = stack%IGEO(ipmat + ilay,isubstack)
392 thk_ly(i) = stack%GEO(ipthk + ilay,isubstack)
393 pos_ly(i) = stack%GEO(ippos + ilay,isubstack)
394 ratio_thkly(i,ilay) = thk_ly(i)
395 jmly = (ilay-1)*jlt + i
396 DO it=1,nptt
397 ipt = ipt_all + it
398 j = (ipt-1)*jlt + i
399 thk_it(ipt,i) = half*thk_ly(i)*w_gauss(it,nptt)
400 IF (ipt == 1) THEN
401 posly(i,ipt) = zshift + half*thk_it(ipt,i)
402 ELSE
403 posly(i,ipt) = posly(i,ipt - 1)
404 . + half*(thk_it(ipt,i) + thk_it(ipt-1,i))
405 ENDIF
406 thkly(j) = thk_it(ipt,i)
407 ENDDO
408 matly(jmly) = mat_ly(i)
409 ENDDO
410 ipt_all = ipt_all + nptt
411 ENDIF
412 ENDDO ! DO ilay=1,nlay
413 ELSE
414 ipt_all = 0
415 DO ilay=1,nlay
416 nptt = elbuf_str%BUFLY(ilay)%NPTT
417
418 iint = igeo(47,pid(1))
419 IF(iint == 1) THEN
420 DO i=jft,jlt
421 mat_ly(i) = stack%IGEO(ipmat + ilay,isubstack)
422 thickt = stack%GEO(1,isubstack)
423 thk_ly(i) = stack%GEO(ipthk + ilay,isubstack)*thickt
424 pos_ly(i) = stack%GEO(ippos + ilay,isubstack)*thickt
425 ratio_thkly(i,ilay) = thk_ly(i)/thickt
426 jmly = (ilay-1)*jlt + i
427 ie = indx_drape(nft + i)
428 IF(ie == 0) THEN
429 DO it=1,nptt
430 ipt = ipt_all + it
431 j = (ipt-1)*jlt + i
432 thk_it(ipt,i) = thk_ly(i)/thickt/nptt
433 IF (ipt == 1) THEN
434 posly(i,ipt) = zshift + half*thk_it(ipt,i)
435 ELSE
436 posly(i,ipt) = posly(i,ipt - 1)
437 . + half*(thk_it(ipt,i) + thk_it(ipt-1,i))
438 ENDIF
439 thkly(j) = thk_it(ipt,i)
440 ENDDO
441 ELSE
442 ip = drape(ie)%INDX_PLY(ilay)
443 thickt_drape = drape(ie)%THICK
444 IF(ip > 0) THEN
445 drape_ply => drape(ie)%DRAPE_PLY(ip)
446 nslice = drape_ply%NSLICE
447 DO it=1,nptt
448 ipt = ipt_all + it
449 j = (ipt-1)*jlt + i
450 thinning = drape_ply%RDRAPE(it,1)
451 thk_it(ipt,i) = thinning*thk_ly(i)/nptt
452 thk_it(ipt,i) = thk_it(ipt,i)/thickt_drape
453 IF (ipt == 1) THEN
454 posly(i,ipt) = zshift + half*thk_it(ipt,i)
455 ELSE
456 posly(i,ipt) = posly(i,ipt - 1)
457 . + half*(thk_it(ipt,i) + thk_it(ipt-1,i))
458 ENDIF
459 thkly(j) = thk_it(ipt,i)
460 ENDDO
461 ELSE
462 DO it=1,nptt
463 ipt = ipt_all + it
464 j = (ipt-1)*jlt + i
465 thk_it(ipt,i) = thk_ly(i
466 IF (ipt == 1) THEN
467 posly(i,ipt) = zshift + half*thk_it(ipt,i)
468 ELSE
469 posly(i,ipt) = posly(i,ipt - 1) ! integr. point "IT" position ratio
470 . + half*(thk_it(ipt,i) + thk_it(ipt-1,i))
471 ENDIF
472 thkly(j) = thk_it(ipt,i)
473 ENDDO
474 ENDIF
475 ENDIF
476 matly(jmly) = mat_ly(i)
477 ENDDO
478 ipt_all = ipt_all + nptt
479 ELSEIF (iint == 2) THEN
480 DO i=jft,jlt
481 mat_ly(i) = stack%IGEO(ipmat + ilay,isubstack)
482 thickt = stack%GEO(1,isubstack)
483 thk_ly(i) = stack%GEO(ipthk + ilay,isubstack)*thickt
484 pos_ly(i) = stack%GEO(ippos + ilay,isubstack)*thickt
485 ratio_thkly(i,ilay) = thk_ly(i)/thickt_drape
486 jmly = (ilay-1)*jlt + i
487 ie = indx_drape(nft + i)
488 IF(ie == 0) THEN
489 DO it=1,nptt
490 ipt = ipt_all + it
491 j = (ipt-1)*jlt + i
492 thk_it(ipt,i) = half*thk_ly(i)*w_gauss(it,nptt)/thk(i)
493 IF (ipt == 1) THEN
494 posly(i,ipt) = zshift + half*thk_it(ipt,i)
495 ELSE
496 posly(i,ipt) = posly(i,ipt - 1)
497 . + half*(thk_it(ipt,i) + thk_it(ipt-1,i))
498 ENDIF
499 thkly(j) = thk_it(ipt,i)
500 ENDDO
501 ELSE
502 ip = drape(ie)%INDX_PLY(ilay)
503 IF(ip > 0) THEN
504 drape_ply => drape(ie)%DRAPE_PLY(ip)
505 nslice = drape_ply%NSLICE
506 DO it=1,nptt
507 ipt = ipt_all + it
508 j = (ipt-1)*jlt + i
509 thinning = drape_ply%RDRAPE(it,1)
510 thk_it(ipt,i) = thinning*half*thk_ly(i)*w_gauss(it,nptt)
511 thk_it(ipt,i) = thk_it(ipt,i)/thickt_drape
512 IF (ipt == 1) THEN
513 posly(i,ipt) = zshift + half*thk_it(ipt,i)
514 ELSE
515 posly(i,ipt) = posly(i,ipt - 1)
516 . + half*(thk_it(ipt,i) + thk_it(ipt-1,i))
517 ENDIF
518 thkly(j) = thk_it(ipt,i)
519 ENDDO
520 ELSE
521 DO it=1,nptt
522 ipt = ipt_all + it
523 j = (ipt-1)*jlt + i
524 thk_it(ipt,i) = half*thk_ly(i)*w_gauss(it,nptt)
525 thk_it(ipt,i) = thk_it(ipt,i)/thickt_drape
526 IF (ipt == 1) THEN
527 posly(i,ipt) = zshift + half*thk_it(ipt,i)
528 ELSE
529 posly(i,ipt) = posly(i,ipt - 1)
530 . + half*(thk_it(ipt,i) + thk_it(ipt-1,i))
531 ENDIF
532 thkly(j) = thk_it(ipt,i)
533 ENDDO
534 ENDIF
535 ENDIF
536 matly(jmly) = mat_ly
537 ENDDO
538 ipt_all = ipt_all + nptt
539 ENDIF
540 ENDDO
541 ENDIF
542
543 CASE DEFAULT
544
545 DO n=1,npt
546 iadr = (n-1)*jlt
547 pos_0 = geo(ippos+n,pid(1))
548 thk_nptt = geo(ipthk+n,pid(1))
549 DO i = jft,jlt
550 j = iadr+i
551 thkly(j) = thk_nptt
552 posly(i,n) = pos_0
553 matly(j) = mat(1)
554 ENDDO
555 ENDDO
556
557 END SELECT
558
559 END IF
560 DEALLOCATE(thk_it)
561
562 RETURN