Skip to content

Commit f4c1609

Browse files
authored
Merge pull request #120 from computationalmodelling/demag_energy
Added demag energy density calc
2 parents e501efc + 45d4b95 commit f4c1609

File tree

6 files changed

+35
-13
lines changed

6 files changed

+35
-13
lines changed

fidimag/atomistic/demag.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ def compute_exact(self):
8787

8888
def compute_energy(self):
8989
energy = self.demag.compute_energy(
90-
self.spin, self.mu_s_scale, self.field)
90+
self.spin, self.mu_s_scale, self.field, self.energy)
91+
92+
self.energy /= self.scale
9193

9294
return energy / self.scale

fidimag/atomistic/demag_hexagonal.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ def setup(self, mesh, spin, mu_s, mu_s_inv):
8181
self.field = np.zeros(3 * self.n, dtype=np.float)
8282
self.field_c = np.zeros(3 * self.n_c, dtype=np.float)
8383

84+
self.energy = np.zeros(self.n, dtype=np.float)
85+
self.energy_c = np.zeros(self.n_c, dtype=np.float)
86+
8487
unit_length = mesh.unit_length
8588
self.mu_s_scale = np.zeros(mesh.n, dtype=np.float)
8689
self.mu_s_scale_c = np.zeros(2 * self.n, dtype=np.float)
@@ -144,7 +147,10 @@ def compute_energy(self):
144147
self.vector2cuboid(self.spin, self.spin_c)
145148

146149
energy = self.demag.compute_energy(
147-
self.spin_c, self.mu_s_scale_c, self.field_c)
150+
self.spin_c, self.mu_s_scale_c, self.field_c, self.energy_c)
151+
152+
self.scalar2cuboid(self.energy, self.energy_c, invert=True)
153+
self.energy /= self.scale
148154

149155
return energy / self.scale
150156

fidimag/common/dipolar/demag.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -417,22 +417,28 @@ void exact_compute(fft_demag_plan *restrict plan, double *restrict spin, double
417417

418418
}
419419

420-
double compute_demag_energy(fft_demag_plan *restrict plan, double *restrict spin, double *restrict mu_s, double *restrict field) {
420+
double compute_demag_energy(fft_demag_plan *restrict plan,
421+
double *restrict spin,
422+
double *restrict mu_s,
423+
double *restrict field,
424+
double *restrict energy
425+
) {
421426

422427
int i,j;
423428

424429
int nxyz = plan->nx * plan->ny * plan->nz;
425430

426-
double energy = 0;
431+
double total_energy = 0;
427432

428433
for (i = 0; i < nxyz; i++) {
429434
j = 3*i;
430-
energy += mu_s[i]*(spin[j]*field[j]+spin[j+1]*field[j+1]+spin[j+2]*field[j+2]);
435+
energy[i] = -0.5 * mu_s[i] * (spin[j] * field[j] +
436+
spin[j+1] * field[j+1] +
437+
spin[j+2] * field[j+2] );
438+
total_energy += energy[i];
431439
}
432440

433-
energy = -energy / 2.0;
434-
435-
return energy;
441+
return total_energy;
436442

437443
}
438444

fidimag/common/dipolar/dipolar.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void fill_demag_tensors_c(fft_demag_plan *restrict plan, double *restrict tensor
7878

7979
void compute_fields(fft_demag_plan *restrict plan, double *restrict spin, double *mu_s, double *restrict field);
8080
void exact_compute(fft_demag_plan *restrict plan, double *restrict spin, double *mu_s, double *restrict field);
81-
double compute_demag_energy(fft_demag_plan *restrict plan, double *restrict spin, double *restrict mu_s, double *restrict field);
81+
double compute_demag_energy(fft_demag_plan *restrict plan, double *restrict spin, double *restrict mu_s, double *restrict field, double *restrict energy);
8282

8383

8484

fidimag/common/dipolar/dipolar.pyx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ cdef extern from "dipolar.h":
4141
void init_plan(fft_demag_plan * plan, double dx, double dy, double dz, int nx,int ny, int nz)
4242
void compute_fields(fft_demag_plan * plan, double *spin, double *mu_s, double *field)
4343
void exact_compute(fft_demag_plan * plan, double *spin, double *mu_s, double *field)
44-
double compute_demag_energy(fft_demag_plan *plan, double *spin, double *mu_s, double *field)
44+
double compute_demag_energy(fft_demag_plan *plan, double *spin, double *mu_s, double *field, double *energy)
4545
void compute_dipolar_tensors(fft_demag_plan *plan)
4646
void compute_demag_tensors(fft_demag_plan *plan)
4747
void create_fftw_plan(fft_demag_plan *plan)
@@ -177,9 +177,11 @@ cdef class FFTDemag(object):
177177
def compute_energy(self,
178178
np.ndarray[double, ndim=1, mode="c"] spin,
179179
np.ndarray[double, ndim=1, mode="c"] mu_s,
180-
np.ndarray[double, ndim=1, mode="c"] field):
180+
np.ndarray[double, ndim=1, mode="c"] field,
181+
np.ndarray[double, ndim=1, mode="c"] energy):
181182

182-
return compute_demag_energy(self._c_plan, &spin[0], &mu_s[0], &field[0])
183+
return compute_demag_energy(self._c_plan, &spin[0], &mu_s[0],
184+
&field[0], &energy[0])
183185

184186

185187
cdef extern from "demagcoef.h":

fidimag/micro/demag.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,13 @@ def compute_exact(self):
115115
def compute_energy(self):
116116

117117
self.compute_field()
118-
energy = self.demag.compute_energy(self.spin, self.Ms, self.field)
118+
energy = self.demag.compute_energy(self.spin, self.Ms,
119+
self.field, self.energy)
120+
121+
self.energy *= mu_0 * (self.mesh.dx *
122+
self.mesh.dy *
123+
self.mesh.dz *
124+
self.mesh.unit_length ** 3.)
119125

120126
return energy * mu_0 * (self.mesh.dx *
121127
self.mesh.dy *

0 commit comments

Comments
 (0)