Skip to content

Commit 9b37b76

Browse files
committed
FieldTmp: Multi-Slots
1 parent 0932ded commit 9b37b76

12 files changed

Lines changed: 91 additions & 40 deletions

File tree

src/picongpu/include/fields/FieldTmp.hpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ namespace picongpu
5050
/** Tmp (at the moment: scalar) field for analysers and tmp data like
5151
* "gridded" particle data (charge density, energy density, ...)
5252
*/
53-
class FieldTmp : public SimulationFieldHelper<MappingDesc>, public ISimulationData
53+
class FieldTmp :
54+
public SimulationFieldHelper<MappingDesc>,
55+
public ISimulationData
5456
{
5557
public:
5658
typedef float1_X ValueType;
@@ -64,13 +66,16 @@ namespace picongpu
6466
return this->cellDescription;
6567
}
6668

67-
FieldTmp( MappingDesc cellDescription );
69+
FieldTmp(
70+
MappingDesc cellDescription,
71+
uint32_t slotId
72+
);
6873

6974
virtual ~FieldTmp( );
7075

7176
virtual void reset( uint32_t currentStep );
7277

73-
template<class FrameSolver >
78+
template< class FrameSolver >
7479
HDINLINE static UnitValueType getUnit();
7580

7681
/** powers of the 7 base measures
@@ -84,7 +89,7 @@ namespace picongpu
8489

8590
static std::string getName();
8691

87-
static uint32_t getCommTag();
92+
uint32_t getCommTag();
8893

8994
virtual EventTask asyncCommunication( EventTask serialEvent );
9095

@@ -101,6 +106,8 @@ namespace picongpu
101106
template<uint32_t AREA, class FrameSolver, class ParticlesClass>
102107
void computeValue(ParticlesClass& parClass, uint32_t currentStep);
103108

109+
static SimulationDataId getUniqueId( uint32_t slotId );
110+
104111
SimulationDataId getUniqueId();
105112

106113
void synchronize( );
@@ -117,8 +124,12 @@ namespace picongpu
117124
void insertField( uint32_t exchangeType );
118125

119126
private:
127+
120128
GridBuffer<ValueType, simDim> *fieldTmp;
121129

130+
uint32_t m_slotId;
131+
132+
uint32_t m_commTag;
122133
};
123134

124135

src/picongpu/include/fields/FieldTmp.tpp

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,26 @@
4646
#include "particles/traits/GetInterpolation.hpp"
4747
#include "particles/traits/FilterByFlag.hpp"
4848
#include "traits/GetMargin.hpp"
49+
#include "traits/GetUniqueTypeId.hpp"
50+
51+
#include <string>
4952

5053
namespace picongpu
5154
{
5255
using namespace PMacc;
5356

54-
FieldTmp::FieldTmp( MappingDesc cellDescription ) :
55-
SimulationFieldHelper<MappingDesc>( cellDescription ),
56-
fieldTmp( NULL )
57+
FieldTmp::FieldTmp(
58+
MappingDesc cellDescription,
59+
uint32_t slotId
60+
) :
61+
SimulationFieldHelper<MappingDesc>( cellDescription ),
62+
fieldTmp( NULL ),
63+
m_slotId( slotId )
5764
{
65+
m_commTag =
66+
++PMacc::traits::detail::GetUniqueTypeId< uint8_t >::counter +
67+
SPECIES_FIRSTTAG;
68+
5869
fieldTmp = new GridBuffer<ValueType, simDim > ( cellDescription.getGridLayout( ) );
5970

6071
/** \todo The exchange has to be resetted and set again regarding the
@@ -154,7 +165,7 @@ namespace picongpu
154165

155166
}
156167
// std::cout << "ex " << i << " x=" << guardingCells[0] << " y=" << guardingCells[1] << " z=" << guardingCells[2] << std::endl;
157-
fieldTmp->addExchangeBuffer( i, guardingCells, FIELD_TMP );
168+
fieldTmp->addExchangeBuffer( i, guardingCells, m_commTag );
158169
}
159170
}
160171

@@ -186,9 +197,17 @@ namespace picongpu
186197
} while( mapper.next( ) );
187198
}
188199

189-
SimulationDataId FieldTmp::getUniqueId()
200+
201+
SimulationDataId
202+
FieldTmp::getUniqueId( uint32_t slotId )
190203
{
191-
return getName();
204+
return getName() + std::to_string( slotId );
205+
}
206+
207+
SimulationDataId
208+
FieldTmp::getUniqueId()
209+
{
210+
return getUniqueId( m_slotId );
192211
}
193212

194213
void FieldTmp::synchronize( )
@@ -299,8 +318,7 @@ namespace picongpu
299318
uint32_t
300319
FieldTmp::getCommTag( )
301320
{
302-
return FIELD_TMP;
321+
return m_commTag;
303322
}
304323

305324
} // namespace picongpu
306-

src/picongpu/include/particles/Particles.hpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class Particles : public ParticlesBase<
8484

8585
void createParticleBuffer();
8686

87-
void init(FieldE &fieldE, FieldB &fieldB, FieldJ &fieldJ, FieldTmp &fieldTmp);
87+
void init(FieldE &fieldE, FieldB &fieldB);
8888

8989
void update(uint32_t currentStep);
9090

@@ -164,8 +164,6 @@ class Particles : public ParticlesBase<
164164

165165
FieldE *fieldE;
166166
FieldB *fieldB;
167-
FieldJ *fieldJcurrent;
168-
FieldTmp *fieldTmp;
169167
};
170168

171169
namespace traits

src/picongpu/include/particles/Particles.tpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232

3333
#include "fields/FieldB.hpp"
3434
#include "fields/FieldE.hpp"
35-
#include "fields/FieldJ.hpp"
36-
#include "fields/FieldTmp.hpp"
3735

3836
#include "particles/memory/buffers/ParticlesBuffer.hpp"
3937
#include "ParticlesInit.kernel"
@@ -76,8 +74,6 @@ Particles<
7674
>( cellDescription ),
7775
fieldB( NULL ),
7876
fieldE( NULL ),
79-
fieldJcurrent( NULL ),
80-
fieldTmp( NULL ),
8177
m_gridLayout(gridLayout),
8278
m_datasetID( datasetID )
8379
{
@@ -210,12 +206,10 @@ Particles<
210206
T_Name,
211207
T_Attributes,
212208
T_Flags
213-
>::init( FieldE &fieldE, FieldB &fieldB, FieldJ &fieldJ, FieldTmp &fieldTmp )
209+
>::init( FieldE &fieldE, FieldB &fieldB )
214210
{
215211
this->fieldE = &fieldE;
216212
this->fieldB = &fieldB;
217-
this->fieldJcurrent = &fieldJ;
218-
this->fieldTmp = &fieldTmp;
219213

220214
Environment<>::get( ).DataConnector( ).registerData( *this );
221215
}

src/picongpu/include/particles/ParticlesFunctors.hpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,9 @@ struct CallInit
111111
template<typename T_StorageTuple>
112112
HINLINE void operator()(T_StorageTuple& tuple,
113113
FieldE* fieldE,
114-
FieldB* fieldB,
115-
FieldJ* fieldJ,
116-
FieldTmp* fieldTmp) const
114+
FieldB* fieldB) const
117115
{
118-
tuple[SpeciesName()]->init(*fieldE, *fieldB, *fieldJ, *fieldTmp);
116+
tuple[SpeciesName()]->init( *fieldE, *fieldB );
119117
}
120118
};
121119

src/picongpu/include/particles/gasProfiles/FromHDF5Impl.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#pragma once
2323

24+
#include "static_assert.hpp"
2425
#include "simulation_defines.hpp"
2526
#include "memory/buffers/GridBuffer.hpp"
2627
#include "memory/boxes/DataBoxDim1Access.hpp"
@@ -74,7 +75,12 @@ struct FromHDF5Impl : public T_ParamClass
7475
{
7576
using namespace splash;
7677
DataConnector &dc = Environment<>::get().DataConnector();
77-
FieldTmp& fieldTmp = dc.getData<FieldTmp > (FieldTmp::getName(), true);
78+
79+
PMACC_CASSERT_MSG(
80+
_please_allocate_at_least_one_FieldTmp_in_memory_param,
81+
fieldTmpNumSlots > 0
82+
);
83+
FieldTmp& fieldTmp = dc.getData<FieldTmp >( FieldTmp::getUniqueId( 0 ), true );
7884
PMACC_AUTO(&fieldBuffer, fieldTmp.getGridBuffer());
7985

8086
deviceDataBox = fieldBuffer.getDeviceBuffer().getDataBox();

src/picongpu/include/plugins/ChargeConservation.tpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
* If not, see <http://www.gnu.org/licenses/>.
1919
*/
2020

