assem0
C ASSEM0 SOURCE CHAT 09/10/09 21:15:50 6519 IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMRIGID -INC SMLMOTS -INC SMLREEL -INC SMLENTI *** SAVE INWAIT SEGMENT INWAIT INTEGER IIM(IRM) ENDSEGMENT * write(6,fmt='('' entree dans assem0 icle'',i6)') icle IF(ICLE.EQ.1) THEN C C on est en premier passage il faut triturer les matrices C MRIGID=MRIGI1 SEGACT MRIGID*MOD INWAIT=0 * write(6,fmt='('' entree dans assem0 mrigi1 ichole '' * * ,2i6)') * * mrigid,ichole IF(ICHOLE.NE.0) THEN SEGDES,MRIGID RETURN ENDIF IRM=IRIGEL(/2) SEGINI INWAIT inWUIT=inwait MLMOTS=NORINC * write( 6,fmt='('' assem0 norinc '', i6)') norinc C ... Si la normalisation est AUTOmatique ... IF( MLMOTS.EQ. -1) THEN C ... Taille initiale de la liste de coeff. ... JG=20 C ... Taille initiale de la liste de nom de DDL ... JGN=4 JGM=20 C ... JFIN = nombre de différents noms de DDL ... JFIN=0 C ... Taille actuelle des MLMOTS et MLREEL ... JMAX=20 SEGINI MLMOTS,MLREEL C ... Boucle sur les zones élémentaires ... DO 50 I=1,IRM DESCR=IRIGEL(3,I) SEGACT DESCR NLIGRP=NOELEP(/1) NLIGRD=NLIGRP C ... On met le premier DDL dans MLMOTS ... IF(I.EQ.1) THEN JFIN=1 ENDIF C ... Si les autres n'y sont pas encore, on les rajoute ... DO 51 J=1,NLIGRP DO 52 K=1,JFIN 52 CONTINUE JFIN=JFIN+1 C ... En agrandissant (s'il le faut) les MLMOTS et MLREEL ... IF(JFIN.GT.JMAX)THEN JG = JMAX+20 JGM=JG SEGADJ MLMOTS,MLREEL ENDIF 51 CONTINUE C ... Initialisation de MLREE1 de taille NLIGRP ... JG=NLIGRP SEGINI MLREE1 XMATRI=IRIGEL(4,I) SEGACT XMATRI C ... Dans lequel on mettra les maxi des NLIGRP termes diagonaux C de toutes le matrices élémentaires de la zone ... DO 53 J=1,RE(/3) * XMATRI=IMATTT(J) * SEGACT XMATRI DO 54 K=1,NLIGRP 54 CONTINUE 53 CONTINUE C ... Puis, pour chaque DDL différent, on met le maxi des C termes diagonaux concernés dans MLREEL ... DO 55 J=1,NLIGRP DO 56 K=1,JFIN 56 CONTINUE 57 CONTINUE 55 CONTINUE SEGSUP MLREE1 50 CONTINUE C ... Toutes les zones étant parcourues, la taille des MLMOTS et MLREEL C est définitive, on peut donc l'ajuster ... JG=JFIN JGM=JG SEGADJ MLMOTS,MLREEL C ... Les coefficients valent 0.8/sqrt(terme maxi) pour les DDL C "physiques" et 1 pour les multiplicateurs de Lagrange ... DO 59 K=1,JFIN 59 CONTINUE C ... Il n'y a pas de normalisation des variables duales ... MLMOT1=0 MLREE1=0 LIN=JFIN NORINC=MLMOTS NORVAL=MLREEL * write(6,fmt='('' norinc '',4( A4,2x))')(mots(kk),kk=1, * * mots(/2)) * write(6,fmt='('' norval '',4(e12.5,2x))')(prog(kk),kk=1, * * prog(/1)) C ... Sinon (cad. la normalisation n'est pas automatique) ... ELSE SEGACT MLMOTS MLREEL=NORVAL SEGACT MLREEL MLMOT1=NORIND MLREE1=NORVAD IF(MLMOT1.NE.0) THEN SEGACT MLMOT1 SEGACT MLREE1 ENDIF ENDIF C ... La normalisation proprement dite commence ici ... C C BOUCLE 1 SUR LES SOUS ZONES ELEMENTAIRES C DO 1 I=1,IRM DESCR=IRIGEL(3,I) SEGACT DESCR NLIGRP=NOELEP(/1) NLIGRD=NLIGRP JG=NLIGRP MLREE2=0 MLREE3=0 C C existe-t-il des inconnues a normer dans la matrice C si oui création de MLREE2 ET MLREE3 qui serviront de coef C multiplicateurs C DO 2 K=1,NLIGRP C ... Pour toute variable primale, on cherche si elle C est présente dans la liste des variables à normaliser ... DO 3 L=1,LIN C ... Si c'est le cas, on vérifie si les listes des C coefficients sont initialisées ... IF(MLREE2.EQ.0) THEN SEGINI MLREE2 DO 33 M=1,NLIGRP 33 CONTINUE IF(MLMOT1.EQ.0) THEN SEGINI MLREE3 DO 34 M=1,NLIGRP 34 CONTINUE ENDIF ENDIF C ... Puis, on met le bon coefficient au bon endroit ... C ... Si la normalisation des variables duales n'a pas été C demandée, les coeff. seront les mêmes que pour les C variables primales ... ENDIF 3 CONTINUE 2 CONTINUE C ... Si au contraire, la normalisation des variables duales a C été demandée, on refait la même chose pour les variables C duales ... IF(MLMOT1.EQ.0) GO TO 6 NLIGRD=NOELED(/1) JG=NLIGRD MLREE3=0 DO 4 K=1,NLIGRD DO 5 L=1,LIND IF(MLREE3.EQ.0) THEN SEGINI MLREE3 DO 35 M=1,NLIGRD 35 CONTINUE ENDIF C ... c.a.d. on met les coefficients au bons endroits dans MLREE3 ... ENDIF 5 CONTINUE 4 CONTINUE 6 CONTINUE C C si MLREE2*MLREE3 NE 0 il faut multiplier les matrices C On va le faire et on cree un nouveau segment IMATRI C l'ancien etant stocke dans inwait C IF(MLREE2*MLREE3.EQ.0) GO TO 15 XMATRI=IRIGEL(4,I) SEGACT XMATRI NELRIG=RE(/3) C ... On met le pointeur IMATRI dans INWAIT ... IIM(I)=XMATRI C ... On créé un nouveau IMATRI et on le met dans MRIGID ... SEGINI,XMATR1=XMATRI IRIGEL(4,I)=XMATR1 C ... Puis on parcourt les matrices élémentaires ... DO 7 K=1,NELRIG * XMATRI=IMATTT(K) C ... Chaque nouvelle matrice est égale au début à la précédente ... * SEGINI,XMATR1=XMATRI * IMATR1.IMATTT(K)=XMATR1 C ... Boucle sur les variables duales ... DO 8 L=1,NLIGRD IF(COE.EQ.1.D0) GO TO 8 C ... Si le coefficient est différent de 1 ... DO 9 M=1,NLIGRP C ... On multiplie la ligne N° L par ce coeff. ... XMATR1.RE(L,M,k)=XMATR1.RE(L,M,k)*COE 9 CONTINUE 8 CONTINUE C ... Boucle sur les variables primales ... DO 10 L=1,NLIGRP IF(COE.EQ.1.D0) GO TO 10 C ... Si le coefficient est différent de 1 ... DO 11 M=1,NLIGRD C ... On multiplie la colonne N° L par ce coeff. ... XMATR1.RE(M,L,k)=XMATR1.RE(M,L,k)*COE 11 CONTINUE 10 CONTINUE * SEGDES XMATR1 7 CONTINUE C ... Ménage ... SEGDES XMATR1,XMATRI 15 CONTINUE SEGDES DESCR 1 CONTINUE * write(6,fmt='('' assem0 norinc norval norind norvad'',4i6) * * ') norinc,norval,norind,norvad SEGDES INWAIT SEGDES MRIGID ELSEIF(ICLE.EQ.2) THEN * write(6,fmt='('' assem0 inwait '' ,i6 )') inwait C ... Destruction des matrices normalisées et remise dans MRIGID C des matrices d'origine conservées 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) GO TO 20 XMATRI=IRIGEL(4,I) ** SEGACT IMATRI * DO 21 L=1,IMATTT(/1) * XMATRI=IMATTT(L) * SEGSUP XMATRI * 21 CONTINUE SEGSUP XMATRI IRIGEL(4,I) = IIM(I) 20 CONTINUE SEGSUP INWAIT SEGDES MRIGID INWUIT=0 ENDIF * write(6,fmt='('' sortie assem0 norinc norval'',2i6)') * * norinc,norval * mlmots = norinc * mlreel = norval * segact mlmots,mlreel * write(6,fmt='('' sortie assem0 definitive'')') RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales