From 9969424425d83c4f03f4158a0a07c6f6e66c9b17 Mon Sep 17 00:00:00 2001 From: Mike McKague Date: Thu, 26 Oct 2023 16:10:52 -0400 Subject: [PATCH 1/7] write unit tests to check conductance shape --- .../unit/models/physics/DiffusiveConductanceTest.py | 10 ++++++++++ .../unit/models/physics/ElectricalConductanceTest.py | 10 ++++++++++ .../unit/models/physics/HydraulicConductanceTest.py | 12 +++++++++++- tests/unit/models/physics/ThermalConductanceTest.py | 11 +++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/tests/unit/models/physics/DiffusiveConductanceTest.py b/tests/unit/models/physics/DiffusiveConductanceTest.py index 5a114bc0db..f32bbc9046 100644 --- a/tests/unit/models/physics/DiffusiveConductanceTest.py +++ b/tests/unit/models/physics/DiffusiveConductanceTest.py @@ -1,6 +1,7 @@ import numpy as np import openpnm as op from numpy.testing import assert_allclose +import openpnm.models.physics.diffusive_conductance as diffusive_conductance class DiffusiveConductanceTest: @@ -120,6 +121,15 @@ def test_taylor_aris_diffusion(self): desired = np.array([0.121193, 0.126131, 0.118578]) assert_allclose(actual, desired, rtol=1e-5) + def test_conductance_shape(self): + available_models = [ + getattr(diffusive_conductance, model_name) + for model_name in dir(diffusive_conductance) + if callable(getattr(diffusive_conductance, model_name)) + ] + for model in available_models: + G = model(phase=self.phase) + assert_allclose(G.shape, (self.net.Nt, 2), rtol=0) if __name__ == '__main__': diff --git a/tests/unit/models/physics/ElectricalConductanceTest.py b/tests/unit/models/physics/ElectricalConductanceTest.py index 9420f1c7c1..4ee698d626 100644 --- a/tests/unit/models/physics/ElectricalConductanceTest.py +++ b/tests/unit/models/physics/ElectricalConductanceTest.py @@ -1,5 +1,6 @@ import numpy as np from numpy.testing import assert_allclose +import openpnm.models.physics.electrical_conductance as electrical_conductance import openpnm as op @@ -29,6 +30,15 @@ def test_series_resistors(self): actual = np.mean(self.phase['throat.electrical_conductance']) assert_allclose(actual, desired=0.091205, rtol=1e-5) + def test_conductance_shape(self): + available_models = [ + getattr(electrical_conductance, model_name) + for model_name in dir(electrical_conductance) + if callable(getattr(electrical_conductance, model_name)) + ] + for model in available_models: + G = model(phase=self.phase) + assert_allclose(G.shape, (self.net.Nt, 2), rtol=0) if __name__ == '__main__': diff --git a/tests/unit/models/physics/HydraulicConductanceTest.py b/tests/unit/models/physics/HydraulicConductanceTest.py index 21a9a58d5b..79d8ae8135 100644 --- a/tests/unit/models/physics/HydraulicConductanceTest.py +++ b/tests/unit/models/physics/HydraulicConductanceTest.py @@ -1,6 +1,7 @@ import openpnm as op import numpy as np from numpy.testing import assert_allclose +import openpnm.models.physics.hydraulic_conductance as hydraulic_conductance class HydraulicConductanceTest: @@ -53,7 +54,16 @@ def test_valvatne_blunt(self): actual = self.phase['throat.valvatne_conductance'].mean() desired = 6198.347107 assert_allclose(actual, desired=desired) - + + def test_conductance_shape(self): + available_models = [ + getattr(hydraulic_conductance, model_name) + for model_name in dir(hydraulic_conductance) + if callable(getattr(hydraulic_conductance, model_name)) + ] + for model in available_models: + G = model(phase=self.phase) + assert_allclose(G.shape, (self.net.Nt, 2), rtol=0) if __name__ == '__main__': diff --git a/tests/unit/models/physics/ThermalConductanceTest.py b/tests/unit/models/physics/ThermalConductanceTest.py index 858abe1dae..df050f87dc 100644 --- a/tests/unit/models/physics/ThermalConductanceTest.py +++ b/tests/unit/models/physics/ThermalConductanceTest.py @@ -1,5 +1,6 @@ import numpy as np from numpy.testing import assert_allclose +import openpnm.models.physics.thermal_conductance as thermal_conductance import openpnm as op @@ -28,6 +29,16 @@ def test_series_resistors(self): actual = self.phase['throat.thermal_conductance'].mean() desired = 1 / (1/(0.4*0.5) + 1/(0.2*0.5) + 1/(0.3*0.5)) assert_allclose(actual, desired) + + def test_conductance_shape(self): + available_models = [ + getattr(thermal_conductance, model_name) + for model_name in dir(thermal_conductance) + if callable(getattr(thermal_conductance, model_name)) + ] + for model in available_models: + G = model(phase=self.phase) + assert_allclose(G.shape, (self.net.Nt, 2), rtol=0) if __name__ == '__main__': From 3fd92ca8848188a68b043493261a8d809884fe15 Mon Sep 17 00:00:00 2001 From: Mike McKague Date: Thu, 26 Oct 2023 16:12:34 -0400 Subject: [PATCH 2/7] ensure _poission_conductance returns shape of Nt by 2 --- openpnm/models/physics/_utils.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openpnm/models/physics/_utils.py b/openpnm/models/physics/_utils.py index 80ff7a3f9f..5b2ba7b2b3 100644 --- a/openpnm/models/physics/_utils.py +++ b/openpnm/models/physics/_utils.py @@ -54,11 +54,12 @@ def _poisson_conductance(phase, g1 = D1 * F1 gt = Dt * Ft g2 = D2 * F2 - return 1 / (1 / g1 + 1 / gt + 1 / g2) + G = 1 / (1 / g1 + 1 / gt + 1 / g2) else: # Otherwise, i.e., the size factor for the entire conduit is only known F = network[size_factors] - return Dt * F + G = Dt * F + return vstack((G, G)).T def _get_key_props(phase=None, From b771d077b53c4cdb1941bafa6b72e2e68c478ec4 Mon Sep 17 00:00:00 2001 From: Mike McKague Date: Thu, 26 Oct 2023 16:13:00 -0400 Subject: [PATCH 3/7] ensure hydraulic conductance models return array of shape Nt by 2 --- openpnm/models/physics/hydraulic_conductance/_funcs.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openpnm/models/physics/hydraulic_conductance/_funcs.py b/openpnm/models/physics/hydraulic_conductance/_funcs.py index f13ec78424..64ba404e13 100644 --- a/openpnm/models/physics/hydraulic_conductance/_funcs.py +++ b/openpnm/models/physics/hydraulic_conductance/_funcs.py @@ -50,7 +50,8 @@ def generic_hydraulic( g1 = F1 / mu1 gt = Ft / mut g2 = F2 / mu2 - return 1 / (1/g1 + 1/gt + 1/g2) + G = 1 / (1/g1 + 1/gt + 1/g2) + return _np.vstack((G, G)).T @_doctxt @@ -203,4 +204,5 @@ def valvatne_blunt( gt = kt * At**2 * Gt / mu_t value = L1 / gp[conns[:, 0]] + Lt / gt + L2 / gp[conns[:, 1]] - return 1 / value + G = 1 / value + return _np.vstack((G, G)).T From 9ef473f18f1113bff0ede72081ef7bbd239d744f Mon Sep 17 00:00:00 2001 From: Mike McKague Date: Thu, 26 Oct 2023 16:14:04 -0400 Subject: [PATCH 4/7] ensure taylor aris conductance returns Nt by 2 array --- openpnm/models/physics/diffusive_conductance/_funcs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpnm/models/physics/diffusive_conductance/_funcs.py b/openpnm/models/physics/diffusive_conductance/_funcs.py index 37f3b623c5..4a76e0fafb 100644 --- a/openpnm/models/physics/diffusive_conductance/_funcs.py +++ b/openpnm/models/physics/diffusive_conductance/_funcs.py @@ -193,4 +193,4 @@ def taylor_aris_diffusion(phase, gtot = 1 / (1/g1 + 1/gt + 1/g2) else: gtot = Dt * (1 + Pet**2 / 192) * F - return gtot + return _np.vstack((gtot, gtot)).T From 9569b2f96d160b6c951380c68a661ffd6b3499a9 Mon Sep 17 00:00:00 2001 From: Mike McKague Date: Fri, 27 Oct 2023 14:18:01 -0400 Subject: [PATCH 5/7] Fixed bug with ad_dif_conductance assuming gh is Nt by 1 --- openpnm/models/physics/ad_dif_conductance/_funcs.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openpnm/models/physics/ad_dif_conductance/_funcs.py b/openpnm/models/physics/ad_dif_conductance/_funcs.py index dda067e16d..3f3e158b34 100644 --- a/openpnm/models/physics/ad_dif_conductance/_funcs.py +++ b/openpnm/models/physics/ad_dif_conductance/_funcs.py @@ -61,6 +61,9 @@ def ad_dif( else: raise Exception(f"Shape of {throat_diffusive_conductance} must either" r" be (Nt,1) or (Nt,2)") + # Special treatment when gh is not Nt by 1 + if gh.size == 2 * network.Nt: + gh = gh[:, 0] # assumes hydraulic conductance is symmetric Qij = -gh * _np.diff(P[cn], axis=1).squeeze() Qij = _np.append(Qij, -Qij) From fd172f7f1d1628d9ccc52850d1de6f6310cb94d9 Mon Sep 17 00:00:00 2001 From: Mike McKague Date: Fri, 27 Oct 2023 14:39:40 -0400 Subject: [PATCH 6/7] fixed set_outflow_BC for case where gh is Nt by 2 --- openpnm/algorithms/_advection_diffusion.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openpnm/algorithms/_advection_diffusion.py b/openpnm/algorithms/_advection_diffusion.py index f3f177c250..f31c3b1cc9 100644 --- a/openpnm/algorithms/_advection_diffusion.py +++ b/openpnm/algorithms/_advection_diffusion.py @@ -81,6 +81,9 @@ def set_outflow_BC(self, pores, mode='add'): C12 = network.conns[throats] P12 = phase[self.settings['pressure']][C12] gh = phase[self.settings['hydraulic_conductance']][throats] + # Special treatment when gh is not Nt by 1 + if gh.size == 2 * len(throats): + gh = gh[:, 0] # assumes hydraulic conductance is symmetric Q12 = -gh * np.diff(P12, axis=1).squeeze() Qp = np.zeros(self.Np) np.add.at(Qp, C12[:, 0], -Q12) From e2ec2b0b8eb0a18bb4a2edad7d345f1f0c068772 Mon Sep 17 00:00:00 2001 From: Mike McKague Date: Fri, 27 Oct 2023 15:02:08 -0400 Subject: [PATCH 7/7] fixed simulating transport notebook so hardcoded gh is Nt by 2 --- .../tutorials/08_simulating_transport.ipynb | 508 +++++++++++------- 1 file changed, 315 insertions(+), 193 deletions(-) diff --git a/examples/tutorials/08_simulating_transport.ipynb b/examples/tutorials/08_simulating_transport.ipynb index e5f9daa834..7efe91c3c5 100644 --- a/examples/tutorials/08_simulating_transport.ipynb +++ b/examples/tutorials/08_simulating_transport.ipynb @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "94917bac", "metadata": {}, "outputs": [ @@ -31,40 +31,156 @@ "name": "stdout", "output_type": "stream", "text": [ + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan]\n", + "[[nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]]\n", + "[[nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]\n", + " [nan nan nan]]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan]\n", + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan]\n", "\n", "══════════════════════════════════════════════════════════════════════════════\n", - "net : \n", + "net : \n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Properties Valid Values\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.coordination_number 25 / 25\n", " 2 pore.coords 25 / 25\n", - " 3 pore.diameter 25 / 25\n", - " 4 pore.max_size 25 / 25\n", - " 5 pore.seed 25 / 25\n", - " 6 pore.volume 25 / 25\n", - " 7 throat.conns 40 / 40\n", - " 8 throat.cross_sectional_area 40 / 40\n", - " 9 throat.diameter 40 / 40\n", - " 10 throat.diffusive_size_factors 40 / 40\n", - " 11 throat.hydraulic_size_factors 40 / 40\n", - " 12 throat.length 40 / 40\n", - " 13 throat.lens_volume 40 / 40\n", - " 14 throat.max_size 40 / 40\n", - " 15 throat.spacing 40 / 40\n", + " 3 throat.conns 40 / 40\n", + " 4 pore.coordination_number 25 / 25\n", + " 5 pore.max_size 25 / 25\n", + " 6 throat.spacing 40 / 40\n", + " 7 pore.seed 25 / 25\n", + " 8 pore.diameter 25 / 25\n", + " 9 throat.max_size 40 / 40\n", + " 10 throat.diameter 40 / 40\n", + " 11 throat.cross_sectional_area 40 / 40\n", + " 12 throat.hydraulic_size_factors 40 / 40\n", + " 13 throat.diffusive_size_factors 40 / 40\n", + " 14 throat.lens_volume 40 / 40\n", + " 15 throat.length 40 / 40\n", " 16 throat.total_volume 40 / 40\n", " 17 throat.volume 40 / 40\n", + " 18 pore.volume 25 / 25\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Labels Assigned Locations\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.back 5\n", - " 2 pore.domain_1 25\n", - " 3 pore.front 5\n", - " 4 pore.left 5\n", - " 5 pore.right 5\n", + " 2 pore.xmin 5\n", + " 3 pore.xmax 5\n", + " 4 pore.ymin 5\n", + " 5 pore.ymax 5\n", " 6 pore.surface 16\n", - " 7 throat.domain_1 40\n", - " 8 throat.surface 16\n", + " 7 throat.surface 16\n", + " 8 pore.left 5\n", + " 9 pore.right 5\n", + " 10 pore.front 5\n", + " 11 pore.back 5\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n" ] } @@ -90,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "b5e3a75a", "metadata": {}, "outputs": [], @@ -108,7 +224,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "029d1797", "metadata": {}, "outputs": [ @@ -116,20 +232,22 @@ "name": "stdout", "output_type": "stream", "text": [ + "[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n", + " nan nan nan nan nan nan nan]\n", "\n", "══════════════════════════════════════════════════════════════════════════════\n", - "phase_01 : \n", + "phase_01 : \n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Properties Valid Values\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.pressure 25 / 25\n", " 2 pore.temperature 25 / 25\n", - " 3 pore.viscosity 25 / 25\n", + " 3 pore.pressure 25 / 25\n", + " 4 pore.viscosity 25 / 25\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Labels Assigned Locations\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.all 25\n", - " 2 throat.all 40\n", + " 2 pore.all 25\n", + " 3 throat.all 40\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n" ] } @@ -150,7 +268,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "8833d1ee", "metadata": {}, "outputs": [ @@ -192,7 +310,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "647bde31", "metadata": {}, "outputs": [ @@ -200,16 +318,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "[1.00220815e-15 1.05133682e-15 2.65744048e-15 2.69017014e-15\n", - " 9.59190878e-15 1.36708286e-14 6.66830487e-14 7.08737841e-14\n", - " 1.99903177e-15 2.00595117e-15 4.79376978e-15 4.31484439e-15\n", - " 3.19680625e-15 2.81277856e-15 5.16906031e-15 4.79857420e-15\n", - " 8.55176371e-15 1.52083335e-15 1.23450963e-15 2.47324217e-15\n", - " 9.86091431e-15 9.79143235e-16 3.16100872e-14 2.89691924e-15\n", - " 3.71177597e-14 1.01109214e-14 1.90884769e-15 2.45494330e-14\n", - " 5.38067275e-15 7.13185895e-15 2.56325956e-14 1.72969382e-15\n", - " 2.28431461e-14 4.24865495e-15 5.99267859e-15 9.64675766e-15\n", - " 2.86021000e-15 1.49648281e-15 2.35465588e-15 9.68639559e-15]\n" + "[9.20427152e-15 7.35551641e-15 1.43782360e-14 2.21592040e-14\n", + " 8.58410110e-15 1.82497731e-15 1.19043989e-15 1.35431656e-15\n", + " 1.24601001e-14 6.51791879e-15 8.29384384e-15 1.27944400e-14\n", + " 4.06680462e-15 4.35974347e-15 1.54483860e-15 1.48004403e-15\n", + " 5.12411085e-16 5.13533658e-16 7.51257701e-16 1.92035129e-15\n", + " 4.10880926e-14 7.00911817e-15 1.90538445e-15 1.39900879e-15\n", + " 1.52488506e-14 1.90114657e-14 7.77942911e-15 1.80259133e-15\n", + " 1.65935565e-15 1.01188512e-14 4.51169949e-15 4.64142945e-15\n", + " 5.11569304e-15 2.03743977e-15 2.55209825e-15 7.44866870e-16\n", + " 5.56731901e-16 7.98229431e-16 1.44963284e-15 2.88211959e-15]\n" ] } ], @@ -233,7 +351,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "d4544d8b", "metadata": {}, "outputs": [ @@ -250,7 +368,7 @@ " 0.00089319, 0.00089319, 0.00089319, 0.00089319, 0.00089319])" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -261,7 +379,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "cf30019f", "metadata": {}, "outputs": [ @@ -278,7 +396,7 @@ " 0.00089319, 0.00089319, 0.00089319, 0.00089319, 0.00089319])" ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -299,7 +417,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "29b8bf9d", "metadata": {}, "outputs": [ @@ -309,17 +427,17 @@ "text": [ "\n", "══════════════════════════════════════════════════════════════════════════════\n", - "stokes_01 : \n", + "stokes_01 : \n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Properties Valid Values\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.bc.rate 0 / 25\n", - " 2 pore.bc.value 0 / 25\n", + " 2 pore.bc.rate 0 / 25\n", + " 3 pore.bc.value 0 / 25\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Labels Assigned Locations\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.all 25\n", - " 2 throat.all 40\n", + " 2 pore.all 25\n", + " 3 throat.all 40\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n" ] } @@ -341,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "3caad7c7", "metadata": {}, "outputs": [ @@ -351,17 +469,17 @@ "text": [ "\n", "══════════════════════════════════════════════════════════════════════════════\n", - "stokes_01 : \n", + "stokes_01 : \n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Properties Valid Values\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.bc.rate 5 / 25\n", - " 2 pore.bc.value 5 / 25\n", + " 2 pore.bc.rate 5 / 25\n", + " 3 pore.bc.value 5 / 25\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Labels Assigned Locations\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.all 25\n", - " 2 throat.all 40\n", + " 2 pore.all 25\n", + " 3 throat.all 40\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n" ] } @@ -384,7 +502,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "f14cea28", "metadata": {}, "outputs": [ @@ -410,18 +528,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "732f855a", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], + "outputs": [], "source": [ "soln = sf.run()" ] @@ -436,7 +546,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "cf47340a", "metadata": {}, "outputs": [ @@ -444,15 +554,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'pore.pressure': SteadyStateSolution([100000. , 100000. , 100000. ,\n", - " 100000. , 100000. , 111994.91786881,\n", - " 109021.80858086, 106007.58742924, 105515.18852917,\n", - " 104499.41168208, 126513.73814012, 120297.06671979,\n", - " 113401.97906307, 115761.92671225, 117822.18393838,\n", - " 132725.59341895, 133551.80327216, 120247.96545073,\n", - " 129309.20272742, 135160.97831439, 148957.44526658,\n", - " 155574.17873369, 168444.33285769, 161719.71531674,\n", - " 148786.89313432])}\n" + "None\n" ] } ], @@ -470,7 +572,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "520819ef", "metadata": {}, "outputs": [ @@ -480,19 +582,19 @@ "text": [ "\n", "══════════════════════════════════════════════════════════════════════════════\n", - "stokes_01 : \n", + "stokes_01 : \n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Properties Valid Values\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.bc.rate 5 / 25\n", - " 2 pore.bc.value 5 / 25\n", - " 3 pore.initial_guess 25 / 25\n", + " 2 pore.bc.rate 5 / 25\n", + " 3 pore.bc.value 5 / 25\n", " 4 pore.pressure 25 / 25\n", + " 5 pore.initial_guess 25 / 25\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Labels Assigned Locations\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.all 25\n", - " 2 throat.all 40\n", + " 2 pore.all 25\n", + " 3 throat.all 40\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n" ] } @@ -511,18 +613,18 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "16a3d0d8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([148957.44526658, 155574.17873369, 168444.33285769, 161719.71531674,\n", - " 148786.89313432])" + "array([280656.65723169, 289505.00671955, 262927.51216542, 232882.04746342,\n", + " 218303.41912755])" ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -560,7 +662,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "322b2746", "metadata": {}, "outputs": [ @@ -570,38 +672,40 @@ "text": [ "\n", "══════════════════════════════════════════════════════════════════════════════\n", - "net : \n", + "net : \n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Properties Valid Values\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.coordination_number 25 / 25\n", " 2 pore.coords 25 / 25\n", - " 3 pore.diameter 25 / 25\n", - " 4 pore.max_size 25 / 25\n", - " 5 pore.seed 25 / 25\n", - " 6 pore.volume 25 / 25\n", - " 7 throat.conns 40 / 40\n", - " 8 throat.cross_sectional_area 40 / 40\n", - " 9 throat.diameter 40 / 40\n", - " 10 throat.diffusive_size_factors 40 / 40\n", - " 11 throat.hydraulic_size_factors 40 / 40\n", - " 12 throat.length 40 / 40\n", - " 13 throat.lens_volume 40 / 40\n", - " 14 throat.max_size 40 / 40\n", - " 15 throat.spacing 40 / 40\n", + " 3 throat.conns 40 / 40\n", + " 4 pore.coordination_number 25 / 25\n", + " 5 pore.max_size 25 / 25\n", + " 6 throat.spacing 40 / 40\n", + " 7 pore.seed 25 / 25\n", + " 8 pore.diameter 25 / 25\n", + " 9 throat.max_size 40 / 40\n", + " 10 throat.diameter 40 / 40\n", + " 11 throat.cross_sectional_area 40 / 40\n", + " 12 throat.hydraulic_size_factors 40 / 40\n", + " 13 throat.diffusive_size_factors 40 / 40\n", + " 14 throat.lens_volume 40 / 40\n", + " 15 throat.length 40 / 40\n", " 16 throat.total_volume 40 / 40\n", " 17 throat.volume 40 / 40\n", + " 18 pore.volume 25 / 25\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", " # Labels Assigned Locations\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - " 1 pore.back 5\n", - " 2 pore.domain_1 25\n", - " 3 pore.front 5\n", - " 4 pore.left 5\n", - " 5 pore.right 5\n", + " 2 pore.xmin 5\n", + " 3 pore.xmax 5\n", + " 4 pore.ymin 5\n", + " 5 pore.ymax 5\n", " 6 pore.surface 16\n", - " 7 throat.domain_1 40\n", - " 8 throat.surface 16\n", + " 7 throat.surface 16\n", + " 8 pore.left 5\n", + " 9 pore.right 5\n", + " 10 pore.front 5\n", + " 11 pore.back 5\n", "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n" ] } @@ -626,56 +730,56 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "65e69a58", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[7.17224268e-17, 8.95163251e-19, 3.41740957e-17],\n", - " [3.41740957e-17, 9.39044534e-19, 8.24868939e-17],\n", - " [1.25531646e-16, 2.37360178e-18, 6.67669730e-17],\n", - " [6.67669730e-17, 2.40283561e-18, 1.29499002e-16],\n", - " [1.77366727e-16, 8.56740609e-18, 1.85484559e-16],\n", - " [2.00896764e-16, 1.22106603e-17, 3.02192896e-16],\n", - " [6.01031396e-16, 5.95606954e-17, 6.03870375e-16],\n", - " [6.09032656e-16, 6.33038224e-17, 6.44196320e-16],\n", - " [1.03665992e-16, 1.78551708e-18, 5.54807336e-17],\n", - " [5.54807336e-17, 1.79169742e-18, 1.04696234e-16],\n", - " [1.54582938e-16, 4.28175177e-18, 1.03819232e-16],\n", - " [1.03819232e-16, 3.85397995e-18, 1.10662774e-16],\n", - " [1.74675531e-16, 2.85535840e-18, 6.83639178e-17],\n", - " [6.83639178e-17, 2.51234835e-18, 1.35228170e-16],\n", - " [1.77395616e-16, 4.61695788e-18, 1.05679867e-16],\n", - " [1.05679867e-16, 4.28604303e-18, 1.46233002e-16],\n", - " [1.49269368e-16, 7.63835793e-18, 2.28705429e-16],\n", - " [1.05688678e-16, 1.35839458e-18, 4.33964312e-17],\n", - " [4.33964312e-17, 1.10265282e-18, 5.10502986e-17],\n", - " [6.76662146e-17, 2.20907752e-18, 9.62504448e-17],\n", - " [2.00160225e-16, 8.80767939e-18, 1.77366727e-16],\n", - " [3.41740957e-17, 8.74561874e-19, 6.63512743e-17],\n", - " [3.60328718e-16, 2.82338438e-17, 4.34693093e-16],\n", - " [6.67669730e-17, 2.58750204e-18, 1.52739862e-16],\n", - " [3.91422673e-16, 3.31532469e-17, 4.87753350e-16],\n", - " [1.77366727e-16, 9.03098345e-18, 2.13610710e-16],\n", - " [8.97176659e-17, 1.70496547e-18, 5.54807336e-17],\n", - " [3.89612755e-16, 2.19273313e-17, 3.02360428e-16],\n", - " [2.01412829e-16, 4.80596819e-18, 1.03819232e-16],\n", - " [2.38528795e-16, 6.37011185e-18, 1.23932048e-16],\n", - " [2.94518073e-16, 2.28948023e-17, 4.35296440e-16],\n", - " [5.54807336e-17, 1.54494686e-18, 5.98270528e-17],\n", - " [3.02360428e-16, 2.04032913e-17, 3.41440656e-16],\n", - " [1.03819232e-16, 3.79486014e-18, 1.04478685e-16],\n", - " [1.23932048e-16, 5.35260627e-18, 1.61465149e-16],\n", - " [2.85250597e-16, 8.61639662e-18, 1.49269368e-16],\n", - " [6.83639178e-17, 2.55471368e-18, 1.40619360e-16],\n", - " [1.01687811e-16, 1.33664490e-18, 4.33964312e-17],\n", - " [7.96485950e-17, 2.10315731e-18, 6.76662146e-17],\n", - " [2.00119660e-16, 8.65180085e-18, 1.74681839e-16]])" + "array([[2.77545187e-16, 8.22117200e-18, 1.45034306e-16],\n", + " [1.45034306e-16, 6.56988067e-18, 1.70822585e-16],\n", + " [2.26887502e-16, 1.28425102e-17, 2.52668970e-16],\n", + " [3.05186878e-16, 1.97924004e-17, 3.14163388e-16],\n", + " [2.19808219e-16, 7.66724140e-18, 1.52188295e-16],\n", + " [8.01864556e-17, 1.63005321e-18, 5.48538206e-17],\n", + " [4.67656335e-17, 1.06329013e-18, 4.27172270e-17],\n", + " [4.27172270e-17, 1.20966329e-18, 8.08160187e-17],\n", + " [2.27595445e-16, 1.11292486e-17, 2.07923286e-16],\n", + " [1.57390932e-16, 5.82174606e-18, 1.34059463e-16],\n", + " [1.34059463e-16, 7.40798623e-18, 2.67561809e-16],\n", + " [3.23356017e-16, 1.14278779e-17, 1.81617674e-16],\n", + " [1.00622084e-16, 3.63243307e-18, 1.02180794e-16],\n", + " [1.05047444e-16, 3.89408340e-18, 1.09098539e-16],\n", + " [6.80303400e-17, 1.37983586e-18, 4.94904692e-17],\n", + " [4.94904692e-17, 1.32196193e-18, 5.58517966e-17],\n", + " [2.55706461e-17, 4.57680942e-19, 2.36554026e-17],\n", + " [2.36554026e-17, 4.58683615e-19, 2.59629504e-17],\n", + " [3.05863613e-17, 6.71016578e-19, 3.70397271e-17],\n", + " [5.15405871e-17, 1.71524039e-18, 1.16323339e-16],\n", + " [5.28842399e-16, 3.66995124e-17, 4.09030233e-16],\n", + " [1.45034306e-16, 6.26048090e-18, 1.47550900e-16],\n", + " [9.32845335e-17, 1.70187214e-18, 5.48538206e-17],\n", + " [8.92235670e-17, 1.24958199e-18, 4.27172270e-17],\n", + " [2.65730635e-16, 1.36201353e-17, 2.34382279e-16],\n", + " [3.11949876e-16, 1.69808691e-17, 2.66891369e-16],\n", + " [1.52188295e-16, 6.94851565e-18, 1.70459081e-16],\n", + " [5.48538206e-17, 1.61005826e-18, 7.64235425e-17],\n", + " [4.27172270e-17, 1.48212144e-18, 1.29975276e-16],\n", + " [1.99194104e-16, 9.03806629e-18, 1.81617674e-16],\n", + " [1.44604895e-16, 4.02980914e-18, 1.00622084e-16],\n", + " [1.35143307e-16, 4.14568277e-18, 1.05047444e-16],\n", + " [1.22688378e-16, 4.56929072e-18, 1.16731933e-16],\n", + " [1.42747545e-16, 1.81982276e-18, 4.94904692e-17],\n", + " [9.88808526e-17, 2.27951105e-18, 6.90093022e-17],\n", + " [4.64815420e-17, 6.65308346e-19, 2.93427520e-17],\n", + " [4.13231685e-17, 4.97267894e-19, 2.36554026e-17],\n", + " [5.04556002e-17, 7.12971301e-19, 3.05863613e-17],\n", + " [4.94904692e-17, 1.29479893e-18, 5.02130054e-17],\n", + " [6.90093022e-17, 2.57428313e-18, 1.39683394e-16]])" ] }, - "execution_count": 17, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -700,42 +804,74 @@ "\n", "$$ Q = \\bigg( \\frac{\\mu}{F_{h, i}} + \\frac{\\mu}{F_{h, k}} + \\frac{\\mu}{F_{h, j}} \\bigg) ^ {-1} \\Delta P $$\n", "\n", - "This can be computed by hand:" + "This can be computed by hand as follows. Note that we write the hydraulic conductance in an Nt by 2 array the OpenPNM convention is to store conductance values in an Nt by 2 array for symmetric and asymmetric physics." ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "0b26948e", "metadata": {}, "outputs": [], "source": [ "F_h = water['throat.hydraulic_size_factors']\n", - "water['throat.hydraulic_conductance'] = (mu * (1/F_h).sum(axis=1))**(-1)" + "gh = (mu * (1/F_h).sum(axis=1))**(-1)\n", + "gh = np.vstack((gh, gh)).T\n", + "water['throat.hydraulic_conductance'] = gh" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "fc49009f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([9.64890861e-16, 1.01200775e-15, 2.52019344e-15, 2.55102875e-15,\n", - " 8.76379447e-15, 1.24146226e-14, 5.56745682e-14, 5.89529400e-14,\n", - " 1.90491669e-15, 1.91150861e-15, 4.48459671e-15, 4.02523528e-15,\n", - " 3.02123137e-15, 2.66531163e-15, 4.83218689e-15, 4.48520822e-15,\n", - " 7.88493570e-15, 1.45652099e-15, 1.17908308e-15, 2.34297724e-15,\n", - " 9.01642545e-15, 9.42596730e-16, 2.76479432e-14, 2.74408781e-15,\n", - " 3.22015299e-14, 9.24896606e-15, 1.81841007e-15, 2.17482514e-14,\n", - " 5.02794728e-15, 6.61517491e-15, 2.26770426e-14, 1.64158955e-15,\n", - " 2.02647323e-14, 3.96006729e-15, 5.56764422e-15, 8.86707390e-15,\n", - " 2.70972049e-15, 1.43348763e-15, 2.22665273e-15, 8.86413983e-15])" + "array([[8.47300580e-15, 8.47300580e-15],\n", + " [6.78704028e-15, 6.78704028e-15],\n", + " [1.29834218e-14, 1.29834218e-14],\n", + " [1.96472322e-14, 1.96472322e-14],\n", + " [7.90970777e-15, 7.90970777e-15],\n", + " [1.73799981e-15, 1.73799981e-15],\n", + " [1.13631934e-15, 1.13631934e-15],\n", + " [1.29812583e-15, 1.29812583e-15],\n", + " [1.13024469e-14, 1.13024469e-14],\n", + " [6.03278805e-15, 6.03278805e-15],\n", + " [7.65859432e-15, 7.65859432e-15],\n", + " [1.16496923e-14, 1.16496923e-14],\n", + " [3.79490415e-15, 3.79490415e-15],\n", + " [4.06403219e-15, 4.06403219e-15],\n", + " [1.47385271e-15, 1.47385271e-15],\n", + " [1.40905507e-15, 1.40905507e-15],\n", + " [4.94010896e-16, 4.94010896e-16],\n", + " [4.95183600e-16, 4.95183600e-16],\n", + " [7.22325282e-16, 7.22325282e-16],\n", + " [1.83235280e-15, 1.83235280e-15],\n", + " [3.54476865e-14, 3.54476865e-14],\n", + " [6.45647720e-15, 6.45647720e-15],\n", + " [1.81591526e-15, 1.81591526e-15],\n", + " [1.34100049e-15, 1.34100049e-15],\n", + " [1.37455519e-14, 1.37455519e-14],\n", + " [1.70039876e-14, 1.70039876e-14],\n", + " [7.16060332e-15, 7.16060332e-15],\n", + " [1.71606825e-15, 1.71606825e-15],\n", + " [1.58623163e-15, 1.58623163e-15],\n", + " [9.23980055e-15, 9.23980055e-15],\n", + " [4.22476733e-15, 4.22476733e-15],\n", + " [4.33721276e-15, 4.33721276e-15],\n", + " [4.75265436e-15, 4.75265436e-15],\n", + " [1.94130681e-15, 1.94130681e-15],\n", + " [2.41656508e-15, 2.41656508e-15],\n", + " [7.18299089e-16, 7.18299089e-16],\n", + " [5.38917989e-16, 5.38917989e-16],\n", + " [7.69421688e-16, 7.69421688e-16],\n", + " [1.37804516e-15, 1.37804516e-15],\n", + " [2.72997059e-15, 2.72997059e-15]])" ] }, - "execution_count": 19, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -746,25 +882,18 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "3ef96480", "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " \r" - ] - }, { "data": { "text/plain": [ - "array([153381.08855867, 160388.98970566, 173533.16165927, 166629.27675144,\n", - " 153163.58781883])" + "array([289394.33735155, 298579.87553587, 271558.25345862, 240901.66451631,\n", + " 225756.73289535])" ] }, - "execution_count": 20, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -797,7 +926,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "9891436d", "metadata": {}, "outputs": [], @@ -808,25 +937,18 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "fd34b943", "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " \r" - ] - }, { "data": { "text/plain": [ - "array([153381.08855867, 160388.98970566, 173533.16165927, 166629.27675144,\n", - " 153163.58781883])" + "array([289394.33735155, 298579.87553587, 271558.25345862, 240901.66451631,\n", + " 225756.73289535])" ] }, - "execution_count": 22, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" }