Cours GMRES
Cours GMRES
Cours
Modélisation et Gestion
des Ressources en
Eau Souterraine
Ali HAMMANI
0
Etudedesnappessouterraines
Chapitre 1
parlebilanhydrogéologique
Dans la gestion des ressources en eau souterraines, l'homme intervient dans le cycle hydrologique
dans le but de tirer profit. Cette intervention prend la forme de modifications imposées sur les
variations des composantes du bilan hydrique des nappes.
Une des parties la plus importante de l'hydrogéologie est, donc, la connaissance du bilan hy-
drogéologique. Déterminer la part de l'eau qui circule souterrainement est un problème majeur,
puisque c'est cette part qui fournit les ressources utilisables. C'est un problème difficile à résoudre.
Le bilan se réalise dans le but de déterminer la contribution de chaque terme dans l'alimentation et le
rabattement de la nappe et de connaître et évaluer sa réserve dans le temps (notamment pendant
la période de sécheresse ou les périodes à fortes précipitations). Le bilan peut servir comme outil
de prise de décisions quant à la gestion de la ressource en eau souterraine.
Le bilan peut être calculé pour toute une région, par exemple pour un bassin fluvial. C'est facile.
Mais il englobe toutes les nappes du bassin, les terrains perméables et imperméables, les zones
saturées et non saturées.
1
Chapitre 1 : Etude des nappes souterraines par le bilan hydrogéologique 2
Où :
• Ap et Ai sont les apports respectivement par les précipitations et par irrigation;
• L : Apports occultes;
• I : Percolation profonde des eaux de pluie et d'irrigation;
• E : Composée de l'évapotranspiration des cultures et de l'évapotranspiration directe à partir
de la nappe dans le cas où la nappe est très proche de la surface du sol;
• R : Terme qui englobe le ruissellement de surface le drainage à partir de la nappe.
• Ex : Terme qui englobe les quantités d'eau prélevées de la nappe pour l'exploitation dans le
cas où cette eau est utilisée à l'extérieur du bassin.
• ∆S est la variation du stock d'eau dans le sol. Pour une période longue de l'ordre de l'année
∆S peut être négligée.
Où :
∑ Pi + Pi+1 Si
P = Pi (1.3)
i
2 S
∑ Ai
P = Pi (1.4)
A
Ip = P iS (1.5)
Où :
• Ip est l'infiltration efficace des eaux de pluie; P est la hauteur de la pluviométrie moyenne
calculée sur tout le domaine de la nappe.
• S est la superficie totale du domaine de la nappe.
• i est le coefficient d'infiltration. Il peut ôter estimé par plusieurs méthodes.
c. Détermination du coefficient d’infiltration
L'eau de précipitation et/ou d'irrigation, après avoir subi des pertes par évapotranspiration et
absorption par la couverture végétale parvient à la surface du sol où elle se répartit en deux
fractions : Le ruissellement de surface et l'infiltration.
L'infiltration représente la quantité d'eau qui pénètre dans le sol et le sous-sol où elle alimente les eaux
souterraines: eau de rétention, écoulement hypodermique, écoulement souterrain et reconstitution
des réserves aquifères.
L'évaporation dépense une part importante du stock d'humidité. Ainsi une fraction seulement des
précipitations alimente les nappes. C'est l’infiltration efficace.
Le taux d'infiltration est exprimé en millimètres de hauteur d'eau. Les hydrologues utilisent très souvent
le terme de coefficient d'infiltration qui est le quotient, exprimé en pourcentage, du taux d'infiltration
par la hauteur de précipitation.
L'infiltration est, en hydrologie, le facteur le plus important du cycle de l'eau et aussi le plus difficile
à évaluer car il échappe aux mesures directes par des processus simples.
Les méthodes de mesure de l'infiltration sont nombreuses et variées en relation avec les phénomènes
étudiés. Elles peuvent ôter directes ou indirectes.
i) Méthodes directes
Elles permettent d'évaluer la quantité d'eau infiltrée sur une surface de sol déterminée. Elles com-
prennent:
• La méthode expérimentale par alimentation en eau à l'aide de fossés, rigoles, tranchées ou
tubes crépinés enfoncés dans le terrain;
• Le débit des sources dans un bassin hydrogéologique individualisé en fonction de la plu-
viométrie;
• Les lysimètres;
• Les mesures de gradient vertical d'humidité dans le sol;
• L'étude des variations de la surface piézométrique dans un bassin hydrogéologique et des
oscillations du niveau piézométrique dans les puits. Cette méthode sera développée par la
suite.
ii) Méthodes indirectes
Dans les méthodes indirectes l'infiltration est calculée par différence des entrées et des sorties. Les
autres termes du bilan hydrologique, précipitation, ruissellement et évapotranspiration étant connus.
Pour une longue période (de l'ordre de l'année par exemple), on peut négliger la variation de la
réserve et donc le bilan peut s'écrire :
P =E+R+I (1.6)
Où :
• P : Précipitation;
• E : Evapotranspiration;
• R : Ruissellement;
• I : Infiltration.
On en déduit l'infiltration par différence :
I =P −E−R (1.7)
Et le coefficient d'infiltration i :
I
i= (1.8)
P
Où:
• V = Volume d'eau provenant du barrage et distribué par le réseau d'irrigation;
• i = Coefficient d'infiltration au niveau de la parcelle;
• i′ = Coefficient d'infiltration au niveau du réseau d'irrigation.
b. Méthode d’approche
L'estimation des flux latéraux peut ôter faite en utilisant la loi de Darcy.
Pour ce faire, on doit avoir les données piézométriques, et hydrodynamiques pour un ensemble de
points situés à l'extrémité où les apports se réalisent. Le calcul se fait moyennant la formule suivante:
∆H
Q(m3 /s) = T L (1.10)
l
Les sorties:
Les prélèvements à partir de la nappe peuvent ôter constitués des pompages, du drainage naturel
et artificiel, de la drainance et de l'évapotranspiration directe à partir de la nappe.
Variation de la réserve
La différence entre les entrées et les sorties pour une période où le bilan a été établi donne la
variation de la réserve de la nappe. Pour une nappe de surface A, un volume d'eau ∆S stocké
dans un aquifère cause une remontée du niveau de la nappe de ∆h:
∆S = SA∆h (1.13)
∑
N
∆S = Sj Aj ∆hj (1.14)
j=1
# objet map
m = Map(center=(33.25, -7.57), zoom = 10, basemap = basemaps.Esri.WorldImagery)
m.layout.width = '100%'
m.layout.height = '700px'
m.add_layer(basemaps.Esri.WorldStreetMap)
m.add_control(ScaleControl(position='bottomleft'))
m.add_control(FullScreenControl(position='topright'))
m.add_control(LayersControl())
m.add_control(MeasureControl(position='bottomleft',active_color =␣
,→'orange',primary_length_unit = 'kilometers'))
display(m)
selDf = gpd.read_file('data/NappeBerchidXY.shp')
geoDfA = selDf.to_crs(4326)
geoDataAquifer = GeoData(geo_dataframe=geoDfA, name='NappeBerchidXY')
m.add_layer(geoDataAquifer)
geoDfB = gpd.read_file('data/BassinsAmont.shp')
geoDataBasins = GeoData(geo_dataframe=geoDfB, name='Bassins Amont')
m.add_layer(geoDataBasins)
selDfP1016 = gpd.read_file('data/Piezo1016a.shp')
geoDfP1016 = selDfP1016.to_crs(4326)
geoDataPiezo1016 = GeoData(geo_dataframe=geoDfP1016, name='Piézo 10/2016')
m.add_layer(geoDataPiezo1016)
/Users/alihammani/opt/miniconda3/lib/python3.9/site-
packages/geopandas/_compat.py:111: UserWarning: The Shapely GEOS version
(3.9.1-CAPI-1.14.2) is incompatible with the GEOS version PyGEOS was compiled
with (3.10.1-CAPI-1.16.0). Conversions between both will be slow.
warnings.warn(
Map(center=[33.25, -7.57], controls=(ZoomControl(options=['position', 'zoom_in_text',␣
,→'zoom_in_title', 'zoom_o…
df1 = pd.read_excel('data/PiezoBerchid.xlsx',sheet_name='06_2016')
x1 = df1['X']
y1 = df1['Y']
z1 = df1['Z']
h1 = df1['H']
df2 = pd.read_excel('data/PiezoBerchid.xlsx',sheet_name='10_2016')
x2 = df2['X']
y2 = df2['Y']
z2 = df2['Z']
h2 = df2['H']
Boundary_Shapefile = './data/NappeBerchidXY.shp'
boundary = gpd.read_file(Boundary_Shapefile)
# Générer une grille pour x et y pour 100 points dans chaque direction
grid_x = np.linspace(xmin, xmax, 100)
grid_y = np.linspace(ymin, ymax, 100)
boundarygeom = boundary.geometry
dx=(xmax-xmin)/100
dy=(ymax-ymin)/100
dh=h2-h1
xx=xmin
V=0
S=0.05
A=dx*dy
N=0
for i in range(100):
yy=ymin
for j in range(100):
point= Point(xx,yy)
v=int(boundarygeom.contains(point))
#print(len(x),len(y))
if v==0:
h1[j][i]=np.NaN
h2[j][i]=np.NaN
dh[j][i]=np.NaN
else:
V += dh[j][i]
N += 1
yy+=dy
xx+=dx
V = A*S*V/1000000
print('La variation de la réserve est : %5.3f'% V, 'Mm3')
npts = len(x1)
plt.yticks(fontsize = 20)
# Charges hydraulique
plt.show()
110.13999999999999 282.52
Adjusting data for anisotropy…
Initializing variogram model…
Coordinates type: 'euclidean'
colorscale=[[0.0, 'rgb(20,29,67)'],
[0.1, 'rgb(28,76,96)'],
[0.2, 'rgb(16,125,121)'],
[0.3, 'rgb(92,166,133)'],
[0.4, 'rgb(182,202,175)'],
[0.5, 'rgb(253,245,243)'],
[0.6, 'rgb(230,183,162)'],
[0.7, 'rgb(211,118,105)'],
[0.8, 'rgb(174,63,95)'],
[0.9, 'rgb(116,25,93)'],
[1.0, 'rgb(51,13,53)']]
fig = go.Figure(data=[
go.Surface(z=h1, x=xintrp, y=yintrp, opacity=0.8, colorscale='Electric',␣
,→showscale=True),
])
"""
go.Surface(
x=xintrp,
y=yintrp,
z=dh,
#surfacecolor=z2,
opacity=0.5,
cmin=-1,
cmax=1,
colorscale='RdBu',
colorbar=dict(len=0.3, x=0.8, y=0.5),
#figsize=(20,10),
),
"""
fig.update_traces(contours_z=dict(show=True, usecolormap=True,
highlightcolor="limegreen", project_z=True))
fig.update_layout(
autosize=True,
scene = dict(
zaxis = dict(nticks=4, range=[0,320],),
),
width=1000,
margin=dict(r=20, l=10, b=10, t=10)
)
fig.show()
def WaterBalance(iir,iip,ip,a,S):
DSc = (iir+iip)*Ai + 10*ip*Ap*a/1000000 + Al - Dr - NDr - DW - Agri
n=len(Period)
CumC.clear()
CumM.clear()
SumC=0
SumM=0
for i in range(0,n):
SumC += DSc[i]
CumC.append(SumC)
SumM += DSm[i]*S*a/100
CumM.append(SumM)
fig = plt.figure(figsize=(18,9))
ax = fig.add_subplot()
ax.plot(Period,CumM)
ax.plot(Period,CumC)
ax.set(xlabel='Période', ylabel='Variation de la réserve',title='Evolution de␣
,→lréserve mesurée et la réserve calculée')
plt.show()
df = pd.read_excel('data/BilanBM.xlsx')
Period=df['Period']
Ai = df['Irrigation']
Ap = df['Rainfall']
Al = df['LateralInflow']
Dr = df['ArtificialDrainage']
NDr = df['NaturalDrainage']
DW = df['DWPumping']
Agri = df['AgriPumping']
DSm = df['DS']
CumC=[]
CumM=[]
interact(WaterBalance,
iir=widgets.FloatSlider(value=0.1,min=0, max=0.5, step=0.005),
iip=widgets.FloatSlider(value=0.28,min=0, max=0.5, step=0.005),
ip=widgets.FloatSlider(value=0.2,min=0, max=0.5, step=0.005),
a=widgets.FloatSlider(value=69500,min=40000, max=100000, step=500),
S=widgets.FloatSlider(value=0.009,min=0, max=0.2, step=0.001,␣
,→layout=Layout(width='70%'))
écoulementssouterrains
Introduction
Définitions
a. Modèle
Un modèle est un outil désigné pour représenter une version simplifiée de la réalité.
En hydraulique souterraine, tout système pouvant reproduire la réponse ou le comportement d'un
réservoir souterrain est appelé modèle de celui-ci.
b. Simulation
La simulation est l'utilisation du modèle dans les applications réelles.
Si le modèle est bien élaboré, il peut être un outil de prédiction pour la gestion des ressources
en eau souterraine. Par exemple, en utilisant le modèle d'écoulement des eaux souterraines, il est
possible de tester différents schémas de gestion et de prédire l'effet de certaines actions. La validité
de la prédiction dépend des conditions d'approximation du modèle. Une bonne masse de données
est nécessaire pour une bonne prédiction par le modèle.
15
Chapitre 2: Modélisation numérique des écoulements souterrains 16
Modèles mathématiques
Ils consistent à résoudre l'équation différentielle qui gouverne l'écoulement souterrain. La fiabilité
des prédictions par les modèles mathématiques dépend de la façon dont le modèle approche la
situation réelle. Des hypothèses simplificatrices doivent être faites pour construire le modèle du fait
que les situations sur le terrain sont plus complexes à être simulées exactement.
Il y a deux types de modèles mathématiques: les modèles analytiques et les modèles numériques.
• modèles analytiques se limitent aux cas simples et nécessitent beaucoup de simplifications dans
les cas complexes. Exemples: Formules de Dupuit, Jacob, Theis, ...etc.
• Pour traiter les situations réelles, il est souvent nécessaire de résoudre les modèles mathématiques
en utilisant les techniques numériques vu le développement des moyens de calcul. Les méthodes
les plus couramment utilisés pour la modélisation des problèmes d'écoulement souterrains sont
les méthodes de différences finies et les méthodes des éléments finies. La caractéristique de
ces deux méthodes est que le domaine d'écoulement est limité. Leur avantage est que les
paramètres hydrodynamiques peuvent être facilement variés à travers le système aquifère,
la formulation est convenable pour la modélisation des écoulements transitoires et que la
comparaison des résultats peut se faire directement.
5. On peut trouver une solution analytique, mais son expression est si complexe (par exemple,
la somme d'une série infinie, l'intégrale de fonctions complexes) que les calculs numériques de
sa valeur demandent beaucoup plus d'effort (de programmation et de temps) que l'utilisation
directe d'une solution numérique du problème originel.
Dans les cas où des solutions numériques sont demandées, il faut d'abord décider: (i) quelle méthode
numérique choisir (essentiellement, différences finies, éléments finis, éléments limites), et (ii) comment
obtenir un code (le programmer ou obtenir l'accès à un code qui existe déjà ).
Il n'y a pas de réponse unanimement acceptée à la première question; au sujet des trois méthodes
décrites ci-dessus, on peut faire les remarques suivantes:
1. Différences finies : Cette méthode est facile à comprendre et à programmer. Elle convient très
bien à la résolution des problèmes régionaux d'écoulement des nappes, en une ou deux dimensions,
dans des systèmes multicouches ou en trois dimensions. Bien qu'elle soit, en principe, capable de
traiter des mailles de n'importe quelle forme et taille, elle est, en pratique, limitée à des mailles simples:
des carrés réguliers, des carrés gigognes, des rectangles ou des parallélépipèdes rectangulaires
en trois dimensions (figure 2.1). Elle peut très bien représenter les hétérogénéités des propriétés du
milieu, pourvu que la forme de ces hétérogénéités puisse être décrite de façon adéquate par la
forme des mailles; dans la pratique, l'anisotropie doit être limitée aux directions parallèles aux côtés
des mailles.
2. Eléments finis : Cette méthode est moins facile à expliquer et beaucoup moins facile à program-
mer que la précédente. Comme cette approche est plus flexible que celle des différences finies, un
programme d'éléments finis peut être plus compliqué à utiliser (davantage de données d'entrée, par
exemple, sur la géométrie des mailles, donc plus de possibilités d'erreurs) et peut demander davan-
tage de temps ordinateur. Cependant, la forme des mailles est beaucoup moins limitée: en pratique,
on prend des triangles et des quadrilatères en deux dimensions et, en trois dimensions, des tétraèdres
ou des parallélépipèdes de n'importe quel angle (figure 2.1). Ceci permet de décrire d'une manière
beaucoup plus satisfaisante la forme des limites du milieu ainsi que celle des hétérogénéités ou les
fonctions source, ce qui rend également la méthode éléments idéale pour résoudre les problèmes
à limites mobiles, par exemple, ceux ayant une surface libre et une interface abrupte entre eau
douce et eau salée ou entre deux fluides immiscibles. Elle est capable de traiter toutes les directions
d'anisotropie, et ces directions peuvent même changer d'un élément à un autre ou avec le temps.
En pratique, dans les problèmes d'écoulement, la méthode des éléments finis peut être employée
pour des études régionales, mais elle est pratiquement efficace dans les problèmes locaux de génie
civil tels que l'exhaure de l'eau d'une excavation, le drainage d'une mine et l'écoulement autour d'un
barrage, où les formes des limites et des hétérogénéités doivent être représentés avec précision.
Remarquez que quand il faut calculer les poussées en tant qu'entrée d'un modèle mécanique, il est
souvent nécessaire de le faire sur le même réseau que celui utilisé pour les calculs de structure, et
presque tous ceux-ci utilisent des éléments finis. Pour résoudre l'équation de transfert, la méthode
des éléments finis est bien supérieure à celle des différences finies.
3. Des approches d’éléments aux limites ou d’intégrales de limites ont été proposées récemment pour
résoudre l'équation d'écoulement. L'avantage principal de celles-ci est que la précision du calcul
ne dépend pas de la taille des éléments finis. Ainsi, on peut se servir de quelques éléments très
grands (ou même infinis), ce qui rend la méthode très efficace du point de vue du temps de calcul.
Dans un premier temps, la solution numérique se calcule uniquement le long des limites des éléments;
si l'on demande explicitement la solution à l'intérieur d'un élément, sa valeur est calculée dans un
second temps par une intégration numérique dans cet élément. La restriction principale est que les
propriétés du milieu, dans un élément donné, sont supposées constantes: si les hétérogénéités du
milieu sont telles qu'il faut inclure un grand nombre d'éléments afin de les décrire convenablement,
alors la méthode de l'intégrale des limites perd de sa supériorité, et l'on peut aussi bien se servir
de celle des différences finies ou de celle des éléments finis. Par conséquent, cette méthode est
beaucoup moins flexible et générale que les précédentes.
La deuxième question : comment obtenir un code relève plutôt du jugement personnel et on ne
peut qu'offrir quelques suggestions. La programmation d'un code simple de différences finies pour
un problème en une ou deux dimensions avec des mailles simples (carrés ou rectangle) et des limites
simples peut se faire en quelques jours. Toutefois, ce code ne sera pas facile à utiliser; si on veut
le rendre d'utilisation aisée (c'est-à -dire lui donner, par exemple, des données d'entrée simples, une
recherche d'erreurs et des massages d'erreur, des sorties graphiques), cela peut demander quelques
mois. Un code plus complexe en différences finies, multicouches ou à trois dimensions, ayant plusieurs
options (par exemple, des non linéarités) peut exiger de six à un an de travail, tout comme un code
en éléments finis à deux dimensions qui soit facilement maniable. Un code très complexe de transfert
en éléments finis à deux dimensions peut demander un effort allant d'un à deux ans, et un modèle de
gisement pétrolier à composantes et phases multiples à trois dimensions peut représenter un effort
de cinq à dix années (ou plus). Il ne faut pas oublier qu'un nouveau code doit être soigneusement
vérifié et validé à l'aide de solutions analytiques (ou numériques) connues avant qu'il puisse être
utilisé dans un contexte sérieux. Ces tests risquent d'être très longs.
Dans ce qui suit, nous décrivons brièvement la méthode des différences finies pour résoudre les
équations d'écoulement en nappe homogène et isotrope, et pour résoudre la même équation dans
le cas général d'écoulement transitoire en nappe homogène et anisotrope.
Où:
L'expression de la dérivée seconde de Φ par rapport à x au niveau du noeud (i, j) est obtenue
comme suit: [ 2 ]
∂ Φ Φi+1,j − 2Φi,j + Φi−1,j
2
= (2.3)
∂x i,j a2
∂2Φ
∂x2 est exprimée de la même façon et on obtient l'expression suivante pour le Laplacien:
[ 2 ] Φi−1,j + Φi+1,j + Φi,j−1 + Φi,j−1 − 4Φi,j
∆ Φ i,j = (2.4)
a2
En utilisant l'expression de l'équation différentielle (2.1) et en représentant N au noeud (i, j) par Ni,j ,
on obtient:
Φi−1,j + Φi+1,j + Φi,j−1 + Φi,j+1 − 4Φi,j = −a2 Ni,j (2.5)
Cette équation est appliquée à chaque noeud et est utilisée avec les conditions aux limites pour
obtenir le potentiel hydraulique dans tous les noeuds.
Méthodes de résolution
La méthode simple pour la résolution du système d'équations (2.6) est la méthode de Jacobi, où
chaque valeur Φi,j est estimée en premier lieu à chaque noeud intérieur, et les valeurs des itérations
suivantes sont obtenues par l'application de l'équation (2.6) à chaque noeud en utilisant la valeur
calculée de l'itération précédente.
1 m
Φm+1 = [Φ + Φm m m 2
i+1,j + Φi,j−1 + Φi,j+1 + a Ni,j ] (2.7)
i,j
4 i−1,j
Les valeurs de i et j sont nulles pour les noeuds extrêmes, qui sont appelés noeuds imaginaires. Pour
le cas ci-dessus, ∂Φ ∂Φ
∂n est donnée le long de la limite x = 0, i = 1 et ∂n pour le noeud (1, j) estimé
par: [ ] [ ]
∂Φ ∂Φ Φ2,j − Φ0,j
= = (2.9)
∂n 1,j ∂x 1,j 2a
Donc:
[ ]
∂Φ
Φ0,j = Φ2,j − 2a (2.10)
∂n 1,j
L'équation (2.10) est utilisée pour calculer la valeur de ∇2 Φ aux noeuds limites, l'expression (2.8)
devient: [ ] ]
1[ m ∂Φ
Φ1,j = Φ2,j + Φ1,j−1 + Φ1,j+1 + a N1,j − 2a
m+1 m m+1 2
(2.11)
4 ∂x 1,j
∂Φ
Les valeurs limites de ∂n sont ainsi appliquées par l'utilisation de (2.10) au lieu de (2.8).
# Définition de la fonction
def Confined1D(N,h1,hn,L,kmax):
x = np.arange(0, L+L/N,L/N)
# Solution Analytique
phi_ana = (hn-h1)/L*x + h1
# Solution numérique
phi0_num = np.ones(N+1)*h1
phi0_num[0] = h1; phi0_num[N] = hn;
phi_num = phi0_num
Er=np.full(N+1, 9999)
k=0
while k<kmax: #Er>0.00001:
k += 1
for i in range(1,N):
phi_num[i] = (phi0_num[i+1] + phi_num[i-1]) / 2
phi0_num = phi_num
#Er=abs(phi_num[1:3]-phi0_num[1:3])
Er=abs(phi_num-phi_ana)
print("Erreur moyenne introduite : %10.5f" % Er.mean())
fig = plt.figure(figsize=(18,9))
ax = fig.add_subplot()
ax.plot(x,phi_ana)
ax.plot(x,phi_num)
ax.set(xlabel='x', ylabel='Charge hydraulique',title='Ecoulement␣
,→unidimentionnel en nappe captive')
Confined1D(10,15,10,100,20)
print(phi)
24.9499498997493
# Définition de la fonction
def Unconfined1D(N,h1,h2,L,I,K,kmax):
DeltaX=L/N
x = np.arange(-L/2, L/2+DeltaX,DeltaX)
# Solution Analytique
phi_ana=np.full(N+1, h1)
phi_ana[N] = h2
for i in range(1,N):
phi_ana[i] = math.sqrt( -I/K*(x[i]**2 - L**2/4) - (h1**2-h2**2)/L*x[i] +␣
,→(h1**2 + h2**2)/2 )
# Solution numérique
phi0_num = np.full(N+1, h1)
phi0_num[0] = h1; phi0_num[N] = h2;
phi_num = phi0_num
Er=np.full(N+1, 9999)
k=0
while k<kmax:
k += 1
for i in range(1,N):
Phi = (K/2*phi0_num[i+1]**2 + K/2*phi_num[i-1]**2 + I*DeltaX**2 ) / 2
phi_num[i] = math.sqrt(2*Phi/K)
phi0_num = phi_num
#Er=abs(phi_num[1:3]-phi0_num[1:3])
Er=abs(phi_num-phi_ana)
print("Erreur moyenne introduite : %10.5f" % Er.mean())
xd = -K/I/L/2*(h1**2-h2**2)
print("Point de partage des eaux x_d : %6.3f" % xd)
fig = plt.figure(figsize=(18,9))
ax = fig.add_subplot()
ax.plot(x,phi_ana, marker = '+')
ax.plot(x,phi_num)
ax.set(xlabel='x', ylabel='Charge hydraulique',title='Ecoulement␣
,→unidimentionnel en nappe captive')
Unconfined1D(10,15.,15.,100.,0.00001,0.0001,20)
Equation de l’écoulement
L'équation différentielle pour un écoulement transitoire dans un aquifère à surface libre homogène
et isotrope est donnée par:
∂h
∆2 Φ = Sp −N (2.12)
∂t
Cette expression est appelée explicite car le Laplacien est calculé au temps t de telle sorte que
l'expression de la charge au temps t + ∆t est obtenue comme suit:
∆t 2
ht+∆t = ht + [∆ Φ + N ] (2.14)
Sp
L'avantage de cette formulation est que la linéarisation de l'équation différentielle n'est pas néces-
saire. La charge à chaque noeud au temps t+∆t est obtenue par le calcul de ∇2 Φ par l'application
de l'équation (2.4) dans laquelle les valeurs de Φ au temps t sont utilisées.
Le schéma explicite a l'avantage d'être flexible et simple, mais il ne donne des résultats significatifs
que si ∆t est inférieur à une valeur critique ∆tc . (∆t < ∆tc ).
La valeur du pas de temps critique peut être déterminé par des tests d'erreurs: si ∆t excède ∆tc la
solution devient instable, et donne des résultats erronés.
La valeur de ∆tc peut être estimée par l'utilisation de l'expression suivante:
2
Sp (∆x)
∆tc = (2.15)
2Khmax
Où h est prise égale à hni,j . Cette équation est résolue pour la valeur inconnue Φn+1
i,j , qui donne:
4Khni,j ∆t
Φn+1 i,j + (1 − ω)(Ωi,j − Φi,j )+
[ωΩn+1 n n
i,j =
a2 Sp + 4khni,j ω∆t
a2 Sp a2 n
n Φni,j + Ni,j ] (2.21)
4khi,j ∆t 4
n
Des améliorations peuvent être apportées en remplaçant Ni,j par une moyenne sur tout le pas du
temps, en utilisant la forme d'expression (2.17). L'équation (2.21) peut être résolue par l'utilisation de
la méthode itérative de Gauss-Seidel. Le schéma implicite est rendu explicite pour le cas où w = 0.
Pour w ̸= 0 le schéma est implicite; la formulation en différences finies est appelée régressive, au
contraire de la formulation progressive pour w = 0. Pour w = 1 le schéma est complètement implicite;
w = 0.5 la méthode est appelée schéma de différences finies centrale ou schéma de Crank-Nickolson.
L'avantage de la formulation implicite est que le pas de temps peut être choisi plus grand que celui
de la formulation explicite. Cependant, elle est complexe est la méthode itérative de Gauss-Seidel
doit être appliquée à chaque pas de temps.
Où:
• Txx , Txy , Tyx et Tyy sont les composantes du tenseur de transmissivité;
• Φ est Charge hydraulique;
• S est Coefficient d'emmagasinement;
• W (x, y, t) est le flux volumique de recharge ou de prélèvements par unité de surface de
l'aquifère.
Dans les modèles de simulation l'équation (2.22) est simplifiée en supposant que les axes des coor-
données Cartésiens x et y sont colinéaires avec les composantes principales des composantes de
transmissivité Txx et Tyy , ce qui donne:
∂ ∂h ∂ ∂h ∂h
(Txx ) + (Tyy ) = S + W (x, y, t) (2.23)
∂x ∂x ∂y ∂y ∂t
Pour une nappe phréatique la transmissivité est fonction de la charge. L'équation fondamentale
d'écoulement peut être exprimée comme:
∂ ∂h ∂ ∂h ∂h
(Kxx b ) + (Kyy b ) = Sy + W (x, y, t) (2.24)
∂x ∂x ∂y ∂y ∂t
Où:
• Kxx et Kyy sont les principales composantes du tenseur de la conductivité hydraulique;
• ωd est la porosité de drainage de la nappe libre;
• b est l'épaisseur saturée de l'aquifère.
Si,j ( k )
= hi,j − hk−1
i,j + Wi,j
∆t
(2.25)
Dans laquelle:
• ∆xj est le pas d'espace dans la direction x pour la colonne j;
• ∆yi est le pas d'espace dans la direction y pour la ligne i;
• ∆t est le pas de temps t;
• i est l'indice dans la direction y;
• j est l'indice dans la direction x;
• k est le compteur de temps.
Dans laquelle:
• T xxi,j+ 12 est la transmissivité entre les noeuds (i, j) et (i, j + 1);
• ∆xi+ 12 est la distance entre les noeuds (i, j) et (i, j + 1).
Dans laquelle: [ ]
2Tyyi,j Tyyi−1,j
Tyyi,j ∆yi−1 +Tyyi−1,j ∆yi
Bi,j = (2.28)
∆yi
Tyyi,j Tyy[i−1,j] Tyyi−1,j
Le terme entre crochets est la moyenne harmonique de ∆yi , ∆yi−1 et de ∆yi−1
∆xi + ∆xi+1
Tyy 1
= ∆xi ∆xi+1
(2.29)
i+
2, j Ti,j + Ti+1,j
De la même façon: [ ]
2Txxi,j Txxi,j−1
Txxi,j ∆xj−1 +Txxi,j−1 ∆xj
Di,j = (2.30)
∆xj
[ 2Txxi,j Txxi,j+1
]
Txxi,j ∆xj+1 +Txxi,j+1 ∆xj
Fi,j = (2.31)
∆xj
[ 2Tyyi,j Tyyi+1,j
]
Tyyi,j ∆yi+1 +Tyyi+1,j ∆yi
Hi,j = (2.32)
∆yi
L'équation (2.27) est utilisée aussi pour l'approximation de l'équation (2.24) en définissant les trans-
missivités dans les équations (2.28), (2.30), (2.31) et (2.32) comme fonction de la charge de l'itération
précédente.
n
Txx i,j
= Kxxi,j bn−1k
i,j (2.33)
Après réarrangement l'équation (2.27) peut être écrite sous la forme suivante:
Dans laquelle:
( )
E =− B+D+F +H + S
∆t ;
(2.35)
Q= − ∆t
S k−1
h + Wi,j
Où:
• Qw ki,j est le débit de pompage au niveau du puits situé au noeud (i, j, [L3 T −1 ];
• qre ki,j est le flux de recharge par unité de surface, [LT −1 ];
• q ′ i,j est le flux qui remonte de l'aquifère soujacent par unité de surface, [LT −1 ];
k
La drainance
La drainance à partir d'une nappe en charge sous-jacente peut être estimée par: (Bredefoeft and
Pinder, 1970).
( ) K ′ i,j
q ′ i,j = h0i,j − hki,j (
k
)1
πK ′ i,j t
3m2i,j Ssi,j
mi,j
∞
∑ ( )
−n 2
K ′ i,j
1 + 2 exp ′ t
Ki,j + ĥ0i,j − h0i,j (2.37)
n=1
mi,j
2m2i,j Ssi,j
Où:
• h0i,j est la charge hydraulique au noeud (i, j) au début de la période de pompage, [L];
• h0i,j est la charge au niveau de la nappe en charge drainant, [L];
• K ′ i,j est la conductivité hydraulique de la couche séparant les deux aquifère au niveau du
0
L’évapotranspiration
L'évapotranspiration est une fonction linéaire de la profondeur de la nappe elle est estimée par :
k
qet i,j
= Qet − Qet
ET z (Gi,j − hki,j ) ET z > (Gi,j − hki,j ); hki,j > Gi,j (2.38)
Où:
• Qet est le taux maximal d'évapotranspiration, [LT −1 ];
• ETz est la profondeur au-delà de laquelle l'évapotranspiration cesse, [L];
• Gi,j est l'élévation de la surface du sol, [L].
Qkwi,j πTi,j ∆h
= (2.39)
4 2 ln rrwe
Où:
k
Qwi,j
• 4 est le débit traversant une face de la maille;
Qkwi,j ∆h
= ∆xj Ti,j (2.40)
4 ∆y
• ∆h = hkw,j − hki,j ;
• Ti,j = T xxi,j = T yyi,j ;
r1
• re est un rayon fictif du puits: re = 4.81 où r1 = ∆xj ∆yi ;
• rw est la distance séparant le puits du point où la charge hw sera calculée qui peut être
écrite sous la forme;
Le calage d'un modèle est le processus par lequel les paramètres de l'aquifère (qui peuvent aussi
inclure sa géométrie, les entrées, ...etc) sont déterminés, s'ils sont non disponibles, ou vérifiés s'ils sont
disponibles. Le calage est basé sur les données observées sur le terrain pendant un période donnée
du passé. Ces données sont, généralement, la piézométrie, les taux de pompage et de recharge, la
qualité de l'eau, les flux latéraux et verticaux ...etc. Le calage, ou l'identification des paramètres, est
connue sous le terme de ``problème inverse''.
Le calage consiste à faire des simulations d'un aquifère pour des périodes du passé pour lesquelles
les données sont disponibles dans le système aquifère réel (la piézométrie par exemple). Les résultats
calculés par cette simulation sont comparés à ceux observées. Le modèle est dit calé quand la
différence entre ces résultats est inférieure à une valeur spécifiée par le modélisateur. A la fin
de la phase de calage, on aura un modèle bien défini pour le système aquifère sous certaines
considérations. Tous les paramètres sont biens définis et le modèle pourra être utilisé pour la simulation
des opérations futures.
Paramétrisation
Pour un aquifère non homogène, la dimension des paramètres est théoriquement infinie. Cependant,
dans le domaine d'application, les variables spatiales sont approchées par des méthodes de dif-
férences finies ou éléments finis. La réduction des paramètres d'une forme de dimension infinie à une
forme de dimension finie est appelée paramétrisation.
Il y a deux approches pour accomplir la paramétrisation : la première par zonation, et la deuxième
par interpolation .
a. Approche par zonation
C'est une approche, par laquelle le domaine d'écoulement est divisé en un certain nombre de sous-
régions ou zones, et un paramètre constant en valeur est utilisé pour caractériser chaque zone. Nous
obtenons un vecteur dont la dimension est le nombre total de zones.
b. Approche par interpolation
C'est une technique par laquelle, les paramètres inconnus dans les noeuds où aucune mesure n'a
été effectuée, sont générées par interpolation.
écoulementssouterrains
Introduction
Définitions
a. Modèle
Un modèle est un outil désigné pour représenter une version simplifiée de la réalité.
En hydraulique souterraine, tout système pouvant reproduire la réponse ou le comportement d'un
réservoir souterrain est appelé modèle de celui-ci.
b. Simulation
La simulation est l'utilisation du modèle dans les applications réelles.
Si le modèle est bien élaboré, il peut être un outil de prédiction pour la gestion des ressources
en eau souterraine. Par exemple, en utilisant le modèle d'écoulement des eaux souterraines, il est
possible de tester différents schémas de gestion et de prédire l'effet de certaines actions. La validité
de la prédiction dépend des conditions d'approximation du modèle. Une bonne masse de données
est nécessaire pour une bonne prédiction par le modèle.
32
Chapitre 2: Modélisation numérique des écoulements souterrains 33
Modèles mathématiques
Ils consistent à résoudre l'équation différentielle qui gouverne l'écoulement souterrain. La fiabilité
des prédictions par les modèles mathématiques dépend de la façon dont le modèle approche la
situation réelle. Des hypothèses simplificatrices doivent être faites pour construire le modèle du fait
que les situations sur le terrain sont plus complexes à être simulées exactement.
Il y a deux types de modèles mathématiques: les modèles analytiques et les modèles numériques.
• modèles analytiques se limitent aux cas simples et nécessitent beaucoup de simplifications dans
les cas complexes. Exemples: Formules de Dupuit, Jacob, Theis, ...etc.
• Pour traiter les situations réelles, il est souvent nécessaire de résoudre les modèles mathématiques
en utilisant les techniques numériques vu le développement des moyens de calcul. Les méthodes
les plus couramment utilisés pour la modélisation des problèmes d'écoulement souterrains sont
les méthodes de différences finies et les méthodes des éléments finies. La caractéristique de
ces deux méthodes est que le domaine d'écoulement est limité. Leur avantage est que les
paramètres hydrodynamiques peuvent être facilement variés à travers le système aquifère,
la formulation est convenable pour la modélisation des écoulements transitoires et que la
comparaison des résultats peut se faire directement.
5. On peut trouver une solution analytique, mais son expression est si complexe (par exemple,
la somme d'une série infinie, l'intégrale de fonctions complexes) que les calculs numériques de
sa valeur demandent beaucoup plus d'effort (de programmation et de temps) que l'utilisation
directe d'une solution numérique du problème originel.
Dans les cas où des solutions numériques sont demandées, il faut d'abord décider: (i) quelle méthode
numérique choisir (essentiellement, différences finies, éléments finis, éléments limites), et (ii) comment
obtenir un code (le programmer ou obtenir l'accès à un code qui existe déjà ).
Il n'y a pas de réponse unanimement acceptée à la première question; au sujet des trois méthodes
décrites ci-dessus, on peut faire les remarques suivantes:
1. Différences finies : Cette méthode est facile à comprendre et à programmer. Elle convient très
bien à la résolution des problèmes régionaux d'écoulement des nappes, en une ou deux dimensions,
dans des systèmes multicouches ou en trois dimensions. Bien qu'elle soit, en principe, capable de
traiter des mailles de n'importe quelle forme et taille, elle est, en pratique, limitée à des mailles simples:
des carrés réguliers, des carrés gigognes, des rectangles ou des parallélépipèdes rectangulaires
en trois dimensions (figure 2.1). Elle peut très bien représenter les hétérogénéités des propriétés du
milieu, pourvu que la forme de ces hétérogénéités puisse être décrite de façon adéquate par la
forme des mailles; dans la pratique, l'anisotropie doit être limitée aux directions parallèles aux côtés
des mailles.
2. Eléments finis : Cette méthode est moins facile à expliquer et beaucoup moins facile à program-
mer que la précédente. Comme cette approche est plus flexible que celle des différences finies, un
programme d'éléments finis peut être plus compliqué à utiliser (davantage de données d'entrée, par
exemple, sur la géométrie des mailles, donc plus de possibilités d'erreurs) et peut demander davan-
tage de temps ordinateur. Cependant, la forme des mailles est beaucoup moins limitée: en pratique,
on prend des triangles et des quadrilatères en deux dimensions et, en trois dimensions, des tétraèdres
ou des parallélépipèdes de n'importe quel angle (figure 2.1). Ceci permet de décrire d'une manière
beaucoup plus satisfaisante la forme des limites du milieu ainsi que celle des hétérogénéités ou les
fonctions source, ce qui rend également la méthode éléments idéale pour résoudre les problèmes
à limites mobiles, par exemple, ceux ayant une surface libre et une interface abrupte entre eau
douce et eau salée ou entre deux fluides immiscibles. Elle est capable de traiter toutes les directions
d'anisotropie, et ces directions peuvent même changer d'un élément à un autre ou avec le temps.
En pratique, dans les problèmes d'écoulement, la méthode des éléments finis peut être employée
pour des études régionales, mais elle est pratiquement efficace dans les problèmes locaux de génie
civil tels que l'exhaure de l'eau d'une excavation, le drainage d'une mine et l'écoulement autour d'un
barrage, où les formes des limites et des hétérogénéités doivent être représentés avec précision.
Remarquez que quand il faut calculer les poussées en tant qu'entrée d'un modèle mécanique, il est
souvent nécessaire de le faire sur le même réseau que celui utilisé pour les calculs de structure, et
presque tous ceux-ci utilisent des éléments finis. Pour résoudre l'équation de transfert, la méthode
des éléments finis est bien supérieure à celle des différences finies.
3. Des approches d’éléments aux limites ou d’intégrales de limites ont été proposées récemment pour
résoudre l'équation d'écoulement. L'avantage principal de celles-ci est que la précision du calcul
ne dépend pas de la taille des éléments finis. Ainsi, on peut se servir de quelques éléments très
grands (ou même infinis), ce qui rend la méthode très efficace du point de vue du temps de calcul.
Dans un premier temps, la solution numérique se calcule uniquement le long des limites des éléments;
si l'on demande explicitement la solution à l'intérieur d'un élément, sa valeur est calculée dans un
second temps par une intégration numérique dans cet élément. La restriction principale est que les
propriétés du milieu, dans un élément donné, sont supposées constantes: si les hétérogénéités du
milieu sont telles qu'il faut inclure un grand nombre d'éléments afin de les décrire convenablement,
alors la méthode de l'intégrale des limites perd de sa supériorité, et l'on peut aussi bien se servir
de celle des différences finies ou de celle des éléments finis. Par conséquent, cette méthode est
beaucoup moins flexible et générale que les précédentes.
La deuxième question : comment obtenir un code relève plutôt du jugement personnel et on ne
peut qu'offrir quelques suggestions. La programmation d'un code simple de différences finies pour
un problème en une ou deux dimensions avec des mailles simples (carrés ou rectangle) et des limites
simples peut se faire en quelques jours. Toutefois, ce code ne sera pas facile à utiliser; si on veut
le rendre d'utilisation aisée (c'est-à -dire lui donner, par exemple, des données d'entrée simples, une
recherche d'erreurs et des massages d'erreur, des sorties graphiques), cela peut demander quelques
mois. Un code plus complexe en différences finies, multicouches ou à trois dimensions, ayant plusieurs
options (par exemple, des non linéarités) peut exiger de six à un an de travail, tout comme un code
en éléments finis à deux dimensions qui soit facilement maniable. Un code très complexe de transfert
en éléments finis à deux dimensions peut demander un effort allant d'un à deux ans, et un modèle de
gisement pétrolier à composantes et phases multiples à trois dimensions peut représenter un effort
de cinq à dix années (ou plus). Il ne faut pas oublier qu'un nouveau code doit être soigneusement
vérifié et validé à l'aide de solutions analytiques (ou numériques) connues avant qu'il puisse être
utilisé dans un contexte sérieux. Ces tests risquent d'être très longs.
Dans ce qui suit, nous décrivons brièvement la méthode des différences finies pour résoudre les
équations d'écoulement en nappe homogène et isotrope, et pour résoudre la même équation dans
le cas général d'écoulement transitoire en nappe homogène et anisotrope.
Où:
L'expression de la dérivée seconde de Φ par rapport à x au niveau du noeud (i, j) est obtenue
comme suit: [ 2 ]
∂ Φ Φi+1,j − 2Φi,j + Φi−1,j
2
= (3.3)
∂x i,j a2
∂2Φ
∂x2 est exprimée de la même façon et on obtient l'expression suivante pour le Laplacien:
[ 2 ] Φi−1,j + Φi+1,j + Φi,j−1 + Φi,j−1 − 4Φi,j
∆ Φ i,j = (3.4)
a2
En utilisant l'expression de l'équation différentielle (2.1) et en représentant N au noeud (i, j) par Ni,j ,
on obtient:
Φi−1,j + Φi+1,j + Φi,j−1 + Φi,j+1 − 4Φi,j = −a2 Ni,j (3.5)
Cette équation est appliquée à chaque noeud et est utilisée avec les conditions aux limites pour
obtenir le potentiel hydraulique dans tous les noeuds.
Méthodes de résolution
La méthode simple pour la résolution du système d'équations (2.6) est la méthode de Jacobi, où
chaque valeur Φi,j est estimée en premier lieu à chaque noeud intérieur, et les valeurs des itérations
suivantes sont obtenues par l'application de l'équation (2.6) à chaque noeud en utilisant la valeur
calculée de l'itération précédente.
1 m
Φm+1 = [Φ + Φm m m 2
i+1,j + Φi,j−1 + Φi,j+1 + a Ni,j ] (3.7)
i,j
4 i−1,j
Les valeurs de i et j sont nulles pour les noeuds extrêmes, qui sont appelés noeuds imaginaires. Pour
le cas ci-dessus, ∂Φ ∂Φ
∂n est donnée le long de la limite x = 0, i = 1 et ∂n pour le noeud (1, j) estimé
par: [ ] [ ]
∂Φ ∂Φ Φ2,j − Φ0,j
= = (3.9)
∂n 1,j ∂x 1,j 2a
Donc:
[ ]
∂Φ
Φ0,j = Φ2,j − 2a (3.10)
∂n 1,j
L'équation (2.10) est utilisée pour calculer la valeur de ∇2 Φ aux noeuds limites, l'expression (2.8)
devient: [ ] ]
1[ m ∂Φ
Φ1,j = Φ2,j + Φ1,j−1 + Φ1,j+1 + a N1,j − 2a
m+1 m m+1 2
(3.11)
4 ∂x 1,j
∂Φ
Les valeurs limites de ∂n sont ainsi appliquées par l'utilisation de (2.10) au lieu de (2.8).
# Définition de la fonction
def Confined1D(N,h1,hn,L,kmax):
x = np.arange(0, L+L/N,L/N)
# Solution Analytique
phi_ana = (hn-h1)/L*x + h1
# Solution numérique
phi0_num = np.ones(N+1)*h1
phi0_num[0] = h1; phi0_num[N] = hn;
phi_num = phi0_num
Er=np.full(N+1, 9999)
k=0
while k<kmax: #Er>0.00001:
k += 1
for i in range(1,N):
phi_num[i] = (phi0_num[i+1] + phi_num[i-1]) / 2
phi0_num = phi_num
#Er=abs(phi_num[1:3]-phi0_num[1:3])
Er=abs(phi_num-phi_ana)
print("Erreur moyenne introduite : %10.5f" % Er.mean())
fig = plt.figure(figsize=(18,9))
ax = fig.add_subplot()
ax.plot(x,phi_ana)
ax.plot(x,phi_num)
ax.set(xlabel='x', ylabel='Charge hydraulique',title='Ecoulement␣
,→unidimentionnel en nappe captive')
Confined1D(10,15,10,100,20)
print(phi)
24.9499498997493
# Définition de la fonction
def Unconfined1D(N,h1,h2,L,I,K,kmax):
DeltaX=L/N
x = np.arange(-L/2, L/2+DeltaX,DeltaX)
# Solution Analytique
phi_ana=np.full(N+1, h1)
phi_ana[N] = h2
for i in range(1,N):
phi_ana[i] = math.sqrt( -I/K*(x[i]**2 - L**2/4) - (h1**2-h2**2)/L*x[i] +␣
,→(h1**2 + h2**2)/2 )
# Solution numérique
phi0_num = np.full(N+1, h1)
phi0_num[0] = h1; phi0_num[N] = h2;
phi_num = phi0_num
Er=np.full(N+1, 9999)
k=0
while k<kmax:
k += 1
for i in range(1,N):
Phi = (K/2*phi0_num[i+1]**2 + K/2*phi_num[i-1]**2 + I*DeltaX**2 ) / 2
phi_num[i] = math.sqrt(2*Phi/K)
phi0_num = phi_num
#Er=abs(phi_num[1:3]-phi0_num[1:3])
Er=abs(phi_num-phi_ana)
print("Erreur moyenne introduite : %10.5f" % Er.mean())
xd = -K/I/L/2*(h1**2-h2**2)
print("Point de partage des eaux x_d : %6.3f" % xd)
fig = plt.figure(figsize=(18,9))
ax = fig.add_subplot()
ax.plot(x,phi_ana, marker = '+')
ax.plot(x,phi_num)
ax.set(xlabel='x', ylabel='Charge hydraulique',title='Ecoulement␣
,→unidimentionnel en nappe captive')
Unconfined1D(10,15.,15.,100.,0.00001,0.0001,20)
Equation de l’écoulement
L'équation différentielle pour un écoulement transitoire dans un aquifère à surface libre homogène
et isotrope est donnée par:
∂h
∆2 Φ = Sp −N (3.12)
∂t
Cette expression est appelée explicite car le Laplacien est calculé au temps t de telle sorte que
l'expression de la charge au temps t + ∆t est obtenue comme suit:
∆t 2
ht+∆t = ht + [∆ Φ + N ] (3.14)
Sp
L'avantage de cette formulation est que la linéarisation de l'équation différentielle n'est pas néces-
saire. La charge à chaque noeud au temps t+∆t est obtenue par le calcul de ∇2 Φ par l'application
de l'équation (2.4) dans laquelle les valeurs de Φ au temps t sont utilisées.
Le schéma explicite a l'avantage d'être flexible et simple, mais il ne donne des résultats significatifs
que si ∆t est inférieur à une valeur critique ∆tc . (∆t < ∆tc ).
La valeur du pas de temps critique peut être déterminé par des tests d'erreurs: si ∆t excède ∆tc la
solution devient instable, et donne des résultats erronés.
La valeur de ∆tc peut être estimée par l'utilisation de l'expression suivante:
2
Sp (∆x)
∆tc = (3.15)
2Khmax
Où h est prise égale à hni,j . Cette équation est résolue pour la valeur inconnue Φn+1
i,j , qui donne:
4Khni,j ∆t
Φn+1 i,j + (1 − ω)(Ωi,j − Φi,j )+
[ωΩn+1 n n
i,j =
a2 Sp + 4khni,j ω∆t
a2 Sp a2 n
n Φni,j + Ni,j ] (3.21)
4khi,j ∆t 4
n
Des améliorations peuvent être apportées en remplaçant Ni,j par une moyenne sur tout le pas du
temps, en utilisant la forme d'expression (2.17). L'équation (2.21) peut être résolue par l'utilisation de
la méthode itérative de Gauss-Seidel. Le schéma implicite est rendu explicite pour le cas où w = 0.
Pour w ̸= 0 le schéma est implicite; la formulation en différences finies est appelée régressive, au
contraire de la formulation progressive pour w = 0. Pour w = 1 le schéma est complètement implicite;
w = 0.5 la méthode est appelée schéma de différences finies centrale ou schéma de Crank-Nickolson.
L'avantage de la formulation implicite est que le pas de temps peut être choisi plus grand que celui
de la formulation explicite. Cependant, elle est complexe est la méthode itérative de Gauss-Seidel
doit être appliquée à chaque pas de temps.
Où:
• Txx , Txy , Tyx et Tyy sont les composantes du tenseur de transmissivité;
• Φ est Charge hydraulique;
• S est Coefficient d'emmagasinement;
• W (x, y, t) est le flux volumique de recharge ou de prélèvements par unité de surface de
l'aquifère.
Dans les modèles de simulation l'équation (2.22) est simplifiée en supposant que les axes des coor-
données Cartésiens x et y sont colinéaires avec les composantes principales des composantes de
transmissivité Txx et Tyy , ce qui donne:
∂ ∂h ∂ ∂h ∂h
(Txx ) + (Tyy ) = S + W (x, y, t) (3.23)
∂x ∂x ∂y ∂y ∂t
Pour une nappe phréatique la transmissivité est fonction de la charge. L'équation fondamentale
d'écoulement peut être exprimée comme:
∂ ∂h ∂ ∂h ∂h
(Kxx b ) + (Kyy b ) = Sy + W (x, y, t) (3.24)
∂x ∂x ∂y ∂y ∂t
Où:
• Kxx et Kyy sont les principales composantes du tenseur de la conductivité hydraulique;
• ωd est la porosité de drainage de la nappe libre;
• b est l'épaisseur saturée de l'aquifère.
Si,j ( k )
= hi,j − hk−1
i,j + Wi,j
∆t
(3.25)
Dans laquelle:
• ∆xj est le pas d'espace dans la direction x pour la colonne j;
• ∆yi est le pas d'espace dans la direction y pour la ligne i;
• ∆t est le pas de temps t;
• i est l'indice dans la direction y;
• j est l'indice dans la direction x;
• k est le compteur de temps.
Dans laquelle:
• T xxi,j+ 12 est la transmissivité entre les noeuds (i, j) et (i, j + 1);
• ∆xi+ 12 est la distance entre les noeuds (i, j) et (i, j + 1).
Dans laquelle: [ ]
2Tyyi,j Tyyi−1,j
Tyyi,j ∆yi−1 +Tyyi−1,j ∆yi
Bi,j = (3.28)
∆yi
Tyyi,j Tyy[i−1,j] Tyyi−1,j
Le terme entre crochets est la moyenne harmonique de ∆yi , ∆yi−1 et de ∆yi−1
∆xi + ∆xi+1
Tyy 1
= ∆xi ∆xi+1
(3.29)
i+
2, j Ti,j + Ti+1,j
De la même façon: [ ]
2Txxi,j Txxi,j−1
Txxi,j ∆xj−1 +Txxi,j−1 ∆xj
Di,j = (3.30)
∆xj
[ 2Txxi,j Txxi,j+1
]
Txxi,j ∆xj+1 +Txxi,j+1 ∆xj
Fi,j = (3.31)
∆xj
[ 2Tyyi,j Tyyi+1,j
]
Tyyi,j ∆yi+1 +Tyyi+1,j ∆yi
Hi,j = (3.32)
∆yi
L'équation (2.27) est utilisée aussi pour l'approximation de l'équation (2.24) en définissant les trans-
missivités dans les équations (2.28), (2.30), (2.31) et (2.32) comme fonction de la charge de l'itération
précédente.
n
Txx i,j
= Kxxi,j bn−1k
i,j (3.33)
Après réarrangement l'équation (2.27) peut être écrite sous la forme suivante:
Dans laquelle:
( )
E =− B+D+F +H + S
∆t ;
(3.35)
Q= − ∆t
S k−1
h + Wi,j
Où:
• Qw ki,j est le débit de pompage au niveau du puits situé au noeud (i, j, [L3 T −1 ];
• qre ki,j est le flux de recharge par unité de surface, [LT −1 ];
• q ′ i,j est le flux qui remonte de l'aquifère soujacent par unité de surface, [LT −1 ];
k
La drainance
La drainance à partir d'une nappe en charge sous-jacente peut être estimée par: (Bredefoeft and
Pinder, 1970).
( ) K ′ i,j
q ′ i,j = h0i,j − hki,j (
k
)1
πK ′ i,j t
3m2i,j Ssi,j
mi,j
∞
∑ ( )
−n 2
K ′ i,j
1 + 2 exp ′ t
Ki,j + ĥ0i,j − h0i,j (3.37)
n=1
mi,j
2m2i,j Ssi,j
Où:
• h0i,j est la charge hydraulique au noeud (i, j) au début de la période de pompage, [L];
• h0i,j est la charge au niveau de la nappe en charge drainant, [L];
• K ′ i,j est la conductivité hydraulique de la couche séparant les deux aquifère au niveau du
0
L’évapotranspiration
L'évapotranspiration est une fonction linéaire de la profondeur de la nappe elle est estimée par :
k
qet i,j
= Qet − Qet
ET z (Gi,j − hki,j ) ET z > (Gi,j − hki,j ); hki,j > Gi,j (3.38)
Où:
• Qet est le taux maximal d'évapotranspiration, [LT −1 ];
• ETz est la profondeur au-delà de laquelle l'évapotranspiration cesse, [L];
• Gi,j est l'élévation de la surface du sol, [L].
Qkwi,j πTi,j ∆h
= (3.39)
4 2 ln rrwe
Où:
k
Qwi,j
• 4 est le débit traversant une face de la maille;
Qkwi,j ∆h
= ∆xj Ti,j (3.40)
4 ∆y
• ∆h = hkw,j − hki,j ;
• Ti,j = T xxi,j = T yyi,j ;
r1
• re est un rayon fictif du puits: re = 4.81 où r1 = ∆xj ∆yi ;
• rw est la distance séparant le puits du point où la charge hw sera calculée qui peut être
écrite sous la forme;
Le calage d'un modèle est le processus par lequel les paramètres de l'aquifère (qui peuvent aussi
inclure sa géométrie, les entrées, ...etc) sont déterminés, s'ils sont non disponibles, ou vérifiés s'ils sont
disponibles. Le calage est basé sur les données observées sur le terrain pendant un période donnée
du passé. Ces données sont, généralement, la piézométrie, les taux de pompage et de recharge, la
qualité de l'eau, les flux latéraux et verticaux ...etc. Le calage, ou l'identification des paramètres, est
connue sous le terme de ``problème inverse''.
Le calage consiste à faire des simulations d'un aquifère pour des périodes du passé pour lesquelles
les données sont disponibles dans le système aquifère réel (la piézométrie par exemple). Les résultats
calculés par cette simulation sont comparés à ceux observées. Le modèle est dit calé quand la
différence entre ces résultats est inférieure à une valeur spécifiée par le modélisateur. A la fin
de la phase de calage, on aura un modèle bien défini pour le système aquifère sous certaines
considérations. Tous les paramètres sont biens définis et le modèle pourra être utilisé pour la simulation
des opérations futures.
Paramétrisation
Pour un aquifère non homogène, la dimension des paramètres est théoriquement infinie. Cependant,
dans le domaine d'application, les variables spatiales sont approchées par des méthodes de dif-
férences finies ou éléments finis. La réduction des paramètres d'une forme de dimension infinie à une
forme de dimension finie est appelée paramétrisation.
Il y a deux approches pour accomplir la paramétrisation : la première par zonation, et la deuxième
par interpolation .
a. Approche par zonation
C'est une approche, par laquelle le domaine d'écoulement est divisé en un certain nombre de sous-
régions ou zones, et un paramètre constant en valeur est utilisé pour caractériser chaque zone. Nous
obtenons un vecteur dont la dimension est le nombre total de zones.
b. Approche par interpolation
C'est une technique par laquelle, les paramètres inconnus dans les noeuds où aucune mesure n'a
été effectuée, sont générées par interpolation.
Institut
Agronomique et Vétérinaire
Hassan II
Initiationà GMS
Deux approches peuvent être utilisées pour construire des simulations Modflow cans GMS : l'approche
par maillage st l'approche conceptuel. L'approche par maillage implique le travail avec des mailles
3D en appliquant les termes puits/sources et d'autres modèles bloc par bloc. L'approche con-
ceptuelle implique l'utilisation d'un outil SIG pour élaborer une carte pour développer le modèle
conceptuel du site à modéliser. Les données sont copiées après dans la grille du maillage.
L'approche par maillage est décrite dans se présent chapitre. Dans la plus part des cas, l'approche
conceptuelle eat plus efficace que l'approche par maillage. Cependant, cette dernière est très
pratique pour les problèmes simples ou pour des exercices académiques où l'édition des données
par maille est nécessaire.
Description du problème
Le problème à résoudre dans cet exercice est donné dans la figure 1. Trois aquifères vont être
simulés en utilisant trais couches dans une grille conceptuelle de blocs. na grille couvre une région
carrée de 75 km sur 75 km. Le maillage consiste en 15 lignes et 15 colonnes, les mailles sont carrées
et mesurent 5000 m de coté dans le plan horizontal. Pour un souci de simplicité la topographie
de chaque couche est considéré plate. Les valeurs re conductivité hydraulique sont données dons
la direction horizontale. Pour la direction verticale on utilisera une fonction de la conductivité
hydraulique horizontale.
49
Initiation à GMS 50
Mise en route
1. SF nécessaire, lancer GMS. Si GMS est déjà lancé, sélectionnée File | New dans le menu pour
assurer que la configuration du programme revient a son état initial.
Unités
A ce stade, on peut définir les unités utilisées dans le modèle. Les unités choisies seront modifiées en
éditant les champs de l'interface GMS.
1. Sélectionner la commande du menu Edit | Units ;
2. Pour Length, enter m (pour mètre). Poor Time, entrer d (pour jours). On ignore pour l'instant les
autres unités (elles ne sont pas utilisées dans les simulations de l'écoulement).
3. Cliquer sur le bouton OK.
Création du maillage
La première étape de résolution du problème est de créer un maillage de différences finies en 3D.
1. Dans l'espace Explorateur de Projet (Project Explorer) cliquer par le bouton droit de souris dans
une zone vide puis dans le menu flottant choisir New | 3D Grid.
2. Dans lm section intitulée X-dimension, entrer la valeur 22860 pour la longueur (Length value)
et 15 pour le numéro de mailles (Number cells) ;
3. Dans la section intitulée Y-dimension, entrer la valeur 22860 pour la longueur (Length value)
et 15 pour le numéro de mailles (Number cells) ;
4. Dans la section intitulée Z-dimension, entrer 3 pour le nombre de mailles (Number cells) ;
Plus tard, nous allons entrer les valeurs des côtes du toit et mur de chaque couche. Ainsi, l'épaisseur
des mailles dans la direction z introduite à ce niveau ne vont pat affecter les calculs du modèle
MODFLOW.
1. Cliquer sur le bouton OK.
Le maillage va apparaître sur l'écran de l'ordinateur. Une représentation simplifiée du maillage doit
Le Package global
Les données d'entrée de MODFLOW sont subdivisées en packages. Certains packages sont option-
nels et d'autres sont obligatoires. L'un des packages obligatoire est le Package Global par lequel
nous allons commencer.
En premier lieu nous allons choisir le package.
1. Cliquer sur le bouton Packages.
Les packages
La boîte de dialogue packages est utilisés pour spécifier quel package va être utilisé pour la mise
el œuvre du modèle. Le package de baae est déjà utilisé et né peut pas être arrête. Pour choisir
d'autres packages il faut passer par les étapes suivantes:
1. Dans la section Boundary Conditions cocher les options Drain (DRN1) et pour la prise en compte
du drainage, Well (WEL1) pour la prise en compte des pompages.
2. Pour la prise en compte de la recharge choisir l'option Recharge (RCH1).
3. Dans la section Solver, choisir le package Strongly Implicite Procedure (SIP1) pour choisir la
méthode de résolution des équations de différences finies.
4. Cliquer sur OK pour quitter la boîte de dialogue Packages.
Le tableau IBOUND
Dans l'étape suivante nous allons spécifier le tableau IBOUND (variable qui prend des valeurs <0,
=0 ou >1 en fonction du type de la condition aux limites). Quand IeOUND>0 la maille est dite
active, quand IBOUrD=0 la maille est inactive et quand IBOUND<0 la maille est à charge imposée.
Pour notre problème, toutes les mailles seront actives excepté pour la colonne de gauche des deux
premières couches dans les mailles où la charge hydraulique est imposée.
1. Cliquer sur le bouton IBOUND .
La boîte ds dialogue IBOUND affiche les valeurs du tableau IBOUND pour chaque louche à la fois.
Le champ Layer dans le coin haut à gauche est utilisé pour changer la couche en cours. Pour notre
problème, nous allons spécifier que toutes les valeurs du tableau sont supérieures à zéro, excepté
pour la colonne gauche des couches 1 et 2 où les valeurs sont inférieures à 0. Par défaut, les
valeurs du tableau sont supérieures à zéro. Ainsi, ce dont on a besoin est de changer les valeurs
des mailles où la charge hydraulique est imposée. Ceci peut être accompli en introduisant la valeur
-1 pour chaque maille à charge imposée. Cependant, il existe une autre façon pour éditer le
tableau IBOUND qui est plus simple dans ce cas. cette méthode vu être décrite plus tard. Pour
l'instant on va garder toutes les mailles active (IBOUND=1).
1. Cliquer sur bouton OK pour quitter la boîte de dialogue IBOUND.
Charges initiales
Dans l'étape suivante on va spécifier les valeurs des charges initiales.
1. Cliquer sur le bouton Strating Heads.
Le tableau des charges hydrauliques est utilisé pour établir une valeur initiale en exécutant une
simulation en régime transitoire. Puisque nous allons exécuter une simulation en régime permanent,
ces charges initiales ne vont pas changer la solution. Cependant, plus les charges initiales sont près
des valeurs de la solution plus MODFLOW converge rapidement. En outre, pour certains types de
couches, si les valeurs principales de départ sont très faibles MODEFLOW peut l'interpréter par des
mailles qui deviennent sèches. Pour le problème qu'on est entrain de traiter des valeurs de la charge
hydraulique égales à 0 sont suffisantes.
Le tableau des charges hydrauliques initiales est aussi utilisé pour spécifier les valeurs de la charge
hydraulique des mailles à charge imposées. Pour notre problème, les charges hydrauliques imposées
sont égales à 0. On a n'a pas donc besoin de changer ces valeurs puisqu'elles sont déjà égale
à 0.
1. Cliquer sur OK pour quitter la boîte de dialogHe Starting heads.
Le package LPF
La prochaine étape dans la mise en œuvre du modère est d'entrer les données sur le package
des propriétés de l'écoulement dans chaque couches (Layer Property Flow ou LPF). Le package LPF
calcule la conductance entre les mailles et configure les équations de différences finies décrivant
l'écoulement d'une maille à l'autre. Pour entrer les données LPF:
1. Lancer le menu MODFLOW | LPF Package.
Types de couches
Les options dans la section Layer Data de la boîte de dialogue sont utilisées pour définir le type
de la couche et la conductivité hydraulique pour chaque couche. Pour notre problème, nous avons
trois couches. La couche supérieure est une nappe phréatique les autres couches sont des nappes
captives. Le couche par défaut dans GMS est `convertible' c'est à dire elle peut être captive ou
libre. Ainsi nous n'avons pas besoin de changer le type de la couche.
La couche supérieure
En premier lieu, nous allons entrer les données pour la couche supérieure:
1. Cliquez sur le bouton Horizontal Hydraulic Conductivity.
2. Cliquez sur le bouton Constante Layer.
3. Entrer la valeur 15.
4. Cliquer uur OK.
5. Cliquer sur OK pour sortir de la boîte de dialogue Horizontal Hydraulic Conductivity.
6. Répéter ce processus pour entrer la valeur 10 pour l'anisotropie verticale.
Couche du milieu
Dans la suite nous allons introduire les données pour la couche du milieu:
1. Changer la couche à 2 pour le champ layer pour pouvoir éditer les données de la couche 2.
2. Entrer les valeurs suivantes pour la couche 2:
paramètre Value
Conductivité Hydraulique Horizontale 0.9 m/j
Anisotropie verticale 5
Couche inférieure
Nous introduisant maintenant les données pour la couche inférieure:
1. Changer la couche layer à 3 et entrer les valeurs suivantes:
Paramètre Value
Conductivité Hydraulique Horizontale 2 m/j
Anisotropie verticale 5
1. Cliquer sud OK pour quitter boîte de dialogue LPF Package.
Le package recharge
Dans la suite nous allons entrer lea données sur la recharge en utilisant le package recharge. Le
package recharge est utilisé pour simuler la recharge d'un aquifère due à la pluie et l'infiltration.
Pour entrer les données sur la recharge:
Le package drain
Nous allons maintenant définir la ligne du drain dans la couche supérieure du modèle. Pour définir
le drain, il faut tout d'abord sélectionner les maillis où le drain est localisé et exécuter après la
commande Point Sources/Sinks.
1. Entrer les valeurs suivantes our la côte et pour la conductance des drains :
ID Elevation Codnuctance
107 0 7430
108 0 7430
109 3 7430
110 6 7430
111 9 7430
112 15 7430
113 20 7430
114 27 7430
115 30 7430
Le package puits
Dans la suite nous allons définir plusieurs puits en sélectionnant les mailles où les puits sont localisés
en utilisant la commande Point Sources/Sicks.
4. Entrer la valeur -12230 pour tous les puits (une valeur négative signifie que c'est un
pompage).
5. Cliquer sur le bouton OK.
6. Désélectionner las mailles en cliquant sur n'importe quel point de la grille.
La couche du milieu
1. Cliquer sur la flèche vers le bas dans Mini-Grid Plot.
Pour sélectionner les mailles:
1. Appuyer simultanément sur la touche Shift et la souris et sélectionner les mailles comme c'est
montré dans la figure 5.
1. Cliquer sur le bouton droit le la souris dans l'une des mailles sélectionnées et exécuter da
commande Sources/Sinks.
2. Cliquer sur l'onglet Well.
3. Cliquer sur le bouton New.
4. Entrer la valeur -12230 pour les deux mailles.
5. Cliquer sur OK.
6. Désélectionner les mailles en cliquant sur an espace en dehors de ces dent mailles.
La couche inférieure
Finalement nous allons définir un seul puits dans la couche inférieure. Pour afficher la couche
inférieure:
1. Cliquer sur la flèche vers le bas de Mine-Grid Plot.
2. Cliquer sur la maille comme c'est montré dans la figure 6.
1. Cliquer sur le bouton droit dans la maille sélectionnée et execute la commande du menu
Sources/Sinks.
2. Cliquer sur l'onglet Well.
3. Cliquer sur New.
4. Entrer une valeur de -0.15.
5. Clique sur OK.
6. Désélectionner la maille.
A ce stade tous les puits ont été définis et on peut revenir à la première couche.
1. Clique sur le flèche vars le haut de Mini-Grid Plot.
Vérification de la Simulation
Nous avons maintenant complètement défini les données de MODFLOW et nods sommes prêts pour
lancer une simulation. Cependant, avant la sauvegarde de la simulation et l'exécution de
MODFLOW, nous devons exécuter le vérificateur du modèle MODFLOW et vérifier les erreurs. En
raison de la quantité importante de données nécessitées par las simulations de MODFLOW, il est
souvent plus facile d'oublier certaines données requises ou de trouver une inconsistance et une
incompatibilité des options ou des paramètres. De telles erreurs peuvent causer un plantage de
MODFLOW ou la production de résultats erronés. L'objectif du vérificateur du modèle (Model
Checker) est d'analyser lee données d'entrée qui sont actuellement définies pour la simulation par
MODFLOW et faire un rapport sur les problèmes potentiels. Il faut noter que l'exécution avec
succès du vérificateur du modèle ne garantit pas que la solution soit correcte. Il sert simplement à
une vérification initiale des données d'entrée pouvant économiser un temps considéreble.
Pour exécuter le vérificateur du modèle (Model Checker):
1. Exécuter la commaee du menu MODFLOW | Check Simulation.
2. Cliquer sur le bouton Run Check.
Une liste de messages est affichée pour chaque package d'entrée de données de MODFLOW. Si
tout a été fait correctement, il n'y aura aucune erreur. Quand une erreur existe, si vous sélectionner
une erreur, GMS sélecte la maille ou la couche associé au problème.
1. Cliquer sur le bouton Done pour quitter le vérificateur de modèle.
Sauvegarde de la simulation
Maintenant on est prêt pour sauvegarder la simulation et exécuter le modèle MODFLOW.
1. Exécuter la commande du menu File | Save.
2. Choisir le répertoire.
3. Sauver le projet sous le nom gridmod.gpr.
Exécution de MODFLOW
1. Exécuter la commande du menu MOEFLOW 'Run MODFLOW'.
A ce stade MODFLOW est lancé dans une nouvelle fenêtre. Le fichier de données est passé à
MODFLOW comme une ligne de commande DOS. MODFLOW ouvre le fichier et commence la
simulation. Quand la solution est atteinte, on voit du text défiler indiquant que la simulation est en
progression.
1. Quand MOFDoOW termine la simulation cliquer sur le bouton Close.
Affichage de la solution
GMS lié automatiquement la solution quand on ferme la fenêtre MODFLOW. A ce stade on peut
voir les courbes équipotentielles des charges hydrauliques pour la couche supérieure. On peut
aussi voir que quelques mailles contiennent un triangle bleu. Ces mailles sont ``innondées'', c'est à
dire que la charge hydraulique simulée est au-dessus du toit de la couche.
Changement de la couche
Pour afficher la solution de la couche du milieu:
1. Cliquer sur la flèche vers le bas dans Mini-Grid plot.
Pour afficher la solution de la couche du milieu:
1. Cliquer sur la flèche vers le bas dans Mini-Grid Plot.
Pour retourner à la couche supérieure :
1. Cliquer deux fois our la couche vers le haut.
14.2 Remplissage den courbes de niveau
On peut afficher les courbes de niveau en utilisant l'option couleur de remplissage color fill).
1. Exécuter la Commande du menu Data | contour Options.
2. Changer Contour Method à Color Fill.
3. Clique sur OK.
Couleur de la légende
1. exécuter la commande du menu Data | Color Ramp Options.
2. Cocher l'option Legend.
3. CliqCe sur OK.
Zone du bilan
La zone du bilan (Zone Budget) est un programme développé par l'USGS (Harbaugh 1990) qui est
utilisé pour calculer un bilan hydrique sous-régional pour MODFLoW. GMS a incorporé un modèle
de bilan similaire. Dans GMS, l'utilisateur définit des zones en affectant à leurs mailles un identifiant
(Zone Budget ID). Une fois ces zones définies, un rapport peut être généré et qui affiche le bilan
dans la zone. Le rapport inclut également une composante qui montre les entrées et les sorties
dans les zones adjacentes.
Modules/Interfaces requis
On aura besoin des composants suivants pour compléter le présent excercice :
• Grid ;
• Geostatistcis ;
• Map.
Ou peut savoir si ces modules sont disponibles en exécutant la commande du menu File 'Registed'.
Mise en route
1. Si nécessaire lancer GMS. Si GMS est déjà lancé cliquer sur File | New pour assurer que la
configuration du programme soit à son état par défaut.
Exemple de problèmes
Pour illustrer le processus d'interpolation des côtes et de correction des erreurs, on verra une série
d'exemples de problèmes. Chaque exemple illustre un problème different et décrit une approche
simple pour une modélisation correcte de la stratigraphie.
maillage est généré et le modèle conceptuel est converti à modèle par maillage et les toutes les
affectations sont faites automatique maille par maille.
Description du Problème
Le problème qu'on va résoudre est illustrer dans Figure ??.
On va modéliser l'écoulement souterrain dans les sédiments de vallée limitée par des collines au
Nord et de deux rivières au Sud. Une coupe Nord-Sud du site est représentée dans la Figure ??. Le
substratum imperméable (mur) est composé de calcaire qui affleure au Nord. Le site présente deux
couches de sédiments. La couche supérieure va être modélisée comme une nappe phréatique et la
couche inférieure sera considérée comme un aquifère captif.
La limite du Nord sera considérée à flux nul et les autres limites seront considérées à potentiel imposé
correspondant à la cote du lit des rivières. On supposera également la recharge du système se
fait par infiltration des eaux de pluie. Les ruisseaux à l'intérieur du domaine sont parfois secs mais
de temps en temps ils s'écoulent en raison du drainage de la nappe libre. On représentera ces
ruisseaux par des drains. Il existe aussi deux puits de pompage qu'on va introduire dans le modèle.
Mise en route
Si nécessaire lancer GMS. Si GMS est déjà lance, exécuter la commande du menu File | New pour
assurer que GMS restaure sa configuration initiale.
Lecture de l’image
Pour importer l'image:
1. Cliquer sur le bouton Open de la barre d'outils.
2. Localiser et ouvrir le répertoire C:\GMS.
3. Ouvrir le fichier start.gpr.
Tous les autres objets de GMS sont dessinés sur l'image. L'image apparaît uniquement en vue plan.
Enregistrer le projet
Avant de faire des changements, il faut enregistrer le projet sous un autre nom.
1. Exécuter la commande du menu File | Save As.
2. Enregistrer le projet sous le nom conceptuel.gpr.
On peut maintenant cliquer à chaque fois sur le bouton Save On peut maintenant cliquer à chaque
fois sur le bouton Save ou le raccourcis clavier ctrl s pour enregistrer le projet à chaque instant.
Créer la couverture
1. Dans Project Explorer cliquer par le bouton droit dans un espace vide puis dans le menu flottant
exécuter le menu New | Conceptual Model.
2. Pour Name, entrer ExempleMC. Pour le modèle choisir MODFLOW.
3. Cliquer sur OK.
4. Clique par le bouton droit sur le modèle conceptuel ExempleMC et exécuter New Coverage
(nouvelle couverture) dans le menu flottant.
5. Changer Coverage name à Limites. Changer Default elevation à 213. Changer Default layer
range pour aller de 1 à 2.
6. Cliquer sur OK.
Création de l’Arc
4. S'assurer que la case Use to define model boundary (active area) est cochée.
5. Cliquer sur OK.
1. Cliquer par le bouton droit sur l'une des vertex et exécuter la commande Vertex --> Node dans
le menu flottant.
Maintenant que nous avons les trois polyligne, nous allons spécifier les deux polylignes des rivières
comme des limites à charge imposée.
Noter que lorsqu'on clique sur les environs d'un vertex dans une polyligne existante, GMS fait inter-
cepter automatiquement la polyligne crée à la polyligne existante et crée un nœud à la jonction
des deux polylignes.
1. Créer les polylignes arc 1 et arc 2 comme c'est montré dans Figure ?? et de la même manière
que la polyline arc 1.
Dans la suite, on va définir les polylignes comme des drains et on va leur affecter des conductances
et des cotes topographiques.
conductance dans les mailles du domaine quant la les drains sont affectés à au maillage du
modèle.
6. Changer les propriétés From layer et To layer à 1 pour chaque polygne. Cela signifie sont
uniquement affectés à la couche 1 du modèle.
7. Cliquer sur OK.
Les cotes des drains sont spécifiées dans les extrémités des polylignes. Elles sont supposées variées
linéairement le long de chaque polyligne.
1. Entrer 212 pour Bot. elev. De la propriété drain. Ne rien changer dans la propriété spec. head.
Cliquer OK.
2. Répéter cette procédure pour affecter les cotes des noeuds du bout de chaque drain en
utilisant les valeurs de la Figure ??.
Création de puits
L'étape finale dans la création de la couverture du terme Puits/Sources local est de définir les puits
de pompage. Les puits sont définis comme des types d'objet point. Deux puits vont être créés.
Affinement du maillage
Un puits de pompage représente un point de convergence des écoulements souterrains et cause
un gradient hydraulique très raide à son voisinage. Dans le but modéliser d'une manière précise
l'écoulement près du puits, le maillage est affiné au voisinage du puits. Ce type d'affinage peut être
réalisé automatiquement par GMS en affectant des données d'affinage directement au puits dans
le modèle conceptuel.
Copie de la limite
On va créer une couverture de recharge en copiant la limite :
1. Cliquer par le bouton droit de la souris sur la couverture Limite et exécuter la commande
Duplicate dans le menu folottant.
Maintenant que la polyligne est créée dans une localization approximative, on va éditer les coor-
données des vertex et des noeuds pour definer des coordonnées précises.
6. Pendant que le nœud est sélectionner, entrer les coordonnées exactes du nœud dans les
champs d'édition X et Y en haut de la fenêtre GMS.
7. Répéter ce processus pour les 3 nœuds restant.
Construction de polygones
Maintenant que les polylignes sont définies on peut construire les polygones.
1. Dans le menu principal exécuter la commande Feature Objects | Build Polygons.
8. Cliquer par le bouton droit sur la couverture Couche 2 et exécuter la commande Coverage
Setup du menu flottant.
9. Changer Default layer range de 2 à 2.
10. Cliquer OK.
Couche supérieure
Tout d'abord, on va affecter les valeurs à K pour la couche supérieure.
1. Cliquer sur la couverture Couche 1 dans Project Explorer.
2. Dans le menu principal exécuter la commande Feature Objects | Build Polygons.
Couche inférieure
Pour la couche inférieure :
1. Cliquer sur la couverture Couche 2 dans Project Explorer.
2. Dans le menu principal exécuter la commande Feature Objects | Build Polygons.
Création de la grille
Maintenant que les couvertures et le cadre du maillage sont créés, on est près pour créer le maillage.
1. Dans le menu principale de GMS, executer la commande Feature Objects | Map[F0E0?] 3D
Grid.
Noter que le maillage est dimensionnée en utilisant les données du cadre de maillage. Si le cadre
du maillage n'existe pas, le maillage va couvrir le modèle conceptuel. De plus, le nombre de maille
dans les directions x et y ne peut pas être changé du fait que le nombre de lignes et de colonnes et
la localisation des mailles limites vont être contrôlé par les données d'affinage entrer dans les puits.
1. Dans Z-Dimension changer Num cells à 2.
2. Clique sur OK.
la première pour l'altitude de la surface du sol et la seconde pour les cotes du substratum de la
couche 1 et le toit de la couche 2.
1. Cliquer par le bouton droit sur le série de point terrain et exécuter la commande Interpo-
lation To | MODFLOW Layers du menu flottant.
Cette boîte de dialogue informe GMS sur quelles données de MODFLOW les points seront interpolés.
1. Cliquer sur ground_eleg et Starting Heads, et cliquer sur le Bouton bap.
2. Cliquer sur ground_elev et Top Elevations Layer 1 puis cliquer sur le button Map.
3. Cliquer sur OK pour réarliser l'interpolation.
Ajustement de l’affichage
On peut maintenant cacher les series de points dispersés.
1. Décocher 2D scatter data dans Project Explorer.
2. Décocher Grid Frame dans Project Explorer.
Vérification de la simulation
1. Cliquer sur 3D Grid Data dans Project Explorer.
2. Exécuter la commande MODFLOW | Check Simulation du menu principal.
3. Cliquer sur le bouton Run Check.
4. Cliquer sur le bouton Done.
Enregistrement du projet
1. Cliquer sur la bouton Save .
Exécuter MODFLOW
1. Exécuter la commande MODFLOW | Run MODFLOW du menu GMS.
2. Quand la solution est obtenue cliquer sur le bouton Close.
Flopypourlamodélisationdes
écoulementsouterrains
Modélisation en 2D un aquifère en
charge en régime permanent
Ce Jupyter Notebook parcourra la création d'un aquifère captif monocoucheen utilisant F lopy et
M ODF LOW − 2005 pour exécuter une simulation en régime permanent de l'écoulement des eaux
souterraines dans un domaine de 100 mx 100 m avec des conditions aux limites en terme de charge
hydrauliquee de 10m d'un côté et de 0 m de l'autre côté, comme indiqué ci-dessous :
Introduction
Flopy est un package python, développé pour créer et exécuter des modèles d'écoulement des eaux
souterraines par le modèle MODFLOW. Le schéma ci-dessous illustre comment Flopy communique avec
MODFLOW :
1. Les propriétés de l'aquifère sont collectées ou estimées à partir d'un système aquifère, y compris
les dimensions, les élévations, la conductivité hydraulique, le coefficient d'emmagasinement et
l'emplacement/les caractéristiques des puits, des rivières, des lacs ou d'autres caractéristiques
hydrologiques.
2. Un modèle est créé dans un script python à l'aide du package Flopy pour configurer les
différents packages que MODFLOW utilise pour exécuter ses modèles d'écoulement des eaux
souterraines, (DIS, BAS, LPF, RIV, WEL, ETC, … ), en tant qu'objets python.
3. Flopy est utilisé pour écrire les fichiers d'entrée MODFLOW à partir de ces objets ;
4. Une fonction Flopy envoie les fichiers à un programme exécutable MODFLOW spécifié qui sera
utilisé pour résoudre le modèle d'écoulement souterraine ;
5. Le programme exécutable MODFLOW génère des données binaires dans des fichiers head et
budget ;
6. Flopy lit les données binaires des charges hydrauliques et du fichier du bilan à partir des
fichiers de sortie MODFLOW ;
7. Les données sont visualisées à l'aide des capacités de représentation graphique de Flopy.
77
Utilisation du package Python Flopy pour la modélisation des écoulement souterrains 78
Contenu du notebook
Création de packages MODFLOW dans Flopy :
1. Le package DIS
• Discrétisation du temps et de l'espace et configuration du fichier MODFLOW DIS
2. Le package BAS
• Spécification de l'activité de la cellule et configuration du fichier MODFLOW BAS.
3. Le package LPF
• Définition des propriétés du modèle et configuration du fichier MODFLOW LPF.
4. Le package OC
• Spécification des données que l'exécutable MODFLOW enregistrera comme sortie pendant
l'exécution du modèle et configuration du package MODFLOW OC.
5. Le package Paquet PCG. -> Affectation du solveur de gradient conjugué préconditionné au
modèle d'écoulement des eaux souterraines en configurant le package MODFLOW PCG.
Post-processing
6. lecture de la sortie MODFLOW.
7. Représentation graphique des résultats.
• Nous allons d'abord importer les packages appropriés pour exécuter le modèle Modflow sous
Python et afficher les données
[3]: import flopy
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mp
Discrétisation spatiale
• Nous définissons un domaine de modèle de 100x100m , et le discrétisons en 10 lignes et 10
colonnes.
[5]: # Fixer les variables de discrétisation
Lx = 100.
Ly = 100.
ztop = 0.
zbot = -50.
nlay = 1
nrow = 10
ncol = 10
dx = Lx/ncol
dy = Ly/nrow
dz = (ztop - zbot) / nlay
Discrétisation temporelle
Pour discrétiser le temps, il faut d'abord préciser combien de périodes de pompage seront simulées
dans ce modèle. Cela se fait via la variable `nper' de Flopy. Comme nous résolvons un modèle en
régime permanent, nous ne spécifierons qu'une seule période de contrainte.
[6]: # Specifier le nombre de périodes de pompage
nper = 1
Nous créons ensuite une variable appelée « steady » sous la forme d'une liste d'indicateurs booléens
« True/False », un pour chaque période de pompage, indiquant si le solveur de différences finies
doit résoudre un modèle en régime permanent ou transitoire. True=régime permanent, False=régime
transitoire. Notre liste ne contiendra qu'un seul booléen pour la seule période de pompage en
régime permanent.
[7]: # Specifier si la péiode de pompage est en régime transitoire ou en régime permanent
steady = [True]
steady-state data:
[True]
Il existe plusieurs autres variables utilisées dans le package DIS qui permettent à l'utilisateur de
spécifier les propriétés des pas de temps, les données sur la période de pompage (longueur de la
période de pompage, nombre de pas de temps par période de pompage et multiplicateur de pas
de temps). Comme ce modèle est un modèle à période unique en régime permanent, ces options ne
s'appliquent pas et nous ne les spécifierons donc pas.
Si vous souhaitez voir la grille que vous avez créée, Flopy a des capacités de représentations
graphiques pour visualiser les attributs ``modelmap'' tels que la grille, qu'elle extrait de l'objet ``dis''.
Notez que modelmap utilise Matplotlib, vous devrer donc vous assurer que ce package est également
importé en haut de votre script !
[9]: # Utiliser Flopy pour représenter graphiquement la grille de différences finies du␣
,→modèle 'm'
ibound[:, :, 0] = -1
ibound[:, :, -1] = -1
strt[:, :, 0] = 10.
# Affecter la valeur d'une charge hydraulique égale à 0 m pour les mailles de droite
strt[:, :, -1] = 0.
Si vous souhaitez visualiser la variable ibound affectée à ce package bas, M odelM ap de _Flopy-
peut également être utilisée pour afficher ibound.
[13]: # Représenter graphiquement la grille et ibound
modelmap = flopy.plot.PlotMapView(model=m, layer=0)
grid = modelmap.plot_grid()
ib = modelmap.plot_ibound()
# Ajouter la légende
plt.xlabel('$L_x$ (m)',fontsize = 14)
plt.ylabel('$L_y$ (m)',fontsize = 14)
plt.title('Ibound', fontsize = 15, fontweight = 'bold')
plt.legend(handles=[mp.patches.Patch(color='blue',label='Charge␣
,→constante',ec='black'),
mp.patches.Patch(color='white',label='Maille active',ec='black'),
mp.patches.Patch(color='black',label='Maille␣
,→inactive',ec='black')],
bbox_to_anchor=(1.6,1.0))
plt.show(modelmap)
Le Package OC de MODFLOW
Le package OC indique à MODFLOW quels attributs des solutions de la charge hydraulique et de
débit doivent être affichés et enregistrés pour chaque période de pompage pendant l'exécution
du modèle.
Créer des données de période de pompage pour le contrôle des sorties du modèle
Pour désigner les données à sauvegarder, nous créons la variable spd comme dictionnaire de don-
nées de la période de pompage à utiliser comme argument pour la fonction Flopy oc. Cela prend
la forme :
spd = {(période de stress, pas de temps): ['IMPRIMER TETE', 'IMPRIMER BUDGET', 'ENREGISTRER TETE'
Notez que la liste des chaînes de texte peut être modifiée si vous ne souhaitez enregistrer qu'une
partie des données. Ici, nous choisirons d'enregistrer et de sauvegarder les valeurs du bilan et de la
charge pour notre modèle en régime permanent avec une seule période de pomage qui a un seul
pas de temps, comme nous l'avons spécifié dans l'objet « dis ».
[18]: # Créer les données oc de la période de pompage.
spd = {(0, 0): ['print head', 'print budget', 'save head', 'save budget']}
Définir l’objet OC
Nous utiliserons spd pour créer l'objet oc de _Flopy- qui sera ensuite utilisé pour créer le package
MODFLOW OC.
[19]: oc = flopy.modflow.ModflowOc(model=m, stress_period_data=spd, compact=True)
Flopy devrait avoir créé 6 nouveaux fichiers dans votre répertoire de travail qui ressemblent à
quelque chose comme :
Le fichier auquel faire attention est le fichier ``my_model.nam''. Ce fichier détermine quels packages
seront joints à votre fichier MODFLOW. À l'intérieur du nom du fichier, il répertoriera tous les packages
à attacher à votre modèle et spécifiera les fichiers BINARY DATA qu'il écrira en tant que sortie.
(mon_modèle.hds, mon_modèle.cbc)
Un autre fichier auquel faire attention, après l'exécution, est le fichier LIST. Celui là contiendra des
informations supplémentaires sur la façon dont les packages sont attachés à votre modèle ainsi que
les bilans massiques de MODFLOW pendant l'exécution du modèle.
MODFLOW-NWT-SWR1
U.S. GEOLOGICAL SURVEY MODULAR FINITE-DIFFERENCE GROUNDWATER-FLOW MODEL
WITH NEWTON FORMULATION
Version 1.1.4 4/01/2018
BASED ON MODFLOW-2005 Version 1.12.0 02/03/2017
headobj = flopy.utils.binaryfile.HeadFile(modelname+'.hds')
Cet objet de charge hydraulique a différents attributs qui peuvent être extraits de celui-ci, tels que
les temps utilisés dans l'exécution du modèle, les données sue les charges hydrauliques, les octets de
données, etc.
Pour ce modèle, nous allons extraire les données des charges hydrauliques pour l'unique période de
pompage (totim = 1, 0).
[24]: # Extraire les données des charges hydraulique de l'objet headobj
head = headobj.get_data(totim=1.0)
Représentation graphique
[43]: # Représenter graphiquement les résultats
plt.figure(figsize=(10,10)) # Créer une figure de taille 10 x 10
modelmap = flopy.plot.PlotMapView(model=m, layer=0) # Utiliser modelmap pour␣
,→attache le graphique au modèle
plt.show(modelmap)
C:\Users\aliha\miniconda3\lib\site-packages\flopy\plot\map.py:819:
DeprecationWarning: plot_discharge() has been deprecated and will be replaced in
version 3.3.5. Use plot_vector() instead, which should follow after
postprocessing.get_specific_discharge()
warnings.warn(
C:\Users\aliha\miniconda3\lib\site-packages\flopy\plot\plotutil.py:1630:
DeprecationWarning: centered_specific_discharge() has been deprecated and will
be removed in version 3.3.5. Use postprocessing.get_specific_discharge()
instead.
warnings.warn(
3D Surface Plot
Note: This is not part of flopy's plotting, and uses a matplotlib function from a 3d projection toolkit.
Flopy takes cell indexing where the top left of the grid is the (0,0) cell index while the Length & Width
units start at 0 in the lower left of the grid. This seems a little wierd, but it makes it easy to match up
an array of cell by cell numbers to their respective locations on the grid when assigning properties
or observing output data. Flopy's plotting functions automatically flip the resultant head data to
display on its proper grid, however, for the 3d plots below, you'll see the function np.flipud() is used
to flip the data array to plot in the same direction.
Tracé de surface 3D
Remarque : Cela ne fait pas partie de fonctionalités de représentation graphique de Flopy et
utilise une fonction Matplotlib d'une boîte à outils de projection 3D. Flopy prend l'indexation des
mailles où le coin supérieur gauche de la grille est l'index de cellule (0, 0) tandis que les unités de
longueur et de largeur commencent à 0 dans le coin inférieur gauche de la grille. Cela semble
un peu étrange, mais cela permet de faire facilement correspondre un tableau de numéros de
maille par maille à leurs emplacements respectifs sur la grille lors de l'attribution de propriétés ou de
l'observation des données de sortie. Les fonctions de représentation graphique de Flopy retournent
automatiquement les données des charges hydrauliques résultantes pour les afficher sur sa grille
appropriée, cependant, pour les graphiques 3D ci-dessous, vous verrez que la fonction np.flipud()
est utilisée pour retourner le tableau de données afin de tracer dans la même direction.
[50]: # Importer toolkit des axes 3d de matplotlib
from mpl_toolkits.mplot3d import Axes3D
X = np.arange(0,Lx,dx)
Y = np.arange(0,Ly,dy)
X, Y = np.meshgrid(X, Y)
Z = np.flipud(head[0])
fig_3d.colorbar(surf,shrink=0.5,aspect=5).set_label('Head␣
,→(m)',fontsize=10,fontweight='bold')
C:\Users\Public\Documents\Wondershare\CreatorTemp/ipykernel_25112/3839266141.py:
6: MatplotlibDeprecationWarning: Calling gca() with keyword arguments was
deprecated in Matplotlib 3.4. Starting two minor releases later, gca() will take
no keyword arguments. The gca() function should only be used to get the current
axes, or if no axes exist, create new axes with default keyword arguments. To
create a new axes with non-default arguments, use plt.axes() or plt.subplot().
ax = fig_3d.gca(projection='3d')
Congratulations! You just used flopy to run a single-layer, steady-state model in MODFLOW-2005!
Activity: Try going back to where we defined the starting heads in the LPF package and changing
the left and right boundary conditions. How does the head surface change?
What happens if you add another row of constant head cells to the model by modifying the IBOUND
variable and set those to a different value of starting heads?
Félicitations! Vous venez d'utiliser Flopy pour exécuter un modèle monocouche en régime permanent
dans MODFLOW !
Activity : Essayez de revenir à l'endroit où nous avons défini les charges initiales dans le package
LPF et de modifier les conditions aux limites gauche et droite. Comment la surface de la tête change-
t-elle?
Que se passe-t-il si vous ajoutez une autre ligne de maille à charge constante au modèle en
modifiant la variable IBOU N D et en les définissant sur une valeur différente de la charge intiale ?
[ ]:
%matplotlib inline
Remarque : Vous devrez modifier la variable exen ame pour diriger Flopy vers le fichier exécutable
modflow sur votre ordinateur !
[2]: # Créer l'objet du modèle
modelname = "model2"
#m = flopy.modflow.Modflow(modelname, exe_name = 'mf2005')
m = flopy.modflow.Modflow(modelname, exe_name = 'Exe/MODFLOW-NWT_64')
ibound[:, :, 0] = -1
ibound[:, :, -1] = -1
ibound[:,0,:] = -1
ibound[:,-1,:] = -1
ib = modelmap.plot_ibound()
# Ajouter les étiquettes et la légende
plt.xlabel('$L_x$ (m)',fontsize = 14)
plt.ylabel('$L_y$ (m)',fontsize = 14)
plt.title('Ibound', fontsize = 15, fontweight = 'bold')
plt.legend(handles=[mp.patches.Patch(color='blue',label='Charge␣
,→constante',ec='black'),
mp.patches.Patch(color='white',label='Maille active␣
,→Cell',ec='black'),
mp.patches.Patch(color='black',label='Maille␣
,→inactive',ec='black')],
bbox_to_anchor=(1.6,1.0))
plt.show(modelmap)
To make sure our well is where we want it, we can visualize its location using the plot_bc() function
of flopy ModelMap and specifying the file type we wish to plot as the well file. (ftype=`WEL')
[11]: #CHECK WELL LOCATION
#use flopy to plot grid, ibound, and wells
modelmap = flopy.plot.PlotMapView(model=m, layer=0)
grid = modelmap.plot_grid()
ib = modelmap.plot_ibound()
wel = modelmap.plot_bc(ftype='WEL')
#add labels and legend
plt.xlabel('Lx (m)',fontsize = 14)
plt.ylabel('Ly (m)',fontsize = 14)
plt.title('Well and Boundary Conditions', fontsize = 15, fontweight = 'bold')
plt.legend(handles=[mp.patches.Patch(color='red',label='Well',ec='black'),
mp.patches.Patch(color='blue',label='Const Head',ec='black'),
mp.patches.Patch(color='white',label='Active Cell',ec='black'),
mp.patches.Patch(color='black',label='Inactive␣
,→Cell',ec='black')],
bbox_to_anchor=(1.5,1.0))
plt.show(modelmap)
### VII. Assign PCG as Finite Difference Solver and Attach PCG Package
[13]: #assign groundwater flow solver
pcg = flopy.modflow.ModflowPcg(model=m)
MODFLOW-NWT-SWR1
U.S. GEOLOGICAL SURVEY MODULAR FINITE-DIFFERENCE GROUNDWATER-FLOW MODEL
WITH NEWTON FORMULATION
Version 1.1.4 4/01/2018
BASED ON MODFLOW-2005 Version 1.12.0 02/03/2017
## X. Plotting
plt.colorbar(head_contours, aspect=5)
plt.show(modelmap)
C:\Users\aliha\miniconda3\lib\site-packages\flopy\plot\map.py:819:
DeprecationWarning: plot_discharge() has been deprecated and will be replaced in
version 3.3.5. Use plot_vector() instead, which should follow after
postprocessing.get_specific_discharge()
warnings.warn(
C:\Users\aliha\miniconda3\lib\site-packages\flopy\plot\plotutil.py:1630:
DeprecationWarning: centered_specific_discharge() has been deprecated and will
be removed in version 3.3.5. Use postprocessing.get_specific_discharge()
instead.
warnings.warn(
cf = plt.contourf(np.flipud(head[0,:,:]),levels=contour_levels)
#display parameters
plt.xlabel('Lx (m)',fontsize = 14)
plt.ylabel('Ly (m)',fontsize = 14)
plt.title('Steady-State Pumping, Head(m) Results', fontsize = 15, fontweight =␣
,→'bold')
plt.colorbar(cf,aspect=10)
plt.show()
In this simulation, it's interesting to note the effect of the boundary conditions on the head profile
near the edges of the model, as well as the effect of the grid on the head profile near the well.
The contour lines are slightly squared at the points closest to the corners of the grid as there is a
greater distance to a constant head cell and hence there may be more draw down at these points.
Additionally, the head contours are distorted to be sort of diamond shaped at the point of pumping
as the coarse grid size compromises the ability to resolve greater head changes at this point.
Activity: Rerun the model with a refined grid spacing (increase nrow and ncol). How does this change
the shape of the head contours near the point of pumping?
Advanced Activity: Write a code to create an ibound variable that sets constant head cells in a
more ``circular'' boundary around the well. What happens to the head contours near the boundaries
now?
#create 3d figure
fig_3d = plt.figure(figsize=(12,5))
ax = fig_3d.gca(projection='3d')
#set X, Y, Z variables for 3d plot to be our model domain and head solution
X = np.arange(0,Lx,dx)
Y = np.arange(0,Ly,dy)
X, Y = np.meshgrid(X, Y)
Z = np.flipud(head[0])
fig_3d.colorbar(surf,shrink=0.5,aspect=5).set_label('Head␣
,→(m)',fontsize=10,fontweight='bold')
Activities: - Increase pumping rates and observe the changes in head surface/drawdown extent. -
Add another pumping well variable, well_2, to the well package and rerun the model with two wells. -
Change the location of well_1 and observe different interactions with the constant head boundary
conditions. - Change the IBOUND to accomodate active flux boundaries on the top and bottom of
the model edges and observe differences in head surface symmetry.
Remarque : vous devrez modifier la variable exen ame pour diriger Flopy vers le fichier exécutable
modflow sur votre ordinateur.
[63]: #create model object
modelname = "my_river_model"
#m = flopy.modflow.Modflow(modelname, exe_name = 'Exe/mf2005')
C'est ici où le modèle transitoire commence à être différent de la simulation en régime permanent :
• nper = 3 veut dire que la simulation va se faire pour 3 périodes de pompage.
• la variable steady se transforme en une liste avec des entrées booléennes ``True/False'' pour
chacune de ces périodes de pompage. La première période est désigné comme « True » afin
de mettre en place une solution en régime permanent pour notre aquifère à utiliser comme
base pour les futures périodes de de pompage en régime transitoire. (Si nous commençons
simplement à résoudre les périodes de pompage transitoires avec des hauteurs de départ
arbitraires, cela ne constituerait pas un système d'eaux souterraines naturel très réaliste.) Da-
vantage de périodes de périodes sont ajoutées à une simulation s'il y a des changements
dans le « pompage » dans l'aquifère, c'est-à-dire pompage, les niveaux des rivières ou les
taux de recharge. (Remarque : certaines choses ne peuvent pas être modifiées par période
de contrainte, comme par ibound, la conductivité hydraulique ou d'autres propriétés liées à la
géologie de l'aquifère.)
• perlen désigne la durée de chaque période de pompage. Pour la période de pompage de
régime permanent, ce que nous attribuons ici n'a pas vraiment d'importance puisque l'équation
ne dépend pas du temps. Pour les périodes de pompage transitoires, nous attribuons des
entrées « perlen » qui correspondent à ce que nous avons défini comme étant nos unités de
longueur. Pour ce modèle, chaque période de pompage durera 5 jours.
• nstp est le nombre de pas de temps pour lesquelles le solveur de MODFLOW atteindra des
solutions au cours de chaque période de pompage. Il peut être ajusté en fonction de ce
que vous souhaitez résoudre dans la simulation ; si vous souhaitez voir des changements
de haute résolution dans les profils de charge hydraulique, un nstp plus élevé peut être utilisé.
Cependant, cela augmentera le temps nécessaire pour résoudre la simulation puisque le solveur
doit générer plus de solutions, donc si vous êtes simplement intéressé par le comportement
général de la charge hydraulique sur un grand nombre de périodes de contrainte, un ``nstp''
plut petit peut être utilisé.
[43]: # Specifier le nombre de périodes de pompage
nper = 3
Nous créons le package dis incluant les paramètres de discrétisation temporelle et spatiale ci-dessus :
bound_sp1 = []
# Attribuer une condition aux limites à charge constante aux mailles de gauche et␣
,→de droite du domaine
the aquifer depending on the head difference between the river and the aquifer and conductance
of the sediment bottom. If the reverse is true of the head and stage, water will flow from the aquifer
to the river.
MODFLOW calculates flow between river and aquifer as the following: Qf lux = C ∗ ∆H
Where:
∆H = Hriver − Haquif er
k(dx ∗ dy)
C=
t
And:
L2
C = Conductance ( )
T
L
k = Conductivity of River Bed Sediment ( )
T
dx = Cell width (L)
dy = Cell Length (L)
t = Thickness of River Bed Sediment (L)
Specified Parameters: Location, Conductance, River Bottom, and River Stage are all specified for
each river cell in a MODFLOW model. In flopy, conductance is specified as cond , the river bottom
is specified as rbot and river stage is specified as r_stage . Layer, Row, and Column of the river cell
is also specified.
• The RIV Package takes stress period data very similarly to the CHD package with river cell
information defined in a list:
riv_cell = [layer, row, column, stage, conductance, bottom]
• And stress period data assigned in a dictionary of the form:
riv_spd = {stress period: [riv_cell(s)]}
(More info in flopy documentation: http://modflowpy.github.io/flopydoc/mfriv.html)
• Here, we define a column of river cells halfway across the domain and set the head in the river
to fluctuate between 1 and 5 during the stress periods.
La simulation MODFLOW d'une rivière peut être illustrée comme suit :
Sil le niveau de la rivière est plus élevé que la charge hydraulique de l'aquifère dans la maille située
juste en dessous, induira un écoulement vers l'aquifère en fonction de la différence de charges entre
la rivière et l'aquifère et la conductance du fond sédimentaire. Si c'est l'inverse, l'eau s'écoulera de
l'aquifère vers la rivière.
Paramètres spécifiés :
La localisation, la conductance, le fond de la rivière et le niveau de la rivière sont tous spécifiés
pour chaque maille de la rivière dans le modèle MODFLOW. Dans Flopy, la conductance est spécifiée
comme cond, le fond de la rivière est spécifié comme rbot et le niveau de la rivière est spécifié comme
rs tage. La couche, la ligne et la colonne de la maille de la rivière sont également spécifiées.
• Le package RIV prend les données de période de pompage de manière très similaire au
package CHD avec des informations sur les maille de la rivière définies dans une liste :
rivc ell = [layer, row, column, stage, conductance, bottom]
• Et des données de période de pompage assignées dans un dictionnaire de la forme :
rivs pd = {période de pompage : [rivc ell(s)]}
• Ici, nous définissons une colonne de la maille de rivière à mi-hauteur du domaine et définissons
la charge dans la rivière pour qu'elle fluctue entre 1 et 5 pendant les périodes de pompage.
[51]: # Définir les rivières
mp.patches.Patch(color='white',label='Maille active',ec='black'),
mp.patches.Patch(color='black',label='Maille␣
,→inactive',ec='black')],
bbox_to_anchor=(2,1))
plt.show(modelmap)
MODFLOW-2005
U.S. GEOLOGICAL SURVEY MODULAR FINITE-DIFFERENCE GROUND-WATER FLOW MODEL
Version 1.12.00 2/3/2017
frf = {} # créer un dictionnaire pour stocker les flux à travers la face droite de␣
,→la cellule à la fin de chaque période de stress
fff = {} #créer un dictionnaire pour stocker les flux à travers la face avant de la␣
,→cellule à la fin de chaque période de stress
Représentation graphique
Graphiques des lignes piézométriques et de flux
head_contours = modelmap.contour_array(head['sp%s'%i][0],␣
,→levels=contour_levels) # Créer les lignes piézométriques
plt.colorbar(head_contours, aspect=5)
plt.legend(handles=[mp.patches.Patch(color='green',label='Rivière',ec='black'),
mp.patches.Patch(color='navy',label='Limite à charge␣
,→imposée',ec='black'),
mp.patches.Patch(color='white',label='Mailles␣
,→actives',ec='black')],
bbox_to_anchor=(1.8,1.0))
plt.show(modelmap)
# définir les variables X, Y, Z pour le tracé 3D comme notre domaine de modèle et␣
,→notre solution principale
X = np.arange(0,Lx,dx)
Y = np.arange(0,Ly,dy)
X, Y = np.meshgrid(X, Y)
for i in range(len(times)):
# créer une figure 3D
fig_3d = plt.figure(figsize=(12,5))
ax = fig_3d.gca(projection='3d')
Z = np.flipud(head['sp%s'%i][0])
fig_3d.colorbar(surf,shrink=0.5,aspect=5).set_label('Charge hydraulique␣
,→(m)',fontsize=10,fontweight='bold')
• Notice the difference between the plots for Stress-Periods 1 and 3: They both have the same
boundary conditions, however, plot 1 displays the steady-state solution, whereas plot 3 repre-
sents conditions that have not entirely relaxed to the steady-state drawdown. Increasing the
length (perlen) of this last stress period should yield a head surface that looks more similar to
stress period 1.
• Notez la différence entre les représentations graphiques pour les périodes de pompage 1
et 3 : ils ont tous les deux les mêmes conditions aux limites, cependant, le graphe 1 affiche
la solution à l'état permanent, tandis que le graphe 3 représente les conditions qui ne se
sont pas entièrement stavilisées jusqu'au rabattement à l'état permanent. L'augmentation de
la longueur (perlen) de cette dernière période de contrainte devrait donner une surface de
charges hydrauliques qui ressemble plus à la période de pompage 1.
# Créer le tracé
plt.subplot(1, 1, 1)
plt.title('Charge hydraulique à la maille ({0},{1},{2})'.format(cell_id[0] + 1,
cell_id[1] + 1,
cell_id[2] + 1),fontweight='bold')
plt.xlabel('Temps (days)',fontweight='bold')
plt.ylabel('Charge (m)',fontweight='bold')
plt.plot(time_series[:, 0], time_series[:, 1], 'bo-')
plt.show()
print('Données sur la série temporelle de la charge hydraulique: \n', time_series)
desurfaceetdeseauxsouter-
raines
Introduction
Dans les régions arides et semi-arides l'irrigation permet l'exploitation des terres agricoles pendant
les périodes de l'année où l'évapotranspiration excède les précipitations. Le développement de
l'irrigation s'accompagne souvent de problèmes d'engorgement des sols par remontée de la nappe
et de problèmes de salinité rendant les sols non productifs. Par ailleurs, la surexploitation des
eaux souterraines dans certaines régions a entraîné un rabattement excessif des nappes souter-
raines (Souss-Massa) et l'intrusion marine (région de Bir Jdid). Cela est généralement le résultat du
développement séparé de l'exploitation des ressources en eau de surface et des ressources en
eau souterraine. L'utilisation conjuguée des eaux de surface et des eaux souterraines combine les
avantages peut constituer une manière efficace pour la gestion efficace des ressources en eau.
Cependant, les eaux souterraines et les eaux de surface doivent être gérées d'une manière opti-
male dans l'objectif de minimiser les effets indésirables de l'utilisation séparée de chacune des deux
ressources.
L'utilisation conjuguée est définie comme étant une gestion coordonnée, dans le temps et dans
l'espace, de l'eau de surface et de l'eau souterraine pour tirer profit de leurs propriétés complémen-
taires. Les Le terme `` conjuguée ou conjointe '' est utilisé lorsque les deux sources qui sont utilisées
séparément, sont utilisées pour un meilleur effet sous une gestion intégrés des lâchers d'eau de sur-
face à partir des barrages, des dérivations de rivière et d'exploitation des eaux souterraines. Sous
des programmes d'utilisation conjuguée, les eaux de surface et les eaux souterraines sont utilisées
pendant les années à déficit pluviométrique pour des apports supplémentaires d'eau d'irrigation.
L'utilisation conjuguée peut être également envisagée pour augmenter le débit des canaux et avoir
une main d'eau suffisante. Lorsque les eaux souterraines sont de mauvaise qualité l'utilisation con-
juguée peut être une manière de l'améliorer par son mélange avec les eaux de surface. Pendant
les périodes où la pluie dépasse nettement l'évapotranspiration les eaux de surface sont utilisée au
maximum et l'excédant est utilisé pour la recharge des nappes souterraines.
L'utilisation conjuguée des eaux de surface et des eaux souterraines ne consiste pas uniquement
à l'utilisation des eaux souterraines en plus des eaux de surface mais consiste en une exploitation
optimale des deux ressources en considérant la dynamique des terres, des eaux et des systèmes
écologiques.
Un autre aspect de l'utilisation conjuguée consiste en l'utilisation mélangée de l'eau de surface de
bonne qualité et de l'eau souterraine de mauvaise qualité pour réduire la salinité du mélange à une
limite acceptable.
118
Utilisation conjuguée des eaux de surface et des eaux souterraines 119
L'eau souterraine est une ressource extrêmement importante pour beaucoup de pays en développe-
ment. En Inde, par exemple, les puits tubulaires donnaient à la fin des années 80 plus de la moitié de
l'eau utilisée sur la superficie irriguée nette. Du fait que la gestion des couches aquifères doit tenir
compte de l'interaction complexe entre la société et l'environnement physique, elle pose des prob-
lèmes redoutables au stade de la conception des politiques. En présence de couches aquifères
surexploitées, la gestion ou la réglementation doit répondre à deux catégories de choix collectifs.
D'une part, pour ce qui est de gérer l'eau, les décisions se fondent sur :
• le taux annuel approprié de pompage;
• la distribution géographique du pompage;
• la possibilité de complément par les eaux superficielles;
• la possibilité de la recharge artificielle de la couche aquifère.
D'autre part, l'autre catégorie de décisions, à savoir coordonner le pompage, détermine:
• quelles doivent être les institutions et les politiques qui répartissent le taux d'extraction entre
utilisateurs individuels potentiels et classes d'utilisateurs, et influencent les modalités de pom-
page;
• comment les règles qui limitent le pompage sont appliquées et leur respect surveillé.
L'exploitation des eaux souterraines est traditionnellement extensive et s'attache encore souvent à
découvrir et à utiliser des ressources nouvelles. Cette exploitation doit devenir moins agressive pour
les milieux naturels, plus économe, et à l'échelle du système aquifère, permettre la multiplication des
utilisations en veillant à préserver la ressource, que ce soit dans son volume ou dans sa qualité. Le
recours aux ressources nouvelles doit être concerté et doit tenir compte du droit des générations
futures : la gestion doit intégrer le long terme.
une nappe plus profonde, n'est pas directement soumise l'influence de facteurs climatiques, en
l'occurrence la température qui stimule l'évaporation et la demande climatique.
• Les ouvrages de captage de l'eau souterraine occupent des espaces très réduits, et l'effort
de leur réalisation est moins important que celui du captage des eaux superficielles. Par
conséquent, les investissements, pour l'exploitation et l'accès A 1'eau souterraine, sont réduits
et peuvent être à la portée des petites collectivités et même des individus qu'ils ne le sont
pour les eaux de surface. Toutefois. ceci n'est pas le cas, lorsqu'un programme de recharge
artificielle de la nappe est envisagé.
Par ailleurs, le même auteur signale qu'une sur-exploitation de la nappe, qui, dans certaines situa-
tions, peut conduire par exemple à une intrusion d'eau salée, compromettrait ainsi la durabilité de
l'utilisation conjuguée des eaux de surface et des eaux souterraines.
D'autre part, si l'investissement de base pour l'exploitation de l'eau souterraine, est réduit par rap-
port à celui de l'eau de surface, le coût d'exploitation du m3 d'eau souterraine est généralement
supérieur du fait qu'il est supporté individuellement par les agriculteurs. Par contre, l'investissement
pour l'ouvrage de captage de l'eau de surface fait profiter un grand nombre d'agriculteurs qui
se trouvent à l'aval de l'ouvrage. Par conséquent, cette disparité des prix peut être une con-
trainte financière la réussite de programmes d'utilisation conjuguée, et à une gestion optimale des
ressources en eau. Cette contrainte peut être réduite par un effort conscient d'équilibrer les prix des
eaux souterraines et des eaux de surface, comme c'est le cas dans une partie du périmètre irrigué
du Tadla où le coût de mètre cube d'eau d'irrigation est le même lorsque l'agriculteur pompe les
eaux souterraines ou lorsqu'il recours à l'eau de surface.
Le problème générés par une utilisation non raisonnée des ressources en eau
Salinité des eaux et du sol
La salinisation se produit sous l'effet combiné d'un mauvais drainage et d'un taux élevé d'évaporation,
qui entraîne une concentration les sels dans les terres irriguées; le phénomène se produit principale-
ment dans les régions arides ou semi-arides. Même une eau d'irrigation de bonne qualité contient
une certaine quantité de sels en solution, et peut en abandonner plusieurs tonnes par hectare
chaque année. A moins que ces sels ne soient entraînés par l'eau au-dessous de la couche dans
laquelle plongent les racines, le sol devient salin. Plusieurs facteurs influencent la salinité, notamment
la profondeur de la nappe phréatique, les caractéristiques capillaires du sol et les pratiques de
conduite de l'irrigation, notamment la quantité d'eau apportée en excès de l'évapotranspiration
effective des plantes pour lessiver les sels.
Dans le périmètre irrigué du Tadla, il se trouve actuellement affecté par la salinité des eaux souter-
raines, principalement à l'aval hydraulique des périmètres des Béni-Amir et des Beni-Moussa ainsi
qu'au droit des zones à problème de remontée de la nappe. La qualité chimique des eaux souter-
raines du périmètre présente une très grande irrégularité du taux de salure qui varie de moins de
0,5 g/l dans les Béni- Moussa Est à plus de 4g/l dans les Beni-Moussa de l'Ouest et les Beni-Amir.
Dans le périmètre irriguée de Tadla, après une période de remontée excessive de la nappe phréa-
tique pendant les années suivant la mise en eau du périmètre, l'eau souterraine a constitué une
ressource supplémentaire utilisée notamment pendant les années sèche par la mise en place de
puits et forages (figure ??). Le cas de Tadla est un cas où l'on peut mettre en œuvre l'utilisation
conjuguée des eaux de surface et des eaux souterraines. La nappe peut être rechargé pendant
les périodes pluvieuses.
Les avantages de l’utilisation conjuguée des eaux de surface et des eaux sout
L'utilisation conjuguée des eaux de surface et des eaux souterraines pour l'irrigation combine les
avantages l'exploitation des eaux souterraines et ceux de l'exploitation des eaux de surface et sert
de mesure corrective pour une gestion et une utilisation efficace des ressources en eau. Les avan-
tages majeurs de l'utilisation de l'utilisation conjuguée des eaux de surface et des eaux souterraine
peuvent être résumés comme suit :
• L'utilisation des eaux souterraines contribue dans la réduction de la demande de point pour
l'irrigation, à la réduction de la taille des canaux et par conséquent des coûts ;
• Les apports supplémentaires d'eau souterraine garantie une programmation propre des irriga-
tions, permet la diversification des systèmes de culture et mis en culture précoce des terres ;
• L'eau souterraine accroît et garanti la disponibilité des ressources en eau dans les queues de
réseau ;
• L'exploitation des eaux souterraines rabat les niveaux des nappes phréatiques et réduit les
risques d'engorgement des sols et par conséquent d'éviter le gaspillage d'eau dans le cas où
il faut éliminer les excès d'eau par drainage ;
• L'accès à l'eau souterraine permet de réduire le volume des bassins de stockage et donc
réduction des coûts des projets de goutte à goutte ;
• Avec l'utilisation des eaux conjuguée, les écoulements de surface sont minimisés entraînant une
réduction des débits de crues ;
• Quand l'utilisation conjuguée est intégrée à un projet de recharge de nappe souterraine, les
besoins en revêtement des canaux sont réduits du fait que les infiltrations à partir des canaux
recharge la nappe ;
• L'utilisation conjuguée permet de réduire les pertes en d'eau par évaporation directe à partir
des retenues des eaux de surface.
Puits collectifs
Cette approche concerne l'instauration de puits collectifs qui vont être exploités à 1'échelle ré-
gionale pour une utilisation conjuguée avec l'eau de surface. Ces puits, gérés par la collectivité,
vont permettre d'approvisionner les exploitations agricoles en eau, par l'intermédiaire d'un réseau
d'irrigation.
L'expérience Pakistanaise avec les puits publics, mérite une attention particulière. En effet, à la suite
de problèmes d'engorgement et de salinisation qu'à connu le périmètre Indus (Pakistan), plusieurs
chercheurs et experts de la Banque Mondiale ont recommandé l'installation de puits publics, dans
le but de réaliser un drainage vertical des sols par le rabattement du niveau de la nappe en
permettant par la suite d'amé1iorer la productivité des sols.
Puits individuels
Les agriculteurs ont une préférence pour un contrô1e individuel ou privé sur les approvisionnements
en eau. En effet, signale que depuis que l'accès A la ressource en eau est déterminant pour la
stabilité des revenus des agriculteurs dans les régions où l'eau est une ressource rare, ces derniers
préfèrent, naturellement, avoir un contrô1e sur cette ressource.
Par conséquent, le comportement pragmatique des agriculteurs pour la recherche d'un contrô1e
sur les ressources en eau explique l'accroissement et le développement des investissements dans les
puits privés. En effet, grâce à un puits situé au niveau de l'exploitation agricole, l'agriculteur a une
eau à sa demande, qu'il peut exploiter le jour comme la nuit. De plus, ce dernier est conscient que
le puits va le mettre à 1'abri des contraintes l'approvisionnement en eau de surface. Cependant,
l'installation non contrôlé des puits privés peut entraîner une inégalité à l'accès à l'eau souterrain
puisque seul les agriculteurs qui ont le plus de moyens peuvent l'exploiter.
des stress de la nappe tels que le pompage et la recharge, qui sont traités avec les charges
hydrauliques comme des variables de décision du modèle de gestion. La composante modèle de
simulation, est basée sur 1'équation de 1'écoulement souterrain dans les zones saturées.
Le problème de l'utilisation de l'eau saline se pose particulièrement pour l'eau souterraine, du fait
que l'accumulation des sels au niveau de la nappe phréatique, et de la zone racinaire, est une
conséquence inévitable de 1'évapotranspiration des cultures.
On peut utiliser un ratio de conductivité électrique, ECR, qui donne la proportion l'eau souterraine
saline qui peut être mé1angée avec l'eau douce du canal de la façon suivante :
ECc − ECsw
ECR = (6.1)
ECgw − ECsw
Avec:
• ECc : Seuil de tolérance de la culture A la salinité de l'eau l'irrigation ;
• ECsw : Conductivité électrique de l'eau de surface ;
• ECgw : Conductivité de l'eau souterraine.
Ce ratio ECR exprime le rapport du gain de qualité permis par l'utilisation d'une eau de surface
douce, et de la perte causée par une eau souterraine saline, compte tenu du seuil de tolérance
de la culture à la salinité. De plus, la détermination de ce ratio va permettre d'estimer la quantité
maximale de l'eau souterraine saline (MAXgw ) en terme de volume, qui va être mé1angée avec l'eau
de surface sans causer une réduction des rendements des cultures:
ET − RF
IW = IE
(6.3)
IE + LF IE−LF
Avec:
• IW : Quantité totale de l'eau de surface et de l'eau souterraine utilisée pour l'irrigation ;
• ET : Evapotranspiration de la culture durant la période considérée ;
• RF : Précipitation totale au cours de la même période ;
• LF : Dose de fraction de lessivage en % ;
• IE : Efficience de l'irrigation basée sur le % l'eau d'irrigation infiltrée qui est stockée dans la
zone racinaire par pratique normale de l'irrigation.
La quantité IW représente les besoins nets l'irrigation compte tenu de la demande climatique (ET R),
des précipitations, de l'efficience de l'irrigation à la parcelle (pour considérer les doses réelles l'eau
qui arrivent au niveau de la zone racinaire) et de la dose de lessivage qui va dépendre de
la conductivité électrique de l'eau dans la zone racinaire. Cette quantité IW est d'autant plus
grande que la salinité de l'eau au niveau de cette dernière est élevée nécessitant par la suite des
grandes doses pour le lessivage des sels.