The particular example presented here is for simulating
uniaxial magneto-crystalline energy, with a single anisotropy constant,
K1, and a single axis, axis, which are uniform across the
sample.
The class definition (.h) and
code (.cc) files are included below.
/* FILE: exampleanisotropy.h
*
* Example anisotropy class definition.
* This class is derived from the Oxs_Energy class.
*
*/
#ifndef _OXS_EXAMPLEANISOTROPY
#define _OXS_EXAMPLEANISOTROPY
#include "energy.h"
#include "threevector.h"
#include "meshvalue.h"
/* End includes */
class Oxs_ExampleAnisotropy:public Oxs_Energy {
private:
double K1; // Primary anisotropy coeficient
ThreeVector axis; // Anisotropy direction
public:
virtual const char* ClassName() const; // ClassName() is
/// automatically generated by the OXS_EXT_REGISTER macro.
virtual BOOL Init();
Oxs_ExampleAnisotropy(const char* name, // Child instance id
Oxs_Director* newdtr, // App director
Tcl_Interp* safe_interp, // Safe interpreter
const char* argstr); // MIF input block parameters
virtual ~Oxs_ExampleAnisotropy() {}
virtual void GetEnergyAndField(const Oxs_SimState& state,
Oxs_MeshValue<REAL8m>& energy,
Oxs_MeshValue<ThreeVector>& field
) const;
};
#endif // _OXS_EXAMPLEANISOTROPY
/* FILE: exampleanisotropy.cc -*-Mode: c++-*-
*
* Example anisotropy class implementation.
* This class is derived from the Oxs_Energy class.
*
*/
#include "exampleanisotropy.h"
// Oxs_Ext registration support
OXS_EXT_REGISTER(Oxs_ExampleAnisotropy);
/* End includes */
#define MU0 12.56637061435917295385e-7 /* 4 PI 10^7 */
// Constructor
Oxs_ExampleAnisotropy::Oxs_ExampleAnisotropy(
const char* name, // Child instance id
Oxs_Director* newdtr, // App director
Tcl_Interp* safe_interp, // Safe interpreter
const char* argstr) // MIF input block parameters
: Oxs_Energy(name,newdtr,safe_interp,argstr)
{
// Process arguments
K1=GetRealInitValue("K1");
axis=GetThreeVectorInitValue("axis");
VerifyAllInitArgsUsed();
}
BOOL Oxs_ExampleAnisotropy::Init()
{ return 1; }
void Oxs_ExampleAnisotropy::GetEnergyAndField
(const Oxs_SimState& state,
Oxs_MeshValue<REAL8m>& energy,
Oxs_MeshValue<ThreeVector>& field
) const
{
const Oxs_MeshValue<REAL8m>& Ms_inverse = *(state.Ms_inverse);
const Oxs_MeshValue<ThreeVector>& spin = state.spin;
UINT4m size = state.mesh->Size();
for(UINT4m i=0;i<size;++i) {
REAL8m field_mult = (2.0/MU0)*K1*Ms_inverse[i];
if(field_mult==0.0) {
energy[i]=0.0;
field[i].Set(0.,0.,0.);
continue;
}
REAL8m dot = axis*spin[i];
field[i] = (field_mult*dot) * axis;
if(K1>0) {
energy[i] = -K1*(dot*dot-1.0); // Make easy axis zero energy
} else {
energy[i] = -K1*dot*dot; // Easy plane is zero energy
}
}
}