kfce
C KFCE SOURCE PV 20/03/24 21:18:33 10554 SUBROUTINE KFCE(IQUAD,MELEMQ) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C************************************************************************* C C Objet : calcule les connectivites faces -> elements (SEG3) C (Ptc 1 Face Pc2) C les supports geometriques des faces (POI1) C C Syntaxe : A , B , C , D , E = 'KFCE' GEO GEO1 <'INCL' TABD> ; C C A : Connectivites elements -> faces (ELTFA) MELAF C B : Support geometrique des centres (CENTRE) MELEM1 C C : Connectivites faces -> sommets (FACEP) MPFD C D : Connectivites faces -> elements (FACEL) MFD C E : Support geometrique des faces (FACE) MF1 C C C GEO : objet maillage C GEO1 : support geometrique de l'objet maillage C C INCL : directive indiquant qu'on cherche a inclure les C points crees dans le domaine TABD C_________________________________________________________________________ C C NPF = IKAS(5,I,NTYEL)= le nombre de point constituant une face pour C le type d'element NTYEL C C C************************************************************************* PARAMETER (NBTYEL=10) CHARACTER*8 LTYPEL(NBTYEL),NOM8,TYPE DIMENSION IKAS(5,6,NBTYEL),NPS(4),LTPL(4),MPS(4) DIMENSION LNBFAC(NBTYEL),NBTYF(NBTYEL),LNBSO(25) C C CORRESPONDANCE C maillage SEG2 TRI3 QUA4 CUB8 PRI6 PYR5 TET4 TRI6 SEG3 QUA9 C | | | | | | | | | | C V V V V V V V V V V C faces SEG2 TRI3 QUA4 PRI6 PYR5 QUA5 TET4 TRI3 SEG2 QUA4 C C C ALIAS seg2 tri3 qua4 pri6 pyr5 qua5 tet4 cub8 tri6 seg3 qua8 C ALIAS numero 2 4 8 16 25 9 23 14 6 3 10 -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMTABLE POINTEUR MTABD.MTABLE,MTBT.MTABLE -INC SMLENTI -INC SMELEME POINTEUR MFD.MELEME,MF1.MELEME,MELEM1.MELEME POINTEUR MPFD.MELEME,MELAF.MELEME POINTEUR MELEMC.MELEME,MELEF1.MELEME POINTEUR MELES1.MELEME,MELEMQ.MELEME POINTEUR MELEM0.MELEME -INC CCGEOME SEGMENT TRAV INTEGER ITRAV(NBFA,4) ENDSEGMENT CHARACTER*4 LISMO(1) PARAMETER (NTB=1) DIMENSION KTAB(NTB) CHARACTER*8 LTAB(NTB) DATA LTYPEL/'SEG2 ','TRI3 ','QUA4 ','CUB8 ', & 'PRI6 ','PYR5 ','TET4 ', & 'TRI6 ','SEG3 ','QUA8 '/ DATA LNBFAC/ 2 , 3 , 4 , 6 , 5 , 5 , 4 , & 3 , 2 , 4 / DATA NBTYF/ 2 , 4 , 8 , 16 , 25 , 9 , 23 , & 4 , 2 , 8 / C LNBSO pointe sur la ligne de IKAS en fct du type d'element (position C dans LNBSO) DATA LNBSO /0 ,1 ,9 ,2 ,0 ,8 ,0 ,3 , & 0 ,10,0 ,0 ,0 ,4 ,0 ,5 , & 0 ,0 ,0 ,0 ,0 ,0 ,7 ,0 ,6/ DATA IKAS/ & 1,0,0,0,1,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, & 1,2,0,0,2,2,3,0,0,2,3,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, & 1,2,0,0,2,2,3,0,0,2,3,4,0,0,2,4,1,0,0,2,0,0,0,0,0,0,0,0,0,0, & 1,2,3,4,4,5,6,7,8,4,1,2,6,5,4,2,3,7,6,4,3,4,8,7,4,4,1,5,8,4, & 1,2,3,0,3,4,5,6,0,3,1,2,5,4,4,2,3,6,5,4,3,1,4,6,4,0,0,0,0,0, & 1,2,3,4,4,1,2,5,0,3,2,3,5,0,3,3,4,5,0,3,4,1,5,0,3,0,0,0,0,0, & 1,2,4,0,3,1,2,3,0,3,4,2,3,0,3,1,4,3,0,3,0,0,0,0,0,0,0,0,0,0, & 1,3,0,0,2,3,5,0,0,2,5,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, & 1,0,0,0,1,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, & 1,3,0,0,2,3,5,0,0,2,5,7,0,0,2,7,1,0,0,2,0,0,0,0,0,0,0,0,0,0/ DATA LTPL /1,2,4,8/ DATA LISMO /'INCL'/ DATA LTAB /'DOMAINE '/ C*** MELEM0=MELEME IF(IRET.EQ.0)GO TO 90 XVAL=ABS(XVAL) MTABD=0 KINC=0 IF(IP.NE.0)THEN KINC=1 NTO=1 IF(IRET.EQ.0)RETURN IF(IRET.EQ.0)RETURN XVAL=ABS(XVAL) MTABD=KTAB(1) TYPE=' ' IF(TYPE.NE.'MAILLAGE')RETURN TYPE=' ' IF(TYPE.NE.'MAILLAGE')RETURN TYPE=' ' IF(TYPE.NE.'MAILLAGE')RETURN ENDIF SEGACT MELEME NBSOUS=LISOUS(/1) IF(NBSOUS.NE.0)THEN NBNN=0 NBELEM=0 NBREF=0 SEGINI MELAF ELSE NBSOUS=1 ENDIF NBFA=0 IELIM=0 NBS=NBSOUS DO 1 L=1,NBS IF(NBS.NE.1)THEN IPT1=LISOUS(L) SEGACT IPT1 ELSE IPT1=MELEME ENDIF NOM8=NOMS(IPT1.ITYPEL)//' ' C write(6,*)' NOM8,IP=',NOM8,IP IF(IP.EQ.0)THEN WRITE(6,*)' On ne sait rien faire pour cet element ',NOM8 GO TO 90 ENDIF IF((IDIM.EQ.2.AND.IP.EQ.1).OR. $ (IDIM.EQ.3.AND.IP.LE.3)) IELIM=1 NBNN=LNBFAC(IP) NBELEM=IPT1.NUM(/2) NBFA=NBFA+NBELEM*NBNN NBSOUS=0 NBREF=0 SEGINI IPT2 IPT2.ITYPEL=NBTYF(IP) IF(NBS.NE.1) THEN MELAF.LISOUS(L)=IPT2 CG Pas besoin de désactiver MELAF, MELEME, IPT1, IPT2 CG SEGDES IPT2 CG SEGDES IPT1 ELSE MELAF=IPT2 ENDIF 1 CONTINUE CG SEGDES MELEME CG SEGDES MELAF C write(6,*)' Nombre de face total =',NBFA IDIM1=IDIM+1 CG Pas besoin d'activer MELAF, MELEME, IPT1, IPT2 CG SEGACT MELEME,MELAF*MOD DO 50 L=1,NBS IF(NBS.NE.1)THEN IPT1=LISOUS(L) IPT2=MELAF.LISOUS(L) CG SEGACT IPT1 CG SEGACT IPT2*MOD ELSE IPT1=MELEME IPT2=MELAF ENDIF NOM8=NOMS(IPT1.ITYPEL)//' ' IF(IP.GE.8.AND.IP.LE.10)THEN IQUAD=1 ELSE IQUAD=0 ENDIF NBFAC=LNBFAC(IP) NEL=IPT1.NUM(/2) NP=IPT1.NUM(/1) C ici on reserve la place pour les faces (ne concerne pas les TRI6...) NELN=0 IF(IQUAD.EQ.0)THEN NELN=NEL*NBFAC C write(6,*)' NBFAC=',NBFAC,' IP=',IP,' NP=',NP,' NF=',NF segact mcoord*mod NBPTI=nbpts KF=NBPTI NBPTS=NBPTI+NELN SEGADJ MCOORD ENDIF DO 52 I=1,NBFAC NPF=IKAS(5,I,IP) I1=IKAS(1,I,IP) I3=IKAS(3,I,IP) I4=IKAS(4,I,IP) GO TO (631,632,633,634),NPF 631 CONTINUE IF(IDIM.EQ.2)THEN C write(6,*)' Cas Segment la face est un poi1 ' IF(IQUAD.EQ.0)THEN DO 851 K=1,NEL KF1=KF KF=KF+1 IPT2.NUM(I,K)=KF N1=IPT1.NUM(I1,K) N11=N1-1 MD1=N11*IDIM1+1 MD2=N11*IDIM1+2 MG1=KF1*IDIM1+1 MG2=KF1*IDIM1+2 XCOOR(MG1)=XCOOR(MD1) XCOOR(MG2)=XCOOR(MD2) XCOOR(KF*IDIM1)=XCOOR(N1*IDIM1) 851 CONTINUE ELSE DO 751 K=1,NEL IPT2.NUM(I,K)=IPT1.NUM(I1,K) 751 CONTINUE ENDIF ELSE DO 951 K=1,NEL KF1=KF KF=KF+1 IPT2.NUM(I,K)=KF N1=IPT1.NUM(I1,K) N11=N1-1 MD1=N11*IDIM1+1 MD2=N11*IDIM1+2 MD3=N11*IDIM1+3 MG1=KF1*IDIM1+1 MG2=KF1*IDIM1+2 MG3=KF1*IDIM1+3 XCOOR(MG1)=XCOOR(MD1) XCOOR(MG2)=XCOOR(MD2) XCOOR(MG3)=XCOOR(MD3) XCOOR(KF*IDIM1)=XCOOR(N1*IDIM1) 951 CONTINUE ENDIF GO TO 640 632 CONTINUE IF(IDIM.EQ.2)THEN C write(6,*)' Cas Triangle ou quadrangle la face est un seg2 ' IF(IQUAD.EQ.0)THEN DO 852 K=1,NEL KF1=KF KF=KF+1 IPT2.NUM(I,K)=KF N1=IPT1.NUM(I1,K) MG1=KF1*IDIM1+1 MG2=KF1*IDIM1+2 XCOOR(MG1)= & (XCOOR((N1-1)*IDIM1+1)+XCOOR((N2-1)*IDIM1+1)) $ /2.D0 XCOOR(MG2)= & (XCOOR((N1-1)*IDIM1+2)+XCOOR((N2-1)*IDIM1+2)) $ /2.D0 XCOOR(KF*IDIM1)=(XCOOR(N1*IDIM1)+XCOOR(N2*IDIM1))/2 $ .D0 C write(6,*)' KF=',KF,XCOOR(MG1),XCOOR(MG2) 852 CONTINUE ELSE C write(6,*)' I1,I=',i1,i DO 752 K=1,NEL IPT2.NUM(I,K)=IPT1.NUM(I1+1,K) 752 CONTINUE ENDIF ELSE DO 952 K=1,NEL KF1=KF KF=KF+1 IPT2.NUM(I,K)=KF N1=IPT1.NUM(I1,K) MG1=KF1*IDIM1+1 MG2=KF1*IDIM1+2 MG3=KF1*IDIM1+3 XCOOR(MG1)= & (XCOOR((N1-1)*IDIM1+1)+XCOOR((N2-1)*IDIM1+1))/2 $ .D0 XCOOR(MG2)= & (XCOOR((N1-1)*IDIM1+2)+XCOOR((N2-1)*IDIM1+2))/2 $ .D0 XCOOR(MG3)= & (XCOOR((N1-1)*IDIM1+3)+XCOOR((N2-1)*IDIM1+3))/2 $ .D0 XCOOR(KF*IDIM1)=(XCOOR(N1*IDIM1)+XCOOR(N2*IDIM1))/2.D0 952 CONTINUE ENDIF GO TO 640 633 CONTINUE DO 853 K=1,NEL KF1=KF KF=KF+1 IPT2.NUM(I,K)=KF N1=IPT1.NUM(I1,K) N3=IPT1.NUM(I3,K) MG1=KF1*IDIM1+1 MG2=MG1+1 MG3=MG1+2 XCOOR(MG1)= & (XCOOR((N1-1)*IDIM1+1)+XCOOR((N2-1)*IDIM1+1) & +XCOOR((N3-1)*IDIM1+1))/3.D0 XCOOR(MG2)= & (XCOOR((N1-1)*IDIM1+2)+XCOOR((N2-1)*IDIM1+2) & +XCOOR((N3-1)*IDIM1+2))/3.D0 XCOOR(MG3)= & (XCOOR((N1-1)*IDIM1+3)+XCOOR((N2-1)*IDIM1+3) & +XCOOR((N3-1)*IDIM1+3))/3.D0 XCOOR(KF*IDIM1)=(XCOOR(N1*IDIM1)+XCOOR(N2*IDIM1) & +XCOOR(N3*IDIM1))/3.D0 853 CONTINUE GO TO 640 634 CONTINUE DO 854 K=1,NEL KF1=KF KF=KF+1 IPT2.NUM(I,K)=KF N1=IPT1.NUM(I1,K) N3=IPT1.NUM(I3,K) N4=IPT1.NUM(I4,K) MG1=KF1*IDIM1+1 MG2=MG1+1 MG3=MG1+2 XCOOR(MG1)= & (XCOOR((N1-1)*IDIM1+1)+XCOOR((N2-1)*IDIM1+1) & +XCOOR((N3-1)*IDIM1+1)+XCOOR((N4-1)*IDIM1+1))/4.D0 XCOOR(MG2)= & (XCOOR((N1-1)*IDIM1+2)+XCOOR((N2-1)*IDIM1+2) & +XCOOR((N3-1)*IDIM1+2)+XCOOR((N4-1)*IDIM1+2))/4.D0 XCOOR(MG3)= & (XCOOR((N1-1)*IDIM1+3)+XCOOR((N2-1)*IDIM1+3) & +XCOOR((N3-1)*IDIM1+3)+XCOOR((N4-1)*IDIM1+3))/4.D0 XCOOR(KF*IDIM1)=(XCOOR(N1*IDIM1)+XCOOR(N2*IDIM1) & +XCOOR(N3*IDIM1)+XCOOR(N4*IDIM1))/4.D0 854 CONTINUE 640 CONTINUE 52 CONTINUE CG Normalement, il n'y a pas besoin de désactiver MELAF et MELEME CG vu qu'ils sont réutilisés juste après CG IF(NBS.NE.1)THEN CG SEGDES IPT2 CG SEGDES IPT1 CG ENDIF 50 CONTINUE CG SEGDES MELAF CG SEGDES MELEME IF(IXV.EQ.0)XVAL=XCOOR(KF*IDIM1)*(1.D-4)+1.D-8 WRITE(6,1951) 1951 FORMAT(1H+,' Creation des points face ') CALL PRCHAN IF(IRET.EQ.0)RETURN C Ici On cree les points centre C write(6,*)' Ici On cree les points centre' CALL CRECTR IF(IRET.EQ.0)RETURN IF(IQUAD.EQ.1)THEN C Cas des éléments quadratiques on cree des TRI7,QUA9... C write(6,*)' Cas des éléments quadratiques' SEGACT MELEME,MELEM1 NBSOUS=LISOUS(/1) NBSOU2=NBSOUS IF(NBSOUS.EQ.0)NBSOU2=1 DO 1880 L=1,NBSOU2 IPT1=MELEME IF(NBSOU2.NE.1)IPT1=LISOUS(L) SEGACT IPT1 NBNN=IPT1.NUM(/1)+1 IF(IPT1.ITYPEL.EQ.3)NBNN=IPT1.NUM(/1) NBELEM=IPT1.NUM(/2) NBREF=0 IF(L.EQ.1.AND.NBSOU2.EQ.1)THEN SEGINI MELEMQ IPT2=MELEMQ ELSEIF(L.EQ.1.AND.NBSOU2.NE.1)THEN NBNN=0 NBELEM=0 NBREF=0 SEGINI MELEMQ NBNN=IPT1.NUM(/1)+1 IF(IPT1.ITYPEL.EQ.3)NBNN=IPT1.NUM(/1) NBELEM=IPT1.NUM(/2) NBSOUS=0 NBREF=0 SEGINI IPT2 MELEMQ.LISOUS(1)=IPT2 NBSOUS=NBSOU2 ELSE NBSOUS=0 NBREF=0 SEGINI IPT2 MELEMQ.LISOUS(L)=IPT2 NBSOUS=NBSOU2 ENDIF IF(IPT1.ITYPEL.EQ.6)THEN IPT2.ITYPEL=7 DO 1883 K=1,NBELEM DO 1882 I=1,NBNN-1 IPT2.NUM(I,K)=IPT1.NUM(I,K) 1882 CONTINUE 1883 CONTINUE ELSEIF(IPT1.ITYPEL.EQ.3)THEN IPT2.ITYPEL=3 DO 1885 K=1,NBELEM DO 18851 I=1,NBNN IPT2.NUM(I,K)=IPT1.NUM(I,K) 18851 CONTINUE 1885 CONTINUE ELSEIF(IPT1.ITYPEL.EQ.10)THEN IPT2.ITYPEL=11 DO 1886 K=1,NBELEM DO 1887 I=1,NBNN-1 IPT2.NUM(I,K)=IPT1.NUM(I,K) 1887 CONTINUE 1886 CONTINUE ELSE WRITE(6,*)' Type d''élément non encore prévu' ENDIF 1880 CONTINUE ENDIF C<<<<<<<<<<<<< C CALL ECMO(MTBT,'MELEM0','MAILLAGE',MELEM0) C CALL ECMO(MTBT,'MELAF','MAILLAGE',MELAF) IF(IELIM.NE.0)THEN WRITE(6,1952) 1952 FORMAT(1H+,' Elimination entre points centre et points face') IF(IRET.EQ.0)RETURN WRITE(6,1954) 1954 FORMAT(1H+,' Elimination entre points face et points sommet') IF(IRET.EQ.0)RETURN ENDIF C Ici On cree les connectivites FACEL (SEG3) C -> In KRIPAD : SEGINI MLENTI C -> In KRIPAD : SEGACT MF1 SEGDES MF1 SEGACT MELEM1 NBNN=3 NBELEM=NBFA NBSOUS=0 NBREF=0 SEGINI MFD MFD.ITYPEL=3 SEGACT MELAF NBSOUS=MELAF.LISOUS(/1) IF(NBSOUS.EQ.0)NBSOUS=1 NK=0 DO 784 NS=1,NBSOUS IF(NBSOUS.NE.1)THEN MELEME=MELAF.LISOUS(NS) SEGACT MELEME ELSE MELEME=MELAF ENDIF NEL=NUM(/2) NP =NUM(/1) DO 783 K=1,NEL NK=NK+1 NNK=MELEM1.NUM(1,NK) DO 782 I=1,NP NUF=NUM(I,K) NUF1=LECT(NUF) MFD.NUM(1,NUF1)=NNK MFD.NUM(2,NUF1)=NUF 782 CONTINUE 783 CONTINUE CG Pas besoin de désactiver CG IF(NBSOUS.NE.1)SEGDES MELEME CG SEGDES MELEME 784 CONTINUE NK=NK+1 DO 785 NS=NBSOUS,1,-1 IF(NBSOUS.NE.1)THEN MELEME=MELAF.LISOUS(NS) CG Pas besoin de réactiver CG SEGACT MELEME ELSE MELEME=MELAF ENDIF NEL=NUM(/2) NP =NUM(/1) DO 786 K=NEL,1,-1 NK=NK-1 NNK=MELEM1.NUM(1,NK) DO 787 I=1,NP NUF=NUM(I,K) NUF1=LECT(NUF) MFD.NUM(3,NUF1)=NNK 787 CONTINUE 786 CONTINUE CG Pas besoin de désactiver mais après, il s'appelle IPT1 ! CG IF(NBSOUS.NE.1)SEGDES MELEME 785 CONTINUE CG SEGDES MELAF SEGDES MFD SEGDES MELEM1 C ici on cree les connectivites face --> sommet CG Sous-entendu : NBFA=nb_éléments(MF1) SEGINI TRAV SEGACT MELEM0 CG SEGACT MELAF NBSOUS=MELAF.LISOUS(/1) IF(NBSOUS.EQ.0)NBSOUS=1 DO 338 L=1,NBSOUS IF(NBSOUS.NE.1)THEN IPT1=MELAF.LISOUS(L) IPT2=MELEM0.LISOUS(L) CG Déja activé plus haut CG SEGACT IPT1 SEGACT IPT2 ELSE IPT1=MELAF IPT2=MELEM0 ENDIF NP =IPT1.NUM(/1) NEL=IPT1.NUM(/2) IP=LNBSO(IPT2.ITYPEL) DO 339 K=1,NEL DO 3391 I=1,NP NUF=IPT1.NUM(I,K) NUF=LECT(NUF) ITRAV(NUF,1)=IPT2 ITRAV(NUF,2)=IP ITRAV(NUF,3)=I ITRAV(NUF,4)=K 3391 CONTINUE 339 CONTINUE IF(NBSOUS.NE.1)SEGDES IPT1 338 CONTINUE SEGDES MELAF SEGSUP MLENTI C write(6,*)' Fin premiere partie ' DO 340 L=1,NBFA IP=ITRAV(L,2) I =ITRAV(L,3) NBS=IKAS(5,I,IP) C write(6,*)' IP,I,nbs=',IP,I,nbs NPS(NBS)=NPS(NBS)+1 340 CONTINUE C write(6,*)' NPS=',NPS NT=0 DO 341 I=1,4 IF(NPS(I).NE.0)THEN NT=NT+1 IT=I ENDIF 341 CONTINUE NBREF=0 IF(NT.EQ.1)THEN NBSOUS=0 NBELEM=NPS(IT) NBNN=IT SEGINI MELEME ITYPEL=LTPL(IT) NPS(IT)=MELEME ELSE NBSOUS=NT NBELEM=0 NBNN=0 SEGINI MELEME JJ=0 DO 342 J=1,4 IF(NPS(J).EQ.0)GO TO 342 JJ=JJ+1 NBSOUS=0 NBREF=0 NBNN=J NBELEM=NPS(J) SEGINI IPT3 LISOUS(JJ)=IPT3 IPT3.ITYPEL=LTPL(J) NPS(J)=IPT3 C write(6,*)' ipt3=',ipt3,' j=',j,' jj=',jj 342 CONTINUE ENDIF MPFD=MELEME C write(6,*)' Fin deuxieme partie MPFD=',MPFD DO 343 L=1,NBFA IPT2=ITRAV(L,1) IP=ITRAV(L,2) I =ITRAV(L,3) K =ITRAV(L,4) NBS=IKAS(5,I,IP) IPT3=NPS(NBS) MPS(NBS)=MPS(NBS)+1 KK=MPS(NBS) DO 344 J=1,NBS JJ=IKAS(J,I,IP) C write(6,*)'j,kk=',j,kk,' jj,k',jj,k,' nbs=',nbs IPT3.NUM(J,KK)=IPT2.NUM(JJ,K) 344 CONTINUE 343 CONTINUE IF(MPFD.LISOUS(/1).NE.0)THEN NSO=MPFD.LISOUS(/1) DO 765 I=1,NSO IPT3=MPFD.LISOUS(I) SEGDES IPT3 765 CONTINUE ENDIF SEGDES MPFD IF(MELEM0.LISOUS(/1).NE.0)THEN NSO=MELEM0.LISOUS(/1) DO 766 I=1,NSO IPT3=MELEM0.LISOUS(I) SEGDES IPT3 766 CONTINUE SEGDES MELEM0 ENDIF SEGSUP TRAV IF(KINC.EQ.1)THEN WRITE(6,1953) 1953 FORMAT(1H+ $ ,' Elimination avec les points d''un autre domaine') CALL PRFUSE CALL PRFUSE IF(IRET.EQ.0)RETURN CALL PRFUSE IF(IRET.EQ.0)RETURN C write(6,*)' Avant prelim ipt1=',ipt1,' ipt2',ipt2 C write(6,*)' retour PRELIM IPT3=',IPT3 SEGSUP IPT1 SEGSUP IPT2 C SEGSUP IPT3 ENDIF SEGSUP MTBT RETURN 90 CONTINUE WRITE(6,*)' Retour anormal de KFCE ' RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales