void BoussinesqForcing::setDataOnPatchHierarchy( const int data_idx, Pointer<Variable<NDIM> > var, Pointer<PatchHierarchy<NDIM> > hierarchy, const double data_time, const bool initial_time, const int coarsest_ln_in, const int finest_ln_in) { // Allocate scratch data when needed. VariableDatabase<NDIM>* var_db = VariableDatabase<NDIM>::getDatabase(); int T_scratch_idx = var_db->mapVariableAndContextToIndex(d_T_var, d_adv_diff_hier_integrator->getScratchContext()); const bool T_scratch_is_allocated = d_adv_diff_hier_integrator->isAllocatedPatchData(T_scratch_idx); if (!T_scratch_is_allocated) { d_adv_diff_hier_integrator->allocatePatchData(T_scratch_idx, data_time); } // Communicate ghost-cell data. if (!initial_time) { int T_current_idx = var_db->mapVariableAndContextToIndex(d_T_var, d_adv_diff_hier_integrator->getCurrentContext()); int T_new_idx = var_db->mapVariableAndContextToIndex(d_T_var, d_adv_diff_hier_integrator->getNewContext()); const bool T_new_is_allocated = d_adv_diff_hier_integrator->isAllocatedPatchData(T_new_idx); HierarchyDataOpsManager<NDIM>* hier_data_ops_manager = HierarchyDataOpsManager<NDIM>::getManager(); Pointer<HierarchyDataOpsReal<NDIM,double> > hier_cc_data_ops = hier_data_ops_manager->getOperationsDouble(d_T_var, hierarchy, /*get_unique*/ true); if (d_adv_diff_hier_integrator->getCurrentCycleNumber() == 0 || !T_new_is_allocated) { hier_cc_data_ops->copyData(T_scratch_idx, T_current_idx); } else { #if !defined(NDEBUG) TBOX_ASSERT(d_adv_diff_hier_integrator->getCurrentCycleNumber() > 0); #endif hier_cc_data_ops->linearSum(T_scratch_idx, 0.5, T_current_idx, 0.5, T_new_idx); } typedef HierarchyGhostCellInterpolation::InterpolationTransactionComponent InterpolationTransactionComponent; InterpolationTransactionComponent ghost_fill_component(T_scratch_idx, "CONSERVATIVE_LINEAR_REFINE", false, "CONSERVATIVE_COARSEN", "LINEAR", false, d_adv_diff_hier_integrator->getPhysicalBcCoefs(d_T_var)); HierarchyGhostCellInterpolation ghost_fill_op; ghost_fill_op.initializeOperatorState(ghost_fill_component, hierarchy); ghost_fill_op.fillData(data_time); } // Compute a staggered-grid approximation to -gamma*T on each patch level. const int coarsest_ln = (coarsest_ln_in == -1 ? 0 : coarsest_ln_in); const int finest_ln = (finest_ln_in == -1 ? hierarchy->getFinestLevelNumber() : finest_ln_in); for (int level_num = coarsest_ln; level_num <= finest_ln; ++level_num) { setDataOnPatchLevel(data_idx, var, hierarchy->getPatchLevel(level_num), data_time, initial_time); } // Deallocate scratch data when needed. if (!T_scratch_is_allocated) { d_adv_diff_hier_integrator->deallocatePatchData(T_scratch_idx); } return; }// setDataOnPatchHierarchy
void CartGridFunction::setDataOnPatchHierarchy(const int data_idx, Pointer<Variable<NDIM> > var, Pointer<PatchHierarchy<NDIM> > hierarchy, const double data_time, const bool initial_time, const int coarsest_ln_in, const int finest_ln_in) { #if !defined(NDEBUG) TBOX_ASSERT(hierarchy); #endif const int coarsest_ln = (coarsest_ln_in == -1 ? 0 : coarsest_ln_in); const int finest_ln = (finest_ln_in == -1 ? hierarchy->getFinestLevelNumber() : finest_ln_in); for (int level_num = coarsest_ln; level_num <= finest_ln; ++level_num) { setDataOnPatchLevel(data_idx, var, hierarchy->getPatchLevel(level_num), data_time, initial_time); } return; } // setDataOnPatchHierarchy