35 . IGRSH3N ,IGRSH4N ,IXC ,IXTG ,
36 . IGEO ,GEO ,THK ,STACK ,
37 . IGEO_STACK ,GEO_STACK , STACK_INFO ,
38 . NUMGEO_STACK,NPROP_STACK , PLY_INFO)
48 use element_mod ,
only : nixc,nixtg
52#include "implicit_f.inc"
63#include "remesh_c.inc"
69 INTEGER IXC(NIXC,NUMELC),
70 . IXTG(NIXTG,NUMELTG),IGEO(NPROPGI,NUMGEO),IWORKSH(3,NUMELC+NUMELTG),
71 . IGEO_STACK(NPROPGI,NUMSTACK + NUMPLY),NUMGEO_STACK(NUMGEO+NUMSTACK),
73 INTEGER ,
INTENT(INOUT) :: PLY_INFO(2,NUMPLY)
75 . GEO(NPROPG,NUMGEO),THK(NUMELC+NUMELTG),GEO_STACK(NPROPG,NUMSTACK + NUMPLY)
77 TYPE (GROUP_) ,
DIMENSION(NGRSH3N) :: IGRSH3N
78 TYPE (GROUP_) ,
DIMENSION(NGRSHEL) :: IGRSH4N
79 TYPE (DRAPE_) ,
DIMENSION(NUMELC + NUMELTG) ,
TARGET :: DRAPE
80 TYPE (DRAPEG_) ,
TARGET :: DRAPEG
81 TYPE(
drape_work_) ,
DIMENSION(NUMELC + NUMELTG) ,
TARGET :: IWORK_T
85 INTEGER I,J,II,IGTYP,ID,JD,IDPLY,NEL,
86 . IAD,ITY,IDSHEL,PID,IS,IDS,NSH,MODE,JJ,NGEO_STACK,
87 . IGRTYP,N1,IPMAT,IPANG,IPTHK,IIGEO,NSS,IPPOS,NPT,,NP,
88 . JJPID,JSTACK,JPID,ITG,IPMAT_IPLY,ISH3N,J4N,J3N,IPOS,
89 . mat_ly,nlay,nptt,ipidl,it,ilay,ipthk_nptt,ippos_nptt,
90 . iint,ipid_ly,ipdir ,ns_stack0 ,npt_stack0,is0,js,pids,ip,
91 . ii1,ii2,jj1,jj2,nslice,ie_drp,npt_lay,ipnpt_lay,
92 . ibit, nkey, ikey,irest,n_ply,nbit,nply,ns_total,ns_first,
93 . ns_sub, nstack,i1,i2,ies
94 INTEGER ,
DIMENSION(:),
ALLOCATABLE :: WORK,INDX_SH,PID_SH,
95 . NFIRST,NLAST,ISUBSTACK,IPTPLY,
96 . NFIRST1,NLAST1,NFIRST2,NLAST2,
98 INTEGER :: NBFI,IPPID,NGL,IPID_1,NUMS,IPWEIGHT,IPTHKLY,NSHQ4,NSHT3
100 . THICKT,ZSHIFT,TMIN,TMAX,DT,THK_LY,POS_LY,THK_IT(100),
101 . POS_IT(100),POS_NPTT,THK_NPTT,POS_0,THINNING,POS
103 INTEGER,
DIMENSION(:,:) ,
ALLOCATABLE :: ITRI,ACTIV_PLY
104 INTEGER,
DIMENSION(:) ,
ALLOCATABLE ::INDX,IDSTACK,INDX_SUB
105 TYPE () :: STACK, IWORKS
106 TYPE (STACK_INFO_ ) ,
DIMENSION (1:NPROP_STACK) :: STACK_INFO
107 TYPE (DRAPE_PLY_),
POINTER :: DRAPE_PLY
108 CHARACTER(LEN=NCHARTITLE) :: TITR,TITR1
111 . a_gauss(9,9),w_gauss(9,9)
117 2 -.577350269189626,0.577350269189626,0. ,
120 3 -.774596669241483,0. ,0.774596669241483,
123 4 -.861136311594053,-.339981043584856,0.339981043584856,
124 4 0.861136311594053,0. ,0. ,
126 5 -.906179845938664,-.538469310105683,0. ,
127 5 0.538469310105683,0.906179845938664,0. ,
129 6 -.932469514203152,-.661209386466265,-.238619186083197,
130 6 0.238619186083197,0.661209386466265,0.932469514203152,
132 7 -.949107912342759,-.741531185599394,-.405845151377397,
133 7 0. ,0.405845151377397,0.741531185599394,
134 7 0.949107912342759,0. ,0. ,
135 8 -.960289856497536,-.796666477413627,-.525532409916329,
136 8 -.183434642495650,0.183434642495650,0.525532409916329,
137 8 0.796666477413627,0.960289856497536,0. ,
138 9 -.968160239507626,-.836031107326636,-.613371432700590,
139 9 -.324253423403809,0. ,0.324253423403809,
140 9 0.613371432700590,0.836031107326636,0.968160239507626/
148 3 0.555555555555556,0.888888888888889,0.555555555555556,
151 4 0.347854845137454,0.652145154862546,0.652145154862546,
152 4 0.347854845137454,0. ,0. ,
154 5 0.236926885056189,0.478628670499366,0.568888888888889,
155 5 0.478628670499366,0.236926885056189,0. ,
157 6 0.171324492379170,0.360761573048139,0.467913934572691,
158 6 0.467913934572691,0.360761573048139,0.171324492379170,
160 7 0.129484966168870,0.279705391489277,0.381830050505119,
161 7 0.417959183673469,0.381830050505119,0.279705391489277,
162 7 0.129484966168870,0. ,0. ,
163 8 0.101228536290376,0.222381034453374,0.313706645877887,
164 8 0.362683783378362,0.362683783378362,0.313706645877887,
165 8 0.222381034453374,0.101228536290376,0. ,
166 9 0.081274388361574,0.180648160694857,0.260610696402935,
167 9 0.312347077040003,0.330239355001260,0.312347077040003,
168 9 0.260610696402935,0.180648160694857,0.081274388361574/
179 ALLOCATE (indx_sh(numelc+numeltg),pid_sh(numelc+numeltg),
180 . isubstack(numgeo+numstack),
181 . iptply(numgeo+numply), work(70000) )
191 IF(ipart_stack > 0)
THEN
196 nstack = igeo(42,i) ! number of stack
where ply is attached
197 IF (igtyp == 19 .AND. nstack > 0) nply = nply+1
204 IF(igtyp == 17 .OR. igtyp == 51)
THEN
214 IF(igtyp == 17 .OR. igtyp == 51)
THEN
216 indx_sh(nsh) = i + numelc
221 nbit = bit_size(nply)
222 irest = mod(nply,nbit)
224 IF(irest > 0) nkey = nkey + 1
225 ALLOCATE( activ_ply(numelc+numeltg,nkey))
226 IF(numelc + numeltg > 0)activ_ply = 0
233 ie_drp = drapeg%INDX(ii)
236 ALLOCATE(iwork_t(ii)%NPT_PLY(npt))
237 iwork_t(ii)%NPT_PLY = 0
239 n_ply = iwork_t(ii)%PLYNUM(j)
241 IF(mod(n_ply,nbit) > 0 ) ikey = ikey + 1
242 ikey =
min(ikey, nkey)
243 ibit = n_ply - (ikey - 1)*nbit
244 idply = iwork_t(ii)%PLYID(j)
245 iwork_t(ii)%NPT_PLY(j) = 1
246 activ_ply(ii,ikey) = ibset(activ_ply(ii,ikey),ibit)
249 ELSEIF(igtyp == 51)
THEN
250 ALLOCATE(iwork_t(ii)%NPT_PLY(npt))
251 iwork_t(ii)%NPT_PLY = 0
252 IF(ie_drp > 0 .AND. npt > 0)
THEN
254 ip = drape(ie_drp)%INDX_PLY(j)
255 n_ply = iwork_t(ii)%PLYNUM(j)
257 IF(mod(n_ply,nbit) > 0 ) ikey = ikey + 1
258 ikey =
min(ikey, nkey)
259 ibit = n_ply - (ikey - 1)*nbit
260 activ_ply(ii,ikey) = ibset(activ_ply(ii,ikey),ibit)
262 drape_ply => drape(ie_drp)%DRAPE_PLY(ip)
263 nslice = drape_ply%NSLICE
264 idply = iwork_t(ii)%PLYID(j)
265 iwork_t(ii)%NPT_PLY(j) = nslice
266 igeo(44,idply) =
max(igeo(4,idply),nslice)
268 idply = iwork_t(ii)%PLYID(j)
269 npt_lay = igeo(4,idply)
270 iwork_t(ii)%NPT_PLY(j) = npt_lay
276 idply = iwork_t(ii)%PLYID(j)
277 npt_lay = igeo(4,idply)
278 iwork_t(ii)%NPT_PLY(j) = npt_lay
279 n_ply = iwork_t(ii)%PLYNUM(j)
281 IF(mod(n_ply,nbit) > 0 ) ikey = ikey + 1
282 ikey =
min(ikey, nkey)
283 ibit = n_ply - (ikey - 1)*nbit
284 activ_ply(ii,ikey) = ibset(activ_ply(ii,ikey),ibit)
291 ALLOCATE(indx(2*nsh),itri(2 + nkey,nsh),indx_total(nsh))
292 ALLOCATE (nfirst(nsh) ,nlast(nsh),
293 . nfirst1(nsh) ,nlast1(nsh))
306 itri(1,i) = pid_sh(i)
307 itri(2,i) = iworksh(1,ii)
309 itri(2+j,i) = activ_ply(ii,j)
316 CALL my_orders(mode, work, itri, indx, nsh , nkey)
322 ii = itri(ikey,indx(i))
323 jj = itri(ikey,indx(i-1))
325 ns_first = ns_first + 1
326 nfirst1(ns_first) = i
327 nlast1(ns_first) = nfirst1(ns_first)
329 ELSEIF(ikey == nkey)
THEN
330 nlast1(ns_first) = nlast1(ns_first) + 1
347 nsh = nlast1(is) - nfirst1(is) + 1
348 ALLOCATE(indx1(2*nsh),itri(nkey,nsh),indx_sub(nsh))
352 DO i= nfirst1(is), nlast1(is)
359 itri(j,i1) = iwork_t(ii)%NPT_PLY(j)
363 CALL my_orders(mode, work, itri, indx1, nsh , nkey)
364 ALLOCATE (nfirst2(nsh) ,nlast2(nsh))
370 ii = itri(ikey,indx1(i))
371 jj = itri(ikey,indx1(i-1))
375 nlast2(ns_sub) = nfirst2(ns_sub)
377 ELSEIF(ikey == nkey)
THEN
378 nlast2(ns_sub) = nlast2(ns_sub) + 1
384 ns_total = ns_total + 1
385 nfirst(ns_total) = nfirst1(is) + nfirst2(iis) - 1
386 nlast(ns_total ) = nfirst1(is) + nlast2(iis) - 1
387 DO i = nfirst2(iis),nlast2(iis)
388 i2 = nfirst1(is) + i - 1
389 indx_total(i2) = indx_sub(indx1(i)) !
392 DEALLOCATE(indx1,nfirst2,nlast2, itri,indx_sub)
394 ns_total = ns_total + 1
395 nfirst(ns_total) = nfirst1(is)
396 nlast(ns_total ) = nlast1(is)
397 DO i= nfirst1(is), nlast1(is)
398 indx_total(i) = indx(i)
402 DEALLOCATE(nfirst1,nlast1)
413 npt_stack =
max(npt_stack,npt)
416 ALLOCATE(iworks%IGEO(4*npt_stack+2,ns_stack))
417 ALLOCATE(iworks%GEO(6*npt_stack+1,ns_stack))
423 ngeo_stack = numgeo + is
435 DO i= nfirst(is) , nlast(is)
438 iworksh(2,ii) = ngeo_stack
451 nums = numgeo_stack(pid)
454 jpid = stack_info(nums)%PID(j)
457 jjpid = iwork_t(ies)%PLYID(jj)
458 IF(jjpid == jpid)
THEN
467 iworks%IGEO(1,is) = npt
468 iworks%IGEO(2,is) = pid
471 ipmat_iply = ipmat + npt
472 ipnpt_lay = ipmat_iply + npt
477 ipthkly = ipdir + npt
478 ipweight = ipthkly + npt
479 nums= numgeo_stack(pid)
482 iworks%IGEO(ippid + j,is) = stack_info(nums)%PID(jstack)
483 iworks%IGEO(ipmat + j,is) = stack_info(nums)%MID(jstack)
484 iworks%IGEO(ipmat_iply + j,is) = stack_info(nums)%MID_IP(jstack)
485 iworks%IGEO(ipnpt_lay + j,is) = iwork_t(ies)%NPT_PLY(j)
486 iworks%GEO(ipang + j,is) = stack_info(nums)%ANG(jstack)
487 iworks%GEO(ipthk + j,is) = stack_info(nums)%THK(jstack)
488 iworks%GEO(ippos + j,is) = stack_info(nums)%POS(jstack)
489 iworks%GEO(ipdir + j,is) = stack_info(nums)%DIR(jstack)
490 iworks%GEO(ipthkly + j,is) = stack_info(nums)%THKLY(jstack)
491 iworks%GEO(ipweight + j,is) = stack_info(nums)%WEIGHT(jstack)
497 zshift = geo(199,pid)
502 dt = half*iworks%GEO(ipthk + j ,is)
503 tmin =
min(tmin,iworks%GEO(ippos + j ,is)-dt)
504 tmax =
max(tmax,iworks%GEO(ippos + j ,is)+dt)
508 iworks%GEO(ipthk+j,is)=iworks%GEO(ipthk+j,is)/
max(thickt,em20)
509 iworks%GEO(ippos+j,is)=iworks%GEO(ippos+j,is)/
max(thickt,em20)
515 thickt = thickt + iworks%GEO(ipthk+j,is)
518 iworks%GEO(ipthk+j,is) =
519 . iworks%GEO(ipthk+j,is)/
max(thickt,em20)
522 IF(ipos == 2 ) zshift = zshift /
max(thickt,em20)
524 iworks%GEO(ippos+1,is) = zshift + half*iworks%GEO(ipthk+1,is)
526 iworks%GEO(ippos+j,is) = iworks%GEO(ippos+j-1,is)
527 . + half*(iworks%GEO(ipthk+j,is)+iworks%GEO(ipthk+j-1,is))
532 iworks%GEO(1,is) = thickt
537 DEALLOCATE(indx,nfirst,nlast,indx_total,activ_ply)
544 npt_stack0 = npt_stack
546 IF(ipart_pcompp > 0)
THEN
551 ids = igeo_stack(42,numstack + i)
552 IF (ids > 0) nply = nply+1
571 indx_sh(nsh) = i + numelc
576 nbit = bit_size(nply)
577 irest = mod(nply,nbit)
579 IF(irest > 0) nkey = nkey + 1
580 ALLOCATE( activ_ply(numelc+numeltg,nkey))
581 IF(numelc + numeltg > 0)activ_ply = 0
585 ie_drp = drapeg%INDX(ii)
586 ALLOCATE(iwork_t(ii)%NPT_PLY(npt))
587 iwork_t(ii)%NPT_PLY = 0
588 IF(ie_drp > 0 .AND. npt > 0)
THEN
590 ip = drape(ie_drp)%INDX_PLY(j)
591 n_ply = iwork_t(ii)%PLYNUM(j)
593 IF(mod(n_ply,nbit) > 0 ) ikey = ikey + 1
594 ikey =
min(ikey, nkey)
595 ibit = n_ply - (ikey - 1)*nbit
596 activ_ply(ii,ikey) = ibset(activ_ply(ii,ikey),ibit)
598 drape_ply => drape(ie_drp)%DRAPE_PLY(ip)
599 nslice = drape_ply%NSLICE
600 idply = iwork_t(ii)%PLYID(j)
601 iwork_t(ii)%NPT_PLY(j) = nslice
602 ply_info(2,idply - numstack) =
max(ply_info(2,idply - numstack),nslice)
604 idply = iwork_t(ii)%PLYID(j)
605 npt_lay = igeo_stack(4,idply)
606 iwork_t(ii)%NPT_PLY(j) = npt_lay
612 n_ply = iwork_t(ii)%PLYNUM(j)
614 IF(mod(n_ply,nbit) > 0 ) ikey = ikey + 1
615 ikey =
min(ikey, nkey)
616 ibit = n_ply - (ikey - 1)*nbit
617 activ_ply(ii,ikey) = ibset(activ_ply(ii,ikey),ibit)
618 idply = iwork_t(ii)%PLYID(j)
619 npt_lay = igeo_stack(4,idply)
620 iwork_t(ii)%NPT_PLY(j) = npt_lay
626 ALLOCATE(indx(2*nsh),itri(2 + nkey,nsh),indx_total(nsh))
627 ALLOCATE (nfirst(nsh) ,nlast(nsh),
628 . nfirst1(nsh) ,nlast1(nsh))
642 itri(1,i) = pid_sh(i)
643 itri(2,i) = iworksh(1,ii)
645 itri(2+j,i) = activ_ply(ii,j)
653 CALL my_orders(mode, work, itri, indx, nsh , nkey)
659 ii = itri(ikey,indx(i))
660 jj = itri(ikey,indx(i-1))
662 ns_first = ns_first + 1
663 nfirst1(ns_first) = i
664 nlast1(ns_first) = nfirst1(ns_first)
666 ELSEIF(ikey == nkey)
THEN
667 nlast1(ns_first) = nlast1(ns_first) + 1
683 nsh = nlast1(is) - nfirst1(is) + 1
684 ALLOCATE(indx1(2*nsh),itri(nkey,nsh),indx_sub(nsh))
688 DO i= nfirst1(is), nlast1(is)
695 itri(j,i1) = iwork_t(ii)%NPT_PLY(j)
699 CALL my_orders(mode, work, itri, indx1, nsh , nkey)
700 ALLOCATE (nfirst2(nsh) ,nlast2(nsh))
706 ii = itri(ikey,indx1(i))
707 jj = itri(ikey,indx1(i-1))
711 nlast2(ns_sub) = nfirst2(ns_sub)
713 ELSEIF(ikey == nkey)
THEN
714 nlast2(ns_sub) = nlast2(ns_sub) + 1
720 ns_total = ns_total + 1
721 nfirst(ns_total) = nfirst1(is) + nfirst2(iis) - 1
722 nlast(ns_total ) = nfirst1(is) + nlast2(iis) - 1
723 DO i = nfirst2(iis),nlast2(iis)
724 i2 = nfirst1(is) + i - 1
725 indx_total(i2) = indx_sub(indx1(i))
728 DEALLOCATE(indx1,nfirst2,nlast2, itri,indx_sub)
730 DEALLOCATE(nfirst1,nlast1)
734 ALLOCATE(idstack(ns_total))
736 ns_stack = ns_stack + ns_total
742 npt_stack =
max(npt_stack,npt)
744 ids = iwork_t(ii)%IDSTACK
750 ALLOCATE(stack%IGEO(4*npt_stack+2
751 ALLOCATE(stack%GEO(6*npt_stack+1,ns_stack))
752 ALLOCATE(stack%PM(20,ns_stack))
760 ngeo_stack = numgeo + numstack + numply + is
771 DO i= nfirst(is) , nlast(is)
774 iworksh(2,ii) = ngeo_stack
775 iworksh(3,ii) = ns_stack0 + is
779 DO j=2,npropgi - ltitr
780 igeo(j,pid) = igeo_stack
785 geo(j,pid) = geo_stack(j,idstack(is))
790 nums = numgeo_stack(numgeo + idstack(is))
792 jpid = stack_info(nums)%PID(j)
795 jjpid = iwork_t(ies)%PLYID(jj)
796 IF(jjpid == jpid)
THEN
807 stack%IGEO(1,iis) = npt
808 stack%IGEO(2,iis) = pid
811 ipmat_iply = ipmat + npt
812 ipnpt_lay = ipmat_iply + npt
818 ipthkly = ipdir + npt
819 ipweight =ipthkly + npt
822 nums = numgeo_stack(numgeo + pids)
825 stack%IGEO(ippid+j ,iis) = stack_info(nums)%PID(js)
826 stack%IGEO(ipmat + j ,iis) = stack_info(nums)%MID(js)
827 stack%IGEO(ipmat_iply+j ,iis) = stack_info(nums)%MID_IP(js)
828 stack%IGEO(ipnpt_lay + j,iis) = iwork_t(ies)%NPT_PLY(j)
829 stack%GEO(ipang + j ,iis) = stack_info(nums)%ANG(js)
830 stack%GEO(ipthk + j ,iis) = stack_info(nums)%THK(js)
831 stack%GEO(ippos + j ,iis) = stack_info(nums)%POS(js)
832 stack%GEO(ipdir + j ,iis) = stack_info(nums)%DIR(js)
833 stack%GEO(ipthkly + j ,iis) = stack_info(nums)%THKLY(js)
834 stack%GEO(ipweight + j ,iis) = stack_info(nums)%WEIGHT(js)
839 zshift = geo(199,pid)
844 dt = half*stack%GEO(ipthk + j ,iis)
845 tmin =
min(tmin,stack%GEO(ippos + j ,iis)-dt)
846 tmax =
max(tmax,stack%GEO(ippos + j ,iis)+dt)
850 stack%GEO(ipthk+j,iis)=
851 . stack%GEO(ipthk+j,iis)/
max(thickt,em20)
852 stack%GEO(ippos+j,iis)=
853 . stack%GEO(ippos+j,iis)/
max(thickt,em20)
859 thickt = thickt + stack%GEO(ipthk+j,iis)
862 stack%GEO(ipthk+j,iis) =
863 . stack%GEO(ipthk+j,iis)/
max(thickt,em20)
866 IF(ipos == 2 )zshift = zshift /
max(thickt,em20)
868 stack%GEO(ippos+1,iis) = zshift +
869 . half*stack%GEO(ipthk+1,iis)
871 stack%GEO(ippos+j,iis) =
872 . stack%GEO(ippos+j-1,iis) +
873 . half*(stack%GEO(ipthk+j,iis)+
874 . stack%GEO(ipthk+j-1,iis))
879 stack%GEO(1,iis) = thickt
884 pids = stack%IGEO(ippid + ilay ,iis)
885 nptt = igeo_stack(4,pids)
886 igeo(4,pid) =
max(igeo(4,pid),nptt)
890 DEALLOCATE(indx,nfirst,nlast,indx_total,idstack,activ_ply)
893 DO i=1,numelc + numeltg
896 DEALLOCATE(iwork_t(i)%PLYID)
897 DEALLOCATE(iwork_t(i)%NPT_PLY)
900 IF(ipart_stack > 0)
THEN
901 IF(ipart_pcompp == 0)
THEN
902 ALLOCATE(stack%IGEO(4*npt_stack0
903 ALLOCATE(stack%GEO(6*npt_stack0+1,ns_stack0))
904 ALLOCATE(stack%PM(20,ns_stack0))
910 DO j = 1, 4*npt_stack0 + 2
911 stack%IGEO(j, is ) = iworks%IGEO(j,is)
913 DO j = 1, 6*npt_stack0+1
914 stack%GEO(j, is ) = iworks%GEO(j,is)
918 DEALLOCATE(iworks%IGEO, iworks%GEO)
921 IF(ns_stack > 0)
THEN
923 npt = stack%IGEO(1,is)
924 pid = stack%IGEO(2,is)
925 thickt = stack%GEO(1,is)
929 WRITE(iout,1000)id, is
930 WRITE(iout,1100) thickt,npt
938 pid = stack%IGEO(ippid + j ,is)
939 pos = stack%GEO( ippos + j ,is)
941 id = igeo_stack(1,pid)
942 WRITE(iout,2000)j, id , pos
946 pid = stack%IGEO(ippid + j ,is)
947 pos = stack%GEO( ippos + j ,is)
950 WRITE(iout,2000)j, id , pos
956 IF(ipart_pcompp > 0 .AND. ipart_stack == 0) ipart_stack = 1
958 DEALLOCATE (indx_sh,pid_sh,isubstack,
963 & 5x,
'COMPOSITE STACK SHELL PROPERTY SET ',
964 &
'WITH VARIABLE THICKNESSES AND MATERIALS'//,
965 & 7x,
'PROPERTY SET NUMBER . . . . . . . . . . ..=',i10/,
966 & 7x,
'SUB PROPERTY SET NUMBER . . . . . . . . . .=',i10/)
968 & 8x,
'SHELL THICKNESS . . . . . . . . . . . .=',1pg20.13/
969 & 8x,
'NUMBER OF PLIES. . . . . . . . . . . . =',i10/)
972 & 8x,
' PLY PID NUMBER . . . . . . . . .=',i10/
973 & 8x,
' POSITION. . . . . . . . . . . . .=',1pg20.13/)