void peano::applications::poisson::multigrid::mappings::SpacetreeGrid2SetupExperiment::createInnerVertex(
  peano::applications::poisson::multigrid::SpacetreeGridVertex&               fineGridVertex,
  const tarch::la::Vector<DIMENSIONS,double>&                                 fineGridX,
  const tarch::la::Vector<DIMENSIONS,double>&                                 fineGridH,
  peano::applications::poisson::multigrid::SpacetreeGridVertex const * const  coarseGridVertices,
  const peano::kernel::gridinterface::VertexEnumerator&                       coarseGridVerticesEnumerator,
  const peano::applications::poisson::multigrid::SpacetreeGridCell&           coarseGridCell,
  const tarch::la::Vector<DIMENSIONS,int>&                                    fineGridPositionOfVertex
) {
  logTraceInWith6Arguments( "createInnerVertex(...)", fineGridVertex, fineGridX, fineGridH, coarseGridVerticesEnumerator.toString(), coarseGridCell, fineGridPositionOfVertex );
//  if (tarch::la::volume(fineGridH) > _refinementThreshold) {
//    fineGridVertex.refine();
//  }

  if (coarseGridVerticesEnumerator.getLevel() < 3) {
    fineGridVertex.refine();
  }

  peano::toolbox::stencil::Stencil stencil;

  #ifdef Dim2
  //if(fineGridVertex.getLevel() == 4){
  stencil =
//    kappa_x *
    peano::toolbox::stencil::StencilFactory::stencilProduct(
      peano::toolbox::stencil::StencilFactory::get1DLaplaceStencil(fineGridH(0)),
      peano::toolbox::stencil::StencilFactory::get1DMassStencil(fineGridH(1))
    ) +
//    kappa-y *
    peano::toolbox::stencil::StencilFactory::stencilProduct(
      peano::toolbox::stencil::StencilFactory::get1DMassStencil(fineGridH(0)),
      peano::toolbox::stencil::StencilFactory::get1DLaplaceStencil(fineGridH(1))
    );
  assertionNumericalEquals(stencil(0), -1.0/3.0);
  assertionNumericalEquals(stencil(1), -1.0/3.0);
  assertionNumericalEquals(stencil(2), -1.0/3.0);
  assertionNumericalEquals(stencil(3), -1.0/3.0);
  assertionNumericalEquals(stencil(4),  8.0/3.0);
  assertionNumericalEquals(stencil(5), -1.0/3.0);
  assertionNumericalEquals(stencil(6), -1.0/3.0);
  assertionNumericalEquals(stencil(7), -1.0/3.0);
  assertionNumericalEquals(stencil(8), -1.0/3.0);

  #if defined(Asserts)
  peano::toolbox::stencil::ElementMatrix elementMatrix;
  peano::toolbox::stencil::ElementWiseAssemblyMatrix testMatrix = elementMatrix.getElementWiseAssemblyMatrix( stencil );

  assertionNumericalEquals(testMatrix(0,0),  2.0/3.0);
  assertionNumericalEquals(testMatrix(0,1), -0.5/3.0);
  assertionNumericalEquals(testMatrix(0,2), -0.5/3.0);
  assertionNumericalEquals(testMatrix(0,3), -1.0/3.0);

  assertionNumericalEquals(testMatrix(1,0), -0.5/3.0);
  assertionNumericalEquals(testMatrix(1,1),  2.0/3.0);
  assertionNumericalEquals(testMatrix(1,2), -1.0/3.0);
  assertionNumericalEquals(testMatrix(1,3), -0.5/3.0);

  assertionNumericalEquals(testMatrix(2,0), -0.5/3.0);
  assertionNumericalEquals(testMatrix(2,1), -1.0/3.0);
  assertionNumericalEquals(testMatrix(2,2),  2.0/3.0);
  assertionNumericalEquals(testMatrix(2,3), -0.5/3.0);

  assertionNumericalEquals(testMatrix(3,0), -1.0/3.0);
  assertionNumericalEquals(testMatrix(3,1), -0.5/3.0);
  assertionNumericalEquals(testMatrix(3,2), -0.5/3.0);
  assertionNumericalEquals(testMatrix(3,3),  2.0/3.0);

  //logDebug( "createInnerVertex(...)", testMatrix );
  #endif
//  tarch::la::assignList(stencil) = -1.0/3.0, -1.0/3.0, -1.0/3.0, -1.0/3.0, 8.0/3.0, -1.0/3.0, -1.0/3.0, -1.0/3.0, -1.0/3.0;
  //}
  //else{
  //  tarch::la::assignList(stencil) = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0;
  //}

  fineGridVertex.setStencil(stencil);

//  double squaredDistanceFromCenter = 0.0;
//  for (int d=0; d<DIMENSIONS; d++) {
//    squaredDistanceFromCenter += (0.5 - fineGridX(d)) * (0.5 - fineGridX(d));
//  }
//  if (squaredDistanceFromCenter<0.24*0.24) {
//    stencil *= 4.2;
//  }

  peano::toolbox::stencil::ProlongationMatrix prolongation;
  tarch::la::assignList(prolongation) = 1.0/9.0, 2.0/9.0, 3.0/9.0, 2.0/9.0, 1.0/9.0,
                                        2.0/9.0, 4.0/9.0, 6.0/9.0, 4.0/9.0, 2.0/9.0,
                                        3.0/9.0, 6.0/9.0, 9.0/9.0, 6.0/9.0, 3.0/9.0,
                                        2.0/9.0, 4.0/9.0, 6.0/9.0, 4.0/9.0, 2.0/9.0,
                                        1.0/9.0, 2.0/9.0, 3.0/9.0, 2.0/9.0, 1.0/9.0;
  fineGridVertex.setP(prolongation);

  peano::toolbox::stencil::RestrictionMatrix restriction;
  tarch::la::assignList(restriction) = 1.0/9.0, 2.0/9.0, 3.0/9.0, 2.0/9.0, 1.0/9.0,
                                       2.0/9.0, 4.0/9.0, 6.0/9.0, 4.0/9.0, 2.0/9.0,
                                       3.0/9.0, 6.0/9.0, 9.0/9.0, 6.0/9.0, 3.0/9.0,
                                       2.0/9.0, 4.0/9.0, 6.0/9.0, 4.0/9.0, 2.0/9.0,
                                       1.0/9.0, 2.0/9.0, 3.0/9.0, 2.0/9.0, 1.0/9.0;
  fineGridVertex.setR(restriction);

  fineGridVertex.setRhs(1.0, fineGridH);

  #else
  assertionMsg( false, "not implemented yet" );
  #endif

  logTraceOutWith1Argument( "createInnerVertex(...)", fineGridVertex );
}
Esempio n. 2
0
void peanoclaw::interSubgridCommunication::GridLevelTransfer::finalizeVirtualSubgrid(
  Patch&                               subgrid,
  peanoclaw::Vertex * const            fineGridVertices,
  const peano::grid::VertexEnumerator& fineGridVerticesEnumerator,
  bool                                 isPeanoCellLeaf
) {
  tarch::multicore::Lock lock(_virtualPatchListSemaphore);
  assertion1(_virtualPatchDescriptionIndices.size() >= 0, subgrid.toString());

  tarch::la::Vector<DIMENSIONS_PLUS_ONE, double> virtualSubgridKey = createVirtualSubgridKey(subgrid.getPosition(), subgrid.getLevel());
  int virtualPatchDescriptionIndex = _virtualPatchDescriptionIndices[virtualSubgridKey];
  _virtualPatchDescriptionIndices.erase(virtualSubgridKey);
//  _virtualPatchTimeConstraints.erase(virtualSubgridKey);
  CellDescription& virtualPatchDescription = CellDescriptionHeap::getInstance().getData(virtualPatchDescriptionIndex).at(0);
  Patch virtualPatch(virtualPatchDescription);

  //Assert that we're working on the correct virtual patch
  assertionEquals3(subgrid.getCellDescriptionIndex(), virtualPatchDescriptionIndex, subgrid, virtualPatch, _virtualPatchDescriptionIndices.size());
  assertionNumericalEquals(subgrid.getPosition(), virtualPatch.getPosition());
  assertionNumericalEquals(subgrid.getSize(), virtualPatch.getSize());
  assertionEquals(subgrid.getLevel(), virtualPatch.getLevel());
  assertionEquals(subgrid.getUIndex(), virtualPatch.getUIndex());
//    assertionEquals(finePatch.getUOldIndex(), virtualPatch.getUOldIndex());

  #ifndef PEANOCLAW_USE_ASCEND_FOR_RESTRICTION
  _numerics.postProcessRestriction(subgrid, !subgrid.willCoarsen());
  #endif

  //Fill ghostlayer
  for(int i = 0; i < TWO_POWER_D; i++) {
    fineGridVertices[fineGridVerticesEnumerator(i)].fillAdjacentGhostLayers(
      subgrid.getLevel(),
      _useDimensionalSplitting,
      _numerics,
      #ifdef PEANOCLAW_USE_ASCEND_FOR_RESTRICTION
      tarch::la::multiplyComponents(peano::utils::dDelinearised(i, 2).convertScalar<double>(), subgrid.getSize()) + subgrid.getPosition(),
      #else
      fineGridVerticesEnumerator.getVertexPosition(i),
      #endif
      _subgridStatistics
    );
  }

  //Switch to leaf or non-virtual
  if(isPeanoCellLeaf) {
    assertion1(tarch::la::greaterEquals(subgrid.getTimeIntervals().getTimestepSize(), 0.0), subgrid);
    subgrid.switchToLeaf();
    _numerics.update(subgrid);
    ParallelSubgrid parallelSubgrid(subgrid);
    parallelSubgrid.markCurrentStateAsSent(false);
  } else {
    if(!isPatchAdjacentToRemoteRank(
      fineGridVertices,
      fineGridVerticesEnumerator
    )) {
      subgrid.switchToNonVirtual();
    }
  }

  assertion1(!subgrid.isVirtual()
    || isPatchAdjacentToRemoteRank(
        fineGridVertices,
        fineGridVerticesEnumerator),
    subgrid);
}