void StaggeredStokesPETScLevelSolver::setupKSPVecs(Vec& petsc_x, Vec& petsc_b, SAMRAIVectorReal<NDIM, double>& x, SAMRAIVectorReal<NDIM, double>& b, Pointer<PatchLevel<NDIM> > patch_level) { if (!d_initial_guess_nonzero) copyToPETScVec(petsc_x, x, patch_level); copyToPETScVec(petsc_b, b, patch_level); return; } // setupKSPVecs
void CCPoissonPETScLevelSolver::setupKSPVecs(Vec& petsc_x, Vec& petsc_b, SAMRAIVectorReal<NDIM, double>& x, SAMRAIVectorReal<NDIM, double>& b, Pointer<PatchLevel<NDIM> > patch_level) { if (!d_initial_guess_nonzero) copyToPETScVec(petsc_x, x, patch_level); const int b_idx = b.getComponentDescriptorIndex(0); Pointer<CellVariable<NDIM, double> > b_var = b.getComponentVariable(0); VariableDatabase<NDIM>* var_db = VariableDatabase<NDIM>::getDatabase(); int b_adj_idx = var_db->registerClonedPatchDataIndex(b_var, b_idx); patch_level->allocatePatchData(b_adj_idx); for (PatchLevel<NDIM>::Iterator p(patch_level); p; p++) { Pointer<Patch<NDIM> > patch = patch_level->getPatch(p()); Pointer<CellData<NDIM, double> > b_data = patch->getPatchData(b_idx); Pointer<CellData<NDIM, double> > b_adj_data = patch->getPatchData(b_adj_idx); b_adj_data->copy(*b_data); if (!patch->getPatchGeometry()->intersectsPhysicalBoundary()) continue; PoissonUtilities::adjustCCBoundaryRhsEntries( patch, *b_adj_data, d_poisson_spec, d_bc_coefs, d_solution_time, d_homogeneous_bc); } PETScVecUtilities::copyToPatchLevelVec(petsc_b, b_adj_idx, d_dof_index_idx, patch_level); patch_level->deallocatePatchData(b_adj_idx); var_db->removePatchDataIndex(b_adj_idx); return; } // setupKSPVecs
void VCSCViscousPETScLevelSolver::setupKSPVecs(Vec& petsc_x, Vec& petsc_b, SAMRAIVectorReal<NDIM, double>& x, SAMRAIVectorReal<NDIM, double>& b) { if (d_initial_guess_nonzero) copyToPETScVec(petsc_x, x); const bool level_zero = (d_level_num == 0); const int x_idx = x.getComponentDescriptorIndex(0); const int b_idx = b.getComponentDescriptorIndex(0); const auto b_adj_idx = d_cached_eulerian_data.getCachedPatchDataIndex(b_idx); for (PatchLevel<NDIM>::Iterator p(d_level); p; p++) { Pointer<Patch<NDIM> > patch = d_level->getPatch(p()); Pointer<PatchGeometry<NDIM> > pgeom = patch->getPatchGeometry(); Pointer<SideData<NDIM, double> > x_data = patch->getPatchData(x_idx); Pointer<SideData<NDIM, double> > b_data = patch->getPatchData(b_idx); Pointer<SideData<NDIM, double> > b_adj_data = patch->getPatchData(b_adj_idx); b_adj_data->copy(*b_data); const bool at_physical_bdry = pgeom->intersectsPhysicalBoundary(); if (at_physical_bdry) { PoissonUtilities::adjustVCSCViscousOpRHSAtPhysicalBoundary(*b_adj_data, patch, d_poisson_spec, 1.0, d_bc_coefs, d_solution_time, d_homogeneous_bc, d_mu_interp_type); } const Array<BoundaryBox<NDIM> >& type_1_cf_bdry = level_zero ? Array<BoundaryBox<NDIM> >() : d_cf_boundary->getBoundaries(patch->getPatchNumber(), /* boundary type */ 1, d_mu_interp_type); const bool at_cf_bdry = type_1_cf_bdry.size() > 0; if (at_cf_bdry) { PoissonUtilities::adjustVCSCViscousOpRHSAtCoarseFineBoundary( *b_adj_data, *x_data, patch, d_poisson_spec, 1.0, type_1_cf_bdry); } } PETScVecUtilities::copyToPatchLevelVec(petsc_b, b_adj_idx, d_dof_index_idx, d_level); return; } // setupKSPVecs
void SCPoissonPETScLevelSolver::setupKSPVecs(Vec& petsc_x, Vec& petsc_b, SAMRAIVectorReal<NDIM, double>& x, SAMRAIVectorReal<NDIM, double>& b) { if (d_initial_guess_nonzero) copyToPETScVec(petsc_x, x); const bool level_zero = (d_level_num == 0); const int x_idx = x.getComponentDescriptorIndex(0); const int b_idx = b.getComponentDescriptorIndex(0); Pointer<SideVariable<NDIM, double> > b_var = b.getComponentVariable(0); VariableDatabase<NDIM>* var_db = VariableDatabase<NDIM>::getDatabase(); int b_adj_idx = var_db->registerClonedPatchDataIndex(b_var, b_idx); d_level->allocatePatchData(b_adj_idx); for (PatchLevel<NDIM>::Iterator p(d_level); p; p++) { Pointer<Patch<NDIM> > patch = d_level->getPatch(p()); Pointer<PatchGeometry<NDIM> > pgeom = patch->getPatchGeometry(); Pointer<SideData<NDIM, double> > x_data = patch->getPatchData(x_idx); Pointer<SideData<NDIM, double> > b_data = patch->getPatchData(b_idx); Pointer<SideData<NDIM, double> > b_adj_data = patch->getPatchData(b_adj_idx); b_adj_data->copy(*b_data); const bool at_physical_bdry = pgeom->intersectsPhysicalBoundary(); if (at_physical_bdry) { PoissonUtilities::adjustRHSAtPhysicalBoundary( *b_adj_data, patch, d_poisson_spec, d_bc_coefs, d_solution_time, d_homogeneous_bc); } const Array<BoundaryBox<NDIM> >& type_1_cf_bdry = level_zero ? Array<BoundaryBox<NDIM> >() : d_cf_boundary->getBoundaries(patch->getPatchNumber(), /* boundary type */ 1); const bool at_cf_bdry = type_1_cf_bdry.size() > 0; if (at_cf_bdry) { PoissonUtilities::adjustRHSAtCoarseFineBoundary( *b_adj_data, *x_data, patch, d_poisson_spec, type_1_cf_bdry); } } PETScVecUtilities::copyToPatchLevelVec(petsc_b, b_adj_idx, d_dof_index_idx, d_level); d_level->deallocatePatchData(b_adj_idx); var_db->removePatchDataIndex(b_adj_idx); return; } // setupKSPVecs