194 lines
4.4 KiB
C++
194 lines
4.4 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// CNode -- structure that holds information about each mesh point.
|
|
|
|
class CNode
|
|
{
|
|
public:
|
|
|
|
double x,y;
|
|
int bc;
|
|
|
|
private:
|
|
|
|
};
|
|
|
|
class CMeshline
|
|
{
|
|
public:
|
|
|
|
int n0,n1;
|
|
|
|
private:
|
|
};
|
|
|
|
class CElement
|
|
{
|
|
public:
|
|
|
|
int p[3];
|
|
int e[3];
|
|
CComplex mu1,mu2,v12;
|
|
int blk;
|
|
int lbl;
|
|
double Jprev;
|
|
|
|
private:
|
|
};
|
|
|
|
class CBlockLabel
|
|
{
|
|
public:
|
|
|
|
double x,y;
|
|
double MaxArea;
|
|
double MagDir;
|
|
int BlockType;
|
|
int InCircuit;
|
|
int InMask;
|
|
int InGroup;
|
|
int Turns;
|
|
BOOL IsExternal;
|
|
BOOL IsDefault;
|
|
char *MagDirFctn;
|
|
|
|
// used for proximity effect regions only.
|
|
CComplex ProximityMu;
|
|
BOOL bIsWound;
|
|
|
|
private:
|
|
|
|
};
|
|
|
|
class CCommonPoint
|
|
{
|
|
public:
|
|
int x,y,t;
|
|
|
|
private:
|
|
};
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Classes that hold property data: CMaterialProp, CBoundaryProp, CPointProp
|
|
class CMaterialProp
|
|
{
|
|
public:
|
|
|
|
double mu_x,mu_y; // permeabilities, relative
|
|
int BHpoints;
|
|
double *Bdata;
|
|
CComplex *Hdata;
|
|
CComplex *slope;
|
|
double H_c; // magnetization, A/m
|
|
double Theta_m; // orientation of magnetization, degrees
|
|
double Jr,Ji; // applied current density, MA/m^2
|
|
double Cduct; // conductivity of the material, MS/m
|
|
double Lam_d; // lamination thickness, mm
|
|
double Theta_hn; // hysteresis angle, degrees
|
|
double Theta_hx; // hysteresis angle, degrees
|
|
double Theta_hy; // hysteresis angle, degrees
|
|
int LamType; // lamination type/orientation
|
|
double LamFill; // lamination fill factor;
|
|
double WireD; // strand diameter, mm
|
|
int NStrands; // number of strands per wire
|
|
double MuMax; // maximum permeability for AC problems
|
|
CMaterialProp();
|
|
~CMaterialProp();
|
|
void GetSlopes();
|
|
void GetSlopes(double omega);
|
|
CComplex GetH(double B);
|
|
CComplex GetdHdB(double B);
|
|
CComplex Get_dvB2(double B);
|
|
CComplex Get_v(double B);
|
|
void GetBHProps(double B, CComplex &v, CComplex &dv);
|
|
void GetBHProps(double B, double &v, double &dv);
|
|
CComplex LaminatedBH(double omega, int i);
|
|
void IncrementalPermeability(double B, double w, CComplex &mu1, CComplex &mu2);
|
|
void IncrementalPermeability(double B, double &mu1, double &mu2);
|
|
|
|
private:
|
|
};
|
|
|
|
class CBoundaryProp
|
|
{
|
|
public:
|
|
|
|
int BdryFormat; // type of boundary condition we are applying
|
|
// 0 = constant value of A
|
|
// 1 = Small skin depth eddy current BC
|
|
// 2 = Mixed BC
|
|
// 3 = SDI boundary (deprecated)
|
|
// 4 = Periodic
|
|
// 5 = Antiperiodic
|
|
// 6 = Periodic AGE
|
|
// 7 = Antiperiodic AGE
|
|
|
|
double A0,A1,A2,phi; // set value of A for BdryFormat=0;
|
|
|
|
double Mu,Sig; // material properties necessary to apply
|
|
// eddy current BC
|
|
|
|
CComplex c0,c1; // coefficients for mixed BC
|
|
|
|
double InnerAngle; // parameters needed to build air gap element
|
|
double OuterAngle;
|
|
|
|
// TO DO: ``flux pipe?'' and ''line currents''
|
|
// Line currents might be redundant, since we already have magnetization.
|
|
|
|
private:
|
|
};
|
|
|
|
class CPointProp
|
|
{
|
|
public:
|
|
|
|
double Jr,Ji; // applied point current, A
|
|
double Ar,Ai; // prescribed nodal value;
|
|
|
|
private:
|
|
};
|
|
|
|
class CCircuit
|
|
{
|
|
public:
|
|
|
|
double dVolts_re, dVolts_im;
|
|
double Amps_re, Amps_im;
|
|
int CircType;
|
|
int OrigCirc;
|
|
|
|
// some member variables used to store some results
|
|
CComplex J;
|
|
CComplex dV;
|
|
int Case;
|
|
|
|
private:
|
|
};
|
|
|
|
class CQuadPoint
|
|
{
|
|
public:
|
|
int n0,n1,n2,n3;
|
|
double w0,w1,w2,w3;
|
|
};
|
|
|
|
class CAirGapElement
|
|
{
|
|
public:
|
|
|
|
char BdryName[80];
|
|
int BdryFormat; // 0 = Periodic
|
|
// 1 = Antiperiodic
|
|
|
|
int totalArcElements; // total elements in the initial meshing
|
|
double totalArcLength; // sum of the angles of all constituent arcs
|
|
double ri,ro; // inner and outer radii of the air gap element
|
|
double InnerAngle; // Angle in degrees through which the inner ring (rotor) is turned
|
|
double OuterAngle; // Angle in degrees through which the inner ring (stator) is turned
|
|
double InnerShift; // fraction of an element that inner mesh is shifted relative to annular mesh
|
|
double OuterShift; // fraction of an element that outer mesh is shifted relative to annular mesh
|
|
CComplex agc; // center of the air gap element
|
|
|
|
CQuadPoint *node; // mapping of mesh nodes onto an annular ring
|
|
|
|
private:
|
|
}; |