|  | @@ -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) << " ";
 | 
	
		
			
				|  |  |       }
 |