void PiecewiseLinearDiscontinuousScalarSpaceBarycentric<BasisFunctionType>::dumpClusterIdsEx(
        const char* fileName,
        const std::vector<unsigned int>& clusterIdsOfDofs,
        DofType dofType) const
{
    // Note: this will probably only work for spaces on full grids
    // (not on segments)

    if (dofType != GLOBAL_DOFS && dofType != FLAT_LOCAL_DOFS)
        throw std::invalid_argument("PiecewiseLinearDiscontinuousScalarSpaceBarycentricScalarSpace::"
                                    "dumpClusterIds(): invalid DOF type");
    const size_t idCount = clusterIdsOfDofs.size();
    if ((dofType == GLOBAL_DOFS && idCount != globalDofCount()) ||
            (dofType == FLAT_LOCAL_DOFS && idCount != flatLocalDofCount()))
        throw std::invalid_argument("PiecewiseLinearDiscontinuousScalarSpaceBarycentricScalarSpace::"
                                    "dumpClusterIds(): incorrect dimension");

    std::auto_ptr<VtkWriter> vtkWriter = this->gridView().vtkWriter();
    if (dofType == GLOBAL_DOFS) {
        arma::Row<double> data(idCount);
        for (size_t i = 0; i < idCount; ++i)
            data(i) = clusterIdsOfDofs[i];
        vtkWriter->addVertexData(data, "ids");
        vtkWriter->write(fileName);
    } else {
        arma::Mat<double> data(idCount, globalDofCount());
        data.fill(0.);
        size_t row = 0;
        for (size_t id = 0; id < idCount; ++id) {
            bool exists = false;
            for (size_t fldof = 0; fldof < idCount; ++fldof) {
                if (clusterIdsOfDofs[fldof] == id) {
                    LocalDof ldof = m_flatLocal2localDofs[fldof];
                    GlobalDofIndex gdof = m_local2globalDofs[ldof.entityIndex][ldof.dofIndex];
                    data(row, gdof) = 1;
                    exists = true;
                }
            }
            if (!exists)
                data.shed_row(row); // very inefficient, of course
            else
                ++row;
        }
        std::cout << "about to write" <<std::endl;
        vtkWriter->addVertexData(data, "ids");
        vtkWriter->write(fileName);
    }
}
void PiecewiseLinearDiscontinuousScalarSpace<BasisFunctionType>::
dumpClusterIdsEx(const char *fileName,
                 const std::vector<unsigned int> &clusterIdsOfDofs,
                 DofType dofType) const {
    if (dofType != GLOBAL_DOFS && dofType != FLAT_LOCAL_DOFS)
        throw std::invalid_argument("PiecewiseLinearDiscontinuousScalarSpace::"
                                    "dumpClusterIds(): invalid DOF type");
    const size_t idCount = clusterIdsOfDofs.size();
    if ((dofType == GLOBAL_DOFS && idCount != globalDofCount()) ||
            (dofType == FLAT_LOCAL_DOFS && idCount != flatLocalDofCount()))
        throw std::invalid_argument("PiecewiseLinearDiscontinuousScalarSpace::"
                                    "dumpClusterIds(): incorrect dimension");

    std::unique_ptr<GridView> view = this->grid()->leafView();
    std::unique_ptr<VtkWriter> vtkWriter = view->vtkWriter();

    Matrix<double> data(idCount, globalDofCount());
    data.setZero();
    size_t row = 0;
    for (size_t id = 0; id < idCount; ++id) {
        bool exists = false;
        for (size_t fldof = 0; fldof < idCount; ++fldof) {
            if (clusterIdsOfDofs[fldof] == id) {
                LocalDof ldof = m_flatLocal2localDofs[fldof];
                GlobalDofIndex gdof =
                    m_local2globalDofs[ldof.entityIndex][ldof.dofIndex];
                data(row, gdof) = 1;
                exists = true;
            }
        }
        if (!exists)
            eigenRemoveRowFromMatrix(data, row); // very inefficient, of course
        else
            ++row;
    }
    std::cout << "about to write" << std::endl;
    vtkWriter->addVertexData(data, "ids");
    vtkWriter->write(fileName);
}
void PiecewiseConstantDiscontinuousScalarSpaceBarycentric<
    BasisFunctionType>::dumpClusterIdsEx(const char *fileName,
                                         const std::vector<unsigned int> &
                                             clusterIdsOfGlobalDofs,
                                         DofType dofType) const {
  if (dofType != GLOBAL_DOFS && dofType != FLAT_LOCAL_DOFS)
    throw std::invalid_argument(
        "PiecewiseConstantDiscontinuousScalarSpaceBarycentric::"
        "dumpClusterIds(): invalid DOF type");
  const size_t idCount = clusterIdsOfGlobalDofs.size();
  if ((dofType == GLOBAL_DOFS && idCount != globalDofCount()) ||
      (dofType == FLAT_LOCAL_DOFS && idCount != flatLocalDofCount()))
    throw std::invalid_argument("PiecewiseConstantDiscontinuousScalarSpaceBaryc"
                                "entric::dumpClusterIds(): "
                                "clusterIds has incorrect length");

  std::unique_ptr<GridView> view = this->grid()->leafView();
  std::unique_ptr<VtkWriter> vtkWriter = view->vtkWriter();
  arma::Row<double> data(idCount);
  for (size_t i = 0; i < idCount; ++i)
    data(i) = clusterIdsOfGlobalDofs[i];
  vtkWriter->addCellData(data, "ids");
  vtkWriter->write(fileName);
}