예제 #1
0
static shell_state 
grid_next_handle() 
{ 
    if (!grid_next())
    {
        printf("No more packets captured\n");
    }
    return GRID;
}
예제 #2
0
int main(int arg_c, char* arg_v[]){
    //initialize mpi
    MPI_Init(&arg_c, &arg_v);

    if(arg_c != 5){
        std::cout << "usage: D (diffusion parameter) L (size of quadrant) N (#steps in 1 dimension) dt (timestep)" << std::endl; 
        return 1;
        }
    double D = std::stod(arg_v[1]);
    double L = std::stod(arg_v[2]);
    int N = std::stoi(arg_v[3]);
    double dt = std::stod(arg_v[4]);
   

    int n, rank;

    //get the mpi parameters n and rank
    MPI_Comm_size(MPI_COMM_WORLD, &n);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    if(rank == 0)
        std::cout << "mpi version with " << n << " 'threads'." << std::endl;

    
    // slice the grid into parts and give the parts to the solvers
    // create the grid-part!
    int sliceHeight = 2*N / n;
    double x,y;
    double dxy = L/N;
    std::vector<std::vector<double>> grid(sliceHeight);
    std::vector<std::vector<double>> grid_next(sliceHeight);
    for(int i = 0; i<sliceHeight; i++){
        x = dxy * (i+rank*sliceHeight-N);
        grid[i] = std::vector<double> (2*N+1);
        grid_next[i] = std::vector<double> (2*N+1);
        for(int j = 0; j<=N*2; j++){
            y = dxy * (j-N);
            if(std::sqrt(x*x + y*y) < 0.5)
                grid[i][j] = 1;
        }
    }

    double tmax = 10000 * dt;
    double tcurrent = 0;
    double y_part, x_part;

    timer t;
    t.start();
    while(tcurrent < tmax){
        tcurrent += dt;
        
        // do the communication



        // solve that part
        for(int i=1; i<sliceHeight-1; i++){
            for(int j=0; j<=2*N; j++){
                x_part = grid[i+1][j] - 2*grid[i][j] + grid[i-1][j];
                x_part = x_part / dxy;
                y_part = ((j==2*N)?0.0:grid[i][j+1]) - 2*grid[i][j] + 
                        ((j==0)?0.0:grid[i][j-1]);
                y_part = y_part / dxy;
                grid_next[i][j] = dt * D * (x_part + y_part) + grid[i][j];
            }
        }
        //do the corner-cases
        
        //swap
        std::swap(grid, grid_next);
    }
    t.stop();
    std::cout << "in rank " << rank << " time passed: " << t.get_timing();
    MPI_Finalize();
    return 0;
}