def test_compare_energies(): ref = np.loadtxt(os.path.join(MODULE_DIR, "energies_ref.txt")) if not os.path.isfile(os.path.join(MODULE_DIR, "energies.txt")) \ or (os.path.getctime(os.path.join(MODULE_DIR, "energies.txt")) < os.path.getctime(os.path.abspath(__file__))): run_finmag() computed = np.loadtxt(os.path.join(MODULE_DIR, "energies.txt")) assert np.size(ref) == np.size(computed), "Compare number of energies." vol = mesh_volume(mesh) * unit_length**mesh.topology().dim() #30x30x100nm^3 = 30x30x100=9000 # Compare exchange energy... exch = computed[:, 0] / vol # <-- ... density! exch_nmag = ref[:, 0] diff = abs(exch - exch_nmag) rel_diff = np.abs(diff / max(exch)) print "Exchange energy, max relative error:", max(rel_diff) assert max(rel_diff) < 0.002, \ "Max relative error in exchange energy = {} is larger than " \ "tolerance (= {})".format(max(rel_diff), REL_TOLERANCE) # Compare demag energy demag = computed[:, 1] / vol demag_nmag = ref[:, 1] diff = abs(demag - demag_nmag) rel_diff = np.abs(diff / max(demag)) print "Demag energy, max relative error:", max(rel_diff) # Don't really know why this is ten times higher than everyting else. assert max(rel_diff) < REL_TOLERANCE*10, \ "Max relative error in demag energy = {} is larger than " \ "tolerance (= {})".format(max(rel_diff), REL_TOLERANCE) # Plot p.plot(exch_nmag, 'o', mfc='w', label='nmag') p.plot(exch, label='finmag') p.xlabel("time step") p.ylabel("$e_\mathrm{exch}\, (\mathrm{Jm^{-3}})$") p.legend() p.savefig(os.path.join(MODULE_DIR, "exchange_energy.pdf")) p.savefig(os.path.join(MODULE_DIR, "exchange_energy.png")) p.close() p.plot(demag_nmag, 'o', mfc='w', label='nmag') p.plot(demag, label='finmag') p.xlabel("time step") p.ylabel("$e_\mathrm{demag}\, (\mathrm{Jm^{-3}})$") p.legend() p.savefig(os.path.join(MODULE_DIR, "demag_energy.pdf")) p.savefig(os.path.join(MODULE_DIR, "demag_energy.png")) #p.show() p.close() print "Energy plots written to exchange_energy.pdf and demag_energy.pdf"
def set_default_values(self): self.Ms = Field(df.FunctionSpace(self.mesh, 'DG', 0), 8.6e5) # A/m saturation magnetisation self._pins = np.array([], dtype="int") self.volumes = df.assemble( df.dot(df.TestFunction(self.S3), df.Constant([1, 1, 1])) * df.dx).array() self.Volume = mesh_volume(self.mesh) self.real_volumes = self.volumes * self.unit_length**3 self.m_pred = np.zeros(self.m.shape) self.integrator = native_llb.StochasticSLLGIntegrator( self.m, self.m_pred, self._Ms, self._T, self.real_volumes, self._alpha, self.stochastic_update_field, self.method) self.alpha = 0.1 self._gamma = consts.gamma self._seed = np.random.random_integers(4294967295) self.dt = 1e-13 self.T = 0
def test_cubic_anisotropy_energy(): mesh = df.BoxMesh(df.Point(0, 0, 0), df.Point(1, 1, 40), 1, 1, 40) volume = mesh_volume(mesh) * unit_length**3 S3 = df.VectorFunctionSpace(mesh, "Lagrange", 1) S1 = df.FunctionSpace(mesh, "Lagrange", 1) m = Field(S3) m.set((0, 0, 1)) Ms_dg = Field(df.FunctionSpace(mesh, 'DG', 0), Ms) ca = CubicAnisotropy(u1, u2, K1, K2, K3) ca.setup(m, Ms_dg, unit_length) energy = ca.compute_energy() # energy_expected = 8.3e-20 # oommf cubicEight_100pc.mif -> ErFe2.odt energy_expected = compute_cubic_energy() * volume print "cubic anisotropy energy = {}, expected {}.".format( energy, energy_expected) rel_diff = abs(energy - energy_expected) / abs(energy_expected) assert rel_diff < 1e-10
def test_compare_energies(): #Dictionary for finmag exchange results exch = {} #Dictionary for finmag demag results demag = {} for demagsolver in demagsolvers: ref = np.loadtxt( os.path.join(MODULE_DIR, demagsolver + "energies_ref.txt")) if not os.path.isfile(os.path.join(MODULE_DIR, demagsolver+"energies.txt")) \ or (os.path.getctime(os.path.join(MODULE_DIR, demagsolver+"energies.txt")) < os.path.getctime(os.path.abspath(__file__))): run_finmag(demagsolver) computed = np.loadtxt( os.path.join(MODULE_DIR, demagsolver + "energies.txt")) assert np.size(ref) == np.size(computed), "Compare number of energies." vol = mesh_volume(mesh) * unit_length**mesh.topology().dim() #30x30x100nm^3 = 30x30x100=9000 # Compare exchange energy exch[demagsolver] = computed[:, 0] / vol exch_nmag = ref[:, 0] diff = abs(exch[demagsolver] - exch_nmag) rel_diff = np.abs(diff / max(exch[demagsolver])) print "Exchange energy Finmag %s Nmag , max relative error:" % demagsolver, max( rel_diff) assert max(rel_diff) < REL_TOLERANCE, \ "Max relative error in Finmag %s Nmag exchange energy is %g"%(demagsolver, max(rel_diff)) # Compare demag energy demag[demagsolver] = computed[:, 1] / vol demag_nmag = ref[:, 1] diff = abs(demag[demagsolver] - demag_nmag) rel_diff = np.abs(diff / max(demag[demagsolver])) print "Finmag %s Nmag Demag energy, max relative error: %g" % ( demagsolver, max(rel_diff)) # Don't really know why this is ten times higher than everyting else. assert max(rel_diff) < REL_TOLERANCE*10, \ "Max relative error in Finmag %s Nmag demag energy is %g" %(demagsolver,max(rel_diff)) # Plot both FK and GCR demags on the same plot. p.title("Finmag vs Nmag Exchange energy") p.plot(exch_nmag, 'o', mfc='w', label='Nmag') p.plot(exch["FK"], label='Finmag FK') p.plot(exch["GCR"], label='Finmag GCR') p.xlabel("Time step") p.ylabel("$\mathsf{E_{exch}}$") p.legend() p.savefig(os.path.join(MODULE_DIR, "exchange_energy.png")) p.close() p.plot(demag_nmag, 'o', mfc='w', label='Nmag') p.plot(demag, label='Finmag') p.xlabel("Time step") p.ylabel("$\mathsf{E_{demag}}$") p.legend() p.savefig(os.path.join(MODULE_DIR, "demag_energy.png")) #p.show()% p.close() print "Energy plots written to exchange_energy.png and demag_energy.png"
def setup(self, S3, m, Ms, unit_length=1): mesh = S3.mesh() n_dim = mesh.topology().dim() self.V = mesh_volume(mesh=mesh) * unit_length**n_dim self.Ms = Ms self.output_shape = df.Function(S3).vector().array().shape
def normalise_phi(phi, mesh): volume = mesh_volume(mesh) average = df.assemble(phi * df.dx) phi.vector()[:] = phi.vector().array() - average / volume