298 lines
5.4 KiB
C++
298 lines
5.4 KiB
C++
#include "stdafx.h"
|
|
#include <afx.h>
|
|
#include <afxtempl.h>
|
|
#include "nosebl.h"
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNode construction
|
|
|
|
CNode::CNode()
|
|
{
|
|
x=0.;
|
|
y=0.;
|
|
IsSelected=FALSE;
|
|
InGroup=0;
|
|
BoundaryMarker="<None>";
|
|
}
|
|
|
|
double CNode::GetDistance(double xo, double yo)
|
|
{
|
|
return sqrt((x-xo)*(x-xo) + (y-yo)*(y-yo));
|
|
}
|
|
|
|
CComplex CNode::CC()
|
|
{
|
|
return CComplex(x,y);
|
|
}
|
|
|
|
void CNode::ToggleSelect()
|
|
{
|
|
if (IsSelected==TRUE) IsSelected=FALSE;
|
|
else IsSelected=TRUE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSegment construction
|
|
|
|
CSegment::CSegment()
|
|
{
|
|
n0=0;
|
|
n1=0;
|
|
IsSelected=FALSE;
|
|
Hidden=FALSE;
|
|
MaxSideLength=-1;
|
|
BoundaryMarker="<None>";
|
|
InGroup=0;
|
|
}
|
|
|
|
void CSegment::ToggleSelect()
|
|
{
|
|
if (IsSelected==TRUE) IsSelected=FALSE;
|
|
else IsSelected=TRUE;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CArcSegment construction
|
|
|
|
CArcSegment::CArcSegment()
|
|
{
|
|
n0=0;
|
|
n1=0;
|
|
IsSelected=FALSE;
|
|
Hidden=FALSE;
|
|
ArcLength=90.;
|
|
MaxSideLength=10.;
|
|
mySideLength=1;
|
|
BoundaryMarker="<None>";
|
|
InGroup=0;
|
|
NormalDirection=TRUE;
|
|
}
|
|
|
|
void CArcSegment::ToggleSelect()
|
|
{
|
|
if (IsSelected==TRUE) IsSelected=FALSE;
|
|
else IsSelected=TRUE;
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNode construction
|
|
|
|
CBlockLabel::CBlockLabel()
|
|
{
|
|
x=0.;
|
|
y=0.;
|
|
MaxArea=0.;
|
|
MagDir=0.;
|
|
Turns=1;
|
|
IsSelected=FALSE;
|
|
BlockType="<None>";
|
|
InCircuit="<None>";
|
|
InGroup=0;
|
|
IsExternal=FALSE;
|
|
IsDefault=FALSE;
|
|
}
|
|
|
|
void CBlockLabel::ToggleSelect()
|
|
{
|
|
if (IsSelected==TRUE) IsSelected=FALSE;
|
|
else IsSelected=TRUE;
|
|
}
|
|
|
|
double CBlockLabel::GetDistance(double xo, double yo)
|
|
{
|
|
return sqrt((x-xo)*(x-xo) + (y-yo)*(y-yo));
|
|
}
|
|
|
|
CMaterialProp::CMaterialProp()
|
|
{
|
|
BlockName="New Material";
|
|
mu_x=1.;
|
|
mu_y=1.; // permeabilities, relative
|
|
H_c=0.; // magnetization, A/m
|
|
Jsrc=0; // applied current density, MA/m^2
|
|
Cduct=0.; // conductivity of the material, MS/m
|
|
Lam_d=0.; // lamination thickness, mm
|
|
Theta_hn=0.; // hysteresis angle, degrees
|
|
Theta_hx=0.; // hysteresis angle, degrees
|
|
Theta_hy=0.; // hysteresis angle, degrees
|
|
Theta_m=0.; // magnetization direction, degrees;
|
|
LamFill=1.; // lamination fill factor;
|
|
LamType=0; // type of lamination;
|
|
WireD=0; // strand diameter, mm
|
|
NStrands=0; // number of strands per wire
|
|
|
|
BHpoints=0;
|
|
}
|
|
|
|
CMaterialProp::~CMaterialProp()
|
|
{
|
|
if(BHpoints>0) free(BHdata);
|
|
}
|
|
|
|
void CMaterialProp::StripBHData(CString &b, CString &h)
|
|
{
|
|
int i,k;
|
|
char *buff,*nptr,*endptr;
|
|
double z;
|
|
CArray <double, double> B;
|
|
CArray <double, double> H;
|
|
|
|
if (BHpoints>0) free(BHdata);
|
|
B.RemoveAll();
|
|
H.RemoveAll();
|
|
|
|
k=b.GetLength()+10;
|
|
buff=(char *)calloc(k,sizeof(char));
|
|
strcpy(buff,b);
|
|
nptr=buff;
|
|
while (sscanf(nptr,"%lf",&z)!=EOF){
|
|
z=strtod(nptr,&endptr );
|
|
if(nptr==endptr) nptr++; //catch special case
|
|
else nptr=endptr;
|
|
if(B.GetSize()>0){ // enforce monotonicity
|
|
if (z<=B[B.GetSize()-1])
|
|
break;
|
|
}
|
|
else if(z!=0) B.Add(0);
|
|
B.Add(z);
|
|
}
|
|
free(buff);
|
|
|
|
k=h.GetLength()+10;
|
|
buff=(char *)calloc(k,sizeof(char));
|
|
strcpy(buff,h);
|
|
nptr=buff;
|
|
while (sscanf(nptr,"%lf",&z)!=EOF){
|
|
z=strtod(nptr,&endptr );
|
|
if(nptr==endptr) nptr++;
|
|
else nptr=endptr;
|
|
if(H.GetSize()>0){
|
|
if (z<=H[H.GetSize()-1])
|
|
break;
|
|
}
|
|
else if(z!=0) H.Add(0);
|
|
H.Add(z);
|
|
}
|
|
|
|
k=(int) B.GetSize();
|
|
if ((int) H.GetSize()<k) k=(int) H.GetSize();
|
|
|
|
if (k>1){
|
|
BHpoints=k;
|
|
{
|
|
BHdata=(CComplex *)calloc(k,sizeof(CComplex));
|
|
for(i=0;i<k;i++) BHdata[i].Set(B[i],H[i]);
|
|
}
|
|
}
|
|
else BHpoints=0;
|
|
free(buff);
|
|
|
|
return;
|
|
}
|
|
|
|
void CMaterialProp::BHDataToCString(CString &b, CString &h)
|
|
{
|
|
int i;
|
|
char c[80];
|
|
|
|
b.Empty();
|
|
h.Empty();
|
|
|
|
for(i=0;i<BHpoints;i++){
|
|
sprintf(c,"%f%c%c",BHdata[i].re,0x0D,0x0A);
|
|
b+=c;
|
|
sprintf(c,"%f%c%c",BHdata[i].im,0x0D,0x0A);
|
|
h+=c;
|
|
}
|
|
|
|
b.AnsiToOem();
|
|
h.AnsiToOem();
|
|
}
|
|
|
|
CBoundaryProp::CBoundaryProp()
|
|
{
|
|
BdryName="New Boundary";
|
|
BdryFormat=0; // type of boundary condition we are applying
|
|
// 0 = constant value of A
|
|
// 1 = Small skin depth eddy current BC
|
|
// 2 = Mixed BC
|
|
|
|
A0=0.; A1=0.;
|
|
A2=0.; phi=0.; // set value of A for BdryFormat=0;
|
|
|
|
Mu=0.; Sig=0.; // material properties necessary to apply
|
|
// eddy current BC
|
|
|
|
c0=0.; c1=0.; // coefficients for mixed BC
|
|
|
|
InnerAngle=0; // information for air gap element definition
|
|
OuterAngle=0;
|
|
}
|
|
|
|
CPointProp::CPointProp()
|
|
{
|
|
PointName="New Point Property";
|
|
Jp=0; // applied point current, A
|
|
Ap=0; // prescribed nodal value;
|
|
}
|
|
|
|
CCircuit::CCircuit()
|
|
{
|
|
CircName="New Circuit";
|
|
Amps=0;
|
|
CircType=1;
|
|
};
|
|
|
|
CPeriodicBoundary::CPeriodicBoundary()
|
|
{
|
|
BdryName="";
|
|
BdryFormat=0;
|
|
nseg=0;
|
|
narc=0;
|
|
seg[0]=0;
|
|
seg[1]=0;
|
|
}
|
|
|
|
CAirGapElement::CAirGapElement()
|
|
{
|
|
BdryName="";
|
|
BdryFormat=0;
|
|
|
|
totalArcElements=0;
|
|
totalArcLength=0;
|
|
ri=0;
|
|
ro=0;
|
|
agc=0;
|
|
InnerAngle=0;
|
|
OuterAngle=0;
|
|
node=NULL;
|
|
}
|
|
|
|
CAirGapElement::~CAirGapElement()
|
|
{
|
|
if (node!=NULL) free(node);
|
|
}
|
|
|
|
CCommonPoint::CCommonPoint()
|
|
{
|
|
x=y=t=0;
|
|
}
|
|
|
|
void CCommonPoint::Order()
|
|
{
|
|
int z;
|
|
|
|
if(x>y){
|
|
z=y;
|
|
y=x;
|
|
x=z;
|
|
}
|
|
}
|
|
|
|
CQuadPoint::CQuadPoint()
|
|
{
|
|
n0=n1=-1;
|
|
w0=w1=0;
|
|
} |