void peanoclaw::mappings::ValidateGrid::mergeWithMaster( const peanoclaw::Cell& workerGridCell, peanoclaw::Vertex * const workerGridVertices, const peano::grid::VertexEnumerator& workerEnumerator, peanoclaw::Cell& fineGridCell, peanoclaw::Vertex * const fineGridVertices, const peano::grid::VertexEnumerator& fineGridVerticesEnumerator, peanoclaw::Vertex * const coarseGridVertices, const peano::grid::VertexEnumerator& coarseGridVerticesEnumerator, peanoclaw::Cell& coarseGridCell, const tarch::la::Vector<DIMENSIONS,int>& fineGridPositionOfCell, int worker, const peanoclaw::State& workerState, peanoclaw::State& masterState ) { logTraceIn( "mergeWithMaster(...)" ); std::vector<PatchDescription> remoteData = PatchDescriptionHeap::getInstance().receiveData( worker, fineGridVerticesEnumerator.getVertexPosition(0), fineGridVerticesEnumerator.getLevel(), peano::heap::MasterWorkerCommunication ); std::vector<PatchDescription>& localData = PatchDescriptionHeap::getInstance().getData(_patchDescriptionsIndex); localData.insert(localData.end(), remoteData.begin(), remoteData.end()); logInfo("mergeWithMaster(...)", "Merged " << remoteData.size() << " patches: " << PatchDescriptionHeap::getInstance().getData(_patchDescriptionsIndex).size() << " entries."); logTraceOut( "mergeWithMaster(...)" ); }
void peanoclaw::mappings::ValidateGrid::destroyCell( const peanoclaw::Cell& fineGridCell, peanoclaw::Vertex * const fineGridVertices, const peano::grid::VertexEnumerator& fineGridVerticesEnumerator, peanoclaw::Vertex * const coarseGridVertices, const peano::grid::VertexEnumerator& coarseGridVerticesEnumerator, peanoclaw::Cell& coarseGridCell, const tarch::la::Vector<DIMENSIONS,int>& fineGridPositionOfCell ) { logTraceInWith4Arguments( "destroyCell(...)", fineGridCell, fineGridVerticesEnumerator.toString(), coarseGridCell, fineGridPositionOfCell ); //TODO unterweg debug // std::cout<< "Destroying cell " << fineGridVerticesEnumerator.getVertexPosition(0) << ", " // << fineGridVerticesEnumerator.getCellSize() // << ", index=" << fineGridCell.getCellDescriptionIndex() // #ifdef Parallel // << ", rank=" << tarch::parallel::Node::getInstance().getRank() // #endif // << std::endl; _validator.deletePatchIfNotRemote( fineGridVerticesEnumerator.getVertexPosition(0), fineGridVerticesEnumerator.getLevel() ); logTraceOutWith1Argument( "destroyCell(...)", fineGridCell ); }
void peanoclaw::mappings::ValidateGrid::destroyHangingVertex( const peanoclaw::Vertex& fineGridVertex, const tarch::la::Vector<DIMENSIONS,double>& fineGridX, const tarch::la::Vector<DIMENSIONS,double>& fineGridH, peanoclaw::Vertex * const coarseGridVertices, const peano::grid::VertexEnumerator& coarseGridVerticesEnumerator, peanoclaw::Cell& coarseGridCell, const tarch::la::Vector<DIMENSIONS,int>& fineGridPositionOfVertex ) { logTraceInWith6Arguments( "destroyHangingVertex(...)", fineGridVertex, fineGridX, fineGridH, coarseGridVerticesEnumerator.toString(), coarseGridCell, fineGridPositionOfVertex ); if(tarch::la::allGreaterEquals(fineGridX, _domainOffset) && tarch::la::allGreaterEquals(_domainOffset+_domainSize, fineGridX)) { _validator.findAdjacentPatches( fineGridVertex, fineGridX, coarseGridVerticesEnumerator.getLevel() + 1, #ifdef Parallel tarch::parallel::Node::getInstance().getRank() #else 0 #endif ); } logTraceOutWith1Argument( "destroyHangingVertex(...)", fineGridVertex ); }
void peanoclaw::mappings::ValidateGrid::destroyVertex( const peanoclaw::Vertex& fineGridVertex, const tarch::la::Vector<DIMENSIONS,double>& fineGridX, const tarch::la::Vector<DIMENSIONS,double>& fineGridH, peanoclaw::Vertex * const coarseGridVertices, const peano::grid::VertexEnumerator& coarseGridVerticesEnumerator, peanoclaw::Cell& coarseGridCell, const tarch::la::Vector<DIMENSIONS,int>& fineGridPositionOfVertex ) { logTraceInWith6Arguments( "destroyVertex(...)", fineGridVertex, fineGridX, fineGridH, coarseGridVerticesEnumerator.toString(), coarseGridCell, fineGridPositionOfVertex ); //TODO unterweg debug // std::cout<< "Destroying vertex " << fineGridX << ", " // << fineGridH // << ", level=" << (coarseGridVerticesEnumerator.getLevel()+1) // #ifdef Parallel // << ", rank=" << tarch::parallel::Node::getInstance().getRank() // #endif // << fineGridVertex.toString() // << std::endl; //We need to call this method here, since it seems that touchVertexLastTime //is not called in the iteration where a vertex is destroyed. _validator.findAdjacentPatches( fineGridVertex, fineGridX, coarseGridVerticesEnumerator.getLevel() + 1, #ifdef Parallel tarch::parallel::Node::getInstance().getRank() #else 0 #endif ); // if(fineGridVertex.isRemote(_state, true, true)) { // _validator.deleteNonRemoteAdjacentPatches( // fineGridVertex, // fineGridX, // coarseGridVerticesEnumerator.getLevel() + 1, // #ifdef Parallel // tarch::parallel::Node::getInstance().getRank() // #else // 0 // #endif // ); // } logTraceOutWith1Argument( "destroyVertex(...)", fineGridVertex ); }
void peanoclaw::mappings::ValidateGrid::createCell( peanoclaw::Cell& fineGridCell, peanoclaw::Vertex * const fineGridVertices, const peano::grid::VertexEnumerator& fineGridVerticesEnumerator, peanoclaw::Vertex * const coarseGridVertices, const peano::grid::VertexEnumerator& coarseGridVerticesEnumerator, peanoclaw::Cell& coarseGridCell, const tarch::la::Vector<DIMENSIONS,int>& fineGridPositionOfCell ) { logTraceInWith4Arguments( "createCell(...)", fineGridCell, fineGridVerticesEnumerator.toString(), coarseGridCell, fineGridPositionOfCell ); //TODO unterweg debug logInfo("", "Creating cell " << fineGridVerticesEnumerator.getVertexPosition(0) << ", " << fineGridVerticesEnumerator.getCellSize() << ", index=" << fineGridCell.getCellDescriptionIndex() << ",level=" << fineGridVerticesEnumerator.getLevel() ); logTraceOutWith1Argument( "createCell(...)", fineGridCell ); }
void peanoclaw::mappings::ValidateGrid::touchVertexLastTime( peanoclaw::Vertex& fineGridVertex, const tarch::la::Vector<DIMENSIONS,double>& fineGridX, const tarch::la::Vector<DIMENSIONS,double>& fineGridH, peanoclaw::Vertex * const coarseGridVertices, const peano::grid::VertexEnumerator& coarseGridVerticesEnumerator, peanoclaw::Cell& coarseGridCell, const tarch::la::Vector<DIMENSIONS,int>& fineGridPositionOfVertex ) { logTraceInWith6Arguments( "touchVertexLastTime(...)", fineGridVertex, fineGridX, fineGridH, coarseGridVerticesEnumerator.toString(), coarseGridCell, fineGridPositionOfVertex ); _validator.findAdjacentPatches( fineGridVertex, fineGridX, coarseGridVerticesEnumerator.getLevel() + 1, #ifdef Parallel tarch::parallel::Node::getInstance().getRank() #else 0 #endif ); logTraceOutWith1Argument( "touchVertexLastTime(...)", fineGridVertex ); }
void peanoclaw::interSubgridCommunication::GridLevelTransfer::stepDown( Patch* coarseSubgrid, Patch& fineSubgrid, peanoclaw::Vertex * const fineGridVertices, const peano::grid::VertexEnumerator& fineGridVerticesEnumerator, bool isInitializing, bool isPeanoCellLeaf ) { //Switch to virtual subgrid if necessary if(shouldBecomeVirtualSubgrid( fineSubgrid, fineGridVertices, fineGridVerticesEnumerator, isInitializing, isPeanoCellLeaf )) { switchToAndAddVirtualSubgrid(fineSubgrid); } else if(fineSubgrid.isVirtual()) { //Switch to non-virtual if still virtual fineSubgrid.switchToNonVirtual(); } //Prepare flags for subgrid if(!fineSubgrid.isLeaf()) { fineSubgrid.setWillCoarsen(peano::grid::aspects::VertexStateAnalysis::doesOneVertexCarryRefinementFlag ( fineGridVertices, fineGridVerticesEnumerator, peanoclaw::records::Vertex::Erasing ) ); } fineSubgrid.getTimeIntervals().resetMinimalNeighborTimeConstraint(); fineSubgrid.getTimeIntervals().resetMaximalNeighborTimeInterval(); fineSubgrid.resetNeighboringGhostlayerBounds(); fineSubgrid.getTimeIntervals().resetMinimalFineGridTimeInterval(); //Get data from neighbors: // - Ghostlayers data // - Ghostlayer bounds // - Neighbor times for(int i = 0; i < TWO_POWER_D; i++) { assertion1(fineSubgrid.getCellDescriptionIndex() != -1, fineSubgrid); fineGridVertices[fineGridVerticesEnumerator(i)].setAdjacentCellDescriptionIndex(i, fineSubgrid.getCellDescriptionIndex()); fineGridVertices[fineGridVerticesEnumerator(i)].fillAdjacentGhostLayers( fineGridVerticesEnumerator.getLevel(), _useDimensionalSplitting, _numerics, fineGridVerticesEnumerator.getVertexPosition(peano::utils::dDelinearised(i, 2)), _subgridStatistics, // fineGridVerticesEnumerator.getVertexPosition(i), i ); } //Data from coarse patch: // -> Update minimal time constraint of coarse neighbors if(coarseSubgrid != 0) { //Patch coarsePatch(coarseCellDescriptionIndex); if(coarseSubgrid->getTimeIntervals().shouldFineGridsSynchronize()) { //Set time constraint of fine grid to time of coarse grid to synch //on that time. fineSubgrid.getTimeIntervals().updateMinimalNeighborTimeConstraint( coarseSubgrid->getTimeIntervals().getCurrentTime() + coarseSubgrid->getTimeIntervals().getTimestepSize(), coarseSubgrid->getCellDescriptionIndex() ); } } }
void peanoclaw::mappings::ValidateGrid::prepareSendToMaster( peanoclaw::Cell& localCell, peanoclaw::Vertex * vertices, const peano::grid::VertexEnumerator& verticesEnumerator, const peanoclaw::Vertex * const coarseGridVertices, const peano::grid::VertexEnumerator& coarseGridVerticesEnumerator, const peanoclaw::Cell& coarseGridCell, const tarch::la::Vector<DIMENSIONS,int>& fineGridPositionOfCell ) { logTraceInWith2Arguments( "prepareSendToMaster(...)", localCell, verticesEnumerator.toString() ); //Assemble vector to send to master std::vector<PatchDescription>& workerAndLocalData = PatchDescriptionHeap::getInstance().getData(_patchDescriptionsIndex); std::vector<PatchDescription> localData = _validator.getAllPatches(); for(int i = 0; i < (int)localData.size(); i++) { //TODO unterweg debug // assertion(localData[i].getIsReferenced()); workerAndLocalData.push_back(localData[i]); } // for(size_t i = 0; i < PatchDescriptionHeap::getInstance().getData(_patchDescriptionsIndex).size(); i++) { // //TODO unterweg debug //// logError("", "Prepare Send to " << tarch::parallel::NodePool::getInstance().getMasterRank() << " -- " << i << ": " << PatchDescriptionHeap::getInstance().getData(_patchDescriptionsIndex)[i].toString()); // assertion(PatchDescriptionHeap::getInstance().getData(_patchDescriptionsIndex)[i].getIsReferenced()); // } //Add non-referenced patches // int index = 0; // int numberOfEntries = 0; // while(numberOfEntries < CellDescriptionHeap::getInstance().getNumberOfAllocatedEntries()) { // if(CellDescriptionHeap::getInstance().isValidIndex(index)) { // if(_descriptions.find(index) == _descriptions.end()) { // //Found non-referenced patch // CellDescription& cellDescription = CellDescriptionHeap::getInstance().getData(index).at(0); // PatchDescription patchDescription; // patchDescription.setPosition(cellDescription.getPosition()); // patchDescription.setSize(cellDescription.getSize()); // patchDescription.setLevel(cellDescription.getLevel()); // patchDescription.setIsRemote(cellDescription.getIsRemote()); // patchDescription.setIsReferenced(false); // patchDescription.setCellDescriptionIndex(index); // patchDescription.setRank(tarch::parallel::Node::getInstance().getRank()); // descriptionVector.push_back(patchDescription); // } // numberOfEntries++; // } // index++; // } //Send PatchDescriptionHeap::getInstance().sendData( _patchDescriptionsIndex, tarch::parallel::NodePool::getInstance().getMasterRank(), verticesEnumerator.getVertexPosition(0), verticesEnumerator.getLevel(), peano::heap::MasterWorkerCommunication ); #ifdef Parallel PatchDescriptionHeap::getInstance().finishedToSendSynchronousData(); #endif logTraceOut( "prepareSendToMaster(...)" ); }