asse10
C ASSE10 SOURCE MB234859 26/09/01 21:15:04 12631 *---------------------------------------------------------------------- * ICLE=1 * ce subroutine a pour fonction d'initialiser le segment de * normalisation MDNOR et de fabriquer les matrices normalisees pour * les transferer a l'assemblage. * ICLE=2 * destructions des matrices normalisees *---------------------------------------------------------------------- IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C -INC PPARAM -INC CCOPTIO -INC SMRIGID -INC SMLMOTS -INC SMLREEL -INC SMLENTI -INC SMMATRI -INC SMELEME C LOGICAL bSYME SEGMENT,INUINV(NNGLOB) SEGMENT INWAIT INTEGER IIM(IRM) ENDSEGMENT C IF (IIMPI.NE.0) WRITE(IOIMP,*) 'Subroutine ASSE10 ',ICLE C C ================================================================= IF (ICLE.EQ.1) THEN C ================================================================= C Renseigner MDNOR et MDNO1 si necessaire MRIGID=MRIGI1 SEGACT,MRIGID*MOD MMATRI=ICHOLE bSYME=(IILIGS.EQ.0) C IRM=IRIGEL(/2) SEGINI,INWAIT INWUIT=inwait C MDNOR =IDNORM SEGACT MDNOR*MOD INUINV=INUIN1 MINCPO=IINCPO MIMIK=IIMIK SEGACT,INUINV,MINCPO,MIMIK NDDLP=INCPO(/1) NODEP=INCPO(/2) NDDLD=NDDLP NODED=NODEP MIPO1=MINCPO C IF (NORINC.EQ.-1) THEN C C Normalisation AUTOmatique C DO 10 I=1,IRM DESCR=IRIGEL(3,I) SEGACT DESCR NLIGRP=NOELEP(/1) NLIGRD=NOELED(/1) IF (NLIGRP.NE.NLIGRD) GOTO 10 JG=NLIGRP SEGINI,MLENTI C DO J=1,NLIGRP DO K=1,NDDLP IF (IMIK(K).EQ.LISINC(J)) GOTO 11 ENDDO 11 CONTINUE LECT(J)=K ENDDO C MELEME=IRIGEL(1,I) SEGACT,MELEME XMATRI=IRIGEL(4,I) SEGACT,XMATRI C Balayer toutes les matrices pour simuler l'assemblage du terme diagonale DO J=1,RE(/3) DO K=1,NLIGRP IA=INUINV(NUM(NOELEP(K),J)) INC=INCPO(LECT(K),IA) DNOR(INC)=DNOR(INC)+RE(K,K,J) ENDDO ENDDO SEGDES,XMATRI SEGSUP,MLENTI 10 CONTINUE C ILX=0 DO IU=1,IMIK(/2) IF (IMIK(IU).EQ.'LX ') THEN ILX=IU GOTO 12 ENDIF ENDDO 12 CONTINUE C C Les coefficients valent 0.8/sqrt(terme maxi) pour les DDL C "physiques" et 1 pour les multiplicateurs de Lagrange DO IO=1,NODEP DO IOP=1,NDDLP IA=INCPO(IOP,IO) IF (IA.NE.0) THEN IF (IOP.EQ.ILX) THEN DNOR(IA)=1.D0 ELSE IF(DNOR(IA).EQ.0.D0) DNOR(IA)=1.D0 DNOR(IA)=0.8D0/SQRT(ABS(DNOR(IA))) ENDIF ENDIF ENDDO ENDDO C IF (.NOT.bSYME) THEN MIPO1=IDUAPO MDNO1=IDNORD MIDUA=IIDUA SEGACT,MIPO1,MIDUA SEGACT,MDNO1=MDNOR SEGACT,MDNO1*MOD ENDIF C ELSE C C Normalisation via LISTMOTS + LISTREEL C MLMOTS=NORINC MLREEL=NORVAL SEGACT,MLMOTS,MLREEL C C Remplir le segment MDNOR DO IOP=1,NDDLP DO IU=1,LINP GOTO 13 ENDIF ENDDO XRE=1.D0 13 CONTINUE DO 14 IO=1,NODEP IA=INCPO(Iop,io) IF (IA.EQ.0) GOTO 14 DNOR(IA)=XRE 14 CONTINUE ENDDO C IF (bSYME) GOTO 15 C MIPO1=IDUAPO MDNO1=IDNORD MIDUA=IIDUA SEGACT,MIPO1,MIDUA C IF (NORIND.EQ.0) THEN SEGACT,MDNO1=MDNOR SEGACT,MDNO1*MOD GOTO 15 ENDIF C MLMOT1=NORIND MLREE1=NORVAD SEGACT,MLMOT1,MLREE1 NDDLD=MIPO1.INCPO(/1) NODED=MIPO1.INCPO(/2) C C Remplir le segment MDNO1 DO IOP=1,NDDLD DO IU=1,LIND GOTO 16 ENDIF ENDDO XRE=1.D0 16 CONTINUE DO 17 IO=1,NODED IA=MIPO1.INCPO(IOP,IO) IF (IA.EQ.0) GOTO 17 MDNO1.DNOR(IA)=XRE 17 CONTINUE ENDDO C 15 CONTINUE ENDIF C --------------------------------------------------------------- C Modifier les matrices elementaires C --------------------------------------------------------------- DO 1 I=1,IRM DESCR=IRIGEL(3,I) SEGACT,DESCR NLIGRP=NOELEP(/1) NLIGRD=NOELED(/1) JG=NLIGRP SEGINI,MLENTI JG=NLIGRD SEGINI,MLENT1 MELEME=IRIGEL(1,I) SEGACT,MELEME XMATRI=IRIGEL(4,I) C Conserver le pointeur sur le XMATRI d'origine IIM(I)=XMATRI C Dupliquer le XMATRI pour lui appliquer la normalisation. SEGINI,XMATR1=XMATRI IRIGEL(4,I)=xMATR1 C DO IU=1,NLIGRP DO IO=1,IMIK(/2) IF(LISINC(IU).EQ.IMIK(IO)) GOTO 2 ENDDO 2 CONTINUE LECT(IU)=IO ENDDO C IF (bSYME) GOTO 4 C DO IU=1,NLIGRD DO IO=1,IDUA(/2) IF(LISDUA(IU).EQ.IDUA(IO)) GOTO 3 ENDDO 3 CONTINUE MLENT1.LECT(IU)=IO ENDDO C 4 CONTINUE C NELMT=XMATR1.RE(/3) DO 7 K=1,NELMT C C Multiplication d'une colonne DO 8 L=1,NLIGRP IAB=INUINV(NUM(NOELEP(L),K)) INH=INCPO(LECT(L),IAB) COE=DNOR(INH) IF (COE.EQ.1.D0) GOTO 8 DO M=1,NLIGRD XMATR1.RE(M,L,K)=XMATR1.RE(M,L,K)*COE IF (bSYME) XMATR1.RE(L,M,K)=XMATR1.RE(L,M,K)*COE ENDDO 8 CONTINUE C IF (bSYME) GOTO 7 C C Multiplication d'une ligne DO 9 L=1,NLIGRD IAB=INUINV(NUM(NOELED(L),K)) INH=MIPO1.INCPO(MLENT1.LECT(L),IAB) COE=MDNO1.DNOR(INH) IF (COE.EQ.1.D0) GOTO 9 DO M=1,NLIGRP XMATR1.RE(L,M,K)=XMATR1.RE(L,M,K)*COE ENDDO 9 CONTINUE C 7 CONTINUE C IF (bSYME) THEN C Verifier la symetrie des matrices elementaires C (sauf le super element qui peut etre tres grand) IF (ITYPEL.NE.28) THEN IF (XMATR1.SYMVER.NE.1) THEN IF (IERR.NE.0) RETURN XMATR1.SYMRE=0 XMATR1.SYMVER=1 ENDIF ENDIF ENDIF C SEGDES,XMATRI,XMATR1 SEGSUP,MLENTI,MLENT1 1 CONTINUE SEGDES INWAIT C ================================================================= ELSEIF (ICLE.EQ.2) THEN C ================================================================= C Destruction des matrices normalisees et remise dans MRIGID C des matrices d'origine conservees dans INWAIT ... INWAIT=INWUIT IF (INWAIT.EQ.0) RETURN SEGACT,INWAIT MRIGID=MRIGI1 SEGACT,MRIGID*MOD DO 20 I=1,IIM(/1) IF(IIM(I).EQ.0) GOTO 20 XMATRI=IRIGEL(4,I) SEGSUP,XMATRI IRIGEL(4,I)=IIM(I) 20 CONTINUE SEGSUP,INWAIT SEGDES,MRIGID INWUIT=0 C ================================================================= ENDIF C ================================================================= END
© Cast3M 2003 - Tous droits réservés.
Mentions légales