C MATRAN SOURCE CB215821 20/11/25 13:34:05 10792 SUBROUTINE MATRAN(MTABD,MCHPOI) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C------------------------------------------------------------------ C PROJET : CASTEM 2000 C C NOM : MATRAN C C DESCRIPTION : Cette subroutine cree un chpoint 'FACE' sur MTABD C contenant la matrice de passage du repaire global C dans le repaire de chaque face (voir CALJQB) C C LANGAGE : FORTRAN 77 + ESOPE 2000 C C AUTEUR : R. MOREL, DRN/DMT/SEMT/TTMF C C----------------------------------------------------------------- C C APPELES (E/S) : LEKTAB C C APPELES (Calcul): CALJBR C C----------------------------------------------------------------- C C ENTREES : C MTABD : Table de sous-type domaine C C SORTIES : C MCHPOI : Pointeur du CHPOIN contenant les C Matrices decrite ci-dessus. C C----------------------------------------------------------------- C C HISTORIQUE (Anomalies et modifications eventuelles) C C HISTORIQUE : 23.10.98, Creation C C----------------------------------------------------------------- C -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC SMTABLE POINTEUR MTABD.MTABLE -INC SMELEME POINTEUR MELEMC.MELEME,MELEMD.MELEME POINTEUR MELEMF.MELEME -INC SMCOORD -INC SMCHPOI -INC SMLENTI -INC SIZFFB PARAMETER (NBO=5) REAL*8 CFT,NORMX,NORMY,NORMZ,A2J(2,2,1),T,TX,TY,TZ,AIRE REAL*8 X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3,SCAL,SGN,A3J(3,3,1) INTEGER NP,NPG,NES CHARACTER*8 TYPE,TYPC,NOM0,LIST1(NBO),LIST2(NBO) C Les elements complets ne sont pas tous implementes C On se ramene aux elements facep sans le centre de la face DATA LIST1/'SEG3 ','TRI4 ','TRI7 ','QUA5 ', & 'QUA9 '/ DATA LIST2/'SEG2 ','TRI3 ','TRI6 ','QUA4 ', & 'QUA8 '/ C CALL LEKTAB(MTABD,'FACEL',MELEMD) SEGACT MELEMD IPT2=MELEMD CALL LEKTAB(MTABD,'FACE',MELEMF) CALL KRIPAD(MELEMF,MLENTI) SEGACT MELEMF NC=IDIM*IDIM TYPE='FACE' CALL CRCHPT(TYPE,MELEMF,NC,MCHPOI) CALL LICHT(MCHPOI,MPOVAL,TYPC,IGEOM) CALL LEKTAB(MTABD,'FACEP',MELEME) SEGACT MELEME C SEGACT MCHPOI*MOD MSOUPO=MCHPOI.IPCHP(1) SEGACT MSOUPO*MOD NBSOUS=LISOUS(/1) IF(NBSOUS.EQ.0)NBSOUS=1 IF (IDIM.EQ.2) THEN C NOCOMP(1)='UX ' NOCOMP(2)='UY ' NOCOMP(3)='RX ' NOCOMP(4)='RY ' DO 1 L=1,NBSOUS IPT1=MELEME IF(NBSOUS.NE.1)IPT1=LISOUS(L) SEGACT IPT1 NP=IPT1.NUM(/1)-1 NEL=IPT1.NUM(/2) C Toutes les faces sont des SEG3 donc NP=2 IF(NP.NE.2)RETURN C C C On considere la face sans son centre comme un elt fini SEG2 C TYPE = NOMS(IPT1.ITYPEL)//' ' CALL OPTLI(IP,LIST1,TYPE,NBO) IF (IP .EQ. 0) CALL ERREUR(5) TYPE = LIST2(IP) CALL KALPBG(TYPE,'FONFORM0',IZFFM) SEGACT IZFFM*MOD IZHR=KZHR(1) SEGACT IZHR*MOD NES=1 NPG=1 C Boucle sur toutes les faces pour le paquet L DO 10 K=1,NEL NF=LECT(IPT1.NUM(NP+1,K)) C REMPLISSAGE DE XYZ C ------------------ C DO 12 I=1,NP J=IPT1.NUM(I,K) DO 12 N=1,IDIM XYZ(N,I)=XCOOR((J-1)*(IDIM+1)+N) 12 CONTINUE C C CALJBR calcul le jacobien du passage de l'elt de ref. C a l'elt. reel C A2J=Jacobien AIRE=detA2J CALL CALJBR(FN,GR,PG,XYZ,HR,PGSQ,RPG,NES,IDIM,NP, &NPG,IAXI,AIRE,A2J,SGEN) C NORMX=A2J(1,2,1) NORMY=A2J(2,2,1) C On verifie que n est dans le meme sens que vec(13) de FACEL C Calcul de vec(13) C FACEL est repere par IPT2 J1=IPT2.NUM(1,NF) J2=IPT2.NUM(2,NF) JJ2=LECT(J2) J3=IPT2.NUM(3,NF) C IF (J1.eq.J3) THEN X1=XCOOR((J1-1)*(IDIM+1)+1) Y1=XCOOR((J1-1)*(IDIM+1)+2) X2=XCOOR((J2-1)*(IDIM+1)+1) Y2=XCOOR((J2-1)*(IDIM+1)+2) SCAL=(X2-X1)*NORMX+(Y2-Y1)*NORMY SGN=SIGN(1.D0,SCAL) C ELSE X1=XCOOR((J1-1)*(IDIM+1)+1) Y1=XCOOR((J1-1)*(IDIM+1)+2) X3=XCOOR((J3-1)*(IDIM+1)+1) Y3=XCOOR((J3-1)*(IDIM+1)+2) SCAL=(X3-X1)*NORMX+(Y3-Y1)*NORMY SGN=SIGN(1.D0,SCAL) ENDIF MPOVAL.VPOCHA(JJ2,1)=A2J(1,1,1) MPOVAL.VPOCHA(JJ2,2)=A2J(2,1,1) MPOVAL.VPOCHA(JJ2,3)=SGN*NORMX MPOVAL.VPOCHA(JJ2,4)=SGN*NORMY C C 10 CONTINUE C SEGDES IPT1 1 CONTINUE C C ELSE C NOCOMP(1)='UX ' NOCOMP(2)='UY ' NOCOMP(3)='UZ ' NOCOMP(4)='RX ' NOCOMP(5)='RY ' NOCOMP(6)='RZ ' NOCOMP(7)='MX ' NOCOMP(8)='MY ' NOCOMP(9)='MZ ' DO 21 L=1,NBSOUS IPT1=MELEME IF(NBSOUS.NE.1)IPT1=LISOUS(L) SEGACT IPT1 NP=IPT1.NUM(/1)-1 NEL=IPT1.NUM(/2) C Les elts complets ne sont pas implementes, on utilise C l'elt. face sans le centre C TYPE = NOMS(IPT1.ITYPEL)//' ' CALL OPTLI(IP,LIST1,TYPE,NBO) IF (IP .EQ. 0) CALL ERREUR(5) TYPE = LIST2(IP) C Calcul des fonctions de forme sur l'elt. de reference C CALL KALPBG(TYPE,'FONFORM0',IZFFM) SEGACT IZFFM*MOD IZHR=KZHR(1) SEGACT IZHR*MOD NES=2 NPG=1 C Boucle sur les faces du paquet L DO 210 K=1,NEL NF=LECT(IPT1.NUM(NP+1,K)) C C REMPLISSAGE DE XYZ C ------------------ C C write(6,*)'num',(ipt1.num(ii,k),ii=1,np+1),' NF=',nf DO 212 I=1,NP J=IPT1.NUM(I,K) DO 212 N=1,IDIM XYZ(N,I)=XCOOR((J-1)*(IDIM+1)+N) 212 CONTINUE C C C calcul du jacobien idem dim 2 C CALL CALJBR(FN,GR,PG,XYZ,HR,PGSQ,RPG,NES,IDIM,NP, & NPG,IAXI,AIRE,A3J,SGEN) NORMX=A3J(1,3,1) NORMY=A3J(2,3,1) NORMZ=A3J(3,3,1) C C On verifie que n est dans le meme sens que vec(13) de FACEL C Calcul de vec(13) C FACEL est repere par IPT2 J1=IPT2.NUM(1,NF) J2=IPT2.NUM(2,NF) JJ2=LECT(J2) J3=IPT2.NUM(3,NF) C IF (J1.eq.J3) THEN X1=XCOOR((J1-1)*(IDIM+1)+1) Y1=XCOOR((J1-1)*(IDIM+1)+2) Z1=XCOOR((J1-1)*(IDIM+1)+3) X2=XCOOR((J2-1)*(IDIM+1)+1) Y2=XCOOR((J2-1)*(IDIM+1)+2) Z2=XCOOR((J2-1)*(IDIM+1)+3) C SCAL=(X2-X1)*NORMX+(Y2-Y1)*NORMY+(Z2-Z1)*NORMZ SGN=SIGN(1.D0,SCAL) C ELSE X1=XCOOR((J1-1)*(IDIM+1)+1) Y1=XCOOR((J1-1)*(IDIM+1)+2) Z1=XCOOR((J1-1)*(IDIM+1)+3) X3=XCOOR((J3-1)*(IDIM+1)+1) Y3=XCOOR((J3-1)*(IDIM+1)+2) Z3=XCOOR((J3-1)*(IDIM+1)+3) SCAL=(X3-X1)*NORMX+(Y3-Y1)*NORMY+(Z3-Z1)*NORMZ SGN=SIGN(1.D0,SCAL) ENDIF C TX=A3J(1,1,1) TY=A3J(2,1,1) TZ=A3J(3,1,1) T=SQRT(TX*TX+TY*TY+TZ*TZ) TX=TX / T TY=TY / T TZ=TZ / T MPOVAL.VPOCHA(JJ2,1)=TX MPOVAL.VPOCHA(JJ2,2)=TY MPOVAL.VPOCHA(JJ2,3)=TZ MPOVAL.VPOCHA(JJ2,4)=NORMY*TZ-NORMZ*TY MPOVAL.VPOCHA(JJ2,5)=NORMZ*TX-NORMX*TZ MPOVAL.VPOCHA(JJ2,6)=NORMX*TY-NORMY*TX MPOVAL.VPOCHA(JJ2,7)=SGN*NORMX MPOVAL.VPOCHA(JJ2,8)=SGN*NORMY MPOVAL.VPOCHA(JJ2,9)=SGN*NORMZ C 210 CONTINUE C SEGDES IPT1 21 CONTINUE ENDIF CALL ECMO(MTABD,'MATROT','CHPOINT ',MCHPOI) SEGSUP MLENTI SEGDES MELEMD SEGDES MELEME SEGDES MELEMF SEGDES MCHPOI SEGDES MSOUPO SEGDES MPOVAL RETURN END