Vector 2 D
Vector 2 D
{
double vx, vy;
public:
Vector2D(double vx = 0.0, double vy = 0.0);
double getXComponent(){return vx;}
double getYComponent(){return vy;}
~Vector2D();
};
Vector2D::Vector2D(double vx, double vy)
:vx(vx), vy(vy){
}
Vector2D::~Vector2D(){
}
class Point2D
{
double x, y;
public:
Point2D(double x = 0.0, double y = 0.0);
~Point2D();
bool operator==(Point2D& p);
bool operator!=(Point2D& p);
void setX(double x){this->x = x;}
void setY(double y){this->y = y;}
double getX(){return x;}
double getY(){return y;}
};
Point2D::Point2D(double x, double y)
:x(x), y(y){
}
bool Point2D::operator==(Point2D& p)
{
bool retval;
retval = ((p.getX() == this->getX()) && (p.getY() == this->getY()));
return retval;
}
bool Point2D::operator!=(Point2D& p)
{
bool retval;
retval = ((p.getX() == this->getX()) && (p.getY() == this->getY()));
retval = !retval;
return retval;
}
Point2D::~Point2D(){
}
class Point2DTester
{
public:
Point2DTester();
void test();
~Point2DTester();
};
Point2DTester::Point2DTester(){
}
void Point2DTester::test(){
Point2D p1(0.,-1.1);
Point2D p2(0.,-1.1);
Point2D p3(1.,2.5);
bool flag;
double x,y;
cout << "Starting test of the class Point2D..." << endl;
// getX
x = p1.getX();
if(x != 0.){
cerr << "ERROR in testing class Point2D: the member function getX does not work
properly." << endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
x = p2.getX();
if(x != 0.){
cerr << "ERROR in testing class Point2D: the member function getX does not work
properly." << endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
x = p3.getX();
if(x != 1.){
cerr << "ERROR in testing class Point2D: the member function getX does not work
properly." << endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
// getX
y = p1.getY();
if(y != -1.1){
cerr << "ERROR in testing class Point2D: the member function getY does not work
properly." << endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
y = p2.getY();
if(y != -1.1){
cerr << "ERROR in testing class Point2D: the member function getY does not work
properly." << endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
y = p3.getY();
if(y != 2.5){
cerr << "ERROR in testing class Point2D: the member function getY does not work
properly." << endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
// ==
flag = (p1 == p2);
if(flag != true){
cerr << "ERROR in testing class Point2D: the operator == does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
flag = (p2 == p1);
if(flag != true){
cerr << "ERROR in testing class Point2D: the operator == does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
flag = (p3 == p2);
if(flag != false){
cerr << "ERROR in testing class Point2D: the operator == does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
flag = (p2 == p3);
if(flag != false){
cerr << "ERROR in testing class Point2D: the operator == does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
flag = (p3 == p1);
if(flag != false){
cerr << "ERROR in testing class Point2D: the operator == does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
flag = (p1 == p3);
if(flag != false){
cerr << "ERROR in testing class Point2D: the operator == does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
// !=
flag = (p1 != p2);
if(flag != false){
cerr << "ERROR in testing class Point2D: the operator != does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
flag = (p2 != p1);
if(flag != false){
cerr << "ERROR in testing class Point2D: the operator != does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
flag = (p3 != p2);
if(flag != true){
cerr << "ERROR in testing class Point2D: the operator != does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
flag = (p2 != p3);
if(flag != true){
cerr << "ERROR in testing class Point2D: the operator != does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
flag = (p3 != p1);
if(flag != true){
cerr << "ERROR in testing class Point2D: the operator != does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
flag = (p1 != p3);
if(flag != true){
cerr << "ERROR in testing class Point2D: the operator != does not work properly." <<
endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
cout << "done." << endl;
}
Point2DTester::~Point2DTester(){
}
class Node
{
Point2D *point;
int nodeID;
//
map<int,Element*> *elements;
//
map<int,double*> *distances;
//
public:
Node(Point2D *point, int nodeID);
bool operator==(Node &n);
double getX(){return point->getX();}
double getY(){return point->getY();}
Point2D* getPoint2D(){return point;}
int getNodeID(){return nodeID;}
~Node();
//
//
};
Node::Node(Point2D *point, int nodeID)
:point(point),nodeID(nodeID){
//
//
}
bool Node::operator==(Node &n){
bool retval;
retval = ((*(n.getPoint2D()) == *(this->getPoint2D())));
return retval;
}
Node::~Node(){
delete point;
}
class NodeTester
{
public:
NodeTester();
void test();
~NodeTester();
};
NodeTester::NodeTester(){
}
void NodeTester::test(){
Point2D p1(7.3,-1.4);
Point2D p2(7.3,-1.4);
Point2D p3(100.,2.5);
Node n1(&p1, 1);
Node n2(&p2, 10);
y = n2.getY();
if(y != -1.4){
cerr << "ERROR in testing class Node: the member function getY does not work properly."
<< endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
y = n3.getY();
if(y != 2.5){
cerr << "ERROR in testing class Node: the member function getY does not work properly."
<< endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
cout << "done." << endl;
}
NodeTester::~NodeTester(){
}
class Edge
{
Node *n1;
Node *n2;
int edgeID;
double length;
bool boundary;
Element* e1;
Element* e2;
public:
Edge(Node *n1, Node *n2, int edgeID, bool boundary = true);
bool operator==(Edge &e);
}
void Edge::addAdjacentElement(Element *e){
if(0 == e1){
e1 = e;
}else if(0 == e2){
e2 = e;
}else{
cerr << "FATAL ERROR: attempting of adding a third element on edge " << getEdgeID()
<< ". The program will be terminated." << endl;
exit(EXIT_FAILURE);
}
}
bool Edge::operator==(Edge &e){
bool retval;
retval = ((*(this->getNode1()) == *(e.getNode1())) && (*(this->getNode2()) ==
*(e.getNode2()))) || ((*(this->getNode1()) == *(e.getNode2())) && (*(this->getNode2()) ==
*(e.getNode1())));
return retval;
}
Edge::~Edge(){
}
class PhysicalProperties
{
string type;
double epsr;
double sigma;
double mur;
double sigma_m;
public:
PhysicalProperties(string type);
PhysicalProperties(double epsr, double sigma, double mur, double sigma_m);
void read(ifstream *ifs);
void setEpsr(double epsr){this->epsr = epsr;}
void setSigma(double sigma){this->sigma = sigma;}
void setMur(double mur){this->mur = mur;}
void setSigma_m(double sigma_m){this->sigma_m = sigma_m;}
string getType(){return type;}
double getEpsr(){return epsr;}
double getSigma(){return sigma;}
double getMur(){return mur;}
double getSigma_m(){return sigma_m;}
~PhysicalProperties();
};
PhysicalProperties::PhysicalProperties(string type)
:type(type){
}
void PhysicalProperties::read(ifstream *ifs){
if(type == "D"){
*ifs >> epsr >> sigma >> mur >> sigma_m;
}else{
cerr << "FATAL ERROR: unknown media type: " << type << ". The program will be
terminated." << endl;
exit(EXIT_FAILURE);
}
}
PhysicalProperties::~PhysicalProperties()
{
}
class Element
{
Node *node1;
Node *node2;
Node *node3;
Edge *edge1;
Edge *edge2;
Edge *edge3;
Vector2D* normal1;
Vector2D* normal2;
Vector2D* normal3;
Point2D barycenter;
double area;
int elementID;
PhysicalProperties *physicalProperties;
Vector2D* computeNormal(Node *n1, Node *n2, Node *n_opposite);
bool boundaryElement;
map<int,Element*> *elements_node_1;
map<int,Element*> *elements_node_2;
map<int,Element*> *elements_node_3;
double* distances_node_1;
double* distances_node_2;
double* distances_node_3;
// ***************************EM Fields***************************
double TH_i_h,
TH_j_i, TH_k_i;
int pml;
int boundaryFlag;
public:
Element(Node *n1, Node *n2, Node *n3, Edge *e1, Edge *e2, Edge *e3, int elementID, bool
boundaryElement = false);
Point2D getBarycenter(){return barycenter;}
Node* getNode1(){return node1;}
Node* getNode2(){return node2;}
Node* getNode3(){return node3;}
Edge* getEdge1(){return edge1;}
Edge* getEdge2(){return edge2;}
Edge* getEdge3(){return edge3;}
Vector2D* getNormal1(){return normal1;}
Vector2D* getNormal2(){return normal2;}
Vector2D* getNormal3(){return normal3;}
double getSideLength1(){return edge1->getLength();}
double getSideLength2(){return edge2->getLength();}
double getSideLength3(){return edge3->getLength();}
void updateBoundary();
void setBoundaryFlag(int boundaryType);
double getArea(){return area;}
void setPhysicalProperties(PhysicalProperties *p){physicalProperties = p;}
PhysicalProperties* getPhysicalProperties(){return physicalProperties;}
void setBoundaryElement(bool boundary){boundaryElement = boundary;}
bool isBoundary(){return boundaryElement;}
int getElementID(){return elementID;}
double getE_z_old(){return E_z_old;}
x3 = node3->getX();
y1 = node1->getY();
y2 = node2->getY();
y3 = node3->getY();
x_barycenter = (x1 + x2 + x3)/3.;
y_barycenter = (y1 + y2 + y3)/3.;
barycenter.setX(x_barycenter);
barycenter.setY(y_barycenter);
e1->addAdjacentElement(this);
e2->addAdjacentElement(this);
e3->addAdjacentElement(this);
// Area computation
double p = (edge1->getLength() + edge2->getLength() + edge3->getLength())/2.;
area = sqrt(p*(p - edge1->getLength())*(p - edge2->getLength())*(p - edge3>getLength())); // Erone
// Normals computation
normal1 = computeNormal(node2, node3, node1);
normal2 = computeNormal(node1, node3, node2);
normal3 = computeNormal(node1, node2, node3);
// Fields inizialization
E_z_new = 0;
H_x_new = 0;
H_y_new =0;
// PML Fields initialization
E_z_y_new = 0;
K_x_r_new = 0;
// Flux initialization
Flux_E_z = 0;
Flux_H_x = 0;
Flux_H_y = 0;
Flux_E_z_y = 0;
Flux_K_x_r = 0;
// Nodal Fields initialization
E_z_node_1 = 0;
E_z_node_2 = 0;
E_z_node_3 = 0;
H_x_node_1 = 0;
H_x_node_2 = 0;
H_x_node_3 = 0;
H_y_node_1 = 0;
H_y_node_2 = 0;
H_y_node_3 = 0;
// Source initialization
J_z = 0;
M_x = 0;
M_y = 0;
Amplitude = 0.;
frequency = 0.;
td = 0.;
taup = 0.;
E_z_h = 0.;
E_z_j = 0.;
E_z_k = 0.;
H_x_h = 0.;
H_x_j = 0.;
H_x_k = 0.;
H_y_h = 0.;
H_y_j = 0.;
H_y_k = 0.;
swapFieldE();
swapFieldH();
//Coefficients initialization
eps = 8.85e-12;
mu = 1.26e-6;
alphaE = 0.;
alphaE_h = 0.;
alphaE_j = 0.;
alphaE_k = 0.;
alphaH = 0.;
alphaH_h = 0.;
alphaH_j = 0.;
alphaH_k = 0.;
CE1 = 0.;
CH1 = 0.;
N_i_h_y = 0.;
N_i_h_x = 0.;
N_i_j_y = 0.;
N_i_j_x = 0.;
N_i_k_y = 0.;
N_i_k_x = 0.;
Z_h = 0.;
Z_j = 0.;
Z_k = 0.;
Y_h = 0.;
Y_j = 0.;
Y_k = 0.;
distance_i_h = 0.;
distance_i_j = 0.;
distance_i_k = 0.;
distance_face_h = 0.;
distance_face_j = 0.;
distance_face_k = 0.;
CSPML1 = 0.;
CSPML2 = 0.;
CE_loss1 = 0.;
CH_loss1 = 0.;
CH_loss2 = 0.;
CH_loss3 = 0.;
CH_loss4 = 0.;
CH_loss5 = 0.;
CH_loss6 = 0.;
CK_x_r1 = 0.;
CK_x_r2 = 0.;
security_factor = 1.;
Zetha_zero = 0.;
Zetha_x_r = 0.;
phi = 0.;
spatial_order = 2;
}
void Element::computeCoefficients(int pml_flag, string type, int order){
spatial_order = order;
double x_bar = 0.;
double y_bar = 0.;
double x = 0.;
double y = 0.;
// Calcolo delle normali delle facce******************************************************
CE1 = 1./(this->getArea());
N_i_h_y = (normal1->getYComponent());
N_i_h_x = (normal1->getXComponent());
N_i_j_y = (normal2->getYComponent());
N_i_j_x = (normal2->getXComponent());
N_i_k_y = (normal3->getYComponent());
N_i_k_x = (normal3->getXComponent());
CH1 = 1./(this->getArea());
//****************************************************************************************
// Serve per prendere i valori di impedenza e ammettenza degli elementi vicini************
// in caso di elemento di bordo si assume un interfaccia PEC
if(this->getEdge1()->isBoundary() == true){
Z_h = 0.;
Y_h = 1.e20;
}else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
Z_h = (this->getEdge1()->getElement1()->getZ());
Y_h = (this->getEdge1()->getElement1()->getY());
}else{
Z_h = (this->getEdge1()->getElement2()->getZ());
Y_h = (this->getEdge1()->getElement2()->getY());
}
}
if(this->getEdge2()->isBoundary() == true){
Z_j = 0.;
Y_j = 1.e20;
}else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
Z_j = (this->getEdge2()->getElement1()->getZ());
Y_j = (this->getEdge2()->getElement1()->getY());
}else{
Z_j = (this->getEdge2()->getElement2()->getZ());
Y_j = (this->getEdge2()->getElement2()->getY());
}
}
if(this->getEdge3()->isBoundary() == true){
Z_k = 0.;
Y_k = 1.e20;
}else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
Z_k = (this->getEdge3()->getElement1()->getZ());
Y_k = (this->getEdge3()->getElement1()->getY());
}else{
Z_k = (this->getEdge3()->getElement2()->getZ());
Y_k = (this->getEdge3()->getElement2()->getY());
}
}
//***************************************************************************************
// Calcolo dei coefficienti T************************************************************
// sul bordo si utilizzano le condizioni di Silver-Muller o PEC
if(this->getEdge1()->isBoundary() == true){
if(boundaryFlag == 1){
TE_i_h = 1.;
TE_h_i = 0.;
TH_i_h = 1.;
TH_h_i = 0.;
}else{
TE_i_h = 2.;
TE_h_i = 0.;
TH_i_h = 0.;
TH_h_i = 0.;
}
}else{
TE_i_h = 2.*Z/(Z+Z_h);
TE_h_i = 2.*Z_h/(Z+Z_h);
TH_i_h = 2.*Y/(Y+Y_h);
TH_h_i = 2.*Y_h/(Y+Y_h);
}
if(this->getEdge2()->isBoundary() == true){
if(boundaryFlag == 1){
TE_i_j = 1.;
TE_j_i = 0.;
TH_i_j = 1.;
TH_j_i = 0.;
}else{
TE_i_j = 2.;
TE_j_i = 0.;
TH_i_j = 0.;
TH_j_i = 0.;
}
}else{
TE_i_j = 2.*Z/(Z+Z_j);
TE_j_i = 2.*Z_j/(Z+Z_j);
TH_i_j = 2.*Y/(Y+Y_j);
TH_j_i = 2.*Y_j/(Y+Y_j);
}
if(this->getEdge3()->isBoundary() == true){
if(boundaryFlag == 1){
TE_i_k = 1.;
TE_k_i = 0.;
TH_i_k = 1.;
TH_k_i = 0.;
}else{
TE_i_k = 2.;
TE_k_i = 0.;
TH_i_k = 0.;
TH_k_i = 0.;
}
}else{
TE_i_k = 2.*Z/(Z+Z_k);
TE_k_i = 2.*Z_k/(Z+Z_k);
TH_i_k = 2.*Y/(Y+Y_k);
TH_k_i = 2.*Y_k/(Y+Y_k);
}
if (spatial_order == 2){
//
********************************************************************************************
****
//
x = this->getBarycenter().getX();
y = this->getBarycenter().getY();
double x_1, x_2, x_3, y_1, y_2, y_3;
if(this->getEdge1()->isBoundary() == true){
x_1=(this->getEdge1()->getNode1()->getX() + this->getEdge1()->getNode2()->getX())/2;
y_1=(this->getEdge1()->getNode1()->getY() + this->getEdge1()->getNode2()->getY())/2;
}
else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
x_1 = this->getEdge1()->getElement1()->getBarycenter().getX();
y_1 = this->getEdge1()->getElement1()->getBarycenter().getY();
}
else{
x_1 = this->getEdge1()->getElement2()->getBarycenter().getX();
y_1 = this->getEdge1()->getElement2()->getBarycenter().getY();
}
}
if(this->getEdge2()->isBoundary() == true){
x_2=(this->getEdge2()->getNode1()->getX() + this->getEdge2()->getNode2()->getX())/2;
y_2=(this->getEdge2()->getNode1()->getY() + this->getEdge2()->getNode2()->getY())/2;
}
else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
x_2 = this->getEdge2()->getElement1()->getBarycenter().getX();
y_2 = this->getEdge2()->getElement1()->getBarycenter().getY();
}
else{
x_2 = this->getEdge2()->getElement2()->getBarycenter().getX();
y_2 = this->getEdge2()->getElement2()->getBarycenter().getY();
}
}
if(this->getEdge3()->isBoundary() == true){
x_3=(this->getEdge3()->getNode1()->getX() + this->getEdge3()->getNode2()->getX())/2;
y_3=(this->getEdge3()->getNode1()->getY() + this->getEdge3()->getNode2()->getY())/2;
}
else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
x_3 = this->getEdge3()->getElement1()->getBarycenter().getX();
y_3 = this->getEdge3()->getElement1()->getBarycenter().getY();
}
else{
x_3 = this->getEdge3()->getElement2()->getBarycenter().getX();
y_3 = this->getEdge3()->getElement2()->getBarycenter().getY();
}
}
dl_i_h_x = ((this->getEdge1()->getNode1()->getX() + this->getEdge1()->getNode2()-
>getX())/2.)- x;
dl_i_j_x = ((this->getEdge2()->getNode1()->getX() + this->getEdge2()->getNode2()>getX())/2.)- x;
dl_i_k_x = ((this->getEdge3()->getNode1()->getX() + this->getEdge3()->getNode2()>getX())/2.)- x;
dl_i_h_y = ((this->getEdge1()->getNode1()->getY() + this->getEdge1()->getNode2()>getY())/2.) - y;
dl_i_j_y = ((this->getEdge2()->getNode1()->getY() + this->getEdge2()->getNode2()>getY())/2.) - y;
dl_i_k_y = ((this->getEdge3()->getNode1()->getY() + this->getEdge3()->getNode2()>getY())/2.) - y;
dl_i_h = sqrt(dl_i_h_x*dl_i_h_x + dl_i_h_y*dl_i_h_y);
dl_i_j = sqrt(dl_i_j_x*dl_i_j_x + dl_i_j_y*dl_i_j_y);
dl_i_k = sqrt(dl_i_k_x*dl_i_k_x + dl_i_k_y*dl_i_k_y);
dl_h_i_x = ((this->getEdge1()->getNode1()->getX() + this->getEdge1()->getNode2()>getX())/2.)- x_1;
dl_j_i_x = ((this->getEdge2()->getNode1()->getX() + this->getEdge2()->getNode2()>getX())/2.)- x_2;
dl_k_i_x = ((this->getEdge3()->getNode1()->getX() + this->getEdge3()->getNode2()>getX())/2.)- x_3;
dl_h_i_y = ((this->getEdge1()->getNode1()->getY() + this->getEdge1()->getNode2()>getY())/2.) - y_1;
dl_j_i_y = ((this->getEdge2()->getNode1()->getY() + this->getEdge2()->getNode2()>getY())/2.) - y_2;
dl_k_i_y = ((this->getEdge3()->getNode1()->getY() + this->getEdge3()->getNode2()>getY())/2.) - y_3;
dl_h_i = sqrt(dl_h_i_x*dl_h_i_x + dl_h_i_y*dl_h_i_y);
dl_j_i = sqrt(dl_j_i_x*dl_j_i_x + dl_j_i_y*dl_j_i_y);
dl_k_i = sqrt(dl_k_i_x*dl_k_i_x + dl_k_i_y*dl_k_i_y);
double y_t = (this->getEdge1()->getNode1()->getY() + this->getEdge1()->getNode2()>getY())/2;
double x_t = (this->getEdge1()->getNode1()->getX() + this->getEdge1()->getNode2()-
>getX())/2;
distance_face_h = sqrt((x-x_t)*(x-x_t) + (y-y_t)*(y-y_t));
y_t = (this->getEdge2()->getNode1()->getY() + this->getEdge2()->getNode2()->getY())/2;
x_t = (this->getEdge2()->getNode1()->getX() + this->getEdge2()->getNode2()->getX())/2;
distance_face_j = sqrt((x-x_t)*(x-x_t) + (y-y_t)*(y-y_t));
y_t = (this->getEdge3()->getNode1()->getY() + this->getEdge3()->getNode2()->getY())/2;
x_t = (this->getEdge3()->getNode1()->getX() + this->getEdge3()->getNode2()->getX())/2;
distance_face_k = sqrt((x-x_t)*(x-x_t) + (y-y_t)*(y-y_t));
//
********************************************************************************************
****
//
********************************************************************************************
****
//
Calcolo delle distanze del baricentro dell'elemento dai baricentri degli elementi
adiacenti
if(this->getEdge1()->isBoundary() == true){
distance_i_h = distance_face_h;
}
else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
x_bar = this->getEdge1()->getElement1()->getBarycenter().getX();
y_bar = this->getEdge1()->getElement1()->getBarycenter().getY();
y_t = (this->getEdge1()->getNode1()->getY() + this->getEdge1()->getNode2()->getY())/2;
x_t = (this->getEdge1()->getNode1()->getX() + this->getEdge1()->getNode2()->getX())/2;
distance_i_h = sqrt((x_t-x_bar)*(x_t-x_bar) + (y_t-y_bar)*(y_t-y_bar)) + distance_face_h;
}
else{
x_bar = this->getEdge1()->getElement2()->getBarycenter().getX();
y_bar = this->getEdge1()->getElement2()->getBarycenter().getY();
y_t = (this->getEdge1()->getNode1()->getY() + this->getEdge1()->getNode2()->getY())/2;
x_t = (this->getEdge1()->getNode1()->getX() + this->getEdge1()->getNode2()->getX())/2;
distance_i_h = sqrt((x_t-x_bar)*(x_t-x_bar) + (y_t-y_bar)*(y_t-y_bar)) + distance_face_h;
}
}
if(this->getEdge2()->isBoundary() == true){
distance_i_j = distance_face_j;
}
else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
x_bar = this->getEdge2()->getElement1()->getBarycenter().getX();
y_bar = this->getEdge2()->getElement1()->getBarycenter().getY();
y_t = (this->getEdge2()->getNode1()->getY() + this->getEdge2()->getNode2()->getY())/2;
x_t = (this->getEdge2()->getNode1()->getX() + this->getEdge2()->getNode2()->getX())/2;
distance_i_j = sqrt((x_t-x_bar)*(x_t-x_bar) + (y_t-y_bar)*(y_t-y_bar)) + distance_face_j;
}
else{
x_bar = this->getEdge2()->getElement2()->getBarycenter().getX();
y_bar = this->getEdge2()->getElement2()->getBarycenter().getY();
y_t = (this->getEdge2()->getNode1()->getY() + this->getEdge2()->getNode2()->getY())/2;
x_t = (this->getEdge2()->getNode1()->getX() + this->getEdge2()->getNode2()->getX())/2;
distance_i_j = sqrt((x_t-x_bar)*(x_t-x_bar) + (y_t-y_bar)*(y_t-y_bar)) + distance_face_j;
}
}
if(this->getEdge3()->isBoundary() == true){
distance_i_k = distance_face_k;
}
else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
x_bar = this->getEdge3()->getElement1()->getBarycenter().getX();
y_bar = this->getEdge3()->getElement1()->getBarycenter().getY();
y_t = (this->getEdge3()->getNode1()->getY() + this->getEdge3()->getNode2()->getY())/2;
x_t = (this->getEdge3()->getNode1()->getX() + this->getEdge3()->getNode2()->getX())/2;
distance_i_k = sqrt((x_t-x_bar)*(x_t-x_bar) + (y_t-y_bar)*(y_t-y_bar)) + distance_face_k;
}
else{
x_bar = this->getEdge3()->getElement2()->getBarycenter().getX();
y_bar = this->getEdge3()->getElement2()->getBarycenter().getY();
y_t = (this->getEdge3()->getNode1()->getY() + this->getEdge3()->getNode2()->getY())/2;
x_t = (this->getEdge3()->getNode1()->getX() + this->getEdge3()->getNode2()->getX())/2;
distance_i_k = sqrt((x_t-x_bar)*(x_t-x_bar) + (y_t-y_bar)*(y_t-y_bar)) + distance_face_k;
}
}
}
pml_type = type;
//
cout<<pml_flag<<endl;
//
cout<<pml_type<<endl;
if(pml_flag == 1){
pml = 1;
if (pml_type == "S"){
//
if (((this->getElementID()>=1)&&(this->getElementID()<=750))||((this>getElementID()>=10500)&&(this->getElementID()<=11250))){
//
//
//
CSPML1 =1;
//sigma x
//
CSPML2 = 1; /*=1*((0.1-this->getBarycenter().getY())/0.1)*((0.1-this>getBarycenter().getY())/0.1)*((0.1-this->getBarycenter().getY())/0.1);
//sigma y*/
//
//
//
//
if(((this->getElementID()>=(1+i))&&(this->getElementID()<=(10+i)))||((this>getElementID()>=(140+i))&&(this->getElementID()<=(150+i)))){
//
CSPML1 = 1; /*=1*((0.1-this->getBarycenter().getX())/0.1)*((0.1-this>getBarycenter().getX())/0.1)*((0.1-this->getBarycenter().getX())/0.1);
//sigma x*/
//
CSPML2 = 1;
//
//
//
//
if ((this->getElementID()>=1)&&(this->getElementID()<=1200)){
CSPML1 =1;
//sigma x
CSPML2 =1.*((0.24-this->getBarycenter().getY())/0.24)*((0.24-this>getBarycenter().getY())/0.24)*((0.24-this->getBarycenter().getY())/0.24);
//sigma y
}
}
if (pml_type == "R"){
double x, y;
Zetha_zero = 8.*2.*3.14*3e8;
Zetha_x_r = Zetha_zero*((sqrt((this->getBarycenter().getX()-0.)*(this>getBarycenter().getX()-0.) + (this->getBarycenter().getY()-0.)*(this>getBarycenter().getY()-0.))-0.5)/0.5)
*((sqrt((this->getBarycenter().getX()-0.)*(this->getBarycenter().getX()-0.) + (this>getBarycenter().getY()-0.)*(this->getBarycenter().getY()-0.))-0.5)/0.5);
//
*((sqrt((this->getBarycenter().getX()-0.)*(this>getBarycenter().getX()-0.) + (this->getBarycenter().getY()-0.)*(this>getBarycenter().getY()-0.))-0.7)/0.3);
//
*((sqrt((this->getBarycenter().getX()-0.)*(this>getBarycenter().getX()-0.) + (this->getBarycenter().getY()-0.)*(this>getBarycenter().getY()-0.))-0.7)/0.3)
//
*((sqrt((this->getBarycenter().getX()-0.)*(this>getBarycenter().getX()-0.) + (this->getBarycenter().getY()-0.)*(this>getBarycenter().getY()-0.))-0.7)/0.3);
if ((((this->getBarycenter().getX()-0.)*(this->getBarycenter().getX()-0.) + (this>getBarycenter().getY()-0.)*(this->getBarycenter().getY()-0.))>=(0.5*0.5))&&(((this>getBarycenter().getX()-0.)*(this->getBarycenter().getX()-0.) + (this>getBarycenter().getY()-0.)*(this->getBarycenter().getY()-0.))<=(1.*1.))){
x= this->getBarycenter().getX()-0.;
y= this->getBarycenter().getY()-0.;
phi = atan(y/x);
CE_loss1 = Zetha_x_r;
CH_loss1 = cos(phi);
CH_loss2 = Zetha_x_r*(sin(phi)*sin(phi));
CH_loss3 = Zetha_x_r*(cos(phi)*sin(phi));
CH_loss4 = sin(phi);
CH_loss5 = Zetha_x_r*(cos(phi)*cos(phi));
CH_loss6 = Zetha_x_r*(cos(phi)*sin(phi));
//
CK_x_r1 = Zetha_x_r*sin(phi)/(this->getPhysicalProperties()>getMur()*mu*this->getArea());
//
CK_x_r2 = Zetha_x_r*cos(phi)/(this->getPhysicalProperties()>getMur()*mu*this->getArea());
CK_x_r1 = Zetha_x_r*sin(phi)/(this->getArea());
CK_x_r2 = Zetha_x_r*cos(phi)/(this->getArea());
}
}
}
}
double Element::computeTemporalStep(){
double step;
step =security_factor*2.* (sqrt(this->getPhysicalProperties()->getEpsr()*eps*this>getPhysicalProperties()->getMur()*mu))*this->getArea()/(this->edge1->getLength() +
this->edge2->getLength() + this->edge3->getLength());
//
step = 9.585e-12;
return step;
}
void Element::computeWeights(){
for (int i = 0; i<10; i++){
Weight_node_1 = Weight_node_1 + distances_node_1[i];
Weight_node_2 = Weight_node_2 + distances_node_2[i];
Weight_node_3 = Weight_node_3 + distances_node_3[i];
}
}
void Element::swapFields(){
E_z_old = E_z_new;
H_x_old = H_x_new;
H_y_old = H_y_new;
K_x_r_old = K_x_r_new;
}
void Element::swapFieldH(){
H_x_old = H_x_new;
H_y_old = H_y_new;
K_x_r_old = K_x_r_new;
}
void Element::swapFieldE(){
E_z_old = E_z_new;
E_z_y_old = E_z_y_new;
}
void Element::swapPredictedFieldH(){
H_x_old_1 = H_x_pred;
H_y_old_1 = H_y_pred;
}
void Element::swapPredictedFieldE(){
E_z_old_1 = E_z_pred;
}
void Element::setUpFieldH(){
if(spatial_order == 2){
double gradient;
if(this->getEdge1()->isBoundary() == true){
if(1 == boundaryFlag){
H_x_h = H_x_old;
H_y_h = H_y_old;
}else{
H_x_h = 0.;
H_y_h = 0.;
}
}else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
H_x_h = (this->getEdge1()->getElement1()->getH_x_old());
H_y_h = (this->getEdge1()->getElement1()->getH_y_old());
}else{
H_x_h = (this->getEdge1()->getElement2()->getH_x_old());
H_y_h = (this->getEdge1()->getElement2()->getH_y_old());
}
}
if(this->getEdge2()->isBoundary() == true){
if(1 == boundaryFlag){
H_x_j = H_x_old;
H_y_j = H_y_old;
}else{
H_x_j = 0.;
H_y_j = 0.;
}
}else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
H_x_j = (this->getEdge2()->getElement1()->getH_x_old());
H_y_j = (this->getEdge2()->getElement1()->getH_y_old());
}else{
H_x_j = (this->getEdge2()->getElement2()->getH_x_old());
H_y_j = (this->getEdge2()->getElement2()->getH_y_old());
}
}
if(this->getEdge3()->isBoundary() == true){
if(1 == boundaryFlag){
H_x_k = H_x_old;
H_y_k = H_y_old;
}else{
H_x_k = 0.;
H_y_k = 0.;
}
}else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
H_x_k = (this->getEdge3()->getElement1()->getH_x_old());
H_y_k = (this->getEdge3()->getElement1()->getH_y_old());
}else{
H_x_k = (this->getEdge3()->getElement2()->getH_x_old());
H_y_k = (this->getEdge3()->getElement2()->getH_y_old());
}
}
H_x_middle_h = (H_x_old*dl_i_h + H_x_h*dl_h_i)/(dl_i_h + dl_h_i);
H_x_middle_j = (H_x_old*dl_i_j + H_x_j*dl_j_i)/(dl_i_j + dl_j_i);
H_x_middle_k = (H_x_old*dl_i_k + H_x_k*dl_k_i)/(dl_i_k + dl_k_i);
double gradient_dl_h =
H_x_middle_h*(N_i_h_x*dl_i_h_x + N_i_h_y*dl_i_h_y)*edge1->getLength() +
H_x_middle_j*(N_i_j_x*dl_i_h_x + N_i_j_y*dl_i_h_y)*edge2->getLength() +
H_x_middle_k*(N_i_k_x*dl_i_h_x + N_i_k_y*dl_i_h_y)*edge3->getLength();
gradient_dl_h = gradient_dl_h/getArea();
double gradient_dl_j =
H_x_middle_h*(N_i_h_x*dl_i_j_x + N_i_h_y*dl_i_j_y)*edge1->getLength() +
H_x_middle_j*(N_i_j_x*dl_i_j_x + N_i_j_y*dl_i_j_y)*edge2->getLength() +
H_x_middle_k*(N_i_k_x*dl_i_j_x + N_i_k_y*dl_i_j_y)*edge3->getLength();
gradient_dl_j = gradient_dl_j/getArea();
double gradient_dl_k =
H_x_middle_h*(N_i_h_x*dl_i_k_x + N_i_h_y*dl_i_k_y)*edge1->getLength() +
H_x_middle_j*(N_i_j_x*dl_i_k_x + N_i_j_y*dl_i_k_y)*edge2->getLength() +
H_x_middle_k*(N_i_k_x*dl_i_k_x + N_i_k_y*dl_i_k_y)*edge3->getLength();
gradient_dl_k = gradient_dl_k/getArea();
H_x_middle_1 = H_x_old + gradient_dl_h;
H_x_middle_2 = H_x_old + gradient_dl_j;
H_x_middle_3 = H_x_old + gradient_dl_k;
H_y_middle_h = (H_y_old*dl_i_h + H_y_h*dl_h_i)/(dl_i_h + dl_h_i);
H_y_middle_j = (H_y_old*dl_i_j + H_y_j*dl_j_i)/(dl_i_j + dl_j_i);
H_y_middle_k = (H_y_old*dl_i_k + H_y_k*dl_k_i)/(dl_i_k + dl_k_i);
gradient_dl_h =
H_y_middle_h*(N_i_h_x*dl_i_h_x + N_i_h_y*dl_i_h_y)*edge1->getLength() +
H_y_middle_j*(N_i_j_x*dl_i_h_x + N_i_j_y*dl_i_h_y)*edge2->getLength() +
H_y_middle_k*(N_i_k_x*dl_i_h_x + N_i_k_y*dl_i_h_y)*edge3->getLength();
gradient_dl_h = gradient_dl_h/getArea();
gradient_dl_j =
H_y_middle_h*(N_i_h_x*dl_i_j_x + N_i_h_y*dl_i_j_y)*edge1->getLength() +
H_y_middle_j*(N_i_j_x*dl_i_j_x + N_i_j_y*dl_i_j_y)*edge2->getLength() +
H_y_middle_k*(N_i_k_x*dl_i_j_x + N_i_k_y*dl_i_j_y)*edge3->getLength();
gradient_dl_j = gradient_dl_j/getArea();
gradient_dl_k =
H_y_middle_h*(N_i_h_x*dl_i_k_x + N_i_h_y*dl_i_k_y)*edge1->getLength() +
H_y_middle_j*(N_i_j_x*dl_i_k_x + N_i_j_y*dl_i_k_y)*edge2->getLength() +
H_y_middle_k*(N_i_k_x*dl_i_k_x + N_i_k_y*dl_i_k_y)*edge3->getLength();
gradient_dl_k = gradient_dl_k/getArea();
else{
H_x_j = (this->getEdge2()->getElement2()->getH_x_old());
H_y_j = (this->getEdge2()->getElement2()->getH_y_old());
}
}
if(this->getEdge3()->isBoundary() == true){
H_x_k = 0.;
H_y_k = 0.;
}
else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
H_x_k = (this->getEdge3()->getElement1()->getH_x_old());
H_y_k = (this->getEdge3()->getElement1()->getH_y_old());
}
else{
H_x_k = (this->getEdge3()->getElement2()->getH_x_old());
H_y_k = (this->getEdge3()->getElement2()->getH_y_old());
}
}
}
//
cout<<"elemento "<<this->getElementID()<<" E_z_h = "<<E_z_h<<" E_z_j =
"<<E_z_j<<" E_z_k = "<<E_z_k<<endl;
if(spatial_order == 3){
if(this->getEdge1()->isBoundary() == true){
//
H_x_h = H_x_middle_1;
H_y_h = H_y_middle_1;
}
else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge1()){
H_x_h = (this->getEdge1()->getElement1()->getH_x_middle_1());
H_y_h = (this->getEdge1()->getElement1()->getH_y_middle_1());
}
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge2()){
H_x_h = (this->getEdge1()->getElement1()->getH_x_middle_2());
H_y_h = (this->getEdge1()->getElement1()->getH_y_middle_2());
}
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge3()){
H_x_h = (this->getEdge1()->getElement1()->getH_x_middle_3());
H_y_h = (this->getEdge1()->getElement1()->getH_y_middle_3());
}
}
else{
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge1()){
H_x_h = (this->getEdge1()->getElement2()->getH_x_middle_1());
H_y_h = (this->getEdge1()->getElement2()->getH_y_middle_1());
}
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge2()){
H_x_h = (this->getEdge1()->getElement2()->getH_x_middle_2());
H_y_h = (this->getEdge1()->getElement2()->getH_y_middle_2());
}
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge3()){
H_x_h = (this->getEdge1()->getElement2()->getH_x_middle_3());
H_y_h = (this->getEdge1()->getElement2()->getH_y_middle_3());
}
}
}
if(this->getEdge2()->isBoundary() == true){
H_x_j = H_x_middle_2;
H_y_j = H_y_middle_2;
}
else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge1()){
H_x_j = (this->getEdge2()->getElement1()->getH_x_middle_1());
H_y_j = (this->getEdge2()->getElement1()->getH_y_middle_1());
}
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge2()){
H_x_j = (this->getEdge2()->getElement1()->getH_x_middle_2());
H_y_j = (this->getEdge2()->getElement1()->getH_y_middle_2());
}
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge3()){
H_x_j = (this->getEdge2()->getElement1()->getH_x_middle_3());
H_y_j = (this->getEdge2()->getElement1()->getH_y_middle_3());
}
}
else{
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge1()){
H_x_j = (this->getEdge2()->getElement2()->getH_x_middle_1());
H_y_j = (this->getEdge2()->getElement2()->getH_y_middle_1());
}
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge2()){
H_x_j = (this->getEdge2()->getElement2()->getH_x_middle_2());
H_y_j = (this->getEdge2()->getElement2()->getH_y_middle_2());
}
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge3()){
H_x_j = (this->getEdge2()->getElement2()->getH_x_middle_3());
H_y_j = (this->getEdge2()->getElement2()->getH_y_middle_3());
}
}
}
if(this->getEdge3()->isBoundary() == true){
H_x_k = H_x_middle_3;
H_y_k = H_y_middle_3;
}
else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge1()){
H_x_k = (this->getEdge3()->getElement1()->getH_x_middle_1());
H_y_k = (this->getEdge3()->getElement1()->getH_y_middle_1());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge2()){
H_x_k = (this->getEdge3()->getElement1()->getH_x_middle_2());
H_y_k = (this->getEdge3()->getElement1()->getH_y_middle_2());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge3()){
H_x_k = (this->getEdge3()->getElement1()->getH_x_middle_3());
H_y_k = (this->getEdge3()->getElement1()->getH_y_middle_3());
}
}
else{
if(this->getEdge3()==this->getEdge3()->getElement2()->getEdge1()){
H_x_k = (this->getEdge3()->getElement2()->getH_x_middle_1());
H_y_k = (this->getEdge3()->getElement2()->getH_y_middle_1());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge2()){
H_x_k = (this->getEdge3()->getElement2()->getH_x_middle_2());
H_y_k = (this->getEdge3()->getElement2()->getH_y_middle_2());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge3()){
H_x_k = (this->getEdge3()->getElement2()->getH_x_middle_3());
H_y_k = (this->getEdge3()->getElement2()->getH_y_middle_3());
}
}
}
}
}
void Element::setUpFieldE(){
if (spatial_order == 2){
if(this->getEdge1()->isBoundary() == true){
if(1 == boundaryFlag){
E_z_h = E_z_old;
}else{
E_z_h = 0.;
}
}else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
E_z_h = (this->getEdge1()->getElement1()->getE_z_old());
}else{
E_z_h = (this->getEdge1()->getElement2()->getE_z_old());
}
}
if(this->getEdge2()->isBoundary() == true){
if(1 == boundaryFlag){
E_z_j = E_z_old;
}else{
E_z_j = 0.;
}
}else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
E_z_j = (this->getEdge2()->getElement1()->getE_z_old());
}else{
E_z_j = (this->getEdge2()->getElement2()->getE_z_old());
}
}
if(this->getEdge3()->isBoundary() == true){
if(1 == boundaryFlag){
E_z_k = E_z_old;
}else{
E_z_k = 0.;
}
}else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
E_z_k = (this->getEdge3()->getElement1()->getE_z_old());
}else{
E_z_k = (this->getEdge3()->getElement2()->getE_z_old());
}
}
E_z_middle_h = (E_z_old*dl_i_h + E_z_h*dl_h_i)/(dl_i_h + dl_h_i);
E_z_middle_j = (E_z_old*dl_i_j + E_z_j*dl_j_i)/(dl_i_j + dl_j_i);
E_z_middle_k = (E_z_old*dl_i_k + E_z_k*dl_k_i)/(dl_i_k + dl_k_i);
double gradient_dl_h =
E_z_middle_h*(N_i_h_x*dl_i_h_x + N_i_h_y*dl_i_h_y)*edge1->getLength() +
E_z_middle_j*(N_i_j_x*dl_i_h_x + N_i_j_y*dl_i_h_y)*edge2->getLength() +
E_z_middle_k*(N_i_k_x*dl_i_h_x + N_i_k_y*dl_i_h_y)*edge3->getLength();
gradient_dl_h = gradient_dl_h/getArea();
double gradient_dl_j =
E_z_middle_h*(N_i_h_x*dl_i_j_x + N_i_h_y*dl_i_j_y)*edge1->getLength() +
E_z_middle_j*(N_i_j_x*dl_i_j_x + N_i_j_y*dl_i_j_y)*edge2->getLength() +
E_z_middle_k*(N_i_k_x*dl_i_j_x + N_i_k_y*dl_i_j_y)*edge3->getLength();
gradient_dl_j = gradient_dl_j/getArea();
double gradient_dl_k =
E_z_middle_h*(N_i_h_x*dl_i_k_x + N_i_h_y*dl_i_k_y)*edge1->getLength() +
E_z_middle_j*(N_i_j_x*dl_i_k_x + N_i_j_y*dl_i_k_y)*edge2->getLength() +
E_z_middle_k*(N_i_k_x*dl_i_k_x + N_i_k_y*dl_i_k_y)*edge3->getLength();
gradient_dl_k = gradient_dl_k/getArea();
E_z_middle_1 = E_z_old + gradient_dl_h;
E_z_middle_2 = E_z_old + gradient_dl_j;
E_z_j = (this->getEdge2()->getElement1()->getE_z_old());
}
else{
E_z_j = (this->getEdge2()->getElement2()->getE_z_old());
}
}
if(this->getEdge3()->isBoundary() == true){
if(spatial_order == 1){
E_z_k = 0.;
}else{
E_z_old = 0.;
}
}
else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
E_z_k = (this->getEdge3()->getElement1()->getE_z_old());
}
else{
E_z_k = (this->getEdge3()->getElement2()->getE_z_old());
}
if(spatial_order == 3){
if(this->getEdge1()->isBoundary() == true){
E_z_h = -E_z_middle_1;
}
else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge1()){
E_z_h = (this->getEdge1()->getElement1()->getE_z_middle_1());
}
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge2()){
E_z_h = (this->getEdge1()->getElement1()->getE_z_middle_2());
}
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge3()){
E_z_h = (this->getEdge1()->getElement1()->getE_z_middle_3());
}
}
else{
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge1()){
E_z_h = (this->getEdge1()->getElement2()->getE_z_middle_1());
}
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge2()){
E_z_h = (this->getEdge1()->getElement2()->getE_z_middle_2());
}
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge3()){
E_z_h = (this->getEdge1()->getElement2()->getE_z_middle_3());
}
}
}
if(this->getEdge2()->isBoundary() == true){
E_z_j = -E_z_middle_2;
}
else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge1()){
E_z_j = (this->getEdge2()->getElement1()->getE_z_middle_1());
}
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge2()){
E_z_j = (this->getEdge2()->getElement1()->getE_z_middle_2());
}
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge3()){
E_z_j = (this->getEdge2()->getElement1()->getE_z_middle_3());
}
}
else{
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge1()){
E_z_j = (this->getEdge2()->getElement2()->getE_z_middle_1());
}
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge2()){
E_z_j = (this->getEdge2()->getElement2()->getE_z_middle_2());
}
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge3()){
E_z_j = (this->getEdge2()->getElement2()->getE_z_middle_3());
}
}
}
if(this->getEdge3()->isBoundary() == true){
E_z_k = -E_z_middle_3;
}
else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge1()){
E_z_k = (this->getEdge3()->getElement1()->getE_z_middle_1());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge2()){
E_z_k = (this->getEdge3()->getElement1()->getE_z_middle_2());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge3()){
E_z_k = (this->getEdge3()->getElement1()->getE_z_middle_3());
}
}
else{
if(this->getEdge3()==this->getEdge3()->getElement2()->getEdge1()){
E_z_k = (this->getEdge3()->getElement2()->getE_z_middle_1());
}
if(this->getEdge3()==this->getEdge3()->getElement2()->getEdge2()){
E_z_k = (this->getEdge3()->getElement2()->getE_z_middle_2());
}
if(this->getEdge3()==this->getEdge3()->getElement2()->getEdge3()){
E_z_k = (this->getEdge3()->getElement2()->getE_z_middle_3());
}
}
}
}
//
cout<<"elemento "<<this->getElementID()<<" E_z_h = "<<E_z_h<<" E_z_j =
"<<E_z_j<<" E_z_k = "<<E_z_k<<endl;
}
void Element::computeE_node(){
E_z_node_1 = 0;
E_z_node_2 = 0;
E_z_node_3 = 0;
map<int,Element*>::iterator it_elements;
int i= 0;
for(it_elements = elements_node_1->begin(); it_elements != elements_node_1->end();
it_elements++){
E_z_node_1 = E_z_node_1 + it_elements->second->getE_z_old()*distances_node_1[i];
i++;
}
E_z_node_1 = E_z_node_1/Weight_node_1;
i = 0;
for(it_elements = elements_node_2->begin(); it_elements != elements_node_2->end();
it_elements++){
E_z_node_2 = E_z_node_2 + it_elements->second->getE_z_old()*distances_node_2[i];
i++;
}
E_z_node_2 = E_z_node_2/Weight_node_2;
i = 0;
for(it_elements = elements_node_3->begin(); it_elements != elements_node_3->end();
it_elements++){
E_z_node_3 = E_z_node_3 + it_elements->second->getE_z_old()*distances_node_3[i];
i++;
}
E_z_node_3 = E_z_node_3/Weight_node_3;
}
void Element::computeH_node(){
H_x_node_1 = 0;
H_y_node_1 = 0;
H_x_node_2 = 0;
H_y_node_2 = 0;
H_x_node_3 = 0;
H_y_node_3 = 0;
map<int,Element*>::iterator it_elements;
int i= 0;
for(it_elements = elements_node_1->begin(); it_elements != elements_node_1->end();
it_elements++){
H_x_node_1 = H_x_node_1 + it_elements->second->getH_x_old()*distances_node_1[i];
H_y_node_1 = H_y_node_1 + it_elements->second->getH_y_old()*distances_node_1[i];
Weight_node_1 = Weight_node_1 + distances_node_1[i];
i++;
}
H_x_node_1 = H_x_node_1/Weight_node_1;
H_y_node_1 = H_y_node_1/Weight_node_1;
i = 0;
for(it_elements = elements_node_2->begin(); it_elements != elements_node_2->end();
it_elements++){
H_x_node_2 = H_x_node_2 + it_elements->second->getH_x_old()*distances_node_2[i];
H_y_node_2 = H_y_node_2 + it_elements->second->getH_y_old()*distances_node_2[i];
Weight_node_2 = Weight_node_2 + distances_node_2[i];
i++;
}
H_x_node_2 = H_x_node_2/Weight_node_2;
H_y_node_2 = H_y_node_2/Weight_node_2;
i = 0;
for(it_elements = elements_node_3->begin(); it_elements != elements_node_3->end();
it_elements++){
i++;
}
E_z_node_1 = E_z_node_1/Weight_node_1;
i = 0;
for(it_elements = elements_node_2->begin(); it_elements != elements_node_2->end();
it_elements++){
E_z_node_2 = E_z_node_2 + it_elements->second->getE_z_old_1()*distances_node_2[i];
//
i++;
}
E_z_node_2 = E_z_node_2/Weight_node_2;
i = 0;
for(it_elements = elements_node_3->begin(); it_elements != elements_node_3->end();
it_elements++){
E_z_node_3 = E_z_node_3 + it_elements->second->getE_z_old_1()*distances_node_3[i];
//
i++;
}
E_z_node_3 = E_z_node_3/Weight_node_3;
}
void Element::computeH_nodePredicted(){
H_x_node_1 = 0;
H_y_node_1 = 0;
H_x_node_2 = 0;
H_y_node_2 = 0;
H_x_node_3 = 0;
H_y_node_3 = 0;
map<int,Element*>::iterator it_elements;
int i= 0;
for(it_elements = elements_node_1->begin(); it_elements != elements_node_1->end();
it_elements++){
H_x_node_1 = H_x_node_1 + it_elements->second->getH_x_old_1()*distances_node_1[i];
H_y_node_1 = H_y_node_1 + it_elements->second->getH_y_old_1()*distances_node_1[i];
Weight_node_1 = Weight_node_1 + distances_node_1[i];
i++;
}
H_x_node_1 = H_x_node_1/Weight_node_1;
H_y_node_1 = H_y_node_1/Weight_node_1;
i = 0;
for(it_elements = elements_node_2->begin(); it_elements != elements_node_2->end();
it_elements++){
H_x_node_2 = H_x_node_2 + it_elements->second->getH_x_old_1()*distances_node_2[i];
H_y_node_2 = H_y_node_2 + it_elements->second->getH_y_old_1()*distances_node_2[i];
Weight_node_2 = Weight_node_2 + distances_node_2[i];
i++;
}
H_x_node_2 = H_x_node_2/Weight_node_2;
H_y_node_2 = H_y_node_2/Weight_node_2;
i = 0;
for(it_elements = elements_node_3->begin(); it_elements != elements_node_3->end();
it_elements++){
H_x_node_3 = H_x_node_3 + it_elements->second->getH_x_old_1()*distances_node_3[i];
H_y_node_3 = H_y_node_3 + it_elements->second->getH_y_old_1()*distances_node_3[i];
Weight_node_3 = Weight_node_3 + distances_node_3[i];
i++;
}
H_x_node_3 = H_x_node_3/Weight_node_3;
H_y_node_3 = H_y_node_3/Weight_node_3;
}
void Element::computeMiddleFieldE(){
if((this->getNode1()!=this->getEdge1()->getNode1())||(this->getNode1()!=this>getEdge1()->getNode2())){
E_z_middle_1 = E_z_old-(E_z_node_1-E_z_old)/2;
E_z_middle_1 = E_z_old + 1/3*(1/2*(E_z_node_2+E_z_node_3)-E_z_node_1);
}
if((this->getNode1()!=this->getEdge2()->getNode1())||(this->getNode1()!=this>getEdge2()->getNode2())){
E_z_middle_2 = E_z_old-(E_z_node_1-E_z_old)/2;
E_z_middle_2 = E_z_old + 1/3*(1/2*(E_z_node_2+E_z_node_3)-E_z_node_1);
}
if((this->getNode1()!=this->getEdge3()->getNode1())||(this->getNode1()!=this>getEdge3()->getNode2())){
E_z_middle_3 = E_z_old-(E_z_node_1-E_z_old)/2;
E_z_middle_3 = E_z_old + 1/3*(1/2*(E_z_node_2+E_z_node_3)-E_z_node_1);
}
if((this->getNode2()!=this->getEdge1()->getNode1())||(this->getNode2()!=this>getEdge1()->getNode2())){
E_z_middle_1 = E_z_old-(E_z_node_2-E_z_old)/2;
E_z_middle_1 = E_z_old + 1/3*(1/2*(E_z_node_1+E_z_node_3)-E_z_node_2);
}
if((this->getNode2()!=this->getEdge2()->getNode1())||(this->getNode2()!=this>getEdge2()->getNode2())){
E_z_middle_2 = E_z_old-(E_z_node_2-E_z_old)/2;
E_z_middle_2 = E_z_old + 1/3*(1/2*(E_z_node_1+E_z_node_3)-E_z_node_2);
}
if((this->getNode2()!=this->getEdge3()->getNode1())||(this->getNode2()!=this>getEdge3()->getNode2())){
E_z_middle_3 = E_z_old-(E_z_node_2-E_z_old)/2;
E_z_middle_3 = E_z_old + 1/3*(1/2*(E_z_node_1+E_z_node_3)-E_z_node_2);
}
if((this->getNode3()!=this->getEdge1()->getNode1())||(this->getNode3()!=this>getEdge1()->getNode2())){
E_z_middle_1 = E_z_old-(E_z_node_3-E_z_old)/2;
E_z_middle_1 = E_z_old + 1/3*(1/2*(E_z_node_1+E_z_node_2)-E_z_node_3);
}
if((this->getNode3()!=this->getEdge2()->getNode1())||(this->getNode3()!=this-
>getEdge2()->getNode2())){
E_z_middle_2 = E_z_old-(E_z_node_3-E_z_old)/2;
E_z_middle_2 = E_z_old + 1/3*(1/2*(E_z_node_1+E_z_node_2)-E_z_node_3);
}
if((this->getNode3()!=this->getEdge3()->getNode1())||(this->getNode3()!=this>getEdge3()->getNode2())){
E_z_middle_3 = E_z_old-(E_z_node_3-E_z_old)/2;
E_z_middle_3 = E_z_old + 1/3*(1/2*(E_z_node_1+E_z_node_2)-E_z_node_3);
}
}
void Element::computeMiddleFieldH(){
if((this->getNode1()!=this->getEdge1()->getNode1())||(this->getNode1()!=this>getEdge1()->getNode2())){
H_x_middle_1 = H_x_old-(H_x_node_1-H_x_old)/2;
H_y_middle_1 = H_y_old-(H_y_node_1-H_y_old)/2;
H_x_middle_1 = H_x_old + 1/3*(1/2*(H_x_node_2+H_x_node_3)-H_x_node_1);
H_y_middle_1 = H_y_old + 1/3*(1/2*(H_y_node_2+H_y_node_3)-H_y_node_1);
}
if((this->getNode1()!=this->getEdge2()->getNode1())||(this->getNode1()!=this>getEdge2()->getNode2())){
H_x_middle_2 = H_x_old-(H_x_node_1-H_x_old)/2;
H_y_middle_2 = H_y_old-(H_y_node_1-H_y_old)/2;
H_x_middle_2 = H_x_old + 1/3*(1/2*(H_x_node_2+H_x_node_3)-H_x_node_1);
H_y_middle_2 = H_y_old + 1/3*(1/2*(H_y_node_2+H_y_node_3)-H_y_node_1);
}
if((this->getNode1()!=this->getEdge3()->getNode1())||(this->getNode1()!=this>getEdge3()->getNode2())){
H_x_middle_3 = H_x_old-(H_x_node_1-H_x_old)/2;
H_y_middle_3 = H_y_old-(H_y_node_1-H_y_old)/2;
}
if((this->getNode2()!=this->getEdge1()->getNode1())||(this->getNode2()!=this>getEdge1()->getNode2())){
E_z_middle_1 = E_z_old_1 + 1./3.*(1./2.*(E_z_node_1+E_z_node_3)-E_z_node_2);
}
if((this->getNode2()!=this->getEdge2()->getNode1())||(this->getNode2()!=this>getEdge2()->getNode2())){
E_z_middle_2 = E_z_old_1 + 1./3.*(1./2.*(E_z_node_1+E_z_node_3)-E_z_node_2);
}
if((this->getNode2()!=this->getEdge3()->getNode1())||(this->getNode2()!=this>getEdge3()->getNode2())){
E_z_middle_3 = E_z_old_1 + 1./3.*(1./2.*(E_z_node_1+E_z_node_3)-E_z_node_2);
}
if((this->getNode3()!=this->getEdge1()->getNode1())||(this->getNode3()!=this>getEdge1()->getNode2())){
E_z_middle_1 = E_z_old_1 + 1./3.*(1./2.*(E_z_node_1+E_z_node_2)-E_z_node_3);
}
if((this->getNode3()!=this->getEdge2()->getNode1())||(this->getNode3()!=this>getEdge2()->getNode2())){
E_z_middle_2 = E_z_old_1 + 1./3.*(1./2.*(E_z_node_1+E_z_node_2)-E_z_node_3);
}
if((this->getNode3()!=this->getEdge3()->getNode1())||(this->getNode3()!=this>getEdge3()->getNode2())){
E_z_middle_3 = E_z_old_1 + 1./3.*(1./2.*(E_z_node_1+E_z_node_2)-E_z_node_3);
}
}
void Element::computePredictedMiddleFieldH(){
if((this->getNode1()!=this->getEdge1()->getNode1())||(this->getNode1()!=this>getEdge1()->getNode2())){
H_x_middle_1 = H_x_old_1 + 1./3.*(1./2.*(H_x_node_2+H_x_node_3)-H_x_node_1);
H_y_h = (this->getEdge1()->getElement1()->getH_y_pred());
}else{
H_x_h = (this->getEdge1()->getElement2()->getH_x_pred());
H_y_h = (this->getEdge1()->getElement2()->getH_y_pred());
}
}
if(this->getEdge2()->isBoundary() == true){
if(1 == boundaryFlag){
H_x_j = H_x_old_1;
H_y_j = H_y_old_1;
}else{
H_x_j = 0.;
H_y_j = 0.;
}
}else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
H_x_j = (this->getEdge2()->getElement1()->getH_x_pred());
H_y_j = (this->getEdge2()->getElement1()->getH_y_pred());
}else{
H_x_j = (this->getEdge2()->getElement2()->getH_x_pred());
H_y_j = (this->getEdge2()->getElement2()->getH_y_pred());
}
}
if(this->getEdge3()->isBoundary() == true){
if(1 == boundaryFlag){
H_x_k = H_x_old_1;
H_y_k = H_y_old_1;
}else{
H_x_k = 0.;
H_y_k = 0.;
}
}else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
H_x_k = (this->getEdge3()->getElement1()->getH_x_pred());
H_y_k = (this->getEdge3()->getElement1()->getH_y_pred());
}else{
H_x_k = (this->getEdge3()->getElement2()->getH_x_pred());
H_y_k = (this->getEdge3()->getElement2()->getH_y_pred());
}
}
H_x_middle_h = (H_x_old_1*dl_i_h + H_x_h*dl_h_i)/(dl_i_h + dl_h_i);
H_x_middle_j = (H_x_old_1*dl_i_j + H_x_j*dl_j_i)/(dl_i_j + dl_j_i);
H_x_middle_k = (H_x_old_1*dl_i_k + H_x_k*dl_k_i)/(dl_i_k + dl_k_i);
double gradient_dl_h =
H_x_middle_h*(N_i_h_x*dl_i_h_x + N_i_h_y*dl_i_h_y)*edge1->getLength() +
H_x_middle_j*(N_i_j_x*dl_i_h_x + N_i_j_y*dl_i_h_y)*edge2->getLength() +
H_x_middle_k*(N_i_k_x*dl_i_h_x + N_i_k_y*dl_i_h_y)*edge3->getLength();
gradient_dl_h = gradient_dl_h/getArea();
double gradient_dl_j =
H_x_middle_h*(N_i_h_x*dl_i_j_x + N_i_h_y*dl_i_j_y)*edge1->getLength() +
H_x_middle_j*(N_i_j_x*dl_i_j_x + N_i_j_y*dl_i_j_y)*edge2->getLength() +
H_x_middle_k*(N_i_k_x*dl_i_j_x + N_i_k_y*dl_i_j_y)*edge3->getLength();
gradient_dl_j = gradient_dl_j/getArea();
double gradient_dl_k =
H_x_middle_h*(N_i_h_x*dl_i_k_x + N_i_h_y*dl_i_k_y)*edge1->getLength() +
H_x_middle_j*(N_i_j_x*dl_i_k_x + N_i_j_y*dl_i_k_y)*edge2->getLength() +
H_x_middle_k*(N_i_k_x*dl_i_k_x + N_i_k_y*dl_i_k_y)*edge3->getLength();
gradient_dl_k = gradient_dl_k/getArea();
H_x_middle_1 = H_x_old_1 + gradient_dl_h;
H_x_middle_2 = H_x_old_1 + gradient_dl_j;
H_x_middle_3 = H_x_old_1 + gradient_dl_k;
// Hy
H_y_middle_h = (H_y_old_1*dl_i_h + H_y_h*dl_h_i)/(dl_i_h + dl_h_i);
H_y_middle_j = (H_y_old_1*dl_i_j + H_y_j*dl_j_i)/(dl_i_j + dl_j_i);
H_y_middle_k = (H_y_old_1*dl_i_k + H_y_k*dl_k_i)/(dl_i_k + dl_k_i);
gradient_dl_h =
H_y_middle_h*(N_i_h_x*dl_i_h_x + N_i_h_y*dl_i_h_y)*edge1->getLength() +
H_y_middle_j*(N_i_j_x*dl_i_h_x + N_i_j_y*dl_i_h_y)*edge2->getLength() +
H_y_middle_k*(N_i_k_x*dl_i_h_x + N_i_k_y*dl_i_h_y)*edge3->getLength();
gradient_dl_h = gradient_dl_h/getArea();
gradient_dl_j =
H_y_middle_h*(N_i_h_x*dl_i_j_x + N_i_h_y*dl_i_j_y)*edge1->getLength() +
H_y_middle_j*(N_i_j_x*dl_i_j_x + N_i_j_y*dl_i_j_y)*edge2->getLength() +
H_y_middle_k*(N_i_k_x*dl_i_j_x + N_i_k_y*dl_i_j_y)*edge3->getLength();
gradient_dl_j = gradient_dl_j/getArea();
gradient_dl_k =
H_y_middle_h*(N_i_h_x*dl_i_k_x + N_i_h_y*dl_i_k_y)*edge1->getLength() +
H_y_middle_j*(N_i_j_x*dl_i_k_x + N_i_j_y*dl_i_k_y)*edge2->getLength() +
H_y_middle_k*(N_i_k_x*dl_i_k_x + N_i_k_y*dl_i_k_y)*edge3->getLength();
gradient_dl_k = gradient_dl_k/getArea();
H_y_middle_1 = H_y_old_1 + gradient_dl_h;
H_y_middle_2 = H_y_old_1 + gradient_dl_j;
H_y_middle_3 = H_y_old_1 + gradient_dl_k;
}
if (spatial_order == 1){
if(this->getEdge1()->isBoundary() == true){
H_x_h = 0.;
H_y_h = 0.;
}else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
H_x_h = (this->getEdge1()->getElement1()->getH_x_pred());
H_y_h = (this->getEdge1()->getElement1()->getH_y_pred());
}
else{
H_x_h = (this->getEdge1()->getElement2()->getH_x_pred());
H_y_h = (this->getEdge1()->getElement2()->getH_y_pred());
}
}
if(this->getEdge2()->isBoundary() == true){
H_x_j = 0.;
H_y_j = 0.;
}else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
H_x_j = (this->getEdge2()->getElement1()->getH_x_pred());
H_y_j = (this->getEdge2()->getElement1()->getH_y_pred());
}else{
H_x_j = (this->getEdge2()->getElement2()->getH_x_pred());
H_y_j = (this->getEdge2()->getElement2()->getH_y_pred());
}
}
if(this->getEdge3()->isBoundary() == true){
H_x_k = 0.;
H_y_k = 0.;
}else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
H_x_k = (this->getEdge3()->getElement1()->getH_x_pred());
H_y_k = (this->getEdge3()->getElement1()->getH_y_pred());
}else{
H_x_k = (this->getEdge3()->getElement2()->getH_x_pred());
H_y_k = (this->getEdge3()->getElement2()->getH_y_pred());
}
}
}
if(spatial_order == 3){
if(this->getEdge1()->isBoundary() == true){
H_x_h = H_x_middle_1;
H_y_h = H_y_middle_1;
}else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge1()){
H_x_h = (this->getEdge1()->getElement1()->getH_x_middle_1());
H_y_h = (this->getEdge1()->getElement1()->getH_y_middle_1());
}
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge2()){
H_x_h = (this->getEdge1()->getElement1()->getH_x_middle_2());
H_y_h = (this->getEdge1()->getElement1()->getH_y_middle_2());
}
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge3()){
H_x_h = (this->getEdge1()->getElement1()->getH_x_middle_3());
H_y_h = (this->getEdge1()->getElement1()->getH_y_middle_3());
}
}else{
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge1()){
H_x_h = (this->getEdge1()->getElement2()->getH_x_middle_1());
H_y_h = (this->getEdge1()->getElement2()->getH_y_middle_1());
}
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge2()){
H_x_h = (this->getEdge1()->getElement2()->getH_x_middle_2());
H_y_h = (this->getEdge1()->getElement2()->getH_y_middle_2());
}
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge3()){
H_x_h = (this->getEdge1()->getElement2()->getH_x_middle_3());
H_y_h = (this->getEdge1()->getElement2()->getH_y_middle_3());
}
}
}
if(this->getEdge2()->isBoundary() == true){
H_x_j = H_x_middle_2;
H_y_j = H_y_middle_2;
}else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge1()){
H_x_j = (this->getEdge2()->getElement1()->getH_x_middle_1());
H_y_j = (this->getEdge2()->getElement1()->getH_y_middle_1());
}
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge2()){
H_x_j = (this->getEdge2()->getElement1()->getH_x_middle_2());
H_y_j = (this->getEdge2()->getElement1()->getH_y_middle_2());
}
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge3()){
H_x_j = (this->getEdge2()->getElement1()->getH_x_middle_3());
H_y_j = (this->getEdge2()->getElement1()->getH_y_middle_3());
}
}else{
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge1()){
H_x_j = (this->getEdge2()->getElement2()->getH_x_middle_1());
H_y_j = (this->getEdge2()->getElement2()->getH_y_middle_1());
}
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge2()){
H_x_j = (this->getEdge2()->getElement2()->getH_x_middle_2());
H_y_j = (this->getEdge2()->getElement2()->getH_y_middle_2());
}
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge3()){
H_x_j = (this->getEdge2()->getElement2()->getH_x_middle_3());
H_y_j = (this->getEdge2()->getElement2()->getH_y_middle_3());
}
}
}
if(this->getEdge3()->isBoundary() == true){
H_x_k = H_x_middle_3;
H_y_k = H_y_middle_3;
}else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge1()){
H_x_k = (this->getEdge3()->getElement1()->getH_x_middle_1());
H_y_k = (this->getEdge3()->getElement1()->getH_y_middle_1());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge2()){
H_x_k = (this->getEdge3()->getElement1()->getH_x_middle_2());
H_y_k = (this->getEdge3()->getElement1()->getH_y_middle_2());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge3()){
H_x_k = (this->getEdge3()->getElement1()->getH_x_middle_3());
H_y_k = (this->getEdge3()->getElement1()->getH_y_middle_3());
}
}
else{
if(this->getEdge3()==this->getEdge3()->getElement2()->getEdge1()){
H_x_k = (this->getEdge3()->getElement2()->getH_x_middle_1());
H_y_k = (this->getEdge3()->getElement2()->getH_y_middle_1());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge2()){
H_x_k = (this->getEdge3()->getElement2()->getH_x_middle_2());
H_y_k = (this->getEdge3()->getElement2()->getH_y_middle_2());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge3()){
H_x_k = (this->getEdge3()->getElement2()->getH_x_middle_3());
H_y_k = (this->getEdge3()->getElement2()->getH_y_middle_3());
}
}
}
}
//
cout<<"elemento "<<this->getElementID()<<" E_z_h = "<<E_z_h<<" E_z_j =
"<<E_z_j<<" E_z_k = "<<E_z_k<<endl;
}
void Element::setUpPredictedFieldE(){
if (spatial_order == 2){
double gradient;
if(this->getEdge1()->isBoundary() == true){
if(1 == boundaryFlag){
E_z_h = E_z_old_1;
}else{
E_z_h = 0.;
}
}else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
E_z_h = (this->getEdge1()->getElement1()->getE_z_pred());
}else{
E_z_h = (this->getEdge1()->getElement2()->getE_z_pred());
}
}
if(this->getEdge2()->isBoundary() == true){
if(1 == boundaryFlag){
E_z_j = E_z_old_1;
}else{
E_z_j = 0.;
}
}else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
E_z_j = (this->getEdge2()->getElement1()->getE_z_pred());
}else{
E_z_j = (this->getEdge2()->getElement2()->getE_z_pred());
}
}
if(this->getEdge3()->isBoundary() == true){
if(1 == boundaryFlag){
E_z_k = E_z_old_1;
}else{
E_z_k = 0.;
}
}else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
E_z_k = (this->getEdge3()->getElement1()->getE_z_pred());
}else{
E_z_k = (this->getEdge3()->getElement2()->getE_z_pred());
}
}
E_z_middle_h = (E_z_old_1*dl_i_h + E_z_h*dl_h_i)/(dl_i_h + dl_h_i);
}
}
else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
E_z_h = (this->getEdge1()->getElement1()->getE_z_pred());
}
else{
E_z_h = (this->getEdge1()->getElement2()->getE_z_pred());
}
}
if(this->getEdge2()->isBoundary() == true){
if(spatial_order == 1){
E_z_j = 0.0;
}else{
E_z_pred = 0.0;
}
}
else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
E_z_j = (this->getEdge2()->getElement1()->getE_z_pred());
}
else{
E_z_j = (this->getEdge2()->getElement2()->getE_z_pred());
}
}
if(this->getEdge3()->isBoundary() == true){
if(spatial_order == 1){
E_z_k = 0.;
}else{
E_z_pred = 0.;
}
}
else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
E_z_k = (this->getEdge3()->getElement1()->getE_z_pred());
}
else{
E_z_k = (this->getEdge3()->getElement2()->getE_z_pred());
}
}
}
if(spatial_order == 3){
if(this->getEdge1()->isBoundary() == true){
E_z_h = 0.0;
}
else{
if(this->getEdge1()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge1()){
E_z_h = (this->getEdge1()->getElement1()->getE_z_middle_1());
}
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge2()){
E_z_h = (this->getEdge1()->getElement1()->getE_z_middle_2());
}
if(this->getEdge1()==this->getEdge1()->getElement1()->getEdge3()){
E_z_h = (this->getEdge1()->getElement1()->getE_z_middle_3());
}
}
else{
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge1()){
E_z_h = (this->getEdge1()->getElement2()->getE_z_middle_1());
}
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge2()){
E_z_h = (this->getEdge1()->getElement2()->getE_z_middle_2());
}
if(this->getEdge1()==this->getEdge1()->getElement2()->getEdge3()){
E_z_h = (this->getEdge1()->getElement2()->getE_z_middle_3());
}
}
}
if(this->getEdge2()->isBoundary() == true){
E_z_j = 0.0;
}
else{
if(this->getEdge2()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge1()){
E_z_j = (this->getEdge2()->getElement1()->getE_z_middle_1());
}
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge2()){
E_z_j = (this->getEdge2()->getElement1()->getE_z_middle_2());
}
if(this->getEdge2()==this->getEdge2()->getElement1()->getEdge3()){
E_z_j = (this->getEdge2()->getElement1()->getE_z_middle_3());
}
}
else{
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge1()){
E_z_j = (this->getEdge2()->getElement2()->getE_z_middle_1());
}
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge2()){
E_z_j = (this->getEdge2()->getElement2()->getE_z_middle_2());
}
if(this->getEdge2()==this->getEdge2()->getElement2()->getEdge3()){
E_z_j = (this->getEdge2()->getElement2()->getE_z_middle_3());
}
}
}
if(this->getEdge3()->isBoundary() == true){
E_z_k = 0.0;
}
else{
if(this->getEdge3()->getElement1()->getElementID()!=this->getElementID()){
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge1()){
E_z_k = (this->getEdge3()->getElement1()->getE_z_middle_1());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge2()){
E_z_k = (this->getEdge3()->getElement1()->getE_z_middle_2());
}
if(this->getEdge3()==this->getEdge3()->getElement1()->getEdge3()){
E_z_k = (this->getEdge3()->getElement1()->getE_z_middle_3());
}
}
else{
if(this->getEdge3()==this->getEdge3()->getElement2()->getEdge1()){
E_z_k = (this->getEdge3()->getElement2()->getE_z_middle_1());
}
if(this->getEdge3()==this->getEdge3()->getElement2()->getEdge2()){
E_z_k = (this->getEdge3()->getElement2()->getE_z_middle_2());
}
if(this->getEdge3()==this->getEdge3()->getElement2()->getEdge3()){
E_z_k = (this->getEdge3()->getElement2()->getE_z_middle_3());
}
}
}
}
//
cout<<"elemento "<<this->getElementID()<<" E_z_h = "<<E_z_h<<" E_z_j =
"<<E_z_j<<" E_z_k = "<<E_z_k<<endl;
}
void Element::setUpMiddles(){
Element *elem;
int myID;
if(this->getEdge1()->isBoundary() == true){
E_z_middle_h = 0.;
H_x_middle_h = 0.;
H_y_middle_h = 0.;
}else{
myID = this->getEdge1()->getEdgeID();
if(this->getEdge1()->getElement1()->getElementID() != this->getElementID()){
elem = this->getEdge1()->getElement1();
}else{
elem = this->getEdge1()->getElement2();
}
if(myID == elem->getEdge1()->getEdgeID()){
E_z_middle_h = elem->getE_z_middle_1();
H_x_middle_h = elem->getH_x_middle_1();
H_y_middle_h = elem->getH_y_middle_1();
}else if(myID == elem->getEdge2()->getEdgeID()){
E_z_middle_h = elem->getE_z_middle_2();
H_x_middle_h = elem->getH_x_middle_2();
H_y_middle_h = elem->getH_y_middle_2();
}else if(myID == elem->getEdge3()->getEdgeID()){
E_z_middle_h = elem->getE_z_middle_3();
H_x_middle_h = elem->getH_x_middle_3();
H_y_middle_h = elem->getH_y_middle_3();
}
}
if(this->getEdge2()->isBoundary() == true){
E_z_middle_j = 0.;
H_x_middle_j = 0.;
H_y_middle_j = 0.;
}else{
myID = this->getEdge2()->getEdgeID();
if(this->getEdge2()->getElement1()->getElementID() != this->getElementID()){
elem = this->getEdge2()->getElement1();
}else{
elem = this->getEdge2()->getElement2();
}
if(myID == elem->getEdge1()->getEdgeID()){
E_z_middle_j = elem->getE_z_middle_1();
H_x_middle_j = elem->getH_x_middle_1();
H_y_middle_j = elem->getH_y_middle_1();
}else if(myID == elem->getEdge2()->getEdgeID()){
E_z_middle_j = elem->getE_z_middle_2();
H_x_middle_j = elem->getH_x_middle_2();
H_y_middle_j = elem->getH_y_middle_2();
}else if(myID == elem->getEdge3()->getEdgeID()){
E_z_middle_j = elem->getE_z_middle_3();
H_x_middle_j = elem->getH_x_middle_3();
H_y_middle_j = elem->getH_y_middle_3();
}
}
if(this->getEdge3()->isBoundary() == true){
E_z_middle_k = 0.;
H_x_middle_k = 0.;
H_y_middle_k = 0.;
}else{
myID = this->getEdge3()->getEdgeID();
if(this->getEdge3()->getElement1()->getElementID() != this->getElementID()){
elem = this->getEdge3()->getElement1();
}else{
elem = this->getEdge3()->getElement2();
}
if(myID == elem->getEdge1()->getEdgeID()){
E_z_middle_k = elem->getE_z_middle_1();
H_x_middle_k = elem->getH_x_middle_1();
H_y_middle_k = elem->getH_y_middle_1();
}else if(myID == elem->getEdge2()->getEdgeID()){
E_z_middle_k = elem->getE_z_middle_2();
H_x_middle_k = elem->getH_x_middle_2();
H_y_middle_k = elem->getH_y_middle_2();
}else if(myID == elem->getEdge3()->getEdgeID()){
E_z_middle_k = elem->getE_z_middle_3();
H_x_middle_k = elem->getH_x_middle_3();
H_y_middle_k = elem->getH_y_middle_3();
}
}
}
void Element::predictFieldE(double delta_t){
if (spatial_order == 1){
double ai_Phi_plus, ai_Phi_minus, ai_Phi, Phi;
ai_Phi_plus =
TE_i_h*(Y*E_z_old + N_i_h_y*H_x_old - N_i_h_x*H_y_old)*edge1->getLength() +
TE_i_j*(Y*E_z_old + N_i_j_y*H_x_old - N_i_j_x*H_y_old)*edge2->getLength() +
TE_i_k*(Y*E_z_old + N_i_k_y*H_x_old - N_i_k_x*H_y_old)*edge3->getLength();
ai_Phi_plus = 0.5*ai_Phi_plus;
ai_Phi_minus =
TE_h_i*(-Y_h*E_z_h + N_i_h_y*H_x_h - N_i_h_x*H_y_h)*edge1->getLength() +
if (spatial_order == 3){
Flux_E_z = (N_i_h_y*(H_x_middle_1 + H_x_h)/2 - N_i_h_x*(H_y_middle_1 + H_y_h)/2 +
N_i_j_y*(H_x_middle_2 + H_x_j)/2 - N_i_j_x*(H_y_middle_2 + H_y_j)/2 +
N_i_k_y*(H_x_middle_3 + H_x_k)/2 - N_i_k_x*(H_y_middle_3 + H_y_k)/2);
}
/*
E_z_pred = E_z_old - CE1*Flux_E_z*delta_t - ((this->getPhysicalProperties()>getSigma()/(this->getPhysicalProperties()->getEpsr()*eps))*E_z_old + J_z/(this>getPhysicalProperties()->getEpsr()*eps))*delta_t;*/
E_z_pred = E_z_old - CE1*Flux_E_z*delta_t - J_z/(this->getPhysicalProperties()>getEpsr()*eps)*delta_t;
if (pml ==1) {
if (pml_type == "S"){
E_z_pred = E_z_pred - (CSPML1*E_z_old + (CSPML2 - CSPML1)*E_z_y_old)/(this>getPhysicalProperties()->getEpsr()*eps)*delta_t;
}
if (pml_type == "R"){
E_z_pred = E_z_pred - (CE_loss1*E_z_old)*delta_t;
}
}
void Element::correctFieldE(double delta_t){
if(spatial_order == 1){
double ai_Phi_plus, ai_Phi_minus, ai_Phi, Phi;
ai_Phi_plus =
TE_i_h*(Y*E_z_old_1 + N_i_h_y*H_x_old_1 - N_i_h_x*H_y_old_1)*edge1->getLength() +
TE_i_j*(Y*E_z_old_1 + N_i_j_y*H_x_old_1 - N_i_j_x*H_y_old_1)*edge2->getLength() +
TE_i_k*(Y*E_z_old_1 + N_i_k_y*H_x_old_1 - N_i_k_x*H_y_old_1)*edge3->getLength();
ai_Phi_plus = 0.5*ai_Phi_plus;
ai_Phi_minus =
TE_h_i*(-Y_h*E_z_h + N_i_h_y*H_x_h - N_i_h_x*H_y_h)*edge1->getLength() +
ai_Phi_plus = 0.5*ai_Phi_plus;
ai_Phi_minus =
TE_h_i*(-Y_h*E_z_middle_h + N_i_h_y*H_x_middle_h - N_i_h_x*H_y_middle_h)*edge1>getLength() +
TE_j_i*(-Y_j*E_z_middle_j + N_i_j_y*H_x_middle_j - N_i_j_x*H_y_middle_j)*edge2>getLength() +
TE_k_i*(-Y_k*E_z_middle_k + N_i_k_y*H_x_middle_k - N_i_k_x*H_y_middle_k)*edge3>getLength();
ai_Phi_minus = 0.5*ai_Phi_minus;
ai_Phi = ai_Phi_plus + ai_Phi_minus;
Phi = ai_Phi/alphaE;
Flux_E_z = Phi;
if (pml ==1) {
if (pml_type == "S"){
Flux_E_z_y = (N_i_h_y*((distance_face_h/distance_i_h)*H_x_old_1 + (1distance_face_h/distance_i_h)*H_x_h) + N_i_j_y*((distance_face_j/distance_i_j)*H_x_old_1 +
(1-distance_face_j/distance_i_j)*H_x_j) + N_i_k_y*((distance_face_k/distance_i_k)*H_x_old_1
+ (1-distance_face_k/distance_i_k)*H_x_k));
}
}
}
if(spatial_order == 3){
Flux_E_z = (N_i_h_y*(H_x_middle_1 + H_x_h)/2 - N_i_h_x*(H_y_middle_1 + H_y_h)/2 +
N_i_j_y*(H_x_middle_1 + H_x_j)/2 - N_i_j_x*(H_y_middle_1 + H_y_j)/2 +
N_i_k_y*(H_x_middle_1 + H_x_k)/2 - N_i_k_x*(H_y_middle_1 + H_y_k)/2);
if (pml ==1) {
if (pml_type == "S"){
Flux_E_z_y = (N_i_h_y*(H_x_middle_1 + H_x_h)/2 + N_i_j_y*(H_x_middle_1 + H_x_j)/2 +
N_i_k_y*(H_x_middle_1 + H_x_k)/2);
}
}
}
/*
E_z_new = E_z_old - CE1*Flux_E_z*delta_t - ((this->getPhysicalProperties()>getSigma()/(this->getPhysicalProperties()->getEpsr()*eps))*E_z_old +J_z/(this>getPhysicalProperties()->getEpsr()*eps))*delta_t;*/
E_z_new = E_z_old - CE1*Flux_E_z*delta_t - J_z/(this->getPhysicalProperties()>getEpsr()*eps)*delta_t;
E_z_new = E_z_new *exp(-(getPhysicalProperties()->getSigma()/
(eps*getPhysicalProperties()->getEpsr()))*delta_t);
if (pml ==1) {
if (pml_type == "S"){
E_z_y_new = E_z_y_old - CE1*Flux_E_z_y*delta_t - CSPML2*E_z_y_old/(this>getPhysicalProperties()->getEpsr()*eps)*delta_t;
E_z_new = E_z_new - (CSPML1*E_z_old + (CSPML2 - CSPML1)*E_z_y_old)/(this>getPhysicalProperties()->getEpsr()*eps)*delta_t;
}
if (pml_type == "R"){
E_z_new = E_z_new - (CE_loss1*E_z_old)*delta_t;
}
}
/*
if(delta_t !=0)
ofs<<"Istante "<<instant<<endl;
ofs<<"Elemento "<<this->getElementID()<<"\n\nE_z_h = "<<E_z_h<<"\nE_z_j =
"<<E_z_j<<"\nE_z_k = "<<E_z_k<<"\n\n"<<"E_z_old = "<<E_z_old<<"\nE_z_new =
"<<E_z_new<<"\nJ_z = "<<J_z<<"\n\nH_x_h = "<<H_x_h<<"\nH_x_j =
"<<H_x_j<<"\nH_x_k = "<<H_x_k<<"\n"<<"H_x_old = "<<H_x_old<<"\nH_x_new =
"<<H_x_new<<"\n\nH_y_h = "<<H_y_h<<"\nH_y_j = "<<H_y_j<<"\nH_y_k =
"<<H_y_k<<"\n"<<"H_y_old = "<<H_y_old<<"\nH_y_new = "<<H_y_new<<"\n\ndelta_t
= "<<delta_t<<"\n--------------------------\n\n"<<endl;
ofs<<"CE1 = "<<CE1<<endl;
ofs<<"N_i_h_y = "<<N_i_h_y<<endl;
ofs<<"N_i_h_x = "<<N_i_h_x<<endl;
ofs<<"N_i_j_y = "<<N_i_j_y<<endl;
ofs<<"N_i_j_x = "<<N_i_j_x<<endl;
ofs<<"N_i_k_y = "<<N_i_k_y<<endl;
ofs<<"N_i_k_x = "<<N_i_k_x<<endl;
ofs<<"CH1 = "<<CH1<<endl;
ofs<<"N_i_h_y = "<<N_i_h_y<<endl;
ofs<<"N_i_j_y = "<<N_i_j_y<<endl;
ofs<<"N_i_k_y = "<<N_i_k_y<<endl;
ofs<<"N_i_h_x = "<<N_i_h_x<<endl;
ofs<<"N_i_j_x = "<<N_i_j_x<<endl;
ofs<<"N_i_k_x = "<<N_i_k_x<<endl;
ofs<<"\n--------------------------\n\n"<<endl;*/
}
void Element::updateFieldE(double delta_t, ostream& ofs, int instant){
//
formula del tipo: U_new = U_old +/- Flusso * delta_t +/- Perdite * delta_t +/- Sorgenti
* delta_t
//
double F;
// *************************************Aggiornamento di
E**********************************************
if(spatial_order == 1){
Flux_E_z = (N_i_h_y*(H_x_old + H_x_h)/2 - N_i_h_x*(H_y_old + H_y_h)/2 + N_i_j_y*(H_x_old
+ H_x_j)/2 - N_i_j_x*(H_y_old + H_y_j)/2 + N_i_k_y*(H_x_old + H_x_k)/2 - N_i_k_x*(H_y_old +
H_y_k)/2);
if (pml ==1) {
if (pml_type == "S"){
Flux_E_z_y = (N_i_h_y*(H_x_old + H_x_h)/2 + N_i_j_y*(H_x_old + H_x_j)/2 +
N_i_k_y*(H_x_old + H_x_k)/2);
}
}
}
if(spatial_order == 2) {
Flux_E_z = (N_i_h_y*((distance_face_h/distance_i_h)*H_x_old + (1distance_face_h/distance_i_h)*H_x_h) - N_i_h_x*((distance_face_h/distance_i_h)*H_y_old +
(1-distance_face_h/distance_i_h)*H_y_h) + N_i_j_y*((distance_face_j/distance_i_j)*H_x_old +
(1-distance_face_j/distance_i_j)*H_x_j) - N_i_j_x*((distance_face_j/distance_i_j)*H_y_old + (1distance_face_j/distance_i_j)*H_y_j) + N_i_k_y*((distance_face_k/distance_i_k)*H_x_old + (1distance_face_k/distance_i_k)*H_x_k) - N_i_k_x*((distance_face_k/distance_i_k)*H_y_old +
(1-distance_face_k/distance_i_k)*H_y_k));
if (pml ==1) {
if (pml_type == "S"){
Flux_E_z_y = (N_i_h_y*((distance_face_h/distance_i_h)*H_x_old + (1distance_face_h/distance_i_h)*H_x_h) + N_i_j_y*((distance_face_j/distance_i_j)*H_x_old +
(1-distance_face_j/distance_i_j)*H_x_j) + N_i_k_y*((distance_face_k/distance_i_k)*H_x_old +
(1-distance_face_k/distance_i_k)*H_x_k));
}
}
}
if(spatial_order == 3){
Flux_E_z = (N_i_h_y*(H_x_middle_1 + H_x_h)/2 - N_i_h_x*(H_y_middle_1 + H_y_h)/2 +
N_i_j_y*(H_x_middle_2 + H_x_j)/2 - N_i_j_x*(H_y_middle_2 + H_y_j)/2 +
N_i_k_y*(H_x_middle_3 + H_x_k)/2 - N_i_k_x*(H_y_middle_3 + H_y_k)/2);
if (pml ==1) {
if (pml_type == "S"){
Flux_E_z_y = (N_i_h_y*(H_x_middle_1 + H_x_h)/2 + N_i_j_y*(H_x_middle_2 + H_x_j)/2 +
N_i_k_y*(H_x_middle_3 + H_x_k)/2);
}
}
}
E_z_new = E_z_old - CE1*Flux_E_z*delta_t - ((this->getPhysicalProperties()->getSigma()/
(this->getPhysicalProperties()->getEpsr()*eps))*E_z_old +J_z/(this->getPhysicalProperties()>getEpsr()*eps))*delta_t;
if (pml ==1) {
if (pml_type == "S"){
E_z_y_new = E_z_y_old - CE1*Flux_E_z_y*delta_t - CSPML2*E_z_y_old/(this>getPhysicalProperties()->getEpsr()*eps)*delta_t;
E_z_new = E_z_new - (CSPML1*E_z_old + (CSPML2 - CSPML1)*E_z_y_old)/(this>getPhysicalProperties()->getEpsr()*eps)*delta_t;
}
if (pml_type == "R"){
E_z_new = E_z_new - (CE_loss1*E_z_old)*delta_t;
}
}
/*
if(delta_t !=0)
ofs<<"Istante "<<instant<<endl;
ofs<<"Elemento "<<this->getElementID()<<"\n\nE_z_h = "<<E_z_h<<"\nE_z_j =
"<<E_z_j<<"\nE_z_k = "<<E_z_k<<"\n\n"<<"E_z_old = "<<E_z_old<<"\nE_z_new =
"<<E_z_new<<"\nJ_z = "<<J_z<<"\n\nH_x_h = "<<H_x_h<<"\nH_x_j =
"<<H_x_j<<"\nH_x_k = "<<H_x_k<<"\n"<<"H_x_old = "<<H_x_old<<"\nH_x_new =
"<<H_x_new<<"\n\nH_y_h = "<<H_y_h<<"\nH_y_j = "<<H_y_j<<"\nH_y_k =
"<<H_y_k<<"\n"<<"H_y_old = "<<H_y_old<<"\nH_y_new = "<<H_y_new<<"\n\ndelta_t
= "<<delta_t<<"\n--------------------------\n\n"<<endl;
ofs<<"CE1 = "<<CE1<<endl;
ofs<<"N_i_h_y = "<<N_i_h_y<<endl;
ofs<<"N_i_h_x = "<<N_i_h_x<<endl;
ofs<<"N_i_j_y = "<<N_i_j_y<<endl;
ofs<<"N_i_j_x = "<<N_i_j_x<<endl;
ofs<<"N_i_k_y = "<<N_i_k_y<<endl;
ofs<<"N_i_k_x = "<<N_i_k_x<<endl;
ofs<<"CH1 = "<<CH1<<endl;
ofs<<"N_i_h_y = "<<N_i_h_y<<endl;
ofs<<"N_i_j_y = "<<N_i_j_y<<endl;
ofs<<"N_i_k_y = "<<N_i_k_y<<endl;
ofs<<"N_i_h_x = "<<N_i_h_x<<endl;
ofs<<"N_i_j_x = "<<N_i_j_x<<endl;
ofs<<"N_i_k_x = "<<N_i_k_x<<endl;
ofs<<"\n--------------------------\n\n"<<endl;*/
}
void Element::predictFieldH(double delta_t){
if (spatial_order == 1){
double ai_Phi_plus, ai_Phi_minus, ai_Phi, Phi;
ai_Phi_plus =
TH_i_h*(N_i_h_y*E_z_old + Z*N_i_h_y*(N_i_h_y*H_x_old - N_i_h_x*H_y_old))*edge1>getLength() +
TH_i_j*(N_i_j_y*E_z_old + Z*N_i_j_y*(N_i_j_y*H_x_old - N_i_j_x*H_y_old))*edge2>getLength() +
TH_i_k*(N_i_k_y*E_z_old + Z*N_i_k_y*(N_i_k_y*H_x_old - N_i_k_x*H_y_old))*edge3>getLength();
ai_Phi_plus = 0.5*ai_Phi_plus;
ai_Phi_minus =
TH_h_i*(N_i_h_y*E_z_h + Z_h*N_i_h_y*(-N_i_h_y*H_x_h + N_i_h_x*H_y_h))*edge1>getLength() +
TH_j_i*(N_i_j_y*E_z_j + Z_j*N_i_j_y*(-N_i_j_y*H_x_j + N_i_j_x*H_y_j))*edge2->getLength() +
TH_k_i*(N_i_k_y*E_z_k + Z_k*N_i_k_y*(-N_i_k_y*H_x_k + N_i_k_x*H_y_k))*edge3>getLength();
ai_Phi_minus = 0.5*ai_Phi_minus;
ai_Phi = ai_Phi_plus + ai_Phi_minus;
Phi = ai_Phi/alphaH;
Flux_H_x = Phi;
ai_Phi_plus =
TH_i_h*(-N_i_h_x*E_z_old + Z*N_i_h_x*(-N_i_h_y*H_x_old + N_i_h_x*H_y_old))*edge1-
>getLength() +
TH_i_j*(-N_i_j_x*E_z_old + Z*N_i_j_x*(-N_i_j_y*H_x_old + N_i_j_x*H_y_old))*edge2>getLength() +
TH_i_k*(-N_i_k_x*E_z_old + Z*N_i_k_x*(-N_i_k_y*H_x_old + N_i_k_x*H_y_old))*edge3>getLength();
ai_Phi_plus = 0.5*ai_Phi_plus;
ai_Phi_minus =
TH_h_i*(-N_i_h_x*E_z_h + Z_h*N_i_h_x*(N_i_h_y*H_x_h - N_i_h_x*H_y_h))*edge1>getLength() +
TH_j_i*(-N_i_j_x*E_z_j + Z_j*N_i_j_x*(N_i_j_y*H_x_j - N_i_j_x*H_y_j))*edge2->getLength() +
TH_k_i*(-N_i_k_x*E_z_k + Z_k*N_i_k_x*(N_i_k_y*H_x_k - N_i_k_x*H_y_k))*edge3>getLength();
ai_Phi_minus = 0.5*ai_Phi_minus;
ai_Phi = ai_Phi_plus + ai_Phi_minus;
Phi = ai_Phi/alphaH;
Flux_H_y = Phi;
}
if (spatial_order == 2) {
double ai_Phi_plus, ai_Phi_minus, ai_Phi, Phi;
ai_Phi_plus =
TH_i_h*(N_i_h_y*E_z_middle_1 + Z*N_i_h_y*(N_i_h_y*H_x_middle_1 N_i_h_x*H_y_middle_1))*edge1->getLength() +
TH_i_j*(N_i_j_y*E_z_middle_2 + Z*N_i_j_y*(N_i_j_y*H_x_middle_2 N_i_j_x*H_y_middle_2))*edge2->getLength() +
TH_i_k*(N_i_k_y*E_z_middle_3 + Z*N_i_k_y*(N_i_k_y*H_x_middle_3 N_i_k_x*H_y_middle_3))*edge3->getLength();
ai_Phi_plus = 0.5*ai_Phi_plus;
ai_Phi_minus =
TH_h_i*(N_i_h_y*E_z_middle_h + Z_h*N_i_h_y*(-N_i_h_y*H_x_middle_h +
N_i_h_x*H_y_middle_h))*edge1->getLength() +
TH_j_i*(N_i_j_y*E_z_middle_j + Z_j*N_i_j_y*(-N_i_j_y*H_x_middle_j +
N_i_j_x*H_y_middle_j))*edge2->getLength() +
TH_k_i*(N_i_k_y*E_z_middle_k + Z_k*N_i_k_y*(-N_i_k_y*H_x_middle_k +
N_i_k_x*H_y_middle_k))*edge3->getLength();
ai_Phi_minus = 0.5*ai_Phi_minus;
ai_Phi = ai_Phi_plus + ai_Phi_minus;
Phi = ai_Phi/alphaH;
Flux_H_x = Phi;
ai_Phi_plus =
TH_i_h*(-N_i_h_x*E_z_middle_1 + Z*N_i_h_x*(-N_i_h_y*H_x_middle_1 +
N_i_h_x*H_y_middle_1))*edge1->getLength() +
TH_i_j*(-N_i_j_x*E_z_middle_2 + Z*N_i_j_x*(-N_i_j_y*H_x_middle_2 +
N_i_j_x*H_y_middle_2))*edge2->getLength() +
TH_i_k*(-N_i_k_x*E_z_middle_3 + Z*N_i_k_x*(-N_i_k_y*H_x_middle_3 +
N_i_k_x*H_y_middle_3))*edge3->getLength();
ai_Phi_plus = 0.5*ai_Phi_plus;
ai_Phi_minus =
TH_h_i*(-N_i_h_x*E_z_middle_h + Z_h*N_i_h_x*(N_i_h_y*H_x_middle_h N_i_h_x*H_y_middle_h))*edge1->getLength() +
TH_j_i*(-N_i_j_x*E_z_middle_j + Z_j*N_i_j_x*(N_i_j_y*H_x_middle_j N_i_j_x*H_y_middle_j))*edge2->getLength() +
TH_k_i*(-N_i_k_x*E_z_middle_k + Z_k*N_i_k_x*(N_i_k_y*H_x_middle_k N_i_k_x*H_y_middle_k))*edge3->getLength();
ai_Phi_minus = 0.5*ai_Phi_minus;
ai_Phi = ai_Phi_plus + ai_Phi_minus;
Phi = ai_Phi/alphaH;
Flux_H_y = Phi;
}
if (spatial_order == 3){
Flux_H_x = (N_i_h_y*(E_z_middle_1 + E_z_h)/2 + N_i_j_y*(E_z_middle_2 + E_z_j)/2 +
N_i_k_y*(E_z_middle_3 + E_z_k)/2);
ai_Phi_plus =
TH_i_h*(N_i_h_y*E_z_old_1 + Z*N_i_h_y*(N_i_h_y*H_x_old_1 - N_i_h_x*H_y_old_1))*edge1>getLength() +
TH_i_j*(N_i_j_y*E_z_old_1 + Z*N_i_j_y*(N_i_j_y*H_x_old_1 - N_i_j_x*H_y_old_1))*edge2>getLength() +
TH_i_k*(N_i_k_y*E_z_old_1 + Z*N_i_k_y*(N_i_k_y*H_x_old_1 - N_i_k_x*H_y_old_1))*edge3>getLength();
ai_Phi_plus = 0.5*ai_Phi_plus;
ai_Phi_minus =
TH_h_i*(N_i_h_y*E_z_h + Z_h*N_i_h_y*(-N_i_h_y*H_x_h + N_i_h_x*H_y_h))*edge1>getLength() +
TH_j_i*(N_i_j_y*E_z_j + Z_j*N_i_j_y*(-N_i_j_y*H_x_j + N_i_j_x*H_y_j))*edge2->getLength() +
TH_k_i*(N_i_k_y*E_z_k + Z_k*N_i_k_y*(-N_i_k_y*H_x_k + N_i_k_x*H_y_k))*edge3>getLength();
ai_Phi_minus = 0.5*ai_Phi_minus;
ai_Phi = ai_Phi_plus + ai_Phi_minus;
Phi = ai_Phi/alphaH;
Flux_H_x = Phi;
ai_Phi_plus =
TH_i_h*(-N_i_h_x*E_z_old_1 + Z*N_i_h_x*(-N_i_h_y*H_x_old_1 + N_i_h_x*H_y_old_1))*edge1>getLength() +
TH_i_j*(-N_i_j_x*E_z_old_1 + Z*N_i_j_x*(-N_i_j_y*H_x_old_1 + N_i_j_x*H_y_old_1))*edge2>getLength() +
TH_i_k*(-N_i_k_x*E_z_old_1 + Z*N_i_k_x*(-N_i_k_y*H_x_old_1 + N_i_k_x*H_y_old_1))*edge3>getLength();
ai_Phi_plus = 0.5*ai_Phi_plus;
ai_Phi_minus =
TH_h_i*(-N_i_h_x*E_z_h + Z_h*N_i_h_x*(N_i_h_y*H_x_h - N_i_h_x*H_y_h))*edge1>getLength() +
TH_j_i*(-N_i_j_x*E_z_j + Z_j*N_i_j_x*(N_i_j_y*H_x_j - N_i_j_x*H_y_j))*edge2->getLength() +
TH_k_i*(-N_i_k_x*E_z_k + Z_k*N_i_k_x*(N_i_k_y*H_x_k - N_i_k_x*H_y_k))*edge3-
>getLength();
ai_Phi_minus = 0.5*ai_Phi_minus;
ai_Phi = ai_Phi_plus + ai_Phi_minus;
Phi = ai_Phi/alphaH;
Flux_H_y = Phi;
}
if(spatial_order == 2) {
ai_Phi_plus =
TH_i_h*(N_i_h_y*E_z_middle_1 + Z*N_i_h_y*(N_i_h_y*H_x_middle_1 N_i_h_x*H_y_middle_1))*edge1->getLength() +
TH_i_j*(N_i_j_y*E_z_middle_2 + Z*N_i_j_y*(N_i_j_y*H_x_middle_2 N_i_j_x*H_y_middle_2))*edge2->getLength() +
TH_i_k*(N_i_k_y*E_z_middle_3 + Z*N_i_k_y*(N_i_k_y*H_x_middle_3 N_i_k_x*H_y_middle_3))*edge3->getLength();
ai_Phi_plus = 0.5*ai_Phi_plus;
ai_Phi_minus =
TH_h_i*(N_i_h_y*E_z_middle_h + Z_h*N_i_h_y*(-N_i_h_y*H_x_middle_h +
N_i_h_x*H_y_middle_h))*edge1->getLength() +
TH_j_i*(N_i_j_y*E_z_middle_j + Z_j*N_i_j_y*(-N_i_j_y*H_x_middle_j +
N_i_j_x*H_y_middle_j))*edge2->getLength() +
TH_k_i*(N_i_k_y*E_z_middle_k + Z_k*N_i_k_y*(-N_i_k_y*H_x_middle_k +
N_i_k_x*H_y_middle_k))*edge3->getLength();
ai_Phi_minus = 0.5*ai_Phi_minus;
ai_Phi = ai_Phi_plus + ai_Phi_minus;
Phi = ai_Phi/alphaH;
Flux_H_x = Phi;
ai_Phi_plus =
TH_i_h*(-N_i_h_x*E_z_middle_1 + Z*N_i_h_x*(-N_i_h_y*H_x_middle_1 +
N_i_h_x*H_y_middle_1))*edge1->getLength() +
TH_i_j*(-N_i_j_x*E_z_middle_2 + Z*N_i_j_x*(-N_i_j_y*H_x_middle_2 +
N_i_j_x*H_y_middle_2))*edge2->getLength() +
TH_i_k*(-N_i_k_x*E_z_middle_3 + Z*N_i_k_x*(-N_i_k_y*H_x_middle_3 +
N_i_k_x*H_y_middle_3))*edge3->getLength();
ai_Phi_plus = 0.5*ai_Phi_plus;
ai_Phi_minus =
TH_h_i*(-N_i_h_x*E_z_middle_h + Z_h*N_i_h_x*(N_i_h_y*H_x_middle_h N_i_h_x*H_y_middle_h))*edge1->getLength() +
TH_j_i*(-N_i_j_x*E_z_middle_j + Z_j*N_i_j_x*(N_i_j_y*H_x_middle_j N_i_j_x*H_y_middle_j))*edge2->getLength() +
TH_k_i*(-N_i_k_x*E_z_middle_k + Z_k*N_i_k_x*(N_i_k_y*H_x_middle_k N_i_k_x*H_y_middle_k))*edge3->getLength();
ai_Phi_minus = 0.5*ai_Phi_minus;
ai_Phi = ai_Phi_plus + ai_Phi_minus;
Phi = ai_Phi/alphaH;
Flux_H_y = Phi;
}
//
if (spatial_order == 3){
//
//
Flux_H_x = (N_i_h_y*(E_z_middle_1 + E_z_h)/2 + N_i_j_y*(E_z_middle_2 + E_z_j)/2 +
N_i_k_y*(E_z_middle_3 + E_z_k)/2);
//
//
Flux_H_y = (N_i_h_x*(E_z_middle_1 + E_z_h)/2 + N_i_j_x*(E_z_middle_2 + E_z_j)/2 +
N_i_k_x*(E_z_middle_3 + E_z_k)/2);
//
//
//
if (pml ==1) {
if (pml_type == "R"){
//
//
Flux_K_x_r = (-CK_x_r1*(N_i_h_x*(E_z_middle_1 + E_z_h)/2 +
N_i_j_x*(E_z_middle_1 + E_z_j)/2 + N_i_k_x*(E_z_middle_1 + E_z_k)/2) +
CK_x_r2*(N_i_h_y*(E_z_middle_1 + E_z_h)/2 + N_i_j_y*(E_z_middle_1 + E_z_j)/2 +
N_i_k_y*(E_z_middle_1 + E_z_k)/2));
//
//
//
//
//
//
/*
H_x_new = H_x_old - CH1*Flux_H_x*delta_t + ((this->getPhysicalProperties()>getSigma_m()/(this->getPhysicalProperties()->getMur()*mu))*H_x_old + M_x/(this>getPhysicalProperties()->getMur()*mu))*delta_t;
H_y_new = H_y_old - CH1*Flux_H_y*delta_t + ((this->getPhysicalProperties()>getSigma_m()/(this->getPhysicalProperties()->getMur()*mu))*H_y_old + M_y/(this>getPhysicalProperties()->getMur()*mu))*delta_t;*/
H_x_new = H_x_old - CH1*Flux_H_x*delta_t;
H_y_new = H_y_old - CH1*Flux_H_y*delta_t;
if (pml ==1) {
if (pml_type == "S"){
H_x_new = H_x_new - (CSPML2*H_x_old)/(this->getPhysicalProperties()>getMur()*mu)*delta_t;
H_y_new = H_y_new - (CSPML1*H_y_old)/(this->getPhysicalProperties()>getMur()*mu)*delta_t;
}
if (pml_type == "R"){
Flux_K_x_r = (CK_x_r1*Flux_H_y + CK_x_r2*Flux_H_x);
K_x_r_new = K_x_r_old + Flux_K_x_r*delta_t;
H_x_new = H_x_new - (CH_loss1*K_x_r_old + CH_loss2*H_x_old CH_loss3*H_y_old)*delta_t;
H_y_new = H_y_new - (CH_loss4*K_x_r_old + CH_loss5*H_y_old CH_loss6*H_x_old)*delta_t;
}
}
}
void Element::updateFieldH(double delta_t, ostream& ofs, int instant){
//
formula del tipo: U_new = U_old +/- Flusso * delta_t +/- Perdite * delta_t +/- Sorgenti
* delta_t
//
// **************************************Aggiornamento di
H*********************************************
if(spatial_order == 1){
Flux_H_x = (N_i_h_y*(E_z_old + E_z_h)/2 + N_i_j_y*(E_z_old + E_z_j)/2 + N_i_k_y*(E_z_old +
E_z_k)/2);
Flux_H_y = (N_i_h_x*(E_z_old + E_z_h)/2 + N_i_j_x*(E_z_old + E_z_j)/2 + N_i_k_x*(E_z_old +
E_z_k)/2);
if (pml ==1) {
if (pml_type == "R"){
Flux_K_x_r = (-CK_x_r1*(N_i_h_x*(E_z_old + E_z_h)/2 + N_i_j_x*(E_z_old + E_z_j)/2 +
N_i_k_x*(E_z_old + E_z_k)/2) + CK_x_r2*(N_i_h_y*(E_z_old + E_z_h)/2 + N_i_j_y*(E_z_old +
E_z_j)/2 + N_i_k_y*(E_z_old + E_z_k)/2));
}
}
}
if(spatial_order == 2) {
Flux_H_x = (N_i_h_y*((distance_face_h/distance_i_h)*E_z_old + (1distance_face_h/distance_i_h)*E_z_h) + N_i_j_y*((distance_face_j/distance_i_j)*E_z_old + (1distance_face_j/distance_i_j)*E_z_j) + N_i_k_y*((distance_face_k/distance_i_k)*E_z_old + (1distance_face_k/distance_i_k)*E_z_k));
Flux_H_y = (N_i_h_x*((distance_face_h/distance_i_h)*E_z_old + (1distance_face_h/distance_i_h)*E_z_h) + N_i_j_x*((distance_face_j/distance_i_j)*E_z_old + (1distance_face_j/distance_i_j)*E_z_j) + N_i_k_x*((distance_face_k/distance_i_k)*E_z_old + (1distance_face_k/distance_i_k)*E_z_k));
if (pml ==1) {
if (pml_type == "R"){
Flux_K_x_r = (-CK_x_r1*(N_i_h_x*((distance_face_h/distance_i_h)*E_z_old + (1-
//
//
if ((t>0) &&((this->getElementID()==2550)))
// //
E_z_old= -sin(6.28*3e7*t);
//
//
//
//
E_z_old = Amplitude*exp(-((t-expected_value)/taup)*((texpected_value)/taup)*0.5);
}
void Element::addElement_node_1(Element* e){
if(elements_node_1->count(e->getElementID()) != 0){
cerr << "FATAL ERROR: Attempt of inserting an element, which already exists. The
program will be terminated." << endl;
exit(EXIT_FAILURE);
}
(*elements_node_1)[e->getElementID()] = e;
}
it_element++){
delete it_element->second;
}
for(it_element = elements_node_2->begin(); it_element != elements_node_2->end();
it_element++){
delete it_element->second;
}
for(it_element = elements_node_3->begin(); it_element != elements_node_3->end();
it_element++){
delete it_element->second;
}
delete elements_node_1;
delete elements_node_2;
delete elements_node_3;
delete normal1;
delete normal2;
delete normal3;
delete [] distances_node_1;
delete [] distances_node_2;
delete [] distances_node_3;
}
class ElementTester{
double tol;
public:
ElementTester();
void test();
~ElementTester();
};
ElementTester::ElementTester(){
tol = 1e-6;
}
void ElementTester::test(){
cout << "Starting test of the class Element ..." << endl;
{
// First test
Point2D p1(0.,0.);
Point2D p2(1.,0.);
Point2D p3(0.,1.);
Node n1(&p1, 1);
Node n2(&p2, 2);
Node n3(&p3, 3);
Edge e1(&n2, &n3, 1);
Edge e2(&n1, &n3, 2);
Edge e3(&n1, &n2, 31);
Element element(&n1, &n2, &n3, &e1, &e2, &e3, 1);
// barycenter
double x_barycenter, y_barycenter;
Point2D barycenter = element.getBarycenter();
x_barycenter = barycenter.getX();
y_barycenter = barycenter.getY();
cout << "x_BC = " << x_barycenter << endl;
cout << "y_BC = " << y_barycenter << endl;
if(abs(x_barycenter - 0.333333) >= tol || abs(y_barycenter - 0.333333) >= tol){
cerr << "ERROR in testing class Element: the barycenter computation does not work
properly." << endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
// lengths
double l1 = element.getSideLength1();
double l2 = element.getSideLength2();
double l3 = element.getSideLength3();
cout << "l1 = " << l1 << endl;
cout << "l2 = " << l2 << endl;
cout << "l3 = " << l3 << endl;
if(abs(l1 - sqrt(2.0)) >= tol || abs(l2 - 1.0) >= tol || abs(l3 - 1.0) >= tol){
cerr << "ERROR in testing class Element: the side lengths computation does not work
properly." << endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
// area
double area = element.getArea();
cout << "Area = " << area << endl;
if(abs(area - 0.5) >= tol){
cerr << "ERROR in testing class Element: the area computation does not work properly."
<< endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
// normals
Vector2D* normal1 = element.getNormal1();
Vector2D* normal2 = element.getNormal2();
Vector2D* normal3 = element.getNormal3();
if(abs(normal1->getXComponent() - sqrt(0.5)) >= tol || abs(normal1->getYComponent() sqrt(0.5)) >= tol){
cerr << "ERROR in testing class Element: the normal computation does not work properly."
<< endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
if(abs(normal2->getXComponent() - (-1.0)) >= tol || abs(normal2->getYComponent() - 0.0)
>= tol){
cerr << "ERROR in testing class Element: the normal computation does not work properly."
<< endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
if(abs(normal3->getXComponent() - (0.0)) >= tol || abs(normal3->getYComponent() - (1.0)) >= tol){
cerr << "ERROR in testing class Element: the normal computation does not work properly."
<< endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
}
{
// Second test
Point2D p1(-1.,0.);
Point2D p2(1.,0.);
Point2D p3(0.,1.);
Node n1(&p1, 1);
Node n2(&p2, 2);
Node n3(&p3, 3);
Edge e1(&n2, &n3, 1);
Edge e2(&n1, &n3, 2);
Edge e3(&n1, &n2, 31);
Element element(&n1, &n2, &n3, &e1, &e2, &e3, 1);
// barycenter
double x_barycenter, y_barycenter;
Point2D barycenter = element.getBarycenter();
x_barycenter = barycenter.getX();
y_barycenter = barycenter.getY();
cout << "x_BC = " << x_barycenter << endl;
cout << "y_BC = " << y_barycenter << endl;
if(abs(x_barycenter - 0.) >= tol || abs(y_barycenter - 0.333333) >= tol){
cerr << "ERROR in testing class Element: the barycenter computation does not work
properly." << endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
// lengths
double l1 = element.getSideLength1();
double l2 = element.getSideLength2();
double l3 = element.getSideLength3();
cout << "l1 = " << l1 << endl;
cout << "l2 = " << l2 << endl;
cout << "l3 = " << l3 << endl;
if(abs(l1 - sqrt(2.0)) >= tol || abs(l2 - sqrt(2.0)) >= tol || abs(l3 - 2.0) >= tol){
cerr << "ERROR in testing class Element: the side lengths computation does not work
properly." << endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
// area
double area = element.getArea();
cout << "Area = " << area << endl;
if(abs(area - 1.0) >= tol){
cerr << "ERROR in testing class Element: the area computation does not work properly."
<< endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
// normals
Vector2D* normal1 = element.getNormal1();
Vector2D* normal2 = element.getNormal2();
Vector2D* normal3 = element.getNormal3();
if(abs(normal1->getXComponent() - sqrt(0.5)) >= tol || abs(normal1->getYComponent() sqrt(0.5)) >= tol){
cerr << "ERROR in testing class Element: the normal computation does not work properly."
<< endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
if(abs(normal2->getXComponent() - (-sqrt(0.5))) >= tol || abs(normal2->getYComponent() sqrt(0.5)) >= tol){
cerr << "ERROR in testing class Element: the normal computation does not work properly."
<< endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
if(abs(normal3->getXComponent() - (0.0)) >= tol || abs(normal3->getYComponent() - (1.0)) >= tol){
cerr << "ERROR in testing class Element: the normal computation does not work properly."
<< endl;
cerr << "See file " << __FILE__ << " at line " << __LINE__ << "." << endl;
}
}
cout << "done." << endl;
}
ElementTester::~ElementTester(){
}
class Mesh{
map<int,Node*> *nodes;
map<int,Element*> *elements;
map<int,Edge*> *edges;
void addElement(Element* e);
void addNode(Node* n);
Edge* addEdge(Edge* e);
public:
Mesh(string nodesFilename, string elementsFilename, string mediaFilename);
Edge* getEdge(int edgeID);
Node* getNode(int nodeID);
Element* getElement(int elementID);
int getElementsNumber(){return elements->size();}
void printBoundaryNodes(string filename);
map<int,Node*>* getNodes(){return nodes;}
map<int,Element*>* getElements(){return elements;}
map<int,Edge*>* getEdges(){return edges;}
~Mesh();
};
Mesh::Mesh(string nodesFilename, string elementsFilename, string mediaFilename){
nodes = new map<int,Node*>;
elements = new map<int,Element*>;
edges = new map<int,Edge*>;
ifstream nodeInput, elementInput, mediaInput;
nodeInput.open(nodesFilename.c_str());
if(!nodeInput){
cerr << "Impossibile to open file " << nodesFilename << ". The program will be
terminated." << endl;
exit(EXIT_FAILURE);
}
int nodesNumber, dummy1, dummy2, dummy3, dummy5;
double x, y, dummy4;
int nodeID;
Point2D *point;
Node *node;
Element *element;
nodeInput >> nodesNumber >> dummy1 >> dummy2 >> dummy3;
for(int n = 0; n < nodesNumber; n++){
nodeInput >> nodeID >> x >> y >> dummy4;
point = new Point2D(x,y);
node = new Node(point, nodeID);
addNode(node);
}
nodeInput.close();
elementInput.open(elementsFilename.c_str());
if(!elementInput){
cerr << "Impossibile to open file " << elementsFilename << ". The program will be
terminated." << endl;
exit(EXIT_FAILURE);
}
int elementsNumber;
int nodesPerElement;
int elementID;
elementInput >> elementsNumber >> nodesPerElement >> dummy1;
if(nodesPerElement != 3){
cerr << "FATAL ERROR: the program is unable to handle elements with a number of nodes
different from 3. The progrm will be terminated.";
exit(EXIT_FAILURE);
}
int nodeID_vector[3];
Node* node_vector[3];
Edge* edge_vector[3];
int edgeID = 0;
for(int e = 0; e < elementsNumber; e++){
elementInput >> elementID;
for(int n = 0; n < nodesPerElement; n++){
elementInput >> nodeID_vector[n];
}
for(int n = 0; n < nodesPerElement; n++){
node_vector[n] = getNode(nodeID_vector[n]);
}
edge_vector[0] = new Edge(node_vector[1], node_vector[2], edgeID);
edgeID++;
edge_vector[1] = new Edge(node_vector[0], node_vector[2], edgeID);
edgeID++;
edge_vector[2] = new Edge(node_vector[0], node_vector[1], edgeID);
edgeID++;
for(int n = 0; n < nodesPerElement; n++){
edge_vector[n] = addEdge(edge_vector[n]);
}
element = new Element(node_vector[0], node_vector[1], node_vector[2], edge_vector[0],
edge_vector[1], edge_vector[2], elementID);
addElement(element);
}
elementInput.close();
map<int,Element*>::iterator it_elements;
for(it_elements = getElements()->begin(); it_elements != getElements()->end();
it_elements++){
it_elements->second->updateBoundary();
}
string mediaType;
PhysicalProperties *physicalProperties;
mediaInput.open(mediaFilename.c_str());
for(int e = 0; e < getElementsNumber(); e++){
mediaInput >> elementID >> mediaType;
physicalProperties = new PhysicalProperties(mediaType);
physicalProperties->read(&mediaInput);
element = getElement(elementID);
element->setPhysicalProperties(physicalProperties);
}
mediaInput.close();
}
void Mesh::printBoundaryNodes(string filename){
ofstream output;
output.open(filename.c_str());
map<int,Edge*>::iterator it;
for(it = getEdges()->begin(); it != getEdges()->end(); it++){
if(it->second->isBoundary() == true){
output << it->second->getNode1()->getX() << "\t" << it->second->getNode1()->getY()
<< endl;
}
(*elements)[e->getElementID()] = e;
}
Element* Mesh::getElement(int elementID){
if(elements->count(elementID) == 0){
return 0;
}else{
return (*elements)[elementID];
}
}
Edge* Mesh::addEdge(Edge* e){
Edge* retval = e;
if(edges->count(e->getEdgeID()) != 0){
cerr << "FATAL ERROR: Attempt of inserting an edge, which already exists. The programa
will be terminated." << endl;
exit(EXIT_FAILURE);
}
map<int,Edge*>::iterator it;
Edge* edge;
bool found = false;
for(it = edges->begin(); it != edges->end(); it++){
edge = it->second;
if(*edge == *e){
retval = edge;
//edge->setBoundary(false);
delete e;
found = true;
break;
}
}
if(found == false){
(*edges)[e->getEdgeID()] = e;
}
return retval;
}
Edge* Mesh::getEdge(int edgeID){
if(edges->count(edgeID) == 0){
return 0;
}else{
return (*edges)[edgeID];
}
}
Mesh::~Mesh(){
map<int,Node*>::iterator it_node;
map<int,Edge*>::iterator it_edge;
map<int,Element*>::iterator it_element;
for(it_node = getNodes()->begin(); it_node != getNodes()->end(); it_node++){
delete it_node->second;
}
for(it_edge = getEdges()->begin(); it_edge != getEdges()->end(); it_edge++){
delete it_edge->second;
}
for(it_element = getElements()->begin(); it_element != getElements()->end(); it_element+
+){
delete it_element->second->getPhysicalProperties();
delete it_element->second;
}
delete nodes;
delete elements;
delete edges;
}
class MeshGen{
public:
MeshGen(string nodesFilename, string elementsFilename, string mediaFilename, int row,
int col, double x_step, double y_step, double x_start, double y_start);
~MeshGen();
};
MeshGen::MeshGen(string nodesFilename, string elementsFilename, string mediaFilename,
int col, int row, double x_step, double y_step, double x_start, double y_start){
int N = col+1;
int M = row+1;
int dummy1 = 1;
int dummy2 = 1;
int dummy3 = 1;
int dummy4 = 1;
int dummy5 = 1;
int nodesPerElement = 3;
int offset;
int ID = 1;
double noise = 0;
double noise2 = 0;
double epsr = 1;
double sigma = 0;
double mur = 1;
double sigma_m = 0;
string type = "D";
ofstream outputNodes;
outputNodes.open(nodesFilename.c_str());
if(!outputNodes){
cerr << "Impossibile to open the output nodes file. The program will be terminated."<<
endl;
exit(EXIT_FAILURE);
}
outputNodes<<N*M<<"\t"<<dummy1<<"\t"<<dummy2<<"\t"<<dummy3<<endl;
for(int m=0; m<M; m++){
offset = (m)*N;
for(int n=0; n<N; n++){
if((offset !=0) && (offset != (M-1)*N)){
//
noise = rand()%100*x_step/100*0.2;
//
noise2 = rand()%100*y_step/100*0.2;
cout <<x_step<<"\n"<<noise<<"\n"<<noise2<<endl;
}
outputNodes << (n)+offset << "\t" << (n*x_step) + x_start + noise << "\t" << (m*y_step)
+ y_start + noise2 << "\t" << dummy4 << endl;
}
}
ofstream outputElements;
outputElements.open(elementsFilename.c_str());
if(!outputElements){
cerr << "Impossibile to open the output elements file. The program will be terminated."<<
endl;
exit(EXIT_FAILURE);
}
outputElements<<2*(N-1)*(M-1)<<"\t"<<nodesPerElement<<"\t"<<dummy1<<endl;
for(int m=1; m<M; m++){
offset = (m -1)*N;
for(int n=1; n<N; n++){
outputElements<<ID<<"\t"<<(n-1)+offset<<"\t"<<(n)+offset<<"\t"<<(N+n1)+offset<<endl;
outputElements<<ID+1<<"\t"<<(n)+offset<<"\t"<<(n-1+N)+offset<<"\t"<<(n+N)
+offset<<endl;
ID+= 2;;
}
}
ofstream outputMedia;
outputMedia.open(mediaFilename.c_str());
if(!outputMedia){
cerr << "Impossibile to open the output parameters file. The program will be
terminated."<< endl;
exit(EXIT_FAILURE);
}
ID = 1;
for(int m =1; m < M; m++){
offset = (m -1)*N;
for(int n=1; n<N; n++){
if(((ID>(3500+41)) && (ID<(3500+61)))||((ID>(3600+41)) && (ID<(3600+61)))||
((ID>(3700+41)) && (ID<(3700+61)))||((ID>(3800+41)) && (ID<(3800+61)))||
((ID>(3900+41)) && (ID<(3900+61)))){
outputMedia << ID << "\t" << type << "\t" << epsr
<<"\t"<<0.<<"\t"<<mur<<"\t"<<sigma_m<<endl;
outputMedia << ID + 1 << "\t" <<type << "\t" << epsr << "\t" << 0.
<<"\t"<<mur<<"\t"<<sigma_m<<endl;
ID+=2;
}else{
outputMedia<<ID<<"\t"<<type<<"\t"<<epsr<<"\t"<<0.<<"\t"<<mur<<"\t"<<sigma_m
<<endl;
outputMedia<<ID+1<<"\t"<<type<<"\t"<<epsr<<"\t"<<0.<<"\t"<<mur<<"\t"<<sigma
_m<<endl;
ID+=2;
}
}
}
//
********************************************************************************************
**********************
outputNodes.close();
outputElements.close();
outputMedia.close();
}
MeshGen::~MeshGen(){
}
////
ostream& operator<<(ostream& ofs, Point2D* p);
ostream& operator<<(ostream& ofs, Node* n);
ostream& operator<<(ostream& ofs, Edge* e);
ostream& operator<<(ostream& ofs, PhysicalProperties* p);
ostream& operator<<(ostream& ofs, Element* e);
ostream& operator<<(ostream& ofs, Vector2D* v);
return ofs;
}
ostream& operator<<(ostream& ofs, PhysicalProperties* p){
ofs << "Type: " << p->getType() << endl;
if(p->getType() == "D"){
ofs << p->getEpsr() << " " << p->getSigma() << " " << p->getMur() << " " << p>getSigma_m() << endl;
}
return ofs;
}
ostream& operator<<(ostream& ofs, Element *e){
Edge* e1 = e->getEdge1();
Edge* e2 = e->getEdge2();
Edge* e3 = e->getEdge3();
Vector2D* normal1 = e->getNormal1();
Vector2D* normal2 = e->getNormal2();
Vector2D* normal3 = e->getNormal3();
ofs << "Element ID = " << e->getElementID() << endl;
ofs << "Is boundary: " << e->isBoundary() << endl;
ofs << "Edge 1" << endl;
ofs << e1 << endl;
ofs << "Edge 2" << endl;
ofs << e2 << endl;
ofs << "Edge 3" << endl;
ofs << e3 << endl;
ofs << "Normal 1" << endl;
ofs << normal1 << endl;
int grid_flag;
Element** grid;
Element** test_elements;
double* test_points;
int test_points_number;
ofstream outfile1, outfile2, outfile3, outfile4;
//
double* distancev;
int row;
int col;
double x_end, x_start;
double y_end, y_start;
double x_step;
double y_step;
double x_dimension;
double y_dimension;
Mesh *mesh;
map<int,Element*> *elements;
public:
fvtd2dSolver();
~fvtd2dSolver();
void inizialize();
void readDomain();
void solve();
void createMesh();
void createBoundary();
void createSource();
void setOutput();
Element* nearestElement(double x, double y);
t_start = 0.;
t_end = 0.;
pml_flag = 0.;
security_coefficient = 0.;
inizialize();
}
fvtd2dSolver::~fvtd2dSolver(){
delete[] grid;
//
delete[] test_elements;
//
delete test_points;
}
void fvtd2dSolver::readDomain(){
ifstream infile("Domain.dat");
if(!infile){
cerr << "Impossibile to open the domain file. The program will be terminated."<< endl;
exit(EXIT_FAILURE);
}
infile >> x_start >> x_end >> row;
infile >> y_start >> y_end >> col;
infile >> t_start >> t_end >> security_coefficient;
infile >> order >> spatial_order;
infile >> boundaryType;
cout << "Coefficiente di sicurezza settato al " << security_coefficient*100 << " %" <<
endl;
cout << "Precisione spaziale di ordine: " << spatial_order << endl;
}
void fvtd2dSolver::inizialize(){
cout << "Inizializzazione in corso..." << endl;
readDomain();
int number_of_elements_x, number_of_elements_y;
double element_dimension_x, element_dimension_y;
ifstream infile("Mesh.dat");
if(!infile){
cerr << "Impossibile to open the mesh parameters file. The program will be
terminated."<< endl;
exit(EXIT_FAILURE);
}
infile >> number_of_elements_x >> number_of_elements_y;
element_dimension_x = (x_end - x_start)/number_of_elements_x;
element_dimension_y = (y_end - y_start)/number_of_elements_y;
MeshGen generator("test_data/test.0.node", "test_data/test.0.ele",
"test_data/parametri.dat", number_of_elements_x, number_of_elements_y,
element_dimension_x, element_dimension_y, x_start, y_start);
createMesh();
createSource();
createBoundary();
delta_t = t_end-t_start;
double min_step = delta_t;
double step=0.;
map<int,Element*>::iterator it_elements;
double bar_x, bar_y;
int id;
cout<<"Calcolo del passo temporale..."<<endl;
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
it_elements->second->setSecurityFactor(security_coefficient);
step = it_elements->second->computeTemporalStep();
if(step<=min_step)
{
min_step=step;
bar_x = it_elements->second->getBarycenter().getX();
bar_y = it_elements->second->getBarycenter().getY();
id = it_elements->second->getElementID();
}
}
delta_t=min_step;
cout << "Passo temporale: " << delta_t << " sec" << endl;
cout << bar_x << " " << bar_y << " " << id << endl;
setOutput();
}
void fvtd2dSolver::createMesh(){
cout<<"Costruzione della mesh in corso..."<<endl;
mesh = new Mesh("test_data/test.0.node", "test_data/test.0.ele",
"test_data/parametri.dat");
//
mesh = new Mesh("test_data/reticolo.2.node", "test_data/reticolo.2.ele",
"test_data/parametri.dat");
mesh->printBoundaryNodes("boundary.dat");
map<int,Element*>::iterator it_elements;
//
//
//
//
it_elements->second->setSecurityFactor(security_coefficient);
it_elements->second->setImpedence();
}
}
void fvtd2dSolver::createBoundary(){
string type;
cout << "Impostazione parametri di contorno..." << endl;
ifstream boundary("PML.dat");
if(!boundary){
cerr << "Impossibile to open the PML parameter file. The program will be terminated." <<
endl;
exit(EXIT_FAILURE);
}
boundary >> pml_flag;
if (pml_flag != 0){
boundary >> type;
cout << "PML di tipo " << type << endl;
}else{
cout << "PML non presenti" << endl;
}
map<int,Element*>::iterator it_elements;
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
it_elements->second->setBoundaryFlag(boundaryType);
it_elements->second->computeCoefficients(pml_flag, type, spatial_order);
}
/*
if(spatial_order == 3){
it_elements->second->addElement_node_2(it_elements_2->second);
x_node = it_elements->second->getNode2()->getX();
y_node = it_elements->second->getNode2()->getY();
x_barycenter = it_elements_2->second->getBarycenter().getX();
y_barycenter = it_elements_2->second->getBarycenter().getX();
dist = sqrt((x_node-x_barycenter)*(x_node-x_barycenter)+(y_node-y_barycenter)*(y_nodey_barycenter));
it_elements->second->setDistances_node_2(dist, j);
j++;
}
if((it_elements_2->second->getNode1()==it_elements->second->getNode3())||
(it_elements_2->second->getNode2()==it_elements->second->getNode3())||
(it_elements_2->second->getNode3()==it_elements->second->getNode3())){
it_elements->second->addElement_node_3(it_elements_2->second);
x_node = it_elements->second->getNode3()->getX();
y_node = it_elements->second->getNode3()->getY();
x_barycenter = it_elements_2->second->getBarycenter().getX();
y_barycenter = it_elements_2->second->getBarycenter().getX();
dist = sqrt((x_node-x_barycenter)*(x_node-x_barycenter)+(y_node-y_barycenter)*(y_nodey_barycenter));
it_elements->second->setDistances_node_3(dist, k);
k++;
}
}
}
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
it_elements->second->computeWeights();
}
//*******************************************************************************************
*************************+
}*/
}
void fvtd2dSolver::createSource(){
cout << "Creazione delle sorgenti in corso..." << endl;
map<int,Element*>::iterator it_elements;
double x_start, y_start, x_end, y_end, x_step, y_step;
string type;
double first_parameter, second_parameter, third_parameter, fourth_parameter;
int nearestElementID;
ifstream infile;
infile.open("Source.dat");
if(!infile){
cerr << "Impossibile to open the source parameter file. The program will be terminated."
<< endl;
exit(EXIT_FAILURE);
}
while(!infile.eof()){
infile >> x_start >> y_start >> type >> first_parameter >> second_parameter >>
third_parameter >> fourth_parameter;
x_step = (x_end - x_start)/6.;
y_step = (y_end - y_start)/6.;
cout << x_step << " " << y_step << endl;
//
//
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements !=
mesh->getElements()->end(); it_elements++){
//
{
if (it_elements->second->getElementID() == nearestElementID)
//
it_elements->second->setUpSource(type, first_parameter,
second_parameter, third_parameter, fourth_parameter);
//
y << endl;
cout << "Sorgente impressa nel punto " << x << " " <<
//
//
//
//
}
}
map<int,Element*>::iterator it_elements;
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
x_barycenter= it_elements->second->getBarycenter().getX();
y_barycenter= it_elements->second->getBarycenter().getY();
distance = sqrt((x - x_barycenter)*(x - x_barycenter) + (y - y_barycenter)*(y y_barycenter));
if (distance <= min_distance){
min_distance = distance;
nearestElement = it_elements->second;
}
}
return nearestElement;
}
void fvtd2dSolver::setOutput(){
double x, y;
ifstream infile("Output.dat");
ofstream outfile("outpoints.dat");
if(!infile){
cerr << "Impossibile to open the output parameter file. The program will be terminated."
<< endl;
exit(EXIT_FAILURE);
}
infile >> print_step;
infile >> test_points_number;
if(test_points_number != 0){
//
}
test_elements[0] = nearestElement(-2.894e-06, -3.8e-06);
outfile << "sorgente " << test_elements[0]->getBarycenter().getX() << "\t" <<
test_elements[0]->getBarycenter().getY() << " elemento " << test_elements[0]>getElementID() << endl;
for(int i=1; i<=test_points_number; i++){
infile >> x >> y;
cout << x << " " << y << endl;
//
test_points [i] = x;
//
test_points [i+1] = y;
cout << "Dimensione della griglia = " << row*col << endl;
cout << "Righe = " << row << " Colonne = " << col << " x_step = " << x_step << "
y_step = " << y_step << endl;
cout << "Stampa ogni " << print_step << " passi temporali" << endl;
return;
}
void fvtd2dSolver::solve(){
cout << "Simulazione in corso..." << endl;
int step = 0;
map<int,Element*>::iterator it_elements;
std::stringstream script;
script<<"grafici.plt";
ofstream scriptfile(script.str().c_str());
if(!scriptfile){
cerr << "Impossibile to open the script file. The program will be terminated."<< endl;
exit(EXIT_FAILURE);
}
outfile1.open("electric1.dat");
//
outfile2.open("electric2.dat");
//
outfile3.open("electric3.dat");
//
outfile4.open("electric4.dat");
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computeH_node();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computeMiddleFieldH();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->setUpFieldH();
//
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
it_elements->second->swapFieldE();
}
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->updateHardSource(t);
//
//
// //update H
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computeE_node();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computeMiddleFieldE();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
//
it_elements->second->setUpFieldE();
//
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->swapFieldH();
//
//
//
//
it_elements->second->setUpFieldE();
it_elements->second->setUpFieldH();
}
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
it_elements->second->setUpMiddles();
}
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
it_elements->second->predictFieldH(delta_t/2.);
it_elements->second->predictFieldE(delta_t/2.);
}
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
it_elements->second->swapPredictedFieldH();
it_elements->second->swapPredictedFieldE();
}
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
it_elements->second->setUpPredictedFieldE();
it_elements->second->setUpPredictedFieldH();
}
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
it_elements->second->setUpMiddles();
}
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
it_elements->second->correctFieldH(delta_t);
it_elements->second->correctFieldE(delta_t);
}
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
it_elements->second->swapFieldH();
it_elements->second->swapFieldE();
}
for(it_elements = mesh->getElements()->begin(); it_elements != mesh->getElements()>end(); it_elements++){
it_elements->second->updateHardSource(t);
}
//Predictor Corrector con LeapFrog*********************************************************************************
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
index);
//
//
it_elements->second->setUpFieldE();
//
//
it_elements->second->updateSource(t, sourceTester,
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
index);
//
//
step);
it_elements->second->updateSource(t, sourceTester,
it_elements->second->predictFieldH(delta_t/2, fields,
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
index);
//
//
it_elements->second->updateSource(t, sourceTester,
it_elements->second->swapPredictedFieldH();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
index);
//
//
it_elements->second->updateSource(t, sourceTester,
it_elements->second->setUpPredictedFieldH();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
index);
//
//
step);
it_elements->second->predictFieldE(delta_t/2, fields,
//
//
it_elements->second->updateSource(t, sourceTester,
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
it_elements->second->swapPredictedFieldE();
}
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
it_elements->second->setUpPredictedFieldE();
}
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
it_elements->second->swapFieldH();
}
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
it_elements->second->setUpFieldH();
}
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
it_elements->second->swapFieldE();
}
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->updateHardSource(t);
//
//
}
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computeE_node();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computeMiddleFieldE();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->setUpFieldE();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
index);
//
it_elements->second->updateSource(t, sourceTester,
//
step);
it_elements->second->predictFieldH(delta_t/2, fields,
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
index);
//
//
it_elements->second->updateSource(t, sourceTester,
it_elements->second->swapPredictedFieldH();
//
//
// //Prediciamo E
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computeH_nodePredicted();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computePredictedMiddleFieldH();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->setUpPredictedFieldH();
//
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
index);
//
step);
//
it_elements->second->updateSource(t, sourceTester,
it_elements->second->predictFieldE(delta_t/2, fields,
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
index);
//
it_elements->second->updateSource(t, sourceTester,
//
it_elements->second->swapPredictedFieldE();
//
//
//
// //Correggiamo il valore di H
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computeE_nodePredicted();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computePredictedMiddleFieldE();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
it_elements->second->setUpPredictedFieldE();
}
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
it_elements->second->swapFieldH();
}
//
// //Correggiamo il valore di E
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computeH_node();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->computeMiddleFieldH();
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
it_elements->second->setUpFieldH();
}
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
//
it_elements->second->swapFieldE();
}
//
for(it_elements = mesh->getElements()->begin(); it_elements != mesh>getElements()->end(); it_elements++){
//
it_elements->second->updateHardSource(t);
//
//
//
//
//
cout << out_files[i] << " " << *out_files[i] << endl;
//
//
//
//
if ((step%print_step)==0){
std::stringstream temp;
temp<<"Risultati/fvtd2D_time_"<<t<<".dat";
ofstream outfile(temp.str().c_str());
if(!outfile){
cerr << "Impossibile to open the output file. The program will be terminated."<< endl;
exit(EXIT_FAILURE);
}
int riga = 0;
int off = 0;
for (int i=0; i<row; i++){
for (int j=0; j<col; j++){
if((grid[i*col + j]->getBarycenter().getX()*grid[i*col + j]->getBarycenter().getX() +
grid[i*col + j]->getBarycenter().getY()*grid[i*col + j]->getBarycenter().getY())>2){
outfile << i << "\t" << j << "\t" << 0. << endl;
}else{
outfile << i << "\t" << j << "\t" << grid[i*col + j]->getE_z_old() << "\t" << grid[i*col + j]>getAlphaE() << "\t" << log (abs(grid[i*col + j]->getE_z_old()) + 1.e-20) << "\t" << endl;
}
}
outfile << endl;
}
outfile.close();
scriptfile << "set pm3d map" << "\n" << "set size ratio -1" << "\n" << "set cbrange [:]\n"
<< "splot '" << temp.str().c_str() << "' using (($1/"<< row << "*" << x_dimension << ")
+" << x_start << "):(($2/" << col << "*" << y_dimension << ")+" << y_start << "):($3/2)
" << "title 'T = " << t/1.e-9 << " ns'" << endl;
scriptfile << "set xlabel 'x [m]'" << endl;
scriptfile << "set ylabel 'y [m]'" << endl;
scriptfile << "set cblabel 'E [V/m]'" << endl;
scriptfile << "set terminal png " << "\n" << "set output " << "'image_time_" <<
int(round(t/delta_t)) << ".png'" << "\n" << "repl" << endl;
}
step++;
}
scriptfile.close();
outfile1.close();
//
outfile2.close();
//
outfile3.close();
//
outfile4.close();
//
//
//
//
mesh.printBoundaryNodes("boundary.dat");
//
//
MeshGen generator("test_data/test.0.node", "test_data/test.0.ele",
"test_data/parametri.dat", 50, 50, 0.02, 0.02, 0., 0.);
fvtd2dSolver solver;
//
solver.inizialize();
solver.solve();
return EXIT_SUCCESS;
}