C TIRE SOURCE SP204843 23/06/05 21:15:03 11671 SUBROUTINE TIRE C======================================================================= C OPERATEUR TIRE C C OBJOL = TIRE MSOLUT TYPE ( ROBO ) ( INSTANTS ) ; C ---- ---- C ou C OBJOL = TIRE MCHARG FLOTTANT | ( 'TABL' ) ; C | ( MOT ) C C OBJOL : objet de type ......... C MSOLUT : objet SOLUTION C TYPE : MOT CLE:TYPE DE LA VARIABLE(DEPL,VITE,ACCE,LIAI, C POIN ..) C MCHARG : objet CHARGEMENT C MOT : nom du CHARGEMENT a instancier C FLOTTANT : temps pour lequel on desire le chargement. C C dans le cas d'un objet SOLUTION de type DYNAMIQUE issu d'une C resolution par PLEX : C 1- on peut obtenir les matrices ROTATION et leurs derivees C en posant TYPE = ROTA ( pour les TRANSLATIONS TYPE = ROTA ) C 2- si on desire effectuer une RECOmbinaison des VITESSES et C des ACCELERATIONS specifier le mot-clef ROBO apres TYPE C C INSTANTS: procedure facultative pour choisir les cas de sortie C MOT suivi d'une VALEUR C TEMP T : FLOTTANT temps a sortir C CAS ICAS : ENTIER cas a sortir C RANG IRG : ENTIER rang de l'objet a sortir C NUME INUME : ENTIER numero du mode a sortir C RIEN : on prend le dernier C C Dans le cas de l'objet chargement le mot clef TABL permet C de ranger les differents chargements instancies dans une C table pointant vers un CHPOINT (ou MCHAML) et d'indice C le nom du chargement. Si on donne un objet de type MOT C a l'operateur il calcule le champ instancie correspondant C uniquement aux chargements portant ce nom.Si aucun mot C n'est donne il instancie le chargement et renvoie un C objet de type CHPOINT ou MCHAML. C Pour des chargements mobiles l'operateur calcule le C champ effectif au temps voulu C-------------------------------------------------------------------- C CREATION : 16/10/85 C PROGRAMMEUR : FARVACQUE C PUIS CHARVET POUR INTRODUCTION DE L'OPTION ROBO ( NON C ENCORE TESTE SUR CRAY ) C APPELLE: LIRE LIRMOT CHRCHA ECRIRE TITMOD TYPFIL ERREUR(235 234 135) C LIRCHA LIRENT LIREE LIROBJ INTER1 MOCHPO DTCHPO ADCHPO PLACE C EXTENSION CHARGEMENT MOBILES 02/98 KICH C C======================================================================= IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCREEL -INC SMSOLUT -INC SMELEME -INC SMCHPOI -INC SMLCHPO -INC SMCHARG -INC SMLREEL -INC SMTABLE -INC SMEVOLL -INC SMLOBJE -INC SMCOORD PARAMETER (LMOOPT=4,LFREQ=6,LGDEP=2) CHARACTER*4 MOOPT(LMOOPT) CHARACTER*8 MTYP1,CHATY2 CHARACTER*4 MOGDEP(LGDEP) CHARACTER*4 MOROBO(1) CHARACTER*4 MOFREQ(LFREQ) CHARACTER *72 ITEX CHARACTER*8 TAPIND,TAPOBJ,TAPOB1,TAPOB2 CHARACTER*4 CHARIN,CHARRE, MTYPR LOGICAL LOGIN,LOGRE REAL*8 XVALIN,XVALRE CHARACTER CTYP*8,MCHA*4,MOT1*4 INTEGER LCHAR,MIN1,MAX1 DATA MOFREQ/'FREQ','MGEN','QX ','QY ','QZ ','POIN'/ DATA MOOPT/'TEMP','CAS ','RANG','NUME'/ DATA MOGDEP/'ROTA','TRAN'/ DATA MOROBO/'ROBO'/ DATA PRECI/1.E-3/ ITEX = ' ' ICHA2 = 0 ICHA3 = 0 IGDEP = 0 IVALIN= 0 XVALIN= 0.D0 LOGIN =.FALSE. IOBIN = 0 IVALRE= 0 XVALRE= 0 *---------------------------------------------------------------------- * CAS OU ON CHERCHE A TIRER UN CHARGEMENT *---------------------------------------------------------------------- *----- la nature du chpo de sortie est conditionnée par celle qui ----- *-------- sort de l'objet chargement si il y des incoherence ---------- *--------- adchpo et muchpo rendront une nature indeterminée ---------- IRETT = 0 CALL LIROBJ('CHARGEME',ICHAR,0,IRETOU) IF(IERR.NE.0) RETURN IF(IRETOU.EQ.0) GOTO 200 CALL LIRCHA(MOT1,0,LCHAR) IF (IERR.NE.0) RETURN IF (LCHAR.EQ.0) THEN MOT1 = ' ' ENDIF CALL LIRREE(XXX,1,IRETOU) IF (IERR.NE.0) RETURN T1 = XXX MCHARG=ICHAR CALL ACTOBJ('CHARGEME',MCHARG,1) C SEGACT MCHARG NCHAR=KCHARG(/1) *---------------------------------------------------------------------- *------- Cas ou on range le chargement instancie dans une TABLE ------ *---------------------------------------------------------------------- IF (MOT1.EQ.'TABL') THEN M = 0 SEGINI MTABLE ITA1 = MTABLE ** SEGDES MTABLE *-------------- boucle sur les chargements élémentaires --------------- DO 501 IC=1,NCHAR ICHARG=KCHARG(IC) C SEGACT ICHARG IPO1 = ICHPO1 IPO2 = ICHPO2 *--------- on ne considère que les objets de sous type force ----------- IF(CHANAT(IC).EQ.'DEPLACEM') THEN MOTERR(1:8)='CHARGEME' MOTERR(9:16)='DEPLACEM' CALL ERREUR(131) GOTO 599 ENDIF *------------ On ne considere que les chargements nommes --------------- IF (CHANOM(IC).EQ.' ') THEN CALL ERREUR(697) GOTO 599 ENDIF *--- cas des chargements elementaires CHPOINT (ou MCHAML) + EVOL ------- IF((CHATYP.EQ.'CHPOINT ').OR.(CHATYP.EQ.'MCHAML ')) THEN MLREEL=ICHPO2 C Cas particulier du chargement constant : on retourne le champ C sans aucune interpolation IF (ICHPO2.EQ.0) THEN IRET=ICHPO1 TAPOBJ=CHATYP C Cas general : interpolation dans l'evolution ELSE SEGACT MLREEL NF=PROG(/1) *------- Le temps %r1 sort de la table du %i1ème chargement ----------- C SP : on s'autorise a sortir de l'intervale de definition de l'evolution. C L'interpolation de l'amplitude est geree par INTER1. C T2 = T1 + ABS(T1*0.000001D0) C T3 = T1 - ABS(T1*0.000001D0) C IF(PROG(1).GT.T2.OR.PROG(NF).LT.T3) THEN C INTERR(1)=IC C REAERR(1)=T1 C CALL ERREUR(342) C GOTO 599 C ENDIF C------------- calcul du deplacement eventuel du champ ---------- IF (CHAMOB(IC).EQ.'TRAN'.OR.CHAMOB(IC).EQ.'ROTA'.OR. & CHAMOB(IC).EQ.'TRAJ') THEN MTYPR = CHAMOB(IC) IPOENT = IPO1 CHATY2 = CHATYP IPOENU = ICHPO4 IPOENV = ICHPO5 IPOENW = ICHPO6 IPOENX = ICHPO7 CALL TIDEP1(T1,IPOENT,CHATY2,MTYPR, $ IPOENU,IPOENV,IPOENW,IPOENX,IPOSOR) IF (IERR.NE.0) RETURN IPO1 = IPOSOR ENDIF C----- interpole la valeur de l'evolution FT1 au temps T1 ICHATX=ICHPO2 ICHAFX=ICHPO3 CALL INTER1(ICHATX,ICHAFX,T1,FT1) IRET = 0 C----- Cas du chargement de nom TRAJ : interpolation d'un point IF (CHANOM(IC).EQ.'TRAJ') THEN CALL IPLCUR(IPO1,FT1,IRET) IF (IERR.NE.0) RETURN TAPOBJ = 'POINT ' C----- Autres cas : multiplication du CHPOINT ou du MCHAML ----------- ELSE IOPERA = 2 IARGU = 2 I11 = 0 IF(CHATYP.EQ.'CHPOINT ') THEN TAPOBJ = 'CHPOINT ' CALL ACTOBJ('CHPOINT ',IPO1,1) CALL OPCHP1(IPO1,IOPERA,IARGU,I11,FT1,IRET,IRETOU) IF (IRETOU.EQ.0) THEN CALL ERREUR(26) RETURN ENDIF ELSE TAPOBJ = 'MCHAML ' CALL ACTOBJ('MCHAML ',IPO1,1) CALL OPCHE1(IPO1,IOPERA,IARGU,I11,FT1,IRET,IRETOU) IF (IRETOU.EQ.0) THEN CALL ERREUR(26) RETURN ENDIF ENDIF ENDIF ENDIF C C----- On met le resultat IRET dans la table : IF(IRET.EQ.0) GOTO 598 CHARIN = CHANOM(IC) IOBRE = IRET TAPIND = 'MOT ' CALL ECCTAB(ITA1,TAPIND,IVALIN,XVALIN,CHARIN,LOGIN,IOBIN, $ TAPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) C---------------------------------------------------------------------- C Cas des chargements elementaires TABLE1-TABLE2 C---------------------------------------------------------------------- ELSEIF (CHATYP.EQ.'TABLE ') THEN IVALI1 = 0 IVALI2 = 1 MTAB1=IPO1 SEGACT MTAB1 JMA1=MTAB1.MLOTAB DO 505 JJ = 1,JMA1 XVALR1=MTAB1.RMTABV(IVALI1+1) TAPOB1=MTAB1.MTABTV(IVALI1+1) IF(JMA1.EQ.1) THEN XVALR2 = T1 ELSE XVALR2=MTAB1.RMTABV(IVALI2+1) TAPOB2=MTAB1.MTABTV(IVALI2+1) ENDIF IF(IVALI1.EQ.0) THEN IF (T1.LE.XVALR1) THEN DREL = 0.D0 GOTO 507 ENDIF ENDIF IF(IVALI2.EQ.(JMA1-1)) THEN IF (T1.GE.XVALR2) THEN DREL = 1.D0 GOTO 507 ENDIF ENDIF IF((XVALR1.LE.T1).AND.(T1.LE.XVALR2)) GOTO 506 5059 CONTINUE IVALI1 = IVALI1 + 1 IVALI2 = IVALI2 + 1 505 CONTINUE SEGDES MTAB1 *------- Le temps %r1 sort de la table du %i1ème chargement ---------- INTERR(1)=IC REAERR(1)=T1 CALL ERREUR(342) GOTO 599 506 CONTINUE *------------ la premiere table ne pointe pas vers des reels ---------- IF((TAPOB1.NE.TAPOB2).OR.(TAPOB1.NE.'FLOTTANT')) THEN CALL ERREUR(692) GOTO 599 ENDIF DREL = (T1 - XVALR1)/(XVALR2 - XVALR1) 507 CONTINUE TAPOB1 = ' ' TAPOB2 = ' ' TAPIND = 'ENTIER ' MTAB2=IPO2 SEGACT MTAB2 TAPOB1=MTAB2.MTABTV(IVALI1+1) TAPOB2=MTAB2.MTABTV(IVALI2+1) IOBR1=MTAB2.MTABIV(IVALI1+1) IOBR2=MTAB2.MTABIV(IVALI2+1) SEGDES MTAB2 *------ la deuxieme table ne pointe pas vers des champs de meme type ----- IF(TAPOB1.NE.TAPOB2) THEN CALL ERREUR(693) GOTO 599 ENDIF C------------- Cas du CHPOINT : IF(TAPOB1.EQ.'CHPOINT ') THEN CALL ECROBJ('CHPOINT ',IOBR1) CALL ECROBJ('CHPOINT ',IOBR2) CALL ECRREE(1.D0 - DREL) CALL ECRREE(DREL) CALL COLI CALL LIROBJ('CHPOINT ',IRET,1,IRETOU) IF(IRETOU.EQ.0) GOTO 599 C------------- calcul du deplacement eventuel du champ ---------- IF (CHAMOB(IC).EQ.'TRAN'.OR.CHAMOB(IC).EQ.'ROTA'.OR. & CHAMOB(IC).EQ.'TRAJ') THEN MTYPR = CHAMOB(IC) IPOENT = IRET CHATY2 = TAPOB1 IPOENU = ICHPO4 IPOENV = ICHPO5 IPOENW = ICHPO6 IPOENX = ICHPO7 CALL TIDEP1(T1,IPOENT,CHATY2,MTYPR, $ IPOENU,IPOENV,IPOENW,IPOENX,IPOSOR) IF (IERR.NE.0) RETURN IRET = IPOSOR ENDIF CHARIN = CHANOM(IC) TAPOBJ = 'CHPOINT ' IOBRE = IRET TAPIND = 'MOT ' CALL ECCTAB(ITA1,TAPIND,IVALIN,XVALIN,CHARIN, $ LOGIN,IOBIN,TAPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) C------------- Cas du MCHAML : ELSEIF (TAPOB1.EQ.'MCHAML ') THEN IF (CHANOM(IC).EQ.'MATE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF ELSE CALL ECROBJ('MCHAML ',IOBR1) CALL ECROBJ('MCHAML',IOBR2) CALL ECRREE(1.D0 - DREL) CALL ECRREE(DREL) CALL COLI CALL LIROBJ('MCHAML ',IRET,1,IRETOU) IF(IRETOU.EQ.0) GOTO 599 C------------- calcul du deplacement eventuel du champ ---------- IF (CHAMOB(IC).EQ.'TRAN'.OR.CHAMOB(IC).EQ.'ROTA'.OR. & CHAMOB(IC).EQ.'TRAJ') THEN MTYPR = CHAMOB(IC) IPOENT = IRET CHATY2 = TAPOB1 IPOENU = ICHPO4 IPOENV = ICHPO5 IPOENW = ICHPO6 IPOENX = ICHPO7 CALL TIDEP1(T1,IPOENT,CHATY2,MTYPR, $ IPOENU,IPOENV,IPOENW,IPOENX,IPOSOR) IF (IERR.NE.0) RETURN IRET = IPOSOR ENDIF ENDIF CHARIN = CHANOM(IC) TAPOBJ = 'MCHAML ' IOBRE = IRET TAPIND = 'MOT ' CALL ECCTAB(ITA1,TAPIND,IVALIN,XVALIN,CHARIN, $ LOGIN,IOBIN,TAPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) C------------- Cas du MODELE : ELSEIF (TAPOB1.EQ.'MMODEL ') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------- Cas du MAILLAGE : ELSEIF (TAPOB1.EQ.'MAILLAGE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------- Cas de la RIGIDITE : ELSEIF (TAPOB1.EQ.'RIGIDITE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------ Cas du POINT : ELSEIF (TAPOB1.EQ.'POINT ') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IF (ABS(DREL-0.D0).LE.XZPREC) THEN IRET = IOBR1 ELSE SEGACT,MCOORD C write(6,*) 'IOBR1, IOBR2,DREL=',IOBR1,IOBR2,DREL NBPTS = NBPTS+1 SEGADJ,MCOORD IDIMP1 = IDIM + 1 XP1 = XCOOR((IOBR1-1)*IDIMP1+1) YP1 = XCOOR((IOBR1-1)*IDIMP1+2) ZP1 = XCOOR((IOBR1-1)*IDIMP1+3) XP2 = XCOOR((IOBR2-1)*IDIMP1+1) YP2 = XCOOR((IOBR2-1)*IDIMP1+2) ZP2 = XCOOR((IOBR2-1)*IDIMP1+3) XCOOR((NBPTS-1)*IDIMP1+1) = DREL*XP2+(1.D0-DREL)*XP1 XCOOR((NBPTS-1)*IDIMP1+2) = DREL*YP2+(1.D0-DREL)*YP1 XCOOR((NBPTS-1)*IDIMP1+3) = DREL*ZP2+(1.D0-DREL)*ZP1 SEGDES,MCOORD ENDIF *-- la 2e table ne pointe pas vers un CHPOINT, MCHAML, MMODLE ou un MAILLAGE ---- ELSE CALL ERREUR(694) GOTO 599 ENDIF C---------------------------------------------------------------------- C Cas des chargements elementaires LREE1-LOBJ1 C---------------------------------------------------------------------- ELSEIF (CHATYP.EQ.'LISTOBJE') THEN C---------- Recherche intervalle de temps contenant T1 IVALI1 = 0 IVALI2 = 1 MLREEL = IPO2 SEGACT, MLREEL MLOBJE = IPO1 SEGACT, MLOBJE JMA1 = PROG(/1) DO 405 JJ = 1,JMA1 XVALR1 = PROG(IVALI1+1) IF(JMA1.EQ.1) THEN XVALR2 = T1 ELSE XVALR2 = PROG(IVALI2+1) ENDIF IF(IVALI1.EQ.0) THEN IF (T1.LE.XVALR1) THEN DREL = 0.D0 GOTO 407 ENDIF ENDIF IF(IVALI2.EQ.(JMA1-1)) THEN IF (T1.GE.XVALR2) THEN DREL = 1.D0 GOTO 407 ENDIF ENDIF IF((XVALR1.LE.T1).AND.(T1.LE.XVALR2)) GOTO 406 IVALI1 = IVALI1 + 1 IVALI2 = IVALI2 + 1 405 CONTINUE C---------- SP : sans doute sans objet aujourd'hui (extrapolation permise) *---------- Le temps %r1 sort de la table du %i1eme chargement INTERR(1)=IC REAERR(1)=T1 CALL ERREUR(342) GOTO 599 C---------- On a trouve les piquets de temps encadrants T1 406 CONTINUE DREL = (T1 - XVALR1)/(XVALR2 - XVALR1) 407 CONTINUE IOBR1 = LISOBJ(IVALI1+1) IOBR2 = LISOBJ(IVALI2+1) MTYP1 = TYPOBJ C---------- Cas du CHPOINT : IF (MTYP1.EQ.'CHPOINT ') THEN CALL ECROBJ('CHPOINT ',IOBR1) CALL ECROBJ('CHPOINT ',IOBR2) CALL ECRREE(1.D0 - DREL) CALL ECRREE(DREL) CALL COLI CALL LIROBJ('CHPOINT ',IRET,1,IRETOU) IF (IRETOU.EQ.0) GOTO 599 C------------- calcul du deplacement eventuel du champ ---------- IF (CHAMOB(IC).EQ.'TRAN'.OR.CHAMOB(IC).EQ.'ROTA'.OR. & CHAMOB(IC).EQ.'TRAJ') THEN MTYPR = CHAMOB(IC) IPOENT = IRET CHATY2 = MTYP1 IPOENU = ICHPO4 IPOENV = ICHPO5 IPOENW = ICHPO6 IPOENX = ICHPO7 CALL TIDEP1(T1,IPOENT,CHATY2,MTYPR, $ IPOENU,IPOENV,IPOENW,IPOENX,IPOSOR) IF (IERR.NE.0) RETURN IRET = IPOSOR ENDIF CHARIN = CHANOM(IC) TAPOBJ = 'CHPOINT ' IOBRE = IRET TAPIND = 'MOT ' CALL ECCTAB(ITA1,TAPIND,IVALIN,XVALIN,CHARIN, $ LOGIN,IOBIN,TAPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) C------------- Cas du MCHAML : ELSEIF (MTYP1.EQ.'MCHAML ') THEN IF (CHANOM(IC).EQ.'MATE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF ELSE CALL ECROBJ('MCHAML ',IOBR1) CALL ECROBJ('MCHAML',IOBR2) CALL ECRREE(1.D0 - DREL) CALL ECRREE(DREL) CALL COLI CALL LIROBJ('MCHAML ',IRET,1,IRETOU) IF (IRETOU.EQ.0) GOTO 599 C------------- calcul du deplacement eventuel du champ ---------- IF (CHAMOB(IC).EQ.'TRAN'.OR.CHAMOB(IC).EQ.'ROTA'.OR. & CHAMOB(IC).EQ.'TRAJ') THEN MTYPR = CHAMOB(IC) IPOENT = IRET CHATY2 = MTYP1 IPOENU = ICHPO4 IPOENV = ICHPO5 IPOENW = ICHPO6 IPOENX = ICHPO7 CALL TIDEP1(T1,IPOENT,CHATY2,MTYPR, $ IPOENU,IPOENV,IPOENW,IPOENX,IPOSOR) IF (IERR.NE.0) RETURN IRET = IPOSOR ENDIF ENDIF CHARIN = CHANOM(IC) TAPOBJ = 'MCHAML ' IOBRE = IRET TAPIND = 'MOT ' CALL ECCTAB(ITA1,TAPIND,IVALIN,XVALIN,CHARIN, $ LOGIN,IOBIN,TAPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) C------------- Cas du MODELE : ELSEIF (MTYP1.EQ.'MMODEL ') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------- Cas du MAILLAGE : ELSEIF (MTYP1.EQ.'MAILLAGE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------- Cas de la RIGIDITE : ELSEIF (MTYP1.EQ.'RIGIDITE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------- Cas du POINT : ELSEIF (MTYP1.EQ.'POINT ') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IF (ABS(DREL-0.D0).LE.XZPREC) THEN IRET = IOBR1 ELSE SEGACT,MCOORD C write(6,*) 'IOBR1, IOBR2,DREL=',IOBR1,IOBR2,DREL NBPTS = NBPTS+1 SEGADJ,MCOORD IDIMP1 = IDIM + 1 XP1 = XCOOR((IOBR1-1)*IDIMP1+1) YP1 = XCOOR((IOBR1-1)*IDIMP1+2) ZP1 = XCOOR((IOBR1-1)*IDIMP1+3) XP2 = XCOOR((IOBR2-1)*IDIMP1+1) YP2 = XCOOR((IOBR2-1)*IDIMP1+2) ZP2 = XCOOR((IOBR2-1)*IDIMP1+3) XCOOR((NBPTS-1)*IDIMP1+1) = DREL*XP2+(1.D0-DREL)*XP1 XCOOR((NBPTS-1)*IDIMP1+2) = DREL*YP2+(1.D0-DREL)*YP1 XCOOR((NBPTS-1)*IDIMP1+3) = DREL*ZP2+(1.D0-DREL)*ZP1 SEGDES,MCOORD ENDIF C--------- le LISTOBJE ne contient pas de CHPOINT, MCHAML, MMODLE ou MAILLAGE ELSE CALL ERREUR(694) GOTO 599 ENDIF ELSE C-------- Pas de type connu trouve CALL ERREUR(695) GOTO 599 ENDIF 501 CONTINUE CALL ECROBJ('TABLE ',ITA1) RETURN 598 IF(IC.NE.0) THEN DO 555 J = 1, IC IRETT = MTABIV(J) CALL DTCHPO(IRETT) 555 CONTINUE ENDIF 599 CONTINUE SEGSUP MTABLE RETURN ELSE *----------------------------------------------------------------------- *- cas ou on veut instancier un seul chargement elementaire de nom MOT - *------------------------------------------------------------------------- * cas ou on veut instancier tout le chargement et le ranger dans un seul champ *------------------------------------------------------------------------- ISU = 0 *-------------- boucle sur les chargements élémentaires --------------- DO 502 IC = 1, NCHAR IF (MOT1.NE.' ') THEN IF (mcharg.CHANOM(IC).NE.MOT1) GOTO 502 ENDIF *--------- on ne considère que les objets de sous type force ----------- IF(CHANAT(IC).EQ.'DEPLACEM') THEN MOTERR(1:8)='CHARGEME' MOTERR(9:16)='DEPLACEM' CALL ERREUR(131) GOTO 690 ENDIF ICHARG=KCHARG(IC) C SEGACT ICHARG IPO1 = ICHPO1 IPO2 = ICHPO2 *--- cas des chargements elementaires CHPOINT (ou MCHAML) + EVOL ------- IF((CHATYP.EQ.'CHPOINT ').OR.(CHATYP.EQ.'MCHAML ')) THEN C Cas particulier du chargement constant : on retourne le champ C sans aucune interpolation IF (ICHPO2.EQ.0) THEN IRET=ICHPO1 TAPOBJ=CHATYP C Cas general : interpolation dans l'evolution ELSE MLREEL=ICHPO2 SEGACT MLREEL NF=PROG(/1) *------- Le temps %r1 sort de la table du %i1ème chargement ------------- C SP : on s'autorise a sortir de l'intervale de definition de l'evolution. C L'interpolation de l'amplitude est geree par INTER1. C T2 = T1 + ABS(T1*0.000001D0) C T3 = T1 - ABS(T1*0.000001D0) C IF(PROG(1).GT.T2.OR.PROG(NF).LT.T3) THEN C INTERR(1)=IC C REAERR(1)=T1 C CALL ERREUR(342) C GOTO 690 C ENDIF C------------- calcul du deplacement eventuel du champ ---------- IF (CHAMOB(IC).EQ.'TRAN'.OR.CHAMOB(IC).EQ.'ROTA'.OR. & CHAMOB(IC).EQ.'TRAJ') THEN MTYPR = CHAMOB(IC) IPOENT = IPO1 CHATY2 = CHATYP IPOENU = ICHPO4 IPOENV = ICHPO5 IPOENW = ICHPO6 IPOENX = ICHPO7 CALL TIDEP1(T1,IPOENT,CHATY2,MTYPR, $ IPOENU,IPOENV,IPOENW,IPOENX,IPOSOR) IF(IERR.NE.0) RETURN IPO1 = IPOSOR ENDIF C----- interpole la valeur de l'evolution FT1 au temps T1 ICHATX=ICHPO2 ICHAFX=ICHPO3 CALL INTER1(ICHATX,ICHAFX,T1,FT1) C C----- Cas du chargement de nom TRAJ : IF (CHANOM(IC).EQ.'TRAJ') THEN IF (MOT1.EQ.'TRAJ'.OR.NCHAR.EQ.1) THEN C write(6,*) 'TIRE : chargement de nom TRAJ' CALL IPLCUR(IPO1,FT1,IPOIN1) IF (IERR.NE.0) RETURN CALL ECROBJ('POINT ',IPOIN1) RETURN ELSE C Si d'autres chargements : incompatible CALL ERREUR(695) GOTO 690 ENDIF ENDIF C----- Autres cas : realise la multiplication du CHPOINT ou du MCHAML ----------- IOPERA = 2 IARGU = 2 I11 = 0 IRET = 0 IF(CHATYP.EQ.'CHPOINT ') THEN CALL ACTOBJ('CHPOINT ',IPO1,1) CALL OPCHP1(IPO1,IOPERA,IARGU,I11,FT1,IRET,IRETOU) IF(IRETOU .EQ. 0)THEN CALL ERREUR(26) RETURN ENDIF ELSE CALL ACTOBJ('MCHAML ',IPO1,1) CALL OPCHE1(IPO1,IOPERA,IARGU,I11,FT1,IRET,IRETOU) IF(IRETOU .EQ. 0)THEN CALL ERREUR(26) RETURN ENDIF ENDIF ENDIF IF(IRET.EQ.0) GOTO 690 IF(ISU.EQ.0) THEN IRETT = IRET ISU = 1 CHATY2 = CHATYP ELSE *------------- Chargements elementaires incompatibles --------------- IF(CHATYP.NE.CHATY2) THEN CALL ERREUR(695) GOTO 690 ELSE IF(CHATYP.EQ.'CHPOINT ') THEN CALL FUCHPO(IRETT,IRET,IRETOU) C CALL DTCHPO(IRET) IF(IRETOU.EQ.0) THEN IF(IRETT.NE.0) THEN CALL DTCHPO(IRETT) ENDIF GOTO 690 ENDIF C CALL DTCHPO(IRETT) IRETT=IRETOU ELSEIF (CHATYP.EQ.'MCHAML ') THEN CALL ADCHEL(IRETT,IRET,IRETOU,1) IF (IERR.NE.0) RETURN IRETT=IRETOU ENDIF CHATY2 = CHATYP ENDIF ENDIF C---------------------------------------------------------------------- C Cas du chargement elementaire TABLE1-TABLE2 C---------------------------------------------------------------------- ELSEIF (CHATYP.EQ.'TABLE ') THEN IVALI1 = 0 IVALI2 = 1 mtab1=ipo1 segact mtab1 jma1=mtab1.mlotab DO 605 JJ = 1,JMA1 TAPOB1 =MTAB1. MTABTV(IVALI1+1) TAPOB2 =MTAB1. MTABTV(IVALI2+1) XVALR1=MTAB1.RMTABV(IVALI1+1) IF (JMA1.EQ.1) THEN XVALR2 = T1 ELSE XVALR2=MTAB1.RMTABV(IVALI2+1) ENDIF IF (IVALI1.EQ.0) THEN IF (T1.LE.XVALR1) THEN DREL = 0.D0 GOTO 607 ENDIF ENDIF IF (IVALI2.EQ.(JMA1-1)) THEN IF (T1.GE.XVALR2) THEN DREL = 1.D0 GOTO 607 ENDIF ENDIF IF((XVALR1.LE.T1).AND.(T1.LE.XVALR2)) GOTO 606 6059 CONTINUE IVALI1 = IVALI1 + 1 IVALI2 = IVALI2 + 1 605 CONTINUE *------- Le temps %r1 sort de la table du %i1ème chargement ------------- INTERR(1)=IC REAERR(1)=T1 CALL ERREUR(342) GOTO 690 606 CONTINUE *---------- la premiere table ne pointe pas vers des reels ---------- IF((TAPOB1.NE.TAPOB2).OR.(TAPOB1.NE.'FLOTTANT')) THEN CALL ERREUR(692) GOTO 690 ENDIF DREL = (T1 - XVALR1)/(XVALR2 - XVALR1) 607 CONTINUE SEGDES MTAB1 MTAB2=IPO2 SEGACT MTAB2 TAPOB1 =MTAB2. MTABTV(IVALI1+1) TAPOB2 =MTAB2. MTABTV(IVALI2+1) IOBR1 = MTAB2. MTABIV(IVALI1+1) IF (JMA1.EQ.1) THEN IRET = IOBR1 GOTO 668 ENDIF IOBR2=MTAB2. MTABIV(IVALI2+1) SEGDES MTAB2 *------ la deuxieme table ne pointe pas vers de champs de meme type ---- IF(TAPOB1.NE.TAPOB2) THEN write(6,*) ' ivali1 ' , ivali1 , ' ivali2 ' , ivali2 write(6,*) ' tapob1 ' , tapob1,' tapob2 ',tapob2 CALL ERREUR(693) GOTO 690 ENDIF IF(TAPOB1.EQ.'CHPOINT ') THEN CALL ECROBJ('CHPOINT ',IOBR1) CALL ECROBJ('CHPOINT ',IOBR2) CALL ECRREE(1.D0 - DREL) CALL ECRREE(DREL) CALL COLI CALL LIROBJ('CHPOINT ',IRET,1,IRETOU) IF(IRETOU.EQ.0) GOTO 690 C------------- calcul du deplacement eventuel du champ ---------- IF (CHAMOB(IC).EQ.'TRAN'.OR.CHAMOB(IC).EQ.'ROTA'.OR. & CHAMOB(IC).EQ.'TRAJ') THEN MTYPR = CHAMOB(IC) IPOENT = IRET CHATY2 = TAPOB1 IPOENU = ICHPO4 IPOENV = ICHPO5 IPOENW = ICHPO6 IPOENX = ICHPO7 CALL TIDEP1(T1,IPOENT,CHATY2,MTYPR, $ IPOENU,IPOENV,IPOENW,IPOENX,IPOSOR) IF(IERR.NE.0) RETURN IRET = IPOSOR ENDIF ELSEIF (TAPOB1.EQ.'MCHAML ') THEN IF (CHANOM(IC).EQ.'MATE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF ELSE CALL ECROBJ('MCHAML ',IOBR1) CALL ECROBJ('MCHAML ',IOBR2) CALL ECRREE(1.D0 - DREL) CALL ECRREE(DREL) CALL COLI CALL LIROBJ('MCHAML ',IRET,1,IRETOU) IF(IRETOU.EQ.0) GOTO 690 C------------- calcul du deplacement eventuel du champ ---------- IF (CHAMOB(IC).EQ.'TRAN'.OR.CHAMOB(IC).EQ.'ROTA'.OR. & CHAMOB(IC).EQ.'TRAJ') THEN MTYPR = CHAMOB(IC) IPOENT = IRET CHATY2 = TAPOB1 IPOENU = ICHPO4 IPOENV = ICHPO5 IPOENW = ICHPO6 IPOENX = ICHPO7 CALL TIDEP1(T1,IPOENT,CHATY2,MTYPR, $ IPOENU,IPOENV,IPOENW,IPOENX,IPOSOR) IF(IERR.NE.0) RETURN IRET = IPOSOR ENDIF ENDIF C------------- Cas du MODELE : ELSEIF (TAPOB1.EQ.'MMODEL ') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------- Cas du MAILLAGE : ELSEIF (TAPOB1.EQ.'MAILLAGE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------- Cas de la RIGIDITE : ELSEIF (TAPOB1.EQ.'RIGIDITE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------ Cas du POINT : ELSEIF (TAPOB1.EQ.'POINT ') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN NBPTS = IOBR2 ELSE IF (ABS(DREL-0.D0).LE.XZPREC) THEN NBPTS = IOBR1 ELSE SEGACT,MCOORD C write(6,*) 'IOBR1, IOBR2,DREL=',IOBR1,IOBR2,DREL NBPTS = NBPTS+1 SEGADJ,MCOORD IDIMP1 = IDIM + 1 XP1 = XCOOR((IOBR1-1)*IDIMP1+1) YP1 = XCOOR((IOBR1-1)*IDIMP1+2) ZP1 = XCOOR((IOBR1-1)*IDIMP1+3) XP2 = XCOOR((IOBR2-1)*IDIMP1+1) YP2 = XCOOR((IOBR2-1)*IDIMP1+2) ZP2 = XCOOR((IOBR2-1)*IDIMP1+3) XCOOR((NBPTS-1)*IDIMP1+1) = DREL*XP2+(1.D0-DREL)*XP1 XCOOR((NBPTS-1)*IDIMP1+2) = DREL*YP2+(1.D0-DREL)*YP1 XCOOR((NBPTS-1)*IDIMP1+3) = DREL*ZP2+(1.D0-DREL)*ZP1 SEGDES,MCOORD ENDIF *-- la 2e table ne pointe pas vers un CHPOINT, MCHAML, MMODLE ou un MAILLAGE ---- ELSE CALL ERREUR(694) GOTO 690 ENDIF 668 CONTINUE IF (ISU.EQ.0) THEN IRETT = IRET ISU = 1 CHATY2 = TAPOB1 ELSE *------------- Chargements elementaires incompatibles --------------- IF(TAPOB1.NE.CHATY2) THEN CALL ERREUR(695) GOTO 690 ELSE IF(TAPOB1.EQ.'CHPOINT ') THEN CALL FUCHPO(IRETT,IRET,IRETOU) C CALL DTCHPO(IRET) IF(IRETOU.EQ.0) THEN IF(IRETT.NE.0) THEN CALL DTCHPO(IRETT) ENDIF GOTO 690 ENDIF C CALL DTCHPO(IRETT) IRETT=IRETOU ELSEIF (TAPOB1.EQ.'MCHAML ') THEN CALL ADCHEL(IRETT,IRET,IRETOU,1) IF (IERR.NE.0) RETURN IRETT=IRETOU ELSEIF (TAPOB1.EQ.'MMODEL ') THEN CALL FUSMOD(IRETT,IRET,IRETOU) IF (IERR.NE.0) RETURN IRETT=IRETOU ELSEIF (TAPOB1.EQ.'MAILLAGE ') THEN CALL FUSE(IRETT,IRET,IRETOU,.false.) IF (IERR.NE.0) RETURN IRETT=IRETOU ELSEIF (TAPOB1.EQ.'RIGIDITE') THEN CALL FUSRIG(IRETT,IRET,IRETOU) IF (IERR.NE.0) RETURN IRETT=IRETOU ENDIF CHATY2 = TAPOB1 ENDIF ENDIF C---------------------------------------------------------------------- C Cas des chargements elementaires LREE1-LOBJ1 C---------------------------------------------------------------------- ELSEIF (CHATYP.EQ.'LISTOBJE') THEN C---------- Recherche intervalle de temps contenant T1 IVALI1 = 0 IVALI2 = 1 MLREEL = IPO2 SEGACT, MLREEL MLOBJE = IPO1 SEGACT, MLOBJE JMA1 = PROG(/1) DO 305 JJ = 1,JMA1 XVALR1 = PROG(IVALI1+1) IF(JMA1.EQ.1) THEN XVALR2 = T1 ELSE XVALR2 = PROG(IVALI2+1) ENDIF IF(IVALI1.EQ.0) THEN IF (T1.LE.XVALR1) THEN DREL = 0.D0 GOTO 307 ENDIF ENDIF IF(IVALI2.EQ.(JMA1-1)) THEN IF (T1.GE.XVALR2) THEN DREL = 1.D0 GOTO 307 ENDIF ENDIF IF((XVALR1.LE.T1).AND.(T1.LE.XVALR2)) GOTO 306 IVALI1 = IVALI1 + 1 IVALI2 = IVALI2 + 1 305 CONTINUE C---------- SP : sans doute sans objet aujourd'hui (extrapolation permise) *---------- Le temps %r1 sort de la table du %i1eme chargement INTERR(1)=IC REAERR(1)=T1 CALL ERREUR(342) GOTO 690 C---------- On a trouve les piquets de temps encadrants T1 306 CONTINUE DREL = (T1 - XVALR1)/(XVALR2 - XVALR1) C---------- Interpolation du chargement a T1 307 CONTINUE IOBR1 = LISOBJ(IVALI1+1) IF (JMA1.EQ.1) THEN IRET = IOBR1 GOTO 669 ENDIF IOBR2 = LISOBJ(IVALI2+1) MTYP1 = TYPOBJ C---------- Cas du CHPOINT : IF (MTYP1.EQ.'CHPOINT ') THEN CALL ECROBJ('CHPOINT ',IOBR1) CALL ECROBJ('CHPOINT ',IOBR2) CALL ECRREE(1.D0 - DREL) CALL ECRREE(DREL) CALL COLI CALL LIROBJ('CHPOINT ',IRET,1,IRETOU) IF (IRETOU.EQ.0) GOTO 690 C------------- calcul du deplacement eventuel du champ ---------- IF (CHAMOB(IC).EQ.'TRAN'.OR.CHAMOB(IC).EQ.'ROTA'.OR. & CHAMOB(IC).EQ.'TRAJ') THEN MTYPR = CHAMOB(IC) IPOENT = IRET CHATY2 = MTYP1 IPOENU = ICHPO4 IPOENV = ICHPO5 IPOENW = ICHPO6 IPOENX = ICHPO7 CALL TIDEP1(T1,IPOENT,CHATY2,MTYPR, $ IPOENU,IPOENV,IPOENW,IPOENX,IPOSOR) IF (IERR.NE.0) RETURN IRET = IPOSOR ENDIF C------------- Cas du MCHAML : ELSEIF (MTYP1.EQ.'MCHAML ') THEN IF (CHANOM(IC).EQ.'MATE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF ELSE CALL ECROBJ('MCHAML ',IOBR1) CALL ECROBJ('MCHAML',IOBR2) CALL ECRREE(1.D0 - DREL) CALL ECRREE(DREL) CALL COLI CALL LIROBJ('MCHAML ',IRET,1,IRETOU) IF (IRETOU.EQ.0) GOTO 690 C------------- calcul du deplacement eventuel du champ ---------- IF (CHAMOB(IC).EQ.'TRAN'.OR.CHAMOB(IC).EQ.'ROTA'.OR. & CHAMOB(IC).EQ.'TRAJ') THEN MTYPR = CHAMOB(IC) IPOENT = IRET CHATY2 = MTYP1 IPOENU = ICHPO4 IPOENV = ICHPO5 IPOENW = ICHPO6 IPOENX = ICHPO7 CALL TIDEP1(T1,IPOENT,CHATY2,MTYPR, $ IPOENU,IPOENV,IPOENW,IPOENX,IPOSOR) IF (IERR.NE.0) RETURN IRET = IPOSOR ENDIF ENDIF C------------- Cas du MODELE : ELSEIF (MTYP1.EQ.'MMODEL ') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------- Cas du MAILLAGE : ELSEIF (MTYP1.EQ.'MAILLAGE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------- Cas de la RIGIDITE : ELSEIF (MTYP1.EQ.'RIGIDITE') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN IRET = IOBR2 ELSE IRET = IOBR1 ENDIF C------------- Cas du POINT : ELSEIF (MTYP1.EQ.'POINT ') THEN IF (ABS(DREL-1.D0).LE.XZPREC) THEN NBPTS = IOBR2 ELSE IF (ABS(DREL-0.D0).LE.XZPREC) THEN NBPTS = IOBR1 ELSE SEGACT,MCOORD*MOD C write(6,*) 'NBPTS,IOBR1, IOBR2,DREL=',NBPTS,IOBR1,IOBR2,DREL NBPTS = NBPTS+1 SEGADJ,MCOORD IDIMP1 = IDIM + 1 XP1 = XCOOR((IOBR1-1)*IDIMP1+1) YP1 = XCOOR((IOBR1-1)*IDIMP1+2) ZP1 = XCOOR((IOBR1-1)*IDIMP1+3) XP2 = XCOOR((IOBR2-1)*IDIMP1+1) YP2 = XCOOR((IOBR2-1)*IDIMP1+2) ZP2 = XCOOR((IOBR2-1)*IDIMP1+3) XCOOR((NBPTS-1)*IDIMP1+1) = DREL*XP2+(1.D0-DREL)*XP1 XCOOR((NBPTS-1)*IDIMP1+2) = DREL*YP2+(1.D0-DREL)*YP1 XCOOR((NBPTS-1)*IDIMP1+3) = DREL*ZP2+(1.D0-DREL)*ZP1 SEGDES,MCOORD ENDIF C--------- le LISTOBJE ne contient pas de CHPOINT, MCHAML, MMODLE ou MAILLAGE ELSE CALL ERREUR(694) GOTO 690 ENDIF 669 CONTINUE IF (ISU.EQ.0) THEN IRETT = IRET ISU = 1 CHATY2 = MTYP1 ELSE *------------- Chargements elementaires incompatibles --------------- IF(MTYP1.NE.CHATY2) THEN CALL ERREUR(695) GOTO 690 ELSE IF(MTYP1.EQ.'CHPOINT ') THEN CALL FUCHPO(IRETT,IRET,IRETOU) IF(IRETOU.EQ.0) THEN IF(IRETT.NE.0) THEN CALL DTCHPO(IRETT) ENDIF GOTO 690 ENDIF C CALL DTCHPO(IRETT) IRETT=IRETOU ELSEIF (MTYP1.EQ.'MCHAML ') THEN CALL ADCHEL(IRETT,IRET,IRETOU,1) IF (IERR.NE.0) RETURN IRETT=IRETOU ELSEIF (MTYP1.EQ.'MMODEL ') THEN CALL FUSMOD(IRETT,IRET,IRETOU) IF (IERR.NE.0) RETURN IRETT=IRETOU ELSEIF (MTYP1.EQ.'MAILLAGE ') THEN CALL FUSE(IRETT,IRET,IRETOU,.false.) IF (IERR.NE.0) RETURN IRETT=IRETOU ELSEIF (MTYP1.EQ.'RIGIDITE') THEN CALL FUSRIG(IRETT,IRET,IRETOU) IF (IERR.NE.0) RETURN IRETT=IRETOU ENDIF CHATY2 = MTYP1 ENDIF ENDIF ELSE C---------- Fin ELSEIF sur CHATYP : pas de type connu trouve CALL ERREUR(695) GOTO 690 ENDIF 502 CONTINUE IF(IRETT.EQ.0) THEN IF (MOT1.NE.' ') THEN MOTERR(1:4) = MOT1 CALL ERREUR(685) ELSE CALL ERREUR(696) ENDIF RETURN ENDIF IF (CHATY2.EQ.'CHPOINT ') THEN CALL ACTOBJ('CHPOINT ',IRETT,1) CALL ECROBJ('CHPOINT ',IRETT) ELSEIF (CHATY2.EQ.'MCHAML ') THEN CALL ACTOBJ('MCHAML ',IRETT,1) CALL ECROBJ('MCHAML ',IRETT) ELSEIF (CHATY2.EQ.'MMODEL ') THEN CALL ACTOBJ('MMODEL ',IRETT,1) CALL ECROBJ('MMODEL ',IRETT) ELSEIF (CHATY2.EQ.'MAILLAGE') THEN CALL ACTOBJ('MAILLAGE',IRETT,1) CALL ECROBJ('MAILLAGE',IRETT) ELSEIF (CHATY2.EQ.'RIGIDITE') THEN CALL ACTOBJ('RIGIDITE',IRETT,1) CALL ECROBJ('RIGIDITE',IRETT) ELSEIF (CHATY2.EQ.'POINT ') THEN CALL ECROBJ('POINT ',NBPTS) ELSE CALL ERREUR(694) ENDIF RETURN 690 CONTINUE RETURN ENDIF C---------------------------- C CAS DE L'OBJET SOLUTION C----------------------------- 200 CONTINUE ISOLIT=0 CALL LIRCHA(MCHA,0,IRETOU) IF(IRETOU.EQ.0) GO TO 300 C CALL LIROBJ('SOLUTION ',KSOLU,1,IRETOU) IF(IERR.NE.0) GOTO 5000 MSOLUT=KSOLU C C *** ON VA CHERCHER LE CHAMP DE TYPE MCHA DANS LE MSOLUT SEGACT MSOLUT C C *** LECTURE DE FN,MN,QX,QY OU QZ ? CALL PLACE(MOFREQ,LFREQ,IPLAC,MCHA) IF(IPLAC.NE.0) THEN ICHA=4 GOTO 50 ENDIF C *** OPTION GRAND DEPLACEMENT ? CALL PLACE (MOGDEP,LGDEP,IGDEP,MCHA) IF(IGDEP .NE. 0) THEN ICHA = 10 + IGDEP GOTO 50 ENDIF C *** LECTURE DES DEPLACEMENTS,DES CONTRAINTES ... MOTERR(1:8)=ITYSOL CALL CHRCHA(MCHA,MOTERR(1:8),ICHA,ISOLIT) IF(ICHA.EQ.0) THEN MOTERR(1:8)='SOLUTION' MOTERR(9:26)=ITYSOL MOTERR(30:38)=MCHA CALL ERREUR(235) C ERREUR DANS LE TYPE DE CHAMP GOTO 5000 ENDIF C TYPE = VITE + ROBO C IF(ICHA.EQ.8) THEN CALL LIRMOT ( MOROBO,1,IROBO,0 ) IF( IROBO.NE.0 ) THEN ICHA2 = ICHA ICHA = 5 ENDIF ENDIF C TYPE = ACCE + ROBO C IF(ICHA.EQ.9) THEN CALL LIRMOT ( MOROBO,1,IROBO,0 ) IF( IROBO.NE.0 ) THEN ICHA3 = ICHA ICHA2 = ICHA - 1 ICHA = 5 ENDIF ENDIF C============================= 50 MSOLEN=MSOLIS(ICHA) IF(MSOLEN.EQ.0) THEN MOTERR(1:8)='SOLUTION' MOTERR(9:26)=ITYSOL MOTERR(30:38)=MCHA CALL ERREUR(235) GOTO 5000 ENDIF ISOLIT=MSOLIT(ICHA) SEGACT MSOLEN LTE=ISOLEN(/1) C C **** CALCUL DE IRG LE RANG DE L'OBJET CHERCHE C IRG=0 CALL LIRMOT(MOOPT,LMOOPT,IMOT,0) C ------------------------------ON PREND LA DERNIERE VALEUR--------- IF(IMOT.NE.0) GOTO 700 IRG=LTE GOTO 152 C C --------------------------------- RECHERCHE D'UN TEMPS----------- 700 IF(IMOT.NE.1)GOTO 701 MSOLRE=MSOLIS(1) IF(MSOLRE.EQ.0) GOTO 140 SEGACT MSOLRE CALL LIRREE (XXX,1,IRETOU) IF(IERR.NE.0) GOTO 5000 T1=XXX IF(T1.EQ.0.) THEN IF(SOLRE(1).EQ.0.) THEN IRG=1 SEGDES MSOLRE GOTO 152 ENDIF GOTO 140 ENDIF DO 153 J=1,LTE T2=SOLRE(J) TR=ABS((T2-T1)/T1) IF(TR.LT.PRECI) THEN IRG=J SEGDES MSOLRE GOTO 152 ENDIF IF(T2.GT.T1) GOTO 140 153 CONTINUE 140 CONTINUE SEGDES MSOLRE MOTERR(9:16)='FLOTTANT' GOTO 145 C -------------------------------------RECHERCHE D'UN CAS----------- 701 CONTINUE IF(IMOT.NE.2)GOTO 702 MSOLE1=MSOLIS(2) IF(MSOLE1.EQ.0) GOTO 141 SEGACT MSOLE1 CALL LIRENT(L1,1,IRETOU) IF(IERR.NE.0) GOTO 5000 DO 154 J=1,LTE IF(L1.EQ.MSOLE1.ISOLEN(J))THEN IRG=J SEGDES MSOLE1 GOTO 152 ENDIF 154 CONTINUE 141 CONTINUE SEGDES MSOLE1 MOTERR(9:16)='ENTIER ' GOTO 145 C -------------------------------------- RECHERCHE D'UN RANG----------- 702 IF(IMOT.NE.3) GOTO 703 CALL LIRENT(IRG,1,IRETOU) IF(IERR.NE.0) GOTO 5000 IF(IRG.GT.LTE.OR.IRG.LT.1) THEN MOTERR(1:8) = ITYSOL CALL ERREUR(203) GOTO 5000 ENDIF GOTO 152 C ---------------------------------------RECHERCHE D UN NUMERO DE MODE-- 703 IF(IMOT.NE.4) GOTO 5000 CALL LIRENT(INUME,1,IRETOU) IF(IERR.NE.0) GOTO 5000 IRG=INUME C C C C C GOTO 152 C --------------------------------ERREUR------------------------- 145 CONTINUE MOTERR(1:8)='SOLUTION' CALL ERREUR(135) GOTO 5000 C ------------------------------------------------------------------ 152 CONTINUE IRET = ISOLEN(IRG) SEGDES MSOLEN IF ( IRET.EQ.0 ) THEN MOTERR(1:8) = ITYSOL MOTERR(9:12)= MCHA INTERR(1) = IRG CALL ERREUR(234) GOTO 5000 ENDIF C TYPE = ACCE + ROBO C VITE IF ( ICHA2.NE.0 ) THEN MSOLEN = MSOLIS(ICHA2) IF(MSOLEN.EQ.0) THEN MOTERR(1:8)='SOLUTION' MOTERR(9:26)=ITYSOL MOTERR(30:38)=MCHA CALL ERREUR(235) GOTO 5000 ENDIF ISOLI2 = MSOLIT(ICHA2) IF ( ISOLI2.NE.ISOLIT ) GOTO 5000 SEGACT MSOLEN IRET2 = ISOLEN(IRG) SEGDES MSOLEN IF ( IRET2.EQ.0 ) THEN MOTERR(1:8) = ITYSOL MOTERR(9:12) = MCHA INTERR(1) = IRG CALL ERREUR(234) GOTO 5000 ENDIF ENDIF C TYPE = ACCE + ROBO C IF ( ICHA3.NE.0 ) THEN MSOLEN = MSOLIS(ICHA3) IF(MSOLEN.EQ.0) THEN MOTERR(1:8)='SOLUTION' MOTERR(9:26)=ITYSOL MOTERR(30:38)=MCHA CALL ERREUR(235) GOTO 5000 ENDIF ISOLI3 = MSOLIT(ICHA3) IF ( ISOLI3.NE.ISOLIT ) GOTO 5000 SEGACT MSOLEN IRET3 = ISOLEN(IRG) SEGDES MSOLEN IF ( IRET3.EQ.0 ) THEN MOTERR(1:8) = ITYSOL MOTERR(9:12) = MCHA INTERR(1) = IRG CALL ERREUR(234) GOTO 5000 ENDIF ENDIF C C **** FREQUENCE* /MGEN /QX /QY /QZ / POIN ************************** C POIN IF ( IPLAC.EQ.6) THEN IF(ITYSOL.NE.'DYNAMIQU') THEN MELEME = MSOLIS(3) SEGACT MELEME IPOINN = NUM(1,IRG) * CALL ECRENT(IPOINN) SEGDES MELEME CALL ECROBJ ('POINT',IPOINN) GOTO 5000 ELSE MOTERR(1:8)='SOLUTION' MOTERR(9:12) = ITYSOL INTERR(1) = IRG CALL ERREUR(131) GOTO 5000 ENDIF ENDIF IF ( ICHA.EQ.4 ) THEN MMODE = IRET SEGACT MMODE RET = FMMODD(IPLAC) SEGDES MMODE CALL ECRREE(RET) GOTO 5000 ENDIF C C *** LE MSOLUT EST UN MODE --------------------------------------- C IF ( ITYSOL.NE.'MODE ') GOTO 800 MSOLEN = MSOLIS(4) SEGACT MSOLEN MMODE = ISOLEN(IRG) SEGDES MSOLEN CALL TITMOD(MMODE,ITEX) GOTO 899 C 800 CONTINUE IF ( IMOT.NE.1 ) GOTO 801 WRITE(ITEX(1:24),FMT='(A4,8X,1PE12.5)') MCHA,T1 ITEX(5:12) = ' T=' GOTO 899 801 CONTINUE 899 CONTINUE C C *** LA SORTIE PORTE SUR DES CHPOINTS--------------------------- C IF ( ISOLIT.NE.2 ) GOTO 600 IF ( ICHA2.EQ.0 ) THEN IF (ITEX.NE.' ') THEN MCHPOI = IRET SEGACT MCHPOI*MOD MOCHDE = ITEX ENDIF GOTO 699 ENDIF C TYPE = VITE + ROBO C IF ( ICHA3.EQ.0 ) THEN N1 = 2 SEGINI MLCHPO ICHPOI(1) = IRET ICHPOI(2) = IRET2 IF (ITEX.NE.' ') THEN MCHPOI = IRET SEGACT MCHPOI*MOD MOCHDE = ITEX ENDIF ISOLIT = 34 IRET = MLCHPO GOTO 699 ENDIF C TYPE = ACCE + ROBO C N1 = 3 SEGINI MLCHPO ICHPOI(1) = IRET ICHPOI(2) = IRET2 ICHPOI(3) = IRET3 IF (ITEX.NE.' ') THEN MCHPOI = IRET SEGACT MCHPOI*MOD MOCHDE = ITEX ENDIF ISOLIT = 34 IRET = MLCHPO GOTO 699 C 600 CONTINUE IF ( ISOLIT.NE.5 ) GOTO 601 WRITE(IOIMP,*) 'TIRE :CAS ISOLIT=5 N EST PLUS BRANCHE' C 601 CONTINUE 699 CONTINUE CTYP = ' ' CALL TYPFIL (CTYP,ISOLIT) CALL ACTOBJ (CTYP,IRET,1) CALL ECROBJ (CTYP,IRET) 5000 CONTINUE RETURN C C PAS D OPERANDE CORRECTE TROUVE C 300 CALL QUETYP(MOTERR(1:8),0,IRETOU) IF(IRETOU.NE.0) THEN CALL ERREUR (39) ELSE CALL ERREUR(533) ENDIF RETURN END