Projet

Général

Profil

Assistance #145

Intégraled de volume

Ajouté par Frank Petitjean il y a environ 7 ans. Mis à jour il y a environ 7 ans.

Statut:
Nouveau
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
10/09/2017
Echéance:
% réalisé:

90%

Temps estimé:
Temps passé:

Description

Bonjour Gérard,

Mon besoin spécifique pour le calcul hydro d'un BSO fermé est le calcul de l'intégrale de zdV sur le volume du ballon au sens du volume situé entre les
plans de base (xy, xz, yz) et la surface des éléments 2D (CAL_VOL_TOTAL_ENTRE_SURFACE_ET_PLANS_REF). Or dans le calcul d'intégrales de volumes que tu viens de développer il s'agit d'intégrales sur le "volume" des éléments eux même.

Est-il possible de recalculer le volume contenu entre les elts 2D à partir de fonctions nD et d'intégrales de volumes sur les éléments au sens classique ?

Merci
Frank


Fichiers

2-PuitVertical.7z (4,57 ko) 2-PuitVertical.7z Frank Petitjean, 10/09/2017 15:11
#1

Mis à jour par Gérard Rio il y a environ 7 ans

  • % réalisé changé de 0 à 20

oui,
effectivement l'intégrale s'effectue sur le volume de l'élément support, c-a-d ligne pour les éléments 1D, surface pour 2D et volume pour 3D.
Maintenant si on veut le volume interne, par exemple entre le plan xy et la surface il faut utiliser une fonction nD qui a pour argument la coordonnée Z du point et qui donne comme résultat Z

#2

Mis à jour par Frank Petitjean il y a environ 7 ans

C'est ce que tu as appelé dans ton fichier test "le moment geo / y" ?

J'ai créé dans l'ordre logique :

la fonction X1

fct_ddl_X1 FONCTION_EXPRESSION_LITTERALE_nD
deb_list_var_ X1 fin_list_var_
fct= X1
fin_parametres_fonction_expression_litterale_

l'intégrale de volume

integrale_sur_volume_   #--------# 
E_tout une_fonction_nD_ fct_ddl_X1

et la fonction nD

fct_volume_2D_plan_zy FONCTION_EXPRESSION_LITTERALE_nD
deb_list_var_ int_vol_E_to_fct_nD_fct_ddl_X1 fin_list_var_
fct= int_vol_E_to_fct_nD_fct_ddl_X1
fin_parametres_fonction_expression_litterale_

J'utilise cette fonction dans un chargement pression bidon pour récupérer la valeur

F_to PRESSION 1 Fonction_nD_CHARGE: fct_volume_2D_plan_zy

et j'obtiens à chaque nœuds 1 (voir le fichier Gmsh modele_pression_ext_ddl_etendu_noe_Gmsh), ce qui n'est pas la valeur attendue.

#3

Mis à jour par Gérard Rio il y a environ 7 ans

  • % réalisé changé de 20 à 80

OK pour la fonction nD:
> la plaque fait 10x1 et les x valent 10, donc l'espace entre la plaque et le plan yz est 10 x 10 = 100
> on lit dans le fichier .BI que l'intégrale vaut 99.99999... donc 100, -> donc a priori on obtient la bonne valeur de l'intégrale

Concernant l'utilisation de l'intégrale, il y a une erreur de mise en donnée:
-> la variable globale générée par l'intégrale se nomme : "int_vol_E_tout_ddl_etendu_TEMP" et non "int_vol_E_to_ddl_etendu_TEMP" !! Actuellement, Herezh ne signale pas le pb (je vais essayer de modifier cela dans le futur).
Deux solutions pour avoir le nom des variables généré: soit regarder dans le .BI (pour les utilisateurs curieux et averti), ou simplement lorsqu'herezh est en interactif, on peut avoir le nom des variables globale (cas 9).
Cependant, avec un delta_t de 1, le fonctionnement ne va pas être celui que tu attends car la fonction va utiliser la valeur à t, or l'intégrale à t = 0 !!
Donc par exemple une solution est d'utiliser plusieurs incrément de temps, et ici dès le second incrément l'intégrale utilisée sera correcte et la pression aussi.

#4

Mis à jour par Frank Petitjean il y a environ 7 ans

Merci Gérard, je n'avais pas réussi à retrouver la valeur dans le .BI. Je commence à mieux m'y repérer.

Dans mon objectif de recalculer le volume entre plans j'ai choisi d'autres orientations pour ma plaque. Lorsque je tourne la plaque autour de l'axe Z la valeur du volume donnée par la sortie pression ne change pas alors que Herezh calcule bien vol_total2D_avec_plan_yz = 0.

Je n'ai pas encore bien compris comment tu calculs les volumes entre plans...

Frank

#5

Mis à jour par Gérard Rio il y a environ 7 ans

  • % réalisé changé de 80 à 90

Bonjour Frank,

1) Le calcul du volume s'effectue de la manière suivante:
- la surface de l'élément est décomposée en surfaces élémentaires triangulaires, cette décomposition dépend du type d'élément et d'interpolation,
- ensuite pour chaque triangle le code suivant est exécuté, sachant que A correspond aux coordonnées du point A (premier point du triangle), idem B pour le deuxième point, et C pour le troisième point:

" Coordonnee AB; Coordonnee AC;
Coordonnee G=1./3.*(A+B+C); // coordonnées du centre de gravité
Coordonnee so=0.5*Util::ProdVec_coor(AB,AC);
so(1) *=G(1);so(2) *=G(2);so(3) *=G(3);
volumePlan += so;
"
donc : AB = un coté du triangle, AC = l'autre coté, d'où so = la surface du triangle
G est la position du centre de gravité
d'où so(3) = Z(G) * (la surface projetée sur z => so(3)) c-a-d le volume entre le triangle et le plan xy
et de même pour les deux autres volumes.

Ensuite tous les volumes sont sommés dans une grandeur globale. Le résultat est en relatif, ce qui permet, lorsqu'il s'agit d'une surface fermée d'avoir le volume interne de la surface indépendamment du plan de projection.

2) Variation: dans mon cas j'obtiens un volume de 100. et ensuite si je fais une rotation autour de z, la valeur change ce qui est normal.
Pour 45° j'obtiens -4.75 par rapport à xz et yz
Pour une rotation de 90°, cela donne 0 pour yz et 100 pour xz,

Donc, j'ai l'impression qu'herezh donne les résultats attendus (aux approximations de la facettisation près).

3) Dans le cas du calcul d'une intégrale, elle s'effectue non pas à partir de la facettisation, mais via les points d'intégration utilisés pour le calcul d'équilibre. On peut donc obtenir un résultat un peu différent du précédent, suivant le nombre de points d'intégration utilisé. A priori (à vérifier), l'intégrale via les points d'intégration devrait être (?) un peu plus précise (mais à confirmer).

#6

Mis à jour par Frank Petitjean il y a environ 7 ans

Gérard,

Merci pour ces explications du calcul de volume. J'ai bien vérifié moi aussi que le calcul de volume entre plans dans Herezh était juste dans mon cas test.

Mon problème est que ce même calcul via les intégrales de volume de fonctions nD ne fonctionne pas ! Les valeurs lues dans le fichier .BI ne correspondent pas au volume entre plans attendu

Dans mon exemple avec la plaque face au plan yz j'ai

int_vol_E_tout_fct_nD_fct_ddl_X1_t_ Vecteur taille= 1 9.9999999999999982
int_vol_E_tout_fct_nD_fct_ddl_X2_t_ Vecteur taille= 1 14.999999999999996
int_vol_E_tout_fct_nD_fct_ddl_X3_t_ Vecteur taille= 1 49.999999999999986

