From 18a0e91202ae3d00bbb126123865c75208bd24f6 Mon Sep 17 00:00:00 2001 From: PrometheusPi Date: Tue, 20 Dec 2016 16:10:10 +0100 Subject: [PATCH 1/9] add missing minus sign wavepacket laser transversal --- src/picongpu/include/fields/laserProfiles/laserWavepacket.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/picongpu/include/fields/laserProfiles/laserWavepacket.hpp b/src/picongpu/include/fields/laserProfiles/laserWavepacket.hpp index 86c24d2892..0e2ced3634 100644 --- a/src/picongpu/include/fields/laserProfiles/laserWavepacket.hpp +++ b/src/picongpu/include/fields/laserProfiles/laserWavepacket.hpp @@ -113,7 +113,7 @@ HDINLINE float3_X laserTransversal(float3_X elong, const float_X, const float_X const float_X exp_x = posX * posX / (W0_X * W0_X); const float_X exp_z = posZ * posZ / (W0_Z * W0_Z); - return elong * math::exp(exp_x + exp_z); + return elong * math::exp( float_X( -1.0 ) * ( exp_x + exp_z ) ); } From 0340cbc3e84721173bc1caa1f9fb7d362465dc6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Widera?= Date: Mon, 19 Dec 2016 11:51:22 +0100 Subject: [PATCH 2/9] fix: write openMPD meta data without species - write `openPMD` attributes `particleBoundary, particleBoundaryParameters` only if PIConGPU defines at least one species - HDF5: - add namespace `writeMeta` - add `writeMeta::OfAllSpecies<>` - ADIOS: - add namespace `writeMeta` - add `writeMeta::OfAllSpecies<>` --- .../include/plugins/adios/WriteMeta.hpp | 96 ++++++++++----- .../include/plugins/hdf5/WriteMeta.hpp | 112 ++++++++++++------ 2 files changed, 146 insertions(+), 62 deletions(-) diff --git a/src/picongpu/include/plugins/adios/WriteMeta.hpp b/src/picongpu/include/plugins/adios/WriteMeta.hpp index 97bed3a7e8..9557f333c6 100644 --- a/src/picongpu/include/plugins/adios/WriteMeta.hpp +++ b/src/picongpu/include/plugins/adios/WriteMeta.hpp @@ -41,6 +41,73 @@ namespace adios { using namespace PMacc; +namespace writeMeta +{ + /** write openPMD species meta data + * + * @tparam numSpecies count of defined species + */ + template< uint32_t numSpecies = bmpl::size::type::value > + struct OfAllSpecies + { + /** write meta data for species + * + * @param threadParams context of the adios plugin + * @param fullMeshesPath path to mesh entry + */ + void operator()( + ThreadParams* threadParams, + const std::string& fullMeshesPath + ) const + { + // assume all boundaries are like the first species for openPMD 1.0.0 + GetStringProperties::type> particleBoundaryProp; + std::list listParticleBoundary; + std::list listParticleBoundaryParam; + for( uint32_t i = NumberOfExchanges::value - 1; i > 0; --i ) + { + if( FRONT % i == 0 ) + { + listParticleBoundary.push_back( + particleBoundaryProp[ExchangeTypeNames()[i]]["name"].value + ); + listParticleBoundaryParam.push_back( + particleBoundaryProp[ExchangeTypeNames()[i]]["param"].value + ); + } + } + helper::GetADIOSArrayOfString getADIOSArrayOfString; + PMACC_AUTO(arrParticleBoundary, getADIOSArrayOfString( listParticleBoundary )); + PMACC_AUTO(arrParticleBoundaryParam, getADIOSArrayOfString( listParticleBoundaryParam )); + + ADIOS_CMD(adios_define_attribute_byvalue(threadParams->adiosGroupHandle, + "particleBoundary", fullMeshesPath.c_str(), adios_string_array, + listParticleBoundary.size(), &( arrParticleBoundary.starts.at( 0 ) ))); + ADIOS_CMD(adios_define_attribute_byvalue(threadParams->adiosGroupHandle, + "particleBoundaryParameters", fullMeshesPath.c_str(), adios_string_array, + listParticleBoundaryParam.size(), &( arrParticleBoundaryParam.starts.at( 0 ) ))); + } + }; + + /** specialization if no species are defined */ + template< > + struct OfAllSpecies< 0 > + { + /** write meta data for species + * + * @param threadParams context of the adios plugin + * @param fullMeshesPath path to mesh entry + */ + void operator()( + ThreadParams* /* threadParams */, + const std::string& /* fullMeshesPath */ + ) const + { + } + }; + +} // namespace writeMeta + struct WriteMeta { void operator()(ThreadParams *threadParams) @@ -143,34 +210,7 @@ using namespace PMacc; "fieldBoundaryParameters", fullMeshesPath.c_str(), adios_string_array, listFieldBoundaryParam.size(), &( arrFieldBoundaryParam.starts.at( 0 ) ))); - if( bmpl::size::type::value > 0 ) - { - // assume all boundaries are like the first species for openPMD 1.0.0 - GetStringProperties::type> particleBoundaryProp; - std::list listParticleBoundary; - std::list listParticleBoundaryParam; - for( uint32_t i = NumberOfExchanges::value - 1; i > 0; --i ) - { - if( FRONT % i == 0 ) - { - listParticleBoundary.push_back( - particleBoundaryProp[ExchangeTypeNames()[i]]["name"].value - ); - listParticleBoundaryParam.push_back( - particleBoundaryProp[ExchangeTypeNames()[i]]["param"].value - ); - } - } - PMACC_AUTO(arrParticleBoundary, getADIOSArrayOfString( listParticleBoundary )); - PMACC_AUTO(arrParticleBoundaryParam, getADIOSArrayOfString( listParticleBoundaryParam )); - - ADIOS_CMD(adios_define_attribute_byvalue(threadParams->adiosGroupHandle, - "particleBoundary", fullMeshesPath.c_str(), adios_string_array, - listParticleBoundary.size(), &( arrParticleBoundary.starts.at( 0 ) ))); - ADIOS_CMD(adios_define_attribute_byvalue(threadParams->adiosGroupHandle, - "particleBoundaryParameters", fullMeshesPath.c_str(), adios_string_array, - listParticleBoundaryParam.size(), &( arrParticleBoundaryParam.starts.at( 0 ) ))); - } + writeMeta::OfAllSpecies<>()( threadParams, fullMeshesPath ); GetStringProperties currentSmoothingProp; const std::string currentSmoothing( currentSmoothingProp["name"].value ); diff --git a/src/picongpu/include/plugins/hdf5/WriteMeta.hpp b/src/picongpu/include/plugins/hdf5/WriteMeta.hpp index 2c351f9999..ec3e1068dd 100644 --- a/src/picongpu/include/plugins/hdf5/WriteMeta.hpp +++ b/src/picongpu/include/plugins/hdf5/WriteMeta.hpp @@ -45,6 +45,83 @@ namespace hdf5 { using namespace PMacc; +namespace writeMeta +{ + /** write openPMD species meta data + * + * @tparam numSpecies count of defined species + */ + template< uint32_t numSpecies = bmpl::size::type::value > + struct OfAllSpecies + { + /** write meta data for species + * + * @param dc hdf5 data connector + * @param meshesPath path to mesh entry + * @param currentStep current simulation time step + */ + void operator()( + ParallelDomainCollector* dc, + const std::string& meshesPath, + const uint32_t currentStep + ) const + { + // assume all boundaries are like the first species for openPMD 1.0.0 + GetStringProperties::type> particleBoundaryProp; + std::list listParticleBoundary; + std::list listParticleBoundaryParam; + for( uint32_t i = NumberOfExchanges::value - 1; i > 0; --i ) + { + if( FRONT % i == 0 ) + { + listParticleBoundary.push_back( + particleBoundaryProp[ExchangeTypeNames()[i]]["name"].value + ); + listParticleBoundaryParam.push_back( + particleBoundaryProp[ExchangeTypeNames()[i]]["param"].value + ); + } + } + helper::GetSplashArrayOfString getSplashArrayOfString; + PMACC_AUTO(arrParticleBoundary, getSplashArrayOfString( listParticleBoundary )); + ColTypeString ctParticleBoundary( arrParticleBoundary.maxLen ); + PMACC_AUTO(arrParticleBoundaryParam, getSplashArrayOfString( listParticleBoundaryParam )); + ColTypeString ctParticleBoundaryParam( arrParticleBoundaryParam.maxLen ); + + dc->writeAttribute( currentStep, ctParticleBoundary, meshesPath.c_str(), + "particleBoundary", + 1u, Dimensions( listParticleBoundary.size(), 0, 0 ), + &( arrParticleBoundary.buffers.at( 0 ) ) + ); + dc->writeAttribute( currentStep, ctParticleBoundaryParam, meshesPath.c_str(), + "particleBoundaryParameters", + 1u, Dimensions( listParticleBoundaryParam.size(), 0, 0 ), + &( arrParticleBoundaryParam.buffers.at( 0 ) ) + ); + } + }; + + /** specialization if no species are defined */ + template< > + struct OfAllSpecies< 0 > + { + /** write meta data for species + * + * @param dc hdf5 data connector + * @param meshesPath path to mesh entry + * @param currentStep current simulation time step + */ + void operator()( + ParallelDomainCollector* /* dc */, + const std::string& /* meshesPath */, + const uint32_t /* currentStep */ + ) const + { + } + }; + +} // namespace writeMeta + struct WriteMeta { typedef PICToSplash::type SplashFloatXType; @@ -174,40 +251,7 @@ using namespace PMacc; &( arrFieldBoundaryParam.buffers.at( 0 ) ) ); - if( bmpl::size::type::value > 0 ) - { - // assume all boundaries are like the first species for openPMD 1.0.0 - GetStringProperties::type> particleBoundaryProp; - std::list listParticleBoundary; - std::list listParticleBoundaryParam; - for( uint32_t i = NumberOfExchanges::value - 1; i > 0; --i ) - { - if( FRONT % i == 0 ) - { - listParticleBoundary.push_back( - particleBoundaryProp[ExchangeTypeNames()[i]]["name"].value - ); - listParticleBoundaryParam.push_back( - particleBoundaryProp[ExchangeTypeNames()[i]]["param"].value - ); - } - } - PMACC_AUTO(arrParticleBoundary, getSplashArrayOfString( listParticleBoundary )); - ColTypeString ctParticleBoundary( arrParticleBoundary.maxLen ); - PMACC_AUTO(arrParticleBoundaryParam, getSplashArrayOfString( listParticleBoundaryParam )); - ColTypeString ctParticleBoundaryParam( arrParticleBoundaryParam.maxLen ); - - dc->writeAttribute( currentStep, ctParticleBoundary, meshesPath.c_str(), - "particleBoundary", - 1u, Dimensions( listParticleBoundary.size(), 0, 0 ), - &( arrParticleBoundary.buffers.at( 0 ) ) - ); - dc->writeAttribute( currentStep, ctParticleBoundaryParam, meshesPath.c_str(), - "particleBoundaryParameters", - 1u, Dimensions( listParticleBoundaryParam.size(), 0, 0 ), - &( arrParticleBoundaryParam.buffers.at( 0 ) ) - ); - } + writeMeta::OfAllSpecies<>()( dc, meshesPath, currentStep ); GetStringProperties currentSmoothingProp; const std::string currentSmoothing( currentSmoothingProp["name"].value ); From 728dbe8dabf0084185e47117f95949f91c18f3aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Widera?= Date: Wed, 30 Nov 2016 10:34:04 +0100 Subject: [PATCH 3/9] fix device selection guard device number outside valid range can be selected --- src/libPMacc/include/Environment.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libPMacc/include/Environment.hpp b/src/libPMacc/include/Environment.hpp index 8e0910a315..d2ed44c500 100644 --- a/src/libPMacc/include/Environment.hpp +++ b/src/libPMacc/include/Environment.hpp @@ -180,7 +180,7 @@ class Environment { throw std::runtime_error("no CUDA capable devices detected"); } - else if (num_gpus < deviceNumber) //check if device can be selected by deviceNumber + else if (deviceNumber >= num_gpus) //check if device can be selected by deviceNumber { std::cerr << "no CUDA device " << deviceNumber << ", only " << num_gpus << " devices found" << std::endl; throw std::runtime_error("CUDA capable devices can't be selected"); From 1de2e688932290ed188bdf6f5126a695ae6d3df6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Widera?= Date: Mon, 21 Nov 2016 13:28:26 +0100 Subject: [PATCH 4/9] fix intel icc compile bug `AllCombinations` not compile with icc --- .../include/compileTime/AllCombinations.hpp | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/libPMacc/include/compileTime/AllCombinations.hpp b/src/libPMacc/include/compileTime/AllCombinations.hpp index f856767797..f94ba8c116 100644 --- a/src/libPMacc/include/compileTime/AllCombinations.hpp +++ b/src/libPMacc/include/compileTime/AllCombinations.hpp @@ -41,29 +41,6 @@ namespace PMacc { namespace bmpl = boost::mpl; -/** Assign to each element in a sequence of CT::Vector(s) a type at a given - * component position - * - * @tparam T_InVector sequence with CT::Vector - * @tparam T_ComponentPos position of the component to be changed (type must be bmpl::integral_c) - * @tparam T_Element value (type) which should replace the component at position T_Component - * in the CT::Vector elements - */ -template -struct AssignToAnyElementInVector -{ - typedef T_InVector InVector; - typedef T_Element Element; - - typedef typename bmpl::transform< - InVector, - PMacc::math::CT::Assign - >::type type; -}; - namespace detail { /** Create tuples out of the elements of N sequences @@ -101,10 +78,39 @@ struct AllCombinations */ typedef typename bmpl::copy > >::type TmpVector; - typedef typename bmpl::transform< TmpVector, - AssignToAnyElementInVector, bmpl::_1 > >::type NestedSeq; + /** Assign to each element in a sequence of CT::Vector(s) a type at a given + * component position + * + * @tparam T_ComponentPos position of the component to be changed (type must be bmpl::integral_c) + * @tparam T_Element value (type) which should replace the component at position T_Component + * in the CT::Vector elements + */ + template< + typename T_ComponentPos, + typename T_Element + > + struct AssignToAnyElementInVector + { + typedef TmpResult InVector; + typedef T_Element Element; + + typedef typename bmpl::transform< + InVector, + PMacc::math::CT::Assign< + bmpl::_1, + T_ComponentPos, + Element + > + >::type type; + }; + typedef typename bmpl::transform< + TmpVector, + AssignToAnyElementInVector< + bmpl::integral_c, + bmpl::_1 + > + >::type NestedSeq; typedef typename MakeSeqFromNestedSeq::type OneSeq; From c67267db49ac0760d86fe19a3710b9d15c2945a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Widera?= Date: Mon, 21 Nov 2016 14:36:59 +0100 Subject: [PATCH 5/9] `MapTuple`: fix broken compile with icc - refactore without any BOOST_PP usage - remove constructor - remove function `make_MapTuple()` Backport: C++98 compatibility --- src/libPMacc/include/math/MapTuple.hpp | 363 ++++++++++++++----------- 1 file changed, 197 insertions(+), 166 deletions(-) diff --git a/src/libPMacc/include/math/MapTuple.hpp b/src/libPMacc/include/math/MapTuple.hpp index 0387bd50d9..e54962677e 100644 --- a/src/libPMacc/include/math/MapTuple.hpp +++ b/src/libPMacc/include/math/MapTuple.hpp @@ -23,199 +23,230 @@ #pragma once #include "pmacc_types.hpp" +#include "particles/boostExtension/InheritLinearly.hpp" + #include -#include #include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include +#include + namespace PMacc { namespace math { -#ifndef MAPTUPLE_MAX_DIM -#define MAPTUPLE_MAX_DIM 8 -#endif - -#define CONSTRUCTOR(Z, N, _) \ - template \ - HDINLINE \ - MapTuple(BOOST_PP_ENUM_BINARY_PARAMS(N, const Arg, &arg)) \ - : data(arg0), \ - base(BOOST_PP_ENUM_SHIFTED_PARAMS(N, arg)) \ - { \ - BOOST_STATIC_ASSERT(dim == N); \ - } - - -namespace mpl = boost::mpl; - -template -struct AlignedData -{ - typedef ValueType_ ValueType; - PMACC_ALIGN(value, ValueType); - - HDINLINE AlignedData() - { - } - - HDINLINE AlignedData(const ValueType& value) : value(value) - { - } -}; - -template -struct NativeData -{ - typedef ValueType_ ValueType; - ValueType value; + namespace bmpl = boost::mpl; - HDINLINE NativeData() + /** wrap a datum + * + * align the data structure with `PMACC_ALIGN` + * + * @tparam T_Pair boost mpl pair< key, type of the value > + */ + template< typename T_Pair > + struct AlignedData { - } + typedef typename T_Pair::first Key; + typedef typename T_Pair::second ValueType; - HDINLINE NativeData(const ValueType& value) : value(value) - { - } -}; + PMACC_ALIGN( value, ValueType ); -template class PODType = NativeData, bool ListEmpty = mpl::empty::type::value> -class MapTuple; + HDINLINE AlignedData( ) + { + } -template class PODType> -class MapTuple -{ -}; + HDINLINE AlignedData( const ValueType& value ) : value( value ) + { + } -template class PODType> -class MapTuple -: public MapTuple::type>::type::first>::type, PODType -> -{ -public: - typedef Map_ Map; - BOOST_STATIC_CONSTEXPR int dim = mpl::size::type::value; -private: - - typedef MapTuple::type>::type::first>::type, PODType> base; + HDINLINE ValueType& operator[]( const Key& ) + { + return value; + } - typedef typename mpl::deref::type>::type::first Key; - typedef typename mpl::deref::type>::type::second Value; - - PODType data; -public: - - template struct result; - - template - struct result - { - typedef typename mpl::at::type& type; - // typedef typename mpl::at::type& type2; + HDINLINE const ValueType& operator[]( const Key& ) const + { + return value; + } }; - template - struct result + /** wrap a datum + * + * @tparam T_Pair boost mpl pair< key, type of the value > + */ + template< typename T_Pair > + struct NativeData { + typedef typename T_Pair::first Key; + typedef typename T_Pair::second ValueType; - typedef const typename mpl::at::type& type; - }; -/* - template class T_PODType,bool T_isEnd,class TKey> - struct result(TKey)> - { - typedef const typename mpl::at::type& type; - }; -*/ - HDINLINE MapTuple() - { - } + ValueType value; - template - HDINLINE MapTuple(const Arg0& arg0) : data(arg0) - { - BOOST_STATIC_ASSERT(dim == 1); - } + HDINLINE NativeData( ) + { + } - BOOST_PP_REPEAT_FROM_TO(2, BOOST_PP_INC(MAPTUPLE_MAX_DIM), CONSTRUCTOR, _) + HDINLINE NativeData( const ValueType& value ) : value( value ) + { + } + HDINLINE ValueType& operator[]( const Key& ) + { + return value; + } - HDINLINE Value& operator[](const Key) - { - return this->data.value; - } + HDINLINE const ValueType& operator[]( const Key& ) const + { + return value; + } + }; - HDINLINE const Value& operator[](const Key) const + template< + typename T_Map, + template< typename > class T_PodType = NativeData + > + struct MapTuple : + protected InheritLinearly< + T_Map, + T_PodType + > { - return this->data.value; - } - template - HDINLINE - typename mpl::at::type& - operator[](const TKey) - { - return base::operator[](TKey()); - } - - template - HDINLINE - const - typename mpl::at::type& - operator[](const TKey) const - { - return base::operator[](TKey()); - } - - template - HDINLINE - typename mpl::deref< - typename mpl::advance< - typename mpl::begin::type, mpl::int_ >::type>::type::second& - at() - { - return (*this)[ - typename mpl::deref< - typename mpl::advance< - typename mpl::begin::type, mpl::int_ >::type>::type::first()]; - } -}; - -#undef CONSTRUCTOR - -#define PAIR_LIST(Z, N, _) mpl::pair - -#define MAKE_MAPTUPLE(Z, N, _) \ - template \ - HDINLINE \ - MapTuple > \ - make_MapTuple(BOOST_PP_ENUM_BINARY_PARAMS(N, const Value, &value)) \ - { \ - return MapTuple > \ - (BOOST_PP_ENUM_PARAMS(N, value)); \ - } - -BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(MAPTUPLE_MAX_DIM), MAKE_MAPTUPLE, _) - -#undef MAKE_MAPTUPLE -#undef PAIR_LIST + typedef T_Map Map; + BOOST_STATIC_CONSTEXPR int dim = bmpl::size< Map >::type::value; + typedef InheritLinearly< + T_Map, + T_PodType + > Base; + + template< class > struct result; + + template< + class T_F, + class T_Key + > + struct result< T_F( T_Key ) > + { + typedef typename bmpl::at< + Map, + T_Key + >::type& type; + }; + + template< + class T_F, + class T_Key + > + struct result< const T_F( T_Key ) > + { + typedef const typename bmpl::at< + Map, + T_Key + >::type& type; + }; + + /** access a datum with a key + * + * @tparam T_Key key type + * + * @{ + */ + template< typename T_Key > + HDINLINE + typename boost::result_of< + MapTuple( T_Key ) + >::type + operator[]( const T_Key& key ) + { + return + ( + *( static_cast< + T_PodType< + bmpl::pair< + T_Key, + typename bmpl::at< + Map, + T_Key + >::type + > + >* + >( this ) ) + )[key]; + } + + template< typename T_Key > + HDINLINE + typename boost::result_of< + const MapTuple( T_Key ) + >::type + operator[]( const T_Key& key ) const + { + return ( + *( + static_cast< + const T_PodType< + bmpl::pair< + T_Key, + typename bmpl::at< + Map, + T_Key + >::type + > + >* + >( this ) + ) + )[key]; + } + /** @} */ + + /** access a datum with an index + * + * @tparam T_i the index of tuple's i-th element + * + * @{ + */ + template< int T_i > + HDINLINE + typename boost::result_of< + MapTuple( + typename bmpl::at< + Map, + bmpl::int_< T_i > + >::type::first + ) + >::type + at( ) + { + return ( *this )[ + typename bmpl::at< + Map, + bmpl::int_< T_i > + >::type::first( ) + ]; + } + + template< int T_i > + HDINLINE + typename boost::result_of< + const MapTuple( + typename bmpl::at< + Map, + bmpl::int_< T_i > + >::type::first + ) + >::type + at( ) const + { + return ( *this )[ + typename bmpl::at< + Map, + bmpl::int_< T_i > + >::type::first( ) + ]; + } + /** @} */ + }; } // math } // PMacc From efffaab3fc39e4c8efc29dfcdac1bd875b23db38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Widera?= Date: Mon, 21 Nov 2016 14:40:24 +0100 Subject: [PATCH 6/9] refactore `InheritLinearly` - move inherit type creation to the namepsace detail - add accessor to the template signature backport: C++98 compatibility --- .../boostExtension/InheritLinearly.hpp | 52 +++++++++++++------ 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/src/libPMacc/include/particles/boostExtension/InheritLinearly.hpp b/src/libPMacc/include/particles/boostExtension/InheritLinearly.hpp index dd2f2b6444..693c51ab59 100644 --- a/src/libPMacc/include/particles/boostExtension/InheritLinearly.hpp +++ b/src/libPMacc/include/particles/boostExtension/InheritLinearly.hpp @@ -24,6 +24,7 @@ #pragma once +#include "compileTime/accessors/Identity.hpp" #include #include #include @@ -31,28 +32,45 @@ namespace PMacc { - - namespace detail { -template -struct InheritLinearly : public T_Base -{ -}; + /** get combined type which inherit from a boost mpl sequence + * + * @tparam T_Sequence boost mpl sequence with classes + * @tparam T_Accessor unary operator to transform each element of the sequence + */ + template< + typename T_Sequence, + template< typename > class T_Accessor = compileTime::accessors::Identity + > + struct InheritLinearly : + public bmpl::inherit_linearly< + T_Sequence, + bmpl::inherit< + bmpl::_1, + T_Accessor< bmpl::_2 > + > + >::type + { + }; } //namespace detail -template -struct InheritLinearly : -public detail::InheritLinearly< -typename -bmpl::inherit_linearly >::type -> -{ -}; - + /** type which inherits from multiple classes + * + * @tparam T_Sequence boost mpl sequence with classes + * @tparam T_Accessor unary operator to transform each element of the sequence + */ + template< + typename T_Sequence, + template< typename > class T_Accessor = compileTime::accessors::Identity + > + struct InheritLinearly : detail::InheritLinearly< + T_Sequence, + T_Accessor + > + { + }; } //namespace PMacc - - From b775f82e87fc6600e1e53c1c143fded6f31e4222 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Tue, 3 Jan 2017 14:57:20 +0100 Subject: [PATCH 7/9] Changelog: 0.2.2 --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5d5fd5f81..fcbfe14a82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,34 @@ Change Log / Release Log for PIConGPU ================================================================ +0.2.2 +----- +**Date:** 2017-01-03 + +Laser wavepacket, vacuum openPMD & icc + +This release fixes small a broken laser profile (wavepacket), +allows to use icc as the host compiler, fixes a bug when writing openPMD +files in simulations without particle species ("vacuum") and a problem +with GPU device selection shared node usage via `CUDA_VISIBLE_DEVICES`. + +### Changes to "0.2.1" + +**Bug Fixes:** + - add missing minus sign wavepacket laser transversal #1722 + - write openMPD meta data without species #1718 + - Device Selection: Guard Valid Range #1665 + - PMacc icc compatibility: + - `MapTuple` #1648 + - `AllCombinations` #1646 + +**Misc:** + - refactor `InheritLinearly` #1647 + +Thank you to René Widera and Richard Pausch for spotting the issues and +providing fixes! + + 0.2.1 ----- **Date:** 2016-11-29 From 8387951f568f4abc8d33817520e1e3103fdd3059 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Tue, 3 Jan 2017 15:00:48 +0100 Subject: [PATCH 8/9] Update Version: 0.2.2 --- src/picongpu/include/version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/picongpu/include/version.hpp b/src/picongpu/include/version.hpp index 5d9fb97670..480cc6f48d 100644 --- a/src/picongpu/include/version.hpp +++ b/src/picongpu/include/version.hpp @@ -22,4 +22,4 @@ #define PICONGPU_VERSION_MAJOR 0 #define PICONGPU_VERSION_MINOR 2 -#define PICONGPU_VERSION_PATCH 1 +#define PICONGPU_VERSION_PATCH 2 From 43d865506e69ba29ec5a155692e55888587e538f Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Wed, 4 Jan 2017 08:58:22 +0100 Subject: [PATCH 9/9] Bump release date, Changelog Typos --- CHANGELOG.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcbfe14a82..d949fa0407 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,21 +3,21 @@ Change Log / Release Log for PIConGPU 0.2.2 ----- -**Date:** 2017-01-03 +**Date:** 2017-01-04 Laser wavepacket, vacuum openPMD & icc -This release fixes small a broken laser profile (wavepacket), -allows to use icc as the host compiler, fixes a bug when writing openPMD -files in simulations without particle species ("vacuum") and a problem -with GPU device selection shared node usage via `CUDA_VISIBLE_DEVICES`. +This release fixes a broken laser profile (wavepacket), allows to use +icc as the host compiler, fixes a bug when writing openPMD files in +simulations without particle species ("vacuum") and a problem with +GPU device selection on shared node usage via `CUDA_VISIBLE_DEVICES`. ### Changes to "0.2.1" **Bug Fixes:** - add missing minus sign wavepacket laser transversal #1722 - - write openMPD meta data without species #1718 - - Device Selection: Guard Valid Range #1665 + - write openPMD meta data without species #1718 + - device selection: guard valid range #1665 - PMacc icc compatibility: - `MapTuple` #1648 - `AllCombinations` #1646 @@ -25,7 +25,7 @@ with GPU device selection shared node usage via `CUDA_VISIBLE_DEVICES`. **Misc:** - refactor `InheritLinearly` #1647 -Thank you to René Widera and Richard Pausch for spotting the issues and +Thanks to René Widera and Richard Pausch for spotting the issues and providing fixes!