| /*========================================================================= |
| |
| 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 ForceTree - calculate particle force in tree |
| // |
| |
| #ifndef ForceTree_h |
| #define ForceTree_h |
| |
| #include "Definition.h" |
| #include "BHForceTree.h" |
| #include <string> |
| #include <vector> |
| #include <set> |
| #include <algorithm> |
| |
| using namespace std; |
| |
| ///////////////////////////////////////////////////////////////////////// |
| // |
| // ForceTree takes the particle information, builds |
| // a Barnes Hut octree from the particles, calculates force |
| // |
| ///////////////////////////////////////////////////////////////////////// |
| |
| class ForceTree { |
| public: |
| ForceTree(); |
| ~ForceTree(); |
| |
| // Set parameters |
| void setParameters( |
| POSVEL_T* minLoc, |
| POSVEL_T* maxLoc, |
| POSVEL_T openAngle, |
| POSVEL_T critRadius, |
| int minGroup, |
| int maxGroup, |
| POSVEL_T pmass); |
| |
| // Set alive particle vectors which were created elsewhere |
| void setParticles( |
| 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<POSVEL_T>* mass, |
| vector<POTENTIAL_T>* potential); |
| |
| // Build the BH force tree structure |
| void buildForceTree(); |
| |
| // Calculate the particle force |
| void forceCalculationBarnesAdjust(); |
| void forceCalculationBarnesQuick(); |
| void forceCalculationGadgetTopDown(); |
| void forceCalculationGadgetBottomUp(); |
| void forceCalculationGroup(); |
| void forceCalculationN2(); |
| |
| // Print values |
| void printForceValues() { this->bhTree->printForceValues(); } |
| |
| private: |
| int myProc; // My processor number |
| int numProc; // Total number of processors |
| |
| ID_T particleCount; // Total particles on this processor |
| POSVEL_T particleMass; // Average particle mass |
| POSVEL_T openingAngle; // Open node in BH tree to higher resolution |
| POSVEL_T criticalRadius; // Ignore node in BH tree |
| int minimumGroup; // Number of particles for one interaction list |
| int maximumGroup; // Number of particles for one interaction list |
| |
| POSVEL_T minLoc[DIMENSION]; // Lower bound on box |
| POSVEL_T maxLoc[DIMENSION]; // Upper bound on box |
| |
| POSVEL_T* xx; // X location for particles on this processor |
| POSVEL_T* yy; // Y location for particles on this processor |
| POSVEL_T* zz; // Z location for particles on this processor |
| POSVEL_T* vx; // X velocity for particles on this processor |
| POSVEL_T* vy; // Y velocity for particles on this processor |
| POSVEL_T* vz; // Z velocity for particles on this processor |
| POSVEL_T* mass; // Mass of particles on this processor |
| POSVEL_T* pot; // Potential of particles on this processor |
| ID_T* tag; // Id tag for particles on this processor |
| |
| // Barnes Hut Tree |
| BHForceTree* bhTree; // Particles organized by location |
| }; |
| |
| #endif |