C'est bon pour la première valeur mais c'est faux pour les 2 autres sui doivent valoir 0. Si je tourne de 45° autour de Oz tout est faux.

Mon objectif est de retrouver les valeurs de volume entre plans déjà calculées par Herezh via les intégrales de volume de fonction nD.

Merci de ton aide
Frank

#7

Mis à jour par Gérard Rio il y a environ 7 ans

peux-tu préciser avec quelle version d'Herezh, les calculs sont réalisés ?

#8

Mis à jour par Frank Petitjean il y a environ 7 ans

Il s'agit de la 6.806. Je suis à jour !

#9

Mis à jour par Gérard Rio il y a environ 7 ans

Exact, mais cela ne signifie pas qu'il y a une erreur, car je crois que la raison est que l'expression à utiliser est en fait à multiplier par le produit scalaire de la normale à la surface avec la direction de la coordonnée que l'on utilise.
Donc, j'ai l'impression que le calcul de l'intégrale est bon, par contre le résultat obtenu ne représente pas ce que l'on veut, car il manque le cosinus directeur ! ce qui permet d'avoir la projection de la surface !
Il faudrait donc passer une information supplémentaire à la fonction à intégrer (qui pour l'instant dans ton exemple est uniquement un ddl).
Par exemple directement la normale à la facette au point d'intégration ?
Qu'en penses-tu ?

#10

Mis à jour par Frank Petitjean il y a environ 7 ans

Oui ma vision était simpliste. Il faut être capable d'avoir la surface projetée de la facette par rapport au plan choisi. C'est plus ou moins ce que tu dois faire dans Herezh mais je ne comprends pas ton bout de code.

Que signifie géométriquement ce produit de so et G composante par composante :
so(1) *=G(1);so(2) *=G(2);so(3) *=G(3)

Et après tu cumules les vecteurs obtenus :
volumePlan += so

Donc en particulier volumePlan est un vecteur ???

Comme on accède simultanément par les fonctions nD aux 3 coordonnées d'espace X1, X2, X3 du pti de l'élément en cours, on peut avoir les cosinus directeur du vecteur OPti mais pas de normal puisque l'on a qu'un point !

Les aspects géométriques de ces opérations ne sont pas encore claires pour moi. Je continue de chercher...

#11

Mis à jour par Gérard Rio il y a environ 7 ans

'C'est plus ou moins ce que tu dois faire dans Herezh'
oui c'est exactement cela,

"Que signifie géométriquement ce produit de so et G composante par composante :
so(1) *=G(1);so(2) *=G(2);so(3) *=G(3)"

so est un vecteur dont la norme = la surface et la direction = la normale à la surface

"Et après tu cumules les vecteurs obtenus :
volumePlan += so

Donc en particulier volumePlan est un vecteur ???
"

oui, il cumule les trois volumes entre plan

"Comme on accède simultanément par les fonctions nD aux 3 coordonnées d'espace X1, X2, X3 du pti de l'élément en cours, on peut avoir les cosinus directeur du vecteur OPti mais pas de normal puisque l'on a qu'un point !"

exactement d'où je pense la nécessité d'avoir accès à une grandeur supplémentaire,
bon... je vais implanter ça, mais avant je vais avancer sur la demande de julien

#12

Mis à jour par Frank Petitjean il y a environ 7 ans

  • Assigné à mis à Gérard Rio

Bonjour Gérard,

Je viens aux nouvelles concernant l'ajout dans Herezh de la possibilité de récupérer les coordonnées de la normal aux faces d'éléments pour une utilisation dans des fonctions nD.

Merci
Frank

#13

Mis à jour par Gérard Rio il y a environ 7 ans

Je n'ai effectivement pas trop communiqué sur le sujet, mais néanmoins j'ai pas mal avancé et je ne suis pas très loin de l'arrivée... donc j'espère finaliser prochainement !

Formats disponibles : Atom PDF

Redmine Appliance - Powered by TurnKey Linux