From 1b775bdffe173aaa1e122c3ccb847c68c97a2212 Mon Sep 17 00:00:00 2001 From: Olivier Coulaud <Olivier.Coulaud@inria.fr> Date: Thu, 4 Sep 2014 15:07:00 +0200 Subject: [PATCH] Remove unsed files and fix some warnings --- Examples/generateDistributions.cpp | 2 - Src/Core/FFmmAlgorithmNoP2P.hpp | 284 --------------------------- Tests/Olivier/ChebyshevSymFMM.cpp | 300 ----------------------------- 3 files changed, 586 deletions(-) delete mode 100755 Src/Core/FFmmAlgorithmNoP2P.hpp delete mode 100755 Tests/Olivier/ChebyshevSymFMM.cpp diff --git a/Examples/generateDistributions.cpp b/Examples/generateDistributions.cpp index 4fd0f0d6e..d54bdd387 100644 --- a/Examples/generateDistributions.cpp +++ b/Examples/generateDistributions.cpp @@ -222,11 +222,9 @@ int main(int argc, char ** argv){ extraRadius = FParameters::getValue(argc,argv,"-extraLength", 0.0); BoxWith += 2*extraRadius ; } - bool binaryMode = false; std::string name(genericFileName); if( FParameters::existParameter(argc, argv, "-bin")){ - binaryMode = true; name += ".bfma"; } else { diff --git a/Src/Core/FFmmAlgorithmNoP2P.hpp b/Src/Core/FFmmAlgorithmNoP2P.hpp deleted file mode 100755 index 49b6ee35f..000000000 --- a/Src/Core/FFmmAlgorithmNoP2P.hpp +++ /dev/null @@ -1,284 +0,0 @@ -// =================================================================================== -// Copyright ScalFmm 2011 INRIA, Olivier Coulaud, Berenger Bramas, Matthias Messner -// olivier.coulaud@inria.fr, berenger.bramas@inria.fr -// This software is a computer program whose purpose is to compute the FMM. -// -// This software is governed by the CeCILL-C and LGPL licenses and -// abiding by the rules of distribution of free software. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public and CeCILL-C Licenses for more details. -// "http://www.cecill.info". -// "http://www.gnu.org/licenses". -// =================================================================================== -#ifndef FFMMALGORITHM_HPP -#define FFMMALGORITHM_HPP - - -#include "../Utils/FGlobal.hpp" -#include "../Utils/FAssert.hpp" -#include "../Utils/FLog.hpp" -#include "../Utils/FTrace.hpp" -#include "../Utils/FTic.hpp" - -#include "../Containers/FOctree.hpp" -#include "../Containers/FVector.hpp" - -#include "FCoreCommon.hpp" - -/** -* @author Berenger Bramas (berenger.bramas@inria.fr) -* @class FFmmAlgorithm -* @brief -* Please read the license -* -* This class is a basic FMM algorithm -* It just iterates on a tree and call the kernels with good arguments. -* -* Of course this class does not deallocate pointer given in arguements. -*/ -template<class OctreeClass, class CellClass, class ContainerClass, class KernelClass, class LeafClass> -class FFmmAlgorithm : public FAbstractAlgorithm { - - OctreeClass* const tree; //< The octree to work on - KernelClass* const kernels; //< The kernels - - const int OctreeHeight; - -public: - /** The constructor need the octree and the kernels used for computation - * @param inTree the octree to work on - * @param inKernels the kernels to call - * An assert is launched if one of the arguments is null - */ - FFmmAlgorithm(OctreeClass* const inTree, KernelClass* const inKernels) - : tree(inTree) , kernels(inKernels), OctreeHeight(tree->getHeight()) { - - FAssertLF(tree, "tree cannot be null"); - FAssertLF(kernels, "kernels cannot be null"); - - FLOG(FLog::Controller << "FFmmAlgorithm\n"); - } - - /** Default destructor */ - virtual ~FFmmAlgorithm(){ - } - - /** - * To execute the fmm algorithm - * Call this function to run the complete algorithm - */ - void execute(const unsigned operationsToProceed = FFmmNearAndFarFields){ - FTRACE( FTrace::FFunction functionTrace(__FUNCTION__, "Fmm" , __FILE__ , __LINE__) ); - - if(operationsToProceed & FFmmP2M) bottomPass(); - - if(operationsToProceed & FFmmM2M) upwardPass(); - - if(operationsToProceed & FFmmM2L) transferPass(); - - if(operationsToProceed & FFmmL2L) downardPass(); - - if( (operationsToProceed & FFmmP2P) || (operationsToProceed & FFmmL2P) ) directPass(); - } - -private: - ///////////////////////////////////////////////////////////////////////////// - // P2M - ///////////////////////////////////////////////////////////////////////////// - - /** P2M */ - void bottomPass(){ - FTRACE( FTrace::FFunction functionTrace(__FUNCTION__, "Fmm" , __FILE__ , __LINE__) ); - FLOG( FLog::Controller.write("\tStart Bottom Pass\n").write(FLog::Flush) ); - FLOG(FTic counterTime); - FLOG(FTic computationCounter); - - typename OctreeClass::Iterator octreeIterator(tree); - - // Iterate on leafs - octreeIterator.gotoBottomLeft(); - do{ - // We need the current cell that represent the leaf - // and the list of particles - FLOG(computationCounter.tic()); - kernels->P2M( octreeIterator.getCurrentCell() , octreeIterator.getCurrentListSrc()); - FLOG(computationCounter.tac()); - } while(octreeIterator.moveRight()); - - FLOG( FLog::Controller << "\tFinished (@Bottom Pass (P2M) = " << counterTime.tacAndElapsed() << "s)\n" ); - FLOG( FLog::Controller << "\t\t Computation : " << computationCounter.cumulated() << " s\n" ); - } - - ///////////////////////////////////////////////////////////////////////////// - // Upward - ///////////////////////////////////////////////////////////////////////////// - - /** M2M */ - void upwardPass(){ - FTRACE( FTrace::FFunction functionTrace(__FUNCTION__, "Fmm" , __FILE__ , __LINE__) ); - FLOG( FLog::Controller.write("\tStart Upward Pass\n").write(FLog::Flush); ); - FLOG(FTic counterTime); - FLOG(FTic computationCounter); - - // Start from leal level - 1 - typename OctreeClass::Iterator octreeIterator(tree); - octreeIterator.gotoBottomLeft(); - octreeIterator.moveUp(); - - typename OctreeClass::Iterator avoidGotoLeftIterator(octreeIterator); - - // for each levels - for(int idxLevel = OctreeHeight - 2 ; idxLevel > 1 ; --idxLevel ){ - FLOG(FTic counterTimeLevel); - - // for each cells - do{ - // We need the current cell and the child - // child is an array (of 8 child) that may be null - FLOG(computationCounter.tic()); - kernels->M2M( octreeIterator.getCurrentCell() , octreeIterator.getCurrentChild(), idxLevel); - FLOG(computationCounter.tac()); - } while(octreeIterator.moveRight()); - - avoidGotoLeftIterator.moveUp(); - octreeIterator = avoidGotoLeftIterator; - - FLOG( FLog::Controller << "\t\t>> Level " << idxLevel << " = " << counterTimeLevel.tacAndElapsed() << "s\n" ); - } - - - FLOG( FLog::Controller << "\tFinished (@Upward Pass (M2M) = " << counterTime.tacAndElapsed() << "s)\n" ); - FLOG( FLog::Controller << "\t\t Computation : " << computationCounter.cumulated() << " s\n" ); - } - - ///////////////////////////////////////////////////////////////////////////// - // Transfer - ///////////////////////////////////////////////////////////////////////////// - - /** M2L */ - void transferPass(){ - FTRACE( FTrace::FFunction functionTrace(__FUNCTION__, "Fmm" , __FILE__ , __LINE__) ); - - FLOG( FLog::Controller.write("\tStart Downward Pass (M2L)\n").write(FLog::Flush); ); - FLOG(FTic counterTime); - FLOG(FTic computationCounter); - - typename OctreeClass::Iterator octreeIterator(tree); - octreeIterator.moveDown(); - - typename OctreeClass::Iterator avoidGotoLeftIterator(octreeIterator); - - const CellClass* neighbors[343]; - - // for each levels - for(int idxLevel = 2 ; idxLevel < OctreeHeight ; ++idxLevel ){ - FLOG(FTic counterTimeLevel); - - // for each cells - do{ - const int counter = tree->getInteractionNeighbors(neighbors, octreeIterator.getCurrentGlobalCoordinate(), idxLevel); - FLOG(computationCounter.tic()); - if(counter) kernels->M2L( octreeIterator.getCurrentCell() , neighbors, counter, idxLevel); - FLOG(computationCounter.tac()); - } while(octreeIterator.moveRight()); - - FLOG(computationCounter.tic()); - kernels->finishedLevelM2L(idxLevel); - FLOG(computationCounter.tac()); - - avoidGotoLeftIterator.moveDown(); - octreeIterator = avoidGotoLeftIterator; - - FLOG( FLog::Controller << "\t\t>> Level " << idxLevel << " = " << counterTimeLevel.tacAndElapsed() << "s\n" ); - } - FLOG( FLog::Controller << "\tFinished (@Downward Pass (M2L) = " << counterTime.tacAndElapsed() << "s)\n" ); - FLOG( FLog::Controller << "\t\t Computation : " << computationCounter.cumulated() << " s\n" ); - } - - ///////////////////////////////////////////////////////////////////////////// - // Downward - ///////////////////////////////////////////////////////////////////////////// - - /** L2L */ - void downardPass(){ - FTRACE( FTrace::FFunction functionTrace(__FUNCTION__, "Fmm" , __FILE__ , __LINE__) ); - FLOG( FLog::Controller.write("\tStart Downward Pass (L2L)\n").write(FLog::Flush); ); - FLOG(FTic counterTime); - FLOG(FTic computationCounter ); - - typename OctreeClass::Iterator octreeIterator(tree); - octreeIterator.moveDown(); - - typename OctreeClass::Iterator avoidGotoLeftIterator(octreeIterator); - - const int heightMinusOne = OctreeHeight - 1; - // for each levels exepted leaf level - for(int idxLevel = 2 ; idxLevel < heightMinusOne ; ++idxLevel ){ - FLOG(FTic counterTimeLevel); - - // for each cells - do{ - FLOG(computationCounter.tic()); - kernels->L2L( octreeIterator.getCurrentCell() , octreeIterator.getCurrentChild(), idxLevel); - FLOG(computationCounter.tac()); - } while(octreeIterator.moveRight()); - - avoidGotoLeftIterator.moveDown(); - octreeIterator = avoidGotoLeftIterator; - - FLOG( FLog::Controller << "\t\t>> Level " << idxLevel << " = " << counterTimeLevel.tacAndElapsed() << "s\n" ); - } - - FLOG( FLog::Controller << "\tFinished (@Downward Pass (L2L) = " << counterTime.tacAndElapsed() << "s)\n" ); - FLOG( FLog::Controller << "\t\t Computation : " << computationCounter.cumulated() << " s\n" ); - - - } - - ///////////////////////////////////////////////////////////////////////////// - // Direct - ///////////////////////////////////////////////////////////////////////////// - - /** P2P */ - void directPass(){ - FTRACE( FTrace::FFunction functionTrace(__FUNCTION__, "Fmm" , __FILE__ , __LINE__) ); - FLOG( FLog::Controller.write("\tStart Direct Pass\n").write(FLog::Flush); ); - FLOG(FTic counterTime); - FLOG(FTic computationCounterL2P); - FLOG(FTic computationCounterP2P); - - const int heightMinusOne = OctreeHeight - 1; - - typename OctreeClass::Iterator octreeIterator(tree); - octreeIterator.gotoBottomLeft(); - // There is a maximum of 26 neighbors - ContainerClass* neighbors[27]; - // for each leafs - do{ - FLOG(computationCounterL2P.tic()); - kernels->L2P(octreeIterator.getCurrentCell(), octreeIterator.getCurrentListTargets()); - FLOG(computationCounterL2P.tac()); - // need the current particles and neighbors particles -// const int counter = tree->getLeafsNeighbors(neighbors, octreeIterator.getCurrentGlobalCoordinate(),heightMinusOne); -// FLOG(computationCounterP2P.tic()); -// kernels->P2P(octreeIterator.getCurrentGlobalCoordinate(),octreeIterator.getCurrentListTargets(), -// octreeIterator.getCurrentListSrc(), neighbors, counter); -// FLOG(computationCounterP2P.tac()); - } while(octreeIterator.moveRight()); - - - FLOG( FLog::Controller << "\tFinished (@Direct Pass (L2P + P2P) = " << counterTime.tacAndElapsed() << "s)\n" ); - FLOG( FLog::Controller << "\t\t Computation L2P : " << computationCounterL2P.cumulated() << " s\n" ); - FLOG( FLog::Controller << "\t\t Computation P2P : " << computationCounterP2P.cumulated() << " s\n" ); - - } - -}; - - -#endif //FFMMALGORITHM_HPP - - diff --git a/Tests/Olivier/ChebyshevSymFMM.cpp b/Tests/Olivier/ChebyshevSymFMM.cpp deleted file mode 100755 index 12611b549..000000000 --- a/Tests/Olivier/ChebyshevSymFMM.cpp +++ /dev/null @@ -1,300 +0,0 @@ -// =================================================================================== -// Copyright ScalFmm 2011 INRIA, Olivier Coulaud, Berenger Bramas -// olivier.coulaud@inria.fr, berenger.bramas@inria.fr -// This software is a computer program whose purpose is to compute the FMM. -// -// This software is governed by the CeCILL-C and LGPL licenses and -// abiding by the rules of distribution of free software. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public and CeCILL-C Licenses for more details. -// "http://www.cecill.info". -// "http://www.gnu.org/licenses". -// =================================================================================== - -// ==== CMAKE ===== -// @FUSE_BLAS -// ================ - -#include <iostream> -#include <fstream> - -#include <cstdio> -#include <cstdlib> -#include <string> - -#include "ScalFmmConfig.h" - -#include "Files/FFmaGenericLoader.hpp" -#include "Files/FTreeIO.hpp" - -#include "Kernels/Chebyshev/FChebCell.hpp" -#include "Kernels/Interpolation/FInterpMatrixKernel.hpp" -#include "Kernels/Chebyshev/FChebSymKernel.hpp" - -#include "Components/FSimpleLeaf.hpp" -#include "Kernels/P2P/FP2PParticleContainerIndexed.hpp" - -#include "Utils/FParameters.hpp" - -#include "Containers/FOctree.hpp" - - -#include "Core/FFmmAlgorithmNoP2P.hpp" - - -/** - * This program runs the FMM Algorithm with the Chebyshev kernel and compares the results with a direct computation. - */ -/// \file ChebyshevInterpolationFMM.cpp -//! -//! \brief This program runs the FMM Algorithm with the interpolation kernel based on Chebyshev interpolation (1/r kernel) -//! \authors B. Bramas, O. Coulaud -//! -//! This code is a short example to use the Chebyshev Interpolation approach for the 1/r kernel -//! -//!@Algorithm -//! <b> General arguments:</b> -//! \param -help(-h) to see the parameters available in this driver -//! \param -depth The depth of the octree -//! \param -subdepth Specifies the size of the sub octree -//! \param -t The number of threads -//! -//! \param -f name Name of the particles file. The file have to be in our FMA format -//! \param -bin if the file is in binary mode - -//! -// - -void usage() { - std::cout << "Driver for Chebyshev interpolation kernel (1/r kernel)" << std::endl; - std::cout << "Options "<< std::endl - << " -help to see the parameters " << std::endl - << " -depth the depth of the octree "<< std::endl - << " -subdepth specifies the size of the sub octree " << std::endl - << " -fin name name specifies the name of the particle distribution" << std::endl - << " -t n specifies the number of threads used in the computations" << std::endl - << " -savetree file specify the file name to save the tree" << std::endl - << " -fout name name specifies the name for the computational values" << std::endl ; - -} - -// Simply create particles and try the kernels -int main(int argc, char* argv[]) -{ - const std::string defaultFile(/*SCALFMMDataPath+*/"../Data/test20k.fma" ); - std::string filename = FParameters::getStr(argc,argv,"-fin", defaultFile.c_str()); - const unsigned int TreeHeight = FParameters::getValue(argc, argv, "-depth", 5); - const unsigned int SubTreeHeight = FParameters::getValue(argc, argv, "-subdepth", 2); - const unsigned int NbThreads = FParameters::getValue(argc, argv, "-t", 1); - if(FParameters::existParameter(argc, argv, "-h")||FParameters::existParameter(argc, argv, "-help")){ - usage() ; - exit(EXIT_SUCCESS); - } -#ifdef _OPENMP - omp_set_num_threads(NbThreads); - std::cout << "\n>> Using " << omp_get_max_threads() << " threads.\n" << std::endl; -#else - std::cout << "\n>> Sequential version.\n" << std::endl; -#endif - // - std::cout << "Parameters "<< std::endl - << " Octree Depth "<< TreeHeight <<std::endl - << " SubOctree depth " << SubTreeHeight <<std::endl - << " Input file name: " <<filename <<std::endl - << " Thread number: " << NbThreads <<std::endl - <<std::endl; - // - // init timer - FTic time; - - // open particle file - //////////////////////////////////////////////////////////////////// - // - FFmaGenericLoader loader(filename); - // - //////////////////////////////////////////////////////////////////// - // begin Chebyshev kernel - - // accuracy - const unsigned int ORDER = 3; - // typedefs - typedef FP2PParticleContainerIndexed<> ContainerClass; - typedef FSimpleLeaf< ContainerClass > LeafClass; - typedef FChebCell<ORDER> CellClass; - typedef FOctree<CellClass,ContainerClass,LeafClass> OctreeClass; - // - typedef FInterpMatrixKernelR MatrixKernelClass; - typedef FChebSymKernel<CellClass,ContainerClass,MatrixKernelClass,ORDER> KernelClass; - // -//#ifdef _OPENMP -// typedef FFmmAlgorithmThread<OctreeClass,CellClass,ContainerClass,KernelClass,LeafClass> FmmClass; -//#else -// typedef FFmmAlgorithm<OctreeClass,CellClass,ContainerClass,KernelClass,LeafClass> FmmClass; -//#endif - typedef FFmmAlgorithm<OctreeClass,CellClass,ContainerClass,KernelClass,LeafClass> FmmClass; - - // init oct-tree - OctreeClass tree(TreeHeight, SubTreeHeight, loader.getBoxWidth(), loader.getCenterOfBox()); - - - { // ----------------------------------------------------- - std::cout << "Creating & Inserting " << loader.getNumberOfParticles() - << " particles ..." << std::endl; - std::cout << "\tHeight : " << TreeHeight << " \t sub-height : " << SubTreeHeight << std::endl; - time.tic(); - // - FPoint position; - FReal physicalValue = 0.0; - // - for(int idxPart = 0 ; idxPart < loader.getNumberOfParticles() ; ++idxPart){ - // - // Read particle per particle from file - loader.fillParticle(&position,&physicalValue); - // - // put particle in octree - tree.insert(position, idxPart, physicalValue); - } - - time.tac(); - std::cout << "Done " << "(@Creating and Inserting Particles = " - << time.elapsed() << " s) ." << std::endl; - } // ----------------------------------------------------- - - { // ----------------------------------------------------- - std::cout << "\nChebyshev FMM (ORDER="<< ORDER << ") ... " << std::endl; - - time.tic(); - // - const MatrixKernelClass MatrixKernel; - KernelClass kernels(TreeHeight, loader.getBoxWidth(), loader.getCenterOfBox(),&MatrixKernel); - // - FmmClass algorithm(&tree, &kernels); - // - algorithm.execute(); // Here the call of the FMM algorithm - // - time.tac(); - std::cout << "Done " << "(@Algorithm = " << time.elapsed() << " s) ." << std::endl; - } - // ----------------------------------------------------- - // - // Some output - // - // - { // ----------------------------------------------------- - long int N1=0, N2= loader.getNumberOfParticles()/2, N3= loader.getNumberOfParticles() -1; ; - FReal energy =0.0 ; - // - // Loop over all leaves - // - std::cout <<std::endl<<" &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& "<<std::endl; - std::cout << std::scientific; - std::cout.precision(10) ; - - tree.forEachLeaf([&](LeafClass* leaf){ - const FReal*const posX = leaf->getTargets()->getPositions()[0]; - const FReal*const posY = leaf->getTargets()->getPositions()[1]; - const FReal*const posZ = leaf->getTargets()->getPositions()[2]; - - const FReal*const potentials = leaf->getTargets()->getPotentials(); - const FReal*const forcesX = leaf->getTargets()->getForcesX(); - const FReal*const forcesY = leaf->getTargets()->getForcesY(); - const FReal*const forcesZ = leaf->getTargets()->getForcesZ(); - const int nbParticlesInLeaf = leaf->getTargets()->getNbParticles(); - const FReal*const physicalValues = leaf->getTargets()->getPhysicalValues(); - - const FVector<int>& indexes = leaf->getTargets()->getIndexes(); - - for(int idxPart = 0 ; idxPart < nbParticlesInLeaf ; ++idxPart){ - const int indexPartOrig = indexes[idxPart]; - if ((indexPartOrig == N1) || (indexPartOrig == N2) || (indexPartOrig == N3) ) { - std::cout << "Index "<< indexPartOrig <<" potential " << potentials[idxPart] - << " Pos "<<posX[idxPart]<<" "<<posY[idxPart]<<" "<<posZ[idxPart] - << " Forces: " << forcesX[idxPart] << " " << forcesY[idxPart] << " "<< forcesZ[idxPart] <<std::endl; - } - energy += potentials[idxPart]*physicalValues[idxPart] ; - } - }); - std::cout <<std::endl<<"Energy: "<< energy<<std::endl; - std::cout <<std::endl<<" &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& "<<std::endl<<std::endl; - - } - // ----------------------------------------------------- - if(FParameters::existParameter(argc, argv, "-savetree")){ - - const std::string filename = FParameters::getStr(argc,argv,"-savetree", "tree.bin"); - FTreeIO::Save<OctreeClass, CellClass, LeafClass, ContainerClass >(filename.c_str(), tree); - - ////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////// - int idCell=0 ; - OctreeClass::Iterator octreeIterator(&tree); - std::ofstream file("aa-REF.tree", std::ofstream::out ); - file << "Number of particles per leaf"<< std::endl; - tree.forEachCellLeaf([&](CellClass* cell, LeafClass* leaf){ - file << "Cell Id " << ++idCell<< " Nb particles "<< leaf->getSrc()->getNbParticles()<<std::endl; - }); - file << std::endl << "//////////////////////////////////////////////////////////////////////////////////" - << std::endl; - - octreeIterator.gotoTop() ; // here we are at level 1 (first child) - // octreeIterator.moveDown() ; - octreeIterator.gotoLeft(); - // octreeIterator.moveDown() ; // We are at the levell 2 - std::cout << " Number of Cells: " << idCell <<std::endl; - // - idCell=0 ; - std::cout << "Top of the octree " << octreeIterator.level() << std::endl ; - for(int idxLevel = 1; idxLevel < TreeHeight ; ++idxLevel){ - file << std::endl << "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"<< std::endl; - file << " Level " << idxLevel <<" Level "<< octreeIterator.level()<< " -- leave level " << std::boolalpha << octreeIterator.isAtLeafLevel() << std::endl; - do{ - file <<"Cell id "<< ++idCell << " " <<*(octreeIterator.getCurrentCell())<< std::endl ; - - } while(octreeIterator.moveRight()); - octreeIterator.moveDown() ; - octreeIterator.gotoLeft(); - } - std::cout << " END " << std::endl; - - } - - if(FParameters::existParameter(argc, argv, "-fout")){ - - filename = FParameters::getStr(argc,argv,"-fout", defaultFile.c_str()); - FFmaGenericWriter writer(filename) ; - // - FSize NBparticles = loader.getNumberOfParticles() ; - FmaRWParticle<8,8> *particles = new FmaRWParticle<8,8>[NBparticles]; - // - tree.forEachLeaf([&](LeafClass* leaf){ - const FReal*const posX = leaf->getTargets()->getPositions()[0]; - const FReal*const posY = leaf->getTargets()->getPositions()[1]; - const FReal*const posZ = leaf->getTargets()->getPositions()[2]; - - const FReal*const potentials = leaf->getTargets()->getPotentials(); - const FReal*const forcesX = leaf->getTargets()->getForcesX(); - const FReal*const forcesY = leaf->getTargets()->getForcesY(); - const FReal*const forcesZ = leaf->getTargets()->getForcesZ(); - const int nbParticlesInLeaf = leaf->getTargets()->getNbParticles(); - const FReal*const physicalValues = leaf->getTargets()->getPhysicalValues(); - - const FVector<int>& indexes = leaf->getTargets()->getIndexes(); - - for(int idxPart = 0 ; idxPart < nbParticlesInLeaf ; ++idxPart){ - const int indexPartOrig = indexes[idxPart]; - particles[indexPartOrig].setPosition(posX[idxPart],posY[idxPart],posZ[idxPart]); - particles[indexPartOrig].setPhysicalValue(physicalValues[idxPart]) ; - particles[indexPartOrig].setPotential( potentials[idxPart]); - particles[indexPartOrig].setForces(forcesX[idxPart] ,forcesY[idxPart], forcesZ[idxPart]); - } - }); - - writer.writeHeader(loader.getCenterOfBox(), loader.getBoxWidth(), NBparticles,*particles) ; - - writer.writeArrayOfParticles(particles, NBparticles); - } - return 0; -} -- GitLab