21+
#include "static_assert.hpp"
2122
#include "math/vector/Int.hpp"
2223
#include "math/vector/Float.hpp"
2324
#include "math/vector/Size_t.hpp"
@@ -188,7 +189,11 @@ void ChargeConservation::notify(uint32_t currentStep)
188189
DataConnector &dc = Environment<>::get().DataConnector();
189190

190191
/* load FieldTmp without copy data to host */
191-
FieldTmp* fieldTmp = &(dc.getData<FieldTmp > (FieldTmp::getName(), true));
192+
PMACC_CASSERT_MSG(
193+
_please_allocate_at_least_one_FieldTmp_in_memory_param,
194+
fieldTmpNumSlots > 0
195+
);
196+
FieldTmp* fieldTmp = &(dc.getData< FieldTmp >( FieldTmp::getUniqueId( 0 ), true ));
192197
/* reset density values to zero */
193198
fieldTmp->getGridBuffer().getDeviceBuffer().setValue(FieldTmp::ValueType(0.0));
194199

src/picongpu/include/plugins/IsaacPlugin.hpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@
2525

2626
#include "plugins/ILightweightPlugin.hpp"
2727
#include "dataManagement/DataConnector.hpp"
28+
#include "static_assert.hpp"
29+
2830
#include <isaac.hpp>
31+
2932
#include <boost/fusion/container/list.hpp>
3033
#include <boost/fusion/include/list.hpp>
3134
#include <boost/fusion/container/list/list_fwd.hpp>
@@ -134,8 +137,14 @@ class TFieldSource< FieldTmpOperation< FrameSolver, ParticleType > >
134137
uint32_t* currentStep = (uint32_t*)pointer;
135138
const SubGrid<simDim>& subGrid = Environment< simDim >::get().SubGrid();
136139
DataConnector &dc = Environment< simDim >::get().DataConnector();
137-
FieldTmp * fieldTmp = &(dc.getData< FieldTmp > (FieldTmp::getName(), true));
140+
141+
PMACC_CASSERT_MSG(
142+
_please_allocate_at_least_one_FieldTmp_in_memory_param,
143+
fieldTmpNumSlots > 0
144+
);
145+
FieldTmp * fieldTmp = &(dc.getData< FieldTmp >( FieldTmp::getUniqueId( 0 ), true ));
138146
ParticleType * particles = &(dc.getData< ParticleType > ( ParticleType::FrameType::getName(), true));
147+
139148
fieldTmp->getGridBuffer().getDeviceBuffer().setValue( FieldTmp::ValueType(0.0) );
140149
fieldTmp->computeValue < CORE + BORDER, FrameSolver > (*particles, *currentStep);
141150
EventTask fieldTmpEvent = fieldTmp->asyncCommunication(__getTransactionEvent());

