Example #1
0
bool Solution::FlagAMRRegionBasedOnSemiNorm(const vector <unsigned> &SolIndex,const double &AMRthreshold){

  vector <double> GradSolMax(SolIndex.size());
  vector <unsigned> SolType(SolIndex.size());
  vector <unsigned> SolEndInd(SolIndex.size());
  unsigned dim=_msh->GetDimension();

  unsigned nel= _msh->GetNumberOfElements();

  for (unsigned k=0; k<SolIndex.size(); k++) {

    if(SolType[k]<3){

      SolType[k] = _SolType[SolIndex[k]];

      BuildGradMatrixStructure(SolType[k]);

      GradSolMax[k]=0.;
      for(int i=0;i<dim;i++){

	if(_GradVec[SolIndex[k]][i]==0){
	  _GradVec[SolIndex[k]][i] = NumericVector::build().release();
	  if(n_processors()==1) { // IF SERIAL
	    _GradVec[SolIndex[k]][i]->init(_msh->MetisOffset[3][n_processors()],_msh->own_size[3][processor_id()],false,SERIAL);
	  }
	  else { //discontinuous pressure has no ghost nodes
	    _GradVec[SolIndex[k]][i]->init(_msh->MetisOffset[3][n_processors()],_msh->own_size[3][processor_id()],false,PARALLEL);

	  }
	}

	_GradVec[SolIndex[k]][i]->matrix_mult(*_Sol[SolIndex[k]],*_GradMat[SolType[k]][i]);
	double GradSolMaxi=_GradVec[SolIndex[k]][i]->linfty_norm();
	GradSolMax[k] =GradSolMaxi*GradSolMaxi;
	_GradVec[SolIndex[k]][i]->close();
	_GradVec[SolIndex[k]][i]->matrix_mult(*_Eps[SolIndex[k]],*_GradMat[SolType[k]][i]);
      }
      GradSolMax[k]=AMRthreshold*(GradSolMax[k]);
    }
  }

  Solution* AMR = _msh->_coordinate;
  unsigned  AMRIndex= AMR->GetIndex("AMR");

  AMR->_Sol[AMRIndex]->zero();

  NumericVector *counter_vec;
  counter_vec = NumericVector::build().release();

  if(_nprocs==1) {
    counter_vec->init(_nprocs,1,false,SERIAL);
  }
  else {
    counter_vec->init(_nprocs,1,false,PARALLEL);
  }
  counter_vec->zero();

  for (int iel_metis=_msh->IS_Mts2Gmt_elem_offset[_iproc]; iel_metis < _msh->IS_Mts2Gmt_elem_offset[_iproc+1]; iel_metis++) {

    for (unsigned k=0; k<SolIndex.size(); k++) {

      if(SolType[k]<3){
	double value=0.;
	for(int i=0;i<dim;i++){
	  double valuei = (*_GradVec[SolIndex[k]][i])(iel_metis);
	  value+=valuei*valuei;
	}
	value=sqrt(value);
	if(fabs(value)>GradSolMax[k]){
	  counter_vec->add(_iproc,1.);
	  AMR->_Sol[AMRIndex]->set(iel_metis,1.);
	  k=SolIndex.size();
	}
      }
    }
  }
  AMR->_Sol[AMRIndex]->close();

  counter_vec->close();
  double counter=counter_vec->l1_norm();
  bool test=(counter<=_nprocs)?1:0;

  return test;
}
Example #2
0
bool Solution::FlagAMRRegionBasedOnl2(const vector <unsigned> &SolIndex,const double &AMRthreshold){

  vector <double> SolMax(SolIndex.size());
  vector <unsigned> SolType(SolIndex.size());
  vector <unsigned> SolEndInd(SolIndex.size());

  unsigned END_IND[5]= {0,1,1,4,5};

  for (unsigned k=0; k<SolIndex.size(); k++) {
    double EPSMAX = _AMREps[SolIndex[k]]->linfty_norm ();
    double SOLMAX = _Sol[SolIndex[k]]->linfty_norm ();
    cout << "Current maximum relative change = " <<EPSMAX/SOLMAX << endl << endl;
    SolMax[k] = AMRthreshold * SOLMAX;
    SolType[k] = _SolType[SolIndex[k]];
    SolEndInd[k]   = END_IND[SolType[k]];
  }

  Solution* AMR = _msh->_coordinate;
  unsigned  AMRIndex= AMR->GetIndex("AMR");
  AMR->_Sol[AMRIndex]->zero();

  unsigned nel= _msh->GetNumberOfElements();

  NumericVector *counter_vec;
  counter_vec = NumericVector::build().release();

  if(_nprocs==1) {
    counter_vec->init(_nprocs,1,false,SERIAL);
  }
  else {
    counter_vec->init(_nprocs,1,false,PARALLEL);
  }
  counter_vec->zero();

  for (int iel_metis=_msh->IS_Mts2Gmt_elem_offset[_iproc]; iel_metis < _msh->IS_Mts2Gmt_elem_offset[_iproc+1]; iel_metis++) {

    unsigned kel = _msh->IS_Mts2Gmt_elem[iel_metis];
    short unsigned kelt=_msh->el->GetElementType(kel);

    for (unsigned k=0; k<SolIndex.size(); k++) {

      if(SolType[k]<3){

      unsigned nve=_msh->el->GetElementDofNumber(kel,SolEndInd[k]);
      for(unsigned i=0; i<nve; i++) {
	unsigned inode=(SolType[k]<3)?(_msh->el->GetElementVertexIndex(kel,i)-1u):(kel+i*nel);
	unsigned inode_metis=_msh->GetMetisDof(inode,SolType[k]);
	double value = (*_AMREps[SolIndex[k]])(inode_metis);
	if(fabs(value)>SolMax[k]){
	  counter_vec->add(_iproc,1.);
	  AMR->_Sol[AMRIndex]->set(iel_metis,1.);
	  k=SolIndex.size();
	  i=nve;
	}
      }
    }
    }
  }
  AMR->_Sol[AMRIndex]->close();

  counter_vec->close();
  double counter=counter_vec->l1_norm();
  bool test=(counter<=_nprocs)?1:0;

  delete counter_vec;
  return test;

}