1 : * COLLER PROCEDUR CHAT 04/01/15 21:15:02 4784 2 : * 3 : ************************************************************************ 4 : * 5 : * C O L L E R 6 : * ----------- 7 : * 8 : * FONCTION: 9 : * --------- 10 : * 11 : * DEFINIR DES JONCTIONS COQUE-MASSIF OU POUTRE-MASSIF EN 3D. 12 : * 13 : * C'est aussi un moyen de generer les valeurs de rotation sur un 14 : * ensemble de noeuds appartenant a des elements massifs. 15 : * 16 : * PHRASE D'APPEL: 17 : * --------------- 18 : * 19 : * COQMASF = COLLER VOLUM8 SURF4 ('SOUPLE') ; 20 : * 21 : * OPERANDES: 22 : * ---------- 23 : * 24 : * VOLUM8 "MAILLAGE" ZONE VOLUMIQUE. 25 : * SURF4 "MAILLAGE" ZONE MODELISEE EN COQUES OU POUTRES, ou 26 : * ensemble de points de l'enveloppe de 27 : * "VOLUM8" sur lesquels on veut connaitre les 28 : * rotations. 29 : * 'SOUPLE' "MOT " MOT-CLE DEMANDANT UNE CERTAINE SOUPLESSE A 30 : * LA "COLLE": ON NE DEFINIT LA JONCTION QU'EN 31 : * 1 POINT SUR 2. 32 : * 33 : * RESULTATS: 34 : * ---------- 35 : * 36 : * COQMASF "RIGIDITE" Matrice definissant des rotations sur 37 : * l'enveloppe des massifs. 38 : * A adjoindre a la Matrice de Rigidite. 39 : * 40 : * REMARQUES: 41 : * ---------- 42 : * 43 : * L'OPTION "SOUPLE" A ETE INTRODUITE POUR CONTRE-BALANCER LA 44 : * RAIDEUR EXCESSIVE D'UN MAILLAGE TROP GROSSIER. 45 : * L'EFFET DE L'OPTION "SOUPLE" EST AUSSI FACILE A QUANTIFIER QUE 46 : * CELUI DES GROSSES MAILLES ... 47 : * 48 : * MODE DE FONCTIONNEMENT: 49 : * ----------------------- 50 : * 51 : * UNE ROTATION EST APPROXIMEE PAR LES DEPLACEMENTS RELATIFS DE 52 : * POINTS DU VOLUME QUI SONT VOISINS DU NOEUD CONSIDERE. 53 : * PLUS FACILE A DIRE QU'A FAIRE ... 54 : * 55 : * VARIABLES: 56 : * ---------- 57 : * 58 : * OXYZ = TABLE DE 3 POINTS VOISINS DU POINT COURANT "P1" ET QUI 59 : * REPRESENTENT AU MIEUX LE TRIEDRE LOCAL PARALLELE AU 60 : * REPERE GENERAL. 61 : * OXYZ.K.'PT' = POINT "P2" TEL QUE P1P2 EST UNE BONNE 62 : * APPROXIMATION DE LA DIRECTION "K". 63 : * OXYZ.K.'COS2' = VALEUR D'AUTANT PLUS PROCHE DE 1 QUE 64 : * L'APPROXIMATION DE LA DIRECTION "K" EST 65 : * BONNE. 66 : * 67 : 'DEBPROC' COLLER VOLUM8*'MAILLAGE' SURF4*'MAILLAGE' OPT/'MOT'; 68 : OXYZ = 'TABLE' ; 69 : OXYZ. 1 = 'TABLE' ; 70 : OXYZ. 2 = 'TABLE' ; 71 : OXYZ. 3 = 'TABLE' ; 72 : UX = 'MOT' 'UX' ; 73 : UY = 'MOT' 'UY' ; 74 : UZ = 'MOT' 'UZ' ; 75 : RX = 'MOT' 'RX' ; 76 : RY = 'MOT' 'RY' ; 77 : RZ = 'MOT' 'RZ' ; 78 : IND = 'TABLE' ; 79 : IND. 1 = 1 ; 80 : IND. 2 = 2 ; 81 : IND. 3 = 3 ; 82 : IND. 4 = 1 ; 83 : IND. 5 = 2 ; 84 : DEP = 'TABLE' ; 85 : DEP. 1 = 'MOT' UX ; 86 : DEP. 2 = 'MOT' UY ; 87 : DEP. 3 = 'MOT' UZ ; 88 : ROT = 'TABLE' ; 89 : ROT. 1 = 'MOT' RX ; 90 : ROT. 2 = 'MOT' RY ; 91 : ROT. 3 = 'MOT' RZ ; 92 : * 93 : * AUTEUR, DATE DE CREATION: 94 : * ------------------------- 95 : * 96 : * P. MANIGOT 28 JUIN 1989 97 : * REPRISE: P.M. 05/09/89 98 : * P.M. 09/02/90: "AXE" enleve. PSCAL --> COORD 99 : * P.M. 19/02/90: durcissement du test ">0.99" 100 : * P.M. 19/03/90: utilisation de "RELA ... DIRECTION" 101 : * P.M. 22/10/91: correction pour elements de volume dont les aretes 102 : * sont a 45› par rapport aux axes du repere general. 103 : * P.M. 24/03/92: mise en commentaire brutale de TASSER qui pose des 104 : * problemes. A arranger plus tard. 105 : * 106 : ************************************************************************ 107 : * 108 : SI = 'MOT' 'SI' ; SINON = 'MOT' 'SINON' ; FINSI = 'MOT' 'FINSI' ; 109 : REPETER = 'MOT' 'REPETER'; QUITTER = 'MOT' 'QUITTER'; FIN = 'MOT' 'FIN'; 110 : * 111 : * 112 : INIT = VRAI ; 113 : X = 'TABLE' ; 114 : * INITIALISATION DE LA LISTE DES POINTS SUR LESQUELS ONT ETE DEFINIES 115 : * LES ROTATIONS: 116 : T_LIAIS = 'TABLE' 'liaison' ; 117 : * INITIALISATION DE LA LISTE DES POINTS "VOISINS" UTILISES POUR DEFINIR 118 : * LES ROTATIONS: 119 : T_VOISIN = 'TABLE' 'voisin' ; 120 : * 121 : * 122 : SOUPLE = 'EXISTE' OPT ; 123 : SI SOUPLE ; 124 : SOUPLE = 'EGA' OPT 'SOUPLE' ; 125 : FINSI; 126 : * 127 : ENVELO4 = 'ENVELOPPE' VOLUM8 ; 128 : SURF1 = 'CHANGER' SURF4 'POI1' ; 129 : SOUDURE = 'ELEMENTS' SURF1 'APPUYES' 'LARGEMENT SUR' ENVELO4 ; 130 : 'OUBLIER' SURF1 ; 131 : NBPT1 = 'NBNOEUDS' SOUDURE ; 132 : * 133 : * 134 : * BOUCLE SUR TOUS LES POINTS DE L'INTERSECTION: 135 : * --------------------------------------------- 136 : IP = 0 ; 137 : REPETER REP1 NBPT1 ; 138 : IP = IP + 1 ; 139 : PT1 = 'POINT' SOUDURE IP ; 140 : * 141 : SI SOUPLE ; 142 : * CAS DE LIAISON 1 SUR 2 : 143 : SI ('EXISTE' T_VOISIN PT1) ; 144 : * "PT1", VOISIN D'UN POINT LIE EN ROTATION, DOIT ETRE SAUTE. 145 : 'ITERER' REP1 ; 146 : FINSI; 147 : PT2 = 'POINT' ('DIFFERENCE' SOUDURE ('MANUEL' 'POI1' PT1)) 148 : 'PROCHE' PT1 ; 149 : SI ('EXISTE' T_LIAIS PT2) ; 150 : 'ITERER' REP1 ; 151 : FINSI; 152 : * 153 : * ON REPERTORIE A PEU PRES LES NOEUDS VOISINS: 154 : VOISIN4 = 'ELEMENT' ENVELO4 'APPUYE' 'LARGEMENT SUR' PT1 ; 155 : NBPROCHE = 'NBELEM' VOISIN4 ; 156 : NBPROCHE = 'MINIMUM' ('LECT' NBPROCHE 4) ; 157 : PT2 = PT1 ; 158 : VOISIN2 = 'CHANGER' VOISIN4 'POI1' ; 159 : REPETER REP11 NBPROCHE ; 160 : VOISIN2 = 'DIFFERENCE' VOISIN2 ('MANUEL' 'POI1' PT2) ; 161 : PT2 = 'POINT' VOISIN2 'PROCHE' PT2 ; 162 : T_VOISIN.PT2 = 1 ; 163 : * (CE QUI IMPORTE SIMPLEMENT, C'EST QUE L'INDICE EXISTE) 164 : FIN REP11 ; 165 : FINSI; 166 : * 167 : T_LIAIS.PT1 = 1 ; 168 : * (CE QUI IMPORTE SIMPLEMENT, C'EST QUE L'INDICE EXISTE) 169 : * 170 : VOISIN8 = 'ELEMENT' VOLUM8 'APPUYE' 'LARGEMENT SUR' PT1 ; 171 : VOISIN1 = 'CHANGER' VOISIN8 'POI1' ; 172 : VOISIN1 = 'DIFFERENCE' VOISIN1 ('MANUEL' 'POI1' PT1) ; 173 : NBPROCHE = 'NBNOEUDS' VOISIN1 ; 174 : * 175 : * 176 : * RECHERCHE DE 3 POINTS VOISINS APPROXIMANT LE TRIEDRE DU REPERE: 177 : * --------------------------------------------------------------- 178 : * 179 : * On suppose que les elements massifs sont corrects; ce qui fait qu'ils 180 : * comprennent au moins 4 points (tetraedre) et que "VOISIN1" contient 181 : * au moins 3 points voisins formant un repere avec le point "PT1" comme 182 : * origine (repere non orthonorme, mais non degenere). 183 : K = 0 ; 184 : REPETER REP23 3 ; 185 : K = K + 1 ; 186 : I = 0 ; 187 : REPETER REP22 ; 188 : I = I + 1 ; 189 : SI (I > NBPROCHE) ; QUITTER REP22 ; FINSI; 190 : * 191 : PT2 = 'POINT' VOISIN1 I ; 192 : V12 = PT2 'MOINS' PT1 ; 193 : X. 1 = ('COORDONNEE' V12 1) ** 2 ; 194 : X. 2 = ('COORDONNEE' V12 2) ** 2 ; 195 : X. 3 = ('COORDONNEE' V12 3) ** 2 ; 196 : XYZ = (X. 1) + (X. 2) + (X. 3) ; 197 : * 198 : COS2 = X.K / XYZ ; 199 : SI (I 'EGA' 1) ; 200 : OXYZ.K.'PT' = PT2 ; 201 : OXYZ.K.'COS2' = COS2 ; 202 : SINON; 203 : SI (OXYZ.K.'COS2' < COS2) ; 204 : OXYZ.K.'PT' = PT2 ; 205 : OXYZ.K.'COS2' = COS2 ; 206 : FINSI; 207 : FINSI; 208 : * 209 : FIN REP22 ; 210 : SI (K < 3) ; 211 : * (risque inutile de plantage si K=3) 212 : VOISIN1 = 'DIFFERENCE' VOISIN1 ('MANUEL' 'POI1' OXYZ.K. 'PT') ; 213 : NBPROCHE = NBPROCHE - 1 ; 214 : FINSI; 215 : * 216 : FIN REP23 ; 217 : 218 : * 219 : * 220 : * CREATION DES 3 MATRICES ELEMENTAIRES DES ROTATIONS EN 1 POINT: 221 : * -------------------------------------------------------------- 222 : K = 0 ; 223 : REPETER REP33 3 ; 224 : K = K + 1 ; 225 : K2 = IND.(K + 1) ; 226 : K3 = IND.(K + 2) ; 227 : * 228 : P2 = OXYZ.K2.'PT' ; 229 : P3 = OXYZ.K3.'PT' ; 230 : R1 = 'MOT' ROT.K ; 231 : U2 = 'MOT' DEP.K2 ; 232 : U3 = 'MOT' DEP.K3 ; 233 : COS2 = OXYZ.K2.'COS2' ; 234 : COS3 = OXYZ.K3.'COS2' ; 235 : * 236 : SI ( (COS2 > 0.999) 'ET' (COS3 > 0.999) ) ; 237 : * 238 : 239 : * si ( ega r1 'RY' ) ; mess ' on saute le point'; 240 : * list pt1; iterer rep33; finsi; 241 : D2 = ('COORDONNEE' P2 K2) - ('COORDONNEE' PT1 K2) ; 242 : D3 = ('COORDONNEE' P3 K3) - ('COORDONNEE' PT1 K3) ; 243 : DD1 = 2.D0 * D2 * D3 ; 244 : MAT1 = 'RELA' DD1 R1 PT1 - D2 U2 PT1 + D3 U3 PT1 245 : + D2 U2 P3 - D3 U3 P2 ; 246 : 247 : * 248 : SINON; 249 : * 250 : * CE N'EST PAS TOUT-A-FAIT "R1" DONT ON CONNAIT L'APPROXIMATION. 251 : * CE N'EST PAS TOUT-A-FAIT "U2" ET "U3" QU'IL FAUT UTILISER. 252 : V12 = P2 'MOINS' PT1 ; 253 : V13 = P3 'MOINS' PT1 ; 254 : D2 = 'NORME' V12 ; 255 : D3 = 'NORME' V13 ; 256 : DD0 = 2.D0 * D2 * D3 ; 257 : N1 = 'PVECTORIEL' V12 V13 ; 258 : N1 = N1 / ('NORME' N1) ; 259 : V12 = V12 / D2 ; 260 : V13 = V13 / D3 ; 261 : N2 = 'PVECTORIEL' V13 N1 ; 262 : N3 = 'PVECTORIEL' N1 V12 ; 263 : * 264 : 265 : n22 = n2 * d2; 266 : nn3= n3* d3; 267 : ndi3= nn3 'MOINS' n22; 268 : nndi3 = 'NORME' ndi3; 269 : ndi3 = ndi3 / nndi3; 270 : * cx cy cz = coor n1; 271 : *mess ' cx cy cz ' cx cy cz; 272 : * si ( (abs cy) > 0.999); mess ' on saute pour le point '; list pt1; 273 : * iterer rep33; finsi; 274 : 275 : * MAT1 = 'RELA' DD0 'ROTA' 'DIRECTION' N1 PT1 276 : * + D2 'DEPL' 'DIRECTION' N2 P3 277 : * - D2 'DEPL' 'DIRECTION' N2 PT1 278 : * - D3 'DEPL' 'DIRECTION' N3 P2 279 : * + D3 'DEPL' 'DIRECTION' N3 PT1 ; 280 : MAT1 = 'RELA' DD0 'ROTA' 'DIRECTION' N1 PT1 281 : + D2 'DEPL' 'DIRECTION' N2 P3 282 : - D3 'DEPL' 'DIRECTION' N3 P2 283 : + nndi3 'DEPL' 'DIRECTION' ndi3 pt1; 284 : * 285 : FINSI; 286 : * 287 : SI INIT ; 288 : COQMASF = MAT1 ; 289 : INIT = FAUX ; 290 : SINON; 291 : COQMASF = COQMASF 'ET' MAT1 ; 292 : FINSI; 293 : * 294 : FIN REP33 ; 295 : * 296 : * SI (IP 'MULTIPLE' 100) ; 297 : * 'MENAGE' ; 298 : * FINSI; 299 : * 300 : FIN REP1 ; 301 : * 302 : 'MESSAGE' NBPT1 'noeuds de jonction entre massifs et coques.' ; 303 : NBPT2 = ('DIMENSION' T_LIAIS) - 1 ; 304 : SI (NBPT2 < NBPT1) ; 305 : 'MESSAGE' NBPT2 'noeuds lies en rotation.' ; 306 : FINSI; 307 : * 308 : 'OUBLIER' T_LIAIS ; 309 : 'OUBLIER' T_VOISIN ; 310 : 'OUBLIER' ENVELO4 ; 311 : 'OUBLIER' SOUDURE ; 312 : 'MENAGE' ; 313 : *+*'TASSER' 'NOOPT' ; 314 : * 315 : 'FINPROC' COQMASF ; 316 :
© Cast3M 2003 - All rights reserved.
Disclaimer