d2pol1
C D2POL1 SOURCE BP208322 18/01/05 21:15:08 9672 C DYPOL1 SOURCE IANIS 96/08/08 21:16:04 2249 & NPAS,NUMLIA,NMOD,FTOTA,IVINIT,IANNUL) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) *--------------------------------------------------------------------* * * * Operateur DYNE : algorithme de Fu - de Vogelaere * * ________________________________________________ * * * * Calcul de la force elementaire pour la liaison POLYNOMIALE * * * * Parametres: * * * * e Q1 Vecteur des deplacements generalises * * e Q2 Vecteur des vitesses generalisees * * e NA1 Nombre total d'inconnues en base A * * e IPLIA Tableau des points de types support et origine * * es XPALA Tableau des parametres de la liaison * * es XVALA Tableau des variables internes de la liaison * * e NLIAA Nombre de liaisons sur la base A * * e IND Indice du demi-pas * * e XPDT pas de temps * * e NPAS Numero du pas de temps * * e NUMLIA Numero de la liaison consideree * * e NMOD Nombre de modes "origine" de la liaison * * es FTOTA Forces exterieures totalisees sur la base A * * e IVINIT =1 si vitesses initiales, =0 sinon * * * * Auteur, date de creation: * * * * Denis ROBERT, le 30 avril 1992. * * * *--------------------------------------------------------------------* * -INC PPARAM -INC CCOPTIO * INTEGER IPLIA(NLIAA,*) REAL*8 XPALA(NLIAA,*),XVALA(NLIAA,4,*),Q1(NA1,*),FTOTA(NA1,*) REAL*8 Q2(NA1,*) PARAMETER (XZERO = 0.D0) PARAMETER (XUN = 1.D0 ) * c XPDT = XDT(NPAS) c XPDTS2 = 0.5 * XPDT XPDTS2 = XPDT * * Boucle sur les modes "origine" * Organisation de XPALA et indices : * COEF [ ED / RD / XJD / EV / RV / XJV / ... NMAX val de depl ... ] * i= 1 IDEB IDEB+6 * IF (IIMPI.EQ.666) THEN WRITE(IOIMP,*)' ' WRITE(IOIMP,*)'NPAS = ',NPAS WRITE(IOIMP,*)'IVINIT = ',IVINIT WRITE(IOIMP,*)'IND = ',IND ENDIF XCOEF = XPALA(NUMLIA,1) IF (IANNUL.EQ.1) XCOEF = 0.D0 FX = 1.D0 IDEB = 2 DO 10 I = 1,NMOD INA2 = IPLIA(NUMLIA,I+1) RD = XPALA(NUMLIA,IDEB+1) * NRD : decalage pour trouver le deplacement lie au retard RD NRD = INT(RD/XPDTS2) + 1 RV = XPALA(NUMLIA,IDEB+4) * NRV : decalage pour trouver la vitesse liee au retard RV NRV = INT(RV/XPDTS2) + 1 * NRV2 : un deplacement de plus pour calculer la vitesse NRV2 = NRV + 1 NMAX = MAX(NRD,NRV2) ED = XPALA(NUMLIA,IDEB) EV = XPALA(NUMLIA,IDEB+3) XJD = XPALA(NUMLIA,IDEB+2) XJV = XPALA(NUMLIA,IDEB+5) * * Les deplacements sont reactualises en First In Last Out * XDNEW = Q1(INA2,IND) J1 = IDEB + 6 XAUX = XPALA(NUMLIA,J) XPALA(NUMLIA,J) = XDNEW XDNEW = XAUX 15 CONTINUE * * Boucle d'impression de XPALA * IF (IIMPI.EQ.666) THEN WRITE(IOIMP,*)'DYPOL1 : IMOD = ',I WRITE(IOIMP,*)'XPALA(',NUMLIA,',',II,')=' ) & ,XPALA(NUMLIA,II ) ) 200 CONTINUE WRITE(IOIMP,*)'NRD = ',NRD WRITE(IOIMP,*)'NRV = ',NRV ENDIF * * faut-il calculer ( cad t > tau) * jmax = ideb + 5+Nmax Xtest = XPALA(NUMLIA,jmax) itest = int (xtest) IF ( itest .eq. 123456) then * on n'a pas ce qu'il faut pour calculer : on met zero fx = 0d0 ELSE XDEPL = XPALA(NUMLIA,IDEB+5+NRD) * * Calcul de la vitesse * IF ((IND.EQ.3).AND.(IVINIT.EQ.1).and. (nrd.eq.1)) THEN XVIT = Q2(INA2,IND) ELSE XD1 = XPALA(NUMLIA,IDEB+5+NRV) XD2 = XPALA(NUMLIA,IDEB+5+NRV2) XVIT = (XD1 - XD2) / XPDTS2 ENDIF IF (IIMPI.EQ.666) THEN WRITE(IOIMP,*)'---> XVIT = ',XVIT ENDIF * IF ((XJD.NE.XZERO).AND.(ED.EQ.XZERO)) THEN ISEUIL = 1 ELSE ISEUIL = 0 ENDIF IF (XJD.GE.XZERO) THEN * * partie positive de (XDEPL - XJD) * IF (XDEPL.GE.XJD) THEN XD = ABS(XDEPL-XJD) ELSE XD = XZERO ENDIF ELSE IF (XDEPL.LT.XJD) THEN XD = ABS(XJD-XDEPL) ELSE XD = XZERO ENDIF ENDIF IF (IIMPI.EQ.666) THEN WRITE(IOIMP,*)'XD = ',XD ENDIF IF (XJV.GE.XZERO) THEN IF (XVIT.GE.XJV) THEN XV = ABS(XVIT-XJV) ELSE XV = XZERO ENDIF ELSE IF (XVIT.LT.XJV) THEN XV = ABS(XJV-XVIT) ELSE XV = XZERO ENDIF ENDIF IF (IIMPI.EQ.666) THEN WRITE(IOIMP,*)'XV = ',XV ENDIF IF (XD.GT.XZERO) THEN FXD = EXP(ED*LOG(XD)) ELSE IF (ED.EQ.XZERO) THEN FXD = XUN ELSE FXD = XZERO ENDIF ENDIF IF (XV.GT.XZERO) THEN IF (ISEUIL.EQ.0) THEN FXV = EXP(EV*LOG(XV)) ELSE IF (XD.GT.XZERO) THEN FXV = EXP(EV*LOG(XV)) ELSE FXV = XZERO ENDIF ENDIF ELSE IF (EV.EQ.XZERO) THEN FXV = XUN ELSE FXV = XZERO ENDIF ENDIF FX = FX * FXV * FXD IF (IIMPI.EQ.666) THEN WRITE(IOIMP,*)'FXD = ',FXD WRITE(IOIMP,*)'FXV = ',FXV WRITE(IOIMP,*)'FX = ',FX ENDIF IDEB = IDEB + 6 + NMAX endif 10 CONTINUE INA1 = IPLIA(NUMLIA,1) FXTOT = XCOEF * FX XVALA(NUMLIA,IND,1) = FXTOT FTOTA(INA1,IND) = FTOTA(INA1,IND) + FXTOT * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales