Exemple #1
0
void LIndexSetData<T>::cacheLocalIndices(Pointer<Patch<NDIM> > patch, const IntVector<NDIM>& periodic_shift)
{
    d_lag_indices.clear();
    d_interior_lag_indices.clear();
    d_ghost_lag_indices.clear();
    d_global_petsc_indices.clear();
    d_interior_global_petsc_indices.clear();
    d_ghost_global_petsc_indices.clear();
    d_local_petsc_indices.clear();
    d_interior_local_petsc_indices.clear();
    d_ghost_local_petsc_indices.clear();
    d_periodic_shifts.clear();
    d_interior_periodic_shifts.clear();
    d_ghost_periodic_shifts.clear();

    const Box<NDIM>& patch_box = patch->getBox();
    const Index<NDIM>& ilower = patch_box.lower();
    const Index<NDIM>& iupper = patch_box.upper();

    const Pointer<CartesianPatchGeometry<NDIM> > pgeom = patch->getPatchGeometry();
    const double* const dx = pgeom->getDx();
    boost::array<bool, NDIM> patch_touches_lower_periodic_bdry, patch_touches_upper_periodic_bdry;
    for (unsigned int axis = 0; axis < NDIM; ++axis)
    {
        patch_touches_lower_periodic_bdry[axis] = pgeom->getTouchesPeriodicBoundary(axis, 0);
        patch_touches_upper_periodic_bdry[axis] = pgeom->getTouchesPeriodicBoundary(axis, 1);
    }

    for (typename LSetData<T>::SetIterator it(*this); it; it++)
    {
        const CellIndex<NDIM>& i = it.getIndex();
        boost::array<int, NDIM> offset;
        for (unsigned int d = 0; d < NDIM; ++d)
        {
            if (patch_touches_lower_periodic_bdry[d] && i(d) < ilower(d))
            {
                offset[d] = -periodic_shift(d); // X is ABOVE the top    of the patch --- need
                                                // to shift DOWN
            }
            else if (patch_touches_upper_periodic_bdry[d] && i(d) > iupper(d))
            {
                offset[d] = +periodic_shift(d); // X is BELOW the bottom of the patch --- need to shift UP
            }
            else
            {
                offset[d] = 0;
            }
        }
        const LSet<T>& idx_set = *it;
        const bool patch_owns_idx_set = patch_box.contains(i);
        for (typename LSet<T>::const_iterator n = idx_set.begin(); n != idx_set.end(); ++n)
        {
            const typename LSet<T>::value_type& idx = *n;
            const int lag_idx = idx->getLagrangianIndex();
            const int global_petsc_idx = idx->getGlobalPETScIndex();
            const int local_petsc_idx = idx->getLocalPETScIndex();
            d_lag_indices.push_back(lag_idx);
            d_global_petsc_indices.push_back(global_petsc_idx);
            d_local_petsc_indices.push_back(local_petsc_idx);
            for (unsigned int d = 0; d < NDIM; ++d)
            {
                d_periodic_shifts.push_back(static_cast<double>(offset[d]) * dx[d]);
            }
            if (patch_owns_idx_set)
            {
                d_interior_lag_indices.push_back(lag_idx);
                d_interior_global_petsc_indices.push_back(global_petsc_idx);
                d_interior_local_petsc_indices.push_back(local_petsc_idx);
                for (unsigned int d = 0; d < NDIM; ++d)
                {
                    d_interior_periodic_shifts.push_back(static_cast<double>(offset[d]) * dx[d]);
                }
            }
            else
            {
                d_ghost_lag_indices.push_back(lag_idx);
                d_ghost_global_petsc_indices.push_back(global_petsc_idx);
                d_ghost_local_petsc_indices.push_back(local_petsc_idx);
                for (unsigned int d = 0; d < NDIM; ++d)
                {
                    d_ghost_periodic_shifts.push_back(static_cast<double>(offset[d]) * dx[d]);
                }
            }
        }
    }
    return;
} // cacheLocalIndices
void
AdvDiffHypPatchOps::conservativeDifferenceOnPatch(
    Patch<NDIM>& patch,
    const double /*time*/,
    const double dt,
    bool /*at_synchronization*/)
{
    const Box<NDIM>& patch_box = patch.getBox();
    const Index<NDIM>& ilower = patch_box.lower();
    const Index<NDIM>& iupper = patch_box.upper();

    const Pointer<CartesianPatchGeometry<NDIM> > patch_geom = patch.getPatchGeometry();
    const double* const dx = patch_geom->getDx();

    for (std::set<Pointer<CellVariable<NDIM,double> > >::const_iterator cit = d_Q_var.begin();
         cit != d_Q_var.end(); ++cit)
    {
        Pointer<CellVariable<NDIM,double> > Q_var = *cit;
        Pointer<FaceVariable<NDIM,double> > u_var = d_Q_u_map[Q_var];

        if (u_var.isNull())
        {
            Pointer<CellData<NDIM,double> > Q_data = patch.getPatchData(Q_var, getDataContext());
            Q_data->fillAll(0.0);
            continue;
        }

        const bool conservation_form = d_Q_difference_form[Q_var] == CONSERVATIVE;
        const bool u_is_div_free = d_u_is_div_free[u_var];

        Pointer<FaceVariable<NDIM,double> > flux_integral_var = d_flux_integral_var[Q_var];
        Pointer<FaceVariable<NDIM,double> > q_integral_var = d_q_integral_var[Q_var];
        Pointer<FaceVariable<NDIM,double> > u_integral_var = d_u_integral_var[u_var];

        Pointer<CellData<NDIM,double> > Q_data = patch.getPatchData(Q_var, getDataContext());
        Pointer<FaceData<NDIM,double> > flux_integral_data =
            (conservation_form
             ? patch.getPatchData(flux_integral_var, getDataContext())
             : Pointer<PatchData<NDIM> >(NULL));
        Pointer<FaceData<NDIM,double> > q_integral_data =
            (!conservation_form || !u_is_div_free
             ? patch.getPatchData(q_integral_var, getDataContext())
             : Pointer<PatchData<NDIM> >(NULL));
        Pointer<FaceData<NDIM,double> > u_integral_data =
            (!conservation_form || !u_is_div_free
             ? patch.getPatchData(u_integral_var, getDataContext())
             : Pointer<PatchData<NDIM> >(NULL));

        const IntVector<NDIM>& Q_data_ghost_cells = Q_data->getGhostCellWidth();
        const IntVector<NDIM>& flux_integral_data_ghost_cells =
            (!flux_integral_data.isNull()
             ? flux_integral_data->getGhostCellWidth()
             : 0);
        const IntVector<NDIM>& q_integral_data_ghost_cells =
            (!q_integral_data.isNull()
             ? q_integral_data->getGhostCellWidth()
             : 0);
        const IntVector<NDIM>& u_integral_data_ghost_cells =
            (!u_integral_data.isNull()
             ? u_integral_data->getGhostCellWidth()
             : 0);

        switch (d_Q_difference_form[Q_var])
        {
            case CONSERVATIVE:
            {
                for (int depth = 0; depth < Q_data->getDepth(); ++depth)
                {
                    if (u_is_div_free)
                    {
#if (NDIM == 2)
                        ADV_DIFF_CONSDIFF_FC(
                            dx,dt,
                            ilower(0),iupper(0),ilower(1),iupper(1),
                            flux_integral_data_ghost_cells(0),flux_integral_data_ghost_cells(1),
                            Q_data_ghost_cells(0),Q_data_ghost_cells(1),
                            flux_integral_data->getPointer(0,depth),
                            flux_integral_data->getPointer(1,depth),
                            Q_data->getPointer(depth));
#endif
#if (NDIM == 3)
                        ADV_DIFF_CONSDIFF_FC(
                            dx,dt,
                            ilower(0),iupper(0),ilower(1),iupper(1),ilower(2),iupper(2),
                            flux_integral_data_ghost_cells(0),flux_integral_data_ghost_cells(1),flux_integral_data_ghost_cells(2),
                            Q_data_ghost_cells(0),Q_data_ghost_cells(1),Q_data_ghost_cells(2),
                            flux_integral_data->getPointer(0,depth),
                            flux_integral_data->getPointer(1,depth),
                            flux_integral_data->getPointer(2,depth),
                            Q_data->getPointer(depth));
#endif
                    }
                    else
                    {
#if (NDIM == 2)
                        ADV_DIFF_CONSDIFFWITHDIVSOURCE_FC(
                            dx,dt,
                            ilower(0),iupper(0),ilower(1),iupper(1),
                            flux_integral_data_ghost_cells(0),flux_integral_data_ghost_cells(1),
                            q_integral_data_ghost_cells(0),q_integral_data_ghost_cells(1),
                            u_integral_data_ghost_cells(0),u_integral_data_ghost_cells(1),
                            Q_data_ghost_cells(0),Q_data_ghost_cells(1),
                            flux_integral_data->getPointer(0,depth),
                            flux_integral_data->getPointer(1,depth),
                            q_integral_data->getPointer(0,depth),
                            q_integral_data->getPointer(1,depth),
                            u_integral_data->getPointer(0),
                            u_integral_data->getPointer(1),
                            Q_data->getPointer(depth));
#endif
#if (NDIM == 3)
                        ADV_DIFF_CONSDIFFWITHDIVSOURCE_FC(
                            dx,dt,
                            ilower(0),iupper(0),ilower(1),iupper(1),ilower(2),iupper(2),
                            flux_integral_data_ghost_cells(0),flux_integral_data_ghost_cells(1),flux_integral_data_ghost_cells(2),
                            q_integral_data_ghost_cells(0),q_integral_data_ghost_cells(1),q_integral_data_ghost_cells(2),
                            u_integral_data_ghost_cells(0),u_integral_data_ghost_cells(1),u_integral_data_ghost_cells(2),
                            Q_data_ghost_cells(0),Q_data_ghost_cells(1),Q_data_ghost_cells(2),
                            flux_integral_data->getPointer(0,depth),
                            flux_integral_data->getPointer(1,depth),
                            flux_integral_data->getPointer(2,depth),
                            q_integral_data->getPointer(0,depth),
                            q_integral_data->getPointer(1,depth),
                            q_integral_data->getPointer(2,depth),
                            u_integral_data->getPointer(0),
                            u_integral_data->getPointer(1),
                            u_integral_data->getPointer(2),
                            Q_data->getPointer(depth));
#endif
                    }
                }
                break;
            }
            case ADVECTIVE:
            {
                CellData<NDIM,double> N_data(patch_box,Q_data->getDepth(),0);
                d_godunov_advector->computeAdvectiveDerivative(N_data, *u_integral_data, *q_integral_data, patch);
                PatchCellDataOpsReal<NDIM,double> patch_cc_data_ops;
                patch_cc_data_ops.scale(Q_data, -1.0/(dt*dt), Pointer<CellData<NDIM,double> >(&N_data,false), patch_box);
                break;
            }
            default:
            {
                TBOX_ERROR("AdvDiffHypPatchOps::conservativeDifferenceOnPatch():\n"
                           << "  unsupported differencing form: " << enum_to_string<ConvectiveDifferencingType>(d_Q_difference_form[Q_var]) << " \n"
                           << "  valid choices are: ADVECTIVE, CONSERVATIVE\n");
            }
        }
    }
    return;
}// conservativeDifferenceOnPatch