C BASEMD SOURCE PV 20/03/24 21:15:28 10554 SUBROUTINE BASEMD IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) C C ================================================================== C C C C CREATION D UNE BASE MODALE C C SYNTAXE : B = BASE S L M U V ; C C B : OBJET DE TYPE BASE MODALE C C S : OBJET DE TYPE STRUCTURE C C L : OBJET DE TYPE MATTAC C C M : OBJET DE TYPE SOLUTION (SOUS TYPE : MODES) C C U : OBJET DE TYPE SOLUTION (SOUS TYPE : SOLUTIONS STATIQUES) C C V : OBJET DE TYPE SOLUTION (SOUS TYPE : PSEUMODE) C C C C ECRIT PAR FARVACQUE. C C APPELLE LES SUBROUTINES SUIVANTS: C C LIRE,ECRIRE,SOLS1,ERREUR(61,130,131,133,134,135,173,226,227) C ================================================================== C -INC SMSOLUT -INC SMBASEM -INC SMSTRUC -INC SMATTAC -INC PPARAM -INC CCOPTIO -INC CCHAMP -INC CCREEL -INC SMCOORD -INC SMELEME SEGMENT ITRAV(NJONC) SEGMENT ITRABB(0) * PARAMETER ( LNOM1 = 2 ) CHARACTER*4 NOMOP1(LNOM1) CHARACTER*8 CTYP DATA NOMOP1/'PLUS','ROTA'/ * * Nouvelle version avec les TABLEs * CALL LIRMOT(NOMOP1,LNOM1,IMOT1,0) IF(IERR.NE.0) RETURN CALL QUETYP(CTYP,1,IRETOU) IF (CTYP(1:8).EQ.'TABLE ') THEN CALL LIRTAB('BASE_MODALE',ITBAS,1,IRETOU) IF(IERR.NE.0) RETURN CALL LIRTAB('POINT',ITPTS,1,IRETOU) IF(IERR.NE.0) RETURN IPO1 = 0 IPO2 = 0 XANG = XZERO CALL LIROBJ('POINT ',IPO1,1,IRETOU) IF(IERR.NE.0) RETURN IF (IMOT1.EQ.2) THEN IF (IDIM.EQ.3) THEN CALL LIROBJ('POINT ',IPO2,1,IRETOU) IF(IERR.NE.0) RETURN ENDIF CALL LIRREE(XANG,1,IRETOU) IF(IERR.NE.0) RETURN ENDIF IF (IMOT1.EQ.0) THEN CALL ERREUR(498) RETURN ELSE CALL COPBAS(ITBAS,ITPTS,NOMOP1(IMOT1),IPO1,IPO2,XANG) RETURN ENDIF ENDIF C NIBST=5 C C **** LECTURE DE LA STRUCTURE C CALL LIROBJ('STRUCTUR',ISTRU0,1,IRETOU) IF(IERR.NE.0) GO TO 5000 MSTRUC=ISTRU0 SEGACT MSTRUC NSTRU=LISTRU(/1) IF(NSTRU.NE.1) THEN C ON VERIFIE QUE LA STRUCTURE EST IDENTIQUE MSOSTU=LISTRU(1) SEGACT MSOSTU I1=ISRAID I2=ISMASS I3=ITYSOU SEGDES MSOSTU DO 5 I=2,NSTRU MSOSTU=LISTRU(I) SEGACT MSOSTU IF(ISRAID.NE.I1) GOTO 6 IF(ISMASS.NE.I2) GOTO 6 IF(ITYSOU.NE.I3) GOTO 6 SEGDES MSOSTU GOTO 5 6 CONTINUE SEGDES MSOSTU CALL ERREUR(226) C LES SOUS STRUCTURES NE SONT PAS IDENTIQUES GOTO 5000 5 CONTINUE ENDIF SEGDES MSTRUC C C **** LECTURE DU MATTAC C CALL LIROBJ('ATTACHE ',IRET,0,IRETOU) MATTAC=IRET IF(IRETOU.EQ.0) MATTAC=0 C C **** LECTURE DES OBJETS SOLUTION C IMODE=0 ISOLS=0 IPSMO = 0 1 CALL LIROBJ('SOLUTION',IRET,0,IRETOU) IF(IRETOU.EQ.0) GO TO 53 MSOLUT=IRET SEGACT MSOLUT C C **** EST CE UN MODE ? C IF(ITYSOL.NE.'MODE ') GO TO 51 IF(IMODE.EQ.0) GO TO 52 MOTERR(1:8)='SOLUTION' MOTERR(9:15)='MODE' CALL ERREUR(130) C MODES DEJA DONNES SEGDES MSOLUT GO TO 5000 52 CONTINUE IMODE=MSOLUT SEGACT MSOLUT MSOLEN=MSOLIS(5) SEGDES MSOLUT IF(MSOLEN.NE.0) GO TO 304 MOTERR(1:8)='MODE' CALL ERREUR(61) GOTO 5000 304 CONTINUE IF(ISOLS.EQ.0) GO TO 1 GO TO 53 51 CONTINUE C C **** EST CE UN SOLSTA ? C IF(ITYSOL.NE.'SOLUSTAT') GO TO 54 IF(ISOLS.EQ.0) GO TO 55 MOTERR(1:8)='SOLUTION' MOTERR(9:16)='SOLUSTAT' CALL ERREUR(130) C SOLUTIONS STATIQUES DEJA DONNEES SEGDES MSOLUT GO TO 5000 55 CONTINUE ISOLS=MSOLUT SEGDES MSOLUT IF(IMODE.EQ.0) GO TO 1 GO TO 53 C C **** EST CE UN PSEUMOD? C 54 CONTINUE IF(ITYSOL.NE.'PSEUMODE') GO TO 954 IF(IPSMO.EQ.0) GO TO 955 MOTERR(1:8)='SOLUTION' MOTERR(9:16)='PSEUMODE' CALL ERREUR(130) C SOLUTIONS STATIQUES DEJA DONNEES SEGDES MSOLUT GO TO 5000 955 CONTINUE IPSMO=MSOLUT SEGDES MSOLUT IF(IMODE.EQ.0) GO TO 1 GO TO 53 954 CONTINUE MOTERR(1:8)='SOLUTION' MOTERR(9:16)=ITYSOL CALL ERREUR(131) C ON N ATTEND PAS CE SOUSTYPE DE SOLUTION SEGDES MSOLUT GO TO 5000 C C **** VERIFICATIONS DIVERSES C 53 CONTINUE IF(IMODE.NE.0 . OR . MATTAC.NE.0) GO TO 60 CALL ERREUR(133) C NI MODE NI LIAISON DANS CETTE BASE MODALE GO TO 5000 60 CONTINUE C SEGACT MSTRUC C BOUCLE SUR LES SOUS-BASES SEGINI ITRABB DO 66 IBAS=1,NSTRU SEGINI MSOBAS ITRABB(**)=MSOBAS IBSTRM(1)=LISTRU(IBAS) IBSTRM(2)=0 IBSTRM(3)=0 IBSTRM(4)=MATTAC IBSTRM(5)=IPSMO IF(IBAS.EQ.1) THEN IBSTRM(2)=IMODE ELSE IF(IMODE.NE.0) THEN C C **** DANS LE CAS IDEN, DUPLICATION DES MODES C SEGACT MCOORD*mod MSOLUT=IMODE SEGACT MSOLUT MELEME=MSOLIS(3) SEGACT MELEME NBELEM=NUM(/2) NBREF=0 NBNN=1 NBSOUS=0 SEGINI IPT1 ITYPEL=1 MSOSTU=LISTRU(IBAS) IPOIN=nbpts NBPTS=IPOIN+NBELEM SEGADJ MCOORD DO 403 I=1,NBELEM XCOOR(IPOIN*(IDIM+1)+1)=0. XCOOR(IPOIN*(IDIM+1)+2)=0. IF(IDIM.EQ.3) XCOOR(IPOIN*(IDIM+1)+3)=0. XCOOR(IPOIN*(IDIM+1)+(IDIM+1))=0. IPOIN=IPOIN+1 IPT1.NUM(1,I)=IPOIN 403 CONTINUE NIPO=MSOLIS(/1) SEGINI MSO1 MSO1.ITYSOL=ITYSOL DO 404 I=1,NIPO MSO1.MSOLIS(I)=MSOLIS(I) MSO1.MSOLIT(I)=MSOLIT(I) 404 CONTINUE MSO1.MSOLIS(3)=IPT1 SEGDES MSO1,MSOLUT,MELEME,IPT1 IBSTRM(2)=MSO1 ENDIF C C **** BOUCLE SUR LES LIAISONS : ON CHERCHE LES LIAISONS QUI AGISSENT C **** SUR MSOSTU. MECA, FLUIDE ET DEPI :MJONCT MIS DANS MSOLE1 C **** AUTRES :RIEN C IF(MATTAC.EQ.0) GO TO 61 N=0 SEGACT MATTAC MSOSTU=LISTRU(IBAS) NSOUMA=LISATT(/1) DO 70 IA=1,NSOUMA MSOUMA=LISATT(IA) SEGACT MSOUMA NL=IATREL(/1) DO 72 IB=1,NL MJONCT=IATREL(IB) SEGACT MJONCT NC=ISTRJO(/1) DO 73 IC=1,NC IF(ISTRJO(IC).NE.MSOSTU) GO TO 73 IF(ITYATT.NE.'MECA'.AND.ITYATT.NE.'FLUI'.AND.ITYATT.NE.'DEPI') & GOTO 73 N=N+1 IF(N.EQ.1)SEGINI MSOLE1 IF(N.NE.1)SEGADJ MSOLE1 MSOLE1.ISOLEN(N)=MJONCT C WRITE(6,4446)MJONCT C4446 FORMAT(' ********MJONCT=',I6) 73 CONTINUE SEGDES MJONCT 72 CONTINUE SEGDES MSOUMA 70 CONTINUE NJONC=N C IF(ISOLS.NE.0) THEN C C **** COMPATIBILITE ENTRE LES MJONCT ET LES SOLUTIONS STATIQUES? C IF(NJONC.EQ.0) GOTO 900 C INCOMPATIBILITE ENTRE LES SOLSTA ET LES LIAISONS MSOLUT=ISOLS SEGACT MSOLUT MSOLEN=MSOLIS(10) SEGACT MSOLEN LTAB=ISOLEN(/1) IF(LTAB.LT.NJONC) THEN C INCOMPATIBILITE ENTRE LES SOLSTA ET LES LIAISONS SEGDES MSOLEN,MSOLUT GO TO 900 ENDIF IF(NJONC.LT.LTAB) SEGINI ITRAV DO 81 J=1,NJONC MJONCT=MSOLE1.ISOLEN(J) DO 80 I=1,LTAB IF(MJONCT.NE.ISOLEN(I)) GO TO 80 IF(NJONC.LT.LTAB) ITRAV(J)=I GOTO 81 80 CONTINUE C INCOMPATIBILITE ENTRE LES SOLSTA ET LES LIAISONS SEGDES MSOLEN,MSOLUT IF(NJONC.LT.LTAB) SEGSUP ITRAV GO TO 900 81 CONTINUE SEGDES MSOLEN,MSOLUT IF(NJONC.LT.LTAB) THEN C C CREATION DE L'OBJET SOLUTION STATIQUE REDUIT AUX LIAISONS DU MATTAC C MSO1=ISOLS SEGACT MSO1 MSOLE2=MSO1.MSOLIS(5) SEGACT MSOLE2 N=NJONC SEGINI MSOLEN NBELEM=NJONC NBNN=1 NBSOUS=0 NBREF=0 SEGINI MELEME ITYPEL=1 DO 82 IB=1,NJONC MJONCT=MSOLE1.ISOLEN(IB) SEGACT MJONCT IPT1=MJOPOI SEGACT IPT1 NUM(1,IB)=IPT1.NUM(1,ITRAV(IB)) ISOLEN(IB)=MSOLE2.ISOLEN(ITRAV(IB)) SEGDES IPT1,MJONCT 82 CONTINUE SEGDES MELEME,MSOLE2,MSOLEN,MSOLE1 SEGSUP ITRAV NIPO=10 SEGINI MSOLUT ITYSOL='SOLUSTAT' DO 83 I=1,NIPO MSOLIS(I)=0 MSOLIT(I)=0 83 CONTINUE MSOLIS(3)=MELEME MSOLIS(5)=MSOLEN MSOLIT(5)=2 MSOLIT(10)=14 MSOLIS(10)=MSOLE1 SEGDES MSOLUT IBSTRM(3)=MSOLUT ELSE IBSTRM(3)=ISOLS SEGSUP MSOLE1 ENDIF ELSE C C *** IL N'Y A PAS DE SOLUTION STATIQUES. S'IL EN FAUT ON VA LES C *** CALCULER EN APPELANT LE SOUS-PROGRAMME SOLS1 DE L'OPERATEUR SOLS C IF(NJONC.NE.0) THEN KSOSTU=MSOSTU KSOLE1=MSOLE1 CALL SOLS1(KSOSTU,KSOLE1,KSOLUT) IF(IERR.NE.0) THEN SEGSUP MSOLE1 GOTO 900 ENDIF IBSTRM(3)=KSOLUT ENDIF ENDIF C C **** SI IL Y A D'AUTRES TYPES DE LIAISONS, ON CREE DES MODES ET DES C **** SOLUTIONS STATIQUES REDUITS AUX POINTS DE CES DERNIERES LIAISONS C IF(IMODE.EQ.0) THEN C *** OUBLI DES MODES CALL ERREUR(227) ENDIF GOTO 62 C 900 CONTINUE MOTERR(1:8)='SOLUSTAT' MOTERR(9:15)='ATTACHE' CALL ERREUR(135) 62 CONTINUE SEGDES MATTAC 61 CONTINUE SEGDES MSOBAS 66 CONTINUE SEGDES MSTRUC N=ITRABB(/1) IF(N.NE.0) THEN SEGINI MBASEM DO 800 NN=1,N LISBAS(NN)=ITRABB(NN) 800 CONTINUE SEGDES MBASEM CALL ECROBJ('BASEMODA',MBASEM) ENDIF SEGSUP ITRABB 5000 CONTINUE RETURN END