Skip to content

Commit 5a28cec

Browse files
author
davidcorteso
committed
Updated demag C lib to allow calc of energy density per mesh site
1 parent 52a0598 commit 5a28cec

File tree

6 files changed

+30
-13
lines changed

6 files changed

+30
-13
lines changed

fidimag/atomistic/demag.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,6 @@ def compute_exact(self):
6767
def compute_energy(self):
6868

6969
energy = self.demag.compute_energy(
70-
self.spin, self.mu_s_scale, self.field)
70+
self.spin, self.mu_s_scale, self.field, self.energy)
7171

7272
return energy / self.scale

fidimag/atomistic/demag_hexagonal.py

Lines changed: 4 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,7 @@ 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)
148151

149152
return energy / self.scale
150153

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
@@ -105,7 +105,13 @@ def compute_exact(self):
105105
def compute_energy(self):
106106

107107
self.compute_field()
108-
energy = self.demag.compute_energy(self.spin, self.Ms, self.field)
108+
energy = self.demag.compute_energy(self.spin, self.Ms,
109+
self.field, self.energy)
110+
111+
self.energy *= mu_0 * (self.mesh.dx *
112+
self.mesh.dy *
113+
self.mesh.dz *
114+
self.mesh.unit_length ** 3.)
109115

110116
return energy * mu_0 * (self.mesh.dx *
111117
self.mesh.dy *

0 commit comments

Comments
 (0)