qzcon3
C QZCON3 SOURCE PV 20/03/24 21:21:10 10554 & DOUBLE) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) ********************************************************************************** * * * CONSTITUTION DES MATRICES A ET B DE TAILLE 2Nx2N POUR LE QZ * * ______________________________________________________________________________ * * * * * * CREATION : le 08 Juillet 2014 LX236206 * * MODIF : BP, 2016-01-15 on reecrit tout pour permettre que K, M et C n'aient * * pas le meme support, mais on maintient la limitation : 1 seule * * inconnue possible (pas forcément ALFA, mais BETA, LX ...) par noeud * * MODIF : BP, 2016-06-15 1ddl <=> (1noeud + 1 nom dinconnue) * * ______________________________________________________________________________ * * * * MODULE(S) APPELANT(S) : VIBRAC * * * * MODULE(S) APPELE(S) : ASSMAT, POSPT * * ______________________________________________________________________________ * * * * EN ENTREE : * * - RI1,RI2,RI3,RI4: quatre matrices pour construire la matrice * de monodromie * -DOUBLE : indique si on double le maillage * * * * EN SORTIE : * * - XMATRA, XMATRB : les matrices A et B 2nx2n * * | RI1 . RI2 | | I . 0 | * * A = | ....... | B = | ....... | * * | RI3 . RI4 | | 0 . I | * * * * - MELEME : le maillage support * * - MLMOTS : les composantes (ALFA suelement meme si non coherent !) * ********************************************************************************** * -INC PPARAM -INC CCOPTIO -INC SMELEME -INC SMLMOTS -INC SMRIGID -INC SMCOORD * SEGMENT ICPR(nbpts) SEGMENT KDDL(NK) SEGMENT KINCO(JGM,NINCO) POINTEUR XMATRA.XMATRI,XMATRB.XMATRI LOGICAL AFFICH,DOUBLE INTEGER MAT(4),IXMAT(4) CHARACTER*4 MOPRI,MODUA PARAMETER(NDDMAX=400) * * Affichage des messages pour verification AFFICH = IIMPI.GE.21 c AFFICH = .true. MAT(1)=RI1 MAT(2)=RI2 MAT(3)=RI3 MAT(4)=RI4 * c *======================================================================* c * VERIFICATION TAILLE COHERENTE AVEC ALGO QZ : NDDL < NDDMAX c *======================================================================* c NDDL1=0 c DO 1 IMAT=1,4 c NDDL1i=0 c MRIGID=MAT(IMAT) c IF(MRIGID.EQ.0) GOTO 1 c SEGACT,MRIGID c NRIGEL=IRIGEL(/2) c DO 2 IRI=1,NRIGEL c IPT1 = IRIGEL(1,IRI) c DES1 = IRIGEL(3,IRI) c SEGACT,DES1,IPT1 c NDDL1i = NDDL1i + DES1.NOELEP(/1)*IPT1.NUM(/2) c SEGDES,DES1,IPT1 c 2 CONTINUE c SEGDES,MRIGID c NDDL1=MAX(NDDL1,NDDL1i) c 1 CONTINUE c IF(NDDL1.GT.NDDMAX) THEN c CALL ERREUR(382) c RETURN c ENDIF *======================================================================* * INITIALISATIONS *======================================================================* * du MELEME NBREF=0 NBSOUS=0 NBELEM=20 NBNN=1 SEGINI,MELEME * du MLMOTS JGN=4 JGM=NBELEM SEGINI,MLMOTS * de XMATR1 XMATR2 ET XMATRM NELRIG=1 NLIGRD=NBELEM NLIGRP=NLIGRD SEGINI,XMATR1,XMATR2,XMATR3,XMATR4 IXMAT(1)=XMATR1 IXMAT(2)=XMATR2 IXMAT(3)=XMATR3 IXMAT(4)=XMATR4 * de ICPR = tableau de la numerotation locale SEGACT MCOORD*mod SEGINI,ICPR NLOC=0 * de MLMOT1 = tableau des noms d'inconnue locale JGN=4 JGM=10 SEGINI,MLMOT1 JGM1=0 * de KINCO = tableau des ddls NINCO=10 SEGINI KINCO * nombre total de DDL : NDDL=0 *======================================================================* * BOUCLE SUR LES RIGIDITES *======================================================================* DO 100 IMAT=1,4 MRIGID=MAT(IMAT) IF(MRIGID.EQ.0) GOTO 100 SEGACT,MRIGID NRIGEL=IRIGEL(/2) *======================================================================* * BOUCLE SUR LES SOUS-RIGIDITES *======================================================================* DO 200 IRI=1,NRIGEL IPT1 = IRIGEL(1,IRI) DES1 = IRIGEL(3,IRI) XMATRI = IRIGEL(4,IRI) SEGACT,DES1,IPT1,XMATRI * Verification que la matrice est carrée NLIG1P=DES1.NOELEP(/1) NLIG1D=DES1.NOELED(/1) IF(NLIG1P.NE.NLIG1D) THEN SEGDES,DES1,IPT1,XMATRI,MRIGID RETURN ENDIF * rem : on pourrait aussi tester NOELEP(:) = NOELED(:) * LISDUA(:) = dual de LISINC(:) SEGACT,IPT1 NBNN1 = IPT1.NUM(/1) NBELEM1 = IPT1.NUM(/2) IF(AFFICH) THEN WRITE(IOIMP,*)'MATRICE ',IMAT,' : ',IRI,'IEME SOUS-RIGIDITE' WRITE(IOIMP,*) '+INCO=',(DES1.LISINC(iou),iou=1,NLIG1P) WRITE(IOIMP,*) ' #',(DES1.NOELEP(iou),iou=1,NLIG1P) ENDIF * creation de KDDL = tableau local des ddls NK=NLIG1P SEGINI,KDDL XCOEF=COERIG(IRI) *----------------------------------------------------------------------* * BOUCLE SUR LES ELEMENTS *----------------------------------------------------------------------* DO 300 JEL=1,NBELEM1 *----------------------------------------------------------------------* * BOUCLE SUR LES DDLS de cet element de cette sous matrice *----------------------------------------------------------------------* DO 400 I=1,NLIG1P c recup du noeud + nom d'inconnue INONO = DES1.NOELEP(I) INONO2= DES1.NOELED(I) MOPRI = DES1.LISINC(I) MODUA = DES1.LISINC(I) IF(INONO.NE.INONO2) THEN c La matrice de rigidite n'est pas carree RETURN ENDIF c rem : il faut aussi tester l'association primal-dual c --- NUMEROTATION LOCALE DES NOEUD --- IP = IPT1.NUM(INONO,JEL) IPLOC = ICPR(IP) c NOUVEAU NOEUD : ON L'AJOUTE IF(IPLOC.EQ.0) THEN NLOC =NLOC+1 IF(NLOC.GT.NINCO) THEN NINCO=NINCO+10 SEGADJ,KINCO ENDIF IPLOC=NLOC ICPR(IP)=IPLOC ELSE c NOEUD DEJA VU : IPLOC^ieme NOEUD LOCAL ENDIF c --- NUMEROTATION LOCALE DES NOMS D'INCONNUES --- DO 410 IILOC=1,JGM1 c NOM D'INCONNUE DEJA VU : IILOC^ieme INCONNUE 410 CONTINUE c NOUVEAU NOM D'INCONNUE : ON L'AJOUTE JGM1 = JGM1 + 1 SEGADJ,MLMOT1,KINCO ENDIF IILOC= JGM1 411 CONTINUE c --- DDL = COUPLE NOEUD + NOM D'INCONNUE --- IDDL=KINCO(IILOC,IPLOC) IF(IDDL.EQ.0) THEN NDDL=NDDL+1 IDDL=NDDL KINCO(IILOC,IPLOC)=IDDL ENDIF c ON REMPLIT LE MELEME DE POI1 + LE MLMOTS IF(IDDL.gt.NBELEM) THEN NBELEM=NBELEM+20 SEGADJ,MELEME JGM=NBELEM SEGADJ,MLMOTS NLIGRD=NBELEM NLIGRP=NLIGRD SEGADJ,XMATR1,XMATR2,XMATR3,XMATR4 ENDIF NUM(1,IDDL)=IP c ON REMPLIT AUSSI LE TABLEAU INVERSE KDDL KDDL(I)=IDDL 400 CONTINUE *----------------------------------------------------------------------* * FIN DE BOUCLE SUR LES DDLS *----------------------------------------------------------------------* IF(AFFICH) THEN WRITE(IOIMP,*) '+#DDL=',(KDDL(iou),iou=1,NLIG1P) c WRITE(IOIMP,*) 'dim de XMATRI=',RE(/1),RE(/2),RE(/3) ENDIF * DEBUT DE REMPLISSAGE DES XMATR* (* = 1 a 4) XMATR5=IXMAT(IMAT) c WRITE(IOIMP,*) 'dim de XMATR',IMAT,'=', c & XMATR5.RE(/1),XMATR5.RE(/2),XMATR5.RE(/3) * --- boucle sur les colonnes --- DO 500 J=1,NLIG1P JDDL = KDDL(J) * --- boucle sur les lignes --- DO 500 I=1,NLIG1P IDDL = KDDL(I) XMATR5.RE(IDDL,JDDL,1) & = XMATR5.RE(IDDL,JDDL,1) + XCOEF*RE(I,J,JEL) 500 CONTINUE 300 CONTINUE *----------------------------------------------------------------------* * FIN DE BOUCLE SUR LES ELEMENTS *----------------------------------------------------------------------* SEGSUP,KDDL SEGDES,DES1,IPT1,XMATRI 200 CONTINUE *======================================================================* * FIN DE BOUCLE SUR LES SOUS-RIGIDITES *======================================================================* SEGDES,MRIGID 100 CONTINUE *======================================================================* * FIN DE BOUCLE SUR LES RIGIDITES *======================================================================* *======================================================================* * MENAGE *======================================================================* SEGSUP,KINCO,MLMOT1 do i=1,ICPR(/1) ICPR(i)=0 enddo *======================================================================* * FINALISATION DES OBJETS RESULTATS *======================================================================* if(NDDL.gt.NDDMAX) then WRITE(IOIMP,*) 'Probleme de grande taille (',NDDL,'ddls):' WRITE(IOIMP,*) 'L execution risque de prendre du temps...' endif * MISE A LA BONNE DIMENSION DES OBJETS MELEME MLMOTS NBELEM=NDDL SEGADJ,MELEME JGM=NDDL SEGADJ,MLMOTS * Duplication du maillage pour la creation des CHPOINTs IF (DOUBLE) THEN NBELEM=2*NDDL SEGADJ,MELEME JGM=2*NDDL SEGADJ,MLMOTS NP2=nbpts DO J=1,NDDL IP=NUM(1,J) IP2=ICPR(IP) IF(IP2.EQ.0)THEN NP2=NP2+1 IP2=NP2 ICPR(IP)=IP2 ENDIF NUM(1,NDDL+J)=IP2 ENDDO NBPTS=NP2 SEGADJ,MCOORD ENDIF * MISE A LA BONNE DIMENSION DES OBJETS XMATR* NLIGRD=NDDL NLIGRP=NLIGRD SEGADJ,XMATR1,XMATR2,XMATR3,XMATR4 NLIGRD=2*NDDL NLIGRP=NLIGRD SEGINI,XMATRA,XMATRB * ECRITURE DE M DANS XMATR1 (A) ET XMATR2 (B) * | RI1 . RI2 | | I . 0 | * * A = | ....... | B = | ....... | * * | RI3 . RI4 | | 0 . I | * XMATR5=IXMAT(1) DO JDDL=1,NDDL DO IDDL=1,NDDL XMATRA.RE(IDDL,JDDL,1) = XMATR5.RE(IDDL,JDDL,1) ENDDO ENDDO XMATR5=IXMAT(2) DO JDDL=1,NDDL DO IDDL=1,NDDL XMATRA.RE(IDDL,NDDL+JDDL,1) = XMATR5.RE(IDDL,JDDL,1) ENDDO ENDDO XMATR5=IXMAT(3) DO JDDL=1,NDDL DO IDDL=1,NDDL XMATRA.RE(NDDL+IDDL,JDDL,1) = XMATR5.RE(IDDL,JDDL,1) ENDDO ENDDO XMATR5=IXMAT(4) DO JDDL=1,NDDL DO IDDL=1,NDDL XMATRA.RE(NDDL+IDDL,NDDL+JDDL,1) = XMATR5.RE(IDDL,JDDL,1) ENDDO ENDDO DO IDDL=1,NDDL XMATRB.RE(IDDL,IDDL,1) = 1.D0 XMATRB.RE(NDDL+IDDL,NDDL+IDDL,1) = 1.D0 ENDDO *======================================================================* * MENAGE *======================================================================* SEGSUP,XMATR1,XMATR2,XMATR3,XMATR4 *======================================================================* * AFFICHAGE DES OBJETS RESULTATS *======================================================================* IF (AFFICH) THEN WRITE(IOIMP,*) 'MATRICE A =' WRITE(IOIMP,*) (NUM(1,iou),iou=1,NBELEM) DO iou=1,2*NDDL WRITE(IOIMP,*) (XMATRA.RE(iou,jou),jou=1,2*NDDL) ENDDO WRITE(IOIMP,*) 'MATRICE B =' WRITE(IOIMP,*) (NUM(1,iou),iou=1,NBELEM) DO iou=1,2*NDDL WRITE(IOIMP,*) (XMATRB.RE(iou,jou),jou=1,2*NDDL) ENDDO ENDIF * *======================================================================* * MENAGE *======================================================================* SEGSUP,ICPR RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales