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 ); }
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); }