Evolution #269
temps de calcul fonction nD
Description
Gérard,
donc suite au ticket #268, j'ai mis en place le calcul suivant : un déploiement de ballon dont la pression de gonflage dépend de fonctions nD qui calcule des centres de gravité de nuage de noeuds.
Dans mon calcul, je détermine 5 centres de gravité. Le numéro de centre de gravite apparait dans le nom des fonctions nD ("numero" dans l'explication ci-dessous). Le chargement de pression est appliqué sur 5 groupes d'éléments (chacun étant en relation avec un centre de gravité).
Le calcul de la pression de gonflage sur un groupe d'élément E_seg_fps_[numero] suit la logique suivante :
1) calcul d'un centre de gravité => fonction nD de nom f_cdg_X1_[numero], f_cdg_X2_[numero] et f_cdg_X3_[numero]
2) calcul d'un produit scalaire entre la normale au pti et la position moins le centre de gravité => fonction nD de nom f_ps_[numero]
3) calcul d'une pression en fonction de f_ps_[numero] => fonction nD de nom f_chargement_[numero]
la chaine est donc (f_cdg_X1_[numero], f_cdg_X2_[numero], f_cdg_X3_[numero]) => f_ps_[numero] => f_chargement_[numero].
Voici maintenant le problème :
Le calcul fonctionne mais est très lent. Et pour cause : pour chaque pti, il y a recalcul des fonctions de centre de gravité (f_cdg_X1_[numero], f_cdg_X2_[numero], f_cdg_X3_[numero]). Or ce centre de gravité pourrait être calculé une seule fois par itération.
Et donc, est-ce que ce serait possible de définir des fonctions nD qui seraient calculées une seule fois au début d'une itération et dont le résultat serait ensuite dispo en tant que variables dans les fonctions nD ?
Dans l'idée, cela serait une fonctionnalité analogue aux intégrales "integrale_sur_volume_" qui donnent accès à des nouvelles variables. Cela mériterait peut-être une rubrique à part entière comme "integrale_sur_volume_" et ensuite une règle de nommage des nouvelles variables créées.
Je ne suis pas dans le programme Herezh++ mais j'ai l'impression que ce serait quasi un copier/coller de integrale_sur_volume_ (en plus simple puisqu'il n'y a pas la partie intégration).
pour comparer les temps de calcul, je t'ai joint 2 archives :
- le calcul qui est lent à cause des centre de gravité : pb_fct_nD_temps_de_calcul.tar
- un calcul à peu près identique sans centre de gravité : pb_fct_nD_temps_de_calcul_sans_cdg.tar
Fichiers
Mis à jour par Julien Troufflard il y a presque 4 ans
pour info, j'obtiens les temps de calcul suivant :
- calcul avec centre de grav : 2613.493u 26.152s 44:26.08
- calcul sans centre de grav : 1008.452u 23.157s 17:33.19
ça passe de 17 minutes à 44, et c'est un maillage léger.
Mis à jour par Gérard Rio il y a presque 4 ans
- Statut changé de Nouveau à En cours
- % réalisé changé de 0 à 10
bonjour Julien,
Je modifie le tracker en "evolution" car il me semble que c'est des évolutions au fonctionnement actuel que tu sollicites.
Ceci étant, je vais essayer de répondre à ta demande mais je propose plusieurs étapes différentes.
1) je vais essayer d'introduire la possibilité indiquée dans le #268 pour appliquer les CL à chaque itération, ceci dans l'algo choisit,
2) je vais essayer d'introduire le fait de disposer spécifiquement sur une ref de noeuds des grandeurs "moyenne, maxi, mini etc. sur ref N" de manière identique à ce qui est disponible en sortie maple. Une fois ces grandeurs calculées, elles sont automatiquement exportées comme grandeurs globales. L'intérêt est a priori un calcul très rapide des ces grandeurs.
3) définir des variables globales qui serait == à des fonctions nD sur des noeuds.
A priori 1) + 2) permettraient de réponse à ta demande immédiate. Le 3) est plus ambitieux et en fait en pratique différent du cas des intégrales car cela n'interviendra a priori pas du tout aux mêmes endroits et due au fait des encapsulages (indépendances) objet cela va nécessiter une gestion particulière. A priori je ne pense pas que ce soit trivial a implanter mais à voir au bilan final.
Le pb, c'est que j'ai plusieurs choses sur le feux et il faut que je finalise les différents chantiers correctement si je veux éviter d'avoir des incohérences. De plus il faut également que je respecte le plus possible la chronologie des affaires. Pour cela j'aimerais bien avoir un endroit pour dire qu'est-ce qui est en route et comment cela avance...
bref... affaire en cours, je vais avancer et je te tiens au courant
Mis à jour par Gérard Rio il y a presque 4 ans
- Tracker changé de Anomalie à Evolution
j'ai trouvé comment mettre en place une "roadmap". L'idée est de décrire les différentes évolutions d'herezh qui sont en cours.
Il faut regarder par exemple dans le projet "Herezh++" l'onglet roadmap
a suivre
Mis à jour par Julien Troufflard il y a presque 4 ans
Merci pour toutes ces évolutions à venir. Effectivement, il y a plein de choses qui ont émergé d'un coup.
Si ça peut aider à hiérachiser :
- le point 2) répond à ma demande : disposer de centre moyen d'un groupe de noeuds et d'une variable associée pour les fonctions nD. J'ai une étude qui requiert cette fonctionnalité avec fin janvier comme deadline. Donc au plus tôt c'est dispo, au mieux c'est pour moi.
- pour le point 1), c'était un pb collatéral qui a émergé au cours du ticket 268. Mes études actuelles ne sont pas concernées. Mais forcément, si quelqu'un s'attend à gouverner une CL avec une fonction nD, il va être coincé si rien n'est fait.
- le point 3) devient moins urgent pour moi puisque le point 2) y remédie. Mais on sent bien que ça peut être utile.
- je me permets de rappeler aussi l'un des pb (collatéral) que j'avais rencontré dans le ticket 268 : l'impossibilité actuelle d'utiliser des fonctions nD dans les coefficients des CLL. Je ne suis pas encore concerné, mais ça viendra forcément un jour pour moi ou quelqu'un d'autre.
Mis à jour par Gérard Rio il y a presque 4 ans
- % réalisé changé de 10 à 90
suite à l'évolution #274 (cf. roadmap) la version 6.977 intègre
- la possibilité de relire les CLL à chaque itération
- la possibilité de faire une statistique sur une ref de noeud (cf. doc) ce qui génère une variable globale. Ensuite utilisation d'une variable relais pour utiliser les infos de la statistique dans une fonction nD
- l'évolution apporte également, sous forme détournée, la réponse au point 3). En effet, maintenant pour définir une variable globale sur une fonction nD s'appliquant sur un noeud on peu:
a) définir une ref sur le noeud
b) définir une statistique sur cette ref
c) définir une variable utilisateur (ici relais) sur la statistique ce qui permet d'obtenir la valeur de la fonction nD
et la statistique permet d'étendre le principe à plusieurs noeuds, en particulier à N_tout
Me dire si cela permet de répondre à la demande.
Merci
Mis à jour par Frank Petitjean il y a presque 4 ans
Bonjour Gérard,
J'avais fait la demande de pouvoir utiliser une grandeur par noeud via une référence. C'est chose faite. Merci pour toutes ces évolutions.
Frank
Mis à jour par Julien Troufflard il y a presque 4 ans
je viens de modifier mon calcul avec centres de gravité en reprenant les nouveautés statistiques du ticket 274. Le calcul tourne mais ne converge pas. Si je sors un résultat intermédiaire, je constate qu'il me donne un résultat erroné pour l'instant. Je n'en connais pas encore la raison sachant que mes 2 calculs précédents tournaient (celui sans centre de gravité et celui avec 5 fonctions nD pour calcul de centres de gravité). Je n'ai fait que modifier le calcul avec centre de grav en remplaçant les fonctions nD de type f_cdg_X1_1 par l'utilisant des statistiques (composante 2).
Mis à jour par Julien Troufflard il y a presque 4 ans
ci-joint mon calcul à tout hasard
Mis à jour par Gérard Rio il y a presque 4 ans
c'est peut-être la même raison qu'en #268 si tu veux utiliser dans une condition limite le centre de gravité ??
Mis à jour par Julien Troufflard il y a presque 4 ans
non non. ça concerne un pilotage de chargement de pression.
Mis à jour par Gérard Rio il y a presque 4 ans
ok,
ce que tu peux faire pour y voir plus clair c'est peut-être
- de te mettre en mode debug
- de sortir dans le .maple, les valeurs des statistiques, dont tu auras ainsi à chaque itération les valeurs calculées
- de mettre un niveau de commentaire important sur la fonction nD qui utilise les statistiques via les variables relais, ainsi tu verras les données d'appel de la fonction et le résultat pour chaque itération
...
Mis à jour par Julien Troufflard il y a presque 4 ans
- Fichier bug_2.png bug_2.png ajouté
- Fichier pb_fct_nD_temps_de_calcul_stats.tar pb_fct_nD_temps_de_calcul_stats.tar ajouté
j'ai commencé par vérifier à l'état initial les coordonnées des centres moyens des 5 sets de noeuds qui m'intéressent : N_seg_fps_1, 2, 3, 4 et 5
dans un premier temps, c'était ok pour le 1, 2 et 3. Puis tout à coup, ça ne fonctionnait plus pour le 4 et 5. En fait je me suis aperçu d'un segmentation fault en fin de calcul. Et puis, les bugs ont commencés à être aléatoires. J'espère que ça le fera chez toi.
J'ai bloqué tous les noeuds dans le calcul test.info de l'archive pièce jointe. Le .CVisu est configuré pour sortir les stats du set N_seg_fps_3.
Voici les 4 bugs que j'ai constaté :
bug 1) le meilleur cas. Le calcul termine malgré un segmentation fault final. Le résultat est ok. Je le constate en comparant les colonnes 3, 13 et 23 (moyenne) par rapport à ce que me renvoie le script a_her.pl en lançant : a_her.pl toto.her N_seg_fps_3
bug 2) le calcul plante juste après l'affichage de l'incrément avec l'affichage suivant :
======================================================================
INCREMENT DE CHARGE : 1 intensite 1 t= 1 dt= 1
======================================================================
Warning : attention cas non traite: ("""suite de symboles incompréhensibles que je ne met pas ici car ça fait bugger redmine""") voir image pièce jointe
Segmentation fault
remarque : ce cas est rare, je l'ai obtenu qu'une seule fois
bug 3) idem 2) mais avec l'affichage suivant :
======================================================================
INCREMENT DE CHARGE : 1 intensite 1 t= 1 dt= 1
======================================================================
Erreur : degre de liberte non defini !
UneVariable()
Erreur : valeur incorrecte du type Enum_boolddl !
NOM_DDL(Enum_boolddl )
passage dans la methode Sortie
======== erreur (Sortie) detectee ======
bug 4) idem 2) mais avec l'affichage suivant :
======================================================================
INCREMENT DE CHARGE : 1 intensite 1 t= 1 dt= 1
Segmentation fault
REMARQUE IMPORTANTE : j'ai constaté que si on efface les fichiers résultats (.BI, .PI, etc...), on obtient presque toujours le bug 1), donc un calcul qui se déroule bien avec juste un seg fault final. Par contre, en présence des fichiers d'un calcul précédent, on obtient presque toujours l'un des 3 autres bugs.
Assez surprenant que le calcul soit perturbé par un calcul précédent alors que ça n'a rien à voir avec un RESTART.
Mis à jour par Gérard Rio il y a presque 4 ans
à oui ! il y avait une erreur au niveau des fonctions combinées dans lesquels j'avais utilisé une méthode générique de récupération des variables globales... mais en fait ce n'est pas possible car on a une combinaison des variables utilisées par les fonctions membres et les variables de la fonction maître ... c'est assez complexe.
Bon... j'ai pu revenir sans pb à la version initiale qui ne pose plus de pb.
Bref un bug de jeunesse.
Dans la version lente, Herezh indiquait bien qu'il y avait un pb au niveau de la fonction combinée: il y avait un paramètre en trop .
Par contre il ne faut pas se fier à la version rapide, car avec ce genre de bug, le programme dit n'importe quoi !!!!!
Donc maintenant le test.info fonctionne ... version 6.978
Mis à jour par Julien Troufflard il y a presque 4 ans
ok ça marche maintenant. Et avec un temps de calcul équivalent au cas sans statistique
j'ai relancé les 2 calculs avec la version 6.978 et j'obtiens les temps :
calcul sans statistiques : 934.458 s
calcul avec statistiques : 890.725 s
et résultats très similaires entre les 2 calculs
La légère meilleure performance du cas avec stats doit être dû à un nombre inférieur d'itérations mais je ne peux pas le vérifier (j'ai pas créé de fichier log).
En tout cas, on est loin du facteur 2.6 que j'évoquais dans le deuxième message de ce ticket. Donc impeccable.
merci, ça m'a l'air ok pour cet ticket.
Mis à jour par Gérard Rio il y a presque 4 ans
- % réalisé changé de 90 à 100
parfait,
merci pour ton retour.
Remarque: je pense que c'est mieux d'utiliser une fonction vectorielle plutôt que 3 fonctions scalaires (coordonnées) cf. l'exemple que j'ai mis sur #274 cela va te permettre d'utiliser une seule variable relais, cela devrait être plus économique.
Bon... à voir
En tout cas je suis content que cela fonctionne.
Je ferme le ticket