46 ArrayMap::const_iterator pos =
_arrays.find(&s);
49 return const_cast<Field&>(*this)._create(s);
55 ArrayMap::iterator pos =
_arrays.find(&s);
127 vector<const StorageSite*>& childSites = *
_childSitesMap[parentSite];
128 childSites.push_back(&s);
134 e <<
"Field::operator[] No array found and no creator defined for "
140 shared_ptr<IContainer>
145 foreach(
const ArrayMap::value_type& pos,
_arrays)
147 c->addArray(*(pos.first),
148 dynamic_pointer_cast<ArrayBase>(pos.second->newClone()));
154 shared_ptr<IContainer>
158 foreach(
const ArrayMap::value_type& pos,
_arrays)
160 c->addArray(*(pos.first),
161 dynamic_pointer_cast<ArrayBase>(pos.second->newCopy()));
170 foreach(ArrayMap::value_type& pos,
_arrays)
179 foreach(ArrayMap::value_type& pos,
_arrays)
181 *pos.second = oField[*pos.first];
189 const Field& other =
dynamic_cast<const Field&
>(oc);
201 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap)
220 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap)
240 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap)
244 const Array<int>& fromIndices = *(mpos.second);
250 thisArray.
scatter(ghostArray,fromIndices);
263 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap)
267 const Array<int>& fromIndices = *(mpos.second);
273 thisArray.
scatter(ghostArray,fromIndices);
286 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap)
295 e <<
"Field::syncScatter: ghost array not found for"
301 thisArray.
gather(ghostArray,toIndices);
313 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap)
322 e <<
"Field::syncScatter: ghost array not found for"
328 thisArray.
gather(ghostArray,toIndices);
337 foreach(ArrayMap::value_type& pos,
_arrays)
340 foreach(ArrayMap::value_type& pos,
_arrays)
349 foreach(ArrayMap::value_type& pos,
_arrays){
352 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
358 if ( to_where != -1 ){
359 int mpi_tag = oSite.
getTag();
360 request_send[indxSend++] =
361 MPI::COMM_WORLD.Isend( sendArray.
getData(), sendArray.
getDataSize(), MPI::BYTE, to_where, mpi_tag );
367 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
373 if ( from_where != -1 ){
374 int mpi_tag = oSite.
getTag();
375 request_recv[indxRecv++] =
376 MPI::COMM_WORLD.Irecv( recvArray.
getData(), recvArray.
getDataSize(), MPI::BYTE, from_where, mpi_tag );
382 MPI::Request::Waitall( count, request_recv );
383 MPI::Request::Waitall( count, request_send );
387 foreach(ArrayMap::value_type& pos,
_arrays)
400 foreach(ArrayMap::value_type& pos,
_arrays){
403 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
421 foreach(ArrayMap::value_type& pos,
_arrays){
422 if ( pos.second->getLength() == pos.first->getCountLevel1() )
426 foreach(ArrayMap::value_type& pos,
_arrays){
427 if ( pos.second->getLength() == pos.first->getCountLevel1() )
435 MPI::Request request_send[ countScatter ];
436 MPI::Request request_recv[ countGather ];
439 foreach(ArrayMap::value_type& pos,
_arrays){
441 if ( pos.second->getLength() == pos.first->getCountLevel1() ){
443 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
449 if ( to_where != -1 ){
450 int mpi_tag = oSite.
getTag();
451 request_send[indxSend++] =
452 MPI::COMM_WORLD.Isend( sendArray.
getData(), sendArray.
getDataSize(), MPI::BYTE, to_where, mpi_tag );
458 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
464 if ( from_where != -1 ){
465 int mpi_tag = oSite.
getTag();
466 request_recv[indxRecv++] =
467 MPI::COMM_WORLD.Irecv( recvArray.
getData(), recvArray.
getDataSize(), MPI::BYTE, from_where, mpi_tag );
474 MPI::Request::Waitall( countGather, request_recv );
475 MPI::Request::Waitall( countScatter, request_send );
479 foreach(ArrayMap::value_type& pos,
_arrays){
480 if ( pos.second->getLength() == pos.first->getCountLevel1() )
489 foreach(ArrayMap::value_type& pos,
_arrays){
492 if ( pos.second->getLength() == pos.first->getCountLevel1() ){
493 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
509 foreach(ArrayMap::value_type& pos,
_arrays){
512 if ( pos.second->getLength() == pos.first->getCountLevel1() ){
513 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
535 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap)
540 if (ghostArrays.find(e) == ghostArrays.end())
555 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap)
560 if (ghostArrays.find(e) == ghostArrays.end())
572 const size_t numDir = dsf.size();
573 Field& field0 = *dsf[0];
579 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap)
583 const Array<int>& fromIndices = *(mpos.second);
584 if (ghostArrays.find(e) == ghostArrays.end()){
588 const int chunkSize = fromIndices.
getLength();
590 for (
size_t dir=0; dir < numDir; dir++){
591 Field& field = *dsf[dir];
592 const ArrayBase& thisArray = field[site];
593 const int offset = chunkSize * dir;
594 thisArray.
scatter(ghostArray,fromIndices, offset);
603 const size_t numDir = dsf.size();
604 Field& field0 = *dsf[0];
610 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap)
614 const Array<int>& fromIndices = *(mpos.second);
615 if (ghostArrays.find(e) == ghostArrays.end()){
619 const int chunkSize = fromIndices.
getLength();
621 for (
size_t dir=0; dir < numDir; dir++){
622 Field& field = *dsf[dir];
623 const ArrayBase& thisArray = field[site];
624 const int offset = chunkSize * dir;
625 thisArray.
scatter(ghostArray,fromIndices, offset);
636 const size_t numDir = dsf.size();
637 Field& field0 = *dsf[0];
642 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap)
648 if (ghostArrays.find(e) == ghostArrays.end())
651 e <<
"Field::syncScatter: ghost array not found for"
656 const ArrayBase& ghostArray = *ghostArrays[e];
657 const int chunkSize = toIndices.
getLength();
658 for (
size_t dir = 0; dir < numDir; dir++){
659 Field& field = *dsf[dir];
661 const size_t offset = dir * chunkSize;
662 thisArray.
gather(ghostArray,toIndices, offset);
671 const size_t numDir = dsf.size();
672 Field& field0 = *dsf[0];
677 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap)
683 if (ghostArrays.find(e) == ghostArrays.end())
686 e <<
"Field::syncScatter: ghost array not found for"
691 const ArrayBase& ghostArray = *ghostArrays[e];
692 const int chunkSize = toIndices.
getLength();
693 for (
size_t dir = 0; dir < numDir; dir++){
694 Field& field = *dsf[dir];
696 const size_t offset = dir * chunkSize;
697 thisArray.
gather(ghostArray,toIndices, offset);
705 Field& field0 = *dsf[0];
707 foreach(ArrayMap::value_type& pos, arrays)
710 const size_t numDir = dsf.size();
711 foreach(ArrayMap::value_type& pos, arrays)
722 foreach(ArrayMap::value_type& pos, arrays){
725 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
731 if ( to_where != -1 ){
732 int mpi_tag = oSite.
getTag();
733 request_send[indxSend++] =
734 MPI::COMM_WORLD.Isend( sendArray.
getData(), sendArray.
getDataSize(), MPI::BYTE, to_where, mpi_tag );
740 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
746 if ( from_where != -1 ){
747 int mpi_tag = oSite.
getTag();
748 request_recv[indxRecv++] =
749 MPI::COMM_WORLD.Irecv( recvArray.
getData(), recvArray.
getDataSize(), MPI::BYTE, from_where, mpi_tag );
755 MPI::Request::Waitall( count, request_recv );
756 MPI::Request::Waitall( count, request_send );
760 foreach(ArrayMap::value_type& pos, arrays)
773 Field& field0 = *dsf[0];
775 foreach(ArrayMap::value_type& pos, arrays){
776 if ( pos.second->getLength() == pos.first->getCountLevel1() )
780 const size_t numDir = dsf.size();
781 foreach(ArrayMap::value_type& pos, arrays){
782 if ( pos.second->getLength() == pos.first->getCountLevel1() )
794 foreach(ArrayMap::value_type& pos, arrays){
797 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
803 if ( to_where != -1 ){
804 int mpi_tag = oSite.
getTag();
805 request_send[indxSend++] =
806 MPI::COMM_WORLD.Isend( sendArray.
getData(), sendArray.
getDataSize(), MPI::BYTE, to_where, mpi_tag );
812 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
818 if ( from_where != -1 ){
819 int mpi_tag = oSite.
getTag();
820 request_recv[indxRecv++] =
821 MPI::COMM_WORLD.Irecv( recvArray.
getData(), recvArray.
getDataSize(), MPI::BYTE, from_where, mpi_tag );
827 MPI::Request::Waitall( count, request_recv );
828 MPI::Request::Waitall( count, request_send );
832 foreach(ArrayMap::value_type& pos, arrays){
833 if ( pos.second->getLength() == pos.first->getCountLevel1() )
847 foreach(ArrayMap::value_type& pos, arrays){
850 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
867 foreach(ArrayMap::value_type& pos, arrays){
870 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
virtual int getDataSize() const =0
virtual shared_ptr< ArrayBase > createOffsetArray(const int offset, const int size)=0
Field & operator=(const Field &oField)
Field(const string &name)
static void syncScatterVectorFields(const StorageSite &site, std::vector< Field * > &dsf)
static void syncGatherVectorFields(const StorageSite &site, std::vector< Field * > &dsf)
bool hasArray(const StorageSite &s) const
vector< const StorageSite * > StorageSiteList
virtual void scatter(ArrayBase &other_, const ArrayBase &indices, const int offset=0) const =0
ChildSitesMap _childSitesMap
pair< const StorageSite *, const StorageSite * > EntryIndex
const GatherMap & getGatherMapLevel1() const
const ScatterMap & getScatterMapLevel1() const
virtual shared_ptr< IContainer > newClone() const
static void createSyncGatherArraysVectorFields(const StorageSite &site, Field &field, const size_t numDir)
map< EntryIndex, shared_ptr< ArrayBase > > GhostArrayMap
void removeArray(const StorageSite &)
void syncScatter(const StorageSite &site)
static void syncGatherVectorFieldsLevel1(const StorageSite &site, std::vector< Field * > &dsf)
virtual void copyFrom(const IContainer &a)
static void syncLocalVectorFieldsLevel1(std::vector< Field * > &dsf)
static void createSyncGatherArraysVectorFieldsLevel1(const StorageSite &site, Field &field, const size_t numDir)
GhostArrayMap _ghostArraysLevel1
int getGatherProcID() const
void syncGather(const StorageSite &site)
void createSyncGatherArrays(const StorageSite &site)
const ArrayBase & operator[](const StorageSite &) const
GhostArrayMap _ghostArrays
GhostArrayMap & getGhostArrayMapLevel1()
const ScatterMap & getScatterMap() const
void addArray(const StorageSite &, shared_ptr< ArrayBase > a)
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
void syncScatterLevel1(const StorageSite &site)
virtual shared_ptr< ArrayBase > newSizedClone(const int size) const =0
int get_request_size_scatter_level1()
const StorageSite *const getParent() const
void syncGatherLevel1(const StorageSite &site)
const GatherMap & getGatherMap() const
int get_request_size_gather_level1()
static void syncLocalVectorFields(std::vector< Field * > &dsf)
virtual void * getData() const =0
virtual void gather(const ArrayBase &other_, const ArrayBase &indices, const int offset=0)=0
void createSyncGatherArraysLevel1(const StorageSite &site)
GhostArrayMap & getGhostArrayMap()
static void syncScatterVectorFieldsLevel1(const StorageSite &site, std::vector< Field * > &dsf)
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
ArrayBase & _create(const StorageSite &site)
map< const StorageSite *, shared_ptr< ArrayBase > > ArrayMap
shared_ptr< ArrayBase > getArrayPtr(const StorageSite &)
static int get_request_size_level1(Field &field)
virtual shared_ptr< IContainer > newCopy() const
void removeArrays(const StorageSiteList &sites)