C++ main module for emicrom Package  1.0
EMMG_AnisotropyOperator.h
Go to the documentation of this file.
1 #ifndef EMMG_AnisotropyOperator_H
2 #define EMMG_AnisotropyOperator_H
3 
4 
6 
16 
18  // ATTRIBUTES
19 
20 
21 private:
22 
23 
24 public:
25 
26 
27  // ASSOCIATION
28 
29 private:
30 
31 protected:
32 
33  // METHODS
34 
35  // CONSTRUCTORS
36 
40  }
41 
42  // DESTRUCTORS
43 
46  virtual ~EMMG_AnisotropyOperator(void) {
47  }
48 
49 
50 public:
54  inline static SP::EMMG_AnisotropyOperator New() {
55  SP::EMMG_AnisotropyOperator p(new EMMG_AnisotropyOperator(),
57  p->setThis(p);
58  return p;
59  };
60 
61 
62 public:
69  virtual void computeMagneticExcitationField(const EMM_RealArray& sigma,
70  const EMM_RealField& M,
71  EMM_RealField& H) const {
72  tUIndex nCells=M.getSize();
73  const tDimension& dim=M.getDimension();
74 
75  //set the size of the magnetic excitation field
76  H.setSize(nCells);
77 
78  //no computation
79  if (nCells==0) return;
80 
81  //verify the type of M
82  const EMMG_RealField *gM=dynamic_cast<const EMMG_RealField *>(&M);
83  if (gM==null) throw EMM_Exception("generic","EMMG_AnisotropyOperator::computeMagneticExcitationField(..)",
84  "M is an incompatible real field");
85 
86 
87  //verify the type of H
88  EMMG_RealField *gH=dynamic_cast<EMMG_RealField *>(&H);
89  if (gH==null) throw EMM_Exception("generic","EMMG_AnisotropyOperator:: computeMagneticExcitationField(..)",
90  "H is an incompatible real field");
91 
92  EMM_AnisotropyOperator::computeMagneticExcitationField(nCells,dim,sigma,&(*gM)[0],&(*gH)[0]);
93  }
94 
103  const EMM_RealField& M,
104  const EMM_RealField& D,
105  EMM_RealField& gradH) const {
106 
107  tUIndex nCells=M.getSize();
108  const tDimension &dim=M.getDimension();
109 
110  //set the size of the magnetic excitation field
111  gradH.setSize(nCells);
112 
113  //no computation
114  if (nCells==0) return 0;
115 
116  //verify the type of M
117  const EMMG_RealField *gM=dynamic_cast<const EMMG_RealField *>(&M);
118  if (gM==null) throw EMM_Exception("generic","EMMG_AnisotropyOperator::computeMagneticExcitationFieldGradient(..)",
119  "M is an incompatible real field");
120 
121  //verify the type of D
122  const EMMG_RealField *gD=dynamic_cast<const EMMG_RealField *>(&D);
123  if (gD==null) throw EMM_Exception("generic","EMMG_AnisotropyOperator::computeMagneticExcitationFieldGradient(..)",
124  "D is an incompatible real field");
125 
126 
127  //verify the type of gradH
128  EMMG_RealField *gGradH=dynamic_cast<EMMG_RealField *>(&gradH);
129  if (gGradH==null) throw EMM_Exception("generic","EMMG_AnisotropyOperator::computeMagneticExcitationFieldGradient(..)",
130  "gradH is an incompatible real field");
131 
132  return EMM_AnisotropyOperator::computeMagneticExcitationFieldGradient(nCells,dim,sigma,&(*gM)[0],&(*gD)[0],&(*gGradH)[0]);
133  }
134 
135 
136 public:
154  virtual tReal computeEnergyWithMagneticExcitation(const tReal& t,const EMM_RealArray& sigma,const EMM_RealField& M,const EMM_RealField& H) const {
155  // size of the operator
156  tUIndex nCells=M.getSize();
157  const tDimension& dim=M.getDimension();
158 
159  //no computation
160  if (nCells==0) return 0;
161 
162  //verify the type of M
163  const EMMG_RealField *gM=dynamic_cast<const EMMG_RealField *>(&M);
164  if (gM==null) throw EMM_Exception("generic","EMMG_AnisotropyOperator::computeMagneticExcitationField(..)",
165  "M is an incompatible real field");
166 
167  const EMMG_RealField *gH=dynamic_cast<const EMMG_RealField *>(&H);
168  if (gH==null) throw EMM_Exception("generic","EMMG_AnisotropyOperator::computeMagneticExcitationField(..)",
169  "H is an incompatible real field");
170 
171 
172  return EMM_AnisotropyOperator::computeEnergyWithMagneticExcitation(nCells,dim,sigma,&(*gM)[0],&(*gH)[0]);
173  }
174 
175 
193  virtual tReal computeEnergy(const tReal& t, const EMM_RealArray& sigma,const EMM_RealField& M,EMM_RealField& W) const {
194  return computeMagneticExcitationFieldAndEnergy(t,sigma,M,W);
195  }
196 
197 };
198 
199 #endif
200 
virtual ~EMMG_AnisotropyOperator(void)
destroy
Definition: EMMG_AnisotropyOperator.h:46
virtual tUIndex getSize() const =0
return the size of the field
DEFINE_SPTR(EMMG_AnisotropyOperator)
This class describes a generic real field.
Definition: EMMG_RealField.h:17
SP_OBJECT(EMMG_AnisotropyOperator)
#define tBoolean
Definition: types.h:139
This class describes the mixed anistropy operator EMM_AnisotropyOperator of the landau lifschitz syst...
Definition: EMMG_AnisotropyOperator.h:15
#define null
Definition: types.h:144
#define tDimension
Definition: EMM_Types.h:10
virtual tBoolean computeMagneticExcitationFieldGradient(const tUIndex &nCells, const tDimension &dim, const EMM_RealArray &sigma, const tReal *M, const tReal *D, tReal *gradH) const
compute the gradient of the magnetic excitation field at M in the direction D
Definition: EMM_AnisotropyOperator.cpp:548
virtual void computeMagneticExcitationField(const tUIndex &nCells, const tDimension &dim, const EMM_RealArray &sigma, const tReal *M, tReal *H) const
compute the normalized excitation magnetic field at M
Definition: EMM_AnisotropyOperator.cpp:399
virtual tReal computeEnergyWithMagneticExcitation(const tReal &t, const EMM_RealArray &sigma, const EMM_RealField &M, const EMM_RealField &H) const
compute the energy of the operator
Definition: EMMG_AnisotropyOperator.h:154
virtual tBoolean computeMagneticExcitationFieldGradient(const EMM_RealArray &sigma, const EMM_RealField &M, const EMM_RealField &D, EMM_RealField &gradH) const
compute the gradient of the magnetic excitation field at M in the direction D
Definition: EMMG_AnisotropyOperator.h:102
#define tUIndex
Definition: types.h:126
This class describes a real array.
Definition: EMM_RealArray.h:16
const tDimension & getDimension() const
get the dimension
Definition: EMM_RealField.h:553
static SP::EMMG_AnisotropyOperator New()
create a cubic anisotropy operator
Definition: EMMG_AnisotropyOperator.h:54
virtual void computeMagneticExcitationField(const EMM_RealArray &sigma, const EMM_RealField &M, EMM_RealField &H) const
compute the normalized excitation magnetic field at M
Definition: EMMG_AnisotropyOperator.h:69
virtual tReal computeEnergy(const tReal &t, const EMM_RealArray &sigma, const EMM_RealField &M, EMM_RealField &W) const
compute the energy of the operator
Definition: EMMG_AnisotropyOperator.h:193
EMMG_AnisotropyOperator(void)
create
Definition: EMMG_AnisotropyOperator.h:39
this class describes the exceptions raised for E-MicromM package
Definition: EMM_Exception.h:14
virtual tReal computeEnergyWithMagneticExcitation(const tUIndex &nCells, const tDimension &dim, const EMM_RealArray &sigma, const tReal *M, const tReal *H) const
compute the energy of the anistropy operator
Definition: EMM_AnisotropyOperator.cpp:247
This class describes the mixed anistropy operators of the landau lifschitz system EMM_LandauLifschitz...
Definition: EMM_AnisotropyOperator.h:53
This class describes a real field.
Definition: EMM_RealField.h:21
virtual void setSize(const tUIndex &n)=0
set the size
#define tReal
Definition: types.h:118
tReal computeMagneticExcitationFieldAndEnergy(const tReal &t, const EMM_RealArray &sigma, const EMM_RealField &Mt, EMM_RealField &Ht) const
compute the energy of the operator
Definition: EMM_MagneticExcitationOperator.h:92
class Free introduced for deleting a smart pointer
Definition: CORE_Object.h:141