00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "DataSource/FieldDataSource.h"
00028 #include "Field/Field.h"
00029 #include "Message/Communicate.h"
00030 #include "Utility/IpplInfo.h"
00031 #include "Profile/Profiler.h"
00032
00033
00035
00036
00037 template<class T, unsigned Dim, class M, class C>
00038 FieldDataSource<T,Dim,M,C>::FieldDataSource(const char *nm, DataConnect *dc,
00039 int tm, Field<T,Dim,M,C>& F)
00040 : DataSourceObject(nm, &F, dc, tm), MyField(F) {
00041
00042 }
00043
00044
00046
00047 template<class T, unsigned Dim, class M, class C>
00048 FieldDataSource<T,Dim,M,C>::~FieldDataSource() {
00049
00050 }
00051
00052
00054
00055 template<class T, unsigned Dim, class M, class C >
00056 void FieldDataSource<T,Dim,M,C>::gather_data(void) {
00057 TAU_TYPE_STRING(taustr, CT(*this) + " void ()" );
00058 TAU_PROFILE("FieldDataSource::gather_data()", taustr, TAU_VIZ);
00059
00060
00061 int n, tag = Ippl::Comm->next_tag(DS_FIELD_TAG, DS_CYCLE);
00062 unsigned N = Ippl::getNodes();
00063 unsigned myN = Ippl::myNode();
00064
00065
00066
00067
00068 typename Field<T,Dim,M,C>::iterator_if local = MyField.begin_if();
00069 typename Field<T,Dim,M,C>::iterator_if endvn = MyField.end_if();
00070 for ( ; local != endvn ; ++local) {
00071 for (n = 0; n < getConnection()->getNodes(); ++n) {
00072
00073 LField<T,Dim>& l = *((*local).second);
00074 NDIndex<Dim>& lo = (NDIndex<Dim>&) l.getOwned();
00075 typename LField<T,Dim>::iterator rhs = l.begin();
00076
00077
00078 if (n != myN) {
00079
00080 Message *mess = new Message();
00081 lo.putMessage(*mess);
00082 rhs.putMessage(*mess);
00083 Ippl::Comm->send(mess, n, tag);
00084 } else {
00085 insert_data(lo, rhs);
00086 }
00087 }
00088 }
00089
00090
00091 if (N > 1 && getConnection()->onConnectNode()) {
00092
00093 int remaining = MyField.getLayout().size_rdv();
00094
00095
00096 for ( ; remaining > 0; --remaining) {
00097
00098 int any_node = COMM_ANY_NODE;
00099 Message *mess = Ippl::Comm->receive_block(any_node, tag);
00100
00101
00102 NDIndex<Dim> localBlock;
00103 T lfdata;
00104 typename LField<T,Dim>::iterator rhs(lfdata);
00105 localBlock.getMessage(*mess);
00106 rhs.getMessage(*mess);
00107
00108
00109 insert_data(localBlock, rhs);
00110
00111
00112 delete mess;
00113 }
00114 }
00115 }
00116
00117
00118
00119
00120
00121