From 84707de8969aa76b63a808c64209d459cfb0938d Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 19 Jul 2017 13:39:43 +0200 Subject: [PATCH 01/53] Updated compressible solver to integrate with already existing datastructures E.g., we make more use of the Parameter class --- src/porepy/numerics/compressible/problems.py | 61 +++++++++-- src/porepy/numerics/compressible/solvers.py | 106 +++++++++++++------ src/porepy/params/data.py | 6 +- tutorials/slightly compressible flow .ipynb | 47 ++++---- 4 files changed, 154 insertions(+), 66 deletions(-) diff --git a/src/porepy/numerics/compressible/problems.py b/src/porepy/numerics/compressible/problems.py index ceabea1c15..754c74b35e 100644 --- a/src/porepy/numerics/compressible/problems.py +++ b/src/porepy/numerics/compressible/problems.py @@ -2,7 +2,7 @@ import scipy.sparse as sps from porepy.grids import structured -from porepy.numerics.fv import tpfa +from porepy.numerics.fv import tpfa, mass_matrix from porepy.numerics.compressible import solvers from porepy.params.data import Parameters from porepy.params import tensor @@ -17,19 +17,33 @@ class SlightlyCompressible(): """ def __init__(self): + self._data = dict() + self._set_data() self.solver = solvers.Implicit(self) self.solver.parameters['store_results'] = True self.parameters = {'file_name': 'pressure'} self.parameters['folder_name'] = 'results' - self.data = dict() + #---------Discretization--------------- def flux_disc(self): """ - Returns the flux discretization. + Returns the flux discretization. """ return tpfa.Tpfa() + def time_disc(self): + """ + Returns the flux discretization. + """ + class TimeDisc(mass_matrix.MassMatrix): + def matrix_rhs(self, g, data): + d = {'phi': data['param'].get_porosity(), + 'deltaT': data['deltaT']} + lhs, rhs = mass_matrix.MassMatrix.matrix_rhs(self, g, d) + return lhs * data['compressibility'], rhs * data['compressibility'] + return TimeDisc() + def solve(self): """ Call the solver @@ -37,6 +51,12 @@ def solve(self): self.data = self.solver.solve() return self.data + def update(self, t): + source = self.source(t) + bc_val = self.bc_val(t) + self.data()['param'].set_source(self.flux_disc(), source) + self.data()['param'].set_bc_val(self.flux_disc(), bc_val) + #-----Parameters------------ def porosity(self): return np.ones(self.grid().num_cells) @@ -48,13 +68,7 @@ def permeability(self): kxx = np.ones(self.grid().num_cells) return tensor.SecondOrder(self.grid().dim, kxx) - #--------Inn/outflow terms--------------- - - def initial_pressure(self): - return np.zeros(self.grid().num_cells) - - def source(self, t): - return np.zeros(self.g.num_cells) + #----Boundary Condition----------- def bc(self): dir_bound = np.array([]) @@ -64,11 +78,38 @@ def bc(self): def bc_val(self, t): return np.zeros(self.grid().num_faces) + #-----Sink and sources----------- + + def source(self, t): + f = np.zeros(self.grid().num_cells) + return f + + #-----Data----------------- + + def data(self): + return self._data + + def _set_data(self): + self._data['param'] = Parameters(self.grid()) + self._data['deltaT'] = self.time_step() + self._data['end_time'] = self.end_time() + self._data['param'].set_tensor(self.flux_disc(), self.permeability()) + self._data['param'].set_porosity(self.porosity()) + self._data['compressibility'] = self.compressibility() + self._data['param'].set_bc(self.flux_disc(), self.bc()) + self._data['param'].set_bc_val(self.flux_disc(), self.bc_val(0.0)) + #--------Initial conditions--------------- + + def initial_pressure(self): + return np.zeros(self.grid().num_cells) + #---------Overloaded Functions----------------- + def grid(self): raise NotImplementedError('subclass must overload function grid()') #--------Time stepping------------ + def time_step(self): return 1.0 diff --git a/src/porepy/numerics/compressible/solvers.py b/src/porepy/numerics/compressible/solvers.py index 541a8325ac..fa9580e112 100644 --- a/src/porepy/numerics/compressible/solvers.py +++ b/src/porepy/numerics/compressible/solvers.py @@ -2,9 +2,11 @@ import scipy.sparse as sps from porepy.grids import structured +from porepy.grids.grid_bucket import GridBucket from porepy.params.data import Parameters from porepy.params import tensor from porepy.params import bc +from porepy.numerics.mixed_dim.solver import Solver class Implicit(): @@ -12,6 +14,9 @@ class Implicit(): Class for solving slightly compressible flow using backward Euler. We solve the equation: c_p * phi * (p^k+1 - p^k)/dt - nabla * K * grad(p^k+1) = f^k+1. + + To solve a slightly compressible flow problem please see the + porepy.numerics.compressible.problems.SlightlyCompressible class. """ def __init__(self, problem): @@ -31,23 +36,20 @@ def __init__(self, problem): problem.initial_pressure() problem.source(t) """ + # Get data g = problem.grid() - por = problem.porosity() - cell_vol = g.cell_volumes - c_p = problem.compressibility() + dt = problem.time_step() T = problem.end_time() - flux_disc = problem.flux_disc() - param = Parameters(g) - data = dict() - param.set_tensor(flux_disc, problem.permeability()) - param.set_source(flux_disc, problem.source(dt)) - param.set_bc(flux_disc, problem.bc()) - param.set_bc_val(flux_disc, problem.bc_val(dt)) - data['param'] = param + data = problem.data() data['pressure'] = [] data['times'] = [] - lhs_flux, rhs_flux = flux_disc.matrix_rhs(g, data) + + problem.update(dt) + + flux_disc = problem.flux_disc() + time_disc = problem.time_disc() + p0 = problem.initial_pressure() p = p0 data['pressure'].append(p) @@ -56,15 +58,12 @@ def __init__(self, problem): self.problem = problem self.g = g self.data = data - self.por = por self.dt = dt self.T = T self.flux_disc = flux_disc + self.time_disc = time_disc self.p0 = p0 self.p = p - self.lhs_flux = lhs_flux - self.rhs_flux = rhs_flux - # First initial empty lhs and rhs, then initialize them throug # reassemble self.lhs = [] @@ -85,6 +84,7 @@ def solve(self): self.update(t) self.reassemble() t += self.dt + return self.data def step(self): @@ -97,11 +97,8 @@ def update(self, t): """ update parameters for next time step """ - param = self.data['param'] - param.set_source(self.flux_disc, self.problem.source(t + self.dt)) - param.set_bc_val(self.flux_disc, self.problem.bc_val(t + self.dt)) + self.problem.update(t + self.dt) self.p0 = self.p - self.reassemble() # Store result if self.parameters['store_results'] == True: self.data['pressure'].append(self.p) @@ -110,16 +107,61 @@ def update(self, t): def reassemble(self): """ reassemble matrices. This must be called between every time step to - update the rhs of the system. + update the rhs of the system. """ - bound_flux = self.data['bound_flux'] - param = self.data['param'] - por = self.problem.porosity() - cell_vol = self.g.cell_volumes - c_p = self.problem.compressibility() - I = np.eye(self.flux_disc.ndof(self.g)) - - self.lhs = cell_vol * por * c_p * I + self.dt * self.lhs_flux - self.rhs_flux = self.dt * self.flux_disc.rhs( - self.g, bound_flux, param.bc_val_flow, param.source_flow) - self.rhs = cell_vol * por * c_p * self.p0 + self.dt * self.rhs_flux + lhs_flux, rhs_flux = self._discretize(self.flux_disc) + lhs_time, rhs_time = self._discretize(self.time_disc) + + self.lhs = lhs_time + lhs_flux + self.rhs = lhs_time * self.p0 + rhs_flux + rhs_time + + def _discretize(self, discr): + if isinstance(self.g, GridBucket): + lhs, rhs = discr.matrix_rhs(self.g) + else: + lhs, rhs = discr.matrix_rhs(self.g, self.data) + return lhs, rhs + + +if __name__ == '__main__': + from porepy.fracs import meshing + from porepy.params.data import Parameters + from porepy.numerics.fv.tpfa import Tpfa + from porepy.numerics.fv.tpfa_coupling import TpfaCoupling + from porepy.numerics.mixed_dim.coupler import Coupler + + T = 0.1 + dt = 0.001 + + frac = np.array([[1, 3], [2, 2]]) + gb = meshing.cart_grid([frac], [12, 12], physdims=[4, 4]) + gb.assign_node_ordering() + gb.add_node_props(['param']) + for g, d in gb: + params = Parameters(g) + params._compressibility = 1 + if g.dim != 2: + continue + bc_val = np.zeros(g.num_cells) + left = np.isclose(g.face_centers[0], 0) + bc_val[left] = 0.1 * g.face_areas[left] + params.set_bc_val('flow', bc_val) + d['param'] = params + d['time_step'] = dt + d['pressure'] = np.zeros(g.num_cells) + + darcy_discr = Tpfa('Flow') + solver = Compressible(darcy_discr, 'Flow') + coupling_conditions = TpfaCoupling(solver) + solver = Coupler(solver, coupling_conditions) + + t = dt + pressures = np.zeros(solver.ndof(gb)) + times = [0.0] + while t < T: + matrix, rhs = solver.matrix_rhs(gb) + p = sps.linalg.spsolve(matrix, rhs) + solver.split(gb, 'pressure', p) + pressures.append(p) + times.append(t) + t += dt diff --git a/src/porepy/params/data.py b/src/porepy/params/data.py index 8baa1396c4..48499e3bab 100644 --- a/src/porepy/params/data.py +++ b/src/porepy/params/data.py @@ -323,11 +323,11 @@ def get_tensor(self, obj): physics = self._get_physics(obj) if physics == 'flow': - return self._perm + return self.get_permeability() elif physics == 'transport': - return self._conductivity + return self.get_conductivity() elif physics == 'mechanics': - return self._stiffness + return self.get_stiffness() else: raise ValueError('Unknown physics "%s".\n Possible physics are: %s' % (physics, self.known_physics)) diff --git a/tutorials/slightly compressible flow .ipynb b/tutorials/slightly compressible flow .ipynb index cdc46e6550..fdf8b61be1 100644 --- a/tutorials/slightly compressible flow .ipynb +++ b/tutorials/slightly compressible flow .ipynb @@ -50,7 +50,7 @@ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", - "from porepy.numerics.compressible.problems import SlightlyCompressibleProblem\n", + "from porepy.numerics.compressible.problems import SlightlyCompressible\n", "\n", "from porepy.grids import structured\n", "from porepy.viz import plot_grid" @@ -70,7 +70,7 @@ "metadata": {}, "outputs": [], "source": [ - "class UnitSquareInjection(SlightlyCompressibleProblem):\n", + "class UnitSquareInjection(SlightlyCompressible):\n", "\n", " def __init__(self):\n", " nx = 11\n", @@ -82,13 +82,13 @@ " g.compute_geometry()\n", " self.g = g\n", " # Initialize base class\n", - " SlightlyCompressibleProblem.__init__(self)\n", + " SlightlyCompressible.__init__(self)\n", "\n", " #--------grid function--------\n", " \n", " def grid(self):\n", " return self.g\n", - " \n", + "\n", " #--------Inn/outflow terms---------------\n", "\n", " def source(self, t):\n", @@ -97,7 +97,11 @@ " f[source_cell] = 10*self.g.cell_volumes[source_cell] # m**3/s\n", " return f * (t < .05)\n", "\n", - "\n", + " #--------Parameters------------\n", + " \n", + " def porosity(self):\n", + " return np.ones(self.g.num_cells)\n", + " \n", " #--------Time stepping------------\n", " def time_step(self):\n", " return .001\n", @@ -117,20 +121,12 @@ "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/runar/anaconda3/envs/porepy/lib/python3.5/site-packages/scipy/sparse/linalg/dsolve/linsolve.py:102: SparseEfficiencyWarning: spsolve requires A be CSC or CSR matrix format\n", - " SparseEfficiencyWarning)\n" - ] - } - ], + "outputs": [], "source": [ "problem = UnitSquareInjection()\n", "problem.solve()\n", - "pressures = problem.data['pressure']" + "pressures = problem.data['pressure']\n", + "problem.save_results()" ] }, { @@ -147,9 +143,9 @@ "outputs": [ { "data": { - "image/png": "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\n1113yV133RWwL3/605/k3HPPbbBv9uzZcs8995xW9tixYwLI4cOH6/a9/vrrcv755zc4rl69eknv\n3r1l+vTpcuTIkYBx7T7XdqxZyelCNyI9QtvaY/LWMe8Q3XPPPfTp04euXbvy4IMPsmrVqrr3XC4X\nixYtIj4+noSEBJYvX86sWbMYM2YMMTEx3HrrrcTHx7Np0yZiYmKorKxkx44dVFdX079/fwYNGgRA\nbGwsBQUFFBcX06lTJzIzM0Pu30UXXcTkyZNxuVwkJCTw29/+lscee4zU1FTi4+NZuHAha9asaTAu\nXatbt25ce+21JCYm0rlzZx588EE+/PBDx+fooYce4p133iE3N5eJEyee9v68efM466yzGDp0KOef\nfz7jxo1j4MCBJCUlcdVVV5GXlwdge/4Ali1bxrJlywL24eTJkyQlJTXYl5SUxIkTJwKWrX0/UNmU\nlBS2bt3K/v372bZtGydOnOCmm24KGNfuc1VNVHujdyhbO6TJO0R9+vSpe92vXz8OHTpU93P37t3p\n0KFD3c/79+/nqaeeIjk5uW47ePAghw4dIi0tjaeffpqFCxfSo0cPpk6dWtfWihUr2L17N+eeey6j\nRo3ib3/7W5P6V9uHa665pi7+eeedR0xMDN98881pdcvLy5k1axb9+vXjrLPO4oc//CElJSV4vd6Q\n4wMcO3aMkydPcuLECaqrq097v2fPnnWvExISTvu5Npnanb/GdOrUidLS0gb7SktL6dy5c8Cyte8H\nKtupUycyMjJwu9307NmTZ599lrfffvu09gHbz1U1kSZvW5q8Q3Tw4MG61wcOHKBXr151PxtjGpTt\n06cPDz74ICUlJXVbeXk5N954IwDTpk3jo48+Yv/+/RhjmDdvHgCDBw9m1apVfPvtt8ybN48pU6ZQ\nVlZGx44dKS8vr2vf6/Vy5MiRBjED9eHNN99s0IeKigp69+592rE99dRT7Nq1i82bN1NaWsrf//53\nwDekFqhtf7Xv33nnnfziF7/gpptuYvXq1bZ17DR2/uwMHTqUPXv2NLjS/vTTTxk6dOhpZbt06cL3\nvvc9Pv3000bLwv8eZ+158Rfsc1XNoMk7KE3eIXruuecoLCzk2LFjPP7449xwww1By86cOZPnn3+e\nzZs3IyKUlZXxxhtvcOLECXbt2sV7771HZWUlHTp0ICEhgZgY31fqr776KkeOHMHlcpGcnAz4/hw/\n55xzqKio4I033qC6uppHH32UyspK2/7eeeedPPjgg+zfvx+AI0eOsHbt2oBlT5w4QUJCAsnJyRw7\ndoxFixY1eL9nz57s2bMnaKzu3btjjKGyspJp06Yxf/589u7dy/Hjx237GIzd+WvMOeecw/Dhw1m0\naBEVFRX8+c9/5rPPPuPaa68NWP6WW27h0Ucf5bvvvmPnzp0sX76c6dOnA7B582Z27dpFTU0NR48e\n5d577+Xyyy8/bVgGsP1cVRMZICbErR3S5B2iadOm1Y3RDhw4kIceeiho2YyMDJYvX84999xDly5d\nSEtLY+XKlYDvvuL58+eTkpLC2Wefzbfffsvjjz8OwPr16xk6dCidOnXivvvuIzs7mw4dOpCUlMSy\nZcu4/fbb6d27Nx07diQ1NdW2v/fddx9ZWVmMGzeOzp07k5mZyebNmwOW/elPf8qpU6dISUkhMzOz\nwW1ytW2tWbOGLl26cO+9955WPzExkYceeohPPvmE5ORktm7dyoIFCwImuVDYnT/w/WK68847g9bP\nzs4mNzeXLl26MH/+fNasWVN3m+Af/vCHBlfWixYtYtCgQfTr14/LLruMOXPm1B3/nj17mDBhAp07\nd+b8888nPj6+wXcd9dl9rqqJdNjElgn2J2AQjgqfKfr378+LL77Ij370o0h3Ram2xH68rREZiUZy\nh4QY6BO2iUhGc+K1Ne30d5ZSKurpYwVt6alRSkUnTd629NSEYN++fZHuglLtUzv9MjIUmryVUtFJ\nr7xt6alRSkUnTd629NQopaKTAeIj3YnopclbKRWd9Mrblk7SCdH69esZMmQIaWlpLF68+LT3Kysr\nueGGG0hLS2PMmDHN+pKzsVhLliwhPT2dYcOGceWVV9bNomyNWLXWrFmDMYbc3Nwmxwo13urVq0lP\nT2fo0KFMmzat1WIdOHCAsWPHMmLECIYNG8a6deuaHGvGjBn06NGD888/P+D7IsK9995LWloaw4YN\n41//+leTY7UbOknHnsPHELZLHo9HBg4cKF999ZVUVlbKsGHDZPv27Q3KPPfcczJr1iwREVm1apVc\nf/31rRbrvffek7KyMhERWbZsWavGEhEpLS2VSy+9VMaMGSNbt25tUqxQ4+3evVuGDx8ux44dExGR\nb775ptVizZw5U5YtWyYiItu3b5d+/fo1KZaIyIcffijbtm2ToUOHBnz/jTfekAkTJkhNTY18/PHH\n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\nkCZvpZRqg/4fuLdZW2lAqUkAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -157,9 +153,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW8AAADxCAYAAAAEJzaTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VNXZ+P3vnZkkJIDhTAuRk0EkWAQMEDxU0f4AaRvw\nERWoVi8UT/h6eFoOfaiKVq3+KuBblfqItHhoiZS2EitiPbdaTqHYKigkckwQJcFwSJgcJvf7x0zy\nhjCzM3sSkgm5P9c11zXZs9a6194b7uys2WsvUVWMMca0LnEt3QFjjDHuWfI2xphWyJK3Mca0Qpa8\njTGmFbLkbYwxrZAlb2OMaYUseRtj2gQRmSAi20UkX0Tmhfg8UUReCX6+QUT61fnsZ8Ht20VkfENt\nikj/YBt5wTYTgtu/KyL/EpEqEZlSL/4NwfJ5InJDQ/tjydsYc9oTEQ/wDHAFkA5ME5H0esVuAr5R\n1TRgMfB4sG46MBUYAkwAloiIp4E2HwcWq+pA4Jtg2wB7gRuBP9TrXxfgAWA0MAp4QEQ6O+2TJW9j\nTFswCshX1Z2qWgFkA5PqlZkEvBB8vwq4XEQkuD1bVctVdReQH2wvZJvBOpcF2yDY5mQAVd2tqv8B\nquvFHg+8paqHVPUb4C0CvyjC8rrbf2w6pjEmUtKYymkiWhZh2S9hK+Crs+k5VX2uzs+9gX11fi4g\ncJVLqDKqWiUih4Guwe3r69XtHXwfqs2uQImqVoUoH06o/jnWcZu8jTGmWZQBt0ZYdgH4VDXDoUio\nXyT1L0bDlQm3PdTIhVN5J67r2LCJMSYmCYGry0heESgAzqzzcyqwP1wZEfECKcAhh7rhthcBnYJt\nhIsVTf9OYMnbGBOT4oCkCF8R2AQMDN4FkkDgC8icemVygJq7PKYA72rgyX05wNTg3Sj9gYHAxnBt\nBuu8F2yDYJurG+jfm8A4Eekc/KJyXHBbWDZsYoyJSQLEN1FbwTHsOwkkRA/wW1XdKiIPAbmqmgMs\nA14SkXwCV9xTg3W3ishKYBtQBcxSVT9AqDaDIecC2SLyMLAl2DYiMhL4C9AZ+KGIPKiqQ1T1kIj8\ngsAvBICHVPWQ0z6Jy0fC2heWxphINeoLy74ietLN2GHcAZsbGPM+7diVtzEmJjXllffpyJK3MSYm\n1XxhaUKzY2OMiUl25e3MkrcxJibV3G1iQrPkbYyJSXbl7cyStzEmZlmCCs+OjTEmJtmVtzNL3saY\nmGR3mzizY2OMiUn2haUzS97GmJhkwybOLHkbY2KSDZs4s2NjjIlJduXtzJK3MSYm2ZW3Mzs2xpiY\nZFfezix5G2NikmB3mzixlXRMs/j973/PuHHjWrobphURIN4b2astsuRtXLv00kt5/vnnw36+e/du\nRISqqqrabT/60Y/429/+1hzdC9mfsWPHkpyczDnnnMPbb78dtuzKlSu54IILSE5O5tJLL22+TpqT\niIDXG9mrLbLkfYrVTWBtuQ8tadq0aQwfPpzi4mIeeeQRpkyZwsGDB0OW7dKlC/fccw/z5kW6hos5\nVUQg3hPZq01SVTcvo6p9+/bVRx99VAcPHqydOnXSG2+8UY8fP66qqu+995727t1bH3vsMe3Zs6de\nd911qqr62muv6XnnnacpKSk6ZswY/fe//13b3mOPPaa9evXSDh066Nlnn61vv/22qqpu2LBBzz//\nfO3YsaP26NFD77333hNi1O/TW2+9paqqDzzwgF511VX6ox/9SDt27KhLly5Vv9+vv/zlL3XAgAHa\npUsXvfrqq7W4uDjk/h06dEi///3va7du3bRTp076/e9/X/ft26eqqv/zP/+jcXFxmpiYqO3bt9dZ\ns2apqurGjRv1O9/5jh4/flxTU1MV0KSkJG3fvr3+85//1N/97nd64YUX1sYA9JlnntG0tDTt0KGD\n/vznP9f8/HzNzMzUjh076tVXX63l5eW15Z2On5Pt27drQkKCHjlypHbbRRddpL/5zW8c6y1dulQv\nueQSxzIHDx7U73//+5qSkqKdO3fWiy66SP1+f0T9aiPc5pcTXiM8aEVKZC8C61A2Kl5re1nyjkLf\nvn11yJAhunfvXi0uLtYLLrhA58+fr6qBxOrxeHTOnDnq8/m0rKxMN2/erN27d9f169drVVWVLl++\nXPv27as+n08///xzTU1N1cLCQlVV3bVrl+bn56uqamZmpr744ouqqnr06FFdt25dbYyGkrfX69W/\n/OUv6vf7taysTBcvXqyjR4/Wffv2qc/n01tuuUWnTp0acv+Kiop01apVWlpaqkeOHNEpU6bopEmT\naj+/5JJLdOnSpSfVmz9/vv7kJz/R6667TgGtrKys/SxU8v7hD3+ohw8f1k8//VQTEhL0sssu0y++\n+EJLSkp08ODBunz5clVVx+Onqnr77bfr7bffHnJf/vznP+s555xzwrZZs2bpnXfeGbJ8jUiS97x5\n8/TWW2/ViooKraio0L///e9aXV3tWKeNaVRyOt+Lao/IXm0xeduwSZTuvPNOzjzzTLp06cL8+fNZ\nsWJF7WdxcXE8+OCDJCYmkpSUxNKlS7n11lsZPXo0Ho+HG264gcTERNavX4/H46G8vJxt27ZRWVlJ\nv379OOusswCIj48nPz+foqIiOnToQGZmZsT9GzNmDJMnTyYuLo6kpCT+93//l0ceeYTU1FQSExNZ\nsGABq1atCjmk0rVrV6666iqSk5Pp2LEj8+fP54MPPmgw5v33389bb73FJ598ElEf586dyxlnnMGQ\nIUM499xzGTduHAMGDCAlJYUrrriCLVu2ADgeP4AlS5awZMmSkDGOHTtGSkrKCdtSUlI4evRoRH10\nEh8fz5dffsmePXuIj4/n4osvRqRRa+6aumpu9I7k1QZZ8o7SmWeeWfu+b9++7N+/v/bn7t27065d\nu9qf9+zZw8KFC+nUqVPta9++fezfv5+0tDSefPJJFixYQI8ePZg6dWptW8uWLWPHjh2cc845jBw5\nkr/+9a9R9a+mD1deeWVt/MGDB+PxePjqq69OqltWVsatt95K3759OeOMM/jud79LSUkJfr/fMeah\nQ4c4duwYx44di6iPPXv2rH2flJR00s817Tgdv4Z06NCBI0eOnLDtyJEjdOzYMaI+Opk9ezZpaWm1\nv3Qee+yxRrdp6rDk7ciSd5T27dtX+37v3r306tWr9uf6V19nnnkm8+fPp6SkpPZVVlbGtGnTAJg+\nfToffvghe/bsQUSYO3cuAAMHDmTFihV8/fXXzJ07lylTplBaWkr79u0pKyurbd/v95/0BVyoPrzx\nxhsn9MHn89G7d++T9m3hwoVs376dDRs2cOTIEf7+978DgSG2UG3XuOWWW/jFL37B5MmTnQ+eSw0d\nPydDhgxh586dJ1xp//vf/2bIkCGN7lfHjh1ZuHAhO3fu5LXXXmPRokW88847jW7X1GHJOyxL3lF6\n5plnKCgo4NChQzz66KNce+21YcvOnDmTZ599lg0bNqCqlJaW8vrrr3P06FG2b9/Ou+++S3l5Oe3a\ntSMpKQmPJ/D1+csvv8zBgweJi4ujU6dOAHg8Hs4++2x8Ph+vv/46lZWVPPzww5SXlzv297bbbmP+\n/Pns2bMHgIMHD7J69eqQZY8ePUpSUhKdOnXi0KFDPPjggyd83rNnT3bu3HnCthdffBGv18v06dN5\n4IEHgMC93U3B6fg15Oyzz2bYsGE8+OCD+Hw+/vKXv/Cf//yHq666KmR5v9+Pz+ejqqqK6upqfD4f\nlZWVIcv+9a9/JT8/H1XljDPOwOPx1J470wQE8ET4aoMseUdp+vTptX8uDxgwgJ///Odhy2ZkZLB0\n6VLuvPNOOnfuTFpaGsuXLwegvLycefPm0a1bN771rW/x9ddf8+ijjwKwdu1ahgwZQocOHbj77rvJ\nzs6mXbt2pKSksGTJEm6++WZ69+5N+/btSU1Ndezv3XffTVZWFuPGjaNjx45kZmayYcOGkGXvuece\njh8/Trdu3cjMzGTChAkntbVq1So6d+7MXXfdBcCPf/xj/vznPwOBK9L77ruPn/70p3Tq1Kl2bDpa\nTscPAr+YbrvttrD1s7Ozyc3NpXPnzsybN49Vq1bRvXt3IPALpu5V+EsvvURSUhK33347//jHP0hK\nSmLmzJkh283Ly+N73/seHTp0YMyYMdxxxx12b3hTsmETR1Lzp3CEXBU+XfXr14/nn3+e733vey3d\nFWNiWaO+vc1IFs0dFGGgj9msqhmNidfatNHfWcaYmGePFXRkh8YYE5sseTuyQxOF3bt3t3QXjGkb\n2uiXkZGw5G2MiU125e3IDo0xJjZZ8nZkh8YYE5sESGzpTsQuS97GmNhkV96ObJJOhNauXcugQYNI\nS0sL+QyL8vJyrr32WtLS0hg9enSjvtRsKNaiRYtIT09n6NChXH755bWzJk9FrBqrVq1CRMjNzY06\nVqTxVq5cSXp6OkOGDGH69OmnLNbevXsZO3Ysw4cPZ+jQoaxZsybqWDNmzKBHjx6ce+65IT9XVe66\n6y7S0tIYOnQo//rXv6KO1WbYJB1nLh9D2CZVVVXpgAED9IsvvtDy8nIdOnSobt269YQyzzzzjN56\n662qqrpixQq95pprTlmsd999V0tLS1VVdcmSJac0lqrqkSNH9OKLL9bRo0frpk2boooVabwdO3bo\nsGHD9NChQ6qq+tVXX52yWDNnztQlS5aoqurWrVu1b9++UcVSVf3ggw908+bNOmTIkJCfv/766zph\nwgStrq7WdevW6ahRo6KO1Yo07pGwnVG9OrIX9khYU1lZSVVVVe1DmAA2btxIWloaAwYMICEhgalT\np570XJDVq1dzww03ADBlyhTeeeedE9qIVCSxapb0AsjMzKSgoMB1nEhjAdx3333MmTPnhCclnqp4\nS5cuZdasWXTu3BmAHj16nLJYIlL7xMHDhw+f8HAxt7773e/SpUuXsJ+vXr2aH//4x4gImZmZlJSU\n8OWXX0Ydr01o4itvEZkgIttFJF9ETloqSUQSReSV4OcbRKRfnc9+Fty+XUTGN9SmiPQPtpEXbDPB\nKYaIxIvICyLyiYh8JiI/a2h/LHnX4/f72bVr1wkJvLCw8IRHrKamplJYWHhCvbplvF4vKSkpFBcX\nu44fSay6li1bxhVXXOE6TqSxtmzZwr59+/jBD34QVQy38Xbs2MGOHTu48MILyczMZO3atacs1oIF\nC3j55ZdJTU1l4sSJPPXUU1HFaqr+mHpqvrCM5NVQUyIe4BngCiAdmCYi6fWK3QR8o6ppwGLg8WDd\ndGAqMASYACwREU8DbT4OLFbVgcA3wbbDxgCuBhJV9TvA+cCtdX95hGLJu57q6moKCgqoqqriiy++\nqP0Tpb76j0WNpEwk3LTz8ssvk5uby+zZs13HiSRWdXU19957LwsXLoyqfbfxILDeZl5eHu+//z4r\nVqzg5ptvpqSk5JTEWrFiBTfeeCMFBQWsWbOG66+/nurqatexmqo/pp6mvfIeBeSr6k5VrQCygUn1\nykwCXgi+XwVcLoGTNAnIVtVyVd0F5AfbC9lmsM5lwTYItjm5gRgKtBcRL5AEVAAnPoi+Hkve9RQX\nF1NaWkplZSX79u0jPz+fXr16nfD87oKCgpP+xE5NTa0tU1VVxeHDhx3/jA6nbjvhYgG8/fbbPPLI\nI+Tk5JCYGN39VA3FOnr0KJ9++imXXnop/fr1Y/369WRlZUX9pWUk+5aamsqkSZOIj4+nf//+DBo0\niLy8vFMSa9myZVxzzTVAYOUhn89HUVGR61hN1R9Tj7vk3U1Ecuu8bqnXWm9gX52fC4LbQpZR1Srg\nMNDVoW647V2BkmAb9WOFi7EKKAW+BPYCT6jqIafDY8m7nu7du5OYmEhubi5+v5+CggKGDh1KXl4e\nu3btoqKiguzsbLKysk6ol5WVxQsvBH6hrlq1issuuyyqK6uRI0c2GGvLli3ceuut5OTkRD0mHEms\nlJQUioqK2L17N7t37yYzM5OcnBwyMqJ7eFsk+zZ58mTee+89AIqKitixYwcDBgw4JbH69OlTu3jC\nZ599hs/nq31UbFPLysrixRdfRFVZv349KSkpfPvb3z4lsU4rkSfvIlXNqPN6rl5Lof4z1v9zKFyZ\nptruFGMU4Ad6Af2Bn4iI4z/8tnqTjSOv18uwYcP46KOPiI+Px+v1snDhQsaNG0d1dTUzZsxgyJAh\nnHXWWSxevJisrCxuuukmrr/+etLS0ujSpQvZ2dlRx3766acZP348fr+/Ntb999/PX//6V/71r38x\ne/Zsjh07xtVXXw0EklBOTs4pidWUIok3fvx4/va3v5Geno7H4+FXv/oVXbt2bdJYGRkZLFmyhEWL\nFjFz5kwWL16MiLB8+fKohzKmTZvG+++/T1FREampqTz44IO1izi8+uqrvPHGG6xZs4a0tDSSk5P5\n3e9+F1WcNqVmMYamUQDUXRswFai/jl5NmYLg8EUKcKiBuqG2FwGdRMQbvLquWz5cjOnAWlWtBL4W\nkY+ADODEVU/qsOd51+Pz+Vi3bh0XXHABH330ET6fjx49enDkyBHOPPNM+vTpQ0JCAiJCRkZGo+97\njlR1dTWjRo1qtnin8775/X5Gjx7dLPGae99iTOOe5/0t0dzrIgy00Pl53sFEuQO4HCgENgHTVXVr\nnTKzgO+o6m0iMhX4L1W9RkSGAH8gcHXcC3gHGEhg/0K2KSJ/BP6kqtki8izwH1Vd4hBjLnAOMANI\nDrY1VVX/E26f7MrbgYiQlJRESkoKBw4cYO/evQDMmjWLoqIiiouLGTFiRLP0JTMzk927dzdbvObc\ntxEjRrBnz55mizdz5ky2bdvWLPG+853vsHfv3tpYe/fuPWXj6qedJpwer6pVInIn8CaB6/nfBpPs\nQwTuEc8BlgEviUg+gavhqcG6W0VkJbANqAJmqaofIFSbwZBzgWwReRjYEmybcDEI3LXyO+DT4J7/\nzilxgyXviPTp04c9e/ZQVlbGrl27+OMf/0hVVRXXXnstr7zySrP0obCwkD179vDiiy82S7zm3LcD\nBw6wf/9+XnrppWaJt2XLFsaPH8/zzz9/ymN9/fXXHDx4kJdeegkRsdWX3Gji6fGqugZYU2/b/XXe\n+wjcsheq7iPAI5G0Gdy+k8CVev3tIWOo6rFwscOx5B0hj8dD+/bt8fl8fPbZZ1RXV/PPDRvp1q2b\nu4a88VAVekHbSMpHFC/eC5VVDZcLkngvGqK8U6xwdaKJEzaey/0AXB3fV1991f35APDEgz/yOkkd\nz2D79u385Cc/4fPPPycjI4Nu3bpFfQ97m2HPNnFkh8aFmmGUESNGUFVVxfFjR+Edl18DXC6w2UWd\n8wUKfe5i9G5HV3/ksy6LPamcpZ+6CvGFnMvZ+m9XdXbIea7ifCHnutoPCOyLq+PVu5278wGBc+Li\nvB+/XBg2bBjvvPMOF110UVsd/3bPkrcju1XQmBZmD7Vy4Inw1QZZ8jamhd14442OQyhvvPEGeXl5\n5OXl8dxzz3H77bc3Y+9akD1V0JElb2NamD3UKowmfLbJ6ciStzExrs0+1MquvB210d02pvVosw+1\nsi8sHdmhMSbGtdmHWjXt9PjTjg2bGBPj2uxDrWzYxFEb3W1jYofTQ61uu+02Jk6c2DYfaiVA4xZv\nOq1Z8m4MT3xg0o2rOt7AJI9Ieb2BiSRueL2BySoRl/fwhYS+x9ipzg45z3UdV3Hc7kewjqvj5fZ8\n1NRxc9498Y4fr1ixwvFzEeGZZ56JPN7pwoZNHFnybgx/ZXSz87a7qDNI6FB60FWIY+2701c/i7j8\nHhnMMF3nKsbHMoZR+oGrOhvlEldxPpYxrvYDAvvi5ngda9/d3fkAGBTFLFnjnn1h6cgOjTEmdlmG\nCssOjTEmNtmwiSNL3saY2GTDJo7s0BhjYlMTLsZwOrLkbYyJTXbl7cgOjTEmNlnydmSHpp7y8nKq\nq6tbuhvGGEvejuzQ1FNRUcHx48f5+OOP8fv9eDz2dbcxLcb++4Vlzzapp2PHjrRv356+fftSXl5O\nWVkZxcXFLd0tY9oee7aJoza62w3r3LkzycnJ+P1+CgsLKS0tJSEhAa+3ziHzxkc3tXqQu+nxx9p3\ndxfD62GPDHZV/mMZ4zrGRrnEdR1XcdzuB7g/Xm7PR00dV484cJ4eb8Kwu00cWfJugMfjYejQoXz4\n4YdUVFRQXl7OunXrAs9YrqqManFgt9O3o5kiPkbfjbj8OrmMK/RPrmK8IVcxWZ2fyVHfqzLNVZw3\n5CpX+wGBfXH7aIBoHj/gdpHjjRs3Eh9vSdwVG/N2ZIcmQnFxcbRr1w5VZdSoUfj9/pbukmlFMjIy\nuPLKK/n888/JyMigW7dujutWGix5N8DGvF0SETweD3FxduhM5OLi4li9ejXnnHMOubm5JyXutWvX\nMmjQINLS0njsscdOqr93717Gjh3L8OHDGTp0KGvWrGmurrccG/N2ZBnImBbm9/uZNWsWb7zxBtu2\nbWPFihVs27bthDIPP/ww11xzDVu2bCE7O5s77rijhXrbvNQT2astaqO/s4yJHRs3biQtLY0BAwYA\nMHXqVFavXk16enptGRHhyJEjABw+fLhNLIOmcVBhizGEZcnbmBYWanX4DRs2nFBmwYIFjBs3jqee\neorS0lLefvvt5u5ms1OBKk+kgwNtb2KdDZsY08IiWR1+xYoV3HjjjRQUFLBmzRquv/76034msIrg\n93ojerVFbXOvjYkhkawOv2zZstovOceMGYPP56OoqIgePXo0a1+bm99mOIdlV97GtLCRI0eSl5fH\nrl27qKioIDs7m6ysrBPK9OnTh3feeQeAzz77DJ/PR/fuLidvtTKK4McT0astsivvxohycWBXMwCj\nmmXoYZ1cFnFx8Xp4Q65yFUK8Hl6Vaa7ruIkjLvcDiGJ2aTQzWF2e9wZmWHq9Xp5++mnGjx+P3+9n\nxowZDBkyhPvvv5+MjAyysrJYuHAhM2fOZPHixYgIy5cvP2lo5XSjCFVtNDFHwpJ3Y1RV0dVf4KpK\nsSfV9QzAaGYZXqUvR1z+T3Idt+iTrmI8J/fw/+j/dVXnKZnjKs5zco+r/YDAvridXRrNDFY3573Y\nk9pgmYkTJzJx4sQTtj300EO179PT0/noo48i7+RpQBEqbH58WJa8jTExqWbYxIRmY97GmJjVlGPe\nIjJBRLaLSL6IzAvxeaKIvBL8fIOI9Kvz2c+C27eLyPiG2hSR/sE28oJtJkQQY6iIrBORrSLyiYg4\njs1Z8jbGxKSaMe9IXg0REQ/wDHAFkA5ME5H0esVuAr5R1TRgMfB4sG46MBUYAkwAloiIp4E2HwcW\nq+pA4Jtg204xvMDLwG2qOgS4FKh02idL3saYmBQYNvFG9IrAKCBfVXeqagWQDUyqV2YS8ELw/Srg\ncgl8KzwJyFbVclXdBeQH2wvZZrDOZcE2CLY5uYEY44D/qOq/AVS1WFUdn35nydsYE5MCX1gmRPQC\nuolIbp3XLfWa6w3sq/NzQXBbyDKqWgUcBro61A23vStQEmyjfqxwMc4GVETeFJF/icicho6PfWFp\njIlJCm5uFSxS1QyHz0PdV1l/amu4MuG2h7r4dSrvFMMLXASMBMqAd0Rks6q+E6I8hAlujDExoEmH\nTQqAM+v8nArsD1cmOAadAhxyqBtuexHQKdhG/VhOMT5Q1SJVLQPWACOcdsiStzEmJjXxDMtNwMDg\nXSAJBL6AzKlXJge4Ifh+CvCuBh48kwNMDd4p0h8YCGwM12awznvBNgi2ubqBGG8CQ0UkOZjULwFO\nfC5wPTZs0hjx3ogmYJwgivUl3c4yFK+HP8l1LsrH8Zzc4zJGHE81PCzXqDjijXO1H4E6Lo9XlOtk\nujrv8fbfLFpNdZ+3qlaJyJ0EkqQH+K2qbhWRh4BcVc0BlgEviUg+gavhqcG6W0VkJYFkWgXMqvky\nMVSbwZBzgWwReRjYEmwbhxjfiMgiAr8QFFijqq877ZP9q2qMyirO0k9dVflCzmWYrou4/McyJqr1\nJd3OZLxP/8dVjF/Io/xCf+Kqzn2y0FWcX8ijUc38dLtOppvzAYFz4ua8fyHnumrfBDT1JB1VXUNg\nOKLutvvrvPcBV4ep+wjwSCRtBrfvJHA3Sv3tTjFeJnC7YEQseddz5MgRfD4fBQUF+P1+W+7MmBai\nCOU2PT4sS971JCUl4fV68fv9VFZW4vf7+eijjygrKyMuLo64uDh279592j9L2TStvXv32oWASzY9\n3pn9a6onPj4er9dL3759adeuHe3bt+fCCy8kOTmZhIQE4uLi8Hq9eNvoA+BNdLxeLzfffHPt6vET\nJkxo6S7FPHskrDNL3hGqWTU+Pj6e1NTUNrGGoGk6vXr1Yu3atVGvHg+wcuVK0tPTGTJkCNOnT2+O\nbre4ppoefzqyy0djWljN6vFvvfUWqampjBw5kqysrBMWIM7Ly+OXv/wlH330EZ07d+brr79uwR43\nj5rp8SY0u/I2poXVXT0+ISGhdvX4upYuXcqsWbPo3LkzwGm//BnYsElDLHkb08JCrR5fWFh4Qpkd\nO3awY8cOLrzwQjIzM08adjkdBe42SYjo1RbZ3yTGtLBIVo+vqqoiLy+P999/n4KCAi6++GI+/fRT\nOnXq1FzdbHY2bOLMjkwjSLzX/QQMr4ePZUzkMaJaX9LdTMY4bxy/kEddxYjzxnGfLHRdx02c6GZ+\nujxeLs9HTR03510amGEZyerxqampZGZmEh8fT//+/Rk0aBB5eXmMHDnSXd9bmbY6JBIJS96NoJVV\nnB14/G7Edsh5jNIPIi6/US5hsq5wFeNVmeZqfcmnZE5UsyUX6h2u6vxElriKc58sjGqdTDfH61WZ\n5up8QOCcuDnvO+Q8x8/rrh7fu3dvsrOz+cMf/nBCmcmTJ7NixQpuvPFGioqK2LFjBwMGDHDV79bG\n7vN2ZsnbmBYWyerx48eP529/+xvp6el4PB5+9atf0bVr15bu+illyduZJW9jYkBDq8eLCIsWLWLR\nokWO7dx3331069aNu+++G4D58+fTs2dP7rrrrqbv9Clm0+Od2d0mxpxGbrrpJl54IbDKVnV1NdnZ\n2fzoRz+ZPpHFAAAYIElEQVRq4V5Fx24VdGZX3sacRvr160fXrl3ZsmULX331FcOHD2/VwyttNTFH\nwpK3MaeZm2++meXLl3PgwAFmzJjR0t2JWs3q8SY0GzYx5jRz5ZVXsnbtWjZt2sT48eNbujtRa+LV\n4087bXOvjTmNJSQkMHbsWDp16oTH07qvXG3YJDxL3sacZqqrq1m/fj1//OMfW7orjaIIFW106nsk\nLHk3gsR7G5yAcRKvh41ySeQxvB5elWnu+uVyfcnoZksKP5ElLuu4ixPdOpkuj5fL81FTx815b2iG\nZVPatm0bP/jBD7jyyisZOHBgs8U9FWzM25kl70ZQW8PSVR1bw/LUS09PZ+fOnc0W71SyZ5s4syNj\njIlZNuYdniVvY0xMsunxzix5G2Niko15O7Pk7ZKqUl5ejt/vb+mumFakoqKipbvQ6gTuNrFnm4Rj\nyTsEVaW0tJSqqir8fj+ffPIJpaWlqCoiwn/+85+QD9A3JpxPP/2Un/70p7Wrx3fr1q1NrIbTGDZs\n4sxmWNZTXFxMaWkpeXl5+P1+4uLi6NOnD8nJyXTo0IH27dszcuRIRowY0dJdNa3IiBEjePfddxu1\nejzAqlWrEBFyc3NPdZdjgj2YKjxL3vV07dqVDh06MGzYMBITE4mPjyclJeWkZamMaSo1q8e/8cYb\nbNu2jRUrVrBt27aTyh09epRf//rXjB49ugV62fxqxrwjebVFlryNaWGRrB4PgWd1z5kzh3bt2rVA\nL5ufPdvEWdvc6yZia1jaGpYR9amBGZahVo/fsGHDCWW2bNnCvn37+MEPfsATTzzhrr+tlE2Pd2bJ\nuxG0soqu/gJXdYo9qfTVzyIuv0cGM0bfdRVjnVzGVfpyxOX/JNdFNZMxmvUl3c78dLMfENgXN8dr\nnVzm6nxA4Jy4Oe/FnlTHzxtaPb66upp7772X5cuXRxzzdGC3Cjqz5G1MC2to9fijR4/y6aefcuml\nlwJw4MABsrKyyMnJISMjo7m726za6pBIJOzIGNPCGlo9PiUlhaKiotqfL730Up544onTPnHbrYLO\n7AtLY1pY3dXjBw8ezDXXXFO7enxOTk5Ld6/F2BqWzuzK25gY0NDq8XW9//77zdCj2GBj3uFZ8jbG\nxKRq4mx6vAMbNjHGxKymHDYRkQkisl1E8kVkXojPE0XkleDnG0SkX53Pfhbcvl1ExjfUpoj0D7aR\nF2wzoaEYwc/7iMgxEflpQ/tjydsYE5OacsxbRDzAM8AVQDowTUTS6xW7CfhGVdOAxcDjwbrpwFRg\nCDABWCIingbafBxYrKoDgW+CbYeNUcdi4I1Ijo8lb2NMTFJoyunxo4B8Vd2pqhVANjCpXplJwAvB\n96uAyyVww/0kIFtVy1V1F5AfbC9km8E6lwXbINjm5AZiICKTgZ3A1kh2yJK3MSZGuZoe301Ecuu8\nbqnXWG9gX52fC4LbQpZR1SrgMNDVoW647V2BkmAb9WOFjCEi7YG5wIORHh37wrIx4r0Nzp47idfD\nHhnsqvw6ucxVCPF6+JNc56J8NNPQo1kc2F0c8ca52o9AHZfHy+35APC6PO/NuADx6cTlfd5Fqup0\n43uoJ8vVn9oarky47aEufp3KO8V4kMAwy7FIH4Jn/6oao7IKCn3u6vRuR4fSgxEXP9a+e1TTt91O\nEY9mkePJusJVnVdlmuvFgaN5NIDbxw+4OR8QOCeuznvvtvEgqaamCOVN92yTAuDMOj+nAvvDlCkQ\nES+QAhxqoG6o7UVAJxHxBq+u65YPF2M0MEVE/i/QCagWEZ+qPh1uh2zYxBgTk5r4qYKbgIHBu0AS\nCHwBWX8GVA5wQ/D9FOBdDTx4JgeYGrxTpD8wENgYrs1gnfeCbRBsc7VTDFW9WFX7qWo/4EngUafE\nDXblbYyJYU01e1JVq0TkTuBNwAP8VlW3ishDQK6q5gDLgJdEJJ/A1fDUYN2tIrIS2AZUAbNU1Q8Q\nqs1gyLlAtog8DGwJtk24GNGw5G2MiUlN/WwTVV0DrKm37f46733A1WHqPgI8Ekmbwe07CdyNUn97\n2Bh1yixw+ryGJW9jTExSBH+1TY8Px5K3MSYmabVQ7rPp8eFY8nahqqqKiooKNmzYYKvHG1dyc3OJ\nj49v6W60KqqCv8quvMOxu00isH//fkpLS6msrCQxMZERI0YwbNiwlu6WaUWGDRvGfffdx+eff05G\nRgYTJkw44fOGVo9ftGgR6enpDB06lMsvv5w9e/Y0V9dbjoK/yhPRqy2yK+8w/H4/FRUVVFRUcPTo\nUZKTk2uXpoqPj7fV5I0rXq+XnJwcLrroInJzc0/4rGb1+LfeeovU1FRGjhxJVlYW6en//6M3hg8f\nTm5uLsnJyfzmN79hzpw5vPLKK829G81KVaiqbJuJORKWvOuprKykvLycdevWoaq0b9+eQYMGUVxc\nfHJhb7z7CRheb2CSR8Tlo5kB6G6WYXSLHHt4Vaa5ruMmjuvZkhDFDFaX5yNYx9V59zoPl9RdPR6o\nXT2+bvIeO3Zs7fvMzExeftnd2p6tk1DttxQVjh2ZekpLSxERxowZc9IK3iepqoTNLse+zxfY7qLO\nIIlqBqDbWYbDdJ2rGB/LGEbpB67qbJRLXMX5WMZENbvU7QxWV+cDYJC4O+/nO/+VFsnq8XUtW7aM\nK664IvL4rZUCbXRIJBKWvOvp1KkTCQkJeDz2j8Y0j4ZWj6/r5ZdfJjc3lw8+cPeLs1WqFvBZigrH\njowxLayh1eNrvP322zzyyCN88MEHJCa2kVvoqhou0lbZ3SbGtLC6q8dXVFSQnZ1NVlbWCWW2bNnC\nrbfeSk5ODj169GihnjazwAO9I3u1QXblbUwLq7t6vN/vZ8aMGbWrx2dkZJCVlcXs2bM5duwYV18d\nmFndp0+f039l+ZrkbUKy5G1MDGho9fi33367ubvU8hSobOlOxC5L3saY2KRAeUt3InZZ8jbGxCYb\nNnFkydsYE5sseTuy5N0Y3vgGJ2CcxOMNTPKIOEY0MwDdr5P5sYxxHWOjXOK6jqs4Ua4v6ep4uT0f\nNXXcnPcGZliaMCx5O7Lk3RhVlfCOy9l5l0cxOy+KdTK7+gsiLl7sSeUs/dRViC/kXM7Wf7uqs0PO\ncxXnCznX1X5AYF9cry8ZzSxZN+f9cnsOTlQseTuy5G2MiV2WvMOy5G2MiU3VgMs/OtsSS97GmNhk\nwyaOLHkbY2KTJW9HlryNMbHJkrcjS97GmNhlyTssS97GmNhkV96OLHm7VFlZyd69e6murm7prphW\npKCggLg4ewKzK9XA8ZbuROyy5B0hVeX48eMnrHCS1OEMjrudgOF2VmY062TGewOTVSIk8V6+kHNd\nhZB4LzvkPNd1XMVxuR+A++MV1SzZeFcTb5I7ngHAjBkzaleP79atG2vXrq0ts3btWu6++278fj83\n33wz8+bNO6GN8vJyfvzjH7N582a6du3KK6+8Qr9+/dz1u7VRwN/SnYhdlrwjcPToUUpLS0lMTMTr\n9ZKamkpVVRV/Xf0XRo0a1Sx92Lt3LwkJCXzrW99qlngbN25stn0rLCxEVUlNdZmoo9Sc+3bgwAEq\nKiro1asXr7zyChMnToxq9fhly5bRuXNn8vPzyc7OZu7cuaf96vGADZs4sOTdgMrKSj755BOSk5OJ\ni4tDRPjoo4+orKykqqqq4UWKm4Cq4vP5SEhIYM+ePc0S7/jx482ybxA4xqpKYWFhs8QrKyvjn//8\nZ7OsU+r3+ykvL6ewsJDZs2ezZ88ehg8fTs+ePWuvvCNZPX716tUsWLAAgClTpnDnnXeiqmHXujwt\n2Ji3I0veYVRXV+Pz+aiurubCCy9k48aNqCojRowgPz+fyspKBg8e3CzjmF9++SUlJSUMHuzyIU1R\nOnLkCIWFhc0Wr6ysjPz8fIYOHdos8Y4dO8bnn3/O8OHDmyWBHzp0iPz8fNasWcNbb73Fk08+yaJF\ni2o/j2T1+LplvF4vKSkpFBcX061bt1Pe/xZjyduRJe8Qqqur2bRpEyJSe8WtqsTFxfGPf/wDj8dD\nYmIimzdvbpa+HD9+nOTkZDZt2nTK4wFUVFQgIs0WD6C0tLRZ41VUVPDPf/6Tdu1cfp8QJVVl8+bN\nPPXUU5SWlpKRkUGvXr1IS0vjpptuOql8/StqNyvMnzZserwj+/q7nsOHD1NWVkZaWlrtCt1VVYFf\n/0ePHiU+Pr7ZVu6uGS5p165ds/5H9fv9zXJFWldcXFyz3sGTkJBAdXV17bk91eLi4khOTmbBggX8\n+te/Jj09nSNHjvDJJ5/wxBNPNLh6fN0V5quqqjh8+DBdunRplr63KFuAOCxL3vUkJiaSnJxMly5d\naq+2169fT2lpKe3atSM+vvmezVxRUYHH42n2RFpdXd3st7V5PJ5mS6Q12rVrR3l5ecir2lNBREhK\nSsLv9/PQQw/Rt29fAHbs2MH777/PJZdcEnb1+KysLF544QUAVq1axWWXXXb6X3nb6vGOLHnX065d\nO+Li4mqvPn0+Hz6fj6SkpGZNon6/H7/f32xX+TVaInFDIHn7/c17X1hcXByJiYn4fM33t3lNAhcR\nHnjgAV588UX69u1Lhw4dWL9+PZ06deKaa66pXT2+ZoX4m266ieLiYtLS0li0aBGPPfZYs/W5xdQs\nQBzJqw0Sl1cdzXOJ0oLKyspYt24d559/PmVlZezcuZNzzjkHr7d5vx7Iy8sjNTWVpKSkZo1bUlJC\neXk5PXv2bNa4qkp+fj4DBw5s1rgA+fn5fPvb36Z9+/bNGvfgwYOUlJQwcOBANmzYwOzZs1m9ejX9\n+/dv1n6cQo3600C6ZShZuQ0XBPidbFbVjMbEa20sedejqnz44YfNfhVo2rY5c+ZQUlJCYmIiiYmJ\nJ03iaaUal7y7ZijfjzB5v9Rw8haRCcD/C3iA51X1sXqfJwIvAucDxcC1qro7+NnPgJsITBu6S1Xf\ndGpTRPoD2UAX4F/A9apaES6GiPwf4DEgAagAZqvqu477Y8nbGHOKNC55d8lQLo8wea9yTt4i4gF2\nAP8HKAA2AdNUdVudMncAQ1X1NhGZClypqteKSDqwAhgF9ALeBs4OVgvZpoisBP6sqtki8izwb1X9\njUOM4cBXqrpfRM4F3lTV3k67bGPexpjYVDM9PpJXw0YB+aq6U1UrCFwVT6pXZhLwQvD9KuByCXwr\nPAnIVtVyVd0F5AfbC9lmsM5lwTYItjnZKYaqblHV/cHtW4F2wav0sCx5G2Nik7u7TbqJSG6d1y31\nWusN7Kvzc0FwW8gyqloFHAa6OtQNt70rUBJso36scDHqugrYoqrlIY5KLZukY4yJTe5mWBY1MOYd\nagin/jBwuDLhtoe6+HUq32A/RGQI8DgwLkS5E9iVtzExYu3atQwaNIi0tLSQtwKWl5dz7bXXkpaW\nxujRo9m9e3fzd7I5Ne2tggXAmXV+TgX2hysjIl4gBTjkUDfc9iKgU7CN+rHCxUBEUoG/AD9W1S8a\n2iFL3sbEgJonC86bN4+4uDgeeOAB7r333hPKLFu2jH379pGQkMCXX37J6NGjm+VBZS2q6ca8NwED\nRaS/iCQAU4GcemVygBuC76cA72rgjo4cYKqIJAbvIhkIbAzXZrDOe8E2CLa52imGiHQCXgd+pqof\nRbJDlryNiQEbN27krLPO4uGHH2bt2rX8/Oc/Jzs7m23bam+GYPXq1UyfPp3c3Fx27txJaWkpc+bM\nacFen2I1zzaJ5NWA4PjyncCbwGfASlXdKiIPiUjNdNZlQFcRyQf+G5gXrLsVWAlsA9YCs1TVH67N\nYFtzgf8OttU12HbYGMF20oD7ROTj4KuH0z7ZmLcxMaCwsJDExMTaR8MeOXKEkpISLr74YmbPns28\nefMoLCxk8uTJJCcnA9CpUyc2b95c+xCxjIzTbI5KzbBJUzWnugZYU2/b/XXe+4Crw9R9BHgkkjaD\n23cSuBul/vaQMVT1YeDhBneiDrvyNiYGqCplZWWceeaZ+P1+XnzxRUaMGEFmZiYPPPAAffr04eDB\ngyfUOXLkCBUVFaSlpdVOqZ8+fXoL7cEp0LS3Cp52LHkbEwNSU1MpKioCAkMoKSkp9OrViw8//JC7\n7rqLmTNnUlZWxt///ncAXnjhBY4dO8acOXM4cOAAzz//PFu3buXJJ59syd1oevZgqrBs2MSYGDBy\n5EgOHjzIjh072LNnD0VFRcTFxdGzZ0+GDh3KypUrUVVmzJjBu+++S05ODj179mTv3r306tWLsrIy\nxo4dS0lJCX6/n8cee4yJEye29G41ji3G4MimxxsTI1577TX+67/+i5SUFPr06UNxcTHJycmMGzeO\n5cuXM3DgQLZs2UJ1dTVJSUmsXbuWRYsWsXnzZsrKyujYsSPnnXceW7Zs4cCBA6xfv54RI0a05C41\nbnp8YobSO8Lp8bva3oOpbNjEmBjxwx/+kNWrV5OUlMTnn3/OBRdcwIUXXsiHH35I+/btGT9+PN26\ndUNE8Pl8fO973+O1115j//79HD9+nLPOOos333yTpUuXMmjQIG6//faW3qXGsed5O7LkbUwMmThx\nIrt27eJb3/oWU6ZMqR1CGTNmDB06dOCGG26gV69e3HHHHVRUVDBz5kwGDhzIn//8Z7Zs2YLf7+fq\nq69m+fLllJSU8OWXX7b0LjWOJe+wLHkbE2O8Xi9PP/008+bN4/3332fo0KGkpKTw5JNP1j5zvGYV\nncmTJ1NSUsKbb75J9+7d6dy5MytXruT6668nNTWVwsLCltyVxrHFGBxZ8jYmBk2cOJG8vDxWr17N\nxx9/THZ2NnfddRc33HADJSUlHD58GIDx48czffp0lixZQmFhIXfccQcTJkzA5/PVLiTdatmtgo7s\nbhNjYljNMMrZZ5/N9OnTqaiooKqqirlz5wKBK/BFixbx2Wefcfz4cQYNGsRnn32Gz+fj66+/Pmkh\n41bF7jZxZHebGNMKrFmzhnvuuQefz0d5eTlfffUV999/PxkZGWRlZbFt2zauuuoqCgsL6d+/PzNm\nzOD3v/89GzdurG3j2Wef5dlnnwXg8OHD9OvXj/fee+9Udrtxd5tIhuKN8G6TKrvbxBgTgyZOnMj5\n559PZWUlhw4dIjU1lb59+7J//36effZZ0tPT2bZtG9dffz3Hjh3j+eefZ8mSJSe0cdttt/Hxxx+z\nadMmUlNT+e///u8W2hsXbNgkLLvyNqaNueOOO+jevTsPPvjgqQ7V+CtvIrzypu1deduYtzFtyPLl\ny9mzZw9PP/10S3fFNJIlb2PaiM2bN/PEE0/wj3/8g7g4GzFt7ewMGtNGPP300xw6dIixY8cybNgw\nbr755pbukmkEG/M2xpwqjRzzHqEQ0aIyQLKNeRtjTGxo4tUYTjOWvI0xMcpm6Tix5G2MiVF25e3E\nkrcxJkZZ8nZiydsYE6MUON7SnYhZlryNMTHKxrydWPI2xsQoGzZxYsnbGBOj7MrbiSVvY0yMsitv\nJ5a8jTExyq68nVjyNsbEqGrsbpPwLHkbY2KUDZs4seRtjIlhNmwSjiVvY0yMsitvJ5a8jTExypK3\nE0vexpgYZXebOLHkbYyJUXa3iRNL3saYGGXDJk4seRtjYpQNmzixBYiNMTGq5so7klfDRGSCiGwX\nkXwRmRfi80QReSX4+QYR6Vfns58Ft28XkfENtSki/YNt5AXbTIg2RjiWvI0xMarmyjuSlzMR8QDP\nAFcA6cA0EUmvV+wm4BtVTQMWA48H66YDU4EhwARgiYh4GmjzcWCxqg4Evgm27TqG0z5Z8jbGxKia\nLywjeTVoFJCvqjtVtQLIBibVKzMJeCH4fhVwuYhIcHu2qpar6i4gP9heyDaDdS4LtkGwzclRxgjL\n7Zi3uCxvjDFR+vJNWNAtwsLtRCS3zs/PqepzdX7uDeyr83MBMLpeG7VlVLVKRA4DXYPb19er2zv4\nPlSbXYESVa0KUT6aGCHZF5bGmJikqhOasLlQF54aYZlw20ONXDiVjyZGWDZsYoxpCwqAM+v8nArs\nD1dGRLxACnDIoW647UVAp2Ab9WO5jRGWJW9jTFuwCRgYvAskgcCXgzn1yuQANwTfTwHeVVUNbp8a\nvFOkPzAQ2BiuzWCd94JtEGxzdZQxwrJhE2PMaS84vnwn8CbgAX6rqltF5CEgV1VzgGXASyKST+Bq\neGqw7lYRWQlsI3BryyxV9QOEajMYci6QLSIPA1uCbRNNjHAkkPSNMca0JjZsYowxrZAlb2OMaYUs\neRtjTCtkydsYY1ohS97GGNMKWfI2xphWyJK3Mca0Qv8fTrau2cJSKFMAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -172,10 +168,19 @@ "\n", "for t in time_steps:\n", " p = pressures[t]\n", - " plot_grid.plot_grid(problem.g, p, color_map = [0, 1*10**-5], if_plot=False)\n", + " plot_grid.plot_grid(problem.g, p, color_map = [0, 0.03], if_plot=False)\n", " plt.title('pressure at time: %g s' %(t*dt))\n", " plt.show()\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { From 91885b7a3be14530825fea1c3e4306620cd66cda Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 19 Jul 2017 14:35:31 +0200 Subject: [PATCH 02/53] Make use of updated mass matrix --- src/porepy/numerics/compressible/problems.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/porepy/numerics/compressible/problems.py b/src/porepy/numerics/compressible/problems.py index 754c74b35e..00a85df22f 100644 --- a/src/porepy/numerics/compressible/problems.py +++ b/src/porepy/numerics/compressible/problems.py @@ -38,9 +38,7 @@ def time_disc(self): """ class TimeDisc(mass_matrix.MassMatrix): def matrix_rhs(self, g, data): - d = {'phi': data['param'].get_porosity(), - 'deltaT': data['deltaT']} - lhs, rhs = mass_matrix.MassMatrix.matrix_rhs(self, g, d) + lhs, rhs = mass_matrix.MassMatrix.matrix_rhs(self, g, data) return lhs * data['compressibility'], rhs * data['compressibility'] return TimeDisc() From 7ca8ae23bd272fbcffe481b60b4584f928e66639 Mon Sep 17 00:00:00 2001 From: Runar Date: Thu, 20 Jul 2017 13:27:53 +0200 Subject: [PATCH 03/53] Added compressible flow for fractured domain --- src/porepy/numerics/compressible/problems.py | 134 +++++++++++- src/porepy/numerics/mixed_dim/coupler.py | 36 +++- tutorials/slightly compressible flow .ipynb | 202 +++++++++++++++++-- 3 files changed, 355 insertions(+), 17 deletions(-) diff --git a/src/porepy/numerics/compressible/problems.py b/src/porepy/numerics/compressible/problems.py index 00a85df22f..34f0a92463 100644 --- a/src/porepy/numerics/compressible/problems.py +++ b/src/porepy/numerics/compressible/problems.py @@ -4,6 +4,7 @@ from porepy.grids import structured from porepy.numerics.fv import tpfa, mass_matrix from porepy.numerics.compressible import solvers +from porepy.numerics.mixed_dim.coupler import Coupler from porepy.params.data import Parameters from porepy.params import tensor from porepy.params import bc @@ -114,7 +115,7 @@ def time_step(self): def end_time(self): return 1.0 - def save_results(self): + def save(self): pressures = self.data['pressure'] times = np.array(self.data['times']) folder = self.parameters['folder_name'] @@ -126,3 +127,134 @@ def save_results(self): export_pvd( self.grid(), self.parameters['file_name'], times, folder=folder) + + +############################################################################### + + +class SubProblem(SlightlyCompressible): + def __init__(self, g): + self.g = g + SlightlyCompressible.__init__(self) + + def grid(self): + return self.g + + +class TpfaComp(tpfa.Tpfa): + def __init__(self, physics='flow'): + tpfa.Tpfa.__init__(self, physics) + + def matrix_rhs(self, g, data): + param = data['problem'].data() + return tpfa.Tpfa.matrix_rhs(self, g, param) + + +class TpfaCompCoupling(tpfa.TpfaCoupling): + def __init__(self, solver): + tpfa.TpfaCoupling.__init__(self, solver) + + def matrix_rhs(self, g_h, g_l, data_h, data_l, data_edge): + param_h = data_h['problem'].data() + param_l = data_l['problem'].data() + return tpfa.TpfaCoupling.matrix_rhs( + self, g_h, g_l, param_h, param_l, data_edge) + + +class SlightlyCompressibleMultiDim(): + """ + Base-class for slightly compressible flow. Initialize all needed + attributes for a slightly compressible solver. + """ + + def __init__(self): + self._data = dict() + self.set_sub_problems() + self.solver = solvers.Implicit(self) + self.solver.parameters['store_results'] = True + self.parameters = {'file_name': 'pressure'} + self.parameters['folder_name'] = 'results' + + #---------Discretization--------------- + + def flux_disc(self): + """ + Returns the flux discretization. + """ + discr = TpfaComp() + coupling_conditions = TpfaCompCoupling(discr) + return Coupler(discr, coupling_conditions) + + def time_disc(self): + """ + Returns the flux discretization. + """ + class TimeDisc(mass_matrix.MassMatrix): + def __init__(self, deltaT): + self.deltaT = deltaT + + def matrix_rhs(self, g, data): + sub_d = data['problem'].data() + sub_d['deltaT'] = self.deltaT + lhs, rhs = mass_matrix.MassMatrix.matrix_rhs(self, g, sub_d) + return lhs * sub_d['compressibility'], rhs * sub_d['compressibility'] + single_dim_discr = TimeDisc(self.time_step()) + multi_dim_discr = Coupler(single_dim_discr) + return multi_dim_discr + + def solve(self): + """ + Call the solver + """ + self.data = self.solver.solve() + return self.data + + def update(self, t): + for _, d in self.grid(): + d['problem'].update(t) + + #-----Data----------------- + + def data(self): + return self._data + + def set_sub_problems(self): + self.grid().add_node_props(['problem']) + for g, d in self.grid(): + d['problem'] = SubProblem(g) + + #--------Initial conditions--------------- + + def initial_pressure(self): + for _, d in self.grid(): + d['pressure'] = d['problem'].initial_pressure() + + global_pressure = self.time_disc().merge(self.grid(), 'pressure') + return global_pressure + + #---------Overloaded Functions----------------- + + def grid(self): + raise NotImplementedError('subclass must overload function grid()') + + #--------Time stepping------------ + + def time_step(self): + return 1.0 + + def end_time(self): + return 1.0 + + def save(self): + pressures = self.data['pressure'] + times = np.array(self.data['times']) + folder = self.parameters['folder_name'] + f_name = self.parameters['file_name'] + for i, p in enumerate(pressures): + self.time_disc().split(self.grid(), 'pressure', p) + data_to_plot = ['pressure'] + export_vtk( + self.grid(), f_name, data_to_plot, time_step=i, folder=folder) + + export_pvd( + self.grid(), self.parameters['file_name'], times, folder=folder) diff --git a/src/porepy/numerics/mixed_dim/coupler.py b/src/porepy/numerics/mixed_dim/coupler.py index d3e64e821f..a551de4a6e 100644 --- a/src/porepy/numerics/mixed_dim/coupler.py +++ b/src/porepy/numerics/mixed_dim/coupler.py @@ -1,9 +1,10 @@ import numpy as np import scipy.sparse as sps + class Coupler(object): -#------------------------------------------------------------------------------# + #------------------------------------------------------------------------------# def __init__(self, solver, coupling=None): self.solver = solver @@ -81,7 +82,8 @@ def matrix_rhs(self, gb, matrix_format="csr"): idx = np.ix_([pos_h, pos_l], [pos_h, pos_l]) data_l, data_h = gb.node_props(g_l), gb.node_props(g_h) - matrix[idx] += self.coupling.matrix_rhs(g_h, g_l, data_h, data_l, data) + matrix[idx] += self.coupling.matrix_rhs( + g_h, g_l, data_h, data_l, data) return sps.bmat(matrix, matrix_format), np.concatenate(tuple(rhs)) @@ -108,6 +110,34 @@ def split(self, gb, key, values): gb.add_node_prop(key) for g, d in gb: i = d['node_number'] - d[key] = values[slice(dofs[i], dofs[i+1])] + d[key] = values[slice(dofs[i], dofs[i + 1])] + +#------------------------------------------------------------------------------# + def merge(self, gb, key): + """ + Merge the stored split function stored in the grid bucket to a vector. + The values are put into the global vector according to the numeration + given by "node_number". + + Parameters + ---------- + gb : grid bucket with geometry fields computed. + key: new name of the solution to be stored in the grid bucket. + + Returns + ------- + values: (ndarray) the values stored in the bucket as an array + """ + self.ndof(gb) + dofs = np.empty(gb.size(), dtype=int) + for _, d in gb: + dofs[d['node_number']] = d['dof'] + dofs = np.r_[0, np.cumsum(dofs)] + values = np.zeros(dofs[-1]) + + for g, d in gb: + i = d['node_number'] + values[slice(dofs[i], dofs[i + 1])] = d[key] + return values #------------------------------------------------------------------------------# diff --git a/tutorials/slightly compressible flow .ipynb b/tutorials/slightly compressible flow .ipynb index fdf8b61be1..584bc6eadc 100644 --- a/tutorials/slightly compressible flow .ipynb +++ b/tutorials/slightly compressible flow .ipynb @@ -44,7 +44,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import numpy as np\n", @@ -67,7 +69,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "class UnitSquareInjection(SlightlyCompressible):\n", @@ -94,7 +98,7 @@ " def source(self, t):\n", " f = np.zeros(self.g.num_cells)\n", " source_cell = round(self.g.num_cells / 2)\n", - " f[source_cell] = 10*self.g.cell_volumes[source_cell] # m**3/s\n", + " f[source_cell] = 20*self.g.cell_volumes[source_cell] # m**3/s\n", " return f * (t < .05)\n", "\n", " #--------Parameters------------\n", @@ -120,13 +124,14 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "problem = UnitSquareInjection()\n", "problem.solve()\n", - "pressures = problem.data['pressure']\n", - "problem.save_results()" + "pressures = problem.data['pressure']\n" ] }, { @@ -143,9 +148,9 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\nOM3o2wnaOxjZVNK8fGNOR3Tt1YBzbpymlxxGL3XWLNnudlRPLzncrBFwjvOmObke4E2E6eS6d3J2\nfAPYHe454cSJE5SXl1NQUIDb7bZUOsa0EEWoiLK0vRZw/SQmJuJyuXC73VRVVeF2u1m7di1lZWXE\nxMQQExPDnj17on4uUhNa+/bts1/eDkXjHa79D/ATFxeHy+WiV69etGnThrZt23LFFVeQlJREfHw8\nMTExuFwuXK1o0mPT8lwuF3fffXdd1t4xY8a0dJMiXiinZ4wUFnCDVJutNy4ujtTU1HMip5QJnW7d\nurFq1apmZ+0FePvtt0lPT2fAgAFMnjw5HM1ucSEc2hsR7DbNmBZWm7X3ww8/JDU1laFDh5KVlVUv\niWReXh6//OUvWbt2LR07duTw4YDzXEeFUA7tjRR2h2tMC/PN2hsfH1+XtdfXwoULmT59Oh07dgSg\nSxdnT5W0RtalYIwJuYay9hYWFtYrs3PnTnbu3MkVV1xBZmbmaV0S0cjzlEJ8UEtrEV3368a0QsFk\n7a2uriYvL4+PP/6YgoICrrrqKr788ks6dOgQrmaGXTR2KUTX2YSdC+cPtbu8D84HqTn5xhyO6Ip1\neQYZOKoCkO0Om+W0nmaMgCOmGXnTnFyP2n0cXffAP2bBZO1NTU0lMzOTuLg4+vTpQ//+/cnLy2Po\n0KEO2tH6tKbugmBYwD0j1UCZw32S4EIHI5sOCsxxOBJqljjKN7ZE7mvGqLF/Z9sL1uxqHNUj293N\nypvm6POaJc6uB3iuiaPrnhRwq2/W3u7du5Odnc1bb71Vr8yNN97I0qVLmTJlCkVFRezcuZO+ffs6\na3crE43P4VrANaaFBZO1d/To0XzwwQekp6cTGxvLr3/9azp1iu4hwxZwjTFnRVNZe0WEuXPnMnfu\n3IDHefzxx0lJSeHBBx8E4NFHH6Vr16488MADoW/0WRaNQ3vtKQVjoshdd93Fa6+9BkBNTQ3Z2dnc\ndtttLdyq5rHHwowxEa1379506tSJLVu28MEHHzB48OBW3fUQyoArImNEZIeI5IvIrAa2J4jIMu/2\nDSLS27v+ByKyWUS+8P57jc8+l3vX54vIb8T/8RI/1qVgTJS5++67WbJkCYcOHWLq1Kkt3Zxmq83a\nGwoiEgvMB36AJx36JhHJUdVtPsXuAr5R1TQRmQT8CpgIFAE3qOoBEbkMTyLK7t59XgZ+BKzHky9t\n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\njFI/nAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -153,9 +158,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt8VNW5+P/Pk0wSEsBwEyqEq0E0WAoYIHhpRS0g1YBH\nVMR6+aKICi+tbUXOoSp6tLW/CvqtQnsEKqKnBMu3llgBFanWC7fQ2CIoELkmSCXQcEmYXCbP74+Z\npJMhl9nDZDIZnvfrtV/M7L32XmvP6MNizV7rEVXFGGNM84tr6QYYY8zZwgKuMcZEiAVcY4yJEAu4\nxhgTIRZwjTEmQizgGmNMhFjANcacFURkrIjsEJECEZlVz/EkEVnuO75RRPoEHO8lIidF5KfBXjOQ\nBVxjTMwTkXhgPnAtkAHcKiIZAcXuBv6lqunA88AvA44/D6x2eM06LOAaY84Gw4ECVd2tqhVADjA+\noMx44FXf6xXA1SIiACIyAdgNbHN4zTpcDhtt09KMMcGSMzk5XUTLgiz7tTcQuv12vayqL/u97wEc\n8HtfCIwIuExtGVWtEpFjQGcROQU8Cnwf+Gl95Ru5Zh1OA64xxkREGTAtyLJzwK2qmY0UqS/4B3Yg\nGyrzJPC8qp70dXidXLMOC7jGmKgkhDVAFQI9/d6nAQcbKFMoIi4gFTiKt9c6UUT+P6ADUC0ibmBL\nENeswwKuMSYqxQHJ4bvcZqC/iPQFioBJwOSAMrnAncB6YCKwTr2re11RU0BE5gAnVfUlX1Bu6pp1\nWMA1xkQlARLCdC3fmOwM4B0gHvidqm4TkaeAPFXNBRYDr4lIAd6e7aRQrtnYOeJweUb70cwYE6wz\n+tGst4g2+WCrzwOwpYkx3KhgPVxjTFQKZw83WljANcZEpTD/aBYVYu1+jDExwnq4xhgTIWF+SiEq\nWMA1xkQl6+EaY0wExVqAirX7McbECOvhGmNMhNhTCsYYEyH2o5kxxkSIDSkYY0yE2JCCMcZEiPVw\njTEmQqyHa4wxEWI9XGOMiRAh9p5SsKy9JiL+93//l9GjR7d0M0wrIkCCK7ittbCAaxy78sorWbRo\nUYPH9+7di4hQVVVVu++2227j3XffjUTz6m3PqFGjSElJ4cILL2Tt2rUNln3jjTe49NJLSUlJ4cor\nr4xcI81pRMDlCm5rLSzgNjP/oHM2t6El3XrrrQwZMoQjR47wzDPPMHHiRA4fPlxv2U6dOvGjH/2I\nWbOCzTVgmosIJMQHt7UaqupkM6rau3dv/fnPf64XXXSRdujQQe+66y49deqUqqr+5S9/0R49euiz\nzz6r3bp10x/+8IeqqvrWW2/pd77zHU1NTdWRI0fq3//+99rrPfvss9q9e3dt166dXnDBBbp27VpV\nVd24caNecskl2r59e+3atas+/PDDdeoIbNN7772nqqpPPPGE3njjjXrbbbdp+/btdeHCherxePQX\nv/iF9uvXTzt16qQ33XSTHjlypN77O3r0qP7gBz/QLl26aIcOHfQHP/iBHjhwQFVV/+u//kvj4uI0\nKSlJ27Ztq9OnT1dV1U2bNum3v/1tPXXqlKalpSmgycnJ2rZtW/3000/1lVde0csuu6y2DkDnz5+v\n6enp2q5dO/3Zz36mBQUFmpWVpe3bt9ebbrpJy8vLa8s39vk1ZseOHZqYmKjHjx+v3Xf55Zfrb37z\nm0bPW7hwoX7ve99rtMzhw4f1Bz/4gaampmrHjh318ssvV4/HE1S7zhJO40udbWg8WpEa3IY3L1mj\n1wPGAjuAAmBWPceTgOW+4xuBPr79w4HPfNvfgRv8ztkLbPUda7oNDj8Eo97gNnDgQN2/f78eOXJE\nL730Up09e7aqeoNhfHy8zpw5U91ut5aVlemWLVv03HPP1Q0bNmhVVZUuWbJEe/furW63W7/88ktN\nS0vToqIiVVXds2ePFhQUqKpqVlaWLl26VFVVT5w4oevXr6+to6mA63K59M0331SPx6NlZWX6/PPP\n64gRI/TAgQPqdrv13nvv1UmTJtV7f8XFxbpixQotLS3V48eP68SJE3X8+PG1x7/3ve/pwoULTztv\n9uzZ+pOf/ER/+MMfKqCVlZW1x+oLuNdff70eO3ZMP//8c01MTNSrrrpKv/rqKy0pKdGLLrpIlyxZ\noqra6Oenqnr//ffr/fffX++9/PGPf9QLL7ywzr7p06frjBkz6i1fI5iAO2vWLJ02bZpWVFRoRUWF\n/vWvf9Xq6upGzznLnFHAvcSFatfgtqaCHd4kj18B/YBEX+DMCCjzAPBb3+tJwHLf6xTA5Xt9HvCN\n3/u9QJdg78mGFEI0Y8YMevbsSadOnZg9ezbLli2rPRYXF8eTTz5JUlISycnJLFy4kGnTpjFixAji\n4+O58847SUpKYsOGDcTHx1NeXs727duprKykT58+nH/++QAkJCRQUFBAcXEx7dq1IysrK+j2jRw5\n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\nrKSqqqrpRJNhoKq43W4SExPZt29fROo7depURO4NvJ+xqlJUVBSR+srKyvj0008jkrfO4/FQXl5O\nUVERjzzyCPv27WPIkCF069attocbTNbelStXMmfOHAAmTpzIjBkzUNUGc5/FBGdPKRSramYjx+v7\noALnZwdT5kzKW8BtSHV1NW63m+rqai677DI2bdqEqjJ06FAKCgqorKzkoosuisi43Ndff01JSQkX\nXXRRs9cFcPz4cYqKiiJWX1lZGQUFBQwaNCgi9Z08eZIvv/ySIUOGRCToHj16lIKCAlatWsV7773H\nCy+8wLx582qPB5O117+My+UiNTWVI0eO0KVLl2Zvf4sJ72NhhUBPv/dpwMEGyhSKiAtIBY42cU3/\nf5bVd806LODWo7q6ms2bNyMitT1bVSUuLo6PPvqI+Ph4kpKS2LJlS0TacurUKVJSUti8eXOz1wdQ\nUVGBiESsPvCmp49kfRUVFXz66ae0adMmIvWpKlu2bOHFF1+ktLSUzMxMunfvTnp6Onffffdp5QN7\nrk4y+8aM8E7t3Qz0F5G+QBEwCZgcUCYXuBNYD0wE1ml9H7yPqn4tIidEJAvYCNwBvNhYI+xn0wDH\njh2jrKyM9PT02syoVVXev2ZPnDhBQkJCxDKm1gwltGnTJqL/c3k8noiniY+Li4vokx+JiYlUV1fX\nfrfNLS4ujpSUFObMmcOvf/1rMjIyOH78OFu3buW5555rMmuvf2bfqqoqjh07RqdOnSLS9hYVpsfC\nVLUKmAG8A3wBvKGq20TkKRGpydi5GOgsIgXAj4HaXy5FZC8wD7hLRApFpGa8535gEVAAfEUjP5iB\n9XBPk5SUREpKCp06dUJViY+PZ8OGDbWBL5KBqKKigvj4+IgHv+rq6og/whQfH09VVRWJiYkRq7NN\nmzacOnWK+Pj4iPyFJiIkJyfjdrt56qmneOKJJzh48CA7d+6krKyM733ve7z33nvk5OTw+9//vs65\n2dnZvPrqq4wcOZIVK1Zw1VVXxX4PN8wzzVR1Fd5Ht/z3Pe732g3c1MC5fRrYn8fpj4o1yHq4Adq0\naUNcXFxtL8/tduN2u0lOTo5o4PN4PHg8noj1pmu0RLAFb8D1eML3DFAw4uLiSEpKwu2O3JJUNUFX\nRHjiiSdYunQpvXv3pl27dmzYsIEOHTpw880312btrcnMe/fdd3PkyBHS09OZN28ezz77bMTa3GJq\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -168,19 +173,190 @@ "\n", "for t in time_steps:\n", " p = pressures[t]\n", - " plot_grid.plot_grid(problem.g, p, color_map = [0, 0.03], if_plot=False)\n", + " plot_grid.plot_grid(problem.g, p, color_map = [0, 0.04], if_plot=False)\n", " plt.title('pressure at time: %g s' %(t*dt))\n", " plt.show()\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Compressible flow with fractures\n", + "\n", + "For a fractured domain we need to import some new classes:" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], - "source": [] + "source": [ + "from porepy.numerics.compressible.problems import SlightlyCompressibleMultiDim, SubProblem\n", + "from porepy.fracs import meshing\n", + "from porepy.params import tensor" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "We create two different types of problems, one for the fractures, and one for the matrix. For the fractures we use all the standard parameters, but we set the apperture to 0.01. We also define a source term in the intersection of the two fractures" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class MatrixDomain(SubProblem):\n", + " def __init__(self, g):\n", + " SubProblem.__init__(self, g)\n", + "\n", + "class FractureDomain(SubProblem):\n", + " def __init__(self, g):\n", + " SubProblem.__init__(self, g)\n", + " aperture = np.power(0.001, 2 - g.dim)\n", + " self.data()['param'].set_aperture(aperture)\n", + " \n", + " def permeability(self):\n", + " kxx = 1000 * np.ones(self.g.num_cells)\n", + " return tensor.SecondOrder(2, kxx)\n", + "\n", + "class IntersectionDomain(FractureDomain):\n", + " def __init__(self, g):\n", + " FractureDomain.__init__(self, g)\n", + "\n", + " def source(self, t):\n", + " assert self.g.num_cells == 1, '0D grid should only have 1 cell'\n", + " f = .4 * self.g.cell_volumes # m**3/s\n", + " return f * (t < .05)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now create the global problem, which inherits from the SlightlyCompressibleMultiDim class. The important thing to notice with this classs is the set_sub_problem() function. Here we define a problem for each of the grids in the GridBucket, which is stored in the data with the keyword 'problem'" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class UnitSquareInjection(SlightlyCompressibleMultiDim):\n", + "\n", + " def __init__(self):\n", + " nx = 12\n", + " ny = 12\n", + " frac1 = np.array([[0, 1], [.5, .5]])\n", + " frac2 = np.array([[.5, .5], [0, 1]])\n", + " fracs = [frac1, frac2]\n", + " physdims = [1, 1]\n", + " g = meshing.cart_grid(fracs, [nx, ny], physdims=physdims)\n", + " g.assign_node_ordering()\n", + " g.compute_geometry()\n", + " self.g = g\n", + " # Initialize base class\n", + " SlightlyCompressibleMultiDim.__init__(self)\n", + "\n", + " #--------grid function--------\n", + "\n", + " def grid(self):\n", + " return self.g\n", + "\n", + " def set_sub_problems(self):\n", + " self.grid().add_node_props(['problem'])\n", + " for g, d in self.grid():\n", + " if g.dim == 2:\n", + " d['problem'] = MatrixDomain(g)\n", + " elif g.dim == 1:\n", + " d['problem'] = FractureDomain(g)\n", + " elif g.dim == 0:\n", + " d['problem'] = IntersectionDomain(g)\n", + " else:\n", + " raise ValueError('Unkown grid-dimension %d' %g.dim)\n", + " #--------Time stepping------------\n", + " def time_step(self):\n", + " return .001\n", + "\n", + " def end_time(self):\n", + " return 0.1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now initialize the problem and solve it:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "problem = UnitSquareInjection()\n", + "solution = problem.solve()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we can plot the result" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nfJK9e/cCcOTIEZYtW1Zt2lOnTpGYmEizZs04duwYM2bMqLK/TZs27Nq1q8ayWrVqhYhQVFTEnXfe\nyZQpU9i9ezcnTpwIW8eahLt+tbniiivo0aMHM2bMoLCwkLfffpt//etf3HbbbdWmv/vuu3nuuef4\n9ttv+fe//838+fMZN24cABs2bGDHjh2UlZVx9OhRHnnkEQYOHHhWkwUQ9r6acyQEWl6dbJCvqr0q\nbS+H5JYHVP4zMBUI/ROkIo2I+IBk4FjlBKr6JVAAXB18fzD472HgbQJNFzWygOvQnXfeWdHm2Llz\nZ5566qka0/bq1Yv58+czadIkmjdvTnp6OgsXLgQC/T6nTJlCSkoKl156KYcPH+aFF14AYOXKlXTr\n1o0mTZowefJkMjMzadSoEcnJycybN4/777+fdu3a0bhxY1JTU8PWd/LkyQwfPpzBgwfTtGlT+vXr\nx4YNG6pN+7Of/YwzZ86QkpJCv379qnSJKs9r6dKlNG/enEceeeSs45OSknjqqaf47LPPaNasGZs2\nbWLatGnVBiYnwl0/CPwyGT9+fI3HZ2Zmkp2dTfPmzZkyZQpLly6t6BL2t7/9rcoT7IwZM7j88stJ\nS0vjhz/8IY899ljF+e/atYuhQ4fStGlTrr76ahISEqq03VcW7r6ac1S3TQqbgC4i0klE4gl8KZYV\nkiYLuCf4eiSwWlU1eIwPQETSgK7AHhFpLCJNg583BgYDW8OeUk1/HtXgnBuLG7KOHTvyyiuv8J//\n+Z/1XRVjGpLwbVG16JUkmt3VYUGfsVlVe4VNIzIM+AOBZ+K/qurzIvIMgR4OWcFmgjeAawk82Y5W\n1V0ichcwBSgByoBnVPUdEelM4KkWAmH/76r6fLg6WG9uY0x0quPpwlR1ObA85LNplV4XArdXc9wb\nBAJx6Oe7gGvc1MECrjEmOsXg/IwxdjoXxp49e+q7CsZcnGLse0cLuMaY6GRPuMYYEyEWcI0xJkKE\nwHQyMcQCrjEmOsXgE64NfHBo5cqVdO3alfT0dGbOnHnW/qKiIu644w7S09Pp27fveX3RVltZs2bN\nIiMjg+7du3PjjTdWjCa7EGWVW7p0KSJCdnb2OZfltLwlS5aQkZFBt27duPPOOy9YWfv27WPQoEFc\ne+21dO/eneXLl1eTizP33nsvrVu35uqrr652v6ryyCOPkJ6eTvfu3fn000/PuayLRt0OfIgOLqdM\n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\naQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4lNXZ+PHvPZOFhCUsAaqE1SAaLCKyKdiCtoBYQS8R\nAdefu8JPbK1Ka8GI1RfbgvZVsBWpiFYi5a0lVsAN0V8tW5BaAStEZAmoEBAIgUkyM/fvj5nkTYYs\nz5DJZDLcn+t6LmY5c855ZsKdkzPPObeoKsYYYxqeq7E7YIwxpwsLuMYYEyUWcI0xJkos4BpjTJRY\nwDXGmCixgGuMMVFiAdcYc1oQkVEi8oWI5IvItGqeTxaR14PPrxORbiHPdxGRYyLyc6d1hrKAa4yJ\neyLiBuYClwNZwEQRyQopdhvwnapmAk8DT4U8/zSwIsw6q7CAa4w5HQwE8lV1h6qWAjnA2JAyY4GX\ng7eXApeJiACIyFXADmBLmHVWkRBmp21ZmjHGKanPizNF9LjDsl8HAqGn0kMvqOoLle53AvZUul8A\nDAqppqKMqnpF5AjQTkROAA8DPwZ+Xl35WuqsItyAa4wxUXEcuMth2WzwqGr/WopUF/xDB5A1lXkM\neFpVjwUHvOHUWYUFXGNMTBIiGqAKgM6V7mcA+2ooUyAiCUAacIjAqHWciPwGaA34RcQDbHRQZxUW\ncI0xMckFpESuug1ATxHpDuwFJgCTQsrkAjcDa4BxwCoN7O51SXkBEckGjqnqc8GgXFedVVjANcbE\nJAESI1RXcE52CvA24Ab+pKpbRGQmkKequcAC4BURyScwsp1wKnXW9hoJc3tG+9LMGONUvb406yqi\ndV7YGnQvbKxjDjcm2AjXGBOTIjnCjRUWcI0xMSnCX5rFhHg7H2NMnLARrjHGREmEr1KICRZwjTEx\nyUa4xhgTRfEWoOLtfIwxccJGuMYYEyV2lYIxxkSJfWlmjDFRYlMKxhgTJTalYIwxUWIjXGOMiRIb\n4RpjTJTYCNcYY6JEiL+rFCxrr4mKP//5z4wYMaKxu2GaEAESE5wdTYUFXBO2YcOG8eKLL9b4/M6d\nOxERvF5vxWPXX38977zzTjS6V21/hg8fTmpqKueccw7vvfdejWWXLFnCxRdfTGpqKsOGDYteJ81J\nRCAhwdnRVFjAbWCVg87p3IfGNHHiRC644AIOHjzIE088wbhx4zhw4EC1Zdu2bcv999/PtGlOcw2Y\nhiICiW5nR5OhquEcRlW7du2qTz75pJ577rnaunVrveWWW/TEiROqqvrBBx9op06ddNasWdqxY0e9\n4YYbVFX1zTff1PPPP1/T0tL0oosu0k8//bSivlmzZumZZ56pLVq00LPPPlvfe+89VVVdt26dXnjh\nhdqyZUvt0KGD/vSnP63SRmif3n33XVVVffTRR/Waa67R66+/Xlu2bKnz589Xn8+n//Vf/6U9evTQ\ntm3b6rXXXqsHDx6s9vwOHTqkV1xxhaanp2vr1q31iiuu0D179qiq6i9/+Ut1uVyanJyszZs318mT\nJ6uq6vr16/X73/++njhxQjMyMhTQlJQUbd68uf7zn//Ul156SYcMGVLRBqBz587VzMxMbdGihf7q\nV7/S/Px8HTx4sLZs2VKvvfZaLSkpqShf2/tXmy+++EKTkpL06NGjFY8NHTpUn3/++VpfN3/+fP3h\nD39Ya5kDBw7oFVdcoWlpadqmTRsdOnSo+nw+R/06TYQbX6oc/dxoaZqzg0BeslrrA0YBXwD5wLRq\nnk8GXg8+vw7oFnx8IPCv4PEpcHWl1+wEPgs+V3cfwnwTjAaCW+/evXX37t168OBBvfjii/WRRx5R\n1UAwdLvd+tBDD6nH49Hjx4/rxo0btX379rp27Vr1er26cOFC7dq1q3o8Hv3Pf/6jGRkZunfvXlVV\n/eqrrzQ/P19VVQcPHqyLFi1SVdWioiJds2ZNRRt1BdyEhAR944031Ofz6fHjx/Xpp5/WQYMG6Z49\ne9Tj8eidd96pEyZMqPb8CgsLdenSpVpcXKxHjx7VcePG6dixYyue/+EPf6jz588/6XWPPPKIPvDA\nA3rDDTcooGVlZRXPVRdwr7zySj1y5Ihu3rxZk5KS9NJLL9Uvv/xSDx8+rOeee64uXLhQVbXW909V\n9Z577tF77rmn2nP561//quecc06VxyZPnqxTpkyptnw5JwF32rRpetddd2lpaamWlpbqRx99pH6/\nv9bXnGbqFXAvTEC1g7OjrmBHIMnjl0APICkYOLNCytwL/CF4ewLwevB2KpAQvH0GsL/S/Z1AutNz\nsimFUzRlyhQ6d+5M27ZteeSRR1i8eHHFcy6Xi8cee4zk5GRSUlKYP38+d911F4MGDcLtdnPzzTeT\nnJzM2rVrcbvdlJSUsHXrVsrKyujWrRtnnXUWAImJieTn51NYWEiLFi0YPHiw4/5ddNFFXHXVVbhc\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pressures = solution['pressure']\n", + "time_steps = [50,100]\n", + "dt = problem.time_step()\n", + "\n", + "for t in time_steps:\n", + " p = pressures[t]\n", + " problem.time_disc().split(problem.grid(), 'pressure', p)\n", + " plot_grid.plot_grid(problem.g, 'pressure', color_map = [0, 0.04], if_plot=False)\n", + " plt.title('pressure at time: %g s' %(t*dt))\n", + " plt.show()" + ] } ], "metadata": { From 9a59785f60b93647c223e370cdbafe4edeb76ad8 Mon Sep 17 00:00:00 2001 From: Runar Date: Thu, 20 Jul 2017 14:53:42 +0200 Subject: [PATCH 04/53] Added integration test to compressible flow --- src/porepy/numerics/compressible/problems.py | 7 +- test/integration/test_compressible_flow.py | 209 +++++++++++++++++++ 2 files changed, 213 insertions(+), 3 deletions(-) create mode 100644 test/integration/test_compressible_flow.py diff --git a/src/porepy/numerics/compressible/problems.py b/src/porepy/numerics/compressible/problems.py index 34f0a92463..4f190e1ee3 100644 --- a/src/porepy/numerics/compressible/problems.py +++ b/src/porepy/numerics/compressible/problems.py @@ -245,11 +245,12 @@ def time_step(self): def end_time(self): return 1.0 - def save(self): - pressures = self.data['pressure'] - times = np.array(self.data['times']) + def save(self, save_every=1): + pressures = self.data['pressure'][::save_every] + times = np.array(self.data['times'])[::save_every] folder = self.parameters['folder_name'] f_name = self.parameters['file_name'] + for i, p in enumerate(pressures): self.time_disc().split(self.grid(), 'pressure', p) data_to_plot = ['pressure'] diff --git a/test/integration/test_compressible_flow.py b/test/integration/test_compressible_flow.py new file mode 100644 index 0000000000..0a69250f11 --- /dev/null +++ b/test/integration/test_compressible_flow.py @@ -0,0 +1,209 @@ +import unittest +import numpy as np + +from porepy.numerics.compressible import problems, solvers +from porepy.grids import structured +from porepy.fracs import meshing +from porepy.params import tensor + + +class TestCompressibleFlow(unittest.TestCase): + def test_single_grid_problem(self): + problem = UnitSquareInjection() + solution = problem.solve() + p = solution['pressure'] + p0 = p[10] + pT = p[-1] + p_ref0, p_refT = _reference_solution_single_grid() + assert np.allclose(p0, p_ref0) + assert np.allclose(pT, p_refT) + + def test_3d_Fracture_problem(self): + problem = UnitSquareInjectionMultiDim() + solution = problem.solve() + p = solution['pressure'][-1] + problem.time_disc().split(problem.grid(), 'pressure', p) + for g, d in problem.grid(): + if g.dim == 3: + pT = d['pressure'] + p_refT = _reference_solution_multi_grid() + assert np.allclose(pT, p_refT) + + +############################################################################### + + +class UnitSquareInjection(problems.SlightlyCompressible): + + def __init__(self): + nx = 11 + ny = 11 + + physdims = [1, 1] + + g = structured.CartGrid([nx, ny], physdims=physdims) + g.compute_geometry() + self.g = g + # Initialize base class + problems.SlightlyCompressible.__init__(self) + + #--------grid function-------- + + def grid(self): + return self.g + + #--------Inn/outflow terms--------------- + + def source(self, t): + f = np.zeros(self.g.num_cells) + source_cell = round(self.g.num_cells / 2) + f[source_cell] = 20 * self.g.cell_volumes[source_cell] # m**3/s + return f * (t < .05) + + #--------Time stepping------------ + def time_step(self): + return .005 + + def end_time(self): + return 0.1 + + +class MatrixDomain(problems.SubProblem): + def __init__(self, g): + problems.SubProblem.__init__(self, g) + + +class FractureDomain(problems.SubProblem): + def __init__(self, g): + problems.SubProblem.__init__(self, g) + aperture = np.power(0.001, 3 - g.dim) + self.data()['param'].set_aperture(aperture) + + def permeability(self): + kxx = 1000 * np.ones(self.g.num_cells) + return tensor.SecondOrder(3, kxx) + + +class IntersectionDomain(FractureDomain): + def __init__(self, g): + FractureDomain.__init__(self, g) + + def source(self, t): + assert self.g.num_cells == 1, '0D grid should only have 1 cell' + f = .4 * self.g.cell_volumes # m**3/s + return f * (t < .05) + + +class UnitSquareInjectionMultiDim(problems.SlightlyCompressibleMultiDim): + + def __init__(self): + + f_1 = np.array([[0, 1, 1, 0], [.5, .5, .5, .5], [0, 0, 1, 1]]) + f_2 = np.array([[.5, .5, .5, .5], [0, 1, 1, 0], [0, 0, 1, 1]]) + f_3 = np.array([[0, 1, 1, 0], [0, 0, 1, 1], [.5, .5, .5, .5]]) + f_set = [f_1, f_2, f_3] + + g = meshing.cart_grid(f_set, [4, 4, 4], physdims=[1, 1, 1]) + g.compute_geometry() + g.assign_node_ordering() + + self.g = g + # Initialize base class + problems.SlightlyCompressibleMultiDim.__init__(self) + + #--------grid function-------- + + def grid(self): + return self.g + + def set_sub_problems(self): + self.grid().add_node_props(['problem']) + for g, d in self.grid(): + if g.dim == 3: + d['problem'] = MatrixDomain(g) + elif g.dim == 2 or g.dim == 1: + d['problem'] = FractureDomain(g) + elif g.dim == 0: + d['problem'] = IntersectionDomain(g) + else: + raise ValueError('Unkown grid-dimension %d' % g.dim) + #--------Time stepping------------ + + def time_step(self): + return .005 + + def end_time(self): + return 0.05 + +############################################################################### + + +def _reference_solution_single_grid(): + pT = np.array([0.00621076, 0.0064875, 0.00695763, 0.00747579, 0.00787619, + 0.00802654, 0.00787619, 0.00747579, 0.00695763, 0.0064875, + 0.00621076, 0.0064875, 0.00679082, 0.00730681, 0.00787666, + 0.00831785, 0.00848373, 0.00831785, 0.00787666, 0.00730681, + 0.00679082, 0.0064875, 0.00695763, 0.00730681, 0.00790215, + 0.00856158, 0.00907363, 0.00926651, 0.00907363, 0.00856158, + 0.00790215, 0.00730681, 0.00695763, 0.00747579, 0.00787666, + 0.00856158, 0.00932247, 0.00991504, 0.01013867, 0.00991504, + 0.00932247, 0.00856158, 0.00787666, 0.00747579, 0.00787619, + 0.00831785, 0.00907363, 0.00991504, 0.01057172, 0.01081989, + 0.01057172, 0.00991504, 0.00907363, 0.00831785, 0.00787619, + 0.00802654, 0.00848373, 0.00926651, 0.01013867, 0.01081989, + 0.01107748, 0.01081989, 0.01013867, 0.00926651, 0.00848373, + 0.00802654, 0.00787619, 0.00831785, 0.00907363, 0.00991504, + 0.01057172, 0.01081989, 0.01057172, 0.00991504, 0.00907363, + 0.00831785, 0.00787619, 0.00747579, 0.00787666, 0.00856158, + 0.00932247, 0.00991504, 0.01013867, 0.00991504, 0.00932247, + 0.00856158, 0.00787666, 0.00747579, 0.00695763, 0.00730681, + 0.00790215, 0.00856158, 0.00907363, 0.00926651, 0.00907363, + 0.00856158, 0.00790215, 0.00730681, 0.00695763, 0.0064875, + 0.00679082, 0.00730681, 0.00787666, 0.00831785, 0.00848373, + 0.00831785, 0.00787666, 0.00730681, 0.00679082, 0.0064875, + 0.00621076, 0.0064875, 0.00695763, 0.00747579, 0.00787619, + 0.00802654, 0.00787619, 0.00747579, 0.00695763, 0.0064875, + 0.00621076]) + p0 = np.array([0.00163541, 0.00196744, 0.00257963, 0.00333943, 0.00400819, + 0.00428807, 0.00400819, 0.00333943, 0.00257963, 0.00196744, + 0.00163541, 0.00196744, 0.00243047, 0.00331231, 0.00446589, + 0.00555531, 0.00605294, 0.00555531, 0.00446589, 0.00331231, + 0.00243047, 0.00196744, 0.00257963, 0.00331231, 0.00477516, + 0.00684537, 0.00903211, 0.010208, 0.00903211, 0.00684537, + 0.00477516, 0.00331231, 0.00257963, 0.00333943, 0.00446589, + 0.00684537, 0.01056736, 0.01517516, 0.01844586, 0.01517516, + 0.01056736, 0.00684537, 0.00446589, 0.00333943, 0.00400819, + 0.00555531, 0.00903211, 0.01517516, 0.02468009, 0.0353479, + 0.02468009, 0.01517516, 0.00903211, 0.00555531, 0.00400819, + 0.00428807, 0.00605294, 0.010208, 0.01844586, 0.0353479, + 0.07602835, 0.0353479, 0.01844586, 0.010208, 0.00605294, + 0.00428807, 0.00400819, 0.00555531, 0.00903211, 0.01517516, + 0.02468009, 0.0353479, 0.02468009, 0.01517516, 0.00903211, + 0.00555531, 0.00400819, 0.00333943, 0.00446589, 0.00684537, + 0.01056736, 0.01517516, 0.01844586, 0.01517516, 0.01056736, + 0.00684537, 0.00446589, 0.00333943, 0.00257963, 0.00331231, + 0.00477516, 0.00684537, 0.00903211, 0.010208, 0.00903211, + 0.00684537, 0.00477516, 0.00331231, 0.00257963, 0.00196744, + 0.00243047, 0.00331231, 0.00446589, 0.00555531, 0.00605294, + 0.00555531, 0.00446589, 0.00331231, 0.00243047, 0.00196744, + 0.00163541, 0.00196744, 0.00257963, 0.00333943, 0.00400819, + 0.00428807, 0.00400819, 0.00333943, 0.00257963, 0.00196744, + 0.00163541]) + return p0, pT + + +def _reference_solution_multi_grid(): + pT = np.array([0.00983112, 0.01637886, 0.01637886, 0.00983112, 0.01637886, + 0.02264049, 0.02264049, 0.01637886, 0.01637886, 0.02264049, + 0.02264049, 0.01637886, 0.00983112, 0.01637886, 0.01637886, + 0.00983112, 0.01637886, 0.02264049, 0.02264049, 0.01637886, + 0.02264049, 0.03234641, 0.03234641, 0.02264049, 0.02264049, + 0.03234641, 0.03234641, 0.02264049, 0.01637886, 0.02264049, + 0.02264049, 0.01637886, 0.01637886, 0.02264049, 0.02264049, + 0.01637886, 0.02264049, 0.03234641, 0.03234641, 0.02264049, + 0.02264049, 0.03234641, 0.03234641, 0.02264049, 0.01637886, + 0.02264049, 0.02264049, 0.01637886, 0.00983112, 0.01637886, + 0.01637886, 0.00983112, 0.01637886, 0.02264049, 0.02264049, + 0.01637886, 0.01637886, 0.02264049, 0.02264049, 0.01637886, + 0.00983112, 0.01637886, 0.01637886, 0.00983112]) + return pT From 25abd7798add5181ad01344f4ad271e345c01895 Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 21 Aug 2017 17:26:00 +0200 Subject: [PATCH 05/53] Added assertion to meshing to check that there exist a mapping from all lower dim cells to higher dim faces --- src/porepy/fracs/meshing.py | 8 +++++--- src/porepy/fracs/split_grid.py | 9 +++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/porepy/fracs/meshing.py b/src/porepy/fracs/meshing.py index d8a2a96b8a..71edca6798 100644 --- a/src/porepy/fracs/meshing.py +++ b/src/porepy/fracs/meshing.py @@ -17,7 +17,7 @@ def simplex_grid(fracs, domain, **kwargs): """ - Main function for grid generation. Creates a fractured simiplex grid in 2 + Main function for grid generation. Creates a fractured simiplex grid in 2 or 3 dimensions. Parameters @@ -81,7 +81,7 @@ def simplex_grid(fracs, domain, **kwargs): gb = assemble_in_bucket(grids) gb.compute_geometry() # Split the grids. - split_grid.split_fractures(gb) + split_grid.split_fractures(gb, **kwargs) return gb @@ -287,6 +287,8 @@ def obtain_interdim_mappings(lg, fn, n_per_face): # An element in cell_2_face gives, for all cells in the # lower-dimensional grid, the index of the corresponding face # in the higher-dimensional structure. - + assert np.all(is_mem) or np.all(~is_mem),\ + '''Either all cells should have a corresponding face in a higher dim grid + or no cells should have a corresponding face in a higher dim grid ''' low_dim_cell = np.where(is_mem)[0] return cell_2_face, low_dim_cell diff --git a/src/porepy/fracs/split_grid.py b/src/porepy/fracs/split_grid.py index 481aa77d7f..1764f6b38e 100644 --- a/src/porepy/fracs/split_grid.py +++ b/src/porepy/fracs/split_grid.py @@ -61,7 +61,7 @@ def split_fractures(bucket, **kwargs): # dimensional grids. for gh, _ in bucket: # add new field to grid - gh.frac_pairs = np.zeros((2,0),dtype=np.int32) + gh.frac_pairs = np.zeros((2, 0), dtype=np.int32) if gh.dim < 1: # Nothing to do. We can not split 0D grids. continue @@ -112,7 +112,7 @@ def split_faces(gh, face_cells): The face_cells are updated such that the copy of a face also map to the same lower-dim cell. """ - gh.frac_pairs = np.zeros((2,0), dtype=np.int32) + gh.frac_pairs = np.zeros((2, 0), dtype=np.int32) for i in range(len(face_cells)): # We first we duplicate faces along tagged faces. The duplicate # faces will share the same nodes as the original faces, @@ -132,13 +132,14 @@ def split_faces(gh, face_cells): x0 = np.reshape(gh.face_centers[:, face_id[0]], (3, 1)) flag = update_cell_connectivity(gh, face_id, n, x0) - if flag==0: + if flag == 0: # if flag== 0 we added left and right faces (if it is -1 no faces # was added and we don't have left and right face pairs. # we now add the new faces to the frac_pair array. left = face_id right = np.arange(gh.num_faces - face_id.size, gh.num_faces) - gh.frac_pairs = np.hstack((gh.frac_pairs, np.vstack((left,right)))) + gh.frac_pairs = np.hstack( + (gh.frac_pairs, np.vstack((left, right)))) return face_cells From 43057ad083899f7937871b8d69076f73bf4d5dd4 Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 21 Aug 2017 17:27:31 +0200 Subject: [PATCH 06/53] Added step function to compressible problem class --- src/porepy/numerics/compressible/problems.py | 14 ++++++++++++-- src/porepy/params/units.py | 3 ++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/porepy/numerics/compressible/problems.py b/src/porepy/numerics/compressible/problems.py index 4f190e1ee3..0fa3a66268 100644 --- a/src/porepy/numerics/compressible/problems.py +++ b/src/porepy/numerics/compressible/problems.py @@ -56,7 +56,11 @@ def update(self, t): self.data()['param'].set_source(self.flux_disc(), source) self.data()['param'].set_bc_val(self.flux_disc(), bc_val) + def step(self): + return self.solver.step() + #-----Parameters------------ + def porosity(self): return np.ones(self.grid().num_cells) @@ -213,6 +217,12 @@ def update(self, t): for _, d in self.grid(): d['problem'].update(t) + def step(self): + return self.solver.step() + + def reassemble(self): + return self.solver.reassemble() + #-----Data----------------- def data(self): @@ -246,8 +256,8 @@ def end_time(self): return 1.0 def save(self, save_every=1): - pressures = self.data['pressure'][::save_every] - times = np.array(self.data['times'])[::save_every] + pressures = self.data()['pressure'][::save_every] + times = np.array(self.data()['times'])[::save_every] folder = self.parameters['folder_name'] f_name = self.parameters['file_name'] diff --git a/src/porepy/params/units.py b/src/porepy/params/units.py index 9964d84735..039fe65991 100644 --- a/src/porepy/params/units.py +++ b/src/porepy/params/units.py @@ -1,9 +1,11 @@ +NANO = 1e-9 MICRO = 1e-6 MILLI = 1e-3 CENTI = 1e-2 DECI = 1e-1 KILO = 1e3 MEGA = 1e6 +GIGA = 1e9 # Time units SECOND = 1 @@ -21,4 +23,3 @@ DARCY = 9.869233e-13 PASCAL = 1 BAR = 101325 * PASCAL - From 4fd78ad876925af786dcae01470c7178e3d50ea5 Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 23 Aug 2017 10:41:13 +0200 Subject: [PATCH 07/53] Added function for zeroing out columns of a sparse matrix --- src/porepy/utils/sparse_mat.py | 28 ++++++++++++++++++++++++++++ test/unit/test_sparse_mat.py | 26 ++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/porepy/utils/sparse_mat.py create mode 100644 test/unit/test_sparse_mat.py diff --git a/src/porepy/utils/sparse_mat.py b/src/porepy/utils/sparse_mat.py new file mode 100644 index 0000000000..e8bc13c0f9 --- /dev/null +++ b/src/porepy/utils/sparse_mat.py @@ -0,0 +1,28 @@ +import scipy.sparse as sps + +from porepy.utils.mcolon import mcolon + + +def zero_columns(A, cols): + ''' + Function to zero out columns in matrix A. Note that this function does not + change the sparcity structure of the matrix, it only changes the column + values to 0 + + Parameter + --------- + A (scipy.sparse.spmatrix): A sparce matrix + cols (ndarray): A numpy array of columns that should be zeroed + Return + ------ + None + + + ''' + if A.getformat() != 'csc': + raise Warning('Zero out columns most efficient for csc matrices') + A = A.tocsc() + indptr = A.indptr + + col_indptr = mcolon(indptr[cols], indptr[cols + 1]) + A.data[col_indptr] = 0 diff --git a/test/unit/test_sparse_mat.py b/test/unit/test_sparse_mat.py new file mode 100644 index 0000000000..7768dd3479 --- /dev/null +++ b/test/unit/test_sparse_mat.py @@ -0,0 +1,26 @@ +import unittest +import scipy.sparse as sps +import numpy as np + +from porepy.utils import sparse_mat + + +class TestZeroColumns(unittest.TestCase): + def zero_1_column(self): + A = sps.csc_matrix((np.array([1, 2, 3]), (np.array( + [0, 2, 1]), np.array([0, 1, 2]))), shape=(3, 3)) + sparse_mat.zero_columns(A, 0) + assert np.all(A.A == np.array([[0, 0, 0], [0, 0, 3], [0, 2, 0]])) + assert A.nnz == 3 + assert A.getformat() == 'csc' + + def zero_2_columns(self): + A = sps.csc_matrix((np.array([1, 2, 3]), (np.array( + [0, 2, 1]), np.array([0, 1, 2]))), shape=(3, 3)) + sparse_mat.zero_columns(A, np.array([0, 2])) + assert np.all(A.A == np.array([[0, 0, 0], [0, 0, 0], [0, 2, 0]])) + assert A.nnz == 3 + assert A.getformat() == 'csc' + + if __name__ == '__main__': + unittest.main() From b8d69d52461429826a8e287d57e5bfd32bd4dec8 Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 2 Oct 2017 10:45:22 +0200 Subject: [PATCH 08/53] Updated tpfa multidim such that it uses the solver.matrix_rhs --- src/porepy/numerics/fv/tpfa.py | 11 +++++++---- src/porepy/utils/sparse_mat.py | 6 +++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/porepy/numerics/fv/tpfa.py b/src/porepy/numerics/fv/tpfa.py index acabd72e8d..637871da88 100644 --- a/src/porepy/numerics/fv/tpfa.py +++ b/src/porepy/numerics/fv/tpfa.py @@ -214,12 +214,15 @@ def discretize(self, g, data, faces=None): class TpfaMultiDim(): def __init__(self, physics='flow'): self.physics = physics - - def matrix_rhs(self, gb): discr = Tpfa(self.physics) coupling_conditions = TpfaCoupling(discr) - solver = Coupler(discr, coupling_conditions) - return solver.matrix_rhs(gb) + self.solver = Coupler(discr, coupling_conditions) + + def matrix_rhs(self, gb): + return self.solver.matrix_rhs(gb) + + def split(self, gb, names, var): + return self.solver.split(gb, names, var) def compute_discharges(self, gb): """ diff --git a/src/porepy/utils/sparse_mat.py b/src/porepy/utils/sparse_mat.py index e8bc13c0f9..975498fe71 100644 --- a/src/porepy/utils/sparse_mat.py +++ b/src/porepy/utils/sparse_mat.py @@ -19,10 +19,10 @@ def zero_columns(A, cols): ''' + if A.getformat() != 'csc': - raise Warning('Zero out columns most efficient for csc matrices') - A = A.tocsc() - indptr = A.indptr + raise ValueError('Need a csc matrix') + indptr = A.indptr col_indptr = mcolon(indptr[cols], indptr[cols + 1]) A.data[col_indptr] = 0 From e15ceed0f9441b65191d1638d3074727d43db5d9 Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 2 Oct 2017 15:59:51 +0200 Subject: [PATCH 09/53] Pulled fvutils from develop --- src/porepy/numerics/fv/fvutils.py | 85 ++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 31 deletions(-) diff --git a/src/porepy/numerics/fv/fvutils.py b/src/porepy/numerics/fv/fvutils.py index fdfb2891f4..244da6b3c7 100644 --- a/src/porepy/numerics/fv/fvutils.py +++ b/src/porepy/numerics/fv/fvutils.py @@ -5,11 +5,11 @@ @author: eke001 """ from __future__ import division -import sys import numpy as np import scipy.sparse as sps from porepy.utils import matrix_compression, mcolon +from porepy.params.data import Parameters class SubcellTopology(object): @@ -938,46 +938,69 @@ def map_subgrid_to_grid(g, loc_faces, loc_cells, is_vector): #------------------------------------------------------------------------------ -def compute_discharges(self, gb): +def compute_discharges(gb, physics='flow'): """ Computes discharges over all faces in the entire grid bucket given pressures for all nodes, provided as node properties. - + Parameter: - gb: grid bucket with the following data fields for all nodes/grids: - 'flux': Internal discretization of fluxes. - 'bound_flux': Discretization of boundary fluxes. - 'p': Pressure values for each cell of the grid. - 'bc_val': Boundary condition values. + gb: grid bucket with the following data fields for all nodes/grids: + 'flux': Internal discretization of fluxes. + 'bound_flux': Discretization of boundary fluxes. + 'p': Pressure values for each cell of the grid. + 'bc_val': Boundary condition values. and the following edge property field for all connected grids: - 'coupling_flux': Discretization of the coupling fluxes. + 'coupling_flux': Discretization of the coupling fluxes. Returns: gb, the same grid bucket with the added field 'discharge' added to all - node data fields. Note that the fluxes between grids will be added doubly, - both to the data corresponding to the higher dimensional grid and as a - edge property. + node data fields. Note that the fluxes between grids will be added only + at the gb edge, not at the node fields. The sign of the discharges + correspond to the directions of the normals, in the edge/coupling case + those of the higher grid. For edges beteween grids of equal dimension, + there is an implicit assumption that all normals point from the second + to the first of the sorted grids (gb.sorted_nodes_of_edge(e)). """ - gb.add_node_props(['discharge']) - - for gr, da in gb: - if gr.dim > 0: - f, _, s = sps.find(gr.cell_faces) - _, ind = np.unique(f, return_index=True) - s = s[ind] - da['discharge'] = (da['flux'] * da['p'] - + da['bound_flux'] * da['bc_val']) + + for g, d in gb: + if g.dim > 0: + pa = d['param'] + dis = d['flux'] * d['p'] + d['bound_flux'] \ + * pa.get_bc_val(physics) + pa.set_discharge(dis) - gb.add_edge_prop('discharge') for e, data in gb.edges_props(): + # According to the sorting convention, g2 is the higher dimensional grid, + # the one to who's faces the fluxes correspond g1, g2 = gb.sorted_nodes_of_edge(e) - if data['face_cells'] is not None: + + if g1.dim != g2.dim and data['face_cells'] is not None: + pa = data['param'] coupling_flux = gb.edge_prop(e, 'coupling_flux')[0] pressures = gb.nodes_prop([g2, g1], 'p') - coupling_contribution = coupling_flux * \ - np.concatenate(pressures) - flux2 = coupling_contribution + gb.node_prop(g2, 'discharge') - data2 = gb.node_props(g2) - data2['discharge'] = copy.deepcopy(flux2) - data['discharge'] = copy.deepcopy(flux2) - - return gb + dis = coupling_flux * np.concatenate(pressures) + pa.set_discharge(dis) + + + elif g1.dim == g2.dim and data['face_cells'] is not None: + try: + pa = data['param'] + except KeyError: + pa = Parameters(g2) + data['param'] = pa + # g2 is now only the "higher", but still the one defining the faces + # (cell-cells connections) in the sense that the normals are assumed + # outward from g2, "pointing towards the g1 cells". Note that in + # general, there are g2.num_cells x g1.num_cells connections/"faces". + cc = data['face_cells'] + cells_1, cells_2 = cc.nonzero() + coupling_flux = gb.edge_prop(e, 'coupling_flux')[0] + + pressures = gb.nodes_prop([g2, g1], 'p') + p2 = pressures[0][cells_2] + p1 = pressures[1][cells_1] + contribution_2 = np.multiply(coupling_flux[cc], p2) + contribution_1 = np.multiply(coupling_flux[cc], p1) + dis = contribution_2-contribution_1 + # Store flux at the edge only. This means that the flux will remain + # zero in the data of both g1 and g2 + pa.set_discharge(np.ravel(dis)) From 214aa1fc2a6a365ca015ed69801948aec7ea1b1c Mon Sep 17 00:00:00 2001 From: Runar Date: Fri, 6 Oct 2017 11:28:18 +0200 Subject: [PATCH 10/53] Changed compressible solver into a general pde-solver --- src/porepy/numerics/compressible/problems.py | 258 ++---------------- src/porepy/numerics/fv/tpfa.py | 2 +- src/porepy/numerics/pdeproblem.py | 149 ++++++++++ .../{compressible/solvers.py => pdesolver.py} | 139 +++++++++- test/integration/test_compressible_flow.py | 134 ++------- test/unit/test_tpfa.py | 8 +- tutorials/slightly compressible flow .ipynb | 205 ++------------ 7 files changed, 346 insertions(+), 549 deletions(-) create mode 100644 src/porepy/numerics/pdeproblem.py rename src/porepy/numerics/{compressible/solvers.py => pdesolver.py} (51%) diff --git a/src/porepy/numerics/compressible/problems.py b/src/porepy/numerics/compressible/problems.py index 0fa3a66268..c5dbd24eb5 100644 --- a/src/porepy/numerics/compressible/problems.py +++ b/src/porepy/numerics/compressible/problems.py @@ -2,8 +2,8 @@ import scipy.sparse as sps from porepy.grids import structured +from porepy.numerics.pdeproblem import * from porepy.numerics.fv import tpfa, mass_matrix -from porepy.numerics.compressible import solvers from porepy.numerics.mixed_dim.coupler import Coupler from porepy.params.data import Parameters from porepy.params import tensor @@ -11,261 +11,43 @@ from porepy.viz.exporter import export_vtk, export_pvd -class SlightlyCompressible(): - """ - Base-class for slightly compressible flow. Initialize all needed - attributes for a slightly compressible solver. - """ - - def __init__(self): - self._data = dict() - self._set_data() - self.solver = solvers.Implicit(self) - self.solver.parameters['store_results'] = True - self.parameters = {'file_name': 'pressure'} - self.parameters['folder_name'] = 'results' - - #---------Discretization--------------- - - def flux_disc(self): - """ - Returns the flux discretization. - """ - return tpfa.Tpfa() - - def time_disc(self): - """ - Returns the flux discretization. - """ - class TimeDisc(mass_matrix.MassMatrix): - def matrix_rhs(self, g, data): - lhs, rhs = mass_matrix.MassMatrix.matrix_rhs(self, g, data) - return lhs * data['compressibility'], rhs * data['compressibility'] - return TimeDisc() - - def solve(self): - """ - Call the solver - """ - self.data = self.solver.solve() - return self.data - - def update(self, t): - source = self.source(t) - bc_val = self.bc_val(t) - self.data()['param'].set_source(self.flux_disc(), source) - self.data()['param'].set_bc_val(self.flux_disc(), bc_val) - - def step(self): - return self.solver.step() - - #-----Parameters------------ - - def porosity(self): - return np.ones(self.grid().num_cells) - - def compressibility(self): - return 1 - - def permeability(self): - kxx = np.ones(self.grid().num_cells) - return tensor.SecondOrder(self.grid().dim, kxx) - - #----Boundary Condition----------- - - def bc(self): - dir_bound = np.array([]) - return bc.BoundaryCondition(self.grid(), dir_bound, - ['dir'] * dir_bound.size) - - def bc_val(self, t): - return np.zeros(self.grid().num_faces) - - #-----Sink and sources----------- - - def source(self, t): - f = np.zeros(self.grid().num_cells) - return f - - #-----Data----------------- - - def data(self): - return self._data - - def _set_data(self): - self._data['param'] = Parameters(self.grid()) - self._data['deltaT'] = self.time_step() - self._data['end_time'] = self.end_time() - self._data['param'].set_tensor(self.flux_disc(), self.permeability()) - self._data['param'].set_porosity(self.porosity()) - self._data['compressibility'] = self.compressibility() - self._data['param'].set_bc(self.flux_disc(), self.bc()) - self._data['param'].set_bc_val(self.flux_disc(), self.bc_val(0.0)) - #--------Initial conditions--------------- - - def initial_pressure(self): - return np.zeros(self.grid().num_cells) - - #---------Overloaded Functions----------------- - - def grid(self): - raise NotImplementedError('subclass must overload function grid()') - - #--------Time stepping------------ - - def time_step(self): - return 1.0 - - def end_time(self): - return 1.0 - - def save(self): - pressures = self.data['pressure'] - times = np.array(self.data['times']) - folder = self.parameters['folder_name'] - f_name = self.parameters['file_name'] - for i, p in enumerate(pressures): - data_to_plot = {'pressure': p} - export_vtk( - self.grid(), f_name, data_to_plot, time_step=i, folder=folder) - - export_pvd( - self.grid(), self.parameters['file_name'], times, folder=folder) - - -############################################################################### - - -class SubProblem(SlightlyCompressible): - def __init__(self, g): - self.g = g - SlightlyCompressible.__init__(self) - - def grid(self): - return self.g - - -class TpfaComp(tpfa.Tpfa): +class SlightlyCompressible(PdeProblem): def __init__(self, physics='flow'): - tpfa.Tpfa.__init__(self, physics) - - def matrix_rhs(self, g, data): - param = data['problem'].data() - return tpfa.Tpfa.matrix_rhs(self, g, param) + PdeProblem.__init__(self, physics) - -class TpfaCompCoupling(tpfa.TpfaCoupling): - def __init__(self, solver): - tpfa.TpfaCoupling.__init__(self, solver) - - def matrix_rhs(self, g_h, g_l, data_h, data_l, data_edge): - param_h = data_h['problem'].data() - param_l = data_l['problem'].data() - return tpfa.TpfaCoupling.matrix_rhs( - self, g_h, g_l, param_h, param_l, data_edge) - - -class SlightlyCompressibleMultiDim(): - """ - Base-class for slightly compressible flow. Initialize all needed - attributes for a slightly compressible solver. - """ - - def __init__(self): - self._data = dict() - self.set_sub_problems() - self.solver = solvers.Implicit(self) - self.solver.parameters['store_results'] = True - self.parameters = {'file_name': 'pressure'} - self.parameters['folder_name'] = 'results' - - #---------Discretization--------------- - - def flux_disc(self): - """ - Returns the flux discretization. - """ - discr = TpfaComp() - coupling_conditions = TpfaCompCoupling(discr) - return Coupler(discr, coupling_conditions) + def space_disc(self): + return self.diffusive_disc() def time_disc(self): """ - Returns the flux discretization. + Returns the time discretization. """ class TimeDisc(mass_matrix.MassMatrix): def __init__(self, deltaT): self.deltaT = deltaT def matrix_rhs(self, g, data): - sub_d = data['problem'].data() - sub_d['deltaT'] = self.deltaT - lhs, rhs = mass_matrix.MassMatrix.matrix_rhs(self, g, sub_d) - return lhs * sub_d['compressibility'], rhs * sub_d['compressibility'] + lhs, rhs = mass_matrix.MassMatrix.matrix_rhs(self, g, data) + return lhs * data['compressibility'], rhs * data['compressibility'] single_dim_discr = TimeDisc(self.time_step()) multi_dim_discr = Coupler(single_dim_discr) return multi_dim_discr - def solve(self): - """ - Call the solver - """ - self.data = self.solver.solve() - return self.data - - def update(self, t): - for _, d in self.grid(): - d['problem'].update(t) - - def step(self): - return self.solver.step() - - def reassemble(self): - return self.solver.reassemble() - - #-----Data----------------- - - def data(self): - return self._data - - def set_sub_problems(self): - self.grid().add_node_props(['problem']) - for g, d in self.grid(): - d['problem'] = SubProblem(g) - - #--------Initial conditions--------------- - - def initial_pressure(self): - for _, d in self.grid(): - d['pressure'] = d['problem'].initial_pressure() - global_pressure = self.time_disc().merge(self.grid(), 'pressure') - return global_pressure +class SubSlightlyCompressible(PdeSubProblem): + def __init__(self, g, data, physics='flow'): + PdeSubProblem.__init__(self, g, data, physics) - #---------Overloaded Functions----------------- - - def grid(self): - raise NotImplementedError('subclass must overload function grid()') - - #--------Time stepping------------ - - def time_step(self): - return 1.0 + def _set_data(self): + PdeSubProblem._set_data(self) + self.data()['compressibility'] = self.compressibility() - def end_time(self): + def compressibility(self): return 1.0 - def save(self, save_every=1): - pressures = self.data()['pressure'][::save_every] - times = np.array(self.data()['times'])[::save_every] - folder = self.parameters['folder_name'] - f_name = self.parameters['file_name'] - - for i, p in enumerate(pressures): - self.time_disc().split(self.grid(), 'pressure', p) - data_to_plot = ['pressure'] - export_vtk( - self.grid(), f_name, data_to_plot, time_step=i, folder=folder) + def permeability(self): + kxx = np.ones(self.grid().num_cells) + return tensor.SecondOrder(self.grid().dim, kxx) - export_pvd( - self.grid(), self.parameters['file_name'], times, folder=folder) + def diffusivity(self): + return self.permeability() diff --git a/src/porepy/numerics/fv/tpfa.py b/src/porepy/numerics/fv/tpfa.py index 637871da88..e820605c53 100644 --- a/src/porepy/numerics/fv/tpfa.py +++ b/src/porepy/numerics/fv/tpfa.py @@ -191,7 +191,7 @@ def discretize(self, g, data, faces=None): # Move Neumann faces to Neumann transmissibility bndr_ind = g.get_boundary_faces() t_b = np.zeros(g.num_faces) - t_b[bnd.is_dir] = t[bnd.is_dir] + t_b[bnd.is_dir] = -t[bnd.is_dir] t_b[bnd.is_neu] = 1 t_b = t_b[bndr_ind] t[np.logical_or(bnd.is_neu, is_not_active)] = 0 diff --git a/src/porepy/numerics/pdeproblem.py b/src/porepy/numerics/pdeproblem.py new file mode 100644 index 0000000000..331a1da4cd --- /dev/null +++ b/src/porepy/numerics/pdeproblem.py @@ -0,0 +1,149 @@ +import numpy as np +import scipy.sparse as sps + +from porepy.params.data import Parameters +from porepy.params import tensor, bc +from porepy.fracs import meshing +from porepy.numerics.fv import fvutils, tpfa, mass_matrix +from porepy.numerics.fv.transport import upwind, upwind_coupling +from porepy.numerics import pdesolver +from porepy.numerics.mixed_dim import coupler +from porepy.viz.exporter import export_vtk, export_pvd + + +class PdeProblem(): + def __init__(self, physics='transport'): + self.physics = physics + self._data = dict() + self.set_sub_problems() + self._set_data() + self._solver = self.solver() + self._solver.parameters['store_results'] = True + self.parameters = {'file_name': physics} + self.parameters['folder_name'] = 'results' + + def data(self): + return self._data + + def _set_data(self): + for _, d in self.grid(): + d['deltaT'] = self.time_step() + + def solve(self): + return self._solver.solve() + + def step(self): + return self._solver.step() + + def update(self, t): + for g, d in self.grid(): + d['problem'].update(t) + + def set_sub_problems(self): + self.grid().add_node_props(['problem']) + for g, d in self.grid(): + d['problem'] = PdeSubProblem(g, d) + + def solver(self): + return pdesolver.Implicit(self) + + def advective_disc(self): + advection_discr = upwind.Upwind(physics=self.physics) + advection_coupling = upwind_coupling.UpwindCoupling(advection_discr) + advection_solver = coupler.Coupler(advection_discr, advection_coupling) + return advection_solver + + def diffusive_disc(self): + diffusive_discr = tpfa.TpfaMultiDim(physics=self.physics) + return diffusive_discr + + def space_disc(self): + return self.advective_disc(), self.diffusive_disc() + + def time_disc(self): + """ + Returns the flux discretization. + """ + mass_matrix_discr = mass_matrix.MassMatrix() + multi_dim_discr = coupler.Coupler(mass_matrix_discr) + return multi_dim_discr + + def initial_condition(self): + for _, d in self.grid(): + d[self.physics] = d['problem'].initial_condition() + + global_variable = self.time_disc().merge(self.grid(), self.physics) + return global_variable + + def grid(self): + raise NotImplementedError('subclass must overload function grid()') + + def time_step(self): + return 1.0 + + def end_time(self): + return 1.0 + + def save(self, save_every=1): + variables = self.data()[self.physics][::save_every] + times = np.array(self.data()['times'])[::save_every] + folder = self.parameters['folder_name'] + f_name = self.parameters['file_name'] + + for i, p in enumerate(variables): + self.time_disc().split(self.grid(), self.physics, p) + data_to_plot = [self.physics] + export_vtk( + self.grid(), f_name, data_to_plot, time_step=i, folder=folder) + + export_pvd( + self.grid(), self.parameters['file_name'], times, folder=folder) + + +class PdeSubProblem(): + def __init__(self, g, data, physics='transport'): + self._g = g + self._data = data + self.physics = physics + self._set_data() + + def _set_data(self): + if 'param' not in self._data: + self._data['param'] = Parameters(self.grid()) + self._data['param'].set_tensor(self.physics, self.diffusivity()) + self._data['param'].set_porosity(self.porosity()) + self._data['param'].set_bc(self.physics, self.bc()) + self._data['param'].set_bc_val(self.physics, self.bc_val(0.0)) + + def update(self, t): + source = self.source(t) + bc_val = self.bc_val(t) + self.data()['param'].set_source(self.physics, source) + self.data()['param'].set_bc_val(self.physics, bc_val) + + def bc(self): + dir_bound = np.array([]) + return bc.BoundaryCondition(self.grid(), dir_bound, + ['dir'] * dir_bound.size) + + def bc_val(self, t): + return np.zeros(self.grid().num_faces) + + def initial_condition(self): + return np.zeros(self.grid().num_cells) + + def source(self, t): + return np.zeros(self.grid().num_cells) + + def data(self): + return self._data + + def grid(self): + return self._g + + def porosity(self): + return np.ones(self.grid().num_cells) + + def diffusivity(self): + kxx = np.ones(self.grid().num_cells) + return tensor.SecondOrder(self.grid().dim, kxx) diff --git a/src/porepy/numerics/compressible/solvers.py b/src/porepy/numerics/pdesolver.py similarity index 51% rename from src/porepy/numerics/compressible/solvers.py rename to src/porepy/numerics/pdesolver.py index fa9580e112..d6ffb4c153 100644 --- a/src/porepy/numerics/compressible/solvers.py +++ b/src/porepy/numerics/pdesolver.py @@ -9,7 +9,7 @@ from porepy.numerics.mixed_dim.solver import Solver -class Implicit(): +class AbstractSolver(): """ Class for solving slightly compressible flow using backward Euler. We solve the equation: @@ -27,7 +27,7 @@ def __init__(self, problem): problem.grid() problem.porosity() problem.compressibility() - problem.flux_disc() + problem.space_disc() problem.permeability() problem.time_step() problem.end_time() @@ -42,17 +42,17 @@ def __init__(self, problem): dt = problem.time_step() T = problem.end_time() data = problem.data() - data['pressure'] = [] + data[problem.physics] = [] data['times'] = [] problem.update(dt) - flux_disc = problem.flux_disc() + space_disc = problem.space_disc() time_disc = problem.time_disc() - p0 = problem.initial_pressure() + p0 = problem.initial_condition() p = p0 - data['pressure'].append(p) + data[problem.physics].append(p) data['times'].append(0.0) self.problem = problem @@ -60,11 +60,11 @@ def __init__(self, problem): self.data = data self.dt = dt self.T = T - self.flux_disc = flux_disc + self.space_disc = space_disc self.time_disc = time_disc self.p0 = p0 self.p = p - # First initial empty lhs and rhs, then initialize them throug + # First initial empty lhs and rhs, then initialize them through # reassemble self.lhs = [] self.rhs = [] @@ -101,7 +101,7 @@ def update(self, t): self.p0 = self.p # Store result if self.parameters['store_results'] == True: - self.data['pressure'].append(self.p) + self.data[self.problem.physics].append(self.p) self.data['times'].append(t) def reassemble(self): @@ -109,18 +109,127 @@ def reassemble(self): reassemble matrices. This must be called between every time step to update the rhs of the system. """ - lhs_flux, rhs_flux = self._discretize(self.flux_disc) + raise NotImplementedError( + 'subclass must overload function reasemble()') + + def _discretize(self, discs): + if isinstance(self.g, GridBucket): + if not isinstance(discs, tuple): + discs = [discs] + lhs, rhs = np.array(discs[0].matrix_rhs(self.g)) + for disc in discs[1:]: + lhs_n, rhs_n = disc.matrix_rhs(self.g) + lhs += lhs_n + rhs += rhs_n + else: + if not isinstance(discs, tuple): + discs = [discs] + lhs, rhs = discs[0].matrix_rhs(self.g, self.data) + for disc in discs[1:]: + lhs_n, rhs_n = disc.matrix_rhs(self.g, self.data) + lhs += lhs_n + rhs += rhs_n + return lhs, rhs + + +class Implicit(AbstractSolver): + def __init__(self, problem): + AbstractSolver.__init__(self, problem) + + def reassemble(self): + + lhs_flux, rhs_flux = self._discretize(self.space_disc) lhs_time, rhs_time = self._discretize(self.time_disc) self.lhs = lhs_time + lhs_flux self.rhs = lhs_time * self.p0 + rhs_flux + rhs_time - def _discretize(self, discr): - if isinstance(self.g, GridBucket): - lhs, rhs = discr.matrix_rhs(self.g) + +class BDF2(AbstractSolver): + def __init__(self, problem): + self.flag_first = True + AbstractSolver.__init__(self, problem) + self.p_1 = self.p0 + + def update(self, t): + """ + update parameters for next time step + """ + self.flag_first = False + self.p_1 = self.p0 + AbstractSolver.update(self, t) + + def reassemble(self): + + lhs_flux, rhs_flux = self._discretize(self.space_disc) + lhs_time, rhs_time = self._discretize(self.time_disc) + + if self.flag_first: + self.lhs = lhs_time + lhs_flux + self.rhs = lhs_time * self.p0 + rhs_flux + rhs_time else: - lhs, rhs = discr.matrix_rhs(self.g, self.data) - return lhs, rhs + self.lhs = lhs_time + 2 / 3 * lhs_flux + bdf2_rhs = 4 / 3 * lhs_time * self.p0 - 1 / 3 * lhs_time * self.p_1 + self.rhs = bdf2_rhs + 2 / 3 * rhs_flux + rhs_time + + +class Explicit(AbstractSolver): + def __init__(self, problem): + AbstractSolver.__init__(self, problem) + + def solve(self): + """ + Solve problem. + """ + t = self.dt + while t < self.T + 1e-14: + if self.parameters['verbose']: + print('solving time step: ', t) + self.step() + self.update(t - self.dt) + self.reassemble() + t += self.dt + return self.data + + def reassemble(self): + + lhs_flux, rhs_flux = self._discretize(self.space_disc) + lhs_time, rhs_time = self._discretize(self.time_disc) + + self.lhs = lhs_time + self.rhs = (lhs_time - lhs_flux) * self.p0 + rhs_flux + rhs_time + + +class CrankNicolson(AbstractSolver): + def __init__(self, problem): + self.g = problem.grid() + self.lhs_flux, self.rhs_flux = self._discretize(problem.space_disc()) + self.lhs_time, self.rhs_time = self._discretize(problem.time_disc()) + self.lhs_flux_0 = self.lhs_flux + self.rhs_flux_0 = self.rhs_flux + self.lhs_time_0 = self.lhs_time + self.rhs_time_0 = self.rhs_time + AbstractSolver.__init__(self, problem) + + def update(self, t): + """ + update parameters for next time step + """ + AbstractSolver.update(self, t) + self.lhs_flux_0 = self.lhs_flux + self.rhs_flux_0 = self.rhs_flux + self.lhs_time_0 = self.lhs_time + self.rhs_time_0 = self.rhs_time + + def reassemble(self): + self.lhs_flux, self.rhs_flux = self._discretize(self.space_disc) + self.lhs_time, self.rhs_time = self._discretize(self.time_disc) + + rhs1 = 0.5 * (self.rhs_flux + self.rhs_time) + rhs0 = 0.5 * (self.rhs_flux_0 + self.rhs_time_0) + self.lhs = self.lhs_time + 0.5 * self.lhs_flux + self.rhs = (self.lhs_time - 0.5 * self.lhs_flux_0) * \ + self.p0 + rhs1 + rhs0 if __name__ == '__main__': diff --git a/test/integration/test_compressible_flow.py b/test/integration/test_compressible_flow.py index 0a69250f11..b087ae2d30 100644 --- a/test/integration/test_compressible_flow.py +++ b/test/integration/test_compressible_flow.py @@ -1,27 +1,18 @@ import unittest import numpy as np -from porepy.numerics.compressible import problems, solvers +from porepy.numerics.compressible import problems from porepy.grids import structured from porepy.fracs import meshing from porepy.params import tensor class TestCompressibleFlow(unittest.TestCase): - def test_single_grid_problem(self): - problem = UnitSquareInjection() - solution = problem.solve() - p = solution['pressure'] - p0 = p[10] - pT = p[-1] - p_ref0, p_refT = _reference_solution_single_grid() - assert np.allclose(p0, p_ref0) - assert np.allclose(pT, p_refT) def test_3d_Fracture_problem(self): problem = UnitSquareInjectionMultiDim() solution = problem.solve() - p = solution['pressure'][-1] + p = solution['flow'][-1] problem.time_disc().split(problem.grid(), 'pressure', p) for g, d in problem.grid(): if g.dim == 3: @@ -33,68 +24,33 @@ def test_3d_Fracture_problem(self): ############################################################################### -class UnitSquareInjection(problems.SlightlyCompressible): - - def __init__(self): - nx = 11 - ny = 11 - - physdims = [1, 1] - - g = structured.CartGrid([nx, ny], physdims=physdims) - g.compute_geometry() - self.g = g - # Initialize base class - problems.SlightlyCompressible.__init__(self) - - #--------grid function-------- - - def grid(self): - return self.g - - #--------Inn/outflow terms--------------- - - def source(self, t): - f = np.zeros(self.g.num_cells) - source_cell = round(self.g.num_cells / 2) - f[source_cell] = 20 * self.g.cell_volumes[source_cell] # m**3/s - return f * (t < .05) - - #--------Time stepping------------ - def time_step(self): - return .005 - - def end_time(self): - return 0.1 - +class MatrixDomain(problems.SubSlightlyCompressible): + def __init__(self, g, d): + problems.SubSlightlyCompressible.__init__(self, g, d) -class MatrixDomain(problems.SubProblem): - def __init__(self, g): - problems.SubProblem.__init__(self, g) - -class FractureDomain(problems.SubProblem): - def __init__(self, g): - problems.SubProblem.__init__(self, g) +class FractureDomain(problems.SubSlightlyCompressible): + def __init__(self, g, d): + problems.SubSlightlyCompressible.__init__(self, g, d) aperture = np.power(0.001, 3 - g.dim) self.data()['param'].set_aperture(aperture) def permeability(self): - kxx = 1000 * np.ones(self.g.num_cells) + kxx = 1000 * np.ones(self.grid().num_cells) return tensor.SecondOrder(3, kxx) class IntersectionDomain(FractureDomain): - def __init__(self, g): - FractureDomain.__init__(self, g) + def __init__(self, g, d): + FractureDomain.__init__(self, g, d) def source(self, t): - assert self.g.num_cells == 1, '0D grid should only have 1 cell' - f = .4 * self.g.cell_volumes # m**3/s + assert self.grid().num_cells == 1, '0D grid should only have 1 cell' + f = .4 * self.grid().cell_volumes # m**3/s return f * (t < .05) -class UnitSquareInjectionMultiDim(problems.SlightlyCompressibleMultiDim): +class UnitSquareInjectionMultiDim(problems.SlightlyCompressible): def __init__(self): @@ -109,7 +65,7 @@ def __init__(self): self.g = g # Initialize base class - problems.SlightlyCompressibleMultiDim.__init__(self) + problems.SlightlyCompressible.__init__(self, 'flow') #--------grid function-------- @@ -120,11 +76,11 @@ def set_sub_problems(self): self.grid().add_node_props(['problem']) for g, d in self.grid(): if g.dim == 3: - d['problem'] = MatrixDomain(g) + d['problem'] = MatrixDomain(g, d) elif g.dim == 2 or g.dim == 1: - d['problem'] = FractureDomain(g) + d['problem'] = FractureDomain(g, d) elif g.dim == 0: - d['problem'] = IntersectionDomain(g) + d['problem'] = IntersectionDomain(g, d) else: raise ValueError('Unkown grid-dimension %d' % g.dim) #--------Time stepping------------ @@ -138,60 +94,6 @@ def end_time(self): ############################################################################### -def _reference_solution_single_grid(): - pT = np.array([0.00621076, 0.0064875, 0.00695763, 0.00747579, 0.00787619, - 0.00802654, 0.00787619, 0.00747579, 0.00695763, 0.0064875, - 0.00621076, 0.0064875, 0.00679082, 0.00730681, 0.00787666, - 0.00831785, 0.00848373, 0.00831785, 0.00787666, 0.00730681, - 0.00679082, 0.0064875, 0.00695763, 0.00730681, 0.00790215, - 0.00856158, 0.00907363, 0.00926651, 0.00907363, 0.00856158, - 0.00790215, 0.00730681, 0.00695763, 0.00747579, 0.00787666, - 0.00856158, 0.00932247, 0.00991504, 0.01013867, 0.00991504, - 0.00932247, 0.00856158, 0.00787666, 0.00747579, 0.00787619, - 0.00831785, 0.00907363, 0.00991504, 0.01057172, 0.01081989, - 0.01057172, 0.00991504, 0.00907363, 0.00831785, 0.00787619, - 0.00802654, 0.00848373, 0.00926651, 0.01013867, 0.01081989, - 0.01107748, 0.01081989, 0.01013867, 0.00926651, 0.00848373, - 0.00802654, 0.00787619, 0.00831785, 0.00907363, 0.00991504, - 0.01057172, 0.01081989, 0.01057172, 0.00991504, 0.00907363, - 0.00831785, 0.00787619, 0.00747579, 0.00787666, 0.00856158, - 0.00932247, 0.00991504, 0.01013867, 0.00991504, 0.00932247, - 0.00856158, 0.00787666, 0.00747579, 0.00695763, 0.00730681, - 0.00790215, 0.00856158, 0.00907363, 0.00926651, 0.00907363, - 0.00856158, 0.00790215, 0.00730681, 0.00695763, 0.0064875, - 0.00679082, 0.00730681, 0.00787666, 0.00831785, 0.00848373, - 0.00831785, 0.00787666, 0.00730681, 0.00679082, 0.0064875, - 0.00621076, 0.0064875, 0.00695763, 0.00747579, 0.00787619, - 0.00802654, 0.00787619, 0.00747579, 0.00695763, 0.0064875, - 0.00621076]) - p0 = np.array([0.00163541, 0.00196744, 0.00257963, 0.00333943, 0.00400819, - 0.00428807, 0.00400819, 0.00333943, 0.00257963, 0.00196744, - 0.00163541, 0.00196744, 0.00243047, 0.00331231, 0.00446589, - 0.00555531, 0.00605294, 0.00555531, 0.00446589, 0.00331231, - 0.00243047, 0.00196744, 0.00257963, 0.00331231, 0.00477516, - 0.00684537, 0.00903211, 0.010208, 0.00903211, 0.00684537, - 0.00477516, 0.00331231, 0.00257963, 0.00333943, 0.00446589, - 0.00684537, 0.01056736, 0.01517516, 0.01844586, 0.01517516, - 0.01056736, 0.00684537, 0.00446589, 0.00333943, 0.00400819, - 0.00555531, 0.00903211, 0.01517516, 0.02468009, 0.0353479, - 0.02468009, 0.01517516, 0.00903211, 0.00555531, 0.00400819, - 0.00428807, 0.00605294, 0.010208, 0.01844586, 0.0353479, - 0.07602835, 0.0353479, 0.01844586, 0.010208, 0.00605294, - 0.00428807, 0.00400819, 0.00555531, 0.00903211, 0.01517516, - 0.02468009, 0.0353479, 0.02468009, 0.01517516, 0.00903211, - 0.00555531, 0.00400819, 0.00333943, 0.00446589, 0.00684537, - 0.01056736, 0.01517516, 0.01844586, 0.01517516, 0.01056736, - 0.00684537, 0.00446589, 0.00333943, 0.00257963, 0.00331231, - 0.00477516, 0.00684537, 0.00903211, 0.010208, 0.00903211, - 0.00684537, 0.00477516, 0.00331231, 0.00257963, 0.00196744, - 0.00243047, 0.00331231, 0.00446589, 0.00555531, 0.00605294, - 0.00555531, 0.00446589, 0.00331231, 0.00243047, 0.00196744, - 0.00163541, 0.00196744, 0.00257963, 0.00333943, 0.00400819, - 0.00428807, 0.00400819, 0.00333943, 0.00257963, 0.00196744, - 0.00163541]) - return p0, pT - - def _reference_solution_multi_grid(): pT = np.array([0.00983112, 0.01637886, 0.01637886, 0.00983112, 0.01637886, 0.02264049, 0.02264049, 0.01637886, 0.01637886, 0.02264049, diff --git a/test/unit/test_tpfa.py b/test/unit/test_tpfa.py index 7045adb50a..5205895a67 100644 --- a/test/unit/test_tpfa.py +++ b/test/unit/test_tpfa.py @@ -40,8 +40,8 @@ def test_tpfa_cart_2d(): trm, bound_flux = d['flux'], d['bound_flux'] div = g.cell_faces.T a = div * trm - b = (div * bound_flux).A - print(b) + b = -(div * bound_flux).A + # Checks on interior cell mid = 4 assert a[mid, mid] == 4 @@ -67,14 +67,14 @@ def test_tpfa_cart_2d(): assert a[2, 5] == -1 assert b[2, 3] == 2 - assert b[2, 14] == 1 + assert b[2, 14] == -1 # Cell 2 has one Neumann face assert a[1, 1] == 3 assert a[1, 0] == -1 assert a[1, 2] == -1 assert a[1, 4] == -1 - assert b[1, 13] == 1 + assert b[1, 13] == -1 return a diff --git a/tutorials/slightly compressible flow .ipynb b/tutorials/slightly compressible flow .ipynb index 584bc6eadc..a8587c40ce 100644 --- a/tutorials/slightly compressible flow .ipynb +++ b/tutorials/slightly compressible flow .ipynb @@ -44,17 +44,15 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", - "from porepy.numerics.compressible.problems import SlightlyCompressible\n", - "\n", - "from porepy.grids import structured\n", + "from porepy.numerics.compressible.problems import SlightlyCompressible, SubSlightlyCompressible\n", + "from porepy.fracs import meshing\n", + "from porepy.params import tensor\n", "from porepy.viz import plot_grid" ] }, @@ -63,180 +61,36 @@ "metadata": {}, "source": [ "# Define problem:\n", - "We define our problem in the unit square. We let our problem inherit from the compressible problem base class to set default values." + "We define our problem in the unit square. We let our problem inherit from the compressible problem base class to set default values. We create two different types of problems, one for the fractures, and one for the matrix. For the fractures we use all the standard parameters, but we set the apperture to 0.01. We also define a source term in the intersection of the two fractures" ] }, { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class UnitSquareInjection(SlightlyCompressible):\n", - "\n", - " def __init__(self):\n", - " nx = 11\n", - " ny = 11\n", - "\n", - " physdims = [1, 1]\n", - "\n", - " g = structured.CartGrid([nx, ny], physdims=physdims)\n", - " g.compute_geometry()\n", - " self.g = g\n", - " # Initialize base class\n", - " SlightlyCompressible.__init__(self)\n", - "\n", - " #--------grid function--------\n", - " \n", - " def grid(self):\n", - " return self.g\n", - "\n", - " #--------Inn/outflow terms---------------\n", - "\n", - " def source(self, t):\n", - " f = np.zeros(self.g.num_cells)\n", - " source_cell = round(self.g.num_cells / 2)\n", - " f[source_cell] = 20*self.g.cell_volumes[source_cell] # m**3/s\n", - " return f * (t < .05)\n", - "\n", - " #--------Parameters------------\n", - " \n", - " def porosity(self):\n", - " return np.ones(self.g.num_cells)\n", - " \n", - " #--------Time stepping------------\n", - " def time_step(self):\n", - " return .001\n", - "\n", - " def end_time(self):\n", - " return 0.1\n" - ] - }, - { - "cell_type": "markdown", "metadata": {}, - "source": [ - "We can now initialize the problem and solve" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, "outputs": [], "source": [ - "problem = UnitSquareInjection()\n", - "problem.solve()\n", - "pressures = problem.data['pressure']\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we plot the solution" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt8VNW5+P/Pk0wSEsCABFAIV4NosBQwQKjairaAVIMe\nQRCPygulXuClx7YiPd7Qakt/VfRUQI9Ai5dKsHxrSSuiItUeKbdQtAoIiVwToBAwEBJymzy/P2aS\nToZkMjsMk8nwvF+v/WJm77X3Wns2ebKzZq/1iKpijDHm7Itp6QYYY8y5wgKuMcaEiQVcY4wJEwu4\nxhgTJhZwjTEmTCzgGmNMmFjANcacE0RkjIjsEJF8EZnVwPYEEVnm3b5BRHr7be8pIidF5KfBHtOf\nBVxjTNQTkVhgPnAdkA7cKiLpfsXuAr5R1TTgBeBXfttfAN5zeMx6LOAaY84Fw4B8Vd2lqpVANjDO\nr8w44DXv6+XAtSIiACJyI7AL2OrwmPW4HDbahqUZY4IlZ7JzmoiWBVn2oCcQlvuselVVX/V53x3Y\n7/O+ABjud5i6MqpaLSLHgU4icgp4BPgB8NOGygc4Zj1OA64xxoRFGXBPkGVnQ7mqZgQo0lDw97+B\nbKzMU8ALqnrSe8Pr5Jj1WMA1xkQkIaQBqgDo4fM+FTjQSJkCEXEBycAxPHet40Xk/wM6ADUiUg5s\nDuKY9VjANcZEpBggMXSH2wT0E5E+QCEwCZjsVyYHuBNYB4wH1qhndq+raguIyGzgpKrO8wblpo5Z\njwVcY0xEEiAuRMfy9snOAN4HYoHfqupWEXkayFXVHGAx8IaI5OO5s53UnGMG2kccTs9oX5oZY4J1\nRl+a9RLRJh9s9bofNjfRhxsR7A7XGBORQnmHGyks4BpjIlKIvzSLCNF2PsaYKGF3uMYYEyYhfkoh\nIljANcZEJLvDNcaYMIq2ABVt52OMiRJ2h2uMMWFiTykYY0yY2JdmxhgTJtalYIwxYWJdCsYYEyZ2\nh2uMMWFid7jGGBMmdodrjDFhIkTfUwqWtdecFb///e8ZNWpUSzfDtGICxLmCW1oLC7imSVdffTWL\nFi1qdPuePXsQEaqrq+vW3XbbbXzwwQfhaF6D7Rk5ciRJSUlccsklrF69utGyFRUVTJ06lfPOO48L\nLriAuXPn1juOiNCuXbu65ec//3k4TsEAIuByBbe0Fq2oqa1DdXU1rhb+HxAJbWhJt956KyNGjGDl\nypWsXLmS8ePHk5eXR+fOnU8rO3v2bPLy8ti7dy+HDh1i5MiRpKenM2bMmLoyxcXF5/Tn2VJEIC62\npVsRYqrqZDkn9erVS3/xi1/opZdeqh06dNApU6boqVOnVFX1r3/9q3bv3l3nzJmjXbt21f/8z/9U\nVdU///nP+u1vf1uTk5N1xIgR+vnnn9cdb86cOdqtWzdt166dXnzxxbp69WpVVd2wYYNefvnl2r59\ne+3SpYs+9NBD9erwb9OHH36oqqpPPvmk3nzzzXrbbbdp+/btdeHChep2u/WXv/yl9u3bV88//3yd\nMGGCHj16tMHzO3bsmP7whz/UlJQU7dChg/7whz/U/fv3q6rqf//3f2tMTIwmJCRo27Ztdfr06aft\n36NHDwU0JiZG27Ztqx999JF269ZNBw8eXFcG0Pnz52taWpq2a9dOH3vsMc3Pz9fMzExt3769Tpgw\nQSsqKurKB/r8AtmxY4fGx8friRMn6tZdeeWV+vLLLzdYvlu3bvr+++/XvX/sscd04sSJqqq6e/du\nBbSqqiqouhu7rucwp/Gl3jIkFq1MDm7Bk5cs4PGAMcAOIB+Y1cD2BGCZd/sGoLd3/TDgM+/yOXCT\nzz57gC+825pug8MP4ZzUq1cvHTBggO7bt0+PHj2q3/nOd/TRRx9VVU8wjI2N1ZkzZ2p5ebmWlZXp\n5s2btXPnzrp+/Xqtrq7WJUuWaK9evbS8vFy/+uorTU1N1cLCQlX1/FDn5+erqmpmZqa+/vrrqqpa\nUlKi69atq6ujqYDrcrn0nXfeUbfbrWVlZfrCCy/o8OHDdf/+/VpeXq4/+tGPdNKkSQ2eX1FRkS5f\nvlxLS0v1xIkTOn78eB03blzd9u9973u6cOHCRj+f2sD0s5/9TH/yk5/o/fffrzfffLNeccUVdWUA\nveGGG/T48eP65Zdfanx8vF5zzTX69ddfa3FxsV566aW6ZMkSVdWAn5+q6n333af33Xdfg2354x//\nqJdcckm9ddOnT9cZM2acVvbYsWMK6KFDh+rW/eEPf9DLLrus3nl169ZNu3fvrlOmTNEjR440WG+g\n63oOO6OAe7kL1S7BLU0FOzxJHr8G+gLx3sCZ7lfmfuAV7+tJwDLv6yTA5X19IXDY5/0eICXYc7I+\n3CDNmDGDHj16cP755/Poo4+ydOnSum0xMTE89dRTJCQkkJiYyMKFC7nnnnsYPnw4sbGx3HnnnSQk\nJLB+/XpiY2OpqKhg27ZtVFVV0bt3by666CIA4uLiyM/Pp6ioiHbt2pGZmRl0+0aMGMGNN95ITEwM\niYmJ/O///i/PPvssqampJCQkMHv2bJYvX16vn7VWp06duPnmm0lKSqJ9+/Y8+uijfPLJJ44/o8ce\ne4wPP/yQ3Nxcxo4de9r2Rx55hPPOO48BAwZw2WWXMWrUKPr27UtycjLXXXcdW7ZsAQj4+QEsWLCA\nBQsWNNiGkydPkpycXG9dcnIyJSUlDZat3d5Q2ZSUFDZt2sTevXvZvHkzJSUl3HbbbQ3WG+i6mmaq\nfRA3mKVpw4B8Vd2lqpVANjDOr8w44DXv6+XAtSIiqlqmqrU/OG04g2S6FnCD1KNHj7rXvXr14sCB\nA3XvO3fuTJs2bere7927l+eff54OHTrULfv37+fAgQOkpaXx4osvMnv2bLp06cKkSZPqjrV48WJ2\n7tzJJZdcwtChQ/nLX/7SrPbVtuGmm26qq//SSy8lNjaWf/3rX6ftW1ZWxj333EOvXr0477zz+O53\nv0txcTFutzvo+gGOHTvGyZMnKSkpoaqq6rTtXbt2rXudmJh42vvaABjo82tKu3btOHHiRL11J06c\noH379g2Wrd3eUNl27dqRkZGBy+Wia9euzJs3jw8++OC04wMBr6tpptAG3O7Afp/3Bd51DZbxBtjj\nQCcAERkuIlvxdB/c6xOAFfhARDaLyI+aaoQF3CDt3//va7Vv3z66detW916kfjboHj168Oijj1Jc\nXFy3lJWVceuttwIwefJkPv30U/bu3YuI8MgjjwDQr18/li5dyuHDh3nkkUcYP348paWltG3blrKy\nsrrju91ujhw5Uq/Ohtrw3nvv1WtDeXk53bv7/x+D559/nh07drBhwwZOnDjB3/72N4DaP7NOO7a/\n2u333nsvP//5z7ntttt4++23A+4TSFOfXyADBgxg165d9e5oP//8cwYMGHBa2Y4dO3LhhRfy+eef\nN1kW/n2etZ+Lv8auqzkDwQfcFBHJ9Vn8g19D/4n9L2SjZVR1g6oOAIYCPxOR2jusK1R1CHAdMF1E\nvhvodCzgBmn+/PkUFBRw7NgxfvGLXzBx4sRGy06bNo1XXnmFDRs2oKqUlpby7rvvUlJSwo4dO1iz\nZg0VFRW0adOGxMREYmM9X8W++eabHDlyhJiYGDp06AB4/lS9+OKLKS8v591336WqqopnnnmGioqK\ngO299957efTRR9m7dy8AR44cYcWKFQ2WLSkpITExkQ4dOnDs2DGeeuqpetu7du3Krl27Gq2rc+fO\niAgVFRVMnjyZWbNmsXv3bo4fPx6wjY0J9Pk15eKLL2bQoEE89dRTlJeX88477/DPf/6Tm2++ucHy\nd9xxB8888wzffPMNX331FQsXLmTKlCkAbNiwgR07dlBTU8PRo0d54IEHuPrqq0/rsgACXlfTTIKn\n5zWYBYpUNcNnedXvaAWA75+BqYD/nyB1ZUTEBSQDx3wLqOp2oBS4zPv+gPffw8A7eLouGmUBN0iT\nJ0+u63Ps27cvjz32WKNlMzIyWLhwITNmzKBjx46kpaWxZMkSwPPc56xZs0hJSeGCCy7g8OHD/OIX\nvwBg1apVDBgwgHbt2vHggw+SnZ1NmzZtSE5OZsGCBdx99910796dtm3bkpqaGrC9Dz74IFlZWYwa\nNYr27duTmZnJhg0bGiz7X//1X5w6dYqUlBQyMzPrPRJVe6zly5fTsWNHHnjggdP2T0pK4rHHHuOz\nzz6jQ4cObNq0iSeeeKLBwBSMQJ8feH6Z3HvvvY3un52dTW5uLh07dmTWrFksX7687pGw3//+9/Xu\nYJ966ikuuugievXqxfe+9z0efvjhuvPftWsXY8aMoX379lx22WUkJCTU67v3Fei6mmYKbZfCJqCf\niPQRkXg8X4rl+JXJAe70vh4PrFFV9e7jAhCRXkB/YI+ItBWR9t71bYFRwJcBT6mxP48a0ezO4tas\nd+/eLFq0iO9///st3RRjWpPAfVFNyEgSze0fZEWfsVlVMwKWERkLvIjnnvi3qvqsiDyN5wmHHG83\nwRvAYDx3tpNUdZeI3A7MAqqAGuBpVf2TiPTFc1cLnrD/lqo+G6gN9jS3MSYyhXi6MFVdCaz0W/eE\nz+tyYEID+72BJxD7r98FfNtJGyzgGmMiUxTOzxhlp3N27Nmzp6WbYMy5Kcq+d7SAa4yJTHaHa4wx\nYWIB1xhjwkTwTCcTRSzgGmMiUxTe4drAhyCtWrWK/v37k5aWxpw5c07bXlFRwcSJE0lLS2P48OFn\n9EVbU3XNnTuX9PR0Bg4cyLXXXls3muxs1FVr+fLliAi5ubnNrivY+t5++23S09MZMGAAkydPPmt1\n7du3j5EjRzJ48GAGDhzIypUrGzhKcKZOnUqXLl247LLLGtyuqjzwwAOkpaUxcOBA/vGPfzS7rnNG\naAc+RAaHU6adk6qrq7Vv37769ddfa0VFhQ4cOFC3bt1ar8z8+fP1nnvuUVXVpUuX6i233HLW6lqz\nZo2WlpaqquqCBQvOal2qqidOnNCrrrpKhw8frps2bWpWXcHWt3PnTh00aJAeO3ZMVVX/9a9/nbW6\npk2bpgsWLFBV1a1bt2qvXr2aVZeq6ieffKKbN2/WAQMGNLj93Xff1TFjxmhNTY2uW7dOhw0b1uy6\nWpEzm56xI6oTglsIYi7aSFjsDtdPVVUV1dXV9SYo2bhxI2lpafTt25f4+HgmTZp02rwEK1as4M47\nPaMCx48fz0cffdToJCeBBFNXbfoYgMzMTAoKChzXE2xdAI8//jgzZ86sNyPa2apv4cKFTJ8+nY4d\nOwLQpUuXs1aXiNTN/HX8+PF6ExI59d3vfpfzzz+/0e0rVqzgjjvuQETIzMykuLiYgwcPNru+c0IU\n3uFawPXjdrvZvXt3vaBbWFhYb/rD1NRUCgsL6+3nW8blcpGcnMzRo0cd1x9MXb4WL17Mdddd57ie\nYOvasmUL+/fv5/rrr29WHU7r27lzJzt37uSKK64gMzOTVatWnbW6Zs+ezZtvvklqaipjx47lpZde\nalZdoWqP8VP7pVkwSythAddPTU0NBQUFVFdX8/XXX/vOBl+P/5SFwZQJhpPjvPnmm+Tm5vLwww87\nrieYumpqanjooYd4/vnnm3V8p/WBJx9bXl4eH3/8MUuXLuXuu++muLj4rNS1dOlSpkyZQkFBAStX\nruT222+npqbGcV2hao/xY3e40e/o0aOUlpZSVVXF/v37yc/Pp1u3bvXmwy0oKDjtz8/U1NS6MtXV\n1Rw/fjzgn5iN8T1OY3UBrF69mmeffZacnBwSEpr3K76pukpKSvjyyy+5+uqr6d27N+vXrycrK6vZ\nX5wFc26pqamMGzeOuLg4+vTpQ//+/cnLyzsrdS1evJhbbrkF8GTMKC8vp6ioyHFdoWqP8WMBN/p1\n7tyZhIQEcnNzcbvdFBQUMHDgQPLy8ti9ezeVlZVkZ2eTlZVVb7+srCxee82TnWP58uVcc801zbqD\nGTp0aJN1bdmyhXvuuYecnJxm93EGU1dycjJFRUXs2bOHPXv2kJmZSU5ODhkZASdlOqNzu/HGG/nr\nX/8KQFFRETt37qRv375npa6ePXvy0UcfAbB9+3bKy8sbzOwbCllZWbz++uuoKuvXryc5OZkLL7zw\nrNQVVaIs4LaipoaPy+Vi0KBBrF27lri4OFwuF88//zyjRo2ipqaGqVOnMmDAAC666CJeeOEFsrKy\nuOuuu7j99ttJS0vj/PPPJzs7u9l1z5s3j9GjR+N2u+vqeuKJJ/jLX/7CP/7xDx5++GFOnjzJhAme\niY169uxJTo7/1J6hqSuUgqlv9OjRfPDBB6SnpxMbG8uvf/1rOnXqFNK6MjIyWLBgAXPnzmXatGm8\n8MILiAhLlixp9p/5t956Kx9//DFFRUWkpqby1FNP1aUZ+tOf/sR7773HypUrSUtLIykpid/97nfN\nquecUjsBeRSx+XD9lJeXs27dOr7zne+wdu1aysvL6dKlCydOnKBHjx707NmT+Ph4RISMjIwzfi41\nWDU1NQwbNixs9UXzubndboYPHx6W+sJ9bhHmzObDvUA09z+DrOj5pufDjQR2hxuAiJCYmEhycjKH\nDh1i3759AEyfPp2ioiKOHj3KkCFDwtKWzMxM9uzZE7b6wnluQ4YMYe/evWGrb9q0aWzbti0s9X3r\nW99i3759dXXt27fvrPUTRx0b2ntu6tmzJ3v37qWsrIzdu3fzhz/8gerqaiZOnMiyZcvC0obCwkL2\n7t3L66+/Hpb6wnluhw4d4sCBA7zxxmlzPJ8VW7ZsYfTo0SxatOis13X48GGOHDnCG2+8gYhY1hAn\nonBob5SdztkTGxtL27ZtKS8vZ/v27dTU1PD3v28gJSXF6ZEAJ+nHXUB13bvg6qu/T3PLB64rDk/G\nEScCt+v0+pyeh7N9/vSnP+H8euB4n8TEduzYsYOf/OQnfPXVV2RkZJCSktLsZ4zPGRZwz221XQxD\nhgyhurqaU6dOAk6/HGsod10gWcCnDuu4EtjpoPzFgNNBGp2AsiZL1ZfksJ5OODsP8JyLk8/rSpxd\nD/Bck+Cv+6lTkxg0aBAfffQRV1555bnan+tcFAZceyzMmBZmE98EEHya9CaJyBgR2SEi+SIyq4Ht\nCSKyzLt9g4j09q4fJiKfeZfPReSmYI/pzwKuMS1sypQpAbsX3nvvPfLy8sjLy+PVV1/lvvvuC2Pr\nWlAIBz6ISCwwH7gOSAduFZF0v2J3Ad+oahrwAvAr7/ovgQxVHQSMAf5XRFxBHrMeC7jGtDCb+KYR\noZ1LYRiQr6q7VLUST5/QOL8y44DXvK+XA9eKiKhqmarWfjHQhn8/HhvMMeuxgGtMhDtnJ75xdoeb\nIiK5PsuP/I7WHdjv877Au67BMt4AexzPFwmIyHAR2Qp8Adzr3R7MMeuJsi5pY6LPOTvxjbMvzYqa\nGPjQ0Afm/8E2WkZVNwADRORS4DUReS/IY9Zjd7jGRLhzduKb2qG9ofnSrADo4fM+FTjQWBkRcQHJ\nwDHfAqq6HSgFLgvymPVYwDUmwp2zE9+EdrawTUA/EekjIvE0/HxmDnCn9/V4YI2qqncfF4CI9AL6\nA3uCPGY91qVgTAsLNPHNvffey9ixY8/NiW8Ez1dUIaCq1SIyA3gfzz3xb1V1q4g8jSc9Tw6wGHhD\nRPLx3NlO8u5+JTBLRKqAGuB+VS0CaOiYgdphAfeMxPLva+Jkn6wmS9Uvf2Uz6rjYQXkX3u8GHO6T\n1Ix9nNTj9Dxq93HyeTm9HrX7OLnugf/mXbp0acDtIsL8+fMd1BclQjxbmKquBFb6rXvC53U5MKGB\n/d4AGhx33tAxA7GAe0bcNG+U0l8dlB9J80ZbOZnYTaC9w4ngSgQudLjPQYf1lAjOJ6gTnI+yc3I9\nwHNNnI4WNI5F4UizKDsdY0xUibIIFWWnY4yJGlE4AbkFXGNMZLIuBWOMCRObgNwYY8LE7nCNMSZM\nLOBGv4qKCmpqalq6GcYYC7jRr7KyklOnTvHZZ5/hdruJjY2yr0mNaU2i7MfP5lLw0759e9q2bUuv\nXr2oqKigrKyMo0edpp8xxpyx0M6lEBFaUVPDq2PHjiQlJeF2uyksLKS0tJT4+HhcLt+PrLnDQkc6\nLO90eKuLhmeOC1C+xOl0fy7PyDGn+ziqx+l5gPPPy+n1qN3H6fBs45g9pXDuiY2NZeDAgXz66adU\nVlZSUVHBunXrvHOUuglPgsdmDG/9loN9vhC4z2EdLwvMcbjPLIf1vOzwPMBzLk6HNYchUeXGjRuJ\ni4tzWM85zvpwz10xMTG0adMGVWXYsGG43U5Ta5tzWUZGBjfddJOlSXciCgOu9eE6JCLExsYSE2Mf\nnQleTEwMK1as4JJLLiE3N/e0YLtq1Sr69+9PWloac+bMOW3/ffv2MXLkSAYPHszAgQNZuTLoCapa\nryjsw7WoYUwLc7vdTJ8+nffee49t27axdOlStm3bVq/MM888wy233MKWLVvIzs7m/vvvb6HWhpfG\nBre0Fq3od4Mx0Wnjxo2kpaXRt29fACZNmsSKFStIT/93xm0R4cSJEwAcP378nEixozFQGaIJyCOF\nBVxjWlhDWXk3bNhQr8zs2bMZNWoUL730EqWlpaxevTrczQw7FaiODfaP8NYxWMm6FIxpYcFk5V26\ndClTpkyhoKCAlStXcvvtt0f9iEgVwe1yBbW0FhZwjWlhwWTlXbx4MbfccgsAI0aMoLy8nKKiorC2\nsyW4Y2ODWoIhImNEZIeI5IvIrAa2J4jIMu/2DSLS27v+ByKyWUS+8P57jc8+H3uP+Zl36RKoDRZw\njWlhQ4cOJS8vj927d1NZWUl2djZZWfUHVvTs2ZOPPvoIgO3bt1NeXk7nzp1borlhowhuYoNamiIi\nscB84DogHbhVRNL9it0FfKOqacALwK+864uAG1T1W3iy+vrnN7tNVQd5l8OB2tF67sUjkovwJHhs\nxoiuLxzsIy7PIAMnYlyegQxOOK7H4XnU7uPo8wpHosrAP2Yul4t58+YxevRo3G43U6dOZcCAATzx\nxBNkZGSQlZXF888/z7Rp03jhhRcQEZYsWXJat0O0UYTq0I3SGwbkq+ouABHJBsYBvo+DjANme18v\nB+aJiKjqFp8yW4E2IpKgqhVOG2EB94xUE5YEj80ZbfU/DvZ5UEjVPEdVFEg/pujLjvZZIvc5qqdA\n+jk7D4AHmzHKLiyJKgMbO3YsY8eOrbfu6aefrnudnp7O2rVrHdTZ+ilCZfBje1NEJNfn/auq+qrP\n++7Afp/3BcBwv2PUlfGmVT+OJ820b9/NzcAWv2D7OxFxA/8PeEYb6pT3soBrjIlItV0KQSpS1YwA\n2xv6c8A/MAYsIyID8HQzjPLZfpuqFopIezwB93bg9cYaYX24xpiIFao+XDx3tD183qcCBxorIyIu\nIBk45n2fCrwD3KGqX9fuoKqF3n9LgLfwdF00ygKuMSYi1fbhBrMEYRPQT0T6iEg8MAnI8SuTg+dL\nMYDxwBpVVRHpALwL/ExV6/p1RMQlIine13HA9cCXgRphXQrGmIjk6VIITYjy9snOAN7H863nb1V1\nq4g8DeSqag6wGHhDRPLx3NlO8u4+A0gDHheRx73rRgGlwPveYBsLrAYWBmqHBVxjTETyfGkWH7rj\nqa4EVvqte8LndTkwoYH9ngGeaeSwlztpgwVcY0xEUgjlY2ERwQKuMSZCha5LIVJE19kYY6KGw8fC\nWgULuGfERVjyjTkdbRXj8gwACLqKWM8gAwfEFcMSuc9Zu5zW4/Q8PJU4/LzCkTfNfsyaywKu8VEN\nOM3o2wnaOxjZVNK8fGNOR3Tt1YBzbpymlxxGL3XWLNnudlRPLzncrBFwjvOmObke4E2E6eS6d3J2\nfAPYHe454cSJE5SXl1NQUIDb7bZUOsa0EEWoiLK0vRZw/SQmJuJyuXC73VRVVeF2u1m7di1lZWXE\nxMQQExPDnj17on4uUhNa+/bts1/eDkXjHa79D/ATFxeHy+WiV69etGnThrZt23LFFVeQlJREfHw8\nMTExuFwuXK1o0mPT8lwuF3fffXdd1t4xY8a0dJMiXiinZ4wUFnCDVJutNy4ujtTU1HMip5QJnW7d\nurFq1apmZ+0FePvtt0lPT2fAgAFMnjw5HM1ucSEc2hsR7DbNmBZWm7X3ww8/JDU1laFDh5KVlVUv\niWReXh6//OUvWbt2LR07duTw4YDzXEeFUA7tjRR2h2tMC/PN2hsfH1+XtdfXwoULmT59Oh07dgSg\nSxdnT5W0RtalYIwJuYay9hYWFtYrs3PnTnbu3MkVV1xBZmbmaV0S0cjzlEJ8UEtrEV3368a0QsFk\n7a2uriYvL4+PP/6YgoICrrrqKr788ks6dOgQrmaGXTR2KUTX2YSdC+cPtbu8D84HqTn5xhyO6Ip1\neQYZOKoCkO0Om+W0nmaMgCOmGXnTnFyP2n0cXffAP2bBZO1NTU0lMzOTuLg4+vTpQ//+/cnLy2Po\n0KEO2tH6tKbugmBYwD0j1UCZw32S4EIHI5sOCsxxOBJqljjKN7ZE7mvGqLF/Z9sL1uxqHNUj293N\nypvm6POaJc6uB3iuiaPrnhRwq2/W3u7du5Odnc1bb71Vr8yNN97I0qVLmTJlCkVFRezcuZO+ffs6\na3crE43P4VrANaaFBZO1d/To0XzwwQekp6cTGxvLr3/9azp1iu4hwxZwjTFnRVNZe0WEuXPnMnfu\n3IDHefzxx0lJSeHBBx8E4NFHH6Vr16488MADoW/0WRaNQ3vtKQVjoshdd93Fa6+9BkBNTQ3Z2dnc\ndtttLdyq5rHHwowxEa1379506tSJLVu28MEHHzB48OBW3fUQyoArImNEZIeI5IvIrAa2J4jIMu/2\nDSLS27v+ByKyWUS+8P57jc8+l3vX54vIb8T/8RI/1qVgTJS5++67WbJkCYcOHWLq1Kkt3Zxmq83a\nGwoiEgvMB36AJx36JhHJUdVtPsXuAr5R1TQRmQT8CpgIFAE3qOoBEbkMTyLK7t59XgZ+BKzHky9t\n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\njFI/nAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt8VNW5+P/Pk0wSEsBwEyqEq0E0WAoYIHhpRS0g1YBH\nVMR6+aKICi+tbUXOoSp6tLW/CvqtQnsEKqKnBMu3llgBFanWC7fQ2CIoELkmSCXQcEmYXCbP74+Z\npJMhl9nDZDIZnvfrtV/M7L32XmvP6MNizV7rEVXFGGNM84tr6QYYY8zZwgKuMcZEiAVcY4yJEAu4\nxhgTIRZwjTEmQizgGmNMhFjANcacFURkrIjsEJECEZlVz/EkEVnuO75RRPoEHO8lIidF5KfBXjOQ\nBVxjTMwTkXhgPnAtkAHcKiIZAcXuBv6lqunA88AvA44/D6x2eM06LOAaY84Gw4ECVd2tqhVADjA+\noMx44FXf6xXA1SIiACIyAdgNbHN4zTpcDhtt09KMMcGSMzk5XUTLgiz7tTcQuv12vayqL/u97wEc\n8HtfCIwIuExtGVWtEpFjQGcROQU8Cnwf+Gl95Ru5Zh1OA64xxkREGTAtyLJzwK2qmY0UqS/4B3Yg\nGyrzJPC8qp70dXidXLMOC7jGmKgkhDVAFQI9/d6nAQcbKFMoIi4gFTiKt9c6UUT+P6ADUC0ibmBL\nENeswwKuMSYqxQHJ4bvcZqC/iPQFioBJwOSAMrnAncB6YCKwTr2re11RU0BE5gAnVfUlX1Bu6pp1\nWMA1xkQlARLCdC3fmOwM4B0gHvidqm4TkaeAPFXNBRYDr4lIAd6e7aRQrtnYOeJweUb70cwYE6wz\n+tGst4g2+WCrzwOwpYkx3KhgPVxjTFQKZw83WljANcZEpTD/aBYVYu1+jDExwnq4xhgTIWF+SiEq\nWMA1xkQl6+EaY0wExVqAirX7McbECOvhGmNMhNhTCsYYEyH2o5kxxkSIDSkYY0yE2JCCMcZEiPVw\njTEmQqyHa4wxEWI9XGOMiRAh9p5SsKy9JiL+93//l9GjR7d0M0wrIkCCK7ittbCAaxy78sorWbRo\nUYPH9+7di4hQVVVVu++2227j3XffjUTz6m3PqFGjSElJ4cILL2Tt2rUNln3jjTe49NJLSUlJ4cor\nr4xcI81pRMDlCm5rLSzgNjP/oHM2t6El3XrrrQwZMoQjR47wzDPPMHHiRA4fPlxv2U6dOvGjH/2I\nWbOCzTVgmosIJMQHt7UaqupkM6rau3dv/fnPf64XXXSRdujQQe+66y49deqUqqr+5S9/0R49euiz\nzz6r3bp10x/+8IeqqvrWW2/pd77zHU1NTdWRI0fq3//+99rrPfvss9q9e3dt166dXnDBBbp27VpV\nVd24caNecskl2r59e+3atas+/PDDdeoIbNN7772nqqpPPPGE3njjjXrbbbdp+/btdeHCherxePQX\nv/iF9uvXTzt16qQ33XSTHjlypN77O3r0qP7gBz/QLl26aIcOHfQHP/iBHjhwQFVV/+u//kvj4uI0\nKSlJ27Ztq9OnT1dV1U2bNum3v/1tPXXqlKalpSmgycnJ2rZtW/3000/1lVde0csuu6y2DkDnz5+v\n6enp2q5dO/3Zz36mBQUFmpWVpe3bt9ebbrpJy8vLa8s39vk1ZseOHZqYmKjHjx+v3Xf55Zfrb37z\nm0bPW7hwoX7ve99rtMzhw4f1Bz/4gaampmrHjh318ssvV4/HE1S7zhJO40udbWg8WpEa3IY3L1mj\n1wPGAjuAAmBWPceTgOW+4xuBPr79w4HPfNvfgRv8ztkLbPUda7oNDj8Eo97gNnDgQN2/f78eOXJE\nL730Up09e7aqeoNhfHy8zpw5U91ut5aVlemWLVv03HPP1Q0bNmhVVZUuWbJEe/furW63W7/88ktN\nS0vToqIiVVXds2ePFhQUqKpqVlaWLl26VFVVT5w4oevXr6+to6mA63K59M0331SPx6NlZWX6/PPP\n64gRI/TAgQPqdrv13nvv1UmTJtV7f8XFxbpixQotLS3V48eP68SJE3X8+PG1x7/3ve/pwoULTztv\n9uzZ+pOf/ER/+MMfKqCVlZW1x+oLuNdff70eO3ZMP//8c01MTNSrrrpKv/rqKy0pKdGLLrpIlyxZ\noqra6Oenqnr//ffr/fffX++9/PGPf9QLL7ywzr7p06frjBkz6i1fI5iAO2vWLJ02bZpWVFRoRUWF\n/vWvf9Xq6upGzznLnFHAvcSFatfgtqaCHd4kj18B/YBEX+DMCCjzAPBb3+tJwHLf6xTA5Xt9HvCN\n3/u9QJdg78mGFEI0Y8YMevbsSadOnZg9ezbLli2rPRYXF8eTTz5JUlISycnJLFy4kGnTpjFixAji\n4+O58847SUpKYsOGDcTHx1NeXs727duprKykT58+nH/++QAkJCRQUFBAcXEx7dq1IysrK+j2jRw5\nkgkTJhAXF0dycjL/8z//wzPPPENaWhpJSUnMmTOHFStW1Dvc0LlzZ2688UZSUlJo3749s2fP5sMP\nP2yyzscff5z33nuPrVu3BtXGRx99lHPOOYeBAwdy8cUXM3r0aPr160dqairXXnst+fn5AI1+fgAL\nFixgwYIF9dZx8uRJUlNT6+xLTU3lxIkTQbWxMQkJCXz99dfs27ePhIQErrjiCkTOKG+i8VfzIG4w\nW9OGAwWqultVK4AcYHxAmfHAq77XK4CrRURUtUxVa/5HacMZJNO1gBuinj171r7u3bs3Bw8erH1/\n7rnn0qZNm9r3+/btY+7cuXTo0KF2O3DgAAcPHiQ9PZ0XXniBOXPm0LVrVyZNmlR7rcWLF7Nz504u\nvPBChg0bxp///OeQ2lfThhtuuKG2/osuuoj4+Hj++c9/nnZuWVkZ06ZNo3fv3pxzzjl897vfpaSk\nBI/H02idR48e5eTJk5w8eTKoNnbr1q32dXJy8mnva67T2OfXlHbt2nH8+PE6+44fP0779u2DamNj\nHnnkEdLT02v/onj22WfP+JrGT3gDbg/ggN/7Qt++esv4AuwxoDOAiIwQkW14hw/u8wvACrwrIltE\n5N6mGmEBN0QHDvz7u9u/fz/du3evfR/Yy+nZsyezZ8+mpKSkdisrK+PWW28FYPLkyXz88cfs27cP\nEeHRRx8FoH///ixbtoxvvvmGRx99lIkTJ1JaWkrbtm0pKyurvb7H4zntR6D62rB69eo6bXC73fTo\nEfjfHMydO5cdO3awceNGjh8/zl//+leAmn92NdiLu/fee/nv//5vJkyY0PiH51BTn19jBg4cyO7d\nu+v0aP/+978zcODAM25X+/btmTt3Lrt37+att95i3rx5vP/++2d8XeMn+IDbRUTy/LbA4Ffff7SB\nPdUGy6jqRlUdCAwD/lNEanpUl6nqUOBaYLqIfLex27GAG6L58+dTWFjI0aNH+fnPf84tt9zSYNmp\nU6fy29/+lo0bN6KqlJaW8vbbb3PixAl27NjBunXrKC8vp02bNiQnJxMf7/3Z9fXXX+fw4cPExcXR\noUMHAOLj47ngggtwu928/fbbVFZW8vTTT1NeXt5oe++77z5mz57Nvn37ADh8+DArV66st+yJEydI\nTk6mQ4cOHD16lCeffLLO8W7durF79+46+5YuXYrL5WLy5Mk88cQTgPfZ23Bo7PNrygUXXMDgwYN5\n8skncbvdvPnmm/zjH//gxhtvrLe8x+PB7XZTVVVFdXU1brebysrKesv++c9/pqCgAFXlnHPOIT4+\nvva7M2EgeEdeg9mgWFUz/baXA65WCPj/sy8NCPwnUm0ZEXEBqcBR/wKq+gVQClzse3/Q9+c3wJt4\nhy4aZAE3RJMnT679p2S/fv342c9+1mDZzMxMFi5cyIwZM+jYsSPp6eksWbIEgPLycmbNmkWXLl34\n1re+xTfffMPPf/5zANasWcPAgQNp164dDz30EDk5ObRp04bU1FQWLFjAPffcQ48ePWjbti1paWmN\ntvehhx4iOzub0aNH0759e7Kysti4cWO9ZX/0ox9x6tQpunTpQlZWFmPHjj3tWitWrKBjx448+OCD\nANxxxx388Y9/BLw9v8cee4yf/vSndOjQoXasNVSNfX7g/cvkvvvua/D8nJwc8vLy6NixI7NmzWLF\nihWce+65gPcvBf/e7muvvUZycjL3338/H330EcnJyUydOrXe6+7atYtrrrmGdu3aMXLkSB544AF7\ndjecwjuksBnoLyJ9RSQR749iuQFlcoE7fa8nAutUVX3nuABEpDcwANgrIm1FpL1vf1tgNPB5o7dU\n88/EIIU8WBxL+vTpw6JFi7jmmmtauinGRLMz+gUxM0U0b0CQFX3GFlXNbLSMyDjgBbx94t+p6jMi\n8hTeJxxyfcMErwFD8PZsJ6nqbhG5HZgFVALVwFOq+icR6Ye3VwvesP97VX2msTa0ojkaxpizSpiX\nC1PVVcCqgH2P+712AzfVc95reANx4P7dwHectMECrjEmOsXg+owxdjuRsXfv3pZugjFnhxj7DdIC\nrjEmOlkP1xhjIsQCrjHGRIjgXU4mhljANcZEpxjs4drEhyCtWbOGAQMGkJ6eXu+c+fLycm655RbS\n09MZMWLEGf2w1lRd8+bNIyMjg0GDBnH11VfXzh5rjrpqrFixAhEhLy8v5LqCre+NN94gIyODgQMH\nMnny5Gara//+/YwaNYohQ4YwaNAgVq1aVc9VgjNlyhS6du3KxRdfXO9xVeXBBx8kPT2dQYMG8be/\n/S3kus4a4Z34EB0cLpl2VqqqqtJ+/frpV199peXl5Tpo0CDdtm1bnTLz58/XadOmqarqsmXL9Oab\nb262utatW6elpaWqqrpgwYJmrUtV9fjx43rFFVfoiBEjdPPmzSHVFWx9O3fu1MGDB+vRo0dVVfWf\n//xns9U1depUXbBggaqqbtu2TXv37h1SXaqqH374oW7ZskUHDhxY7/G3335bx44dq9XV1bp+/Xod\nPnx4yHW1Ime2PGNHVG8KbiOItWijYbMeboDKykqqqqpqF2oB2LRpE+np6fTr14/ExEQmTZp02joE\nK1eu5M47vbMCJ06cyPvvv1/nGsEKpq6adDEAWVlZFBYWOq4n2LoAHnvsMWbOnFlnBbTmqm/hwoVM\nnz6djh07AtC1a9dmq0tEalcSO3bsWJ0FiJz67ne/S6dOnRo8vnLlSu644w5EhKysLEpKSvj6669D\nru+sEIM9XAu4ATweD3v27KkTdIuKiuosd5iWlkZRUVGd8/zLuFwuUlNTOXLkiOP6g6nL3+LFi7n2\n2msd1xNsXfn5+Rw4cIDrrrsupDqc1rdz50527tzJZZddRlZWFmvWrGm2uubMmcPrr79OWloa48aN\n48UXXwyprnC1xwSo+dEsmK2VsIAboLq6msLCQqqqqvjqq6/8V4OvI3CJwmDKBMPJdV5//XXy8vJ4\n5JFHHNcTTF3V1dU8/PDDzJ07N6TrO60PvPnXdu3axQcffMCyZcu45557KCkpaZa6li1bxl133UVh\nYSGrVq3i9ttvp7q62nFd4WqPCWA93Nh35MgRSktLqays5MCBAxQUFNC9e/c6698WFhae9s/PtLS0\n2jJVVVUcO3as0X9iNsT/Og3VBbB27VqeeeYZcnNzSUoK7a/4puo6ceIEn3/+OVdeeSV9+vRhw4YN\nZGdnh/zDWTD3lpaWxvjx40lISKBv374MGDCAXbt2NUtdixcv5uabbwa8GTLcbjfFxcWO6wpXe0wA\nC7ix79xzzyUpKYm8vDw8Hg+FhYUMGjSIXbt2sWfPHioqKsjJySE7O7vOednZ2bz6qjc7x4oVK7jq\nqqtC6sEMGzasybry8/OZNm0aubm5IY9xBlNXamoqxcXF7N27l71795KVlUVubi6ZmY0uynRG9zZh\nwgT+8pe/AFBcXMzOnTvp169fs9TVq1ev2gXDv/jiC9xud+2yjeGWnZ3N0qVLUVU2bNhAamoq5513\nXrPUFVNiLOC2oqZGjsvlYvDgwXzyySckJCTgcrmYO3cuo0ePprq6milTpjBw4EDOP/98nn/+ebKz\ns7n77ru5/fbbSU9Pp1OnTuTk5IRc90svvcSYMWPweDy1dT3++OP8+c9/5m9/+xuPPPIIJ0+e5Kab\nvAsb9erVi9zcwKU9w1NXOAVT35gxY3j33XfJyMggPj6eX/3qV3Tu3DmsdWVmZrJgwQLmzZvH1KlT\nef755xERlixZEvI/82+99VY++OADiouLSUtL48knn6xduPxPf/oTq1evZtWqVaSnp5OSksIrr7wS\nUj1nlZoFyGOIrYcbwO12s379ei699FI++eQT3G43Xbt25fjx4/Ts2ZNevXqRmJiIiJCZmXnGz6UG\nq7q6muHDh0esvli+N4/Hw4gRIyJSX6TvLcqc2Xq43xLN+2GQFc1tej3caGA93EaICMnJyaSmpnLo\n0CH2798PwPTp0ykuLubIkSMMHTo0Im3Jyspi7969Easvkvc2dOhQ9u3bF7H6pk6dyvbt2yNS37e/\n/W32799fW9f+/fubbZw45tjU3rNTr1692LdvH2VlZezZs4c//OEPVFVVccstt7B8+fKItKGoqIh9\n+/axdOnSiNQXyXs7dOgQBw8e5LXXTlvjuVnk5+czZswYFi1a1Ox1ffPNNxw+fJjXXnsNEbEsIU7E\n4NTeGLud5hMfH0/btm1xu9188cUXVFdX8+mnm+jSpYuzC0kCaP1JCYMpH1R9Z1hHUHU5rSOIc06r\nrxnq8PenP/0ptDpIwJttJTjJKeewY8cOfvKTn/Dll1+SmZlJly5dQn7G+KxhAffsVjPEMHToUKqq\nqjh16gT0dDisfUAg3cE5BQJDHNaRL3CFg3M+ErjWYR2rI3DOaof3Ad57cfJ55Tv8PsD7nTj43k8d\nEAYPHsz777/P5ZdffraO5zoXgwHXHgszpoXZwjeNCD5NepNEZKyI7BCRAhGZVc/xJBFZ7ju+UUT6\n+PYPF5HPfNvfReSGYK8ZyAKuMS3srrvuanR4YfXq1ezatYtdu3bx8ssvc//990ewdS0ojBMfRCQe\nmA9cC2QAt4pIRkCxu4F/qWo68DzwS9/+z4FMVR0MjAX+R0RcQV6zDgu4xrQwW/imAeFdS2E4UKCq\nu1W1AsgBxgeUGQ+86nu9ArhaRERVy1S1yre/Df9+PDaYa9ZhAdeYKHfWLnzjrIfbRUTy/LZ7A67W\nAzjg977Qt6/eMr4AewzoDCAiI0RkG7AVuM93PJhr1hFjQ9LGxJ6zduEbZz+aFTcx8aG+Dyzwg22w\njKpuBAaKyEXAqyKyOshr1mE9XGOi3Fm78E3N1N7w/GhWCPT0e58GHGyojIi4gFTgqH8BVf0CKAUu\nDvKadVjANSbKnbUL34R3tbDNQH8R6SsiicAkIHABklzgTt/ricA6VVXfOS4AEekNDAD2BnnNOmxI\nwZgW1tjCN/fddx/jxo07Oxe+Ebw/UYWBqlaJyAzgHbx94t+p6jYReQpvep5cYDHwmogU4O3ZTvKd\nfjkwS0QqgWrgAVUtBqjvmo21wwLuGUnwTmRwxOV9cN5J+XyHdYjLOwHASfnVIdTR3Oc4vQ/A+efl\n9PvwnePke5eERg8vW7as8dNFmD9/fvD1xYowrxamqquAVQH7Hvd77QZuque814B6553Xd83GWMA9\nI5WhzVL6toNztgqMdFjHeoFrHJyzVuAGh3W8KTDR4TkrHNbzpsP7AO+9OPm81jv8PsD7nTidLWic\ni8GZZjF2O8aYmBJjESrGbscYEzNicAFyC7jGmOhkQwrGGBMhtgC5McZEiPVwjTEmQizgxr7y8nKq\nq6tbuhnGGAu4sa+iooJTp07x2Wef4fF4iI+PsZ9JjWlNYux/P1tLIUD79u1p27YtvXv3pry8nLKy\nMo4cOdLSzTLm7BPetRSiQitqamR17NiRlJQUPB4PRUVFlJaWkpiYiMvl95FJQmjTQrc6nHq6PoQp\ntGsdTqF9M4Q6VoRwjpN6nN5HzTmOPi+n34fvHCffexNTe00D7CmFs098fDyDBg3i448/pqKigvLy\nctavX+9do1QrQ0vw6HTqaSjTW51Mu10h8H8c1vGKwD0Oz1nksJ5XQpw+7HRacyhTpx0mqty0aRMJ\nCRZ4HbEx3LNXXFwcbdq0QVUZPnw4Ho+npZtkWpHMzExuuOEGS5PuRAwGXBvDdUhEiI+PJy7OPjoT\nvLi4OFauXMmFF15IXl7eacF2zZo1DBgwgPT0dJ599tnTzt+/fz+jRo1iyJAhDBo0iFWrgl6gqvWK\nwTFcixrGtDCPx8P06dNZvXo127dvZ9myZWzfvr1Omaeffpqbb76Z/Px8cnJyeOCBB1qotZGl8cFt\nrUUr+rvBmNi0adMm0tPT6devHwCTJk1i5cqVZGT8O+O2iHD8+HEAjh07dlak2NE4qAjTAuTRwgKu\nMS2svqy8GzdurFNmzpw5jB49mhdffJHS0lLWrl0b6WZGnApUxQf7j/DWMVnJhhSMaWHBZOVdtmwZ\nd911F4WFhaxatYrbb7895mdEqggelyuorbWwgGtMCwsmK+/ixYu5+eabARg5ciRut5vi4uKItrMl\neOLjg9qCISJjRWSHiBSIyKx6jieJyHLf8Y0i0se3//siskVEtvr+vMrvnA981/zMt3VtrA0WcI1p\nYcOGDWPXrl3s2bOHiooKcnJyyM7OrlOmV69evP/++wB88cUXuN1uzj333JZobsQogof4oLamiEg8\nMB+4FsgAbhWRjIBidwP/UtV04Hngl779xcD1qvptvFl9A/Ob3aaqg33bN421o/X0xaORJDhP8Oh0\n5lios62czAITl3eSgdM6FoVwjpN6Qp3N5nSWndOZfE4TVTYx08zlcvHSSy8xZswYPB4PU6ZMYeDA\ngTz++ONkZmaSnZ3N3LlzmTp1Ks8//zwiwpIlS04bdog1ilAVvsUUhgMFqrobQERygPGA/+Mg44E5\nvtcrgJdERFQ136/MNqCNiCSparnTRljAPRNaCVc4nKX0UQgzoUKZbeVkFtgigYcd1vG8wE8dnvOc\nw3qeD3E2m9NZdqHM5HPyvQeReXjcuHGMGzeuzr6nnnqq9nVGRgaffPJJ8HXGAEWoCH5ubxcRyfN7\n/7Kqvuz3vgdwwO99ITAi4Bq1ZXxp1Y8BnfH2cGvcCOQHBNtXRMQD/D/gaa1vUN7HAq4xJirVDCkE\nqVhVMxs5Xt/feoGBsdEyIjIQ7zDDaL/jt6lqkYi0xxtwbweWNtQIG8M1xkStcI3h4u3R9vR7nwYc\nbKiMiLiAVOCo730a8CZwh6p+VXOCqhb5/jwB/B7v0EWDLOAaY6JSzRhuMFsQNgP9RaSviCQCk4Dc\ngDK5eH8UA5gIrFNVFZEOwNvAf6pq7biOiLhEpIvvdQJwHfB5Y42wIQVjTFTyDimEJ0T5xmRnAO/g\nXdb8d6q6TUSeAvJUNRdYDLwmIgV4e7aTfKfPANKBx0TkMd++0UAp8I4v2MYDa4GFjbXDAq4xJip5\nfzRLDN/1VFcBqwL2Pe732g3cVM95TwNPN3DZS5y0wQKuMSYqKYTzsbCoYAHXGBOlwjekEC1i626M\nMTHD4WNhrYIF3DMhCUE91F73nBBmQoUy28rJLLA4l3eSgRNxLu9EBqfnOKkn1NlsTmfZhTKTz8n3\nbjnNQmYB1/ybVsK1DmcprRa4wcE5b4aYb8zpjK4nHdbxhMAzDs+Z7bCeJ0KcAec0b5qT7wO834mT\n7311bE/BbS7Wwz0LHD9+HLfbTWFhIR6Px1LpGNNCFKE8xtL2WsANkJycjMvlwuPxUFlZicfj4ZNP\nPqGsrIy4uDji4uLYu3dvzK9FasJr//799pe3Q7HYw7X/AgIkJCTgcrno3bs3bdq0oW3btlx22WWk\npKSQmJhIXFwcLpcLVyta9Ni0PJfLxT333FObtXfs2LEt3aSoF87lGaOFBdwg1WTrTUhIIC0t7azI\nKWXCp3v37qxZsybkrL0Ab7zxBhkZGQwcOJDJkydHotktLoxTe6OCddOMaWE1WXvfe+890tLSGDZs\nGNnZ2XWSSO7atYtf/OIXfPLJJ3Ts2JFvvml0neuYEM6pvdHCerjGtDD/rL2JiYm1WXv9LVy4kOnT\np9OxY0cAunZtNJNLTLAhBWNM2NWXtbeoqKhOmZ07d7Jz504uu+wysrKyThuSiEXepxQSg9pai9jq\nrxvTCgWTtbeqqopdu3bxwQcfUFhYyBVXXMHnn39Ohw4dItXMiIvFIYXYuptIkwTnD7WLy/vgvJPy\nTvONOZ3RFefyTjJwWsfsEM5xUk8oM+BCyZvm5PuoOcfJ997ETLNgsvampaWRlZVFQkICffv2ZcCA\nAezatYthw4Y5anpr05qGC4JhAfdMhDrTzGnOrVDyejnJN/ZciLPGnnV4ziyH9cwOMW+a03xuoeSM\nC+NMM/+svT169CAnJ4ff//73dcpMmDCBZcuWcdddd1FcXMzOnTvp16+fs3a3MrH4HK4FXGNaWDBZ\ne8eMGcO7775LRkYG8fHx/OpXv6Jz584t3fRmZQHXGNMsmsraKyLMmzePefPmNXqdxx57jC5duvDQ\nQw8BMHv2bLp168aDDz4Y/kY3s1ic2mtPKRgTQ+6++25effVVAKqrq8nJyeG2225r4VaFxh4LM8ZE\ntT59+tC5c2fy8/N59913GTJkSKseeghnwBWRsSKyQ0QKRGRWPceTRGS57/hGEenj2/99EdkiIlt9\nf17ld84lvv0FIvJrCXy8JIANKRgTY+655x6WLFnCoUOHmDJlSks3J2Q1WXvDQUTigfnA9/GmQ98s\nIrmqut2v2N3Av1Q1XUQmAb8EbgGKgetV9aCIXIw3EWUP3zm/Ae4FNuDNlzYWWN1QO6yHa0yMueGG\nG1izZg2bN29mzJgxLd2ckNU8hxvMFoThQIGq7lbVCiAHGB9QZjzwqu/1CuBqERFVzVfVg77924A2\nvt7wecA5qrpevQ9TLwUmNNYI6+EaE2MSExMZNWoUHTp0ID6+9Yxv1sfB+GwXEcnze/+yqr7s974H\ncMDvfSEwIuAatWV8adWPAZ3x9nBr3Ajkq2q5iPTwXcf/mj1ohAVcY2JMdXU1GzZs4A9/+ENLN+WM\nOEyTXqzyy50sAAAXaElEQVSqmY0cr29sNfBh6kbLiMhAvMMMox1csw4LuGci1JlmTnNuOc3r5TTf\nWKizxmY18+y0UPKmOf28Qs0ZF8aZZuG0fft2rrvuOm644Qb69+8fsXqbQzjHcPH2Pnv6vU8DDjZQ\nplBEXEAqcBRARNKAN4E7VPUrv/JpTVyzDgu4Z8Jymjk7x3KaNbuMjAx2794dsfqaU5jXUtgM9BeR\nvkARMAkIXFQ4F7gTWA9MBNapqopIB+Bt4D9V9ZPa9ql+LSInRCQL2AjcAbzYWCPsRzNjTNQK12Nh\nqloFzMD7hMEXwBuquk1EnhKRbF+xxUBnESkAfgzUPDo2A0gHHhORz3xbzfqY9wOLgALgKxp5QgGs\nh2uMiVLhntqrqqvwPrrlv+9xv9du4KZ6znsaeLqBa+YBFwfbBgu4xpioFOYx3KhgAdchVaW8vByP\nx9PSTTGtSEVFRUs3odXxPqUQW2spWMCth6pSWlpKVVUVHo+HrVu3UlpaiqoiIvzjH/+od9FoYxry\n+eef89Of/rQ2a2+XLl3OiqwNZyIWVwuzH80CHDlyhNLSUnbt2oXH4yEuLo5evXqRkpJCu3btaNu2\nLcOGDWPo0KEt3VTTigwdOpR169adUdZegBUrViAi5OXlNVgmltjiNTGuc+fOtGvXjsGDB5OUlERC\nQgKpqamnpTwxJlxqsvauXr2a7du3s2zZMrZv335auRMnTvDrX/+aESMCJ0jFppox3FhKk24B15gW\nFkzWXvCudTtz5kzatGnTAq2MvDCvpRAVWk9Lo5HlNHN+juU0O019WXs3btxYp0x+fj4HDhzguuuu\n47nnnnPU3NbK4dTeVsEC7pnQSrjC4Y9nHwlc4+CctSHm3HKa1yuUGV2h5BtzOgMulHxuTnPGOfk+\nwPudOPneP2o8ODeVtbe6upqHH36YJUuWBF9nDLDHwowxYddU1t4TJ07w+eefc+WVVwJw6NAhsrOz\nyc3NJTOzsfVaWr/WNFwQjNi6G2Naoaay9qamplJc/O8VAq+88kqee+65mA+29liYMSbs/LP2XnTR\nRdx88821WXtzc3NbunktJhZzmlkP15go0FTWXn8ffPBBBFoUHWwM1xhjIqCaOJvaa4wxkdKahguC\nYQHXGBOVYvFHMwu4xpiopNgYrjHGREhYU+xEhdi6m0iThCZnEZ1+jss7U8lJ+VCSHDpJpBjKFNpQ\nEjw6rSeUBJqhJOl08n3UnOPke49gEslYYkMKpi6thCEOp4XmC4x0cM76EKeeOp3eGkqiylCm3TpN\n8BjKtGanU6edfB/g/U6cfO/5ttJcKBShPIxrKYjIWOD/AvHAIlV9NuB4ErAUuAQ4AtyiqntFpDOw\nAhgGLFHVGX7nfACcB5zy7Rqtqt801AYLuMaYqBTOrL0iEg/MB76PN735ZhHJVVX/dTDvBv6lquki\nMgn4JXAL4AYew5u7rL78Zbf5cps1yWaaGWOiVhhnmg0HClR1t6pWADnA+IAy44FXfa9XAFeLiKhq\nqap+jDfwnhELuMaYqORwam8XEcnz2+4NuFwP4IDf+0LfvnrL+NKqHwM6B9HUV3yp0x+TJjIV2JCC\nMSYqKYKnOugfzYpVtbHVfOoLhIED8cGUCXSbqhaJSHvg/wG34x0HrpcFXGNMVNJqodwdtqm9hUBP\nv/dpwMEGyhSKiAtIBY422kbVIt+fJ0Tk93iHLizghkNVVRUVFRVs3LjRsvYaR/Ly8khIsMfDnFAV\nPFVheyxsM9BfRPoCRcAkYHJAmVzgTmA9MBFYp438j+4Lyh1UtVhEEoDrgLWNNcLGcINw8OBBSktL\nqaysJCkpiaFDhzJ48OCWbpZpRQYPHsxjjz1WmyZ97NixdY43lbV33rx5ZGRkMGjQIK6++mr27dsX\nqaa3HAVPVXxQW5OX8o7JzgDeAb4A3lDVbSLylIhk+4otBjqLSAHwY2BWzfkisheYB9wlIoUikgEk\nAe+IyD+Az/AG8oWNtcN6uA3weDxUVFRQUVHBiRMnSElJqU17kpCQYFl8jSMul4vc3Fwuv/zy01Kc\n12Ttfe+990hLS2PYsGFkZ2eTkZFRW2bIkCHk5eWRkpLCb37zG2bOnMny5csjfRsRpSpUVYZv4oOq\nrgJWBex73O+1G7ipgXP7NHDZS5y0wQJugMrKSsrLy1m/fj2qStu2bRkwYABHjhw5vbAkhPBQu8v7\n4HywQp0J5XS2ldNElaHOAnOa4DGUWXZOZ/I5+T4AcDn73puYaeaftReozdrrH3BHjRpV+zorK4vX\nX3/dWZNbJaHaE1shKrbuJgxKS0sREUaOHHla5tTTaCWkOxzLLRD4toNztoY4E8rpbKsbHNbxZoiz\nwJzU82aIs+yczuRz8n2A9ztx8r0XNB6cg8na62/x4sVce+21wdffWikQvjHcqGABN0CHDh1ITEwk\nPj62vmgTvZrK2uvv9ddfJy8vjw8//LC5m9XyqgXcsRWiYutujGmFmsraW2Pt2rU888wzfPjhhyQl\nxVYmhAZVtXQDwsueUjCmhfln7a2oqCAnJ4fs7Ow6ZfLz85k2bRq5ubl07dq1hVoaYd4FcYPbWgnr\n4RrTwvyz9no8HqZMmVKbtTczM5Ps7GweeeQRTp48yU03eX9E79WrV+xn9K0JuDHEAq4xUaCprL1r\n1zb6PH1sUqCypRsRXhZwjTHRSYHylm5EeFnANcZEJxtSMMaYCLGAa+qQhCYfaj+dy/vgvJPyTmdC\nhTLb6s1mns0WSj2hzrJz9Hk5/T585zj53i2nWWgs4Jo6tBJ6OpyldCCEWUqh5E27wsE5Hwlc67CO\n1RE4Z7XD+wDvvTjNNxbKbEEn3/sBW3cjJBZwjTEmgizgGmNMBFQThixi0cUCrjEmOtmQgjHGRIgF\nXGOMiRALuMYYE0ExFnBttTBjTHQK82phIjJWRHaISIGIzKrneJKILPcd3ygifXz7O4vIX0TkpIi8\nFHDOJSKy1XfOr6WJ3FvWw3WosrKS/fv3U11d3dJNMa1IYWEhcXHWv3GkGjgVnkuJSDwwH/g+3nTo\nm0UkV1W3+xW7G/iXqqaLyCTgl8AteJ+VeAy42Lf5+w1wL7ABb760scDqhtphATdIqsqpU6fqrMSf\nnHIOp5w+1O50dlooedMkwTsBwEn51SHU0dznOL2PmnOc5htzOltQEhxNZkhJOQeAKVOm1Gbt7dKl\nC2vWrKkts2bNGh566CE8Hg/33HMPs2bV7YCVl5dzxx13sGXLFjp37szy5cvp06ePs3a3Ngp4wna1\n4UCBqu4GEJEcYDzgH3DHA3N8r1cAL4mIqGop8LGIpPtfUETOA85R1fW+90uBCVjAPTMnTpygtLSU\npKQkXC4XaWlpVFVV8ee33mT48OERacP+/ftJTEzkW9/6VkTq27RpU8TuraioCFUlLS0tIvVF8t4O\nHTpERUUF3bt3Z/ny5YwbNy6krL2LFy+mY8eOFBQUkJOTw6OPPhrzWXsBJ2O4XUTE/4N9WVVf9nvf\nAzjg974QGBFwjdoyqlolIseAzkBxA3X28F3H/5o9GmukBdwmVFZWsnXrVlJSUoiLi0NE+OSTT6is\nrKSqqqrpRJNhoKq43W4SExPZt29fROo7depURO4NvJ+xqlJUVBSR+srKyvj0008jkrfO4/FQXl5O\nUVERjzzyCPv27WPIkCF069attocbTNbelStXMmfOHAAmTpzIjBkzUNUGc5/FBGdPKRSramYjx+v7\noALnZwdT5kzKW8BtSHV1NW63m+rqai677DI2bdqEqjJ06FAKCgqorKzkoosuisi43Ndff01JSQkX\nXXRRs9cFcPz4cYqKiiJWX1lZGQUFBQwaNCgi9Z08eZIvv/ySIUOGRCToHj16lIKCAlatWsV7773H\nCy+8wLx582qPB5O117+My+UiNTWVI0eO0KVLl2Zvf4sJ72NhhUBPv/dpwMEGyhSKiAtIBY42cU3/\nf5bVd806LODWo7q6ms2bNyMitT1bVSUuLo6PPvqI+Ph4kpKS2LJlS0TacurUKVJSUti8eXOz1wdQ\nUVGBiESsPvCmp49kfRUVFXz66ae0adMmIvWpKlu2bOHFF1+ktLSUzMxMunfvTnp6Onffffdp5QN7\nrk4y+8aM8E7t3Qz0F5G+QBEwCZgcUCYXuBNYD0wE1ml9H7yPqn4tIidEJAvYCNwBvNhYI+xn0wDH\njh2jrKyM9PT02syoVVXev2ZPnDhBQkJCxDKm1gwltGnTJqL/c3k8noiniY+Li4vokx+JiYlUV1fX\nfrfNLS4ujpSUFObMmcOvf/1rMjIyOH78OFu3buW5555rMmuvf2bfqqoqjh07RqdOnSLS9hYVpsfC\nVLUKmAG8A3wBvKGq20TkKRGpydi5GOgsIgXAj4HaXy5FZC8wD7hLRApFpGa8535gEVAAfEUjP5iB\n9XBPk5SUREpKCp06dUJViY+PZ8OGDbWBL5KBqKKigvj4+IgHv+rq6og/whQfH09VVRWJiYkRq7NN\nmzacOnWK+Pj4iPyFJiIkJyfjdrt56qmneOKJJzh48CA7d+6krKyM733ve7z33nvk5OTw+9//vs65\n2dnZvPrqq4wcOZIVK1Zw1VVXxX4PN8wzzVR1Fd5Ht/z3Pe732g3c1MC5fRrYn8fpj4o1yHq4Adq0\naUNcXFxtL8/tduN2u0lOTo5o4PN4PHg8noj1pmu0RLAFb8D1eML3DFAw4uLiSEpKwu2O3JJUNUFX\nRHjiiSdYunQpvXv3pl27dmzYsIEOHTpw880312btrcnMe/fdd3PkyBHS09OZN28ezz77bMTa3GJq\n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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "time_steps = [50,100]\n", - "dt = problem.time_step()\n", - "\n", - "for t in time_steps:\n", - " p = pressures[t]\n", - " plot_grid.plot_grid(problem.g, p, color_map = [0, 0.04], if_plot=False)\n", - " plt.title('pressure at time: %g s' %(t*dt))\n", - " plt.show()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Compressible flow with fractures\n", - "\n", - "For a fractured domain we need to import some new classes:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from porepy.numerics.compressible.problems import SlightlyCompressibleMultiDim, SubProblem\n", - "from porepy.fracs import meshing\n", - "from porepy.params import tensor" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "class MatrixDomain(SubSlightlyCompressible):\n", + " def __init__(self, g, data):\n", + " SubSlightlyCompressible.__init__(self, g, data)\n", "\n", - "We create two different types of problems, one for the fractures, and one for the matrix. For the fractures we use all the standard parameters, but we set the apperture to 0.01. We also define a source term in the intersection of the two fractures" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class MatrixDomain(SubProblem):\n", - " def __init__(self, g):\n", - " SubProblem.__init__(self, g)\n", - "\n", - "class FractureDomain(SubProblem):\n", - " def __init__(self, g):\n", - " SubProblem.__init__(self, g)\n", + "class FractureDomain(MatrixDomain):\n", + " def __init__(self, g, data):\n", + " MatrixDomain.__init__(self, g, data)\n", " aperture = np.power(0.001, 2 - g.dim)\n", " self.data()['param'].set_aperture(aperture)\n", " \n", " def permeability(self):\n", - " kxx = 1000 * np.ones(self.g.num_cells)\n", + " kxx = 1000 * np.ones(self.grid().num_cells)\n", " return tensor.SecondOrder(2, kxx)\n", "\n", "class IntersectionDomain(FractureDomain):\n", - " def __init__(self, g):\n", - " FractureDomain.__init__(self, g)\n", + " def __init__(self, g, data):\n", + " FractureDomain.__init__(self, g, data)\n", "\n", " def source(self, t):\n", - " assert self.g.num_cells == 1, '0D grid should only have 1 cell'\n", - " f = .4 * self.g.cell_volumes # m**3/s\n", + " assert self.grid().num_cells == 1, '0D grid should only have 1 cell'\n", + " f = .4 * self.grid().cell_volumes # m**3/s\n", " return f * (t < .05)" ] }, @@ -249,13 +103,13 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "class UnitSquareInjection(SlightlyCompressibleMultiDim):\n", + "class UnitSquareInjection(SlightlyCompressible):\n", "\n", " def __init__(self):\n", " nx = 12\n", @@ -269,7 +123,7 @@ " g.compute_geometry()\n", " self.g = g\n", " # Initialize base class\n", - " SlightlyCompressibleMultiDim.__init__(self)\n", + " SlightlyCompressible.__init__(self)\n", "\n", " #--------grid function--------\n", "\n", @@ -280,13 +134,14 @@ " self.grid().add_node_props(['problem'])\n", " for g, d in self.grid():\n", " if g.dim == 2:\n", - " d['problem'] = MatrixDomain(g)\n", + " d['problem'] = MatrixDomain(g, d)\n", " elif g.dim == 1:\n", - " d['problem'] = FractureDomain(g)\n", + " d['problem'] = FractureDomain(g, d)\n", " elif g.dim == 0:\n", - " d['problem'] = IntersectionDomain(g)\n", + " d['problem'] = IntersectionDomain(g, d)\n", " else:\n", " raise ValueError('Unkown grid-dimension %d' %g.dim)\n", + "\n", " #--------Time stepping------------\n", " def time_step(self):\n", " return .001\n", @@ -304,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -321,14 +176,14 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\nfJK9e/cCcOTIEZYtW1Zt2lOnTpGYmEizZs04duwYM2bMqLK/TZs27Nq1q8ayWrVqhYhQVFTEnXfe\nyZQpU9i9ezcnTpwIW8eahLt+tbniiivo0aMHM2bMoLCwkLfffpt//etf3HbbbdWmv/vuu3nuuef4\n9ttv+fe//838+fMZN24cABs2bGDHjh2UlZVx9OhRHnnkEQYOHHhWkwUQ9r6acyQEWl6dbJCvqr0q\nbS+H5JYHVP4zMBUI/ROkIo2I+IBk4FjlBKr6JVAAXB18fzD472HgbQJNFzWygOvQnXfeWdHm2Llz\nZ5566qka0/bq1Yv58+czadIkmjdvTnp6OgsXLgQC/T6nTJlCSkoKl156KYcPH+aFF14AYOXKlXTr\n1o0mTZowefJkMjMzadSoEcnJycybN4/777+fdu3a0bhxY1JTU8PWd/LkyQwfPpzBgwfTtGlT+vXr\nx4YNG6pN+7Of/YwzZ86QkpJCv379qnSJKs9r6dKlNG/enEceeeSs45OSknjqqaf47LPPaNasGZs2\nbWLatGnVBiYnwl0/CPwyGT9+fI3HZ2Zmkp2dTfPmzZkyZQpLly6t6BL2t7/9rcoT7IwZM7j88stJ\nS0vjhz/8IY899ljF+e/atYuhQ4fStGlTrr76ahISEqq03VcW7r6ac1S3TQqbgC4i0klE4gl8KZYV\nkiYLuCf4eiSwWlU1eIwPQETSgK7AHhFpLCJNg583BgYDW8OeUk1/HtXgnBuLG7KOHTvyyiuv8J//\n+Z/1XRVjGpLwbVG16JUkmt3VYUGfsVlVe4VNIzIM+AOBZ+K/qurzIvIMgR4OWcFmgjeAawk82Y5W\n1V0ichcwBSgByoBnVPUdEelM4KkWAmH/76r6fLg6WG9uY0x0quPpwlR1ObA85LNplV4XArdXc9wb\nBAJx6Oe7gGvc1MECrjEmOsXg/IwxdjoXxp49e+q7CsZcnGLse0cLuMaY6GRPuMYYEyEWcI0xJkKE\nwHQyMcQCrjEmOsXgE64NfHBo5cqVdO3alfT0dGbOnHnW/qKiIu644w7S09Pp27fveX3RVltZs2bN\nIiMjg+7du3PjjTdWjCa7EGWVW7p0KSJCdnb2OZfltLwlS5aQkZFBt27duPPOOy9YWfv27WPQoEFc\ne+21dO/eneXLl1eTizP33nsvrVu35uqrr652v6ryyCOPkJ6eTvfu3fn000/PuayLRt0OfIgOLqdM\n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\naQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VPW18PHvykwuBDDBcFEIcjGIBqqiEbDUVkQRaQ22\nIqIclSNaUXn00B4Vi1qwYunbin0rqBVpwRtReavkVEBF0T61GAkFW0AhkWu4KCECIZDbZL1/zCQn\nGZLJ3mGYTIb1eZ79ODN77b1/e+9xsfOb30VUFWOMMSdfXGsXwBhjThWWcI0xJkIs4RpjTIRYwjXG\nmAixhGuMMRFiCdcYYyLEEq4x5pQgIqNEZLOIFIrItEbWJ4rI64H1eSLSO2j9WSJyRET+2+k+g1nC\nNcbEPBHxAPOAa4BM4CYRyQwKmwR8q6oZwNPAb4LWPw0sd7nPBizhGmNOBYOBQlXdqqqVQA4wJihm\nDLAo8HoJMEJEBEBErgO2Ahtd7rMBr8tCW7c0Y4xTciIbZ4joUYexe/2JsLzeRy+o6gv13vcAdtV7\nXwQMCdpNXYyqVovIISBNRI4BDwFXAf/dWHyIfTbgNuEaY0xEHAXuchg7A8pVNStESGPJP/gBsqmY\nmcDTqnok8MDrZp8NWMI1xkQlIawJqgjoWe99OrCniZgiEfECKUAJ/qfWsSLyf4BUoEZEyoG1DvbZ\ngCVcY0xUigPahW93a4B+ItIH2A2MB24OiskFbgNWA2OBD9U/utdltQEiMgM4oqpzA0m5uX02YAnX\nGBOVBIgP074CdbJTgHcBD/AnVd0oIo8D+aqaCywAXhaRQvxPtuNbss9Q24jL4RntRzNjjFMn9KNZ\nLxFttmFrwD2wtpk63KhgT7jGmKgUzifcaGEJ1xgTlcL8o1lUiLXzMcbECHvCNcaYCAlzK4WoYAnX\nGBOV7AnXGGMiKNYSVKydjzEmRtgTrjHGRIi1UjDGmAixH82MMSZCrErBGGMixKoUjDEmQuwJ1xhj\nIsSecI0xJkLsCdcYYyJEiL1WCjZrrzkpXn31VUaOHNnaxTBtmADxXmdLW2EJ1zTr8ssv58UXX2xy\n/fbt2xERqqur6z6bMGEC7733XiSK12h5hg8fTnJyMueeey4rV65sMraiooLbb7+d0047jTPOOIM5\nc+Y02I+I0KFDh7rlV7/6VSROwQAi4PU6W9qKNlTUtqG6uhpvK38DoqEMremmm27i0ksvZdmyZSxb\ntoyxY8dSUFBAly5djoudMWMGBQUF7Nixg3379jF8+HAyMzMZNWpUXczBgwdP6evZWkQg3tPapQgz\nVXWznJJ69eqlTz75pJ533nmampqqEydO1GPHjqmq6qpVq7RHjx46e/Zs7datm/7Hf/yHqqr+z//8\nj15wwQWakpKil156qX7++ed1+5s9e7Z2795dO3TooOecc46uXLlSVVXz8vL04osv1o4dO2rXrl11\n6tSpDY4RXKb3339fVVV/+ctf6vXXX68TJkzQjh076vz589Xn8+mvf/1r7du3r55++ul6ww036IED\nBxo9v5KSEv3hD3+onTt31tTUVP3hD3+ou3btUlXVX/ziFxoXF6eJiYnavn17vffee4/bvmfPngpo\nXFyctm/fXj/44APt3r27Dho0qC4G0Hnz5mlGRoZ26NBBH3nkES0sLNShQ4dqx44d9YYbbtCKioq6\n+FDXL5TNmzdrQkKCHj58uO6z733ve/rcc881Gt+9e3d99913694/8sgjeuONN6qq6rZt2xTQqqoq\nR8du6r6ewtzmlwbLRR60MsXZgn9espD7A0YBm4FCYFoj6xOB1wPr84Degc8HA+sDy+fAj+ttsx34\nd2Bd82VweRFOSb169dIBAwbozp079cCBA/rd735Xp0+frqr+ZOjxePTBBx/U8vJyPXr0qK5du1a7\ndOmin376qVZXV+vChQu1V69eWl5erl9++aWmp6fr7t27VdX/P3VhYaGqqg4dOlRfeuklVVUtLS3V\n1atX1x2juYTr9Xr1rbfeUp/Pp0ePHtWnn35ahwwZort27dLy8nL96U9/quPHj2/0/IqLi3XJkiVa\nVlamhw8f1rFjx+qYMWPq1v/gBz/Q+fPnN3l9ahPTww8/rD//+c/1nnvu0euvv16HDRtWFwPotdde\nq4cOHdINGzZoQkKCXnHFFfrVV1/pwYMH9bzzztOFCxeqqoa8fqqqd999t959992NluUvf/mLnnvu\nuQ0+u/fee3XKlCnHxZaUlCig+/btq/vszTff1IEDBzY4r+7du2uPHj104sSJun///kaPG+q+nsJO\nKOFe7EW1q7OluWSHf5LHr4C+QEIgcWYGxdwDPB94PR54PfA6GfAGXp8JfFPv/Xags9Nzsjpch6ZM\nmULPnj05/fTTmT59OosXL65bFxcXx8yZM0lMTKRdu3bMnz+fu+66iyFDhuDxeLjttttITEzk008/\n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\ncrp06UJycjLHjh2jqKiIvXv38tRTTzFy5Ehqamq4/fbbGTBgAGeffTZPP/002dnZTJo0iVtuuYWM\njAxOP/10cnJyWnRsr9fL3Llzufrqq/H5fHXHeuyxx/jrX//KP//5Tx544AGOHDnCDTf4BzY666yz\nyM0NHtozPMcKJyfHu/rqq3nvvffIzMzE4/Hw29/+lrS0tLAeKysri2effZY5c+Zw55138vTTTyMi\nLFy4sMV/5t9000189NFHFBcXk56ezsyZM+umGXr77bdZvnw5y5YtIyMjg+TkZP785z+36DinlNoB\nyGOIjYcbpLy8HIDVq1ejqnTs2JH9+/eTlJREz549uejiIRwp/db5DiUe9Pj5vZoUFw81LuK98VDt\nPF7iPWiV87nKvPFCdZXz2+42Pi7eQ42L8rg9X9fX0+39asE2HTt24vDhkuYD274TGw/3DNH8/3B4\noKeaHw83GtgTbggiwne+8x0+/vhjjh49ys6dO/3Jto+Lf3e2CVzqIn61wFQX8U8LfOI8XocJI7Xx\nqXYa856M4e96seP478la1/Fuy+PmfBnWguvp5n6B/565+E6UbrMfyxyxrr2nHhEhISEBj8fTYCJH\nY8xJZl17T10ej4f27du3djFMjAieN840IgZbKbShorY+azdpwqWlHTpOKfaEa4wJNxv4JgTn06Q3\nS0RGichmESkUkWmNrE8UkdcD6/NEpHfg88Eisj6wfC4iP3a6z2CWcI1pZRMnTgz5xLt8+XIKCgoo\nKCjghRde4O67745g6VpRGKsURMQDzAOuATKBm0QkMyhsEvCtqmYATwO/CXy+AchS1QuBUcAfRcTr\ncJ8NWMI1ppXZwDdNCO9YCoOBQlXdqqqVQA4wJihmDLAo8HoJMEJERFWPqmp14PMk/rd5rJN9NmAJ\n15god8oOfOPuCbeziOTXW34atLcewK5674sCnzUaE0iwh4A0ABEZIiIbgX8DkwPrneyzgRirkjYm\n9pyyA9+4+9GsuJmOD41dsOAL22SMquYBA0TkPGCRiCx3uM8GLOG6JfH+zgyOef0N452K8/ob3zvl\n8fob9zskXo+/84Dj3Qvfk7WuiuMm3m153J6v6+spLu8XAF533wmJd7X3U3bgm/B27S0CetZ7nw7s\naSKmSES8QArQoEugqn4hImXAQIf7bMASrlta5b7n2FgX8UsEZruInyaww3m3Uu0Vz0R9znH8Qrmb\nrep8kJW+std1vNvyuDlfesW7v55u7hf475nb74QL2dnZzJ07l/Hjx5OXl3fqDHwT3mZha4B+ItIH\n2A2MB4Lnb8oFbgNWA2OBD1VVA9vsUtVqEekF9Ae2Awcd7LMBS7jGtLJQA99MnjyZ0aNHn5oD3wj+\nn6jCIJAspwDv4n9u/pOqbhSRx/FPz5MLLABeFpFC/E+24wObfw+YJiJVQA1wj6oWAzS2z1DlsIRr\nTCtbvHhxyPUiwrx58yJUmigS5tHCVHUZsCzos8fqvS4Hbmhku5eBl53uMxRLuMaY6BSDPc1i7HSM\nMTElxjJUjJ2OMSZmxOAA5JZwjTHRyaoUjDEmQmwAcmOMiRB7wjVIvLuG6+L1N4x3Ks7rb3zvlMfr\nb9zvuDhx/s4DLnbfV5wPlOJ1Ge+2PHjdna/r6+n2ftVu4+o74a6n2SnLEm7sq6iowOcLMamhVrmf\nI8ttTyeXc3YN1M8ch2+QwczVSY7jp8gCtMB5caQfLuNrXJfH7fm6ngPNzf0C/z1z+50wzbOEG/sq\nKyv54osvOHr0KImJMVaBZExbE2OtFGx4xiAdO3Zk8ODBJCYmUlFRQX5+PtXV1c1vaIwJrxic08wS\nbhM8Hg/Jycn079+fqqoqysrK6vq3G2MiILwDkEeFNvRvQ+vo2LEj7dq1o6amhsrKytYujjGnjhis\nw7UnXIfi4uJISgrT0EXmlGfTpDtgVQrGmHAInjRyxYoV9O/fn4yMDGbPnn1c/M6dOxk+fDiDBg3i\n/PPPZ9kyxwNUtV2WcI0x4ebz+bj33ntZvnw5mzZtYvHixWzatKlBzBNPPMG4ceNYt24dOTk53HPP\nPa1U2shSj7OlrWhD/zYYE5s+++wzMjIy6Nu3LwDjx49n6dKlZGb+74zbIsLhw4cBOHTo0CkxxY7G\nQWWM1eJZwnUrLt5dw/WW9BxzM2eX1+Nv3O+4OMIUWeBm90g/V8VxFe+2PG7Pt0VzoLm5X7XbuPpO\nNOxp1tisvHl5eQ1iZsyYwciRI3nmmWcoKytj5cqV7srYBqlAtcfpH+E1J7Us4WIJ162aKvc9l1zO\nweW2J9Uv9FHH8U/Kr9ihXZ0XR75Bn3QcjvwCl/Hqujxuz9d1zzQ39wv8XY3dfifqcTIr7+LFi5k4\ncSI///nPWb16NbfccgsbNmwgLi52awVVBJ/XaYpqGy2IYvduGdNGOJmVd8GCBYwbNw6ASy+9lPLy\ncoqLiyNaztbg83gcLU6IyCgR2SwihSIyrZH1iSLyemB9noj0Dnx+lYisFZF/B/57Rb1tPgrsc31g\nCfn0YAnXmFZ2ySWXUFBQwLZt26isrCQnJ4fs7OwGMWeddRYffPABAF988QXl5eV06dKlNYobMYrg\nw+NoaY6IeIB5wDVAJnCTiGQGhU0CvlXVDOBp4DeBz4uBa1X1O/hn9Q2e32yCql4YWL4JVQ5LuMa0\nMq/Xy9y5c7n66qs577zzGDduHAMGDOCxxx4jNzcXgKeeeor58+dzwQUXcNNNN7Fw4cLjqh1ijSJU\n43G0ODAYKFTVrapaCeQAY4JixgCLAq+XACNERFR1naruCXy+EUgSkRb1b7M6XGOiwOjRoxk9enSD\nzx5//PG615mZmXzyySeRLlarUoRK5/12O4tIfr33L6jqC/Xe9wB21XtfBAwJ2kddTGBa9UNAGv4n\n3FrXA+tUtaLeZ38WER/w/4AntLFK+QBLuMaYqFRbpeBQsapmhVjf2J8DwYkxZIyIDMBfzTCy3voJ\nqrpbRDriT7i3AC81VQirUjDGRK1w1eHif6LtWe99OrCnqRgR8QIpQEngfTrwFnCrqn5Vu4Gq7g78\ntxR4DX/VRZMs4RpjolKY63DXAP1EpI+IJADjgdygmFz8P4oBjAU+VFUVkVTgHeBhVa2r1xERr4h0\nDryOB34EbAhVCKtSMMZEJX+VQnhSVKBOdgrwLv5hzf+kqhtF5HEgX1VzgQXAyyJSiP/Jdnxg8ylA\nBvCoiNQ2Ah8JlAHvBpKtB1gJzA9VDglRv9toud0Et0Xl5eUArF69GoDvfve7/OMf/6hbf8XIq6Ha\nRcN4rxfcDGDu9UB1iCl+gsR546ipdt7LxuMFn5vixIGL3buPd3l53J6v2+vpukDQgosaj1a1jYb6\nJ+iEmlFkZrXTV/P7OIq9SL5Y20wdblSwJ1y3qqsYqUsdh78nY5iozzmOXyh3u57jy3XPsecdhyOT\nwcXukW9aEO+qPDWuz9ft9XRzv8B/z9x+J0zzFJxWF7QZlnCNMVEqfFUK0SK2zsYYEzNcNgtrEyzh\nGmOiliVcY4yJAHvCPQUcPnyYvXv3UllZicfjsYkjjWklilDRlqbkdcASbpB27dqRlpbGvn37qKqq\nYv369Rw5cgQRiemxR42JNrH4hGsZJEh8fDydO3cmISGBpKQkBg8eTIcOHUhOTiYhIaG1i2dihM3a\n27xwDs8YLazjQ5DmOj5cefVV1FQ5b0gv3jjURUP9OK9QU+38Mp/0jgyAm24AruNPekcJd9fT7f3y\nb+NB3XRWiffgq2x4EitWrOD+++/H5/Nxxx13MG3aceNj88YbbzBjxgxEhAsuuIDXXnvNVTlbwQl1\nfMjIStH/kz/MUez1stw6PsSimioff9eLHcd/T9ayVc90HN9X9qIFzssj/dxOaeO+Y8ITzsN5BJfx\nNS3oKOFyCh9317PG1f0C/z1z+52or3bW3vfff5/09HQuueQSsrOzG0wiWVBQwK9//Ws++eQTOnXq\nxDffhBznOiaEs2tvtLAqBWNaWf1ZexMSEupm7a1v/vz53HvvvXTq1AmArl1d/CvVRsVilYIlXGNa\nWWOz9u7evbtBzJYtW9iyZQvDhg1j6NChrFixItLFjDh/K4UER0tbEVvP68a0QU5m7a2urqagoICP\nPvqIoqIiLrvsMjZs2EBqamqkihlxVqVgjAk7J7P2pqenM2bMGOLj4+nTpw/9+/enoMBF5XQbZVUK\nxpiwcjJr73XXXceqVasAKC4uZsuWLfTt27c1ihsxsViHG1vP68a0QfVn7fX5fNx+++11s/ZmZWWR\nnZ3N1VdfzXvvvUdmZiYej4ff/va3pKWltXbRT6pY7PhgCdeYKNDcrL0iwpw5c5gzZ07I/Tz66KN0\n7tyZ+++/H4Dp06fTrVs37rvvvvAX+iSLxa69VqVgTAyZNGkSixYtAqCmpoacnBwmTJjQyqVqGatS\nMHjj5biG66F4vP6G8Y737/F3ZnAcH+fvzOA4Hn/nAafi8HdmOFnxbsvj+nzdXk+X9wv899jNd8Ib\nf0IdsELq3bs3aWlprFu3jq+//ppBgwa16aqHcCZTERkF/F/884+9qKqzg9Yn4p/i/GLgAHCjqm4X\nkauA2UACUAk8oKofBra5GFgItAOWAfdriO67lnBdqq5S62kWguueZpzsnma4vp6R7mkWbnfccQcL\nFy5k37593H777Sf1WCdT7ay94SAiHmAecBX+6dDXiEiuqm6qFzYJ+FZVM0RkPPAb4EagGLhWVfeI\nyED8E1H2CGzzHPBT4FP8CXcUsLypcliVgjEx5sc//jErVqxgzZo1XH311a1dnBarbYfrZHFgMFCo\nqltVtRLIAYInlxsDLAq8XgKMEBFR1XWquifw+UYgSUQSReRM4DRVXR14qn0JuC5UIewJ15gYk5CQ\nwPDhw0lNTcXjaTv1m41xUaXQWUTy671/QVVfqPe+B7Cr3vsiYEjQPupiAtOqHwLS8D/h1roeWKeq\nFSLSI7B5JjPDAAAW/UlEQVSf+vvsQQiWcI2JMTU1NXz66ae8+eabrV2UE6IIlc677RY3M1pYYxXn\nwXWtIWNEZAD+aoaRLvbZgFUpGBNDNm3aREZGBiNGjKBfPxe/Fkah2jpcJ4sDRUDPeu/TgT1NxYiI\nF0gBSgLv04G3gFtV9at68enN7LMBe8I1JoZkZmaydevW1i5GWIR5LIU1QD8R6QPsBsYDNwfF5AK3\nAauBscCHqqoikgq8Azysqp/UlU91r4iUishQIA+4FXgmVCHsCdcYE7XC1Q5XVauBKfhbGHwBvKGq\nG0XkcRGp7Ue9AEgTkULgZ0DtKPBTgAzgURFZH1hq29bcDbwIFAJfEaKFAtgTrjEmSoW7a6+qLsPf\ndKv+Z4/Ve10O3NDIdk/QRGtHVc0HBjotgyVcY0xUCmc73GhhCdcl62kW3njraWaa4m+lEFtjKVjC\nbURNTU3dsnXrVo4dO0ZNTQ2qSnWVMlKXNr+TgPdkDBP1OcfxC+Vu5uokx/FTZAE7XHTV6iXfoM87\nDkcmt6AnmNt4l+Vxe75ur6eb+wX+e+b2OzFq1KhTYtaGExGLo4XZj2ZBDhw4QF5eHuXl5fh8PpKS\nkkhISCA5OZkOHTq0dvFMjAhOtitWrKB///5kZGQwe/bsJraCJUuWICLk5+c3GRNLYm3wGku4QdLS\n0rj00ktJTk4mMTGR7t274/F4jpvyxJhwqZ21d/ny5WzatInFixezadOm4+JKS0v5wx/+wJAhwR2k\nYlOY2+FGBUu4xrQyJ7P2gn+s2wcffJCkpKRWKGXkhXkshahgCdeYVuZk1t5169axa9cufvSjH0W6\neK2mtmuvk6WtaDv/NBgTo5qbtbempoapU6eycOHCCJaq9VmzMGNM2DU3a29paSkbNmzg8ssvB2Df\nvn1kZ2eTm5tLVlao8VravrZUXeBEbJ2NMW1Q/Vl7e/ToQU5ODq+99lrd+pSUFIqL/3eEwMsvv5zf\n/e53MZ9srVmYMSbs6s/ae9555zFu3Li6WXtzc3Nbu3itJhbnNJMQ0+80xlVwW1ReXg7A6tWrAfju\nd7/LP/7xj7r1I66+Cq3yOd6feOPQ6hrH8XFeoaba+WX2eMFX7Tgcbxy4KA5ewMXu3ce7LY8Xql0c\nwO31dHu//Nt40GoX34l4DzWVbq5Sm3VCbSk7Zp2jF+bPcxT7dxm5tpnxcKOCVSm4pFU++MT5/8A6\nTGBHleP4ml7xDNTPHMdvkMH8Qh91HP+k/Mp9zzS3c4i5jHdbHrfn6/Z6urlfANor3v13wjSrhjjr\n2muMMZHSlqoLnLCEa4yJSrH4o5klXGNMVFKwdrjGGBMZYZ1iJyrE1tkYY2JGLFYpWDtcY0xUUoQK\nEhwtTojIKBHZLCKFIjKtkfWJIvJ6YH2eiPQOfJ4mIqtE5IiIzA3a5qPAPoPnOmuUPeEaY6JSOGft\nFREPMA+4Cv/05mtEJFdV64+DOQn4VlUzRGQ88BvgRqAceBT/3GWNzV82ITC3WbPsCdcYE7XC2NNs\nMFCoqltVtRLIAcYExYwBFgVeLwFGiIioapmq/h1/4j0h9oTrljce3DRc93qhV7yLeI+/8b1Dcd44\nnpRfOY73eP2dBxwXx+0cYm7jXZbH7fm6vZ6u7xf4L6qr74TL/Z+iXNbhdhaR+k+ZL6jqC/Xe9wB2\n1XtfBASP5F4Xo6rVInIISAOKCe3PIuID/h/whIbovmsJ163qKpjqoofz0wKzXcRPE1e9lmqGieue\nVG7n+NICx+FIP1zHuy2P655jLq4nw1zeL/DfM7ffCdMsRfDVOE64xc107W3sogffNCcxwSao6m4R\n6Yg/4d4CvNRUsCVcY0xU0hqhojxsXXuLgJ713qcDe5qIKRIRL5AClIQso+ruwH9LReQ1/FUXTSZc\nq8N1odrNqCnGmBOiKviqPY4WB9YA/USkj4gkAOOB4KHYcoHbAq/HAh+Gqh4QEa+IdA68jgd+BGwI\nVQhLuM2oqamhqqqKsrIyqqrcDWpiTFNGjRrV4H1zs/bOmTOHzMxMzj//fEaMGMGOHTsiVdTWo4Qt\n4apqNTAFeBf4AnhDVTeKyOMikh0IWwCkiUgh8DOgrumYiGwH5gATRaRIRDKBROBdEfkXsB7YDcwP\nVQ6rUmiCqlJVVcXq1avx+XwkJyfbzL0mbOpPk147a+/7779Peno6l1xyCdnZ2WRmZtbFDBo0iPz8\nfJKTk3nuued48MEHef3111uj6BGjKlRXha/jg6ouA5YFffZYvdflwA1NbNu7id1e7KYM9oQbpKqq\niq+++oqysjJUlcGDB5OUlGTJ1pw0TmbtHT58OMnJyQAMHTqUoqKi1ihqhAk1Pq+jpa2whBukrKyM\nhIQE2rdvT2JiIvHx1oTHnFxOZu2tb8GCBVxzzTWRKFrrUqDa42xpI9rOPw0RkpqaSmpq6inyBGGi\nQXOz9tb3yiuvkJ+fz8cff3yyi9X6agTKYytFxdbZREJcvLt2lHFefztNp1w3onfbUUKYIgvc7B7p\n56o4ruLdlsd1Rwa319Pt/ardxtV3ouFfTc3N2ltr5cqVzJo1i48//pjExNiaCaFJMdYwyBKuWzVV\ncKmLRu6rBca6iF/Sgo4SLqfwmajPOY5fKHezVc90HN9X9rqOd1seV1Pg9Ip3fz3d3C/w3zO334l6\nmpu1F2DdunXcddddrFixgq5dnU9J1Kb5B8SNKZZwjWll9Wft9fl83H777XWz9mZlZZGdnc0DDzzA\nkSNHuOEG/4/oZ511VuzP6GsJ1xhzMowePZrRo0c3+Ozxxx+ve71y5cpIF6n1KRBjTd8t4RpjopMC\nFa1diPCyhGuMiU5WpWCMMRFiCdcYYyLEEq4xxkSIJVxjjIkgS7inOIk/ruF66Hivv2G8Uy3pmeZi\nShjxxvk7D7jYfV/Z6zje6zLebXlcT4Hj9nq6vV+127j6Ttj4HI7UEIZZxKKLJVy3tAr6uOhVtK0F\nvZDcTtfiYgoZHSaM1KXNBwa8J2P4uzofge57stZ1vNvyuJ4yx+31dHO/wH/P3H4nTPOsSsEYYyLE\nEq4xxkSIJVxjjImgGEu4NgC5MSY61T7hOlkcEJFRIrJZRApFZFoj6xNF5PXA+jwR6R34PE1EVonI\nERGZG7TNxSLy78A2f5BmpoaxhGuMiU41wDGHSzNExAPMA64BMoGbAhNB1jcJ+FZVM4Cngd8EPi8H\nHgX+u5FdPwf8FOgXWEY1ElPHEq5DqsrRo0dbuxgmRridtbeiooIbb7yRjIwMhgwZwvbt2yNU0lak\ngM/h0rzBQKGqblXVSiAHGBMUMwZYFHi9BBghIqKqZar6d4IaqYnImcBpqro6MJ36S8B1oQphCdcB\nn89HWVmZzW9mwqaxWXuXL1/Opk2bWLx4MZs2bWoQv2DBAjp16kRhYSFTp07loYceinSRW4fzKoXO\nIpJfb/lp0J56ALvqvS8KfNZoTGBa9UNAWojS9QjsJ9Q+G7CE24y9e/dy7NgxkpOTLeGak8LJrL1L\nly7ltttuA2Ds2LF88MEHjc6FFlPc1eEWq2pWveWFoL01VrcafAGdxJxIvLVSCKW8vJx9+/bRvn17\nRIS4uDjaJZ/GMTcN1932THM7Z5on3tWcXRLv8XcecLx74Xuy1nG812W82/LgdXe+rq+n2/tVu43L\n78TAgQNJT09nxYoVjc7am5eX12CT+jFer5eUlBQOHDhA586d3ZW1LQlvs7AioGe99+nAniZiikTE\nC6QAJc3sM72ZfTZgCbcRFRUVlJWV4fV6ufDCC1m9ejVxcXFUV1fzxuuv4vF4IjaJX01NTd0TdjM/\ngIZNZWUlIhLRJ/qysjLat28fseNVVlZSU1NDUlJSRI5Xex8TExN5+OGH2bFjB+Xl5WRlZVFdXU1W\nVlaD+OB77WZm35gR3q69a4B+ItIH2A2MB24OiskFbgNWA2OBDzXEnxGquldESkVkKJAH3Ao8E6oQ\nVqUQ5NChQ6xdu5bExEQSExNRVeLi4qiqquLo0aPEx8dHLNmqKuXl5SQlJUX0fy6fz4fH44nY8QDi\n4uKoqamJ2PESEhKoqamhujoyDT3j4uJITk6msrKSWbNm0bt3b6qqqti/fz/l5eW8/fbbdbGNzdpb\nf2bf6upqDh06xOmnnx6RsreqMDULC9TJTgHeBb4A3lDVjSLyuIhkB8IWAGkiUgj8DKhrOiYi24E5\nwEQRKarXwuFu4EWgEPgKWB6qHOKyHijGK43g4MGDgH+W1Li4OHw+Hz6fry7xRTIRVVT45xeJ9JTY\nkX7aBP8TJ/gTYaS0xl8Ptf+IiggJCQn87Gc/Y//+/ZSUlDB06FDef/99LrnkEl577TUGDBhQt928\nefP497//zfPPP09OTg5/+ctfeOONNyJS5hNwQhdVumYpY/OdBT8na1U1q/nA1mVVCkGSkpJQVVSV\niy66iK+//ppdu3YxZMgQ2rVrF7FyHDp0iK+++opBgwZF9Om2rKyMbdu2MXDgwIgdE6C0tJRdu3aR\nmRncNPLkKi4uZs+ePXznO9+JaNLdsWMHBw8eZNWqVbz22ms888wz7Ny5k/POO6/RWXsnTZrELbfc\nQkZGBqeffjo5OTkRKWurisFJJO0JN8jRo0eprKxk/fr1VFVVUVFREfE/6cH/dBsfH09cXGRrfXw+\nH6qK1xv5f4srKioi/jRfe9zWuNbV1dX4fD5++ctfcvDgQXbv3s3ZZ59Njx49GjQba8NO7Am3c5aS\n7fAJ989t4wnXEm4QVW1Ql6iqsf/jhGk19b9f+/fvp1u3brH0fTuxhJuWpfzQYcJ9uW0kXKtSCCIi\nEf/ByBiAM844o7WLEF0UR9122xJLuMaY6FTbtTeGWMI1xkQnGw/XGGMixBKuMcZESAw2C7OeZsZE\niZKSEq666ir69evHVVddxbffftto3KJFi+jXrx/9+vVj0aJFx63Pzs6OeDvqkyZ8wzNGBUu4xkSJ\n2bNnM2LECPLy8ti+fTt9+/Y9LvGWlJQwc+ZM8vLymDp1KnfccQdnn312XeJdvHgxa9eupaCggAED\nBjBt2nETG7QdtWMpOFnaCEu4xkSJpUuXctZZZ5GRkUFxcTFer5cRI0Y0GJD8r3/9KyJCVlYWP/vZ\nz8jOzmbatGnMnDmThx56iP/8z//E5/Nx5plnsm7dOj755BOWLw/ZvT961VYpOFnaCEu4xkSJffv2\n8eijj5KSksL69espKSnh0ksvbTCwzdtvv01aWhqzZs1i2LBhbNmyhUOHDpGVlcVzzz3HSy+9xJtv\nvsmePXvweDxcdNFFFBUVhThqFAvvjA9RwX40MyaCrrzySvbt23fc57NmzcLn85GRkUFeXh5ffPEF\nqspPfvKTBlM7bdy4kR/84Afs2LGDr7/+mk2bNvGHP/yBtLQ0kpKS6NSpE/fccw/V1dWce+65HDly\nhPvvvz+SpxheMdZKwZ5wjYmglStXsmHDhuN6lU2fPp2KigqOHTuGqjJ58mQ6duxYN1Ld1KlTAf9Y\nH2VlZeTl5dWNXnfw4EH+9a9/cejQIW677TaKi4sB2LVrF/v27eMvf/lLxM8zLMI8a280sCdcY1rB\nypUrj/ssOzubvXv3kpKSgohQXV3N6NGjWbVqFTk5Odx55520b9+ev/3tb5x22mmAf7Chzz77jMzM\nTHr27ElhYSHbt2+nf//+pKamUlJSErExf8MuvAOQRwV7wjUmStxzzz1s3bqVAwcO8M0333DGGWdQ\nWlrKueeei8/nY+nSpfTq1YtbbrmFgoICNm3aRGJiIl27dgX80/CoKr/73e+orq4mIyOD9PT0Vhn5\nLSxi8AnXEq4xUeLKK68kJSWFxx57jISEBLZv3863337LhAkTuOCCC1i3bh2lpaWUlJTQr1+/uifh\nwYMHk5qais/nIz8/n3nz5lFTU8Nnn33G4cOHj5sfrU2xhGuMORm8Xi9z585l7ty5HD16lEGDBpGX\nl8ebb77JsWPH6NatGx9++CEHDhxg27ZtHDt2jPfff58vv/ySuLg4OnTowA033MBpp51Gp06dWLVq\nFVOmTGHIkCGtfWotY83CjDEn0+jRo9m2bRtpaWl1c6AdOHCArKwsunfvTlJSEm+++Sa//e1v6dq1\nK3FxcSxZsoTLL7+cuLg41q1bR3V1NV6vlwkTJvD73/+eJ598krlz57b2qbkX5mZhIjJKRDaLSKGI\nHNcjREQSReT1wPo8Eeldb93Dgc83i8jV9T7fLiL/FpH1ItLs4L2WcI2JMl6vlz/+8Y+sXr2ajIwM\nfvKTn7Bq1Sp27NhBbm4uAJMmTaJz586MGjWKOXPmcNlll3HFFVcwb948ALp3705qaipJSUncd999\nTJkypTVPqWXCWIcrIh5gHnANkAncVG8iyFqTgG9VNQN4GvhNYNtM/LP8DgBGAc8G9ldruKpe6GQA\ndEu4xkSha6+9lqVLl5KUlMRLL73EuHHjeP7558nPzyc3N5ekpCRWr17NyJEjKSkp4dVXX2X27Nk8\n8sgjlJWVsX79etavX8/kyZPp0KEDAM8//zwXXnghF154IX369GH48OGtfJbNqME/ALmTpXmDgUJV\n3aqqlUAOMCYoZgxQOzjFEmCE+KffGAPkqGqFqm7DP0Pv4Jackk2xY8wppqqqiiuuuIIHH3yQa6+9\n9mQe6sSm2JEspfm/0v009BQ7IjIWGKWqdwTe3wIMUdUp9WI2BGKKAu+/AoYAM4BPVfWVwOcLgOWq\nukREtgHf4s+Nf1TVF0IVs422FzHGtNT999/PFVdccbKTbXg4f8TrHFSH+kJQ8mss+QfvvamYUNsO\nU9U9ItIVeF9EvlTVvzVVSEu4xpxCFi5cyI4dO9rmj2ihFTdTh1oE9Kz3Ph3Y00RMkYh4gRSgJNS2\nqlr7329E5C38VQ1NJlyrwzXmFLF27Vp+97vf8corr0R8SvgosAboJyJ9RCQB/49guUExucBtgddj\ngQ/VX+eaC4wPtGLoA/QDPhOR9iLSEUBE2gMjgQ2hCmFPuMacIubOnUtJSUndj2VZWVm8+OKLrVyq\nyFDVahGZArwLeIA/qepGEXkcyFfVXGAB8LKIFOJ/sh0f2HajiLwBbMLfJuJeVfWJSDfgrcC09l7g\nNVVdEaoc9qOZMeZkOcEfzS5S+MRhdHLIH82ihT3hGmOiVOxNamYJ1xgTpWJv2l5LuMaYKGVPuMYY\nEyGWcI0xJkIUp/122wpLuMaYKGV1uMYYEyFWpWCMMRFiT7jGGBMh9oRrjDERYk+4xhgTIbUjkMcO\nS7jGmChlVQrGGBNBVqVgjDERYE+4xhgTIZZwjTEmQqyVgjHGRIi1UjDGmAixKgVjjImQ2KtSOOWm\n7jTGtBW1T7hOluaJyCgR2SwihSIyrZH1iSLyemB9noj0rrfu4cDnm0Xkaqf7DGYJ1xgTpWqfcJ0s\noYmIB5gHXANkAjeJSGZQ2CTgW1XNAJ4GfhPYNhP/DL4DgFHAsyLicbjPBizhGmOiVO2PZk6WZg0G\nClV1q6pWAjnAmKCYMcCiwOslwAjxz4E+BshR1QpV3QYUBvbnZJ8NuK3DPaFpj40xxrm978KMzg6D\nk0Qkv977F1T1hXrvewC76r0vAoYE7aMuRlWrReQQkBb4/NOgbXsEXje3zwbsRzNjTFRS1VFh3F1j\nD4vqMKapzxurIQjeZwNWpWCMORUUAT3rvU8H9jQVIyJeIAUoCbGtk302YAnXGHMqWAP0E5E+IpKA\n/0ew3KCYXOC2wOuxwIeqqoHPxwdaMfQB+gGfOdxnA1alYIyJeYE62SnAu4AH+JOqbhSRx4F8Vc0F\nFgAvi0gh/ifb8YFtN4rIG8Am/E0i7lVVH0Bj+wxVDvEncGOMMSebVSkYY0yEWMI1xpgIsYRrjDER\nYgnXGGMixBKuMcZEiCVcY4yJEEu4xhgTIf8f6aBiEeLiQs0AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -336,9 +191,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4lNXZ+PHvPZOFhCUsAaqE1SAaLCKyKdiCtoBYQS8R\nAdefu8JPbK1Ka8GI1RfbgvZVsBWpiFYi5a0lVsAN0V8tW5BaAStEZAmoEBAIgUkyM/fvj5nkTYYs\nz5DJZDLcn+t6LmY5c855ZsKdkzPPObeoKsYYYxqeq7E7YIwxpwsLuMYYEyUWcI0xJkos4BpjTJRY\nwDXGmCixgGuMMVFiAdcYc1oQkVEi8oWI5IvItGqeTxaR14PPrxORbiHPdxGRYyLyc6d1hrKAa4yJ\neyLiBuYClwNZwEQRyQopdhvwnapmAk8DT4U8/zSwIsw6q7CAa4w5HQwE8lV1h6qWAjnA2JAyY4GX\ng7eXApeJiACIyFXADmBLmHVWkRBmp21ZmjHGKanPizNF9LjDsl8HAqGn0kMvqOoLle53AvZUul8A\nDAqppqKMqnpF5AjQTkROAA8DPwZ+Xl35WuqsItyAa4wxUXEcuMth2WzwqGr/WopUF/xDB5A1lXkM\neFpVjwUHvOHUWYUFXGNMTBIiGqAKgM6V7mcA+2ooUyAiCUAacIjAqHWciPwGaA34RcQDbHRQZxUW\ncI0xMckFpESuug1ATxHpDuwFJgCTQsrkAjcDa4BxwCoN7O51SXkBEckGjqnqc8GgXFedVVjANcbE\nJAESI1RXcE52CvA24Ab+pKpbRGQmkKequcAC4BURyScwsp1wKnXW9hoJc3tG+9LMGONUvb406yqi\ndV7YGnQvbKxjDjcm2AjXGBOTIjnCjRUWcI0xMSnCX5rFhHg7H2NMnLARrjHGREmEr1KICRZwjTEx\nyUa4xhgTRfEWoOLtfIwxccJGuMYYEyV2lYIxxkSJfWlmjDFRYlMKxhgTJTalYIwxUWIjXGOMiRIb\n4RpjTJTYCNcYY6JEiL+rFCxrr4mKP//5z4wYMaKxu2GaEAESE5wdTYUFXBO2YcOG8eKLL9b4/M6d\nOxERvF5vxWPXX38977zzTjS6V21/hg8fTmpqKueccw7vvfdejWWXLFnCxRdfTGpqKsOGDYteJ81J\nRCAhwdnRVFjAbWCVg87p3IfGNHHiRC644AIOHjzIE088wbhx4zhw4EC1Zdu2bcv999/PtGlOcw2Y\nhiICiW5nR5OhquEcRlW7du2qTz75pJ577rnaunVrveWWW/TEiROqqvrBBx9op06ddNasWdqxY0e9\n4YYbVFX1zTff1PPPP1/T0tL0oosu0k8//bSivlmzZumZZ56pLVq00LPPPlvfe+89VVVdt26dXnjh\nhdqyZUvt0KGD/vSnP63SRmif3n33XVVVffTRR/Waa67R66+/Xlu2bKnz589Xn8+n//Vf/6U9evTQ\ntm3b6rXXXqsHDx6s9vwOHTqkV1xxhaanp2vr1q31iiuu0D179qiq6i9/+Ut1uVyanJyszZs318mT\nJ6uq6vr16/X73/++njhxQjMyMhTQlJQUbd68uf7zn//Ul156SYcMGVLRBqBz587VzMxMbdGihf7q\nV7/S/Px8HTx4sLZs2VKvvfZaLSkpqShf2/tXmy+++EKTkpL06NGjFY8NHTpUn3/++VpfN3/+fP3h\nD39Ya5kDBw7oFVdcoWlpadqmTRsdOnSo+nw+R/06TYQbX6oc/dxoaZqzg0BeslrrA0YBXwD5wLRq\nnk8GXg8+vw7oFnx8IPCv4PEpcHWl1+wEPgs+V3cfwnwTjAaCW+/evXX37t168OBBvfjii/WRRx5R\n1UAwdLvd+tBDD6nH49Hjx4/rxo0btX379rp27Vr1er26cOFC7dq1q3o8Hv3Pf/6jGRkZunfvXlVV\n/eqrrzQ/P19VVQcPHqyLFi1SVdWioiJds2ZNRRt1BdyEhAR944031Ofz6fHjx/Xpp5/WQYMG6Z49\ne9Tj8eidd96pEyZMqPb8CgsLdenSpVpcXKxHjx7VcePG6dixYyue/+EPf6jz588/6XWPPPKIPvDA\nA3rDDTcooGVlZRXPVRdwr7zySj1y5Ihu3rxZk5KS9NJLL9Uvv/xSDx8+rOeee64uXLhQVbXW909V\n9Z577tF77rmn2nP561//quecc06VxyZPnqxTpkyptnw5JwF32rRpetddd2lpaamWlpbqRx99pH6/\nv9bXnGbqFXAvTEC1g7OjrmBHIMnjl0APICkYOLNCytwL/CF4ewLwevB2KpAQvH0GsL/S/Z1AutNz\nsimFUzRlyhQ6d+5M27ZteeSRR1i8eHHFcy6Xi8cee4zk5GRSUlKYP38+d911F4MGDcLtdnPzzTeT\nnJzM2rVrcbvdlJSUsHXrVsrKyujWrRtnnXUWAImJieTn51NYWEiLFi0YPHiw4/5ddNFFXHXVVbhc\n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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VNXV+PHvyuRGABMIgoUgF4No4t0IWGuroohYg62I\nKEV9xbvUS1sFS7GgotgW9FcBLUgLaiFqXpVUBRVFfWsxGgqtgBUit4SLEsI1kNvM+v0xkzQZcjmT\nTCaTyfo8z3mYc8465+yZE1Z29py9t6gqxhhjWl5UaxfAGGPaC0u4xhgTIpZwjTEmRCzhGmNMiFjC\nNcaYELGEa4wxIWIJ1xjTLojIcBH5WkTyRWRSHfvjROQV3/5cEenrt/9EETksIr9yek5/lnCNMRFP\nRFzAHOAKIA24XkTS/MLGA/tUNRV4GnjKb//TwLIAz1mLJVxjTHswCMhX1c2qWg5kASP9YkYCi3yv\ns4GhIiIAInI1sBlYH+A5a4kOsNDWLc0Y45Q05+BUET3iMHaXNxGW1tg0T1Xn1VjvBRTUWC8EBvud\npjpGVStF5ACQLCJHgYnAZcCv6opv4Jy1BJpwjTEmJI4AdziMnQqlqprRQEhdyd+/AllfzDTgaVU9\n7KvwBnLOWizhGmPCkhDUBFUI9K6xngLsrCemUESigUSgGG+tdZSI/A5IAjwiUgqsdnDOWizhGmPC\nUhTQIXin+wIYICL9gB3AGOAGv5gc4CZgFTAK+FC9o3tdWBUgIlOBw6o625eUGztnLZZwjTFhSYCY\nIJ3L1yY7AXgXcAF/VtX1IvIokKeqOcAC4CURycdbsx3TlHM2dIwEODyjfWlmjHGqWV+a9RHRRh9s\n9bkbVjfShhsWrIZrjAlLwazhhgtLuMaYsBTkL83CQqS9H2NMhLAarjHGhEiQn1IIC5ZwjTFhyWq4\nxhgTQpGWoCLt/RhjIoTVcI0xJkTsKQVjjAkR+9LMGGNCxJoUjDEmRKxJwRhjQsRquMYYEyJWwzXG\nmBCxGq4xxoSIEHlPKdisvSYk/vrXvzJs2LDWLoZpQwSIiXa2tBWWcE3ALrroIl544YV692/duhUR\nobKysnrb2LFjee+990JRvDrLc/HFF5OQkMApp5zCihUr6o199dVX+f73v09CQgIXXXRR6AppjiEC\n0dHOlrbCEm4Lq5l02nMZWtP111/P2Wefzd69e5k+fTqjRo1iz549dcZ27dqV+++/n0mTnM41YFqK\nCMS4nC1thqoGshhV7dOnjz7xxBN66qmnalJSkt5888169OhRVVVduXKl9urVS2fMmKE9evTQn/3s\nZ6qq+re//U3PPPNMTUxM1PPPP1//9a9/VZ9vxowZ2rNnT+3UqZOefPLJumLFClVVzc3N1XPPPVc7\nd+6s3bt31wceeKDWNfzL9P7776uq6m9/+1u95pprdOzYsdq5c2edP3++ut1uffLJJ7V///7atWtX\nvfbaa3Xv3r11vr/i4mK98sortVu3bpqUlKRXXnmlFhQUqKrqr3/9a42KitK4uDjt2LGj3nPPPaqq\n+vnnn+vpp5+uR48e1ZSUFAW0Q4cO2rFjR/3HP/6hf/nLX/SCCy6ovgagc+bM0dTUVO3UqZP+5je/\n0fz8fB0yZIh27txZr732Wi0rK6uOb+jza8jXX3+tsbGxevDgweptP/jBD/S5555r8Lj58+frj370\nowZj9uzZo1deeaUmJiZqly5d9Ac/+IG63W5H5WonAs0vtZZzXGh5orMF77xkDZ4PGA58DeQDk+rY\nHwe84tufC/T1bR8ErPUt/wJ+UuOYrcCXvn2NlyHAD8GoN7mlp6fr9u3bde/evfr9739fJ0+erKre\nZOhyufShhx7S0tJSPXLkiK5evVqPP/54/eyzz7SyslIXLlyoffr00dLSUv3Pf/6jKSkpumPHDlVV\n3bJli+bn56uq6pAhQ/TFF19UVdVDhw7pqlWrqq/RWMKNjo7WN954Q91utx45ckSffvppHTx4sBYU\nFGhpaanefvvtOmbMmDrfX1FRkWZnZ2tJSYkePHhQR40apSNHjqze/6Mf/Ujnz59/zHGTJ0/WX/7y\nl/qzn/1MAa2oqKjeV1fCveqqq/TAgQO6bt06jY2N1UsuuUS/+eYb3b9/v5566qm6cOFCVdUGPz9V\n1bvuukvvuuuuOt/L66+/rqecckqtbffcc49OmDChzvgqThLupEmT9I477tDy8nItLy/XTz75RD0e\nT4PHtDPNSrjnRqPa3dnSWLLDO8njN0B/INaXONP8Yu4Gnve9HgO84nudAET7Xn8P+K7G+lagm9P3\nZE0KTTRhwgR69+5N165dmTx5MkuWLKneFxUVxbRp04iLi6NDhw7Mnz+fO+64g8GDB+NyubjpppuI\ni4vjs88+w+VyUVZWxoYNG6ioqKBv376cdNJJAMTExJCfn09RURGdOnViyJAhjst3/vnnc/XVVxMV\n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\nISl7qwrSY2G+NtkJwLvAV8CrqrpeRB4VkUxf2AIgWUTygV8A1Y+OichWYBZws4gU1njC4S7gBSAf\n+AZY1lA5bPAaP/v37we8s6RGRUXhdrtxu93ViS+UiaiszDu/SKgSfJVQ1zbBW+MEbyIMldb466Hq\nl6iIEBsbyy9+8Qv27NlDcXExQ4YM4f333+e8885j8eLFpKenVx83Z84cvvzyS55//nmysrJ4/fXX\nefXVwMZ8aAXNG7yme4YyyuHgNc/Z4DVtUnx8PKqKqnLOOefw7bffUlBQwODBg+nQoUPIynHgwAG+\n+eYbzj777JDWbktKStiyZQunnXZayK4JcOjQIQoKCkhL8380smUVFRWxc+dOTj/99JAm3W3btrF/\n/35WrlzJ4sWLefbZZ9m+fTunnnpqnbP2jh8/nnHjxpGamkrXrl3JysoKSVlbVQROImk1XD9Hjhyh\nvLyctWvXUlFRQVlZWcj/pAdv7TYmJoaoqNC2+rjdblSV6OjQ/y4uKysLeW2+6rqt8VlXVlbidrv5\n7W9/y/79+9mxYwcnnXQSvXr1qvXYWBvWvBputwwl02EN9y9to4ZrCdePqtZqS1TVyP9ywrSamj9f\ne/bsoUePHpH089a8hJucoVzpMOG+1DYSrjUp+BGRkH9hZAzACSec0NpFCC+Ko267bYklXGNMeKrq\n2htBLOEaY8KTjYdrjDEhYgnXGGNCJAIfC7OeZsaEieLiYi677DIGDBjAZZddxr59++qMW7RoEQMG\nDGDAgAEsWrTomP2ZmZkhf466xQRveMawYAnXmDAxY8YMhg4dSm5uLlu3bqV///7HJN7i4mKmTZtG\nbm4uDzzwALfeeisnnXRSdeJdsmQJq1evZtOmTaSnpzNp0jETG7QdVWMpOFnaCEu4xoSJpUuXcuKJ\nJ5KamkpRURHR0dEMHTq01oDkb731FiJCRkYGv/jFL8jMzGTSpElMmzaNiRMn8j//8z+43W6+973v\nsWbNGj799FOWLWuwe3/4qmpScLK0EZZwjQkTu3fvZsqUKSQmJrJ27VqKi4s5//zzaw1s8+abb5Kc\nnMz06dO54IIL2LhxIwcOHCAjI4PnnnuOF198kddee42dO3ficrk455xzKCwsbOCqYSy4Mz6EBfvS\nzJgQuvTSS9m9e/cx26dPn47b7SY1NZXc3Fy++uorVJWf/vSntaZ2Wr9+PT/60Y/Ytm0b3377LRs2\nbOCPf/wjycnJxMfH06VLF+6++24qKys55ZRTOHz4MPfdd18o32JwRdhTClbDNSaEVqxYwbp1647p\nVTZ58mTKyso4evQoqsqdd95J586dq0eqe+CBBwDvWB8lJSXk5uZWj163f/9+/v3vf3PgwAFuuukm\nioqKACgoKGD37t28/vrrIX+fQRHkWXvDgdVwjWkFK1asOGZbZmYmu3btIjExERGhsrKSESNGsHLl\nSrKysrjtttvo2LEjn3zyCccddxzgHWzo888/Jy0tjd69e5Ofn8/WrVsZOHAgSUlJFBcXh2zM36AL\n7gDkYcFquMaEibvvvpvNmzezd+9evvvuO0444QQOHTrEKaecgtvtZunSpfTp04dx48axadMmNmzY\nQFxcHN27dwe80/CoKn/4wx+orKwkNTWVlJSUVhn5LSgisIZrCdeYMHHppZeSmJjII488QmxsLFu3\nbmXfvn2MHTuWM888kzVr1nDo0CGKi4sZMGBAdU140KBBJCUl4Xa7ycvLY86cOXg8Hj7//HMOHjx4\nzPxobYolXGNMS4iOjmb27NnMnj2bI0eOcPbZZ5Obm8trr73G0aNH6dGjBx9++CF79+5ly5YtHD16\nlPfff5///Oc/REVF0alTJ6699lqOO+44unTpwsqVK5kwYQKDBw9u7bfWNPZYmDGmJY0YMYItW7aQ\nnJxcPQfa3r17ycjIoGfPnsTHx/Paa6/x+9//nu7duxMVFUV2djYXXXQRUVFRrFmzhsrKSqKjoxk7\ndizPPPMMTzzxBLNnz27ttxa4ID8WJiLDReRrEckXkWN6hIhInIi84tufKyJ9a+x72Lf9axG5vMb2\nrSLypYisFZFGB++1hGtMmImOjuZPf/oTq1atIjU1lZ/+9KesXLmSbdu2kZOTA8D48ePp1q0bw4cP\nZ9asWVx44YVccsklzJkzB4CePXuSlJREfHw89957LxMmTGjNt9Q0QWzDFREXMAe4AkgDrq8xEWSV\n8cA+VU0Fngae8h2bhneW33RgODDXd74qF6vqWU4GQLeEa0wYuuqqq1i6dCnx8fG8+OKLjB49muef\nf568vDxycnKIj49n1apVDBs2jOLiYv76178yY8YMfvOb31BSUsLatWtZu3Ytd955J506dQLg+eef\n56yzzuKss86iX79+XHzxxa38LhvhwTsAuZOlcYOAfFXdrKrlQBYw0i9mJFA1OEU2MFS802+MBLJU\ntUxVt+CdoXdQU96STbFjTDtTUVHBJZdcwkMPPcRVV13Vkpdq3hQ7kqE0/le6lzY8xY6IjAKGq+qt\nvvVxwGBVnVAjZp0vptC3/g0wGJgKfKaqL/u2LwCWqWq2iGwB9uHNjX9S1XkNFbONPi9ijGmq++67\nj0suuaSlk21wOK/idfNrQ53nl/zqSv7+Z68vpqFjL1DVnSLSHXhfRP6jqp/UV0hLuMa0IwsXLmTb\ntm1t80u0hhU10oZaCPSusZ4C7KwnplBEooFEoLihY1W16t/vROQNvE0N9SZca8M1pp1YvXo1f/jD\nH3j55ZdDPiV8GPgCGCAi/UQkFu+XYDl+MTnATb7Xo4AP1dvmmgOM8T3F0A8YAHwuIh1FpDOAiHQE\nhgHrGiqE1XCNaSdmz55NcXFx9ZdlGRkZvPDCC61cqtBQ1UoRmQC8C7iAP6vqehF5FMhT1RxgAfCS\niOTjrdmO8R27XkReBTbgfSbiHlV1i0gP4A3ftPbRwGJVXd5QOexLM2NMS2nml2bnKHzqMDqhwS/N\nwoXVcI0xYSryJjWzhGuMCVORN22vJVxjTJiyGq4xxoSIJVxjjAkRxWm/3bbCEq4xJkxZG64xxoSI\nNSkYY0yIWA3XGGNCxGq4xhgTIlbDNcaYEKkagTxyWMI1xoQpa1IwxpgQsiYFY4wJAavhGmNMiFjC\nNcaYELGnFIwxJkTsKQVjjAkRa1IwxpgQibwmhXY3dacxpq2oquE6WRonIsNF5GsRyReRSXXsjxOR\nV3z7c0Wkb419D/u2fy0ilzs9pz9LuMaYMFVVw3WyNExEXMAc4AogDbheRNL8wsYD+1Q1FXgaeMp3\nbBreGXzTgeHAXBFxOTxnLZZwjTFhqupLMydLowYB+aq6WVXLgSxgpF/MSGCR73U2MFS8c6CPBLJU\ntUxVtwD5vvM5OWctgbbhNmvaY2OMcW7XuzC1m8PgeBHJq7E+T1Xn1VjvBRTUWC8EBvudozpGVStF\n5ACQ7Nv+md+xvXyvGztnLfalmTEmLKnq8CCerq7KojqMqW97XS0E/uesxZoUjDHtQSHQu8Z6CrCz\nvhgRiQYSgeIGjnVyzlos4Rpj2oMvgAEi0k9EYvF+CZbjF5MD3OR7PQr4UFXVt32M7ymGfsAA4HOH\n56zFmhSMMRHP1yY7AXgXcAF/VtX1IvIokKeqOcAC4CURycdbsx3jO3a9iLwKbMD7SMQ9quoGqOuc\nDZVDvAncGGNMS7MmBWOMCRFLuMYYEyKWcI0xJkQs4RpjTIhYwjXGmBCxhGuMMSFiCdcYY0Lk/wPx\nZAzfsR/fvAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -346,7 +201,7 @@ } ], "source": [ - "pressures = solution['pressure']\n", + "pressures = solution['flow']\n", "time_steps = [50,100]\n", "dt = problem.time_step()\n", "\n", From 87215ff0fd55f560404733620462e63db3fd2f00 Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 9 Oct 2017 10:00:44 +0200 Subject: [PATCH 11/53] Changed name of parameters in pdesolver from flow names to more general names E.g., permeabillity -> diffusivity --- src/porepy/numerics/fv/tpfa.py | 5 ++ .../numerics/mixed_dim/abstract_coupling.py | 5 +- src/porepy/numerics/pdesolver.py | 78 ++++++------------- 3 files changed, 33 insertions(+), 55 deletions(-) diff --git a/src/porepy/numerics/fv/tpfa.py b/src/porepy/numerics/fv/tpfa.py index 424c8cfceb..73ee740016 100644 --- a/src/porepy/numerics/fv/tpfa.py +++ b/src/porepy/numerics/fv/tpfa.py @@ -221,6 +221,11 @@ def __init__(self, physics='flow'): coupling_conditions = TpfaCoupling(discr) self.solver = Coupler(discr, coupling_conditions) + def ndof(self, gb): + ndof = 0 + for g, _ in gb: + ndof += g.num_cells + def matrix_rhs(self, gb): return self.solver.matrix_rhs(gb) diff --git a/src/porepy/numerics/mixed_dim/abstract_coupling.py b/src/porepy/numerics/mixed_dim/abstract_coupling.py index ab4bf24193..eaa433f290 100644 --- a/src/porepy/numerics/mixed_dim/abstract_coupling.py +++ b/src/porepy/numerics/mixed_dim/abstract_coupling.py @@ -1,9 +1,10 @@ import numpy as np import scipy.sparse as sps + class AbstractCoupling(object): -#------------------------------------------------------------------------------# + #------------------------------------------------------------------------------# def __init__(self, solver): self.solver = solver @@ -71,7 +72,7 @@ def create_block_matrix(self, g_h, g_l): dof = np.array([self.solver.ndof(g_h), self.solver.ndof(g_l)]) # Create the block matrix for the contributions - cc = np.array([sps.coo_matrix((i,j)) for i in dof for j in dof]) + cc = np.array([sps.coo_matrix((i, j)) for i in dof for j in dof]) return dof, cc.reshape((2, 2)) diff --git a/src/porepy/numerics/pdesolver.py b/src/porepy/numerics/pdesolver.py index d6ffb4c153..338178b0f1 100644 --- a/src/porepy/numerics/pdesolver.py +++ b/src/porepy/numerics/pdesolver.py @@ -11,12 +11,9 @@ class AbstractSolver(): """ - Class for solving slightly compressible flow using backward Euler. + Class for solving slightly compressible flow. We solve the equation: - c_p * phi * (p^k+1 - p^k)/dt - nabla * K * grad(p^k+1) = f^k+1. - - To solve a slightly compressible flow problem please see the - porepy.numerics.compressible.problems.SlightlyCompressible class. + phi * dp/dt - nabla * K * grad(p) + v * nabla p = f. """ def __init__(self, problem): @@ -25,16 +22,15 @@ def __init__(self, problem): ---------- problem: a problem class. Must have the attributes problem.grid() - problem.porosity() - problem.compressibility() + problem.porosity(): phi problem.space_disc() - problem.permeability() + problem.diffusivity(): K problem.time_step() problem.end_time() problem.bc() problem.bc_val(t) problem.initial_pressure() - problem.source(t) + problem.source(t): f """ # Get data g = problem.grid() @@ -133,6 +129,11 @@ def _discretize(self, discs): class Implicit(AbstractSolver): + """ + Implicit time discretization: + (y_k+1 - y_k) / dt = F^k+1 + """ + def __init__(self, problem): AbstractSolver.__init__(self, problem) @@ -146,6 +147,11 @@ def reassemble(self): class BDF2(AbstractSolver): + """ + Second order implicit time discretization: + (y_k+2 - 4/3 * y_k+1 + 1/3 * y_k) / dt = 2/3 * F^k+2 + """ + def __init__(self, problem): self.flag_first = True AbstractSolver.__init__(self, problem) @@ -174,6 +180,11 @@ def reassemble(self): class Explicit(AbstractSolver): + """ + Explicit time discretization: + (y_k - y_k-1)/dt = F^k + """ + def __init__(self, problem): AbstractSolver.__init__(self, problem) @@ -201,6 +212,11 @@ def reassemble(self): class CrankNicolson(AbstractSolver): + """ + Crank-Nicolson time discretization: + (y_k+1 - y_k) / dt = 0.5 * (F^k+1 + F^k) + """ + def __init__(self, problem): self.g = problem.grid() self.lhs_flux, self.rhs_flux = self._discretize(problem.space_disc()) @@ -230,47 +246,3 @@ def reassemble(self): self.lhs = self.lhs_time + 0.5 * self.lhs_flux self.rhs = (self.lhs_time - 0.5 * self.lhs_flux_0) * \ self.p0 + rhs1 + rhs0 - - -if __name__ == '__main__': - from porepy.fracs import meshing - from porepy.params.data import Parameters - from porepy.numerics.fv.tpfa import Tpfa - from porepy.numerics.fv.tpfa_coupling import TpfaCoupling - from porepy.numerics.mixed_dim.coupler import Coupler - - T = 0.1 - dt = 0.001 - - frac = np.array([[1, 3], [2, 2]]) - gb = meshing.cart_grid([frac], [12, 12], physdims=[4, 4]) - gb.assign_node_ordering() - gb.add_node_props(['param']) - for g, d in gb: - params = Parameters(g) - params._compressibility = 1 - if g.dim != 2: - continue - bc_val = np.zeros(g.num_cells) - left = np.isclose(g.face_centers[0], 0) - bc_val[left] = 0.1 * g.face_areas[left] - params.set_bc_val('flow', bc_val) - d['param'] = params - d['time_step'] = dt - d['pressure'] = np.zeros(g.num_cells) - - darcy_discr = Tpfa('Flow') - solver = Compressible(darcy_discr, 'Flow') - coupling_conditions = TpfaCoupling(solver) - solver = Coupler(solver, coupling_conditions) - - t = dt - pressures = np.zeros(solver.ndof(gb)) - times = [0.0] - while t < T: - matrix, rhs = solver.matrix_rhs(gb) - p = sps.linalg.spsolve(matrix, rhs) - solver.split(gb, 'pressure', p) - pressures.append(p) - times.append(t) - t += dt From 9bca6986be7b96c45e27ad196883d188930ccf21 Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 9 Oct 2017 10:01:48 +0200 Subject: [PATCH 12/53] Added darcy solver. --- src/porepy/numerics/darcyEq.py | 159 +++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 src/porepy/numerics/darcyEq.py diff --git a/src/porepy/numerics/darcyEq.py b/src/porepy/numerics/darcyEq.py new file mode 100644 index 0000000000..6efe98d0c4 --- /dev/null +++ b/src/porepy/numerics/darcyEq.py @@ -0,0 +1,159 @@ +import numpy as np +import scipy.sparse as sps + +from porepy.numerics.fv import tpfa +from porepy.grids.grid_bucket import GridBucket +from porepy.params import bc, tensor +from porepy.params.data import Parameters + + +class Darcy(): + def __init__(self, gb, data=None, physics='flow'): + self.physics = physics + self._gb = gb + self._data = data + self.lhs, self.rhs = self.reassemble() + self.p = np.zeros(self.flux_disc().ndof(self.grid())) + + def solve(self): + self.p = sps.linalg.spsolve(self.lhs, self.rhs) + return self.p + + def reassemble(self): + """ + reassemble matrices. This must be called between every time step to + update the rhs of the system. + """ + lhs, rhs = self._discretize() + self.lhs = lhs + self.rhs = rhs + return lhs, rhs + + def flux_disc(self): + if isinstance(self.grid(), GridBucket): + diffusive_discr = tpfa.TpfaMultiDim(physics=self.physics) + else: + diffusive_discr = tpfa.Tpfa(physics=self.physics) + return diffusive_discr + + def _discretize(self): + if isinstance(self.grid(), GridBucket): + lhs, rhs = self.flux_disc().matrix_rhs(self.grid()) + else: + lhs, rhs = self.flux_disc().matrix_rhs(self.grid(), self.data()) + return lhs, rhs + + def grid(self): + return self._gb + + def data(self): + return self._data + + def split(self, name): + self.flux_disc().split(self.grid(), name, self.p) + + +class DarcyData(): + def __init__(self, g, data, physics='flow'): + self._g = g + self._data = data + + self.physics = physics + self._set_data() + + def bc(self): + return bc.BoundaryCondition(self.grid()) + + def bc_val(self): + return np.zeros(self.grid().num_faces) + + def porosity(self): + return np.ones(self.grid().num_cells) + + def aperture(self): + return np.ones(self.grid().num_cells) + + def permeability(self): + kxx = np.ones(self.grid().num_cells) + return tensor.SecondOrder(self.grid().dim, kxx) + + def source(self): + return np.zeros(self.grid().num_cells) + + def data(self): + return self._data + + def grid(self): + return self._g + + def _set_data(self): + if 'param' not in self._data: + self._data['param'] = Parameters(self.grid()) + self._data['param'].set_tensor(self.physics, self.permeability()) + self._data['param'].set_porosity(self.porosity()) + self._data['param'].set_bc(self.physics, self.bc()) + self._data['param'].set_bc_val(self.physics, self.bc_val()) + self._data['param'].set_source(self.physics, self.source()) + self._data['param'].set_aperture(self.aperture()) + + +if __name__ == '__main__': + from porepy.grids import structured + from porepy.fracs import meshing + from porepy.viz.plot_grid import plot_grid + from porepy.grids.grid import FaceTag + g = structured.CartGrid([11, 11]) + g.compute_geometry() + + param = Parameters(g) + dir_bound = np.ravel(np.argwhere( + (g.has_face_tag(FaceTag.DOMAIN_BOUNDARY)))) + bc_cond = bc.BoundaryCondition(g, dir_bound, ['dir'] * dir_bound.size) + bc_val = g.face_centers[0] + + src = np.zeros(g.num_cells) + src[60] = 0 + + param.set_bc('flow', bc_cond) + param.set_bc_val('flow', bc_val) + param.set_source('flow', src) + d = {'param': param} + + problem = Darcy(g, d) + p = problem.solve() + import pdb + pdb.set_trace() + + plot_grid(g, p) + + def assign_darcy_data(gb): + gb.add_node_props(['problem']) + for g, d in gb: + d['problem'] = Matrix(g, d) + + class Matrix(DarcyData): + def __init__(self, g, d): + DarcyData.__init__(self, g, d) + + def bc_val(self): + east = bc.face_on_side(self.grid(), 'East') + west = bc.face_on_side(self.grid(), 'West') + val = np.zeros(self.grid().num_faces) + val[east] = 1 + val[west] = -1 + return val + + g = structured.CartGrid([10, 10]) + g.compute_geometry() + d = {'param': Parameters(g)} + gb = meshing.cart_grid([], [10, 10]) + gb.assign_node_ordering() + + assign_darcy_data(gb) + problem = Darcy(gb) + problem_mono = Darcy(g, d) + p_mono = problem_mono.solve() + plot_grid(g, p_mono) + p = problem.solve() + problem.flux_disc().split(problem.grid(), 'pressure', p) + plot_grid(problem.grid(), 'pressure') From 0013b0f2a4610ff9a87bb9555143907472b2e127 Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 9 Oct 2017 10:06:47 +0200 Subject: [PATCH 13/53] Added tutorial to Darcy solver --- tutorials/Darcy equation.ipynb | 239 +++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 tutorials/Darcy equation.ipynb diff --git a/tutorials/Darcy equation.ipynb b/tutorials/Darcy equation.ipynb new file mode 100644 index 0000000000..12b55e9dff --- /dev/null +++ b/tutorials/Darcy equation.ipynb @@ -0,0 +1,239 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Darcy's Equation\n", + "\n", + "Darcy's equation relates the flux field to the pressure gradient:\n", + "\\begin{equation}\n", + "v = -\\frac{K}{\\mu}\\nabla p\n", + "\\end{equation}\n", + "If we have a incompressible fluid, conservation of mass gives us:\n", + "\\begin{equation}\n", + "-\\nabla\\frac{K}{\\mu} \\nabla p = q\n", + "\\end{equation}\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To solve this equation in Porepy we import the Darcy module." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "from porepy.numerics import darcyEq\n", + "from porepy.fracs import meshing\n", + "from porepy.params import bc, tensor, data\n", + "from porepy.grids.grid import FaceTag\n", + "from porepy.grids.structured import CartGrid\n", + "from porepy.viz.plot_grid import plot_grid" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We frist solve the equation on a single cartesian grid" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "g = CartGrid([11, 11])\n", + "g.compute_geometry()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We create a parameter class and assign zero dirichlet boundary conditions, and a source term" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "param = data.Parameters(g)\n", + "dir_bound = np.ravel(np.argwhere((g.has_face_tag(FaceTag.BOUNDARY))))\n", + "bc_cond = bc.BoundaryCondition(g, dir_bound, ['dir']*dir_bound.size)\n", + "\n", + "src = np.zeros(g.num_cells)\n", + "src[60] = 1\n", + "\n", + "param.set_bc('flow', bc_cond)\n", + "param.set_source('flow', src)\n", + "d = {'param': param}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now create a Darcy object and solve the problem" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVAAAADuCAYAAABvX19oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VFW26PHfTlVCIEAYEiATU4NCUGQIBhBtRFCk2ygY\nBQRlilwRr9jcVrFFG3y2A92K0njbp+3UcjHX2+8qtAKKOCMRAtiCKHMgCWOYQuaqynp/hFSHSJI6\nlapUhazv53M+Hyp1zt7rVJGVfc7ZgxERlFJKWRcS6ACUUqqx0gSqlFJe0gSqlFJe0gSqlFJe0gSq\nlFJe0gSqlFJe0gSqlFJe0gSqlFJe0gSqlFJeslvcX4ctKaU8ZepzcA9jpMjDfQ/DRyIyuj71ecNq\nAlVKqQZRDMz2cN/5EOXPWGqiCVQpFZQMEBroIOqgCVQpFZQMwZ+g9CFSkGnZsiX79u274Htvvvkm\nw4YNa+CIlAqMyhaoJ1ugNMkEunz5cpKSkmjZsiUxMTHceOONfP31116XZ4xhz5495/3s7NmzzJ07\nl65duxIREUHnzp1JTU1l48aNtZZVUFBA9+7dvYqjrKyMBQsW0LNnTyIiIujatSvTp08nKyvLq/L8\nZcGCBUyePDnQYfhVVlYWxhicTmegQ2m0QoDmHm6B0uQS6PPPP88DDzzA7373O44ePcrBgwe59957\nWbFiheWyavrlKC0tZcSIEWzbto0PPviA/Px8fvzxRyZMmMCqVasslWVFamoqK1euZPny5Zw5c4Z/\n/vOfDBw4kHXr1tW7bOV7mlxrV3kJ78kWMCJiZWvUTp8+LREREfLuu+/WuM+3334rgwcPlsjISOnU\nqZPMnj1bSktL3e8DsnTpUunRo4d07dpVrr76agGkRYsWEhERIenp6fLqq69Kp06dpKCgoNZ4qpdV\n+bPdu3eLiEheXp7cdNNN0qpVKxk0aJDMnz9frrrqqguWtXbtWgkPD5eDBw/WWF9ubq7cdNNN0rZt\nW/nFL34hr7zyivu93//+95KamiqTJk2Sli1bymWXXSY7d+6Up556SqKjoyU+Pl4++ugj9/6//OUv\nZd68eTJo0CBp3bq1pKSkyIkTJ0RE5LPPPpO4uLjz6u7SpYusXbtWVq9eLaGhoWK32yUiIkL69u0r\nIhXfzfTp06VTp04SGxsrjz76qDidzgueR1FRkdx1113Spk0b6dWrlzz77LPn1Zebmyvjxo2TqKgo\n6dq1q7z44ovu90pKSmTOnDkSExMjMTExMmfOHCkpKTkv7meffVaio6OlU6dO8t5778mHH34oPXv2\nlLZt28of/vAHd1kul0uefvpp6d69u7Rr105uu+0292eQkJAggEREREhERIR888038sYbb8jQoUPl\ngQcekLZt28q8efOkbdu28v3337vLPHr0qISHh8uxY8dq/B4bEav55bytG8gyDzcgs771ebM1qQS6\nevVqsdls4nA4atwnMzNTNmzYIA6HQ/bv3y+9evWSxYsXu98HZOTIkXLixAkpKipy/6wy6YmIjB8/\nXqZMmVJnPHWVNX78eLntttukoKBAtm3bJrGxsTUm0IcffliuueaaWuu75pprZNasWVJcXCxbt26V\nqKgo+eSTT0SkIoE2a9ZM1qxZIw6HQ+68807p2rWrPPnkk1JWViavvPKKO8mLVCTQ2NhY2bZtmxQU\nFMi4ceNk0qRJIlJ7Aq2sq3LfSjfffLPMnDlTCgoK5OjRozJo0CB5+eWXaz3XkydPSnZ2tlx++eXu\n+lwulwwYMEAWLlwopaWlsnfvXunWrZusWbNGREQee+wxSU5OlqNHj8qxY8dkyJAhMn/+fHfcNptN\nFi5c6D7nqKgomThxouTn58v27dulWbNmsnfvXhERWbx4sSQnJ0t2draUlJTIzJkzZcKECSIisn//\nfgHO+7/2xhtviM1mkyVLlojD4ZCioiKZNWuWPPTQQ+59XnjhBfn1r39d6/fYiNQrOXUHSfdw0wTa\nAJYtWyYdO3a0dMzixYvllltucb8GZN26deftUz2BXnfddfLwww+7X2/dulUiIyOlVatWcskll3hU\nltPpFLvdLj/++KP7vUceeaTGBJqWlibjx4+v8TwOHjwoISEhkp+f7/7ZvHnz3In+97//vYwcOdL9\n3sqVKyUiIsLdCszPzxdATp06JSIVCbTqOf7www8SGhoqTqfTcgI9cuSIhIWFuf+IiIgsX75chg8f\nfsFzqZoQRUReffVVd30ZGRmSkJBw3v5PPfWUTJ06VUREunfvLh9++KH7vTVr1kiXLl1EpCKBhoeH\n/+ycMzIy3PsPGDBA3nvvPRER6dWrl/sPkIjIoUOHxG63u//4XiiBVo8tIyND4uPjxeVyiYjIwIED\n5b//+78veN6NUL2S0y9A/p+HW6ASaLD3EvCp9u3bk5eXh9PpxG6/8Knv2rWLuXPnkpmZSVFREU6n\nk4EDB563T0JCQp31HD582P26X79+nD59mk8++YS0tDSPyjp+/DhOp/O897t06VJrnbt27arx/UOH\nDtGuXTtatWp1XnmZmZnu1x07dnT/u3nz5kRFRWGz2dyvoeIhV5s2bX4We5cuXXA4HOTl5dUYQ00O\nHDiAw+EgJibG/bPy8vIaP5tDhw6d917Vfx84cIBDhw65YwRwuVxcffXV7mOrfo5dunTh0KFD7tft\n27f/2TlX/1wKCgrcdY0dO5aQkH89SrDZbBw9erTGc61+TsnJyURERPDFF18QExPDnj17SElJqfH4\npqQx9ANtUg+RhgwZQnh4OO+//36N+8yaNYtevXqxe/du8vPzeeqppyqa6lUYU/sIteuuu46PP/6Y\nwsLCOmOqqazo6GjsdjvZ2dnunx08eLDGckaOHMnGjRvJycm54PuxsbGcPHmSs2fPnldeXFxcnTHW\npHpsoaGhREVFERERQVHRvwbhuVwujh8/7n5d/ZwTEhJo1qwZeXl5nD59mtOnT5Ofn88PP/xwwXpj\nYmLOO8+qcSQkJNCtWzd3OadPn+bs2bPuh3exsbEcOHDgvLhjY2O9Ov+EhARWr159Xl0lJSXExcXV\n+L1e6OdTpkxh2bJlvP3226SmphIeHu5VPBcbgz6FDyqRkZE88cQTzJ49m/fff5+ioiIcDgerV6/m\noYceAiq6H7Vu3ZqWLVvy008/8Ze//KXOcjt27Hhe38277rqLmJgYxo4dy/bt23G5XJSUlJzX2quL\nzWZj3LhxLFiwgKKiInbs2MFbb71V4/4jR45k1KhRjB07ls2bN+N0Ojl79iwvv/wyr7/+OgkJCQwd\nOpRHHnmEkpISvv/+e1577TUmTZrkcUzVLVu2jB07dlBUVMTjjz9OamoqNpuNSy65hJKSEj788EMc\nDgdPPvkkpaWl7uM6duxIVlYW5eXlQEVCvP766/mP//gP8vPzKS8vZ+/evXzxxRcXrPf222/n6aef\n5tSpU+Tm5rJ06VL3e1deeSWtW7fm2Wefpbi4GJfLxfbt29m0aRMAEydO5Mknn+T48ePk5eXxxBNP\neN2l6p577uHRRx91J+Tjx4+7e3NER0cTEhJSY5/equ68807ee+89li1bxl133eVVLBejxvAUvkkl\nUIC5c+fy/PPP8+STTxIdHU1CQgJLly7llltuAeBPf/oTy5cvp1WrVtx9992MHz++zjIXLFjAlClT\naNOmDe+++y7h4eF89tlnJCYm8qtf/YrWrVtz6aWXsmnTJt59912PY126dCkFBQV06tSJqVOnMm3a\ntFr3//vf/86YMWMYP348kZGRXHbZZWRmZjJy5EgA3nnnHbKysoiNjWXs2LEsXLiQUaNGeRxPdXfe\neSdTp06lU6dOlJSUsGTJEqDiD9V//ud/kpaWRlxcHBEREcTHx7uPu+2224CKy+UBAwYA8Le//Y2y\nsjISExNp27Ytqamp590Gqerxxx8nPj6ebt26MXLkSFJTU2nWrBlQ8YfnH//4B9999x3dunUjKiqK\ntLQ0zpw5A8D8+fNJSkqib9++XH755QwYMID58+d7df5z5swhJSWF66+/nlatWjF48GC+/fZbAFq0\naMGjjz7KVVddRZs2bcjIyKixnPj4eAYMGIAxxn2rQfm+I70xZrQxZqcxZo8xZt4F3p9qjDlujPnu\n3JZ2oXLOO6b65WkddDYmBcDw4cOZPHnyz+7pBsJf/vIX0tPTa2yxNgbTp08nNjaWJ598MtCh+FK9\nZmPqbYy86eG+g2GziCTVGIgxNmAXMArIATYBE0VkR5V9pgJJInKfpzE2uRaoavwOHz7M+vXrKS8v\nZ+fOnTz33HOMHTs20GF5LSsri//93/9lxowZgQ4lqPi4BXolsEdE9olIGZAO3FzfGDWBqkanrKyM\nf/u3f6NVq1aMGDGCm2++mXvvvTfQYXnlscce47LLLuPBBx+kW7dugQ4nqFgcyhlljMmsss2sVlwc\nkF3ldc65n1V3qzHme2PM340xtXe3QS/hlVL+U69L+MuNkf/1cN9L6r6Evw24QUTSzr2+E7hSRP69\nyj7tgQIRKTXG3APcLiIjaqtXW6BKqaDk40v4HKBqizIeOFR1BxE5ISKV3UVeBc7vAH4BmkCVUkHJ\nxwl0E9DTGNPNGBMGTABWnlefMTFVXqYAP9ZVaJMaiaSUalx8laBExGmMuQ/4CLABr4vID8aYJ6gY\nBroSuN8YkwI4gZPA1LrK1XugSil/qdc90H7GyKceZtD2ztrvgfqLtkCVUkEpJASaN/Nw5wBNraoJ\nVCkVlIyBGub8CRr6EEn5xKZNm+jbty8lJSUUFhbSp08ftm/fHuiwVCNmgFC7Z1vAYtR7oMpX5s+f\nT0lJCcXFxcTHx/PII48EOiQVWPW6B5oUaiSznYcVHQvMPVBNoMpnysrKGDRoEOHh4XzzzTfueTVV\nk1W/BBpmJDPaw4oO6UMk1cidPHmSgoICHA4HJSUlREREBDok1Zg1goXhtQWqfCYlJYUJEyawf/9+\nDh8+fN48napJql8LNNxIZmcPK9qtLVDViP3tb3/Dbrdzxx134HK5GDp0KJ9++ikjRtQ6lFipmmkL\nVCnVhNWvBdrCSGYPDyvapi1QpZQ6X5A/h9QEqpQKTo3gEj7Iw1NKNVkG8HQoZ4BoAlVKBSdtgSql\nlJc0gSqllJc0gSqlVD0E+VN4nY2pHtasWcOll15Kjx49eOaZZ3xadnZ2Ntdeey29e/emT58+vPji\niz4tvyqXy0X//v359a9/7ZfyT58+TWpqKr169aJ3795s2LDB53UsXryYPn36cNlllzFx4kRKSkrq\nXeb06dPp0KEDl112mftnJ0+eZNSoUfTs2ZNRo0Zx6tSpetejalDZAvVkCxBNoF5yuVzMnj2b1atX\ns2PHDt555x127Njhs/LtdjvPPfccP/74IxkZGbz00ks+Lb+qF198kd69e/ulbIA5c+YwevRofvrp\nJ/75z3/6vK7c3FyWLFlCZmYm27dvx+VykZ6eXu9yp06dypo1a8772TPPPMN1113H7t27ue6663z+\nh1NVEULFU3hPtgDRBFqNiODJ6KyNGzfSo0cPunfvTlhYGBMmTGDFihU+iyMmJoYBAwYA0KpVK3r3\n7k1ubq7Pyq+Uk5PDhx9+SFpams/LBsjPz+fLL79kxowZAISFhdGmTRuf1+N0OikuLsbpdFJUVERs\nbGy9y7zmmmto1+78+dRWrFjBlClTAJgyZQrvv/9+vetRNdAWaONTVlbG3r17KS8vr3W/3NxcEhL+\ntUpqfHy8XxIcQFZWFlu3biU5OdnnZT/wwAMsWrSIkBD//FfYt28f0dHRTJs2jf79+5OWlkZhYaFP\n64iLi+O3v/0tnTt3JiYmhsjISK6//nqf1lHp6NGjxMRULN4YExPDsWPH/FKPOkcTaOMiImRnZ1Na\nWorL5ap1v+qMqdfQ3wsqKCjg1ltv5YUXXqB169Y+LfuDDz6gQ4cODBxY5/LXXnM6nWzZsoVZs2ax\ndetWIiIifH7Ze+rUKVasWMH+/fs5dOgQhYWFLFu2zKd1qAAwVDxE8mQLEE2gNTDGsG/fPpxO5wWT\nZXx8PNnZ2e7XOTk5PrlsrMrhcHDrrbcyadIkxo0b59OyAdavX8/KlSvp2rUrEyZM4NNPP2Xy5Mk+\nrSM+Pp74+Hh36zk1NZUtW7b4tI5PPvmEbt26ER0dTWhoKOPGjeObb77xaR2VOnbsyOHDhwE4fPgw\nHTp08Es9Cr2Eb8yMMeTk5LB//34cDsfPkuigQYPYvXs3+/fvp6ysjPT0dFJSUnxWv4gwY8YMevfu\nzdy5c31WblVPP/00OTk5ZGVlkZ6ezogRI3zecuvUqRMJCQns3LkTgHXr1pGYmOjTOjp37kxGRgZF\nRUWICOvWrfPbQ7GUlBTeeustAN566y1uvvlmv9Sj0AR6McjJycHlcrF3797zkqjdbmfp0qXccMMN\n9O7dm9tvv50+ffr4rN7169fz9ttv8+mnn9KvXz/69evHqlWrfFZ+Q/rzn//MpEmT6Nu3L9999x2/\n+93vfFp+cnIyqampDBgwgMsvv5zy8nJmzpxZ73InTpzIkCFD2LlzJ/Hx8bz22mvMmzePtWvX0rNn\nT9auXcu8efN8cAbqgirHwgfxU3jtSO8BYwzZ2dmICL/4xS/cD1yWLFnCrl27/FLnsGHDEBFGjx79\ns640vlZZx/Dhw/1Sfr9+/YiKivLreSxcuJCFCxcyevRo3n77bZ+U+c4771zw56Ghoezevdsndaha\n6Eiki0Plw6GcnBwAZs+eTV5eHjk5Oe6uRv6idXguOTmZL7/80q/11LeOgwcPkpeX5+OoLlKaQC8+\nOTk5fPDBBzidToYPH87nn3/u1/q0Ds9lZGSwZ88en/bH9XUdw4YN83FEF7kgH8qpCbQeGmIUitZh\njT+TZ0PWodAW6MXu17++meLiAotH2YCa+5fWf/9grcObYy6OOlq2jOTo0UMW61CEAOGBDqJ2mkDr\noSJ5LrB41ALgWQv7PwwssVjH/cCrFva/G3jDYh3TAKtdniZbrGca1s4DKs7Fyud1P9a+D6j4ThZ4\nvHdBgef7qmr0El4ppbzQCC7htR+oUio4+bgjvTFmtDFmpzFmjzGmxg68xphUY4wYY+pcJlkTaDWl\npaV1TiSilGogPhoLb4yxAS8BNwKJwERjzM+GxBljWlFxX+dbT8LTBFpNSUkJRUVFHDx4MNChKNW0\n+bYFeiWwR0T2iUgZkA5caBzu/wEWAR7NyK0JtJrIyEgiIiIoKiqisLBQW6NKBYpvJ1SOA7KrvM45\n9zM3Y0x/IEFEPvA0xCC/RRsYxhh69erF8ePHKS4uZs+ePYEOSammx9pDpChjTGaV16+IyCvVSqvO\nPbmFMSYEWAxMtRKiJtBa2Gw2IiIisNlsFBQU0Lx5c2y2IO9XodTFxPMMlScitT30yQESqryOB6p2\nzm0FXAZ8fm7odidgpTEmRUSqJmYvw2vCunXrRm5uLsXFxYSEhLBv3z69tFeWZGVl+W3W/4uWb7sx\nbQJ6GmO6AbnABOCOyjdF5AwQ5a7amM+B39aWPPFpeBe5kJAQIiIicDqdNG/e/Nxs9SFY70gfQkVH\nbCv73+9FHXdb3H+axTpsVHSMt8JqPVbPo/IYK5+X1e+j8pgFlvYPDw9n2rRp/PTTTyQlJfl9dqqL\nQuWM9D4gIk5jzH3AR+dKfV1EfjDGPAFkishKb8rVBGqR3W4nJiYGp9MJlOPdKBYrI3gmA59ZrONa\nwMo0e5cAZyzWEQmUWTwmzGI9kVg7D6g4Fyuf17V4N6LK2miyTp06sXr1aoYNG0Zm5oUbNdOnT3cv\ns7J9+3agYhnl8ePHk5WVRdeuXXn33Xdp27atxXgbKR93pBeRVcCqaj97vIZ9h3tSpl5TKBUkdBnl\nahrBhMqaQJUKErqMcjWNYEkPvYRXKog16WWUG8FY+CAPTynVpAV5r0G9hFcqiDXpZZQbwSW8JlCl\ngliTXka5ckJlT7YA0QSqVJDQZZQvwEezMfmL3gNVKkjUtIzyunXrGjiSIKEPkS52NrwbxWJlBI+N\nis7eVtio6FDuKTsVndatsFPRMd7qMVbqsXoelcdY+by8HVFl5XsP8ichwUoT6MXOhXfrFVkdKePF\nKKG2UvdulU4ZGGJhf4ANBm60eMxqi/VsMNbOAyrOxfJoJ29Gelldd0l5Jcj/9mgCVUoFJ22BKqWU\nl3RZY6WU8p7oJbxSSlknBlxBnqGCPDylVJOlCbTxOXHiBEVFRRw5cgQR4dz0/kqpBiYGnDZPx/oE\nZoUITaDVtG/fnmbNmnHmzBkKCwux2WycOHEi0GEp1eSIMbjsnqYoq5N7+4Ym0Auw2WxceumlnDhx\nApfLxZEjRygoKMBut2O32yksLDw3I71SniksLNSrGYsEQ5nN08EamkCDks1mo0+fPpw5cwan04nD\n4WD37t3nFpWzYb2TtNWRMl6OEjpl5ZfVXtFp3Qpjr+gYb/UYS/VYPY9zx1ge7WR1pJfVdZds7N27\nl9/85je6JpIFgsEZ5D3pNYFaUNkC7dev37kWqAt41WIpd2N5vSJvRuNMtHDMOwbesljHFAMZFo8Z\nbLGeKRbPAyrOxeooLK/WXbLyvd9N3759WbduXa1rIlW3ePFi/vrXv2KM4fLLL+eNN94gPDzIO0b6\nmCvIU5TOxqRUEMrNzWXJkiVkZmayfft2XC4X6enpgQ6rQQkGFzaPtkAJ7vSuVBPmdDopLi4mNDSU\noqIiYmNjAx1Sg6pMoMFMW6BKBaG4uDh++9vf0rlzZ2JiYoiMjOT6668PdFgNSjCUEubRFiiaQJUK\nQqdOnWLFihXs37+fQ4cOUVhYyLJlVtevb9wqWqB2j7ZA0QSqVBD65JNP6NatG9HR0YSGhjJu3Di+\n+eabQIfV4IL9HqgmUKWCUOfOncnIyKCoqAgRYd26dfTu3TvQYTUofYiklPJKcnIyqampDBgwALvd\nTv/+/Zk5c2agw2pQAtoPVCnlnYULF7Jw4cJAhxFAJuj7gQZ3dEHPRkXHeKvHWFyvyOpoHGOv6FDu\nqRB7Rad1K2z2io7xVlitx+p5ANY/L2/WXQrB2vce3K2oYCUYygL4hN0TmkDrxQW8YfGYaVhes8eb\n9YosjvjpJxssVfGdGcIrcqelY2aaty3V850Z4t0IKavrLnmz5pSl732axfIVNI5+oJpAlVJBScfC\nK6VUPQT7PVDtxqSUCkq+7sZkjBltjNlpjNljjJl3gffvMcZsM8Z8Z4z52hiTWFeZwZ3elVJNVuVQ\nTl8wxtiAl4BRQA6wyRizUkR2VNltuYi8fG7/FOB5YHRt5WoCVUoFJfFtN6YrgT0isg/AGJMO3Ay4\nE6iI5FfZP4KKrqi10gSqlApKFp/CRxljqk60+oqIvFLldRyQXeV1DpBcvRBjzGxgLhAGjKirUk2g\nSqmgZSGB5olIUi3vX6hz8M9amCLyEvCSMeYOYD4wpbZKNYFWU1xcjMPhIC8vD5fLhTEGh8MR6LCU\nanJ83I0pB0io8joeOFTL/unAX+oqVBNoNSJCeXk5J06coKysDBFh69atFBQUuPdZv349IhY7eKsm\nLSMjg9DQ0ECH0aj4+B7oJqCnMaYbkAtMAO6ouoMxpqeI7D738lfAbuqgCbSaFi1a0KxZM/eqnABX\nXnnleVOJXXXVVefWRLJhfZSJ1UXPvFjwzeqQSbutYtSPpSoMM83b1uKyWo/NiyGm3ixcZ3nRvhCs\nfe82Bg8ezM0332xpUbnTp0+TlpbG9u3bMcbw+uuvM2SIte+pMfPlUE4RcRpj7gM+ouIX93UR+cEY\n8wSQKSIrgfuMMSMBB3CKOi7fQRNoPbkAq5PcTsbaEqxhcKPF1u5qiwu+DTZeDctcYC0qFjhdluqZ\nad72buE6K5/XaoP1JXHDsPa9TwZgxYoVlhaVmzNnDqNHj+bvf/87ZWVlFBUVWYyzcfP1UE4RWQWs\nqvazx6v8e47VMrUjvVJBKD8/ny+//JIZM2YAEBYWRps2beo87rHHHuPFF190v3700UdZsmSJ3+L0\nNyc2j7ZA0QSqVBDat28f0dHRTJs2jf79+5OWlkZhYWGdx82YMYO33noLgPLyctLT05k0aZK/w/UL\nXdJDKeUVp9PJli1bmDVrFlu3biUiIoJnnnmmzuO6du1K+/bt2bp1Kx9//DH9+/enffv2DRCx7+mM\n9Eopr8THxxMfH09yckVf79TUVI8SKEBaWhpvvvkmR44cYfr06f4M0++CfTo7bYEqFYQ6depEQkIC\nO3fuBGDdunUkJtY5twUAY8eOZc2aNWzatIkbbrjBn2H6VTkhlNLMoy1QtAWqVJD685//zKRJkygr\nK6N79+688YZnkziHhYVx7bXX0qZNG2y24G7B1SXYW6CaQJUKUv369fO4y1NV5eXlZGRk8D//8z9+\niKrhNIYZ6fUSXqmLyI4dO+jRowfXXXcdPXv2DHQ49aYPkS5qNio7SXvODlZGVxj7uc7eFlhc8M2b\nUUUhYLkjveV6vFm4zvLnZfH7AKx/7w33C56YmMi+ffsarD5/0iU9LnoNsKic+H9RuXJdVM5aHbqo\nXIOoGMoZuAdEntAEqpQKSo3hHqgmUKVUUNJLeKWUqodgX5UzuKNTSjVZegmvlFJe0gSqlFJe8uWy\nxv6iCVQpFZR8vKSHXwR3dEGkvLwcl8tFeXk5O3fupLy8PNAhqUZk9+7d2O3662aVXsI3QiLCyZMn\nKS0txeVysX79eoqLi7Hb7YSEhNCuXTtcLhe6JpKuieQZG23btuWuu+6ytCZSU6f3QBuhEydOUFRU\nxJEjRwgJCSE0NJShQ4eyYcO/RtBER0efW1TOBbxqsYa7gV0W9r8E2locjXPKwEQLx7xjbeQSVIxe\n8mq9Iiv1TLF4HlBxLlY+r1MGa98HwCVY+97vJioqilWrVllaEwnA5XKRlJREXFwcH3zwgcU4G7fG\n0A9UJxOppn379kRERJCYmEhoaCghISEYY7EVpJSPvPjii/Tu3TvQYQSMLumhlPJKTk4OH374IWlp\naYEOJSDKCaGMMI+2QNFLeKWC1AMPPMCiRYs4e/ZsoEMJGL2EV0pZ9sEHH9ChQwcGDhwY6FACpjGs\nyqktUKXUeVj2AAAP60lEQVSC0Pr161m5ciWrVq2ipKSE/Px8Jk+ezLJlywIdWoNpDE/htQWqVBB6\n+umnycnJISsri/T0dEaMGNGkkmclnZFeKaW8UK5DOZVS9TV8+HCGDx8e6DACQIdyXuRsVHSMt3rM\nJRb2t5/r7G2BsVd0KPeU1ZFL4N16RVbrsXoegPXPy+r3ARV3vqx878F9Hy9YNYZ7oJpA68UFLLF4\nzP3AZxb2vxbLa/ZIpPXRON6su3SjxWNWe7FekTejsCx9XpFY+z6g4jux8r3fb7F8VUkTqFJKeUGH\nciqllJd83Q/UGDPaGLPTGLPHGDPvAu/PNcbsMMZ8b4xZZ4zpUleZ2gJVSgWlimWNffMU3hhjA14C\nRgE5wCZjzEoR2VFlt61AkogUGWNmAYuA8bWVqy1QpVRQEgyucptHmweuBPaIyD4RKQPSgZvPq0/k\nMxEpOvcyA4ivq1BtgSqlgpOA0+nxPdAoY0zVeQJfEZFXqryOA7KrvM4Bkmspbwawuq5KNYEqpYKS\niMHl9DhF5YlIUi3vX6hv2wW7eBhjJgNJwC/rqlQTqFIqKFUkUJ89hc8BEqq8jgcOVd/JGDMSeBT4\npYiU1lWoJlCLXC4Xp0+fPrekh1KeOXPmjE7MbZXgywS6CehpjOkG5AITgDuq7mCM6Q/8X2C0iBzz\npFBNoB5yOp2UlpZijCE3N/fconI2rHeStlHREdtT3qzZY3U0jhfrLhl7Rcd4q8dYXa/I6igsy5+X\n1e8DKp69WvnebRw6dIj7779f10SyQCSEspJmPipLnMaY+4CPqPjSXxeRH4wxTwCZIrIS+CPQEvif\nc3/sDopISm3lagKtg9PpZOPGjZSVlREeHo7NZqNPnz5V1kR61mKJDwNWZtWZjHcjZSyuu+TNaCfK\nLB4TZrGeSLxbr8jqSC+rsxxNxtr3/jC9e/dm7dq1Hq+JlJ2dzV133eVem2vmzJnMmTPHYpyNnAC+\na4EiIquAVdV+9niVf4+0WqYm0BqcOHGCwsJCQkJCGDBgAN9//32gQ1JNiN1u57nnnmPAgAGcPXuW\ngQMHMmrUKBITEwMdWsMR49ME6g+aQKs5e/YshYWF5OTk0Lx5c0JCQmjZsmWgw1JNTExMDDExMQC0\natWK3r17k5ub28QSKOAM7vvG2pG+mtDQUJo3b84VV1xBSIh+PCrwsrKy2Lp1K8nJtXVbvEg5PdwC\nRFug1YSHh2viVEGjoKCAW2+9lRdeeIHWrVsHOpyGVQ6UBDqI2mkCVSpIORwObr31ViZNmsS4ceMC\nHU7DE8AR6CBqpwlUqSAkIsyYMYPevXszd+7cQIcTGEJFR5cgpteqSgWh9evX8/bbb/Ppp5/Sr18/\n+vXrx6pVq+o+8GKj90CVUlYNGzYMEYuz8V9shIAmR09oAq0XGxUd460IoaIjtpU6rI6U8WLdJW9G\nO1meq9GbUUJW1yuy+nnZsPZ9QMV3aOV7D+6+jEFLE+jFzgUssHjMAqyOYvFu3aVXLex/N/CGxTqm\n4d0IHiv1TMPaeUDFuVhdr8ib0WQLLOxvZV/lpk/hlVKqHrQFqpRSXtBuTEop5aVG0I1JE6hSKjjp\nQySllPKSPkRSSql60BaoUkp5QS/hlVLKS40ggepYeAtcLhcFBQWsX7+ejIyMQIejGpGMjAyuvfZa\n95pIo0ePDnRIwa+yG5MnW4AYi+NtL/rBuSUlJWzYsIGhQ4fyzTffADBkyBC++OILHA4HzZs35+qr\nr8bpdBIV1ZHi4gKLNdiw1jfD6v7BWoc3x1wcdbRsGcnRoxUr6A4bNowtW7Z4dNyaNWuYM2cOLpeL\ntLQ05s2bZzHOgKvXdPImLkmYXff6UQA8ajbXsS68X+glfB1EhO3bt+NyuWjRogVQkWRLS0v5xz/e\nZ+DAgX6ru7y8nC1btpCU5L//FyLCli1b/HoeAJs3b/Z7HZmZmQwcONCvywdnZmbSv39/bDZr49vL\nyspYtWoVZ8+e9Wh/l8vF7NmzWbt2LfHx8QwaNIiUlJSmt6SHPoVvvMrLyykuLqZz587u//jGGL79\n9ltKSkoICwtj8+bNfqu/chllf9ZRXl5OaWmpX+sAKCoqIjMz06/JraysjI0bN2K3+++/tdPpZMOG\nDYSHh1s+l+eff57jx4/TuXNnEhMTa13WeOPGjfTo0YPu3bsDMGHCBFasWNH0EqjeA22cjh8/TlFR\nEeHh4cTHxyMiGGMoKyujpKSE8PBwQkNDMcb4ZXO5XIgIzZo181sdxhicTqdfz6Mht2bNmlFWVrHU\nsr/qCAsLw263U1paarmeRYsW0bNnTxwOh7tFXtO90NzcXBISEtyv4+Pjyc3N9f9//GDSCO6BagKt\nRkQoLS3lwIEDREREYLPZcLlc2Gw2SktLKSsro3nz5pYv4ayobBWGh4f7rY5KTqfTry22SsYYysvL\n/V6H3W7H4fDvb1RYWBg2m42SkhLLc3Y+++yzLFu2jNjYWLKzszl8+PAFk+iFyjUmuFeo9LnKoZye\nbAGiCbSa48ePIyLue2khISF8++23FBUV4XQ63Usd+4uIuFu4/v6FKS8vd7eO/C0kJKRBJggOCwvD\n4XD4va6wsDBCQkIoKbF+k84Yw+LFi92tygMHDvzsyXx8fDzZ2dnu1zk5OcTGxvok9kZFZ6RvXDp0\n6MDevXuBimR2xRVXsGPHDtq1a0f37t39nmx27dpFTEzMeZdv/nLgwAFCQ0Mb5Bez8vIzLi7O73Vl\nZ2fjcrno2rWr3+vat28fpaWl9OrVy/L/jS+++II9e/YwY8YM5syZw+TJ/5rYedCgQezevZv9+/cT\nFxdHeno6y5cv93X4wa0R3APVBFqNiLgv4wG++uorwsLCKC4u5sSJE36t2+l04nQ6CQ8P5/Dhw36t\nCyoe7DRv3pycnBy/1+V0OikvL2+w+3hFRUUcPXq0QVrXpaWlfP311zRr1syr4202Gw8++CAPPvgg\nV1xxBR999BF2u52lS5dyww034HK5mD59On369PFx5EGuEYyF136g1ZSWlpKRkeF+iFNeXu7X+51V\nNeQlNeC+t9sQKv8w+fP2R1WN7bOcN28eeXl5hIeH06JFC6Kiomp9St9I1K8faPsk4Vce9gN9W/uB\nBoVmzZrxy1/+MtBhqCZm48aNgQ4hOOklvFJKeUFnpFdKKS/pjPRKKeWlRvAQSfuBKhUk1qxZw6WX\nXkqPHj145plnfvZ+aWkp48ePp0ePHiQnJ5OVldXwQTYkH49EMsaMNsbsNMbsMcb8bGYWY8w1xpgt\nxhinMSbVkzI1gSoVBConD1m9ejU7duzgnXfeYceOHeft89prr9G2bVv27NnDb37zGx5++OEARduA\nfDQSyRhjA14CbgQSgYnGmOoTCxwEpgIed7jVS3ilgkDl5CG7du3ixhtvJC8vj7lz557XlWnFihVc\neumlJCYmYrPZ+Omnn8jKymqQAQMB4duO9FcCe0RkH4AxJh24GXD/lRKRrHPveTzmWFugSgWB3Nxc\n4uLi3K3QKVOmsHbtWjp37uy+nM/NzWXYsGFkZmaybds22rRpw+23344xhsxMD/tLNiaVCdSzoZxR\nxpjMKtvMaqXFAdlVXuec+1m9aAtUqSAgIhw/fpwePXrQpUsX/uu//ou+ffsybtw43nnnHVJSUhAR\nhg4d6p6XNjQ0lJ9++onk5OQAR+8n1rox5dXRkf5CnfrrPTBIW6BKBYH4+HgOHjxIQkICGzduJDIy\nkp49e7Jx40YOHTrE1VdfjcPhcE8w4nQ6OXbsGCkpKeTn53P77bfTp08f7rjjjgCfiQ8JUOrhVrcc\noOoEE/HAofqGqAlUqSAwaNAgjhw5wtmzZzlw4AB5eXlcccUVfPnll8ybN4/Bgwezf/9+rr/+ep55\n5hnuuOMOQkJCeOSRR8jOzuYPf/gDHTp0YNu2bfTt25dVq1YF+pTqz9olfF02AT2NMd2MMWHABGBl\nfUPUS3ilgoDdbuehhx7i8ccf5/PPP6d79+7k5ORgs9k4ePAgX3/9Nffddx8ff/wxjz32GE6nk/fe\ne4+33nqL2NhY3n33XW6//XZmzZrFjh07GDNmTOPv5uTDkUgi4jTG3Ad8RMWiVq+LyA/GmCeATBFZ\naYwZBLwHtAVuMsYsFJFaZ3DRyUSUChJOp5NLLrmEP/7xj7z88svs2rWLpKQkOnTowLp16+jUqRMb\nN27E4XAQFhZGx44dOXbsGGVlZYgIUVFRDB48mM2bN3Pq1Cm++uorBgwYEMhTqt9kIs2ShDgPH47t\nD8xkInoJr1SQqJzCbt68eXz++ef07duXyMhIli9fTlRUFFdffTWRkZEARERE0KZNG1q1akWbNm1Y\nsWIFdrudlStXcvbsWV566SVmzZoV4DOqJ99ewvuFJlClgsiYMWPYvXs3K1as4LvvviM9PZ0xY8aQ\nmJjIhg0buOqqq4iJiWHixIl89913jB07lqioKNatW+derO75559n0aJFnD59ukHmlfUrTaBKKavG\njBnD/v376dSpE6mpqRw4cIATJ05wzz334HA43KsI3HLLLSQnJ/Pxxx8TGhrK8ePHueWWWygpKaFD\nhw6NeyG6yrHwnmwBoglUqSBV/ZJ+5MiRdO3alRMnTtCqVSsAbrjhBtq3b8+BAwfYuHEj9957L8eO\nHXMvu92oF6JrBJfw+hBJqUZg1apVPPDAA5SUlFBaWsrRo0d5/PHHSUpKIiUlhR07djBixAjCwsJo\n164dixYt4t///d/5/PPPiYmJCVTY9XuIFJIkhHv4EKlYHyIppWowZswYdu3axZdffkl0dDQATzzx\nBCkpKQAkJiby2muv0adPH7Zu3Urr1q2JjIw8L3m+/PLL9OvXj379+tGtWzeuvfbagJyLxxrBuvDa\nAlWqkZg4cSKff/45eXl5dOzYkYULF+JwVGSPe+65BxHhvvvuY82aNbRo0YI33niDpKSfN8ocDgcj\nRozgoYce4qabbvJnyPVrgZokwXjYApXAtEA1gSrVxNx7771ER0ezcOFCf1dV/wSKp5Ok6KJySik/\ne/PNNzlw4ABLly4NdCgXBU2gSjURmzdv5k9/+hNfffVVgy0vfbHTBKpUE7F06VJOnjzpfniUlJTE\nX//61wBHVZvgX5ZT74EqpfylnvdABwis93DvFnoPVCml/iX4W6CaQJVSQaocKA50ELXSBKqUClLa\nAlVKqXoI4EB3D2gCVUoFKW2BKqWUl3y7MLw/aAJVSgUpbYEqpZSX9Cm8Ukp5SS/hlVLKS3oJr5RS\nXtIWqFJKeUlboEop5SVBHyIppZRXtAWqlFJe0nugSinlJW2BKqWUl7QFqpRSXtIWqFJKeUmHciql\nlJf0El4ppbwU/JfwVlflVEqpBmGMWQNEebh7noiM9mc8F6IJVCmlvBQS6ACUUqqx0gSqlFJe0gSq\nlFJe0gSqlFJe0gSqlFJe0gSqlFJe0gSqlFJe0gSqlFJe0gSqlFJe+v8ADB+HEnvoYQAAAABJRU5E\nrkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "problem = darcyEq.Darcy(g, d)\n", + "p = problem.solve()\n", + "plot_grid(g, p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now try to solve the same problem, but with a fracture in the domain. We create a multidimensional grid:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "f = np.array([[0,10],[5,5]])\n", + "gb = meshing.cart_grid([f], [10,10])\n", + "gb.assign_node_ordering()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now make use of the DarcyData class to assign data to the fracture and matrix. We wish to set zero dirichlet boundary conditions. However, the data class assigns Neumann conditions by default, so we overload the bc function. Also, we change the parameters in the fracture." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class MatrixDomain(darcyEq.DarcyData):\n", + " def __init__(self, g, d):\n", + " darcyEq.DarcyData.__init__(self, g, d)\n", + "\n", + " def bc(self):\n", + " dir_bound = np.ravel(np.argwhere((self.grid().has_face_tag(FaceTag.DOMAIN_BOUNDARY))))\n", + " return bc.BoundaryCondition(self.grid(), dir_bound, ['dir']*dir_bound.size)\n", + "\n", + "class FractureDomain(MatrixDomain):\n", + " def __init(self, g, d):\n", + " MatrixDomain.__init__(self, g, d)\n", + " \n", + " def permeability(self):\n", + " kxx = 100 * np.ones(self.grid().num_cells)\n", + " return tensor.SecondOrder(2, kxx)\n", + " \n", + " def source(self):\n", + " val = np.ones(self.grid().num_cells)\n", + " val[round(self.grid().num_cells/2)] = 1\n", + " return val\n", + " \n", + " def aperture(self):\n", + " val = 0.01 * np.ones(self.grid().num_cells)\n", + " return val\n", + " \n", + "def assign_darcy_data(gb):\n", + " gb.add_node_props(['problem'])\n", + " for g, d in gb:\n", + " if g.dim == 2:\n", + " d['problem'] = MatrixDomain(g, d)\n", + " else:\n", + " d['problem'] = FractureDomain(g, d)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are now ready to declare the problem and solve it" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "assign_darcy_data(gb)\n", + "problem = darcyEq.Darcy(gb)\n", + "problem.solve()\n", + "problem.split('pressure')\n", + "plot_grid(gb, 'pressure')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From c3fe571eb10e1808ad70f36813840269303fd5e5 Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 9 Oct 2017 10:27:28 +0200 Subject: [PATCH 14/53] meshing now assigns node ordering --- src/porepy/fracs/meshing.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/porepy/fracs/meshing.py b/src/porepy/fracs/meshing.py index c434f689be..4a4218de55 100644 --- a/src/porepy/fracs/meshing.py +++ b/src/porepy/fracs/meshing.py @@ -86,6 +86,7 @@ def simplex_grid(fracs, domain, **kwargs): #------------------------------------------------------------------------------# + def from_gmsh(file_name, dim, **kwargs): """ Import an already generated grid from gmsh. @@ -136,6 +137,7 @@ def from_gmsh(file_name, dim, **kwargs): #------------------------------------------------------------------------------# + def cart_grid(fracs, nx, **kwargs): """ Creates a cartesian fractured GridBucket in 2- or 3-dimensions. @@ -200,6 +202,7 @@ def cart_grid(fracs, nx, **kwargs): # Split grid. split_grid.split_fractures(gb, **kwargs) + gb.assign_node_ordering() return gb From a7d523ef361f25cba656f022bd3d29e490eb75b1 Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 9 Oct 2017 11:39:47 +0200 Subject: [PATCH 15/53] Added unit and integration tests too darcy equation --- test/integration/test_darcy.py | 111 +++++++++++++++++++++++++++++++++ test/unit/test_darcyEq.py | 99 +++++++++++++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 test/integration/test_darcy.py create mode 100644 test/unit/test_darcyEq.py diff --git a/test/integration/test_darcy.py b/test/integration/test_darcy.py new file mode 100644 index 0000000000..47e961629c --- /dev/null +++ b/test/integration/test_darcy.py @@ -0,0 +1,111 @@ +import numpy as np +import unittest + +from porepy.numerics import darcyEq +from porepy.grids.structured import CartGrid +from porepy.fracs import meshing +from porepy.params.data import Parameters +from porepy.params import tensor, bc + + +class BasicsTest(unittest.TestCase): + + #------------------------------------------------------------------------------# + + def test_mono_equals_multi(self): + """ + test that the mono_dimensional darcy solver gives the same answer as + the grid bucket darcy + """ + g = CartGrid([10, 10]) + g.compute_geometry() + gb = meshing.cart_grid([], [10, 10]) + param_g = Parameters(g) + + def bc_val(g): + left = g.face_centers[0] < 1e-6 + right = g.face_centers[0] > 10 - 1e-6 + + bc_val = np.zeros(g.num_faces) + bc_val[left] = -1 + bc_val[right] = 1 + return bc_val + + param_g.set_bc_val('flow', bc_val(g)) + + gb.add_node_props(['param']) + for sub_g, d in gb: + d['param'] = Parameters(sub_g) + d['param'].set_bc_val('flow', bc_val(g)) + + problem_mono = darcyEq.Darcy(g, {'param': param_g}) + problem_mult = darcyEq.Darcy(gb) + + p_mono = problem_mono.solve() + p_mult = problem_mult.solve() + + assert np.allclose(p_mono, p_mult) +#------------------------------------------------------------------------------# + + def test_darcy_uniform_flow_cart(self): + gb = setup_2d_1d([10, 10]) + problem = darcyEq.Darcy(gb) + p = problem.solve() + problem.split('pressure') + + for g, d in gb: + pressure = d['pressure'] + p_analytic = g.cell_centers[1] + p_diff = pressure - p_analytic + assert np.max(np.abs(p_diff)) < 0.03 +#------------------------------------------------------------------------------# + + def test_darcy_uniform_flow_simplex(self): + # Unstructured simplex grid + gb = setup_2d_1d(np.array([10, 10]), simplex_grid=True) + problem = darcyEq.Darcy(gb) + p = problem.solve() + problem.split('pressure') + + for g, d in gb: + pressure = d['pressure'] + p_analytic = g.cell_centers[1] + p_diff = pressure - p_analytic + assert np.max(np.abs(p_diff)) < 0.03 + + +def setup_2d_1d(nx, simplex_grid=False): + frac1 = np.array([[0.2, 0.8], [0.5, 0.5]]) + frac2 = np.array([[0.5, 0.5], [0.8, 0.2]]) + fracs = [frac1, frac2] + if not simplex_grid: + gb = meshing.cart_grid(fracs, nx, physdims=[1, 1]) + else: + mesh_kwargs = {} + mesh_size = .3 + mesh_kwargs['mesh_size'] = {'mode': 'constant', + 'value': mesh_size, 'bound_value': 2 * mesh_size} + domain = {'xmin': 0, 'ymin': 0, 'xmax': 1, 'ymax': 1} + gb = meshing.simplex_grid(fracs, domain, **mesh_kwargs) + + gb.compute_geometry() + gb.assign_node_ordering() + gb.add_node_props(['param']) + for g, d in gb: + kxx = np.ones(g.num_cells) + perm = tensor.SecondOrder(gb.dim_max(), kxx) + a = 0.01 / np.max(nx) + a = np.power(a, gb.dim_max() - g.dim) + param = Parameters(g) + param.set_tensor('flow', perm) + param.set_aperture(a) + if g.dim == 2: + bound_faces = g.get_boundary_faces() + bound = bc.BoundaryCondition(g, bound_faces.ravel('F'), + ['dir'] * bound_faces.size) + bc_val = g.face_centers[1] + param.set_bc('flow', bound) + param.set_bc_val('flow', bc_val) + d['param'] = param + + return gb diff --git a/test/unit/test_darcyEq.py b/test/unit/test_darcyEq.py new file mode 100644 index 0000000000..2870115cb8 --- /dev/null +++ b/test/unit/test_darcyEq.py @@ -0,0 +1,99 @@ +import numpy as np +import unittest + +from porepy.numerics.darcyEq import DarcyData +from porepy.grids import simplex +from porepy.params import bc, tensor +from porepy.params.data import Parameters + +#------------------------------------------------------------------------------# + + +class BasicsTest(unittest.TestCase): + + #------------------------------------------------------------------------------# + + def test_darcy_data_default_values(self): + """ + test that the darcy data initialize the correct data. + """ + p = np.random.rand(3, 10) + g = simplex.TetrahedralGrid(p) + param = Parameters(g) + darcy_data = dict() + DarcyData(g, darcy_data) + darcy_param = darcy_data['param'] + + check_parameters(darcy_param, param) + + def test_darcy_data_given_values(self): + """ + test that the darcy data initialize the correct data. + """ + p = np.random.rand(3, 10) + g = simplex.TetrahedralGrid(p) + # Set values + bc_val = np.pi * np.ones(g.num_faces) + dir_faces = g.get_boundary_faces() + bc_cond = bc.BoundaryCondition(g, dir_faces, ['dir'] * dir_faces.size) + porosity = 1 / np.pi * np.ones(g.num_cells) + apperture = 0.5 * np.ones(g.num_cells) + kxx = 2 * np.ones(g.num_cells) + kyy = 3 * np.ones(g.num_cells) + K = tensor.SecondOrder(g.dim, kxx, kyy) + source = 42 * np.ones(g.num_cells) + # Assign to parameter + param = Parameters(g) + param.set_bc_val('flow', bc_val) + param.set_bc('flow', bc_cond) + param.set_porosity(porosity) + param.set_aperture(apperture) + param.set_tensor('flow', K) + param.set_source('flow', source) + # Define DarcyData class + + class Data(DarcyData): + def __init__(self, g, data): + DarcyData.__init__(self, g, data) + + def bc(self): + return bc_cond + + def bc_val(self): + return bc_val + + def porosity(self): + return porosity + + def aperture(self): + return apperture + + def permeability(self): + return K + + def source(self): + return source + + darcy_data = dict() + Data(g, darcy_data) + darcy_param = darcy_data['param'] + + check_parameters(darcy_param, param) + + +#------------------------------------------------------------------------------# + + +def check_parameters(param_c, param_t): + + bc_c = param_c.get_bc('flow') + bc_t = param_t.get_bc('flow') + k_c = param_c.get_tensor('flow').perm + k_t = param_t.get_tensor('flow').perm + + assert np.alltrue(bc_c.is_dir == bc_t.is_dir) + assert np.alltrue(param_c.get_bc_val('flow') == param_t.get_bc_val('flow')) + assert np.alltrue(param_c.get_porosity() == param_t.get_porosity()) + assert np.alltrue(param_c.get_aperture() == param_t.get_aperture()) + assert np.alltrue(k_c == k_t) + assert np.alltrue(param_c.get_source('flow') == param_t.get_source('flow')) From 32b9bc6eb0a4ae3a2b2acf306af36656e7face3d Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 9 Oct 2017 16:29:02 +0200 Subject: [PATCH 16/53] Seperated PdeProblem from PdeProblemData. --- src/porepy/numerics/compressible/problems.py | 6 +-- src/porepy/numerics/pdeproblem.py | 24 +++++------- test/integration/test_compressible_flow.py | 34 ++++++++-------- tutorials/slightly compressible flow .ipynb | 41 ++++++++++---------- 4 files changed, 51 insertions(+), 54 deletions(-) diff --git a/src/porepy/numerics/compressible/problems.py b/src/porepy/numerics/compressible/problems.py index c5dbd24eb5..5361dc843a 100644 --- a/src/porepy/numerics/compressible/problems.py +++ b/src/porepy/numerics/compressible/problems.py @@ -34,12 +34,12 @@ def matrix_rhs(self, g, data): return multi_dim_discr -class SubSlightlyCompressible(PdeSubProblem): +class SlightlyCompressibleData(PdeProblemData): def __init__(self, g, data, physics='flow'): - PdeSubProblem.__init__(self, g, data, physics) + PdeProblemData.__init__(self, g, data, physics) def _set_data(self): - PdeSubProblem._set_data(self) + PdeProblemData._set_data(self) self.data()['compressibility'] = self.compressibility() def compressibility(self): diff --git a/src/porepy/numerics/pdeproblem.py b/src/porepy/numerics/pdeproblem.py index 331a1da4cd..7c981055ee 100644 --- a/src/porepy/numerics/pdeproblem.py +++ b/src/porepy/numerics/pdeproblem.py @@ -15,7 +15,6 @@ class PdeProblem(): def __init__(self, physics='transport'): self.physics = physics self._data = dict() - self.set_sub_problems() self._set_data() self._solver = self.solver() self._solver.parameters['store_results'] = True @@ -39,11 +38,6 @@ def update(self, t): for g, d in self.grid(): d['problem'].update(t) - def set_sub_problems(self): - self.grid().add_node_props(['problem']) - for g, d in self.grid(): - d['problem'] = PdeSubProblem(g, d) - def solver(self): return pdesolver.Implicit(self) @@ -100,21 +94,13 @@ def save(self, save_every=1): self.grid(), self.parameters['file_name'], times, folder=folder) -class PdeSubProblem(): +class PdeProblemData(): def __init__(self, g, data, physics='transport'): self._g = g self._data = data self.physics = physics self._set_data() - def _set_data(self): - if 'param' not in self._data: - self._data['param'] = Parameters(self.grid()) - self._data['param'].set_tensor(self.physics, self.diffusivity()) - self._data['param'].set_porosity(self.porosity()) - self._data['param'].set_bc(self.physics, self.bc()) - self._data['param'].set_bc_val(self.physics, self.bc_val(0.0)) - def update(self, t): source = self.source(t) bc_val = self.bc_val(t) @@ -147,3 +133,11 @@ def porosity(self): def diffusivity(self): kxx = np.ones(self.grid().num_cells) return tensor.SecondOrder(self.grid().dim, kxx) + + def _set_data(self): + if 'param' not in self._data: + self._data['param'] = Parameters(self.grid()) + self._data['param'].set_tensor(self.physics, self.diffusivity()) + self._data['param'].set_porosity(self.porosity()) + self._data['param'].set_bc(self.physics, self.bc()) + self._data['param'].set_bc_val(self.physics, self.bc_val(0.0)) diff --git a/test/integration/test_compressible_flow.py b/test/integration/test_compressible_flow.py index b087ae2d30..ec6ed8bbd8 100644 --- a/test/integration/test_compressible_flow.py +++ b/test/integration/test_compressible_flow.py @@ -24,14 +24,14 @@ def test_3d_Fracture_problem(self): ############################################################################### -class MatrixDomain(problems.SubSlightlyCompressible): +class MatrixDomain(problems.SlightlyCompressibleData): def __init__(self, g, d): - problems.SubSlightlyCompressible.__init__(self, g, d) + problems.SlightlyCompressibleData.__init__(self, g, d) -class FractureDomain(problems.SubSlightlyCompressible): +class FractureDomain(problems.SlightlyCompressibleData): def __init__(self, g, d): - problems.SubSlightlyCompressible.__init__(self, g, d) + problems.SlightlyCompressibleData.__init__(self, g, d) aperture = np.power(0.001, 3 - g.dim) self.data()['param'].set_aperture(aperture) @@ -50,6 +50,19 @@ def source(self, t): return f * (t < .05) +def set_sub_problems(gb): + gb.add_node_props(['problem']) + for g, d in gb: + if g.dim == 3: + d['problem'] = MatrixDomain(g, d) + elif g.dim == 2 or g.dim == 1: + d['problem'] = FractureDomain(g, d) + elif g.dim == 0: + d['problem'] = IntersectionDomain(g, d) + else: + raise ValueError('Unkown grid-dimension %d' % g.dim) + + class UnitSquareInjectionMultiDim(problems.SlightlyCompressible): def __init__(self): @@ -62,7 +75,7 @@ def __init__(self): g = meshing.cart_grid(f_set, [4, 4, 4], physdims=[1, 1, 1]) g.compute_geometry() g.assign_node_ordering() - + set_sub_problems(g) self.g = g # Initialize base class problems.SlightlyCompressible.__init__(self, 'flow') @@ -72,17 +85,6 @@ def __init__(self): def grid(self): return self.g - def set_sub_problems(self): - self.grid().add_node_props(['problem']) - for g, d in self.grid(): - if g.dim == 3: - d['problem'] = MatrixDomain(g, d) - elif g.dim == 2 or g.dim == 1: - d['problem'] = FractureDomain(g, d) - elif g.dim == 0: - d['problem'] = IntersectionDomain(g, d) - else: - raise ValueError('Unkown grid-dimension %d' % g.dim) #--------Time stepping------------ def time_step(self): diff --git a/tutorials/slightly compressible flow .ipynb b/tutorials/slightly compressible flow .ipynb index a8587c40ce..2c78b46b48 100644 --- a/tutorials/slightly compressible flow .ipynb +++ b/tutorials/slightly compressible flow .ipynb @@ -50,7 +50,7 @@ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", - "from porepy.numerics.compressible.problems import SlightlyCompressible, SubSlightlyCompressible\n", + "from porepy.numerics.compressible.problems import SlightlyCompressible, SlightlyCompressibleData\n", "from porepy.fracs import meshing\n", "from porepy.params import tensor\n", "from porepy.viz import plot_grid" @@ -70,9 +70,9 @@ "metadata": {}, "outputs": [], "source": [ - "class MatrixDomain(SubSlightlyCompressible):\n", + "class MatrixDomain(SlightlyCompressibleData):\n", " def __init__(self, g, data):\n", - " SubSlightlyCompressible.__init__(self, g, data)\n", + " SlightlyCompressibleData.__init__(self, g, data)\n", "\n", "class FractureDomain(MatrixDomain):\n", " def __init__(self, g, data):\n", @@ -91,7 +91,19 @@ " def source(self, t):\n", " assert self.grid().num_cells == 1, '0D grid should only have 1 cell'\n", " f = .4 * self.grid().cell_volumes # m**3/s\n", - " return f * (t < .05)" + " return f * (t < .05)\n", + " \n", + "def set_sub_problems(gb):\n", + " gb.add_node_props(['problem'])\n", + " for g, d in gb:\n", + " if g.dim == 2:\n", + " d['problem'] = MatrixDomain(g, d)\n", + " elif g.dim == 1:\n", + " d['problem'] = FractureDomain(g, d)\n", + " elif g.dim == 0:\n", + " d['problem'] = IntersectionDomain(g, d)\n", + " else:\n", + " raise ValueError('Unkown grid-dimension %d' %g.dim)" ] }, { @@ -121,6 +133,7 @@ " g = meshing.cart_grid(fracs, [nx, ny], physdims=physdims)\n", " g.assign_node_ordering()\n", " g.compute_geometry()\n", + " set_sub_problems(g)\n", " self.g = g\n", " # Initialize base class\n", " SlightlyCompressible.__init__(self)\n", @@ -130,18 +143,6 @@ " def grid(self):\n", " return self.g\n", "\n", - " def set_sub_problems(self):\n", - " self.grid().add_node_props(['problem'])\n", - " for g, d in self.grid():\n", - " if g.dim == 2:\n", - " d['problem'] = MatrixDomain(g, d)\n", - " elif g.dim == 1:\n", - " d['problem'] = FractureDomain(g, d)\n", - " elif g.dim == 0:\n", - " d['problem'] = IntersectionDomain(g, d)\n", - " else:\n", - " raise ValueError('Unkown grid-dimension %d' %g.dim)\n", - "\n", " #--------Time stepping------------\n", " def time_step(self):\n", " return .001\n", @@ -181,9 +182,9 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VPW18PHvykwuBDDBcFEIcjGIBqqiEbDUVkQRaQ22\nIqIclSNaUXn00B4Vi1qwYunbin0rqBVpwRtReavkVEBF0T61GAkFW0AhkWu4KCECIZDbZL1/zCQn\nGZLJ3mGYTIb1eZ79ODN77b1/e+9xsfOb30VUFWOMMSdfXGsXwBhjThWWcI0xJkIs4RpjTIRYwjXG\nmAixhGuMMRFiCdcYYyLEEq4x5pQgIqNEZLOIFIrItEbWJ4rI64H1eSLSO2j9WSJyRET+2+k+g1nC\nNcbEPBHxAPOAa4BM4CYRyQwKmwR8q6oZwNPAb4LWPw0sd7nPBizhGmNOBYOBQlXdqqqVQA4wJihm\nDLAo8HoJMEJEBEBErgO2Ahtd7rMBr8tCW7c0Y4xTciIbZ4joUYexe/2JsLzeRy+o6gv13vcAdtV7\nXwQMCdpNXYyqVovIISBNRI4BDwFXAf/dWHyIfTbgNuEaY0xEHAXuchg7A8pVNStESGPJP/gBsqmY\nmcDTqnok8MDrZp8NWMI1xkQlIawJqgjoWe99OrCniZgiEfECKUAJ/qfWsSLyf4BUoEZEyoG1DvbZ\ngCVcY0xUigPahW93a4B+ItIH2A2MB24OiskFbgNWA2OBD9U/utdltQEiMgM4oqpzA0m5uX02YAnX\nGBOVBIgP074CdbJTgHcBD/AnVd0oIo8D+aqaCywAXhaRQvxPtuNbss9Q24jL4RntRzNjjFMn9KNZ\nLxFttmFrwD2wtpk63KhgT7jGmKgUzifcaGEJ1xgTlcL8o1lUiLXzMcbECHvCNcaYCAlzK4WoYAnX\nGBOV7AnXGGMiKNYSVKydjzEmRtgTrjHGRIi1UjDGmAixH82MMSZCrErBGGMixKoUjDEmQuwJ1xhj\nIsSecI0xJkLsCdcYYyJEiL1WCjZrrzkpXn31VUaOHNnaxTBtmADxXmdLW2EJ1zTr8ssv58UXX2xy\n/fbt2xERqqur6z6bMGEC7733XiSK12h5hg8fTnJyMueeey4rV65sMraiooLbb7+d0047jTPOOIM5\nc+Y02I+I0KFDh7rlV7/6VSROwQAi4PU6W9qKNlTUtqG6uhpvK38DoqEMremmm27i0ksvZdmyZSxb\ntoyxY8dSUFBAly5djoudMWMGBQUF7Nixg3379jF8+HAyMzMZNWpUXczBgwdP6evZWkQg3tPapQgz\nVXWznJJ69eqlTz75pJ533nmampqqEydO1GPHjqmq6qpVq7RHjx46e/Zs7datm/7Hf/yHqqr+z//8\nj15wwQWakpKil156qX7++ed1+5s9e7Z2795dO3TooOecc46uXLlSVVXz8vL04osv1o4dO2rXrl11\n6tSpDY4RXKb3339fVVV/+ctf6vXXX68TJkzQjh076vz589Xn8+mvf/1r7du3r55++ul6ww036IED\nBxo9v5KSEv3hD3+onTt31tTUVP3hD3+ou3btUlXVX/ziFxoXF6eJiYnavn17vffee4/bvmfPngpo\nXFyctm/fXj/44APt3r27Dho0qC4G0Hnz5mlGRoZ26NBBH3nkES0sLNShQ4dqx44d9YYbbtCKioq6\n+FDXL5TNmzdrQkKCHj58uO6z733ve/rcc881Gt+9e3d99913694/8sgjeuONN6qq6rZt2xTQqqoq\nR8du6r6ewtzmlwbLRR60MsXZgn9espD7A0YBm4FCYFoj6xOB1wPr84Degc8HA+sDy+fAj+ttsx34\nd2Bd82VweRFOSb169dIBAwbozp079cCBA/rd735Xp0+frqr+ZOjxePTBBx/U8vJyPXr0qK5du1a7\ndOmin376qVZXV+vChQu1V69eWl5erl9++aWmp6fr7t27VdX/P3VhYaGqqg4dOlRfeuklVVUtLS3V\n1atX1x2juYTr9Xr1rbfeUp/Pp0ePHtWnn35ahwwZort27dLy8nL96U9/quPHj2/0/IqLi3XJkiVa\nVlamhw8f1rFjx+qYMWPq1v/gBz/Q+fPnN3l9ahPTww8/rD//+c/1nnvu0euvv16HDRtWFwPotdde\nq4cOHdINGzZoQkKCXnHFFfrVV1/pwYMH9bzzztOFCxeqqoa8fqqqd999t959992NluUvf/mLnnvu\nuQ0+u/fee3XKlCnHxZaUlCig+/btq/vszTff1IEDBzY4r+7du2uPHj104sSJun///kaPG+q+nsJO\nKOFe7EW1q7OluWSHf5LHr4C+QEIgcWYGxdwDPB94PR54PfA6GfAGXp8JfFPv/Xags9Nzsjpch6ZM\nmULPnj05/fTTmT59OosXL65bFxcXx8yZM0lMTKRdu3bMnz+fu+66iyFDhuDxeLjttttITEzk008/\n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\ncrp06UJycjLHjh2jqKiIvXv38tRTTzFy5Ehqamq4/fbbGTBgAGeffTZPP/002dnZTJo0iVtuuYWM\njAxOP/10cnJyWnRsr9fL3Llzufrqq/H5fHXHeuyxx/jrX//KP//5Tx544AGOHDnCDTf4BzY666yz\nyM0NHtozPMcKJyfHu/rqq3nvvffIzMzE4/Hw29/+lrS0tLAeKysri2effZY5c+Zw55138vTTTyMi\nLFy4sMV/5t9000189NFHFBcXk56ezsyZM+umGXr77bdZvnw5y5YtIyMjg+TkZP785z+36DinlNoB\nyGOIjYcbpLy8HIDVq1ejqnTs2JH9+/eTlJREz549uejiIRwp/db5DiUe9Pj5vZoUFw81LuK98VDt\nPF7iPWiV87nKvPFCdZXz2+42Pi7eQ42L8rg9X9fX0+39asE2HTt24vDhkuYD274TGw/3DNH8/3B4\noKeaHw83GtgTbggiwne+8x0+/vhjjh49ys6dO/3Jto+Lf3e2CVzqIn61wFQX8U8LfOI8XocJI7Xx\nqXYa856M4e96seP478la1/Fuy+PmfBnWguvp5n6B/565+E6UbrMfyxyxrr2nHhEhISEBj8fTYCJH\nY8xJZl17T10ej4f27du3djFMjAieN840IgZbKbShorY+azdpwqWlHTpOKfaEa4wJNxv4JgTn06Q3\nS0RGichmESkUkWmNrE8UkdcD6/NEpHfg88Eisj6wfC4iP3a6z2CWcI1pZRMnTgz5xLt8+XIKCgoo\nKCjghRde4O67745g6VpRGKsURMQDzAOuATKBm0QkMyhsEvCtqmYATwO/CXy+AchS1QuBUcAfRcTr\ncJ8NWMI1ppXZwDdNCO9YCoOBQlXdqqqVQA4wJihmDLAo8HoJMEJERFWPqmp14PMk/rd5rJN9NmAJ\n15god8oOfOPuCbeziOTXW34atLcewK5674sCnzUaE0iwh4A0ABEZIiIbgX8DkwPrneyzgRirkjYm\n9pyyA9+4+9GsuJmOD41dsOAL22SMquYBA0TkPGCRiCx3uM8GLOG6JfH+zgyOef0N452K8/ob3zvl\n8fob9zskXo+/84Dj3Qvfk7WuiuMm3m153J6v6+spLu8XAF533wmJd7X3U3bgm/B27S0CetZ7nw7s\naSKmSES8QArQoEugqn4hImXAQIf7bMASrlta5b7n2FgX8UsEZruInyaww3m3Uu0Vz0R9znH8Qrmb\n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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -191,9 +192,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VNXV+PHvyuRGABMIgoUgF4No4t0IWGuroohYg62I\nKEV9xbvUS1sFS7GgotgW9FcBLUgLaiFqXpVUBRVFfWsxGgqtgBUit4SLEsI1kNvM+v0xkzQZcjmT\nTCaTyfo8z3mYc8465+yZE1Z29py9t6gqxhhjWl5UaxfAGGPaC0u4xhgTIpZwjTEmRCzhGmNMiFjC\nNcaYELGEa4wxIWIJ1xjTLojIcBH5WkTyRWRSHfvjROQV3/5cEenrt/9EETksIr9yek5/lnCNMRFP\nRFzAHOAKIA24XkTS/MLGA/tUNRV4GnjKb//TwLIAz1mLJVxjTHswCMhX1c2qWg5kASP9YkYCi3yv\ns4GhIiIAInI1sBlYH+A5a4kOsNDWLc0Y45Q05+BUET3iMHaXNxGW1tg0T1Xn1VjvBRTUWC8EBvud\npjpGVStF5ACQLCJHgYnAZcCv6opv4Jy1BJpwjTEmJI4AdziMnQqlqprRQEhdyd+/AllfzDTgaVU9\n7KvwBnLOWizhGmPCkhDUBFUI9K6xngLsrCemUESigUSgGG+tdZSI/A5IAjwiUgqsdnDOWizhGmPC\nUhTQIXin+wIYICL9gB3AGOAGv5gc4CZgFTAK+FC9o3tdWBUgIlOBw6o625eUGztnLZZwjTFhSYCY\nIJ3L1yY7AXgXcAF/VtX1IvIokKeqOcAC4CURycdbsx3TlHM2dIwEODyjfWlmjHGqWV+a9RHRRh9s\n9bkbVjfShhsWrIZrjAlLwazhhgtLuMaYsBTkL83CQqS9H2NMhLAarjHGhEiQn1IIC5ZwjTFhyWq4\nxhgTQpGWoCLt/RhjIoTVcI0xJkTsKQVjjAkR+9LMGGNCxJoUjDEmRKxJwRhjQsRquMYYEyJWwzXG\nmBCxGq4xxoSIEHlPKdisvSYk/vrXvzJs2LDWLoZpQwSIiXa2tBWWcE3ALrroIl544YV692/duhUR\nobKysnrb2LFjee+990JRvDrLc/HFF5OQkMApp5zCihUr6o199dVX+f73v09CQgIXXXRR6AppjiEC\n0dHOlrbCEm4Lq5l02nMZWtP111/P2Wefzd69e5k+fTqjRo1iz549dcZ27dqV+++/n0mTnM41YFqK\nCMS4nC1thqoGshhV7dOnjz7xxBN66qmnalJSkt5888169OhRVVVduXKl9urVS2fMmKE9evTQn/3s\nZ6qq+re//U3PPPNMTUxM1PPPP1//9a9/VZ9vxowZ2rNnT+3UqZOefPLJumLFClVVzc3N1XPPPVc7\nd+6s3bt31wceeKDWNfzL9P7776uq6m9/+1u95pprdOzYsdq5c2edP3++ut1uffLJJ7V///7atWtX\nvfbaa3Xv3r11vr/i4mK98sortVu3bpqUlKRXXnmlFhQUqKrqr3/9a42KitK4uDjt2LGj3nPPPaqq\n+vnnn+vpp5+uR48e1ZSUFAW0Q4cO2rFjR/3HP/6hf/nLX/SCCy6ovgagc+bM0dTUVO3UqZP+5je/\n0fz8fB0yZIh27txZr732Wi0rK6uOb+jza8jXX3+tsbGxevDgweptP/jBD/S5555r8Lj58+frj370\nowZj9uzZo1deeaUmJiZqly5d9Ac/+IG63W5H5WonAs0vtZZzXGh5orMF77xkDZ4PGA58DeQDk+rY\nHwe84tufC/T1bR8ErPUt/wJ+UuOYrcCXvn2NlyHAD8GoN7mlp6fr9u3bde/evfr9739fJ0+erKre\nZOhyufShhx7S0tJSPXLkiK5evVqPP/54/eyzz7SyslIXLlyoffr00dLSUv3Pf/6jKSkpumPHDlVV\n3bJli+bn56uq6pAhQ/TFF19UVdVDhw7pqlWrqq/RWMKNjo7WN954Q91utx45ckSffvppHTx4sBYU\nFGhpaanefvvtOmbMmDrfX1FRkWZnZ2tJSYkePHhQR40apSNHjqze/6Mf/Ujnz59/zHGTJ0/WX/7y\nl/qzn/1MAa2oqKjeV1fCveqqq/TAgQO6bt06jY2N1UsuuUS/+eYb3b9/v5566qm6cOFCVdUGPz9V\n1bvuukvvuuuuOt/L66+/rqecckqtbffcc49OmDChzvgqThLupEmT9I477tDy8nItLy/XTz75RD0e\nT4PHtDPNSrjnRqPa3dnSWLLDO8njN0B/INaXONP8Yu4Gnve9HgO84nudAET7Xn8P+K7G+lagm9P3\nZE0KTTRhwgR69+5N165dmTx5MkuWLKneFxUVxbRp04iLi6NDhw7Mnz+fO+64g8GDB+NyubjpppuI\ni4vjs88+w+VyUVZWxoYNG6ioqKBv376cdNJJAMTExJCfn09RURGdOnViyJAhjst3/vnnc/XVVxMV\n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\nISl7qwrSY2G+NtkJwLvAV8CrqrpeRB4VkUxf2AIgWUTygV8A1Y+OichWYBZws4gU1njC4S7gBSAf\n+AZY1lA5bPAaP/v37we8s6RGRUXhdrtxu93ViS+UiaiszDu/SKgSfJVQ1zbBW+MEbyIMldb466Hq\nl6iIEBsbyy9+8Qv27NlDcXExQ4YM4f333+e8885j8eLFpKenVx83Z84cvvzyS55//nmysrJ4/fXX\nefXVwMZ8aAXNG7yme4YyyuHgNc/Z4DVtUnx8PKqKqnLOOefw7bffUlBQwODBg+nQoUPIynHgwAG+\n+eYbzj777JDWbktKStiyZQunnXZayK4JcOjQIQoKCkhL8380smUVFRWxc+dOTj/99JAm3W3btrF/\n/35WrlzJ4sWLefbZZ9m+fTunnnpqnbP2jh8/nnHjxpGamkrXrl3JysoKSVlbVQROImk1XD9Hjhyh\nvLyctWvXUlFRQVlZWcj/pAdv7TYmJoaoqNC2+rjdblSV6OjQ/y4uKysLeW2+6rqt8VlXVlbidrv5\n7W9/y/79+9mxYwcnnXQSvXr1qvXYWBvWvBputwwl02EN9y9to4ZrCdePqtZqS1TVyP9ywrSamj9f\ne/bsoUePHpH089a8hJucoVzpMOG+1DYSrjUp+BGRkH9hZAzACSec0NpFCC+Ko267bYklXGNMeKrq\n2htBLOEaY8KTjYdrjDEhYgnXGGNCJAIfC7OeZsaEieLiYi677DIGDBjAZZddxr59++qMW7RoEQMG\nDGDAgAEsWrTomP2ZmZkhf466xQRveMawYAnXmDAxY8YMhg4dSm5uLlu3bqV///7HJN7i4mKmTZtG\nbm4uDzzwALfeeisnnXRSdeJdsmQJq1evZtOmTaSnpzNp0jETG7QdVWMpOFnaCEu4xoSJpUuXcuKJ\nJ5KamkpRURHR0dEMHTq01oDkb731FiJCRkYGv/jFL8jMzGTSpElMmzaNiRMn8j//8z+43W6+973v\nsWbNGj799FOWLWuwe3/4qmpScLK0EZZwjQkTu3fvZsqUKSQmJrJ27VqKi4s5//zzaw1s8+abb5Kc\nnMz06dO54IIL2LhxIwcOHCAjI4PnnnuOF198kddee42dO3ficrk455xzKCwsbOCqYSy4Mz6EBfvS\nzJgQuvTSS9m9e/cx26dPn47b7SY1NZXc3Fy++uorVJWf/vSntaZ2Wr9+PT/60Y/Ytm0b3377LRs2\nbOCPf/wjycnJxMfH06VLF+6++24qKys55ZRTOHz4MPfdd18o32JwRdhTClbDNSaEVqxYwbp1647p\nVTZ58mTKyso4evQoqsqdd95J586dq0eqe+CBBwDvWB8lJSXk5uZWj163f/9+/v3vf3PgwAFuuukm\nioqKACgoKGD37t28/vrrIX+fQRHkWXvDgdVwjWkFK1asOGZbZmYmu3btIjExERGhsrKSESNGsHLl\nSrKysrjtttvo2LEjn3zyCccddxzgHWzo888/Jy0tjd69e5Ofn8/WrVsZOHAgSUlJFBcXh2zM36AL\n7gDkYcFquMaEibvvvpvNmzezd+9evvvuO0444QQOHTrEKaecgtvtZunSpfTp04dx48axadMmNmzY\nQFxcHN27dwe80/CoKn/4wx+orKwkNTWVlJSUVhn5LSgisIZrCdeYMHHppZeSmJjII488QmxsLFu3\nbmXfvn2MHTuWM888kzVr1nDo0CGKi4sZMGBAdU140KBBJCUl4Xa7ycvLY86cOXg8Hj7//HMOHjx4\nzPxobYolXGNMS4iOjmb27NnMnj2bI0eOcPbZZ5Obm8trr73G0aNH6dGjBx9++CF79+5ly5YtHD16\nlPfff5///Oc/REVF0alTJ6699lqOO+44unTpwsqVK5kwYQKDBw9u7bfWNPZYmDGmJY0YMYItW7aQ\nnJxcPQfa3r17ycjIoGfPnsTHx/Paa6/x+9//nu7duxMVFUV2djYXXXQRUVFRrFmzhsrKSqKjoxk7\ndizPPPMMTzzxBLNnz27ttxa4ID8WJiLDReRrEckXkWN6hIhInIi84tufKyJ9a+x72Lf9axG5vMb2\nrSLypYisFZFGB++1hGtMmImOjuZPf/oTq1atIjU1lZ/+9KesXLmSbdu2kZOTA8D48ePp1q0bw4cP\nZ9asWVx44YVccsklzJkzB4CePXuSlJREfHw89957LxMmTGjNt9Q0QWzDFREXMAe4AkgDrq8xEWSV\n8cA+VU0Fngae8h2bhneW33RgODDXd74qF6vqWU4GQLeEa0wYuuqqq1i6dCnx8fG8+OKLjB49muef\nf568vDxycnKIj49n1apVDBs2jOLiYv76178yY8YMfvOb31BSUsLatWtZu3Ytd955J506dQLg+eef\n56yzzuKss86iX79+XHzxxa38LhvhwTsAuZOlcYOAfFXdrKrlQBYw0i9mJFA1OEU2MFS802+MBLJU\ntUxVt+CdoXdQU96STbFjTDtTUVHBJZdcwkMPPcRVV13Vkpdq3hQ7kqE0/le6lzY8xY6IjAKGq+qt\nvvVxwGBVnVAjZp0vptC3/g0wGJgKfKaqL/u2LwCWqWq2iGwB9uHNjX9S1XkNFbONPi9ijGmq++67\nj0suuaSlk21wOK/idfNrQ53nl/zqSv7+Z68vpqFjL1DVnSLSHXhfRP6jqp/UV0hLuMa0IwsXLmTb\ntm1t80u0hhU10oZaCPSusZ4C7KwnplBEooFEoLihY1W16t/vROQNvE0N9SZca8M1pp1YvXo1f/jD\nH3j55ZdDPiV8GPgCGCAi/UQkFu+XYDl+MTnATb7Xo4AP1dvmmgOM8T3F0A8YAHwuIh1FpDOAiHQE\nhgHrGiqE1XCNaSdmz55NcXFx9ZdlGRkZvPDCC61cqtBQ1UoRmQC8C7iAP6vqehF5FMhT1RxgAfCS\niOTjrdmO8R27XkReBTbgfSbiHlV1i0gP4A3ftPbRwGJVXd5QOexLM2NMS2nml2bnKHzqMDqhwS/N\nwoXVcI0xYSryJjWzhGuMCVORN22vJVxjTJiyGq4xxoSIJVxjjAkRxWm/3bbCEq4xJkxZG64xxoSI\nNSkYY0yIWA3XGGNCxGq4xhgTIlbDNcaYEKkagTxyWMI1xoQpa1IwxpgQsiYFY4wJAavhGmNMiFjC\nNcaYELGnFIwxJkTsKQVjjAkRa1IwxpgQibwmhXY3dacxpq2oquE6WRonIsNF5GsRyReRSXXsjxOR\nV3z7c0Wkb419D/u2fy0ilzs9pz9LuMaYMFVVw3WyNExEXMAc4AogDbheRNL8wsYD+1Q1FXgaeMp3\nbBreGXzTgeHAXBFxOTxnLZZwjTFhqupLMydLowYB+aq6WVXLgSxgpF/MSGCR73U2MFS8c6CPBLJU\ntUxVtwD5vvM5OWctgbbhNmvaY2OMcW7XuzC1m8PgeBHJq7E+T1Xn1VjvBRTUWC8EBvudozpGVStF\n5ACQ7Nv+md+xvXyvGztnLfalmTEmLKnq8CCerq7KojqMqW97XS0E/uesxZoUjDHtQSHQu8Z6CrCz\nvhgRiQYSgeIGjnVyzlos4Rpj2oMvgAEi0k9EYvF+CZbjF5MD3OR7PQr4UFXVt32M7ymGfsAA4HOH\n56zFmhSMMRHP1yY7AXgXcAF/VtX1IvIokKeqOcAC4CURycdbsx3jO3a9iLwKbMD7SMQ9quoGqOuc\nDZVDvAncGGNMS7MmBWOMCRFLuMYYEyKWcI0xJkQs4RpjTIhYwjXGmBCxhGuMMSFiCdcYY0Lk/wPx\nZAzfsR/fvAAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4lNXZ+PHvPZOFhCUsAaqE1QAaLAKGTbQVbQGxgl4i\nAq6XKwo/sbUqLUURqy+2Be2rYCtSEawEylslVsAN0beWLUhVwAIRWQIiBARCcLLM3L8/ZpI3GbI8\nA5PJZLg/1/VcznLmnPPM4J0zZ55zblFVjDHG1D1XfXfAGGPOFhZwjTEmQizgGmNMhFjANcaYCLGA\na4wxEWIB1xhjIsQCrjHmrCAiw0Rkm4jkisjkKp5PFJHFgefXiUinoOc7iMgJEfml0zqDWcA1xsQ8\nEXEDs4GrgAxgrIhkBBW7E/hOVdOBZ4Fngp5/FlgRYp2VWMA1xpwN+gG5qrpTVYuBLGBkUJmRwKuB\n20uBK0VEAETkWmAnsCXEOiuJC7HTtizNGOOUnMmL00X0pMOy3/gDoafCQy+p6ksV7rcD9la4nwf0\nD6qmvIyqlorIMaCViHwPPAr8FPhlVeVrqLOSUAOuMcZExEngXodlp4FHVTNrKFJV8A8eQFZX5gng\nWVU9ERjwhlJnJRZwjTFRSQhrgMoD2le4nwbsr6ZMnojEASnAEfyj1lEi8jugOeATEQ+w0UGdlVjA\nNcZEJReQFL7qNgBdRaQzsA8YA4wLKpMN3AasAUYBq9S/u9dlZQVEZBpwQlVfCATl2uqsxAKuMSYq\nCRAfproCc7ITgXcAN/AXVd0iItOBHFXNBuYBC0UkF//Idszp1FnTayTE7RntRzNjjFNn9KNZRxGt\n9cLWgPthYy1zuFHBRrjGmKgUzhFutLCAa4yJSmH+0SwqxNr5GGNihI1wjTEmQsJ8lUJUsIBrjIlK\nNsI1xpgIirUAFWvnY4yJETbCNcaYCLGrFIwxJkLsRzNjjIkQm1IwxpgIsSkFY4yJEBvhGmNMhNgI\n1xhjIsRGuMYYEyFC7F2lYFl7TUT89a9/ZciQIfXdDdOACBAf5+xoKCzgmpBdfvnlvPzyy9U+v2vX\nLkSE0tLS8sduuukm3n333Uh0r8r+DB48mOTkZM4//3zef//9assuWbKESy65hOTkZC6//PLIddKc\nQgTi4pwdDYUF3DpWMeiczX2oT2PHjqV3794cPnyYp556ilGjRnHo0KEqy7Zs2ZIHH3yQyZOd5how\ndUUE4t3OjgZDVUM5jKp27NhRn376ab3gggu0efPmevvtt+v333+vqqoffvihtmvXTmfMmKFt27bV\nm2++WVVV33rrLb3ooos0JSVFBw4cqJ999ll5fTNmzNBzzz1XmzRpot26ddP3339fVVXXrVunF198\nsTZt2lTbtGmjP//5zyu1Edyn9957T1VVH3/8cb3++uv1pptu0qZNm+rcuXPV6/Xqf/3Xf2mXLl20\nZcuWesMNN+jhw4erPL8jR47o1Vdframpqdq8eXO9+uqrde/evaqq+utf/1pdLpcmJiZq48aNdcKE\nCaqqun79ev3hD3+o33//vaalpSmgSUlJ2rhxY/3Xv/6lr7zyig4aNKi8DUBnz56t6enp2qRJE/3N\nb36jubm5OmDAAG3atKnecMMNWlRUVF6+pvevJtu2bdOEhAQ9fvx4+WOXXnqpvvjiizW+bu7cufrj\nH/+4xjKHDh3Sq6++WlNSUrRFixZ66aWXqtfrddSvs0So8aXS0ceNFqc4O/DnJauxPmAYsA3IBSZX\n8XwisDjw/DqgU+DxfsC/A8dnwHUVXrML+CLwXO19CPFNMOoPbj169NA9e/bo4cOH9ZJLLtEpU6ao\nqj8Yut1ufeSRR9Tj8ejJkyd148aN2rp1a127dq2Wlpbq/PnztWPHjurxePQ///mPpqWl6b59+1RV\n9euvv9bc3FxVVR0wYIAuWLBAVVULCgp0zZo15W3UFnDj4uL0jTfeUK/XqydPntRnn31W+/fvr3v3\n7lWPx6P33HOPjhkzpsrzy8/P16VLl2phYaEeP35cR40apSNHjix//sc//rHOnTv3lNdNmTJFH3ro\nIb355psV0JKSkvLnqgq411xzjR47dkw3b96sCQkJesUVV+hXX32lR48e1QsuuEDnz5+vqlrj+6eq\net999+l9991X5bn8/e9/1/PPP7/SYxMmTNCJEydWWb6Mk4A7efJkvffee7W4uFiLi4v1448/Vp/P\nV+NrzjJnFHAvjkO1jbOjtmCHP8njV0AXICEQODOCytwP/ClwewywOHA7GYgL3D4HOFjh/i4g1ek5\n2ZTCaZo4cSLt27enZcuWTJkyhUWLFpU/53K5eOKJJ0hMTCQpKYm5c+dy77330r9/f9xuN7fddhuJ\niYmsXbsWt9tNUVERW7dupaSkhE6dOnHeeecBEB8fT25uLvn5+TRp0oQBAwY47t/AgQO59tprcblc\nJCUl8ec//5mnnnqKtLQ0EhMTmTZtGkuXLq1yuqFVq1Zcf/31JCcn07RpU6ZMmcJHH31Ua5uPPfYY\n7733Hl988YWjPj766KM0a9aMHj16cOGFFzJkyBC6dOlCSkoKV111FZs2bQKo8f0DmDNnDnPmzKmy\njRMnTpCSklLpsZSUFAoKChz1sSbx8fF888037N69m/j4eC677DJEzihvoqmo7EJcJ0ft+gG5qrpT\nVYuBLGBkUJmRwKuB20uBK0VEVPWkqpb9j9KIM0imawH3NLVv3778dseOHdm/f3/5/datW9OoUaPy\n+7t372bmzJk0b968/Ni7dy/79+8nPT2d5557jmnTptGmTRvGjBlTXte8efPYvn07559/Pn379uUf\n//jHafWvrA/XXXddefsXXHABbrebb7/99pTXnjx5knvvvZeOHTvSrFkzfvSjH3H06FG8Xm+NbR45\ncoQTJ05w4sQJR31s27Zt+e2kpKRT7pfVU9P7V5smTZpw/PjxSo8dP36cpk2bOupjTR5++GHS09PL\n/1DMmDHjjOs0FYQ34LYD9la4nxd4rMoygQB7DGgFICL9RWQL/umD8RUCsALvishGEbmntk5YwD1N\ne/f+32e3Z88ezj333PL7waOc9u3bM2XKFI4ePVp+nDx5krFjxwIwbtw4/vnPf7J7925EhEcffRSA\nrl27smjRIg4ePMijjz7KqFGjKCwspHHjxpw8ebK8fq/Xe8qPQFX1YcWKFZX64PF4aNcu+N8czJw5\nk23btrFu3TqOHz/Oxx9/DFD2tavaUdw999zDk08+ybXXXlvzmxei2t6/mvTo0YOdO3dWGtF+9tln\n9OjR44z71bRpU2bOnMnOnTt56623mDVrFh988MEZ12sqcB5wU0Ukp8IRHPyq+kcbPFKttoyqrlPV\nHkBf4FciUjaiGqSqfYCrgAki8qOaTscC7mmaPXs2eXl5HDlyhKeffpobb7yx2rJ33303f/rTn1i3\nbh2qSmFhIW+//TYFBQVs27aNVatWUVRURKNGjUhKSsLt9v/s+tprr3Ho0CFcLhfNmzcHwO12061b\nNzweD2+//TYlJSX89re/paioqMb+jh8/nilTprB7924ADh06xLJly6osW1BQQFJSEs2bN+fIkSM8\n8cQTlZ5v27YtO3furPTYggULiIuLY9y4cTz++OOA/9rbcKjp/atNt27d6NWrF0888QQej4c33niD\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, From 771e694f4d4e7df34964044ea30b0ce61208835b Mon Sep 17 00:00:00 2001 From: Runar Date: Tue, 10 Oct 2017 10:03:42 +0200 Subject: [PATCH 17/53] Added source discretization and removed the source term from tpfa --- src/porepy/numerics/compressible/problems.py | 2 +- src/porepy/numerics/darcyEq.py | 25 ++++-- src/porepy/numerics/fv/source.py | 78 +++++++++++++++++++ src/porepy/numerics/fv/tpfa.py | 10 +-- src/porepy/numerics/pdeproblem.py | 7 +- test/integration/test_darcy.py | 80 ++++++++++++++++++++ 6 files changed, 184 insertions(+), 18 deletions(-) create mode 100644 src/porepy/numerics/fv/source.py diff --git a/src/porepy/numerics/compressible/problems.py b/src/porepy/numerics/compressible/problems.py index 5361dc843a..894d669132 100644 --- a/src/porepy/numerics/compressible/problems.py +++ b/src/porepy/numerics/compressible/problems.py @@ -16,7 +16,7 @@ def __init__(self, physics='flow'): PdeProblem.__init__(self, physics) def space_disc(self): - return self.diffusive_disc() + return self.diffusive_disc(), self.source_disc() def time_disc(self): """ diff --git a/src/porepy/numerics/darcyEq.py b/src/porepy/numerics/darcyEq.py index 6efe98d0c4..deb7a098b0 100644 --- a/src/porepy/numerics/darcyEq.py +++ b/src/porepy/numerics/darcyEq.py @@ -1,7 +1,7 @@ import numpy as np import scipy.sparse as sps -from porepy.numerics.fv import tpfa +from porepy.numerics.fv import tpfa, source from porepy.grids.grid_bucket import GridBucket from porepy.params import bc, tensor from porepy.params.data import Parameters @@ -24,10 +24,19 @@ def reassemble(self): reassemble matrices. This must be called between every time step to update the rhs of the system. """ - lhs, rhs = self._discretize() - self.lhs = lhs - self.rhs = rhs - return lhs, rhs + lhs_flux, rhs_flux = self._discretize(self.flux_disc()) + lhs_source, rhs_source = self._discretize(self.source_disc()) + assert lhs_source.nnz == 0, 'Source lhs different from zero!' + self.lhs = lhs_flux + self.rhs = rhs_flux + rhs_source + return self.lhs, self.rhs + + def source_disc(self): + if isinstance(self.grid(), GridBucket): + source_discr = source.IntegralMultiDim(physics=self.physics) + else: + source_discr = source.Integral(physics=self.physics) + return source_discr def flux_disc(self): if isinstance(self.grid(), GridBucket): @@ -36,11 +45,11 @@ def flux_disc(self): diffusive_discr = tpfa.Tpfa(physics=self.physics) return diffusive_discr - def _discretize(self): + def _discretize(self, discr): if isinstance(self.grid(), GridBucket): - lhs, rhs = self.flux_disc().matrix_rhs(self.grid()) + lhs, rhs = discr.matrix_rhs(self.grid()) else: - lhs, rhs = self.flux_disc().matrix_rhs(self.grid(), self.data()) + lhs, rhs = discr.matrix_rhs(self.grid(), self.data()) return lhs, rhs def grid(self): diff --git a/src/porepy/numerics/fv/source.py b/src/porepy/numerics/fv/source.py new file mode 100644 index 0000000000..00e791bf45 --- /dev/null +++ b/src/porepy/numerics/fv/source.py @@ -0,0 +1,78 @@ +import numpy as np +import scipy.sparse as sps + +from porepy.numerics.mixed_dim.solver import Solver +from porepy.numerics.mixed_dim.coupler import Coupler + + +class Integral(Solver): + + def __init__(self, physics='flow'): + self.physics = physics + Solver.__init__(self) + + def ndof(self, g): + return g.num_cells + + def matrix_rhs(self, g, data): + param = data['param'] + sources = param.get_source(self) + lhs = sps.csc_matrix((g.num_cells, g.num_cells)) + assert sources.size == g.num_cells, 'There should be one soure value for each cell' + return lhs, sources + + +class Density(Solver): + def __init__(self, physics='flow'): + self.physics = physics + Solver.__init__(self) + + def ndof(self, g): + return g.num_cells + + def matrix_rhs(self, g, data): + param = data['param'] + sources = param.get_source(self) + lhs = sps.csc_matrix((g.num_cells, g.num_cells)) + assert sources.size == g.num_cells, 'There should be one soure value for each cell' + rhs = sources * g.cell_volumes + + return lhs, rhs + + +class IntegralMultiDim(Solver): + def __init__(self, physics='flow'): + self.physics = physics + discr = Integral(self.physics) + self.solver = Coupler(discr) + Solver.__init__(self) + + def ndof(self, gb): + ndof = 0 + for g, _ in gb: + ndof += g.num_cells + + def matrix_rhs(self, gb): + return self.solver.matrix_rhs(gb) + + def split(self, gb, names, var): + return self.solver.split(gb, names, var) + + +class DensityMultiDim(Solver): + def __init__(self, physics='flow'): + self.physics = physics + discr = Density(self.physics) + self.solver = Coupler(discr) + Solver.__init__(self) + + def ndof(self, gb): + ndof = 0 + for g, _ in gb: + ndof += g.num_cells + + def matrix_rhs(self, gb): + return self.solver.matrix_rhs(gb) + + def split(self, gb, names, var): + return self.solver.split(gb, names, var) diff --git a/src/porepy/numerics/fv/tpfa.py b/src/porepy/numerics/fv/tpfa.py index 73ee740016..2549a0d24c 100644 --- a/src/porepy/numerics/fv/tpfa.py +++ b/src/porepy/numerics/fv/tpfa.py @@ -93,23 +93,19 @@ def matrix_rhs(self, g, data, faces=None, discretize=True): bound_flux = data['bound_flux'] param = data['param'] bc_val = param.get_bc_val(self) - sources = param.get_source(self) - return M, self.rhs(g, bound_flux, bc_val, sources) + return M, self.rhs(g, bound_flux, bc_val) #------------------------------------------------------------------------------# - def rhs(self, g, bound_flux, bc_val, f): + def rhs(self, g, bound_flux, bc_val): """ Return the righ-hand side for a discretization of a second order elliptic equation using the TPFA method. See self.matrix_rhs for a detaild description. """ - if f is None: - f = np.zeros(g.num_cells) - warnings.warn('Scalar source not assigned, assumed null') div = g.cell_faces.T - return -div * bound_flux * bc_val + f + return -div * bound_flux * bc_val #------------------------------------------------------------------------------# diff --git a/src/porepy/numerics/pdeproblem.py b/src/porepy/numerics/pdeproblem.py index 7c981055ee..bc10a108b6 100644 --- a/src/porepy/numerics/pdeproblem.py +++ b/src/porepy/numerics/pdeproblem.py @@ -4,7 +4,7 @@ from porepy.params.data import Parameters from porepy.params import tensor, bc from porepy.fracs import meshing -from porepy.numerics.fv import fvutils, tpfa, mass_matrix +from porepy.numerics.fv import fvutils, tpfa, mass_matrix, source from porepy.numerics.fv.transport import upwind, upwind_coupling from porepy.numerics import pdesolver from porepy.numerics.mixed_dim import coupler @@ -51,8 +51,11 @@ def diffusive_disc(self): diffusive_discr = tpfa.TpfaMultiDim(physics=self.physics) return diffusive_discr + def source_disc(self): + return source.IntegralMultiDim(physics=self.physics) + def space_disc(self): - return self.advective_disc(), self.diffusive_disc() + return self.advective_disc(), self.diffusive_disc(), self.source_disc() def time_disc(self): """ diff --git a/test/integration/test_darcy.py b/test/integration/test_darcy.py index 47e961629c..2200be446f 100644 --- a/test/integration/test_darcy.py +++ b/test/integration/test_darcy.py @@ -73,6 +73,66 @@ def test_darcy_uniform_flow_simplex(self): p_diff = pressure - p_analytic assert np.max(np.abs(p_diff)) < 0.03 + def test_darcy_dirich_neumann_source_sink_cart(self): + gb = setup_3d(np.array([4, 4, 4]), simplex_grid=False) + problem = darcyEq.Darcy(gb) + p = problem.solve() + problem.split('pressure') + + for g, d in gb: + if g.dim == 3: + p_ref = darcy_dirich_neumann_source_sink_cart_ref_3d() + assert np.allclose(d['pressure'], p_ref) + if g.dim == 0: + p_ref = [-10788.06883149] + assert np.allclose(d['pressure'], p_ref) + return gb + + +def setup_3d(nx, simplex_grid=False): + f1 = np.array( + [[0.2, 0.2, 0.8, 0.8], [0.2, 0.8, 0.8, 0.2], [0.5, 0.5, 0.5, 0.5]]) + f2 = np.array( + [[0.2, 0.8, 0.8, 0.2], [0.5, 0.5, 0.5, 0.5], [0.2, 0.2, 0.8, 0.8]]) + f3 = np.array( + [[0.5, 0.5, 0.5, 0.5], [0.2, 0.8, 0.8, 0.2], [0.2, 0.2, 0.8, 0.8]]) + fracs = [f1, f2, f3] + if not simplex_grid: + gb = meshing.cart_grid(fracs, nx, physdims=[1, 1, 1]) + else: + mesh_kwargs = {} + mesh_size = .3 + mesh_kwargs['mesh_size'] = {'mode': 'constant', + 'value': mesh_size, 'bound_value': 2 * mesh_size} + domain = {'xmin': 0, 'ymin': 0, 'xmax': 1, 'ymax': 1} + gb = meshing.simplex_grid(fracs, domain, **mesh_kwargs) + + gb.add_node_props(['param']) + for g, d in gb: + a = 0.01 / np.max(nx) + a = np.power(a, gb.dim_max() - g.dim) + param = Parameters(g) + param.set_aperture(a) + + # BoundaryCondition + left = g.face_centers[0] < 1e-6 + top = g.face_centers[2] > 1 - 1e-6 + dir_faces = np.argwhere(left) + bc_cond = bc.BoundaryCondition(g, dir_faces, ['dir'] * dir_faces.size) + bc_val = np.zeros(g.num_faces) + bc_val[dir_faces] = 3 + bc_val[top] = 2.4 + param.set_bc('flow', bc_cond) + param.set_bc_val('flow', bc_val) + + # Source and sink + src = np.zeros(g.num_cells) + src[0] = np.pi + src[-1] = -np.pi + param.set_source('flow', src) + d['param'] = param + return gb + def setup_2d_1d(nx, simplex_grid=False): frac1 = np.array([[0.2, 0.8], [0.5, 0.5]]) @@ -109,3 +169,23 @@ def setup_2d_1d(nx, simplex_grid=False): d['param'] = param return gb + + +def darcy_dirich_neumann_source_sink_cart_ref_3d(): + p_ref = np.array([0.54570555, -11.33848749, -19.44484907, -23.13293673, + -2.03828237, -12.73249228, -20.96189563, -24.14626244, + -2.81412045, -14.03104316, -22.2699576, -25.06029852, + -2.82350853, -13.6157183, -21.47553858, -24.92564315, + -2.46107297, -13.72231418, -22.34607642, -25.80769869, + -3.22878706, -15.29275276, -26.21591677, -27.42991885, + -3.99188865, -18.72292714, -29.82101211, -28.89933092, + -3.68770392, -16.13278292, -25.09083527, -28.24109233, + -4.36104216, -17.17318124, -26.53960339, -30.32186276, + -4.81751268, -18.63731792, -30.45264082, -32.08038545, + -5.489682, -22.06836116, -34.23287575, -33.94433277, + -5.17804343, -19.54672997, -29.78375042, -34.04856, + -7.71448607, -22.60562853, -32.40425572, -36.8597635, + -8.00575965, -23.53059111, -34.01202746, -38.25317203, + -8.37196805, -24.79222197, -35.8194776, -40.46051172, + -8.34414468, -24.57071193, -35.99975111, -44.22506448]) + return p_ref From 81d45c4b19e278e2286ecab70acf0e047256c7d6 Mon Sep 17 00:00:00 2001 From: IvarStefansson Date: Wed, 11 Oct 2017 09:46:43 +0200 Subject: [PATCH 18/53] Split and ndof function for MpfaMultiDim --- src/porepy/numerics/fv/mpfa.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/porepy/numerics/fv/mpfa.py b/src/porepy/numerics/fv/mpfa.py index 387ee550d0..36e5318ea4 100644 --- a/src/porepy/numerics/fv/mpfa.py +++ b/src/porepy/numerics/fv/mpfa.py @@ -294,6 +294,11 @@ def __init__(self, physics='flow'): coupling_conditions = TpfaCoupling(discr) self.solver = Coupler(discr, coupling_conditions) + def ndof(self, gb): + ndof = 0 + for g, _ in gb: + ndof += g.num_cells + def matrix_rhs(self, gb): """ Returns the solution matrix and right hand side for the global system, @@ -301,6 +306,8 @@ def matrix_rhs(self, gb): """ return self.solver.matrix_rhs(gb) + def split(self, gb, names, var): + return self.solver.split(gb, names, var) #------------------------------------------------------------------------------ From 136e5717ce888095f9922d673b3fa6bfbd5ec534 Mon Sep 17 00:00:00 2001 From: IvarStefansson Date: Wed, 11 Oct 2017 10:23:04 +0200 Subject: [PATCH 19/53] Save function for Darcy problem --- src/porepy/numerics/darcyEq.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/porepy/numerics/darcyEq.py b/src/porepy/numerics/darcyEq.py index deb7a098b0..d29ed86998 100644 --- a/src/porepy/numerics/darcyEq.py +++ b/src/porepy/numerics/darcyEq.py @@ -5,7 +5,7 @@ from porepy.grids.grid_bucket import GridBucket from porepy.params import bc, tensor from porepy.params.data import Parameters - +from porepy.viz.exporter import export_vtk class Darcy(): def __init__(self, gb, data=None, physics='flow'): @@ -14,6 +14,8 @@ def __init__(self, gb, data=None, physics='flow'): self._data = data self.lhs, self.rhs = self.reassemble() self.p = np.zeros(self.flux_disc().ndof(self.grid())) + self.parameters = {'file_name': physics} + self.parameters['folder_name'] = 'results' def solve(self): self.p = sps.linalg.spsolve(self.lhs, self.rhs) @@ -61,7 +63,12 @@ def data(self): def split(self, name): self.flux_disc().split(self.grid(), name, self.p) - + def save(self): + self.flux_disc().split(self.grid(), 'p', self.p) + folder = self.parameters['folder_name'] + f_name = self.parameters['file_name'] + export_vtk(self.grid(), f_name, ['p'], folder=folder) + class DarcyData(): def __init__(self, g, data, physics='flow'): self._g = g From 60cf3c05de997b44d20629c6757fc26fe06a80cc Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 11 Oct 2017 13:43:51 +0200 Subject: [PATCH 20/53] Removed source term from upwind discretization --- src/porepy/fracs/meshing.py | 1 + src/porepy/numerics/compressible/problems.py | 6 +++++- src/porepy/numerics/fv/transport/upwind.py | 5 ++--- src/porepy/numerics/pdeproblem.py | 4 ++++ src/porepy/numerics/pdesolver.py | 1 + 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/porepy/fracs/meshing.py b/src/porepy/fracs/meshing.py index 4a4218de55..6736b2778f 100644 --- a/src/porepy/fracs/meshing.py +++ b/src/porepy/fracs/meshing.py @@ -82,6 +82,7 @@ def simplex_grid(fracs, domain, **kwargs): gb.compute_geometry() # Split the grids. split_grid.split_fractures(gb, **kwargs) + gb.assign_node_ordering() return gb #------------------------------------------------------------------------------# diff --git a/src/porepy/numerics/compressible/problems.py b/src/porepy/numerics/compressible/problems.py index 894d669132..a53b003fa7 100644 --- a/src/porepy/numerics/compressible/problems.py +++ b/src/porepy/numerics/compressible/problems.py @@ -3,7 +3,7 @@ from porepy.grids import structured from porepy.numerics.pdeproblem import * -from porepy.numerics.fv import tpfa, mass_matrix +from porepy.numerics.fv import tpfa, mass_matrix, fvutils from porepy.numerics.mixed_dim.coupler import Coupler from porepy.params.data import Parameters from porepy.params import tensor @@ -33,6 +33,10 @@ def matrix_rhs(self, g, data): multi_dim_discr = Coupler(single_dim_discr) return multi_dim_discr + def discharge(self): + self.diffusive_disc().split(self.grid(), 'p', self._solver.p) + fvutils.compute_discharges(self.grid()) + class SlightlyCompressibleData(PdeProblemData): def __init__(self, g, data, physics='flow'): diff --git a/src/porepy/numerics/fv/transport/upwind.py b/src/porepy/numerics/fv/transport/upwind.py index 35a6d469e8..8ae1c02dd8 100644 --- a/src/porepy/numerics/fv/transport/upwind.py +++ b/src/porepy/numerics/fv/transport/upwind.py @@ -91,7 +91,6 @@ def matrix_rhs(self, g, data): discharge = param.get_discharge() bc = param.get_bc(self) bc_val = param.get_bc_val(self) - f = param.get_source(self) has_bc = not(bc is None or bc_val is None) @@ -149,8 +148,8 @@ def matrix_rhs(self, g, data): is_neu = np.where(bc.is_neu)[0] bc_val_neu[is_neu] = bc_val[is_neu] - return flow_cells, f - inflow.transpose() * bc_val_dir \ - - np.abs(g.cell_faces.transpose()) * bc_val_neu + return flow_cells, - inflow.transpose() * bc_val_dir \ + - np.abs(g.cell_faces.transpose()) * bc_val_neu #------------------------------------------------------------------------------# diff --git a/src/porepy/numerics/pdeproblem.py b/src/porepy/numerics/pdeproblem.py index bc10a108b6..baa665ff87 100644 --- a/src/porepy/numerics/pdeproblem.py +++ b/src/porepy/numerics/pdeproblem.py @@ -38,6 +38,9 @@ def update(self, t): for g, d in self.grid(): d['problem'].update(t) + def reassemble(self): + return self._solver.reassemble() + def solver(self): return pdesolver.Implicit(self) @@ -144,3 +147,4 @@ def _set_data(self): self._data['param'].set_porosity(self.porosity()) self._data['param'].set_bc(self.physics, self.bc()) self._data['param'].set_bc_val(self.physics, self.bc_val(0.0)) + self._data['param'].set_source(self.physics, self.source(0.0)) diff --git a/src/porepy/numerics/pdesolver.py b/src/porepy/numerics/pdesolver.py index 338178b0f1..5737929fd4 100644 --- a/src/porepy/numerics/pdesolver.py +++ b/src/porepy/numerics/pdesolver.py @@ -88,6 +88,7 @@ def step(self): Take one time step """ self.p = sps.linalg.spsolve(self.lhs, self.rhs) + return self.p def update(self, t): """ From d533cb688a9eb249f20b91b5c8a497066e2cb612 Mon Sep 17 00:00:00 2001 From: IvarStefansson Date: Wed, 11 Oct 2017 14:06:30 +0200 Subject: [PATCH 21/53] The FV MultiDim ndof functions did not return --- src/porepy/numerics/fv/mpfa.py | 1 + src/porepy/numerics/fv/tpfa.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/porepy/numerics/fv/mpfa.py b/src/porepy/numerics/fv/mpfa.py index 36e5318ea4..104abe868d 100644 --- a/src/porepy/numerics/fv/mpfa.py +++ b/src/porepy/numerics/fv/mpfa.py @@ -298,6 +298,7 @@ def ndof(self, gb): ndof = 0 for g, _ in gb: ndof += g.num_cells + return ndof def matrix_rhs(self, gb): """ diff --git a/src/porepy/numerics/fv/tpfa.py b/src/porepy/numerics/fv/tpfa.py index 2549a0d24c..634a450650 100644 --- a/src/porepy/numerics/fv/tpfa.py +++ b/src/porepy/numerics/fv/tpfa.py @@ -221,7 +221,8 @@ def ndof(self, gb): ndof = 0 for g, _ in gb: ndof += g.num_cells - + return ndof + def matrix_rhs(self, gb): return self.solver.matrix_rhs(gb) From 75dd20468c6890fa612c31be229877fde31e6caf Mon Sep 17 00:00:00 2001 From: IvarStefansson Date: Sun, 15 Oct 2017 11:04:34 +0200 Subject: [PATCH 22/53] Correct test for positive definiteness of 2nd order tensor --- src/porepy/params/tensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/porepy/params/tensor.py b/src/porepy/params/tensor.py index 620cf3c908..01aba0b3f6 100644 --- a/src/porepy/params/tensor.py +++ b/src/porepy/params/tensor.py @@ -84,7 +84,7 @@ def __init__(self, dim, kxx, kyy=None, kzz=None, kyz = 0 * kxx # Onsager's principle if not np.all((kxx * (kyy * kzz - kyz * kyz) - - kxy * (kyz * kzz - kxz * kyz) + + kxy * (kxy * kzz - kxz * kyz) + kxz * (kxy * kyz - kxz * kyy)) > 0): raise ValueError('Tensor is not positive definite because of ' 'components in z-direction') From e65539b9b1cfdf03a3105def1a9fb7f79499602f Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 16 Oct 2017 11:42:46 +0200 Subject: [PATCH 23/53] Added integration tests for pdeproblem --- src/porepy/numerics/darcyEq.py | 14 +- src/porepy/numerics/fv/tpfa.py | 1 + src/porepy/numerics/fv/transport/upwind.py | 2 +- src/porepy/numerics/pdeproblem.py | 6 +- src/porepy/numerics/pdesolver.py | 1 - test/integration/test_advective_diffusive.py | 240 +++++++++++++++++++ 6 files changed, 260 insertions(+), 4 deletions(-) create mode 100644 test/integration/test_advective_diffusive.py diff --git a/src/porepy/numerics/darcyEq.py b/src/porepy/numerics/darcyEq.py index deb7a098b0..8ac159a243 100644 --- a/src/porepy/numerics/darcyEq.py +++ b/src/porepy/numerics/darcyEq.py @@ -1,10 +1,11 @@ import numpy as np import scipy.sparse as sps -from porepy.numerics.fv import tpfa, source +from porepy.numerics.fv import tpfa, source, fvutils from porepy.grids.grid_bucket import GridBucket from porepy.params import bc, tensor from porepy.params.data import Parameters +from porepy.viz.exporter import export_vtk class Darcy(): @@ -19,6 +20,9 @@ def solve(self): self.p = sps.linalg.spsolve(self.lhs, self.rhs) return self.p + def step(self): + return self.solve() + def reassemble(self): """ reassemble matrices. This must be called between every time step to @@ -61,6 +65,14 @@ def data(self): def split(self, name): self.flux_disc().split(self.grid(), name, self.p) + def discharge(self): + self.split('p') + fvutils.compute_discharges(self.grid()) + + def save(self, save_every=None): + self.split('p') + export_vtk(self.grid(), 'pressure', ['p']) + class DarcyData(): def __init__(self, g, data, physics='flow'): diff --git a/src/porepy/numerics/fv/tpfa.py b/src/porepy/numerics/fv/tpfa.py index 2549a0d24c..e0068f5164 100644 --- a/src/porepy/numerics/fv/tpfa.py +++ b/src/porepy/numerics/fv/tpfa.py @@ -221,6 +221,7 @@ def ndof(self, gb): ndof = 0 for g, _ in gb: ndof += g.num_cells + return ndof def matrix_rhs(self, gb): return self.solver.matrix_rhs(gb) diff --git a/src/porepy/numerics/fv/transport/upwind.py b/src/porepy/numerics/fv/transport/upwind.py index 8ae1c02dd8..7657093221 100644 --- a/src/porepy/numerics/fv/transport/upwind.py +++ b/src/porepy/numerics/fv/transport/upwind.py @@ -132,7 +132,7 @@ def matrix_rhs(self, g, data): flow_cells.tocsr() if not has_bc: - return flow_cells, f + return flow_cells, np.zeros(g.num_cells) # Impose the boundary conditions bc_val_dir = np.zeros(g.num_faces) diff --git a/src/porepy/numerics/pdeproblem.py b/src/porepy/numerics/pdeproblem.py index baa665ff87..33507b11ff 100644 --- a/src/porepy/numerics/pdeproblem.py +++ b/src/porepy/numerics/pdeproblem.py @@ -64,7 +64,7 @@ def time_disc(self): """ Returns the flux discretization. """ - mass_matrix_discr = mass_matrix.MassMatrix() + mass_matrix_discr = mass_matrix.MassMatrix(physics=self.physics) multi_dim_discr = coupler.Coupler(mass_matrix_discr) return multi_dim_discr @@ -140,6 +140,9 @@ def diffusivity(self): kxx = np.ones(self.grid().num_cells) return tensor.SecondOrder(self.grid().dim, kxx) + def aperture(self): + return np.ones(self.grid().num_cells) + def _set_data(self): if 'param' not in self._data: self._data['param'] = Parameters(self.grid()) @@ -148,3 +151,4 @@ def _set_data(self): self._data['param'].set_bc(self.physics, self.bc()) self._data['param'].set_bc_val(self.physics, self.bc_val(0.0)) self._data['param'].set_source(self.physics, self.source(0.0)) + self._data['param'].set_aperture(self.aperture()) diff --git a/src/porepy/numerics/pdesolver.py b/src/porepy/numerics/pdesolver.py index 5737929fd4..8dd9c2f697 100644 --- a/src/porepy/numerics/pdesolver.py +++ b/src/porepy/numerics/pdesolver.py @@ -139,7 +139,6 @@ def __init__(self, problem): AbstractSolver.__init__(self, problem) def reassemble(self): - lhs_flux, rhs_flux = self._discretize(self.space_disc) lhs_time, rhs_time = self._discretize(self.time_disc) diff --git a/test/integration/test_advective_diffusive.py b/test/integration/test_advective_diffusive.py new file mode 100644 index 0000000000..6d8268129c --- /dev/null +++ b/test/integration/test_advective_diffusive.py @@ -0,0 +1,240 @@ +import numpy as np +import unittest + +from porepy.numerics.pdeproblem import * +from porepy.numerics import darcyEq +from porepy.fracs import meshing +from porepy.params.data import Parameters +from porepy.params import tensor, bc +from porepy.params.units import * +from porepy.grids.grid import FaceTag + + +class BasicsTest(unittest.TestCase): + + def __init__(self, *args, **kwargs): + f = np.array([[1, 1, 4, 4], [1, 4, 4, 1], [2, 2, 2, 2]]) + box = {'xmin': 0, 'ymin': 0, 'zmin': 0, + 'xmax': 5, 'ymax': 5, 'zmax': 5} + mesh_size = 1.0 + mesh_kwargs = {'mode': 'constant', + 'value': mesh_size, 'bound_value': mesh_size} + self.gb3d = meshing.simplex_grid([f], box, mesh_size=mesh_kwargs) + unittest.TestCase.__init__(self, *args, **kwargs) + + #------------------------------------------------------------------------------# + + def test_src_2d(self): + """ + test that the mono_dimensional darcy solver gives the same answer as + the grid bucket darcy + """ + gb = meshing.cart_grid([], [10, 10]) + + for sub_g, d in gb: + if sub_g.dim == 2: + d['problem'] = InjectionDomain(sub_g, d) + else: + d['problem'] = MatrixDomain(sub_g, d) + + problem = SourceProblem(gb) + problem.solve() + dE = change_in_energy(problem) + assert np.abs(dE - 10) < 1e-6 + + def test_src_3d(self): + """ + test that the mono_dimensional darcy solver gives the same answer as + the grid bucket darcy + """ + delete_node_data(self.gb3d) + + for sub_g, d in self.gb3d: + if sub_g.dim == 2: + d['problem'] = InjectionDomain(sub_g, d) + else: + d['problem'] = MatrixDomain(sub_g, d) + + problem = SourceProblem(self.gb3d) + problem.solve() + dE = change_in_energy(problem) + assert np.abs(dE - 10) < 1e-6 + + def test_src_advective(self): + delete_node_data(self.gb3d) + + for g, d in self.gb3d: + if g.dim == 2: + d['problem'] = InjectionDomain(g, d) + else: + d['problem'] = MatrixDomain(g, d) + solve_darcy_problem(self.gb3d) + problem = SourceAdvectiveProblem(self.gb3d) + problem.solve() + dE = change_in_energy(problem) + assert np.abs(dE - 10) < 1e-6 + + def test_src_advective_diffusive(self): + delete_node_data(self.gb3d) + for g, d in self.gb3d: + if g.dim == 2: + d['problem'] = InjectionDomain(g, d) + else: + d['problem'] = MatrixDomain(g, d) + solve_darcy_problem(self.gb3d) + problem = SourceAdvectiveDiffusiveProblem(self.gb3d) + problem.solve() + dE = change_in_energy(problem) + assert np.abs(dE - 10) < 1e-6 + + def test_constant_temp(self): + delete_node_data(self.gb3d) + for g, d in self.gb3d: + if g.dim == 2: + d['problem'] = InjectionDomain(g, d) + else: + d['problem'] = MatrixDomain(g, d) + solve_darcy_problem(self.gb3d) + problem = SourceAdvectiveDiffusiveDirBound(self.gb3d) + problem.solve() + for _, d in self.gb3d: + T_list = d['transport'] + const_temp = [np.allclose(T, 10) for T in T_list] + assert np.all(const_temp) + + +class SourceProblem(PdeProblem): + def __init__(self, g): + self._g = g + PdeProblem.__init__(self) + + def grid(self): + return self._g + + def space_disc(self): + return self.source_disc() + + def time_step(self): + return 0.5 + + +class SourceAdvectiveProblem(PdeProblem): + def __init__(self, g): + self._g = g + PdeProblem.__init__(self) + + def grid(self): + return self._g + + def space_disc(self): + return self.source_disc(), self.advective_disc() + + def time_step(self): + return 0.5 + + +class SourceAdvectiveDiffusiveProblem(PdeProblem): + def __init__(self, g): + self._g = g + PdeProblem.__init__(self) + + def grid(self): + return self._g + + def space_disc(self): + return self.source_disc(), self.advective_disc(), self.diffusive_disc() + + def time_step(self): + return 0.5 + + +class SourceAdvectiveDiffusiveDirBound(SourceAdvectiveDiffusiveProblem): + def __init__(self, g): + SourceAdvectiveDiffusiveProblem.__init__(self, g) + + def bc(self): + dir_faces = self.grid().has_face_tag(FaceTag.DOMAIN_BOUNDARY) + dir_faces = np.ravel(np.argwhere(dir_faces)) + bc_cond = bc.BoundaryCondition( + self.grid(), dir_faces, ['dir'] * dir_faces.size) + return bc_cond + + def bc_val(self, t): + dir_faces = self.grid().has_face_tag(FaceTag.DOMAIN_BOUNDARY) + dir_faces = np.ravel(np.argwhere(dir_faces)) + val = np.zeros(self.grid().num_faces) + val[dir_faces] = 10 * PASCAL + return val + + +def source(g, t): + tol = 1e-4 + value = np.zeros(g.num_cells) + cell_coord = np.atleast_2d(np.mean(g.cell_centers, axis=1)).T + cell = np.argmin( + np.sum(np.abs(g.cell_centers - cell_coord), axis=0)) + + value[cell] = 1.0 * KILOGRAM / SECOND + return value + + +class MatrixDomain(PdeProblemData): + def __init__(self, g, d, physics='transport'): + PdeProblemData.__init__(self, g, d, physics) + + def initial_condition(self): + return 10 * np.ones(self.grid().num_cells) + + +class InjectionDomain(MatrixDomain): + def __init__(self, g, d, physics='transport'): + MatrixDomain.__init__(self, g, d, physics) + + def source(self, t): + flux = source(self.grid(), t) + T_in = 10 + return flux * T_in + + def aperture(self): + return 0.1 * np.ones(self.grid().num_cells) + + +def change_in_energy(problem): + dE = 0 + problem.advective_disc().split( + problem.grid(), 'T', problem._solver.p) + for g, d in problem.grid(): + p = d['T'] + p0 = d['problem'].initial_condition() + V = g.cell_volumes * d['param'].get_aperture() + dE += np.sum((p - p0) * V) + + return dE + + +def solve_darcy_problem(gb): + for g, d in gb: + if g.dim == 2: + d['param'].set_source( + 'flow', source(g, 0.0)) + + dir_bound = np.argwhere(g.has_face_tag(FaceTag.DOMAIN_BOUNDARY)) + bc_cond = bc.BoundaryCondition( + g, dir_bound, ['dir'] * dir_bound.size) + d['param'].set_bc('flow', bc_cond) + + gb.add_edge_prop('param') + for e, d in gb.edges_props(): + g_h = gb.sorted_nodes_of_edge(e)[1] + d['param'] = Parameters(g_h) + flux = darcyEq.Darcy(gb) + p = flux.solve() + flux.split('p') + fvutils.compute_discharges(gb) + + +def delete_node_data(gb): + for _, d in gb: + d.clear() + + gb.assign_node_ordering() From b7f20121c17c898b6cad28b51161c00f8a9501fb Mon Sep 17 00:00:00 2001 From: IvarStefansson Date: Mon, 16 Oct 2017 11:52:48 +0200 Subject: [PATCH 24/53] Transmissibilities The tpfa half face transmissibility calculation now defaults to mrst style, but the Aavatsmark version is kept as an (hidden) option. Also added option to perform aperture correction in the coupling. --- src/porepy/numerics/fv/tpfa.py | 74 +++++++++++++++---- .../numerics/fv/transport/upwind_coupling.py | 2 +- test/integration/test_darcy.py | 17 +++-- test/integration/test_tpfaMultiDim.py | 6 +- 4 files changed, 75 insertions(+), 24 deletions(-) diff --git a/src/porepy/numerics/fv/tpfa.py b/src/porepy/numerics/fv/tpfa.py index 634a450650..969c790bbe 100644 --- a/src/porepy/numerics/fv/tpfa.py +++ b/src/porepy/numerics/fv/tpfa.py @@ -134,6 +134,12 @@ def discretize(self, g, data, faces=None): apertures : (np.ndarray) (optional) apertures of the cells for scaling of the face normals. + Hidden option (intended as "advanced" option that one should normally not + care about): + Half transmissibility calculation according to Ivar Aavatsmark, see + folk.uib.no/fciia/elliptisk.pdf. Activated by adding the entry + Aavatsmark_transmissibilities: True to the data dictionary. + Parameters ---------- g : grid, or a subclass, with geometry fields computed. @@ -171,14 +177,22 @@ def discretize(self, g, data, faces=None): # Transpose normal vectors to match the shape of K and multiply the two nk = perm * n - nk = nk.sum(axis=0) + nk = nk.sum(axis=1) + + if data.get('Aavatsmark_transmissibilities', False): + # These work better in some cases (possibly if the problem is grid + # quality rather than anisotropy?). To be explored (with care) or + # ignored. + dist_face_cell = np.linalg.norm(fc_cc, 2, axis=0) + t_face = np.linalg.norm(nk, 2, axis=0) + else: + nk *= fc_cc + t_face = nk.sum(axis=0) + dist_face_cell = np.power(fc_cc, 2).sum(axis=0) + - # Divide the norm of the normal permeability through the distance between - # the face centre and the cell centre - t_face = np.linalg.norm(nk, 2, axis=0) - dist_face_cell = np.linalg.norm(fc_cc, 2, axis=0) t_face = np.divide(t_face, dist_face_cell) - + # Return harmonic average t = 1 / np.bincount(fi, weights=1 / t_face) @@ -241,7 +255,7 @@ def matrix_rhs(self, g_h, g_l, data_h, data_l, data_edge): """ Computes the coupling terms for the faces between cells in g_h and g_l using the two-point flux approximation. - + Parameters: g_h and g_l: grid structures of the higher and lower dimensional subdomains, respectively. @@ -249,6 +263,17 @@ def matrix_rhs(self, g_h, g_l, data_h, data_l, data_edge): to contain both permeability values ('perm') and apertures ('apertures') for each of the cells in the grids. + Two hidden options (intended as "advanced" options that one should + normally not care about): + Half transmissibility calculation according to Ivar Aavatsmark, see + folk.uib.no/fciia/elliptisk.pdf. Activated by adding the entry + 'Aavatsmark_transmissibilities': True to the edge data. + + Aperture correction. The face centre is moved half an aperture + away from the fracture for the matrix side transmissibility + calculation. Activated by adding the entry + 'aperture_correction': True to the edge data. + Returns: cc: Discretization matrices for the coupling terms assembled in a csc.sparse matrix. @@ -271,19 +296,36 @@ def matrix_rhs(self, g_h, g_l, data_h, data_l, data_edge): cells_h, sgn_h = cells_h[faces_h], sgn_h[faces_h] # The procedure for obtaining the face transmissibilities of the higher - # grid is analougous to the one used in the discretize function of the - # Tpfa class. + # grid is in the main analougous to the one used in the discretize function + # of the Tpfa class. n = g_h.face_normals[:, faces_h] n *= sgn_h perm_h = k_h.perm[:, :, cells_h] - fc_cc_h = g_h.face_centers[::, faces_h] - g_h.cell_centers[::, cells_h] - + + # Compute the distance between face center and cell center. If specified + # (edgewise), the face centroid is shifted half an aperture in the normal + # direction of the fracture. Unless matrix cell size approaches the + # aperture, this has minimal impact. + if data_edge.get('aperture_correction', False): + apt_dim = np.divide(a_l[cells_l], a_h[cells_h]) + fc_corrected = g_h.face_centers[::,faces_h].copy()-apt_dim/2*n + fc_cc_h = fc_corrected - g_h.cell_centers[::,cells_h] + else: + fc_cc_h = g_h.face_centers[::, faces_h] - g_h.cell_centers[::, cells_h] + nk_h = perm_h * n - nk_h = nk_h.sum(axis=0) - - # Account for the apertures - t_face_h = np.linalg.norm(nk_h, 2, axis=0) * a_h[cells_h] - dist_face_cell_h = np.linalg.norm(fc_cc_h, 2, axis=0) + nk_h = nk_h.sum(axis=1) + if data_edge.get('Aavatsmark_transmissibilities', False): + dist_face_cell_h = np.linalg.norm(fc_cc_h, 2, axis=0) + t_face_h = np.linalg.norm(nk_h, 2, axis=0) + else: + nk_h *= fc_cc_h + t_face_h = nk_h.sum(axis=0) + dist_face_cell_h = np.power(fc_cc_h, 2).sum(axis=0) + + # Account for the apertures + t_face_h = t_face_h * a_h[cells_h] + # and compute the matrix side half transmissibilities t_face_h = np.divide(t_face_h, dist_face_cell_h) # For the lower dimension some simplifications can be made, due to the diff --git a/src/porepy/numerics/fv/transport/upwind_coupling.py b/src/porepy/numerics/fv/transport/upwind_coupling.py index 921c471173..2d183292f9 100644 --- a/src/porepy/numerics/fv/transport/upwind_coupling.py +++ b/src/porepy/numerics/fv/transport/upwind_coupling.py @@ -127,7 +127,7 @@ def cfl(self, g_h, g_l, data_h, data_l, data_edge): # More or less same as below, except we have cell_cells in the place # of face_cells (see grid_bucket.duplicate_without_dimension). phi_h = data_h['param'].get_porosity() - cells_h, cells_l = data_edge['face_cells'].nonzero() + cells_l, cells_h = data_edge['face_cells'].nonzero() not_zero = ~np.isclose(np.zeros(discharge.shape), discharge, atol = 0) if not np.any(not_zero): return np.Inf diff --git a/test/integration/test_darcy.py b/test/integration/test_darcy.py index 2200be446f..c6e14dd56c 100644 --- a/test/integration/test_darcy.py +++ b/test/integration/test_darcy.py @@ -6,6 +6,7 @@ from porepy.fracs import meshing from porepy.params.data import Parameters from porepy.params import tensor, bc +from porepy.viz import plot_grid class BasicsTest(unittest.TestCase): @@ -61,7 +62,11 @@ def test_darcy_uniform_flow_cart(self): #------------------------------------------------------------------------------# def test_darcy_uniform_flow_simplex(self): - # Unstructured simplex grid + """ + Unstructured simplex grid. Note that the solution depends + on the grid quality. Also sensitive to the way in which + the tpfa half transmissibilities are computed. + """ gb = setup_2d_1d(np.array([10, 10]), simplex_grid=True) problem = darcyEq.Darcy(gb) p = problem.solve() @@ -71,7 +76,7 @@ def test_darcy_uniform_flow_simplex(self): pressure = d['pressure'] p_analytic = g.cell_centers[1] p_diff = pressure - p_analytic - assert np.max(np.abs(p_diff)) < 0.03 + assert np.max(np.abs(p_diff)) < 0.033 def test_darcy_dirich_neumann_source_sink_cart(self): gb = setup_3d(np.array([4, 4, 4]), simplex_grid=False) @@ -144,7 +149,7 @@ def setup_2d_1d(nx, simplex_grid=False): mesh_kwargs = {} mesh_size = .3 mesh_kwargs['mesh_size'] = {'mode': 'constant', - 'value': mesh_size, 'bound_value': 2 * mesh_size} + 'value': mesh_size, 'bound_value': 1 * mesh_size} domain = {'xmin': 0, 'ymin': 0, 'xmax': 1, 'ymax': 1} gb = meshing.simplex_grid(fracs, domain, **mesh_kwargs) @@ -153,7 +158,7 @@ def setup_2d_1d(nx, simplex_grid=False): gb.add_node_props(['param']) for g, d in gb: kxx = np.ones(g.num_cells) - perm = tensor.SecondOrder(gb.dim_max(), kxx) + perm = tensor.SecondOrder(3, kxx) a = 0.01 / np.max(nx) a = np.power(a, gb.dim_max() - g.dim) param = Parameters(g) @@ -167,7 +172,7 @@ def setup_2d_1d(nx, simplex_grid=False): param.set_bc('flow', bound) param.set_bc_val('flow', bc_val) d['param'] = param - + return gb @@ -189,3 +194,5 @@ def darcy_dirich_neumann_source_sink_cart_ref_3d(): -8.37196805, -24.79222197, -35.8194776, -40.46051172, -8.34414468, -24.57071193, -35.99975111, -44.22506448]) return p_ref + +BasicsTest().test_darcy_uniform_flow_simplex() diff --git a/test/integration/test_tpfaMultiDim.py b/test/integration/test_tpfaMultiDim.py index 0fac0b872b..91614586dd 100644 --- a/test/integration/test_tpfaMultiDim.py +++ b/test/integration/test_tpfaMultiDim.py @@ -45,13 +45,15 @@ def setup_2d_1d(nx, simplex_grid=False): def check_pressures(gb): """ Check that the pressures are not too far from an approximate - analytical solution. + analytical solution. Note that the solution depends + on the grid quality. Also sensitive to the way in which + the tpfa half transmissibilities are computed. """ for g, d in gb: pressure = d['pressure'] pressure_analytic = g.cell_centers[1] p_diff = pressure - pressure_analytic - assert np.max(np.abs(p_diff)) < 0.03 + assert np.max(np.abs(p_diff)) < 0.033 def test_uniform_flow_cart_2d_1d_cartesian(): # Structured Cartesian grid From 24c9228b065f188976bf1ec3da0f40567f0e0e7c Mon Sep 17 00:00:00 2001 From: IvarStefansson Date: Mon, 16 Oct 2017 12:08:55 +0200 Subject: [PATCH 25/53] Remove accidentally added plot_grid import --- test/integration/test_darcy.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/integration/test_darcy.py b/test/integration/test_darcy.py index c6e14dd56c..7ffb7205cf 100644 --- a/test/integration/test_darcy.py +++ b/test/integration/test_darcy.py @@ -6,7 +6,6 @@ from porepy.fracs import meshing from porepy.params.data import Parameters from porepy.params import tensor, bc -from porepy.viz import plot_grid class BasicsTest(unittest.TestCase): From a9d5e15adc36d927e243d29f9cfc5752bb3fc87d Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 16 Oct 2017 13:42:07 +0200 Subject: [PATCH 26/53] Updated pdeproblem documentation --- src/porepy/numerics/pdeproblem.py | 98 +++++++++++++++++++++++++++++-- 1 file changed, 92 insertions(+), 6 deletions(-) diff --git a/src/porepy/numerics/pdeproblem.py b/src/porepy/numerics/pdeproblem.py index 33507b11ff..770a32f4a5 100644 --- a/src/porepy/numerics/pdeproblem.py +++ b/src/porepy/numerics/pdeproblem.py @@ -12,6 +12,55 @@ class PdeProblem(): + ''' + Base class for solving general pde problems. This class solves equations of + the type: + dT/dt + v*\nabla T - \nabla K \nabla T = q + + Init: + - physics (string) Physics key word. See Parameters class for valid physics + + Functions that should be overloaded: + grid(): returns the grid bucket for the problem + + functions: + data(): returns data dictionary. Is only used for single grids (I.e. not + GridBucket) + solve(): solve problem + step(): take one time step + update(t): update parameters to time t + reassemble(): reassemble matrices and right hand side + solver(): initiate solver (see numerics.pdesolver) + advective_disc(): discretization of the advective term + diffusive_disc(): discretization of the diffusive term + soruce_disc(): discretization of the source term, q + space_disc(): returns one or more of the above discretizations. If + advective_disc(), source_disc() are returned we solve + the problem without diffusion + time_disc(): returns the time discretization + initial_condition(): returns the initial condition for global variable + time_step(): returns time step length + end_time(): returns end time + save(save_every=1): save solution. Parameter: save_every, save only every + save_every time steps + + Example: + # We create a problem with standard data, neglecting the advective term + + class ExampleProblem(PdeProblem): + def __init__(self, gb): + self._g = gb + PdeProblem.__init__(self) + + def space_disc(self): + return self.source_disc(), self.diffusive_discr() + gb = meshing.cart_grid([], [10,10], physdims=[1,1]) + for g, d in gb: + d['problem'] = PdeProblemData(g, d) + problem = ExampleProblem(gb) + problem.solve() + ''' + def __init__(self, physics='transport'): self.physics = physics self._data = dict() @@ -101,6 +150,43 @@ def save(self, save_every=1): class PdeProblemData(): + ''' + Base class for assigning valid data to a grid. + Init: + - g (Grid) Grid that data should correspond to + - d (dictionary) data dictionary that data will be assigned to + - physics (string) Physics key word. See Parameters class for valid physics + + Functions: + update(t): Update source and bc term to time t + bc: Set boundary condition + bc_val(t): boundary condition value at time t + initial_condition(): initial condition for problem + source(): source term for problem + porosity(): porosity of each cell + diffusivity(): second order diffusivity tensor + aperture(): the aperture of each cell + data(): returns data dictionary + grid(): returns the grid g + + Example: + # We set an inflow and outflow boundary condition by overloading the + # bc_val term + class ExampleData(PdeProblemData): + def __init__(g, d): + PdeProblemData.__init__(self, g, d) + def bc_val(self): + left = self.grid().nodes[0] < 1e-6 + right = self.grid().nodes[0] > 1 - 1e-6 + val = np.zeros(g.num_faces) + val[left] = 1 + val[right] = -1 + return val + gb = meshing.cart_grid([], [10,10], physdims=[1,1]) + for g, d in gb: + d['problem'] = ExampleData(g, d) + ''' + def __init__(self, g, data, physics='transport'): self._g = g self._data = data @@ -127,12 +213,6 @@ def initial_condition(self): def source(self, t): return np.zeros(self.grid().num_cells) - def data(self): - return self._data - - def grid(self): - return self._g - def porosity(self): return np.ones(self.grid().num_cells) @@ -143,6 +223,12 @@ def diffusivity(self): def aperture(self): return np.ones(self.grid().num_cells) + def data(self): + return self._data + + def grid(self): + return self._g + def _set_data(self): if 'param' not in self._data: self._data['param'] = Parameters(self.grid()) From 443bbe4b304d6272d032c7e5e4d7d24afcbe3ac8 Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 16 Oct 2017 13:49:53 +0200 Subject: [PATCH 27/53] And some more comments --- src/porepy/numerics/pdeproblem.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/porepy/numerics/pdeproblem.py b/src/porepy/numerics/pdeproblem.py index 770a32f4a5..c450d49aa8 100644 --- a/src/porepy/numerics/pdeproblem.py +++ b/src/porepy/numerics/pdeproblem.py @@ -71,6 +71,7 @@ def __init__(self, physics='transport'): self.parameters['folder_name'] = 'results' def data(self): + 'Get data dictionary' return self._data def _set_data(self): @@ -78,35 +79,45 @@ def _set_data(self): d['deltaT'] = self.time_step() def solve(self): + 'Solve problem' return self._solver.solve() def step(self): + 'Take one time step' return self._solver.step() def update(self, t): + 'Update parameters to time t' for g, d in self.grid(): d['problem'].update(t) def reassemble(self): + 'Reassemble matrices and rhs' return self._solver.reassemble() def solver(self): + 'Initiate solver' return pdesolver.Implicit(self) def advective_disc(self): + 'Discretization of term v * \nabla T' advection_discr = upwind.Upwind(physics=self.physics) advection_coupling = upwind_coupling.UpwindCoupling(advection_discr) advection_solver = coupler.Coupler(advection_discr, advection_coupling) return advection_solver def diffusive_disc(self): + 'Discretization of term \nabla K \nabla T' diffusive_discr = tpfa.TpfaMultiDim(physics=self.physics) return diffusive_discr def source_disc(self): + 'Discretization of source term, q' return source.IntegralMultiDim(physics=self.physics) def space_disc(self): + '''Space discretization. Returns the discretization terms that should be + used in the model''' return self.advective_disc(), self.diffusive_disc(), self.source_disc() def time_disc(self): @@ -118,6 +129,7 @@ def time_disc(self): return multi_dim_discr def initial_condition(self): + 'Returns initial condition for global variable' for _, d in self.grid(): d[self.physics] = d['problem'].initial_condition() @@ -125,15 +137,19 @@ def initial_condition(self): return global_variable def grid(self): + 'Returns initial condition for global variable' raise NotImplementedError('subclass must overload function grid()') def time_step(self): + 'Returns the time step' return 1.0 def end_time(self): + 'Returns the end time' return 1.0 def save(self, save_every=1): + 'Saves the solution' variables = self.data()[self.physics][::save_every] times = np.array(self.data()['times'])[::save_every] folder = self.parameters['folder_name'] @@ -194,42 +210,55 @@ def __init__(self, g, data, physics='transport'): self._set_data() def update(self, t): + 'Update source and bc_val term to time step t' source = self.source(t) bc_val = self.bc_val(t) self.data()['param'].set_source(self.physics, source) self.data()['param'].set_bc_val(self.physics, bc_val) def bc(self): + 'Define boundary condition' dir_bound = np.array([]) return bc.BoundaryCondition(self.grid(), dir_bound, ['dir'] * dir_bound.size) def bc_val(self, t): + 'Returns boundary condition values at time t' return np.zeros(self.grid().num_faces) def initial_condition(self): + 'Returns initial condition' return np.zeros(self.grid().num_cells) def source(self, t): + 'Returns source term' return np.zeros(self.grid().num_cells) def porosity(self): + 'Returns porosity' return np.ones(self.grid().num_cells) def diffusivity(self): + 'Returns diffusivity tensor' kxx = np.ones(self.grid().num_cells) return tensor.SecondOrder(self.grid().dim, kxx) def aperture(self): + 'Returns apperture of each cell' return np.ones(self.grid().num_cells) def data(self): + 'Returns data dictionary' return self._data def grid(self): + 'Returns grid' return self._g def _set_data(self): + '''Create a Parameter object and assign data based on the returned + values from the functions (e.g., self.source(t)) + ''' if 'param' not in self._data: self._data['param'] = Parameters(self.grid()) self._data['param'].set_tensor(self.physics, self.diffusivity()) From 9b4daadcb13b33c860b083439e19cbf570d61a83 Mon Sep 17 00:00:00 2001 From: Runar Date: Mon, 16 Oct 2017 16:50:19 +0200 Subject: [PATCH 28/53] Added integration test for pdesolver --- src/porepy/numerics/pdesolver.py | 29 ++++--- test/integration/test_compressible_flow.py | 1 + test/integration/test_pdesolver.py | 99 ++++++++++++++++++++++ 3 files changed, 115 insertions(+), 14 deletions(-) create mode 100644 test/integration/test_pdesolver.py diff --git a/src/porepy/numerics/pdesolver.py b/src/porepy/numerics/pdesolver.py index 8dd9c2f697..4c36e05c65 100644 --- a/src/porepy/numerics/pdesolver.py +++ b/src/porepy/numerics/pdesolver.py @@ -9,11 +9,11 @@ from porepy.numerics.mixed_dim.solver import Solver -class AbstractSolver(): +class AbstractSolver(object): """ - Class for solving slightly compressible flow. - We solve the equation: - phi * dp/dt - nabla * K * grad(p) + v * nabla p = f. + Abstract base class for solving a general first order time pde problem. + dT/dt + G(T) = 0, + where G(T) is a space discretization """ def __init__(self, problem): @@ -64,7 +64,6 @@ def __init__(self, problem): # reassemble self.lhs = [] self.rhs = [] - self.reassemble() self.parameters = {'store_results': False, 'verbose': False} @@ -76,11 +75,11 @@ def solve(self): while t < self.T + 1e-14: if self.parameters['verbose']: print('solving time step: ', t) - self.step() self.update(t) self.reassemble() + self.step() t += self.dt - + self.update(t) return self.data def step(self): @@ -94,12 +93,12 @@ def update(self, t): """ update parameters for next time step """ - self.problem.update(t + self.dt) + self.problem.update(t) self.p0 = self.p # Store result if self.parameters['store_results'] == True: self.data[self.problem.physics].append(self.p) - self.data['times'].append(t) + self.data['times'].append(t - self.dt) def reassemble(self): """ @@ -161,7 +160,8 @@ def update(self, t): """ update parameters for next time step """ - self.flag_first = False + if t > self.dt + 1e-6: + self.flag_first = False self.p_1 = self.p0 AbstractSolver.update(self, t) @@ -192,14 +192,15 @@ def solve(self): """ Solve problem. """ - t = self.dt - while t < self.T + 1e-14: + t = 0.0 + while t < self.T - self.dt + 1e-14: if self.parameters['verbose']: print('solving time step: ', t) - self.step() - self.update(t - self.dt) + self.update(t) self.reassemble() + self.step() t += self.dt + return self.data def reassemble(self): diff --git a/test/integration/test_compressible_flow.py b/test/integration/test_compressible_flow.py index ec6ed8bbd8..a226a6a611 100644 --- a/test/integration/test_compressible_flow.py +++ b/test/integration/test_compressible_flow.py @@ -18,6 +18,7 @@ def test_3d_Fracture_problem(self): if g.dim == 3: pT = d['pressure'] p_refT = _reference_solution_multi_grid() + assert np.allclose(pT, p_refT) diff --git a/test/integration/test_pdesolver.py b/test/integration/test_pdesolver.py new file mode 100644 index 0000000000..d8330fc78d --- /dev/null +++ b/test/integration/test_pdesolver.py @@ -0,0 +1,99 @@ +import unittest +import numpy as np + +from porepy.numerics.pdeproblem import PdeProblem, PdeProblemData +from porepy.numerics.pdesolver import * +from porepy.grids import structured +from porepy.fracs import meshing +from porepy.params import tensor + + +class TestBase(unittest.TestCase): + def __init__(self, *args, **kwargs): + unittest.TestCase.__init__(self, *args, **kwargs) + + f_1 = np.array([[0, 1, 1, 0], [.5, .5, .5, .5], [0, 0, 1, 1]]) + f_2 = np.array([[.5, .5, .5, .5], [0, 1, 1, 0], [0, 0, 1, 1]]) + f_3 = np.array([[0, 1, 1, 0], [0, 0, 1, 1], [.5, .5, .5, .5]]) + f_set = [f_1, f_2, f_3] + + self.gb = meshing.cart_grid(f_set, [4, 4, 4], physdims=[1, 1, 1]) + self.gb.add_node_props(['problem']) + for g, d in self.gb: + d['problem'] = PdeProblemData(g, d) + + def test_implicit_solver(self): + problem = UnitSquareInjectionMultiDim(self.gb) + problem.update(0.0) + solver = Implicit(problem) + solver.solve() + assert np.sum(np.abs(solver.rhs) > 1e-6) == 1 + assert np.sum(np.abs(solver.rhs - 1) < 1e-6) == 1 + assert np.sum(np.abs(solver.p) > 1e-6) == 1 + assert np.sum(np.abs(solver.p - 1) < 1e-6) == 1 + + def test_BDF2_solver(self): + problem = UnitSquareInjectionTwoSteps(self.gb) + problem.update(0.0) + solver = BDF2(problem) + solver.solve() + assert np.sum(np.abs(solver.rhs) > 1e-6) == 1 + assert np.sum(np.abs(solver.rhs - 2) < 1e-6) == 1 + assert np.sum(np.abs(solver.p) > 1e-6) == 1 + assert np.sum(np.abs(solver.p - 1) < 1e-6) == 1 + assert np.sum(np.abs(solver.p_1 - 0.5) < 1e-6) == 1 + + def test_explicit_solver(self): + problem = UnitSquareInjectionMultiDim(self.gb) + problem.update(0.0) + solver = Explicit(problem) + solver.solve() + assert np.sum(np.abs(solver.rhs) > 1e-6) == 0 + assert np.sum(np.abs(solver.p) > 1e-6) == 0 + + def test_CrankNicolson_solver(self): + problem = UnitSquareInjectionMultiDim(self.gb) + problem.update(0.0) + solver = CrankNicolson(problem) + solver.solve() + + assert np.sum(np.abs(solver.rhs) > 1e-6) == 1 + assert np.sum(np.abs(solver.rhs - 0.5) < 1e-6) == 1 + assert np.sum(np.abs(solver.p) > 1e-6) == 1 + assert np.sum(np.abs(solver.p - 0.5) < 1e-6) == 1 + + +############################################################################### + + +class UnitSquareInjectionMultiDim(PdeProblem): + def __init__(self, gb): + # Initialize base class + self._g = gb + PdeProblem.__init__(self) + + def space_disc(self): + return self.source_disc() + + #--------grid function-------- + + def grid(self): + return self._g + + #--------Time stepping------------ + + def update(self, t): + for g, d in self.grid(): + source = np.zeros(g.num_cells) + if g.dim == 0 and t > self.time_step() - 1e-5: + source[0] = 1 + d['param'].set_source('transport', source) + + +############################################################################### +class UnitSquareInjectionTwoSteps(UnitSquareInjectionMultiDim): + def __init__(self, gb): + UnitSquareInjectionMultiDim.__init__(self, gb) + + def time_step(self): + return 0.5 From fe32cc09549b4229992bad9c341ed2ab2fed8d60 Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 10:01:13 +0200 Subject: [PATCH 29/53] Removed save of initial condition in pdesolver initialization --- src/porepy/numerics/pdesolver.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/porepy/numerics/pdesolver.py b/src/porepy/numerics/pdesolver.py index 4c36e05c65..d4ee16bad1 100644 --- a/src/porepy/numerics/pdesolver.py +++ b/src/porepy/numerics/pdesolver.py @@ -41,15 +41,11 @@ def __init__(self, problem): data[problem.physics] = [] data['times'] = [] - problem.update(dt) - space_disc = problem.space_disc() time_disc = problem.time_disc() p0 = problem.initial_condition() p = p0 - data[problem.physics].append(p) - data['times'].append(0.0) self.problem = problem self.g = g From d1c7c17670dd1657a271454a68a5fe6877390cce Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 10:50:01 +0200 Subject: [PATCH 30/53] Removed source term from mpfa --- src/porepy/numerics/fv/mpfa.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/porepy/numerics/fv/mpfa.py b/src/porepy/numerics/fv/mpfa.py index 104abe868d..460e8d9c2e 100644 --- a/src/porepy/numerics/fv/mpfa.py +++ b/src/porepy/numerics/fv/mpfa.py @@ -90,24 +90,20 @@ def matrix_rhs(self, g, data, discretize=True): param = data['param'] bc_val = param.get_bc_val(self) - f = param.get_source(self) - return M, self.rhs(g, bound_flux, bc_val, f) + return M, self.rhs(g, bound_flux, bc_val) #------------------------------------------------------------------------------# - def rhs(self, g, bound_flux, bc_val, f): + def rhs(self, g, bound_flux, bc_val): """ Return the righ-hand side for a discretization of a second order elliptic equation using the MPFA method. See self.matrix_rhs for a detaild description. """ - if f is None: - f = np.zeros(g.num_cells) - warnings.warn('Scalar source not assigned, assumed null') div = g.cell_faces.T - return -div * bound_flux * bc_val + f + return -div * bound_flux * bc_val #------------------------------------------------------------------------------# @@ -288,6 +284,7 @@ class MpfaMultiDim(Solver): Solver class for a multi-dimensional Mpfa discretization with a Tpfa coupling between dimensions. """ + def __init__(self, physics='flow'): self.physics = physics discr = Mpfa(self.physics) @@ -493,7 +490,7 @@ def _mpfa_local(g, k, bnd, eta=None, inverter='numba', apertures=None): k.perm = np.tensordot(R.T, np.tensordot(R, k.perm, (1, 0)), (0, 1)) k.perm = np.delete(k.perm, (2), axis=0) k.perm = np.delete(k.perm, (2), axis=1) - + # Define subcell topology, that is, the local numbering of faces, subfaces, # sub-cells and nodes. This numbering is used throughout the # discretization. From fc96250fbf6fd2679199ac4d3a3dc8ab2689a45a Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 10:50:16 +0200 Subject: [PATCH 31/53] Updated tutorial for Darcy problem --- tutorials/Darcy equation.ipynb | 85 ++++++++++++++++++--- tutorials/slightly compressible flow .ipynb | 21 ++--- 2 files changed, 86 insertions(+), 20 deletions(-) diff --git a/tutorials/Darcy equation.ipynb b/tutorials/Darcy equation.ipynb index 12b55e9dff..7d67876507 100644 --- a/tutorials/Darcy equation.ipynb +++ b/tutorials/Darcy equation.ipynb @@ -6,20 +6,31 @@ "source": [ "# Darcy's Equation\n", "\n", - "Darcy's equation relates the flux field to the pressure gradient:\n", + "In this tutorial we will assume we have an incompressible fluid. Conservation of mass then gives us\n", "\\begin{equation}\n", - "v = -\\frac{K}{\\mu}\\nabla p\n", + "\\nabla v = q,\n", "\\end{equation}\n", - "If we have a incompressible fluid, conservation of mass gives us:\n", + "where $v$ is the fluid velocity and $q$ any source term. \n", + "\n", + "A common assumption used for flow in porous media is the so called Darcy's law, which relates the flux field to the pressure gradient:\n", "\\begin{equation}\n", - "-\\nabla\\frac{K}{\\mu} \\nabla p = q\n", - "\\end{equation}\n" + "v = -\\frac{K}{\\mu}\\nabla p\n", + "\\end{equation}\n", + "\n", + "We innsert Darcy's law into the equation for conservation of mass to obtain an elliptic equation, which can be solved with respect to the pressure\n", + "\n", + "$$ - \\nabla \\cdot \\rho K \\nabla p = \\rho f $$\n", + "with boundary conditions on $\\partial \\Omega_d$ and $\\partial \\Omega_n$:\n", + "$$ p = p_b \\qquad - K \\nabla p \\cdot \\mathbf{n} = u_b$$\n", + "\n", + "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "# Import modules\n", "To solve this equation in Porepy we import the Darcy module." ] }, @@ -45,7 +56,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We frist solve the equation on a single cartesian grid" + "# Generate grid\n", + "We first solve the equation on a single cartesian grid, and will later add fractures to the grid" ] }, { @@ -64,13 +76,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "# Set parameters\n", "We create a parameter class and assign zero dirichlet boundary conditions, and a source term" ] }, { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "param = data.Parameters(g)\n", @@ -89,6 +104,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "# Solve problem\n", "We can now create a Darcy object and solve the problem" ] }, @@ -101,7 +117,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVAAAADuCAYAAABvX19oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VFW26PHfTlVCIEAYEiATU4NCUGQIBhBtRFCk2ygY\nBQRlilwRr9jcVrFFG3y2A92K0njbp+3UcjHX2+8qtAKKOCMRAtiCKHMgCWOYQuaqynp/hFSHSJI6\nlapUhazv53M+Hyp1zt7rVJGVfc7ZgxERlFJKWRcS6ACUUqqx0gSqlFJe0gSqlFJe0gSqlFJe0gSq\nlFJe0gSqlFJe0gSqlFJe0gSqlFJe0gSqlFJeslvcX4ctKaU8ZepzcA9jpMjDfQ/DRyIyuj71ecNq\nAlVKqQZRDMz2cN/5EOXPWGqiCVQpFZQMEBroIOqgCVQpFZQMwZ+g9CFSkGnZsiX79u274Htvvvkm\nw4YNa+CIlAqMyhaoJ1ugNMkEunz5cpKSkmjZsiUxMTHceOONfP31116XZ4xhz5495/3s7NmzzJ07\nl65duxIREUHnzp1JTU1l48aNtZZVUFBA9+7dvYqjrKyMBQsW0LNnTyIiIujatSvTp08nKyvLq/L8\nZcGCBUyePDnQYfhVVlYWxhicTmegQ2m0QoDmHm6B0uQS6PPPP88DDzzA7373O44ePcrBgwe59957\nWbFiheWyavrlKC0tZcSIEWzbto0PPviA/Px8fvzxRyZMmMCqVasslWVFamoqK1euZPny5Zw5c4Z/\n/vOfDBw4kHXr1tW7bOV7mlxrV3kJ78kWMCJiZWvUTp8+LREREfLuu+/WuM+3334rgwcPlsjISOnU\nqZPMnj1bSktL3e8DsnTpUunRo4d07dpVrr76agGkRYsWEhERIenp6fLqq69Kp06dpKCgoNZ4qpdV\n+bPdu3eLiEheXp7cdNNN0qpVKxk0aJDMnz9frrrqqguWtXbtWgkPD5eDBw/WWF9ubq7cdNNN0rZt\nW/nFL34hr7zyivu93//+95KamiqTJk2Sli1bymWXXSY7d+6Up556SqKjoyU+Pl4++ugj9/6//OUv\nZd68eTJo0CBp3bq1pKSkyIkTJ0RE5LPPPpO4uLjz6u7SpYusXbtWVq9eLaGhoWK32yUiIkL69u0r\nIhXfzfTp06VTp04SGxsrjz76qDidzgueR1FRkdx1113Spk0b6dWrlzz77LPn1Zebmyvjxo2TqKgo\n6dq1q7z44ovu90pKSmTOnDkSExMjMTExMmfOHCkpKTkv7meffVaio6OlU6dO8t5778mHH34oPXv2\nlLZt28of/vAHd1kul0uefvpp6d69u7Rr105uu+0292eQkJAggEREREhERIR888038sYbb8jQoUPl\ngQcekLZt28q8efOkbdu28v3337vLPHr0qISHh8uxY8dq/B4bEav55bytG8gyDzcgs771ebM1qQS6\nevVqsdls4nA4atwnMzNTNmzYIA6HQ/bv3y+9evWSxYsXu98HZOTIkXLixAkpKipy/6wy6YmIjB8/\nXqZMmVJnPHWVNX78eLntttukoKBAtm3bJrGxsTUm0IcffliuueaaWuu75pprZNasWVJcXCxbt26V\nqKgo+eSTT0SkIoE2a9ZM1qxZIw6HQ+68807p2rWrPPnkk1JWViavvPKKO8mLVCTQ2NhY2bZtmxQU\nFMi4ceNk0qRJIlJ7Aq2sq3LfSjfffLPMnDlTCgoK5OjRozJo0CB5+eWXaz3XkydPSnZ2tlx++eXu\n+lwulwwYMEAWLlwopaWlsnfvXunWrZusWbNGREQee+wxSU5OlqNHj8qxY8dkyJAhMn/+fHfcNptN\nFi5c6D7nqKgomThxouTn58v27dulWbNmsnfvXhERWbx4sSQnJ0t2draUlJTIzJkzZcKECSIisn//\nfgHO+7/2xhtviM1mkyVLlojD4ZCioiKZNWuWPPTQQ+59XnjhBfn1r39d6/fYiNQrOXUHSfdw0wTa\nAJYtWyYdO3a0dMzixYvllltucb8GZN26deftUz2BXnfddfLwww+7X2/dulUiIyOlVatWcskll3hU\nltPpFLvdLj/++KP7vUceeaTGBJqWlibjx4+v8TwOHjwoISEhkp+f7/7ZvHnz3In+97//vYwcOdL9\n3sqVKyUiIsLdCszPzxdATp06JSIVCbTqOf7www8SGhoqTqfTcgI9cuSIhIWFuf+IiIgsX75chg8f\nfsFzqZoQRUReffVVd30ZGRmSkJBw3v5PPfWUTJ06VUREunfvLh9++KH7vTVr1kiXLl1EpCKBhoeH\n/+ycMzIy3PsPGDBA3nvvPRER6dWrl/sPkIjIoUOHxG63u//4XiiBVo8tIyND4uPjxeVyiYjIwIED\n5b//+78veN6NUL2S0y9A/p+HW6ASaLD3EvCp9u3bk5eXh9PpxG6/8Knv2rWLuXPnkpmZSVFREU6n\n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\nrkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -118,6 +134,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "# Add fractures\n", "We now try to solve the same problem, but with a fracture in the domain. We create a multidimensional grid:" ] }, @@ -138,7 +155,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We now make use of the DarcyData class to assign data to the fracture and matrix. We wish to set zero dirichlet boundary conditions. However, the data class assigns Neumann conditions by default, so we overload the bc function. Also, we change the parameters in the fracture." + "We now make use of the DarcyData class to assign data to the fracture and matrix. We wish to set zero dirichlet boundary conditions. However, the data class assigns Neumann conditions by default, so we overload the bc function. We set a small aperture for the fracture, but a high permeability. Note that we let the FractureDomain innherit from the MatrixDomain. This way we assign the same parameters to the fractures as the matrix, unless we overload the parameter function(e.g., the permeabillity) " ] }, { @@ -197,9 +214,9 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\nYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -213,6 +230,52 @@ "problem.split('pressure')\n", "plot_grid(gb, 'pressure')" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Change discretization\n", + "By default, the darcy solver uses the TPFA discretization for the fluxes. If we set a anisotropic permeability tensor tpfa will not give a consistent discretization. In these cases we would like to use, e.g., the MPSA discretization. We can do this by overloading the flux_disc() function of the darcy solver" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from porepy.numerics.fv import mpfa\n", + "class DarcyMPFA(darcyEq.Darcy):\n", + " def __init__(self, gb):\n", + " darcyEq.Darcy.__init__(self, gb)\n", + " \n", + " def flux_disc(self):\n", + " return mpfa.MpfaMultiDim()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "problem = DarcyMPFA(gb)\n", + "problem.solve()\n", + "problem.split('pressure')\n", + "plot_grid(gb, 'pressure')" + ] } ], "metadata": { diff --git a/tutorials/slightly compressible flow .ipynb b/tutorials/slightly compressible flow .ipynb index 2c78b46b48..beaa7c48a1 100644 --- a/tutorials/slightly compressible flow .ipynb +++ b/tutorials/slightly compressible flow .ipynb @@ -22,7 +22,7 @@ "with boundary conditions on $\\partial \\Omega_d$ and $\\partial \\Omega_n$:\n", "$$ p = p_b \\qquad - K \\nabla p \\cdot \\mathbf{n} = u_b$$\n", "\n", - "Where $\\phi$ is the porosity, $\\rho$ is the fluid density, $f$ is a scalar source/sink term, $K$ is the permeability matrix, $p_b$ is the pressure at the boundary (Dirichlet condition), and $u_p$ is the flux at the boundary (Neumann condition).
\n", + "Where $\\phi$ is the porosity, $\\rho$ is the fluid density, $f$ is a scalar source/sink term, $K$ is the permeability matrix, $p_b$ is the pressure at the boundary (Dirichlet condition), and $u_b$ is the flux at the boundary (Neumann condition).
\n", "\n", "As a relationship between pressure and density we use $c_p\\rho = \\text{d}\\rho/\\text{d}p$. Assuming slightly compressible flow (e.g., $\\nabla\\rho\\cdot K\\nabla p \\ll 1$) we can write conservation of mass as\n", "\n", @@ -44,7 +44,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import numpy as np\n", @@ -77,19 +79,20 @@ "class FractureDomain(MatrixDomain):\n", " def __init__(self, g, data):\n", " MatrixDomain.__init__(self, g, data)\n", - " aperture = np.power(0.001, 2 - g.dim)\n", - " self.data()['param'].set_aperture(aperture)\n", " \n", " def permeability(self):\n", " kxx = 1000 * np.ones(self.grid().num_cells)\n", " return tensor.SecondOrder(2, kxx)\n", + " \n", + " def aperture(self):\n", + " return np.power(0.001, 2 - self.grid().dim)\n", "\n", "class IntersectionDomain(FractureDomain):\n", " def __init__(self, g, data):\n", " FractureDomain.__init__(self, g, data)\n", "\n", " def source(self, t):\n", - " assert self.grid().num_cells == 1, '0D grid should only have 1 cell'\n", + " assert self.grid().num_cells == 1, 'Assumes Intersection domain only has 1 cell'\n", " f = .4 * self.grid().cell_volumes # m**3/s\n", " return f * (t < .05)\n", " \n", @@ -182,9 +185,9 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VNW9+P/3Z2aSkACGSwCFQACDaPAgItdiW9BTQFpB\nHxFBqvJ4BeGR2lalRRC8lZ5WaE8BW5GKl5aIfI+SUwFREfvIj1sQrYCFRK4BEQJyMZDb5PP7YyY5\nyZBM9oYwmQyf1/PMw8zsNWuvvXf4ZGfNWusjqooxxpgLz1PfDTDGmIuFBVxjjIkQC7jGGBMhFnCN\nMSZCLOAaY0yEWMA1xpgIsYBrjLkoiMhQEdkhIrkiMqWa7Qki8mZw+wYR6RiyvYOIfCciv3RaZygL\nuMaYmCciXmAecBOQAYwRkYyQYvcB36pqOjAH+G3I9jnACpd1VmEB1xhzMegD5KrqLlUtBjKBESFl\nRgCvBp8vBW4UEQEQkVuAXcA2l3VW4XPZaJuWZoxxSs7nw+kietph2a8DgbCw0lsvqepLlV63A/ZX\nep0H9A2ppqKMqpaKyAmgpYicAZ4AfgT8srryYeqswm3ANcaYiDgNPOSw7AwoVNVeYYpUF/xDbyBr\nKjMTmKOq3wVveN3UWYUFXGNMVBLqNEDlAe0rvU4FDtZQJk9EfEAycIzAXetIEfkvoBlQJiKFwGYH\ndVZhAdcYE5U8QGLdVbcJ6CIinYADwGjgzpAyWcA9wDpgJLBaA6t7fb+8gIjMAL5T1bnBoFxbnVVY\nwDXGRCUB4uqormCf7CTgPcAL/FVVt4nI00C2qmYBC4HXRSSXwJ3t6HOpM9xnxOXyjPalmTHGqfP6\n0ixNRGsd2Br0MGyupQ83KtgdrjEmKtXlHW60sIBrjIlKdfylWVSIteMxxsQIu8M1xpgIqeNRClHB\nAq4xJirZHa4xxkRQrAWoWDseY0yMsDtcY4yJEBulYIwxEWJfmhljTIRYl4IxxkSIdSkYY0yE2B2u\nMcZEiN3hGmNMhNgdrjHGRIgQe6MULGuvuSD+9re/MXjw4PpuhmnABIjzOXs0FBZwTa0GDhzIyy+/\nXOP2PXv2ICKUlpZWvDd27FhWrVoVieZV255BgwaRlJTElVdeyQcffFBj2aKiIu69914uueQSLr30\nUmbPnl2lHhGhSZMmFY9nnnkmEodgABHw+Zw9GooG1NSGobS0FF89/wREQxvq05gxY+jfvz/Lly9n\n+fLljBw5kpycHFq1anVW2RkzZpCTk8PevXs5dOgQgwYNIiMjg6FDh1aUOX78+EV9PuuLCMR567sV\ndUxV3TwuSmlpafr888/rVVddpc2aNdNx48bpmTNnVFX1o48+0nbt2umsWbO0TZs2+tOf/lRVVf/3\nf/9Xr7nmGk1OTtb+/fvr559/XlHfrFmztG3bttqkSRO94oor9IMPPlBV1Q0bNuh1112nTZs21dat\nW+ujjz5aZR+hbXr//fdVVfWpp57S2267TceOHatNmzbVBQsWqN/v19/85jfauXNnbdGihd5+++16\n9OjRao/v2LFj+uMf/1hTUlK0WbNm+uMf/1j379+vqqq//vWv1ePxaEJCgjZu3FgnTpx41ufbt2+v\ngHo8Hm3cuLF++OGH2rZtW7322msrygA6b948TU9P1yZNmuiTTz6pubm52q9fP23atKnefvvtWlRU\nVFE+3PkLZ8eOHRofH68nT56seO/666/XF198sdrybdu21ffee6/i9ZNPPql33HGHqqru3r1bAS0p\nKXG075qu60XMbXyp8ujpRYuTnT0I5CULWx8wFNgB5AJTqtmeALwZ3L4B6Bh8vw/wWfDxOXBrpc/s\nAb4Ibqu9DS5PwkUpLS1Nu3Xrpvv27dOjR4/q9773PZ06daqqBoKh1+vVxx9/XAsLC/X06dO6efNm\nbdWqla5fv15LS0t10aJFmpaWpoWFhfrvf/9bU1NT9cCBA6oa+E+dm5urqqr9+vXT1157TVVVT506\npevWravYR20B1+fz6dtvv61+v19Pnz6tc+bM0b59++r+/fu1sLBQH3zwQR09enS1x5efn69Lly7V\ngoICPXnypI4cOVJHjBhRsf2HP/yhLliwoMbzUx6YfvWrX+kvfvELffjhh/W2227TAQMGVJQB9Oab\nb9YTJ07o1q1bNT4+Xm+44Qb96quv9Pjx43rVVVfpokWLVFXDnj9V1QkTJuiECROqbcv//M//6JVX\nXlnlvYkTJ+qkSZPOKnvs2DEF9NChQxXvvfXWW3r11VdXOa62bdtqu3btdNy4cXrkyJFq9xvuul7E\nzivgXudDtbWzR23BjkCSx6+AzkB8MHBmhJR5GPhz8Plo4M3g8yTAF3x+GXC40us9QIrTY7I+XIcm\nTZpE+/btadGiBVOnTmXx4sUV2zweDzNnziQhIYHExEQWLFjAQw89RN++ffF6vdxzzz0kJCSwfv16\nvF4vRUVFbN++nZKSEjp27Mjll18OQFxcHLm5ueTn59OkSRP69evnuH39+/fnlltuwePxkJiYyF/+\n8heee+45UlNTSUhIYMaMGSxdurRKP2u5li1bctttt5GUlETTpk2ZOnUqH3/8setz9OSTT/L++++T\nnZ3NsGHDztr+xBNPcMkll9CtWzeuvvpqBg8eTOfOnUlOTuamm25iy5YtAGHPH8D8+fOZP39+tW34\n7rvvSE5OrvJecnIyp06dqrZs+fbqyqakpLBp0yb27t3L5s2bOXXqFGPHjq12v+GuqzlH5QNxnTxq\n1wfIVdVdqloMZAIjQsqMAF4NPl8K3CgioqqnVbX8P04jziOZrgVch9q3b1/xPC0tjYMHD1a8btWq\nFY0aNap4vXfvXl544QWaNWtW8di/fz8HDx4kPT2dP/zhD8yYMYPWrVszevToiroWLlzIzp07ufLK\nK+nduzf/+Mc/zql95W249dZbK/Z/1VVX4fV6+eabb8767OnTp3nooYdIS0vjkksu4Qc/+AHHjx/H\n7/c73j/AsWPH+O677zh16hQlJSVnbW/Tpk3F88TExLNelwfAcOevNk2aNOHkyZNV3jt58iRNmzat\ntmz59urKNmnShF69euHz+WjTpg1z585l1apVZ9UPhL2u5hzVbcBtB+yv9Dov+F61ZYIB9gTQEkBE\n+orINgLdB+MrBWAFVonIZhF5sLZGWMB1aP/+/7tW+/bto23bthWvRapmg27fvj1Tp07l+PHjFY/T\np08zZswYAO68804++eQT9u7di4jwxBNPANClSxcWL17M4cOHeeKJJxg5ciQFBQU0btyY06dPV9Tv\n9/s5cuRIlX1W14YVK1ZUaUNhYSHt2oX+jMELL7zAjh072LBhAydPnuSf//wnQPmfWWfVHap8+/jx\n43nmmWcYO3YsS5YsCfuZcGo7f+F069aNXbt2Vbmj/fzzz+nWrdtZZZs3b85ll13G559/XmtZ+L/j\nLD8voWq6ruY8OA+4KSKSXekRGvyq+yEOvZA1llHVDaraDegN/EpEyu+wBqhqT+AmYKKI/CDc4VjA\ndWjevHnk5eVx7Ngxnn/+ee64444ayz7wwAP8+c9/ZsOGDagqBQUFvPvuu5w6dYodO3awevVqioqK\naNSoEYmJiXi9ga9i33jjDY4cOYLH46FZs2ZA4E/VK664gsLCQt59911KSkp49tlnKSoqCtve8ePH\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -192,9 +195,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4lNXZ+PHvPZOFhCUsAaqE1QAaLAKGTbQVbQGxgl4i\nAq6XKwo/sbUqLUURqy+2Be2rYCtSEawEylslVsAN0beWLUhVwAIRWQIiBARCcLLM3L8/ZpI3GbI8\nA5PJZLg/1/VcznLmnPPM4J0zZ55zblFVjDHG1D1XfXfAGGPOFhZwjTEmQizgGmNMhFjANcaYCLGA\na4wxEWIB1xhjIsQCrjHmrCAiw0Rkm4jkisjkKp5PFJHFgefXiUinoOc7iMgJEfml0zqDWcA1xsQ8\nEXEDs4GrgAxgrIhkBBW7E/hOVdOBZ4Fngp5/FlgRYp2VWMA1xpwN+gG5qrpTVYuBLGBkUJmRwKuB\n20uBK0VEAETkWmAnsCXEOiuJC7HTtizNGOOUnMmL00X0pMOy3/gDoafCQy+p6ksV7rcD9la4nwf0\nD6qmvIyqlorIMaCViHwPPAr8FPhlVeVrqLOSUAOuMcZExEngXodlp4FHVTNrKFJV8A8eQFZX5gng\nWVU9ERjwhlJnJRZwjTFRSQhrgMoD2le4nwbsr6ZMnojEASnAEfyj1lEi8jugOeATEQ+w0UGdlVjA\nNcZEJReQFL7qNgBdRaQzsA8YA4wLKpMN3AasAUYBq9S/u9dlZQVEZBpwQlVfCATl2uqsxAKuMSYq\nCRAfproCc7ITgXcAN/AXVd0iItOBHFXNBuYBC0UkF//Idszp1FnTayTE7RntRzNjjFNn9KNZRxGt\n9cLWgPthYy1zuFHBRrjGmKgUzhFutLCAa4yJSmH+0SwqxNr5GGNihI1wjTEmQsJ8lUJUsIBrjIlK\nNsI1xpgIirUAFWvnY4yJETbCNcaYCLGrFIwxJkLsRzNjjIkQm1IwxpgIsSkFY4yJEBvhGmNMhNgI\n1xhjIsRGuMYYEyFC7F2lYFl7TUT89a9/ZciQIfXdDdOACBAf5+xoKCzgmpBdfvnlvPzyy9U+v2vX\nLkSE0tLS8sduuukm3n333Uh0r8r+DB48mOTkZM4//3zef//9assuWbKESy65hOTkZC6//PLIddKc\nQgTi4pwdDYUF3DpWMeiczX2oT2PHjqV3794cPnyYp556ilGjRnHo0KEqy7Zs2ZIHH3yQyZOd5how\ndUUE4t3OjgZDVUM5jKp27NhRn376ab3gggu0efPmevvtt+v333+vqqoffvihtmvXTmfMmKFt27bV\nm2++WVVV33rrLb3ooos0JSVFBw4cqJ999ll5fTNmzNBzzz1XmzRpot26ddP3339fVVXXrVunF198\nsTZt2lTbtGmjP//5zyu1Edyn9957T1VVH3/8cb3++uv1pptu0qZNm+rcuXPV6/Xqf/3Xf2mXLl20\nZcuWesMNN+jhw4erPL8jR47o1Vdframpqdq8eXO9+uqrde/evaqq+utf/1pdLpcmJiZq48aNdcKE\nCaqqun79ev3hD3+o33//vaalpSmgSUlJ2rhxY/3Xv/6lr7zyig4aNKi8DUBnz56t6enp2qRJE/3N\nb36jubm5OmDAAG3atKnecMMNWlRUVF6+pvevJtu2bdOEhAQ9fvx4+WOXXnqpvvjiizW+bu7cufrj\nH/+4xjKHDh3Sq6++WlNSUrRFixZ66aWXqtfrddSvs0So8aXS0ceNFqc4O/DnJauxPmAYsA3IBSZX\n8XwisDjw/DqgU+DxfsC/A8dnwHUVXrML+CLwXO19CPFNMOoPbj169NA9e/bo4cOH9ZJLLtEpU6ao\nqj8Yut1ufeSRR9Tj8ejJkyd148aN2rp1a127dq2Wlpbq/PnztWPHjurxePQ///mPpqWl6b59+1RV\n9euvv9bc3FxVVR0wYIAuWLBAVVULCgp0zZo15W3UFnDj4uL0jTfeUK/XqydPntRnn31W+/fvr3v3\n7lWPx6P33HOPjhkzpsrzy8/P16VLl2phYaEeP35cR40apSNHjix//sc//rHOnTv3lNdNmTJFH3ro\nIb355psV0JKSkvLnqgq411xzjR47dkw3b96sCQkJesUVV+hXX32lR48e1QsuuEDnz5+vqlrj+6eq\net999+l9991X5bn8/e9/1/PPP7/SYxMmTNCJEydWWb6Mk4A7efJkvffee7W4uFiLi4v1448/Vp/P\nV+NrzjJnFHAvjkO1jbOjtmCHP8njV0AXICEQODOCytwP/ClwewywOHA7GYgL3D4HOFjh/i4g1ek5\n2ZTCaZo4cSLt27enZcuWTJkyhUWLFpU/53K5eOKJJ0hMTCQpKYm5c+dy77330r9/f9xuN7fddhuJ\niYmsXbsWt9tNUVERW7dupaSkhE6dOnHeeecBEB8fT25uLvn5+TRp0oQBAwY47t/AgQO59tprcblc\nJCUl8ec//5mnnnqKtLQ0EhMTmTZtGkuXLq1yuqFVq1Zcf/31JCcn07RpU6ZMmcJHH31Ua5uPPfYY\n7733Hl988YWjPj766KM0a9aMHj16cOGFFzJkyBC6dOlCSkoKV111FZs2bQKo8f0DmDNnDnPmzKmy\njRMnTpCSklLpsZSUFAoKChz1sSbx8fF888037N69m/j4eC677DJEzihvoqmo7EJcJ0ft+gG5qrpT\nVYuBLGBkUJmRwKuB20uBK0VEVPWkqpb9j9KIM0imawH3NLVv3778dseOHdm/f3/5/datW9OoUaPy\n+7t372bmzJk0b968/Ni7dy/79+8nPT2d5557jmnTptGmTRvGjBlTXte8efPYvn07559/Pn379uUf\n//jHafWvrA/XXXddefsXXHABbrebb7/99pTXnjx5knvvvZeOHTvSrFkzfvSjH3H06FG8Xm+NbR45\ncoQTJ05w4sQJR31s27Zt+e2kpKRT7pfVU9P7V5smTZpw/PjxSo8dP36cpk2bOupjTR5++GHS09PL\n/1DMmDHjjOs0FYQ34LYD9la4nxd4rMoygQB7DGgFICL9RWQL/umD8RUCsALvishGEbmntk5YwD1N\ne/f+32e3Z88ezj333PL7waOc9u3bM2XKFI4ePVp+nDx5krFjxwIwbtw4/vnPf7J7925EhEcffRSA\nrl27smjRIg4ePMijjz7KqFGjKCwspHHjxpw8ebK8fq/Xe8qPQFX1YcWKFZX64PF4aNcu+N8czJw5\nk23btrFu3TqOHz/Oxx9/DFD2tavaUdw999zDk08+ybXXXlvzmxei2t6/mvTo0YOdO3dWGtF+9tln\n9OjR44z71bRpU2bOnMnOnTt56623mDVrFh988MEZ12sqcB5wU0Ukp8IRHPyq+kcbPFKttoyqrlPV\nHkBf4FciUjaiGqSqfYCrgAki8qOaTscC7mmaPXs2eXl5HDlyhKeffpobb7yx2rJ33303f/rTn1i3\nbh2qSmFhIW+//TYFBQVs27aNVatWUVRURKNGjUhKSsLt9v/s+tprr3Ho0CFcLhfNmzcHwO12061b\nNzweD2+//TYlJSX89re/paioqMb+jh8/nilTprB7924ADh06xLJly6osW1BQQFJSEs2bN+fIkSM8\n8cQTlZ5v27YtO3furPTYggULiIuLY9y4cTz++OOA/9rbcKjp/atNt27d6NWrF0888QQej4c33niD\n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\n", + "image/png": "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\n3qlz585VVdVt27Zp586dz6gtVdUPP/xQN2/erD179qz0+bfeektHjhypfr9f161bp/379z/jthqR\n2m3P2ArVG5wdONiLNhoOG+GGKCkpwev1lm3UArBx40bS09Pp1q0bCQkJjB8//rR9CFasWMFttwVW\nBY4dO5b333+/Qh1OOWmrNF0MwMCBA8nLywu7HadtAcyYMYOHH364wg5o9dXevHnzmDJlCq1atQKg\nXbt29daWiJTtJHb8+PEKGxCF6wc/+AGtW7eu8vkVK1Zw6623IiIMHDiQY8eO8fXXX59xe2eFGBzh\nWsAN4fP5+OqrryoE3QMHDlTY7jAtLY0DBw5UeF35MnFxcaSkpHDkyJGw23fSVnnz58/nqquuCrsd\np21t2bKF/fv38+Mf//iM2gi3vZ07d7Jz504GDx7MwIEDWb16db21lZmZyWuvvUZaWhqjRo3iueee\nO6O26qo/JkTpl2ZOjkbCAm4Iv99PXl4eXq+XL7/8svxu8BWEblHopIwT4dTz2muvkZOTw0MPPRR2\nO07a8vv9/OQnP2H27NlnVH+47UEg/9quXbtYu3YtS5Ys4Y477uDYsWP10taSJUu4/fbbycvLY+XK\nldxyyy34/f6w26qr/pgQNsKNfUeOHKGwsJCSkhL2799Pbm4u5557boX9b/Py8k778zMtLa2sjNfr\n5fjx49X+iVmV8vVU1RbAe++9x5NPPkl2djaJiWf2K76mtgoKCti6dStDhw6lS5curF+/ntGjR5/x\nF2dOzi0tLY0xY8YQHx9P165d6dGjB7t27aqXtubPn8+4ceOAQIYMj8dDfn5+2G3VVX9MCAu4sa9t\n27YkJiaSk5ODz+cjLy+PXr16kZqayldffUVxcTFZWVmMHj26wutGjx7Nq68GsnMsX76cK6644oxG\nMP369WPXrl3VtrVlyxbuvvtusrOzz3iO00lbKSkp5Ofns2fPHvbs2cPAgQPJzs6mb99qN2Wq1bld\ne+21fPDBBwDk5+ezc+dOunXrVi9tderUqWzD8C+++AKPx1O2bWNdGz16NIsWLUJVWb9+PSkpKZxz\nzjn10lZMibGA24i6GjlxcXH07t2bTz75hPj4eOLi4rjhhhsYPnw4fr+fSZMm0bNnT8477zyeffZZ\nRo8ezeTJk7nllltIT0+ndevWZGVlnXHbzz//PCNGjMDn85W1NXPmTP72t7/x6aef8tBDD3Hy5Elu\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, From 29537d63053520416c3128460461adc854fa9483 Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 11:17:03 +0200 Subject: [PATCH 32/53] Changed init of PdeProblem to take a Grid/GridBucket --- src/porepy/numerics/compressible/problems.py | 58 +++++++++++++++++++- src/porepy/numerics/pdeproblem.py | 10 ++-- test/integration/test_advective_diffusive.py | 18 +----- test/integration/test_pdesolver.py | 8 +-- 4 files changed, 66 insertions(+), 28 deletions(-) diff --git a/src/porepy/numerics/compressible/problems.py b/src/porepy/numerics/compressible/problems.py index a53b003fa7..337966eeb7 100644 --- a/src/porepy/numerics/compressible/problems.py +++ b/src/porepy/numerics/compressible/problems.py @@ -12,8 +12,31 @@ class SlightlyCompressible(PdeProblem): - def __init__(self, physics='flow'): - PdeProblem.__init__(self, physics) + ''' + Inherits from PdeProblem + This class solves equations of the type: + phi *c_p dp/dt - \nabla K \nabla p = q + + Init: + - gb (Grid/GridBucket) Grid or grid bucket for the problem + - physics (string) Physics key word. See Parameters class for valid physics + + functions: + discharge(): computes the discharges and saves it in the grid bucket as 'p' + Also see functions from PdeProblem + + Example: + # We create a problem with standard data + + gb = meshing.cart_grid([], [10,10], physdims=[1,1]) + for g, d in gb: + d['problem'] = SlightlyCompressibleData(g, d) + problem = SlightlyCompressible(gb) + problem.solve() + ''' + + def __init__(self, gb, physics='flow'): + PdeProblem.__init__(self, gb, physics) def space_disc(self): return self.diffusive_disc(), self.source_disc() @@ -39,6 +62,37 @@ def discharge(self): class SlightlyCompressibleData(PdeProblemData): + ''' + Inherits from PdeProblemData + Base class for assigning valid data for a slighly compressible problem. + Init: + - g (Grid) Grid that data should correspond to + - d (dictionary) data dictionary that data will be assigned to + - physics (string) Physics key word. See Parameters class for valid physics + + Functions: + compressibility: (float) the compressibility of the fluid + permeability: (tensor.SecondOrder) The permeability tensor for the rock. + Setting the permeability is equivalent to setting + the PdeProblemData.diffusivity() function. + Example: + # We set an inflow and outflow boundary condition by overloading the + # bc_val term + class ExampleData(SlightlyCompressibleData): + def __init__(g, d): + SlightlyCompressibleData.__init__(self, g, d) + def bc_val(self): + left = self.grid().nodes[0] < 1e-6 + right = self.grid().nodes[0] > 1 - 1e-6 + val = np.zeros(g.num_faces) + val[left] = 1 + val[right] = -1 + return val + gb = meshing.cart_grid([], [10,10], physdims=[1,1]) + for g, d in gb: + d['problem'] = ExampleData(g, d) + ''' + def __init__(self, g, data, physics='flow'): PdeProblemData.__init__(self, g, data, physics) diff --git a/src/porepy/numerics/pdeproblem.py b/src/porepy/numerics/pdeproblem.py index c450d49aa8..fab8ebf244 100644 --- a/src/porepy/numerics/pdeproblem.py +++ b/src/porepy/numerics/pdeproblem.py @@ -18,10 +18,10 @@ class PdeProblem(): dT/dt + v*\nabla T - \nabla K \nabla T = q Init: + - gb (Grid/GridBucket) Grid or grid bucket for the problem - physics (string) Physics key word. See Parameters class for valid physics Functions that should be overloaded: - grid(): returns the grid bucket for the problem functions: data(): returns data dictionary. Is only used for single grids (I.e. not @@ -39,6 +39,7 @@ class PdeProblem(): the problem without diffusion time_disc(): returns the time discretization initial_condition(): returns the initial condition for global variable + grid(): returns the grid bucket for the problem time_step(): returns time step length end_time(): returns end time save(save_every=1): save solution. Parameter: save_every, save only every @@ -61,7 +62,8 @@ def space_disc(self): problem.solve() ''' - def __init__(self, physics='transport'): + def __init__(self, gb, physics='transport'): + self._gb = gb self.physics = physics self._data = dict() self._set_data() @@ -137,8 +139,8 @@ def initial_condition(self): return global_variable def grid(self): - 'Returns initial condition for global variable' - raise NotImplementedError('subclass must overload function grid()') + 'Returns grid/grid_bucket' + return self._gb def time_step(self): 'Returns the time step' diff --git a/test/integration/test_advective_diffusive.py b/test/integration/test_advective_diffusive.py index 6d8268129c..a991e164ac 100644 --- a/test/integration/test_advective_diffusive.py +++ b/test/integration/test_advective_diffusive.py @@ -105,11 +105,7 @@ def test_constant_temp(self): class SourceProblem(PdeProblem): def __init__(self, g): - self._g = g - PdeProblem.__init__(self) - - def grid(self): - return self._g + PdeProblem.__init__(self, g) def space_disc(self): return self.source_disc() @@ -120,11 +116,7 @@ def time_step(self): class SourceAdvectiveProblem(PdeProblem): def __init__(self, g): - self._g = g - PdeProblem.__init__(self) - - def grid(self): - return self._g + PdeProblem.__init__(self, g) def space_disc(self): return self.source_disc(), self.advective_disc() @@ -135,11 +127,7 @@ def time_step(self): class SourceAdvectiveDiffusiveProblem(PdeProblem): def __init__(self, g): - self._g = g - PdeProblem.__init__(self) - - def grid(self): - return self._g + PdeProblem.__init__(self, g) def space_disc(self): return self.source_disc(), self.advective_disc(), self.diffusive_disc() diff --git a/test/integration/test_pdesolver.py b/test/integration/test_pdesolver.py index d8330fc78d..afacfb805b 100644 --- a/test/integration/test_pdesolver.py +++ b/test/integration/test_pdesolver.py @@ -69,17 +69,11 @@ def test_CrankNicolson_solver(self): class UnitSquareInjectionMultiDim(PdeProblem): def __init__(self, gb): # Initialize base class - self._g = gb - PdeProblem.__init__(self) + PdeProblem.__init__(self, gb) def space_disc(self): return self.source_disc() - #--------grid function-------- - - def grid(self): - return self._g - #--------Time stepping------------ def update(self, t): From cee009535a7f04c3e097248d6ad7349697cb69a3 Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 11:55:29 +0200 Subject: [PATCH 33/53] Updated gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 879d5880fb..35052244b3 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ *.vrml *~ *.swo +*.coverage +.cache/* +bin/* From f0684b28d73bc03c584ea2572fbf2ade91ca22e1 Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 13:01:20 +0200 Subject: [PATCH 34/53] Removed export from example --- examples/example8/test_advection_diffusion_coupling.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/example8/test_advection_diffusion_coupling.py b/examples/example8/test_advection_diffusion_coupling.py index 374a5c3563..0267310c07 100644 --- a/examples/example8/test_advection_diffusion_coupling.py +++ b/examples/example8/test_advection_diffusion_coupling.py @@ -125,6 +125,7 @@ def add_data_advection_diffusion(gb, domain, tol): #------------------------------------------------------------------------------# +do_save = False folder = os.path.dirname(os.path.realpath(__file__)) + "/" export_folder = folder + 'advection_diffusion_coupling' tol = 1e-3 @@ -166,7 +167,8 @@ def add_data_advection_diffusion(gb, domain, tol): d["p"] = darcy_discr.extract_p(g, d["up"]) d["P0u"] = darcy_discr.project_u(g, discharge, d) -exporter.export_vtk(gb, 'darcy', ["p", "P0u"], folder=export_folder) +if do_save: + exporter.export_vtk(gb, 'darcy', ["p", "P0u"], folder=export_folder) ################################################################# @@ -192,6 +194,6 @@ def add_data_advection_diffusion(gb, domain, tol): theta = sps.linalg.spsolve(D + U, rhs_u + rhs_d) diffusion_coupler.split(gb, "temperature", theta) -exporter.export_vtk(gb, 'advection_diffusion', [ - "temperature"], folder=export_folder) - +if do_save: + exporter.export_vtk(gb, 'advection_diffusion', [ + "temperature"], folder=export_folder) From 17db4747e4ce883e53fde7332757efc863f5ef4b Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 13:01:38 +0200 Subject: [PATCH 35/53] Renamed pdeproblem -> parabolic and pdesolver -> pde_solver --- src/porepy/numerics/compressible/problems.py | 20 +++++++++---------- .../numerics/{pdeproblem.py => parabolic.py} | 20 +++++++++---------- .../numerics/{pdesolver.py => pde_solver.py} | 0 test/integration/test_advective_diffusive.py | 18 ++++++++--------- test/integration/test_pdesolver.py | 10 +++++----- 5 files changed, 34 insertions(+), 34 deletions(-) rename src/porepy/numerics/{pdeproblem.py => parabolic.py} (95%) rename src/porepy/numerics/{pdesolver.py => pde_solver.py} (100%) diff --git a/src/porepy/numerics/compressible/problems.py b/src/porepy/numerics/compressible/problems.py index 337966eeb7..57176611f7 100644 --- a/src/porepy/numerics/compressible/problems.py +++ b/src/porepy/numerics/compressible/problems.py @@ -2,7 +2,7 @@ import scipy.sparse as sps from porepy.grids import structured -from porepy.numerics.pdeproblem import * +from porepy.numerics.parabolic import * from porepy.numerics.fv import tpfa, mass_matrix, fvutils from porepy.numerics.mixed_dim.coupler import Coupler from porepy.params.data import Parameters @@ -11,9 +11,9 @@ from porepy.viz.exporter import export_vtk, export_pvd -class SlightlyCompressible(PdeProblem): +class SlightlyCompressible(ParabolicProblem): ''' - Inherits from PdeProblem + Inherits from ParabolicProblem This class solves equations of the type: phi *c_p dp/dt - \nabla K \nabla p = q @@ -23,7 +23,7 @@ class SlightlyCompressible(PdeProblem): functions: discharge(): computes the discharges and saves it in the grid bucket as 'p' - Also see functions from PdeProblem + Also see functions from ParabolicProblem Example: # We create a problem with standard data @@ -36,7 +36,7 @@ class SlightlyCompressible(PdeProblem): ''' def __init__(self, gb, physics='flow'): - PdeProblem.__init__(self, gb, physics) + ParabolicProblem.__init__(self, gb, physics) def space_disc(self): return self.diffusive_disc(), self.source_disc() @@ -61,9 +61,9 @@ def discharge(self): fvutils.compute_discharges(self.grid()) -class SlightlyCompressibleData(PdeProblemData): +class SlightlyCompressibleData(ParabolicData): ''' - Inherits from PdeProblemData + Inherits from ParabolicData Base class for assigning valid data for a slighly compressible problem. Init: - g (Grid) Grid that data should correspond to @@ -74,7 +74,7 @@ class SlightlyCompressibleData(PdeProblemData): compressibility: (float) the compressibility of the fluid permeability: (tensor.SecondOrder) The permeability tensor for the rock. Setting the permeability is equivalent to setting - the PdeProblemData.diffusivity() function. + the ParabolicData.diffusivity() function. Example: # We set an inflow and outflow boundary condition by overloading the # bc_val term @@ -94,10 +94,10 @@ def bc_val(self): ''' def __init__(self, g, data, physics='flow'): - PdeProblemData.__init__(self, g, data, physics) + ParabolicData.__init__(self, g, data, physics) def _set_data(self): - PdeProblemData._set_data(self) + ParabolicData._set_data(self) self.data()['compressibility'] = self.compressibility() def compressibility(self): diff --git a/src/porepy/numerics/pdeproblem.py b/src/porepy/numerics/parabolic.py similarity index 95% rename from src/porepy/numerics/pdeproblem.py rename to src/porepy/numerics/parabolic.py index fab8ebf244..fa9def8f53 100644 --- a/src/porepy/numerics/pdeproblem.py +++ b/src/porepy/numerics/parabolic.py @@ -6,12 +6,12 @@ from porepy.fracs import meshing from porepy.numerics.fv import fvutils, tpfa, mass_matrix, source from porepy.numerics.fv.transport import upwind, upwind_coupling -from porepy.numerics import pdesolver +from porepy.numerics import pde_solver from porepy.numerics.mixed_dim import coupler from porepy.viz.exporter import export_vtk, export_pvd -class PdeProblem(): +class ParabolicProblem(): ''' Base class for solving general pde problems. This class solves equations of the type: @@ -30,7 +30,7 @@ class PdeProblem(): step(): take one time step update(t): update parameters to time t reassemble(): reassemble matrices and right hand side - solver(): initiate solver (see numerics.pdesolver) + solver(): initiate solver (see numerics.pde_solver) advective_disc(): discretization of the advective term diffusive_disc(): discretization of the diffusive term soruce_disc(): discretization of the source term, q @@ -48,16 +48,16 @@ class PdeProblem(): Example: # We create a problem with standard data, neglecting the advective term - class ExampleProblem(PdeProblem): + class ExampleProblem(ParabolicProblem): def __init__(self, gb): self._g = gb - PdeProblem.__init__(self) + ParabolicProblem.__init__(self) def space_disc(self): return self.source_disc(), self.diffusive_discr() gb = meshing.cart_grid([], [10,10], physdims=[1,1]) for g, d in gb: - d['problem'] = PdeProblemData(g, d) + d['problem'] = ParabolicData(g, d) problem = ExampleProblem(gb) problem.solve() ''' @@ -99,7 +99,7 @@ def reassemble(self): def solver(self): 'Initiate solver' - return pdesolver.Implicit(self) + return pde_solver.Implicit(self) def advective_disc(self): 'Discretization of term v * \nabla T' @@ -167,7 +167,7 @@ def save(self, save_every=1): self.grid(), self.parameters['file_name'], times, folder=folder) -class PdeProblemData(): +class ParabolicData(): ''' Base class for assigning valid data to a grid. Init: @@ -190,9 +190,9 @@ class PdeProblemData(): Example: # We set an inflow and outflow boundary condition by overloading the # bc_val term - class ExampleData(PdeProblemData): + class ExampleData(ParabolicData): def __init__(g, d): - PdeProblemData.__init__(self, g, d) + ParabolicData.__init__(self, g, d) def bc_val(self): left = self.grid().nodes[0] < 1e-6 right = self.grid().nodes[0] > 1 - 1e-6 diff --git a/src/porepy/numerics/pdesolver.py b/src/porepy/numerics/pde_solver.py similarity index 100% rename from src/porepy/numerics/pdesolver.py rename to src/porepy/numerics/pde_solver.py diff --git a/test/integration/test_advective_diffusive.py b/test/integration/test_advective_diffusive.py index a991e164ac..4bf1aba110 100644 --- a/test/integration/test_advective_diffusive.py +++ b/test/integration/test_advective_diffusive.py @@ -1,7 +1,7 @@ import numpy as np import unittest -from porepy.numerics.pdeproblem import * +from porepy.numerics.parabolic import * from porepy.numerics import darcyEq from porepy.fracs import meshing from porepy.params.data import Parameters @@ -103,9 +103,9 @@ def test_constant_temp(self): assert np.all(const_temp) -class SourceProblem(PdeProblem): +class SourceProblem(ParabolicProblem): def __init__(self, g): - PdeProblem.__init__(self, g) + ParabolicProblem.__init__(self, g) def space_disc(self): return self.source_disc() @@ -114,9 +114,9 @@ def time_step(self): return 0.5 -class SourceAdvectiveProblem(PdeProblem): +class SourceAdvectiveProblem(ParabolicProblem): def __init__(self, g): - PdeProblem.__init__(self, g) + ParabolicProblem.__init__(self, g) def space_disc(self): return self.source_disc(), self.advective_disc() @@ -125,9 +125,9 @@ def time_step(self): return 0.5 -class SourceAdvectiveDiffusiveProblem(PdeProblem): +class SourceAdvectiveDiffusiveProblem(ParabolicProblem): def __init__(self, g): - PdeProblem.__init__(self, g) + ParabolicProblem.__init__(self, g) def space_disc(self): return self.source_disc(), self.advective_disc(), self.diffusive_disc() @@ -166,9 +166,9 @@ def source(g, t): return value -class MatrixDomain(PdeProblemData): +class MatrixDomain(ParabolicData): def __init__(self, g, d, physics='transport'): - PdeProblemData.__init__(self, g, d, physics) + ParabolicData.__init__(self, g, d, physics) def initial_condition(self): return 10 * np.ones(self.grid().num_cells) diff --git a/test/integration/test_pdesolver.py b/test/integration/test_pdesolver.py index afacfb805b..b9ca187e69 100644 --- a/test/integration/test_pdesolver.py +++ b/test/integration/test_pdesolver.py @@ -1,8 +1,8 @@ import unittest import numpy as np -from porepy.numerics.pdeproblem import PdeProblem, PdeProblemData -from porepy.numerics.pdesolver import * +from porepy.numerics.parabolic import ParabolicProblem, ParabolicData +from porepy.numerics.pde_solver import * from porepy.grids import structured from porepy.fracs import meshing from porepy.params import tensor @@ -20,7 +20,7 @@ def __init__(self, *args, **kwargs): self.gb = meshing.cart_grid(f_set, [4, 4, 4], physdims=[1, 1, 1]) self.gb.add_node_props(['problem']) for g, d in self.gb: - d['problem'] = PdeProblemData(g, d) + d['problem'] = ParabolicData(g, d) def test_implicit_solver(self): problem = UnitSquareInjectionMultiDim(self.gb) @@ -66,10 +66,10 @@ def test_CrankNicolson_solver(self): ############################################################################### -class UnitSquareInjectionMultiDim(PdeProblem): +class UnitSquareInjectionMultiDim(ParabolicProblem): def __init__(self, gb): # Initialize base class - PdeProblem.__init__(self, gb) + ParabolicProblem.__init__(self, gb) def space_disc(self): return self.source_disc() From ca840a662e58966a90120ba22498cc842cc9465e Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 13:06:40 +0200 Subject: [PATCH 36/53] Removed unused variables from pde_solver --- src/porepy/numerics/pde_solver.py | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/porepy/numerics/pde_solver.py b/src/porepy/numerics/pde_solver.py index d4ee16bad1..ecc9a916db 100644 --- a/src/porepy/numerics/pde_solver.py +++ b/src/porepy/numerics/pde_solver.py @@ -22,38 +22,30 @@ def __init__(self, problem): ---------- problem: a problem class. Must have the attributes problem.grid() - problem.porosity(): phi + problem.data() problem.space_disc() - problem.diffusivity(): K + problem.time_disc() problem.time_step() problem.end_time() - problem.bc() - problem.bc_val(t) problem.initial_pressure() - problem.source(t): f """ # Get data g = problem.grid() - dt = problem.time_step() - T = problem.end_time() data = problem.data() data[problem.physics] = [] data['times'] = [] - space_disc = problem.space_disc() - time_disc = problem.time_disc() - p0 = problem.initial_condition() p = p0 self.problem = problem self.g = g self.data = data - self.dt = dt - self.T = T - self.space_disc = space_disc - self.time_disc = time_disc + self.dt = problem.time_step() + self.T = problem.end_time() + self.space_disc = problem.space_disc() + self.time_disc = problem.time_disc() self.p0 = p0 self.p = p # First initial empty lhs and rhs, then initialize them through From ddfa97a8a65151cf6b75b60d4e7bbc0502de2801 Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 13:12:30 +0200 Subject: [PATCH 37/53] renamed darcyEq.py -> darcy.py --- src/porepy/numerics/{darcyEq.py => darcy.py} | 0 test/integration/test_advective_diffusive.py | 4 ++-- test/integration/test_darcy.py | 15 ++++++++------- test/unit/test_darcyEq.py | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) rename src/porepy/numerics/{darcyEq.py => darcy.py} (100%) diff --git a/src/porepy/numerics/darcyEq.py b/src/porepy/numerics/darcy.py similarity index 100% rename from src/porepy/numerics/darcyEq.py rename to src/porepy/numerics/darcy.py diff --git a/test/integration/test_advective_diffusive.py b/test/integration/test_advective_diffusive.py index 4bf1aba110..3a9e297274 100644 --- a/test/integration/test_advective_diffusive.py +++ b/test/integration/test_advective_diffusive.py @@ -2,7 +2,7 @@ import unittest from porepy.numerics.parabolic import * -from porepy.numerics import darcyEq +from porepy.numerics import darcy from porepy.fracs import meshing from porepy.params.data import Parameters from porepy.params import tensor, bc @@ -215,7 +215,7 @@ def solve_darcy_problem(gb): for e, d in gb.edges_props(): g_h = gb.sorted_nodes_of_edge(e)[1] d['param'] = Parameters(g_h) - flux = darcyEq.Darcy(gb) + flux = darcy.Darcy(gb) p = flux.solve() flux.split('p') fvutils.compute_discharges(gb) diff --git a/test/integration/test_darcy.py b/test/integration/test_darcy.py index 7ffb7205cf..7c127b0fdd 100644 --- a/test/integration/test_darcy.py +++ b/test/integration/test_darcy.py @@ -1,7 +1,7 @@ import numpy as np import unittest -from porepy.numerics import darcyEq +from porepy.numerics import darcy from porepy.grids.structured import CartGrid from porepy.fracs import meshing from porepy.params.data import Parameters @@ -38,8 +38,8 @@ def bc_val(g): d['param'] = Parameters(sub_g) d['param'].set_bc_val('flow', bc_val(g)) - problem_mono = darcyEq.Darcy(g, {'param': param_g}) - problem_mult = darcyEq.Darcy(gb) + problem_mono = darcy.Darcy(g, {'param': param_g}) + problem_mult = darcy.Darcy(gb) p_mono = problem_mono.solve() p_mult = problem_mult.solve() @@ -49,7 +49,7 @@ def bc_val(g): def test_darcy_uniform_flow_cart(self): gb = setup_2d_1d([10, 10]) - problem = darcyEq.Darcy(gb) + problem = darcy.Darcy(gb) p = problem.solve() problem.split('pressure') @@ -67,7 +67,7 @@ def test_darcy_uniform_flow_simplex(self): the tpfa half transmissibilities are computed. """ gb = setup_2d_1d(np.array([10, 10]), simplex_grid=True) - problem = darcyEq.Darcy(gb) + problem = darcy.Darcy(gb) p = problem.solve() problem.split('pressure') @@ -79,7 +79,7 @@ def test_darcy_uniform_flow_simplex(self): def test_darcy_dirich_neumann_source_sink_cart(self): gb = setup_3d(np.array([4, 4, 4]), simplex_grid=False) - problem = darcyEq.Darcy(gb) + problem = darcy.Darcy(gb) p = problem.solve() problem.split('pressure') @@ -171,7 +171,7 @@ def setup_2d_1d(nx, simplex_grid=False): param.set_bc('flow', bound) param.set_bc_val('flow', bc_val) d['param'] = param - + return gb @@ -194,4 +194,5 @@ def darcy_dirich_neumann_source_sink_cart_ref_3d(): -8.34414468, -24.57071193, -35.99975111, -44.22506448]) return p_ref + BasicsTest().test_darcy_uniform_flow_simplex() diff --git a/test/unit/test_darcyEq.py b/test/unit/test_darcyEq.py index 2870115cb8..7610e9c68c 100644 --- a/test/unit/test_darcyEq.py +++ b/test/unit/test_darcyEq.py @@ -1,7 +1,7 @@ import numpy as np import unittest -from porepy.numerics.darcyEq import DarcyData +from porepy.numerics.darcy import DarcyData from porepy.grids import simplex from porepy.params import bc, tensor from porepy.params.data import Parameters From 17b168b247cf33aedf95dd321f06560bfe79644b Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 13:21:21 +0200 Subject: [PATCH 38/53] Updated tutorials to work with new names --- tutorials/Darcy equation.ipynb | 30 ++++++++++----------- tutorials/slightly compressible flow .ipynb | 21 +++++++-------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/tutorials/Darcy equation.ipynb b/tutorials/Darcy equation.ipynb index 7d67876507..f5e26f8bee 100644 --- a/tutorials/Darcy equation.ipynb +++ b/tutorials/Darcy equation.ipynb @@ -44,7 +44,7 @@ "source": [ "import numpy as np\n", "\n", - "from porepy.numerics import darcyEq\n", + "from porepy.numerics import darcy\n", "from porepy.fracs import meshing\n", "from porepy.params import bc, tensor, data\n", "from porepy.grids.grid import FaceTag\n", @@ -117,7 +117,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVAAAADuCAYAAABvX19oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VFW26PHfTlVCIEAYEiATU4NCUGQIBhBtRFCk2ygY\nBQRlilwRr9jcVrFFG3y2A92K0njbp+3UcjHX2+8qtAKKOCMRAtiCKHMgCWOYQuaqynp/hFSHSJI6\nlapUhazv53M+Hyp1zt7rVJGVfc7ZgxERlFJKWRcS6ACUUqqx0gSqlFJe0gSqlFJe0gSqlFJe0gSq\nlFJe0gSqlFJe0gSqlFJe0gSqlFJe0gSqlFJeslvcX4ctKaU8ZepzcA9jpMjDfQ/DRyIyuj71ecNq\nAlVKqQZRDMz2cN/5EOXPWGqiCVQpFZQMEBroIOqgCVQpFZQMwZ+g9CFSkGnZsiX79u274Htvvvkm\nw4YNa+CIlAqMyhaoJ1ugNMkEunz5cpKSkmjZsiUxMTHceOONfP31116XZ4xhz5495/3s7NmzzJ07\nl65duxIREUHnzp1JTU1l48aNtZZVUFBA9+7dvYqjrKyMBQsW0LNnTyIiIujatSvTp08nKyvLq/L8\nZcGCBUyePDnQYfhVVlYWxhicTmegQ2m0QoDmHm6B0uQS6PPPP88DDzzA7373O44ePcrBgwe59957\nWbFiheWyavrlKC0tZcSIEWzbto0PPviA/Px8fvzxRyZMmMCqVasslWVFamoqK1euZPny5Zw5c4Z/\n/vOfDBw4kHXr1tW7bOV7mlxrV3kJ78kWMCJiZWvUTp8+LREREfLuu+/WuM+3334rgwcPlsjISOnU\nqZPMnj1bSktL3e8DsnTpUunRo4d07dpVrr76agGkRYsWEhERIenp6fLqq69Kp06dpKCgoNZ4qpdV\n+bPdu3eLiEheXp7cdNNN0qpVKxk0aJDMnz9frrrqqguWtXbtWgkPD5eDBw/WWF9ubq7cdNNN0rZt\nW/nFL34hr7zyivu93//+95KamiqTJk2Sli1bymWXXSY7d+6Up556SqKjoyU+Pl4++ugj9/6//OUv\nZd68eTJo0CBp3bq1pKSkyIkTJ0RE5LPPPpO4uLjz6u7SpYusXbtWVq9eLaGhoWK32yUiIkL69u0r\nIhXfzfTp06VTp04SGxsrjz76qDidzgueR1FRkdx1113Spk0b6dWrlzz77LPn1Zebmyvjxo2TqKgo\n6dq1q7z44ovu90pKSmTOnDkSExMjMTExMmfOHCkpKTkv7meffVaio6OlU6dO8t5778mHH34oPXv2\nlLZt28of/vAHd1kul0uefvpp6d69u7Rr105uu+0292eQkJAggEREREhERIR888038sYbb8jQoUPl\ngQcekLZt28q8efOkbdu28v3337vLPHr0qISHh8uxY8dq/B4bEav55bytG8gyDzcgs771ebM1qQS6\nevVqsdls4nA4atwnMzNTNmzYIA6HQ/bv3y+9evWSxYsXu98HZOTIkXLixAkpKipy/6wy6YmIjB8/\nXqZMmVJnPHWVNX78eLntttukoKBAtm3bJrGxsTUm0IcffliuueaaWuu75pprZNasWVJcXCxbt26V\nqKgo+eSTT0SkIoE2a9ZM1qxZIw6HQ+68807p2rWrPPnkk1JWViavvPKKO8mLVCTQ2NhY2bZtmxQU\nFMi4ceNk0qRJIlJ7Aq2sq3LfSjfffLPMnDlTCgoK5OjRozJo0CB5+eWXaz3XkydPSnZ2tlx++eXu\n+lwulwwYMEAWLlwopaWlsnfvXunWrZusWbNGREQee+wxSU5OlqNHj8qxY8dkyJAhMn/+fHfcNptN\nFi5c6D7nqKgomThxouTn58v27dulWbNmsnfvXhERWbx4sSQnJ0t2draUlJTIzJkzZcKECSIisn//\nfgHO+7/2xhtviM1mkyVLlojD4ZCioiKZNWuWPPTQQ+59XnjhBfn1r39d6/fYiNQrOXUHSfdw0wTa\nAJYtWyYdO3a0dMzixYvllltucb8GZN26deftUz2BXnfddfLwww+7X2/dulUiIyOlVatWcskll3hU\nltPpFLvdLj/++KP7vUceeaTGBJqWlibjx4+v8TwOHjwoISEhkp+f7/7ZvHnz3In+97//vYwcOdL9\n3sqVKyUiIsLdCszPzxdATp06JSIVCbTqOf7www8SGhoqTqfTcgI9cuSIhIWFuf+IiIgsX75chg8f\nfsFzqZoQRUReffVVd30ZGRmSkJBw3v5PPfWUTJ06VUREunfvLh9++KH7vTVr1kiXLl1EpCKBhoeH\n/+ycMzIy3PsPGDBA3nvvPRER6dWrl/sPkIjIoUOHxG63u//4XiiBVo8tIyND4uPjxeVyiYjIwIED\n5b//+78veN6NUL2S0y9A/p+HW6ASaLD3EvCp9u3bk5eXh9PpxG6/8Knv2rWLuXPnkpmZSVFREU6n\n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\nrkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -125,7 +125,7 @@ } ], "source": [ - "problem = darcyEq.Darcy(g, d)\n", + "problem = darcy.Darcy(g, d)\n", "p = problem.solve()\n", "plot_grid(g, p)" ] @@ -161,14 +161,12 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ - "class MatrixDomain(darcyEq.DarcyData):\n", + "class MatrixDomain(darcy.DarcyData):\n", " def __init__(self, g, d):\n", - " darcyEq.DarcyData.__init__(self, g, d)\n", + " darcy.DarcyData.__init__(self, g, d)\n", "\n", " def bc(self):\n", " dir_bound = np.ravel(np.argwhere((self.grid().has_face_tag(FaceTag.DOMAIN_BOUNDARY))))\n", @@ -216,7 +214,7 @@ "data": { "image/png": "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\nYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -225,7 +223,7 @@ ], "source": [ "assign_darcy_data(gb)\n", - "problem = darcyEq.Darcy(gb)\n", + "problem = darcy.Darcy(gb)\n", "problem.solve()\n", "problem.split('pressure')\n", "plot_grid(gb, 'pressure')" @@ -236,19 +234,21 @@ "metadata": {}, "source": [ "# Change discretization\n", - "By default, the darcy solver uses the TPFA discretization for the fluxes. If we set a anisotropic permeability tensor tpfa will not give a consistent discretization. In these cases we would like to use, e.g., the MPSA discretization. We can do this by overloading the flux_disc() function of the darcy solver" + "By default, the darcy solver uses the TPFA discretization for the fluxes. If we set a anisotropic permeability tensor tpfa will not give a consistent discretization. In these cases we would like to use, e.g., the MPSA discretization. We can do this by overloading the flux_disc() function of the darcy solver. Note that we have already assigned data to the grid, so we do not have to do this again" ] }, { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "from porepy.numerics.fv import mpfa\n", - "class DarcyMPFA(darcyEq.Darcy):\n", + "class DarcyMPFA(darcy.Darcy):\n", " def __init__(self, gb):\n", - " darcyEq.Darcy.__init__(self, gb)\n", + " darcy.Darcy.__init__(self, gb)\n", " \n", " def flux_disc(self):\n", " return mpfa.MpfaMultiDim()" @@ -263,7 +263,7 @@ "data": { "image/png": "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\nYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/tutorials/slightly compressible flow .ipynb b/tutorials/slightly compressible flow .ipynb index beaa7c48a1..2ba3860bb7 100644 --- a/tutorials/slightly compressible flow .ipynb +++ b/tutorials/slightly compressible flow .ipynb @@ -69,7 +69,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "class MatrixDomain(SlightlyCompressibleData):\n", @@ -137,14 +139,9 @@ " g.assign_node_ordering()\n", " g.compute_geometry()\n", " set_sub_problems(g)\n", - " self.g = g\n", " # Initialize base class\n", - " SlightlyCompressible.__init__(self)\n", - "\n", - " #--------grid function--------\n", + " SlightlyCompressible.__init__(self, g)\n", "\n", - " def grid(self):\n", - " return self.g\n", "\n", " #--------Time stepping------------\n", " def time_step(self):\n", @@ -185,9 +182,9 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VNW9+P/3Z2aSkACGSwCFQACDaPAgItdiW9BTQFpB\nHxFBqvJ4BeGR2lalRRC8lZ5WaE8BW5GKl5aIfI+SUwFREfvIj1sQrYCFRK4BEQJyMZDb5PP7YyY5\nyZBM9oYwmQyf1/PMw8zsNWuvvXf4ZGfNWusjqooxxpgLz1PfDTDGmIuFBVxjjIkQC7jGGBMhFnCN\nMSZCLOAaY0yEWMA1xpgIsYBrjLkoiMhQEdkhIrkiMqWa7Qki8mZw+wYR6RiyvYOIfCciv3RaZygL\nuMaYmCciXmAecBOQAYwRkYyQYvcB36pqOjAH+G3I9jnACpd1VmEB1xhzMegD5KrqLlUtBjKBESFl\nRgCvBp8vBW4UEQEQkVuAXcA2l3VW4XPZaJuWZoxxSs7nw+kietph2a8DgbCw0lsvqepLlV63A/ZX\nep0H9A2ppqKMqpaKyAmgpYicAZ4AfgT8srryYeqswm3ANcaYiDgNPOSw7AwoVNVeYYpUF/xDbyBr\nKjMTmKOq3wVveN3UWYUFXGNMVBLqNEDlAe0rvU4FDtZQJk9EfEAycIzAXetIEfkvoBlQJiKFwGYH\ndVZhAdcYE5U8QGLdVbcJ6CIinYADwGjgzpAyWcA9wDpgJLBaA6t7fb+8gIjMAL5T1bnBoFxbnVVY\nwDXGRCUB4uqormCf7CTgPcAL/FVVt4nI00C2qmYBC4HXRSSXwJ3t6HOpM9xnxOXyjPalmTHGqfP6\n0ixNRGsd2Br0MGyupQ83KtgdrjEmKtXlHW60sIBrjIlKdfylWVSIteMxxsQIu8M1xpgIqeNRClHB\nAq4xJirZHa4xxkRQrAWoWDseY0yMsDtcY4yJEBulYIwxEWJfmhljTIRYl4IxxkSIdSkYY0yE2B2u\nMcZEiN3hGmNMhNgdrjHGRIgQe6MULGuvuSD+9re/MXjw4PpuhmnABIjzOXs0FBZwTa0GDhzIyy+/\nXOP2PXv2ICKUlpZWvDd27FhWrVoVieZV255BgwaRlJTElVdeyQcffFBj2aKiIu69914uueQSLr30\nUmbPnl2lHhGhSZMmFY9nnnkmEodgABHw+Zw9GooG1NSGobS0FF89/wREQxvq05gxY+jfvz/Lly9n\n+fLljBw5kpycHFq1anVW2RkzZpCTk8PevXs5dOgQgwYNIiMjg6FDh1aUOX78+EV9PuuLCMR567sV\ndUxV3TwuSmlpafr888/rVVddpc2aNdNx48bpmTNnVFX1o48+0nbt2umsWbO0TZs2+tOf/lRVVf/3\nf/9Xr7nmGk1OTtb+/fvr559/XlHfrFmztG3bttqkSRO94oor9IMPPlBV1Q0bNuh1112nTZs21dat\nW+ujjz5aZR+hbXr//fdVVfWpp57S2267TceOHatNmzbVBQsWqN/v19/85jfauXNnbdGihd5+++16\n9OjRao/v2LFj+uMf/1hTUlK0WbNm+uMf/1j379+vqqq//vWv1ePxaEJCgjZu3FgnTpx41ufbt2+v\ngHo8Hm3cuLF++OGH2rZtW7322msrygA6b948TU9P1yZNmuiTTz6pubm52q9fP23atKnefvvtWlRU\nVFE+3PkLZ8eOHRofH68nT56seO/666/XF198sdrybdu21ffee6/i9ZNPPql33HGHqqru3r1bAS0p\nKXG075qu60XMbXyp8ujpRYuTnT0I5CULWx8wFNgB5AJTqtmeALwZ3L4B6Bh8vw/wWfDxOXBrpc/s\nAb4Ibqu9DS5PwkUpLS1Nu3Xrpvv27dOjR4/q9773PZ06daqqBoKh1+vVxx9/XAsLC/X06dO6efNm\nbdWqla5fv15LS0t10aJFmpaWpoWFhfrvf/9bU1NT9cCBA6oa+E+dm5urqqr9+vXT1157TVVVT506\npevWravYR20B1+fz6dtvv61+v19Pnz6tc+bM0b59++r+/fu1sLBQH3zwQR09enS1x5efn69Lly7V\ngoICPXnypI4cOVJHjBhRsf2HP/yhLliwoMbzUx6YfvWrX+kvfvELffjhh/W2227TAQMGVJQB9Oab\nb9YTJ07o1q1bNT4+Xm+44Qb96quv9Pjx43rVVVfpokWLVFXDnj9V1QkTJuiECROqbcv//M//6JVX\nXlnlvYkTJ+qkSZPOKnvs2DEF9NChQxXvvfXWW3r11VdXOa62bdtqu3btdNy4cXrkyJFq9xvuul7E\nzivgXudDtbWzR23BjkCSx6+AzkB8MHBmhJR5GPhz8Plo4M3g8yTAF3x+GXC40us9QIrTY7I+XIcm\nTZpE+/btadGiBVOnTmXx4sUV2zweDzNnziQhIYHExEQWLFjAQw89RN++ffF6vdxzzz0kJCSwfv16\nvF4vRUVFbN++nZKSEjp27Mjll18OQFxcHLm5ueTn59OkSRP69evnuH39+/fnlltuwePxkJiYyF/+\n8heee+45UlNTSUhIYMaMGSxdurRKP2u5li1bctttt5GUlETTpk2ZOnUqH3/8setz9OSTT/L++++T\nnZ3NsGHDztr+xBNPcMkll9CtWzeuvvpqBg8eTOfOnUlOTuamm25iy5YtAGHPH8D8+fOZP39+tW34\n7rvvSE5OrvJecnIyp06dqrZs+fbqyqakpLBp0yb27t3L5s2bOXXqFGPHjq12v+GuqzlH5QNxnTxq\n1wfIVdVdqloMZAIjQsqMAF4NPl8K3CgioqqnVbX8P04jziOZrgVch9q3b1/xPC0tjYMHD1a8btWq\nFY0aNap4vXfvXl544QWaNWtW8di/fz8HDx4kPT2dP/zhD8yYMYPWrVszevToiroWLlzIzp07ufLK\nK+nduzf/+Mc/zql95W249dZbK/Z/1VVX4fV6+eabb8767OnTp3nooYdIS0vjkksu4Qc/+AHHjx/H\n7/c73j/AsWPH+O677zh16hQlJSVnbW/Tpk3F88TExLNelwfAcOevNk2aNOHkyZNV3jt58iRNmzat\ntmz59urKNmnShF69euHz+WjTpg1z585l1apVZ9UPhL2u5hzVbcBtB+yv9Dov+F61ZYIB9gTQEkBE\n+orINgLdB+MrBWAFVonIZhF5sLZGWMB1aP/+/7tW+/bto23bthWvRapmg27fvj1Tp07l+PHjFY/T\np08zZswYAO68804++eQT9u7di4jwxBNPANClSxcWL17M4cOHeeKJJxg5ciQFBQU0btyY06dPV9Tv\n9/s5cuRIlX1W14YVK1ZUaUNhYSHt2oX+jMELL7zAjh072LBhAydPnuSf//wnQPmfWWfVHap8+/jx\n43nmmWcYO3YsS5YsCfuZcGo7f+F069aNXbt2Vbmj/fzzz+nWrdtZZZs3b85ll13G559/XmtZ+L/j\nLD8voWq6ruY8OA+4KSKSXekRGvyq+yEOvZA1llHVDaraDegN/EpEyu+wBqhqT+AmYKKI/CDc4VjA\ndWjevHnk5eVx7Ngxnn/+ee64444ayz7wwAP8+c9/ZsOGDagqBQUFvPvuu5w6dYodO3awevVqioqK\naNSoEYmJiXi9ga9i33jjDY4cOYLH46FZs2ZA4E/VK664gsLCQt59911KSkp49tlnKSoqCtve8ePH\n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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4FPXZ+P/3nd0cCMQEw0EhyMFQNFAVjYClrSAKSGuw\nFRHlsfKIVlQufWy/Kha1YMXSbyv2V0GtSItWJSrfKnkqoKJor1qMhIItYCGRYzgoIQIhkNPu/ftj\nN2myJJuZEDab5X5d11zu7twz85mZ9Wby2c9BVBVjjDGnXlxbF8AYY04XlnCNMSZCLOEaY0yEWMI1\nxpgIsYRrjDERYgnXGGMixBKuMea0ICJjRWSLiBSJyIxG1ieKyGvB9fki0idk/TkiclRE/o/TfYay\nhGuMiXki4gEWAFcDWcCNIpIVEjYV+FpVM4GngF+FrH8KWOFynw1YwjXGnA6GAEWquk1Vq4BcYHxI\nzHjgxeDrpcAoEREAEbkW2AZscrnPBrwuC23d0owxTsnJbJwposccxu4LJMKKeh89r6rP13vfE9hd\n730xMDRkN3UxqlojIoeBdBE5DjwIXAX8n8biw+yzAbcJ1xhjIuIYcIfD2FlQoarZYUIaS/6hD5BN\nxcwGnlLVo8EHXjf7bMASrjEmKgmtmqCKgV713mcAe5uIKRYRL5AKlBJ4ap0gIv8XSAP8IlIBrHOw\nzwYs4RpjolIc0KH1drcW6C8ifYE9wCTgppCYPOAWYA0wAfhAA6N7fac2QERmAUdVdX4wKTe3zwYs\n4RpjopIA8a20r2Cd7HTgHcAD/EFVN4nIY0CBquYBi4A/iUgRgSfbSS3ZZ7htxOXwjPajmTHGqZP6\n0ay3iDbbsDXoLljXTB1uVLAnXGNMVGrNJ9xoYQnXGBOVWvlHs6gQa+djjIkR9oRrjDER0sqtFKKC\nJVxjTFSyJ1xjjImgWEtQsXY+xpgYYU+4xhgTIdZKwRhjIsR+NDPGmAixKgVjjIkQq1IwxpgIsSdc\nY4yJEHvCNcaYCLEnXGOMiRAh9lop2Ky95pR45ZVXGD16dFsXw7RjAsR7nS3thSVc06wRI0bwwgsv\nNLl+x44diAg1NTV1n02ePJl33303EsVrtDwjR44kOTmZ8847j1WrVjUZW1lZya233soZZ5zBWWed\nxbx58xrsR0To1KlT3fKLX/wiEqdgABHwep0t7UU7Kmr7UFNTg7eNvwHRUIa2dOONN3LZZZexfPly\nli9fzoQJEygsLKRr164nxM6aNYvCwkJ27tzJ/v37GTlyJFlZWYwdO7Yu5tChQ6f19WwrIhDvaetS\ntDJVdbOclnr37q1PPPGEnn/++ZqWlqZTpkzR48ePq6rq6tWrtWfPnjp37lzt3r27/td//Zeqqv7v\n//6vXnjhhZqamqqXXXaZfvbZZ3X7mzt3rvbo0UM7deqk3/jGN3TVqlWqqpqfn6+XXHKJpqSkaLdu\n3fS+++5rcIzQMr333nuqqvrzn/9cr7vuOp08ebKmpKTowoUL1efz6S9/+Uvt16+fnnnmmXr99dfr\nwYMHGz2/0tJS/d73vqddunTRtLQ0/d73vqe7d+9WVdWf/exnGhcXp4mJidqxY0e9++67T9i+V69e\nCmhcXJx27NhR33//fe3Ro4cOHjy4LgbQBQsWaGZmpnbq1EkffvhhLSoq0mHDhmlKSopef/31WllZ\nWRcf7vqFs2XLFk1ISNAjR47Uffbtb39bn3322Ubje/Tooe+8807d+4cfflhvuOEGVVXdvn27Alpd\nXe3o2E3d19OY2/zSYLnYg1alOlsIzEsWdn/AWGALUATMaGR9IvBacH0+0Cf4+RBgQ3D5DPhBvW12\nAP8Krmu+DC4vwmmpd+/eOnDgQN21a5cePHhQv/Wtb+nMmTNVNZAMPR6PPvDAA1pRUaHHjh3TdevW\nadeuXfWTTz7RmpoaXbx4sfbu3VsrKir03//+t2ZkZOiePXtUNfA/dVFRkaqqDhs2TF966SVVVS0r\nK9M1a9bUHaO5hOv1evXNN99Un8+nx44d06eeekqHDh2qu3fv1oqKCv3xj3+skyZNavT8SkpKdOnS\npVpeXq5HjhzRCRMm6Pjx4+vWX3755bpw4cImr09tYnrooYf0pz/9qd5111163XXX6fDhw+tiAL3m\nmmv08OHDunHjRk1ISNArrrhCv/jiCz106JCef/75unjxYlXVsNdPVfXOO+/UO++8s9Gy/PnPf9bz\nzjuvwWd33323Tp8+/YTY0tJSBXT//v11n73xxhs6aNCgBufVo0cP7dmzp06ZMkUPHDjQ6HHD3dfT\n2Ekl3Eu8qHZztjSX7AhM8vgF0A9ICCbOrJCYu4Dngq8nAa8FXycD3uDrs4Gv6r3fAXRxek5Wh+vQ\n9OnT6dWrF2eeeSYzZ85kyZIldevi4uKYPXs2iYmJdOjQgYULF3LHHXcwdOhQPB4Pt9xyC4mJiXzy\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -195,9 +192,9 @@ }, { "data": { - "image/png": "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\n3qlz585VVdVt27Zp586dz6gtVdUPP/xQN2/erD179qz0+bfeektHjhypfr9f161bp/379z/jthqR\n2m3P2ArVG5wdONiLNhoOG+GGKCkpwev1lm3UArBx40bS09Pp1q0bCQkJjB8//rR9CFasWMFttwVW\nBY4dO5b333+/Qh1OOWmrNF0MwMCBA8nLywu7HadtAcyYMYOHH364wg5o9dXevHnzmDJlCq1atQKg\nXbt29daWiJTtJHb8+PEKGxCF6wc/+AGtW7eu8vkVK1Zw6623IiIMHDiQY8eO8fXXX59xe2eFGBzh\nWsAN4fP5+OqrryoE3QMHDlTY7jAtLY0DBw5UeF35MnFxcaSkpHDkyJGw23fSVnnz58/nqquuCrsd\np21t2bKF/fv38+Mf//iM2gi3vZ07d7Jz504GDx7MwIEDWb16db21lZmZyWuvvUZaWhqjRo3iueee\nO6O26qo/JkTpl2ZOjkbCAm4Iv99PXl4eXq+XL7/8svxu8BWEblHopIwT4dTz2muvkZOTw0MPPRR2\nO07a8vv9/OQnP2H27NlnVH+47UEg/9quXbtYu3YtS5Ys4Y477uDYsWP10taSJUu4/fbbycvLY+XK\nldxyyy34/f6w26qr/pgQNsKNfUeOHKGwsJCSkhL2799Pbm4u5557boX9b/Py8k778zMtLa2sjNfr\n5fjx49X+iVmV8vVU1RbAe++9x5NPPkl2djaJiWf2K76mtgoKCti6dStDhw6lS5curF+/ntGjR5/x\nF2dOzi0tLY0xY8YQHx9P165d6dGjB7t27aqXtubPn8+4ceOAQIYMj8dDfn5+2G3VVX9MCAu4sa9t\n27YkJiaSk5ODz+cjLy+PXr16kZqayldffUVxcTFZWVmMHj26wutGjx7Nq68GsnMsX76cK6644oxG\nMP369WPXrl3VtrVlyxbuvvtusrOzz3iO00lbKSkp5Ofns2fPHvbs2cPAgQPJzs6mb99qN2Wq1bld\ne+21fPDBBwDk5+ezc+dOunXrVi9tderUqWzD8C+++AKPx1O2bWNdGz16NIsWLUJVWb9+PSkpKZxz\nzjn10lZMibGA24i6GjlxcXH07t2bTz75hPj4eOLi4rjhhhsYPnw4fr+fSZMm0bNnT8477zyeffZZ\nRo8ezeTJk7nllltIT0+ndevWZGVlnXHbzz//PCNGjMDn85W1NXPmTP72t7/x6aef8tBDD3Hy5Elu\n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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAADxCAYAAACH4w+oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VNX5+PHPk8lGABMIgoUgi0E0cTcC1lpBFBFrsBUR\npahfcZe6tFWwiMUFxbagvwpoQVpQC1HzVUlVUFHUby1GQ6EVsEJkDYsSwhrINvP8/phJOhmy3AmT\nyWR43q/XfTH33ufee2ZueHJy5p5zRFUxxhjT/GJaugDGGHOssIRrjDFhYgnXGGPCxBKuMcaEiSVc\nY4wJE0u4xhgTJpZwjTHHBBEZKiLfiEihiEyoY3+CiLzq258vIj0D9p8oIgdF5NdOzxnIEq4xJuqJ\niAuYCVwOZADXiUhGQNhYYI+qpgPPAE8H7H8GWBzkOWuxhGuMORb0AwpVdYOqVgA5wPCAmOHAfN/r\nXGCwiAiAiFwFbADWBHnOWmKDLLR1SzPGOCVHc3C6iB5yGLvDmwjL/DbNVtXZfuvdgK1+60VA/4DT\n1MSoapWI7ANSReQwMB64FPh1XfENnLOWYBOuMcaExSHgdoexk6FMVbMaCKkr+QdWIOuLeRR4RlUP\n+iq8wZyzFku4xpiIJIQ0QRUB3f3W04Dt9cQUiUgskAyU4K21jhCR3wEpgEdEyoAVDs5ZiyVcY0xE\nigHahO50XwJ9RKQXsA0YBVwfEJMH3AgsB0YAH6l3dK8LqwNEZDJwUFVn+JJyY+esxRKuMSYiCRAX\nonP52mTHAe8BLuDPqrpGRB4DClQ1D5gLvCwihXhrtqOacs6GjpEgh2e0L82MMU4d1ZdmPUS00Qdb\nfe6CFY204UYEq+EaYyJSKGu4kcISrjEmIoX4S7OIEG3vxxgTJayGa4wxYRLipxQigiVcY0xEshqu\nMcaEUbQlqGh7P8aYKGE1XGOMCRN7SsEYY8LEvjQzxpgwsSYFY4wJE2tSMMaYMLEarjHGhInVcI0x\nJkyshmuMMWEiRN9TCjZrrwmLv/71rwwZMqSli2FaEQHiYp0trYUlXBO0gQMH8uKLL9a7f9OmTYgI\nVVVVNdtGjx7N+++/H47i1VmeQYMGkZSUxCmnnMLSpUvrjX3ttdf44Q9/SFJSEgMHDgxfIc0RRCA2\n1tnSWljCbWb+SedYLkNLuu666zj77LPZvXs3U6ZMYcSIEezatavO2I4dO3LfffcxYYLTuQZMcxGB\nOJezpdVQ1WAWo6o9evTQJ598Uk899VRNSUnRm266SQ8fPqyqqsuWLdNu3brp1KlTtUuXLvrzn/9c\nVVX/9re/6ZlnnqnJycl6/vnn67/+9a+a802dOlW7du2q7dq105NPPlmXLl2qqqr5+fl67rnnavv2\n7bVz5856//3317pGYJk++OADVVX97W9/q1dffbWOHj1a27dvr3PmzFG3261PPfWU9u7dWzt27KjX\nXHON7t69u873V1JSoldccYV26tRJU1JS9IorrtCtW7eqqupvfvMbjYmJ0YSEBG3btq3efffdqqr6\nxRdf6Omnn66HDx/WtLQ0BbRNmzbatm1b/cc//qF/+ctf9IILLqi5BqAzZ87U9PR0bdeunT788MNa\nWFioAwYM0Pbt2+s111yj5eXlNfENfX4N+eabbzQ+Pl73799fs+1HP/qRPv/88w0eN2fOHL3ooosa\njNm1a5deccUVmpycrB06dNAf/ehH6na7HZXrGBFsfqm1nONCK5KdLXjnJWvwfMBQ4BugEJhQx/4E\n4FXf/nygp297P2CVb/kX8FO/YzYBX/n2NV6GID8Eo97klpmZqVu2bNHdu3frD3/4Q504caKqepOh\ny+XSBx98UMvKyvTQoUO6YsUKPf744/Xzzz/XqqoqnTdvnvbo0UPLysr0P//5j6alpem2bdtUVXXj\nxo1aWFioqqoDBgzQl156SVVVDxw4oMuXL6+5RmMJNzY2Vt988011u9166NAhfeaZZ7R///66detW\nLSsr09tuu01HjRpV5/srLi7W3NxcLS0t1f379+uIESN0+PDhNfsvuuginTNnzhHHTZw4UX/1q1/p\nz3/+cwW0srKyZl9dCffKK6/Uffv26erVqzU+Pl4vvvhi/fbbb3Xv3r166qmn6rx581RVG/z8VFXv\nvPNOvfPOO+t8L2+88YaecsoptbbdfffdOm7cuDrjqzlJuBMmTNDbb79dKyoqtKKiQj/99FP1eDwN\nHnOMOaqEe24sqp2dLY0lO7yTPH4L9AbifYkzIyDmLuAF3+tRwKu+10lArO/1D4Dv/dY3AZ2cvidr\nUmiicePG0b17dzp27MjEiRNZuHBhzb6YmBgeffRREhISaNOmDXPmzOH222+nf//+uFwubrzxRhIS\nEvj8889xuVyUl5ezdu1aKisr6dmzJyeddBIAcXFxFBYWUlxcTLt27RgwYIDj8p1//vlcddVVxMTE\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -212,7 +209,7 @@ "for t in time_steps:\n", " p = pressures[t]\n", " problem.time_disc().split(problem.grid(), 'pressure', p)\n", - " plot_grid.plot_grid(problem.g, 'pressure', color_map = [0, 0.04], if_plot=False)\n", + " plot_grid.plot_grid(problem.grid(), 'pressure', color_map = [0, 0.04], if_plot=False)\n", " plt.title('pressure at time: %g s' %(t*dt))\n", " plt.show()" ] From e7399855cf1c11c55f54484b2a82721fc6a00295 Mon Sep 17 00:00:00 2001 From: IvarStefansson Date: Wed, 18 Oct 2017 13:32:15 +0200 Subject: [PATCH 39/53] darcyTransport class For solving darcy problem once and parabolic problem with the resulting fluxes. --- src/porepy/numerics/darcyAndTransport.py | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/porepy/numerics/darcyAndTransport.py diff --git a/src/porepy/numerics/darcyAndTransport.py b/src/porepy/numerics/darcyAndTransport.py new file mode 100644 index 0000000000..7235c938a4 --- /dev/null +++ b/src/porepy/numerics/darcyAndTransport.py @@ -0,0 +1,28 @@ +class DarcyAndTransport(): + """ + Wrapper for a stationary Darcy problem and a transport problem + on the resulting fluxes. + The flow and transport inputs should be members of the + Darcy and Parabolic classes, respectively. + """ + def __init__(self, flow, transport): + self.flow = flow + self.transport = transport + + def solve(self): + """ + Solve both problems. + """ + self.flow.reassemble() + p = self.flow.step() + self.flow.discharge() + + s = self.transport.solve() + return p, s['transport'] + + def save(self, export_every=1): + """ + Save for visualization. + """ + self.flow.save() + self.transport.save(save_every=export_every) From 7fd3e3452734a8b4c140d445a5e6a4e744fb3c6d Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 13:34:46 +0200 Subject: [PATCH 40/53] Updated unit test for sparse_mat --- test/unit/test_sparse_mat.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/unit/test_sparse_mat.py b/test/unit/test_sparse_mat.py index 510678d8af..02a82a3c9e 100644 --- a/test/unit/test_sparse_mat.py +++ b/test/unit/test_sparse_mat.py @@ -49,5 +49,21 @@ def test_csc_slice(self): assert rows_2 == np.array([2]) assert np.all(rows0_2 == np.array([1, 2])) + def test_zero_columns(self): + # Test slicing of csr_matrix + A = sps.csc_matrix(np.array([[0, 0, 0], + [1, 0, 0], + [0, 0, 3]])) + A0 = A.copy() + A2 = A.copy() + A0_2 = A.copy() + sparse_mat.zero_columns(A0, np.array([0])) + sparse_mat.zero_columns(A2, np.array([2])) + sparse_mat.zero_columns(A0_2, np.array([0, 1, 2])) + + assert np.sum(A0[:, 0] != 0) == 0 + assert np.sum(A2[:, 2] != 0) == 0 + assert np.sum(A0_2[:, 0:3] != 0) == 0 + if __name__ == '__main__': unittest.main() From 3310bf6da7b38da6be49006d19f730b1a575416e Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 13:36:55 +0200 Subject: [PATCH 41/53] Checked out travis setup from develop --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index e6c11c0c68..54770b6be1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,15 +17,15 @@ install: before_script: # Download gmsh - - wget http://gmsh.info/bin/Linux/gmsh-3.0.0-Linux64.tgz + - wget http://gmsh.info/bin/Linux/gmsh-2.11.0-Linux64.tgz - pwd - ls - - tar xvf gmsh-3.0.0-Linux64.tgz + - tar xvf gmsh-2.11.0-Linux64.tgz # Create porepy config file - cd $TRAVIS_BUILD_DIR - echo $TRAVIS_BUILD_DIR - - echo "config = {\"gmsh_path\":\"$TRAVIS_BUILD_DIR/gmsh-3.0.0-Linux/bin/gmsh\"} " > porepy_config.py + - echo "config = {\"gmsh_path\":\"$TRAVIS_BUILD_DIR/gmsh-2.11.0-Linux/bin/gmsh\"} " > porepy_config.py # add $HOME to $PYTHONPATH to make config file accessible - export PYTHONPATH=${TRAVIS_BUILD_DIR}:${PYTHONPATH} From f65a766eb09067ea6daf81f437360f36caa27766 Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 13:44:09 +0200 Subject: [PATCH 42/53] update unit test for spare_mat (again) --- ...rcyAndTransport.py => darcy_and_transport.py} | 0 test/unit/test_sparse_mat.py | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) rename src/porepy/numerics/{darcyAndTransport.py => darcy_and_transport.py} (100%) diff --git a/src/porepy/numerics/darcyAndTransport.py b/src/porepy/numerics/darcy_and_transport.py similarity index 100% rename from src/porepy/numerics/darcyAndTransport.py rename to src/porepy/numerics/darcy_and_transport.py diff --git a/test/unit/test_sparse_mat.py b/test/unit/test_sparse_mat.py index 02a82a3c9e..df43adebb0 100644 --- a/test/unit/test_sparse_mat.py +++ b/test/unit/test_sparse_mat.py @@ -54,6 +54,16 @@ def test_zero_columns(self): A = sps.csc_matrix(np.array([[0, 0, 0], [1, 0, 0], [0, 0, 3]])) + + A0_t = sps.csc_matrix(np.array([[0, 0, 0], + [0, 0, 0], + [0, 0, 3]])) + A2_t = sps.csc_matrix(np.array([[0, 0, 0], + [1, 0, 0], + [0, 0, 0]])) + A0_2_t = sps.csc_matrix(np.array([[0, 0, 0], + [0, 0, 0], + [0, 0, 0]])) A0 = A.copy() A2 = A.copy() A0_2 = A.copy() @@ -61,9 +71,9 @@ def test_zero_columns(self): sparse_mat.zero_columns(A2, np.array([2])) sparse_mat.zero_columns(A0_2, np.array([0, 1, 2])) - assert np.sum(A0[:, 0] != 0) == 0 - assert np.sum(A2[:, 2] != 0) == 0 - assert np.sum(A0_2[:, 0:3] != 0) == 0 + assert np.sum(A0 != A0_t) == 0 + assert np.sum(A2 != A2_t) == 0 + assert np.sum(A0_2 != A0_2_t) == 0 if __name__ == '__main__': unittest.main() From 3e267ccc30e09f1502129f617f04c6d1bc131e80 Mon Sep 17 00:00:00 2001 From: Runar Date: Wed, 18 Oct 2017 14:16:08 +0200 Subject: [PATCH 43/53] Added unit test for source discretization --- test/unit/test_source.py | 44 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 test/unit/test_source.py diff --git a/test/unit/test_source.py b/test/unit/test_source.py new file mode 100644 index 0000000000..e53ff1be3d --- /dev/null +++ b/test/unit/test_source.py @@ -0,0 +1,44 @@ +import unittest +import scipy.sparse as sps +import numpy as np + +from porepy.grids.structured import CartGrid +from porepy.numerics.fv import source +from porepy.params.data import Parameters + + +class TestSource(unittest.TestCase): + def test_integral(self): + g, d = setup_3d_grid() + src_disc = source.Integral() + lhs, rhs = src_disc.matrix_rhs(g, d) + + rhs_t = np.array([0, 0, 0, 0, 1, 0, 0, 0]) + assert src_disc.ndof(g) == g.num_cells + assert np.all(rhs == rhs_t) + assert lhs.shape == (8, 8) + assert np.sum(lhs != 0) == 0 + + def test_density(self): + g, d = setup_3d_grid() + src_disc = source.Density() + lhs, rhs = src_disc.matrix_rhs(g, d) + + rhs_t = np.array([0, 0, 0, 0, 0.5**3, 0, 0, 0]) + assert src_disc.ndof(g) == g.num_cells + assert np.allclose(rhs, rhs_t) + assert lhs.shape == (8, 8) + assert np.sum(lhs != 0) == 0 + + if __name__ == '__main__': + unittest.main() + + +def setup_3d_grid(): + g = CartGrid([2, 2, 2], physdims=[1, 1, 1]) + g.compute_geometry() + d = {'param': Parameters(g)} + src = np.zeros(g.num_cells) + src[4] = 1 + d['param'].set_source('flow', src) + return g, d From 72121d2bf0ea0ec34313d7082d63ca61fb24974a Mon Sep 17 00:00:00 2001 From: Runar Date: Thu, 19 Oct 2017 09:49:49 +0200 Subject: [PATCH 44/53] Removed bugged line in test_darcy. Probably pasted by a mistake? --- test/integration/test_darcy.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/integration/test_darcy.py b/test/integration/test_darcy.py index 7c127b0fdd..12b738b494 100644 --- a/test/integration/test_darcy.py +++ b/test/integration/test_darcy.py @@ -193,6 +193,3 @@ def darcy_dirich_neumann_source_sink_cart_ref_3d(): -8.37196805, -24.79222197, -35.8194776, -40.46051172, -8.34414468, -24.57071193, -35.99975111, -44.22506448]) return p_ref - - -BasicsTest().test_darcy_uniform_flow_simplex() From 25f9daed0c439caa9b3e37939707e524922e6113 Mon Sep 17 00:00:00 2001 From: Runar Date: Thu, 19 Oct 2017 11:27:20 +0200 Subject: [PATCH 45/53] Updated documentation --- src/porepy/fracs/meshing.py | 3 +- src/porepy/numerics/darcy.py | 83 +++++++++++++++++++++++++++++++++- src/porepy/numerics/fv/mpfa.py | 10 ---- 3 files changed, 84 insertions(+), 12 deletions(-) diff --git a/src/porepy/fracs/meshing.py b/src/porepy/fracs/meshing.py index 6736b2778f..f6c626507c 100644 --- a/src/porepy/fracs/meshing.py +++ b/src/porepy/fracs/meshing.py @@ -344,6 +344,7 @@ def obtain_interdim_mappings(lg, fn, n_per_face): # in the higher-dimensional structure. assert np.all(is_mem) or np.all(~is_mem),\ '''Either all cells should have a corresponding face in a higher dim grid - or no cells should have a corresponding face in a higher dim grid ''' + or no cells should have a corresponding face in a higher dim grid. This + might be a problem with gmsh or how we read the gmsh output, not sure.. ''' low_dim_cell = np.where(is_mem)[0] return cell_2_face, low_dim_cell diff --git a/src/porepy/numerics/darcy.py b/src/porepy/numerics/darcy.py index 93771d73a7..5dbf0c9d0c 100644 --- a/src/porepy/numerics/darcy.py +++ b/src/porepy/numerics/darcy.py @@ -1,3 +1,8 @@ +''' +Module for initializing, assigning data, solve, and save an incompressible flow +problem assuming darcy's law. Please see the tutorial darcy's equation on the +porepy github: https://github.com/pmgbergen/porepy +''' import numpy as np import scipy.sparse as sps @@ -9,16 +14,57 @@ class Darcy(): + ''' + Class for solving an incompressible flow problem: + \nabla K \nabla p = q, + where K is the second order permeability tenser, p the fluid pressure + and q sinks and sources. + + Parameters in Init: + gb: (Grid /GridBucket) a grid or grid bucket object. If gb = GridBucket + a Parameter class should be added to each grid bucket data node with + keyword 'param'. + data: (dictionary) Defaults to None. Only used if gb is a Grid. Should + contain a Parameter class with the keyword 'Param' + physics: (string): defaults to 'flow' + + Functions: + solve(): Calls reassemble and solves the linear system. + Returns: the pressure p. + Sets attributes: self.p + step(): Same as solve, but without reassemble of the matrices + reassemble(): Assembles the lhs matrix and rhs array. + Returns: lhs, rhs. + Sets attributes: self.lhs, self.rhs + source_disc(): Defines the discretization of the source term. + Returns Source discretization object + flux_disc(): Defines the discretization of the flux term. + Returns Flux discretization object (E.g., Tpfa) + grid(): Returns: the Grid or GridBucket + data(): Returns: Data dictionary + split(name): Assignes the pressure self.p to the data dictionary at each + node in the GridBucket. + Parameters: + name: (string) The keyword assigned to the pressure + discharge(): Calls split('p'). Then calculate the discharges over each + face in the grids and between edges in the GridBucket + save(): calls split('p'). Then export the pressure to a vtk file to the + folder self.parameters['folder_name'] with file name + self.parameters['file_name'] + ''' + def __init__(self, gb, data=None, physics='flow'): self.physics = physics self._gb = gb self._data = data - self.lhs, self.rhs = self.reassemble() + self.lhs = [] + self.rhs = [] self.p = np.zeros(self.flux_disc().ndof(self.grid())) self.parameters = {'file_name': physics} self.parameters['folder_name'] = 'results' def solve(self): + self.lhs, self.rhs = self.reassemble() self.p = sps.linalg.spsolve(self.lhs, self.rhs) return self.p @@ -79,6 +125,41 @@ def save(self, save_every=None): class DarcyData(): + ''' + Class for setting data to an incompressible flow problem: + \nabla K \nabla p = q, + where K is the second order permeability tenser, p the fluid pressure + and q sinks and sources. This class creates a Parameter object and + assigns the data to this object by calling DarcyData's functions. + + To change the default values create a class that inherits from DarcyData. + Then overload the values you whish to change. + + Parameters in Init: + gb: (Grid /GridBucket) a grid or grid bucket object + data: (dictionary) Dictionary which Parameter will be added to with keyword + 'param' + physics: (string): defaults to 'flow' + + Functions that assign data to Parameter class: + bc(): defaults to neumann boundary condition + Returns: (Object) boundary condition + bc_val(): defaults to 0 + returns: (ndarray) boundary condition values + porosity(): defaults to 1 + returns: (ndarray) porosity of each cell + apperture(): defaults to 1 + returns: (ndarray) aperture of each cell + permeability(): defaults to 1 + returns: (tensor.SecondOrder) Permeabillity tensor + source(): defaults to 0 + returns: (ndarray) The source and sinks + + Utility functions: + grid(): returns: the grid + + ''' + def __init__(self, g, data, physics='flow'): self._g = g self._data = data diff --git a/src/porepy/numerics/fv/mpfa.py b/src/porepy/numerics/fv/mpfa.py index 460e8d9c2e..ee20cc7ef7 100644 --- a/src/porepy/numerics/fv/mpfa.py +++ b/src/porepy/numerics/fv/mpfa.py @@ -49,11 +49,6 @@ def matrix_rhs(self, g, data, discretize=True): The name of data in the input dictionary (data) are: k : second_order_tensor Permeability defined cell-wise. - f : array (self.g.num_cells) - Scalar source term defined cell-wise. Given as net inn/out-flow, i.e. - should already have been multiplied with the cell sizes. Positive - values are considered innflow. If not given a zero source - term is assumed and a warning arised. bc : boundary conditions (optional) bc_val : dictionary (optional) Values of the boundary conditions. The dictionary has at most the @@ -113,11 +108,6 @@ def discretize(self, g, data): k : second_order_tensor Permeability defined cell-wise. If not given a identity permeability is assumed and a warning arised. - f : array (self.g.num_cells) - Scalar source term defined cell-wise. Given as net inn/out-flow, i.e. - should already have been multiplied with the cell sizes. Positive - values are considered innflow. If not given a zero source - term is assumed and a warning arised. bc : boundary conditions (optional) bc_val : dictionary (optional) Values of the boundary conditions. The dictionary has at most the From 5ebbe3140abc16366bf4630f1d6cf5e3a680c48f Mon Sep 17 00:00:00 2001 From: Runar Date: Thu, 19 Oct 2017 11:34:19 +0200 Subject: [PATCH 46/53] Removed density source discretization --- src/porepy/numerics/fv/source.py | 49 ++++++++------------------------ test/unit/test_source.py | 13 +-------- 2 files changed, 13 insertions(+), 49 deletions(-) diff --git a/src/porepy/numerics/fv/source.py b/src/porepy/numerics/fv/source.py index 00e791bf45..ad605da78e 100644 --- a/src/porepy/numerics/fv/source.py +++ b/src/porepy/numerics/fv/source.py @@ -1,3 +1,7 @@ +''' +Discretization of the flux term of an equation. +''' + import numpy as np import scipy.sparse as sps @@ -6,23 +10,15 @@ class Integral(Solver): + ''' + Discretization of the integrated source term + int q * dx + over each grid cell. - def __init__(self, physics='flow'): - self.physics = physics - Solver.__init__(self) + All this function does is returning a zero lhs and + rhs = param.get_source.physics. + ''' - def ndof(self, g): - return g.num_cells - - def matrix_rhs(self, g, data): - param = data['param'] - sources = param.get_source(self) - lhs = sps.csc_matrix((g.num_cells, g.num_cells)) - assert sources.size == g.num_cells, 'There should be one soure value for each cell' - return lhs, sources - - -class Density(Solver): def __init__(self, physics='flow'): self.physics = physics Solver.__init__(self) @@ -35,9 +31,7 @@ def matrix_rhs(self, g, data): sources = param.get_source(self) lhs = sps.csc_matrix((g.num_cells, g.num_cells)) assert sources.size == g.num_cells, 'There should be one soure value for each cell' - rhs = sources * g.cell_volumes - - return lhs, rhs + return lhs, sources class IntegralMultiDim(Solver): @@ -57,22 +51,3 @@ def matrix_rhs(self, gb): def split(self, gb, names, var): return self.solver.split(gb, names, var) - - -class DensityMultiDim(Solver): - def __init__(self, physics='flow'): - self.physics = physics - discr = Density(self.physics) - self.solver = Coupler(discr) - Solver.__init__(self) - - def ndof(self, gb): - ndof = 0 - for g, _ in gb: - ndof += g.num_cells - - def matrix_rhs(self, gb): - return self.solver.matrix_rhs(gb) - - def split(self, gb, names, var): - return self.solver.split(gb, names, var) diff --git a/test/unit/test_source.py b/test/unit/test_source.py index e53ff1be3d..e9196c3e49 100644 --- a/test/unit/test_source.py +++ b/test/unit/test_source.py @@ -17,18 +17,7 @@ def test_integral(self): assert src_disc.ndof(g) == g.num_cells assert np.all(rhs == rhs_t) assert lhs.shape == (8, 8) - assert np.sum(lhs != 0) == 0 - - def test_density(self): - g, d = setup_3d_grid() - src_disc = source.Density() - lhs, rhs = src_disc.matrix_rhs(g, d) - - rhs_t = np.array([0, 0, 0, 0, 0.5**3, 0, 0, 0]) - assert src_disc.ndof(g) == g.num_cells - assert np.allclose(rhs, rhs_t) - assert lhs.shape == (8, 8) - assert np.sum(lhs != 0) == 0 + assert lhs.nnz == 0 if __name__ == '__main__': unittest.main() From a5f96878262401e6ec5e3427bcc392570973e0e9 Mon Sep 17 00:00:00 2001 From: Runar Date: Thu, 19 Oct 2017 11:35:51 +0200 Subject: [PATCH 47/53] some more documentation --- src/porepy/numerics/parabolic.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/porepy/numerics/parabolic.py b/src/porepy/numerics/parabolic.py index fa9def8f53..3d36511c04 100644 --- a/src/porepy/numerics/parabolic.py +++ b/src/porepy/numerics/parabolic.py @@ -21,9 +21,7 @@ class ParabolicProblem(): - gb (Grid/GridBucket) Grid or grid bucket for the problem - physics (string) Physics key word. See Parameters class for valid physics - Functions that should be overloaded: - - functions: + Functions: data(): returns data dictionary. Is only used for single grids (I.e. not GridBucket) solve(): solve problem @@ -46,7 +44,7 @@ class ParabolicProblem(): save_every time steps Example: - # We create a problem with standard data, neglecting the advective term + # We create a problem with default data, neglecting the advective term class ExampleProblem(ParabolicProblem): def __init__(self, gb): From eccce8493c828acfe6011c125827cca56f6117b2 Mon Sep 17 00:00:00 2001 From: Runar Date: Thu, 19 Oct 2017 12:49:14 +0200 Subject: [PATCH 48/53] Tried to fix unit test for python 2.7. Not sure if it worked --- src/porepy/numerics/pde_solver.py | 2 ++ test/integration/test_pdesolver.py | 27 +++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/porepy/numerics/pde_solver.py b/src/porepy/numerics/pde_solver.py index ecc9a916db..b9952101ff 100644 --- a/src/porepy/numerics/pde_solver.py +++ b/src/porepy/numerics/pde_solver.py @@ -150,6 +150,8 @@ def update(self, t): """ if t > self.dt + 1e-6: self.flag_first = False + else: + self.flag_first = True self.p_1 = self.p0 AbstractSolver.update(self, t) diff --git a/test/integration/test_pdesolver.py b/test/integration/test_pdesolver.py index b9ca187e69..7af72adcf4 100644 --- a/test/integration/test_pdesolver.py +++ b/test/integration/test_pdesolver.py @@ -23,6 +23,8 @@ def __init__(self, *args, **kwargs): d['problem'] = ParabolicData(g, d) def test_implicit_solver(self): + '''Inject 1 in cell 0. Test that rhs and pressure solution + is correct''' problem = UnitSquareInjectionMultiDim(self.gb) problem.update(0.0) solver = Implicit(problem) @@ -33,17 +35,36 @@ def test_implicit_solver(self): assert np.sum(np.abs(solver.p - 1) < 1e-6) == 1 def test_BDF2_solver(self): + '''Inject 1 in cell 0. Test that rhs and pressure solution + is correct''' problem = UnitSquareInjectionTwoSteps(self.gb) problem.update(0.0) solver = BDF2(problem) - solver.solve() + solver.update(solver.dt) + solver.reassemble() + solver.step() + # The first step should be an implicit step + assert np.sum(np.abs(solver.rhs) > 1e-6) == 1 + assert np.sum(np.abs(solver.rhs - 1) < 1e-6) == 1 + assert np.sum(np.abs(solver.p) > 1e-6) == 1 + assert np.sum(np.abs(solver.p - 1 / 2) < 1e-6) == 1 + assert np.allclose(solver.p0, 0) + assert np.allclose(solver.p_1, 0) + + solver.update(2 * solver.dt) + solver.reassemble() + solver.step() + # The second step should be a full bdf2 step assert np.sum(np.abs(solver.rhs) > 1e-6) == 1 assert np.sum(np.abs(solver.rhs - 2) < 1e-6) == 1 assert np.sum(np.abs(solver.p) > 1e-6) == 1 assert np.sum(np.abs(solver.p - 1) < 1e-6) == 1 - assert np.sum(np.abs(solver.p_1 - 0.5) < 1e-6) == 1 + assert np.sum(np.abs(solver.p0 - 0.5) < 1e-6) == 1 + assert np.allclose(solver.p_1, 0) def test_explicit_solver(self): + '''Inject 1 in cell 0. Test that rhs and pressure solution + is correct''' problem = UnitSquareInjectionMultiDim(self.gb) problem.update(0.0) solver = Explicit(problem) @@ -52,6 +73,8 @@ def test_explicit_solver(self): assert np.sum(np.abs(solver.p) > 1e-6) == 0 def test_CrankNicolson_solver(self): + '''Inject 1 in cell 0. Test that rhs and pressure solution + is correct''' problem = UnitSquareInjectionMultiDim(self.gb) problem.update(0.0) solver = CrankNicolson(problem) From a6166ae7bd33103e6d1183659ab6a56a5fc41e69 Mon Sep 17 00:00:00 2001 From: Runar Date: Thu, 19 Oct 2017 13:02:50 +0200 Subject: [PATCH 49/53] Is it a int vs float problem ?? --- test/integration/test_pdesolver.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/integration/test_pdesolver.py b/test/integration/test_pdesolver.py index 7af72adcf4..15ee6ab2e1 100644 --- a/test/integration/test_pdesolver.py +++ b/test/integration/test_pdesolver.py @@ -45,9 +45,9 @@ def test_BDF2_solver(self): solver.step() # The first step should be an implicit step assert np.sum(np.abs(solver.rhs) > 1e-6) == 1 - assert np.sum(np.abs(solver.rhs - 1) < 1e-6) == 1 + assert np.sum(np.abs(solver.rhs - 1.0) < 1e-6) == 1 assert np.sum(np.abs(solver.p) > 1e-6) == 1 - assert np.sum(np.abs(solver.p - 1 / 2) < 1e-6) == 1 + assert np.sum(np.abs(solver.p - 1.0 / 2.0) < 1e-6) == 1 assert np.allclose(solver.p0, 0) assert np.allclose(solver.p_1, 0) @@ -56,11 +56,11 @@ def test_BDF2_solver(self): solver.step() # The second step should be a full bdf2 step assert np.sum(np.abs(solver.rhs) > 1e-6) == 1 - assert np.sum(np.abs(solver.rhs - 2) < 1e-6) == 1 + assert np.sum(np.abs(solver.rhs - 2.0) < 1e-6) == 1 assert np.sum(np.abs(solver.p) > 1e-6) == 1 assert np.sum(np.abs(solver.p - 1) < 1e-6) == 1 assert np.sum(np.abs(solver.p0 - 0.5) < 1e-6) == 1 - assert np.allclose(solver.p_1, 0) + assert np.allclose(solver.p_1, 0.0) def test_explicit_solver(self): '''Inject 1 in cell 0. Test that rhs and pressure solution @@ -103,7 +103,7 @@ def update(self, t): for g, d in self.grid(): source = np.zeros(g.num_cells) if g.dim == 0 and t > self.time_step() - 1e-5: - source[0] = 1 + source[0] = 1.0 d['param'].set_source('transport', source) From c2f0d38ae8a18c2bc7d8963cf344d13c1320f15d Mon Sep 17 00:00:00 2001 From: Runar Date: Thu, 19 Oct 2017 13:06:48 +0200 Subject: [PATCH 50/53] YES it is !! 1 / 2 = 0 in python 2.7 --- src/porepy/numerics/pde_solver.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/porepy/numerics/pde_solver.py b/src/porepy/numerics/pde_solver.py index b9952101ff..c0b4af9a78 100644 --- a/src/porepy/numerics/pde_solver.py +++ b/src/porepy/numerics/pde_solver.py @@ -164,9 +164,9 @@ def reassemble(self): self.lhs = lhs_time + lhs_flux self.rhs = lhs_time * self.p0 + rhs_flux + rhs_time else: - self.lhs = lhs_time + 2 / 3 * lhs_flux - bdf2_rhs = 4 / 3 * lhs_time * self.p0 - 1 / 3 * lhs_time * self.p_1 - self.rhs = bdf2_rhs + 2 / 3 * rhs_flux + rhs_time + self.lhs = lhs_time + 2. / 3 * lhs_flux + bdf2_rhs = 4. / 3 * lhs_time * self.p0 - 1. / 3 * lhs_time * self.p_1 + self.rhs = bdf2_rhs + 2. / 3 * rhs_flux + rhs_time class Explicit(AbstractSolver): From 7e5a15dd2fc854fd90a4dd8aa4215fa7fe837ba2 Mon Sep 17 00:00:00 2001 From: Runar Date: Thu, 19 Oct 2017 13:27:27 +0200 Subject: [PATCH 51/53] Renamed darcy -> elliptic --- src/porepy/numerics/darcy_and_transport.py | 31 +++++++++--------- src/porepy/numerics/{darcy.py => elliptic.py} | 11 ++++--- test/integration/test_advective_diffusive.py | 20 ++++++------ test/integration/test_darcy.py | 26 +++++++-------- test/unit/test_darcyEq.py | 32 +++++++++---------- tutorials/Darcy equation.ipynb | 28 ++++++++-------- 6 files changed, 76 insertions(+), 72 deletions(-) rename src/porepy/numerics/{darcy.py => elliptic.py} (96%) diff --git a/src/porepy/numerics/darcy_and_transport.py b/src/porepy/numerics/darcy_and_transport.py index 7235c938a4..dc05740954 100644 --- a/src/porepy/numerics/darcy_and_transport.py +++ b/src/porepy/numerics/darcy_and_transport.py @@ -1,28 +1,29 @@ -class DarcyAndTransport(): +class DarcyAndTransport(): """ Wrapper for a stationary Darcy problem and a transport problem on the resulting fluxes. The flow and transport inputs should be members of the Darcy and Parabolic classes, respectively. - """ - def __init__(self, flow, transport): - self.flow = flow - self.transport = transport - - def solve(self): + """ + + def __init__(self, flow, transport): + self.flow = flow + self.transport = transport + + def solve(self): """ Solve both problems. - """ - self.flow.reassemble() + """ + self.flow.reassemble() p = self.flow.step() self.flow.discharge() - + s = self.transport.solve() - return p, s['transport'] - - def save(self, export_every=1): + return p, s['transport'] + + def save(self, export_every=1): """ Save for visualization. - """ - self.flow.save() + """ + self.flow.save() self.transport.save(save_every=export_every) diff --git a/src/porepy/numerics/darcy.py b/src/porepy/numerics/elliptic.py similarity index 96% rename from src/porepy/numerics/darcy.py rename to src/porepy/numerics/elliptic.py index 5dbf0c9d0c..40433e0086 100644 --- a/src/porepy/numerics/darcy.py +++ b/src/porepy/numerics/elliptic.py @@ -1,5 +1,6 @@ ''' -Module for initializing, assigning data, solve, and save an incompressible flow +Module for initializing, assigning data, solve, and save an elliptic pde. +Ths can for example be incompressible flow problem assuming darcy's law. Please see the tutorial darcy's equation on the porepy github: https://github.com/pmgbergen/porepy ''' @@ -13,7 +14,7 @@ from porepy.viz.exporter import export_vtk -class Darcy(): +class Elliptic(): ''' Class for solving an incompressible flow problem: \nabla K \nabla p = q, @@ -124,15 +125,15 @@ def save(self, save_every=None): export_vtk(self.grid(), f_name, ['p'], folder=folder) -class DarcyData(): +class EllipticData(): ''' Class for setting data to an incompressible flow problem: \nabla K \nabla p = q, where K is the second order permeability tenser, p the fluid pressure and q sinks and sources. This class creates a Parameter object and - assigns the data to this object by calling DarcyData's functions. + assigns the data to this object by calling EllipticData's functions. - To change the default values create a class that inherits from DarcyData. + To change the default values create a class that inherits from EllipticData. Then overload the values you whish to change. Parameters in Init: diff --git a/test/integration/test_advective_diffusive.py b/test/integration/test_advective_diffusive.py index 3a9e297274..bf67140485 100644 --- a/test/integration/test_advective_diffusive.py +++ b/test/integration/test_advective_diffusive.py @@ -2,7 +2,7 @@ import unittest from porepy.numerics.parabolic import * -from porepy.numerics import darcy +from porepy.numerics import elliptic from porepy.fracs import meshing from porepy.params.data import Parameters from porepy.params import tensor, bc @@ -26,8 +26,8 @@ def __init__(self, *args, **kwargs): def test_src_2d(self): """ - test that the mono_dimensional darcy solver gives the same answer as - the grid bucket darcy + test that the mono_dimensional elliptic solver gives the same answer as + the grid bucket elliptic """ gb = meshing.cart_grid([], [10, 10]) @@ -44,8 +44,8 @@ def test_src_2d(self): def test_src_3d(self): """ - test that the mono_dimensional darcy solver gives the same answer as - the grid bucket darcy + test that the mono_dimensional elliptic solver gives the same answer as + the grid bucket elliptic """ delete_node_data(self.gb3d) @@ -68,7 +68,7 @@ def test_src_advective(self): d['problem'] = InjectionDomain(g, d) else: d['problem'] = MatrixDomain(g, d) - solve_darcy_problem(self.gb3d) + solve_elliptic_problem(self.gb3d) problem = SourceAdvectiveProblem(self.gb3d) problem.solve() dE = change_in_energy(problem) @@ -81,7 +81,7 @@ def test_src_advective_diffusive(self): d['problem'] = InjectionDomain(g, d) else: d['problem'] = MatrixDomain(g, d) - solve_darcy_problem(self.gb3d) + solve_elliptic_problem(self.gb3d) problem = SourceAdvectiveDiffusiveProblem(self.gb3d) problem.solve() dE = change_in_energy(problem) @@ -94,7 +94,7 @@ def test_constant_temp(self): d['problem'] = InjectionDomain(g, d) else: d['problem'] = MatrixDomain(g, d) - solve_darcy_problem(self.gb3d) + solve_elliptic_problem(self.gb3d) problem = SourceAdvectiveDiffusiveDirBound(self.gb3d) problem.solve() for _, d in self.gb3d: @@ -200,7 +200,7 @@ def change_in_energy(problem): return dE -def solve_darcy_problem(gb): +def solve_elliptic_problem(gb): for g, d in gb: if g.dim == 2: d['param'].set_source( @@ -215,7 +215,7 @@ def solve_darcy_problem(gb): for e, d in gb.edges_props(): g_h = gb.sorted_nodes_of_edge(e)[1] d['param'] = Parameters(g_h) - flux = darcy.Darcy(gb) + flux = elliptic.Elliptic(gb) p = flux.solve() flux.split('p') fvutils.compute_discharges(gb) diff --git a/test/integration/test_darcy.py b/test/integration/test_darcy.py index 12b738b494..2a1cbf176b 100644 --- a/test/integration/test_darcy.py +++ b/test/integration/test_darcy.py @@ -1,7 +1,7 @@ import numpy as np import unittest -from porepy.numerics import darcy +from porepy.numerics import elliptic from porepy.grids.structured import CartGrid from porepy.fracs import meshing from porepy.params.data import Parameters @@ -14,8 +14,8 @@ class BasicsTest(unittest.TestCase): def test_mono_equals_multi(self): """ - test that the mono_dimensional darcy solver gives the same answer as - the grid bucket darcy + test that the mono_dimensional elliptic solver gives the same answer as + the grid bucket elliptic """ g = CartGrid([10, 10]) g.compute_geometry() @@ -38,8 +38,8 @@ def bc_val(g): d['param'] = Parameters(sub_g) d['param'].set_bc_val('flow', bc_val(g)) - problem_mono = darcy.Darcy(g, {'param': param_g}) - problem_mult = darcy.Darcy(gb) + problem_mono = elliptic.Elliptic(g, {'param': param_g}) + problem_mult = elliptic.Elliptic(gb) p_mono = problem_mono.solve() p_mult = problem_mult.solve() @@ -47,9 +47,9 @@ def bc_val(g): assert np.allclose(p_mono, p_mult) #------------------------------------------------------------------------------# - def test_darcy_uniform_flow_cart(self): + def test_elliptic_uniform_flow_cart(self): gb = setup_2d_1d([10, 10]) - problem = darcy.Darcy(gb) + problem = elliptic.Elliptic(gb) p = problem.solve() problem.split('pressure') @@ -60,14 +60,14 @@ def test_darcy_uniform_flow_cart(self): assert np.max(np.abs(p_diff)) < 0.03 #------------------------------------------------------------------------------# - def test_darcy_uniform_flow_simplex(self): + def test_elliptic_uniform_flow_simplex(self): """ Unstructured simplex grid. Note that the solution depends on the grid quality. Also sensitive to the way in which the tpfa half transmissibilities are computed. """ gb = setup_2d_1d(np.array([10, 10]), simplex_grid=True) - problem = darcy.Darcy(gb) + problem = elliptic.Elliptic(gb) p = problem.solve() problem.split('pressure') @@ -77,15 +77,15 @@ def test_darcy_uniform_flow_simplex(self): p_diff = pressure - p_analytic assert np.max(np.abs(p_diff)) < 0.033 - def test_darcy_dirich_neumann_source_sink_cart(self): + def test_elliptic_dirich_neumann_source_sink_cart(self): gb = setup_3d(np.array([4, 4, 4]), simplex_grid=False) - problem = darcy.Darcy(gb) + problem = elliptic.Elliptic(gb) p = problem.solve() problem.split('pressure') for g, d in gb: if g.dim == 3: - p_ref = darcy_dirich_neumann_source_sink_cart_ref_3d() + p_ref = elliptic_dirich_neumann_source_sink_cart_ref_3d() assert np.allclose(d['pressure'], p_ref) if g.dim == 0: p_ref = [-10788.06883149] @@ -175,7 +175,7 @@ def setup_2d_1d(nx, simplex_grid=False): return gb -def darcy_dirich_neumann_source_sink_cart_ref_3d(): +def elliptic_dirich_neumann_source_sink_cart_ref_3d(): p_ref = np.array([0.54570555, -11.33848749, -19.44484907, -23.13293673, -2.03828237, -12.73249228, -20.96189563, -24.14626244, -2.81412045, -14.03104316, -22.2699576, -25.06029852, diff --git a/test/unit/test_darcyEq.py b/test/unit/test_darcyEq.py index 7610e9c68c..e617bac03b 100644 --- a/test/unit/test_darcyEq.py +++ b/test/unit/test_darcyEq.py @@ -1,7 +1,7 @@ import numpy as np import unittest -from porepy.numerics.darcy import DarcyData +from porepy.numerics.elliptic import EllipticData from porepy.grids import simplex from porepy.params import bc, tensor from porepy.params.data import Parameters @@ -13,22 +13,22 @@ class BasicsTest(unittest.TestCase): #------------------------------------------------------------------------------# - def test_darcy_data_default_values(self): + def test_elliptic_data_default_values(self): """ - test that the darcy data initialize the correct data. + test that the elliptic data initialize the correct data. """ p = np.random.rand(3, 10) g = simplex.TetrahedralGrid(p) param = Parameters(g) - darcy_data = dict() - DarcyData(g, darcy_data) - darcy_param = darcy_data['param'] + elliptic_data = dict() + EllipticData(g, elliptic_data) + elliptic_param = elliptic_data['param'] - check_parameters(darcy_param, param) + check_parameters(elliptic_param, param) - def test_darcy_data_given_values(self): + def test_elliptic_data_given_values(self): """ - test that the darcy data initialize the correct data. + test that the elliptic data initialize the correct data. """ p = np.random.rand(3, 10) g = simplex.TetrahedralGrid(p) @@ -50,11 +50,11 @@ def test_darcy_data_given_values(self): param.set_aperture(apperture) param.set_tensor('flow', K) param.set_source('flow', source) - # Define DarcyData class + # Define EllipticData class - class Data(DarcyData): + class Data(EllipticData): def __init__(self, g, data): - DarcyData.__init__(self, g, data) + EllipticData.__init__(self, g, data) def bc(self): return bc_cond @@ -74,11 +74,11 @@ def permeability(self): def source(self): return source - darcy_data = dict() - Data(g, darcy_data) - darcy_param = darcy_data['param'] + elliptic_data = dict() + Data(g, elliptic_data) + elliptic_param = elliptic_data['param'] - check_parameters(darcy_param, param) + check_parameters(elliptic_param, param) #------------------------------------------------------------------------------# diff --git a/tutorials/Darcy equation.ipynb b/tutorials/Darcy equation.ipynb index f5e26f8bee..72373242b0 100644 --- a/tutorials/Darcy equation.ipynb +++ b/tutorials/Darcy equation.ipynb @@ -44,7 +44,7 @@ "source": [ "import numpy as np\n", "\n", - "from porepy.numerics import darcy\n", + "from porepy.numerics import elliptic\n", "from porepy.fracs import meshing\n", "from porepy.params import bc, tensor, data\n", "from porepy.grids.grid import FaceTag\n", @@ -117,7 +117,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVAAAADuCAYAAABvX19oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VFW26PHfTlVCIEAYEiATU4NCUGQIBhBtRFCk2ygY\nBQRlilwRr9jcVrFFG3y2A92K0njbp+3UcjHX2+8qtAKKOCMRAtiCKHMgCWOYQuaqynp/hFSHSJI6\nlapUhazv53M+Hyp1zt7rVJGVfc7ZgxERlFJKWRcS6ACUUqqx0gSqlFJe0gSqlFJe0gSqlFJe0gSq\nlFJe0gSqlFJe0gSqlFJe0gSqlFJe0gSqlFJeslvcX4ctKaU8ZepzcA9jpMjDfQ/DRyIyuj71ecNq\nAlVKqQZRDMz2cN/5EOXPWGqiCVQpFZQMEBroIOqgCVQpFZQMwZ+g9CFSkGnZsiX79u274Htvvvkm\nw4YNa+CIlAqMyhaoJ1ugNMkEunz5cpKSkmjZsiUxMTHceOONfP31116XZ4xhz5495/3s7NmzzJ07\nl65duxIREUHnzp1JTU1l48aNtZZVUFBA9+7dvYqjrKyMBQsW0LNnTyIiIujatSvTp08nKyvLq/L8\nZcGCBUyePDnQYfhVVlYWxhicTmegQ2m0QoDmHm6B0uQS6PPPP88DDzzA7373O44ePcrBgwe59957\nWbFiheWyavrlKC0tZcSIEWzbto0PPviA/Px8fvzxRyZMmMCqVasslWVFamoqK1euZPny5Zw5c4Z/\n/vOfDBw4kHXr1tW7bOV7mlxrV3kJ78kWMCJiZWvUTp8+LREREfLuu+/WuM+3334rgwcPlsjISOnU\nqZPMnj1bSktL3e8DsnTpUunRo4d07dpVrr76agGkRYsWEhERIenp6fLqq69Kp06dpKCgoNZ4qpdV\n+bPdu3eLiEheXp7cdNNN0qpVKxk0aJDMnz9frrrqqguWtXbtWgkPD5eDBw/WWF9ubq7cdNNN0rZt\nW/nFL34hr7zyivu93//+95KamiqTJk2Sli1bymWXXSY7d+6Up556SqKjoyU+Pl4++ugj9/6//OUv\nZd68eTJo0CBp3bq1pKSkyIkTJ0RE5LPPPpO4uLjz6u7SpYusXbtWVq9eLaGhoWK32yUiIkL69u0r\nIhXfzfTp06VTp04SGxsrjz76qDidzgueR1FRkdx1113Spk0b6dWrlzz77LPn1Zebmyvjxo2TqKgo\n6dq1q7z44ovu90pKSmTOnDkSExMjMTExMmfOHCkpKTkv7meffVaio6OlU6dO8t5778mHH34oPXv2\nlLZt28of/vAHd1kul0uefvpp6d69u7Rr105uu+0292eQkJAggEREREhERIR888038sYbb8jQoUPl\ngQcekLZt28q8efOkbdu28v3337vLPHr0qISHh8uxY8dq/B4bEav55bytG8gyDzcgs771ebM1qQS6\nevVqsdls4nA4atwnMzNTNmzYIA6HQ/bv3y+9evWSxYsXu98HZOTIkXLixAkpKipy/6wy6YmIjB8/\nXqZMmVJnPHWVNX78eLntttukoKBAtm3bJrGxsTUm0IcffliuueaaWuu75pprZNasWVJcXCxbt26V\nqKgo+eSTT0SkIoE2a9ZM1qxZIw6HQ+68807p2rWrPPnkk1JWViavvPKKO8mLVCTQ2NhY2bZtmxQU\nFMi4ceNk0qRJIlJ7Aq2sq3LfSjfffLPMnDlTCgoK5OjRozJo0CB5+eWXaz3XkydPSnZ2tlx++eXu\n+lwulwwYMEAWLlwopaWlsnfvXunWrZusWbNGREQee+wxSU5OlqNHj8qxY8dkyJAhMn/+fHfcNptN\nFi5c6D7nqKgomThxouTn58v27dulWbNmsnfvXhERWbx4sSQnJ0t2draUlJTIzJkzZcKECSIisn//\nfgHO+7/2xhtviM1mkyVLlojD4ZCioiKZNWuWPPTQQ+59XnjhBfn1r39d6/fYiNQrOXUHSfdw0wTa\nAJYtWyYdO3a0dMzixYvllltucb8GZN26deftUz2BXnfddfLwww+7X2/dulUiIyOlVatWcskll3hU\nltPpFLvdLj/++KP7vUceeaTGBJqWlibjx4+v8TwOHjwoISEhkp+f7/7ZvHnz3In+97//vYwcOdL9\n3sqVKyUiIsLdCszPzxdATp06JSIVCbTqOf7www8SGhoqTqfTcgI9cuSIhIWFuf+IiIgsX75chg8f\nfsFzqZoQRUReffVVd30ZGRmSkJBw3v5PPfWUTJ06VUREunfvLh9++KH7vTVr1kiXLl1EpCKBhoeH\n/+ycMzIy3PsPGDBA3nvvPRER6dWrl/sPkIjIoUOHxG63u//4XiiBVo8tIyND4uPjxeVyiYjIwIED\n5b//+78veN6NUL2S0y9A/p+HW6ASaLD3EvCp9u3bk5eXh9PpxG6/8Knv2rWLuXPnkpmZSVFREU6n\nk4EDB563T0JCQp31HD582P26X79+nD59mk8++YS0tDSPyjp+/DhOp/O897t06VJrnbt27arx/UOH\nDtGuXTtatWp1XnmZmZnu1x07dnT/u3nz5kRFRWGz2dyvoeIhV5s2bX4We5cuXXA4HOTl5dUYQ00O\nHDiAw+EgJibG/bPy8vIaP5tDhw6d917Vfx84cIBDhw65YwRwuVxcffXV7mOrfo5dunTh0KFD7tft\n27f/2TlX/1wKCgrcdY0dO5aQkH89SrDZbBw9erTGc61+TsnJyURERPDFF18QExPDnj17SElJqfH4\npqQx9ANtUg+RhgwZQnh4OO+//36N+8yaNYtevXqxe/du8vPzeeqppyqa6lUYU/sIteuuu46PP/6Y\nwsLCOmOqqazo6GjsdjvZ2dnunx08eLDGckaOHMnGjRvJycm54PuxsbGcPHmSs2fPnldeXFxcnTHW\npHpsoaGhREVFERERQVHRvwbhuVwujh8/7n5d/ZwTEhJo1qwZeXl5nD59mtOnT5Ofn88PP/xwwXpj\nYmLOO8+qcSQkJNCtWzd3OadPn+bs2bPuh3exsbEcOHDgvLhjY2O9Ov+EhARWr159Xl0lJSXExcXV\n+L1e6OdTpkxh2bJlvP3226SmphIeHu5VPBcbgz6FDyqRkZE88cQTzJ49m/fff5+ioiIcDgerV6/m\noYceAiq6H7Vu3ZqWLVvy008/8Ze//KXOcjt27Hhe38277rqLmJgYxo4dy/bt23G5XJSUlJzX2quL\nzWZj3LhxLFiwgKKiInbs2MFbb71V4/4jR45k1KhRjB07ls2bN+N0Ojl79iwvv/wyr7/+OgkJCQwd\nOpRHHnmEkpISvv/+e1577TUmTZrkcUzVLVu2jB07dlBUVMTjjz9OamoqNpuNSy65hJKSEj788EMc\nDgdPPvkkpaWl7uM6duxIVlYW5eXlQEVCvP766/mP//gP8vPzKS8vZ+/evXzxxRcXrPf222/n6aef\n5tSpU+Tm5rJ06VL3e1deeSWtW7fm2Wefpbi4GJfLxfbt29m0aRMAEydO5Mknn+T48ePk5eXxxBNP\neN2l6p577uHRRx91J+Tjx4+7e3NER0cTEhJSY5/equ68807ee+89li1bxl133eVVLBejxvAUvkkl\nUIC5c+fy/PPP8+STTxIdHU1CQgJLly7llltuAeBPf/oTy5cvp1WrVtx9992MHz++zjIXLFjAlClT\naNOmDe+++y7h4eF89tlnJCYm8qtf/YrWrVtz6aWXsmnTJt59912PY126dCkFBQV06tSJqVOnMm3a\ntFr3//vf/86YMWMYP348kZGRXHbZZWRmZjJy5EgA3nnnHbKysoiNjWXs2LEsXLiQUaNGeRxPdXfe\neSdTp06lU6dOlJSUsGTJEqDiD9V//ud/kpaWRlxcHBEREcTHx7uPu+2224CKy+UBAwYA8Le//Y2y\nsjISExNp27Ytqamp590Gqerxxx8nPj6ebt26MXLkSFJTU2nWrBlQ8YfnH//4B9999x3dunUjKiqK\ntLQ0zpw5A8D8+fNJSkqib9++XH755QwYMID58+d7df5z5swhJSWF66+/nlatWjF48GC+/fZbAFq0\naMGjjz7KVVddRZs2bcjIyKixnPj4eAYMGIAxxn2rQfm+I70xZrQxZqcxZo8xZt4F3p9qjDlujPnu\n3JZ2oXLOO6b65WkddDYmBcDw4cOZPHnyz+7pBsJf/vIX0tPTa2yxNgbTp08nNjaWJ598MtCh+FK9\nZmPqbYy86eG+g2GziCTVGIgxNmAXMArIATYBE0VkR5V9pgJJInKfpzE2uRaoavwOHz7M+vXrKS8v\nZ+fOnTz33HOMHTs20GF5LSsri//93/9lxowZgQ4lqPi4BXolsEdE9olIGZAO3FzfGDWBqkanrKyM\nf/u3f6NVq1aMGDGCm2++mXvvvTfQYXnlscce47LLLuPBBx+kW7dugQ4nqFgcyhlljMmsss2sVlwc\nkF3ldc65n1V3qzHme2PM340xtXe3QS/hlVL+U69L+MuNkf/1cN9L6r6Evw24QUTSzr2+E7hSRP69\nyj7tgQIRKTXG3APcLiIjaqtXW6BKqaDk40v4HKBqizIeOFR1BxE5ISKV3UVeBc7vAH4BmkCVUkHJ\nxwl0E9DTGNPNGBMGTABWnlefMTFVXqYAP9ZVaJMaiaSUalx8laBExGmMuQ/4CLABr4vID8aYJ6gY\nBroSuN8YkwI4gZPA1LrK1XugSil/qdc90H7GyKceZtD2ztrvgfqLtkCVUkEpJASaN/Nw5wBNraoJ\nVCkVlIyBGub8CRr6EEn5xKZNm+jbty8lJSUUFhbSp08ftm/fHuiwVCNmgFC7Z1vAYtR7oMpX5s+f\nT0lJCcXFxcTHx/PII48EOiQVWPW6B5oUaiSznYcVHQvMPVBNoMpnysrKGDRoEOHh4XzzzTfueTVV\nk1W/BBpmJDPaw4oO6UMk1cidPHmSgoICHA4HJSUlREREBDok1Zg1goXhtQWqfCYlJYUJEyawf/9+\nDh8+fN48napJql8LNNxIZmcPK9qtLVDViP3tb3/Dbrdzxx134HK5GDp0KJ9++ikjRtQ6lFipmmkL\nVCnVhNWvBdrCSGYPDyvapi1QpZQ6X5A/h9QEqpQKTo3gEj7Iw1NKNVkG8HQoZ4BoAlVKBSdtgSql\nlJc0gSqllJc0gSqlVD0E+VN4nY2pHtasWcOll15Kjx49eOaZZ3xadnZ2Ntdeey29e/emT58+vPji\niz4tvyqXy0X//v359a9/7ZfyT58+TWpqKr169aJ3795s2LDB53UsXryYPn36cNlllzFx4kRKSkrq\nXeb06dPp0KEDl112mftnJ0+eZNSoUfTs2ZNRo0Zx6tSpetejalDZAvVkCxBNoF5yuVzMnj2b1atX\ns2PHDt555x127Njhs/LtdjvPPfccP/74IxkZGbz00ks+Lb+qF198kd69e/ulbIA5c+YwevRofvrp\nJ/75z3/6vK7c3FyWLFlCZmYm27dvx+VykZ6eXu9yp06dypo1a8772TPPPMN1113H7t27ue6663z+\nh1NVEULFU3hPtgDRBFqNiODJ6KyNGzfSo0cPunfvTlhYGBMmTGDFihU+iyMmJoYBAwYA0KpVK3r3\n7k1ubq7Pyq+Uk5PDhx9+SFpams/LBsjPz+fLL79kxowZAISFhdGmTRuf1+N0OikuLsbpdFJUVERs\nbGy9y7zmmmto1+78+dRWrFjBlClTAJgyZQrvv/9+vetRNdAWaONTVlbG3r17KS8vr3W/3NxcEhL+\ntUpqfHy8XxIcQFZWFlu3biU5OdnnZT/wwAMsWrSIkBD//FfYt28f0dHRTJs2jf79+5OWlkZhYaFP\n64iLi+O3v/0tnTt3JiYmhsjISK6//nqf1lHp6NGjxMRULN4YExPDsWPH/FKPOkcTaOMiImRnZ1Na\nWorL5ap1v+qMqdfQ3wsqKCjg1ltv5YUXXqB169Y+LfuDDz6gQ4cODBxY5/LXXnM6nWzZsoVZs2ax\ndetWIiIifH7Ze+rUKVasWMH+/fs5dOgQhYWFLFu2zKd1qAAwVDxE8mQLEE2gNTDGsG/fPpxO5wWT\nZXx8PNnZ2e7XOTk5PrlsrMrhcHDrrbcyadIkxo0b59OyAdavX8/KlSvp2rUrEyZM4NNPP2Xy5Mk+\nrSM+Pp74+Hh36zk1NZUtW7b4tI5PPvmEbt26ER0dTWhoKOPGjeObb77xaR2VOnbsyOHDhwE4fPgw\nHTp08Es9Cr2Eb8yMMeTk5LB//34cDsfPkuigQYPYvXs3+/fvp6ysjPT0dFJSUnxWv4gwY8YMevfu\nzdy5c31WblVPP/00OTk5ZGVlkZ6ezogRI3zecuvUqRMJCQns3LkTgHXr1pGYmOjTOjp37kxGRgZF\nRUWICOvWrfPbQ7GUlBTeeustAN566y1uvvlmv9Sj0AR6McjJycHlcrF3797zkqjdbmfp0qXccMMN\n9O7dm9tvv50+ffr4rN7169fz9ttv8+mnn9KvXz/69evHqlWrfFZ+Q/rzn//MpEmT6Nu3L9999x2/\n+93vfFp+cnIyqampDBgwgMsvv5zy8nJmzpxZ73InTpzIkCFD2LlzJ/Hx8bz22mvMmzePtWvX0rNn\nT9auXcu8efN8cAbqgirHwgfxU3jtSO8BYwzZ2dmICL/4xS/cD1yWLFnCrl27/FLnsGHDEBFGjx79\ns640vlZZx/Dhw/1Sfr9+/YiKivLreSxcuJCFCxcyevRo3n77bZ+U+c4771zw56Ghoezevdsndaha\n6Eiki0Plw6GcnBwAZs+eTV5eHjk5Oe6uRv6idXguOTmZL7/80q/11LeOgwcPkpeX5+OoLlKaQC8+\nOTk5fPDBBzidToYPH87nn3/u1/q0Ds9lZGSwZ88en/bH9XUdw4YN83FEF7kgH8qpCbQeGmIUitZh\njT+TZ0PWodAW6MXu17++meLiAotH2YCa+5fWf/9grcObYy6OOlq2jOTo0UMW61CEAOGBDqJ2mkDr\noSJ5LrB41ALgWQv7PwwssVjH/cCrFva/G3jDYh3TAKtdniZbrGca1s4DKs7Fyud1P9a+D6j4ThZ4\nvHdBgef7qmr0El4ppbzQCC7htR+oUio4+bgjvTFmtDFmpzFmjzGmxg68xphUY4wYY+pcJlkTaDWl\npaV1TiSilGogPhoLb4yxAS8BNwKJwERjzM+GxBljWlFxX+dbT8LTBFpNSUkJRUVFHDx4MNChKNW0\n+bYFeiWwR0T2iUgZkA5caBzu/wEWAR7NyK0JtJrIyEgiIiIoKiqisLBQW6NKBYpvJ1SOA7KrvM45\n9zM3Y0x/IEFEPvA0xCC/RRsYxhh69erF8ePHKS4uZs+ePYEOSammx9pDpChjTGaV16+IyCvVSqvO\nPbmFMSYEWAxMtRKiJtBa2Gw2IiIisNlsFBQU0Lx5c2y2IO9XodTFxPMMlScitT30yQESqryOB6p2\nzm0FXAZ8fm7odidgpTEmRUSqJmYvw2vCunXrRm5uLsXFxYSEhLBv3z69tFeWZGVl+W3W/4uWb7sx\nbQJ6GmO6AbnABOCOyjdF5AwQ5a7amM+B39aWPPFpeBe5kJAQIiIicDqdNG/e/Nxs9SFY70gfQkVH\nbCv73+9FHXdb3H+axTpsVHSMt8JqPVbPo/IYK5+X1e+j8pgFlvYPDw9n2rRp/PTTTyQlJfl9dqqL\nQuWM9D4gIk5jzH3AR+dKfV1EfjDGPAFkishKb8rVBGqR3W4nJiYGp9MJlOPdKBYrI3gmA59ZrONa\nwMo0e5cAZyzWEQmUWTwmzGI9kVg7D6g4Fyuf17V4N6LK2miyTp06sXr1aoYNG0Zm5oUbNdOnT3cv\ns7J9+3agYhnl8ePHk5WVRdeuXXn33Xdp27atxXgbKR93pBeRVcCqaj97vIZ9h3tSpl5TKBUkdBnl\nahrBhMqaQJUKErqMcjWNYEkPvYRXKog16WWUG8FY+CAPTynVpAV5r0G9hFcqiDXpZZQbwSW8JlCl\ngliTXka5ckJlT7YA0QSqVJDQZZQvwEezMfmL3gNVKkjUtIzyunXrGjiSIKEPkS52NrwbxWJlBI+N\nis7eVtio6FDuKTsVndatsFPRMd7qMVbqsXoelcdY+by8HVFl5XsP8ichwUoT6MXOhXfrFVkdKePF\nKKG2UvdulU4ZGGJhf4ANBm60eMxqi/VsMNbOAyrOxfJoJ29Gelldd0l5Jcj/9mgCVUoFJ22BKqWU\nl3RZY6WU8p7oJbxSSlknBlxBnqGCPDylVJOlCbTxOXHiBEVFRRw5cgQR4dz0/kqpBiYGnDZPx/oE\nZoUITaDVtG/fnmbNmnHmzBkKCwux2WycOHEi0GEp1eSIMbjsnqYoq5N7+4Ym0Auw2WxceumlnDhx\nApfLxZEjRygoKMBut2O32yksLDw3I71SniksLNSrGYsEQ5nN08EamkCDks1mo0+fPpw5cwan04nD\n4WD37t3nFpWzYb2TtNWRMl6OEjpl5ZfVXtFp3Qpjr+gYb/UYS/VYPY9zx1ge7WR1pJfVdZds7N27\nl9/85je6JpIFgsEZ5D3pNYFaUNkC7dev37kWqAt41WIpd2N5vSJvRuNMtHDMOwbesljHFAMZFo8Z\nbLGeKRbPAyrOxeooLK/WXbLyvd9N3759WbduXa1rIlW3ePFi/vrXv2KM4fLLL+eNN94gPDzIO0b6\nmCvIU5TOxqRUEMrNzWXJkiVkZmayfft2XC4X6enpgQ6rQQkGFzaPtkAJ7vSuVBPmdDopLi4mNDSU\noqIiYmNjAx1Sg6pMoMFMW6BKBaG4uDh++9vf0rlzZ2JiYoiMjOT6668PdFgNSjCUEubRFiiaQJUK\nQqdOnWLFihXs37+fQ4cOUVhYyLJlVtevb9wqWqB2j7ZA0QSqVBD65JNP6NatG9HR0YSGhjJu3Di+\n+eabQIfV4IL9HqgmUKWCUOfOncnIyKCoqAgRYd26dfTu3TvQYTUofYiklPJKcnIyqampDBgwALvd\nTv/+/Zk5c2agw2pQAtoPVCnlnYULF7Jw4cJAhxFAJuj7gQZ3dEHPRkXHeKvHWFyvyOpoHGOv6FDu\nqRB7Rad1K2z2io7xVlitx+p5ANY/L2/WXQrB2vce3K2oYCUYygL4hN0TmkDrxQW8YfGYaVhes8eb\n9YosjvjpJxssVfGdGcIrcqelY2aaty3V850Z4t0IKavrLnmz5pSl732axfIVNI5+oJpAlVJBScfC\nK6VUPQT7PVDtxqSUCkq+7sZkjBltjNlpjNljjJl3gffvMcZsM8Z8Z4z52hiTWFeZwZ3elVJNVuVQ\nTl8wxtiAl4BRQA6wyRizUkR2VNltuYi8fG7/FOB5YHRt5WoCVUoFJfFtN6YrgT0isg/AGJMO3Ay4\nE6iI5FfZP4KKrqi10gSqlApKFp/CRxljqk60+oqIvFLldRyQXeV1DpBcvRBjzGxgLhAGjKirUk2g\nSqmgZSGB5olIUi3vX6hz8M9amCLyEvCSMeYOYD4wpbZKNYFWU1xcjMPhIC8vD5fLhTEGh8MR6LCU\nanJ83I0pB0io8joeOFTL/unAX+oqVBNoNSJCeXk5J06coKysDBFh69atFBQUuPdZv349IhY7eKsm\nLSMjg9DQ0ECH0aj4+B7oJqCnMaYbkAtMAO6ouoMxpqeI7D738lfAbuqgCbSaFi1a0KxZM/eqnABX\nXnnleVOJXXXVVefWRLJhfZSJ1UXPvFjwzeqQSbutYtSPpSoMM83b1uKyWo/NiyGm3ixcZ3nRvhCs\nfe82Bg8ezM0332xpUbnTp0+TlpbG9u3bMcbw+uuvM2SIte+pMfPlUE4RcRpj7gM+ouIX93UR+cEY\n8wSQKSIrgfuMMSMBB3CKOi7fQRNoPbkAq5PcTsbaEqxhcKPF1u5qiwu+DTZeDctcYC0qFjhdluqZ\nad72buE6K5/XaoP1JXHDsPa9TwZgxYoVlhaVmzNnDqNHj+bvf/87ZWVlFBUVWYyzcfP1UE4RWQWs\nqvazx6v8e47VMrUjvVJBKD8/ny+//JIZM2YAEBYWRps2beo87rHHHuPFF190v3700UdZsmSJ3+L0\nNyc2j7ZA0QSqVBDat28f0dHRTJs2jf79+5OWlkZhYWGdx82YMYO33noLgPLyctLT05k0aZK/w/UL\nXdJDKeUVp9PJli1bmDVrFlu3biUiIoJnnnmmzuO6du1K+/bt2bp1Kx9//DH9+/enffv2DRCx7+mM\n9Eopr8THxxMfH09yckVf79TUVI8SKEBaWhpvvvkmR44cYfr06f4M0++CfTo7bYEqFYQ6depEQkIC\nO3fuBGDdunUkJtY5twUAY8eOZc2aNWzatIkbbrjBn2H6VTkhlNLMoy1QtAWqVJD685//zKRJkygr\nK6N79+688YZnkziHhYVx7bXX0qZNG2y24G7B1SXYW6CaQJUKUv369fO4y1NV5eXlZGRk8D//8z9+\niKrhNIYZ6fUSXqmLyI4dO+jRowfXXXcdPXv2DHQ49aYPkS5qNio7SXvODlZGVxj7uc7eFlhc8M2b\nUUUhYLkjveV6vFm4zvLnZfH7AKx/7w33C56YmMi+ffsarD5/0iU9LnoNsKic+H9RuXJdVM5aHbqo\nXIOoGMoZuAdEntAEqpQKSo3hHqgmUKVUUNJLeKWUqodgX5UzuKNTSjVZegmvlFJe0gSqlFJe8uWy\nxv6iCVQpFZR8vKSHXwR3dEGkvLwcl8tFeXk5O3fupLy8PNAhqUZk9+7d2O3662aVXsI3QiLCyZMn\nKS0txeVysX79eoqLi7Hb7YSEhNCuXTtcLhe6JpKuieQZG23btuWuu+6ytCZSU6f3QBuhEydOUFRU\nxJEjRwgJCSE0NJShQ4eyYcO/RtBER0efW1TOBbxqsYa7gV0W9r8E2locjXPKwEQLx7xjbeQSVIxe\n8mq9Iiv1TLF4HlBxLlY+r1MGa98HwCVY+97vJioqilWrVllaEwnA5XKRlJREXFwcH3zwgcU4G7fG\n0A9UJxOppn379kRERJCYmEhoaCghISEYY7EVpJSPvPjii/Tu3TvQYQSMLumhlPJKTk4OH374IWlp\naYEOJSDKCaGMMI+2QNFLeKWC1AMPPMCiRYs4e/ZsoEMJGL2EV0pZ9sEHH9ChQwcGDhwY6FACpjGs\nyqktUKXUeVj2AAAP60lEQVSC0Pr161m5ciWrVq2ipKSE/Px8Jk+ezLJlywIdWoNpDE/htQWqVBB6\n+umnycnJISsri/T0dEaMGNGkkmclnZFeKaW8UK5DOZVS9TV8+HCGDx8e6DACQIdyXuRsVHSMt3rM\nJRb2t5/r7G2BsVd0KPeU1ZFL4N16RVbrsXoegPXPy+r3ARV3vqx878F9Hy9YNYZ7oJpA68UFLLF4\nzP3AZxb2vxbLa/ZIpPXRON6su3SjxWNWe7FekTejsCx9XpFY+z6g4jux8r3fb7F8VUkTqFJKeUGH\nciqllJd83Q/UGDPaGLPTGLPHGDPvAu/PNcbsMMZ8b4xZZ4zpUleZ2gJVSgWlimWNffMU3hhjA14C\nRgE5wCZjzEoR2VFlt61AkogUGWNmAYuA8bWVqy1QpVRQEgyucptHmweuBPaIyD4RKQPSgZvPq0/k\nMxEpOvcyA4ivq1BtgSqlgpOA0+nxPdAoY0zVeQJfEZFXqryOA7KrvM4Bkmspbwawuq5KNYEqpYKS\niMHl9DhF5YlIUi3vX6hv2wW7eBhjJgNJwC/rqlQTqFIqKFUkUJ89hc8BEqq8jgcOVd/JGDMSeBT4\npYiU1lWoJlCLXC4Xp0+fPrekh1KeOXPmjE7MbZXgywS6CehpjOkG5AITgDuq7mCM6Q/8X2C0iBzz\npFBNoB5yOp2UlpZijCE3N/fconI2rHeStlHREdtT3qzZY3U0jhfrLhl7Rcd4q8dYXa/I6igsy5+X\n1e8DKp69WvnebRw6dIj7779f10SyQCSEspJmPipLnMaY+4CPqPjSXxeRH4wxTwCZIrIS+CPQEvif\nc3/sDopISm3lagKtg9PpZOPGjZSVlREeHo7NZqNPnz5V1kR61mKJDwNWZtWZjHcjZSyuu+TNaCfK\nLB4TZrGeSLxbr8jqSC+rsxxNxtr3/jC9e/dm7dq1Hq+JlJ2dzV133eVem2vmzJnMmTPHYpyNnAC+\na4EiIquAVdV+9niVf4+0WqYm0BqcOHGCwsJCQkJCGDBgAN9//32gQ1JNiN1u57nnnmPAgAGcPXuW\ngQMHMmrUKBITEwMdWsMR49ME6g+aQKs5e/YshYWF5OTk0Lx5c0JCQmjZsmWgw1JNTExMDDExMQC0\natWK3r17k5ub28QSKOAM7vvG2pG+mtDQUJo3b84VV1xBSIh+PCrwsrKy2Lp1K8nJtXVbvEg5PdwC\nRFug1YSHh2viVEGjoKCAW2+9lRdeeIHWrVsHOpyGVQ6UBDqI2mkCVSpIORwObr31ViZNmsS4ceMC\nHU7DE8AR6CBqpwlUqSAkIsyYMYPevXszd+7cQIcTGEJFR5cgpteqSgWh9evX8/bbb/Ppp5/Sr18/\n+vXrx6pVq+o+8GKj90CVUlYNGzYMEYuz8V9shIAmR09oAq0XGxUd460IoaIjtpU6rI6U8WLdJW9G\nO1meq9GbUUJW1yuy+nnZsPZ9QMV3aOV7D+6+jEFLE+jFzgUssHjMAqyOYvFu3aVXLex/N/CGxTqm\n4d0IHiv1TMPaeUDFuVhdr8ib0WQLLOxvZV/lpk/hlVKqHrQFqpRSXtBuTEop5aVG0I1JE6hSKjjp\nQySllPKSPkRSSql60BaoUkp5QS/hlVLKS40ggepYeAtcLhcFBQWsX7+ejIyMQIejGpGMjAyuvfZa\n95pIo0ePDnRIwa+yG5MnW4AYi+NtL/rBuSUlJWzYsIGhQ4fyzTffADBkyBC++OILHA4HzZs35+qr\nr8bpdBIV1ZHi4gKLNdiw1jfD6v7BWoc3x1wcdbRsGcnRoxUr6A4bNowtW7Z4dNyaNWuYM2cOLpeL\ntLQ05s2bZzHOgKvXdPImLkmYXff6UQA8ajbXsS68X+glfB1EhO3bt+NyuWjRogVQkWRLS0v5xz/e\nZ+DAgX6ru7y8nC1btpCU5L//FyLCli1b/HoeAJs3b/Z7HZmZmQwcONCvywdnZmbSv39/bDZr49vL\nyspYtWoVZ8+e9Wh/l8vF7NmzWbt2LfHx8QwaNIiUlJSmt6SHPoVvvMrLyykuLqZz587u//jGGL79\n9ltKSkoICwtj8+bNfqu/chllf9ZRXl5OaWmpX+sAKCoqIjMz06/JraysjI0bN2K3+++/tdPpZMOG\nDYSHh1s+l+eff57jx4/TuXNnEhMTa13WeOPGjfTo0YPu3bsDMGHCBFasWNH0EqjeA22cjh8/TlFR\nEeHh4cTHxyMiGGMoKyujpKSE8PBwQkNDMcb4ZXO5XIgIzZo181sdxhicTqdfz6Mht2bNmlFWVrHU\nsr/qCAsLw263U1paarmeRYsW0bNnTxwOh7tFXtO90NzcXBISEtyv4+Pjyc3N9f9//GDSCO6BagKt\nRkQoLS3lwIEDREREYLPZcLlc2Gw2SktLKSsro3nz5pYv4ayobBWGh4f7rY5KTqfTry22SsYYysvL\n/V6H3W7H4fDvb1RYWBg2m42SkhLLc3Y+++yzLFu2jNjYWLKzszl8+PAFk+iFyjUmuFeo9LnKoZye\nbAGiCbSa48ePIyLue2khISF8++23FBUV4XQ63Usd+4uIuFu4/v6FKS8vd7eO/C0kJKRBJggOCwvD\n4XD4va6wsDBCQkIoKbF+k84Yw+LFi92tygMHDvzsyXx8fDzZ2dnu1zk5OcTGxvok9kZFZ6RvXDp0\n6MDevXuBimR2xRVXsGPHDtq1a0f37t39nmx27dpFTEzMeZdv/nLgwAFCQ0Mb5Bez8vIzLi7O73Vl\nZ2fjcrno2rWr3+vat28fpaWl9OrVy/L/jS+++II9e/YwY8YM5syZw+TJ/5rYedCgQezevZv9+/cT\nFxdHeno6y5cv93X4wa0R3APVBFqNiLgv4wG++uorwsLCKC4u5sSJE36t2+l04nQ6CQ8P5/Dhw36t\nCyoe7DRv3pycnBy/1+V0OikvL2+w+3hFRUUcPXq0QVrXpaWlfP311zRr1syr4202Gw8++CAPPvgg\nV1xxBR999BF2u52lS5dyww034HK5mD59On369PFx5EGuEYyF136g1ZSWlpKRkeF+iFNeXu7X+51V\nNeQlNeC+t9sQKv8w+fP2R1WN7bOcN28eeXl5hIeH06JFC6Kiomp9St9I1K8faPsk4Vce9gN9W/uB\nBoVmzZrxy1/+MtBhqCZm48aNgQ4hOOklvFJKeUFnpFdKKS/pjPRKKeWlRvAQSfuBKhUk1qxZw6WX\nXkqPHj145plnfvZ+aWkp48ePp0ePHiQnJ5OVldXwQTYkH49EMsaMNsbsNMbsMcb8bGYWY8w1xpgt\nxhinMSbVkzI1gSoVBConD1m9ejU7duzgnXfeYceOHeft89prr9G2bVv27NnDb37zGx5++OEARduA\nfDQSyRhjA14CbgQSgYnGmOoTCxwEpgIed7jVS3ilgkDl5CG7du3ixhtvJC8vj7lz557XlWnFihVc\neumlJCYmYrPZ+Omnn8jKymqQAQMB4duO9FcCe0RkH4AxJh24GXD/lRKRrHPveTzmWFugSgWB3Nxc\n4uLi3K3QKVOmsHbtWjp37uy+nM/NzWXYsGFkZmaybds22rRpw+23344xhsxMD/tLNiaVCdSzoZxR\nxpjMKtvMaqXFAdlVXuec+1m9aAtUqSAgIhw/fpwePXrQpUsX/uu//ou+ffsybtw43nnnHVJSUhAR\nhg4d6p6XNjQ0lJ9++onk5OQAR+8n1rox5dXRkf5CnfrrPTBIW6BKBYH4+HgOHjxIQkICGzduJDIy\nkp49e7Jx40YOHTrE1VdfjcPhcE8w4nQ6OXbsGCkpKeTn53P77bfTp08f7rjjjgCfiQ8JUOrhVrcc\noOoEE/HAofqGqAlUqSAwaNAgjhw5wtmzZzlw4AB5eXlcccUVfPnll8ybN4/Bgwezf/9+rr/+ep55\n5hnuuOMOQkJCeOSRR8jOzuYPf/gDHTp0YNu2bfTt25dVq1YF+pTqz9olfF02AT2NMd2MMWHABGBl\nfUPUS3ilgoDdbuehhx7i8ccf5/PPP6d79+7k5ORgs9k4ePAgX3/9Nffddx8ff/wxjz32GE6nk/fe\ne4+33nqL2NhY3n33XW6//XZmzZrFjh07GDNmTOPv5uTDkUgi4jTG3Ad8RMWiVq+LyA/GmCeATBFZ\naYwZBLwHtAVuMsYsFJFaZ3DRyUSUChJOp5NLLrmEP/7xj7z88svs2rWLpKQkOnTowLp16+jUqRMb\nN27E4XAQFhZGx44dOXbsGGVlZYgIUVFRDB48mM2bN3Pq1Cm++uorBgwYEMhTqt9kIs2ShDgPH47t\nD8xkInoJr1SQqJzCbt68eXz++ef07duXyMhIli9fTlRUFFdffTWRkZEARERE0KZNG1q1akWbNm1Y\nsWIFdrudlStXcvbsWV566SVmzZoV4DOqJ99ewvuFJlClgsiYMWPYvXs3K1as4LvvviM9PZ0xY8aQ\nmJjIhg0buOqqq4iJiWHixIl89913jB07lqioKNatW+derO75559n0aJFnD59ukHmlfUrTaBKKavG\njBnD/v376dSpE6mpqRw4cIATJ05wzz334HA43KsI3HLLLSQnJ/Pxxx8TGhrK8ePHueWWWygpKaFD\nhw6NeyG6yrHwnmwBoglUqSBV/ZJ+5MiRdO3alRMnTtCqVSsAbrjhBtq3b8+BAwfYuHEj9957L8eO\nHXMvu92oF6JrBJfw+hBJqUZg1apVPPDAA5SUlFBaWsrRo0d5/PHHSUpKIiUlhR07djBixAjCwsJo\n164dixYt4t///d/5/PPPiYmJCVTY9XuIFJIkhHv4EKlYHyIppWowZswYdu3axZdffkl0dDQATzzx\nBCkpKQAkJiby2muv0adPH7Zu3Urr1q2JjIw8L3m+/PLL9OvXj379+tGtWzeuvfbagJyLxxrBuvDa\nAlWqkZg4cSKff/45eXl5dOzYkYULF+JwVGSPe+65BxHhvvvuY82aNbRo0YI33niDpKSfN8ocDgcj\nRozgoYce4qabbvJnyPVrgZokwXjYApXAtEA1gSrVxNx7771ER0ezcOFCf1dV/wSKp5Ok6KJySik/\ne/PNNzlw4ABLly4NdCgXBU2gSjURmzdv5k9/+hNfffVVgy0vfbHTBKpUE7F06VJOnjzpfniUlJTE\nX//61wBHVZvgX5ZT74EqpfylnvdABwis93DvFnoPVCml/iX4W6CaQJVSQaocKA50ELXSBKqUClLa\nAlVKqXoI4EB3D2gCVUoFKW2BKqWUl3y7MLw/aAJVSgUpbYEqpZSX9Cm8Ukp5SS/hlVLKS3oJr5RS\nXtIWqFJKeUlboEop5SVBHyIppZRXtAWqlFJe0nugSinlJW2BKqWUl7QFqpRSXtIWqFJKeUmHciql\nlJf0El4ppbwU/JfwVlflVEqpBmGMWQNEebh7noiM9mc8F6IJVCmlvBQS6ACUUqqx0gSqlFJe0gSq\nlFJe0gSqlFJe0gSqlFJe0gSqlFJe0gSqlFJe0gSqlFJe0gSqlFJe+v8ADB+HEnvoYQAAAABJRU5E\nrkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -125,7 +125,7 @@ } ], "source": [ - "problem = darcy.Darcy(g, d)\n", + "problem = elliptic.Elliptic(g, d)\n", "p = problem.solve()\n", "plot_grid(g, p)" ] @@ -161,12 +161,14 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ - "class MatrixDomain(darcy.DarcyData):\n", + "class MatrixDomain(elliptic.EllipticData):\n", " def __init__(self, g, d):\n", - " darcy.DarcyData.__init__(self, g, d)\n", + " elliptic.EllipticData.__init__(self, g, d)\n", "\n", " def bc(self):\n", " dir_bound = np.ravel(np.argwhere((self.grid().has_face_tag(FaceTag.DOMAIN_BOUNDARY))))\n", @@ -212,9 +214,9 @@ "outputs": [ { "data": { - "image/png": "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\nYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -223,7 +225,7 @@ ], "source": [ "assign_darcy_data(gb)\n", - "problem = darcy.Darcy(gb)\n", + "problem = elliptic.Elliptic(gb)\n", "problem.solve()\n", "problem.split('pressure')\n", "plot_grid(gb, 'pressure')" @@ -246,9 +248,9 @@ "outputs": [], "source": [ "from porepy.numerics.fv import mpfa\n", - "class DarcyMPFA(darcy.Darcy):\n", + "class DarcyMPFA(elliptic.Elliptic):\n", " def __init__(self, gb):\n", - " darcy.Darcy.__init__(self, gb)\n", + " elliptic.Elliptic.__init__(self, gb)\n", " \n", " def flux_disc(self):\n", " return mpfa.MpfaMultiDim()" @@ -261,9 +263,9 @@ "outputs": [ { "data": { - "image/png": "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\nYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, From 4f9aad347061a5f235abd8a42ead8a0f09ac85d6 Mon Sep 17 00:00:00 2001 From: Eirik Keilegavlen Date: Mon, 23 Oct 2017 13:51:27 +0200 Subject: [PATCH 52/53] Workaround for cell-face mapping issue related to gmsh. Allow for a keyword to be passed to the simplex meshing algorithm so that an assertion that cells in lower dimension corresponds to a face in higher dimension is *not* made. This is a workaround, but not a solution, to #43. --- src/porepy/fracs/meshing.py | 40 +++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/porepy/fracs/meshing.py b/src/porepy/fracs/meshing.py index f6c626507c..f4a85dcb88 100644 --- a/src/porepy/fracs/meshing.py +++ b/src/porepy/fracs/meshing.py @@ -8,6 +8,7 @@ """ import numpy as np import scipy.sparse as sps +import warnings from porepy.fracs import structured, simplex, split_grid from porepy.grids.grid_bucket import GridBucket @@ -20,6 +21,14 @@ def simplex_grid(fracs, domain, **kwargs): Main function for grid generation. Creates a fractured simiplex grid in 2 or 3 dimensions. + NOTE: For some fracture networks, what appears to be a bug in Gmsh leads to + surface grids with cells that does not have a corresponding face in the 3d + grid. The problem may have been resolved (at least partly) by newer + versions of Gmsh, but can still be an issue for our purposes. If this + behavior is detected, an assertion error is raised. To avoid the issue, + and go on with a surface mesh that likely is problematic, kwargs should + contain a keyword ensure_matching_face_cell=False. + Parameters ---------- fracs (list of np.ndarray): One list item for each fracture. Each item @@ -78,7 +87,7 @@ def simplex_grid(fracs, domain, **kwargs): tag_faces(grids) # Assemble grids in a bucket - gb = assemble_in_bucket(grids) + gb = assemble_in_bucket(grids, **kwargs) gb.compute_geometry() # Split the grids. split_grid.split_fractures(gb, **kwargs) @@ -272,7 +281,7 @@ def nodes_per_face(g): return n_per_face -def assemble_in_bucket(grids): +def assemble_in_bucket(grids, **kwargs): """ Create a GridBucket from a list of grids. Parameters @@ -308,7 +317,7 @@ def assemble_in_bucket(grids): for lg in grids[dim + 1]: cell_2_face, cell = obtain_interdim_mappings( - lg, fn, n_per_face) + lg, fn, n_per_face, **kwargs) face_cells = sps.csc_matrix( (np.array([True] * cell.size), (cell, cell_2_face)), (lg.num_cells, hg.num_faces)) @@ -320,10 +329,20 @@ def assemble_in_bucket(grids): return bucket -def obtain_interdim_mappings(lg, fn, n_per_face): +def obtain_interdim_mappings(lg, fn, n_per_face, + ensure_matching_face_cell=True, **kwargs): """ Find mappings between faces in higher dimension and cells in the lower dimension + + Parameters: + lg: Lower dimensional grid. + fn: Higher dimensional face-node relation. + n_per_face: Number of nodes per face in the higher-dimensional grid. + ensure_matching_face_cell: Boolean, defaults to True. If True, an + assertion is made that all lower-dimensional cells corresponds to a + higher dimensional cell. + """ if lg.dim > 0: cn_loc = lg.cell_nodes().indices.reshape((n_per_face, @@ -342,9 +361,14 @@ def obtain_interdim_mappings(lg, fn, n_per_face): # An element in cell_2_face gives, for all cells in the # lower-dimensional grid, the index of the corresponding face # in the higher-dimensional structure. - assert np.all(is_mem) or np.all(~is_mem),\ - '''Either all cells should have a corresponding face in a higher dim grid - or no cells should have a corresponding face in a higher dim grid. This - might be a problem with gmsh or how we read the gmsh output, not sure.. ''' + if not (np.all(is_mem) or np.all(~is_mem)): + if ensure_matching_face_cell: + raise ValueError( + '''Either all cells should have a corresponding face in a higher + dim grid or no cells should have a corresponding face in a higher + dim grid. This likely is related to gmsh behavior. ''') + else: + warnings.warn('''Found inconsistency between cells and higher + dimensional faces. Continuing, faces crossed''') low_dim_cell = np.where(is_mem)[0] return cell_2_face, low_dim_cell From f2aa6b044a213af87912ba1ceac47ad2bd831ab8 Mon Sep 17 00:00:00 2001 From: Runar Date: Tue, 24 Oct 2017 13:12:35 +0200 Subject: [PATCH 53/53] Parabolic and eliptic now uses Parameter class default variables for non-physics objects. E.g., Parameters.aperture is not overwritten. If we have a coupled Parabolic and Eliptic problem, we can now define the aperture in one of the problems and this aperture is then used of both. Before this fix, the Object defined last decided the aperture --- src/porepy/numerics/elliptic.py | 15 +++++++++++---- src/porepy/numerics/parabolic.py | 17 +++++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/porepy/numerics/elliptic.py b/src/porepy/numerics/elliptic.py index 40433e0086..407e3fad45 100644 --- a/src/porepy/numerics/elliptic.py +++ b/src/porepy/numerics/elliptic.py @@ -175,10 +175,14 @@ def bc_val(self): return np.zeros(self.grid().num_faces) def porosity(self): - return np.ones(self.grid().num_cells) + '''Returns apperture of each cell. If None is returned, default + Parameter class value is used''' + return None def aperture(self): - return np.ones(self.grid().num_cells) + '''Returns apperture of each cell. If None is returned, default + Parameter class value is used''' + return None def permeability(self): kxx = np.ones(self.grid().num_cells) @@ -197,8 +201,11 @@ def _set_data(self): if 'param' not in self._data: self._data['param'] = Parameters(self.grid()) self._data['param'].set_tensor(self.physics, self.permeability()) - self._data['param'].set_porosity(self.porosity()) self._data['param'].set_bc(self.physics, self.bc()) self._data['param'].set_bc_val(self.physics, self.bc_val()) self._data['param'].set_source(self.physics, self.source()) - self._data['param'].set_aperture(self.aperture()) + + if self.porosity() is not None: + self._data['param'].set_porosity(self.porosity()) + if self.aperture() is not None: + self._data['param'].set_aperture(self.aperture()) diff --git a/src/porepy/numerics/parabolic.py b/src/porepy/numerics/parabolic.py index 3d36511c04..bc7fad65bb 100644 --- a/src/porepy/numerics/parabolic.py +++ b/src/porepy/numerics/parabolic.py @@ -235,8 +235,9 @@ def source(self, t): return np.zeros(self.grid().num_cells) def porosity(self): - 'Returns porosity' - return np.ones(self.grid().num_cells) + '''Returns apperture of each cell. If None is returned, default + Parameter class value is used''' + return None def diffusivity(self): 'Returns diffusivity tensor' @@ -244,8 +245,9 @@ def diffusivity(self): return tensor.SecondOrder(self.grid().dim, kxx) def aperture(self): - 'Returns apperture of each cell' - return np.ones(self.grid().num_cells) + '''Returns apperture of each cell. If None is returned, default + Parameter class value is used''' + return None def data(self): 'Returns data dictionary' @@ -262,8 +264,11 @@ def _set_data(self): if 'param' not in self._data: self._data['param'] = Parameters(self.grid()) self._data['param'].set_tensor(self.physics, self.diffusivity()) - self._data['param'].set_porosity(self.porosity()) self._data['param'].set_bc(self.physics, self.bc()) self._data['param'].set_bc_val(self.physics, self.bc_val(0.0)) self._data['param'].set_source(self.physics, self.source(0.0)) - self._data['param'].set_aperture(self.aperture()) + + if self.porosity() is not None: + self._data['param'].set_porosity(self.porosity()) + if self.aperture() is not None: + self._data['param'].set_aperture(self.aperture())