exincr
C EXINCR SOURCE FANDEUR 22/03/01 21:15:04 11301 IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : EXINCR C DESCRIPTION : Extrait d'une rigidité la sous-matrice C d'inconnues primales et duales celles données C en argument CH*4 * Dans le cas d'une relation, il serait prudent * de créer un nouveau multiplicateur mais alors si * on recombine les matrices extraites, on ne reobtient * pas l'originale. D'autre part, si on ne crée pas * de nouveau multiplicateur reso buggera sur la * matrice recombinée (présence d'un même multiplicateur * dans deux matrices différentes) On choisit de ne pas * créer de multiplicateur ici. 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 RIG2 = EXTR RIG1 LMOT1 LMOT2 ; C C ENTREES : C ENTREES/SORTIES : C SORTIES : C CODE RETOUR (IRET) : = 0 si tout s'est bien passé C*********************************************************************** C VERSION : v1, 01/06/2011, version initiale C HISTORIQUE : v1, 01/06/2011, création C HISTORIQUE : C HISTORIQUE : C*********************************************************************** -INC PPARAM -INC CCOPTIO -INC SMRIGID -INC SMELEME -INC SMLMOTS * * Segment de correspondance : noms d'inconnues * segment trav1 integer cor1p(nligp2),cor1d(nligd2) endsegment segment trav2 integer cor1n(nbnn2),cor2n(nbnn) endsegment * * Segment extensibles pour ranger les rigidités * créés * segment imatno(0) segment idesno(0) segment igeono(0) segment coerno(0) segment irg8no(0) segment irg7no(0) segment irg6no(0) segment irg5no(0) segment irg2no(0) * logical lsym,lrela * * Executable statements * SEGACT ri1 SEGACT MLMOT1,MLMOT2 * segini imatno,idesno,igeono,coerno,irg7no,irg5no segini irg2no,irg6no,irg8no do 1000 irig=1,ri1.irigel(/2) des1=ri1.irigel(3,irig) segact des1 nligrp=des1.lisinc(/2) nligrd=des1.lisdua(/2) nligp2=nligrp nligd2=nligrd segini trav1 * On regarde le descripteur et les inconnues concernées nligp2=0 do 410 iligrp=1,nligrp nligp2=nligp2+1 cor1p(nligp2)=iligrp goto 410 endif 420 continue 410 continue if (nligp2.eq.0) goto 999 nligd2=0 do 510 iligrd=1,nligrd nligd2=nligd2+1 cor1d(nligd2)=iligrd goto 510 endif 520 continue 510 continue * WRITE(IOIMP,*) 'irig=',irig * WRITE(IOIMP,*) 'cor1p=' * WRITE (IOIMP,2020) (cor1p(I),I=1,cor1p(/1)) * WRITE(IOIMP,*) 'cor1d=' * WRITE (IOIMP,2020) (cor1d(I),I=1,cor1d(/1)) * 2020 FORMAT (20(2X,I4) ) if (nligd2.eq.0) goto 999 segadj,trav1 * On fait un cas particulier pour les matrices de relations * Il faut vérifier qu'on a bien gardé la symétrie. * Il faut également que la relation ait gardé le multiplicateur * et porte au moins sur un ddl autre ! ipt1=ri1.irigel(1,irig) segact ipt1 lrela=.false. if (ipt1.itypel.eq.22) then if (nligp2.eq.nligd2) then do 700 ilig=1,nligp2 if (cor1p(ilig).ne.cor1d(ilig)) goto 710 700 continue lrela=.true. 710 continue endif endif * l'ordre de ces deux lignes est important if (lrela.and.cor1p(1).ne.1) goto 998 if (lrela.and.nligp2.eq.1) goto 998 coerno(**)=ri1.coerig(irig) irg2no(**) =ri1.irigel(2,irig) irg5no(**) =ri1.irigel(5,irig) irg6no(**) =ri1.irigel(6,irig) irg8no(**) =ri1.irigel(8,irig) * Le cas particulier facile, où on garde toute la matrice * élémentaire : on recopie la matrice originale if (nligp2.eq.nligrp.and.nligd2.eq.nligrd) then igeono(**)=ri1.irigel(1,irig) idesno(**) =des1 imatno(**) =ri1.irigel(4,irig) irg7no(**) =ri1.irigel(7,irig) goto 999 endif * Sinon, il faut réduire la matrice et son descripteur, voire même * la géométrie * Réduction du descripteur nligrp=nligp2 nligrd=nligd2 segini des2 do iligp2=1,nligp2 iligp1=cor1p(iligp2) des2.lisinc(iligp2)=des1.lisinc(iligp1) des2.noelep(iligp2)=des1.noelep(iligp1) enddo do iligd2=1,nligd2 iligd1=cor1d(iligd2) des2.lisdua(iligd2)=des1.lisdua(iligd1) des2.noeled(iligd2)=des1.noeled(iligd1) enddo idesno(**)=des2 * Réduction de la matrice xmatr1=ri1.irigel(4,irig) segact xmatr1 nelrig=xmatr1.re(/3) segini xmatr2 do ielrig=1,nelrig do iligp2=1,nligp2 iligp1=cor1p(iligp2) do iligd2=1,nligd2 iligd1=cor1d(iligd2) xmatr2.re(iligd2,iligp2,ielrig)= & xmatr1.re(iligd1,iligp1,ielrig) enddo enddo enddo segdes xmatr1 imatno(**) =xmatr2 * Réduction éventuelle de la géométrie si des noeuds * ne sont pas référencés nbnn=ipt1.num(/1) nbnn2=ipt1.num(/1) segini trav2 nbnn2=0 do in=1,des2.noelep(/1) ic1=cor2n(des2.noelep(in)) if (ic1.eq.0) then nbnn2=nbnn2+1 cor1n(nbnn2)=des2.noelep(in) cor2n(des2.noelep(in))=nbnn2 endif enddo do in=1,des2.noeled(/1) ic1=cor2n(des2.noeled(in)) if (ic1.eq.0) then nbnn2=nbnn2+1 cor1n(nbnn2)=des2.noeled(in) cor2n(des2.noeled(in))=nbnn2 endif enddo * Si tous les noeuds ont été vus, on peut peut-être * garder la géométrie if (nbnn2.eq.nbnn) then if (ipt1.itypel.eq.22.and.(.not.lrela)) then segini,ipt2=ipt1 ipt2.itypel=28 segdes ipt2 else ipt2=ipt1 endif else * Sinon, on ne garde que les noeuds vus dans le nouveau * maillage et on modifie le descripteur nbnn=nbnn2 nbelem=ipt1.num(/2) nbsous=0 nbref=0 segini ipt2 ipt2.itypel=28 if (lrela) ipt2.itypel=22 do iel=1,nbelem do ibnn2=1,nbnn2 ibnn=cor1n(ibnn2) ipt2.num(ibnn2,iel)=ipt1.num(ibnn,iel) enddo enddo do iligrp=1,des2.noelep(/1) des2.noelep(iligrp)=cor2n(des2.noelep(iligrp)) enddo do iligrd=1,des2.noeled(/1) des2.noeled(iligrd)=cor2n(des2.noeled(iligrd)) enddo segdes ipt2 endif segsup trav2 igeono(**)=ipt2 segdes des2 * Garde-t-on la symétrie ou l'antisymétrie ? Par défaut non, mais si * les ddl primaux et duaux que l'on garde sont les mêmes, oui ! lsym=.false. if (ri1.irigel(7,irig).ne.2) then if (nligp2.eq.nligd2) then do 600 ilig=1,nligp2 if (cor1p(ilig).ne.cor1d(ilig)) goto 610 600 continue lsym=.true. 610 continue endif endif if (lsym) then irg7no(**) =ri1.irigel(7,irig) xmatr2.symre=ri1.irigel(7,irig) else irg7no(**) =2 xmatr2.symre=2 endif segdes xmatr2 998 continue segdes ipt1 999 continue segdes des1 segsup trav1 1000 CONTINUE SEGDES MLMOT1,MLMOT2 * * il ne reste plus qu'a ranger dans ri2 les nouvelles raideurs engendrées * NRIGEL=imatno(/1) SEGINI RI2 RI2.MTYMAT=RI1.MTYMAT RI2.IFORIG=RI1.IFORIG SEGDES RI1 DO irig=1,NRIGEL RI2.COERIG(irig)=coerno(irig) RI2.IRIGEL(1,irig)=igeono(irig) RI2.IRIGEL(2,irig)=irg2no(irig) RI2.IRIGEL(3,irig)=idesno(irig) RI2.IRIGEL(4,irig)=imatno(irig) RI2.IRIGEL(5,irig)=irg5no(irig) RI2.IRIGEL(6,irig)=irg6no(irig) RI2.IRIGEL(7,irig)=irg7no(irig) RI2.IRIGEL(8,irig)=irg8no(irig) ENDDO SEGDES RI2 segsup imatno,idesno,igeono,coerno,irg7no,irg5no segsup irg2no,irg6no,irg8no * * Normal termination * * IRET=0 RETURN * * End of subroutine EXINCR * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales