1 #!/bin/sh -e 2 3 4 #==================================================================== 5 # TP3 : créer sa propre géométrie avec la bibliothèque CAO star-cad # 6 #==================================================================== 7 8 # Voir le TP1 pour la prise en main du système d'exploitation EDIX. 9 # Les commandes suivantes sont identiques à celles du début du TP1. 10 11 . /home/lafrier/star-build/local/etc/stardis.profile 12 mkdir TP3 13 cd TP3 14 15 # La variable d'environnement suivante simplifie l'accès aux exemples de 16 # CAO : 17 18 export SCAD_EX=/home/lafrier/demonstrateur_2/libs/star-cad-examples 19 20 # Dans les TPs précédents, on a vu que les géométries sont décrites par 21 # des stl. En ouvrir un pour voir ce que cela signifie. 22 # Ici le cube du premier TP. 23 24 cat /home/lafrier/Stardis-Starter-Pack-0.2.0/cube/solid.stl 25 26 # On voit plusieurs facet ... endfacet, qui correspondent à des triangles 27 # définis par 3 sommets et une normale sortante du triangle. Ces coordonnées 28 # nous indiquent aussi la position de cet objet dans la scène et sa taille. 29 # Il y a 12 triangles, qui correspondent bien à deux triangles pour chacune 30 # des six faces du cube. 31 32 # Pour une géométrie complexe, on n'aura pas envie d'écrire des maillages à 33 # la main. On présente ici une façon d'obtenir des stl pour stardis, à 34 # l'aide du logiciel starcad. 35 36 37 #=========================================================================== 38 # TP3 - Partie 1 : voir comment un simple cube est construit avec star-cad # 39 #=========================================================================== 40 41 ls "${SCAD_EX}" 42 mkdir star-cad-cube 43 cd star-cad-cube 44 45 # On l'exécute : 46 47 "${SCAD_EX}"/cube 48 49 # Observer tous les fichiers stl qui viennent d'être créés : 50 51 ls 52 53 # Visualiser avec Paraview : 54 55 paraview 56 57 # Open tous les fichiers stl du dossier star-cad-cube. 58 # C'est la même scène que le starter pack sur laquelle on a travaillé dans 59 # le TP1 : 60 # - un cube (solide), 61 # - des conditions limites : parois gauche et droite, autres parois (latérales) 62 63 # Exécuter stardis : 64 65 cp -r "${SCAD_EX}"/models/cube.txt model.txt 66 stardis -V 3 -M model.txt -p 0.5,0.5,0.5,INF -n 10000 67 68 # Ouvrir le fichier star-cad : 69 70 vim "${SCAD_EX}"/src/cube.c 71 72 # On décrit ici tout le fichier. Pour vous, l'objectif est de cibler où le 73 # modifier pour vos besoins. 74 75 # On décrit tout de même l'ensemble des étapes : 76 # - include : inclusion de la librairie starcad, qui définit toutes les 77 # fonctions commençant par `scad_` utilisées dans la suite 78 # Dans la fonction main : 79 # - initialisation du contexte : 80 # - les variables qui nous serons propres 81 # - starcad initialise ses propres variables : scad_initialize 82 83 # - La partie qui vous intéresse : la création du cube. 84 # Ici on a besoin de déterminer les bords du cube, on doit le faire via deux 85 # étapes pour obtenir une liste de faces. Ensuite on catégorise ces faces, 86 # on leur donne une sémantique (ici paroi gauche / droite / latérales). 87 # On fusionne les faces latérales pour avoir un seul objet à exporter 88 # ensuite. 89 90 # - option pour changer la taille des triangles dans le mesh 91 # - meshing : on passe de la géométrie décrite par des opérations 92 # mathématiques, par une représentation sous forme de maillage. 93 94 # - Export des différentes géométries dans des fichiers stl 95 # - suppression du contexte : 96 # - nettoyage des structures allouées 97 # - scad_finalize : contexte star-cad 98 99 100 #================================== 101 # TP3 - Partie 2 : maison cubique # 102 #================================== 103 104 cd .. 105 mkdir star-cad-house 106 cd star-cad-house 107 108 # On exécute le script pour créer la géométrie : 109 110 "${SCAD_EX}"/cubic_house 111 112 # Observer tous les fichiers stl qui viennent d'être créés : 113 114 ls 115 116 # Visualiser avec Paraview : 117 118 paraview 119 120 # Exécuter stardis : 121 122 cp -r "${SCAD_EX}"/models/cubic_house.txt model.txt 123 stardis -M model.txt -p 0,0,1.5 -n 10000 124 125 # Ouvrir le fichier pour observer sa structure : 126 127 vim "${SCAD_EX}"/src/cubic_house.c 128 129 # On observe les mêmes étapes que dans le cas précédent. 130 # Ici on voit de nouvelles fonctions pour définir les géométries qui sont plus 131 # complexes. On fait appel à des opérateurs de CAD. 132 # TODO : donner un pointeur vers un livre de CAO (voir avec Antoine). 133 134 # Exercice : 135 # Modifiez `src/cube.c` pour ajouter une boule au centre du cube, 136 # cette boule sera un solide à température imposée. 137 # Ici l'objectif est de créer avec starcad plusieurs fichiers stl : 138 # - un cube troué par une boule (solide) 139 # - une boule (solide à température imposée), 140 # - les parois gauche, droite et autres du cube (sur lesquelles seront 141 # appliquées des conditions limites). 142 143 # Pour cela : 144 # 1/ Dupliquez `src/cube.c` (voir procédure ci-dessous) ; 145 # 2/ Après la création du cube, ajoutez une boule en consultant l'API de 146 # starcad (fichier `/home/lafrier/star-build/local/include/star/scad.h`). 147 # Vous devrez pour cela définir de nouvelles variables. 148 # Attention, réglez les paramètres de la boule de sorte à ce qu'elle soit 149 # inclue strictement dans le cube. 150 # 3/ Réalisez une opération de découpe (`cut`) entre le cube et la boule 151 # pour obtenir un "cube troué". Vous pouvez vous aider de l'exemple 152 # `cubic_house.c` qui fait aussi appel à cette fonction. 153 # Lors de cette opération, la frontière commune (surface externe de la 154 # boule et surface interne du cube troué) est dupliquée : elle existe de 155 # façon distincte dans les deux représentations. 156 # 4/ Réalisez une partition de la scène afin d'identifier que cette 157 # frontière est commune, c'est la seule manière d'assurer que le maillage 158 # de cette frontière ensuite soit identique pour les deux objets (cube 159 # troué et boule). Pour cela, vous devez créer une liste en entrée de la 160 # fonction, qui contient les deux objets (cube troué et boule). Vous 161 # pouvez choisir flags = 0. 162 # Attention, la partition créé de nouveaux objets en sortie, il faut 163 # utiliser ceux-ci uniquement (ne plus utiliser les objets d'entrée de 164 # cette fonction). 165 # 5/ Exporter le maillage de la boule et du cube troué. 166 # 6/ Niveau avancé en C : pour aller plus loin, réalisez une libération 167 # explicite de la mémoire, si vous ne le faites pas, la fonction 168 # `scad_finalize` le fait déjà pour vous. 169 170 # La correction est donnée dans le fichier 171 # `${DEMONSTRATEUR_2}/TP3/src/2_starcad/mon_cube.c`. 172 # Le fichier `cube_modification_diff.txt` contient les lignes ajoutées au 173 # fichier originel `cube.c`. 174 175 cd .. 176 mkdir star-cad-exo-cube 177 cd star-cad-exo-cube 178 179 # Créez votre propre fichier : 180 181 cp "${SCAD_EX}"/src/cube.c ./mon_cube.c 182 183 # Compilation : 184 185 gcc mon_cube.c -o mon_cube -lscad -lrsys 186 187 # Voir l'exécutable mon_cube : 188 189 ls 190 191 # Exécution : 192 193 mkdir scene 194 cd scene 195 ../mon_cube 196 ls 197 198 # Vous devez observer que les fichiers stl ont été générés. 199 # Vous pouvez maintenant modifier `mon_cube.c` en implémentant les étapes 200 # 2 à 6, puis recompilez et exécutez. 201 202 # Une fois l'exercice réalisé, visualisez le maillage du cube troué : 203 204 paraview 205 206 # Vous devriez avoir un résultat semblable à l'image ci-dessous en chargeant 207 # 1 seul stl correspondant au cube troué : 208 209 feh "${DEMONSTRATEUR_2}"/Figures/tp3_boule_dans_cube.png 210 211 # Afin de lancer un calcul stardis sur cette scène, copiez le fichier : 212 213 cp "${SCAD_EX}"/models/cube.txt model.txt 214 215 # Ajoutez la ligne suivante après la description du cube et placer le point 216 # sonde dans le volume du cube troué (hors de la boule) : 217 218 vim model.txt 219 # SOLID BOULE 0.1 25 2 0.01 280 280 0 FRONT boule.stl 220 stardis -M model.txt -p 0.99,0.99,0.99 221 222 # Dans cet exercice, nous faisons le choix de mettre une boule solide afin 223 # que le système soit le plus simple possible à décrire. Comme dans le TP1, 224 # une boule fluide nécessite de décrire la connexion solide / fluide. 225 226 # Explication du concept de partition : 227 # La partition est un opérateur qui permet d'identifier différentes composantes 228 # et de garantir des frontières communes entre elles quand elles existent. 229 # On donne ici un exemple sur la scène suivante, composée d'un carré et d'un 230 # cercle en intersection : 231 # __________ 232 # | _|_ 233 # | / | \ 234 # | | | | 235 # | \ _|_ / 236 # |__________| 237 # 238 # Les deux géométries d'entrée sont : 239 # __________ _ _ 240 # | | / \ 241 # | | | | 242 # | | \ _ _ / 243 # | | 244 # |__________| 245 # 246 # En interne, trois composantes seront identifiées, ainsi qu'une arête commune : 247 # __________ 248 # |1 _|_ 249 # | / | \ 250 # | |2 | 3| 251 # | \ _|_ / 252 # |__________| 253 # 254 # En sortie, renvoie le même nombre de géométries, où chacune aggrège des 255 # composantes pour former la même surface que la géométrie d'entrée. 256 # __________ _ _ 257 # | _| / | \ 258 # | / | | | | 259 # | | | \ _|_ / 260 # | \ _| 261 # |__________| 262 # 263 264 # Pour aller plus loin : 265 # ---------------------- 266 # Vous pouvez consulter la ferme de ROFFIAC : 267 268 cd ../.. 269 mkdir star-cad-farm 270 cd star-cad-farm 271 272 # On exécute le script pour créer la géométrie : 273 274 "${SCAD_EX}"/roffiac_farm 275 276 # Observer tous les fichiers stl qui viennent d'être créés : 277 278 ls 279 280 # Visualiser avec Paraview : 281 282 paraview 283 284 # Exécuter stardis : 285 286 cp -r "${SCAD_EX}"/models/roffiac_farm.txt model.txt 287 stardis -M model.txt -p 0,0,1.5 -n 10000 288 289 # Ouvrir le fichier pour observer sa structure : 290 291 vim "${SCAD_EX}"/src/roffiac_farm.c 292 293 # On observe les mêmes étapes que dans le cas précédent. 294 295 296 #============================================ 297 # TP3 - Partie 3 : import d'un fichier step # 298 #============================================ 299 300 cd .. 301 302 # Présenter le cas d'application d'Antoine, juste être en capacité de 303 # comprendre les instructions de CAO. Il a un canal dans lequel il y a un fluide 304 # et des MOS FET sources de puissance volumique. Il a déjà des fichiers ".stp" 305 # issus de logiciels de CAO standards. Il souhaite importer et "découper" le 306 # fluide en différentes bandes sur lesquelles des températures moyennes seront 307 # calculées. Côté géométrie, il défini donc un rectangle qui permet de faire 308 # cette découpe, il supprime cet outil avant de faire l'étape de maillage. 309 # Les étapes sont les suivantes : 310 # - initialisation du contexte 311 # - import du step de la géométrie composé de plusieurs volumes 312 # (6 MOS FET + canal) 313 # - partitionnement 314 # - import du step contenant le fluide 315 # - création de l'outil de découpe (parallélépipède) 316 # - création des n tronçons de géométrie 317 # - suppression des éléments inutilés (à ne pas mailler) : l'outil de découpe 318 # et le fluide 319 # - création de la liste des objets à partitionner 320 # - partitionnement 321 # - identification des différents éléments (sapphire et MOS) 322 # - maillage 323 # - export des différents éléments 324 # - extraction des surfaces sur lesquelles des conditions limites sont 325 # appliquées (parties externes du canal) ; une sémantique leur est attribuée 326 # en fonction de la position du centre de masse 327 # - calcul de l'aire des MOS 328 # - fusion de faces qui auront la même condition limite 329 # - export de ces géométries sur lesquelles seront appliquées des conditions 330 # limites 331 # - écriture automatique du fichier de description de la scène pour stardis 332 # - libération de la mémoire allouée 333 334 mkdir star-cad-electronique 335 cd star-cad-electronique 336 337 # Les fichiers suivants sont copiés dans le répertoire courant, 338 # car le code scad_sliced-geometry en a besoin et qu'il n'y a pas de mécanisme 339 # en place pour spécifier ce chemin de façon absolue. 340 341 cp "${DEMONSTRATEUR_2}"/libs/scad_sliced-geometry/starcad_learning.stp . 342 cp "${DEMONSTRATEUR_2}"/libs/scad_sliced-geometry/starcad_learning_fluid.stp . 343 "${DEMONSTRATEUR_2}"/libs/scad_sliced-geometry/fragments_n.exe 344 ls 345 346 # Lire le code en observant les différentes étapes décrites ci-dessus 347 348 vim "${DEMONSTRATEUR_2}"/libs/scad_sliced-geometry/fragments_n.c 349 350 # Le fichier d'entrée de stardis "stardis_entry.txt" prévoit que les fichiers 351 # stl soient placés dans des répertoires. (scad_sliced-geometry - tag 0.0.1) 352 # On l'édite pour supprimer ces dossiers. 353 354 sed -e 's/MOS\///g; s/canal_frags_n\///g' -i stardis_entry.txt 355 356 # Lancer stardis pour vérifier que la géométrie est bien conforme 357 # On voit que le calcul va bien au bout, ici une température moyenne de la 358 # surface indexée 0 du canal intérieur. Le calcul est long car les chemins 359 # sont piégés. Dans la thèse d'Antoine, une autre méthode de Monte-Carlo est 360 # développée (dite avec rebonds) mais n'est pas présentée ici. 361 362 stardis -M stardis_entry.txt -s canal_int_0.stl -n 1000 363 364 365 #================================== 366 # TP3 - Partie 4 : city generator # 367 #================================== 368 369 # Description de city generator : 370 # C'est un outil de génération procédurale permettant la construction de la 371 # géométrie d'une ville à partir d'un cadastre (empreinte au sol et hauteur 372 # des batiments). Les modes constructifs contrôlent des propriétés des 373 # batiments comme la présence d'isolations et de fenêtres par exemple. 374 # Les catalogues décrivent eux les propriétés des batiments comme 375 # l'épaisseur de chaque isolant, la proportion de fenêtres, l'épaisseur de 376 # la dalle, etc. 377 378 # Dans cet exercice, nous voyons comment paramétrer sa propre ville. 379 380 381 # Partie 4.1 : un exemple concret, l'île du Ramier pour le projet ANR MC2 382 # (porté par C. Caliot du LMAP) 383 # ----------------------------------------------------------------------- 384 385 cd .. 386 387 # Voir la scène de l'île du Ramier : 388 389 paraview "${DEMONSTRATEUR_2}"/TP3/src/script_paraview_ile_ramier.py 390 391 # Vous devez observer quelque chose de similaire à l'image suivante : 392 393 feh "${DEMONSTRATEUR_2}"/Figures/tp3_ile_du_ramier_geometrie.png 394 395 # Vous pouvez jouer avec la caméra pour tester différents points de vue. 396 # C'est cette description de la scène qui est utilisée ensuite pour le calcul 397 # stardis. Si le script ne fonctionne pas, lancer `paraview` puis visualiser 398 # B_BUILDING.stl du dossier '${DEMONSTRATEUR_2}/data/ile_du_ramier' 399 400 # Lancer le calcul d'une image infrarouge : 401 402 stardis -V 3 -M "${DEMONSTRATEUR_2}"/data/ile_du_ramier/idr.txt \ 403 -R file=idr2.ht:fov=30:pos=1730,70,50:tgt=900,800,-250:img=500x500:spp=2 404 405 # Produire une image infrarouge à partir du fichier idr2.ht : 406 407 htpp -v -f -m default -o idr2.ppm idr2.ht 408 409 # Visualiser l'image infrarouge : 410 411 feh idr2.ppm 412 413 # La même image est disponible dans l'énoncé avec beaucoup plus de 414 # réalisations par pixel : 415 416 feh "${DEMONSTRATEUR_2}"/Figures/ile_du_ramier_2048_spp.png 417 418 # Dans cet exercice, la géométrie vous a été donnée, elle a été obtenue 419 # grâce à city_generator. Dans la suite, afin de réduire le temps de 420 # calcul de la géométrie, on prend une scène plus modeste (4 batiments 421 # mitoyens). 422 423 # Partie 4.2 : découverte de city_generator et du mode constructif 0 424 # ------------------------------------------------------------------ 425 426 mkdir city_generator_mode_0 427 cd city_generator_mode_0 428 429 # Description de la scène : 430 431 city_generator2 \ 432 -m "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/4_buildings_mode_0/nc3.yaml \ 433 -c \ 434 "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/4_buildings_mode_0/catalog0.yaml \ 435 -V 3 436 437 # Observer les stl créés : 438 439 ls 440 441 # Produire le fichier model.txt de façon automatique, via le script suivant. 442 # Pour éviter de décrire chaque batiment, on fusionne les murs ensemble, les 443 # cavités ensemble et on donne à ces groupes les mêmes propriétés. 444 # Le script propose des paramètres par défaut à ces propriétés physiques. 445 446 sh "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/make_stardis_model.sh \ 447 > model.txt 2> /dev/null 448 449 # Editer le fichier model.txt, pour changer TRAD à 240 par exemple. 450 # L'objectif est de voir que c'est le même type de fichiers que d'habitude : 451 # vous auriez pu l'écrire à la main ... Sinon jetez un coup d'oeil au TP1 :-) 452 453 paraview 454 455 # Chargez les fichiers STL préfixés par `S_`. Vous observez quelque chose 456 # comme : 457 458 feh "${DEMONSTRATEUR_2}"/Figures/tp3_city_generator_mode_0_geometrie.png 459 460 # On génère maintenant une image infrarouge de cette scène : 461 462 stardis -V 3 -M model.txt \ 463 -R file=idr2.ht:fov=30:pos=22,-17,20:tgt=4,5,6.5:img=500x500:spp=16 464 htpp -v -f -m gnuplot:range=260,285 idr2.ht | gnuplot - > idr2.png 465 feh idr2.png 466 467 # Observer l'impact du manque d'isolant sur l'image infrarouge des batiments. 468 469 # Si vous n'avez pas pu générer l'image : 470 471 feh "${DEMONSTRATEUR_2}"/Figures/tp3_city_generator_mode_0_rendu_128_spp.png 472 473 # Analyse de l'image : 474 # Les recoins occultent le ciel, ce qui explique la couleur. 475 # Deuxième effet, le mur est plus chaud ici parce que les deux pièces sont 476 # chaudes. C'est un effet connu pour les batiments mitoyens. 477 478 cd .. 479 480 481 # Partie 4.3 : mode constructif 1 avec fenêtre et isolants 482 # -------------------------------------------------------- 483 484 mkdir city_generator_mode_1 485 cd city_generator_mode_1 486 487 # Afin de lancer en mode 1 qui présente une isolation : 488 489 city_generator2 -m \ 490 "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/4_buildings_mode_1/nc3.yaml \ 491 -c \ 492 "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/4_buildings_mode_1/catalog1.yaml \ 493 -V 3 494 495 # Observer les stl créés : 496 497 ls 498 499 # Produire le fichier model.txt de façon automatique : 500 501 sh "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/make_stardis_model.sh \ 502 > model.txt 2> /dev/null 503 504 # Aller éditer le fichier model.txt pour changer TRAD à 240 par exemple. 505 506 paraview 507 508 # Chargez les fichiers STL préfixés par `S_`. Vous observez quelque chose 509 # comme : 510 511 feh "${DEMONSTRATEUR_2}"/Figures/tp3_city_generator_mode_1_geometrie.png 512 513 # Chargez l'ensemble des stl commençant par `S_`. Observer la présence de 514 # fenêtres dans ce mode constructif, d'une dalle de fondation et d'isolants. 515 # On vous demandera dans l'exercice suivant de modifier ces propriétés. 516 517 stardis -V 3 -M model.txt \ 518 -R file=idr2.ht:fov=30:pos=22,-17,20:tgt=4,5,6.5:img=500x500:spp=16 519 htpp -v -f -m gnuplot:range=260,285 idr2.ht | gnuplot - > idr2.png 520 feh idr2.png 521 522 # Si vous n'avez pas pu générer l'image : 523 524 feh "${DEMONSTRATEUR_2}"/Figures/tp3_city_generator_mode_1_rendu_128_spp.png 525 526 # Observer l'impact des isolants sur l'image infrarouge, noter que le batiment 527 # le plus présente une forte perte par sa toiture. 528 529 cd .. 530 531 532 # Partie 4.4 : Exercice, ajouter une isolation à la toiture du batiment 533 # le plus haut 534 # --------------------------------------------------------------------- 535 536 cp -r "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/4_buildings_mode_1 \ 537 city_generator_exercice 538 cd city_generator_exercice 539 540 # Démarche : 541 # Identifier le batiment dans la scène : 542 543 cat nc3.yaml 544 545 # Le batiment le plus haut (height = 13) correspond à l'identifiant "bat_1". 546 # Il utilise les propriétés nommées "b1" dans le catalogue. 547 # Il faut donc modifier les propriétés de "b1" dans le catalogue : 548 549 vim catalog1.yaml 550 551 # catalog1.yaml 552 # - name: b1 553 # roof_insulation_thickness: 0.5 554 555 # Ces modifications sont dans données dans le dossier de correction. 556 557 # Générer la géométrie : 558 559 city_generator2 -m nc3.yaml -c catalog1.yaml -V 3 560 561 # Générer la description du système pour stardis : 562 563 sh "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/make_stardis_model.sh \ 564 > model.txt 2> /dev/null 565 566 # Lancer stardis : 567 568 stardis -V 3 -M model.txt -R file=idr2.ht:fov=30:pos=22,-17,20:tgt=4,5,6.5:img=500x500:spp=16 569 570 # Convertir le résultat en image : 571 572 htpp -v -f -m gnuplot:range=260,285 idr2.ht | gnuplot - > idr2.png 573 feh idr2.ppm 574 575 # Si vous n'avez pas pu générer l'image : 576 577 feh "${DEMONSTRATEUR_2}"/Figures/tp3_city_generator_exercice_rendu_128_spp.png 578 579 # Comparer cette image avec la précédente. 580 581 feh ../city_generator_mode_1/idr2.png 582 583 # Vous devez observer que l'isolant a bien été ajouté et qu'il y a donc moins 584 # de perte par cette toiture.