Ejemplo n.º 1
0
void FDTD2D::updateE(){
  int ii,jj;
  double CFL2 = CFL;///2.;
  // Bulk update, Ex
  for( jj=1; jj<Ny-1; jj++){
    for( ii=0; ii<Nx-1; ii++){
      Ex(ii,jj) += ExC(ii,jj)*(Hz(ii,jj) - Hz(ii,jj-1));
    }
  }
  // Bulk update, Ey
  for( jj=0; jj<Ny-1; jj++){
    for( ii=1; ii<Nx-1; ii++){
      Ey(ii,jj) -= EyC(ii,jj)*(Hz(ii,jj) - Hz(ii-1,jj));
    }
  }
  // Boundary update, Ex
  for( ii=0; ii<Nx-1; ii++){
    Ex(ii,0)    = (1.-CFL2)*Ex(ii,0)    + CFL2*Ex(ii,1);
    Ex(ii,Ny-1) = (1.-CFL2)*Ex(ii,Ny-1) + CFL2*Ex(ii,Ny-2);
  }
  // Boundary update, Ey
  for( jj=0; jj<Ny-1; jj++){
    Ey(0,jj)    = (1.-CFL2)*Ey(0,jj)    + CFL2*Ey(1,jj);
    Ey(Nx-1,jj) = (1.-CFL2)*Ey(Nx-1,jj) + CFL2*Ey(Nx-2,jj);
  }
  return;
}
Ejemplo n.º 2
0
void FDTD2D::meshScatterer(){
  // Define useful variables
  int II;
  double tan30, tan60;
  switch(TYPE){
    case NONE:
      break;
    case SQUARE:
      for( int jj=Ny/2-s_size; jj<=Ny/2+s_size; jj++){
        for( int ii=Nx/2-s_size; ii<=Nx/2+s_size; ii++){
           ExC(ii,jj)=0.;
           EyC(ii,jj)=0.; 
        } 
      }
      break;
    case CIRCLE:
      for( int jj=Ny/2-s_size; jj<=Ny/2+s_size; jj++){
        for( int ii=Nx/2-s_size; ii<=Nx/2+s_size; ii++){
           if( (jj-Ny/2)*(jj-Ny/2)+(ii-Nx/2)*(ii-Nx/2) < s_size*s_size){
             ExC(ii,jj)=0.;
             EyC(ii,jj)=0.; 
           }
        } 
      }
      break;
    case TRIANGLE:
      tan60 = tan(60.*M_PI/180.);
      tan30 = tan(30.*M_PI/180.);
      II = Nx/2+s_size-ceil(s_size*tan60); // Leftmost point
      for( int jj=Ny/2-s_size; jj<=Ny/2+s_size; jj++){
        for( int ii=Nx/2-s_size; ii<=Nx/2+s_size; ii++){
          if( ii >= II && abs(jj-Ny/2) < fabs((ii-II)*tan30)){
            ExC(ii,jj) = 0.;
            EyC(ii,jj) = 0.;
          }
        }
      }
      break;
    default:
      break;
  }//switch
  return;
}
Ejemplo n.º 3
0
void FDTD2D::correctFieldsE(){
  static double eta = sqrt(mu/eps);
  // Left partition at Lx+0.5. Right at Nx-Lx+0.5.
  double l_source = (1./eta)*gauss_der_source(t-(Lx+0.5)*ds/c, sigma, mean);
  double r_source = (1./eta)*gauss_der_source(t-(Nx-Lx+0.5)*ds/c, sigma, mean);
  for( int jj=Ly; jj <= Ny-Ly; jj++){
    Ey(Lx,jj)      += EyC(Lx,jj)      * l_source;
    Ey(Nx-Lx+1,jj) -= EyC(Nx-Lx+1,jj) * r_source; 
  }
  // Bottom partition at Ly+0.5. Top at Ny-Ly+0.5.
  // Note: v.costly, need to evaluate source function at every point!
  double source;
  for( int ii=Lx; ii <= Nx-Lx; ii++){
    if(ii<0) std::cerr << "ii = " << ii << std::endl;
    source = (1./eta)*gauss_der_source(t-(ii+0.5)*ds/c, sigma, mean);
    Ex(ii,Ly)      -= ExC(ii,Ly)      * source;
    Ex(ii,Ny-Ly+1) += ExC(ii,Ny-Ly+1) * source;
  }
  return;
}
Ejemplo n.º 4
0
void FDTD2D::zeroICs(){
  for(int jj=0; jj<Ny; jj++){
    for(int ii=0; ii<Nx; ii++){
      if(ii<Nx-1){ 
        Ex(ii,jj)  = 0.;
        ExC(ii,jj) = dt / (eps*ds);
      }
      if(jj<Ny-1){
        Ey(ii,jj)  = 0.;
        EyC(ii,jj) = dt / (eps*ds);
      }
      if(ii<Nx-1 && jj<Ny-1){
        Hz(ii,jj)   = 0.;
        HzC(ii,jj)  = dt / (mu*ds);
      }
    }
  }
  return;
}
Ejemplo n.º 5
0
void CANGetNewVelocityMeasurements()
{
	CanRxMsg velocity_rx; //, version_rx;
	int32_t tmp;
	uint8_t i;

	for(i = 0; i < NUM_MOTORS; ++i)
	{
		GetAvgVelocity(_motor[i].NodeID);
		//GetActualVelocity(_motor[i].NodeID);//Strange
		// Block on queue until new CanRxMsg struct arrived
		xQueueReceive( _velocityQueue[i], &velocity_rx, portMAX_DELAY);

		if(!(velocity_rx.Data[4] == 0xFF && velocity_rx.Data[5] == 0xFF && velocity_rx.Data[6] == 0xFF && velocity_rx.Data[7] == 0xFF))
		{
			tmp = (((int32_t) velocity_rx.Data[7]) << 24
					| ((int32_t) velocity_rx.Data[6]) << 16
					| ((int32_t) velocity_rx.Data[5]) << 8
					| ((int32_t) velocity_rx.Data[4]));

			EnC(); _motor[i].Velocity = ((float)tmp)*2.0*PI/60.0; ExC();
		}
	}
}