relr30
C RELR30 SOURCE GOUNAND 24/09/06 21:15:04 12004 $ MCON,MCHPO2, $ IMPR,IRET) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : RELR30 C DESCRIPTION : * * Création d'une matrice de contraintes (simple mulag) * C C C C LANGAGE : ESOPE C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) C mél : gounand@semt2.smts.cea.fr C*********************************************************************** C APPELES : C APPELES (E/S) : C APPELES (BLAS) : C APPELES (CALCUL) : C APPELE PAR : C*********************************************************************** C SYNTAXE GIBIANE : C ENTREES : C ENTREES/SORTIES : C SORTIES : C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 01/03/2006, version initiale C HISTORIQUE : v1, 01/03/2006, création C HISTORIQUE : C HISTORIQUE : C*********************************************************************** C Prière de PRENDRE LE TEMPS de compléter les commentaires C en cas de modification de ce sous-programme afin de faciliter C la maintenance ! C*********************************************************************** -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC CCHAMP -INC SMCHPOI -INC TMTRAV POINTEUR MTRA2.MTRAV -INC SMRIGID POINTEUR MCON.MRIGID POINTEUR DESCON.DESCR * POINTEUR ICON.IMATRI POINTEUR XCON.XMATRI -INC SMELEME POINTEUR MEL.MELEME * Includes persos CBEGININCLUDE SMMINC SEGMENT MINC INTEGER NPOS(NPT+1) INTEGER MPOS(NPT,NBI+1) ENDSEGMENT SEGMENT IMINC INTEGER LNUPO (NDDL) INTEGER LNUINC(NDDL) ENDSEGMENT CENDINCLUDE SMMINC POINTEUR MINCP.MINC POINTEUR MINCD.MINC POINTEUR IMINCP.IMINC POINTEUR IMINCD.IMINC CBEGININCLUDE SMPMORS SEGMENT PMORS INTEGER IA (NTT+1) INTEGER JA (NJA) ENDSEGMENT CENDINCLUDE SMPMORS POINTEUR PROFM.PMORS CBEGININCLUDE SMIZA SEGMENT IZA REAL*8 A(NBVA) ENDSEGMENT CENDINCLUDE SMIZA POINTEUR VALM.IZA CBEGININCLUDE SMMATASS SEGMENT MATASS POINTEUR KJPOPA.MLENTI POINTEUR LINCPA.MLMOTS POINTEUR MINCPA.MINC POINTEUR KJPODA.MLENTI POINTEUR LINCDA.MLMOTS POINTEUR MINCDA.MINC POINTEUR PROFMA.PMORS POINTEUR VALMA.IZA ENDSEGMENT CENDINCLUDE SMMATASS * -INC SMLENTI POINTEUR KJSPGP.MLENTI POINTEUR KJSPGD.MLENTI POINTEUR KLSPGP.MLENTI POINTEUR KKSPGP.MLENTI -INC SMLMOTS POINTEUR LINCP.MLMOTS POINTEUR LINCD.MLMOTS * INTEGER IMPR,IRET CHARACTER*4 MYMOP,MYMOD * * Executable statements * IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans relr30.eso' * * Lecture de MATASS * SEGACT MATASS KJSPGP=MATASS.KJPOPA LINCP =MATASS.LINCPA MINCP =MATASS.MINCPA KJSPGD=MATASS.KJPODA LINCD =MATASS.LINCDA MINCD =MATASS.MINCDA PROFM =MATASS.PROFMA VALM =MATASS.VALMA * * Création de l'inverse des segments MINC * et suppression de ces derniers * * In relr21 : SEGINI IMINCP IF (IRET.NE.0) GOTO 9999 * In relr21 : SEGINI IMINCD IF (IRET.NE.0) GOTO 9999 * SEGPRT,IMINCP * SEGPRT,IMINCD SEGSUP MINCP SEGSUP MINCD SEGACT MCOORD*MOD SEGACT KJSPGP SEGACT LINCP SEGACT IMINCP SEGACT KJSPGD SEGACT LINCD SEGACT IMINCD SEGACT PROFM SEGACT VALM NDDLDU=IMINCD.LNUPO(/1) NPOPRI=KJSPGP.LECT(/1) * Il y a autant de rigidités à créer que de degrés de liberté duaux NRIGEL=NDDLDU SEGINI MCON MCON.MTYMAT='CON.DIV.' MCON.IFORIG=IFOUR JG=NPOPRI SEGINI KLSPGP IF (MCHPOI.NE.0) THEN * Transformer le KJSPGD en MELEME NBNN=1 NBELEM=KJSPGD.LECT(/1) NBSOUS=0 NBREF=0 SEGINI MELEME DO IBELEM=1,NBELEM NUM(1,IBELEM)=KJSPGD.LECT(IBELEM) ENDDO IF (IERR.NE.0) GOTO 9999 SEGSUP MELEME SEGACT MTRAV SEGACT LINCD NNNOE=NDDLDU SEGINI MTRA2 DO ININ=1,NNIN MTRA2.NHAR(ININ)=MTRAV.NHAR(ININ) ENDDO ENDIF * Ensemble des numéros de points primaux DO IDDLDU=1,NDDLDU MCON.COERIG(IDDLDU)=1.D0 INZ=PROFM.IA(IDDLDU) LNZ=PROFM.IA(IDDLDU+1)-INZ * * Création de la géométrie pour la iddldueme matrice * * Quels points de KJSPGP sont concernés par les * ddls INZ à INZ+LNZ-1. * degré et fin de la liste chaînée LDG=0 LAST=-1 DO JNZ=1,LNZ NUMPP=IMINCP.LNUPO(PROFM.JA(INZ+JNZ-1)) IF (KLSPGP.LECT(NUMPP).EQ.0) THEN LDG=LDG+1 KLSPGP.LECT(NUMPP)=LAST LAST=NUMPP ENDIF ENDDO * remplissage de KKSPGP * KLSPGP sert maintenant de repérage dans KKSPGP * (ouh la la quelle prise de risque !) JG=LDG SEGINI KKSPGP DO ILDG=1,LDG IPREC=KLSPGP.LECT(LAST) KKSPGP.LECT(ILDG)=LAST KLSPGP.LECT(LAST)=ILDG * KLSPGP.LECT(LAST)=0 LAST=IPREC ENDDO * géométrie NBNN=LDG+1 NBELEM=1 NBSOUS=0 NBREF=0 SEGINI MEL MEL.ITYPEL=22 * le premier point correspond à celui de IDDLDU NUPODU=KJSPGD.LECT(IMINCD.LNUPO(IDDLDU)) *! MEL.NUM(1,1)=NUPODU *! on crée deux ! nouveaux points * on crée un nouveau point de mêmes coordonnées * support du multiplicateur de Lagrange * NBPTOT=nbpts * NBPTS=NBPTOT+1 * SEGADJ MCOORD * DO IIDIM=1,IDIM * XCOOR((NBPTS-1)*(IDIM+1) + IIDIM)= * $ XCOOR((NUPODU-1)*(IDIM+1) + IIDIM) * ENDDO * MEL.NUM(2,1)=NBPTS NBPTOT=nbpts NBPTS=NBPTOT+1 SEGADJ MCOORD DO IIDIM=1,IDIM XCOOR((NBPTS-1)*(IDIM+1) + IIDIM)= $ XCOOR((NUPODU-1)*(IDIM+1) + IIDIM) ENDDO MEL.NUM(1,1)=NBPTS * les points suivants correspondent à ceux de KKSPGP DO ILDG=1,LDG MEL.NUM(1+ILDG,1)=KJSPGP.LECT(KKSPGP.LECT(ILDG)) ENDDO SEGDES MEL MCON.IRIGEL(1,IDDLDU)=MEL * * Création du segment descripteur pour la iddldueme matrice * NLIGRP=1+LNZ NLIGRD=1+LNZ SEGINI DESCON * Les deux premiers indices DESCON.NOELEP(1)=1 DESCON.NOELED(1)=1 $ INOMDU, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 DESCON.LISINC(1)=NOMDD(INOMDU) DESCON.LISDUA(1)=MYMOD * Les indices suivants DO JNZ=1,LNZ NUIPP=IMINCP.LNUINC(PROFM.JA(INZ+JNZ-1)) $ INOMDD, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 DESCON.LISINC(1+JNZ)=MYMOP DESCON.LISDUA(1+JNZ)=NOMDU(INOMDD) NUMPP=IMINCP.LNUPO(PROFM.JA(INZ+JNZ-1)) NUMP2=KLSPGP.LECT(NUMPP) IF (NUMP2.EQ.0) THEN WRITE(IOIMP,*) 'Erreur grave no1' GOTO 9999 ENDIF DESCON.NOELEP(1+JNZ)=1+NUMP2 DESCON.NOELED(1+JNZ)=1+NUMP2 ENDDO SEGDES DESCON MCON.IRIGEL(3,IDDLDU)=DESCON * remise à zéro de KLSPGP et suppression de KKSPGP DO ILDG=1,LDG KLSPGP.LECT(KKSPGP.LECT(ILDG))=0 ENDDO SEGSUP KKSPGP * * Création de la matrice élémentaire * NELRIG=1 * SEGINI ICON NLIGRP=1+LNZ NLIGRD=1+LNZ SEGINI XCON * Les deux premiers indices XCON.RE(1,1)=0.D0 * Les indices suivants DO JNZ=1,LNZ VAL=VALM.A(INZ+JNZ-1) XCON.RE(1,1+JNZ,1)=VAL XCON.RE(1+JNZ,1,1)=VAL ENDDO SEGDES XCON * ICON.IMATTT(1)=XCON * SEGDES ICON * MCON.IRIGEL(4,IDDLDU)=ICON MCON.IRIGEL(4,IDDLDU)=XCON MCON.IRIGEL(5,IDDLDU)=0 MCON.IRIGEL(6,IDDLDU)=0 MCON.IRIGEL(7,IDDLDU)=0 IF (MCHPOI.NE.0) THEN ININ=IMINCD.LNUINC(IDDLDU) INNOE=IMINCD.LNUPO(IDDLDU) MTRA2.IGEO(IDDLDU)=NBPTS MTRA2.IBIN(ININ,IDDLDU)=1 MTRA2.BB(ININ,IDDLDU)=MTRAV.BB(ININ,INNOE) ENDIF ENDDO SEGSUP KLSPGP SEGDES MCON * Suppression de tous les objets de MATASS SEGSUP VALM SEGSUP PROFM SEGSUP IMINCD SEGSUP LINCD SEGSUP KJSPGD SEGSUP IMINCP SEGSUP LINCP SEGSUP KJSPGP * SEGDES MCOORD SEGACT MCOORD SEGSUP MATASS IF (MCHPOI.NE.0) THEN SEGSUP MTRAV SEGSUP MTRA2 ELSE MCHPO2=0 ENDIF * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine relr30' RETURN * * End of subroutine RELR30 * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales