• Aucun résultat trouvé

Écoulements dans un réseau

CHAPITRE 9. ÉCOULEMENTS DANS UN RÉSEAU où W Sec est la section mouillée.

L’ensemble de ces grandeurs sont calculées soit en considérant le véritable fond du brin, si le booléen isponded est Faux, soit en considérant que le fond du tronçon se situe au dessus de la hauteur de ponding si le booléen est vrai.

WaterContent2WaterLevel

La méthode WaterContent2Waterlevel permet de convertir un volume d’eau en une hauteur d’eau à partir d’une géométrie connue. L’objectif de cette méthode étant de fournir la hauteur d’eau qui sera utilisée pour la résolution de l’équation de l’onde cinématique, il est nécessaire de ne considérer que l’eau qui pourra effectivement se déplacer dans le réseau. C’est-à-dire l’eau située au dessus de la hauteur de ponding renseignée par l’utilisateur. Cette méthode prend comme argument d’entrée le volume d’eau disponible dans le tronçon et renvoit en sortie une hauteur d’eau calculée à partir d’un fond virtuel au niveau de la hauteur maximale de ponding WaterLevel_RO et une hauteur d’eau calculée depuis le vrai fond du tronçon WaterLevel_TOTAL. Ces deux variables sont illustrées figure 28.

Figure 28 – Variables WaterContent, WaterLevel_TOTAL, WaterLevel_RO

RKCK_RightHandSide

Cette méthode permet de calculer le membre de droite de l’équation 9.6. Elle prend en entrée une hauteur d’eau WaterLevel laquelle sera utilisée pour appeler la méthode GeometrySimple.

RungeKuttaCashKarp

Cette méthode met en oeuvre la méthode de résolution de Runge-Kutta à l’ordre 4 avec les coefficients de Cash (voir Annexe B). On rappelle que la variable de résolution est une hauteur d’eau, initialisée à Y0 et le membre de droite de l’équation de continuité 9.6 ainsi que le pas de temps utilisé pour la résolution sont également donnés en entrée.

9.4.3

Classe Network

La classe Network réunit plusieurs tronçons de rivière ou fossé pour former un réseau sur lequel est résolue l’équation de l’onde cinématique. Elle est construite par association association ou... ? je ne sais jamais lequel d’instances de la classe Reach. Chaque réseau se caractérise également par un ordre de parcours des tronçons qui est déterminé dans la section 9.4.1. On précise aussi le type d’éléments qui composent le réseau (un réseau ne peut être constitué que d’un seul type d’élément).

__init__

Une instance de la classe Network s’initialise à partir de : — idx(scal) : un indice pour identifier le réseau ;

— nature(string) : une chaîne de caractères indiquant si le réseau est composé de fossés ("ditch") ou de rivières ("river") ;

— ReachDic(dictionnary) : un dictionnaire contenant m instances de la classe Reach ; — RoutingOrder(0 :m) : un vecteur ordonné qui définit l’ordre de parcours des

tronçons dans le réseau ;

— Outlet(0 :2,0 :l) : un tableau contenant l’ensemble des connections entre réseaux. Pour chaque connexion, la première colonne contient l’indice du tronçon exutoire du réseau amont connecté à un autre réseau aval. La seconde colonne contient l’indice du tronçon de l’autre réseau dans lequel se jette le tronçon repéré dans la première colonne. Par exemple, dans le cas de la Figure 10, le tableau Outlet contiendrait une seule ligne : "12 ; 9".

— WaterOutlet(scal) : le volume d’eau cumulé qui a traversé l’exutoire identifié pour le réseau donné. Cette variable est incrémentée à condition que l’exutoire du réseau soit effectivement connecté à un autre réseau en aval. Cette connexion est renseignée dans le tableau Outlet.

— SoluteOutlet(1 :n_solute) : pour chacun des soluté simulé, la masse cumulée qui a traversé l’exutoire identifié pour le réseau donné. A nouveau, cette variable est incrémentée à condition que l’exutoire du réseau soit effectivement connecté à un autre réseau en aval.

handle_RKCK_Resolution

C’est la méthode principale de la classe Network. Elle permet de résoudre l’équation de l’onde cinématique sur le réseau en utilisant la méthode de RKCK. Durant un pas de temps, le niveau d’eau dans chaque tronçon du réseau est mis à jour ; plusieurs fois, si le pas de temps déterminé pour la résolution le nécessite. Les opérations suivantes sont effectuées jusqu’à arriver à la fin du pas de temps :

— Les tronçons sont parcourus dans l’ordre et le débit d’eau entrant et sortant de chacun d’eux est déterminé en fonction du niveau d’eau et des éléments situés en amont et en aval. Le débit à destination d’un autre réseau éventuellement connecté à l’aval est stocké.

