From: kanschat <kanschat@0785d39b-7218-0410-832d-ea1e28bc413d> Date: Fri, 26 Oct 2012 10:07:46 +0000 (+0000) Subject: add VectorInfo class X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=23cfc3bc463ded11d13e15d79a0173bd376f0536;p=dealii-svn.git add VectorInfo class git-svn-id: https://svn.dealii.org/trunk@27202 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/include/deal.II/meshworker/vector_info.h b/deal.II/include/deal.II/meshworker/vector_info.h new file mode 100644 index 0000000000..e768b7a929 --- /dev/null +++ b/deal.II/include/deal.II/meshworker/vector_info.h @@ -0,0 +1,121 @@ +//--------------------------------------------------------------------------- +// $Id: mesh_worker_info.h 23936 2011-07-09 17:02:27Z kanschat $ +// +// Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 by the deal.II authors +// +// This file is subject to QPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//--------------------------------------------------------------------------- + +#ifndef __deal2__mesh_worker_vector_info_h +#define __deal2__mesh_worker_vector_info_h + +#include <deal.II/base/named_data.h> +#include <deal.II/lac/block_indices.h> +#include <deal.II/numerics/mesh_worker_info.h> + +using namespace dealii; + +class VectorInfo +{ + public: + /** + * Initialize the data + * vector and cache the + * selector. + */ + void initialize_data(const NamedData<BlockVector<double>*>&data); + + template<int dim, int spacedim> + void reinit(const MeshWorker::DoFInfo<dim, spacedim>& i); + + BlockVector<double>& operator() (unsigned int i); + + private: + std::vector<BlockVector<double> > local_data; + /** + * The global data vector + * used to compute function + * values in quadrature + * points. + */ + SmartPointer<const NamedData<BlockVector<double>*> > global_data; +}; + + +class VectorInfoBox + { + public: + typedef VectorInfo CellInfo; + + void initialize_data(const NamedData<BlockVector<double>*>&data); + + template <int dim, class DOFINFO> + void post_cell(const MeshWorker::DoFInfoBox<dim, DOFINFO>&) + {} + + template <int dim, class DOFINFO> + void post_faces(const MeshWorker::DoFInfoBox<dim, DOFINFO>&) + {} + + VectorInfo cell; + VectorInfo boundary; + VectorInfo face; + VectorInfo subface; + VectorInfo neighbor; + }; + + +inline +void +VectorInfo::initialize_data(const NamedData<BlockVector<double>*>&data) +{ + global_data = &data; + local_data.resize(global_data->size()); +} + + +template<int dim, int spacedim> +inline +void +VectorInfo::reinit(const MeshWorker::DoFInfo<dim, spacedim>& i) +{ + const NamedData<BlockVector<double>*>& gd = *global_data; + + for (unsigned int k=0;k<local_data.size();++k) + { + const BlockVector<double>& v = *gd(k); + + local_data[k].reinit(i.block_info->local()); + for (unsigned int j=0;j<local_data[k].size();++j) + local_data[k](j) = v(i.indices[j]); + } +} + + +inline +BlockVector<double>& +VectorInfo::operator() (unsigned int i) +{ + AssertIndexRange(i, local_data.size()); + return local_data[i]; +} + + +inline +void +VectorInfoBox::initialize_data(const NamedData<BlockVector<double>*>&data) +{ + cell.initialize_data(data); + boundary.initialize_data(data); + face.initialize_data(data); + subface.initialize_data(data); + neighbor.initialize_data(data); +} + + + +#endif