C SIGMAX SOURCE CB215821 19/08/20 21:22:01 10287 subroutine SIGMAX (MATE,IMAT,NBGMAT,NELMAT,NMATT,CMATE, & IVAMAT,IMODEL,IREPS2,IVADEP, & IVASTR,UZDPG,RYDPG,RXDPG,IIPDPG,IRETER) c C PROCEDURE UTILISEE DANS LE CAS D'ELEMENTS XFEM c POUR LE CALCUL DE la contrainte (élastique) C C C********************************************************* C PARTIE DECLARATIVE C********************************************************* C IMPLICIT REAL*8(A-H,O-Z) C PARAMETER (NDDLMAX=30,NBNIMAX=10) CTY PARAMETER (NDDLMAX=20,NBNIMAX=10) PARAMETER (NBENRMAX=5) DIMENSION MLRE(NBENRMAX+1) C -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMMODEL -INC SMCHAML -INC SMINTE -INC SMELEME -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 c SEGMENT WRK1 REAL*8 XE(3,NBBB) REAL*8 DDHOOK(LHOOK,LHOOK) REAL*8 XDDL(LRE),XSTRS(LHOOK) ENDSEGMENT c SEGMENT WRK2 REAL*8 SHPWRK(6,NBNO),BGENE(LHOOK,LRE) 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 SEGMENT MTRACE REAL*8 TRACE(3,NBPTEL) ENDSEGMENT c CHARACTER*8 CMATE DIMENSION UDPGE(3) LOGICAL BDPGE C c write (*,*) '#############################' c write (*,*) '##### DEBUT DE SIGMAX #####' c write (*,*) '#############################' C C********************************************************* c Introduction du point autour duquel se fait le mouvement c de la section en defo plane generalisee C********************************************************* C En 1D : pas de rotation BDPGE=.FALSE. NDPGE=0 XDPGE=0.D0 YDPGE=0.D0 IF (IFOUR.EQ.-3) THEN BDPGE=.TRUE. NDPGE=3 UDPGE(1)=UZDPG UDPGE(2)=RYDPG UDPGE(3)=RXDPG SEGACT,MCOORD IREF=(IIPDPG-1)*(IDIM+1) XDPGE=XCOOR(IREF+1) YDPGE=XCOOR(IREF+2) ELSE IF (IDIM.EQ.1) THEN IF (IFOUR.EQ. 7 .OR. IFOUR.EQ. 8 .OR. IFOUR.EQ. 9 .OR. . IFOUR.EQ.10 .OR. IFOUR.EQ.14) THEN BDPGE=.TRUE. NDPGE=1 UDPGE(1)=UZDPG ELSE IF (IFOUR.EQ.11) THEN BDPGE=.TRUE. NDPGE=2 UDPGE(1)=UZDPG UDPGE(2)=RXDPG ENDIF ENDIF C NV1=NMATT SEGINI,MVELCH C C C********************************************************* c C RECUPERATION + ACTIVATIONS + VALEURS UTILES c C********************************************************* C SEGACT MMODEL,IMODEL deja activé dans epsi1 c C++++ Activation au cas ou ++++++++++++++++++++++++++++++ SEGACT MCOORD C++++ Recup + Activation de la geometrie ++++++++++++++++ MELEME= IMAMOD c SEGACT MELEME deja activé dans epsi1 C++++ RECUP DES INFOS EF ++++++++++++++++++++++++++++++++ c + OBTENUES PAR ELQUOI DANS RIGI1 PENDANT PHASE 1 C segment INFO deja actif dans RIGI1 c + rigi1 n appelle pas elquoi, c'est modeli qui l'a fait c mais du coup, on na pas de segment minte c (car depend de si pt de g pour rigi, pour sigma....) c c'est + simple de rappeler elquoi ici MELE = NEFMOD call elquoi(MELE,0,3,IPINF,IMODEL) 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(6,*)'-> EPSIX 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 CTY if(MELE.eq.263) then if(MELE.EQ.263.OR.MELE.EQ.264) then NGAU2 = MINT2.POIGAU(/1) endif c write(*,*) 'dim de MINT2=6,',(MINT2.SHPTOT(/2)),(MINT2.SHPTOT(/3)) c write(*,*) 'MINT2',(MINT2.QSIGAU(iou),iou=1,NGAU) 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 goto 1000 endif endif enddo write(*,*) 'Le modele est vide (absence d enrichissement)' * return else write(*,*) 'Il n y a pas de MCHEML 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(*,*) 'niveau d enrichissement(s) du modele',NBENR1 c C********************************************************* C INITIALISATIONS... C********************************************************* IRETER = 0 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 enddo endif C Tables + longues car 1er indice correspond au fontion de forme std MLRE(1) = IDIM*NBNN1*1 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 NBNO = LRE/IDIM SEGINI,WRK2 C c ...DU SEGMENT MRACC NBENRMA2 = NBENRMAX NBI = NBNN1 segini,MRACC C C du nombre d erreur sur le noms de composantes NBERR1=0 C********************************************************* C C>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> BOUCLE SUR LES ELEMENTS C DO 2000 J=1,NBEL1 c write(*,*) '===================================' c write(*,*) '========= EF',J,' /NBEL1 =========' C C C********************************************************* C POUR CHAQUE ELEMENT, ... C********************************************************* C C++++ ON RECUPERE LES COORDONNEES DES NOEUDS DE L ELEMENT CALL DOXE(XCOOR,IDIM,NBNN1,NUM,J,XE) C c 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 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 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(*,*) 'EF',J,' NBENRJ=',NBENRJ, c &'donc',NLIGRD,' ddls et ',NBNI,' fonctions de forme' c C++++ ON CALCULE XDDL ++++ MPTVAL = IVADEP NCOSOU = IVAL(/1) INITOT = 0 C-->> BOUCLE SUR LES niveaux d'ENRICHISSEMENTS (0:U 1:A 2:BCDE1 3:BCDE2) DO IENR=0,NBENRJ *nbre de fonction(s) de ce niveau d'enrichissement (=1 si std ou H, =4 pour F1,2,...) if(IENR .le. 1) then NBNIENR = 1 else NBNIENR = 4 endif C---->> BOUCLE SUR LES fonctions de forme de ce type d'enrichissement DO INI=1,NBNIENR INITOT = INITOT + 1 C------>> BOUCLE SUR LA DIMENSION DO 2220 KDIM=1,IDIM ICOMP = (INITOT-1)*IDIM + KDIM c --cas ou on n'a pas trouvé assez de composantes-- if(ICOMP.GT.NCOSOU) GOTO 2221 MELVAL = IVAL(ICOMP) c --cas ou on a pas trouvé cette composante dans cette zone du c chpoint solution devenu mchaml -- if(MELVAL.eq.0)then c Avait on besoin de cette composante? c oui, si c'est une composante obligatoire if(IENR.eq.0) goto 2991 c oui, si l'un des noeuds est enrichi do I=1,NBNN1 if(TLREEL(IENR,I).ne.0) goto 2991 enddo c non, si c'est facultatif et qu'on n'est pas enrichi -> on saute goto 2220 c ->AVERTISSEMENT puis on saute 2991 NBERR1=NBERR1+1 if(IIMPI.lt.1) goto 2220 c write(IOIMP,*) 'PB OPERATEUR SIGM :' write(IOIMP,991) ICOMP,IENR,INI,KDIM 991 format(2X,'ABSENCE DANS LE CHPOINT DEPLACEMENT DE LA ',I3, $ 'ieme COMPOSANTE (enrichissement',I3, $ ', fonction',I3,', direction ',I3, $ ') NECESSAIRE POUR L UN DES NOEUDS SUIVANTS :') write(IOIMP,*)' noeuds :',(NUM(iou,J),iou=1,NBNN1) goto 2220 endif C---------->> BOUCLE SUR LES NOEUDS DO I=1,NBNN1 IQ = ((INITOT-1)*NBNN1*IDIM) + ((I-1)*IDIM) + KDIM XDDL(IQ) = VELCHE(I,J) ENDDO 2220 CONTINUE ENDDO ENDDO c --cas normal (toutes les composantes souhaitees etaient presentes)-- GOTO 2223 c --cas ou on n'a pas trouvé assez de composantes-- 2221 CONTINUE if (IIMPI.ge.1) then WRITE(IOIMP,2222) J,NCOSOU,ICOMP 2222 FORMAT(2X,'ATTENTION : ELEMENT ',I6, & ' LE CHAMP DE DEPLACEMENT CONTIENT ',I3,' COMPOSANTES', & ' PAR NOEUD AU LIEU DE ',I3,' ATTENDUES') endif NDDL=NCOSOU*NBNN1 NBENRJ=IENR 2223 CONTINUE c --cas ou on a une ou des erreurs-- IF (NBERR1.gt.0.and.J.eq.NBEL1) THEN write(IOIMP,*) 'OPERATEUR GRAD : ABSENCE DANS LE CHPOINT ', & 'DEPLACEMENT DE CERTAINES INCONNUES ATTENDUES PAR LE MODELE' ENDIF c c rem: il serait probablement interessant au niveau du tems cpu c d'utiliser moins de pts de Gauss lorsque l element est élastique c On pourrait par ex. utiliser MINT2 = infell(12) qui contient 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 pour les def quadratiques ISDJC=0 NBPTEL=NBPGAU IF (IREPS2.EQ.1) SEGINI MTRACE c 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 do ienr7=1,NBENRMAX do ienr7=1,NBENRJ do inod7=1,NBNN1 c do i6=1,6 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++++ CALCUL DES Ni,x Ni,y (i=1,4) + CALCUL DE det(J) CALL JACOBI(XE,SHPWRK,IDIM,NBNN1,DJAC) c if(J.eq.1.and.KGAU.eq.1) c &write(*,*) 'Ni(i=1,4)=',(SHPWRK(1,iou),iou=1,NBNN1) 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 xpsi1 = mlree1.PROG(inode) 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 xphi1 = mlree1.PROG(NBNN1+inode) else xphi1 = mlree1.PROG(inode) 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********************************************************* CALL SHAPX(MELE,LV7WRK,NBENRMAX,NBENRJ,TLREEL,SHPWRK,IRET) c retour a la partie commune aux EF enrichi et non enrichi 2999 continue C********************************************************* C CALCUL DE B' 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(2,II) BGENE(2,KB+1) = SHPWRK(3,II) BGENE(4,KB) = SHPWRK(3,II) BGENE(4,KB+1) = SHPWRK(2,II) IF(IDIM.EQ.3) THEN BGENE(3,KB+2)=SHPWRK(4,II) BGENE(5,KB)=SHPWRK(4,II) BGENE(5,KB+2)=SHPWRK(2,II) BGENE(6,KB+1)=SHPWRK(4,II) BGENE(6,KB+2)=SHPWRK(3,II) ENDIF KB = KB + IDIM 3001 CONTINUE C c if(J.eq.5.and.KGAU.eq.1) then c if(KGAU.eq.1) then c write(*,*) 'BGENE(1,..)=',(BGENE(1,iou),iou=1,2*NBNI) c write(*,*) 'BGENE(2,..)=',(BGENE(2,iou),iou=1,2*NBNI) c write(*,*) 'BGENE(4,..)=',(BGENE(3,iou),iou=1,2*NBNI) c endif C********************************************************* C CALCUL DE D C********************************************************* c on cherche les matrices de Hooke MPTVAL=IVAMAT IF (IMAT.EQ.2) THEN MELVAL=IVAL(1) IBMN=MIN(J ,IELCHE(/2)) IGMN=MIN(KGAU,IELCHE(/1)) MLREEL=IELCHE(IGMN,IBMN) SEGACT MLREEL IF (KGAU.LE.NBGMAT.AND.(J.LE.NELMAT.OR.NBGMAT.GT.1)) 1 CALL DOHOOO(PROG,LHOOK,DDHOOK) ELSE IF (IMAT.EQ.1) THEN DO 9004 IM=1,NMATT IF (IVAL(IM).NE.0) THEN MELVAL=IVAL(IM) IBMN=MIN(J ,VELCHE(/2)) IGMN=MIN(KGAU,VELCHE(/1)) VALMAT(IM)=VELCHE(IGMN,IBMN) ELSE VALMAT(IM)=0.D0 ENDIF 9004 CONTINUE c IF (MATE.EQ.2.OR.MATE.EQ.3.OR.MATE.EQ.4) THEN * IF (IGAU.LE.NBGMAT) * 1 CALL DOHMAO(VALMAT,CMATE,IFOUR,IDIM,TXR,XLOC,XGLOB,D1HO, * 2 ROTH,DDHOOK,LHOOK,1,IRTD) write(*,*) 'cas non prevu a ce jour pour les EF xfem' return ELSE IF (KGAU.LE.NBGMAT.AND.(J.LE.NELMAT.OR.NBGMAT.GT.1)) 1 CALL DOHMAS(VALMAT,CMATE,IFOUR,LHOOK,1,DDHOOK,IRTD) ENDIF ENDIF c c C********************************************************* C CALCUL DE sigma = D*B*u C********************************************************* c CALL DBST(BGENE,DDHOOK,XDDL,(NBNI*IDIM),LHOOK,XSTRS) c c calcul des eps 2 (termes quadratiques de la deformation) c IF (IREPS2.EQ.1) 1 CALL DBST2(SHPWRK,DDHOOK,XDDL,XE,NBNI,IFOUR,LHOOK,XSTRS, 2 TRACE,KGAU,XDPGE,YDPGE,UDPGE,NIFOUR) c c remplissage du segment contenant les contraintes c MPTVAL=IVASTR DO 7004 ICOMP=1,LHOOK MELVAL=IVAL(ICOMP) IBMN=MIN(J,VELCHE(/2)) VELCHE(KGAU,IBMN)=XSTRS(ICOMP) 7004 CONTINUE c * if(J.eq.5 .and. KGAU.eq.1) then c if(KGAU.eq.1) then c write(*,*) J,KGAU,'sigma(..)=',(XSTRS(iou),iou=1,LHOOK) c endif c 2500 CONTINUE C FIN DE BOUCLE SUR LES POINTS DE GAUSS <<<<<<<<<<<<<< C c quelques suppressions c (ici element non-incompressible=> pas besoin de MTRACE (cf epsi2) IF (IREPS2.EQ.1) THEN SEGSUP MTRACE ENDIF c 2000 CONTINUE C FIN DE BOUCLE SUR LES ELEMENTS <<<<<<<<<<<<<<<<<<<<< c C********************************************************* C SUPPRESSION ET DESACTIVATION DE SEGMENTS C********************************************************* C SEGSUP,WRK1,WRK2,MVELCH SEGSUP,MRACC END