cmct1
C CMCT1 SOURCE FANDEUR 22/03/01 21:15:02 11301 *_______________________________________________________________________ c c opérateur cmct c c entrée c ICHP : champ par point qui stocke la masse inversée c IRIG : rigidité contenant les blocages c c sortie c IRIG2 : rigidité contenant la matrice condensée c *_______________________________________________________________________ IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) * -INC PPARAM -INC CCOPTIO -INC SMRIGID -INC SMELEME -INC SMCOORD -INC SMCHPOI * stockage des noms de tous les composantes primales. SEGMENT LSINCP CHARACTER*(LOCOMP) LISINP(NLIGP) ENDSEGMENT * correspondance entre les noms de composantes locale LISINC * et les nom de composantes dans LSINCP SEGMENT CORES1 INTEGER IPCOR2(NRIGEL) ENDSEGMENT SEGMENT CORES2 INTEGER COR2(NLIGRP) ENDSEGMENT * tableau pour dire en chaque point si la composante du tableau LISINP * est implquée SEGMENT MTOPTS * nombre d'occurence de la compoosante INTEGER ITOPTS(NBPTS,NLIGP) * valeur de l'inverse la masse en ce point REAL*8 XTOPTS(NBPTS,NLIGP+1) ENDSEGMENT * * tableau pour pointer vers MCOEF à partir du nombre d'inconnues * SEGMENT LSINCO INTEGER LESINC(NINC,2) REAL*8 XMAS(NINC) ENDSEGMENT * * tableau des coefficient de la matrice C * ordonné dans l'ordre des inconnues SEGMENT MCOEF * numero du noeud support du multiplicateur ligne 1 * est il en marié avec un autre multiplicateur ligne 2 INTEGER ICOEF(2,NCOEF) * valeur des coefficients REAL*8 XCOEF(NCOEF) ENDSEGMENT * *_______________________________________________________________________ * * la première etape consiste à établir la liste de tous les noms * d'inconnue primale dans la rigidité * cette liste est stockée dans LSINCP * la correspondance locale -> globale dans CORES1 * * la rigidité est déjà active (cmct) MRIGID = IRIG NRIGEL = IRIGEL(/2) SEGINI CORES1 * NLIGP1 est la taille effective de LSINCP * on évite ainsi de faire trop de segadj NLIGP1 = 0 NLIGP = 0 NCOEF = 0 DO 50 I=1,NRIGEL DESCR = IRIGEL(3,I) SEGACT DESCR*NOMOD NLIGRP = LISINC(/2) NLIGP = NLIGP + NLIGRP MELEME = IRIGEL(1,I) NCOEF = NCOEF + (NUM(/2) * NLIGRP) * les coeffficients sur les multiplicateurs * ne nous interessent pas IF (ITYPEL .EQ. 22) NCOEF=NCOEF-NUM(/2) 50 CONTINUE * SEGINI LSINCP DO 300 I=1,NRIGEL DESCR = IRIGEL(3,I) NLIGRP = LISINC(/2) MELEME = IRIGEL(1,I) IMULT=1 IF (ITYPEL .EQ.22) IMULT = 2 SEGINI CORES2 DO 200 J=IMULT,NLIGRP DO 100 K=1,NLIGP IF (LISINC(J) .EQ. LISINP(K)) THEN COR2(J) = K GOTO 200 ENDIF 100 CONTINUE NLIGP1 = NLIGP1 + 1 LISINP(NLIGP1) = LISINC(J) COR2(J) = NLIGP1 200 CONTINUE IPCOR2(I) = CORES2 300 CONTINUE * * ajustement de la taille de LSINCP * on purrait suprimer cette ligne NLIGP = NLIGP1 SEGADJ LSINCP * * *_______________________________________________________________________ * on remplit maintenant le tableau itopts en bouclant sur les sous zones de * la rigidité * SEGINI MTOPTS * DO 600 I=1,NRIGEL * les maillages sont actifs depuis cmct MELEME = IRIGEL(1,I) imult=1 IF (ITYPEL .EQ.22) IMULT = 2 DESCR = IRIGEL(3,I) CORES2 = IPCOR2(I) DO 500 K=1,NUM(/2) DO 400 J=IMULT,NOELEP(/1) ITOPTS(NUM(NOELEP(J),K),COR2(J)) = & ITOPTS(NUM(NOELEP(J),K),COR2(J)) + 1 400 CONTINUE 500 CONTINUE 600 CONTINUE * * on remplit maintenant la masse inversée * MCHPOI = ICHP SEGACT MCHPOI*NOMOD * boucle sur les sous zones du champ par point DO 1100 I=1,IPCHP(/1) MSOUPO = IPCHP(I) SEGACT MSOUPO MELEME = IGEOC SEGACT MELEME MPOVAL = IPOVAL SEGACT MPOVAL * boucle sur les composantes de la sous zone DO 1000 J=1,NOCOMP(/2) * recuperation du numéro de la composante dans LISINP DO 700 K=1,NLIGP IF (NOCOMP(J) .EQ. LISINP(K)) THEN IDK = K GOTO 800 ENDIF 700 CONTINUE IDK = NLIGP + 1 * 800 CONTINUE * boucle sur les points de la sous zone DO 900 K=1,NUM(/2) XTOPTS(NUM(1,K),IDK) = VPOCHA(K,J) 900 CONTINUE * 1000 CONTINUE SEGDES MPOVAL,MELEME,MSOUPO 1100 CONTINUE * SEGDES MCHPOI * *_______________________________________________________________________ * * calcul du nombre d'inconnues et creation de LESINC * correspondance entre les inconnues et MCOEF * * NINC = 0 DO 1300 I=1,NLIGP DO 1200 J=1,NBPTS NINC = NINC + SIGN(1,(ITOPTS(J,I)-1)) 1200 CONTINUE 1300 CONTINUE NINC = ((NLIGP * NBPTS) + NINC )/ 2 ** * on remplit LSINCO SEGINI LSINCO IND1 = 1 IDUM = 1 DO 1600 I=1,NRIGEL MELEME = IRIGEL(1,I) imult=1 IF (ITYPEL .EQ.22) IMULT = 2 DESCR = IRIGEL(3,I) CORES2 = IPCOR2(I) DO 1500 K=1,NUM(/2) DO 1400 J=IMULT,NOELEP(/1) IF ( ITOPTS(NUM(NOELEP(J),K),COR2(J)) .GT. 0 ) THEN LESINC(IND1,1) = IDUM IDUM = IDUM + ITOPTS(NUM(NOELEP(J),K),COR2(J)) * ITOPTS va desormais contenir le numéro de l'inconnue dans LESINC ITOPTS(NUM(NOELEP(J),K),COR2(J)) = -1 * IND1 XMAS(IND1) = XTOPTS(NUM(NOELEP(J),K),COR2(J)) IND1 = IND1 + 1 ENDIF 1400 CONTINUE 1500 CONTINUE 1600 CONTINUE *===== * if ( (IND1-1) .NE. NINC ) then * write(*,*) 'erreur dans boucle lsinco' * endif *====== * * *_______________________________________________________________________ * remplissage de MCOEF * SEGINI MCOEF DO 1900 I=1,NRIGEL MELEME = IRIGEL(1,I) imult=1 IF (ITYPEL .EQ.22) IMULT = 2 DESCR = IRIGEL(3,I) CORES2 = IPCOR2(I) xMATRI = IRIGEL(4,I) SEGACT xMATRI DO 1800 K=1,NUM(/2) * XMATRI = IMATTT(K) * SEGACT XMATRI DO 1700 J=IMULT,NOELEP(/1) NNINC = -1 * ITOPTS(NUM(NOELEP(J),K),COR2(J)) IDMCOE = LESINC(NNINC,1)+LESINC(NNINC,2) LESINC(NNINC,2) = LESINC(NNINC,2) + 1 ICOEF(1,IDMCOE)=NUM(1,K) XCOEF(IDMCOE)=RE(1,J,k)*COERIG(I) 1700 CONTINUE * SEGDES XMATRI 1800 CONTINUE * on referme la boutique SEGDES xMATRI,MELEME,DESCR SEGSUP CORES2 1900 CONTINUE SEGSUP CORES1,LSINCP,MTOPTS * *===== * do 2001 i=1,ninc * write(*,2003) i,lesinc(i,1),lesinc(i,2),xmas(i) * 2001 continue * 2003 format(I3,1X,I3,1X,I3,2X,E12.5) * * do 2005 i=1,ncoef * write(*,2003) i,icoef(1,i),icoef(2,i),xcoef(i) * 2005 continue *===== *_______________________________________________________________________ * * il ne reste plus qu' a creer les matrices élémentaires * IF (IERR .NE.0 ) RETURN SEGSUP LSINCO,MCOEF RI2 = IRIG2 SEGACT,RI2*MOD RI2.MTYMAT = MRIGID.MTYMAT RI2.IFORIG = MRIGID.IFORIG SEGDES,RI2 * *_______________________________________________________________________ RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales