dyne17
C DYNE17 SOURCE CB215821 20/11/25 13:26:22 10792 &KSAM,lmodyn) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) *--------------------------------------------------------------------* * * * Operateur DYNE : algorithme de Fu - de Vogelaere * * ________________________________________________ * * * * Creation des CHPOINTs qui contiendront les resultats. * * Creation des LISTREELs qui contiendront les resultats. * * Creation des POINTS qui contiendront les variables de liaison * * necessaires a une reprise. * * * * Parametres: * * * * e ITBAS Table representant une base modale * * e ITKM Table contenant les matrices XK et XM * * e IPMAIL Maillage de reference * * es KTRES Segment de sauvegarde des resultats * * e KPREF Segment des points de reference * * e NPLAA Nombre max de pts pour les liaisons en base A * * e NXPALA Nombre max de var internes pour ces memes liaisons * * * * Remarque importante: tous les CHPOINTs crees vont pointer * * sur le meme MELEME afin de limiter au maximum la memoire * * utilisee. * * * * Auteur, date de creation: * * * * Denis ROBERT-MOUGIN, le 30 juin 1989. * * * *--------------------------------------------------------------------* -INC PPARAM -INC CCOPTIO -INC SMCHARG -INC SMCHPOI -INC SMELEME -INC SMRIGID -INC SMLREEL -INC SMLENTI -INC SMCOORD -INC SMTABLE * * IPORES contient les pointeurs sur les CHPOINTs qui * representeront chaque variable pour chaque pas de sortie. * IPOREP contient les pointeurs sur les CHPOINTs * necessaires a une reprise eventuelle de calcul. * SEGMENT,MTRES REAL*8 XRES(NRES,NCRES,NPRES),XREP(NREP,NCRES) REAL*8 XRESLA(NLSA,NPRES,NVALA),XRESLB(NLSB,NPRES,NVALB) REAL*8 XMREP(NLIAB,4,IDIMB) INTEGER ICHRES(NVES),IPORES(NRESPO,NPRES),IPOREP(NREP) INTEGER ILIRES(NRESLI,NCRES) INTEGER IPOLA(NLSA),INULA(NLSA),IPLRLA(NLSA,NVALA) INTEGER IPOLB(NLSB),INULB(NLSB),IPLRLB(NLSB,NVALB) INTEGER ILIREA(NLSA,NTVAR),ILIREB(NLSB,NTVAR) INTEGER ILIRNA(NLSA,NTVAR),ILIRNB(NLSB,NTVAR) INTEGER IPOLR(1),IMREP(NLIAB,2),IPPREP(NLIAB,4) INTEGER ILPOLA(NLIAA,2) ENDSEGMENT SEGMENT,MPREF INTEGER IPOREF(NPREF) ENDSEGMENT * Segment pour Champoints SEGMENT,MSAM integer jplibb(NPLB) ENDSEGMENT c segment local pour verifier que les matrices sont deja assemblees et c pas 2 fois la meme inconnue (composante + noeud) dans 2 sous-matrices SEGMENT MVU c CHARACTER*4 COMPVU(NCVU) c INTEGER IDEJVU(NIVU,NCVU) INTEGER IDEJVU(NIVU) ENDSEGMENT * LOGICAL L0,L1,lmodyn * MTRES = KTRES MPREF = KPREF MSAM = KSAM NPREF = IPOREF(/1) NVES = ICHRES(/1) NRES = XRES(/1) NCRES = XRES(/2) NPRES = XRES(/3) NREP = XREP(/1) NLSA = IPLRLA(/1) NLSB = IPLRLB(/1) NLIAB = XMREP(/1) NLIAA = ILPOLA(/1) NPLBB = JPLIBB(/1) NTVAR = ILIRNB(/2) * *=========== CAS D'UNE BASE MODALE =========== * IF (ITBAS.NE.0.AND.ITKM.EQ.0) THEN * --- syntaxe table PASAPAS --- IF(LMODYN) THEN * maillage meleme = ipmail segact meleme if (lisous(/1).eq.0) then ipmmod = ipmail ipmsta = 0 else ipmmod = lisous(1) ipmsta = lisous(2) endif * * production chpoint forces base A (devso2) NSOUPO = 1 if(ipmmod.gt.0.and.ipmsta.gt.0) nsoupo = 2 NAT=1 SEGINI,MCHPOI IPCHPO = MCHPOI MTYPOI = 'FLIAISONS' IFOPOI = IFOUR * nature diffuse JATTRI(1) = 1 nmost0 = 0 KIPCHP = 0 if (ipmmod.gt.0) then NC = 1 SEGINI,MSOUPO KIPCHP = KIPCHP + 1 IPCHP(KIPCHP) = MSOUPO NOCOMP(1) = 'ALFA' NOHARM(1) = NIFOUR IGEOC = ipmmod ipt1 = ipmmod segact ipt1 N = ipt1.num(/2) nmost0 = N SEGINI,MPOVAL IPOVAL = MPOVAL endif if (ipmsta.gt.0) then NC = 1 SEGINI,MSOUPO KIPCHP = KIPCHP + 1 IPCHP(KIPCHP) = MSOUPO NOCOMP(1) = 'BETA' NOHARM(1) = NIFOUR IGEOC = ipmsta ipt1 = ipmsta segact ipt1 N = ipt1.num(/2) SEGINI,MPOVAL IPOVAL = MPOVAL endif * --- syntaxe tables DYNE normales --- ELSE * * Cas de la base modale, on n'a qu'une composante: 'ALFA' IF (IIMPI.EQ.333) THEN WRITE(IOIMP,*)'DYNE17: cas de la base modale' ENDIF NSOUPO = 1 NAT=1 SEGINI,MCHPOI IPCHPO = MCHPOI MTYPOI = ' ' IFOPOI = IFOUR * nature diffuse JATTRI(1) = 1 NC = 1 SEGINI,MSOUPO IPCHP(1) = MSOUPO NOCOMP(1) = 'ALFA' NOHARM(1) = NIFOUR NOCOMP(1) = 'ALFA' NOHARM(1) = NIFOUR IGEOC = IPMAIL N = NPREF SEGINI,MPOVAL IPOVAL = MPOVAL ENDIF * *=========== CAS DE MATRICES MODALES EN ENTREE =========== * ELSE IF (ITKM.NE.0) THEN * * On se refere au descripteur de la rigidite, mais attention: * les composantes peuvent differer d'une zone elementaire a * une autre. * & 'RIGIDITE',I1,X1,' ',L1,IRIGI) * * Creation du CHPOINT de reference: * IF (IIMPI.EQ.333) THEN WRITE(IOIMP,*) & 'DYNE17: creation selon un descripteur de rigidite' ENDIF MRIGID = IRIGI SEGACT,MRIGID NRIGI = IRIGEL(/2) IF (IIMPI.EQ.333) THEN WRITE(IOIMP,*) & 'DYNE17: nombre de rigidites elementaires ',NRIGI ENDIF NSOUPO = NRIGI NAT=1 SEGINI,MCHPOI IPCHPO = MCHPOI MTYPOI = ' ' * nature diffuse JATTRI(1) = 1 IFOPOI = IFOUR c creation du segment de verif NIVU = NPREF SEGINI,MVU DO 30 I=1,NRIGI NYSONT = 0 DESCR = IRIGEL(3,I) IPT1 = IRIGEL(1,I) SEGACT,DESCR,IPT1 * NTOTC est le nombre total d'inconnues * NBNO est le nombre de noeuds par element * NBEL est le nombre d'elements dans la zone * NC est le nombre de composantes par noeud dans la zone NTOTC = LISINC(/2) IF (IIMPI.EQ.333) THEN WRITE(IOIMP,*)'DYNE17: nombre total d''inconnues ',NTOTC WRITE(IOIMP,*)'DYNE17: nombre de composantes par noeud ',NC ENDIF SEGINI,MSOUPO IPCHP(I) = MSOUPO DO 40 IC=1,NC IF (LISINC(IC).NE.'ALFA'.and.LISINC(IC).NE.'BETA') THEN WRITE(IOIMP,*) 'DYNE: la raideur K de la table RAIDEUR_ET_MASSE', & ' ne peut avoir que ALFA ou BETA pour composante!' RETURN ENDIF NOCOMP(IC) = LISINC(IC) NOHARM(IC) = NIFOUR 40 CONTINUE * * Combien de noeuds references dans cette zone ? * c BP : le chpoint repose necessairement sur des elements POI1 NBSOUS=0 NBREF =0 NBNN =1 SEGINI,MELEME ITYPEL=1 IGEOC = MELEME c ce noeud appartient-il bien a la liste MPREF.IPOREF ? IF (ILYEST.EQ.0) GOTO 50 c rem : si ILYEST = 0 , on a un pb --> erreur dans devtra c BP : ce noeud a t'il deja ete vu dans une autre zone? IF(IDEJVU(ILYEST).EQ.0) THEN c tout va bien on ajoute ce noeud pour ces composantes NYSONT = NYSONT + 1 NUM(1,NYSONT) = IPT1.NUM(INO,IEL) IDEJVU(ILYEST)=NYSONT ELSE c noeud deja vu a l element NYSONT : on ne fait rien c on suppose qu'1 noeud => 1 inconnue ENDIF 50 CONTINUE IF(NYSONT.lt.NBELEM) THEN NBELEM=NYSONT SEGADJ,MELEME ENDIF IF (IIMPI.EQ.333) THEN WRITE(IOIMP,*)'DYNE17: nombre de noeuds dans la zone ',NYSONT ENDIF N = NYSONT SEGINI,MPOVAL IPOVAL = MPOVAL SEGDES,DESCR,IPT1,MELEME,MSOUPO 30 CONTINUE SEGDES,MRIGID SEGSUP,MVU ENDIF *=========== FIN DES CAS BASE MODALE / MATRICES MODALES =========== * * Variables demandees en sortie: c II = 0 IIPO = 0 c IILI = 0 c boucle sur les variables (deplacement, vitesse ... ) DO 60 ICR=1,8 * - Duplication du CHPOINT pour les variables demandees * a tous les pas de sortie IF (ICHRES(ICR).EQ.1) THEN c II = II + 1 IIPO=IIPO+1 DO 70 IPAS=1,NPRES IPORES(IIPO,IPAS) = IPCHP1 70 CONTINUE * - creation des LISTREEL pour les variables demandees * et tous les modes ELSEIF(ICHRES(ICR).EQ.2) THEN c II = II + 1 c IILI=IILI+1 c if (NCRES.gt.IPORES(/2)) then c write(ioimp,*) 'il faut plus de pas que de modes !' c call erreur(481) c return c endif c DO 71 IMODE=1,NCRES c JG=NPRES c segini,MLREEL c ILIRES(IILI,IMODE) = MLREEL c c rem : on range le MLREEL ici en supposant qu'il y a plus c c de pas que de modes cbp : on ne fait quasi-rien ici, on travaillera dans devso2 71 CONTINUE ENDIF 60 CONTINUE * * Cas des CHPOINTs necessaires a la reprise du calcul: * DO 80 I = 1,NREP IPOREP(I) = IPCHP1 80 CONTINUE * * Cas des POINTS necessaires a la reprise du calcul: * IDIM1 = IDIM + 1 segact mcoord*mod NPTS = nbpts NBPTS = NPTS + 4 * NLIAB SEGADJ MCOORD DO 90 I = 1,NLIAB DO 90 II = 1,4 NPTS = NPTS + 1 IPPREP(I,II) = NPTS 90 CONTINUE * MCHPOI = IPCHPO SEGSUP,MCHPOI * * Creation des LISTREELs qui contiendront les resultats * JG = NPRES SEGINI,MLREEL IPOLR(1) = MLREEL * * liaisons en base A DO 100 IL = 1,NLSA NLR = ICHRES(10 + IL) DO 105 IN = 1,NLR JG = NPRES SEGINI,MLREEL IPLRLA(IL,IN) = MLREEL 105 CONTINUE 100 CONTINUE * DO 110 IL = 1,NLSB * NLR = ICHRES(10 + NLSA + IL) * DO 115 IN = 1,NLR * JG = NPRES * SEGINI,MLREEL * IPLRLB(IL,IN) = MLREEL * 115 CONTINUE * end do * 110 CONTINUE * end do * * Creation des LISTENTIs et des LISTREELs pour sauvegarde * des liaisons en base A en vue d'une reprise * DO 200 I = 1,NLIAA * liaisons POLYNOMIALEs IF (ILPOLA(I,1).EQ.1) THEN JG = NPLAA * 2 SEGINI,MLENTI ILPOLA(I,1) = MLENTI JG = NXPALA SEGINI,MLREEL ILPOLA(I,2) = MLREEL * liaisons COUPLAGE_DEPLACEMENT + CONVOLUTION ELSEIF(ILPOLA(I,1).EQ.2) THEN * on ne fait rien ici : * on branchera les listreels creees par dyne19 dans devso4 ENDIF 200 CONTINUE * * liaisons en base B DO 300 IL=1,NLSB II=0 DO 310 IV = 1,NTVAR * -Creation de listreels IF (ILIREB(IL,IV).EQ.1) THEN II=II+1 JG = NPRES SEGINI,MLREEL IPLRLB(IL,II) = MLREEL * -Creation d'une table de chpoints ELSEIF (ILIREB(IL,IV).EQ.2) THEN M=NPRES SEGINI,MTABLE MLOTAB=M DO 320 IM=1,NPRES MTABTI(IM)='ENTIER' MTABTV(IM)='CHPOINT' MTABII(IM)=IM 320 CONTINUE SEGDES,MTABLE IPLRLB(IL,II+1)=MTABLE * Creation d un champoint NSOUPO=1 SEGINI,MCHPOI IPCHPO = MCHPOI MOCHDE = 'Force_de_choc' * nature diffuse NC=2 SEGINI,MSOUPO NOCOMP(1)='NORM' NOCOMP(2)='TANG' IPCHP(1)=MSOUPO N=NPLBB SEGINI,MPOVAL IPOVAL=MPOVAL NBELEM=NPLBB NBNN=1 NBREF=0 NBSOUS=0 SEGINI,MELEME DO 330 IE=1,NPLBB NUM(1,IE)=JPLIBB(IE) 330 CONTINUE IGEOC=MELEME JG=NPRES SEGINI,MLENTI DO 340 I = 1,NPRES LECT(I) = IPCHP1 340 CONTINUE SEGDES,MLENTI IPLRLB(IL,II+2)=MLENTI MCHPOI=IPCHPO SEGSUP,MCHPOI II=II+NPLBB*2 ENDIF 310 CONTINUE 300 CONTINUE * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales