Skip to content

Commit f5f35a6

Browse files
committed
Add option to calculate demagnetising field less frequently
1 parent e6391f2 commit f5f35a6

File tree

2 files changed

+48
-18
lines changed

2 files changed

+48
-18
lines changed

fidimag/atomistic/demag.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ class Demag(Energy):
3434
3535
"""
3636

37-
def __init__(self, name='Demag'):
37+
def __init__(self, calc_every=0, name='Demag'):
38+
self.calc_every = calc_every
3839
self.name = name
3940
self.jac = True
4041

4142
def setup(self, mesh, spin, mu_s, mu_s_inv):
4243
super(Demag, self).setup(mesh, spin, mu_s, mu_s_inv)
4344
self.scale = 1e-7 / mesh.unit_length**3
44-
4545
# could be wrong, needs carefully tests!!!
4646
# David Tue 19 Jun 2018: This variable is updated in the SIM class in
4747
# case mu_s changes
@@ -50,22 +50,42 @@ def setup(self, mesh, spin, mu_s, mu_s_inv):
5050
self.demag = clib.FFTDemag(self.dx, self.dy, self.dz,
5151
self.nx, self.ny, self.nz,
5252
tensor_type='dipolar')
53+
if not self.calc_every:
54+
self.compute_field = self.compute_field_every
55+
else:
56+
self.count = 0
57+
self.compute_field = self.compute_field_periodically
5358

54-
def compute_field(self, t=0, spin=None):
59+
def compute_field_every(self, t=0, spin=None):
5560
if spin is not None:
5661
m = spin
5762
else:
5863
m = self.spin
5964
self.demag.compute_field(m, self.mu_s_scale, self.field)
6065
return self.field
6166

67+
def compute_field_periodically(self, t=0, spin=None):
68+
if spin is not None:
69+
m = spin
70+
else:
71+
m = self.spin
72+
73+
if not (self.count % self.calc_every == 0):
74+
self.count += 1
75+
return self.field
76+
else:
77+
print(self.count)
78+
self.count += 1
79+
self.demag.compute_field(m, self.mu_s_scale, self.field)
80+
return self.field
81+
82+
6283
def compute_exact(self):
6384
field = np.zeros(3 * self.n)
6485
self.demag.compute_exact(self.spin, self.mu_s_scale, field)
6586
return field
6687

6788
def compute_energy(self):
68-
6989
energy = self.demag.compute_energy(
7090
self.spin, self.mu_s_scale, self.field)
7191

fidimag/micro/demag.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,28 @@
1717
class Demag(Energy):
1818

1919
def __init__(self, name='Demag', pbc_2d=False,
20-
pbc_options=default_options):
20+
pbc_options=default_options, calc_every=0):
2121
self.name = name
2222
self.oommf = True
2323
self.pbc_2d = pbc_2d
2424
self.pbc_options = pbc_options
2525
self.jac = False
26+
self.calc_every = calc_every
2627

2728
def setup(self, mesh, spin, Ms, Ms_inv):
2829
super(Demag, self).setup(mesh, spin, Ms, Ms_inv)
2930

3031
if self.pbc_2d is True:
31-
3232
self.demag = clib.FFTDemag(self.dx, self.dy, self.dz,
3333
self.nx, self.ny, self.nz, tensor_type='2d_pbc')
34-
3534
nxyz = self.nx*self.ny*self.nz
3635
tensors = np.zeros(6*nxyz, dtype=np.float)
37-
3836
pbc_2d_error = 1e-10
3937
sample_repeat_nx = -1
4038
sample_repeat_ny = -1
4139
asymptotic_radius = 32.0
4240
dipolar_radius = 10000.0
43-
tensor_file_name = ''
44-
41+
tensor_file_name = None
4542
options = self.pbc_options
4643

4744
if 'sample_repeat_nx' in options:
@@ -56,9 +53,8 @@ def setup(self, mesh, spin, Ms, Ms_inv):
5653
if 'tensor_file_name' in options:
5754
tensor_file_name = options['tensor_file_name']
5855

59-
if len(tensor_file_name) > 0 :
56+
if tensor_file_name:
6057
if not (os.path.exists(tensor_file_name+'.npz')):
61-
6258
self.demag.compute_tensors_2dpbc(tensors, pbc_2d_error, sample_repeat_nx, sample_repeat_ny, dipolar_radius)
6359
else:
6460
npzfile = np.load(tensor_file_name+'.npz')
@@ -69,7 +65,6 @@ def setup(self, mesh, spin, Ms, Ms_inv):
6965
self.demag.compute_tensors_2dpbc(tensors, pbc_2d_error, sample_repeat_nx, sample_repeat_ny, dipolar_radius)
7066
else:
7167
tensors = npzfile['tensors']
72-
7368
geo_arr = np.array([self.nx, self.ny, self.nz, self.dx, self.dy, self.dz], dtype=np.float)
7469
np.savez(tensor_file_name+'.npz', geo=geo_arr, tensors=tensors)
7570

@@ -84,19 +79,34 @@ def setup(self, mesh, spin, Ms, Ms_inv):
8479
self.demag = clib.FFTDemag(self.dx, self.dy, self.dz,
8580
self.nx, self.ny, self.nz,
8681
tensor_type='demag')
82+
if not self.calc_every:
83+
self.compute_field = self.compute_field_every
84+
else:
85+
self.count = 0
86+
self.compute_field = self.compute_field_periodically
8787

88-
89-
90-
def compute_field(self, t=0, spin=None):
88+
def compute_field_every(self, t=0, spin=None):
9189
if spin is not None:
9290
m = spin
9391
else:
9492
m = self.spin
95-
9693
self.demag.compute_field(m, self.Ms, self.field)
97-
9894
return self.field
9995

96+
def compute_field_periodically(self, t=0, spin=None):
97+
if spin is not None:
98+
m = spin
99+
else:
100+
m = self.spin
101+
102+
if not (self.count % self.calc_every == 0):
103+
self.count += 1
104+
return self.field
105+
else:
106+
self.count += 1
107+
self.demag.compute_field(m, self.Ms, self.field)
108+
return self.field
109+
100110
def compute_exact(self):
101111
field = np.zeros(3 * self.mesh.n)
102112
self.demag.compute_exact(self.spin, self.Ms, field)

0 commit comments

Comments
 (0)