#include "ConditionalEstimator.h" #include "ElInfo.h" #include "PartitionElementData.h" #include "Element.h" #include "Traverse.h" #include "mpi.h" namespace AMDiS { ConditionalEstimator::ConditionalEstimator(Estimator* decorated) : decoratedEstimator_(decorated), elementCount_(0), row_(decorated ? decorated->getRow() : 0) { FUNCNAME("ConditionalEstimator::ConditionalEstimator(Estimator* decorated)"); if (decorated!=NULL) { name = decorated->getName(); int swap; int retVal = Parameters::getGlobalParameter(0, name + "->estimate outer", "%d", &swap); if (retVal > 0) estimateOut = (bool)swap; else estimateOut = false; } } double ConditionalEstimator::estimate(double ts) { if (decoratedEstimator_) { double partition_sum = 0.0; elementCount_ = 0; decoratedEstimator_->init(ts); mesh = decoratedEstimator_->getMesh(); traverseFlag = decoratedEstimator_->getTraverseFlag(); TraverseStack stack; ElInfo *elInfo = stack.traverseFirst(mesh, -1, traverseFlag); while (elInfo) { PartitionElementData *elData = dynamic_cast (elInfo->getElement()->getElementData(PARTITION_ED)); TEST_EXIT_DBG(elInfo->getElement()->isLeaf())("element not leaf\n"); TEST_EXIT_DBG(elData)("no partition data on leaf element %d (rank %d)\n", elInfo->getElement()->getIndex(), MPI::COMM_WORLD.Get_rank()); PartitionStatus status = elData->getPartitionStatus(); if (status == IN || status == OVERLAP || (estimateOut && status==OUT)) decoratedEstimator_->estimateElement(elInfo); else elInfo->getElement()->setMark(0); elInfo = stack.traverseNext(elInfo); } elInfo = stack.traverseFirst(mesh, -1, traverseFlag); while (elInfo) { PartitionElementData *elData = dynamic_cast (elInfo->getElement()->getElementData(PARTITION_ED)); PartitionStatus status = elData->getPartitionStatus(); if (status == IN || status==OVERLAP || (estimateOut && status==OUT)) { elementCount_++; partition_sum += elInfo->getElement()->getEstimation(row_); } elInfo = stack.traverseNext(elInfo); } // !!! test !!! double total_sum = 0.0; MPI::COMM_WORLD.Allreduce(&partition_sum, &total_sum, 1, MPI_DOUBLE, MPI_SUM); decoratedEstimator_->setErrorSum(total_sum); double total_max = 0.0; est_max = decoratedEstimator_->getErrorMax(); MPI::COMM_WORLD.Allreduce(&est_max, &total_max, 1, MPI_DOUBLE, MPI_MAX); decoratedEstimator_->setErrorMax(total_max); decoratedEstimator_->exit(); est_sum = decoratedEstimator_->getErrorSum(); est_max = decoratedEstimator_->getErrorMax(); // !!! test !!! #if 0 decoratedEstimator_->exit(); est_sum = sqrt(partition_sum); //decoratedEstimator_->getErrorSum(); est_t_sum = decoratedEstimator_->getTimeEst(); est_max = decoratedEstimator_->getErrorMax(); #endif // MSG("rank %d , estimate %e (total %e) elements %d (total %d)\n", // MPI::COMM_WORLD.Get_rank(), est_sum, total_sum, // elementCount_, // mesh->getNumberOfLeaves()); return est_sum; } else { return 0.0; } } }