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.