diff --git a/Src/Kernels/Chebyshev/FAbstractChebKernel.hpp b/Src/Kernels/Chebyshev/FAbstractChebKernel.hpp index 09b051eff9345100f40e4887aeff5a67b5d1caae..c65e4a598d7fdde90ad9a09456c723d7fd587ea9 100755 --- a/Src/Kernels/Chebyshev/FAbstractChebKernel.hpp +++ b/Src/Kernels/Chebyshev/FAbstractChebKernel.hpp @@ -22,12 +22,10 @@ #include "../../Components/FAbstractKernels.hpp" -#include "../P2P/FP2P.hpp" - +#include "FChebP2PKernels.hpp" #include "./FChebInterpolator.hpp" -class FTreeCoordinate; -template <KERNEL_FUNCCTION_IDENTIFIER Identifier, int NVALS> struct DirectInteactionComputer; +#include "../../Containers/FTreeCoordinate.hpp" /** * @author Matthias Messner(matthias.messner@inria.fr) @@ -126,113 +124,20 @@ public: - void P2P(const FTreeCoordinate& /* LeafCellCoordinate */, // needed for periodic boundary conditions + virtual void P2P(const FTreeCoordinate& /* LeafCellCoordinate */, // needed for periodic boundary conditions ContainerClass* const FRestrict TargetParticles, const ContainerClass* const FRestrict /*SourceParticles*/, ContainerClass* const NeighborSourceParticles[27], - const int /* size */) - { - DirectInteactionComputer<MatrixKernelClass::Identifier, NVALS>::P2P(TargetParticles,NeighborSourceParticles); - } + const int /* size */) = 0; - void P2PRemote(const FTreeCoordinate& /*inPosition*/, + virtual void P2PRemote(const FTreeCoordinate& /*inPosition*/, ContainerClass* const FRestrict inTargets, const ContainerClass* const FRestrict /*inSources*/, - ContainerClass* const inNeighbors[27], const int /*inSize*/){ - DirectInteactionComputer<MatrixKernelClass::Identifier, NVALS>::P2PRemote(inTargets,inNeighbors,27); - } - -}; - - -/////////////////////////////////////////////////////// -// P2P Wrappers -/////////////////////////////////////////////////////// + ContainerClass* const inNeighbors[27], const int /*inSize*/) = 0; -/*! Specialization for Laplace potential */ -template <> -struct DirectInteactionComputer<ONE_OVER_R, 1> -{ - template <typename ContainerClass> - static void P2P( ContainerClass* const FRestrict TargetParticles, - ContainerClass* const NeighborSourceParticles[27]){ - FP2P::FullMutual(TargetParticles,NeighborSourceParticles,14); - } - - template <typename ContainerClass> - static void P2PRemote( ContainerClass* const FRestrict inTargets, - ContainerClass* const inNeighbors[27], - const int inSize){ - FP2P::FullRemote(inTargets,inNeighbors,inSize); - } }; -/*! Specialization for Leonard-Jones potential */ -template <> -struct DirectInteactionComputer<LEONARD_JONES_POTENTIAL, 1> -{ - template <typename ContainerClass> - static void P2P( ContainerClass* const FRestrict TargetParticles, - ContainerClass* const NeighborSourceParticles[27]){ - FP2P::FullMutualLJ(TargetParticles,NeighborSourceParticles,14); - } - - template <typename ContainerClass> - static void P2PRemote( ContainerClass* const FRestrict inTargets, - ContainerClass* const inNeighbors[27], - const int inSize){ - FP2P::FullRemoteLJ(inTargets,inNeighbors,inSize); - } -}; - -/////////////////////////////////////////////////////// -// In case of multi right hand side -/////////////////////////////////////////////////////// - -template <int NVALS> -struct DirectInteactionComputer<ONE_OVER_R, NVALS> -{ - template <typename ContainerClass> - static void P2P( ContainerClass* const FRestrict TargetParticles, - ContainerClass* const NeighborSourceParticles[27]){ - for(int idxRhs = 0 ; idxRhs < NVALS ; ++idxRhs){ - FP2P::FullMutual(TargetParticles,NeighborSourceParticles,14); - } - } - - template <typename ContainerClass> - static void P2PRemote( ContainerClass* const FRestrict inTargets, - ContainerClass* const inNeighbors[27], - const int inSize){ - for(int idxRhs = 0 ; idxRhs < NVALS ; ++idxRhs){ - FP2P::FullRemote(inTargets,inNeighbors,inSize); - } - } -}; - - -/*! Specialization for Leonard-Jones potential */ -template <int NVALS> -struct DirectInteactionComputer<LEONARD_JONES_POTENTIAL, NVALS> -{ - template <typename ContainerClass> - static void P2P( ContainerClass* const FRestrict TargetParticles, - ContainerClass* const NeighborSourceParticles[27]){ - for(int idxRhs = 0 ; idxRhs < NVALS ; ++idxRhs){ - FP2P::FullMutualLJ(TargetParticles,NeighborSourceParticles,14); - } - } - - template <typename ContainerClass> - static void P2PRemote( ContainerClass* const FRestrict inTargets, - ContainerClass* const inNeighbors[27], - const int inSize){ - for(int idxRhs = 0 ; idxRhs < NVALS ; ++idxRhs){ - FP2P::FullRemoteLJ(inTargets,inNeighbors,inSize); - } - } -}; diff --git a/Src/Kernels/Chebyshev/FChebKernel.hpp b/Src/Kernels/Chebyshev/FChebKernel.hpp index 579abcfe99ddeda01f288197ee265b58973b6242..c064d568d882628154dd3862d7327b5e386abc15 100755 --- a/Src/Kernels/Chebyshev/FChebKernel.hpp +++ b/Src/Kernels/Chebyshev/FChebKernel.hpp @@ -203,6 +203,22 @@ public: } } + void P2P(const FTreeCoordinate& /* LeafCellCoordinate */, // needed for periodic boundary conditions + ContainerClass* const FRestrict TargetParticles, + const ContainerClass* const FRestrict /*SourceParticles*/, + ContainerClass* const NeighborSourceParticles[27], + const int /* size */) + { + DirectInteactionComputer<MatrixKernelClass::Identifier, NVALS>::P2P(TargetParticles,NeighborSourceParticles); + } + + + void P2PRemote(const FTreeCoordinate& /*inPosition*/, + ContainerClass* const FRestrict inTargets, const ContainerClass* const FRestrict /*inSources*/, + ContainerClass* const inNeighbors[27], const int /*inSize*/){ + DirectInteactionComputer<MatrixKernelClass::Identifier, NVALS>::P2PRemote(inTargets,inNeighbors,27); + } + }; diff --git a/Src/Kernels/Chebyshev/FChebP2PKernels.hpp b/Src/Kernels/Chebyshev/FChebP2PKernels.hpp new file mode 100644 index 0000000000000000000000000000000000000000..f54b41c669e098477460e2388b83d6ad6a47c340 --- /dev/null +++ b/Src/Kernels/Chebyshev/FChebP2PKernels.hpp @@ -0,0 +1,101 @@ +#ifndef FCHEBP2PKERNELS_HPP +#define FCHEBP2PKERNELS_HPP + + +#include "../P2P/FP2P.hpp" + +template <KERNEL_FUNCCTION_IDENTIFIER Identifier, int NVALS> +struct DirectInteactionComputer; + +/////////////////////////////////////////////////////// +// P2P Wrappers +/////////////////////////////////////////////////////// + +/*! Specialization for Laplace potential */ +template <> +struct DirectInteactionComputer<ONE_OVER_R, 1> +{ + template <typename ContainerClass> + static void P2P( ContainerClass* const FRestrict TargetParticles, + ContainerClass* const NeighborSourceParticles[27]){ + FP2P::FullMutual(TargetParticles,NeighborSourceParticles,14); + } + + template <typename ContainerClass> + static void P2PRemote( ContainerClass* const FRestrict inTargets, + ContainerClass* const inNeighbors[27], + const int inSize){ + FP2P::FullRemote(inTargets,inNeighbors,inSize); + } +}; + + +/*! Specialization for Leonard-Jones potential */ +template <> +struct DirectInteactionComputer<LEONARD_JONES_POTENTIAL, 1> +{ + template <typename ContainerClass> + static void P2P( ContainerClass* const FRestrict TargetParticles, + ContainerClass* const NeighborSourceParticles[27]){ + FP2P::FullMutualLJ(TargetParticles,NeighborSourceParticles,14); + } + + template <typename ContainerClass> + static void P2PRemote( ContainerClass* const FRestrict inTargets, + ContainerClass* const inNeighbors[27], + const int inSize){ + FP2P::FullRemoteLJ(inTargets,inNeighbors,inSize); + } +}; + +/////////////////////////////////////////////////////// +// In case of multi right hand side +/////////////////////////////////////////////////////// + + + +template <int NVALS> +struct DirectInteactionComputer<ONE_OVER_R, NVALS> +{ + template <typename ContainerClass> + static void P2P( ContainerClass* const FRestrict TargetParticles, + ContainerClass* const NeighborSourceParticles[27]){ + for(int idxRhs = 0 ; idxRhs < NVALS ; ++idxRhs){ + FP2P::FullMutual(TargetParticles,NeighborSourceParticles,14); + } + } + + template <typename ContainerClass> + static void P2PRemote( ContainerClass* const FRestrict inTargets, + ContainerClass* const inNeighbors[27], + const int inSize){ + for(int idxRhs = 0 ; idxRhs < NVALS ; ++idxRhs){ + FP2P::FullRemote(inTargets,inNeighbors,inSize); + } + } +}; + + +/*! Specialization for Leonard-Jones potential */ +template <int NVALS> +struct DirectInteactionComputer<LEONARD_JONES_POTENTIAL, NVALS> +{ + template <typename ContainerClass> + static void P2P( ContainerClass* const FRestrict TargetParticles, + ContainerClass* const NeighborSourceParticles[27]){ + for(int idxRhs = 0 ; idxRhs < NVALS ; ++idxRhs){ + FP2P::FullMutualLJ(TargetParticles,NeighborSourceParticles,14); + } + } + + template <typename ContainerClass> + static void P2PRemote( ContainerClass* const FRestrict inTargets, + ContainerClass* const inNeighbors[27], + const int inSize){ + for(int idxRhs = 0 ; idxRhs < NVALS ; ++idxRhs){ + FP2P::FullRemoteLJ(inTargets,inNeighbors,inSize); + } + } +}; + +#endif // FCHEBP2PKERNELS_HPP diff --git a/Src/Kernels/Chebyshev/FChebSymKernel.hpp b/Src/Kernels/Chebyshev/FChebSymKernel.hpp index a9181c68f39baef449bf5d1a6fbc2add1a3c045c..b54556a86e095806d7084380a59a5e63671f0a24 100755 --- a/Src/Kernels/Chebyshev/FChebSymKernel.hpp +++ b/Src/Kernels/Chebyshev/FChebSymKernel.hpp @@ -448,6 +448,21 @@ public: } } + void P2P(const FTreeCoordinate& /* LeafCellCoordinate */, // needed for periodic boundary conditions + ContainerClass* const FRestrict TargetParticles, + const ContainerClass* const FRestrict /*SourceParticles*/, + ContainerClass* const NeighborSourceParticles[27], + const int /* size */) + { + DirectInteactionComputer<MatrixKernelClass::Identifier, NVALS>::P2P(TargetParticles,NeighborSourceParticles); + } + + + void P2PRemote(const FTreeCoordinate& /*inPosition*/, + ContainerClass* const FRestrict inTargets, const ContainerClass* const FRestrict /*inSources*/, + ContainerClass* const inNeighbors[27], const int /*inSize*/){ + DirectInteactionComputer<MatrixKernelClass::Identifier, NVALS>::P2PRemote(inTargets,inNeighbors,27); + } };