Loading [MathJax]/extensions/tex2jax.js
Plugins
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
filter.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013-2014: G-CSC, Goethe University Frankfurt
3 * Author: Christian Wehner
4 *
5 * This file is part of UG4.
6 *
7 * UG4 is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License version 3 (as published by the
9 * Free Software Foundation) with the following additional attribution
10 * requirements (according to LGPL/GPL v3 §7):
11 *
12 * (1) The following notice must be displayed in the Appropriate Legal Notices
13 * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14 *
15 * (2) The following notice must be displayed at a prominent place in the
16 * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17 *
18 * (3) The following bibliography is recommended for citation and must be
19 * preserved in all covered files:
20 * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21 * parallel geometric multigrid solver on hierarchically distributed grids.
22 * Computing and visualization in science 16, 4 (2013), 151-164"
23 * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24 * flexible software system for simulating pde based models on high performance
25 * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26 *
27 * This program is distributed in the hope that it will be useful,
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 * GNU Lesser General Public License for more details.
31 */
32
33#ifndef __H__UG__NAVIER_STOKES__INCOMPRESSIBLE__FILTER__
34#define __H__UG__NAVIER_STOKES__INCOMPRESSIBLE__FILTER__
35
36#include <vector>
39#include "lib_grid/lg_base.h"
46
47namespace ug{
48namespace NavierStokes{
49
50template <typename TGridFunction>
52public:
53 inline int si(){return m_subset_index;}
54 inline number coord(){return m_coord;}
55 inline size_t direction(){return m_direction;}
57 return std::abs(co[m_direction]-m_coord);
58 }
60 m_subset_index = u->subset_id_by_name(subset);
63 }
64private:
68};
69
70template <int dim,typename elem_type,typename TGridFunction>
73 typedef typename TGridFunction::template traits<elem_type>::const_iterator ElemIterator;
75 typedef typename TGridFunction::domain_type domain_type;
76 // get domain
77 domain_type& domain = *u->domain().get();
78 // create Multiindex
79 std::vector<DoFIndex> multInd;
80 for(int si = 0; si < domain.subset_handler()->num_subsets(); ++si){
81 ElemIterator iter = u->template begin<elem_type>(si);
82 ElemIterator iterEnd = u->template end<elem_type>(si);
83 for( ;iter !=iterEnd; ++iter)
84 {
85 elem_type* elem = *iter;
86 for (int d=0;d<dim;d++){
87 u->dof_indices(elem, d, multInd);
88 DoFRef(*u,multInd[0])=aaU[elem][d];
89 }
90 }
91 }
92}
93
94template <int dim,typename elem_type,typename TGridFunction>
97 typedef typename TGridFunction::template traits<elem_type>::const_iterator ElemIterator;
99 typedef typename TGridFunction::domain_type domain_type;
100 // get domain
101 domain_type& domain = *u->domain().get();
102 // create Multiindex
103 std::vector<DoFIndex> multInd;
104 for(int si = 0; si < domain.subset_handler()->num_subsets(); ++si){
105 ElemIterator iter = u->template begin<elem_type>(si);
106 ElemIterator iterEnd = u->template end<elem_type>(si);
107 for( ;iter !=iterEnd; ++iter)
108 {
109 elem_type* elem = *iter;
110 for (int d=0;d<dim;d++){
111 u->dof_indices(elem, d, multInd);
112 aaU[elem][d]=DoFRef(*u,multInd[0]);
113 }
114 }
115 }
116}
117
118template <typename elem_type,typename attachment_type,typename grid_type>
120 attachment_type& attachment,
121 grid_type& grid
122 ){
123 grid.template attach_to<elem_type>(attachment);
124 accessor.access(grid,attachment);
125};
126
127template <typename TGridFunction>
129public:
131 static const size_t dim = TGridFunction::dim;
132
134 typedef typename TGridFunction::template dim_traits<dim>::grid_base_object elem_type;
135
137 typedef typename TGridFunction::domain_type domain_type;
138
140 typedef typename domain_type::grid_type grid_type;
141
143 typedef typename elem_type::side side_type;
144
145 // vertex type
147
148 // data types used in attachments
150 typedef number type1;
152
153 // filter for side attachment
156
159
162
163 // filter for crouzeix-raviart type grid function
166
167 // filter for vertex attachment
170
173
176
177 // filter for general grid function, result stored in nodes
180
181 // filter grid function
183
184 virtual number width(vertex_type* vrt){return -1;}
185
186 virtual number width(side_type* side){return -1;}
187
188 virtual void compute_filterwidth(){}
189
192};
193
194// wrapper class for filtering
195template <typename TImpl,typename TGridFunction>
197: public FilterBaseClass<TGridFunction>
198{
199 public:
201 static const size_t dim = TGridFunction::dim;
202
204 typedef typename TGridFunction::template dim_traits<dim>::grid_base_object elem_type;
205
207 typedef typename TGridFunction::domain_type domain_type;
208
210 typedef typename domain_type::grid_type grid_type;
211
213 typedef typename elem_type::side side_type;
214
215 // vertex type
217
218 // data types
222
223 // filter for side attachment
228
233
238
239 // filter for crouzeix-raviart type grid function
242 UG_LOG("son class\n");
243 getImpl().apply_filter(aaUHat,u,aaUHat);
244 }
245
246 // filter for vertex attachment
251
256
261
262 // filter for general grid function, result stored in nodes
265 if (u->local_finite_element_id(0) == LFEID(LFEID::CROUZEIX_RAVIART, dim, 1)){
266 getImpl().apply_filter(aaUHat,u);
267 } else {
268 getImpl().apply_filter(aaUHat,u,aaUHat);
269 }
270 }
271
272 template <typename TElem>
274 // define attachment types
277
278 domain_type& domain = *u->domain().get();
279 grid_type& grid = *domain.grid();
280
281 // attach
282 grid.template attach_to<TElem>(aUHat);
283 acUHat.access(grid,aUHat);
284 getImpl().apply_filter(acUHat,u,acUHat);
285 copyAttachmentToGridFunction<dim,TElem,TGridFunction>(u,acUHat);
286 grid.template detach_from<TElem>(aUHat);
287 }
288
289 // filter grid function
291 if (u->local_finite_element_id(0) == LFEID(LFEID::CROUZEIX_RAVIART, dim, 1)){
292 apply_<side_type>(u);
293 } else {
294 apply_<vertex_type>(u);
295 }
296 }
297
298 template<typename VType,typename TElem>
300 typedef typename TGridFunction::domain_type TDomain;
301 typedef typename TDomain::grid_type TGrid;
302 TDomain domain = *u->domain().get();
303 typedef typename TGridFunction::template traits<TElem>::const_iterator ElemIterator;
304 PeriodicBoundaryManager* pbm = (domain.grid())->periodic_boundary_manager();
305 std::vector<DoFIndex> dofInd;
306 for (int j=0;j<(int)walls.size();j++){
307 int si = walls[j].si();
308 ElemIterator elemIter = u->template begin<TElem>(si);
309 ElemIterator elemIterEnd = u->template end<TElem>(si);
310 for( ;elemIter !=elemIterEnd; elemIter++)
311 {
312 TElem* elem = *elemIter;
313 if (pbm && pbm->is_slave(elem)) continue;
314 VType localValue;
315 for (int d=0;d<TGridFunction::dim;d++){
316 u->dof_indices(elem, d, dofInd);
317 assignVal(localValue,d,DoFRef(*u,dofInd[0]));
318 }
319 acUHat[elem]=localValue;
320 }
321 }
322 }
323
324 template<typename VType,typename TElem>
327 typedef typename TGridFunction::domain_type TDomain;
328 typedef typename TDomain::grid_type TGrid;
329 TDomain domain = *u->domain().get();
330 typedef typename TGridFunction::template traits<TElem>::const_iterator ElemIterator;
331 PeriodicBoundaryManager* pbm = (domain.grid())->periodic_boundary_manager();
332 std::vector<DoFIndex> dofInd;
333 for (int j=0;j<(int)walls.size();j++){
334 int si = walls[j].si();
335 ElemIterator elemIter = u->template begin<TElem>(si);
336 ElemIterator elemIterEnd = u->template end<TElem>(si);
337 for( ;elemIter !=elemIterEnd; elemIter++)
338 {
339 TElem* elem = *elemIter;
340 if (pbm && pbm->is_slave(elem)) continue;
341 acUHat[elem]=acU[elem];
342 }
343 }
344 }
345
346 void assignVal(number& v,size_t ind,number value){
347 v=value;
348 }
349
350 void assignVal(MathVector<2>& v,size_t ind,number value){
351 v[ind]=value;
352 }
353
354 void assignVal(MathVector<3>& v,size_t ind,number value){
355 v[ind]=value;
356 }
357
358 void assignVal(MathSymmetricMatrix<2>& v,size_t ind,number value){
359 v[ind]=value;
360 }
361
362 void assignVal(MathSymmetricMatrix<3>& v,size_t ind,number value){
363 v[ind]=value;
364 }
365
366 protected:
368 TImpl& getImpl() {return static_cast<TImpl&>(*this);}
369
371 const TImpl& getImpl() const {return static_cast<const TImpl&>(*this);}
372};
373
374template <int dim>
379
380// Box filter with constant filter width
381template <typename TGridFunction>
383 : public FilterImplBaseClass<ConstantBoxFilter<TGridFunction>,TGridFunction>
384{
385public:
386 // base type
388
389 // dimension
390 static const size_t dim = TGridFunction::dim;
391
392 // element type
393 typedef typename TGridFunction::template dim_traits<dim>::grid_base_object elem_type;
394
395 // domain type
396 typedef typename TGridFunction::domain_type domain_type;
397
398 // side type
399 typedef typename elem_type::side side_type;
400
401 // vertex type
403
404 // grid type
405 typedef typename domain_type::grid_type grid_type;
406
407 // position accessor type
408 typedef typename domain_type::position_accessor_type position_accessor_type;
409
411 typedef typename TGridFunction::template dim_traits<dim>::const_iterator ElemIterator;
412
414 typedef typename TGridFunction::template traits<side_type>::const_iterator SideIterator;
415
417 typedef typename TGridFunction::template traits<vertex_type>::const_iterator VertexIterator;
418
419 // accessor types
422
423 // filter for crouzeix-raviart type data
424 template <typename VType>
427
428 // filter for fv1 type data
429 template <typename VType>
434
435 // filter for crouzeix-raviart grid function with output in node attachment
436 template <typename VType>
441
442 // compute average mesh size
444
445 inline number width(vertex_type* vrt){ return m_width; }
446
447 inline number width(side_type* side){ return m_width; }
448
450 m_walls.push_back(w);
451 }
452
453 // constructors
455 m_width = width;
456 m_uInfo = u;
457 domain_type& domain = *u->domain().get();
458 if (u->local_finite_element_id(0) == LFEID(LFEID::CROUZEIX_RAVIART, dim, 1)){
459 domain.grid()->template attach_to<side_type>(m_aSideVolume);
460 m_acSideVolume.access(*domain.grid(),m_aSideVolume);
461 } else {
462 domain.grid()->template attach_to<vertex_type>(m_aVertexVolume);
463 m_acSideVolume.access(*domain.grid(),m_aVertexVolume);
464 }
465 }
466
468 m_uInfo = u;
469 domain_type& domain = *u->domain().get();
470 if (u->local_finite_element_id(0) == LFEID(LFEID::CROUZEIX_RAVIART, dim, 1)){
471 domain.grid()->template attach_to<side_type>(m_aSideVolume);
472 m_acSideVolume.access(*domain.grid(),m_aSideVolume);
473 } else {
474 domain.grid()->template attach_to<vertex_type>(m_aVertexVolume);
475 m_acSideVolume.access(*domain.grid(),m_aVertexVolume);
476 }
478 }
479
481 domain_type& domain = *m_uInfo->domain().get();
482 domain.grid()->template detach_from<side_type>(m_aSideVolume);
483 domain.grid()->template detach_from<vertex_type>(m_aVertexVolume);
484 }
485
486private:
487 template <typename VType>
490 std::vector< MathVector<dim> >& coord,
491 VType values[DimFV1Geometry<dim>::maxNumSCV],
493 std::vector<side_type*>& sides
494 );
495
496 // volume attachment
501
503
505
506 // grid function
508
509 std::vector<WallObject<TGridFunction> > m_walls;
510
513};
514
515// Box filter with constant filter width
516template <typename TGridFunction>
518: public FilterImplBaseClass<VariableBoxFilter<TGridFunction>,TGridFunction>
519{
520public:
521 // base type
523
524 // dimension
525 static const size_t dim = TGridFunction::dim;
526
527 // element type
528 typedef typename TGridFunction::template dim_traits<dim>::grid_base_object elem_type;
529
530 // domain type
531 typedef typename TGridFunction::domain_type domain_type;
532
533 // side type
534 typedef typename elem_type::side side_type;
535
536 // vertex type
538
539 // grid type
540 typedef typename domain_type::grid_type grid_type;
541
542 // position accessor type
543 typedef typename domain_type::position_accessor_type position_accessor_type;
544
546 typedef typename TGridFunction::template dim_traits<dim>::const_iterator ElemIterator;
547
549 typedef typename TGridFunction::template traits<side_type>::const_iterator SideIterator;
550
552 typedef typename TGridFunction::template traits<vertex_type>::const_iterator VertexIterator;
553
554 // accessor types
557
558 // filter for crouzeix-raviart type data
559 template <typename VType>
562
563 // filter for fv1 type data
564 template <typename VType>
569
570 // filter for crouzeix-raviart grid function with output in node attachment
571 template <typename VType>
576
577 // compute average mesh size
579
580 inline number width(vertex_type* vrt){
581 std::vector<DoFIndex> multInd;
582 m_width->inner_dof_indices(vrt,0, multInd);
583 return DoFRef(*m_width,multInd[0]);
584 }
585
586 inline number width(side_type* side){
587 std::vector<DoFIndex> multInd;
588 m_width->inner_dof_indices(side,0, multInd);
589 return DoFRef(*m_width,multInd[0]);
590 }
591
592 template <typename TElem>
594 domain_type& domain = *m_width->domain().get();
595 std::vector<DoFIndex> multInd;
596 for(int si = 0; si < domain.subset_handler()->num_subsets(); ++si)
597 {
598 // get iterators
599 ElemIterator iter = m_width->template begin<elem_type>(si);
600 ElemIterator iterEnd = m_width->template end<elem_type>(si);
601
602 // loop elements of dimension
603 for( ;iter !=iterEnd; ++iter)
604 {
605 // get Elem
606 elem_type* elem = *iter;
607 m_width->inner_dof_indices(elem,0, multInd);
608 DoFRef(*m_width,multInd[0])=width;
609 }
610 }
611 }
612
613 template <typename TElem>
615 domain_type& domain = *m_width->domain().get();
616 std::vector<DoFIndex> multInd;
617 number maxwidth = 0;
618 for(int si = 0; si < domain.subset_handler()->num_subsets(); ++si)
619 {
620 // get iterators
621 ElemIterator iter = m_width->template begin<elem_type>(si);
622 ElemIterator iterEnd = m_width->template end<elem_type>(si);
623
624 // loop elements of dimension
625 for( ;iter !=iterEnd; ++iter)
626 {
627 // get Elem
628 elem_type* elem = *iter;
629 m_width->inner_dof_indices(elem,0, multInd);
630 maxwidth=std::max(DoFRef(*m_width,multInd[0]),maxwidth);
631 }
632 }
633 m_maxwidth = maxwidth;
634 return maxwidth;
635 }
636
638 m_walls.push_back(w);
639 }
640
641 template <typename VType,typename TElem>
646
647 // constructors
649 m_width = fwidth;
650 m_uInfo = u;
651 domain_type& domain = *u->domain().get();
652 if (u->local_finite_element_id(0) == LFEID(LFEID::CROUZEIX_RAVIART, dim, 1)){
653 domain.grid()->template attach_to<side_type>(m_aSideVolume);
654 m_acSideVolume.access(*domain.grid(),m_aSideVolume);
655 } else {
656 domain.grid()->template attach_to<vertex_type>(m_aVertexVolume);
657 m_acSideVolume.access(*domain.grid(),m_aVertexVolume);
658 }
659 if (initWidth){
661 if (m_width->local_finite_element_id(0) == LFEID(LFEID::CROUZEIX_RAVIART, dim, 1)){
662 init_width<side_type>(width);
663 }
664 if (m_width->local_finite_element_id(0) == LFEID(LFEID::LAGRANGE, dim, 1)){
665 init_width<vertex_type>(width);
666 }
667 }
668 }
669
671 domain_type& domain = *m_uInfo->domain().get();
672 domain.grid()->template detach_from<side_type>(m_aSideVolume);
673 domain.grid()->template detach_from<vertex_type>(m_aVertexVolume);
674 }
675
676private:
677 template <typename VType>
680 std::vector< MathVector<dim> >& coord,
681 VType values[DimFV1Geometry<dim>::maxNumSCV],
683 std::vector<side_type*>& sides
684 );
685
686 // volume attachment
691
693
694 // grid function
696
697 // filter width
699
701
702 std::vector<WallObject<TGridFunction> > m_walls;
703
706};
707
708
709
710// Box filter with local filter volume given by vertex-centered FV (fv1 geometry)
711template <typename TGridFunction>
713 : public FilterImplBaseClass<FV1BoxFilter<TGridFunction>,TGridFunction>
714{
715public:
716 // base type
718
719 // dimension
720 static const size_t dim = TGridFunction::dim;
721
722 // element type
723 typedef typename TGridFunction::template dim_traits<dim>::grid_base_object elem_type;
724
725 // domain type
726 typedef typename TGridFunction::domain_type domain_type;
727
728 // side type
729 typedef typename elem_type::side side_type;
730
731 // vertex type
733
734 // grid type
735 typedef typename domain_type::grid_type grid_type;
736
737 // position accessor type
738 typedef typename domain_type::position_accessor_type position_accessor_type;
739
740 // element iterator
741 typedef typename TGridFunction::template dim_traits<dim>::const_iterator ElemIterator;
742
743 // side iterator
744 typedef typename TGridFunction::template traits<side_type>::const_iterator SideIterator;
745
746 // vertex iterator
747 typedef typename TGridFunction::template traits<vertex_type>::const_iterator VertexIterator;
748
751
752 // filter for crouzeix-raviart type data
753 template <typename VType>
756
757 // filter for fv1 type data
758 template <typename VType>
761
762 // filter for crouzeix-raviart grid function with output in node attachment
763 template <typename VType>
769
770 // return filter width
771 inline number width(vertex_type* vrt){ return pow(m_acVertexVolume[vrt],(number)1.0/dim); }
772
773 inline number width(side_type* side){ return pow(m_acSideVolume[side],(number)1.0/dim); }
774
776 if (m_uInfo->local_finite_element_id(0) == LFEID(LFEID::CROUZEIX_RAVIART, dim, 1)){
778 } else {
780 }
781 }
782
784
786
788 m_walls.push_back(w);
789 }
790
791 // constructor
793 m_uInfo = u;
794 domain_type& domain = *u->domain().get();
795 if (u->local_finite_element_id(0) == LFEID(LFEID::CROUZEIX_RAVIART, dim, 1)){
796 domain.grid()->template attach_to<side_type>(m_aSideVolume);
797 m_acSideVolume.access(*domain.grid(),m_aSideVolume);
798 } else {
799 domain.grid()->template attach_to<vertex_type>(m_aVertexVolume);
800 m_acSideVolume.access(*domain.grid(),m_aVertexVolume);
801 }
802 }
803
804 // destructor
806 domain_type& domain = *m_uInfo->domain().get();
807 domain.grid()->template detach_from<side_type>(m_aSideVolume);
808 domain.grid()->template detach_from<vertex_type>(m_aVertexVolume);
809 }
810
811private:
812 // volume attachment
817
818 // grid function
820
821 std::vector<WallObject<TGridFunction> > m_walls;
822
825};
826
827
828// Box filter with local filter volume given by vertex-centered FV (fv1 geometry)
829template <typename TGridFunction>
831 : public FilterImplBaseClass<FVCRBoxFilter<TGridFunction>,TGridFunction>
832{
833public:
834 // base type
836
837 // dimension
838 static const size_t dim = TGridFunction::dim;
839
840 // element type
841 typedef typename TGridFunction::template dim_traits<dim>::grid_base_object elem_type;
842
843 // domain type
844 typedef typename TGridFunction::domain_type domain_type;
845
846 // side type
847 typedef typename elem_type::side side_type;
848
849 // vertex type
851
852 // grid type
853 typedef typename domain_type::grid_type grid_type;
854
855 // position accessor type
856 typedef typename domain_type::position_accessor_type position_accessor_type;
857
858 // element iterator
859 typedef typename TGridFunction::template dim_traits<dim>::const_iterator ElemIterator;
860
861 // side iterator
862 typedef typename TGridFunction::template traits<side_type>::const_iterator SideIterator;
863
864 // vertex iterator
865 typedef typename TGridFunction::template traits<vertex_type>::const_iterator VertexIterator;
866
869
870 // filter for crouzeix-raviart type data
871 template <typename VType>
874
875 // filter for fv1 type data
876 template <typename VType>
882
883 // filter for crouzeix-raviart grid function with output in node attachment
884 template <typename VType>
890
892 m_walls.push_back(w);
893 }
894
895 // return filter width
896 inline number width(vertex_type* vrt){ UG_THROW("not implemented"); return 0; }
897
898 inline number width(side_type* side){ return pow(m_acSideVolume[side],(number)1.0/dim); }
899
901 if (m_uInfo->local_finite_element_id(0) == LFEID(LFEID::CROUZEIX_RAVIART, dim, 1)){
903 } else {
905 }
906 }
907
909 UG_LOG("not implemented\n");
910 }
911
913
914 // constructors
916 m_uInfo = u;
917 domain_type& domain = *u->domain().get();
918 if (u->local_finite_element_id(0) != LFEID(LFEID::CROUZEIX_RAVIART, dim, 1))
919 UG_THROW("Only implemented for Crouzeix-Raviart type functions.");
920 domain.grid()->template attach_to<side_type>(m_aSideVolume);
921 m_acSideVolume.access(*domain.grid(),m_aSideVolume);
922 }
923
925 domain_type& domain = *m_uInfo->domain().get();
926 domain.grid()->template detach_from<side_type>(m_aSideVolume);
927 }
928
929 private:
930 // volume attachment
933 //ANumber m_aVertexVolume;
934 //aVertexNumber m_acVertexVolume;
935
936 // grid function
938
939 std::vector<WallObject<TGridFunction> > m_walls;
940
943};
944
945// Box filter with local filter volume given by vertex-centered FV (fv1 geometry)
946template <typename TGridFunction>
948: public FilterImplBaseClass<ElementBoxFilter<TGridFunction>,TGridFunction>
949{
950public:
951 // base type
953
954 // dimension
955 static const size_t dim = TGridFunction::dim;
956
957 // element type
958 typedef typename TGridFunction::template dim_traits<dim>::grid_base_object elem_type;
959
960 // domain type
961 typedef typename TGridFunction::domain_type domain_type;
962
963 // side type
964 typedef typename elem_type::side side_type;
965
966 // vertex type
968
969 // grid type
970 typedef typename domain_type::grid_type grid_type;
971
972 // position accessor type
973 typedef typename domain_type::position_accessor_type position_accessor_type;
974
975 // element iterator
976 typedef typename TGridFunction::template dim_traits<dim>::const_iterator ElemIterator;
977
978 // side iterator
979 typedef typename TGridFunction::template traits<side_type>::const_iterator SideIterator;
980
981 // vertex iterator
982 typedef typename TGridFunction::template traits<vertex_type>::const_iterator VertexIterator;
983
986
987 // filter for crouzeix-raviart type data
988 template <typename VType>
991
992 // filter for fv1 type data
993 template <typename VType>
996
997 // filter for crouzeix-raviart grid function with output in node attachment
998 template <typename VType>
1001 {
1002 UG_THROW("not implemented");
1003 };
1004
1005 // return filter width
1006 inline number width(vertex_type* vrt){ return pow(m_acVertexVolume[vrt],(number)1.0/dim); }
1007
1008 inline number width(side_type* side){ return pow(m_acSideVolume[side],(number)1.0/dim); }
1009
1011 if (m_uInfo->local_finite_element_id(0) == LFEID(LFEID::CROUZEIX_RAVIART, dim, 1)){
1013 } else {
1015 }
1016 }
1017
1019
1021
1023 m_walls.push_back(w);
1024 }
1025
1026 // constructors
1028 m_uInfo = u;
1029 domain_type& domain = *u->domain().get();
1030 if (u->local_finite_element_id(0) == LFEID(LFEID::CROUZEIX_RAVIART, dim, 1)){
1031 domain.grid()->template attach_to<side_type>(m_aSideVolume);
1032 m_acSideVolume.access(*domain.grid(),m_aSideVolume);
1033 } else {
1034 domain.grid()->template attach_to<side_type>(m_aVertexVolume);
1035 m_acSideVolume.access(*domain.grid(),m_aVertexVolume);
1036 }
1037 }
1038
1040 domain_type& domain = *m_uInfo->domain().get();
1041 domain.grid()->template detach_from<side_type>(m_aSideVolume);
1042 domain.grid()->template detach_from<vertex_type>(m_aVertexVolume);
1043 }
1044
1045private:
1046 // volume attachment
1051
1052 // grid function
1054
1055 std::vector<WallObject<TGridFunction> > m_walls;
1056
1059};
1060
1061} // end namespace NavierStokes
1062} // end namespace ug
1063
1064#include "filter_impl.h"
1065
1066#endif /* __H__UG__LIB_DISC__NAVIER_STOKES__INCOMPRESSIBLE__FILTER__ */
function NavierStokes(fcts, subsets, discType)
T * get()
TGridFunction::template dim_traits< dim >::grid_base_object elem_type
Definition filter.h:393
domain_type::position_accessor_type position_accessor_type
Definition filter.h:408
ConstantBoxFilter(SmartPtr< TGridFunction > u)
Definition filter.h:467
number m_width
Definition filter.h:502
number width(vertex_type *vrt)
Definition filter.h:445
number compute_average_element_size(SmartPtr< TGridFunction > u)
Definition filter_impl.h:78
TGridFunction::template traits< vertex_type >::const_iterator VertexIterator
vertex iterator
Definition filter.h:417
std::vector< WallObject< TGridFunction > > m_walls
Definition filter.h:509
PeriodicAttachmentAccessor< side_type, ANumber > aSideNumber
Definition filter.h:420
ANumber m_aVertexVolume
Definition filter.h:499
void apply_filter(PeriodicAttachmentAccessor< side_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u, PeriodicAttachmentAccessor< side_type, Attachment< VType > > &aaU)
Definition filter_impl.h:183
SmartPtr< TGridFunction > m_uInfo
Definition filter.h:507
ConstantBoxFilter(SmartPtr< TGridFunction > u, number width)
Definition filter.h:454
TGridFunction::template dim_traits< dim >::const_iterator ElemIterator
element iterator
Definition filter.h:411
void apply_filter(PeriodicAttachmentAccessor< vertex_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u, PeriodicAttachmentAccessor< vertex_type, Attachment< VType > > &aaU)
Definition filter.h:430
aSideNumber m_acSideVolume
Definition filter.h:498
void collectSides(PeriodicAttachmentAccessor< side_type, Attachment< VType > > &acUHat, PeriodicAttachmentAccessor< side_type, Attachment< number > > &acVolume, std::vector< MathVector< dim > > &coord, VType values[DimFV1Geometry< dim >::maxNumSCV], number volumes[DimFV1Geometry< dim >::maxNumSCV], std::vector< side_type * > &sides)
Definition filter_impl.h:101
void apply_filter(PeriodicAttachmentAccessor< vertex_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u)
Definition filter.h:437
aVertexNumber m_acVertexVolume
Definition filter.h:500
~ConstantBoxFilter()
Definition filter.h:480
static const size_t dim
Definition filter.h:390
position_accessor_type m_posAcc
Definition filter.h:504
TGridFunction::template traits< side_type >::const_iterator SideIterator
side iterator
Definition filter.h:414
FilterImplBaseClass< ConstantBoxFilter< TGridFunction >, TGridFunction > base_type
Definition filter.h:387
number width(side_type *side)
Definition filter.h:447
Vertex vertex_type
Definition filter.h:402
domain_type::grid_type grid_type
Definition filter.h:405
void add_wall(WallObject< TGridFunction > w)
Definition filter.h:449
elem_type::side side_type
Definition filter.h:399
ANumber m_aSideVolume
Definition filter.h:497
TGridFunction::domain_type domain_type
Definition filter.h:396
PeriodicAttachmentAccessor< vertex_type, ANumber > aVertexNumber
Definition filter.h:421
Definition filter.h:949
TGridFunction::template dim_traits< dim >::grid_base_object elem_type
Definition filter.h:958
static const size_t dim
Definition filter.h:955
ElementBoxFilter(SmartPtr< TGridFunction > u)
Definition filter.h:1027
number width(vertex_type *vrt)
Definition filter.h:1006
aSideNumber m_acSideVolume
Definition filter.h:1048
void compute_filterwidth_fvcr()
Definition filter_impl.h:1206
number width(side_type *side)
Definition filter.h:1008
void apply_filter(PeriodicAttachmentAccessor< side_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u, PeriodicAttachmentAccessor< side_type, Attachment< VType > > &aaU)
Definition filter_impl.h:1258
void compute_filterwidth()
Definition filter.h:1010
FilterImplBaseClass< ElementBoxFilter< TGridFunction >, TGridFunction > base_type
Definition filter.h:952
TGridFunction::template traits< side_type >::const_iterator SideIterator
Definition filter.h:979
domain_type::grid_type grid_type
Definition filter.h:970
~ElementBoxFilter()
Definition filter.h:1039
elem_type::side side_type
Definition filter.h:964
void add_wall(WallObject< TGridFunction > w)
Definition filter.h:1022
void compute_filterwidth_fv1()
Definition filter_impl.h:1076
PeriodicAttachmentAccessor< side_type, ANumber > aSideNumber
Definition filter.h:984
TGridFunction::domain_type domain_type
Definition filter.h:961
aVertexNumber m_acVertexVolume
Definition filter.h:1050
Vertex vertex_type
Definition filter.h:967
TGridFunction::template dim_traits< dim >::const_iterator ElemIterator
Definition filter.h:976
SmartPtr< TGridFunction > m_uInfo
Definition filter.h:1053
void apply_filter(PeriodicAttachmentAccessor< vertex_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u)
Definition filter.h:999
PeriodicAttachmentAccessor< vertex_type, ANumber > aVertexNumber
Definition filter.h:985
ANumber m_aSideVolume
Definition filter.h:1047
ANumber m_aVertexVolume
Definition filter.h:1049
domain_type::position_accessor_type position_accessor_type
Definition filter.h:973
TGridFunction::template traits< vertex_type >::const_iterator VertexIterator
Definition filter.h:982
std::vector< WallObject< TGridFunction > > m_walls
Definition filter.h:1055
Definition filter.h:714
void compute_filterwidth()
Definition filter.h:775
void add_wall(WallObject< TGridFunction > w)
Definition filter.h:787
static const size_t dim
Definition filter.h:720
elem_type::side side_type
Definition filter.h:729
TGridFunction::template traits< side_type >::const_iterator SideIterator
Definition filter.h:744
void compute_filterwidth_fvcr()
Definition filter_impl.h:764
std::vector< WallObject< TGridFunction > > m_walls
Definition filter.h:821
number width(side_type *side)
Definition filter.h:773
domain_type::position_accessor_type position_accessor_type
Definition filter.h:738
void apply_filter(PeriodicAttachmentAccessor< side_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u, PeriodicAttachmentAccessor< side_type, Attachment< VType > > &aaU)
Definition filter_impl.h:822
Vertex vertex_type
Definition filter.h:732
TGridFunction::template traits< vertex_type >::const_iterator VertexIterator
Definition filter.h:747
PeriodicAttachmentAccessor< vertex_type, ANumber > aVertexNumber
Definition filter.h:750
domain_type::grid_type grid_type
Definition filter.h:735
FV1BoxFilter(SmartPtr< TGridFunction > u)
Definition filter.h:792
TGridFunction::domain_type domain_type
Definition filter.h:726
number width(vertex_type *vrt)
Definition filter.h:771
ANumber m_aSideVolume
Definition filter.h:813
FilterImplBaseClass< FV1BoxFilter< TGridFunction >, TGridFunction > base_type
Definition filter.h:717
PeriodicAttachmentAccessor< side_type, ANumber > aSideNumber
Definition filter.h:749
aSideNumber m_acSideVolume
Definition filter.h:814
TGridFunction::template dim_traits< dim >::grid_base_object elem_type
Definition filter.h:723
void apply_filter(PeriodicAttachmentAccessor< vertex_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u)
Definition filter.h:764
ANumber m_aVertexVolume
Definition filter.h:815
SmartPtr< TGridFunction > m_uInfo
Definition filter.h:819
TGridFunction::template dim_traits< dim >::const_iterator ElemIterator
Definition filter.h:741
void compute_filterwidth_fv1()
Definition filter_impl.h:721
aVertexNumber m_acVertexVolume
Definition filter.h:816
~FV1BoxFilter()
Definition filter.h:805
Definition filter.h:832
Vertex vertex_type
Definition filter.h:850
PeriodicAttachmentAccessor< vertex_type, ANumber > aVertexNumber
Definition filter.h:868
TGridFunction::template dim_traits< dim >::grid_base_object elem_type
Definition filter.h:841
domain_type::position_accessor_type position_accessor_type
Definition filter.h:856
void apply_filter(PeriodicAttachmentAccessor< vertex_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u, PeriodicAttachmentAccessor< vertex_type, Attachment< VType > > &aaU)
Definition filter.h:877
void apply_filter(PeriodicAttachmentAccessor< vertex_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u)
Definition filter.h:885
domain_type::grid_type grid_type
Definition filter.h:853
PeriodicAttachmentAccessor< side_type, ANumber > aSideNumber
Definition filter.h:867
void apply_filter(PeriodicAttachmentAccessor< side_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u, PeriodicAttachmentAccessor< side_type, Attachment< VType > > &aaU)
Definition filter_impl.h:930
~FVCRBoxFilter()
Definition filter.h:924
TGridFunction::template traits< vertex_type >::const_iterator VertexIterator
Definition filter.h:865
FilterImplBaseClass< FVCRBoxFilter< TGridFunction >, TGridFunction > base_type
Definition filter.h:835
number width(vertex_type *vrt)
Definition filter.h:896
elem_type::side side_type
Definition filter.h:847
TGridFunction::template dim_traits< dim >::const_iterator ElemIterator
Definition filter.h:859
FVCRBoxFilter(SmartPtr< TGridFunction > u)
Definition filter.h:915
void compute_filterwidth()
Definition filter.h:900
std::vector< WallObject< TGridFunction > > m_walls
Definition filter.h:939
TGridFunction::domain_type domain_type
Definition filter.h:844
number width(side_type *side)
Definition filter.h:898
SmartPtr< TGridFunction > m_uInfo
Definition filter.h:937
ANumber m_aSideVolume
Definition filter.h:931
static const size_t dim
Definition filter.h:838
void compute_filterwidth_fv1()
Definition filter.h:908
void add_wall(WallObject< TGridFunction > w)
Definition filter.h:891
aSideNumber m_acSideVolume
Definition filter.h:932
TGridFunction::template traits< side_type >::const_iterator SideIterator
Definition filter.h:862
void compute_filterwidth_fvcr()
Definition filter_impl.h:1027
Definition filter.h:128
MathVector< dim > type0
Definition filter.h:149
virtual number width(vertex_type *vrt)
Definition filter.h:184
static const size_t dim
dimension
Definition filter.h:131
virtual void apply(PeriodicAttachmentAccessor< vertex_type, Attachment< type0 > > &aaUHat, SmartPtr< TGridFunction > u)
Definition filter.h:178
number type1
Definition filter.h:150
virtual void apply(PeriodicAttachmentAccessor< vertex_type, Attachment< type1 > > &aaUHat, PeriodicAttachmentAccessor< vertex_type, Attachment< type1 > > &aaU)
Definition filter.h:171
virtual number width(side_type *side)
Definition filter.h:186
TGridFunction::domain_type domain_type
domain type
Definition filter.h:137
virtual void apply(SmartPtr< TGridFunction > u)
Definition filter.h:182
domain_type::grid_type grid_type
grid type
Definition filter.h:140
virtual void apply(PeriodicAttachmentAccessor< side_type, Attachment< type1 > > &aaUHat, PeriodicAttachmentAccessor< side_type, Attachment< type1 > > &aaU)
Definition filter.h:157
virtual void apply(PeriodicAttachmentAccessor< vertex_type, Attachment< type0 > > &aaUHat, PeriodicAttachmentAccessor< vertex_type, Attachment< type0 > > &aaU)
Definition filter.h:168
virtual ~FilterBaseClass()
Definition filter.h:191
virtual void apply(PeriodicAttachmentAccessor< vertex_type, Attachment< type2 > > &aaUHat, PeriodicAttachmentAccessor< vertex_type, Attachment< type2 > > &aaU)
Definition filter.h:174
MathSymmetricMatrix< dim > type2
Definition filter.h:151
TGridFunction::template dim_traits< dim >::grid_base_object elem_type
element type
Definition filter.h:134
virtual void apply(PeriodicAttachmentAccessor< side_type, Attachment< type0 > > &aaUHat, PeriodicAttachmentAccessor< side_type, Attachment< type0 > > &aaU)
Definition filter.h:154
Vertex vertex_type
Definition filter.h:146
virtual void compute_filterwidth()
Definition filter.h:188
virtual void apply(PeriodicAttachmentAccessor< side_type, Attachment< type2 > > &aaUHat, PeriodicAttachmentAccessor< side_type, Attachment< type2 > > &aaU)
Definition filter.h:160
elem_type::side side_type
side type
Definition filter.h:143
virtual void apply(PeriodicAttachmentAccessor< side_type, Attachment< type0 > > &aaUHat, SmartPtr< TGridFunction > u)
Definition filter.h:164
FilterBaseClass()
Definition filter.h:190
domain_type::grid_type grid_type
grid type
Definition filter.h:210
FilterBaseClass< TGridFunction >::type2 type2
Definition filter.h:221
void apply(PeriodicAttachmentAccessor< side_type, Attachment< type1 > > &aaUHat, PeriodicAttachmentAccessor< side_type, Attachment< type1 > > &aaU)
Definition filter.h:229
TGridFunction::template dim_traits< dim >::grid_base_object elem_type
element type
Definition filter.h:204
void apply(PeriodicAttachmentAccessor< vertex_type, Attachment< type2 > > &aaUHat, PeriodicAttachmentAccessor< vertex_type, Attachment< type2 > > &aaU)
Definition filter.h:257
FilterBaseClass< TGridFunction >::type1 type1
Definition filter.h:220
void apply(PeriodicAttachmentAccessor< vertex_type, Attachment< type0 > > &aaUHat, SmartPtr< TGridFunction > u)
Definition filter.h:263
TGridFunction::domain_type domain_type
domain type
Definition filter.h:207
TImpl & getImpl()
access to implementation
Definition filter.h:368
elem_type::side side_type
side type
Definition filter.h:213
void assignVal(MathVector< 2 > &v, size_t ind, number value)
Definition filter.h:350
void assignVal(MathVector< 3 > &v, size_t ind, number value)
Definition filter.h:354
static const size_t dim
dimension
Definition filter.h:201
const TImpl & getImpl() const
const access to implementation
Definition filter.h:371
void copyWallData(PeriodicAttachmentAccessor< TElem, Attachment< VType > > &acUHat, SmartPtr< TGridFunction > u, std::vector< WallObject< TGridFunction > > walls)
Definition filter.h:299
void apply(PeriodicAttachmentAccessor< side_type, Attachment< type2 > > &aaUHat, PeriodicAttachmentAccessor< side_type, Attachment< type2 > > &aaU)
Definition filter.h:234
Vertex vertex_type
Definition filter.h:216
void copyWallData(PeriodicAttachmentAccessor< TElem, Attachment< VType > > &acUHat, PeriodicAttachmentAccessor< TElem, Attachment< VType > > &acU, SmartPtr< TGridFunction > u, std::vector< WallObject< TGridFunction > > walls)
Definition filter.h:325
void apply(SmartPtr< TGridFunction > u)
Definition filter.h:290
void apply(PeriodicAttachmentAccessor< side_type, Attachment< type0 > > &aaUHat, PeriodicAttachmentAccessor< side_type, Attachment< type0 > > &aaU)
Definition filter.h:224
void apply(PeriodicAttachmentAccessor< vertex_type, Attachment< type1 > > &aaUHat, PeriodicAttachmentAccessor< vertex_type, Attachment< type1 > > &aaU)
Definition filter.h:252
void assignVal(number &v, size_t ind, number value)
Definition filter.h:346
void apply_(SmartPtr< TGridFunction > u)
Definition filter.h:273
void assignVal(MathSymmetricMatrix< 3 > &v, size_t ind, number value)
Definition filter.h:362
void assignVal(MathSymmetricMatrix< 2 > &v, size_t ind, number value)
Definition filter.h:358
FilterBaseClass< TGridFunction >::type0 type0
Definition filter.h:219
void apply(PeriodicAttachmentAccessor< vertex_type, Attachment< type0 > > &aaUHat, PeriodicAttachmentAccessor< vertex_type, Attachment< type0 > > &aaU)
Definition filter.h:247
void apply(PeriodicAttachmentAccessor< side_type, Attachment< type0 > > &aaUHat, SmartPtr< TGridFunction > u)
Definition filter.h:240
position_accessor_type m_posAcc
Definition filter.h:692
number compute_average_element_size(SmartPtr< TGridFunction > u)
Definition filter_impl.h:355
void apply_filter(PeriodicAttachmentAccessor< vertex_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u)
Definition filter.h:572
TGridFunction::domain_type domain_type
Definition filter.h:531
PeriodicAttachmentAccessor< vertex_type, ANumber > aVertexNumber
Definition filter.h:556
TGridFunction::template dim_traits< dim >::const_iterator ElemIterator
element iterator
Definition filter.h:546
void collectSides(PeriodicAttachmentAccessor< side_type, Attachment< VType > > &acUHat, PeriodicAttachmentAccessor< side_type, Attachment< number > > &acVolume, std::vector< MathVector< dim > > &coord, VType values[DimFV1Geometry< dim >::maxNumSCV], number volumes[DimFV1Geometry< dim >::maxNumSCV], std::vector< side_type * > &sides)
Definition filter_impl.h:378
void add_wall(WallObject< TGridFunction > w)
Definition filter.h:637
elem_type::side side_type
Definition filter.h:534
number m_maxwidth
Definition filter.h:700
ANumber m_aVertexVolume
Definition filter.h:689
std::vector< WallObject< TGridFunction > > m_walls
Definition filter.h:702
ANumber m_aSideVolume
Definition filter.h:687
TGridFunction::template traits< side_type >::const_iterator SideIterator
side iterator
Definition filter.h:549
FilterImplBaseClass< VariableBoxFilter< TGridFunction >, TGridFunction > base_type
Definition filter.h:522
aVertexNumber m_acVertexVolume
Definition filter.h:690
~VariableBoxFilter()
Definition filter.h:670
VariableBoxFilter(SmartPtr< TGridFunction > u, SmartPtr< TGridFunction > fwidth, bool initWidth=false)
Definition filter.h:648
Vertex vertex_type
Definition filter.h:537
void apply_filter(PeriodicAttachmentAccessor< vertex_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u, PeriodicAttachmentAccessor< vertex_type, Attachment< VType > > &aaU)
Definition filter.h:565
TGridFunction::template dim_traits< dim >::grid_base_object elem_type
Definition filter.h:528
aSideNumber m_acSideVolume
Definition filter.h:688
number width(side_type *side)
Definition filter.h:586
number width(vertex_type *vrt)
Definition filter.h:580
void check_volume_sizes(PeriodicAttachmentAccessor< TElem, Attachment< VType > > &acUHat, SmartPtr< TGridFunction > u)
Definition filter.h:642
domain_type::grid_type grid_type
Definition filter.h:540
SmartPtr< TGridFunction > m_width
Definition filter.h:698
domain_type::position_accessor_type position_accessor_type
Definition filter.h:543
TGridFunction::template traits< vertex_type >::const_iterator VertexIterator
vertex iterator
Definition filter.h:552
number max_width(number width)
Definition filter.h:614
void init_width(number width)
Definition filter.h:593
SmartPtr< TGridFunction > m_uInfo
Definition filter.h:695
static const size_t dim
Definition filter.h:525
void apply_filter(PeriodicAttachmentAccessor< side_type, Attachment< VType > > &aaUHat, SmartPtr< TGridFunction > u, PeriodicAttachmentAccessor< side_type, Attachment< VType > > &aaU)
Definition filter_impl.h:463
PeriodicAttachmentAccessor< side_type, ANumber > aSideNumber
Definition filter.h:555
Definition filter.h:51
int m_subset_index
Definition filter.h:65
WallObject(SmartPtr< TGridFunction > u, size_t direction, number coord, const char *subset)
Definition filter.h:59
number dist(MathVector< TGridFunction::dim > co)
Definition filter.h:56
size_t m_direction
Definition filter.h:66
number m_coord
Definition filter.h:67
number coord()
Definition filter.h:54
int si()
Definition filter.h:53
size_t direction()
Definition filter.h:55
bool access(Grid &g, TAttachment &a)
bool is_slave(TElem *) const
SmartPtr< TGrid > grid()
size_t num_subsets() const
const NullSmartPtr SPNULL
#define UG_THROW(msg)
#define UG_LOG(msg)
double number
void initAttachment(PeriodicAttachmentAccessor< elem_type, attachment_type > &accessor, attachment_type &attachment, grid_type &grid)
Definition filter.h:119
void copyAttachmentToGridFunction(SmartPtr< TGridFunction > u, PeriodicAttachmentAccessor< elem_type, Attachment< MathVector< dim > > > &aaU)
Definition filter.h:71
void copyGridFunctionToAttachment(PeriodicAttachmentAccessor< elem_type, Attachment< MathVector< dim > > > &aaU, SmartPtr< TGridFunction > u)
Definition filter.h:95
const number & DoFRef(const TMatrix &mat, const DoFIndex &iInd, const DoFIndex &jInd)
Definition filter.h:375
size_t firstIndex
Definition filter.h:376
MathVector< dim > periodicOffset
Definition filter.h:377