void PointwiseAvg::Observe(const DataBox& box, const double /* TimeForDumpFiles */, const std::string& FirstColumnInDatFiles) const { const DataBoxAccess boxA(box,"Observers::PointwiseAvg::Observe"); const Domain& D = boxA.Get<Domain>("Domain"); // avg stores the total until dividing by numPoints double avg = 0.0; int numPoints = 0; for(int sd=0;sd<D.Size();++sd) { const Tensor<DataMesh>& Input = boxA[sd].Get<Tensor<DataMesh> >(mInput); for(Tensor<DataMesh>::const_iterator it = Input.begin(); it != Input.end(); it++) { numPoints += (*it).Size(); for (int j = 0; j < (*it).Size(); j++) avg += (*it)[j]; } } avg = MPreduceAdd(avg,D.Communicator()); numPoints = MPreduceAdd(numPoints,D.Communicator()); avg /= numPoints; // Output the norm if(D.Communicator().Rank()==0) { std::ofstream out(mFileName.c_str(),std::ios::app); out << FirstColumnInDatFiles << " " << avg << std::endl; } }
void PointwiseAvgIlana::Observe(const DataBox& box, const double /* TimeForDumpFiles */, const std::string& FirstColumnInDatFiles) const { DataBoxAccess boxA(box, "Observers::PointwiseAvgIlana::Observe"); const Domain& D = boxA.Get<Domain>("Domain"); // find total of points in domain, and number of points double sum = 0.0; int numpts = 0; for(int sd=0;sd<D.Size();++sd) { const Tensor<DataMesh>& Input = boxA[sd].Get<Tensor<DataMesh> >(mInput); for(Tensor<DataMesh>::const_iterator i=Input.begin();i!=Input.end();++i) { for(int j=0;j<(*i).Size();++j) sum += (*i)[j]; // asterisk means a pointer to i numpts += (*i).Size(); } } sum = MPreduceAdd(sum,D.Communicator()); numpts = MPreduceAdd(numpts,D.Communicator()); // Output the average if(D.Communicator().Rank()==0) { std::ofstream out(mFileName.c_str(),std::ios::app); out << FirstColumnInDatFiles << " " << sum/numpts << std::endl; } }