* MAILVORO PROCEDUR SP204843 24/03/15 21:15:06 11871 *----------------------------------------------------------------------* * Procedure de maillage volumique d'une partition de voronoi * *----------------------------------------------------------------------* * * ENTREE : *--------- * - TAB1 : TABLE ISSUE DE L'OPERATEUR VORO * - ENV0 : ENVELOPPE DE LA PARTITION * - NBDIV0 : NOMBRE D'ELEMENTS CIBLE PAR DIAMETRE DE CELLULE * - COEF0 : PERMET DE CALCULER CRIT1 = COEF0 * HCEL * AVEC, POUR CHAQUE CELLULE : * - HCEL := LE PAS DE MAILLAGE CIBLE CHAQUE CELLULE * - CRIT1 := LE CRITERE DE SELECTION DES PETITES ARETES * * SORTIE : *--------- * - MTRIA1 = TABLE DES DONNEES DU MAILLAGE VOLUMIQUE *----------------------------------------------------------------------* *======================================================================* * Initialisation * *======================================================================* NBDIV = 4; FINS; * COEF1 = 1./3; FINS; * * SI (IDIM EGA 3); SINO; ARE0 = ENV0; FINS; * MCELREF = (VENV0/(NBCEL0)); TDENSC = TABLE; TDENSS = TABLE; * *======================================================================* * Determiner la taille de maille cible des cellules * *======================================================================* * P0 = TABI1 . (&B0); MCEL = MCELREF; SINO; FINS; * SI (MCEL > MCELREF); HCEL = (MCEL**(1./IDIM)) / NBDIV; TDENSC . P0 = HCEL; SINO; TDENSC . P0 = ((MCELREF**(1./IDIM)) / NBDIV); FINS; FIN B0; * *=====================================================================* * Tables des correspondances *=====================================================================* SI (IDIM EGA 3); * table de correspondance fac ---> cel TFC = TABLE; P0 = IC . &B0; LFAC0 = TAB1.CELL.P0 .FACS; SINO; TFC . NFAC01 = (TFC . NFAC01) ET P0; FINS; FINS; FIN B01; FIN B0; * table correspondance art ---> fac et art ---> cel NFAC0 = IF . &B0; LART0 = TAB1.FACS.NFAC0 .ARTS; TAFC . NART01 . 'FACS' = TAFC . NART01 . 'FACS' ET NFAC0; TAFC . NART01 . 'CELL' = TFC . NFAC0; SINO; TAFC . NART01 . 'FACS' = (TAFC . NART01 . 'FACS') ET NFAC0; FINS; TAFC.NART01 .'CELL' = (TAFC.NART01 .'CELL') ET P001; FINS; FIN B001; FINS; FIN B01; FIN B0; * Table correspondance sommet ---> art NART0 = IA . &B0; LARTINI = LARTINI ET NART0; SMT = S1 ET S2; REPE B00 2; TSA . S0 . 'ARTS' = TSA . S0 . 'ARTS' ET NART0; TSA . S0 . 'FACS' = TAFC . NART0 . 'FACS'; TSA . S0 . 'CELL' = TAFC . NART0 . 'CELL'; SINO; TSA . S0 . 'ARTS' = TSA . S0 . 'ARTS' ET NART0; FINS; TSA . S0 . 'FACS' = (TSA . S0 . 'FACS') ET NFAC01; FINS; FIN B01; * TSA . S0 . 'CELL' = (TSA . S0 . 'CELL') ET P02; FINS; FIN B02; FINS; FIN B00; FIN B0; * FINS; * SI (IDIM EGA 2); * table de correspondance ART ---> cel TAC = TABLE; * P0 = IC . &B0; LART0 = TAB1.CELL.P0 .ARTS; SINO; TAC . NART01 = (TAC . NART01) ET P0; FINS; FINS; FIN B01; FIN B0; * Table correspondance sommet ---> art NART0 = IA . &B0; LARTINI = LARTINI ET NART0; SMT = S1 ET S2; REPE B00 2; TSA . S0 . 'ARTS' = TSA . S0 . 'ARTS' ET NART0; TSA . S0 . 'CELL' = TAC . NART0; SINO; * TSA . S0 . 'ARTS' = TSA . S0 . 'ARTS' ET NART0; FINS; * TSA . S0 . 'CELL' = (TSA . S0 . 'CELL') ET P02; FINS; FIN B02; * FINS; FIN B00; FIN B0; FINS; * Determiner les densites aux sommets S0 = ITSA . &B0; TDENSS . S0 = TDENSC . P02; SINON; SI ((TDENSC . P02) < (TDENSS . S0)); TDENSS . S0 = TDENSC . P02; FINS; FINS; FIN B00; FIN B0; *======================================================================* * ELIMINATION DES PETITES ARETES * *======================================================================* * TAB2 = TABLE; TAB2 . 'CELL' = TABLE; TAB2 . 'FACS' = TABLE; TAB2 . 'ARTS' = TABLE; * TSMT = TABLE; TANT = TABLE; * LART1 = LARTINI; * Determiner les sommets sur l'enveloppe; SI (IDIM EGA 3); SINO; FINS; * REPE B1 NBARTS; * NART1 = IA . &B1; ART01 = TAB1 .'ARTS'.NART1; * Verifier que ART111 n'est pas une arete de l'enveloppe LARTNEW = LARTNEW ET NART1; OUBL TEST; ITER B1; FINS; OUBL TEST; * * SN1 = TSMT . S1; ANT1 = TANT . SN1; SINO; SN1 = S1; FINS; * SN2 = TSMT . S2; ANT2 = TANT . SN2; SINO; SN2 = S2; FINS; * Verifier que SN1 et SN2 ne sont pas confondus SI ('<EG' ('DIST' SN1 SN2) 1.E-10); ITER B1; FINS; * ART1 = D 1 SN1 SN2; * Verifier que ART1 n'est pas une arete de l'enveloppe LARTNEW = LARTNEW ET NART1; FINS; OUBL TEST; ITER B1; FINS; OUBL TEST; * * Determiner SM0 point de fusionnement de S1 et S2 * SI (IDIM EGA 3); SINO; ENV0A = ENV0; FINS; TBOR = 'TABLE'; * SI (IDIM EGA 3); **** PILE0 = PILE1; * Test appartenance de S10 a l'element BORDI PRJ1 = S10 'PROJ' 'DIRE' N1 D1 = 'DIST' S10 PRJ1 ; 'SI' (D1 < 1.E-10); * Test coincidence S10 avec sommets enveloppe * QUIT B2; 'SINO'; ITER B20; 'FINS'; 'FINS'; * Test appartenance S10 a une des aretes "vives" du plan considere * 'SI' ((ABS(TEST5 + 1.0)) < 1E-10); QUIT B2; 'SINO'; ITER B20; 'FINS'; 'FINS'; 'FIN' B200; FINS; * Les Tests precedents sont negatifs ==> S10 dans l'element BORDI * QUIT B2; 'SINO'; ITER B20; 'FINS'; 'FINS'; 'FINS'; 'FIN' B20; ** 'FIN' B2; FINS; * SI(EGA IDIM 2); PILE0 = PILE1; * Test coincidence S10 avec sommets enveloppe * SI ('<EG' ('DIST' S10 PB1) 1E-10) ; QUIT B2; 'SINO'; ITER B20; 'FINS'; FINS; * SI ('<EG' ('DIST' S10 PB2) 1E-10) ; QUIT B2; 'SINO'; ITER B20; 'FINS'; FINS; * * Test appartenance de S10 a l'element BORDI 'SI' ((ABS(TEST5 + 1.0)) < (1E-04)); QUIT B2; 'SINO'; ITER B20; 'FINS'; FINS; FIN B20; FIN B2; FINS; * REPE QIT0 1; * SMTOUT = SMTOUT ET SM0; QUIT QIT0; FINS; * * SI (INFO1 EGA INFO2); SI (info1 EGA 3); SI (EGA (TBOR . 1) (TBOR . 2)); SMTOUT = SMTOUT ET SM0; QUIT QIT0; SINO; * Determination de la projection de S1 sur INTC12 NPARK12 = 'NORME' PARK12; VAL1 = VAL1 '/' ((NPARK12)**2); SMTOUT = SMTOUT ET SM0; QUIT QIT0; SINO; QUIT QIT0; SINO; ERREUR 5; FINS; FINS; FINS; SINO; SMTOUT = SMTOUT ET SM0; QUIT QIT0; SINO; QUIT QIT0; FINS; * FINS; FINS; * 'SI' (INFO1 < INFO2); SM0 = SN1; SMTOUT = SMTOUT ET SM0; QUIT QIT0; 'SINO'; SM0 = SN2; SMTOUT = SMTOUT ET SM0; QUIT QIT0; 'FINS'; 'FINS'; 'FIN' QIT0; SINO; FINS; * SM0 = TSMT.SM0; FINS; * FIN B11; FINS; * FIN B11; FINS; * TSMT . S1 = SM0; TSMT . S2 = SM0; TSMT. SN1 = SM0; TSMT. SN2 = SM0; TANT . SM0 = (S1 ET S2 ET ANT1 ET ANT2 ET SN1 ET SN2); * TDENSS . SM0 = CRIT1/COEF1; SINO; LARTNEW = LARTNEW ET NART1; FINS; MENAGE; FIN B1; * * Construir la nouvelle table des aretes ART2 = TAB1 .'ARTS'.NART2; SF1 = TSMT . S1; SINO; SF1 = S1; FINS; SF2 = TSMT . S2; SINO; SF2 = S2; FINS; * SI ('>' ('DIST' SF1 SF2) 1.E-10) ; TAB2 . 'ARTS'. NART2 = D 1 SF1 SF2; * MISE À JOUR DES DENSITES FINS; FIN B2; * SI (IDIM EGA 3); * Creer la nouvelle table des faces SAVEARTB = TABLE; NFAC3 = ITF . &B3; LART3 = TAB1 . 'FACS' . NFAC3 . 'ARTS'; * LARTN = LARTN ET NART31; VISUN = VISUN ET (TAB2 . 'ARTS' .NART31); FINS; FIN B31; * ITER B3; FINS; * SAVEARTB . NARTB = NARTA; ITER B3; FINS; TAB2 . 'FACS' . NFAC3 = TABLE; TAB2 . 'FACS' . NFAC3 . 'VISU' = VISUN; TAB2 . 'FACS' . NFAC3 . 'ARTS' = LARTN; FIN B3; * Remplacer NARTB par NARTA dans les faces concernees NART4 = ISARTB . &B4; LFAC4 = TAFC . NART4 . 'FACS'; SI (POSB > 0); * NARTB = NART4; REPE B411; NARTA = SAVEARTB.NARTB; NARTB = NARTA; ITER B411; SINO; QUIT B411; FINS; FIN B411; * SINO; FINS; * FINS; FINS; FIN B41; FIN B4; * * eliminer les NARTB de tab2; FIN B40; FINS; * Creer les indices VISU des faces NFAC5 = ITFN . &B5; LART5 = TAB2 . 'FACS' . NFAC5 . 'ARTS'; TAB2 . 'FACS' . NFAC5 . 'VISU' = (TAB2 . 'FACS' . NFAC5 . 'VISU') ET (TAB2 .'ARTS'.NART51); FIN B51; FIN B5; * Creer la nouvelle table des cellules SAVEFACB = TABLE; P6 = ITC . &B6; LFAC6 = TAB1 .'CELL'.P6 . 'FACS'; * LFACN = LFACN ET NFAC61; FINS; FIN B61; * ITER B6; FINS; * SAVEFACB . NFACB = NFACA; ITER B6; FINS; TAB2 . 'CELL' . P6 = TABLE; TAB2 . 'CELL' . P6 . 'FACS' = LFACN; TAB2 . 'CELL' .P6 . 'VOIS' = TAB1 . 'CELL' .P6 . 'VOIS'; * Creer l indice VISU de la cellule FAC62 = TAB2.FACS.NFAC62 .VISU; FIN B62; TAB2 . 'CELL' . P6 . 'VISU' = CVISU; * FIN B6; * Remplacer NFACB par NFACA dans les cellules concernees NFAC7 = ISFACB . &B7; LCEL7 = TFC . NFAC7; SI (POSB > 0); POSB (SAVEFACB. (SAVEFACB .NFAC7)); SINO; FINS; FINS; FINS; FIN B71; FIN B7; FINS; * SINO; * Creer la nouvelle table des cellules SAVEARTB = TABLE; P6 = ITC . &B6; LART6 = TAB1 .'CELL'.P6 . 'ARTS'; * LARTN = LARTN ET NART61; FINS; FIN B61; * ITER B6; FINS; * SAVEARTB . NARTB = NARTA; * TAB2 . 'ARTS' = ENLE (TAB2 .'ARTS') NARTB; ITER B6; FINS; TAB2 . 'CELL' . P6 = TABLE; TAB2 . 'CELL' . P6 . 'ARTS' = LARTN; TAB2 . 'CELL' .P6 . 'VOIS' = TAB1 . 'CELL' .P6 . 'VOIS'; * Creer l indice VISU de la cellule ART62 = TAB2.ARTS.NART62; FIN B62; TAB2 . 'CELL' . P6 . 'VISU' = CVISU; * FIN B6; * Remplacer NARTB par NARTA dans les cellules concernees NART7 = ISARTB . &B7; LCEL7 = TAC . NART7; SI (POSB > 0); POSB (SAVEARTB. (SAVEARTB .NART7)); SINO; LISTE (TAB2 . 'CELL'. P71 .'ARTS'); FINS; FINS; FINS; FIN B71; FIN B7; FINS; FINS; * *======================================================================* * MAILLAGE VOLUMIQUE DE LA PARTION DE VORONOI * *======================================================================* * * A t on demande une coloration aleatoire des cellules ? LOG1 = FAUX ; LOG1 = VRAI ; LCOUL1 = MOTS 'BLEU' 'ROUG' 'JAUN' 'VERT' 'TURQ' 'AZUR' 'ORAN' 'VIOL' 'OCEA' 'OLIV' 'GRIS' ; FINS ; FINS ; FINS ; * Type d'elements a creer et nature des bords des cellules selon la * dimension SI (EGA IDIM 2) ; FINS ; SI (EGA IDIM 3) ; FINS ; * Initialisation de la table de sortie (sur la meme base que celle issue * de l'operateur VORO) SI (EGA IDIM 3) ; FINS ; * Recuperation des tables d'entree T1C = TAB2 . 'CELL' ; SI (EGA IDIM 3) ; T1F = TAB2 . 'FACS' ; FINS ; T1A = TAB2 . 'ARTS' ; * Boucle 1 : maillage des aretes A1 = T1A . (ITA1 . &B1) ; L12 = DIST P1 P2 ; MA1 = D P1 P2 'DINI' (TDENSS . P1) 'DFIN' (TDENSS . P2) ; TAB20 . 'ARTS' . (ITA1 . &B1) = MA1 ; FIN B1 ; * Boucle 2 : maillage des faces a partir des aretes (dimension 3) SI (EGA IDIM 3) ; TAB20 . 'FACS' . (IT1F . &B1). 'MAIL' = 0 ; * construction du contour de la face &B1 LA1 = T1F . (IT1F . &B1) . 'ARTS' ; CONT1 = CONT1 ET (TAB20 . 'ARTS' . IA2) ; LA2 = LA2 ET IA2 ; FIN B2 ; * construction de la surface a l'interieur du contour * ce contour peut etre compose de plusieurs parties, on boucle sur * les differentes parties connexes S1 = S1 ET S2 ; FIN B2 ; TAB20 . 'FACS' . (IT1F . &B1) . 'MAIL' = S1 ; TAB20 . 'FACS' . (IT1F . &B1) . 'ARTS' = LA2 ; FIN B1 ; FINS ; * * Boucle 3 : maillage des cellules a partir des faces/aretes P1 = IT1C . &B1 ; * assemblage des bords de la cellule LAF1 = T1C . P1 . MBORD ; MV1 = T1C . P1 . 'VOIS' ; SI (EGA IDIM 2) ; BORD1 = BORD1 ET (TAB20 . MBORD . IAF2) ; FINS ; SI (EGA IDIM 3) ; BORD1 = BORD1 ET (TAB20 . MBORD . IAF2 . 'MAIL') ; FINS ; LAF2 = LAF2 ET IAF2 ; FIN B2 ; * determination d'une couleur pour la cellule aleatoirement et * differente de celles des cellules voisines SI LOG1 ; I1 = (ENTI RAND1) + 1 ; I1 = I1 + 1 ; I1 = 1 ; FINS ; ITER B3 ; SINO ; QUIT B3 ; FINS ; FIN B3 ; FINS ; FINS ; FIN B2 ; FINS ; * construction de la cellule a l'interieur du bord * ce bord peut etre compose de plusieurs parties, on boucle sur * les differentes parties connexes * SI (EGA IDIM 2) ; FINS ; SI (EGA IDIM 3) ; FINS ; CEL1 = CEL1 ET CEL11 ; FIN B2 ; TAB20 . 'CELL' . P1 . 'MAIL' = CEL1 ; TAB20 . 'CELL' . P1 . MBORD = LAF2 ; * maillage des cellules voisines MV2 = MV2 ET PV2 ; FIN B2 ; TAB20 . 'CELL' . P1 . 'VOIS' = MV2 ; * couleur de la cellule * maillage global de la partition TAB20 . 'MAIL' = (TAB20 . 'MAIL') ET CEL1 ; FIN B1 ; * MTRIA1 = TAB20; * FINP MTRIA1 ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales