/*=========================================================================
                                                                                
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
