vibrat
C VIBRAT SOURCE BP208322 21/03/17 21:15:10 10921 SUBROUTINE VIBRAT ************************************************************************ * * V I B R A T * ----------- * * SOUS-PROGRAMME ASSOCIE A L'OPERATEUR "VIBRation" * * FONCTION: * --------- * * CALCUL DE MODES PROPRES. * * PHRASE D'APPEL (EN GIBIANE): * ---------------------------- * * ..... = VIBRATION | PROCHE ..... | ; * | INTERVALLE ..... | * | SIMULTANE ..... | * | IRAM ..... | * * VOIR LES DETAILS DANS LES SOUS-PROGRAMMES ASSOCIES AUX OPTIONS * "PROCHE", "INTERVALLE", ETC... * * SOUS-PROGRAMMES APPELES: * ------------------------ * * INTVAL, LIRMOT, PROCHE, SIMULT, ARPACK * * * CREATION et MODIFICATION: * ------------------------ * PASCAL MANIGOT, 13 NOVEMBRE 1984: creation * PASCAL BOUDA, 24 JUIN 2015: AJOUT DE L'OPTION IRAM * BP, 2019-09-28: LIMAGE=VRAI PAR DEFAUT * BP, 2019-09-28: LOG1=VRAI PAR DEFAUT * EN PREVISION SUPPRESSION DES OBJETS SOLUTIONS * PB 2020-12: TRAVAIL SUR LES MATRICES CONDENSEES + * MENAGE (TRI DES RIGIDITES, TRAITEMENT DE L'OBJET SOLUTION) * ************************************************************************ * IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO *-INC SMSOLUT -INC SMCHPOI -INC SMRIGID -INC SMTABLE -INC CCHAMP SEGMENT IDEMEM(0) SEGMENT IDEME0(IDEMEM(/1),2) SEGMENT IDEME1(IDEMEM(/1),2) COMMON/CITINV/ NBITER,IACCEL,NUMAC,IPX2,IPX0,IPX1,IPBX1, C IBBX1,IBBX2,ITPRO,DIFREL * PARAMETER (NBRMOT = 10) PARAMETER (NBIMOT = 9) CHARACTER*4 LISMOT(NBRMOT) CHARACTER*8 letyp,charre CHARACTER*2 LIRAM(NBIMOT) COMPLEX*16 SHIFT CHARACTER*2 SOLU LOGICAL LOG1, LIMAGE, LMULT,boolin, LVIBC * DATA LISMOT/'PROC','INTE','SIMU','IRAM', & 'IMPR','BASS','HAUT','TBAS','MULT','SOLU'/ * LISTE SPECIFIQUE IRAM DATA LIRAM/'LM','SM','LR','SR','LI','SI','LA','SA','BE'/ ************************************************************************ * INITIALISATIONS et VERIFICATION ************************************************************************ * IBASS = 0 IHAUT = 0 NOPT = 0 ivalin = 0 LOG1 = .TRUE. LMULT = .FALSE. LIMAGE= .TRUE. NIMP=IIMPI ICODE = 0 NBMOT = NBRMOT NBMOTI= NBIMOT NBMO=0 SHIFT=CMPLX(0.D0,0.D0) c * verification de l'option de calcul des deformations c IF(MEPSIL.NE.1) THEN c CALL ERREUR(1037) c RETURN c ENDIF cbp, 2020-12-10 : ci dessus n'a plus lieu d'etre car SIGSOL travaille c toujours en hypothese de deformations lineaires * ************************************************************************ * LECTURE DES MOTS-CLE ET DONNEES SPECIFIQUES ASSOCIEES ************************************************************************ ***** 1ere liste de mots-cles ****************************************** DO 10 I=1,5 IF (IERR .NE. 0) RETURN IF (NUMLIS.EQ.0) GOTO 10 c -lecture effective de 'PROC','INTE','SIMU' ou 'IRAM' IF (NUMLIS.LE.4) THEN IF (NUMLIS.EQ.1) THEN IF (IERR.NE.0) RETURN IPNMOD = 0 IF (IERR .NE. 0) RETURN ENDIF IF (NUMLIS.EQ.2) THEN IF (IERR.NE.0) RETURN IF(IERR.NE.0) RETURN ENDIF IF (NUMLIS.GE.3) THEN IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN ENDIF NOPT=NUMLIS GOTO 10 ENDIF c -autres options IF (NUMLIS.EQ.5) THEN *** IIMPI=2 CALL GINT2 ENDIF IF(IERR.NE.0) RETURN IF(IERR.NE.0) RETURN cbp 2017-09-28 IF (NUMLIS.EQ.8) LOG1 = .TRUE. IF (NUMLIS.EQ.8) THEN MOTERR(1:12)='mot-cle TBAS' MOTERR(13:40)=' ' c WARNING : mot-cle TBAS soon obsolete ENDIF IF (NUMLIS.EQ.10) THEN LOG1 = .FALSE. MOTERR(1:14)='OBJET SOLUTION' MOTERR(15:40)=' ' c WARNING : OBJET SOLUTION soon obsolete ENDIF IF (NUMLIS.EQ.9) LMULT = .TRUE. 10 CONTINUE ***** MOTS CLES SPECIFIQUES IRAM ***************** IF (NOPT .EQ. 4) THEN c on recupere shift Re + i Im et nbmo a calculer X=XINT1 Y=0.D0 SHIFT=CMPLX(X,Y) NBMO=IBASS SOLU='LM' IF (IERR .NE. 0) RETURN IF (NUMIRA.NE.0) SOLU=LIRAM(NUMIRA) ENDIF ************************************************************************ * LECTURE DES RIGIDITES (sans se soucier de leur type) ************************************************************************ IF(IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN ** pb dec20: le travail desormais uniformise en amont des options **On trie les rigidites lues IF (IRETOU .EQ. 0) THEN **deux matrices lues IPRIG0=IPRIG1 IPMAS0=IPMAS1 IPAMO0=0 ELSEIF (IRETOU .EQ. 1) THEN **trois matrices ENDIF IF (IERR.NE.0) RETURN * Lecture d'un logique optionnel pour savoir que faire si (2pi*w)^2 * est negatif (faux --> on renvoie |w|, vrai --> on renvoie -|w| * car pas d'imaginaire) IF (IRETOU.NE.0) THEN * avertissement : syntaxe bientot obsolete MOTERR(1:40)='use of a logical' ENDIF ***pb dec20: devenu caduque (travail sur matrice condensee) **** dualisation des mult de Lagrange pour la matrice de sstype RIGI * MRIGID=IPRIG0 * SEGINI,RI1=MRIGID * SEGDES MRIGID * MRIGID=RI1 * IMGEO2=0 * CALL DBBLX(MRIGID,LAGDUA) * IMLAG=LAGDUA * IPRIG2=MRIGID * SEGDES MRIGID *************************** *Condensation des matrices* *************************** * Chpoint primal "dummy" pour enregistrer l'elimination des composantes IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN SEGINI IDEMEM IDEMEM(**)=IPCHP0 SEGINI IDEME0,IDEME1 *Condensation sur matrices copiees => MYMAT = TEMPORAI & IDEMEM,IDEME0,IDEME1,IELIM) IF (IERR.NE.0) RETURN ************************************************************************ * APPEL DES ROUTINES SELON L'OPTION ************************************************************************ ***** PROCHE ***** IF (NOPT .EQ. 1) THEN ITPRO=1 & IPNMOD,MBASC,INSYM) IF (IERR.NE.0) RETURN c TODO : debrancher le solveur non-symetrique de PROCHE ***** INTERVALLE ***** ELSE IF (NOPT .EQ. 2) THEN ITPRO=0 INSYM=0 $ LIMAGE,IPMASS,IPRIGI,LMULT) IF (IERR.NE.0) RETURN ***** SIMULTANE ***** ELSE IF (NOPT .EQ. 3) THEN ITPRO=0 INSYM=0 IF (IERR.NE.0) RETURN ***** IRAM ***** ELSE IF (NOPT .EQ. 4) THEN $ NBMO,SOLU,INSYM,LAGDUA) IF (IERR.NE.0) RETURN *pb dec20: suppression des goto pour uniformiser le canal de *posttraitement * * cas Hermitien/non-Hermitien * IF (INSYM.EQ.0) THEN * cas Hermitien --> modes Reels * GOTO 901 * ELSE * cas non-Hermitien --> modes Complexes * GOTO 902 * ENDIF ELSE RETURN ENDIF ************************************************************************ * POST TRAITEMENT DES RESULTATS ************************************************************************ IF (INSYM .EQ. 0) THEN LVIBC=.FALSE. ELSE LVIBC=.TRUE. ENDIF c NB: INSYM=0 si pb aux v.p. Hermitien (K et M Reels et symetriques) *bp,2019 : erreur si pb non symetrique, car debranche sauf pour IRAM IF (NOPT .NE. 4 .AND. LVIBC) THEN RETURN ENDIF *pb dec20: devenu caduque (travail sur matrice condensee) c***** Appel a dbbcf pour dedualiser les modes (chpoints) ***** * MSOLUT=IPSOLU * SEGACT MSOLUT*MOD * DO ILX=1,MSOLIT(/1) * IF (MSOLIT(ILX).EQ.2) THEN * MSOLEN=MSOLIS(ILX) * SEGACT MSOLEN*MOD * DO ISO=1,ISOLEN(/1) * MCHPOI=ISOLEN(ISO) * SEGACT MCHPOI*MOD * IF (LAGDUA.NE.0) CALL DBBCF(MCHPOI,LAGDUA) * ISOLEN(ISO)=MCHPOI * SEGDES MCHPOI * ENDDO * SEGDES MSOLEN * ENDIF * ENDDO * SEGDES MSOLUT **pb dev20: dedualisation des mult de lagrange substituee par une **reconstruction des modes necessaire suite a la condensation IF (IERR.NE.0) RETURN *bp,2019 IF (insym.eq.0) then * dedualisation de la solution * msolut=ipsolu * segact msolut*mod * do 210 ilx=1,msolit(/1) * if (msolit(ilx).eq.2) then * msolen=msolis(ilx) * segact msolen*mod * do 200 iso=1,isolen(/1) * mchpoi=isolen(iso) * segact mchpoi*mod * if (lagdua.ne.0) call dbbcf(mchpoi,lagdua) * isolen(iso)=mchpoi * 200 continue * endif * 210 continue *bp,2019 ELSE c if (lagdua.ne.0) then c mtable=mbasc c segact mtable c call acctab(mbasc,'MOT ',iva,xvalin,'MODES',boolin,iobin, c $ 'TABLE ',ivalre,xvalre,charre,boolin,mtab1) c do 250 i=1,10000 c letyp=' ' c call acctab (mtab1,'ENTIER ',i,xva,charre,boolin,iobin, c $ letyp,ivalre,xvalre,charre,boolin,mtab2) c if(letyp.ne.'TABLE ') go to 251 c letyp=' ' c call acctab(mtab2,'MOT',iva,xva,'DEFORMEE_MODALE_REELLE', c $ boolin,iobin,letyp,ivalre,xvalre,charre,boolin,iobre) c if(letyp.eq.'CHPOINT') then c mchpoi=iobre c segact mchpoi*mod c call dbbcf(mchpoi,lagdua) c call ecctab(mtab2,'MOT',iva,xva,'DEFORMEE_MODALE_REELLE', c $ boolin,iobin,letyp,ivalre,xvalre,charre,boolin,mchpoi) c else c call erreur(5) c return c endif c c letyp=' ' c call acctab(mtab2,'MOT',iva,xva,'DEFORMEE_MODALE_IMAGINAIRE', c $ boolin,iobin,letyp,ivalre,xvalre,charre,boolin,iobre) c if(letyp.eq.' ')go to 250 c mchpoi=iobre c segact mchpoi*mod c call dbbcf(mchpoi,lagdua) c call ecctab(mtab2,'MOT',ivalin,xva,'DEFORMEE_MODALE_IMAG', c $ boolin,iobin,letyp,ivalre,xvalre,charre,boolin,mchpoi) c 250 continue c endif c 251 continue c ENDIF *pb dev20 suppression des goto pour uniformiser le canal *bp,2019 IF (INSYM .EQ. 0) THEN IF (INSYM .EQ. 0) THEN ***** CREATION D'UNE BASE MODALE REELLE ***** c901 CONTINUE IF (LOG1) THEN IF (IERR.NE.0) RETURN C CALL DESOLU (IPSOLU) IF (IERR.NE.0) RETURN ELSE ENDIF *bp,2019 ELSE *bp,2019 CALL LIROBJ('CHPOINT', IPOINT, 0, IRETOU) *bp,2019 CALL ECROBJ('TABLE', MBASC) *bp,2019 ENDIF C GOTO 100 ELSE ***** CREATION D'UNE BASE MODALE COMPLEXE (IRAM SEULEMENT) ***** c902 CONTINUE IF (LOG1) THEN IF (IERR.NE.0) RETURN CALL DESOLU (IPSOLU) IF (IERR.NE.0) RETURN ELSE * ce cas ci-apres n'est pas terrible... ENDIF * ENDIF *menage sur les matrices copiees ************************************************************************ * FIN NORMALE ************************************************************************ C100 CONTINUE IIMPI=NIMP CALL GINT2 END
© Cast3M 2003 - Tous droits réservés.
Mentions légales