2010-03-11 15:47:40 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2010 Thorsten Liebig (Thorsten.Liebig@gmx.de)
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2010-03-07 11:49:38 +00:00
|
|
|
#include "FDTD_examples.h"
|
|
|
|
#include "../tools/constants.h"
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
void BuildDipol(const char* filename)
|
2010-03-07 11:49:38 +00:00
|
|
|
{
|
2010-03-11 09:56:19 +00:00
|
|
|
int maxIter = 1000;
|
2010-03-11 14:35:12 +00:00
|
|
|
double f0=0.5e9;
|
|
|
|
double fc=0.5e9;
|
2010-03-11 09:56:19 +00:00
|
|
|
int Excit_Type=0;
|
|
|
|
int bounds[] = {1,1,0,0,0,0};
|
|
|
|
|
|
|
|
cerr << "Create Geometry..." << endl;
|
|
|
|
ContinuousStructure CSX;
|
|
|
|
|
2010-03-07 11:49:38 +00:00
|
|
|
CSPropMaterial* mat = new CSPropMaterial(CSX.GetParameterSet());
|
|
|
|
mat->SetKappa(0.001);
|
|
|
|
CSX.AddProperty(mat);
|
|
|
|
|
|
|
|
CSPrimBox* matbox = new CSPrimBox(CSX.GetParameterSet(),mat);
|
|
|
|
matbox->SetCoord(0,-1000.0);matbox->SetCoord(1,1000.0);
|
|
|
|
matbox->SetCoord(2,-1000.0);matbox->SetCoord(3,1000.0);
|
|
|
|
matbox->SetCoord(4,-1000.0);matbox->SetCoord(5,1000.0);
|
|
|
|
CSX.AddPrimitive(matbox);
|
|
|
|
|
|
|
|
CSPropElectrode* elec = new CSPropElectrode(CSX.GetParameterSet());
|
|
|
|
elec->SetExcitation(1,1);
|
|
|
|
elec->SetExcitType(1);
|
|
|
|
elec->SetActiveDir(0,0);//disable x
|
|
|
|
elec->SetActiveDir(0,2);//disable z
|
|
|
|
// elec->SetDelay(2.0e-9);
|
|
|
|
CSX.AddProperty(elec);
|
|
|
|
|
|
|
|
CSPrimBox* box = new CSPrimBox(CSX.GetParameterSet(),elec);
|
|
|
|
box->SetCoord(0,-10.0);box->SetCoord(1,10.0);
|
|
|
|
box->SetCoord(2,-75.0);box->SetCoord(3,75.0);
|
|
|
|
box->SetCoord(4,-10.0);box->SetCoord(5,10.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
CSRectGrid* grid = CSX.GetGrid();
|
|
|
|
|
|
|
|
for (int n=-990;n<=990;n+=20)
|
|
|
|
grid->AddDiscLine(2,(double)n);
|
|
|
|
for (int n=-990;n<=990;n+=20)
|
|
|
|
grid->AddDiscLine(0,(double)n);
|
|
|
|
for (int n=-990;n<=990;n+=20)
|
|
|
|
grid->AddDiscLine(1,(double)n);
|
|
|
|
|
|
|
|
grid->SetDeltaUnit(1e-3);
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
//*************** Create XML file **********************
|
|
|
|
TiXmlDocument doc(filename);
|
|
|
|
doc.InsertEndChild(TiXmlDeclaration("1.0","ISO-8859-1","yes"));
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
TiXmlElement openEMS("openEMS");
|
|
|
|
|
|
|
|
TiXmlElement FDTD_Opts("FDTD");
|
2010-03-11 09:56:19 +00:00
|
|
|
FDTD_Opts.SetAttribute("NumberOfTimesteps",maxIter);
|
|
|
|
|
|
|
|
TiXmlElement Excite("Excitation");
|
|
|
|
Excite.SetAttribute("Type",Excit_Type);
|
2010-03-11 14:35:12 +00:00
|
|
|
Excite.SetAttribute("f0",f0);
|
|
|
|
Excite.SetAttribute("fc",fc);
|
2010-03-11 09:56:19 +00:00
|
|
|
FDTD_Opts.InsertEndChild(Excite);
|
|
|
|
|
|
|
|
TiXmlElement BC("BoundaryCond");
|
|
|
|
BC.SetAttribute("xmin",bounds[0]);
|
|
|
|
BC.SetAttribute("xmax",bounds[1]);
|
|
|
|
BC.SetAttribute("ymin",bounds[2]);
|
|
|
|
BC.SetAttribute("ymax",bounds[3]);
|
|
|
|
BC.SetAttribute("zmin",bounds[4]);
|
|
|
|
BC.SetAttribute("zmax",bounds[5]);
|
|
|
|
FDTD_Opts.InsertEndChild(BC);
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
openEMS.InsertEndChild(FDTD_Opts);
|
2010-03-11 09:56:19 +00:00
|
|
|
|
2010-03-22 21:30:18 +00:00
|
|
|
if (CSX.Write2XML(&openEMS,true,true)==false)
|
2010-03-11 09:56:19 +00:00
|
|
|
{
|
|
|
|
cerr << "writing failed" << endl;
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
doc.InsertEndChild(openEMS);
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
doc.SaveFile();
|
2010-03-07 11:49:38 +00:00
|
|
|
}
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
void BuildPlaneWave(const char* filename)
|
2010-03-07 11:49:38 +00:00
|
|
|
{
|
2010-03-16 20:43:11 +00:00
|
|
|
int maxIter = 10000;
|
2010-03-11 14:35:12 +00:00
|
|
|
double f0=0.5e9;
|
|
|
|
double fc=0.5e9;
|
2010-03-11 09:56:19 +00:00
|
|
|
int Excit_Type=0;
|
|
|
|
int bounds[] = {1,1,0,0,0,0};
|
|
|
|
|
|
|
|
cerr << "Create Geometry..." << endl;
|
|
|
|
ContinuousStructure CSX;
|
|
|
|
|
2010-03-07 21:00:01 +00:00
|
|
|
double width = 1000;
|
|
|
|
double hight = 1000;
|
|
|
|
double length = 4000;
|
|
|
|
double abs_l = 200;
|
|
|
|
|
|
|
|
CSPrimBox* box = NULL;
|
|
|
|
//fake pml....
|
|
|
|
CSPropMaterial* mat = new CSPropMaterial(CSX.GetParameterSet());
|
|
|
|
// mat->SetEpsilon(3.6);
|
|
|
|
double finalKappa = 0.3/pow(abs_l,4);
|
|
|
|
mat->SetKappa(finalKappa);
|
|
|
|
std::ostringstream fct;
|
|
|
|
fct << "pow(abs(z)-" << length/2.0-abs_l << ",4)";
|
|
|
|
mat->SetKappaWeightFunction(fct.str(),0);
|
|
|
|
mat->SetKappaWeightFunction(fct.str(),1);
|
|
|
|
mat->SetKappaWeightFunction(fct.str(),2);
|
|
|
|
mat->SetSigma(finalKappa*__MUE0__/__EPS0__);
|
|
|
|
mat->SetSigmaWeightFunction(fct.str(),0);
|
|
|
|
mat->SetSigmaWeightFunction(fct.str(),1);
|
|
|
|
mat->SetSigmaWeightFunction(fct.str(),2);
|
|
|
|
CSX.AddProperty(mat);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),mat);
|
|
|
|
box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0);
|
|
|
|
box->SetCoord(2,hight/-2.0);box->SetCoord(3,hight/2.0);
|
|
|
|
box->SetCoord(4,length/2.0-abs_l); box->SetCoord(5,length/2.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),mat);
|
|
|
|
box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0);
|
|
|
|
box->SetCoord(2,hight/-2.0);box->SetCoord(3,hight/2.0);
|
|
|
|
box->SetCoord(4,length/-2.0+abs_l); box->SetCoord(5,length/-2.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
CSPropMaterial* mat2 = new CSPropMaterial(CSX.GetParameterSet());
|
|
|
|
mat2->SetEpsilon(2);
|
|
|
|
CSX.AddProperty(mat2);
|
2010-03-22 07:19:17 +00:00
|
|
|
CSPrimCylindricalShell* cylshell = new CSPrimCylindricalShell(CSX.GetParameterSet(),mat2);
|
|
|
|
cylshell->SetRadius(length/4.0);
|
|
|
|
cylshell->SetShellWidth(200.0);
|
|
|
|
cylshell->SetCoord(0,0.0);cylshell->SetCoord(1,0.0);
|
|
|
|
cylshell->SetCoord(2,hight/-2.0);cylshell->SetCoord(3,hight/2.0);
|
|
|
|
cylshell->SetCoord(4,0.0);cylshell->SetCoord(5,0.0);
|
|
|
|
CSX.AddPrimitive(cylshell);
|
2010-03-07 11:49:38 +00:00
|
|
|
|
|
|
|
CSPropElectrode* elec = new CSPropElectrode(CSX.GetParameterSet());
|
|
|
|
elec->SetExcitation(1,1);
|
|
|
|
elec->SetExcitType(0);
|
|
|
|
elec->SetActiveDir(0,0);//disable x
|
|
|
|
elec->SetActiveDir(0,2);//disable z
|
|
|
|
// elec->SetDelay(2.0e-9);
|
|
|
|
CSX.AddProperty(elec);
|
|
|
|
|
2010-03-07 21:00:01 +00:00
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),elec);
|
|
|
|
box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0);
|
|
|
|
box->SetCoord(2,hight/-2.0);box->SetCoord(3,hight/2.0);
|
|
|
|
box->SetCoord(4,0.0);box->SetCoord(5,0.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
//E-field dump
|
|
|
|
CSPropDumpBox* Edump = new CSPropDumpBox(CSX.GetParameterSet());
|
2010-03-10 11:15:14 +00:00
|
|
|
Edump->SetDumpType(0);
|
2010-03-12 07:39:32 +00:00
|
|
|
Edump->SetName("Et_");
|
2010-03-07 21:00:01 +00:00
|
|
|
CSX.AddProperty(Edump);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),Edump);
|
|
|
|
box->SetCoord(0,width/-3.0);box->SetCoord(1,width/3.0);
|
|
|
|
box->SetCoord(2,0.0);box->SetCoord(3,0.0);
|
|
|
|
box->SetCoord(4,length/-2.0+abs_l);box->SetCoord(5,length/2.0-abs_l);
|
2010-03-07 11:49:38 +00:00
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
2010-03-10 11:15:14 +00:00
|
|
|
//H-field dump
|
|
|
|
CSPropDumpBox* Hdump = new CSPropDumpBox(CSX.GetParameterSet());
|
|
|
|
Hdump->SetDumpType(1);
|
2010-03-12 07:39:32 +00:00
|
|
|
Hdump->SetName("Ht_");
|
2010-03-10 11:15:14 +00:00
|
|
|
CSX.AddProperty(Hdump);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),Hdump);
|
|
|
|
box->SetCoord(0,width/-3.0);box->SetCoord(1,width/3.0);
|
|
|
|
box->SetCoord(2,0.0);box->SetCoord(3,0.0);
|
|
|
|
box->SetCoord(4,length/-2.0+abs_l);box->SetCoord(5,length/2.0-abs_l);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
2010-03-07 21:00:01 +00:00
|
|
|
// CSPropMetal* metal = new CSPropMetal(CSX.GetParameterSet());
|
|
|
|
// CSX.AddProperty(metal);
|
|
|
|
// CSPrimCylinder* cyl = new CSPrimCylinder(CSX.GetParameterSet(),metal);
|
|
|
|
// cyl->SetRadius(100);
|
|
|
|
// cyl->SetCoord(0,0.0);cyl->SetCoord(1,0.0);
|
|
|
|
// cyl->SetCoord(2,-250.0);cyl->SetCoord(3,250.0);
|
|
|
|
// cyl->SetCoord(4,-0000.0);cyl->SetCoord(5,-0000.0);
|
|
|
|
// CSX.AddPrimitive(cyl);
|
2010-03-07 11:49:38 +00:00
|
|
|
|
|
|
|
CSRectGrid* grid = CSX.GetGrid();
|
|
|
|
|
2010-03-07 21:00:01 +00:00
|
|
|
for (int n=width/-2.0;n<=width/2;n+=20)
|
2010-03-07 11:49:38 +00:00
|
|
|
grid->AddDiscLine(0,(double)n);
|
2010-03-07 21:00:01 +00:00
|
|
|
for (int n=hight/-2.0;n<=hight/2.0;n+=20)
|
2010-03-07 11:49:38 +00:00
|
|
|
grid->AddDiscLine(1,(double)n);
|
2010-03-07 21:00:01 +00:00
|
|
|
for (int n=length/-2.0;n<=length/2.0;n+=20)
|
2010-03-07 11:49:38 +00:00
|
|
|
grid->AddDiscLine(2,(double)n);
|
|
|
|
|
|
|
|
grid->SetDeltaUnit(1e-3);
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
//*************** Create XML file **********************
|
|
|
|
TiXmlDocument doc(filename);
|
|
|
|
doc.InsertEndChild(TiXmlDeclaration("1.0","ISO-8859-1","yes"));
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
TiXmlElement openEMS("openEMS");
|
|
|
|
|
|
|
|
TiXmlElement FDTD_Opts("FDTD");
|
2010-03-11 09:56:19 +00:00
|
|
|
FDTD_Opts.SetAttribute("NumberOfTimesteps",maxIter);
|
|
|
|
|
|
|
|
TiXmlElement Excite("Excitation");
|
|
|
|
Excite.SetAttribute("Type",Excit_Type);
|
2010-03-11 14:35:12 +00:00
|
|
|
Excite.SetAttribute("f0",f0);
|
|
|
|
Excite.SetAttribute("fc",fc);
|
2010-03-11 09:56:19 +00:00
|
|
|
FDTD_Opts.InsertEndChild(Excite);
|
|
|
|
|
|
|
|
TiXmlElement BC("BoundaryCond");
|
|
|
|
BC.SetAttribute("xmin",bounds[0]);
|
|
|
|
BC.SetAttribute("xmax",bounds[1]);
|
|
|
|
BC.SetAttribute("ymin",bounds[2]);
|
|
|
|
BC.SetAttribute("ymax",bounds[3]);
|
|
|
|
BC.SetAttribute("zmin",bounds[4]);
|
|
|
|
BC.SetAttribute("zmax",bounds[5]);
|
|
|
|
FDTD_Opts.InsertEndChild(BC);
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
openEMS.InsertEndChild(FDTD_Opts);
|
2010-03-11 09:56:19 +00:00
|
|
|
|
2010-03-22 21:30:18 +00:00
|
|
|
if (CSX.Write2XML(&openEMS,true,true)==false)
|
2010-03-11 09:56:19 +00:00
|
|
|
{
|
|
|
|
cerr << "writing failed" << endl;
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
doc.InsertEndChild(openEMS);
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
doc.SaveFile();
|
2010-03-07 11:49:38 +00:00
|
|
|
}
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
void BuildMSL(const char* filename)
|
2010-03-07 11:49:38 +00:00
|
|
|
{
|
2010-03-15 19:49:31 +00:00
|
|
|
int maxIter = 10000;
|
2010-03-11 14:35:12 +00:00
|
|
|
double f0=0.5e9;
|
|
|
|
double fc=0.5e9;
|
2010-03-11 09:56:19 +00:00
|
|
|
int Excit_Type=0;
|
|
|
|
int bounds[] = {1,1,0,0,0,0};
|
|
|
|
|
|
|
|
cerr << "Create Geometry..." << endl;
|
|
|
|
ContinuousStructure CSX;
|
|
|
|
|
2010-03-07 11:49:38 +00:00
|
|
|
double width = 1000;
|
2010-03-11 09:56:19 +00:00
|
|
|
double height = 500;
|
2010-03-07 11:49:38 +00:00
|
|
|
double length = 2000;
|
|
|
|
double abs_l = 200;
|
2010-03-11 09:56:19 +00:00
|
|
|
double MSL_height=50;
|
|
|
|
double MSL_width=80;
|
|
|
|
double delta[] = {20,10,20};
|
2010-03-07 11:49:38 +00:00
|
|
|
|
|
|
|
//substrate....
|
|
|
|
CSPropMaterial* mat = new CSPropMaterial(CSX.GetParameterSet());
|
|
|
|
// mat->SetEpsilon(3.6);
|
2010-03-07 21:00:01 +00:00
|
|
|
double finalKappa = 0.3/pow(abs_l,4);
|
2010-03-07 11:49:38 +00:00
|
|
|
mat->SetKappa(finalKappa);
|
|
|
|
std::ostringstream fct;
|
|
|
|
fct << "pow(abs(z)-" << length/2.0-abs_l << ",4)";
|
|
|
|
mat->SetKappaWeightFunction(fct.str(),0);
|
|
|
|
mat->SetKappaWeightFunction(fct.str(),1);
|
|
|
|
mat->SetKappaWeightFunction(fct.str(),2);
|
|
|
|
mat->SetSigma(finalKappa*__MUE0__/__EPS0__);
|
|
|
|
mat->SetSigmaWeightFunction(fct.str(),0);
|
|
|
|
mat->SetSigmaWeightFunction(fct.str(),1);
|
|
|
|
mat->SetSigmaWeightFunction(fct.str(),2);
|
|
|
|
CSX.AddProperty(mat);
|
|
|
|
CSPrimBox* box = new CSPrimBox(CSX.GetParameterSet(),mat);
|
|
|
|
box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0);
|
2010-03-11 09:56:19 +00:00
|
|
|
box->SetCoord(2,0.0);box->SetCoord(3,height);
|
2010-03-07 11:49:38 +00:00
|
|
|
box->SetCoord(4,length/2.0-abs_l); box->SetCoord(5,length/2.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
// box = new CSPrimBox(CSX.GetParameterSet(),mat);
|
|
|
|
// box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0);
|
|
|
|
// box->SetCoord(2,0.0);box->SetCoord(3,hight);
|
|
|
|
// box->SetCoord(4,length/-2.0+abs_l); box->SetCoord(5,length/-2.0);
|
|
|
|
// CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
//MSL
|
2010-03-11 09:56:19 +00:00
|
|
|
CSProperties* MSL = NULL;
|
2010-03-12 19:39:04 +00:00
|
|
|
CSPropMaterial* MSL_mat = new CSPropMaterial(CSX.GetParameterSet());
|
|
|
|
MSL_mat->SetKappa(56e6);
|
|
|
|
MSL = MSL_mat;
|
|
|
|
// MSL = new CSPropMetal(CSX.GetParameterSet());
|
2010-03-11 09:56:19 +00:00
|
|
|
|
2010-03-07 11:49:38 +00:00
|
|
|
CSX.AddProperty(MSL);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),MSL);
|
2010-03-11 09:56:19 +00:00
|
|
|
box->SetCoord(0,MSL_width/-2.0);box->SetCoord(1,MSL_width/2.0);
|
|
|
|
box->SetCoord(2,MSL_height);box->SetCoord(3,MSL_height+delta[1]);
|
2010-03-07 11:49:38 +00:00
|
|
|
box->SetCoord(4,length/-2);box->SetCoord(5,length/2.0);
|
|
|
|
box->SetPriority(100);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
//MSL excite...
|
|
|
|
CSPropElectrode* elec = new CSPropElectrode(CSX.GetParameterSet());
|
|
|
|
elec->SetExcitation(-1,1);
|
|
|
|
elec->SetExcitType(0);
|
|
|
|
// elec->SetDelay(2.0e-9);
|
|
|
|
CSX.AddProperty(elec);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),elec);
|
|
|
|
box->SetCoord(0,-40.0);box->SetCoord(1,40.0);
|
|
|
|
box->SetCoord(2,0.0);box->SetCoord(3,50.0);
|
|
|
|
box->SetCoord(4,length/-2.0);box->SetCoord(5,length/-2.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
CSPropDumpBox* Edump = NULL;
|
|
|
|
// //E-field dump xz
|
|
|
|
// Edump = new CSPropDumpBox(CSX.GetParameterSet());
|
|
|
|
// Edump->SetDumpType(0);
|
2010-03-12 07:39:32 +00:00
|
|
|
// Edump->SetName("Et_xz_");
|
2010-03-11 09:56:19 +00:00
|
|
|
// CSX.AddProperty(Edump);
|
|
|
|
// box = new CSPrimBox(CSX.GetParameterSet(),Edump);
|
|
|
|
// box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0);
|
|
|
|
// box->SetCoord(2,25.0);box->SetCoord(3,25.);
|
|
|
|
// box->SetCoord(4,length/-2.0);box->SetCoord(5,length/2.0);
|
|
|
|
// CSX.AddPrimitive(box);
|
|
|
|
//
|
|
|
|
// //E-field dump xy
|
|
|
|
// Edump = new CSPropDumpBox(CSX.GetParameterSet());
|
|
|
|
// Edump->SetDumpType(0);
|
2010-03-12 07:39:32 +00:00
|
|
|
// Edump->SetName("Et_xy_");
|
2010-03-11 09:56:19 +00:00
|
|
|
// CSX.AddProperty(Edump);
|
|
|
|
// box = new CSPrimBox(CSX.GetParameterSet(),Edump);
|
|
|
|
// box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0);
|
|
|
|
// box->SetCoord(2,0.0);box->SetCoord(3,height);
|
|
|
|
// box->SetCoord(4,0.0);box->SetCoord(5,0.0);
|
|
|
|
// CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
//E-field dump 3D
|
|
|
|
Edump = new CSPropDumpBox(CSX.GetParameterSet());
|
2010-03-10 11:15:14 +00:00
|
|
|
Edump->SetDumpType(0);
|
2010-03-11 09:56:19 +00:00
|
|
|
Edump->SetDumpMode(2); //cell interpolated dump
|
2010-03-12 07:39:32 +00:00
|
|
|
Edump->SetName("Et_");
|
2010-03-07 11:49:38 +00:00
|
|
|
CSX.AddProperty(Edump);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),Edump);
|
2010-03-11 09:56:19 +00:00
|
|
|
box->SetCoord(0,MSL_width*-1.5);box->SetCoord(1,MSL_width*1.5);
|
|
|
|
box->SetCoord(2,0.0);box->SetCoord(3,MSL_height*1.5);
|
2010-03-07 11:49:38 +00:00
|
|
|
box->SetCoord(4,length/-2.0);box->SetCoord(5,length/2.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
//voltage calc
|
|
|
|
CSPropProbeBox* volt = new CSPropProbeBox(CSX.GetParameterSet());
|
|
|
|
volt->SetProbeType(0);
|
2010-03-12 07:39:32 +00:00
|
|
|
volt->SetName("u1");
|
2010-03-11 09:56:19 +00:00
|
|
|
CSX.AddProperty(volt);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),volt);
|
|
|
|
box->SetCoord(0,0.0);box->SetCoord(1,0.0);
|
|
|
|
box->SetCoord(2,MSL_height);box->SetCoord(3,0.0);
|
|
|
|
box->SetCoord(4,0.0);box->SetCoord(5,0.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
//current calc
|
|
|
|
CSPropProbeBox* curr = new CSPropProbeBox(CSX.GetParameterSet());
|
|
|
|
curr->SetProbeType(1);
|
2010-03-12 07:39:32 +00:00
|
|
|
curr->SetName("i1");
|
2010-03-11 09:56:19 +00:00
|
|
|
CSX.AddProperty(curr);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),curr);
|
|
|
|
box->SetCoord(0,MSL_width*-1.5);box->SetCoord(1,MSL_width*1.5);
|
|
|
|
box->SetCoord(2,MSL_height/2.0);box->SetCoord(3,MSL_height*1.5);
|
|
|
|
box->SetCoord(4,0.0);box->SetCoord(5,0.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
2010-03-07 11:49:38 +00:00
|
|
|
CSRectGrid* grid = CSX.GetGrid();
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
for (double n=width/-2.0;n<=width/2;n+=delta[0])
|
2010-03-07 11:49:38 +00:00
|
|
|
grid->AddDiscLine(0,n);
|
2010-03-11 09:56:19 +00:00
|
|
|
for (double n=0;n<=height;n+=delta[1])
|
2010-03-07 11:49:38 +00:00
|
|
|
grid->AddDiscLine(1,n);
|
2010-03-11 09:56:19 +00:00
|
|
|
for (double n=length/-2.0;n<=length/2.0;n+=delta[2])
|
2010-03-07 11:49:38 +00:00
|
|
|
grid->AddDiscLine(2,n);
|
|
|
|
|
|
|
|
grid->SetDeltaUnit(1e-3);
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
//*************** Create XML file **********************
|
|
|
|
TiXmlDocument doc(filename);
|
|
|
|
doc.InsertEndChild(TiXmlDeclaration("1.0","ISO-8859-1","yes"));
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
TiXmlElement openEMS("openEMS");
|
|
|
|
|
|
|
|
TiXmlElement FDTD_Opts("FDTD");
|
2010-03-11 09:56:19 +00:00
|
|
|
FDTD_Opts.SetAttribute("NumberOfTimesteps",maxIter);
|
|
|
|
|
|
|
|
TiXmlElement Excite("Excitation");
|
|
|
|
Excite.SetAttribute("Type",Excit_Type);
|
2010-03-11 14:35:12 +00:00
|
|
|
Excite.SetAttribute("f0",f0);
|
|
|
|
Excite.SetAttribute("fc",fc);
|
2010-03-11 09:56:19 +00:00
|
|
|
FDTD_Opts.InsertEndChild(Excite);
|
|
|
|
|
|
|
|
TiXmlElement BC("BoundaryCond");
|
|
|
|
BC.SetAttribute("xmin",bounds[0]);
|
|
|
|
BC.SetAttribute("xmax",bounds[1]);
|
|
|
|
BC.SetAttribute("ymin",bounds[2]);
|
|
|
|
BC.SetAttribute("ymax",bounds[3]);
|
|
|
|
BC.SetAttribute("zmin",bounds[4]);
|
|
|
|
BC.SetAttribute("zmax",bounds[5]);
|
|
|
|
FDTD_Opts.InsertEndChild(BC);
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
openEMS.InsertEndChild(FDTD_Opts);
|
2010-03-11 09:56:19 +00:00
|
|
|
|
2010-03-22 21:30:18 +00:00
|
|
|
if (CSX.Write2XML(&openEMS,true,true)==false)
|
2010-03-11 09:56:19 +00:00
|
|
|
{
|
|
|
|
cerr << "writing failed" << endl;
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
doc.InsertEndChild(openEMS);
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
doc.SaveFile();
|
2010-03-07 11:49:38 +00:00
|
|
|
}
|
|
|
|
|
2010-03-11 14:35:12 +00:00
|
|
|
void BuildCoaxial_Cartesian(const char* filename)
|
|
|
|
{
|
|
|
|
int maxIter = 1000;
|
|
|
|
double f0=1e9;
|
|
|
|
double fc=1e9;
|
|
|
|
int Excit_Type=0;
|
|
|
|
int bounds[] = {0,0,0,0,0,0};
|
|
|
|
|
|
|
|
cerr << "Create Geometry..." << endl;
|
|
|
|
ContinuousStructure CSX;
|
|
|
|
|
|
|
|
double rad[] = {100, 230};
|
|
|
|
double length[] = {-500,1500};
|
|
|
|
double abs_l = 200;
|
|
|
|
|
|
|
|
double delta[] = {5,5,10};
|
|
|
|
|
|
|
|
CSPrimBox* box = NULL;
|
|
|
|
//fake pml....
|
|
|
|
CSPropMaterial* mat = new CSPropMaterial(CSX.GetParameterSet());
|
|
|
|
// mat->SetEpsilon(3.6);
|
|
|
|
double finalKappa = 0.3/pow(abs_l,4);
|
|
|
|
mat->SetKappa(finalKappa);
|
|
|
|
std::ostringstream fct;
|
|
|
|
fct << "pow(abs(z)-" << length[1]-abs_l << ",4)";
|
|
|
|
mat->SetKappaWeightFunction(fct.str(),0);
|
|
|
|
mat->SetKappaWeightFunction(fct.str(),1);
|
|
|
|
mat->SetKappaWeightFunction(fct.str(),2);
|
|
|
|
mat->SetSigma(finalKappa*__MUE0__/__EPS0__);
|
|
|
|
mat->SetSigmaWeightFunction(fct.str(),0);
|
|
|
|
mat->SetSigmaWeightFunction(fct.str(),1);
|
|
|
|
mat->SetSigmaWeightFunction(fct.str(),2);
|
|
|
|
CSX.AddProperty(mat);
|
|
|
|
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),mat);
|
|
|
|
box->SetCoord(0,-1.0*rad[1]);box->SetCoord(1,1.0*rad[1]);
|
|
|
|
box->SetCoord(2,-1.0*rad[1]);box->SetCoord(3,1.0*rad[1]);
|
|
|
|
box->SetCoord(4,length[1]-abs_l); box->SetCoord(5,length[1]);
|
|
|
|
box->SetPriority(10);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
CSPropElectrode* elec = new CSPropElectrode(CSX.GetParameterSet());
|
|
|
|
elec->SetExcitation(1.0,0);
|
|
|
|
elec->SetExcitation(1.0,1);
|
|
|
|
elec->SetWeightFunction("x/pow(rho,2)",0);
|
|
|
|
elec->SetWeightFunction("y/pow(rho,2)",1);
|
|
|
|
elec->SetExcitType(0);
|
|
|
|
// elec->SetActiveDir(0,0);//disable x
|
|
|
|
// elec->SetActiveDir(0,2);//disable z
|
|
|
|
// elec->SetDelay(2.0e-9);
|
|
|
|
CSX.AddProperty(elec);
|
|
|
|
|
|
|
|
// double coords[] = {-100,-100,0};
|
|
|
|
// cerr << elec->GetWeightedExcitation(0,coords) << endl;
|
|
|
|
// cerr << elec->GetWeightedExcitation(1,coords) << endl;
|
|
|
|
// exit(0);
|
|
|
|
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),elec);
|
|
|
|
box->SetCoord(0,-1.0*rad[1]);box->SetCoord(1,1.0*rad[1]);
|
|
|
|
box->SetCoord(2,-1.0*rad[1]);box->SetCoord(3,1.0*rad[1]);
|
|
|
|
box->SetCoord(4,length[0]);box->SetCoord(5,length[0]);
|
|
|
|
box->SetPriority(5);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
//E-field dump
|
|
|
|
CSPropDumpBox* Edump = new CSPropDumpBox(CSX.GetParameterSet());
|
|
|
|
Edump->SetDumpType(0);
|
2010-03-22 07:19:17 +00:00
|
|
|
Edump->SetDumpMode(0);
|
2010-03-12 07:39:32 +00:00
|
|
|
Edump->SetName("Et_");
|
2010-03-11 14:35:12 +00:00
|
|
|
CSX.AddProperty(Edump);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),Edump);
|
|
|
|
box->SetCoord(0,-1*rad[1]);box->SetCoord(1,rad[1]);
|
|
|
|
box->SetCoord(2,-0*rad[1]);box->SetCoord(3,0*rad[1]);
|
|
|
|
box->SetCoord(4,length[0]);box->SetCoord(5,length[1]);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
//voltage calc
|
|
|
|
CSPropProbeBox* volt = new CSPropProbeBox(CSX.GetParameterSet());
|
|
|
|
volt->SetProbeType(0);
|
2010-03-12 07:39:32 +00:00
|
|
|
volt->SetName("u1");
|
2010-03-11 14:35:12 +00:00
|
|
|
CSX.AddProperty(volt);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),volt);
|
|
|
|
box->SetCoord(0,rad[0]);box->SetCoord(1,rad[1]);
|
|
|
|
box->SetCoord(2,0.0);box->SetCoord(3,0.0);
|
|
|
|
box->SetCoord(4,0.0);box->SetCoord(5,0.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
//current calc
|
|
|
|
CSPropProbeBox* curr = new CSPropProbeBox(CSX.GetParameterSet());
|
|
|
|
curr->SetProbeType(1);
|
2010-03-12 07:39:32 +00:00
|
|
|
curr->SetName("i1");
|
2010-03-11 14:35:12 +00:00
|
|
|
CSX.AddProperty(curr);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),curr);
|
|
|
|
box->SetCoord(0,-1.5*rad[0]);box->SetCoord(1,1.5*rad[0]);
|
|
|
|
box->SetCoord(2,-1.5*rad[0]);box->SetCoord(3,1.5*rad[0]);
|
|
|
|
box->SetCoord(4,0.0);box->SetCoord(5,0.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
CSPropMaterial* metal = new CSPropMaterial(CSX.GetParameterSet());
|
|
|
|
metal->SetKappa(56e9);
|
|
|
|
// CSPropMetal* metal = new CSPropMetal(CSX.GetParameterSet());
|
|
|
|
CSX.AddProperty(metal);
|
|
|
|
CSPrimCylinder* cyl = new CSPrimCylinder(CSX.GetParameterSet(),metal);
|
|
|
|
cyl->SetRadius(rad[0]);
|
|
|
|
cyl->SetCoord(0,0.0);cyl->SetCoord(1,0.0);
|
|
|
|
cyl->SetCoord(2,0.0);cyl->SetCoord(3,0.0);
|
|
|
|
cyl->SetCoord(4,length[0]);cyl->SetCoord(5,length[1]);
|
|
|
|
cyl->SetPriority(100);
|
|
|
|
CSX.AddPrimitive(cyl);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),metal);
|
|
|
|
box->SetCoord(0,-1.0*rad[1]);box->SetCoord(1,1.0*rad[1]);
|
|
|
|
box->SetCoord(2,-1.0*rad[1]);box->SetCoord(3,1.0*rad[1]);
|
|
|
|
box->SetCoord(4,length[0]);box->SetCoord(5,length[1]);
|
|
|
|
box->SetPriority(1);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
CSPropMaterial* air = new CSPropMaterial(CSX.GetParameterSet());
|
|
|
|
CSX.AddProperty(air);
|
|
|
|
cyl = new CSPrimCylinder(CSX.GetParameterSet(),air);
|
|
|
|
cyl->SetRadius(rad[1]);
|
|
|
|
cyl->SetCoord(0,0.0);cyl->SetCoord(1,0.0);
|
|
|
|
cyl->SetCoord(2,0.0);cyl->SetCoord(3,0.0);
|
|
|
|
cyl->SetCoord(4,length[0]);cyl->SetCoord(5,length[1]);
|
|
|
|
cyl->SetPriority(9);
|
|
|
|
CSX.AddPrimitive(cyl);
|
|
|
|
|
|
|
|
CSRectGrid* grid = CSX.GetGrid();
|
|
|
|
|
|
|
|
for (int n=-1.0*rad[1];n<=rad[1];n+=delta[0])
|
|
|
|
grid->AddDiscLine(0,(double)n);
|
|
|
|
for (int n=-1.0*rad[1];n<=rad[1];n+=delta[1])
|
|
|
|
grid->AddDiscLine(1,(double)n);
|
|
|
|
for (int n=length[0];n<=length[1];n+=delta[2])
|
|
|
|
grid->AddDiscLine(2,(double)n);
|
|
|
|
|
|
|
|
grid->SetDeltaUnit(1e-3);
|
|
|
|
|
|
|
|
//*************** Create XML file **********************
|
|
|
|
TiXmlDocument doc(filename);
|
|
|
|
doc.InsertEndChild(TiXmlDeclaration("1.0","ISO-8859-1","yes"));
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
TiXmlElement openEMS("openEMS");
|
|
|
|
|
|
|
|
TiXmlElement FDTD_Opts("FDTD");
|
2010-03-11 14:35:12 +00:00
|
|
|
FDTD_Opts.SetAttribute("NumberOfTimesteps",maxIter);
|
|
|
|
|
|
|
|
TiXmlElement Excite("Excitation");
|
|
|
|
Excite.SetAttribute("Type",Excit_Type);
|
|
|
|
Excite.SetAttribute("f0",f0);
|
|
|
|
Excite.SetAttribute("fc",fc);
|
|
|
|
FDTD_Opts.InsertEndChild(Excite);
|
|
|
|
|
|
|
|
TiXmlElement BC("BoundaryCond");
|
|
|
|
BC.SetAttribute("xmin",bounds[0]);
|
|
|
|
BC.SetAttribute("xmax",bounds[1]);
|
|
|
|
BC.SetAttribute("ymin",bounds[2]);
|
|
|
|
BC.SetAttribute("ymax",bounds[3]);
|
|
|
|
BC.SetAttribute("zmin",bounds[4]);
|
|
|
|
BC.SetAttribute("zmax",bounds[5]);
|
|
|
|
FDTD_Opts.InsertEndChild(BC);
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
openEMS.InsertEndChild(FDTD_Opts);
|
2010-03-11 14:35:12 +00:00
|
|
|
|
2010-03-22 21:30:18 +00:00
|
|
|
if (CSX.Write2XML(&openEMS,true,true)==false)
|
2010-03-11 14:35:12 +00:00
|
|
|
{
|
|
|
|
cerr << "writing failed" << endl;
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
2010-03-12 20:14:17 +00:00
|
|
|
doc.InsertEndChild(openEMS);
|
|
|
|
|
2010-03-11 14:35:12 +00:00
|
|
|
doc.SaveFile();
|
|
|
|
}
|
2010-03-07 11:49:38 +00:00
|
|
|
|
2010-03-14 22:03:18 +00:00
|
|
|
void BuildHelix(const char* filename)
|
|
|
|
{
|
2010-03-15 19:49:31 +00:00
|
|
|
int maxIter = 5e5;
|
2010-03-15 15:58:28 +00:00
|
|
|
double f0=0.5e9;
|
|
|
|
double fc=0.5e9;
|
2010-03-14 22:03:18 +00:00
|
|
|
int Excit_Type=0;
|
2010-03-15 15:58:28 +00:00
|
|
|
int bounds[] = {1,1,1,1,1,1};
|
2010-03-14 22:03:18 +00:00
|
|
|
|
|
|
|
cerr << "Create Helix Geometry..." << endl;
|
|
|
|
ContinuousStructure CSX;
|
|
|
|
|
2010-03-15 15:58:28 +00:00
|
|
|
double feed_length=10;
|
2010-03-22 07:19:17 +00:00
|
|
|
double wire_rad = sqrt(1.4/PI);
|
2010-03-15 15:58:28 +00:00
|
|
|
double coil_rad = 10;
|
|
|
|
double coil_length = 50;
|
2010-03-16 22:02:14 +00:00
|
|
|
int coil_turns = 8;
|
2010-03-22 07:19:17 +00:00
|
|
|
int coil_res = 10;
|
2010-03-15 15:58:28 +00:00
|
|
|
double delta[] = {0.5,0.5,0.5};
|
2010-03-14 22:03:18 +00:00
|
|
|
|
2010-03-16 20:43:11 +00:00
|
|
|
CSPrimBox* box = NULL;
|
|
|
|
|
|
|
|
ParameterSet* PS = CSX.GetParameterSet();
|
2010-03-16 22:02:14 +00:00
|
|
|
PS->AddParameter(new Parameter("rad_coil",coil_rad));
|
|
|
|
PS->AddParameter(new Parameter("rad_wire",wire_rad));
|
|
|
|
PS->AddParameter(new Parameter("turns",coil_turns));
|
|
|
|
PS->AddParameter(new Parameter("coil_length",coil_length));
|
2010-03-16 20:43:11 +00:00
|
|
|
|
2010-03-14 22:03:18 +00:00
|
|
|
CSPropMaterial* copper = new CSPropMaterial(CSX.GetParameterSet());
|
|
|
|
copper->SetKappa(56e6);
|
|
|
|
copper->SetName("copper");
|
|
|
|
CSX.AddProperty(copper);
|
|
|
|
|
2010-03-22 07:19:17 +00:00
|
|
|
// CSPropMetal* pec = new CSPropMetal(CSX.GetParameterSet());
|
|
|
|
// CSX.AddProperty(pec);
|
|
|
|
// CSPrimCurve* curve = new CSPrimCurve(CSX.GetParameterSet(),pec);
|
|
|
|
CSPrimWire* curve = new CSPrimWire(CSX.GetParameterSet(),copper);
|
|
|
|
curve->SetWireRadius("rad_wire");
|
|
|
|
double p[3];
|
|
|
|
double dt = 1.0/coil_res;
|
|
|
|
double height=0;
|
|
|
|
for (int n=0;n<coil_turns;++n)
|
|
|
|
{
|
|
|
|
for (int m=0;m<=coil_res;++m)
|
|
|
|
{
|
|
|
|
p[0] = coil_rad * cos(2*PI*dt*m);
|
|
|
|
p[1] = coil_rad * sin(2*PI*dt*m);
|
|
|
|
p[2] = height + coil_length/(double)coil_turns * dt*m;
|
|
|
|
// cerr << p[0] << " " << p[1] << " " << p[2] << " " << endl;
|
|
|
|
curve->AddPoint(p);
|
|
|
|
}
|
|
|
|
height += coil_length/(double)coil_turns;
|
|
|
|
}
|
|
|
|
// exit(0);
|
|
|
|
CSX.AddPrimitive(curve);
|
|
|
|
|
|
|
|
// CSPrimUserDefined* helix = new CSPrimUserDefined(CSX.GetParameterSet(),copper);
|
|
|
|
// helix->SetCoordSystem(CSPrimUserDefined::CYLINDER_SYSTEM);
|
|
|
|
// helix->SetFunction("(r>(rad_coil-rad_wire))&(r<rad_coil+rad_wire)&(sqrt(pow(x-r*cos(2*pi*z*turns/coil_length),2)+pow(y-r*sin(2*pi*z*turns/coil_length),2))<(2*rad_wire))&(z>0)&(z<coil_length)");
|
|
|
|
// CSX.AddPrimitive(helix);
|
2010-03-15 15:58:28 +00:00
|
|
|
|
2010-03-22 07:19:17 +00:00
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),copper);
|
|
|
|
box->SetCoord(0,coil_rad); box->SetCoord(1,coil_rad+feed_length);
|
|
|
|
box->SetCoord(2,-0.5); box->SetCoord(3,0.5);
|
|
|
|
box->SetCoord(4,-0.5); box->SetCoord(5,0.5);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),copper);
|
|
|
|
box->SetCoord(0,coil_rad); box->SetCoord(1,coil_rad+feed_length);
|
|
|
|
box->SetCoord(2,-0.5); box->SetCoord(3,0.5);
|
|
|
|
box->SetCoord(4,coil_length-0.5); box->SetCoord(5,coil_length+0.5);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),copper);
|
|
|
|
box->SetCoord(0,coil_rad+feed_length-0.5); box->SetCoord(1,coil_rad+feed_length+0.5);
|
|
|
|
box->SetCoord(2,-0.5); box->SetCoord(3,0.5);
|
|
|
|
box->SetCoord(4,0.0); box->SetCoord(5,coil_length);///2.0-delta[2]);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
double kappa_resist = (coil_length/3.0)/50/1e-3;
|
2010-03-15 15:58:28 +00:00
|
|
|
CSPropMaterial* Src_Resist = new CSPropMaterial(CSX.GetParameterSet());
|
2010-03-16 20:43:11 +00:00
|
|
|
Src_Resist->SetKappa(kappa_resist,2);
|
|
|
|
Src_Resist->SetIsotropy(false);
|
2010-03-15 15:58:28 +00:00
|
|
|
Src_Resist->SetName("resist");
|
|
|
|
CSX.AddProperty(Src_Resist);
|
2010-03-16 20:43:11 +00:00
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),Src_Resist);
|
2010-03-22 07:19:17 +00:00
|
|
|
box->SetPriority(100);
|
2010-03-16 20:43:11 +00:00
|
|
|
box->SetCoord(0,coil_rad+feed_length-0.5); box->SetCoord(1,coil_rad+feed_length+0.5);
|
|
|
|
box->SetCoord(2,-0.5); box->SetCoord(3,0.5);
|
2010-03-22 07:19:17 +00:00
|
|
|
box->SetCoord(4,coil_length/3.0); box->SetCoord(5,coil_length/3.0*2.0);///2.0-delta[2]);
|
2010-03-16 20:43:11 +00:00
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
// box = new CSPrimBox(CSX.GetParameterSet(),Src_Resist);
|
|
|
|
// box->SetCoord(0,coil_rad+feed_length-0.5); box->SetCoord(1,coil_rad+feed_length+0.5);
|
|
|
|
// box->SetCoord(2,-0.5); box->SetCoord(3,0.5);
|
|
|
|
// box->SetCoord(4,coil_length/2.0+delta[2]); box->SetCoord(5,coil_length);
|
|
|
|
// CSX.AddPrimitive(box);
|
2010-03-14 22:03:18 +00:00
|
|
|
|
|
|
|
CSPropElectrode* elec = new CSPropElectrode(CSX.GetParameterSet());
|
|
|
|
elec->SetExcitation(1.0,2);
|
2010-03-16 20:43:11 +00:00
|
|
|
elec->SetExcitType(0);
|
2010-03-14 22:03:18 +00:00
|
|
|
// elec->SetDelay(2.0e-9);
|
|
|
|
CSX.AddProperty(elec);
|
2010-03-16 20:43:11 +00:00
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),elec);
|
|
|
|
box->SetCoord(0,coil_rad+feed_length+0.5); box->SetCoord(1,coil_rad+feed_length-0.5);
|
|
|
|
box->SetCoord(2,-0.5); box->SetCoord(3,0.5);
|
2010-03-22 07:19:17 +00:00
|
|
|
box->SetCoord(4,coil_length/3.0); box->SetCoord(5,coil_length/3.0*2.0);///2.0-delta[2]);
|
2010-03-16 20:43:11 +00:00
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
// CSPropMetal* elec_mat = new CSPropMetal(CSX.GetParameterSet());
|
|
|
|
// CSX.AddProperty(elec_mat);
|
|
|
|
// box = new CSPrimBox(CSX.GetParameterSet(),elec_mat);
|
|
|
|
// box->SetCoord(0,coil_rad+feed_length+0.5); box->SetCoord(1,coil_rad+feed_length-0.5);
|
|
|
|
// box->SetCoord(2,-0.5); box->SetCoord(3,0.5);
|
|
|
|
// box->SetCoord(4,coil_length/2.0-delta[2]); box->SetCoord(5,coil_length/2.0+delta[2]);
|
|
|
|
// CSX.AddPrimitive(box);
|
2010-03-14 22:03:18 +00:00
|
|
|
|
|
|
|
CSPropDumpBox* Edump = NULL;
|
|
|
|
//E-field dump xz
|
2010-03-15 19:49:31 +00:00
|
|
|
Edump = new CSPropDumpBox(CSX.GetParameterSet());
|
|
|
|
Edump->SetDumpType(0);
|
2010-03-16 20:43:11 +00:00
|
|
|
Edump->SetDumpMode(0);
|
2010-03-15 19:49:31 +00:00
|
|
|
Edump->SetName("Et_xz_");
|
|
|
|
CSX.AddProperty(Edump);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),Edump);
|
|
|
|
box->SetCoord(0,coil_rad/-1.0-25.0);box->SetCoord(1,coil_rad/1.0+25.0+feed_length);
|
|
|
|
box->SetCoord(2,0.0);box->SetCoord(3,0.0);
|
|
|
|
box->SetCoord(4,-25.0);box->SetCoord(5,coil_length+25.0);
|
|
|
|
CSX.AddPrimitive(box);
|
2010-03-16 20:43:11 +00:00
|
|
|
|
|
|
|
CSPropDumpBox* Hdump = NULL;
|
|
|
|
//H-field dump xz
|
|
|
|
Hdump = new CSPropDumpBox(CSX.GetParameterSet());
|
|
|
|
Hdump->SetDumpType(1);
|
|
|
|
Hdump->SetDumpMode(0);
|
|
|
|
Hdump->SetName("Ht_xz_");
|
|
|
|
CSX.AddProperty(Hdump);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),Hdump);
|
|
|
|
box->SetCoord(0,coil_rad/-1.0-25.0);box->SetCoord(1,coil_rad/1.0+25.0+feed_length);
|
|
|
|
box->SetCoord(2,0.0);box->SetCoord(3,0.0);
|
|
|
|
box->SetCoord(4,-25.0);box->SetCoord(5,coil_length+25.0);
|
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
2010-03-14 22:03:18 +00:00
|
|
|
//
|
|
|
|
// //E-field dump xy
|
|
|
|
// Edump = new CSPropDumpBox(CSX.GetParameterSet());
|
|
|
|
// Edump->SetDumpType(0);
|
|
|
|
// Edump->SetName("Et_xy_");
|
|
|
|
// CSX.AddProperty(Edump);
|
|
|
|
// box = new CSPrimBox(CSX.GetParameterSet(),Edump);
|
|
|
|
// box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0);
|
|
|
|
// box->SetCoord(2,0.0);box->SetCoord(3,height);
|
|
|
|
// box->SetCoord(4,0.0);box->SetCoord(5,0.0);
|
|
|
|
// CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
// //E-field dump 3D
|
|
|
|
// Edump = new CSPropDumpBox(CSX.GetParameterSet());
|
|
|
|
// Edump->SetDumpType(0);
|
|
|
|
// Edump->SetDumpMode(2); //cell interpolated dump
|
|
|
|
// Edump->SetName("Et_");
|
|
|
|
// CSX.AddProperty(Edump);
|
|
|
|
// box = new CSPrimBox(CSX.GetParameterSet(),Edump);
|
|
|
|
// box->SetCoord(0,MSL_width*-1.5);box->SetCoord(1,MSL_width*1.5);
|
|
|
|
// box->SetCoord(2,0.0);box->SetCoord(3,MSL_height*1.5);
|
|
|
|
// box->SetCoord(4,length/-2.0);box->SetCoord(5,length/2.0);
|
|
|
|
// CSX.AddPrimitive(box);
|
|
|
|
//
|
|
|
|
//voltage calc
|
|
|
|
CSPropProbeBox* volt = new CSPropProbeBox(CSX.GetParameterSet());
|
|
|
|
volt->SetProbeType(0);
|
|
|
|
volt->SetName("u1");
|
|
|
|
CSX.AddProperty(volt);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),volt);
|
2010-03-15 15:58:28 +00:00
|
|
|
box->SetCoord(0,coil_rad+feed_length);box->SetCoord(1,coil_rad+feed_length);
|
2010-03-14 22:03:18 +00:00
|
|
|
box->SetCoord(2,0.0);box->SetCoord(3,0.0);
|
2010-03-16 20:43:11 +00:00
|
|
|
box->SetCoord(4,coil_length);box->SetCoord(5,0.0);
|
2010-03-14 22:03:18 +00:00
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
//current calc
|
2010-03-22 07:19:17 +00:00
|
|
|
double curr_dist = 2;
|
2010-03-14 22:03:18 +00:00
|
|
|
CSPropProbeBox* curr = new CSPropProbeBox(CSX.GetParameterSet());
|
|
|
|
curr->SetProbeType(1);
|
|
|
|
curr->SetName("i1");
|
|
|
|
CSX.AddProperty(curr);
|
|
|
|
box = new CSPrimBox(CSX.GetParameterSet(),curr);
|
2010-03-15 15:58:28 +00:00
|
|
|
box->SetCoord(0,coil_rad+feed_length-curr_dist);box->SetCoord(1,coil_rad+feed_length+curr_dist);
|
|
|
|
box->SetCoord(2,-curr_dist);box->SetCoord(3,curr_dist);
|
|
|
|
box->SetCoord(4,coil_length/2.0);box->SetCoord(5,coil_length/2.0);
|
2010-03-14 22:03:18 +00:00
|
|
|
CSX.AddPrimitive(box);
|
|
|
|
|
|
|
|
CSRectGrid* grid = CSX.GetGrid();
|
|
|
|
|
2010-03-15 19:49:31 +00:00
|
|
|
double offset[]={coil_rad/-1.0,coil_rad/-1.0,0.0};
|
|
|
|
//graded mesh
|
|
|
|
for (int n=0;n<3;++n)
|
|
|
|
{
|
|
|
|
grid->AddDiscLine(n,offset[n] - 25.0);
|
|
|
|
grid->AddDiscLine(n,offset[n] - 15.0);
|
|
|
|
grid->AddDiscLine(n,offset[n] - 10.0);
|
|
|
|
grid->AddDiscLine(n,offset[n] - 5.0);
|
|
|
|
grid->AddDiscLine(n,offset[n] - 2.0);
|
|
|
|
grid->AddDiscLine(n,offset[n] - 1.0);
|
|
|
|
grid->AddDiscLine(n,offset[n] - 0.5);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (double n=coil_rad/-1.0;n<=coil_rad;n+=delta[0])
|
2010-03-14 22:03:18 +00:00
|
|
|
grid->AddDiscLine(0,n);
|
2010-03-15 19:49:31 +00:00
|
|
|
//feeding mesh
|
|
|
|
grid->AddDiscLine(0,coil_rad+0.5);
|
|
|
|
grid->AddDiscLine(0,coil_rad+1);
|
|
|
|
grid->AddDiscLine(0,coil_rad+2);
|
2010-03-16 20:43:11 +00:00
|
|
|
grid->AddDiscLine(0,coil_rad+3.5);
|
2010-03-15 19:49:31 +00:00
|
|
|
grid->AddDiscLine(0,coil_rad+5);
|
|
|
|
grid->AddDiscLine(0,coil_rad+7);
|
2010-03-16 20:43:11 +00:00
|
|
|
grid->AddDiscLine(0,coil_rad+8);
|
2010-03-15 19:49:31 +00:00
|
|
|
grid->AddDiscLine(0,coil_rad+9);
|
|
|
|
grid->AddDiscLine(0,coil_rad+9.5);
|
|
|
|
grid->AddDiscLine(0,coil_rad+10);
|
|
|
|
for (double n=coil_rad/-1.0;n<=coil_rad;n+=delta[1])
|
2010-03-14 22:03:18 +00:00
|
|
|
grid->AddDiscLine(1,n);
|
2010-03-15 19:49:31 +00:00
|
|
|
for (double n=0.0;n<=coil_length;n+=delta[2])
|
2010-03-14 22:03:18 +00:00
|
|
|
grid->AddDiscLine(2,n);
|
|
|
|
|
2010-03-15 19:49:31 +00:00
|
|
|
offset[0]=coil_rad+feed_length;
|
|
|
|
offset[1]=coil_rad;
|
|
|
|
offset[2]=coil_length;
|
|
|
|
for (int n=0;n<3;++n)
|
|
|
|
{
|
|
|
|
grid->AddDiscLine(n,offset[n] + 0.5);
|
|
|
|
grid->AddDiscLine(n,offset[n] + 1.0);
|
|
|
|
grid->AddDiscLine(n,offset[n] + 2.0);
|
2010-03-16 20:43:11 +00:00
|
|
|
grid->AddDiscLine(n,offset[n] + 3.0);
|
2010-03-15 19:49:31 +00:00
|
|
|
grid->AddDiscLine(n,offset[n] + 5.0);
|
2010-03-16 20:43:11 +00:00
|
|
|
grid->AddDiscLine(n,offset[n] + 7.5);
|
2010-03-15 19:49:31 +00:00
|
|
|
grid->AddDiscLine(n,offset[n] + 10.0);
|
|
|
|
grid->AddDiscLine(n,offset[n] + 15.0);
|
|
|
|
grid->AddDiscLine(n,offset[n] + 25.0);
|
|
|
|
grid->Sort(n);
|
|
|
|
}
|
|
|
|
|
2010-03-14 22:03:18 +00:00
|
|
|
grid->SetDeltaUnit(1e-3);
|
|
|
|
|
|
|
|
//*************** Create XML file **********************
|
|
|
|
TiXmlDocument doc(filename);
|
|
|
|
doc.InsertEndChild(TiXmlDeclaration("1.0","ISO-8859-1","yes"));
|
|
|
|
|
|
|
|
TiXmlElement openEMS("openEMS");
|
|
|
|
|
|
|
|
TiXmlElement FDTD_Opts("FDTD");
|
|
|
|
FDTD_Opts.SetAttribute("NumberOfTimesteps",maxIter);
|
2010-03-22 07:19:17 +00:00
|
|
|
FDTD_Opts.SetDoubleAttribute("endCriteria",1e-8);
|
2010-03-14 22:03:18 +00:00
|
|
|
|
|
|
|
TiXmlElement Excite("Excitation");
|
|
|
|
Excite.SetAttribute("Type",Excit_Type);
|
|
|
|
Excite.SetAttribute("f0",f0);
|
|
|
|
Excite.SetAttribute("fc",fc);
|
|
|
|
FDTD_Opts.InsertEndChild(Excite);
|
|
|
|
|
|
|
|
TiXmlElement BC("BoundaryCond");
|
|
|
|
BC.SetAttribute("xmin",bounds[0]);
|
|
|
|
BC.SetAttribute("xmax",bounds[1]);
|
|
|
|
BC.SetAttribute("ymin",bounds[2]);
|
|
|
|
BC.SetAttribute("ymax",bounds[3]);
|
|
|
|
BC.SetAttribute("zmin",bounds[4]);
|
|
|
|
BC.SetAttribute("zmax",bounds[5]);
|
|
|
|
FDTD_Opts.InsertEndChild(BC);
|
|
|
|
|
|
|
|
openEMS.InsertEndChild(FDTD_Opts);
|
|
|
|
|
2010-03-22 21:30:18 +00:00
|
|
|
if (CSX.Write2XML(&openEMS,true,true)==false)
|
2010-03-14 22:03:18 +00:00
|
|
|
{
|
|
|
|
cerr << "writing failed" << endl;
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
doc.InsertEndChild(openEMS);
|
|
|
|
|
|
|
|
doc.SaveFile();
|
|
|
|
}
|