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; }
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; }
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; }
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; }
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(); } } }