示例#1
0
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
示例#2
0
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