Artelia / Mascaret

Pre and Post Processing for Mascaret
GNU General Public License v3.0
3 stars 3 forks source link

Génération du maillage dans le fichier xcas #38

Closed FlorentBourhis closed 2 years ago

FlorentBourhis commented 2 years ago

Bonjour,

Nous avons rencontré des problèmes dans la génération du maillage lors du lancement d'un de nos modèles présentant des confluences. Un message d'erreur nous indiquant que le maillage ne pouvait être produit entre telle et telle section était généré. Il est apparu, après analyse, que le problème provenait sans doute de la génération du fichier xcas, plus particulièrement de la séquence sql suivante :

  <methodeMaillage>5</methodeMaillage>
  <planim>
    <nbPas>185</nbPas>
    <nbZones>5</nbZones>
    <valeursPas>0.2 0.2 0.2 0.2 0.2</valeursPas>
    <num1erProf>1 14 28 147 182</num1erProf>
    <numDerProf>13 27 146 181 315</numDerProf>
  </planim>
  <maillage>

Nous avions au départ la séquence suivante :

    <num1erProf>1 14 28 147 182</num1erProf>
    <numDerProf>10 27 146 181 319</numDerProf>

Nous avions 315 profils actifs, mais au lieu d'écrire "1 à 13 ; 14 à 27 ; etc", le plugin écrivait "1 à 10 ; 14 à 27 ; [...] ; 182 à 319". On avait donc toujours 315 profils, mais les profils 316, 317, 318 et 319 n'existaient pas. En corrigeant ce décalage et en relançant mascaret, le calcul aboutissait bien (nous lancions alors des calculs en mode permanent).

Dans le code source, il apparait dans le fichier ClassMascaret, à la ligne 380, le code suivant (fonction maillage_select) :

sql = """SELECT MIN(t1.mesh) AS pas,

MIN(t2.nombre),

MAX(t2.nombre)+MIN(diff)+1 AS max

FROM (SELECT branch, mesh,

ST_UNION(geom) AS geom,

MIN(diff) AS diff

FROM (SELECT branch,

mesh,

geom,

row_number()

OVER (PARTITION BY branch,

mesh ORDER BY zonenum)

- zonenum AS grp,

branch-lead(branch,1,branch+1)

OVER (ORDER BY zonenum) AS diff

FROM {0}.branchs

WHERE active) x

GROUP BY branch, mesh, grp) AS t1,

(SELECT ROW_NUMBER() OVER(ORDER BY abscissa)

AS nombre, geom

FROM {0}.profiles

WHERE active ) AS t2

WHERE ST_INTERSECTS(t1.geom,t2.geom)

GROUP BY t1.geom

ORDER BY min;"""

En particulier, il y a la ligne suivante : MAX(t2.nombre)+MIN(diff)+1 où une variable "diff" apparait (cette variable n'apparait pas dans la fonction planim_select qui est, a priori, le pendant pour le planimétrage de ce qu'est la fonction maillage_select pour le maillage). En remplaçant la ligne MAX(t2.nombre)+MIN(diff)+1 par MAX(t2.nombre), nous n'avons plus eu de problème. Mais on a supprimé cette variable "diff" qui n'était sans doute pas là par hasard.

Quelle est la fonction de cette variable "diff" ?

Par avance, je vous remercie pour votre aide.

Cordialement,

Florent Bourhis

daoum commented 2 years ago

Bonjour @FlorentBourhis ,

Pour répondre à votre question, la variable "diff" permet la gestion du dédoublement d'un profil lorsque deux zones se trouvent sur une même branche.

Par exemple (branche 1 : profil 1 à 4 (2 zones), branche 2 : 5 à 8(1 zone) et branche 3 : 9 à 10 (1 zone) ):

  <num1erProfPlage>1 **3** 5 9</num1erProfPlage>
<numDerProfPlage>**3** 4 8 10</numDerProfPlage>

Dans le cas de la planimétrie, ce problème ne se pose pas.

Après l'étude du problème, un bug peut se produire si les numéro de zone ne sont pas dans l'ordre des branches (cela induit une erreur lors de la création de diff). Vous pouvez utiliser la ligne sql suivante, où un trie sur les branches en plus des numéros de zone (modification en Gras) a été ajouté, cela devrait régler votre problème :

sql = """SELECT MIN(t1.mesh) AS pas, MIN(t2.nombre), MAX(t2.nombre)+MIN(diff)+1 AS max FROM (SELECT branch, mesh, ST_UNION(geom) AS geom, MIN(diff) AS diff FROM (SELECT branch, mesh, geom, row_number() OVER (PARTITION BY branch, mesh ORDER BY branch, zonenum)

  • zonenum AS grp, branch-lead(branch,1,branch+1) OVER (ORDER BY branch, zonenum) AS diff FROM {0}.branchs WHERE active) x GROUP BY branch, mesh, grp) AS t1, (SELECT ROW_NUMBER() OVER(ORDER BY abscissa) AS nombre, geom FROM {0}.profiles WHERE active ) AS t2 WHERE ST_INTERSECTS(t1.geom,t2.geom) GROUP BY t1.geom ORDER BY min;"""

Ces modifications seront ajoutées à la prochaine version du plugin.

Cordialement,