src/picongpu/include/plugins/adios/ADIOSWriter.hpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <vector>
2929

3030
#include "pmacc_types.hpp"
31+
#include "static_assert.hpp"
3132
#include "simulation_types.hpp"
3233
#include "plugins/adios/ADIOSWriter.def"
3334

@@ -232,7 +233,11 @@ class ADIOSWriter : public ILightweightPlugin
232233
/*## update field ##*/
233234

234235
/*load FieldTmp without copy data to host*/
235-
FieldTmp* fieldTmp = &(dc.getData<FieldTmp > (FieldTmp::getName(), true));
236+
PMACC_CASSERT_MSG(
237+
_please_allocate_at_least_one_FieldTmp_in_memory_param,
238+
fieldTmpNumSlots > 0
239+
);
240+
FieldTmp* fieldTmp = &(dc.getData<FieldTmp > (FieldTmp::getUniqueId( 0 ), true));
236241
/*load particle without copy particle data to host*/
237242
Species* speciesTmp = &(dc.getData<Species >(Species::FrameType::getName(), true));
238243

@@ -259,7 +264,7 @@ class ADIOSWriter : public ILightweightPlugin
259264
getName(),
260265
fieldTmp->getHostDataBox().getPointer());
261266

262-
dc.releaseData(FieldTmp::getName());
267+
dc.releaseData( FieldTmp::getUniqueId( 0 ) );
263268

264269
}
265270

src/picongpu/include/plugins/hdf5/WriteFields.hpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#pragma once
2323

2424
#include "pmacc_types.hpp"
25+
#include "static_assert.hpp"
2526
#include "simulation_types.hpp"
2627
#include "plugins/hdf5/HDF5Writer.def"
2728
#include "plugins/hdf5/writer/Field.hpp"
@@ -170,7 +171,11 @@ class WriteFields<FieldTmpOperation<Solver, Species> >
170171
/*## update field ##*/
171172

172173
/*load FieldTmp without copy data to host*/
173-
FieldTmp* fieldTmp = &(dc.getData<FieldTmp > (FieldTmp::getName(), true));
174+
PMACC_CASSERT_MSG(
175+
_please_allocate_at_least_one_FieldTmp_in_memory_param,
176+
fieldTmpNumSlots > 0
177+
);
178+
FieldTmp* fieldTmp = &(dc.getData<FieldTmp >( FieldTmp::getUniqueId( 0 ), true ));
174179
/*load particle without copy particle data to host*/
175180
Species* speciesTmp = &(dc.getData<Species >(Species::FrameType::getName(), true));
176181

@@ -210,7 +215,7 @@ class WriteFields<FieldTmpOperation<Solver, Species> >
210215
fieldTmp->getHostDataBox(),
211216
ValueType());
212217

213-
dc.releaseData(FieldTmp::getName());
218+
dc.releaseData( FieldTmp::getUniqueId( 0 ) );
214219

215220
}
216221

0 commit comments

Comments
 (0)