Rien

- Ajout de la fct clsname() à plusieurs classes (Vect2,
Vect3, etc).
- Ajout d'une fct get_properties() dans Physet qui retourne
l'entièreté de la Stack des properties Physet
(pour pouvoir boucler sur toutes les propriétés à partir
de l'extérieur.
- Déclaration de la classe MetaFac (+ I_MetaFac)
- Ajout d'une std::string au Domain (appelée
username) qui contient le nom de la classe I_ ayant
appelé le constructeur de l'objet. En version non-interprétée,
le username du Domain est "noname". J'ai fait
les routines set_username() et get_username() traditionnelles.
Modifications
- Ajout d'une case defo_scale à BWin pour gérer
l'échelle de déformation lors de la visualisation
- Ajout des #include "meta_global.h" là où
il n'était pas.
- Possibilité de sauvegarde de la DB sur disque :
classes MetaFac, Io_Object et dérivées.
Infos pour le développeur
J'ai introduit une classe Io_Object qui définit l'interface
de sauvegarde d'un objet ainsi que des utilitaires. Cette classe pourrait être
placée dans oofelie mais on risque d'avoir des problèmes de conflits
lors de l'industrialisation d'oofelie par open engineering (cette tâche
est une tâche d'industrialisation). Pour cette raison, la classe Io_Object
fonctionne de deux manières distinctes) :
- La première est utilisée pour les classes d'oofelie
(Matr3, Set, Step, ...) : on dérive
une classe de Io_Object (p.expl Io_Step) pour obtenir
une "classe utilitaire" qui prendra comme argument la classe à
charger ou sauver et s'occupera des transferts. L'intérêt de
cette manière de faire est que la classe à sauver/charger ne
doit pas être recompilée lorsqu'on modifie son objet de sauvegarde/chargement.
L'inconvénient est facile à deviner: l'objet à transférer
doit pouvoir être totalement rempli via des fct publiques (heureusement,
c'est le cas de la plupart des objets oofelie).
- La seconde est utilisée pour les classes Metafor
telles que les classes MetaGeneric, GPState_common et
dérivées : L'objet à sauver/charger est directement dérivé
de Io_Object ; il possède donc en lui toutes les fonctionnalités
de sauvegarde. L'avantage est la réduction du nombre de fichiers sources,
l'accès aux membres privés ainsi que l'utilisation du polymorphisme
(l'objet Io_Elemset peut par exemple appeler la fct Io_Object::save()
(virtuelle) de chaque élément sans se tracasser de son type).
Remarquons que l'avantage du polymorphisme s'arrête là puisqu'il
est difficilement envisageable de charger un objet sans connaitre son type
via la fct virtuelle Io_Object::load(). L'inconvénient de
la méthode est qu'il faut recompiler tous les fichiers à chaque
modification de Io_Objet (long!). Ce n'est pas de la programmation
modulaire.
A côté de ces objets de sauvegarde (soit séparés,
soit intégrés), j'ai défini une classe MetaFac
(qui, elle, est spécifique à Metafor). Cet objet se charge de
créer et d'appeler les bons objets de sauvegarde.
J'ai fait les choix suivants pour le fac "metafor sous oofelie":
- Un fichier par Step (contrairement à z-mesh ou bacon qui
sauve l'entièreté du calcul dans le même fichier). Cela
permet d'extraire des pas de temps facilement et cela facilitera la gestion
du restart plus tard (on charge le dernier fichier et on en écrit d'autres).
- Je sauve la DB entière relative au Step courant (c-à-d
tous les Set et Set3 contenus dans le Step
courant) ; suivie de l'Elemset (uniquement les données aux
points de Gauss). Il n'y a donc aucune info de géométrie ou
même de mailles dans la sauvegarde pour l'instant. Tant qu'on ne fait
pas de remaillage, c'est totalement inutile. Il faut donc recharger le jeu
de données initial avant de charger un pas de temps.
- Les formats suivants sont utilisés : ASCII (.tfac), binaire
(.bfac), binaire zippé (.bfac.gz). Le format
ASCII zippé n'est pas simple à réaliser vu l'absence
de fonction équivalente à fscanf dans la librairie
que j'utilise pour la compresion (zlib
- licence GNU). Cette lib est fournie d'origine avec VTK ; il suffit donc
de décomprimer les sources VTK pour obtenir le zlib.h nécessaire.
Le format zippé peut être dézippé directement avec
winzip (si nécessaire). Par défaut, c'est le format binaire
zippé qui est choisi ou le binaire non zippé si zlib n'est pas
présente sur le système.
- Le format est extrêmement flexible et risque de changer souvent au
début.
Pour l'utilisateur
- Sauvegarde d'un Step (sous le numéro 10) - ceci est fait
par défaut dans fin_step.e
MetaFac myfac(domain);
myfac.save(10);
myfac.save(20); # charge le fac numero 20
myfac.load_first(); # charge le premier step
myfac.load_last(); # charge le dernier step
myfac.load_next(); # charge le step suivant
myfac.ascii();
myfac.binary();
myfac.zipped();
myfac.unzipped();
- Utilisation de scripts utilitaires
bfac2tfac(domain); # conversion binaire vers ascii
tfac2bfac(domain); # conversion ascii vers binaire
bfac2zfac(domain); # conversion binaire vers fac z-mesh
makeanim(domain); # fait une anim à partir de facs binaires
loadbfac(domain,10); # charge le fac numéro 10
vizu(domain); # visualise le domaine avec des options par défaut
Comparaison sur cas-test
meta_qs(elbow_modif4b)
maillage : 6374 noeuds - 1800 mailles - 31 archivages
TYPE |
TAILLE FICHIERS |
TAILLE TOTALE |
tfac |
3677Ko x 31 |
111 Mo |
bfac |
1760Ko x 31 |
53.3 Mo |
bfac.gz |
1070Ko x 30 + 2Ko x 1 |
31.2 Mo |
zfac |
229 Mo x 1 |
229 Mo |
Pour info, j'ai pas réussi à créer un fac bacon avec le
zfac provenant d'oofelie.
Je propose de virer définitivement l'écriture du zfac vu que
:
- c'est (très) lent
- ça bouffe du disque
- c'est inutile dans la plupart des cas
- ça peut être regénéré directement à
partir des archives binaires via le script bfac2zfac()
Compilation
Pour compiler avec zlib, ça devrait marcher automatiquement sans rien
faire vu que VTK inclut zlib. J'ai cependant pas réussi à linker
en release (DLL) directement - le truc c'est de compiler avec les macros _WINDOWS
et ZLIB_DLL les fichiers qui utilisent la zlib ; c-à-d io_object.cpp
et io_lock.cpp.
Dans oofelie, le flag de compilation avec/sans zlib est _WITH_ZLIB_
et il est actif automatiquement si on met _WITH_VTK_ (voir fichier
meta_global.h)
Reste à faire
Changer le mo.zfac en vrai_nom_du_cas_test.zfac (faisable
grâce à Domain::get_username()).
- Ecrire les routines pour l'ASCII compressé.
- Faire une interface BWin.
- Faire le restart (travail principalement au niveau des fichiers meta_*.e
et équivalents).