blob: ca1161c692046d91dcfaea2b2fa7d1a9b3d4f9d2 [file] [log] [blame]
/*=========================================================================
Copyright (c) 2007, Los Alamos National Security, LLC
All rights reserved.
Copyright 2007. Los Alamos National Security, LLC.
This software was produced under U.S. Government contract DE-AC52-06NA25396
for Los Alamos National Laboratory (LANL), which is operated by
Los Alamos National Security, LLC for the U.S. Department of Energy.
The U.S. Government has rights to use, reproduce, and distribute this software.
NEITHER THE GOVERNMENT NOR LOS ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY,
EXPRESS OR IMPLIED, OR ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE.
If software is modified to produce derivative works, such modified software
should be clearly marked, so as not to confuse it with the version available
from LANL.
Additionally, redistribution and use in source and binary forms, with or
without modification, are permitted provided that the following conditions
are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
- Neither the name of Los Alamos National Security, LLC, Los Alamos National
Laboratory, LANL, the U.S. Government, nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY LOS ALAMOS NATIONAL SECURITY, LLC AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL LOS ALAMOS NATIONAL SECURITY, LLC OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=========================================================================*/
// .NAME InitialExchange - Get pointer to alive plus dead particles for this
// processor. Store the alive in supplied vectors
// and send the dead to the correct neighbor processor
// where they become alive.
//
// .SECTION Description
// InitialExchange takes input from the particle initializer which originally
// contained alive particles on this processor, but after the particles move
// a little they might have moved to a neighbor processor. Input is in the
// form of arrays, but vectors are supplied which will be filled with the
// alive particles for this processor. As each particle is examined it is
// placed immediately in the vector if it is alive on this processor and the
// index is placed by neighbor if it is dead on this processor. After
// categorizing all particles, the dead are exchanged with neighbors where
// they become alive.
//
// After this initial exchange, ParticleExchange is called to place all
// dead particles (which will be the ones sent in this step being returned
// plus the others which were originally placed correctly on the neighbor).
#ifndef InitialExchange_h
#define InitialExchange_h
#include "Definition.h"
#include "Message.h"
#include <string>
#include <vector>
#define INITIAL_EXCHANGE_FUDGE 8.0
using namespace std;
class InitialExchange {
public:
InitialExchange();
~InitialExchange();
// Set parameters particle distribution
void setParameters(
POSVEL_T rL, // Box size of the physical problem
POSVEL_T deadSize); // Dead delta border for each processor
// Set neighbor processor numbers and calculate dead regions
void initialize();
// Calculate physical range of alive particles which must be shared
void calculateExchangeRegions();
// Set alive particle arrays from the initializer
void setParticleArrays(
long count,
POSVEL_T* xx,
POSVEL_T* yy,
POSVEL_T* zz,
POSVEL_T* vx,
POSVEL_T* vy,
POSVEL_T* vz,
POTENTIAL_T* potential,
ID_T* tag,
MASK_T* mask);
// Set alive particle vectors which will be filled in
void setParticleVectors(
vector<POSVEL_T>* xx,
vector<POSVEL_T>* yy,
vector<POSVEL_T>* zz,
vector<POSVEL_T>* vx,
vector<POSVEL_T>* vy,
vector<POSVEL_T>* vz,
vector<POTENTIAL_T>* potential,
vector<ID_T>* tag,
vector<MASK_T>* mask,
vector<STATUS_T>* status);
// Identify and exchange alive particles which must be shared with neighbors
void exchangeParticles();
void identifyExchangeParticles();
void exchangeNeighborParticles();
void exchange(
int sendTo, // Neighbor to send particles to
int recvFrom, // Neighbor to receive particles from
Message* sendMessage,
Message* recvMessage);
long getNumberOfAliveParticles() const { return numberOfAliveParticles; }
private:
int myProc; // My processor number
int numProc; // Total number of processors
int layoutSize[DIMENSION]; // Decomposition of processors
int layoutPos[DIMENSION]; // Position of this processor in decomposition
POSVEL_T boxSize; // Physical box size (rL)
POSVEL_T deadSize; // Border size for dead particles
long numberOfAliveParticles;
long particleCount; // Number of particles received from arrays
POSVEL_T minAlive[DIMENSION]; // Minimum alive particle not exchanged
POSVEL_T maxAlive[DIMENSION]; // Maximum alive particle not exchanged
POSVEL_T minDead[DIMENSION]; // Minimum particle sent
POSVEL_T maxDead[DIMENSION]; // Maximum particle sent
int neighbor[NUM_OF_NEIGHBORS]; // Neighbor processor indices
POSVEL_T minRange[NUM_OF_NEIGHBORS][DIMENSION]; // Range of dead particles
POSVEL_T maxRange[NUM_OF_NEIGHBORS][DIMENSION]; // Range of dead particles
vector<ID_T> neighborParticles[NUM_OF_NEIGHBORS];
// Particle ids sent to each neighbor as ALIVE
POSVEL_T* xxInit; // X location from initializer
POSVEL_T* yyInit; // Y location from initializer
POSVEL_T* zzInit; // Z location from initializer
POSVEL_T* vxInit; // X velocity from initializer
POSVEL_T* vyInit; // Y velocity from initializer
POSVEL_T* vzInit; // Z velocity from initializer
POTENTIAL_T* potInit; // Particle potential
ID_T* tagInit; // Tag from initializer
MASK_T* maskInit; // Particle information
vector<POSVEL_T>* xx; // X location for particles on this processor
vector<POSVEL_T>* yy; // Y location for particles on this processor
vector<POSVEL_T>* zz; // Z location for particles on this processor
vector<POSVEL_T>* vx; // X velocity for particles on this processor
vector<POSVEL_T>* vy; // Y velocity for particles on this processor
vector<POSVEL_T>* vz; // Z velocity for particles on this processor
vector<POTENTIAL_T>* pot; // Particle potential
vector<ID_T>* tag; // Id tag for particles on this processor
vector<MASK_T>* mask; // Particle information
vector<STATUS_T>* status; // Particle is ALIVE when it leaves
};
#endif