Exemplo n.º 1
0
void
getError(LevelData<EBCellFAB>&       a_error,
         const EBISLayout&           a_ebisl,
         const DisjointBoxLayout&    a_dbl,
         const Real&                 a_dx)
{
    EBCellFactory ebcellfact(a_ebisl);
    EBFluxFactory ebfluxfact(a_ebisl);
    a_error.define(a_dbl, 1, IntVect::Zero,   ebcellfact);
    LevelData<EBCellFAB> divFCalc(a_dbl, 1, IntVect::Zero,   ebcellfact);
    LevelData<EBCellFAB> divFExac(a_dbl, 1, IntVect::Zero,   ebcellfact);
    LevelData<EBFluxFAB> faceFlux(a_dbl, 1, IntVect::Zero,   ebfluxfact);

    for (DataIterator dit = a_dbl.dataIterator(); dit.ok(); ++dit)
    {
        a_error[dit()].setVal(0.);
        divFCalc[dit()].setVal(0.);
        divFExac[dit()].setVal(0.);
    }

    setToExactDivFLD(divFExac,  a_ebisl, a_dbl, a_dx);
    setToExactFluxLD(faceFlux,  a_ebisl, a_dbl, a_dx);

    Interval interv(0, 0);
    faceFlux.exchange(interv);

    kappaDivergenceLD(divFCalc, faceFlux, a_ebisl, a_dbl, a_dx);

    for (DataIterator dit = a_dbl.dataIterator(); dit.ok(); ++dit)
    {
        EBCellFAB& errorFAB = a_error[dit()];
        EBCellFAB& exactFAB = divFExac[dit()];
        EBCellFAB& calcuFAB = divFCalc[dit()];

        errorFAB += calcuFAB;
        errorFAB -= exactFAB;
    }
}
Exemplo n.º 2
0
EBCompositeCCProjector::
EBCompositeCCProjector(const Vector<EBLevelGrid>&                      a_eblg,
                       const Vector<int>&                              a_refRat,
                       const Vector<RefCountedPtr<EBQuadCFInterp> >&   a_quadCFI,
                       const RealVect&                                 a_coarsestDx,
                       const RealVect&                                 a_origin,
                       const RefCountedPtr<BaseDomainBCFactory>&       a_baseDomainBCVel,
                       const RefCountedPtr<BaseDomainBCFactory>&       a_baseDomainBCPhi,
                       const RefCountedPtr<BaseEBBCFactory>&           a_ebbcPhi,
                       const bool&                                     a_subtractOffMean,
                       const int&                                      a_numLevels,
                       const int&                                      a_verbosity,
                       const int&                                      a_numPreCondIters,
                       const Real&                                     a_time,
                       const int&                                      a_relaxType,
                       const int&                                      a_bottomSolverType,
                       EBCompositeMACProjector*                        a_inputMAC)
{
  CH_TIME("EBCompositeCCProjector::EBCompositeCCProjector");
  if (a_numLevels < 0)
    {
      m_numLevels = a_eblg.size();
    }
  else
    {
      CH_assert(a_numLevels <= a_eblg.size());
      m_numLevels = a_numLevels;
    }
  CH_assert(a_refRat.size() >= m_numLevels);

  m_eblg      = a_eblg;
  m_quadCFI   = a_quadCFI;
  m_refRat     = a_refRat;
  m_pwlCFI.resize(m_numLevels);
  int nvarquad = 1;
  int radius =1;
  for (int ilev = 1; ilev < m_numLevels; ilev++)
    {
      m_pwlCFI[ilev]  = RefCountedPtr<EBPWLFillPatch>(new  EBPWLFillPatch(m_eblg[ilev].getDBL(),
                                                                          m_eblg[ilev-1].getDBL(),
                                                                          m_eblg[ilev].getEBISL(),
                                                                          m_eblg[ilev-1].getEBISL(),
                                                                          m_eblg[ilev-1].getDomain(),
                                                                          m_refRat[ilev-1],
                                                                          nvarquad,
                                                                          radius,
                                                                          m_eblg[ilev].getEBISL().getEBIS()));
    }

  m_dx.resize(m_numLevels);
  m_dx[0]     = a_coarsestDx;
  for (int ilev = 1; ilev < m_numLevels; ilev++)
    {
      m_dx[ilev]     = m_dx[ilev-1]/m_refRat[ilev-1];
    }

  if (a_inputMAC != NULL)
    {
      m_macProjector = a_inputMAC;
      m_externMAC    = true;
    }
  else
    {
      m_externMAC    = false;
      m_macProjector = new EBCompositeMACProjector(a_eblg, a_refRat, a_quadCFI,
                                                   a_coarsestDx, a_origin,
                                                   a_baseDomainBCVel,
                                                   a_baseDomainBCPhi,
                                                   a_ebbcPhi,
                                                   a_subtractOffMean,
                                                   a_numLevels,
                                                   a_verbosity,
                                                   a_numPreCondIters,
                                                   a_time,
                                                   a_relaxType,
                                                   a_bottomSolverType);

      //default values
      int numSmooth = 4;
      int itermax = 77;
      int mgCycle = 1;
      Real hang = 1.0e-20;
      Real tolerance = 1.0e-12;
      Real normThresh= 1.0e-12;
      setSolverParams(numSmooth,  itermax, mgCycle, hang, tolerance, a_verbosity,normThresh);
    }

  m_macVelo.resize(m_numLevels, NULL);
  m_macGrad.resize(m_numLevels, NULL);

  for (int ilev = 0; ilev < m_numLevels; ilev++)
    {
      EBFluxFactory ebfluxfact(m_eblg[ilev].getEBISL());
      m_macVelo[ilev] = new LevelData<EBFluxFAB>(m_eblg[ilev].getDBL(), 1,   IntVect::Unit, ebfluxfact);
      m_macGrad[ilev] = new LevelData<EBFluxFAB>(m_eblg[ilev].getDBL(), 1, 2*IntVect::Unit, ebfluxfact);
    }
}
EBGradDivFilter::
EBGradDivFilter(const DisjointBoxLayout&                  a_gridsFine,
                const DisjointBoxLayout*                  a_gridsCoarPtr,
                const EBISLayout&                         a_ebislFine,
                const EBISLayout*                         a_ebislCoarPtr,
                const ProblemDomain&                      a_domainFine,
                const RealVect&                           a_dxFine,
                const int&                                a_refRat,
                const Real&                               a_lambdaScale,
                const EBIndexSpace* const                 a_ebisPtr)
{
  CH_TIME("EBGradDivFilter::EBGradDivFilter");
  m_gridsFine   =  a_gridsFine    ;
  m_gridsCoarPtr=  a_gridsCoarPtr ;
  m_ebislFine   =  a_ebislFine    ;
  m_eblgFine.define(m_gridsFine, m_ebislFine, m_domainFine);

  m_ebislCoarPtr=  a_ebislCoarPtr ;
  m_domainFine  =  a_domainFine   ;
  m_refRat      =  a_refRat       ;
  m_dxFine      =  a_dxFine;
  m_hasCoarser = (m_gridsCoarPtr != NULL);
  EBCellFactory ebcellfact(m_ebislFine);
  EBFluxFactory ebfluxfact(m_ebislFine);
  m_gradVel.define(m_gridsFine, SpaceDim*SpaceDim, IntVect::Unit, ebcellfact);
  m_lambda.define( m_gridsFine,                 1, IntVect::Zero, ebcellfact);
  m_faceDivCell.define(m_gridsFine,             1,4*IntVect::Unit, ebfluxfact);
  m_dropOrder.define( m_gridsFine);
  m_johanStencil.define(m_gridsFine);
  m_distanceAlongLine.define(m_gridsFine);

  for (DataIterator dit = m_gridsFine.dataIterator(); dit.ok(); ++dit)
    {
      BaseIVFAB<VoFStencil>& curJohanStencil      = m_johanStencil[dit()];
      BaseIVFAB<char>&       curDropOrder         = m_dropOrder[dit()];
      BaseIVFAB<Real>&       curDistanceAlongLine = m_distanceAlongLine[dit()];

      EBGraph ebgraph =  m_ebislFine[dit()].getEBGraph();
      IntVectSet ivsIrreg = m_ebislFine[dit()].getIrregIVS(m_gridsFine.get(dit()));
      curJohanStencil.define(     ivsIrreg,ebgraph, 2);
      curDistanceAlongLine.define(ivsIrreg,ebgraph, 2);
      curDropOrder.define(        ivsIrreg,ebgraph, 1);

      for (VoFIterator vofit(ivsIrreg, ebgraph); vofit.ok(); ++vofit)
        {
          Vector<VoFStencil> pointStencils;
          Vector<Real>       distanceAlongLine;
          bool dropOrder = false;
          EBArith::johanStencil(dropOrder,
                                pointStencils,
                                distanceAlongLine,
                                vofit(), m_ebislFine[dit()], m_dxFine,
                                (*m_eblgFine.getCFIVS())[dit()]);

          curDropOrder(vofit(), 0) = dropOrder;
          if (!dropOrder)
            {
              for (int ipoint = 0; ipoint < 2; ipoint++)
                {
                  curJohanStencil(vofit(), ipoint)      = pointStencils[ipoint];
                  curDistanceAlongLine(vofit(), ipoint) = distanceAlongLine[ipoint];
                }
            }
        }
    }
  m_tensorCFI  = NULL;
  if (m_hasCoarser)
    {
      Real dx = a_dxFine[0];
      m_domainCoar  =  coarsen(m_domainFine, m_refRat);
      m_tensorCFI= new EBTensorCFInterp(m_gridsFine, *m_gridsCoarPtr,
                                        m_ebislFine, *m_ebislCoarPtr,
                                        m_domainCoar, m_refRat, SpaceDim, dx,
                                        *m_eblgFine.getCFIVS(), a_ebisPtr);

    }

  m_lambdaScale = a_lambdaScale;
  fillLambda();
}