|
@@ -230,7 +230,6 @@ namespace shell_generator {
|
|
|
// ********************************************************************** //
|
|
|
// ********************************************************************** //
|
|
|
double ShellGenerator::IntegrateGaussSimple(double charge, double shift) {
|
|
|
- EvalFaces();
|
|
|
double integral = 0.0;
|
|
|
// return field at point p from the charge, located at (shift, 0,0)
|
|
|
auto field = [](double charge, double shift, std::vector<double> p){
|
|
@@ -307,7 +306,8 @@ namespace shell_generator {
|
|
|
auto E = E_[i];
|
|
|
//auto H = 377.0*H_[i];
|
|
|
auto H = H_[i];
|
|
|
- auto vert = vertices_[i];
|
|
|
+ //auto vert = vertices_[i];
|
|
|
+ auto vert = face_centers_[i];
|
|
|
// Vector to unit product
|
|
|
double r = norm(vert);
|
|
|
std::vector<double> n = { vert[0]/r, vert[1]/r, vert[2]/r};
|
|
@@ -323,22 +323,77 @@ namespace shell_generator {
|
|
|
std::complex<double> S(0.0);
|
|
|
for (int ii = 0; ii < 3; ++ii)
|
|
|
S += E[ii]*std::conj(E[ii]) + H[ii]*std::conj(H[ii]);
|
|
|
- std::vector< std::vector<double> > T = {{0.0, 0.0, 0.0},
|
|
|
+ std::vector< std::vector<std::complex<double> > > T = {{0.0, 0.0, 0.0},
|
|
|
{0.0, 0.0, 0.0},
|
|
|
{0.0, 0.0, 0.0}};
|
|
|
for (int i = 0; i < 3; ++i) {
|
|
|
for (int j = 0; j < 3; ++j) {
|
|
|
- T[i][j] = (1/(2.0/* *4.0*pi */))
|
|
|
- * real(E[i]*std::conj(E[j]) + H[i]*std::conj(H[j])
|
|
|
- -1.0/2.0*S*d[i][j]);
|
|
|
- F[i] += T[i][j]*n[j];
|
|
|
+ T[i][j] = E[i]*std::conj(E[j]) + H[i]*std::conj(H[j])
|
|
|
+ -1.0/2.0*S*d[i][j];
|
|
|
+ F[i] += (1/(2.0/* *4.0*pi */))*real(T[i][j]*n[j]);
|
|
|
}
|
|
|
}
|
|
|
// std::cout <<"E "<<E[0]<<", "<< E[1] <<", "<<E[2] << std::endl;
|
|
|
// std::cout <<"H "<<H[0]<<", "<< H[1] <<", "<<H[2] << std::endl;
|
|
|
// std::cout <<"vert "<<vert[0]<<", "<< vert[1] <<", "<<vert[2] << std::endl;
|
|
|
// std::cout<<"F: " <<F[0]<<", "<< F[1] <<", "<<F[2] << std::endl<< std::endl;
|
|
|
- integral = integral + per_vertice_area_*F;
|
|
|
+
|
|
|
+ //integral = integral + per_vertice_area_*F;
|
|
|
+ integral = integral + per_face_area_[i]*F;
|
|
|
+ }
|
|
|
+ return integral;
|
|
|
+ }
|
|
|
+ // ********************************************************************** //
|
|
|
+ // ********************************************************************** //
|
|
|
+ // ********************************************************************** //
|
|
|
+
|
|
|
+ std::vector<double> ShellGenerator::IntegrateByFaces() {
|
|
|
+ std::vector<double> integral = {0.0, 0.0, 0.0};
|
|
|
+ //simple
|
|
|
+ for (long unsigned int i=0; i<E_.size(); ++i) {
|
|
|
+ //std::cout << i << " ";
|
|
|
+ auto E = E_[i];
|
|
|
+ //auto H = 377.0*H_[i];
|
|
|
+ auto H = H_[i];
|
|
|
+ auto Es = Es_[i];
|
|
|
+ auto Hs = Hs_[i];
|
|
|
+
|
|
|
+ auto vert = face_centers_[i];
|
|
|
+ // Vector to unit product
|
|
|
+ double r = norm(vert);
|
|
|
+ std::vector<std::complex<double> > unit = { vert[0]/r, vert[1]/r, vert[2]/r};
|
|
|
+ // std::cout << norm(unit) << std::endl;
|
|
|
+ //const double pi = 3.1415926535897932384626433832795;
|
|
|
+ std::vector<double> P = (1/(2.0))
|
|
|
+ *real(
|
|
|
+ dot(unit,E)*vconj(E) +
|
|
|
+ dot(unit,H)*vconj(H) +
|
|
|
+ (-1.0/2.0)*(dot(E,vconj(E))
|
|
|
+ +dot(H,vconj(H))
|
|
|
+ )*unit
|
|
|
+ );
|
|
|
+ // std::vector<double> P = (1/(2.0))
|
|
|
+ // *real(
|
|
|
+ // Es[0]*vconj(E) +
|
|
|
+ // Hs[0]*vconj(H) +
|
|
|
+ // (-1.0/2.0)*(dot(E,vconj(E))
|
|
|
+ // +dot(H,vconj(H))
|
|
|
+ // )*unit
|
|
|
+ // );
|
|
|
+ // std::vector<double> P = (1/(2.0))
|
|
|
+ // *(
|
|
|
+ // real(dot(unit,E)*vconj(E)) +
|
|
|
+ // real(dot(unit,H)*vconj(H))) +
|
|
|
+ // (-1.0/4.0)*(dot(E,vconj(E))*unit
|
|
|
+ // +dot(H,vconj(H))*unit
|
|
|
+ // )
|
|
|
+
|
|
|
+ // );
|
|
|
+ // auto
|
|
|
+ // std::cout <<"E "<<E[0]<<", "<< E[1] <<", "<<E[2] << std::endl;
|
|
|
+ // std::cout <<"H "<<H[0]<<", "<< H[1] <<", "<<H[2] << std::endl;
|
|
|
+ // std::cout <<"vert "<<vert[0]<<", "<< vert[1] <<", "<<vert[2] << std::endl<<std::endl;
|
|
|
+ integral = integral + per_face_area_[i]*P;
|
|
|
}
|
|
|
return integral;
|
|
|
}
|
|
@@ -390,6 +445,20 @@ namespace shell_generator {
|
|
|
// ********************************************************************** //
|
|
|
// ********************************************************************** //
|
|
|
// ********************************************************************** //
|
|
|
+ std::vector< std::vector<double> > ShellGenerator::GetFaceCentersT() {
|
|
|
+ EvalFaces();
|
|
|
+ std::vector< std::vector<double> > vertices_t;
|
|
|
+ vertices_t.resize(3);
|
|
|
+ for(const auto vert : face_centers_){
|
|
|
+ vertices_t[0].push_back(vert[0]);
|
|
|
+ vertices_t[1].push_back(vert[1]);
|
|
|
+ vertices_t[2].push_back(vert[2]);
|
|
|
+ }
|
|
|
+ return vertices_t;
|
|
|
+ }
|
|
|
+ // ********************************************************************** //
|
|
|
+ // ********************************************************************** //
|
|
|
+ // ********************************************************************** //
|
|
|
double ShellGenerator::norm(std::vector<double> a){
|
|
|
double norm_value = 0;
|
|
|
for (auto coord:a)
|
|
@@ -404,7 +473,7 @@ namespace shell_generator {
|
|
|
double factor = norm(vert);
|
|
|
//std::cout<< factor <<std::endl;
|
|
|
for (auto &coord:vert) {
|
|
|
- coord*=scale/factor;
|
|
|
+ coord = coord*scale/factor;
|
|
|
}
|
|
|
//std::cout << " " << norm(vert) << " ";
|
|
|
}
|