# Particle Basics

In MFIX-Exa, particles are managed by the MFIXParticleContainer class. This class is derived from AMReX’s `NeighborParticleContainer` and handles all of the particle data. `MFIXParticleContainer` provides the functions for solving the particle dynamics (based on particle-particle, particle-fluid, and particle-wall forces)

## Particle Dynamics

During the DES steps, particle positions are updated using the MFIXParticleContainer::EvolveParticles method. It’s structure is:

     1 // Set time-step size (subdt) and number (numbsebsteps) for the DES steps
     2 des_init_time_loop( &time, &dt, &nsubsteps, &subdt, &subdt_io );
     3
     4 // Temporary storage of forces and torques
     5 std::map<PairIndex, Vector<Real>> tow;
     6 std::map<PairIndex, Vector<Real>> fc;
     7 for (MFIXParIter pti(*this, lev); pti.isValid(); ++pti)
     8 {
     9     PairIndex index(pti.index(), pti.LocalTileIndex());
    10     tow[index] = Vector<Real>();
    11     fc[index] = Vector<Real>();
    12 }
    13
    14 while (n < nsubsteps) // step over number of substeps (DES part)
    15 {
    16     // Neighborlist house-keeping
    17     if (n % 25 == 0) {
    18         clearNeighbors(lev);
    19         Redistribute();
    20         fillNeighbors(lev);
    21         buildNeighborList(lev,sort_neighbor_list);
    22     } else {
    23         updateNeighbors(lev);
    24     }
    25
    26     // Iterate over particles
    27     for (MFIXParIter pti(*this, lev); pti.isValid(); ++pti)
    28     {
    29         // Forces and torques due to particle-wall collisions
    30         calc_wall_collisions_ls(particles, & ntot, & nrp,
    31                                 tow[index].dataPtr(), fc[index].dataPtr(), & subdt,
    32                                 ...
    33                                 );
    34
    35         calc_particle_collisions(particles                     , &nrp,
    36                                  neighbors[index].dataPtr()    , &size_ng,
    37                                  neighbor_list[index].dataPtr(), &size_nl,
    38                                  tow[index].dataPtr(), fc[index].dataPtr(),
    39                                  &subdt, &ncoll);
    40     }
    41
    42     // Move particles based on velocities and forces
    43     des_time_loop(&nrp     , particles,
    44                   &ntot, tow[index].dataPtr(), fc[index].dataPtr(), &subdt,
    45                   &xlen, &ylen, &zlen, &stime, &n);
    46 }

where the highlighted lines are responsible for moving the particles.