xpost2
C XPOST2 SOURCE OF166741 24/08/02 21:15:04 11974 SUBROUTINE XPOST2 c c Construit 2 Chpoints avec des ddl "physiques" (UX UY) c sur le maillage de la fissure (en phi=0+ et phi=0-) c en RECOmbinant les ddl Xfem (UX AX B1X C1X ...) c -> Utile pour le tracé de l ouverture de fissure c C SYNTAXE : c chpo2 chpo3 = XFEM 'FISS' geofissure chpo1 MODEL_XFEM C c IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C PARAMETER (NBRMAX=5) C SEGMENTS INCLUDE -INC PPARAM -INC CCOPTIO -INC CCREEL -INC SMCOORD -INC SMELEME -INC SMCHPOI -INC SMCHAML -INC SMMODEL -INC SMLREEL c POINTEUR MCHEX1.MCHELM C SEGMENT IDEJVU(NBPT2) c segment wrk4 real*8 xel(3,nbnn),shpp(6,nbnn),qsi(3),XPT2(3) endsegment C C_____________________________________________________________ C INITIALISATION DES INCONNUES obligatoires et facultatives PARAMETER (NOBL=3,NFAC=27) CHARACTER*(LOCOMP) MODDL,MODDL2,DDLOBL(NOBL),DDLFAC(NFAC) DATA DDLOBL/'UX ','UY ','UZ '/ DATA DDLFAC/'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 '/ INTEGER TENR(NFAC),TNI(NFAC),TF2O(NFAC) c ddlfac correspond a quel enrichissement? DATA TENR/1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3/ c ddlfac correspond a quel fonction d'enrichissement? DATA TNI/1,1,1,1,1,1,2,2,2,3,3,3,4,4,4,1,1,1,2,2,2,3,3,3,4,4,4/ c ddlfac correspond a quel ddlobl? DATA TF2O/1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3/ c tables pour mise en concordance des ddl INTEGER TOBL(NOBL),TFAC(NOBL,4,NBRMAX) INTEGER TIFAC(NOBL,4,NBRMAX) c fonctions de forme REAL*8 SHPWRK(4),SHPWR2(4) C_____________________________________________________________ C NBERR1=0 C LECTURE IF(IERR.NE.0) RETURN SEGACT,MCOORD C_____________________________________________________________ C TRANSFO EN MCHELM DU CHPOINT avec ddl xfem C_____________________________________________________________ C CHANGEMENT DE SUPPORT POUR LE CHPOINT DE SORTIE ipt2 = IPT2in c write(6,*) 'xpost2: retour de change (ipt2 doit etre actif)',ipt2 C_____________________________________________________________ C ACTIVATION DU MODELE NSOUS = KMODEL(/1) C_____________________________________________________________ c write(6,*) 'C INITIALISATION du mchpo2' C NAT=JATTRI(/1) NSOUPO=1 SEGINI,MCHPO2=MCHPOI segadj,MCHPO2 SEGINI,MCHPO3=MCHPO2 c on sait que l'on a seulement besoin de UX et UY en 2D c (+léger que dans xpost1.eso) NC=IDIM segini,MSOUP2,MSOUP3 MCHPO2.IPCHP(1) = MSOUP2 MCHPO3.IPCHP(1) = MSOUP3 do ic2=1,IDIM MSOUP2.NOCOMP(ic2) = DDLOBL(ic2) MSOUP3.NOCOMP(ic2) = DDLOBL(ic2) MSOUP2.NOHARM(ic2) = NIFOUR MSOUP3.NOHARM(ic2) = NIFOUR enddo MSOUP2.IGEOC = IPT2 MSOUP3.IGEOC = IPT2 NBNN2 = IPT2.NUM(/1) NBELE2 = IPT2.NUM(/2) NBPT2 = NBELE2 N = NBPT2 C segini,MPOVA2,MPOVA3 C bp: on ajoute IDEJVU pour ne caluler le champ de depl qu'une seule fois si le point arive sur le bord d un element segini,MPOVA2,MPOVA3,IDEJVU MSOUP2.IPOVAL = MPOVA2 MSOUP3.IPOVAL = MPOVA3 C CHAMP DE DEPLACEMENT X-FEM MCHELM = IPCHEL C_____________________________________________________________ C>>>>>>>>>>>>>>>>>>>>>>> BOUCLE SUR LES ZONES DU Modele DO 1000 ISOUS=1,NSOUS IMODEL = KMODEL(ISOUS) c write(6,*) '____________________________________' c write(6,*) 'xpost2: ZONE',ISOUS,' / ',NSOUS,' IMODEL=',IMODEL C_____________________________________ C RECHERCHE DU MCHAM1 issu du MCHEX1 D ENRICHISSEMENT MCHAM1=0 NBENR2=0 isouX=0 NOBMOD=IVAMOD(/1) c write(6,*) 'IMAMOD,NEFMOD,NOBMOD',IMAMOD,NEFMOD,NOBMOD C Si sous modele de sure on passe au sous modele suivant if (NEFMOD.eq.259) goto 1000 IF (NOBMOD.NE.0) THEN c boucle sur les objets contenus dans ivamod DO 1002 iobmo1=1,NOBMOD c write(6,*) '-->1002: objet=',iobmo1,'/',NOBMOD c write(*,*) ' TYMODE(iobmo1)=',TYMODE(iobmo1) if((TYMODE(iobmo1)).ne.'MCHAML') goto 1002 MCHEX1 = IVAMOD(iobmo1) c write(*,*) ' MCHEX1,MCHEX1.TITCHE=',MCHEX1,MCHEX1.TITCHE if((MCHEX1.TITCHE).ne.'ENRICHIS') goto 1003 c REM. IMPORTANTE: a ce jour 1 seule zone XFEM, donc on prend ICHAML(isouX=1) c mais on ecrit ci dessous un prototype de la recherche de la zone du MCHEX1 c associée a la zone du sous modele en cours via le pointeur du maillage nsouX = MCHEX1.ICHAML(/1) do isouX=1,nsouX c write(*,*) 'isouX=',isouX,'/',nsouX,' : ',IMACHE(isouX) if(IMAMOD.eq.MCHEX1.IMACHE(isouX)) goto 1004 enddo isouX=0 goto 1003 1004 continue MCHAM1 = MCHEX1.ICHAML(isouX) NBENR2 = MCHAM1.IELVAL(/1) 1003 continue 1002 CONTINUE ENDIF c if(isouX.ne.0) then c write(6,*) 'isouX/n',isouX,nsouX c write(6,*) 'IMAMOD,IMACHE=',IMAMOD,IMACHE(isouX) c endif c write(6,*) 'MCHAM1,NBENR2=',MCHAM1,NBENR2 C_____________________________________ C ACTIVATION DU SOUS CHPOINT devenu MCHELM ET DES COMPOSANTES MELVAL MCHAML = ICHAML(ISOUS) N2= IELVAL(/1) c nbre de composante, de points NCOMP = N2 C_____________________________________ c quelles sont les composantes obligatoires (=physiques) et ou sont elles? c on en deduit NC NC=0 DO 1011 IOBL=1,NOBL MODDL2 = DDLOBL(IOBL) DO ICOMP=1,NCOMP MODDL = NOMCHE(ICOMP) * on a trouvé cette comp obl dans le chpoint d entree IF (MODDL.eq.MODDL2) THEN NC=NC+1 TOBL(NC) = ICOMP GOTO 1011 ENDIF ENDDO 1011 CONTINUE IF (NC.lt.NOBL) THEN DO IOBL=(NC+1),NOBL TOBL(IOBL) = 0 ENDDO ENDIF c ...et les facultatives(enrichissement)? do i3=1,NBRMAX do i1=1,NOBL enddo enddo enddo NF=0 IFAC = 0 DO 1012 IFAC=1,NFAC MODDL2 = DDLFAC(IFAC) DO ICOMP=1,NCOMP MODDL = NOMCHE(ICOMP) * on a trouvé une comp fac qui va etre ajouté a la comp obl dans le chpoint de sortie IF (MODDL.eq.MODDL2) THEN NF=NF+1 IOBL=TF2O(IFAC) INI =TNI (IFAC) IENR=TENR(IFAC) TFAC(IOBL,INI,IENR) = ICOMP TIFAC(IOBL,INI,IENR) = IFAC GOTO 1012 ENDIF ENDDO * on n a pas trouvé la composante facultative IOBL=TF2O(IFAC) INI =TNI (IFAC) IENR=TENR(IFAC) TIFAC(IOBL,INI,IENR) = IFAC 1012 CONTINUE c write(*,*) 'TOBL et TFAC remplis' c recup du maillage MELEME = IMAMOD NBNN0=NUM(/1) NBELE0=NUM(/2) MELGEO = ITYPEL c initialisation du segment de travail NBNN = NBNN0 segini,wrk4 C_____________________________________ C>>>>>>>>>>>>> BOUCLE SUR LES ELEMENTS DU MODELE DO 2000 J0=1,NBELE0 c XEL = coor des noeuds de l'ef J0 de MELEME C_____________________________________ C>>>>>>>>>>>>> BOUCLE SUR LES NOEUD DU CHP2 * point J2 IDEJaVU dans un autre element => on saute C inoeu2 = IPT2.NUM(1,J2) c XPT2 = coor du pt J2 de IPT2 c calcul iteratif des coord QSI du pt XPT2 dans le repere local de l'ef defini par XEL if(iret.ne.0) goto 2002 do i0=1,NBNN0 * if (SHPP(1,i0).lt.0.) goto 2002 * a revoir car pb lorsqu'on tombe "pile" sur un bord if(SHPP(1,i0).lt.(-1.E-7)) goto 2002 enddo * On a trouvé que le point J2 appartenait a l'EF J0 c write(6,*) '_______________________________' c write(*,*) 'ELEM ',J0,'/',NBELE0,' point ',J2,'/',NBPT2 c write(6,*) 'QSI= ',(QSI(iou),iou=1,3) c write(6,*) 'SHPP=',(SHPP(1,iou),iou=1,4) C______________________ C On commence par interpoler la partie relative aux ddls (UX,UY) DO IC2=1,NC ICOMP = TOBL(IC2) MELVAL = IELVAL(ICOMP) DO I0=1,NBNN0 $ + ( SHPP(1,I0) * VELCHE(I0,J0) ) ENDDO c write(*,*) 'U_',IC2,'=',MPOVA2.VPOCHA(J2,IC2) ENDDO C______________________ C le noeud inoeu (I0^ieme noeud de l ef J0) est il IENR2-enrichi? if(NBENR2.eq.0) goto 2002 DO 3000 I0=1,NBNN0 inoeu = NUM(I0,J0) DO 3001 IENR2=1,NBENR2 MELVA1=MCHAM1.IELVAL(IENR2) MLREEL=MELVA1.IELCHE(I0,J0) C si ce noeud n est pas IENR2-enrichi on ne fait rien IF(MLREEL.eq.0) GOTO 3001 C si ce noeud est enrichi,... c write(6,*) 'I0,inoeu,IENR2,MLREEL=', c $ I0,inoeu,IENR2,MLREEL c ...on calcule les fonctions d enrichissement : c------------pour IENR=1, fonction H, ddl AX et AY IF (IENR2.eq.1) THEN NBNI = 1 SHPWRK(1) = 1.d0 SHPWR2(1) = -1.d0 ENDIF c------------fin du cas IENR=1, fonction H c------------pour IENR>1, 4 fonctions F IF (IENR2.ge.2) THEN NBNI = 4 PHIX = 0.d0 PSIX = 0.d0 c WRITE(6,*) 'XPSI1=',(PROG(IOU),IOU=1,4) do iii0 = 1,NBNN0 XSHPP = SHPP(1,iii0) PSIX = PSIX + (XSHPP * XPSI1) enddo * write(6,*) 'PHIX,PSIX=',PHIX,PSIX RX = ( (PSIX**2) + (PHIX**2) )**0.5 * IF(RX.LT.XTOL) THEN IF (PSIX.ge.0.) THEN THETAX = 0. THETA2 = 0. ELSE * THETAX = HX * ((XPI/2.) - (ATAN(PSIX/ABS(PHIX)))) THETAX = XPI THETA2 = -1.*XPI ENDIF RX05= (RX**0.5) c write(6,*) 'PSIX,PHIX,RX05=',PSIX,PHIX,RX05 SIN1T = SIN(THETAX) C COS1T = COS(THETAX) SIN05T = SIN(THETAX/2.) COS05T = COS(THETAX/2.) c if (IENR2.lt.2) then c SHPWRK(1) = 0.d0 c else SHPWRK(1) = (RX05) * SIN05T c endif SHPWRK(2) = (RX05) * COS05T SHPWRK(3) = (RX05) * SIN05T * SIN1T SHPWRK(4) = (RX05) * COS05T * SIN1T SIN12 = SIN(THETA2) C COS12 = COS(THETA2) SIN052 = SIN(THETA2/2.) COS052 = COS(THETA2/2.) c if (IENR2.lt.2) then c SHPWR2(1) = 0.d0 c else SHPWR2(1) = (RX05) * SIN052 c endif SHPWR2(2) = (RX05) * COS052 SHPWR2(3) = (RX05) * SIN052 * SIN12 SHPWR2(4) = (RX05) * COS052 * SIN12 ENDIF c------------fin du cas IENR>1, fonction F c on ajoute les fonctions d enrichissement DO 3900 IC2=1,NC DO 3901 INI=1,NBNI ICOMP = TFAC(IC2,INI,IENR2) c cas ou on a pas trouvé cette composante dans cette zone du c chpoint solution => AVERTISSEMENT puis on saute if (ICOMP.eq.0) then NBERR1=NBERR1+1 if (IIMPI.ge.1) then write(IOIMP,991) DDLFAC(icomp),inoeu 991 format(2X,'ABSENCE DE LA COMPOSANTE ',A4,' AU NOEUD ', $ I6,' DANS LE CHPOINT FOURNI a XFEM FISS') endif goto 3900 endif MELVAL = IELVAL(ICOMP) $ + ( (SHPP(1,I0) * SHPWRK(INI)) * VELCHE(I0,J0) ) $ + ( (SHPP(1,I0) * SHPWR2(INI)) * VELCHE(I0,J0) ) 3901 CONTINUE 3900 CONTINUE 3001 CONTINUE C<<<<<<<<< FIN DE BOUCLE SUR LES enrichissements 3000 CONTINUE C<<<<<<<<< FIN DE BOUCLE SUR LES noeuds c do ic2=1,NC c write(*,*) 'U_tot',IC2,'=',MPOVA2.VPOCHA(J2,IC2) c enddo 2002 CONTINUE C<<<<<<<<<<<<<<< FIN DE BOUCLE SUR LES noeud du chp2 2000 CONTINUE C<<<<<<<<<<<<<<< FIN DE BOUCLE SUR LES elements segsup,wrk4 1000 CONTINUE C<<<<<<<<<<<<<<<<<<<<<<<<< FIN DE BOUCLE SUR LES ZONES SEGSUP,IDEJVU c --cas ou on a une ou des erreurs-- IF (NBERR1.gt.0) THEN write(IOIMP,*) 'OPERATEUR XFEM FISS : ABSENCE DANS LE CHPOINT ', & 'DEPLACEMENT DE CERTAINES INCONNUES ATTENDUES PAR LE MODELE' ENDIF C_____________________________________________________________ C C ECRITURE END
© Cast3M 2003 - Tous droits réservés.
Mentions légales