qzbasc
C QZBASC SOURCE FANDEUR 22/01/03 21:15:37 11136 & IPBC,ERR,NWANTED) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) * ************************************************************************ * CREATION D'UNE BASE DE MODES PROPRES COMPLEXES POUR VIBC * ______________________________________________________________________ * * AUTEUR : Nicolas BENECH, 13 avril 1995 * MODIF : BP, 2016-01-15 on reecrit tout * ______________________________________________________________________ * * MODULE(S) APPELANT(S) : VIBRAC * * MODULE(S) APPELE(S) : CRTABL, ACCTAB, ECCTAB, CREPO1, MUCHPO * ______________________________________________________________________ * * EN ENTREE : * -ALFR : partie reelle des valeurs propres * -ALFI : partie imaginaire des valeurs propres * -BETA : denominateur (reel) des valeurs propres * (denominateur nul --> valeur propre infinie) * -MATZ : vecteurs propres complexes * -MELEME : maillage support des chpoints * -MCOMP : liste des composantes des chpoints * ______________________________________________________________________ * * EN SORTIE : * -IPBC : base de modes complexes * ______________________________________________________________________ * * REMARQUE : la variable SEUIL definie au début des données générales * permet d'identifier les valeurs propres infinies, et * d'annuler le mode correspondant. * Sa valeur a ete fixee a 100 x EPSLON(1.0D0) pour le moment ************************************************************************ * -INC CCREEL -INC PPARAM -INC CCOPTIO -INC SMELEME -INC SMLCHPO -INC SMLMOTS -INC SMCHPOI -INC SMRIGID -INC SMTABLE -INC SMLREEL -INC SMLENTI -INC SMCOORD * segment de travail = MTRAV modifie pour NNCHPO chpoints SEGMENT MTRAV REAL*8 BB(NNCHPO,NNIN,NNNOE) INTEGER IBIN(NNIN,NNNOE),IGEO(NNNOE),NHAR(NNIN) ENDSEGMENT * * ******** INCO(NNIN) CONTIENT LE NOMS DES NNIN INCONNUES DIFFERENTES. * * ******** BB(I,J) EST LA VALEUR DE LA IEME INCONNUE DU CHAMP POUR * ******** LE JEME NOEUD DU TABLEAU IGEO. * * ******** IBIN(I,J)=1 OU 0. 1 INDIQUE QUE LA I EME INCONNUE DU CHAMP * ******** EXISTE POUR LE J EME NOEUD DU TABLEAU IGEO. * * ******** IGEO(I) EST LE NUMERO A METTRE DANS UN OBJET MELEME POUR * ******** REFERENCER LE IEME NOEUD * * ******** NHAR(I) EST LE NUMERO D'HARMONIQUE SI CALCUL AXI OU * ******** SIGNIFIE CONTRAINTE PLANE,DEFORMATION PLANE OU DEF PLAN GEN * SEGMENT ICPR(nbpts) * REAL*8 XVAL,SEUIL INTEGER I, J, K, IC, NUMAFF,ERR LOGICAL MODANN, MODREL, AFFICH,CONV CHARACTER*4 NOMDDL * POINTEUR ALFR.MLREEL, ALFI.MLREEL, BETA.MLREEL POINTEUR MATZ.XMATRI POINTEUR MCOMP.MLMOTS * ************************************************************************ * DONNEES GENERALES * ************************************************************************ * Ecriture des messages pour verification AFFICH = IIMPI.GE.21 c AFFICH = .TRUE. * IF (AFFICH) & WRITE (IOIMP,*) 'QZBASC: Extraction des donnees generales...' * * seuil pour le denominateur d'une valeur propre * SEUIL = (EPSLON(1.0D0)*100) SEUIL = 1.D-99 * nombre de modes calcules **** si on souhaite un nombre de modes inferieur, on devra alors trier IF(NWANTED.GT.0.AND.NWANTED.LT.NBMOD1) THEN c tri selon 1/module**2 : il faut le calculer explicitement SEGINI,MLREEL=BETA I=1 88 IF(I.GT.NBMOD1) GOTO 22 c bp : si c'est un complexe, on force l egalite du module c comme le tri d'ORDON1 est stable, les complexes i et i+1 c resteront a des indices successifs I=I+1 ENDIF I=I+1 GOTO 88 22 CONTINUE IORDRE=1 segsup,MLREEL MLENTI=IORDRE segact,MLENTI ELSE IORDRE=0 NWANTED=NBMOD1 ENDIF **** preparation des CHPOINTs deformees ******************************* * nombre de ddls (=dimension de MELEME = dimension de MCOMP) SEGACT,MELEME,MCOMP NDDL=MELEME.NUM(/2) * on cree ICPR SEGINI,ICPR * on dimensionne au maxi MTRAV NNIN=NDDL NNNOE=NDDL NNCHPO=NBMOD1 SEGINI,MTRAV NNIN=0 NNNOE=0 *---- traitement de chaque ddl ---------------------------------- DO 100 J=1,NDDL c - NOEUD IP=NUM(1,J) JNOE=ICPR(IP) c nouveau noeud #IP de numero local #JNOE IF(JNOE.EQ.0) THEN NNNOE=NNNOE+1 JNOE=NNNOE ICPR(IP)=JNOE IGEO(JNOE)=IP ENDIF c - COMPOSANTE IF(NNIN.EQ.0) GOTO 111 DO 110 JIN=1,NNIN c NOMDDL trouvee dans INCO(JIN) 110 CONTINUE 111 CONTINUE c NOMDDL pas trouvee dans INCO(JIN) -> on l'ajoute a la fin NNIN=NNIN+1 JIN=NNIN c bp : pour l'instant on laisse NHAR=NIFOUR, mais il faudrait c recuperer IRIGEL(5,:) des rigidites d'entree ou autre ...? NHAR(JIN)=NIFOUR 112 CONTINUE c NOMDDL trouvee dans INCO(JIN) et noeud #IP dans IGEO(JNOE) c Remplissage de IBIN et BB IBIN(JIN,JNOE)=J DO I=1,NBMOD1 BB(I,JIN,JNOE)=MATZ.RE(J,I,1) ENDDO 100 CONTINUE *---- fin de la boucle sur les ddl ---------------------------------- SEGSUP,MCOMP,ICPR SEGDES,MELEME SEGADJ,MTRAV c write(*,*) 'IGEO=',(IGEO(iou),iou=1,NNNOE) c write(*,*) 'INCO=',(INCO(iou),iou=1,NNIN) c on va generer N1 chpoints en 1 passage dans une copie de CRECHP N1=NBMOD1 SEGINI,MLCHPO SEGSUP,MTRAV ******************************************* * Creation de la table BASE_DE_MODES * ******************************************* * IF (AFFICH) WRITE(IOIMP,*) 'Creation de la table BASE_DE_MODES...' * & 'MOT',0,0.0D0,'BASE_DE_MODES',.TRUE.,0) & 'MAILLAGE',0,0.0D0,' ',.TRUE.,MELEME) ************************************************************************ * BOUCLE SUR LES MODES * ************************************************************************ * III=1 80 IF (III .GT. NWANTED) GOTO 20 * selection des NWANTED plus petits modes IF(IORDRE.NE.0) THEN I = LECT(III) ELSE I = III ENDIF * IF (AFFICH) THEN IF (MODREL) THEN ELSE ENDIF ENDIF * * ---- frequence infinie ? * * ---- oui IF (MODANN) THEN 90 WRITE (IOIMP,*) 'Attention !!! Mode ',I, & ' annule : frequence infinie.' & 'MOT',0,0.0D0,'MODE_ANNULE',.TRUE.,0) & 'TABLE', 0, 0.0D0,' ',.TRUE.,MTAB1) IF (.NOT. MODREL) THEN MODREL = .TRUE. III = III + 1 GO TO 90 ENDIF * ---- non ELSE * *------- Deformees reelle (1) et imaginaire (2) du mode i * Recup des CHPOINTs : MCHPO1=ICHPOI(I) * Cas reel : il faut un chpoint nul -> on crée un chpoint vide IF (MODREL) THEN NAT=1 NSOUPO=0 SEGINI,MCHPO2 MCHPO2.IFOPOI=IFOUR MCHPO2.MOCHDE='CHPOINT CREE PAR QZBASC' * Cas complexe : on fait la Recup ELSE MCHPO2=ICHPOI(I+1) ENDIF c write(*,*) '>>> mode',I,'phiR=',MCHPO1,'phiI=',MCHPO2 * * ************************************************ * Creation de la table MODE * ************************************************ * *----- valeur propre (reelle ou complexe) * * Attention : on enregistre f = w/2pi * avec iw = landa donc w=-i landa !!! * IF (AFFICH) WRITE (*,*) 'Construction de la table MODE ...' * & 'MOT',0,0.0D0,'MODE_COMPLEXE',.TRUE.,0) * & 'ENTIER',I,0.0D0,' ',.TRUE.,0) & 'POINT',0,0.0D0,' ',.TRUE.,IPOIN) $ ,'FLOTTANT',0,XVAL,' ',.TRUE.,0) & 'FLOTTANT',0,XVAL,' ',.TRUE.,0) * & .TRUE.,0,'CHPOINT',0,0.0D0,' ',.TRUE.,MCHPO1) & .TRUE.,0,'CHPOINT',0,0.0D0,' ',.TRUE.,MCHPO2) * & 0,0.0D0,' ',.TRUE.,MTAB1) * IF (MODREL) GOTO 70 * *----- Valeur propre complexe conjuguee * * SEGINI, MTAB2=MTAB1 SEGDES, MTAB2 III = III + 1 IF (AFFICH) WRITE (*,*) 'Mode conjugue, no : ',I & 'ENTIER',I,0.0D0,' ',.TRUE.,0) & 'FLOTTANT',0,-1.*XVAL,' ',.TRUE.,0) XVAL=-1.D0 & .TRUE.,0,'CHPOINT',0,0.0D0,' ',.TRUE.,MCHPO1) & .TRUE.,0,'CHPOINT',0,0.0D0,' ',.TRUE.,IRET) * & 0,0.0D0,' ',.TRUE.,MTAB2) * IF (AFFICH) WRITE (*,*) 'Construction du conjugue ok' 70 CONTINUE ENDIF III = III + 1 GOTO 80 ************************************************************************ * FIN DE BOUCLE SUR LES MODES * ************************************************************************ 20 CONTINUE ***** MENAGE *********************************************************** SEGSUP, ALFR, ALFI, BETA SEGSUP, MATZ IF(IORDRE.GT.0) SEGSUP,MLENTI * ******************************************** * Creation de la table BASE_MODALE * ******************************************** * IF (AFFICH) WRITE (*,*) 'Creation de la table BASE_MODALE...' * & 'MOT',0,0.0D0,'BASE_MODALE',.TRUE.,0) & 'TABLE',0,0.0D0,' ',.TRUE.,IPTAB2) cbp : on ajoute un indicateur de succes (en plus du message dans vibrac) CONV=ERR.eq.0 & 'LOGIQUE ',0,0.0D0,' ',CONV,0) * RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales