Download coller.procedur

Back to the list

   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