TP3 : créer sa propre géométrie avec la bibliothèque CAO star-cad
Voir le TP1 pour la prise en main du système d'exploitation EDIX.
Les commandes suivantes sont identiques à celles du début du TP1.
. /home/lafrier/star-build/local/etc/stardis.profile
mkdir TP3
cd TP3
La variable d'environnement suivante simplifie l'accès aux exemples de
CAO :
export SCAD_EX=/home/lafrier/demonstrateur_2/libs/star-cad-examples
Dans les TPs précédents, on a vu que les géométries sont décrites par
des stl. En ouvrir un pour voir ce que cela signifie.
Ici le cube du premier TP.
cat /home/lafrier/Stardis-Starter-Pack-0.2.0/cube/solid.stl
On voit plusieurs facet ... endfacet, qui correspondent à des triangles
définis par 3 sommets et une normale sortante du triangle. Ces coordonnées
nous indiquent aussi la position de cet objet dans la scène et sa taille.
Il y a 12 triangles, qui correspondent bien à deux triangles pour chacune
des six faces du cube.
Pour une géométrie complexe, on n'aura pas envie d'écrire des maillages à
la main. On présente ici une façon d'obtenir des stl pour stardis, à
l'aide du logiciel starcad.
TP3 - Partie 1 : voir comment un simple cube est construit avec star-cad
ls "${SCAD_EX}"
mkdir star-cad-cube
cd star-cad-cube
On l'exécute :
"${SCAD_EX}"/cube
Observer tous les fichiers stl qui viennent d'être créés :
ls
Visualiser avec Paraview :
paraview
Open tous les fichiers stl du dossier star-cad-cube.
C'est la même scène que le starter pack sur laquelle on a travaillé dans
le TP1 :
- un cube (solide),
- des conditions limites : parois gauche et droite, autres parois (latérales)
Exécuter stardis :
cp -r "${SCAD_EX}"/models/cube.txt model.txt
stardis -V 3 -M model.txt -p 0.5,0.5,0.5,INF -n 10000
Ouvrir le fichier star-cad :
vim "${SCAD_EX}"/src/cube.c
On décrit ici tout le fichier. Pour vous, l'objectif est de cibler où le
modifier pour vos besoins.
On décrit tout de même l'ensemble des étapes :
include : inclusion de la librairie starcad, qui définit toutes les
fonctions commençant parscad_utilisées dans la suite
Dans la fonction main :initialisation du contexte :
- les variables qui nous serons propres
- starcad initialise ses propres variables : scad_initialize
La partie qui vous intéresse : la création du cube.
Ici on a besoin de déterminer les bords du cube, on doit le faire via deux
étapes pour obtenir une liste de faces. Ensuite on catégorise ces faces,
on leur donne une sémantique (ici paroi gauche / droite / latérales).
On fusionne les faces latérales pour avoir un seul objet à exporter
ensuite.option pour changer la taille des triangles dans le mesh
meshing : on passe de la géométrie décrite par des opérations
mathématiques, par une représentation sous forme de maillage.Export des différentes géométries dans des fichiers stl
suppression du contexte :
- nettoyage des structures allouées
- scad_finalize : contexte star-cad
TP3 - Partie 2 : maison cubique
cd ..
mkdir star-cad-house
cd star-cad-house
On exécute le script pour créer la géométrie :
"${SCAD_EX}"/cubic_house
Observer tous les fichiers stl qui viennent d'être créés :
ls
Visualiser avec Paraview :
paraview
Exécuter stardis :
cp -r "${SCAD_EX}"/models/cubic_house.txt model.txt
stardis -M model.txt -p 0,0,1.5 -n 10000 -V 3
Ouvrir le fichier pour observer sa structure :
vim "${SCAD_EX}"/src/cubic_house.c
On observe les mêmes étapes que dans le cas précédent.
Ici on voit de nouvelles fonctions pour définir les géométries qui sont plus
complexes. On fait appel à des opérateurs de CAD.
TODO : donner un pointeur vers un livre de CAO (voir avec Antoine).
Exercice :
Modifiez src/cube.c pour ajouter une boule au centre du cube,
cette boule sera un solide à température imposée.
Ici l'objectif est de créer avec starcad plusieurs fichiers stl :
- un cube troué par une boule (solide)
- une boule (solide à température imposée),
- les parois gauche, droite et autres du cube (sur lesquelles seront
appliquées des conditions limites).
Pour cela :
1/ Dupliquez src/cube.c (voir procédure ci-dessous) ;
2/ Après la création du cube, ajoutez une boule en consultant l'API de
starcad (fichier /home/lafrier/star-build/local/include/star/scad.h).
Vous devrez pour cela définir de nouvelles variables.
Attention, réglez les paramètres de la boule de sorte à ce qu'elle soit
inclue strictement dans le cube.
3/ Réalisez une opération de découpe (cut) entre le cube et la boule
pour obtenir un "cube troué". Vous pouvez vous aider de l'exemple
cubic_house.c qui fait aussi appel à cette fonction.
Lors de cette opération, la frontière commune (surface externe de la
boule et surface interne du cube troué) est dupliquée : elle existe de
façon distincte dans les deux représentations.
4/ Réalisez une partition de la scène afin d'identifier que cette
frontière est commune, c'est la seule manière d'assurer que le maillage
de cette frontière ensuite soit identique pour les deux objets (cube
troué et boule). Pour cela, vous devez créer une liste en entrée de la
fonction, qui contient les deux objets (cube troué et boule). Vous
pouvez choisir flags = 0.
Attention, la partition créé de nouveaux objets en sortie, il faut
utiliser ceux-ci uniquement (ne plus utiliser les objets d'entrée de
cette fonction).
5/ Exporter le maillage de la boule et du cube troué.
6/ Niveau avancé en C : pour aller plus loin, réalisez une libération
explicite de la mémoire, si vous ne le faites pas, la fonction
scad_finalize le fait déjà pour vous.
La correction est donnée dans le fichier
${DEMONSTRATEUR_2}/TP3/src/2_starcad/mon_cube.c.
Le fichier cube_modification_diff.txt contient les lignes ajoutées au
fichier originel cube.c.
cd ..
mkdir star-cad-exo-cube
cd star-cad-exo-cube
Créez votre propre fichier :
cp "${SCAD_EX}"/src/cube.c ./mon_cube.c
Compilation :
gcc mon_cube.c -o mon_cube -lscad -lrsys
Voir l'exécutable mon_cube :
ls
Exécution :
mkdir scene
cd scene
../mon_cube
ls
Vous devez observer que les fichiers stl ont été générés.
Vous pouvez maintenant modifier mon_cube.c en implémentant les étapes
2 à 6, puis recompilez et exécutez.
Une fois l'exercice réalisé, visualisez le maillage du cube troué :
paraview
Vous devriez avoir un résultat semblable à l'image ci-dessous en chargeant
1 seul stl correspondant au cube troué :
feh "${DEMONSTRATEUR_2}"/Figures/tp3_boule_dans_cube.png
Afin de lancer un calcul stardis sur cette scène, copiez le fichier :
cp "${SCAD_EX}"/models/cube.txt model.txt
Ajoutez la ligne suivante après la description du cube et placer le point
sonde dans le volume du cube troué (hors de la boule) :
vim model.txt
SOLID BOULE 0.1 25 2 0.01 280 280 0 FRONT boule.stl
stardis -M model.txt -p 0.99,0.99,0.99 -V 3
Dans cet exercice, nous faisons le choix de mettre une boule solide afin
que le système soit le plus simple possible à décrire. Comme dans le TP1,
une boule fluide nécessite de décrire la connexion solide / fluide.
Explication du concept de partition :
La partition est un opérateur qui permet d'identifier différentes composantes
et de garantir des frontières communes entre elles quand elles existent.
On donne ici un exemple sur la scène suivante, composée d'un carré et d'un
cercle en intersection :
__________
| |
| / | \
| | | |
| \ | /
|__________|
Les deux géométries d'entrée sont :
__________ _ _
| | / \
| | | |
| | \ _ _ /
| |
|__________|
En interne, trois composantes seront identifiées, ainsi qu'une arête commune :
__________
|1 |
| / | \
| |2 | 3|
| \ | /
|__________|
En sortie, renvoie le même nombre de géométries, où chacune aggrège des
composantes pour former la même surface que la géométrie d'entrée.
__________ _ _
| | / | \
| / | | | |
| | | \ | /
| \ |
|________|
Pour aller plus loin :
Vous pouvez consulter la ferme de ROFFIAC :
cd ../..
mkdir star-cad-farm
cd star-cad-farm
On exécute le script pour créer la géométrie :
"${SCAD_EX}"/roffiac_farm
Observer tous les fichiers stl qui viennent d'être créés :
ls
Visualiser avec Paraview :
paraview
Exécuter stardis :
cp -r "${SCAD_EX}"/models/roffiac_farm.txt model.txt
stardis -M model.txt -p 0,0,1.5 -n 10000 -V 3
Ouvrir le fichier pour observer sa structure :
vim "${SCAD_EX}"/src/roffiac_farm.c
On observe les mêmes étapes que dans le cas précédent.
TP3 - Partie 3 : import d'un fichier step
cd ..
Présenter le cas d'application d'Antoine, juste être en capacité de
comprendre les instructions de CAO. Il a un canal dans lequel il y a un fluide
et des MOS FET sources de puissance volumique. Il a déjà des fichiers ".stp"
issus de logiciels de CAO standards. Il souhaite importer et "découper" le
fluide en différentes bandes sur lesquelles des températures moyennes seront
calculées. Côté géométrie, il défini donc un rectangle qui permet de faire
cette découpe, il supprime cet outil avant de faire l'étape de maillage.
Les étapes sont les suivantes :
initialisation du contexte
import du step de la géométrie composé de plusieurs volumes
(6 MOS FET + canal)partitionnement
import du step contenant le fluide
création de l'outil de découpe (parallélépipède)
création des n tronçons de géométrie
suppression des éléments inutilés (à ne pas mailler) : l'outil de découpe
et le fluidecréation de la liste des objets à partitionner
partitionnement
identification des différents éléments (sapphire et MOS)
maillage
export des différents éléments
extraction des surfaces sur lesquelles des conditions limites sont
appliquées (parties externes du canal) ; une sémantique leur est attribuée
en fonction de la position du centre de massecalcul de l'aire des MOS
fusion de faces qui auront la même condition limite
export de ces géométries sur lesquelles seront appliquées des conditions
limitesécriture automatique du fichier de description de la scène pour stardis
libération de la mémoire allouée
mkdir star-cad-electronique cd star-cad-electronique
Les fichiers suivants sont copiés dans le répertoire courant,
car le code scad_sliced-geometry en a besoin et qu'il n'y a pas de mécanisme
en place pour spécifier ce chemin de façon absolue.
cp "${DEMONSTRATEUR_2}"/libs/scad_sliced-geometry/starcad_learning.stp .
cp "${DEMONSTRATEUR_2}"/libs/scad_sliced-geometry/starcad_learning_fluid.stp .
"${DEMONSTRATEUR_2}"/libs/scad_sliced-geometry/fragments_n.exe
ls
Lire le code en observant les différentes étapes décrites ci-dessus
vim "${DEMONSTRATEUR_2}"/libs/scad_sliced-geometry/fragments_n.c
Le fichier d'entrée de stardis "stardis_entry.txt" prévoit que les fichiers
stl soient placés dans des répertoires. (scad_sliced-geometry - tag 0.0.1)
On l'édite pour supprimer ces dossiers.
sed -e 's/MOS\///g; s/canal_frags_n\///g' -i stardis_entry.txt
Lancer stardis pour vérifier que la géométrie est bien conforme
On voit que le calcul va bien au bout, ici une température moyenne de la
surface indexée 0 du canal intérieur. Le calcul est long car les chemins
sont piégés. Dans la thèse d'Antoine, une autre méthode de Monte-Carlo est
développée (dite avec rebonds) mais n'est pas présentée ici.
stardis -M stardis_entry.txt -s canal_int_0.stl -n 1000 -V 3
TP3 - Partie 4 : city generator
Description de city generator :
C'est un outil de génération procédurale permettant la construction de la
géométrie d'une ville à partir d'un cadastre (empreinte au sol et hauteur
des batiments). Les modes constructifs contrôlent des propriétés des
batiments comme la présence d'isolations et de fenêtres par exemple.
Les catalogues décrivent eux les propriétés des batiments comme
l'épaisseur de chaque isolant, la proportion de fenêtres, l'épaisseur de
la dalle, etc.
Dans cet exercice, nous voyons comment paramétrer sa propre ville.
Partie 4.1 : un exemple concret, l'île du Ramier pour le projet ANR MC2
(porté par C. Caliot du LMAP)
cd ..
Voir la scène de l'île du Ramier :
paraview "${DEMONSTRATEUR_2}"/TP3/src/script_paraview_ile_ramier.py
Vous devez observer quelque chose de similaire à l'image suivante :
feh "${DEMONSTRATEUR_2}"/Figures/tp3_ile_du_ramier_geometrie.png
Vous pouvez jouer avec la caméra pour tester différents points de vue.
C'est cette description de la scène qui est utilisée ensuite pour le calcul
stardis. Si le script ne fonctionne pas, lancer paraview puis visualiser
B_BUILDING.stl du dossier '${DEMONSTRATEUR_2}/data/ile_du_ramier'
Lancer le calcul d'une image infrarouge :
stardis -V 3 -M "${DEMONSTRATEUR_2}"/data/ile_du_ramier/idr.txt \
-R file=idr2.ht:fov=30:pos=1730,70,50:tgt=900,800,-250:img=500x500:spp=2
Produire une image infrarouge à partir du fichier idr2.ht :
htpp -v -f -m default -o idr2.ppm idr2.ht
Visualiser l'image infrarouge :
feh idr2.ppm
La même image est disponible dans l'énoncé avec beaucoup plus de
réalisations par pixel :
feh "${DEMONSTRATEUR_2}"/Figures/ile_du_ramier_2048_spp.png
Dans cet exercice, la géométrie vous a été donnée, elle a été obtenue
grâce à city_generator. Dans la suite, afin de réduire le temps de
calcul de la géométrie, on prend une scène plus modeste (4 batiments
mitoyens).
Partie 4.2 : découverte de city_generator et du mode constructif 0
mkdir city_generator_mode_0
cd city_generator_mode_0
Obtention de la description géométrique de la scène :
Dans un shell à part (lancé par la commande sh), on commence par enrichir
les chemins avec les répertoires dans lesquels sont installées les librairies
et l'exécutable city_generator_2 (comme dans le TP1).
On le fait dans un shell à part pour éviter que cela n'interfère avec
l'environnement du démonstrateur 2.
sh
. /home/lafrier/environnement_city_generator_2/etc/profile
city_generator2
-m "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/4_buildings_mode_0/nc3.yaml
-c
"${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/4_buildings_mode_0/catalog0.yaml
-V 3
exit
On vient de quitter ce "sous-environnement".
Observer les stl créés :
ls
Produire le fichier model.txt de façon automatique, via le script suivant.
Pour éviter de décrire chaque batiment, on fusionne les murs ensemble, les
cavités ensemble et on donne à ces groupes les mêmes propriétés.
Le script propose des paramètres par défaut à ces propriétés physiques.
sh "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/make_stardis_model.sh \
> model.txt 2> /dev/null
Editer le fichier model.txt, pour changer TRAD à 240 par exemple.
L'objectif est de voir que c'est le même type de fichiers que d'habitude :
vous auriez pu l'écrire à la main ... Sinon jetez un coup d'oeil au TP1 :-)
paraview
Chargez les fichiers STL préfixés par S_. Vous observez quelque chose
comme :
feh "${DEMONSTRATEUR_2}"/Figures/tp3_city_generator_mode_0_geometrie.png
On génère maintenant une image infrarouge de cette scène :
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
htpp -v -f -m gnuplot:range=260,285 idr2.ht | gnuplot - > idr2.png
feh idr2.png
Observer l'impact du manque d'isolant sur l'image infrarouge des batiments.
Si vous n'avez pas pu générer l'image :
feh "${DEMONSTRATEUR_2}"/Figures/tp3_city_generator_mode_0_rendu_128_spp.png
Analyse de l'image :
Les recoins occultent le ciel, ce qui explique la couleur.
Deuxième effet, le mur est plus chaud ici parce que les deux pièces sont
chaudes. C'est un effet connu pour les batiments mitoyens.
cd ..
Partie 4.3 : mode constructif 1 avec fenêtre et isolants
mkdir city_generator_mode_1
cd city_generator_mode_1
Afin de lancer en mode 1 qui présente une isolation :
sh
. /home/lafrier/environnement_city_generator_2/etc/profile
city_generator2 -m \
"${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/4_buildings_mode_1/nc3.yaml \
-c \
"${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/4_buildings_mode_1/catalog1.yaml \
-V 3
exit
Observer les stl créés :
ls
Produire le fichier model.txt de façon automatique :
sh "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/make_stardis_model.sh \
> model.txt 2> /dev/null
Aller éditer le fichier model.txt pour changer TRAD à 240 par exemple.
paraview
Chargez les fichiers STL préfixés par S_. Vous observez quelque chose
comme :
feh "${DEMONSTRATEUR_2}"/Figures/tp3_city_generator_mode_1_geometrie.png
Chargez l'ensemble des stl commençant par S_. Observer la présence de
fenêtres dans ce mode constructif, d'une dalle de fondation et d'isolants.
On vous demandera dans l'exercice suivant de modifier ces propriétés.
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
htpp -v -f -m gnuplot:range=260,285 idr2.ht | gnuplot - > idr2.png
feh idr2.png
Si vous n'avez pas pu générer l'image :
feh "${DEMONSTRATEUR_2}"/Figures/tp3_city_generator_mode_1_rendu_128_spp.png
Observer l'impact des isolants sur l'image infrarouge, noter que le batiment
le plus présente une forte perte par sa toiture.
cd ..
Partie 4.4 : Exercice, ajouter une isolation à la toiture du batiment
le plus haut
cp -r "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/4_buildings_mode_1 \
city_generator_exercice
cd city_generator_exercice
Démarche :
Identifier le batiment dans la scène :
cat nc3.yaml
Le batiment le plus haut (height = 13) correspond à l'identifiant "bat_1".
Il utilise les propriétés nommées "b1" dans le catalogue.
Il faut donc modifier les propriétés de "b1" dans le catalogue :
vim catalog1.yaml
catalog1.yaml
- name: b1
roof_insulation_thickness: 0.5
Ces modifications sont dans données dans le dossier de correction.
Générer la géométrie :
sh
. /home/lafrier/environnement_city_generator_2/etc/profile
city_generator2 -m nc3.yaml -c catalog1.yaml -V 3
exit
Générer la description du système pour stardis :
sh "${DEMONSTRATEUR_2}"/TP3/src/4_city_generator/make_stardis_model.sh \
> model.txt 2> /dev/null
Lancer stardis :
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
Convertir le résultat en image :
htpp -v -f -m gnuplot:range=260,285 idr2.ht | gnuplot - > idr2.png
feh idr2.png
Si vous n'avez pas pu générer l'image :
feh "${DEMONSTRATEUR_2}"/Figures/tp3_city_generator_exercice_rendu_128_spp.png
Comparer cette image avec la précédente.
feh ../city_generator_mode_1/idr2.png
Vous devez observer que l'isolant a bien été ajouté et qu'il y a donc moins
de perte par cette toiture.