$$$$ CH_THETX * CH_THETX PROCEDUR JB251061 21/06/14 21:15:01 11034 * ============================================================================= *PROCEDURE DE CALCUL DU CHAMP THETA/PI EN XFEM *--------------------------------------------- * * DESCRIPTION : PROCEDURE ANALOGUE A CH_THETA MAIS POUR LES ELEMENTS XFEM. * DETERMINE UN CHPOINT DE NORME CONSTANTE A L'INTERIEUR D'UNE * COURONNE ENTOURANT LE FRONT DE FISSURE ET NUL A L'EXTERIEUR DE * CETTE COURONNE. LE CHPOINT THETA AINSI DEFINI REPRESENTE LA * DIRECTION DE PROPAGATION EVENTUELLE DE LA FISSURE. * ============================================================================= DEBP CH_THETX SUPTAB*TABLE OBJUTI*'TABLE' BOOL*'TABLE' ; * RECUPERATION DE CERTAINES DONNEES GDIME = VALE 'DIME' ; GMODE = VALE 'DIME' ; MOD_MEC = OBJUTI.'MOD_MEC' ; MUI = EXTR (EXTR MOD_MEC 'DEPL') (LECT 1 PAS 1 GDIME) ; M_FRONT = OBJUTI.'FRONT' ; * I - COMPATIBILITE DES DONNEES * ----------------------------- SI (NON (EXIS SUPTAB 'MAILLAGE')) ; MESS 'ERREUR : ON N A PAS TROUVE DANS LA' ; MESS ' TABLE L OBJET MAILLAGE' ; QUIT CH_THETX ; SINON ; MAILLAGE = SUPTAB.'MAILLAGE' ; FINSI ; SI (NON (EXIS SUPTAB 'FRONT_FISSURE')) ; MESS 'ERREUR : LE FRONT DE LA FISSURE N EST PAS DONNE' ; QUIT CH_THETX ; SINON ; PFISS = SUPTAB.'FRONT_FISSURE' ; SI (EGA (TYPE PFISS) 'POINT') ; PFISS1 = MANU 'POI1' PFISS ; SINON ; PFISS1 = CHAN 'POI1' PFISS ; FINSI ; FINSI ; SI ((NON (EXIS SUPTAB 'PSI')) OU (NON (EXIS SUPTAB 'PHI'))) ; MESS 'ERREUR : CHPOINT PSI et PHI NON FOURNIS' ; QUIT CH_THETX ; SINON ; PSI1 = SUPTAB.'PSI' ; PHI1 = SUPTAB.'PHI' ; FINSI ; SI (EXIS SUPTAB 'COUCHE') ; COUCHE = SUPTAB.'COUCHE' ; SINON ; SI (EXIS SUPTAB 'CHAMP_THETA') ; THETA = SUPTAB.'CHAMP_THETA' ; SINON ; MESS 'ERREUR : IL FAUT SOIT LE NOMBRE DE COUCHES SOIT UN CHAMP THETA' ; FINSI ; FINSI ; * ON DETERMINE SI UNE OU DEUX LEVRES SONT MODELISEES NB_LEVRES = 2 ; * SI UNE DEMI-EPROUVETTE EST MODELISEE, * ON ESPERE QUE PHI(X)>0 OU <0 QQSOIT X MINY1 = MINI PHI1 ; MAXY1 = MAXI PHI1 ; SI ((MAXY1*MINY1) 1) ; REPE ICOUCH (COUCHE - 1) ; MBOUGER = ELEM MAILLAGE 'APPUYE' 'LARG' MBOUGER ; FIN ICOUCH ; FINSI ; * CREATION DU MAILLAGE OU THETA N'EST PAS NUL : MAIL MAIL = ELEM MAILLAGE 'APPU' 'LARG' MBOUGER ; * ON VERIFIE QUE PSI ET PHI SONT ENTIEREMENT DEFINIS SUR MAIL MINTER = (CHAN 'POI1' MAIL) INTE (EXTR PSI1 'MAILLAGE') ; NBEL1 = NBEL (DIFF (CHAN 'POI1' MAIL) MINTER ) ; SI (NBEL1 NEG 0) ; MESS NBEL1 'POINTS DES COUCHES OU PSI ET PHI SONT INDEFINIS' ; ERRE 21 ; FINSI ; * ON SE RESTREINT AU DOMAINE DE DEFINITION DE PSI ET PHI MAIL = MAIL INTE MAILPSI ; * ON COMMENCE PAR CREER LE CHAMP THETA GLOBAL : * ********************************************* * ON DEFINIT UN MODELE THERMIQUE POUR CALCULER LES GRADIENTS MOD7 = MODE MAIL 'THERMIQUE' ; GPSI = GRAD MOD7 (NOMC 'T' PSI1 'NATU' 'DIFFUS') ; GPSI = CHAN GPSI 'TYPE' 'SCALAIRE' ; GPHI = GRAD MOD7 (NOMC 'T' SUPTAB.'PHI' 'NATU' 'DIFFUS') ; GPHI = CHAN GPHI 'TYPE' 'SCALAIRE' ; NCOMP = EXTR GPSI 'COMP' ; * TAW = GRAD(PSI)^GRAD(PHI) TAW1 = PVEC GPSI GPHI NCOMP NCOMP NCOMP ; * THETA = GRAD(PHI)^TAW THETA = PVEC GPHI TAW1 NCOMP NCOMP MUI ; * ON CHANGE THETA EN CHPO THETA = CHAN 'CHPO' MOD7 THETA 'MOYE' ; * ON NORME THETA, EN FAISANT ATTENTION QUE LE CHAMP PEUT ETRE QUASI-NUL * PAR ENDROITS => ON UTILISE MASQ NTHETA = (PSCA THETA THETA MUI MUI)**0.5 ; MTHETA = MASQ NTHETA 'SUPERIEUR' 1.E-2 ; BTHETA = BORN NTHETA 'SCAL' 'MINIMUM' 1.E-2 ; THETA = CHAN (THETA / BTHETA * MTHETA) 'ATTRIBUT' 'NATURE' 'DIFFUS' ; OBJUTI.'V1' = THETA ; * ON REDUIT THETA A MBOUGER THETA = REDU THETA MBOUGER ; * ON FAIT DE MEME AVEC GRAD(PHI), MAIS IL N'EST A PRIORI JAMAIS NUL DONC PAS * BESOIN DE MASQ GPHI = CHAN 'CHPO' MOD7 GPHI 'MOYE' ; NGPHI = (PSCA GPHI GPHI NCOMP NCOMP)**0.5 ; GPHI = CHAN (GPHI / NGPHI) 'ATTRIBUT' 'NATURE' 'DIFFUS' ; OBJUTI.'V2' = NOMC NCOMP MUI GPHI ; GPHI = REDU GPHI MBOUGER ; * ON FAIT DE MEME AVEC TAW, LUI AUSSI PEUT ETRE QUASI-NUL TAW1 = CHAN 'CHPO' MOD7 TAW1 'MOYE' ; NTAW1 = (PSCA TAW1 TAW1 NCOMP NCOMP)**0.5 ; MTAW1 = MASQ NTAW1 'SUPERIEUR' 1.E-2 ; BTAW1 = BORN NTAW1 'SCAL' 'MINIMUM' 1.E-2 ; TAW1 = CHAN (TAW1 / BTAW1 * MTAW1) 'ATTRIBUT' 'NATURE' 'DIFFUS' ; OBJUTI.'V3' = NOMC NCOMP MUI TAW1 ; TAW1 = REDU TAW1 MBOUGER ; * ON INTERPOLE LES 3 DIRECTIONS SUR LE FRONT DIR1 = INT_COMP MBOUGER THETA PFISS1 ; DIR2 = NOMC NCOMP MUI (INT_COMP MBOUGER GPHI PFISS1) ; DIR3 = NOMC NCOMP MUI (INT_COMP MBOUGER TAW1 PFISS1) ; * ON LES NORME ET ON LES CHANGE EN DIFFUS NDIR1 = (PSCA DIR1 DIR1 MUI MUI)**0.5 ; NDIR2 = (PSCA DIR2 DIR2 MUI MUI)**0.5 ; NDIR3 = (PSCA DIR3 DIR3 MUI MUI)**0.5 ; DIR1 = CHAN (DIR1 / NDIR1) 'ATTRIBUT' 'NATURE' 'DIFFUS' ; DIR2 = CHAN (DIR2 / NDIR2) 'ATTRIBUT' 'NATURE' 'DIFFUS' ; DIR3 = CHAN (DIR3 / NDIR3) 'ATTRIBUT' 'NATURE' 'DIFFUS' ; * ENSUITE ON IDENTIFIE CHAQUE ELEMENT AUTOUR DU FRONT A BOUGER : * ************************************************************** NPFISS1 = NBEL PFISS1 ; TAB_ELF = TABL ; REPE IPFISS1 NPFISS1 ; PFI = PFISS1 POIN &IPFISS1 ; * EXTRACTION DES ELEMENTS CONTENANT LE POINT COURANT ELI = MBOUGER ELEM 'CONTENANT' PFI 'TOUS' ; SI (EGA &IPFISS1 1) ; TAB_ELF.(1) = ELI ; SINON ; SI ((DIME TAB_ELF) > 1) ; INTE1 = ELI INTE TAB_ELF.((DIME TAB_ELF) - 1) 'NOVERIF' ; SI (NEG (NBEL INTE1) 0) ; * S'IL Y A DES ELEMENTS EN COMMUN AVEC L'AVANT DERNIER INDICE DE LA TABLE * ALORS ON LES ENLEVE ELI = DIFF ELI INTE1 ; SI (EGA (NBEL ELI) 0) ; ITER IPFISS1 ; FINSI ; FINSI ; FINSI ; FINSI ; * ON REGARDE ENSUITE L'INTERSECTION AVEC LE DERNIER INDICE DE LA TABLE INTE2 = ELI INTE TAB_ELF.(DIME TAB_ELF) 'NOVERIF' ; SI (EGA (NBEL INTE2) 0) ; * S'IL N'Y A PAS D'ELEMENT EN COMMUN ON A TERMINE TAB_ELF.((DIME TAB_ELF) + 1) = ELI ; SINON ; * SINON IL FAUT SUPPRIMER/AJOUTER DES ELEMENTS ETEMP = DIFF TAB_ELF.(DIME TAB_ELF) INTE2 ; SI (NEG (NBEL ETEMP) 0) ; * DANS CE CAS IL Y AVAIT DES ELEMENTS EN TROP DANS LE DERNIER INDICE * => ON LES ENLEVE ET ON MET CE QUI RESTE DANS UN NOUVEL INDICE TAB_ELF.(DIME TAB_ELF) = ETEMP ; INTE2 = ELI INTE ETEMP 'NOVERIF' ; ELI = DIFF ELI INTE2 ; SI (NEG (NBEL ELI) 0) ; TAB_ELF.((DIME TAB_ELF) + 1) = ELI ; FINSI ; SINON ; * DANS CE CAS IL Y A DES ELEMENTS EN TROP DANS ELI * => ON LES ENLEVE ET ON STOCKE CE QUI RESTE DANS UN NOUVEL INDICE ETEMP = DIFF ELI INTE2 ; SI (NEG (NBEL ETEMP) 0) ; TAB_ELF.((DIME TAB_ELF) + 1) = ETEMP ; FINSI ; FINSI ; FINSI ; FIN IPFISS1 ; * CREATION ET REMPLISSAGE DE LA TABLE TTHETA * ****************************************** * FONCTIONS D'INTERPOLATION TINTER = TABL ; * ON BOUCLE SUR LES ELEMENTS ENTOURANT LE FRONT REPE IELF (DIME TAB_ELF) ; MBOUGI = TAB_ELF.&IELF ; MINTER = MBOUGI INTE ELAV ; SI (EGA (NBEL MINTER) 0) ; ITER IELF ; FINSI ; FINTER = MANU 'CHPO' MBOUGI 1 'SCAL' 1. ; * ON BOUCLE SUR LE NOMBRE DE COUCHES REPE ICOUCH (COUCHE - 1) ; MBOUGI = ELEM MAILLAGE 'APPUYE' 'LARG' MBOUGI ; FINTER = FINTER + (MANU 'CHPO' MBOUGI 1 'SCAL' 1.) ; FIN ICOUCH ; TINTER.(TAB_ELF.&IELF) = FINTER ; FIN IELF ; * TABLE TTHETA TTHETA = TABL ; TIND = INDE TINTER ; REPE IIND (DIME TIND) ; FINTER = TINTER.(TIND.&IIND) ; THETI = FINTER * THETA ; TTHETA.(TIND.&IIND) = THETI ; FIN IIND ; TTHETA.'GLOBAL' = THETA ; * NORMALISATION * ************* * PETIT FLOTTANT POUR QUE LE MOUVEMENT SOIT INFINITESIMAL EPS1 = 1.E-4 ; TIND = INDE TTHETA ; REPE ICHAM (DIME TIND) ; THETI = TTHETA.(TIND.&ICHAM) ; * ON CREE UN CHAMP THETI DONT LA NORME EST PROCHE DE LA DIMENSION DES ELEMENTS NTHETI = (PSCA THETI THETI MUI MUI)**0.5 ; THETI = THETI * DX0 / (MAXI NTHETI) ; THETA2 = INT_COMP EFISS0 THETI PFISS ; PFISS2 = PFISS PLUS (EPS1*THETA2) ; AFISS2 = PFISS2 REGL PFISS 1 ; DELTA_A = NB_LEVRES * (MESU AFISS2 'SURF') / EPS1 ; THETI = THETI * 2. / DELTA_A ; TTHETA.(TIND.&ICHAM) = THETI ; FIN ICHAM ; * ON REMPLACE THETA PAR LE CHAMP THETA GLOBAL THETA = TTHETA.'GLOBAL' ; FINSI ; * II.3 - STOCKAGE DU CHAMP THETA ET DES DIRECTIONS * ************************************************ SI (EXIS SUPTAB 'COUCHE') ; SUPTAB.'CHAMP_THETA' = THETA ; FINSI ; SUPTAB.'TAB_THETA' = TTHETA ; OBJUTI.'DIRECTION1' = DIR1 ; OBJUTI.'DIRECTION2' = DIR2 ; SI (EGA GDIME 3) ; OBJUTI.'DIRECTION3' = DIR3 ; FINSI ; FINP ;