Skip to content
Snippets Groups Projects
Forked from iwr / amdis
1671 commits behind the upstream repository.
ConditionalMarker.cc 2.24 KiB
#include "ConditionalMarker.h"

namespace AMDiS
{
  ConditionalMarker::ConditionalMarker(const std::string name_,
				       int row,
				       Marker *decoratedMarker,
				       int globalCoarseGridLevel,
				       int localCoarseGridLevel)
    : Marker(name_, row), 
      decoratedMarker_(decoratedMarker),
      globalCoarseGridLevel_(globalCoarseGridLevel),    
      localCoarseGridLevel_(localCoarseGridLevel)
  {
    if (decoratedMarker != NULL)
      name = decoratedMarker->getName();
    else
      std::cout << "no decorated Marker, mark outer path is" << name << "->mark outer" << std::endl;
    
    int swap;      
    int retVal = Parameters::getGlobalParameter(0, name + "->mark outer", "%d", &swap);

    if (retVal>0)
      markOuter = (bool)swap;
    else
      markOuter = false;

    MSG("markOuter:" + markOuter);
  }

  void ConditionalMarker::initMarking(AdaptInfo *adaptInfo, Mesh *mesh) 
  {
    if (decoratedMarker_) 
      decoratedMarker_->initMarking(adaptInfo, mesh);
  }

  void ConditionalMarker::finishMarking(AdaptInfo *adaptInfo)
  {
    if (decoratedMarker_) {
      int tmp = decoratedMarker_->getElMarkRefine();
      MPI::COMM_WORLD.Allreduce(&tmp,
				&elMarkRefine,
				1,
				MPI_INT,
				MPI_SUM);
      tmp = decoratedMarker_->getElMarkCoarsen();
      MPI::COMM_WORLD.Allreduce(&tmp,
				&elMarkCoarsen,
				1,
				MPI_INT,
				MPI_SUM);
      decoratedMarker_->finishMarking(adaptInfo);
    }
  }


  void ConditionalMarker::markElement(AdaptInfo *adaptInfo, ElInfo *elInfo) 
  {
    FUNCNAME("ConditionalMarker::markElement()");

    if (decoratedMarker_) {
      PartitionElementData *elData = 
	dynamic_cast<PartitionElementData*>(elInfo->getElement()->
					    getElementData(PARTITION_ED));

      TEST_EXIT_DBG(elData)("no partition data\n");

      decoratedMarker_->markElement(adaptInfo, elInfo);

      if (!markOuter && elData->getPartitionStatus() == OUT) {
	Element *element = elInfo->getElement();
	if (element->getMark() > 0)
	  element->setMark(0);	  
      }

      int minLevel = 
	elData->getPartitionStatus() != OUT ? 
	localCoarseGridLevel_ :
	globalCoarseGridLevel_;

      if (elData->getLevel() + elInfo->getElement()->getMark() < minLevel)
	elInfo->getElement()->setMark(-(elData->getLevel() - minLevel));
    }
  }
}