📄 femmedoccore.cpp
字号:
// FemmeDocCore.cpp : implementation of the CFemmeDocCore class
//
#include <stdafx.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "fkn.h"
#include "fknDlg.h"
#include "complex.h"
#include "mesh.h"
#include "spars.h"
#include "FemmeDocCore.h"
/////////////////////////////////////////////////////////////////////////////
// CFemmeDocCore construction/destruction
CFemmeDocCore::CFemmeDocCore()
{
TheView=NULL;
Frequency=NULL;
Precision=NULL;
Relax=NULL;
LengthUnits=NULL;
ProblemType=NULL;
Coords=NULL;
BandWidth=NULL;
NumNodes=NULL;
NumEls=NULL;
NumBlockProps=NULL;
NumPBCs=NULL;
NumLineProps=NULL;
NumPointProps=NULL;
NumCircProps=NULL;
NumBlockLabels=NULL;
NumCircPropsOrig=NULL;
meshnode=NULL;
meshele=NULL;
blockproplist=NULL;
lineproplist=NULL;
nodeproplist=NULL;
circproplist=NULL;
labellist=NULL;
pbclist=NULL;
PathName=NULL;
extRo=extRi=extZo=NULL;
}
CFemmeDocCore::~CFemmeDocCore()
{
// This space for rent.
}
void CFemmeDocCore::CleanUp()
{
if (meshnode!=NULL) free(meshnode);
if (meshele!=NULL) free(meshele);
if (blockproplist!=NULL){
int k;
for(k=0;k<NumBlockProps;k++)
{
if(blockproplist[k].Bdata!=NULL) free(blockproplist[k].Bdata);
if(blockproplist[k].Hdata!=NULL) free(blockproplist[k].Hdata);
if(blockproplist[k].slope!=NULL) free(blockproplist[k].slope);
}
free(blockproplist);
}
if (lineproplist!=NULL) free(lineproplist);
if (nodeproplist!=NULL) free(nodeproplist);
if (circproplist!=NULL) free(circproplist);
if (labellist!=NULL) free(labellist);
if (pbclist!=NULL) free(pbclist);
}
/////////////////////////////////////////////////////////////////////////////
// CFemmeDocCore commands
char* StripKey(char *c)
{
char *d;
int i,k;
k=strlen(c);
for(i=0;i<k;i++){
if (c[i] == '='){
d=c+i+1;
return d;
}
}
return c+k;
}
BOOL CFemmeDocCore::OnOpenDocument()
{
FILE *fp;
int j,k,ic;
char s[1024],q[1024];
char *v;
CPointProp PProp;
CBoundaryProp BProp;
CMaterialProp MProp;
CCircuit CProp;
CBlockLabel blk;
sprintf(s,"%s.fem",PathName);
if ((fp=fopen(s,"rt"))==NULL){
MsgBox("Couldn't read from specified .fem file");
return FALSE;
}
// define some defaults
Frequency=0.;
Precision=1.e-08;
Relax=1.;
ProblemType=0;
Coords=0;
NumPointProps=0;
NumLineProps=0;
NumBlockProps=0;
NumCircProps=0;
// parse the file
while (fgets(s,1024,fp)!=NULL)
{
sscanf(s,"%s",q);
// Frequency of the problem
if( _strnicmp(q,"[frequency]",11)==0){
v=StripKey(s);
sscanf(v,"%lf",&Frequency);
q[0]=NULL;
}
// Precision
if( _strnicmp(q,"[precision]",11)==0){
v=StripKey(s);
sscanf(v,"%lf",&Precision);
q[0]=NULL;
}
// Units of length used by the problem
if( _strnicmp(q,"[lengthunits]",13)==0){
v=StripKey(s);
sscanf(v,"%s",q);
if( _strnicmp(q,"inches",6)==0) LengthUnits=0;
else if( _strnicmp(q,"millimeters",11)==0) LengthUnits=1;
else if( _strnicmp(q,"centimeters",1)==0) LengthUnits=2;
else if( _strnicmp(q,"mils",4)==0) LengthUnits=4;
else if( _strnicmp(q,"microns",6)==0) LengthUnits=5;
else if( _strnicmp(q,"meters",6)==0) LengthUnits=3;
q[0]=NULL;
}
// Problem Type (planar or axisymmetric)
if( _strnicmp(q,"[problemtype]",13)==0){
v=StripKey(s);
sscanf(v,"%s",q);
if( _strnicmp(q,"planar",6)==0) ProblemType=0;
if( _strnicmp(q,"axisymmetric",3)==0) ProblemType=1;
q[0]=NULL;
}
// Coordinates (cartesian or polar)
if( _strnicmp(q,"[coordinates]",13)==0){
v=StripKey(s);
sscanf(v,"%s",q);
if ( _strnicmp(q,"cartesian",4)==0) Coords=0;
if ( _strnicmp(q,"polar",5)==0) Coords=1;
q[0]=NULL;
}
// properties for axisymmetric external region
if( _strnicmp(q,"[extzo]",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&extZo);
q[0]=NULL;
}
if( _strnicmp(q,"[extro]",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&extRo);
q[0]=NULL;
}
if( _strnicmp(q,"[extri]",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&extRi);
q[0]=NULL;
}
// Point Properties
if( _strnicmp(q,"[pointprops]",12)==0){
v=StripKey(s);
sscanf(v,"%i",&k);
if (k>0) nodeproplist=(CPointProp *)calloc(k,sizeof(CPointProp));
q[0]=NULL;
}
if( _strnicmp(q,"<beginpoint>",11)==0){
PProp.Jr=0.;
PProp.Ji=0.;
PProp.Ar=0.;
PProp.Ai=0.;
q[0]=NULL;
}
if( _strnicmp(q,"<A_re>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&PProp.Ar);
q[0]=NULL;
}
if( _strnicmp(q,"<A_im>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&PProp.Ai);
q[0]=NULL;
}
if( _strnicmp(q,"<I_re>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&PProp.Jr);
q[0]=NULL;
}
if( _strnicmp(q,"<I_im>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&PProp.Ji);
q[0]=NULL;
}
if( _strnicmp(q,"<endpoint>",9)==0){
nodeproplist[NumPointProps]=PProp;
NumPointProps++;
q[0]=NULL;
}
// Boundary Properties;
if( _strnicmp(q,"[bdryprops]",11)==0){
v=StripKey(s);
sscanf(v,"%i",&k);
if (k>0) lineproplist=(CBoundaryProp *)calloc(k,sizeof(CBoundaryProp));
q[0]=NULL;
}
if( _strnicmp(q,"<beginbdry>",11)==0){
BProp.BdryFormat=0;
BProp.A0=0.;
BProp.A1=0.;
BProp.A2=0.;
BProp.phi=0.;
BProp.Mu=0.;
BProp.Sig=0.;
BProp.c0=0.;
BProp.c1=0.;
q[0]=NULL;
}
if( _strnicmp(q,"<bdrytype>",10)==0){
v=StripKey(s);
sscanf(v,"%i",&BProp.BdryFormat);
q[0]=NULL;
}
if( _strnicmp(q,"<mu_ssd>",8)==0){
v=StripKey(s);
sscanf(v,"%lf",&BProp.Mu);
q[0]=NULL;
}
if( _strnicmp(q,"<sigma_ssd>",11)==0){
v=StripKey(s);
sscanf(v,"%lf",&BProp.Sig);
q[0]=NULL;
}
if( _strnicmp(q,"<A_0>",5)==0){
v=StripKey(s);
sscanf(v,"%lf",&BProp.A0);
q[0]=NULL;
}
if( _strnicmp(q,"<A_1>",5)==0){
v=StripKey(s);
sscanf(v,"%lf",&BProp.A1);
q[0]=NULL;
}
if( _strnicmp(q,"<A_2>",5)==0){
v=StripKey(s);
sscanf(v,"%lf",&BProp.A2);
q[0]=NULL;
}
if( _strnicmp(q,"<phi>",5)==0){
v=StripKey(s);
sscanf(v,"%lf",&BProp.phi);
q[0]=NULL;
}
if( _strnicmp(q,"<c0>",4)==0){
v=StripKey(s);
sscanf(v,"%lf",&BProp.c0);
q[0]=NULL;
}
if( _strnicmp(q,"<c1>",4)==0){
v=StripKey(s);
sscanf(v,"%lf",&BProp.c1);
q[0]=NULL;
}
if( _strnicmp(q,"<endbdry>",9)==0){
lineproplist[NumLineProps]=BProp;
NumLineProps++;
q[0]=NULL;
}
// Block Properties;
if( _strnicmp(q,"[blockprops]",12)==0){
v=StripKey(s);
sscanf(v,"%i",&k);
if (k>0) blockproplist=(CMaterialProp *)calloc(k,sizeof(CMaterialProp));
q[0]=NULL;
}
if( _strnicmp(q,"<beginblock>",12)==0){
MProp.mu_x=1.;
MProp.mu_y=1.; // permeabilities, relative
MProp.H_c=0.; // magnetization, A/m
MProp.Jr=0.;
MProp.Ji=0.; // applied current density, MA/m^2
MProp.Cduct=0.; // conductivity of the material, MS/m
MProp.Lam_d=0.; // lamination thickness, mm
MProp.Theta_hn=0.; // hysteresis angle, degrees
MProp.Theta_hx=0.; // hysteresis angle, degrees
MProp.Theta_hy=0.; // hysteresis angle, degrees
MProp.Theta_m=0.; // magnetization direction, degrees;
MProp.LamFill=1.; // lamination fill factor;
MProp.LamType=0; // type of lamination;
MProp.NStrands=0;
MProp.WireD=0;
MProp.BHpoints=0;
MProp.Bdata=NULL;
MProp.Hdata=NULL;
q[0]=NULL;
}
if( _strnicmp(q,"<mu_x>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.mu_x);
q[0]=NULL;
}
if( _strnicmp(q,"<mu_y>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.mu_y);
q[0]=NULL;
}
if( _strnicmp(q,"<H_c>",5)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.H_c);
q[0]=NULL;
}
if( _strnicmp(q,"<H_cAngle>",10)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Theta_m);
q[0]=NULL;
}
if( _strnicmp(q,"<J_re>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Jr);
q[0]=NULL;
}
if( _strnicmp(q,"<J_im>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Ji);
q[0]=NULL;
}
if( _strnicmp(q,"<sigma>",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Cduct);
q[0]=NULL;
}
if( _strnicmp(q,"<phi_h>",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Theta_hn);
q[0]=NULL;
}
if( _strnicmp(q,"<phi_hx>",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Theta_hx);
q[0]=NULL;
}
if( _strnicmp(q,"<phi_hy>",8)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Theta_hy);
q[0]=NULL;
}
if( _strnicmp(q,"<d_lam>",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Lam_d);
q[0]=NULL;
}
if( _strnicmp(q,"<LamFill>",8)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.LamFill);
q[0]=NULL;
}
if( _strnicmp(q,"<WireD>",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.WireD);
q[0]=NULL;
}
if( _strnicmp(q,"<LamType>",9)==0){
v=StripKey(s);
sscanf(v,"%i",&MProp.LamType);
q[0]=NULL;
}
if( _strnicmp(q,"<NStrands>",10)==0){
v=StripKey(s);
sscanf(v,"%i",&MProp.NStrands);
q[0]=NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -