From 4f6c77de39141ecd6ae7c3dd9b15fc6f9a810e89 Mon Sep 17 00:00:00 2001 From: Pascal Muster Date: Thu, 26 Oct 2023 16:07:12 +0200 Subject: [PATCH 01/10] Add a test for new `Hsteps` keyword argument Test structure of new `TestHysteresisDriver` class is now similar to already existing `TestMinDriver` class. --- .../calculatortests/__init__.py | 2 +- .../calculatortests/hysteresisdriver.py | 73 ++++++++++++++----- 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/micromagnetictests/calculatortests/__init__.py b/micromagnetictests/calculatortests/__init__.py index d24c372..1cf0dfa 100644 --- a/micromagnetictests/calculatortests/__init__.py +++ b/micromagnetictests/calculatortests/__init__.py @@ -9,7 +9,7 @@ from .energy import TestEnergy from .exchange import TestExchange from .fixedsubregions import TestFixedSubregions -from .hysteresisdriver import test_simple_hysteresis_loop +from .hysteresisdriver import TestHysteresisDriver from .info_file import test_info_file from .mesh import TestMesh from .mindriver import TestMinDriver diff --git a/micromagnetictests/calculatortests/hysteresisdriver.py b/micromagnetictests/calculatortests/hysteresisdriver.py index 849a5b9..7ca259a 100644 --- a/micromagnetictests/calculatortests/hysteresisdriver.py +++ b/micromagnetictests/calculatortests/hysteresisdriver.py @@ -1,32 +1,65 @@ import discretisedfield as df import micromagneticmodel as mm import numpy as np +import pytest -def test_simple_hysteresis_loop(calculator): - """Simple hysteresis loop between Hmin and Hmax with symmetric number of steps.""" - system = mm.System(name="hysteresisdriver_noevolver_nodriver") +class TestHysteresisDriver: + @pytest.fixture(autouse=True) + def _setup_calculator(self, calculator): + self.calculator = calculator - A = 1e-12 - H = (0, 0, 1e6) - system.energy = mm.Exchange(A=A) + mm.Zeeman(H=H) + def setup_method(self): + p1 = (0, 0, 0) + p2 = (5e-9, 5e-9, 5e-9) + n = (5, 5, 5) + self.Ms = 1e6 + A = 1e-12 + H = (0, 0, 1e6) + region = df.Region(p1=p1, p2=p2) + self.mesh = df.Mesh(region=region, n=n) + self.energy = mm.Exchange(A=A) + mm.Zeeman(H=H) + self.m = df.Field(self.mesh, nvdim=3, value=(0, 1, 0), norm=self.Ms) - p1 = (0, 0, 0) - p2 = (5e-9, 5e-9, 5e-9) - n = (5, 5, 5) - Ms = 1e6 - region = df.Region(p1=p1, p2=p2) - mesh = df.Mesh(region=region, n=n) - system.m = df.Field(mesh, nvdim=3, value=(0, 1, 0), norm=Ms) + def test_simple_hysteresis_loop(self): + """Simple hysteresis loop between Hmin and Hmax with symmetric number of steps.""" + name = "hysteresisdriver_noevolver_nodriver" - hd = calculator.HysteresisDriver() - hd.drive(system, Hmin=(0, 0, -1e6), Hmax=(0, 0, 1e6), n=3) + system = mm.System(name=name) + system.energy = self.energy + system.m = self.m - value = system.m(mesh.region.random_point()) - assert np.linalg.norm(np.subtract(value, (0, 0, Ms))) < 1e-3 + hd = self.calculator.HysteresisDriver() + hd.drive(system, Hmin=(0, 0, -1e6), Hmax=(0, 0, 1e6), n=3) - assert len(system.table.data.index) == 5 + value = system.m(self.mesh.region.random_point()) + assert np.linalg.norm(np.subtract(value, (0, 0, self.Ms))) < 1e-3 - assert system.table.x == "B_hysteresis" + assert len(system.table.data.index) == 5 - calculator.delete(system) + assert system.table.x == "B_hysteresis" + + self.calculator.delete(system) + + def test_stepped_hysteresis_loop(self): + """Same as in the test above, but by using `Hsteps` as keyword argument.""" + name = "hysteresisdriver_noevolver_nodriver" + + system = mm.System(name=name) + system.energy = self.energy + system.m = self.m + + hd = self.calculator.HysteresisDriver() + hd.drive(system, Hsteps=[ + [(0, 0, -1e6), (0, 0, 1e6), 3], + [(0, 0, 1e6), (0, 0, -1e6), 3], + ]) + + value = system.m(self.mesh.region.random_point()) + assert np.linalg.norm(np.subtract(value, (0, 0, self.Ms))) < 1e-3 + + assert len(system.table.data.index) == 5 + + assert system.table.x == "B_hysteresis" + + self.calculator.delete(system) From d8d67b9c1bbdb39c808ca89523f27626290c8824 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 26 Oct 2023 14:13:12 +0000 Subject: [PATCH 02/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../calculatortests/hysteresisdriver.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/micromagnetictests/calculatortests/hysteresisdriver.py b/micromagnetictests/calculatortests/hysteresisdriver.py index 7ca259a..d591753 100644 --- a/micromagnetictests/calculatortests/hysteresisdriver.py +++ b/micromagnetictests/calculatortests/hysteresisdriver.py @@ -50,10 +50,13 @@ def test_stepped_hysteresis_loop(self): system.m = self.m hd = self.calculator.HysteresisDriver() - hd.drive(system, Hsteps=[ - [(0, 0, -1e6), (0, 0, 1e6), 3], - [(0, 0, 1e6), (0, 0, -1e6), 3], - ]) + hd.drive( + system, + Hsteps=[ + [(0, 0, -1e6), (0, 0, 1e6), 3], + [(0, 0, 1e6), (0, 0, -1e6), 3], + ], + ) value = system.m(self.mesh.region.random_point()) assert np.linalg.norm(np.subtract(value, (0, 0, self.Ms))) < 1e-3 From 15d13e8e4ff48f90f57bf59f966fdf0f3c5b6264 Mon Sep 17 00:00:00 2001 From: Martin Lang <67915889+lang-m@users.noreply.github.com> Date: Wed, 24 Jan 2024 10:24:45 +0100 Subject: [PATCH 03/10] Re-remove test class We plan to completely switch to using fixtures and simple test functions instead of test classes with setup/teardown methods --- .../calculatortests/hysteresisdriver.py | 88 +++++++++---------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/micromagnetictests/calculatortests/hysteresisdriver.py b/micromagnetictests/calculatortests/hysteresisdriver.py index d591753..a0e9f0c 100644 --- a/micromagnetictests/calculatortests/hysteresisdriver.py +++ b/micromagnetictests/calculatortests/hysteresisdriver.py @@ -4,65 +4,59 @@ import pytest -class TestHysteresisDriver: - @pytest.fixture(autouse=True) - def _setup_calculator(self, calculator): - self.calculator = calculator +@pytest.fixture +def Ms(): + return 1e6 - def setup_method(self): - p1 = (0, 0, 0) - p2 = (5e-9, 5e-9, 5e-9) - n = (5, 5, 5) - self.Ms = 1e6 - A = 1e-12 - H = (0, 0, 1e6) - region = df.Region(p1=p1, p2=p2) - self.mesh = df.Mesh(region=region, n=n) - self.energy = mm.Exchange(A=A) + mm.Zeeman(H=H) - self.m = df.Field(self.mesh, nvdim=3, value=(0, 1, 0), norm=self.Ms) - def test_simple_hysteresis_loop(self): - """Simple hysteresis loop between Hmin and Hmax with symmetric number of steps.""" - name = "hysteresisdriver_noevolver_nodriver" +@pytest.fixture +def system(Ms): + system = mm.System(name="hysteresisdriver_noevolver_nodriver") + + A = 1e-12 + H = (0, 0, 1e6) + system.energy = mm.Exchange(A=A) + mm.Zeeman(H=H) - system = mm.System(name=name) - system.energy = self.energy - system.m = self.m + p1 = (0, 0, 0) + p2 = (5e-9, 5e-9, 5e-9) + n = (5, 5, 5) + region = df.Region(p1=p1, p2=p2) + mesh = df.Mesh(region=region, n=n) + system.m = df.Field(mesh, nvdim=3, value=(0, 1, 0), norm=Ms) + return system - hd = self.calculator.HysteresisDriver() - hd.drive(system, Hmin=(0, 0, -1e6), Hmax=(0, 0, 1e6), n=3) - value = system.m(self.mesh.region.random_point()) - assert np.linalg.norm(np.subtract(value, (0, 0, self.Ms))) < 1e-3 +def test_simple_hysteresis_loop(calculator, system, Ms): + """Simple hysteresis loop between Hmin and Hmax with symmetric number of steps.""" + hd = calculator.HysteresisDriver() + hd.drive(system, Hmin=(0, 0, -1e6), Hmax=(0, 0, 1e6), n=3) - assert len(system.table.data.index) == 5 + value = system.m(mesh.region.random_point()) + assert np.linalg.norm(np.subtract(value, (0, 0, Ms))) < 1e-3 - assert system.table.x == "B_hysteresis" + assert len(system.table.data.index) == 5 - self.calculator.delete(system) + assert system.table.x == "B_hysteresis" - def test_stepped_hysteresis_loop(self): - """Same as in the test above, but by using `Hsteps` as keyword argument.""" - name = "hysteresisdriver_noevolver_nodriver" + calculator.delete(system) - system = mm.System(name=name) - system.energy = self.energy - system.m = self.m - hd = self.calculator.HysteresisDriver() - hd.drive( - system, - Hsteps=[ - [(0, 0, -1e6), (0, 0, 1e6), 3], - [(0, 0, 1e6), (0, 0, -1e6), 3], - ], - ) +def test_stepped_hysteresis_loop(calculator, system, Ms): + """Simple hysteresis loop using `Hsteps` as keyword argument.""" + hd = calculator.HysteresisDriver() + hd.drive( + system, + Hsteps=[ + [(0, 0, -1e6), (0, 0, 1e6), 3], + [(0, 0, 1e6), (0, 0, -1e6), 3], + ], + ) - value = system.m(self.mesh.region.random_point()) - assert np.linalg.norm(np.subtract(value, (0, 0, self.Ms))) < 1e-3 + value = system.m(self.mesh.region.random_point()) + assert np.linalg.norm(np.subtract(value, (0, 0, Ms))) < 1e-3 - assert len(system.table.data.index) == 5 + assert len(system.table.data.index) == 5 - assert system.table.x == "B_hysteresis" + assert system.table.x == "B_hysteresis" - self.calculator.delete(system) + calculator.delete(system) From b908b2d1e5bc6948ac405ea717c70a3f4d60ee2e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 09:24:57 +0000 Subject: [PATCH 04/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- micromagnetictests/calculatortests/hysteresisdriver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromagnetictests/calculatortests/hysteresisdriver.py b/micromagnetictests/calculatortests/hysteresisdriver.py index a0e9f0c..75aa57c 100644 --- a/micromagnetictests/calculatortests/hysteresisdriver.py +++ b/micromagnetictests/calculatortests/hysteresisdriver.py @@ -12,7 +12,7 @@ def Ms(): @pytest.fixture def system(Ms): system = mm.System(name="hysteresisdriver_noevolver_nodriver") - + A = 1e-12 H = (0, 0, 1e6) system.energy = mm.Exchange(A=A) + mm.Zeeman(H=H) From f88945456905b2c436d867574b0a454ebdf1b3ba Mon Sep 17 00:00:00 2001 From: Martin Lang <67915889+lang-m@users.noreply.github.com> Date: Wed, 24 Jan 2024 10:25:38 +0100 Subject: [PATCH 05/10] Update __init__.py: hysteresis test names --- micromagnetictests/calculatortests/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromagnetictests/calculatortests/__init__.py b/micromagnetictests/calculatortests/__init__.py index 1cf0dfa..62bdea1 100644 --- a/micromagnetictests/calculatortests/__init__.py +++ b/micromagnetictests/calculatortests/__init__.py @@ -9,7 +9,7 @@ from .energy import TestEnergy from .exchange import TestExchange from .fixedsubregions import TestFixedSubregions -from .hysteresisdriver import TestHysteresisDriver +from .hysteresisdriver import test_simple_hysteresis_loop, test_stepped_hysteresis_loop from .info_file import test_info_file from .mesh import TestMesh from .mindriver import TestMinDriver From 2e9ea5c0b89da9af589dd4adaa699381e10d6b3a Mon Sep 17 00:00:00 2001 From: Martin Lang <67915889+lang-m@users.noreply.github.com> Date: Wed, 24 Jan 2024 10:28:32 +0100 Subject: [PATCH 06/10] stepped hysteresis driver: different numbers of steps --- micromagnetictests/calculatortests/hysteresisdriver.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/micromagnetictests/calculatortests/hysteresisdriver.py b/micromagnetictests/calculatortests/hysteresisdriver.py index 75aa57c..2da1ab9 100644 --- a/micromagnetictests/calculatortests/hysteresisdriver.py +++ b/micromagnetictests/calculatortests/hysteresisdriver.py @@ -42,20 +42,20 @@ def test_simple_hysteresis_loop(calculator, system, Ms): def test_stepped_hysteresis_loop(calculator, system, Ms): - """Simple hysteresis loop using `Hsteps` as keyword argument.""" + """Simple hysteresis loop with uneven steps using `Hsteps` as keyword argument.""" hd = calculator.HysteresisDriver() hd.drive( system, Hsteps=[ [(0, 0, -1e6), (0, 0, 1e6), 3], - [(0, 0, 1e6), (0, 0, -1e6), 3], + [(0, 0, 1e6), (0, 0, -1e6), 5], ], ) value = system.m(self.mesh.region.random_point()) assert np.linalg.norm(np.subtract(value, (0, 0, Ms))) < 1e-3 - assert len(system.table.data.index) == 5 + assert len(system.table.data.index) == 7 assert system.table.x == "B_hysteresis" From 140ddf014a4f016429117582608f50b013ed5a49 Mon Sep 17 00:00:00 2001 From: Martin Lang <67915889+lang-m@users.noreply.github.com> Date: Wed, 24 Jan 2024 10:30:20 +0100 Subject: [PATCH 07/10] hysteresisdriver.py: fix undefined mesh --- micromagnetictests/calculatortests/hysteresisdriver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/micromagnetictests/calculatortests/hysteresisdriver.py b/micromagnetictests/calculatortests/hysteresisdriver.py index 2da1ab9..4438d5d 100644 --- a/micromagnetictests/calculatortests/hysteresisdriver.py +++ b/micromagnetictests/calculatortests/hysteresisdriver.py @@ -31,7 +31,7 @@ def test_simple_hysteresis_loop(calculator, system, Ms): hd = calculator.HysteresisDriver() hd.drive(system, Hmin=(0, 0, -1e6), Hmax=(0, 0, 1e6), n=3) - value = system.m(mesh.region.random_point()) + value = system.m(system.m.mesh.region.random_point()) assert np.linalg.norm(np.subtract(value, (0, 0, Ms))) < 1e-3 assert len(system.table.data.index) == 5 @@ -52,7 +52,7 @@ def test_stepped_hysteresis_loop(calculator, system, Ms): ], ) - value = system.m(self.mesh.region.random_point()) + value = system.m(system.m.mesh.region.random_point()) assert np.linalg.norm(np.subtract(value, (0, 0, Ms))) < 1e-3 assert len(system.table.data.index) == 7 From 6937313cd5c51a044a98dc2d2a3082b27dfb5501 Mon Sep 17 00:00:00 2001 From: Martin Lang <67915889+lang-m@users.noreply.github.com> Date: Wed, 24 Jan 2024 10:33:40 +0100 Subject: [PATCH 08/10] Update number of tests --- micromagnetictests/tests/test_get_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromagnetictests/tests/test_get_tests.py b/micromagnetictests/tests/test_get_tests.py index 6625fcf..e16fb31 100644 --- a/micromagnetictests/tests/test_get_tests.py +++ b/micromagnetictests/tests/test_get_tests.py @@ -3,4 +3,4 @@ def test_get_tests(): tests = list(mt.get_tests()) - assert len(tests) == 30 + assert len(tests) == 31 From 06f39d71274301915d9fec4879b676f1c0da2060 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 12:27:49 +0000 Subject: [PATCH 09/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- micromagnetictests/calculatortests/__init__.py | 6 +++++- micromagnetictests/calculatortests/hysteresisdriver.py | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/micromagnetictests/calculatortests/__init__.py b/micromagnetictests/calculatortests/__init__.py index c34b07c..266d215 100644 --- a/micromagnetictests/calculatortests/__init__.py +++ b/micromagnetictests/calculatortests/__init__.py @@ -9,7 +9,11 @@ from .energy import TestEnergy from .exchange import TestExchange from .fixedsubregions import TestFixedSubregions -from .hysteresisdriver import test_check_for_energy, test_simple_hysteresis_loop, test_stepped_hysteresis_loop +from .hysteresisdriver import ( + test_check_for_energy, + test_simple_hysteresis_loop, + test_stepped_hysteresis_loop, +) from .info_file import test_info_file from .mesh import TestMesh from .mindriver import TestMinDriver diff --git a/micromagnetictests/calculatortests/hysteresisdriver.py b/micromagnetictests/calculatortests/hysteresisdriver.py index 2e9594d..fcbd1d0 100644 --- a/micromagnetictests/calculatortests/hysteresisdriver.py +++ b/micromagnetictests/calculatortests/hysteresisdriver.py @@ -69,4 +69,3 @@ def test_check_for_energy(calculator): with pytest.raises(RuntimeError, match="System's energy is not defined"): hd.drive(system, Hmin=(0, 0, -1e6), Hmax=(0, 0, 1e6), n=3) - From 7e0b5b552d337daf9e9df4c7ae57544ca5680f11 Mon Sep 17 00:00:00 2001 From: Sam Holt <48217392+samjrholt@users.noreply.github.com> Date: Thu, 9 May 2024 14:34:12 +0200 Subject: [PATCH 10/10] Correct number of tests --- micromagnetictests/tests/test_get_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromagnetictests/tests/test_get_tests.py b/micromagnetictests/tests/test_get_tests.py index e16fb31..f415449 100644 --- a/micromagnetictests/tests/test_get_tests.py +++ b/micromagnetictests/tests/test_get_tests.py @@ -3,4 +3,4 @@ def test_get_tests(): tests = list(mt.get_tests()) - assert len(tests) == 31 + assert len(tests) == 34