4. Uniform Flow and Well#

Contributed by Ms. Anne Pförtner and Sophie Pförtner. The original concept from Prof. R. Liedl spreasheet code.

The worksheet addresses the superposition of uniform and radial steady-state groundwater flow
in a homogeneous, confined aquifer of uniform thickness without recharge.
The radial flow component may represent an extraction or injection well.

The worksheet calculates hydraulic head isolines (red), streamlines (blue / black), and isochrones (green)
by using an analytical solution. The set of streamlines includes the dividing streamline (black).
In addition, the capture width of the well (dashed lines) and the position of the stagnation point are determined.
Three travel time values representing isochrones can be selected by the user.

input parameters

units

remarks

hydraulic conductivity

m/s

enter positive number

effective porosity

-

enter number between 0 and 1

thickness

mm/a

enter positive number

uniform velocity

m/d

enter number different from zero\(*\)

pumping rate

m³/d

enter number different from zero\(**\)

travel time

d

enter positive number

\(*\) Positive or negative numbers correspond to uniform flow in parallel with or antiparallel to the x-axis, resp.
\(**\) Positive or negative numbers correspond to water extraction or injection, resp.

This tool can also be downloaded and run locally. For that download the uniform_flow_and_well.ipynb file from the book GitHub site, and execute the process in any editor (e.g., JUPYTER notebook, JUPYTER lab) that is able to read and execute this file-type.

The codes are licensed under CC by 4.0 (use anyways, but acknowledge the original work)

import numpy as np
from ipywidgets import *
import matplotlib.pyplot as plt

import warnings
warnings.filterwarnings('ignore')

