massx
C MASSX SOURCE CB215821 24/04/12 21:16:39 11897 C RIGIX SOURCE BP208322 08/12/10 21:15:26 6216 & IMODEL,LOCIRI) c C PROCEDURE UTILISEE DANS LE CAS D'ELEMENTS XFEM c POUR LE CALCUL DE RIGIDITE ELEMENTAIRES C C C********************************************************* C PARTIE DECLARATIVE C********************************************************* C IMPLICIT REAL*8(A-H,O-Z) C CHARACTER*8 CMATE CYT PARAMETER (NDDLMAX=20,NBNIMAX=10) PARAMETER (NDDLMAX=30,NBNIMAX=10) CHARACTER*4 MOTINC(NDDLMAX),MOTDUA(NDDLMAX) CYT DATA MOTINC/'UX ','UY ','AX ','AY ', CYT >'B1X ','B1Y ','C1X ','C1Y ','D1X ','D1Y ','E1X ','E1Y ', CYT >'B2X ','B2Y ','C2X ','C2Y ','D2X ','D2Y ','E2X ','E2Y '/ CYT DATA MOTDUA/ 'FX ','FY ','FAX ','FAY ', CYT >'FB1X','FB1Y','FC1X','FC1Y','FD1X','FD1Y','FE1X','FE1Y', CYT >'FB2X','FB2Y','FC2X','FC2Y','FD2X','FD2Y','FE2X','FE2Y'/ DATA MOTINC/'UX ','UY ','UZ ','AX ','AY ','AZ ', >'B1X ','B1Y ','B1Z ','C1X ','C1Y ','C1Z ','D1X ','D1Y ', >'D1Z ','E1X ','E1Y ','E1Z ','B2X ','B2Y ','B2Z ','C2X ', >'C2Y ','C2Z ','D2X ','D2Y ','D2Z ','E2X ','E2Y ','E2Z '/ DATA MOTDUA/'FX ','FY ', 'FZ ','FAX ','FAY ','FAZ ', >'FB1X','FB1Y','FB1Z','FC1X','FC1Y','FC1Z','FD1X','FD1Y', >'FD1Z','FE1X','FE1Y','FE1Z','FB2X','FB2Y','FB2Z','FC2X', >'FC2Y','FC2Z','FD2X','FD2Y','FD2Z','FE2X','FE2Y','FE2Z'/ C PARAMETER (NBENRMAX=5) C NBENRMAX deja defini dans rigixr.eso INTEGER LOCIRI(10,(1+NBENRMAX)) DIMENSION MLRE(NBENRMAX+1) C -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMMODEL -INC SMCHAML -INC SMINTE -INC SMELEME -INC SMRIGID -INC SMLREEL C POINTEUR MCHEX1.MCHELM,MINT1.MINTE,MINT2.MINTE C C Segment (type LISTENTI) contenant les informations sur un element SEGMENT INFO INTEGER INFELL(JG) ENDSEGMENT SEGMENT WRK1 REAL*8 XE(3,NBBB) REAL*8 REL(LRE,LRE),RINT(LRE,LRE) ENDSEGMENT C SEGMENT WRK2 c REAL*8 LV7WRK(NBENRMA2,2,6,NBNO) REAL*8 LV7WRK(NBENRMA2,2,6,NBBB) ENDSEGMENT C SEGMENT MVELCH REAL*8 VALMAT(NV1) ENDSEGMENT C SEGMENT MPTVAL INTEGER IPOS(NS),NSOF(NS) INTEGER IVAL(NCOSOU) CHARACTER*16 TYVAL(NCOSOU) ENDSEGMENT C SEGMENT MRACC INTEGER TLREEL(NBENRMA2,NBI) ENDSEGMENT C c write (ioimp,*) '############################' c write (ioimp,*) '# DEBUT DE MASSX #' c write (ioimp,*) '############################' C C********************************************************* c C RECUPERATION + ACTIVATIONS + VALEURS UTILES c C********************************************************* C sont deja actifs dans rigi1.eso : C SEGACT MMODEL,IMODEL,MELVAL c IVAMAT MPTVAL=IVAMAT c C++++ Activation au cas ou ++++++++++++++++++++++++++++++ SEGACT MCOORD C++++ Recup + Activation de la geometrie ++++++++++++++++ MELEME= IMAMOD c SEGACT MELEME deja actif C++++ RECUP DES INFOS EF ++++++++++++++++++++++++++++++++ c + OBTENUES PAR ELQUOI DANS MASSE1 C segment INFO OBTENUES PAR ELQUOI DANS MASSE1 mais supprimé dans MASSE1 MELE = NEFMOD INFO = IPINF c MELE = INFELL(1) c NBPGA2= INFELL(2) c NBPGAU= INFELL(3) c NBPGAU= INFELL(4) c ICARA = INFELL(5) NGAU1 = INFELL(6) c LW = INFELL(7) LRE = INFELL(9) LHOOK = INFELL(10) MINT1 = INFELL(11) segact,MINT1 MINT2 = INFELL(12) if(MINT2.ne.0) segact,MINT2 MFR = INFELL(13) IELE = INFELL(14) NDDL = INFELL(15) NSTRS = INFELL(16) c write(ioimp,*)'-> MASSX infell',(infell(iou),iou=1,16) c + AUTRES INFOS C nbre de noeuds par element NBNN1 = NUM(/1) C nbre d elements NBEL1 = NUM(/2) c REM: pour se passer du dimensionnement du nbre d'enrichissement dans c elquoi et le realiser localement , on pourrait ecrire: c LRE = NDDLMAX*NBNN1 c NDDL= NDDLMAX C sous decoupage et points de Gauss de l element geometrique de base CYT if(MELE.eq.263) then if(MELE.eq.263.or.MELE.eq.264) then c NGAU2 = 4 NGAU2 = MINT2.POIGAU(/1) c NBSSEF = (NGAU1/NGAU2)**0.5 endif c write(ioimp,*) 'dim de MINT2=6,',(MINT2.SHPTOT(/2)),(MINT2.SHPTOT(/3)) c write(ioimp,*) 'MINT2',(MINT2.QSIGAU(iou),iou=1,NGAU) c segdes,MINT2 c nbre maxi de fonction de forme par noeud (fonction std comprise) c NBNI = NDDL/IDIM inutile! C++++ Recup des infos d enrichissement +++++++++++++++++++ c recup du MCHEX1 d'enrichissement NOBMO1 = IVAMOD(/1) if(NOBMO1.ne.0) then do iobmo1=1,NOBMO1 if((TYMODE(iobmo1)).eq.'MCHAML') then MCHEX1 = IVAMOD(iobmo1) segact,MCHEX1 if((MCHEX1.TITCHE).eq.'ENRICHIS') then MCHAM1 = MCHEX1.ICHAML(1) segact,MCHAM1 segdes,MCHEX1 goto 1000 endif segdes,MCHEX1 endif enddo write(ioimp,*) 'Le modele est vide (absence d enrichissement)' * return else write(ioimp,*) 'Aucun MCHAML enrichissement dans le Modele' * return endif 1000 continue c niveau d enrichissement(s) du modele (ddls std u exclus) c NBENR1= 0 si std, 1 si H seul, 2 si H+F1, 3 si H+F1+F2, etc... if(NOBMO1.ne.0) then NBENR1= MCHAM1.IELVAL(/1) else NBENR1 = 0 endif c write(ioimp,*) 'niveau d enrichissement(s) du modele',NBENR1 C********************************************************* c c PHASE 2 : PREPARATION DES OBJETS RESULTATS c C********************************************************* C C++++ RECHERCHE DES NOMS D'INCONNUES ET DES DUAUX c MOTINC et MODUA en dur pour l instant C++++ REMPLISSAGE DE DESCR de taille maxi c (on ajustera en enlevant si besoin) NLIGRP = LRE NLIGRD = LRE SEGINI DESCR IPDSCR = DESCR C KINC = 0 C----->> BOUCLE SUR LES fonctions de Forme DO IENR=1,NBNIMAX C------->> BOUCLE SUR LES NOEUDS DO I=1,NBNN1 C--------->> BOUCLE SUR LA DIMENSION DO KDIM=1,IDIM KINC = KINC + 1 LISINC(KINC) = MOTINC((3*(IENR-1))+KDIM) LISDUA(KINC) = MOTDUA((3*(IENR-1))+KDIM) CYT LISINC(KINC) = MOTINC((IDIM*(IENR-1))+KDIM) CYT LISDUA(KINC) = MOTDUA((IDIM*(IENR-1))+KDIM) NOELEP(KINC) = I NOELED(KINC) = I ENDDO C--------------| ENDDO C-------------| ENDDO C------------| IF(KINC.NE.LRE) THEN WRITE(*,*) 'IL Y A UNE ERREUR DANS DESCR' WRITE(*,*) 'KINC , LRE = ',KINC,LRE RETURN ENDIF C SEGDES DESCR C C********************************************************* C INITIALISATIONS... C********************************************************* C c preparation des tables avec: if(NBENR1.ne.0) then do ienr=1,NBENR1 c -le nombre d'inconnues de chaque sous-zone c determinee depuis le nombre de fonction de forme c ienr= 1: U+H(1+1=2), 2: U+H+F1(2+4=6), 3: U+H+F1+F2(6+4=10) nbniJ = 2 + ((ienr-1)*4) MLRE(1+ienr) = IDIM*NBNN1*nbniJ c -LOCIRI LOCIRI(5,1+ienr)= NIFOUR enddo endif C Tables + longues car 1er indice correspond au fontion de forme std MLRE(1) = IDIM*NBNN1*1 LOCIRI(5,1)= NIFOUR if(NBENR1.lt.(NBENRMAX+1)) then do ienr=(NBENR1+1),(NBENRMAX) MLRE(1+ienr) = 0 enddo endif c c ...DU SEGMENT WRK1 NBENRMA2 = NBENRMAX NBBB = NBNN1 SEGINI,WRK1 c ...DU SEGMENT WRK2 c NBNO = NBNI c ici, pour le calcul de la masse, BGENE ne designe pas B mais N => lhook=2 CTY LHOOK=2 LHOOK=IDIM SEGINI,WRK2 c ...DU SEGMENT MVELCH NV1 = NMATT SEGINI,MVELCH C c ...DU SEGMENT MRACC NBENRMA2 = NBENRMAX NBI = NBNN1 segini,MRACC C C C********************************************************* C C>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> BOUCLE SUR LES ELEMENTS C DO 2000 J=1,NBEL1 c write(ioimp,*) '========= EF',J,' /NBEL1 =========' C C C********************************************************* C POUR CHAQUE ELEMENT, ... C********************************************************* C C++++ ON RECUPERE LES COORDONNEES DES NOEUDS DE L ELEMENT C c c CALL ZEROI(TLREEL,NBENRMA2,NBI) C++++ NBENRJ = niveau d enrichissement de l element ++++ C =0 si EF std =1 si U+H =2 si U+H+F1 =3 si U+H+F1+F2 NBENRJ=0 if(NBENR1.ne.0) then do IENR=1,NBENR1 MELVA1 = MCHAM1.IELVAL(IENR) segact,MELVA1 do I=1,NBNN1 mlree1 = MELVA1.IELCHE(I,J) C on en profite pour remplir MRACC table de raccourcis pour cet element TLREEL(IENR,I) = mlree1 if(mlree1.ne.0) then NBENRJ = max(NBENRJ,IENR) C et on active la listreel segact,mlree1 endif enddo segdes,MELVA1 enddo endif if(NBENRMA2.gt.NBENR1) then do IENR2=(NBENR1+1),NBENRMA2 do I=1,NBNN1 TLREEL(IENR2,I) = 0 enddo enddo endif C c++++ quelques indices pour dimensionner au plus juste c nbre total de ddl de l'élément considéré NLIGRD = MLRE(1+NBENRJ) NLIGRP = MLRE(1+NBENRJ) c nbre fonction de forme=((Ni_std+Ni_enrichi)*nbnoeud)=Ninconnues/idim NBNI = (MLRE(1+NBENRJ)) / IDIM c write(ioimp,*) 'EF',J,' NBENRJ=',NBENRJ, c &'donc',NLIGRD,' ddls et ',NBNI,' fonctions de forme' c c++++ Selon le niveau d enrichissement, c C + On copie cet element a la geo correspondante IPT1 = LOCIRI(1,1+NBENRJ) c si elle n existe pas, il faut la creer if(IPT1.eq.0) then NBNN =NBNN1 NBELEM=1 NBSOUS=0 NBREF=0 segini,IPT1 IPT1.ITYPEL = ITYPEL LOCIRI(1,1+NBENRJ)=IPT1 c si elle existe, il faut l agrandir else NBNN =NBNN1 NBELEM = (IPT1.NUM(/2)) + 1 NBSOUS=0 NBREF=0 segadj,IPT1 endif c copie en cours do I=1,NBNN1 IPT1.NUM(I,NBELEM) = NUM(I,J) enddo C + On crée le descr qui va bien si il n existe pas DES1 = LOCIRI(3,1+NBENRJ) if(DES1.eq.0) then segini,DES1=DESCR c write(ioimp,*)' on ne garde que les',MLRE(1+NBENRJ), c &' 1eres inconnues' c NLIGRP = MLRE(1+NBENRJ) fait + haut (ligne 313) c NLIGRD = MLRE(1+NBENRJ) segadj,DES1 LOCIRI(3,1+NBENRJ) = DES1 segdes,DES1 endif C + On en profite pour créer IMATRI si il n existe pas xMATR1 = LOCIRI(4,1+NBENRJ) if(xMATR1.eq.0) then NELRIG = 1 segini,xMATR1 LOCIRI(4,1+NBENRJ) = xMATR1 c si il existe, il faut l agrandir else NELRIG = xmatr1.RE(/3) + 1 segadj,xMATR1 endif C++++ ON MET A ZERO LA SOMME QUE L ON VA CALCULER c CALL ZERO(RINT,LRE,NLIGRP) * CALL ZERO(RINT,NLIGRD,NLIGRP) c |-> impossible car ZERO considere qu il sagit de la dimension de SHPWRK c c rem: il serait probablement interessant au niveau du tems cpu c d'utiliser moins de pts de Gauss lorsque l element n est pas enrichi c car cela n'apprte rien de plus c On pourrait par ex. utiliser MINT2 = infell(12) qui contiendrait c le segment d'integration de l'EF std (QUA4 par ex.) if((NBENRJ.eq.0).and.(MINT2.ne.0)) then MINTE = MINT2 NBPGAU= NGAU2 else MINTE = MINT1 NBPGAU= NGAU1 endif C C********************************************************* C C>>>>>>>>>> BOUCLE SUR LES POINTS DE GAUSS C DO 2500 KGAU=1,NBPGAU C C********************************************************* C Initialisation à 0 C********************************************************* c ZERO ne serait-il pas facultatif? * CALL ZERO(SHPWRK,6,NBNO) C i6zz = 3 IF (IDIM.EQ.3) i6zz = 4 C c do ienr7=1,NBENRMAX do ienr7=1,NBENRJ do inod7=1,NBNN1 c do i6=1,6 CYT do i6=1,3 do i6=1,i6zz LV7WRK(ienr7,1,i6,inod7) = 0 LV7WRK(ienr7,2,i6,inod7) = 0 enddo enddo enddo c********************************************************* c Calcul des fonction de forme std dans repere local c********************************************************* ccccc BOUCLE SUR LES NOEUDS ccccccccccccccccccccccccccccc c (et donc sur les Ni std) DO 2510 I=1,NBNN1 C++++ Calcul des Ni std c (rappel: 1:Ni 2:Ni,qsi 3:Ni,eta avec i=1,4) SHPWRK(1,I) = SHPTOT(1,I,KGAU) SHPWRK(2,I) = SHPTOT(2,I,KGAU) SHPWRK(3,I) = SHPTOT(3,I,KGAU) IF (IDIM.EQ.3) SHPWRK(4,I) = SHPTOT(4,I,KGAU) 2510 CONTINUE ccccc fin de BOUCLE SUR LES NOEUDS ccccccccccccccccccccccc c********************************************************* c Passage des fonctions de forme std dans repere global c********************************************************* c C++++ CALCUL DES Ni,x Ni,y (i=1,4) + CALCUL DE det(J) c C PRISE EN COMPTE DU POIDS D'INTEGRATION DJAC = ABS(DJAC) * POIGAU(KGAU) c CAS DES CONTRAINTES PLANES C recuperation de l'epaisseur: DIM3 donnée facultative du materiau IF (IFOUR.EQ.-2) THEN MPTVAL=IVACAR IF (IVACAR.NE.0) THEN MELVAL=IVAL(1) IF (MELVAL.NE.0) THEN IGMN=MIN(KGAU,VELCHE(/1)) IBMN=MIN(J,VELCHE(/2)) DIM3=VELCHE(IGMN,IBMN) ELSE DIM3=1.D0 ENDIF ENDIF DJAC=DJAC*DIM3 MPTVAL=IVAMAT ENDIF c********************************************************* c Si on est pas du tout enrichi on peut sauter une grosse partie c********************************************************* if(NBENRJ.eq.0) goto 2999 c********************************************************* c Calcul des level set + leurs derivees dans repere global c********************************************************* ccccc BOUCLE SUR LES enrichissements ccccccccccccccccccc do 2520 ienr=1,NBENRJ c MELVA1=MCHAM1.IELVAL(IENR) c segact,MELVA1 ccccc BOUCLE SUR LES NOEUDS ccccccccccccccccccccccccccc DO 2521 I=1,NBNN1 C++++ Le I eme noeud est-il ienr-enrichi? mlree1= TLREEL(IENR,I) if(mlree1.eq.0) goto 2521 c Calcul du repere local de fissure(=PSI,PHI) c (rappel: 1,1:psi 1,2:phi 2,1 psi,x ...etc...) do 2522 inode=1,NBNN1 c pour le H-enrichissement, on n a pas gardé PSI (inutile) if(ienr.ne.1) then c valeur de PSI au inode^ieme noeud c qu on multiplie par la valeur de Ni^std au pt de G considéré LV7WRK(ienr,1,1,I)= LV7WRK(ienr,1,1,I) & + (SHPWRK(1,inode)*xpsi1) LV7WRK(ienr,1,2,I)= LV7WRK(ienr,1,2,I) & + (SHPWRK(2,inode)*xpsi1) LV7WRK(ienr,1,3,I)= LV7WRK(ienr,1,3,I) & + (SHPWRK(3,inode)*xpsi1) IF (IDIM.EQ.3) LV7WRK(ienr,1,4,I)= LV7WRK(ienr,1,4,I) & + (SHPWRK(4,inode)*xpsi1) c valeur de PHI au inode^ieme noeud else endif LV7WRK(ienr,2,1,I)= LV7WRK(ienr,2,1,I) & + (SHPWRK(1,inode)*xphi1) LV7WRK(ienr,2,2,I)= LV7WRK(ienr,2,2,I) & + (SHPWRK(2,inode)*xphi1) LV7WRK(ienr,2,3,I)= LV7WRK(ienr,2,3,I) & + (SHPWRK(3,inode)*xphi1) IF (IDIM.EQ.3) LV7WRK(ienr,2,4,I)= LV7WRK(ienr,2,4,I) & + (SHPWRK(4,inode)*xphi1) 2522 continue 2521 continue ccccc fin de BOUCLE SUR LES NOEUDS ccccccccccccccccccccccc 2520 CONTINUE ccccc fin de BOUCLE SUR LES enrichissements cccccccccccccccc c on a construit C LV7WRK(ienr, PSI/PHI, valeur/deriveeparqsi/pareta, iNOEUD) c********************************************************* c Ajout des fonctions de forme d enrichissement c + leurs derivees dans repere global c********************************************************* CYT CALL SHAPX(XGAU,YGAU,MELE,LV7WRK,NBENRMAX,NBENRJ, c retour a la partie commune aux EF enrichi et non enrichi 2999 continue C********************************************************* C CALCUL DE [N] C********************************************************* c ZERO ne serait-il pas facultatif? c call ZERO(BGENE,LHOOK,NLIGRP) KB=1 C boucle sur tous les Ni DO 3001 II=1,NBNI BGENE(1,KB) = SHPWRK(1,II) BGENE(2,KB+1) = SHPWRK(1,II) IF(IDIM.EQ.3) BGENE(3,KB+2) = SHPWRK(1,II) KB = KB + IDIM CTY KB = KB + 2 3001 CONTINUE C c if(J.eq.1.and.KGAU.eq.1) then c write(ioimp,*) 'BGENE(1,..)=',(BGENE(1,iou),iou=1,2*NBNI) c write(ioimp,*) 'BGENE(2,..)=',(BGENE(2,iou),iou=1,2*NBNI) c endif C********************************************************* C CALCUL DE rho C********************************************************* c C on remplit le segment MVELCH => valmat(1)=RHO IF (IVAL(1).NE.0) THEN MELVAL=IVAL(1) IBMN=MIN(J ,VELCHE(/2)) IGMN=MIN(KGAU,VELCHE(/1)) VALMAT(1)=VELCHE(IGMN,IBMN) ELSE VALMAT(1)=0.D0 ENDIF C PRISE EN COMPTE DE RHO DJAC=DJAC*VALMAT(1) c if(J.eq.1) write(ioimp,*) 'DJAC=',DJAC c c C********************************************************* C CALCUL DE rho.Nt.N C********************************************************* c pour gagner du temps cpu il faudrait qqchose du type: c CALL NTNSTX(BGENE,DJAC,DDHOOK,NLIGRP,2,LRE,REL) c if(J.eq.1) then c write(ioimp,*) 'REL',(REL(1,iou),iou=1,8) c write(ioimp,*) 'REL',(REL(2,iou),iou=1,8) c write(ioimp,*) 'REL',(REL(3,iou),iou=1,8) c write(ioimp,*) 'REL',(REL(4,iou),iou=1,8) c endif C********************************************************* C CUMUL DANS RINT(II,JJ) C********************************************************* DO 4201 II=1,NLIGRD DO 4202 JJ=1,NLIGRP RINT(II,JJ) = RINT(II,JJ) + REL(II,JJ) 4202 CONTINUE 4201 CONTINUE c c 2500 CONTINUE C FIN DE BOUCLE SUR LES POINTS DE GAUSS <<<<<<<<<<<<<< C C********************************************************* c write(ioimp,*) 'C STOCKAGE DANS XMATRI de RE(II,JJ)' C et de XMATRI dans IMATRI C********************************************************* C * SEGINI,XMATRI * IMATR1.IMATTT(NELRIG) = XMATRI c DO 6001 II=1,NLIGRD DO 6002 JJ=1,NLIGRP xmatr1.RE(II,JJ,nelrig) = RINT(II,JJ) c si NON enrichi, on met tout a 0 sauf la diago c if(mlree1.eq.0) RE(II,JJ) = 0. inutile 6002 CONTINUE c if(J.eq.1) write(ioimp,*) 'RE_',II,'=',(RE(II,jou),jou=1,NLIGRP) 6001 CONTINUE c c quelques desactivations CYT SEGDES,XMATRI do IENR=1,NBENR1 do I=1,NBNN1 mlree1 = TLREEL(IENR,I) if(mlree1.ne.0) segdes,mlree1 enddo enddo c c c 2000 CONTINUE C FIN DE BOUCLE SUR LES ELEMENTS <<<<<<<<<<<<<<<<<<<<< c c C********************************************************* C SUPPRESSION ET DESACTIVATION DE SEGMENTS C********************************************************* C SEGSUP,WRK1,WRK2,MVELCH SEGSUP,MRACC segdes,MELEME segdes,MINT1 if(MINT2.ne.0) segdes,MINT2 c desactivation des maillages et segment imatri do ienr=1,(1+NBENR1) IPT1 = LOCIRI(1,ienr) if(IPT1.ne.0) segdes,IPT1 xMATR1 = LOCIRI(4,ienr) if(xMATR1.ne.0) segdes,xMATR1 enddo c SEGDES dans RIGI1 = IMODEL C RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales