00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__vectors_h
00013 #define __deal2__vectors_h
00014
00015
00016 #include <deal.II/base/config.h>
00017 #include <deal.II/base/exceptions.h>
00018 #include <deal.II/base/quadrature_lib.h>
00019 #include <deal.II/base/point.h>
00020 #include <deal.II/dofs/function_map.h>
00021 #include <deal.II/fe/mapping_q.h>
00022 #include <deal.II/hp/mapping_collection.h>
00023
00024 #include <map>
00025 #include <vector>
00026 #include <set>
00027
00028 DEAL_II_NAMESPACE_OPEN
00029
00030 template <int dim> class Function;
00031 template <int dim> struct FunctionMap;
00032 template <int dim> class Quadrature;
00033 template <int dim> class QGauss;
00034
00035 template <typename number> class Vector;
00036 template <typename number> class FullMatrix;
00037 template <int dim, int spacedim> class Mapping;
00038 template <int dim, int spacedim> class DoFHandler;
00039 template <typename gridtype> class InterGridMap;
00040 namespace hp
00041 {
00042 template <int dim, int spacedim> class DoFHandler;
00043 template <int dim, int spacedim> class MappingCollection;
00044 template <int dim> class QCollection;
00045 }
00046 class ConstraintMatrix;
00047
00048
00049
00050
00333 namespace VectorTools
00334 {
00343 enum NormType
00344 {
00351 mean,
00357 L1_norm,
00365 L2_norm,
00376 Lp_norm,
00381 Linfty_norm,
00385 H1_seminorm,
00392 H1_norm,
00396 W1p_seminorm,
00401 W1p_norm,
00405 W1infty_seminorm,
00410 W1infty_norm
00411
00412 };
00449 template <class VECTOR, class DH>
00450 void interpolate (const Mapping<DH::dimension,DH::space_dimension> &mapping,
00451 const DH &dof,
00452 const Function<DH::space_dimension> &function,
00453 VECTOR &vec);
00454
00460 template <class VECTOR, class DH>
00461 void interpolate (const DH &dof,
00462 const Function<DH::space_dimension> &function,
00463 VECTOR &vec);
00464
00493 template <int dim, class InVector, class OutVector, int spacedim>
00494 void interpolate (const DoFHandler<dim,spacedim> &dof_1,
00495 const DoFHandler<dim,spacedim> &dof_2,
00496 const FullMatrix<double> &transfer,
00497 const InVector &data_1,
00498 OutVector &data_2);
00499
00536 template <int dim, int spacedim,
00537 template <int,int> class DH,
00538 class VECTOR>
00539 void
00540 interpolate_to_different_mesh (const DH<dim, spacedim> &dof1,
00541 const VECTOR &u1,
00542 const DH<dim, spacedim> &dof2,
00543 VECTOR &u2);
00544
00570 template <int dim, int spacedim,
00571 template <int,int> class DH,
00572 class VECTOR>
00573 void
00574 interpolate_to_different_mesh (const DH<dim, spacedim> &dof1,
00575 const VECTOR &u1,
00576 const DH<dim, spacedim> &dof2,
00577 const ConstraintMatrix &constraints,
00578 VECTOR &u2);
00579
00580
00594 template <int dim, int spacedim,
00595 template <int,int> class DH,
00596 class VECTOR>
00597 void
00598 interpolate_to_different_mesh (const InterGridMap<DH<dim, spacedim> > &intergridmap,
00599 const VECTOR &u1,
00600 const ConstraintMatrix &constraints,
00601 VECTOR &u2);
00602
00641 template <int dim, class VECTOR, int spacedim>
00642 void project (const Mapping<dim, spacedim> &mapping,
00643 const DoFHandler<dim,spacedim> &dof,
00644 const ConstraintMatrix &constraints,
00645 const Quadrature<dim> &quadrature,
00646 const Function<spacedim> &function,
00647 VECTOR &vec,
00648 const bool enforce_zero_boundary = false,
00649 const Quadrature<dim-1> &q_boundary = (dim > 1 ?
00650 QGauss<dim-1>(2) :
00651 Quadrature<dim-1>(0)),
00652 const bool project_to_boundary_first = false);
00653
00659 template <int dim, class VECTOR, int spacedim>
00660 void project (const DoFHandler<dim,spacedim> &dof,
00661 const ConstraintMatrix &constraints,
00662 const Quadrature<dim> &quadrature,
00663 const Function<spacedim> &function,
00664 VECTOR &vec,
00665 const bool enforce_zero_boundary = false,
00666 const Quadrature<dim-1> &q_boundary = (dim > 1 ?
00667 QGauss<dim-1>(2) :
00668 Quadrature<dim-1>(0)),
00669 const bool project_to_boundary_first = false);
00670
00739 template <class DH>
00740
00741 void
00742 interpolate_boundary_values (const Mapping<DH::dimension,DH::space_dimension> &mapping,
00743 const DH &dof,
00744 const typename FunctionMap<DH::space_dimension>::type &function_map,
00745 std::map<unsigned int,double> &boundary_values,
00746 const std::vector<bool> &component_mask = std::vector<bool>());
00747
00761 template <class DH>
00762
00763 void
00764 interpolate_boundary_values (const Mapping<DH::dimension,DH::space_dimension> &mapping,
00765 const DH &dof,
00766 const types::boundary_id_t boundary_component,
00767 const Function<DH::space_dimension> &boundary_function,
00768 std::map<unsigned int,double> &boundary_values,
00769 const std::vector<bool> &component_mask = std::vector<bool>());
00770
00777 template <class DH>
00778
00779 void
00780 interpolate_boundary_values (const DH &dof,
00781 const types::boundary_id_t boundary_component,
00782 const Function<DH::space_dimension> &boundary_function,
00783 std::map<unsigned int,double> &boundary_values,
00784 const std::vector<bool> &component_mask = std::vector<bool>());
00785
00786
00793 template <class DH>
00794
00795 void
00796 interpolate_boundary_values (const DH &dof,
00797 const typename FunctionMap<DH::space_dimension>::type &function_map,
00798 std::map<unsigned int,double> &boundary_values,
00799 const std::vector<bool> &component_mask = std::vector<bool>());
00800
00801
00884 template <class DH>
00885
00886 void
00887 interpolate_boundary_values (const Mapping<DH::dimension,DH::space_dimension> &mapping,
00888 const DH &dof,
00889 const typename FunctionMap<DH::space_dimension>::type &function_map,
00890 ConstraintMatrix &constraints,
00891 const std::vector<bool> &component_mask = std::vector<bool>());
00892
00905 template <class DH>
00906
00907 void
00908 interpolate_boundary_values (const Mapping<DH::dimension,DH::space_dimension> &mapping,
00909 const DH &dof,
00910 const types::boundary_id_t boundary_component,
00911 const Function<DH::space_dimension> &boundary_function,
00912 ConstraintMatrix &constraints,
00913 const std::vector<bool> &component_mask = std::vector<bool>());
00914
00923 template <class DH>
00924
00925 void
00926 interpolate_boundary_values (const DH &dof,
00927 const types::boundary_id_t boundary_component,
00928 const Function<DH::space_dimension> &boundary_function,
00929 ConstraintMatrix &constraints,
00930 const std::vector<bool> &component_mask = std::vector<bool>());
00931
00932
00941 template <class DH>
00942
00943 void
00944 interpolate_boundary_values (const DH &dof,
00945 const typename FunctionMap<DH::space_dimension>::type &function_map,
00946 ConstraintMatrix &constraints,
00947 const std::vector<bool> &component_mask = std::vector<bool>());
00948
00949
00994 template <int dim, int spacedim>
00995 void project_boundary_values (const Mapping<dim, spacedim> &mapping,
00996 const DoFHandler<dim,spacedim> &dof,
00997 const typename FunctionMap<spacedim>::type &boundary_functions,
00998 const Quadrature<dim-1> &q,
00999 std::map<unsigned int,double> &boundary_values,
01000 std::vector<unsigned int> component_mapping = std::vector<unsigned int>());
01001
01007 template <int dim, int spacedim>
01008 void project_boundary_values (const DoFHandler<dim,spacedim> &dof,
01009 const typename FunctionMap<spacedim>::type &boundary_function,
01010 const Quadrature<dim-1> &q,
01011 std::map<unsigned int,double> &boundary_values,
01012 std::vector<unsigned int> component_mapping = std::vector<unsigned int>());
01013
01077 template <int dim, int spacedim>
01078 void project_boundary_values (const Mapping<dim, spacedim> &mapping,
01079 const DoFHandler<dim,spacedim> &dof,
01080 const typename FunctionMap<spacedim>::type &boundary_functions,
01081 const Quadrature<dim-1> &q,
01082 ConstraintMatrix &constraints,
01083 std::vector<unsigned int> component_mapping = std::vector<unsigned int>());
01084
01092 template <int dim, int spacedim>
01093 void project_boundary_values (const DoFHandler<dim,spacedim> &dof,
01094 const typename FunctionMap<spacedim>::type &boundary_function,
01095 const Quadrature<dim-1> &q,
01096 ConstraintMatrix &constraints,
01097 std::vector<unsigned int> component_mapping = std::vector<unsigned int>());
01098
01099
01179 template <int dim>
01180 void project_boundary_values_curl_conforming (const DoFHandler<dim>& dof_handler,
01181 const unsigned int first_vector_component,
01182 const Function<dim>& boundary_function,
01183 const types::boundary_id_t boundary_component,
01184 ConstraintMatrix& constraints,
01185 const Mapping<dim>& mapping = StaticMappingQ1<dim>::mapping);
01186
01192 template <int dim>
01193 void project_boundary_values_curl_conforming (const hp::DoFHandler<dim>& dof_handler,
01194 const unsigned int first_vector_component,
01195 const Function<dim>& boundary_function,
01196 const types::boundary_id_t boundary_component,
01197 ConstraintMatrix& constraints,
01198 const hp::MappingCollection<dim, dim>& mapping_collection = hp::StaticMappingQ1<dim>::mapping_collection);
01199
01200
01265 template<int dim>
01266 void project_boundary_values_div_conforming (const DoFHandler<dim>& dof_handler,
01267 const unsigned int first_vector_component,
01268 const Function<dim>& boundary_function,
01269 const types::boundary_id_t boundary_component,
01270 ConstraintMatrix& constraints,
01271 const Mapping<dim>& mapping = StaticMappingQ1<dim>::mapping);
01272
01278 template<int dim>
01279 void project_boundary_values_div_conforming (const hp::DoFHandler<dim>& dof_handler,
01280 const unsigned int first_vector_component,
01281 const Function<dim>& boundary_function,
01282 const types::boundary_id_t boundary_component,
01283 ConstraintMatrix& constraints,
01284 const hp::MappingCollection<dim, dim>& mapping_collection = hp::StaticMappingQ1<dim>::mapping_collection);
01285
01286
01602 template <int dim, template <int, int> class DH, int spacedim>
01603
01604 void
01605 compute_no_normal_flux_constraints (const DH<dim,spacedim> &dof_handler,
01606 const unsigned int first_vector_component,
01607 const std::set<types::boundary_id_t> &boundary_ids,
01608 ConstraintMatrix &constraints,
01609 const Mapping<dim, spacedim> &mapping = StaticMappingQ1<dim>::mapping);
01610
01611
01613
01617
01627 template <int dim, int spacedim>
01628 void create_right_hand_side (const Mapping<dim, spacedim> &mapping,
01629 const DoFHandler<dim,spacedim> &dof,
01630 const Quadrature<dim> &q,
01631 const Function<spacedim> &rhs,
01632 Vector<double> &rhs_vector);
01633
01639 template <int dim, int spacedim>
01640 void create_right_hand_side (const DoFHandler<dim,spacedim> &dof,
01641 const Quadrature<dim> &q,
01642 const Function<spacedim> &rhs,
01643 Vector<double> &rhs_vector);
01644
01649 template <int dim, int spacedim>
01650 void create_right_hand_side (const hp::MappingCollection<dim,spacedim> &mapping,
01651 const hp::DoFHandler<dim,spacedim> &dof,
01652 const hp::QCollection<dim> &q,
01653 const Function<spacedim> &rhs,
01654 Vector<double> &rhs_vector);
01655
01660 template <int dim, int spacedim>
01661 void create_right_hand_side (const hp::DoFHandler<dim,spacedim> &dof,
01662 const hp::QCollection<dim> &q,
01663 const Function<spacedim> &rhs,
01664 Vector<double> &rhs_vector);
01665
01676 template <int dim, int spacedim>
01677 void create_point_source_vector(const Mapping<dim,spacedim> &mapping,
01678 const DoFHandler<dim,spacedim> &dof,
01679 const Point<spacedim> &p,
01680 Vector<double> &rhs_vector);
01681
01687 template <int dim, int spacedim>
01688 void create_point_source_vector(const DoFHandler<dim,spacedim> &dof,
01689 const Point<spacedim> &p,
01690 Vector<double> &rhs_vector);
01691
01696 template <int dim, int spacedim>
01697 void create_point_source_vector(const hp::MappingCollection<dim,spacedim> &mapping,
01698 const hp::DoFHandler<dim,spacedim> &dof,
01699 const Point<spacedim> &p,
01700 Vector<double> &rhs_vector);
01701
01712 template <int dim, int spacedim>
01713 void create_point_source_vector(const hp::DoFHandler<dim,spacedim> &dof,
01714 const Point<spacedim> &p,
01715 Vector<double> &rhs_vector);
01716
01728 template <int dim, int spacedim>
01729 void create_point_source_vector(const Mapping<dim,spacedim> &mapping,
01730 const DoFHandler<dim,spacedim> &dof,
01731 const Point<spacedim> &p,
01732 const Point<dim> &orientation,
01733 Vector<double> &rhs_vector);
01734
01741 template <int dim, int spacedim>
01742 void create_point_source_vector(const DoFHandler<dim,spacedim> &dof,
01743 const Point<spacedim> &p,
01744 const Point<dim> &orientation,
01745 Vector<double> &rhs_vector);
01746
01751 template <int dim, int spacedim>
01752 void create_point_source_vector(const hp::MappingCollection<dim,spacedim> &mapping,
01753 const hp::DoFHandler<dim,spacedim> &dof,
01754 const Point<spacedim> &p,
01755 const Point<dim> &orientation,
01756 Vector<double> &rhs_vector);
01757
01768 template <int dim, int spacedim>
01769 void create_point_source_vector(const hp::DoFHandler<dim,spacedim> &dof,
01770 const Point<spacedim> &p,
01771 const Point<dim> &orientation,
01772 Vector<double> &rhs_vector);
01773
01784 template <int dim, int spacedim>
01785 void create_boundary_right_hand_side (const Mapping<dim,spacedim> &mapping,
01786 const DoFHandler<dim,spacedim> &dof,
01787 const Quadrature<dim-1> &q,
01788 const Function<spacedim> &rhs,
01789 Vector<double> &rhs_vector,
01790 const std::set<types::boundary_id_t> &boundary_indicators = std::set<types::boundary_id_t>());
01791
01798 template <int dim, int spacedim>
01799 void create_boundary_right_hand_side (const DoFHandler<dim,spacedim> &dof,
01800 const Quadrature<dim-1> &q,
01801 const Function<spacedim> &rhs,
01802 Vector<double> &rhs_vector,
01803 const std::set<types::boundary_id_t> &boundary_indicators = std::set<types::boundary_id_t>());
01804
01809 template <int dim, int spacedim>
01810 void create_boundary_right_hand_side (const hp::MappingCollection<dim,spacedim> &mapping,
01811 const hp::DoFHandler<dim,spacedim> &dof,
01812 const hp::QCollection<dim-1> &q,
01813 const Function<spacedim> &rhs,
01814 Vector<double> &rhs_vector,
01815 const std::set<types::boundary_id_t> &boundary_indicators = std::set<types::boundary_id_t>());
01816
01827 template <int dim, int spacedim>
01828 void create_boundary_right_hand_side (const hp::DoFHandler<dim,spacedim> &dof,
01829 const hp::QCollection<dim-1> &q,
01830 const Function<spacedim> &rhs,
01831 Vector<double> &rhs_vector,
01832 const std::set<types::boundary_id_t> &boundary_indicators = std::set<types::boundary_id_t>());
01833
01835
01840
01920 template <int dim, class InVector, class OutVector, int spacedim>
01921 void integrate_difference (const Mapping<dim,spacedim> &mapping,
01922 const DoFHandler<dim,spacedim> &dof,
01923 const InVector &fe_function,
01924 const Function<spacedim> &exact_solution,
01925 OutVector &difference,
01926 const Quadrature<dim> &q,
01927 const NormType &norm,
01928 const Function<spacedim> *weight=0,
01929 const double exponent = 2.);
01930
01936 template <int dim, class InVector, class OutVector, int spacedim>
01937 void integrate_difference (const DoFHandler<dim,spacedim> &dof,
01938 const InVector &fe_function,
01939 const Function<spacedim> &exact_solution,
01940 OutVector &difference,
01941 const Quadrature<dim> &q,
01942 const NormType &norm,
01943 const Function<spacedim> *weight=0,
01944 const double exponent = 2.);
01945
01946 template <int dim, class InVector, class OutVector, int spacedim>
01947 void integrate_difference (const hp::MappingCollection<dim,spacedim> &mapping,
01948 const hp::DoFHandler<dim,spacedim> &dof,
01949 const InVector &fe_function,
01950 const Function<spacedim> &exact_solution,
01951 OutVector &difference,
01952 const hp::QCollection<dim> &q,
01953 const NormType &norm,
01954 const Function<spacedim> *weight=0,
01955 const double exponent = 2.);
01956
01962 template <int dim, class InVector, class OutVector, int spacedim>
01963 void integrate_difference (const hp::DoFHandler<dim,spacedim> &dof,
01964 const InVector &fe_function,
01965 const Function<spacedim> &exact_solution,
01966 OutVector &difference,
01967 const hp::QCollection<dim> &q,
01968 const NormType &norm,
01969 const Function<spacedim> *weight=0,
01970 const double exponent = 2.);
01971
01988 template <int dim, class InVector, int spacedim>
01989 void point_difference (const DoFHandler<dim,spacedim>& dof,
01990 const InVector& fe_function,
01991 const Function<spacedim>& exact_solution,
01992 Vector<double>& difference,
01993 const Point<spacedim>& point);
01994
02012 template <int dim, class InVector, int spacedim>
02013 void point_difference (const Mapping<dim, spacedim> &mapping,
02014 const DoFHandler<dim,spacedim>& dof,
02015 const InVector& fe_function,
02016 const Function<spacedim>& exact_solution,
02017 Vector<double>& difference,
02018 const Point<spacedim>& point);
02019
02035 template <int dim, class InVector, int spacedim>
02036 void
02037 point_value (const DoFHandler<dim,spacedim> &dof,
02038 const InVector &fe_function,
02039 const Point<spacedim> &point,
02040 Vector<double> &value);
02041
02046 template <int dim, class InVector, int spacedim>
02047 void
02048 point_value (const hp::DoFHandler<dim,spacedim> &dof,
02049 const InVector &fe_function,
02050 const Point<spacedim> &point,
02051 Vector<double> &value);
02052
02053
02072 template <int dim, class InVector, int spacedim>
02073 double
02074 point_value (const DoFHandler<dim,spacedim> &dof,
02075 const InVector &fe_function,
02076 const Point<spacedim> &point);
02077
02082 template <int dim, class InVector, int spacedim>
02083 double
02084 point_value (const hp::DoFHandler<dim,spacedim> &dof,
02085 const InVector &fe_function,
02086 const Point<spacedim> &point);
02087
02103 template <int dim, class InVector, int spacedim>
02104 void
02105 point_value (const Mapping<dim, spacedim> &mapping,
02106 const DoFHandler<dim,spacedim> &dof,
02107 const InVector &fe_function,
02108 const Point<spacedim> &point,
02109 Vector<double> &value);
02110
02115 template <int dim, class InVector, int spacedim>
02116 void
02117 point_value (const hp::MappingCollection<dim, spacedim> &mapping,
02118 const hp::DoFHandler<dim,spacedim> &dof,
02119 const InVector &fe_function,
02120 const Point<spacedim> &point,
02121 Vector<double> &value);
02122
02136 template <int dim, class InVector, int spacedim>
02137 double
02138 point_value (const Mapping<dim,spacedim> &mapping,
02139 const DoFHandler<dim,spacedim> &dof,
02140 const InVector &fe_function,
02141 const Point<spacedim> &point);
02142
02147 template <int dim, class InVector, int spacedim>
02148 double
02149 point_value (const hp::MappingCollection<dim,spacedim> &mapping,
02150 const hp::DoFHandler<dim,spacedim> &dof,
02151 const InVector &fe_function,
02152 const Point<spacedim> &point);
02153
02155
02159
02224 void subtract_mean_value(Vector<double> &v,
02225 const std::vector<bool> &p_select);
02226
02266 template <int dim, class InVector, int spacedim>
02267 double compute_mean_value (const Mapping<dim, spacedim> &mapping,
02268 const DoFHandler<dim,spacedim> &dof,
02269 const Quadrature<dim> &quadrature,
02270 const InVector &v,
02271 const unsigned int component);
02272
02278 template <int dim, class InVector, int spacedim>
02279 double compute_mean_value (const DoFHandler<dim,spacedim> &dof,
02280 const Quadrature<dim> &quadrature,
02281 const InVector &v,
02282 const unsigned int component);
02284
02288 DeclException0 (ExcInvalidBoundaryIndicator);
02292 DeclException0 (ExcNonInterpolatingFE);
02296 DeclException0 (ExcNoComponentSelected);
02297 }
02298
02299
02300 DEAL_II_NAMESPACE_CLOSE
02301
02302 #endif
02303