#definition of the function 
def uniform_flow(K, ne, m, v, Q, t1, t2, t3):

    #intermediate results 
    K_1 = K*86400                       #hydraulic conductivity [m/d]
    capture_width = Q/m/v               #capture width [m]
    L_ref = Q/(2*np.pi*np.exp(1)*m*v)   #[m]
    h_ref = v/K_1*L_ref                 #[m]
    t_ref = 0.5*ne*Q/np.pi/m/v**2       #[d]
    stagnation_x = np.exp(1)*L_ref      #stagnation point (x) [m]
    stagnation_y = 0                    #stagnation point (y) [m]

    #isolines; Syntax: isolines_[X or Y]_plot_[h_ref]_[optional: 1 or 2]
    isolines_x_plot_n5_1=[] 
    isolines_y_plot_n5_1=[]
    isolines_x_plot_n5_2 = []
    isolines_y_plot_n5_2 = []
    isolines_x_plot_n2_5_1 = []
    isolines_y_plot_n2_5_1 = []
    isolines_x_plot_n2_5_2 = []
    isolines_y_plot_n2_5_2 = []
    isolines_x_plot_0_1 = []
    isolines_y_plot_0_1 = []
    isolines_x_plot_0_2 = []
    isolines_y_plot_0_2 = []
    isolines_x_plot_2_5 = []
    isolines_y_plot_2_5 = []
    isolines_x_plot_5 = []
    isolines_y_plot_5 = []
    isolines_x_plot_7_5 = []
    isolines_y_plot_7_5 = []
    isolines_x_plot_10 = []
    isolines_y_plot_10 = []
    isolines_x_plot_12_5 = []
    isolines_y_plot_12_5 = []
    isolines_x_plot_15 = []
    isolines_y_plot_15 = []
    
    
    for x in range(0, 100):
        isolines_x_n5_1=L_ref*((x*0.169103048517306+(100-x)*-0.150360933444141)/100)
        isolines_x_n5_2=L_ref*((x*12.35+(100-x)*11.6815653622516)/100)
        isolines_x_n2_5_1=L_ref*((x*0.474722923528955+(100-x)*-0.350418198256065)/100)
        isolines_x_n2_5_2=L_ref*((x*9.45+(100-x)*8.22933315122817)/100)
        isolines_x_0_1=L_ref*((x*np.exp(1)+(100-x)*-0.75695357132717)/100)
        isolines_x_0_2=L_ref*((x*6.65+(100-x)*np.exp(1))/100)
        isolines_x_2_5=L_ref*((x*4+(100-x)*-1.46395392968976)/100)
        isolines_x_5=L_ref*((x*1.5+(100-x)*-2.50444142220744)/100)
        isolines_x_7_5=L_ref*((x*-0.875+(100-x)*-3.84154019983304)/100)
        isolines_x_10=L_ref*((x*-3.15+(100-x)*-5.4105773228373)/100)
        isolines_x_12_5=L_ref*((x*-5.4+(100-x)*-7.15205676143326)/100)
        isolines_x_15=L_ref*((x*-7.65+(100-x)*-9.02099613666581)/100)
        
        if x == 0:
            isolines_y_n5_1 = 0
            isolines_y_n5_2 = 0
            isolines_y_n2_5_1 = 0
            isolines_y_n2_5_2 = 0
            isolines_y_0_1 = 0
            isolines_y_0_2 = 0
            isolines_y_2_5 = 0
            isolines_y_5 = 0
            isolines_y_7_5 = 0
            isolines_y_10 = 0
            isolines_y_12_5 = 0
            isolines_y_15 = 0
            
        else:
            isolines_y_n5_1 = np.sqrt((L_ref*np.exp(-5/np.exp(1)+isolines_x_n5_1/L_ref/np.exp(1)))**2-isolines_x_n5_1**2)
            isolines_y_n5_2 = np.sqrt((L_ref*np.exp(-5/np.exp(1)+isolines_x_n5_2/L_ref/np.exp(1)))**2-isolines_x_n5_2**2)
            isolines_y_n2_5_1 = np.sqrt((L_ref*np.exp(-2.5/np.exp(1)+isolines_x_n2_5_1/L_ref/np.exp(1)))**2-isolines_x_n2_5_1**2)
            isolines_y_n2_5_2 = np.sqrt((L_ref*np.exp(-2.5/np.exp(1)+isolines_x_n2_5_2/L_ref/np.exp(1)))**2-isolines_x_n2_5_2**2)
            isolines_y_0_1 = np.sqrt((L_ref*np.exp(0/np.exp(1)+isolines_x_0_1/L_ref/np.exp(1)))**2-isolines_x_0_1**2)
            isolines_y_0_2 = np.sqrt((L_ref*np.exp(0/np.exp(1)+isolines_x_0_2/L_ref/np.exp(1)))**2-isolines_x_0_2**2)
            isolines_y_2_5 = np.sqrt((L_ref*np.exp(2.5/np.exp(1)+isolines_x_2_5/L_ref/np.exp(1)))**2-isolines_x_2_5**2)
            isolines_y_5 = np.sqrt((L_ref*np.exp(5/np.exp(1)+isolines_x_5/L_ref/np.exp(1)))**2-isolines_x_5**2)
            isolines_y_7_5 = np.sqrt((L_ref*np.exp(7.5/np.exp(1)+isolines_x_7_5/L_ref/np.exp(1)))**2-isolines_x_7_5**2)
            isolines_y_10 = np.sqrt((L_ref*np.exp(10/np.exp(1)+isolines_x_10/L_ref/np.exp(1)))**2-isolines_x_10**2)
            isolines_y_12_5 = np.sqrt((L_ref*np.exp(12.5/np.exp(1)+isolines_x_12_5/L_ref/np.exp(1)))**2-isolines_x_12_5**2)
            isolines_y_15 = np.sqrt((L_ref*np.exp(15/np.exp(1)+isolines_x_15/L_ref/np.exp(1)))**2-isolines_x_15**2)
        
        isolines_x_plot_n5_1.append(isolines_x_n5_1)
        isolines_y_plot_n5_1.append(isolines_y_n5_1)
        isolines_x_plot_n5_2.append(isolines_x_n5_2)
        isolines_y_plot_n5_2.append(isolines_y_n5_2)
        isolines_x_plot_n2_5_1.append(isolines_x_n2_5_1)
        isolines_y_plot_n2_5_1.append(isolines_y_n2_5_1)
        isolines_x_plot_n2_5_2.append(isolines_x_n2_5_2)
        isolines_y_plot_n2_5_2.append(isolines_y_n2_5_2)
        isolines_x_plot_0_1.append(isolines_x_0_1)
        isolines_y_plot_0_1.append(isolines_y_0_1)
        isolines_x_plot_0_2.append(isolines_x_0_2)
        isolines_y_plot_0_2.append(isolines_y_0_2)
        isolines_x_plot_2_5.append(isolines_x_2_5)
        isolines_y_plot_2_5.append(isolines_y_2_5)
        isolines_x_plot_5.append(isolines_x_5)
        isolines_y_plot_5.append(isolines_y_5)
        isolines_x_plot_7_5.append(isolines_x_7_5)
        isolines_y_plot_7_5.append(isolines_y_7_5)
        isolines_x_plot_10.append(isolines_x_10)
        isolines_y_plot_10.append(isolines_y_10)
        isolines_x_plot_12_5.append(isolines_x_12_5)
        isolines_y_plot_12_5.append(isolines_y_12_5)
        isolines_x_plot_15.append(isolines_x_15)
        isolines_y_plot_15.append(isolines_y_15)
    
    #streamlines; synthax: streamlines_[X or Y]_plot_[psi]
    streamlines_x_plot_0 = [0, (L_ref*-10)]
    streamlines_y_plot_0 = [0, 0]
    streamlines_x_plot_0_2 = []
    streamlines_y_plot_0_2 = []
    streamlines_x_plot_0_4 = []
    streamlines_y_plot_0_4 = []
    streamlines_x_plot_0_6 = []
    streamlines_y_plot_0_6 = []
    streamlines_x_plot_0_8 = []
    streamlines_y_plot_0_8 = []
    streamlines_x_plot_1 = []
    streamlines_y_plot_1 = []
    streamlines_x_plot_1_2 = []
    streamlines_y_plot_1_2 = []
    streamlines_x_plot_1_4 = []
    streamlines_y_plot_1_4 = []
    streamlines_x_plot_1_6 = []
    streamlines_y_plot_1_6 = []
    
    for x in range(0,100):
        streamlines_y_0_2 = L_ref*((x*0+(100-x)*1.34462005667342)/100)
        streamlines_y_0_4 = L_ref*((x*0+(100-x)*2.6992421745751)/100)
        streamlines_y_0_6 = L_ref*((x*0+(100-x)*4.07255559164565)/100)
        streamlines_y_0_8 = L_ref*((x*0+(100-x)*5.47097889806004)/100)
        streamlines_y_1 = L_ref*((x*0+(100-x)*6.89826117541355)/100)
        streamlines_y_1_2 = L_ref*((x*2.13413758353342+(100-x)*8.35561532789609)/100)
        streamlines_y_1_4 = L_ref*((x*4.24381382643103+(100-x)*9.8422946888304)/100)
        streamlines_y_1_6 = L_ref*((x*6.31283612436048+(100-x)*11.3562442221618)/100)

        streamlines_x_0_2 = streamlines_y_0_2/np.tan(streamlines_y_0_2/L_ref/np.exp(1)-np.pi*0.2)
        streamlines_x_0_4 = streamlines_y_0_4/np.tan(streamlines_y_0_4/L_ref/np.exp(1)-np.pi*0.4)
        streamlines_x_0_6 = streamlines_y_0_6/np.tan(streamlines_y_0_6/L_ref/np.exp(1)-np.pi*0.6)
        streamlines_x_0_8 = streamlines_y_0_8/np.tan(streamlines_y_0_8/L_ref/np.exp(1)-np.pi*0.8)
        streamlines_x_1 = streamlines_y_1/np.tan(streamlines_y_1/L_ref/np.exp(1)-np.pi*1)
        streamlines_x_1_2 = streamlines_y_1_2/np.tan(streamlines_y_1_2/L_ref/np.exp(1)-np.pi*1.2)
        streamlines_x_1_4 = streamlines_y_1_4/np.tan(streamlines_y_1_4/L_ref/np.exp(1)-np.pi*1.4)
        streamlines_x_1_6 = streamlines_y_1_6/np.tan(streamlines_y_1_6/L_ref/np.exp(1)-np.pi*1.6)
        
        streamlines_x_plot_0_2.append(streamlines_x_0_2)
        streamlines_y_plot_0_2.append(streamlines_y_0_2)
        streamlines_x_plot_0_4.append(streamlines_x_0_4)
        streamlines_y_plot_0_4.append(streamlines_y_0_4)
        streamlines_x_plot_0_6.append(streamlines_x_0_6)
        streamlines_y_plot_0_6.append(streamlines_y_0_6)
        streamlines_x_plot_0_8.append(streamlines_x_0_8)
        streamlines_y_plot_0_8.append(streamlines_y_0_8)
        streamlines_x_plot_1.append(streamlines_x_1)
        streamlines_y_plot_1.append(streamlines_y_1)
        streamlines_x_plot_1_2.append(streamlines_x_1_2)
        streamlines_y_plot_1_2.append(streamlines_y_1_2)
        streamlines_x_plot_1_4.append(streamlines_x_1_4)
        streamlines_y_plot_1_4.append(streamlines_y_1_4)
        streamlines_x_plot_1_6.append(streamlines_x_1_6)
        streamlines_y_plot_1_6.append(streamlines_y_1_6)

    #isochrones
    isochrones_x_plot_t1 = []
    isochrones_y_plot_t1 = []
    isochrones_x_plot_t2 = []
    isochrones_y_plot_t2 = []
    isochrones_x_plot_t3 = []
    isochrones_y_plot_t3 = []
    
    #iterate 5 times with start value t_xmin1/ t_xmax1
    
    t1_xmin1=-np.exp(1)*np.sqrt(np.exp(2*(t1/t_ref))-1)
    t1_xmin6= t1_xmin1+(np.exp(1)-t1_xmin1)*(1+np.exp(1)/t1_xmin1*(np.log(1-t1_xmin1/np.exp(1))+(t1/t_ref)))
    t1_xmax1= np.exp(1)*np.sqrt(1-np.exp(-2*(t1/t_ref)))
    t1_xmax6= t1_xmax1+(np.exp(1)-t1_xmax1)*(1+np.exp(1)/t1_xmax1*(np.log(1-t1_xmax1/np.exp(1))+(t1/t_ref)))
    t2_xmin1=-np.exp(1)*np.sqrt(np.exp(2*(t2/t_ref))-1)
    t2_xmin6= t2_xmin1+(np.exp(1)-t2_xmin1)*(1+np.exp(1)/t2_xmin1*(np.log(1-t2_xmin1/np.exp(1))+(t2/t_ref)))
    t2_xmax1=np.exp(1)*np.sqrt(1-np.exp(-2*(t2/t_ref)))
    t2_xmax6= t2_xmax1+(np.exp(1)-t2_xmax1)*(1+np.exp(1)/t2_xmax1*(np.log(1-t2_xmax1/np.exp(1))+(t2/t_ref)))
    t3_xmin1=-np.exp(1)*np.sqrt(np.exp(2*(t3/t_ref))-1)
    t3_xmin6= t3_xmin1+(np.exp(1)-t3_xmin1)*(1+np.exp(1)/t3_xmin1*(np.log(1-t3_xmin1/np.exp(1))+(t3/t_ref)))
    t3_xmax1=np.exp(1)*np.sqrt(1-np.exp(-2*(t3/t_ref)))
    t3_xmax6= t3_xmax1+(np.exp(1)-t3_xmax1)*(1+np.exp(1)/t3_xmax1*(np.log(1-t3_xmax1/np.exp(1))+(t3/t_ref)))
    for i in range(4):     
        t1_xmin6= t1_xmin6+(np.exp(1)-t1_xmin6)*(1+np.exp(1)/t1_xmin6*(np.log(1-t1_xmin6/np.exp(1))+(t1/t_ref)))
        t1_xmax6= t1_xmax6+(np.exp(1)-t1_xmax6)*(1+np.exp(1)/t1_xmax6*(np.log(1-t1_xmax6/np.exp(1))+(t1/t_ref)))
        t2_xmin6= t2_xmin6+(np.exp(1)-t2_xmin6)*(1+np.exp(1)/t2_xmin6*(np.log(1-t2_xmin6/np.exp(1))+(t2/t_ref)))
        t2_xmax6= t2_xmax6+(np.exp(1)-t2_xmax6)*(1+np.exp(1)/t2_xmax6*(np.log(1-t2_xmax6/np.exp(1))+(t2/t_ref)))
        t3_xmin6= t3_xmin6+(np.exp(1)-t3_xmin6)*(1+np.exp(1)/t3_xmin6*(np.log(1-t3_xmin6/np.exp(1))+(t3/t_ref)))
        t3_xmax6= t3_xmax6+(np.exp(1)-t3_xmax6)*(1+np.exp(1)/t3_xmax6*(np.log(1-t3_xmax6/np.exp(1))+(t3/t_ref)))

    for x in range (0,100):
    
        isochrones_x_t1 = 0.5*L_ref*(t1_xmin6+t1_xmax6+(t1_xmax6-t1_xmin6)*np.cos(np.pi*(100-x)/100))
        isochrones_x_t2 = 0.5*L_ref*(t2_xmin6+t2_xmax6+(t2_xmax6-t2_xmin6)*np.cos(np.pi*(100-x)/100))
        isochrones_x_t3 = 0.5*L_ref*(t3_xmin6+t3_xmax6+(t3_xmax6-t3_xmin6)*np.cos(np.pi*(100-x)/100))

        if x == 0:
            isochrones_y_t1 = 0
            isochrones_y_t2 = 0
            isochrones_y_t3 = 0
        else:
        
            isochrones_y1_t1 = L_ref*np.exp(1)*np.arccos((0.5*isochrones_x_t1/np.exp(1)/L_ref+np.exp(-(t1/t_ref)-isochrones_x_t1/np.exp(1)/L_ref))/(1-0.5*isochrones_x_t1/np.exp(1)/L_ref))
            isochrones_y_t1 = L_ref*np.exp(1)*np.arccos((isochrones_x_t1/L_ref*(np.sin(isochrones_y1_t1/np.exp(1)/L_ref)/(isochrones_y1_t1/L_ref)-0.5*np.cos(isochrones_y1_t1/np.exp(1)/L_ref)/np.exp(1))+np.exp(-(t1/t_ref)-isochrones_x_t1/np.exp(1)/L_ref))/(1-0.5*isochrones_x_t1/np.exp(1)/L_ref))

            isochrones_y1_t2 = L_ref*np.exp(1)*np.arccos((0.5*isochrones_x_t2/np.exp(1)/L_ref+np.exp(-(t2/t_ref)-isochrones_x_t2/np.exp(1)/L_ref))/(1-0.5*isochrones_x_t2/np.exp(1)/L_ref))
            isochrones_y_t2 = L_ref*np.exp(1)*np.arccos((isochrones_x_t2/L_ref*(np.sin(isochrones_y1_t2/np.exp(1)/L_ref)/(isochrones_y1_t2/L_ref)-0.5*np.cos(isochrones_y1_t2/np.exp(1)/L_ref)/np.exp(1))+np.exp(-(t2/t_ref)-isochrones_x_t2/np.exp(1)/L_ref))/(1-0.5*isochrones_x_t2/np.exp(1)/L_ref))

            isochrones_y1_t3 = L_ref*np.exp(1)*np.arccos((0.5*isochrones_x_t3/np.exp(1)/L_ref+np.exp(-(t3/t_ref)-isochrones_x_t3/np.exp(1)/L_ref))/(1-0.5*isochrones_x_t3/np.exp(1)/L_ref))
            isochrones_y_t3 = L_ref*np.exp(1)*np.arccos((isochrones_x_t3/L_ref*(np.sin(isochrones_y1_t3/np.exp(1)/L_ref)/(isochrones_y_t3/L_ref)-0.5*np.cos(isochrones_y1_t3/np.exp(1)/L_ref)/np.exp(1))+np.exp(-(t3/t_ref)-isochrones_x_t3/np.exp(1)/L_ref))/(1-0.5*isochrones_x_t3/np.exp(1)/L_ref))

            for i in range(4):
                isochrones_y_t1 = L_ref*np.exp(1)*np.arccos((isochrones_x_t1/L_ref*(np.sin(isochrones_y_t1/np.exp(1)/L_ref)/(isochrones_y_t1/L_ref)-0.5*np.cos(isochrones_y_t1/np.exp(1)/L_ref)/np.exp(1))+np.exp(-(t1/t_ref)-isochrones_x_t1/np.exp(1)/L_ref))/(1-0.5*isochrones_x_t1/np.exp(1)/L_ref))
            
                isochrones_y_t2 = L_ref*np.exp(1)*np.arccos((isochrones_x_t2/L_ref*(np.sin(isochrones_y_t2/np.exp(1)/L_ref)/(isochrones_y_t2/L_ref)-0.5*np.cos(isochrones_y_t2/np.exp(1)/L_ref)/np.exp(1))+np.exp(-(t2/t_ref)-isochrones_x_t2/np.exp(1)/L_ref))/(1-0.5*isochrones_x_t2/np.exp(1)/L_ref))

                isochrones_y_t3 = L_ref*np.exp(1)*np.arccos((isochrones_x_t3/L_ref*(np.sin(isochrones_y_t3/np.exp(1)/L_ref)/(isochrones_y_t3/L_ref)-0.5*np.cos(isochrones_y_t3/np.exp(1)/L_ref)/np.exp(1))+np.exp(-(t3/t_ref)-isochrones_x_t3/np.exp(1)/L_ref))/(1-0.5*isochrones_x_t3/np.exp(1)/L_ref))

    
        isochrones_x_plot_t1.append(isochrones_x_t1)
        isochrones_y_plot_t1.append(isochrones_y_t1)
        isochrones_x_plot_t2.append(isochrones_x_t2)
        isochrones_y_plot_t2.append(isochrones_y_t2)
        isochrones_x_plot_t3.append(isochrones_x_t3)
        isochrones_y_plot_t3.append(isochrones_y_t3)

    #still necessary: mirror on x-axis 
    isolines_y_plot_n5_1_mirror = -1*(np.asarray(isolines_y_plot_n5_1))
    isolines_y_plot_n5_2_mirror = -1*(np.asarray(isolines_y_plot_n5_2))
    isolines_y_plot_n2_5_1_mirror = -1*(np.asarray(isolines_y_plot_n2_5_1))
    isolines_y_plot_n2_5_2_mirror = -1*(np.asarray(isolines_y_plot_n2_5_2))
    isolines_y_plot_0_1_mirror = -1*(np.asarray(isolines_y_plot_0_1))
    isolines_y_plot_0_2_mirror = -1*(np.asarray(isolines_y_plot_0_2))
    isolines_y_plot_2_5_mirror = -1*(np.asarray(isolines_y_plot_2_5))
    isolines_y_plot_5_mirror = -1*(np.asarray(isolines_y_plot_5))
    isolines_y_plot_7_5_mirror = -1*(np.asarray(isolines_y_plot_7_5))
    isolines_y_plot_10_mirror = -1*(np.asarray(isolines_y_plot_10))
    isolines_y_plot_12_5_mirror = -1*(np.asarray(isolines_y_plot_12_5))
    isolines_y_plot_15_mirror = -1*(np.asarray(isolines_y_plot_15))
    
    streamlines_y_plot_0_2_mirror = -1*(np.asarray(streamlines_y_plot_0_2))
    streamlines_y_plot_0_4_mirror = -1*(np.asarray(streamlines_y_plot_0_4))
    streamlines_y_plot_0_6_mirror = -1*(np.asarray(streamlines_y_plot_0_6))
    streamlines_y_plot_0_8_mirror = -1*(np.asarray(streamlines_y_plot_0_8))
    streamlines_y_plot_1_mirror = -1*(np.asarray(streamlines_y_plot_1))
    streamlines_y_plot_1_2_mirror = -1*(np.asarray(streamlines_y_plot_1_2))
    streamlines_y_plot_1_4_mirror = -1*(np.asarray(streamlines_y_plot_1_4))
    streamlines_y_plot_1_6_mirror = -1*(np.asarray(streamlines_y_plot_1_6))

    
    isochrones_y_plot_t1_mirror = -1*(np.asarray(isochrones_y_plot_t1))
    isochrones_y_plot_t2_mirror = -1*(np.asarray(isochrones_y_plot_t2))
    isochrones_y_plot_t3_mirror = -1*(np.asarray(isochrones_y_plot_t3))
    

    fig, (ax1, ax2) = plt.subplots(2, figsize=(10, 10))

    #plotten incl. mirror on x-axis

    ax1.plot(isolines_x_plot_n5_1, isolines_y_plot_n5_1, 'r')
    ax1.plot(isolines_x_plot_n5_2, isolines_y_plot_n5_2, 'r')
    ax1.plot(isolines_x_plot_n2_5_1, isolines_y_plot_n2_5_1, 'r')
    ax1.plot(isolines_x_plot_n2_5_2, isolines_y_plot_n2_5_2, 'r')
    ax1.plot(isolines_x_plot_0_1, isolines_y_plot_0_1, 'r')
    ax1.plot(isolines_x_plot_0_2, isolines_y_plot_0_2, 'r')
    ax1.plot(isolines_x_plot_2_5, isolines_y_plot_2_5, 'r')
    ax1.plot(isolines_x_plot_5, isolines_y_plot_5, 'r')
    ax1.plot(isolines_x_plot_7_5, isolines_y_plot_7_5, 'r')
    ax1.plot(isolines_x_plot_10, isolines_y_plot_10, 'r')
    ax1.plot(isolines_x_plot_12_5, isolines_y_plot_12_5, 'r')
    ax1.plot(isolines_x_plot_15, isolines_y_plot_15, 'r')

    ax1.plot(isolines_x_plot_n5_1, isolines_y_plot_n5_1_mirror, 'r')
    ax1.plot(isolines_x_plot_n5_2, isolines_y_plot_n5_2_mirror, 'r')
    ax1.plot(isolines_x_plot_n2_5_1, isolines_y_plot_n2_5_1_mirror, 'r')
    ax1.plot(isolines_x_plot_n2_5_2, isolines_y_plot_n2_5_2_mirror, 'r')
    ax1.plot(isolines_x_plot_0_1, isolines_y_plot_0_1_mirror, 'r')
    ax1.plot(isolines_x_plot_0_2, isolines_y_plot_0_2_mirror, 'r')
    ax1.plot(isolines_x_plot_2_5, isolines_y_plot_2_5_mirror, 'r')
    ax1.plot(isolines_x_plot_5, isolines_y_plot_5_mirror, 'r')
    ax1.plot(isolines_x_plot_7_5, isolines_y_plot_7_5_mirror, 'r')
    ax1.plot(isolines_x_plot_10, isolines_y_plot_10_mirror, 'r')
    ax1.plot(isolines_x_plot_12_5, isolines_y_plot_12_5_mirror, 'r')
    ax1.plot(isolines_x_plot_15, isolines_y_plot_15_mirror, 'r')

    ax1.plot(streamlines_x_plot_0,streamlines_y_plot_0, 'b')
    ax1.plot(streamlines_x_plot_0_2,streamlines_y_plot_0_2, 'b')
    ax1.plot(streamlines_x_plot_0_4,streamlines_y_plot_0_4, 'b')
    ax1.plot(streamlines_x_plot_0_6,streamlines_y_plot_0_6, 'b')
    ax1.plot(streamlines_x_plot_0_8,streamlines_y_plot_0_8, 'b')
    ax1.plot(streamlines_x_plot_1,streamlines_y_plot_1, color = 'black')
    ax1.plot(streamlines_x_plot_1_2,streamlines_y_plot_1_2, 'b')
    ax1.plot(streamlines_x_plot_1_4,streamlines_y_plot_1_4, 'b')
    ax1.plot(streamlines_x_plot_1_6,streamlines_y_plot_1_6, 'b')

    
    ax1.plot(streamlines_x_plot_0_2,streamlines_y_plot_0_2_mirror, 'b')
    ax1.plot(streamlines_x_plot_0_4,streamlines_y_plot_0_4_mirror, 'b')
    ax1.plot(streamlines_x_plot_0_6,streamlines_y_plot_0_6_mirror, 'b')
    ax1.plot(streamlines_x_plot_0_8,streamlines_y_plot_0_8_mirror, 'b')
    ax1.plot(streamlines_x_plot_1,streamlines_y_plot_1_mirror, color = 'black')
    ax1.plot(streamlines_x_plot_1_2,streamlines_y_plot_1_2_mirror, 'b')
    ax1.plot(streamlines_x_plot_1_4,streamlines_y_plot_1_4_mirror, 'b')
    ax1.plot(streamlines_x_plot_1_6,streamlines_y_plot_1_6_mirror, 'b')


    ax1.set(xlabel='x [m]', ylabel ='y [m]', xlim = [-175, 225], ylim = [-175,175])
    fig.savefig("isolines.png", dpi=300)

    ax2.plot(isochrones_x_plot_t1, isochrones_y_plot_t1, 'g')
    ax2.plot(isochrones_x_plot_t2, isochrones_y_plot_t2, 'g')
    ax2.plot(isochrones_x_plot_t3, isochrones_y_plot_t3, 'g')

    ax2.plot(isochrones_x_plot_t1, isochrones_y_plot_t1_mirror, 'g')
    ax2.plot(isochrones_x_plot_t2, isochrones_y_plot_t2_mirror, 'g')
    ax2.plot(isochrones_x_plot_t3, isochrones_y_plot_t3_mirror, 'g')
    
    ax2.plot(streamlines_x_plot_0,streamlines_y_plot_0, 'b')
    ax2.plot(streamlines_x_plot_0_2,streamlines_y_plot_0_2, 'b')
    ax2.plot(streamlines_x_plot_0_4,streamlines_y_plot_0_4, 'b')
    ax2.plot(streamlines_x_plot_0_6,streamlines_y_plot_0_6, 'b')
    ax2.plot(streamlines_x_plot_0_8,streamlines_y_plot_0_8, 'b')
    ax2.plot(streamlines_x_plot_1,streamlines_y_plot_1, color = 'black')
    ax2.plot(streamlines_x_plot_1_2,streamlines_y_plot_1_2, 'b')
    ax2.plot(streamlines_x_plot_1_4,streamlines_y_plot_1_4, 'b')
    ax2.plot(streamlines_x_plot_1_6,streamlines_y_plot_1_6, 'b')
    
    
    ax2.plot(streamlines_x_plot_0_2,streamlines_y_plot_0_2_mirror, 'b')
    ax2.plot(streamlines_x_plot_0_4,streamlines_y_plot_0_4_mirror, 'b')
    ax2.plot(streamlines_x_plot_0_6,streamlines_y_plot_0_6_mirror, 'b')
    ax2.plot(streamlines_x_plot_0_8,streamlines_y_plot_0_8_mirror, 'b')
    ax2.plot(streamlines_x_plot_1,streamlines_y_plot_1_mirror, color = 'black')
    ax2.plot(streamlines_x_plot_1_2,streamlines_y_plot_1_2_mirror, 'b')
    ax2.plot(streamlines_x_plot_1_4,streamlines_y_plot_1_4_mirror, 'b')
    ax2.plot(streamlines_x_plot_1_6,streamlines_y_plot_1_6_mirror, 'b')
    
    

    ax2.set(xlabel='x [m]', ylabel ='y [m]', xlim = [-175, 225], ylim = [-175,175])
    fig.savefig("isochrones.png", dpi=300)

interact(uniform_flow,
         K=widgets.FloatLogSlider(value=3e-4, base=10, min=-10, max=0, step=0.1, description='hydraulic conductivity [m/s]:', disabled=False),
         ne=widgets.FloatSlider(value=0.2, min=0.001, max=1, step=0.05, description='effective porosity [-]:', disabled=False),
         m= widgets.FloatSlider(value=7,min=0, max=30,step=1, description='thickness [m]:' , disabled=False),
         v=widgets.FloatSlider(value=0.4, min=0.00001, max=5, step=0.1, description='uniform velocity [m/d]:', disabled=False),
         Q=widgets.FloatSlider(value=800, min=100, max=1000, step=0.1, description='pumping rate [m^3/d]:', disabled=False),
         t1=widgets.BoundedFloatText(value=10, min=1, max=100, step=0.1, description='t1 [d]:', disabled=False),
         t2=widgets.BoundedFloatText(value=30, min=1, max=100, step=0.1, description='t2 [d]:', disabled=False),
         t3=widgets.BoundedFloatText(value=50, min=1, max=100, step=0.1, description='t3 [d]:', disabled=False),
         );