— Le pas de temps pour la méthode RKCK est déterminé de manière à garder l’erreur de la solution inférieure à un seuil fixé par la variable Tolérance. A noter que dans ce bloc de code, le pas de temps ne peut-être qu’augmenter si la contrainte sur l’erreur n’est pas atteinte et que la solution est "trop" précise. Une fois qu’un pas de temps suffisamment grossier a été identifié, on appelle une autre méthode EvalTimeStep, décrite plus bas pour vérifier spécifiquement que le pas de temps permet toujours d’obtenir une solution suffisamment précise. Je n’ai pas bien compris pourquoi ces deux étapes sont séparées et ne peuvent pas se faire en un seul bloc. J’ai repris cette structure du code de LIQUID après m’être rendue compte qu’une structure plus simple, en un bloc ne conduisait pas à des résultats satisfaisants....à creuser.

CHAPITRE 9. ÉCOULEMENTS DANS UN RÉSEAU

— Les tronçons sont parcourus dans l’ordre et le débit de solutés entrant et sortant de chacun d’eux est déterminé en fonction des éléments situés en amont et en aval. A nouveau, le débit à destination d’un autre réseau éventuellement connecté à l’aval est stocké.

— Le transport advectif de solutés est calculé en faisant un bilan de masse sur chaque tronçon. La masse disponible dans chaque tronçon est mise à jour.

— La résolution de RKCK est lancée sur chaque tronçon à partir des débits d’eau entrants, sortants. Pour cela, la méthode RungeKuttaCashKarp de la classe Reach est appelée. Ceci permet de mettre à jour la variable hauteur d’eau (au dessus de la hauteur de ponding) puis d’actualiser le volume d’eau total dans le tronçon ainsi que l’état du réservoir de ponding (plein ou non).

— A partir de ces nouveaux volumes d’eau mis à jour dans chaque tronçon, la quantité de solutés dissous est elle aussi mise à jour dans chaque tronçon. — Enfin, les variables de forçage cumulé sont mises à jour.

EvalTimeStep

Cette méthode détermine le pas de temps nécessaire à la résolution RKCK permettant de respecter le seuil de qualité fixé par la variable Tolerance. Pour cela, une première résolution à partir d’un pas de temps de base est simulée sur tout le réseau. On appelle pour cela la méthode RungeKuttaCashKarp de la classe Reach. On stocke alors l’erreur obtenue conformément aux recommandations faites dans (Press et al., 1992) et re-détaillées en Annexe B. En comparant l’erreur obtenue à la variable Tolerance, on adapte alors le pas de temps en le raffinant si l’erreur sur la solution n’est pas satisfaisante. Le processus est itératif jusqu’à obtenir un résultat satisfaisant.

adsorption

L’équilibre d’adsorption pour tous les tronçons d’un réseau est calculé par cette méthode. Pour chacun des tronçons, la méthode récupère ou détermine le volume d’eau total et le volume d’eau en contact avec la bande d’adsorption. A nouveau, on fait l’hypothèse que dans la bande d’adsorption, le substrat/sol est en suspension dans l’eau du fossé. L’équilibre d’adsorption est alors déterminé dans cette bande d’adsorption.

degradation

Pour chacun des solutés simulés, la quantité de solutés dégradée est déterminée, les stocks sont mis à jour en alimentant éventuellement les stocks de métabolites.

9.4.4

Module use_launch_RIVER1D

Le module use_launch_RIVER1D permet de créer toutes les instances des classes Reach et Network permettant la résolution de l’onde cinématique sur les différents réseaux du bassin versant simulé. C’est également le module qui fait le lien avec le reste du modèle en récupérant puis transmettant toutes les variables et paramètres stockés dans des variables PALM. Pour cela, les étapes suivantes sont effectuées :

— Réception de toutes les données relatives à la description du BV : liste des linéaires, des fossés, des rivières, etc... ;

— Chargement des données décrivant chaque tronçon de fossé et initialisation d’une instance de la classe Reach pour chacun d’entre eux ;

— Chargement des données décrivant chaque tronçon de rivière et initialisation d’une instance de la classe Reach pour chacun d’entre eux ;

— Identification des différents réseaux de fossés indépendants et de l’ordre de parcours qui les caractérise. Pour cela, on fait appel à la fonction d’analyse du paysage spécialement développée get_order_reach. A partir d’une table de connexions entre tronçons et d’une information sur l’altitude de ces tronçons, cette fonction renvoie le nombre de réseaux indépendants identifiés et une liste contenant des listes ordonnées d’indices de tronçons pour chaque réseau. Chacune de ces listes ordonnées d’indices correspond à l’ordre de parcours du réseau.

— Identification des différents réseaux de rivières indépendants et de l’ordre de parcours qui les caractérise ;

— Initialise de la simulation : pour cela, il faut initialiser le niveau d’eau et la vitesse de Manning dans chaque tronçon de fossé et de rivière. ;

— Lancement de la simulation entre t et t+dt_PALM. La résolution se fait d’abord sur les réseaux de fossés. Ainsi, cela permet d’obtenir un éventuellement terme source correspondant à un réseau de fossés dont l’exutoire serait relié à la rivière. Ce terme source déjà calculé pourrait alors être injecté au même pas de temps lors de la résolution pour les réseaux de rivière.

Chapitre 10