* COLLER PROCEDUR CHAT 04/01/15 21:15:02 4784 * ************************************************************************ * * C O L L E R * ----------- * * FONCTION: * --------- * * DEFINIR DES JONCTIONS COQUE-MASSIF OU POUTRE-MASSIF EN 3D. * * C'est aussi un moyen de generer les valeurs de rotation sur un * ensemble de noeuds appartenant a des elements massifs. * * PHRASE D'APPEL: * --------------- * * COQMASF = COLLER VOLUM8 SURF4 ('SOUPLE') ; * * OPERANDES: * ---------- * * VOLUM8 "MAILLAGE" ZONE VOLUMIQUE. * SURF4 "MAILLAGE" ZONE MODELISEE EN COQUES OU POUTRES, ou * ensemble de points de l'enveloppe de * "VOLUM8" sur lesquels on veut connaitre les * rotations. * 'SOUPLE' "MOT " MOT-CLE DEMANDANT UNE CERTAINE SOUPLESSE A * LA "COLLE": ON NE DEFINIT LA JONCTION QU'EN * 1 POINT SUR 2. * * RESULTATS: * ---------- * * COQMASF "RIGIDITE" Matrice definissant des rotations sur * l'enveloppe des massifs. * A adjoindre a la Matrice de Rigidite. * * REMARQUES: * ---------- * * L'OPTION "SOUPLE" A ETE INTRODUITE POUR CONTRE-BALANCER LA * RAIDEUR EXCESSIVE D'UN MAILLAGE TROP GROSSIER. * L'EFFET DE L'OPTION "SOUPLE" EST AUSSI FACILE A QUANTIFIER QUE * CELUI DES GROSSES MAILLES ... * * MODE DE FONCTIONNEMENT: * ----------------------- * * UNE ROTATION EST APPROXIMEE PAR LES DEPLACEMENTS RELATIFS DE * POINTS DU VOLUME QUI SONT VOISINS DU NOEUD CONSIDERE. * PLUS FACILE A DIRE QU'A FAIRE ... * * VARIABLES: * ---------- * * OXYZ = TABLE DE 3 POINTS VOISINS DU POINT COURANT "P1" ET QUI * REPRESENTENT AU MIEUX LE TRIEDRE LOCAL PARALLELE AU * REPERE GENERAL. * OXYZ.K.'PT' = POINT "P2" TEL QUE P1P2 EST UNE BONNE * APPROXIMATION DE LA DIRECTION "K". * OXYZ.K.'COS2' = VALEUR D'AUTANT PLUS PROCHE DE 1 QUE * L'APPROXIMATION DE LA DIRECTION "K" EST * BONNE. * OXYZ = 'TABLE' ; OXYZ. 1 = 'TABLE' ; OXYZ. 2 = 'TABLE' ; OXYZ. 3 = 'TABLE' ; IND = 'TABLE' ; IND. 1 = 1 ; IND. 2 = 2 ; IND. 3 = 3 ; IND. 4 = 1 ; IND. 5 = 2 ; DEP = 'TABLE' ; ROT = 'TABLE' ; * * AUTEUR, DATE DE CREATION: * ------------------------- * * P. MANIGOT 28 JUIN 1989 * REPRISE: P.M. 05/09/89 * P.M. 09/02/90: "AXE" enleve. PSCAL --> COORD * P.M. 19/02/90: durcissement du test ">0.99" * P.M. 19/03/90: utilisation de "RELA ... DIRECTION" * P.M. 22/10/91: correction pour elements de volume dont les aretes * sont a 45 par rapport aux axes du repere general. * P.M. 24/03/92: mise en commentaire brutale de TASSER qui pose des * problemes. A arranger plus tard. * ************************************************************************ * * * INIT = VRAI ; X = 'TABLE' ; * INITIALISATION DE LA LISTE DES POINTS SUR LESQUELS ONT ETE DEFINIES * LES ROTATIONS: T_LIAIS = 'TABLE' 'liaison' ; * INITIALISATION DE LA LISTE DES POINTS "VOISINS" UTILISES POUR DEFINIR * LES ROTATIONS: T_VOISIN = 'TABLE' 'voisin' ; * * SOUPLE = 'EXISTE' OPT ; SI SOUPLE ; SOUPLE = 'EGA' OPT 'SOUPLE' ; FINSI; * ENVELO4 = 'ENVELOPPE' VOLUM8 ; SURF1 = 'CHANGER' SURF4 'POI1' ; SOUDURE = 'ELEMENTS' SURF1 'APPUYES' 'LARGEMENT SUR' ENVELO4 ; 'OUBLIER' SURF1 ; NBPT1 = 'NBNOEUDS' SOUDURE ; * * * BOUCLE SUR TOUS LES POINTS DE L'INTERSECTION: * --------------------------------------------- IP = 0 ; REPETER REP1 NBPT1 ; IP = IP + 1 ; PT1 = 'POINT' SOUDURE IP ; * SI SOUPLE ; * CAS DE LIAISON 1 SUR 2 : SI ('EXISTE' T_VOISIN PT1) ; * "PT1", VOISIN D'UN POINT LIE EN ROTATION, DOIT ETRE SAUTE. 'ITERER' REP1 ; FINSI; PT2 = 'POINT' ('DIFFERENCE' SOUDURE ('MANUEL' 'POI1' PT1)) 'PROCHE' PT1 ; SI ('EXISTE' T_LIAIS PT2) ; 'ITERER' REP1 ; FINSI; * * ON REPERTORIE A PEU PRES LES NOEUDS VOISINS: VOISIN4 = 'ELEMENT' ENVELO4 'APPUYE' 'LARGEMENT SUR' PT1 ; NBPROCHE = 'NBELEM' VOISIN4 ; PT2 = PT1 ; VOISIN2 = 'CHANGER' VOISIN4 'POI1' ; REPETER REP11 NBPROCHE ; VOISIN2 = 'DIFFERENCE' VOISIN2 ('MANUEL' 'POI1' PT2) ; PT2 = 'POINT' VOISIN2 'PROCHE' PT2 ; T_VOISIN.PT2 = 1 ; * (CE QUI IMPORTE SIMPLEMENT, C'EST QUE L'INDICE EXISTE) FIN REP11 ; FINSI; * T_LIAIS.PT1 = 1 ; * (CE QUI IMPORTE SIMPLEMENT, C'EST QUE L'INDICE EXISTE) * VOISIN8 = 'ELEMENT' VOLUM8 'APPUYE' 'LARGEMENT SUR' PT1 ; VOISIN1 = 'CHANGER' VOISIN8 'POI1' ; VOISIN1 = 'DIFFERENCE' VOISIN1 ('MANUEL' 'POI1' PT1) ; NBPROCHE = 'NBNOEUDS' VOISIN1 ; * * * RECHERCHE DE 3 POINTS VOISINS APPROXIMANT LE TRIEDRE DU REPERE: * --------------------------------------------------------------- * * On suppose que les elements massifs sont corrects; ce qui fait qu'ils * comprennent au moins 4 points (tetraedre) et que "VOISIN1" contient * au moins 3 points voisins formant un repere avec le point "PT1" comme * origine (repere non orthonorme, mais non degenere). K = 0 ; REPETER REP23 3 ; K = K + 1 ; I = 0 ; REPETER REP22 ; I = I + 1 ; SI (I > NBPROCHE) ; QUITTER REP22 ; FINSI; * PT2 = 'POINT' VOISIN1 I ; V12 = PT2 'MOINS' PT1 ; X. 1 = ('COORDONNEE' V12 1) ** 2 ; X. 2 = ('COORDONNEE' V12 2) ** 2 ; X. 3 = ('COORDONNEE' V12 3) ** 2 ; XYZ = (X. 1) + (X. 2) + (X. 3) ; * COS2 = X.K / XYZ ; SI (I 'EGA' 1) ; OXYZ.K.'PT' = PT2 ; OXYZ.K.'COS2' = COS2 ; SINON; SI (OXYZ.K.'COS2' < COS2) ; OXYZ.K.'PT' = PT2 ; OXYZ.K.'COS2' = COS2 ; FINSI; FINSI; * FIN REP22 ; SI (K < 3) ; * (risque inutile de plantage si K=3) VOISIN1 = 'DIFFERENCE' VOISIN1 ('MANUEL' 'POI1' OXYZ.K. 'PT') ; NBPROCHE = NBPROCHE - 1 ; FINSI; * FIN REP23 ; * * * CREATION DES 3 MATRICES ELEMENTAIRES DES ROTATIONS EN 1 POINT: * -------------------------------------------------------------- K = 0 ; REPETER REP33 3 ; K = K + 1 ; K2 = IND.(K + 1) ; K3 = IND.(K + 2) ; * P2 = OXYZ.K2.'PT' ; P3 = OXYZ.K3.'PT' ; COS2 = OXYZ.K2.'COS2' ; COS3 = OXYZ.K3.'COS2' ; * SI ( (COS2 > 0.999) 'ET' (COS3 > 0.999) ) ; * * si ( ega r1 'RY' ) ; mess ' on saute le point'; * list pt1; iterer rep33; finsi; D2 = ('COORDONNEE' P2 K2) - ('COORDONNEE' PT1 K2) ; D3 = ('COORDONNEE' P3 K3) - ('COORDONNEE' PT1 K3) ; DD1 = 2.D0 * D2 * D3 ; + D2 U2 P3 - D3 U3 P2 ; * SINON; * * CE N'EST PAS TOUT-A-FAIT "R1" DONT ON CONNAIT L'APPROXIMATION. * CE N'EST PAS TOUT-A-FAIT "U2" ET "U3" QU'IL FAUT UTILISER. V12 = P2 'MOINS' PT1 ; V13 = P3 'MOINS' PT1 ; D2 = 'NORME' V12 ; D3 = 'NORME' V13 ; DD0 = 2.D0 * D2 * D3 ; N1 = 'PVECTORIEL' V12 V13 ; N1 = N1 / ('NORME' N1) ; V12 = V12 / D2 ; V13 = V13 / D3 ; N2 = 'PVECTORIEL' V13 N1 ; N3 = 'PVECTORIEL' N1 V12 ; * n22 = n2 * d2; nn3= n3* d3; ndi3= nn3 'MOINS' n22; nndi3 = 'NORME' ndi3; ndi3 = ndi3 / nndi3; * cx cy cz = coor n1; *mess ' cx cy cz ' cx cy cz; * si ( (abs cy) > 0.999); mess ' on saute pour le point '; list pt1; * iterer rep33; finsi; * MAT1 = 'RELA' DD0 'ROTA' 'DIRECTION' N1 PT1 * + D2 'DEPL' 'DIRECTION' N2 P3 * - D2 'DEPL' 'DIRECTION' N2 PT1 * - D3 'DEPL' 'DIRECTION' N3 P2 * + D3 'DEPL' 'DIRECTION' N3 PT1 ; + D2 'DEPL' 'DIRECTION' N2 P3 - D3 'DEPL' 'DIRECTION' N3 P2 * FINSI; * SI INIT ; COQMASF = MAT1 ; INIT = FAUX ; SINON; COQMASF = COQMASF 'ET' MAT1 ; FINSI; * FIN REP33 ; * * SI (IP 'MULTIPLE' 100) ; * 'MENAGE' ; * FINSI; * FIN REP1 ; * 'MESSAGE' NBPT1 'noeuds de jonction entre massifs et coques.' ; NBPT2 = ('DIMENSION' T_LIAIS) - 1 ; SI (NBPT2 < NBPT1) ; 'MESSAGE' NBPT2 'noeuds lies en rotation.' ; FINSI; * 'OUBLIER' T_LIAIS ; 'OUBLIER' T_VOISIN ; 'OUBLIER' ENVELO4 ; 'OUBLIER' SOUDURE ; 'MENAGE' ; *+*'TASSER' 'NOOPT' ; * 'FINPROC' COQMASF ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales