⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matlib.cpp

📁 一个2D电磁场FEM计算的VC++源程序
💻 CPP
字号:
// MatLib.cpp : implementation file
//

#include "stdafx.h"
#include "femme.h"
#include "FemmeDoc.h"
#include "MatLib.h"
#include "MatDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMatLib dialog


CMatLib::CMatLib(CWnd* pParent /*=NULL*/)
	: CDialog(CMatLib::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMatLib)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CMatLib::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMatLib)
	DDX_Control(pDX, IDC_INMODEL, m_inmodel);
	DDX_Control(pDX, IDC_INLIBRARY, m_inlibrary);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMatLib, CDialog)
	//{{AFX_MSG_MAP(CMatLib)
	ON_BN_CLICKED(IDC_LIB_MODIFY, OnLibModify)
	ON_BN_CLICKED(IDC_LIB_REMOVE, OnLibRemove)
	ON_BN_CLICKED(IDC_TOMODEL, OnToModel)
	ON_BN_CLICKED(IDC_TOLIBRARY, OnToLibrary)
	ON_BN_CLICKED(IDC_MODEL_DEL, OnModelDel)
	ON_BN_CLICKED(IDC_NEW_LIB_ENTRY, OnNewLibEntry)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMatLib message handlers

void CMatLib::OnLibModify() 
{
	// TODO: Add your control notification handler code here
		CArray <CMaterialProp, CMaterialProp&> &blockproplist=pDoc->blockproplist;
		CMatDlg zDlg;

		if (LibProps.GetSize()==0) return;
		int k=m_inlibrary.GetCurSel();
		if (k==CB_ERR) return;

		zDlg.m_mu_x=LibProps[k].mu_x;
		zDlg.m_mu_y=LibProps[k].mu_y;
		zDlg.m_H_c=LibProps[k].H_c;
		zDlg.m_Jr=LibProps[k].Jr;
		zDlg.m_Ji=LibProps[k].Ji;
		zDlg.m_Cduct=LibProps[k].Cduct;
		zDlg.m_Lam_d=LibProps[k].Lam_d;
		zDlg.m_Theta_hn=LibProps[k].Theta_hn;
		zDlg.m_Theta_hx=LibProps[k].Theta_hx;
		zDlg.m_Theta_hy=LibProps[k].Theta_hy;
		zDlg.m_BlockName=LibProps[k].BlockName;
		zDlg.LamType=LibProps[k].LamType;
		zDlg.m_lam_fill=LibProps[k].LamFill;
	
		if (LibProps[k].BHpoints==0) zDlg.m_nlflag=FALSE;
		else{
			zDlg.m_nlflag=TRUE;
			LibProps[k].BHDataToCString(zDlg.BData,zDlg.HData);
		}

		if(pDoc->ProblemType==0){
			zDlg.m_mu1label="x";
			zDlg.m_mu2label="y";
			zDlg.m_h1label="hx";
			zDlg.m_h2label="hy";
		}
		else{
			zDlg.m_mu1label="r";
			zDlg.m_mu2label="z";
			zDlg.m_h1label="hr";
			zDlg.m_h2label="hz";
		}
		if(zDlg.DoModal()==IDOK){
			LibProps[k].BlockName=zDlg.m_BlockName;
			LibProps[k].mu_x=zDlg.m_mu_x;
			LibProps[k].mu_y=zDlg.m_mu_y;
			LibProps[k].H_c=zDlg.m_H_c;
			LibProps[k].Jr=zDlg.m_Jr;
			LibProps[k].Ji=zDlg.m_Ji;
			LibProps[k].Cduct=zDlg.m_Cduct;
			LibProps[k].Lam_d=zDlg.m_Lam_d;
			LibProps[k].Theta_hn=zDlg.m_Theta_hn;
			LibProps[k].Theta_hx=zDlg.m_Theta_hx;
			LibProps[k].Theta_hy=zDlg.m_Theta_hy;
			LibProps[k].LamType=zDlg.LamType;
			LibProps[k].LamFill=zDlg.m_lam_fill;

			if (zDlg.m_nlflag==FALSE)
			{
				zDlg.BData.Empty();
				zDlg.HData.Empty();
			}
			LibProps[k].StripBHData(zDlg.BData,zDlg.HData);
			
			m_inlibrary.InsertString(k,zDlg.m_BlockName);
			m_inlibrary.DeleteString(k+1);
			m_inlibrary.SetCurSel(k);

		}
}

void CMatLib::OnLibRemove() 
{
	// TODO: Add your control notification handler code here
	
		int k=m_inlibrary.GetCurSel();
		if((k!=CB_ERR) && (LibProps.GetSize()!=0))
		{	
			LibProps.RemoveAt(k);
			m_inlibrary.DeleteString(k);
			m_inlibrary.SetCurSel(0);
		}
}

void CMatLib::OnToModel() 
{
	// TODO: Add your control notification handler code here
	CArray <CMaterialProp, CMaterialProp&> &blockproplist=pDoc->blockproplist;
	int k=m_inlibrary.GetCurSel();
	if (k==CB_ERR) return;
	int i=blockproplist.GetSize();
	int j;

	// check to see if the property has already been included;
	for(j=0;j<i;j++)
		if(blockproplist[j].BlockName==LibProps[k].BlockName){
			AfxMessageBox("Cannot add this property; a property\nwith this name is already in the model");
			return;
		}

	blockproplist.Add(LibProps[k]);
	m_inmodel.AddString(LibProps[k].BlockName);
	m_inmodel.SetCurSel(i);

	if(blockproplist[i].BHpoints!=0){
		blockproplist[i].BHdata=(CComplex *)calloc(blockproplist[i].BHpoints,
			sizeof(CComplex));
		for(j=0;j<blockproplist[i].BHpoints;j++)
			blockproplist[i].BHdata[j]=LibProps[k].BHdata[j];
	}
}

void CMatLib::OnToLibrary() 
{
		// TODO: Add your control notification handler code here
	CArray <CMaterialProp, CMaterialProp&> &blockproplist=pDoc->blockproplist;
	int k=m_inmodel.GetCurSel();
	if (k==CB_ERR) return;
	int i=LibProps.GetSize();
	int j;

	// check to see if the property has already been included;
	for(j=0;j<i;j++)
		if(blockproplist[k].BlockName==LibProps[j].BlockName){
			AfxMessageBox("Cannot add this property; a property\nwith this name is already in the library");
			return;
		}

	LibProps.Add(blockproplist[k]);
	m_inlibrary.AddString(blockproplist[k].BlockName);
	m_inlibrary.SetCurSel(i);

	if(LibProps[i].BHpoints!=0){
		LibProps[i].BHdata=(CComplex *)calloc(LibProps[i].BHpoints,sizeof(CComplex));
		for(j=0;j<LibProps[i].BHpoints;j++)
			LibProps[i].BHdata[j]=blockproplist[k].BHdata[j];
	}
	
}

void CMatLib::OnModelDel() 
{
	// TODO: Add your control notification handler code here
		CArray <CMaterialProp, CMaterialProp&> &blockproplist=pDoc->blockproplist;
		int k=m_inmodel.GetCurSel();
		if((k!=CB_ERR) && (blockproplist.GetSize()!=0))
		{	
			blockproplist.RemoveAt(k);
			m_inmodel.DeleteString(k);
			m_inmodel.SetCurSel(0);
		}
}

BOOL CMatLib::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	CArray<CMaterialProp,CMaterialProp&> &blockproplist=pDoc->blockproplist;
	int i,j,k;

	CString LibName=BinDir+"matlib.dat";

	FILE *fp;
	CMaterialProp MProp;
	char s[1024],q[1024];
	char *v;
	// Put Model's properties into the InModel edit box;
	for(i=0;i<blockproplist.GetSize();i++)
		m_inmodel.AddString(blockproplist[i].BlockName);
	m_inmodel.SetCurSel(0);

	// read in materials library;
	LibProps.RemoveAll();

	if ((fp=fopen(LibName,"rt"))==NULL) return TRUE;

	while (fgets(s,1024,fp)!=NULL)
	{ 
		sscanf(s,"%s",q);

		// Block Properties;
		if( _strnicmp(q,"<beginblock>",12)==0){	
			MProp.BlockName="New Material";
			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.;
			MProp.Theta_hy=0.;
			MProp.LamFill=1.;			// lamination fill factor;	
			MProp.LamType=0;			// type of lamination;
			MProp.BHpoints=0;
			MProp.BHdata=NULL;
			q[0]=NULL;
		}

		if( _strnicmp(q,"<blockname>",10)==0){
			v=StripKey(s);
			k=strlen(v);
			for(i=0;i<k;i++)
				if(v[i]=='\"'){
					v=v+i+1;
					i=k;
				}
			k=strlen(v);
			if(k>0) for(i=k-1;i>=0;i--){
				if(v[i]=='\"'){
					v[i]=0;
					i=-1;
				}
			}
			MProp.BlockName=v;
			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,"<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>",8)==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,"<LamType>",9)==0){
		   v=StripKey(s);
		   sscanf(v,"%i",&MProp.LamType);
		   q[0]=NULL;
		}	

		if( _strnicmp(q,"<BHPoints>",10)==0){
			v=StripKey(s);
			sscanf(v,"%i",&MProp.BHpoints);
			if (MProp.BHpoints>0)
			{
				MProp.BHdata=(CComplex *)calloc(MProp.BHpoints,sizeof(CComplex));
				for(j=0;j<MProp.BHpoints;j++){
					fgets(s,1024,fp);
					sscanf(s,"%lf	%lf",&MProp.BHdata[j].re,&MProp.BHdata[j].im);
				}
			}
			q[0]=NULL;
		}

		if( _strnicmp(q,"<endblock>",9)==0){
			LibProps.Add(MProp);
			MProp.BHpoints=0;
			q[0]=NULL;
		}
	}
	MProp.BHpoints=0;

	fclose(fp);

	// Put Library's properties into the InLibrary edit box;
	for(i=0;i<LibProps.GetSize();i++)
		m_inlibrary.AddString(LibProps[i].BlockName);
	m_inlibrary.SetCurSel(0);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CMatLib::OnOK() 
{
	int i,j;

	CString LibName=BinDir+"matlib.dat";

	FILE *fp;

	if ((fp=fopen(LibName,"wt"))==NULL) return;
	for(i=0;i<LibProps.GetSize();i++)
	{
		fprintf(fp,"<BeginBlock>\n");
		fprintf(fp,"<BlockName> = \"%s\"\n",LibProps[i].BlockName);
		fprintf(fp,"<Mu_x> = %.17g\n",LibProps[i].mu_x);
		fprintf(fp,"<Mu_y> = %.17g\n",LibProps[i].mu_y);
		fprintf(fp,"<H_c> = %.17g\n",LibProps[i].H_c);
		fprintf(fp,"<H_cAngle> = %.17g\n",LibProps[i].Theta_m);
		fprintf(fp,"<J_re> = %.17g\n",LibProps[i].Jr);
		fprintf(fp,"<J_im> = %.17g\n",LibProps[i].Ji);
		fprintf(fp,"<Sigma> = %.17g\n",LibProps[i].Cduct);
		fprintf(fp,"<d_lam> = %.17g\n",LibProps[i].Lam_d);
		fprintf(fp,"<Phi_h> = %.17g\n",LibProps[i].Theta_hn);
		fprintf(fp,"<Phi_hx> = %.17g\n",LibProps[i].Theta_hx);
		fprintf(fp,"<Phi_hy> = %.17g\n",LibProps[i].Theta_hy);
		fprintf(fp,"<LamType> = %i\n",LibProps[i].LamType);
		fprintf(fp,"<LamFill> = %.17g\n",LibProps[i].LamFill);
		fprintf(fp,"<BHPoints> = %i\n",LibProps[i].BHpoints);
		for(j=0;j<LibProps[i].BHpoints;j++)
			fprintf(fp,"	%.17g	%.17g\n",LibProps[i].BHdata[j].re,
					LibProps[i].BHdata[j].im);
		fprintf(fp,"<EndBlock>\n\n");
	}
	fclose(fp);
	
	CDialog::OnOK();


}

void CMatLib::OnNewLibEntry() 
{
	// TODO: Add your control notification handler code here
	CMaterialProp MProp;
	int k=LibProps.GetSize();
	LibProps.Add(MProp);
	m_inlibrary.AddString(LibProps[k].BlockName);
	m_inlibrary.SetCurSel(k);
	OnLibModify();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -