diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3a92896f541d56372b7b60317fcef4a205dab1f5..96561e05f6518c6b23d5cb6d28a93e830e63bafa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -151,6 +151,24 @@ build-users-doc: - doc/users/images/ allow_failure: true + +build-td: + stage: build + tags: + - linux + needs: + - job: set-version + artifacts: true + script: + - cd ./doc/users/Tuto1/ + - ./build.sh + artifacts: + paths: + - doc/users/Tuto1/step-by-step.pdf + - doc/users/Tuto1/pas-a-pas.pdf + - doc/users/Tuto1/data/ + allow_failure: true + build-developers-doc: stage: build tags: @@ -199,6 +217,8 @@ build-linux: artifacts: true - job: build-users-doc artifacts: true + - job: build-td + artifacts: true script: - mkdir -p linux - cd linux @@ -249,6 +269,12 @@ build-linux: #- cp ../doc/users/images/* pamhyr/doc/images - cp -r ../doc/dev/images/* pamhyr/doc/images - cp -r ../doc/images/* pamhyr/doc/images + # Copy Tuto + - mkdir -p pamhyr/doc/Tuto1/ + - mkdir -p pamhyr/doc/Tuto1/data + - cp ../doc/users/Tuto1/step-by-step.pdf pamhyr/doc/Tuto1/Tuto1-en.pdf + - cp ../doc/users/Tuto1/pas-a-pas.pdf pamhyr/doc/Tuto1/Tuto1-fr.pdf + - cp ../doc/users/Tuto1/data/* pamhyr/doc/Tuto1/data/ # Create running script - echo "#!/bin/sh" > pamhyr/Pamhyr2 - echo "./pamhyr/pamhyr $@" >> pamhyr/Pamhyr2 @@ -274,6 +300,8 @@ build-windows: artifacts: true - job: build-users-doc artifacts: true + - job: build-td + artifacts: true script: - mkdir windows - cd windows diff --git a/doc/users/Tuto1/build.sh b/doc/users/Tuto1/build.sh new file mode 100755 index 0000000000000000000000000000000000000000..a247a4adfb5b20a1ddbc655a05bd13631cf313d8 --- /dev/null +++ b/doc/users/Tuto1/build.sh @@ -0,0 +1,4 @@ +#! /bin/sh + +pdflatex -no-shell-escape step-by-step.tex +pdflatex -no-shell-escape pas-a-pas.tex diff --git a/doc/users/Tuto1/pas-a-pas.tex b/doc/users/Tuto1/pas-a-pas.tex index 7b163674eaecb517eb2a18b6a7afd0a18bdcf35c..6f730cae951b415f022458bbbf3992512bdb417f 100644 --- a/doc/users/Tuto1/pas-a-pas.tex +++ b/doc/users/Tuto1/pas-a-pas.tex @@ -34,9 +34,11 @@ ~ \begin{center} + Tutoriel pour Pamhyr2 Janvier 2024 + \par\end{center} ~ @@ -44,8 +46,10 @@ Janvier 2024 ~ \begin{center} + \textbf{\LARGE Modélisation 1D de la rivière } \\ \textbf{\LARGE Hogneau (Nord, France) avec Pamhyr2} + \par\end{center}{\LARGE \par} ~ @@ -57,7 +61,9 @@ Janvier 2024 \par\end{center}{\large \par} \begin{center} + RiverLy, Hydraulique des rivières + \par\end{center} ~ @@ -77,6 +83,7 @@ RiverLy, Hydraulique des rivi Autors : & Pierre-Antoine Rouby & pierre-antoine.rouby@inrae.fr\tabularnewline & Théophile TERRAZ & theophile.terraz@inrae.fr\tabularnewline & Lionel Pénard & lionel.penard@inrae.fr\tabularnewline + \end{tabular} \par\end{center} @@ -98,13 +105,16 @@ TODO \pagebreak{} + \section{Installer Pamhyr2} Pamhyr2 peut être téléchargé ici : \url{https://gitlab.irstea.fr/theophile.terraz/pamhyr}. + \begin{center} \includegraphics[width=15cm]{dl.png} \par\end{center} + Utilisez le bouton de téléchargement GNU Linux ou Windows en fonction de votre système. Sous Windows, lancez le programme d'installation. Sous Linux, décompressez l'archive et lancez Pamhyr2. @@ -115,10 +125,12 @@ Dans la fen Cliquez sur \texttt{[Réseau] => [Editer le réseau]} pour créer les biefs de votre rivière. Dans cette fenêtre, vous devez définir un graphe orienté qui représente les biefs de votre réseau fluvial : les arêtes sont les biefs et les n½uds sont soit des conditions limites amont, soit des conditions limites aval, soit des jonctions entre biefs. Appuyez sur le bouton \includegraphics[width=0.5cm]{gtk_add.png} pour entrer dans le mode \textit{Ajout}. Créez deux n½uds en cliquant dans la zone grise de la fenêtre, et créez un lien en cliquant à nouveau sur chaque n½ud. Appuyez à nouveau sur \includegraphics[width=0.5cm]{gtk_add.png} pour quitter le mode \textit{Ajout}. Vous avez créé votre premier bief, avec un n½ud amont et un n½ud aval. Dans la partie inférieure de la fenêtre \textit{Editer le réseau hydrographique}, vous pouvez renommer les n½uds et les biefs. Comme le bief que vous avez créé est automatiquement sélectionné, toutes les étapes suivantes s'appliqueront à ce bief. La fenêtre doit se présenter comme suit : + \begin{center} \includegraphics[width=15cm]{network.png} \par\end{center} + Fermer la fenêtre \textit{Editer le réseau}. @@ -126,19 +138,23 @@ Fermer la fen Cliquez sur \texttt{[Géometrie] => [Editer la géometrie]} pour définir la géométrie du bief sélectionné. Cliquez sur le bouton \texttt{[Importer]} et sélectionnez le fichier \texttt{Data/Bief\_1.st}. Vous devriez voir : + \begin{center} \includegraphics[width=15cm]{Geo.png} \par\end{center} + Le panneau de gauche contient une liste de toutes les sections en travers avec leur nom et leur abscisse longitudinale (PK). Dans le graphique en haut à gauche, vous pouvez voir la vue de dessus de la rivière, dans le panneau en haut à droite, la coupe longitudinale de la rivière et dans le graphique en bas, vous pouvez voir la section en travers sélectionnée (bleu) ainsi que la suivante (pointillés violets) et la précédente (pointillés noirs). Vous pouvez vous déplacer dans la liste des sections en cliquant dans le tableau ou à l'aide de l'ascenseur situé entre le tableau et les graphiques. Vous pouvez éditer la section en travers sélectionnée en cliquant sur l'icône \includegraphics[width=0.5cm]{"../../../src/View/ui/ressources/edit.png"}. Sélectionnez la section en travers nommée \textit{PontRD101m} et ouvrez la fenêtre d'édition. Vous devriez voir : + \begin{center} \includegraphics[width=15cm]{editsect.png} \par\end{center} + Sur le panneau de gauche se trouve la liste de tous les points de la section, avec leurs coordonnées, leur nom et leur abscisse transversale. La coordonnée Z du point le plus haut est inscrite en bleu et celle du point le plus bas en rouge. Les points peuvent avoir un nom. Si un point portant le même nom existe dans toutes les sections d'un bief, il forme une ligne longitudinale (ou ligne directrice). Par exemple, nous avons ici \textit{rg} et \textit{rd} qui représentent la rive gauche et la rive droite du lit mineur. Sur le graphique figure une projection de la section en travers. Vous pouvez utiliser \texttt{[ctrl + clic]} pour sélectionner un point dans le tracé et \texttt{[maj + clic]} pour sélectionner une ligne d'eau et visualiser des données géométriques utiles. Vous pouvez fermer la fenêtre d'édition de la section en travers et la fenêtre d'édition de la géométrie. @@ -151,6 +167,7 @@ Dans la fen \includegraphics[width=15cm]{boundary.png} \par\end{center} + Utilisez le bouton \textit{ajouter} en haut à gauche de la fenêtre pour ajouter une condition limite pour le liquide. Sur la nouvelle ligne, on peut cliquer pour sélectionner la ligne entière, et double-cliquer pour sélectionner la cellule. Sélectionnez la cellule \textit{Type} pour donner un nom à la condition limite. Ici, nous définirons le débit mesuré lors de la crue de février 2002. Vous pouvez nommer cette condition limite "crue2002". @@ -164,6 +181,7 @@ Dans la fen \includegraphics[width=15cm]{fev2002.png} \par\end{center} + Fermer cette fenêtre. Revenir sur la fenêtre \textit{Conditions aux limites}. Ajouter une nouvelle ligne, lui donner un nom, lui donner le type textit{Z(T)} et l'associer au noeud aval du réseau. Ouvrez la fenêtre \textit{Éditer les conditions aux limites} (\includegraphics[width=0.5cm]{"../../../src/View/ui/ressources/edit.png"}). Ajoutez deux lignes. Dans la première, entrez le temps : 0.00.00 et Z : 15.000. Dans la seconde, saisissez le temps : 1.00.00 et Z : 15.000. Cela crée une côte constante de l'eau en aval. Pour le calcul, Mage extrapolera continuellement l'élévation de l'eau. Vous pouvez fermer les fenêtres \textit{Éditer les conditions aux limites} et \textit{Conditions aux limites}. @@ -174,10 +192,12 @@ Dans la fen Si vous ne connaissez pas les conditions initiales de la côte de l'eau et du débit de la rivière, vous pouvez utiliser les boutons \texttt{[Générer une hauteur minimale]} ou \texttt{[Générer un débit constant]} pour laisser Pamhyr2 estimer une condition initiale à l'aide de la formule de Manning-Strickler. Cliquez sur \texttt{[Générer à partir du débit]} et saisissez un débit de $4 m^2$ dans la fenêtre contextuelle pour générer une condition initiale de hauteur d'eau basée sur la formule de Manning-Strickler et un débit uniforme de $4 m^2$. Vous devriez voir : + \begin{center} \includegraphics[width=15cm]{ic.png} \par\end{center} + Fermer la fenêtre \textit{Conditions initiales} @@ -186,16 +206,20 @@ Fermer la fen Dans la fenêtre principale, cliquez sur \texttt{[Hydraulique] => [Editer les frottements]}. Vous devez d'abord définir des jeux de coefficients de Strickler. Cliquez sur \includegraphics[width=0.5cm]{"../../../src/View/ui/ressources/edit.png"} pour ouvrir la fenêtre \textit{Strickler}. Vous pouvez y créer des couples de coefficients de Strickler, le premier pour le lit mineur, le second pour le lit moyen. Cliquez quatre fois sur \textit{add} pour créer quatre nouveaux couples. Donnez-leur les valeurs suivantes : + \begin{center} \includegraphics[width=15cm]{K.png} \par\end{center} + Fermez la fenêtre \textit{Strickler}. Dans la fenêtre \textit{Editer les frottements}, ajoutez quatre lignes avec le bouton \includegraphics[width=0.5cm]{gtk_add.png} pour créer quatre zones de frottement. Chaque zone est définie par un PK \textit{début} et de \textit{fin} PK et un couple \textit{begin} et \textit{end} couple de Strickler. Les couples de coefficients de Strickler à l'intérieur d'une zone sont interpolés à partir des couples \textit{begin} et \textit{end}. Dans notre cas, nous utiliserons des coefficients constants par zone. Définissez les zones comme suit : + \begin{center} \includegraphics[width=15cm]{frictions.png} \par\end{center} + La zone sélectionnée est surlignée en bleu. Fermez la fenêtre \textit{Editer les frottements}. @@ -204,25 +228,31 @@ La zone s Parfois, il peut y avoir des sections en travers dans lesquelles les équations de Saint-Venant ne peuvent pas être utilisées pour modéliser l'écoulement de l'eau. Dans ce cas, nous devons définir une autre loi pour relier la côte de l'eau et le débit. C'est le cas, par exemple, au niveau des ponts lorsque la hauteur d'eau est trop élevée, ce qui entraîne un écoulement en charge. Pamhyr2 permet de définir différents ouvrages hydrauliques avec des lois paramétrables. Dans notre cas, on doit représenter un seuil et deux ponts comme ouvrages hydrauliques. Dans la fenêtre principale, cliquez sur \texttt{[Hydraulique] => [Ouvrages hydrauliques]} pour ouvrir la fenêtre des ouvrages hydrauliques. Cliquez trois fois sur le bouton \includegraphics[width=0.5cm]{gtk_add.png} pour créer trois ouvrages hydrauliques. Chaque structure peut avoir un nom et doit avoir une portée et un PK. Définissez-les comme suit : + \begin{center} \includegraphics[width=15cm]{hs.png} \par\end{center} + Sélectionnez le déversoir aval et cliquez sur \includegraphics[width=0.5cm]{"../../../src/View/ui/ressources/edit.png"} pour modifier les lois de cette ouvrage. Les ouvrages hydrauliques sont composés d'ouvrages hydrauliques élémentaires. Vous pouvez combiner les lois de plusieurs ouvrages hydrauliques élémentaires pour créer votre ouvrage. Pour ce déversoir, nous n'avons besoin que d'un ouvrage hydraulique élémentaire de type déversoir. Cliquez sur \includegraphics[width=0.5cm]{gtk_add.png} pour ajouter un nouvel ouvrage hydraulique élémentaire, donnez-lui le type \textit{seuil} et configurez-le comme suit : + \begin{center} \includegraphics[width=15cm]{seuil.png} \par\end{center} + Retournez à la fenêtre \textit{Ouvrages hydrauliques}. Sélectionnez le pont RS101 et cliquez sur \includegraphics[width=0.5cm]{"../../../src/View/ui/ressources/edit.png"} pour éditer les lois de cet ouvrage. Un pont peut être modélisé comme une combinaison d'un orifice pour l'écoulement sous le pont et d'un déversoir pour l'écoulement au-dessus du pont. Créez deux ouvrages hydrauliques élémentaires et définissez-les comme suit : + \begin{center} \includegraphics[width=15cm]{seuilRS101.png} \includegraphics[width=15cm]{orificeRS101.png} \par\end{center} + Revenez à la fenêtre \textit{Ouvrages hydrauliques} et appliquez la même procédure pour le pont de Thivencelle : \begin{center} @@ -231,6 +261,7 @@ Revenez \includegraphics[width=15cm]{seuilThivencelle.png} \par\end{center} + Vous pouvez maintenant fermer les fenêtres \textit{Ouvrages hydrauliques}. \section{Paramètres du solveur} @@ -238,10 +269,12 @@ Vous pouvez maintenant fermer les fen Dans la fenêtre principale, cliquez sur \texttt{[Exécuter] => [Parameters numériques fdes solveurs]}. Dans la fenêtre \textit{Paramètres du solveur}, sélectionnez l'onglet \textit{Mage v8}. Réglez les paramètres du solveur comme suit : + \begin{center} \includegraphics[width=15cm]{param.png} \par\end{center} + Fermer la fenêtre \textit{Paramètres du solveur}. \section{Lancer la simulation} @@ -260,6 +293,7 @@ Pour cr Vous pouvez maintenant voir un nouvel onglet avec le tracé 2D personnalisé dans le panneau droit de la fenêtre \textit{Results}. + \pagebreak{} \end{document} diff --git a/packages/make-windows-dir.bat b/packages/make-windows-dir.bat index e2f386d712f5eec33244842be98ed91689cfe705..564b652391b2dec11a8ea737163ca9197e48aaf7 100644 --- a/packages/make-windows-dir.bat +++ b/packages/make-windows-dir.bat @@ -60,3 +60,9 @@ copy /y ..\doc\dev\documentation.html pamhyr\doc\Pamhyr2-dev.html copy /y ..\doc\users\images\* pamhyr\doc\images copy /y ..\doc\dev\images\* pamhyr\doc\images copy /y ..\doc\images\* pamhyr\doc\images +rem Tuto +mkdir pamhyr/doc/Tuto1/ +mkdir pamhyr/doc/Tuto1/data +copy /y ..\doc\users\Tuto1\step-by-step.pdf pamhyr\doc\Tuto1\Tuto1-en.pdf +copy /y ..\doc\users\Tuto1\pas-a-pas.pdf pamhyr\doc\Tuto1\Tuto1-fr.pdf +copy /y ..\doc\users\Tuto1\data\* pamhyr\doc\Tuto1\data\ diff --git a/src/Model/HydraulicStructures/Basic/Types.py b/src/Model/HydraulicStructures/Basic/Types.py index 96fde7ebfc594c9820b113bf1f921563ac8f4529..4b4cddd60f6895c9a6db51652d72f51d4556bf28 100644 --- a/src/Model/HydraulicStructures/Basic/Types.py +++ b/src/Model/HydraulicStructures/Basic/Types.py @@ -205,11 +205,13 @@ class CheckValve(BasicHS): self._type = "CV" self._data = [ - BHSValue("parameter_1", float, 0.0, status=status), - BHSValue("parameter_2", float, 0.0, status=status), - BHSValue("parameter_3", float, 0.0, status=status), - BHSValue("parameter_4", float, 0.0, status=status), - BHSValue("parameter_5", float, 0.0, status=status), + BHSValue("width", float, 0.0, status=status), + BHSValue("elevation", float, 0.0, status=status), + BHSValue("loading_elevation", float, 9999.999, + status=status), + BHSValue("discharge_coefficient", float, 0.4, status=status), + BHSValue("maximal_loading_elevation", float, 9999.999, + status=status), ] @@ -242,6 +244,6 @@ BHS_types = { "V1": RectangularGate, "V2": SimplifiedRectangularGate, "BO": Borda, - # "VC": CheckValve, + "CV": CheckValve, "UD": UserDefined } diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py index 2189e7bf5259bd3c84983a9010690f33192ec1f8..5f5b80fa17e9aeb769a547914fe7a557a1c85730 100644 --- a/src/Solver/Mage.py +++ b/src/Solver/Mage.py @@ -458,6 +458,7 @@ class Mage(CommandLineSolver): "ND": "*", "S1": "D", "S2": "T", "S3": "T", "OR": "O", "OC": "B", "OV": "F", + "CV": "O", # CheckValve "V1": "V", "V2": "W", "BO": "A", "UD": "X", @@ -496,10 +497,14 @@ class Mage(CommandLineSolver): ] ) + name = bhs.name + if name == "": + name = f"HS_{bhs.id:>3}".replace(" ", "0") + f.write( f"{sin_dict[bhs._type]} " + f"{reach_id} {hs.input_kp:>12.3f} {param_str} " + - f"{bhs.name}\n" + f"{name}\n" ) return files @@ -517,7 +522,7 @@ class Mage(CommandLineSolver): return res def _export_SIN_parameters_5(self, bhs): - # S2, OR, V1, V2, UD + # S2, OR, V1, V2, UD, CV return [ bhs._data[0].value, bhs._data[1].value, @@ -562,6 +567,42 @@ class Mage(CommandLineSolver): return res + @timer + def _export_VAR(self, study, repertory, qlog, name="0"): + files = [] + + hydraulic_structures = study.river.hydraulic_structures.lst + if len(hydraulic_structures) == 0: + return files + + if qlog is not None: + qlog.put("Export VAR file") + + with mage_file_open(os.path.join(repertory, f"{name}.VAR"), "w+") as f: + files.append(f"{name}.VAR") + + for hs in hydraulic_structures: + if hs.input_reach is None: + continue + + if not hs.input_reach.is_enable(): + continue + + for bhs in hs.basic_structures: + logger.info(bhs._type) + if bhs._type != "CV" : + continue + + name = bhs.name + if name == "": + name = f"HS_{bhs.id:>3}".replace(" ", "0") + + f.write( + f"${name} clapet" + ) + + return files + @timer def _export_DEV(self, study, repertory, qlog, name="0"): files = [] @@ -835,6 +876,7 @@ class Mage8(Mage): files = files + self._export_RUG(study, repertory, qlog, name=name) files = files + self._export_INI(study, repertory, qlog, name=name) files = files + self._export_SIN(study, repertory, qlog, name=name) + files = files + self._export_VAR(study, repertory, qlog, name=name) files = files + self._export_CAS(study, repertory, qlog, name=name) files = files + self._export_DEV(study, repertory, qlog, name=name) self._export_REP(study, repertory, files, qlog, name=name)