DUNE-ACFEM (unstable)

unaryexpression.hh
1 #ifndef __DUNE_ACFEM_MODELS_UNARYEXPRESSION_HH__
2 #define __DUNE_ACFEM_MODELS_UNARYEXPRESSION_HH__
3 
4 #include "../expressions/operationtraits.hh"
5 #include "../expressions/storage.hh"
6 #include "../expressions/interface.hh"
7 #include "../expressions/signutil.hh"
8 #include "../common/literals.hh"
9 #include "../tensors/tensor.hh"
10 
11 #include "modeltraits.hh"
12 #include "expressionoperations.hh"
13 
14 namespace Dune
15 {
16 
17  namespace ACFem
18  {
19 
32  namespace PDEModel {
33 
34  using namespace Literals;
35 
37  using namespace ModelIntrospection;
38 
40  template<class Model, class Quadrature = PointWrapperQuadrature<typename Model::DomainType> >
41  using AllArgs = typename Traits<Model>::template AllArguments<Quadrature>;
42 
79  template<class Model, class ReturnValueFunctor, std::size_t tag,
80  class LinArgSeq, class OuterArgSeq, class InnerArgSeq,
81  class Enable = void>
82  class ModelMethod;
83 
85  template<class Model,
86  std::size_t tag,
88  class F = OperationTraits<IdentityOperation> >
90  Model, F, tag,
94  >;
95 
129  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
130  class ModelMethod<Model, F, flux,
131  IndexSequence<>,
132  IndexSequence<pointIndex, OuterArgsIdx...>,
133  IndexSequence<InnerArgsIdx...>,
134  std::enable_if_t<Traits<Model>::template HasMethod<flux>::value> >
135  {
136  public:
137  static constexpr MethodTag tag = ModelIntrospection::flux;
138 
139  ModelMethod(const Model& model, const F& f = F())
140  : model_(model), f_(f)
141  {}
142 
144  template<class Quadrature>
145  auto flux(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
146  {
147  return f_(model_.flux(std::get<InnerArgsIdx>(std::forward_as_tuple(x, args...))...));
148  }
149 
151  template<class Quadrature>
152  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
153  {
154  return flux(x, args...);
155  }
156 
157  private:
158  const Model& model_;
159  const F& f_;
160  };
161 
163  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
164  class ModelMethod<Model, F, flux,
165  IndexSequence<>,
166  IndexSequence<OuterArgsIdx...>,
167  IndexSequence<InnerArgsIdx...>,
168  std::enable_if_t<Traits<Model>::template HasMethod<flux>::value> >
169  {
170  public:
171  static constexpr MethodTag tag = ModelIntrospection::flux;
172 
173  ModelMethod(const Model& model, const F& f = F())
174  : model_(model), f_(f)
175  {}
176 
178  auto flux(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
179  {
180  return f_(model_.flux(std::get<InnerArgsIdx>(std::forward_as_tuple(args...))...));
181  }
182 
184  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
185  {
186  return flux(args...);
187  }
188 
189  private:
190  const Model& model_;
191  const F& f_;
192  };
193 
195  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
196  class ModelMethod<Model, F, flux,
197  IndexSequence<>,
198  IndexSequence<pointIndex, OuterArgsIdx...>,
199  IndexSequence<InnerArgsIdx...>,
200  std::enable_if_t<!Traits<Model>::template HasMethod<flux>::value> >
201  {
202  public:
203  static constexpr MethodTag tag = ModelIntrospection::flux;
204 
205  ModelMethod(const Model& model, const F& f = F())
206  : l_(model, f)
207  {}
208 
210  template<class Quadrature>
211  auto flux(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
212  {
213  return l_(x, args...);
214  }
215 
217  template<class Quadrature>
218  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
219  {
220  return l_(x, args...);
221  }
222 
223  private:
224  const TaggedModelMethod<Model, LinearizedTag<tag>::value, SequenceMask<pointIndex, OuterArgsIdx...>::value, F> l_;
225  };
226 
228  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
229  class ModelMethod<Model, F, flux,
230  IndexSequence<>,
231  IndexSequence<OuterArgsIdx...>,
232  IndexSequence<InnerArgsIdx...>,
233  std::enable_if_t<!Traits<Model>::template HasMethod<flux>::value> >
234  {
235  public:
236  static constexpr MethodTag tag = ModelIntrospection::flux;
237 
238  ModelMethod(const Model& model, const F& f = F())
239  : l_(model, f)
240  {}
241 
243  auto flux(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
244  {
245  return l_(args...);
246  }
247 
249  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
250  {
251  return l_(args...);
252  }
253 
254  private:
255  const TaggedModelMethod<Model, LinearizedTag<tag>::value, SequenceMask<OuterArgsIdx...>::value, F> l_;
256  };
257 
268  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
269  class ModelMethod<Model, F, linearizedFlux,
270  IndexSequence<LinArgsIdx...>,
271  IndexSequence<pointIndex, OuterArgsIdx...>,
272  IndexSequence<InnerArgsIdx...>,
273  std::enable_if_t<Traits<Model>::template HasMethod<linearizedFlux>::value> >
274  {
275  public:
276  static constexpr MethodTag tag = ModelIntrospection::linearizedFlux;
277 
278  ModelMethod(const Model& model, const F& f = F())
279  : model_(model), f_(f)
280  {}
281 
283  template<class Quadrature>
284  auto linearizedFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
286  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
287  {
288  return f_(model_.linearizedFlux(std::get<InnerArgsIdx>(std::forward_as_tuple(linArgs..., x, args...))...));
289  }
290 
292  template<class Quadrature>
293  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
295  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
296  {
297  return linearizedFlux(linArgs..., x, args...);
298  }
299 
300  private:
301  const Model& model_;
302  const F& f_;
303  };
304 
306  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
307  class ModelMethod<Model, F, linearizedFlux,
308  IndexSequence<LinArgsIdx...>,
309  IndexSequence<OuterArgsIdx...>,
310  IndexSequence<InnerArgsIdx...>,
311  std::enable_if_t<Traits<Model>::template HasMethod<linearizedFlux>::value> >
312  {
313  public:
314  static constexpr MethodTag tag = ModelIntrospection::linearizedFlux;
315 
316  ModelMethod(const Model& model, const F& f = F())
317  : model_(model), f_(f)
318  {}
319 
321  auto linearizedFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
322  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
323  {
324  return f_(model_.linearizedFlux(std::get<InnerArgsIdx>(std::forward_as_tuple(linArgs..., args...))...));
325  }
326 
328  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
329  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
330  {
331  return linearizedFlux(linArgs..., args...);
332  }
333 
334  private:
335  const Model& model_;
336  const F& f_;
337  };
338 
340  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
341  class ModelMethod<Model, F, linearizedFlux,
342  IndexSequence<LinArgsIdx...>,
343  IndexSequence<pointIndex, OuterArgsIdx...>,
344  IndexSequence<InnerArgsIdx...>,
345  std::enable_if_t<!Traits<Model>::template HasMethod<linearizedFlux>::value> >
346  {
347  public:
348  static constexpr MethodTag tag = ModelIntrospection::linearizedFlux;
349 
350  ModelMethod(const Model& model, const F& f = F())
351  {}
352 
354  template<class Quadrature>
355  auto linearizedFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
357  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
358  {
359  return typename Traits<Model>::template ReturnType<tag>(0);
360  }
361 
363  template<class Quadrature>
364  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
366  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
367  {
368  return typename Traits<Model>::template ReturnType<tag>(0);
369  }
370  };
371 
373  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
374  class ModelMethod<Model, F, linearizedFlux,
375  IndexSequence<LinArgsIdx...>,
376  IndexSequence<OuterArgsIdx...>,
377  IndexSequence<InnerArgsIdx...>,
378  std::enable_if_t<!Traits<Model>::template HasMethod<linearizedFlux>::value> >
379  {
380  public:
381  static constexpr MethodTag tag = ModelIntrospection::linearizedFlux;
382 
383  ModelMethod(const Model& model, const F& f = F())
384  {}
385 
387  auto linearizedFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
388  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
389  {
390  return typename Traits<Model>::template ReturnType<tag>(0);
391  }
392 
394  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
395  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
396  {
397  return typename Traits<Model>::template ReturnType<tag>(0);
398  }
399  };
400 
411  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
412  class ModelMethod<Model, F, source,
413  IndexSequence<>,
414  IndexSequence<pointIndex, OuterArgsIdx...>,
415  IndexSequence<InnerArgsIdx...>,
416  std::enable_if_t<Traits<Model>::template HasMethod<source>::value> >
417  {
418  public:
419  static constexpr MethodTag tag = ModelIntrospection::source;
420 
421  ModelMethod(const Model& model, const F& f = F())
422  : model_(model), f_(f)
423  {}
424 
426  template<class Quadrature>
427  auto source(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
428  {
429  return f_(model_.source(std::get<InnerArgsIdx>(std::forward_as_tuple(x, args...))...));
430  }
431 
433  template<class Quadrature>
434  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
435  {
436  return source(x, args...);
437  }
438 
439  private:
440  const Model& model_;
441  const F& f_;
442  };
443 
445  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
446  class ModelMethod<Model, F, source,
447  IndexSequence<>,
448  IndexSequence<OuterArgsIdx...>,
449  IndexSequence<InnerArgsIdx...>,
450  std::enable_if_t<Traits<Model>::template HasMethod<source>::value> >
451  {
452  public:
453  static constexpr MethodTag tag = ModelIntrospection::source;
454 
455  ModelMethod(const Model& model, const F& f = F())
456  : model_(model), f_(f)
457  {}
458 
460  auto source(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
461  {
462  return f_(model_.source(std::get<InnerArgsIdx>(std::forward_as_tuple(args...))...));
463  }
464 
466  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
467  {
468  return source(args...);
469  }
470 
471  private:
472  const Model& model_;
473  const F& f_;
474  };
475 
477  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
478  class ModelMethod<Model, F, source,
479  IndexSequence<>,
480  IndexSequence<pointIndex, OuterArgsIdx...>,
481  IndexSequence<InnerArgsIdx...>,
482  std::enable_if_t<!Traits<Model>::template HasMethod<source>::value> >
483  {
484  public:
485  static constexpr MethodTag tag = ModelIntrospection::source;
486 
487  ModelMethod(const Model& model, const F& f = F())
488  : l_(model, f)
489  {}
490 
492  template<class Quadrature>
493  auto source(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
494  {
495  return l_(x, args...);
496  }
497 
499  template<class Quadrature>
500  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
501  {
502  return l_(x, args...);
503  }
504 
505  private:
506  const TaggedModelMethod<Model, LinearizedTag<tag>::value, SequenceMask<pointIndex, OuterArgsIdx...>::value, F> l_;
507  };
508 
510  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
511  class ModelMethod<Model, F, source,
512  IndexSequence<>,
513  IndexSequence<OuterArgsIdx...>,
514  IndexSequence<InnerArgsIdx...>,
515  std::enable_if_t<!Traits<Model>::template HasMethod<source>::value> >
516  {
517  public:
518  static constexpr MethodTag tag = ModelIntrospection::source;
519 
520  ModelMethod(const Model& model, const F& f = F())
521  : l_(model, f)
522  {}
523 
525  auto source(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
526  {
527  return l_(args...);
528  }
529 
531  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
532  {
533  return l_(args...);
534  }
535 
536  private:
537  const TaggedModelMethod<Model, LinearizedTag<tag>::value, SequenceMask<OuterArgsIdx...>::value, F> l_;
538  };
539 
550  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
551  class ModelMethod<Model, F, linearizedSource,
552  IndexSequence<LinArgsIdx...>,
553  IndexSequence<pointIndex, OuterArgsIdx...>,
554  IndexSequence<InnerArgsIdx...>,
555  std::enable_if_t<Traits<Model>::template HasMethod<linearizedSource>::value> >
556  {
557  public:
558  static constexpr MethodTag tag = ModelIntrospection::linearizedSource;
559 
560  ModelMethod(const Model& model, const F& f = F())
561  : model_(model), f_(f)
562  {}
563 
565  template<class Quadrature>
566  auto linearizedSource(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
568  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
569  {
570  return f_(model_.linearizedSource(std::get<InnerArgsIdx>(std::forward_as_tuple(linArgs..., x, args...))...));
571  }
572 
574  template<class Quadrature>
575  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
577  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
578  {
579  return linearizedSource(linArgs..., x, args...);
580  }
581 
582  private:
583  const Model& model_;
584  const F& f_;
585  };
586 
588  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
589  class ModelMethod<Model, F, linearizedSource,
590  IndexSequence<LinArgsIdx...>,
591  IndexSequence<OuterArgsIdx...>,
592  IndexSequence<InnerArgsIdx...>,
593  std::enable_if_t<Traits<Model>::template HasMethod<linearizedSource>::value> >
594  {
595  public:
596  static constexpr MethodTag tag = ModelIntrospection::linearizedSource;
597 
598  ModelMethod(const Model& model, const F& f = F())
599  : model_(model), f_(f)
600  {}
601 
603  auto linearizedSource(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
604  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
605  {
606  return f_(model_.linearizedSource(std::get<InnerArgsIdx>(std::forward_as_tuple(linArgs..., args...))...));
607  }
608 
610  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
611  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
612  {
613  return linearizedSource(linArgs..., args...);
614  }
615 
616  private:
617  const Model& model_;
618  const F& f_;
619  };
620 
622  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
623  class ModelMethod<Model, F, linearizedSource,
624  IndexSequence<LinArgsIdx...>,
625  IndexSequence<pointIndex, OuterArgsIdx...>,
626  IndexSequence<InnerArgsIdx...>,
627  std::enable_if_t<!Traits<Model>::template HasMethod<linearizedSource>::value> >
628  {
629  public:
630  static constexpr MethodTag tag = ModelIntrospection::linearizedSource;
631 
632  ModelMethod(const Model& model, const F& f = F())
633  {}
634 
636  template<class Quadrature>
637  auto linearizedSource(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
639  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
640  {
641  return typename Traits<Model>::template ReturnType<tag>(0);
642  }
643 
645  template<class Quadrature>
646  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
648  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
649  {
650  return typename Traits<Model>::template ReturnType<tag>(0);
651  }
652  };
653 
655  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
656  class ModelMethod<Model, F, linearizedSource,
657  IndexSequence<LinArgsIdx...>,
658  IndexSequence<OuterArgsIdx...>,
659  IndexSequence<InnerArgsIdx...>,
660  std::enable_if_t<!Traits<Model>::template HasMethod<linearizedSource>::value> >
661  {
662  public:
663  static constexpr MethodTag tag = ModelIntrospection::linearizedSource;
664 
665  ModelMethod(const Model& model, const F& f = F())
666  {}
667 
669  auto linearizedSource(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
670  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
671  {
672  return typename Traits<Model>::template ReturnType<tag>(0);
673  }
674 
676  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
677  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
678  {
679  return typename Traits<Model>::template ReturnType<tag>(0);
680  }
681  };
682 
693  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
694  class ModelMethod<Model, F, robinFlux,
695  IndexSequence<>,
696  IndexSequence<pointIndex, OuterArgsIdx...>,
697  IndexSequence<InnerArgsIdx...>,
698  std::enable_if_t<Traits<Model>::template HasMethod<robinFlux>::value> >
699  {
700  public:
701  static constexpr MethodTag tag = ModelIntrospection::robinFlux;
702 
703  ModelMethod(const Model& model, const F& f = F())
704  : model_(model), f_(f)
705  {}
706 
708  template<class Quadrature>
709  auto robinFlux(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
710  {
711  return f_(model_.robinFlux(std::get<InnerArgsIdx>(std::forward_as_tuple(x, args...))...));
712  }
713 
715  template<class Quadrature>
716  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
717  {
718  return robinFlux(x, args...);
719  }
720 
721  private:
722  const Model& model_;
723  const F& f_;
724  };
725 
727  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
728  class ModelMethod<Model, F, robinFlux,
729  IndexSequence<>,
730  IndexSequence<OuterArgsIdx...>,
731  IndexSequence<InnerArgsIdx...>,
732  std::enable_if_t<Traits<Model>::template HasMethod<robinFlux>::value> >
733  {
734  public:
735  static constexpr MethodTag tag = ModelIntrospection::robinFlux;
736 
737  ModelMethod(const Model& model, const F& f = F())
738  : model_(model), f_(f)
739  {}
740 
742  auto robinFlux(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
743  {
744  return f_(model_.robinFlux(std::get<InnerArgsIdx>(std::forward_as_tuple(args...))...));
745  }
746 
748  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
749  {
750  return robinFlux(args...);
751  }
752 
753  private:
754  const Model& model_;
755  const F& f_;
756  };
757 
759  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
760  class ModelMethod<Model, F, robinFlux,
761  IndexSequence<>,
762  IndexSequence<pointIndex, OuterArgsIdx...>,
763  IndexSequence<InnerArgsIdx...>,
764  std::enable_if_t<!Traits<Model>::template HasMethod<robinFlux>::value> >
765  {
766  public:
767  static constexpr MethodTag tag = ModelIntrospection::robinFlux;
768 
769  ModelMethod(const Model& model, const F& f = F())
770  : l_(model, f)
771  {}
772 
774  template<class Quadrature>
775  auto robinFlux(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
776  {
777  return l_(x, args...);
778  }
779 
781  template<class Quadrature>
782  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
783  {
784  return l_(x, args...);
785  }
786 
787  private:
788  const TaggedModelMethod<Model, LinearizedTag<tag>::value, SequenceMask<pointIndex, OuterArgsIdx...>::value, F> l_;
789  };
790 
792  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
793  class ModelMethod<Model, F, robinFlux,
794  IndexSequence<>,
795  IndexSequence<OuterArgsIdx...>,
796  IndexSequence<InnerArgsIdx...>,
797  std::enable_if_t<!Traits<Model>::template HasMethod<robinFlux>::value> >
798  {
799  public:
800  static constexpr MethodTag tag = ModelIntrospection::robinFlux;
801 
802  ModelMethod(const Model& model, const F& f = F())
803  : l_(model, f)
804  {}
805 
807  auto robinFlux(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
808  {
809  return l_(args...);
810  }
811 
813  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
814  {
815  return l_(args...);
816  }
817 
818  private:
819  const TaggedModelMethod<Model, LinearizedTag<tag>::value, SequenceMask<OuterArgsIdx...>::value, F> l_;
820  };
821 
832  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
833  class ModelMethod<Model, F, linearizedRobinFlux,
834  IndexSequence<LinArgsIdx...>,
835  IndexSequence<pointIndex, OuterArgsIdx...>,
836  IndexSequence<InnerArgsIdx...>,
837  std::enable_if_t<Traits<Model>::template HasMethod<linearizedRobinFlux>::value> >
838  {
839  public:
840  static constexpr MethodTag tag = ModelIntrospection::linearizedRobinFlux;
841 
842  ModelMethod(const Model& model, const F& f = F())
843  : model_(model), f_(f)
844  {}
845 
847  template<class Quadrature>
848  auto linearizedRobinFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
850  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
851  {
852  return f_(model_.linearizedRobinFlux(std::get<InnerArgsIdx>(std::forward_as_tuple(linArgs..., x, args...))...));
853  }
854 
856  template<class Quadrature>
857  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
859  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
860  {
861  return linearizedRobinFlux(linArgs..., x, args...);
862  }
863 
864  private:
865  const Model& model_;
866  const F& f_;
867  };
868 
870  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
871  class ModelMethod<Model, F, linearizedRobinFlux,
872  IndexSequence<LinArgsIdx...>,
873  IndexSequence<OuterArgsIdx...>,
874  IndexSequence<InnerArgsIdx...>,
875  std::enable_if_t<Traits<Model>::template HasMethod<linearizedRobinFlux>::value> >
876  {
877  public:
878  static constexpr MethodTag tag = ModelIntrospection::linearizedRobinFlux;
879 
880  ModelMethod(const Model& model, const F& f = F())
881  : model_(model), f_(f)
882  {}
883 
885  auto linearizedRobinFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
886  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
887  {
888  return f_(model_.linearizedRobinFlux(std::get<InnerArgsIdx>(std::forward_as_tuple(linArgs..., args...))...));
889  }
890 
892  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
893  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
894  {
895  return linearizedRobinFlux(linArgs..., args...);
896  }
897 
898  private:
899  const Model& model_;
900  const F& f_;
901  };
902 
904  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
905  class ModelMethod<Model, F, linearizedRobinFlux,
906  IndexSequence<LinArgsIdx...>,
907  IndexSequence<pointIndex, OuterArgsIdx...>,
908  IndexSequence<InnerArgsIdx...>,
909  std::enable_if_t<!Traits<Model>::template HasMethod<linearizedRobinFlux>::value> >
910  {
911  public:
912  static constexpr MethodTag tag = ModelIntrospection::linearizedRobinFlux;
913 
914  ModelMethod(const Model& model, const F& f = F())
915  {}
916 
918  template<class Quadrature>
919  auto linearizedRobinFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
921  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
922  {
923  return typename Traits<Model>::template ReturnType<tag>(0);
924  }
925 
927  template<class Quadrature>
928  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
930  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
931  {
932  return typename Traits<Model>::template ReturnType<tag>(0);
933  }
934  };
935 
937  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
938  class ModelMethod<Model, F, linearizedRobinFlux,
939  IndexSequence<LinArgsIdx...>,
940  IndexSequence<OuterArgsIdx...>,
941  IndexSequence<InnerArgsIdx...>,
942  std::enable_if_t<!Traits<Model>::template HasMethod<linearizedRobinFlux>::value> >
943  {
944  public:
945  static constexpr MethodTag tag = ModelIntrospection::linearizedRobinFlux;
946 
947  ModelMethod(const Model& model, const F& f = F())
948  {}
949 
951  auto linearizedRobinFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
952  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
953  {
954  return typename Traits<Model>::template ReturnType<tag>(0);
955  }
956 
958  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
959  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
960  {
961  return typename Traits<Model>::template ReturnType<tag>(0);
962  }
963  };
964 
975  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
976  class ModelMethod<Model, F, singularFlux,
977  IndexSequence<>,
978  IndexSequence<pointIndex, OuterArgsIdx...>,
979  IndexSequence<InnerArgsIdx...>,
980  std::enable_if_t<Traits<Model>::template HasMethod<singularFlux>::value> >
981  {
982  public:
983  static constexpr MethodTag tag = ModelIntrospection::singularFlux;
984 
985  ModelMethod(const Model& model, const F& f = F())
986  : model_(model), f_(f)
987  {}
988 
990  template<class Quadrature>
991  auto singularFlux(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
992  {
993  return f_(model_.singularFlux(std::get<InnerArgsIdx>(std::forward_as_tuple(x, args...))...));
994  }
995 
997  template<class Quadrature>
998  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
999  {
1000  return singularFlux(x, args...);
1001  }
1002 
1003  private:
1004  const Model& model_;
1005  const F& f_;
1006  };
1007 
1009  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1010  class ModelMethod<Model, F, singularFlux,
1011  IndexSequence<>,
1012  IndexSequence<OuterArgsIdx...>,
1013  IndexSequence<InnerArgsIdx...>,
1014  std::enable_if_t<Traits<Model>::template HasMethod<singularFlux>::value> >
1015  {
1016  public:
1017  static constexpr MethodTag tag = ModelIntrospection::singularFlux;
1018 
1019  ModelMethod(const Model& model, const F& f = F())
1020  : model_(model), f_(f)
1021  {}
1022 
1024  auto singularFlux(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1025  {
1026  return f_(model_.singularFlux(std::get<InnerArgsIdx>(std::forward_as_tuple(args...))...));
1027  }
1028 
1030  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1031  {
1032  return singularFlux(args...);
1033  }
1034 
1035  private:
1036  const Model& model_;
1037  const F& f_;
1038  };
1039 
1041  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1042  class ModelMethod<Model, F, singularFlux,
1043  IndexSequence<>,
1044  IndexSequence<pointIndex, OuterArgsIdx...>,
1045  IndexSequence<InnerArgsIdx...>,
1046  std::enable_if_t<!Traits<Model>::template HasMethod<singularFlux>::value> >
1047  {
1048  public:
1049  static constexpr MethodTag tag = ModelIntrospection::singularFlux;
1050 
1051  ModelMethod(const Model& model, const F& f = F())
1052  : l_(model, f)
1053  {}
1054 
1056  template<class Quadrature>
1057  auto singularFlux(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1058  {
1059  return l_(x, args...);
1060  }
1061 
1063  template<class Quadrature>
1064  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1065  {
1066  return l_(x, args...);
1067  }
1068 
1069  private:
1070  const TaggedModelMethod<Model, LinearizedTag<tag>::value, SequenceMask<pointIndex, OuterArgsIdx...>::value, F> l_;
1071  };
1072 
1074  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1075  class ModelMethod<Model, F, singularFlux,
1076  IndexSequence<>,
1077  IndexSequence<OuterArgsIdx...>,
1078  IndexSequence<InnerArgsIdx...>,
1079  std::enable_if_t<!Traits<Model>::template HasMethod<singularFlux>::value> >
1080  {
1081  public:
1082  static constexpr MethodTag tag = ModelIntrospection::singularFlux;
1083 
1084  ModelMethod(const Model& model, const F& f = F())
1085  : l_(model, f)
1086  {}
1087 
1089  auto singularFlux(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1090  {
1091  return l_(args...);
1092  }
1093 
1095  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1096  {
1097  return l_(args...);
1098  }
1099 
1100  private:
1101  const TaggedModelMethod<Model, LinearizedTag<tag>::value, SequenceMask<OuterArgsIdx...>::value, F> l_;
1102  };
1103 
1114  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1115  class ModelMethod<Model, F, linearizedSingularFlux,
1116  IndexSequence<LinArgsIdx...>,
1117  IndexSequence<pointIndex, OuterArgsIdx...>,
1118  IndexSequence<InnerArgsIdx...>,
1119  std::enable_if_t<Traits<Model>::template HasMethod<linearizedSingularFlux>::value> >
1120  {
1121  public:
1122  static constexpr MethodTag tag = ModelIntrospection::linearizedSingularFlux;
1123 
1124  ModelMethod(const Model& model, const F& f = F())
1125  : model_(model), f_(f)
1126  {}
1127 
1129  template<class Quadrature>
1130  auto linearizedSingularFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1131  const QuadraturePoint<Quadrature>& x,
1132  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1133  {
1134  return f_(model_.linearizedSingularFlux(std::get<InnerArgsIdx>(std::forward_as_tuple(linArgs..., x, args...))...));
1135  }
1136 
1138  template<class Quadrature>
1139  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1140  const QuadraturePoint<Quadrature>& x,
1141  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1142  {
1143  return linearizedSingularFlux(linArgs..., x, args...);
1144  }
1145 
1146  private:
1147  const Model& model_;
1148  const F& f_;
1149  };
1150 
1152  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1153  class ModelMethod<Model, F, linearizedSingularFlux,
1154  IndexSequence<LinArgsIdx...>,
1155  IndexSequence<OuterArgsIdx...>,
1156  IndexSequence<InnerArgsIdx...>,
1157  std::enable_if_t<Traits<Model>::template HasMethod<linearizedSingularFlux>::value> >
1158  {
1159  public:
1160  static constexpr MethodTag tag = ModelIntrospection::linearizedSingularFlux;
1161 
1162  ModelMethod(const Model& model, const F& f = F())
1163  : model_(model), f_(f)
1164  {}
1165 
1167  auto linearizedSingularFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1168  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1169  {
1170  return f_(model_.linearizedSingularFlux(std::get<InnerArgsIdx>(std::forward_as_tuple(linArgs..., args...))...));
1171  }
1172 
1174  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1175  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1176  {
1177  return linearizedSingularFlux(linArgs..., args...);
1178  }
1179 
1180  private:
1181  const Model& model_;
1182  const F& f_;
1183  };
1184 
1186  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1187  class ModelMethod<Model, F, linearizedSingularFlux,
1188  IndexSequence<LinArgsIdx...>,
1189  IndexSequence<pointIndex, OuterArgsIdx...>,
1190  IndexSequence<InnerArgsIdx...>,
1191  std::enable_if_t<!Traits<Model>::template HasMethod<linearizedSingularFlux>::value> >
1192  {
1193  public:
1194  static constexpr MethodTag tag = ModelIntrospection::linearizedSingularFlux;
1195 
1196  ModelMethod(const Model& model, const F& f = F())
1197  {}
1198 
1200  template<class Quadrature>
1201  auto linearizedSingularFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1202  const QuadraturePoint<Quadrature>& x,
1203  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1204  {
1205  return typename Traits<Model>::template ReturnType<tag>(0);
1206  }
1207 
1209  template<class Quadrature>
1210  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1211  const QuadraturePoint<Quadrature>& x,
1212  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1213  {
1214  return typename Traits<Model>::template ReturnType<tag>(0);
1215  }
1216  };
1217 
1219  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1220  class ModelMethod<Model, F, linearizedSingularFlux,
1221  IndexSequence<LinArgsIdx...>,
1222  IndexSequence<OuterArgsIdx...>,
1223  IndexSequence<InnerArgsIdx...>,
1224  std::enable_if_t<!Traits<Model>::template HasMethod<linearizedSingularFlux>::value> >
1225  {
1226  public:
1227  static constexpr MethodTag tag = ModelIntrospection::linearizedSingularFlux;
1228 
1229  ModelMethod(const Model& model, const F& f = F())
1230  {}
1231 
1233  auto linearizedSingularFlux(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1234  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1235  {
1236  return typename Traits<Model>::template ReturnType<tag>(0);
1237  }
1238 
1240  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1241  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1242  {
1243  return typename Traits<Model>::template ReturnType<tag>(0);
1244  }
1245  };
1246 
1257  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1258  class ModelMethod<Model, F, ModelIntrospection::dirichlet,
1259  IndexSequence<>,
1260  IndexSequence<pointIndex, OuterArgsIdx...>,
1261  IndexSequence<InnerArgsIdx...>,
1262  std::enable_if_t<Traits<Model>::template HasMethod<ModelIntrospection::dirichlet>::value> >
1263  {
1264  public:
1265  static constexpr MethodTag tag = ModelIntrospection::dirichlet;
1266 
1267  ModelMethod(const Model& model, const F& f = F())
1268  : model_(model), f_(f)
1269  {}
1270 
1272  template<class Quadrature>
1273  auto dirichlet(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1274  {
1275  return f_(model_.dirichlet(std::get<InnerArgsIdx>(std::forward_as_tuple(x, args...))...));
1276  }
1277 
1279  template<class Quadrature>
1280  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1281  {
1282  return dirichlet(x, args...);
1283  }
1284 
1285  private:
1286  const Model& model_;
1287  const F& f_;
1288  };
1289 
1291  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1292  class ModelMethod<Model, F, ModelIntrospection::dirichlet,
1293  IndexSequence<>,
1294  IndexSequence<OuterArgsIdx...>,
1295  IndexSequence<InnerArgsIdx...>,
1296  std::enable_if_t<Traits<Model>::template HasMethod<ModelIntrospection::dirichlet>::value> >
1297  {
1298  public:
1299  static constexpr MethodTag tag = ModelIntrospection::dirichlet;
1300 
1301  ModelMethod(const Model& model, const F& f = F())
1302  : model_(model), f_(f)
1303  {}
1304 
1306  auto dirichlet(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1307  {
1308  return f_(model_.dirichlet(std::get<InnerArgsIdx>(std::forward_as_tuple(args...))...));
1309  }
1310 
1312  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1313  {
1314  return dirichlet(args...);
1315  }
1316 
1317  private:
1318  const Model& model_;
1319  const F& f_;
1320  };
1321 
1323  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1324  class ModelMethod<Model, F, ModelIntrospection::dirichlet,
1325  IndexSequence<>,
1326  IndexSequence<pointIndex, OuterArgsIdx...>,
1327  IndexSequence<InnerArgsIdx...>,
1328  std::enable_if_t<!Traits<Model>::template HasMethod<ModelIntrospection::dirichlet>::value> >
1329  {
1330  public:
1331  static constexpr MethodTag tag = ModelIntrospection::dirichlet;
1332 
1333  ModelMethod(const Model& model, const F& f = F())
1334  : l_(model, f)
1335  {}
1336 
1338  template<class Quadrature>
1339  auto dirichlet(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1340  {
1341  return l_(x, args...);
1342  }
1343 
1345  template<class Quadrature>
1346  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1347  {
1348  return l_(x, args...);
1349  }
1350 
1351  private:
1352  const TaggedModelMethod<Model, LinearizedTag<tag>::value, SequenceMask<pointIndex, OuterArgsIdx...>::value, F> l_;
1353  };
1354 
1356  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1357  class ModelMethod<Model, F, ModelIntrospection::dirichlet,
1358  IndexSequence<>,
1359  IndexSequence<OuterArgsIdx...>,
1360  IndexSequence<InnerArgsIdx...>,
1361  std::enable_if_t<!Traits<Model>::template HasMethod<ModelIntrospection::dirichlet>::value> >
1362  {
1363  public:
1364  static constexpr MethodTag tag = ModelIntrospection::dirichlet;
1365 
1366  ModelMethod(const Model& model, const F& f = F())
1367  : l_(model, f)
1368  {}
1369 
1371  auto dirichlet(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1372  {
1373  return l_(args...);
1374  }
1375 
1377  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1378  {
1379  return l_(args...);
1380  }
1381 
1382  private:
1383  const TaggedModelMethod<Model, LinearizedTag<tag>::value, SequenceMask<OuterArgsIdx...>::value, F> l_;
1384  };
1385 
1396  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1397  class ModelMethod<Model, F, linearizedDirichlet,
1398  IndexSequence<LinArgsIdx...>,
1399  IndexSequence<pointIndex, OuterArgsIdx...>,
1400  IndexSequence<InnerArgsIdx...>,
1401  std::enable_if_t<Traits<Model>::template HasMethod<linearizedDirichlet>::value> >
1402  {
1403  public:
1404  static constexpr MethodTag tag = ModelIntrospection::linearizedDirichlet;
1405 
1406  ModelMethod(const Model& model, const F& f = F())
1407  : model_(model), f_(f)
1408  {}
1409 
1411  template<class Quadrature>
1412  auto linearizedDirichlet(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1413  const QuadraturePoint<Quadrature>& x,
1414  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1415  {
1416  return f_(model_.linearizedDirichlet(std::get<InnerArgsIdx>(std::forward_as_tuple(linArgs..., x, args...))...));
1417  }
1418 
1420  template<class Quadrature>
1421  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1422  const QuadraturePoint<Quadrature>& x,
1423  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1424  {
1425  return linearizedDirichlet(linArgs..., x, args...);
1426  }
1427 
1428  private:
1429  const Model& model_;
1430  const F& f_;
1431  };
1432 
1434  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1435  class ModelMethod<Model, F, linearizedDirichlet,
1436  IndexSequence<LinArgsIdx...>,
1437  IndexSequence<OuterArgsIdx...>,
1438  IndexSequence<InnerArgsIdx...>,
1439  std::enable_if_t<Traits<Model>::template HasMethod<linearizedDirichlet>::value> >
1440  {
1441  public:
1442  static constexpr MethodTag tag = ModelIntrospection::linearizedDirichlet;
1443 
1444  ModelMethod(const Model& model, const F& f = F())
1445  : model_(model), f_(f)
1446  {}
1447 
1449  auto linearizedDirichlet(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1450  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1451  {
1452  return f_(model_.linearizedDirichlet(std::get<InnerArgsIdx>(std::forward_as_tuple(linArgs..., args...))...));
1453  }
1454 
1456  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1457  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1458  {
1459  return linearizedDirichlet(linArgs..., args...);
1460  }
1461 
1462  private:
1463  const Model& model_;
1464  const F& f_;
1465  };
1466 
1468  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1469  class ModelMethod<Model, F, linearizedDirichlet,
1470  IndexSequence<LinArgsIdx...>,
1471  IndexSequence<pointIndex, OuterArgsIdx...>,
1472  IndexSequence<InnerArgsIdx...>,
1473  std::enable_if_t<!Traits<Model>::template HasMethod<linearizedDirichlet>::value> >
1474  {
1475  public:
1476  static constexpr MethodTag tag = ModelIntrospection::linearizedDirichlet;
1477 
1478  ModelMethod(const Model& model, const F& f = F())
1479  {}
1480 
1482  template<class Quadrature>
1483  auto linearizedDirichlet(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1484  const QuadraturePoint<Quadrature>& x,
1485  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1486  {
1487  return typename Traits<Model>::template ReturnType<tag>(0);
1488  }
1489 
1491  template<class Quadrature>
1492  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1493  const QuadraturePoint<Quadrature>& x,
1494  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1495  {
1496  return typename Traits<Model>::template ReturnType<tag>(0);
1497  }
1498  };
1499 
1501  template<class Model, class F, std::size_t... LinArgsIdx, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1502  class ModelMethod<Model, F, linearizedDirichlet,
1503  IndexSequence<LinArgsIdx...>,
1504  IndexSequence<OuterArgsIdx...>,
1505  IndexSequence<InnerArgsIdx...>,
1506  std::enable_if_t<!Traits<Model>::template HasMethod<linearizedDirichlet>::value> >
1507  {
1508  public:
1509  static constexpr MethodTag tag = ModelIntrospection::linearizedDirichlet;
1510 
1511  ModelMethod(const Model& model, const F& f = F())
1512  {}
1513 
1515  auto linearizedDirichlet(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1516  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1517  {
1518  return typename Traits<Model>::template ReturnType<tag>(0);
1519  }
1520 
1522  auto operator()(const TupleElement<LinArgsIdx, AllArgs<Model> >&... linArgs,
1523  const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1524  {
1525  return typename Traits<Model>::template ReturnType<tag>(0);
1526  }
1527  };
1528 
1539  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1540  class ModelMethod<Model, F, fluxDivergence,
1541  IndexSequence<>,
1542  IndexSequence<pointIndex, OuterArgsIdx...>,
1543  IndexSequence<InnerArgsIdx...>,
1544  std::enable_if_t<Traits<Model>::template HasMethod<fluxDivergence>::value> >
1545  {
1546  public:
1547  static constexpr MethodTag tag = ModelIntrospection::fluxDivergence;
1548 
1549  ModelMethod(const Model& model, const F& f = F())
1550  : model_(model), f_(f)
1551  {}
1552 
1554  template<class Quadrature>
1555  auto fluxDivergence(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1556  {
1557  return f_(model_.fluxDivergence(std::get<InnerArgsIdx>(std::forward_as_tuple(x, args...))...));
1558  }
1559 
1561  template<class Quadrature>
1562  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1563  {
1564  return fluxDivergence(x, args...);
1565  }
1566 
1567  private:
1568  const Model& model_;
1569  const F& f_;
1570  };
1571 
1573  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1574  class ModelMethod<Model, F, fluxDivergence,
1575  IndexSequence<>,
1576  IndexSequence<OuterArgsIdx...>,
1577  IndexSequence<InnerArgsIdx...>,
1578  std::enable_if_t<Traits<Model>::template HasMethod<fluxDivergence>::value> >
1579  {
1580  public:
1581  static constexpr MethodTag tag = ModelIntrospection::fluxDivergence;
1582 
1583  ModelMethod(const Model& model, const F& f = F())
1584  : model_(model), f_(f)
1585  {}
1586 
1588  auto fluxDivergence(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1589  {
1590  return f_(model_.fluxDivergence(std::get<InnerArgsIdx>(std::forward_as_tuple(args...))...));
1591  }
1592 
1594  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1595  {
1596  return fluxDivergence(args...);
1597  }
1598 
1599  private:
1600  const Model& model_;
1601  const F& f_;
1602  };
1603 
1605  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1606  class ModelMethod<Model, F, fluxDivergence,
1607  IndexSequence<>,
1608  IndexSequence<pointIndex, OuterArgsIdx...>,
1609  IndexSequence<InnerArgsIdx...>,
1610  std::enable_if_t<!Traits<Model>::template HasMethod<fluxDivergence>::value> >
1611  {
1612  public:
1613  static constexpr MethodTag tag = ModelIntrospection::fluxDivergence;
1614 
1615  ModelMethod(const Model& model, const F& f = F())
1616  {}
1617 
1619  template<class Quadrature>
1620  auto fluxDivergence(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1621  {
1622  return typename Traits<Model>::template ReturnType<tag>(0);
1623  }
1624 
1626  template<class Quadrature>
1627  auto operator()(const QuadraturePoint<Quadrature>& x, const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1628  {
1629  return typename Traits<Model>::template ReturnType<tag>(0);
1630  }
1631  };
1632 
1634  template<class Model, class F, std::size_t... OuterArgsIdx, std::size_t... InnerArgsIdx>
1635  class ModelMethod<Model, F, fluxDivergence,
1636  IndexSequence<>,
1637  IndexSequence<OuterArgsIdx...>,
1638  IndexSequence<InnerArgsIdx...>,
1639  std::enable_if_t<!Traits<Model>::template HasMethod<fluxDivergence>::value> >
1640  {
1641  public:
1642  static constexpr MethodTag tag = ModelIntrospection::fluxDivergence;
1643 
1644  ModelMethod(const Model& model, const F& f = F())
1645  {}
1646 
1648  auto fluxDivergence(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1649  {
1650  return typename Traits<Model>::template ReturnType<tag>(0);
1651  }
1652 
1654  auto operator()(const TupleElement<OuterArgsIdx, AllArgs<Model> >&... args) const
1655  {
1656  return typename Traits<Model>::template ReturnType<tag>(0);
1657  }
1658  };
1659 
1681  template<class ReturnValueFunctor,
1682  class Model,
1683  class Methods = typename ModelTraits<Model>::Methods,
1684  class Signatures = typename ModelTraits<Model>::MethodCallSignatures>
1686 
1688  template<class F, class Model, std::size_t... tag, class Signatures>
1689  class UnaryModelExpression<F, Model, IndexSequence<tag...>, Signatures>
1690  : public ModelBase<typename std::decay_t<Model>::DomainFunctionSpaceType,
1691  typename std::decay_t<Model>::RangeFunctionSpaceType>
1692  , public Expressions::Storage<F, Model>
1693  // Expressions model rvalues. We are constant if the
1694  // underlying expression claims to be so or if we store a copy
1695  // and the underlying expression is "independent"
1696  // (i.e. determined at runtime only by the contained data), or
1697  // if the value of the expression is just a compile-time
1698  // constant.
1699  , public MPL::UniqueTags<
1700  typename AssumeTraits<F>::Properties,
1701  ConditionalType<(IsConstantExprArg<Model>::value
1702  && !FunctorHas<IsIndeterminateOperation, F>::value
1703  && !FunctorHas<IsPlaceholderOperation, F>::value
1704  ), ConstantExpression, void>,
1705  ConditionalType<(IsTypedValue<Model>::value
1706  && !FunctorHas<IsDynamicOperation, F>::value
1707  && !FunctorHas<IsIndeterminateOperation, F>::value
1708  && !FunctorHas<IsPlaceholderOperation, F>::value
1709  ), TypedValueExpression, void> >
1710  // end of tag promotion
1711  , public TaggedModelMethod<std::decay_t<Model>, tag, Get<tag, Signatures>::value, F>...
1712  {
1713  using StorageType = Expressions::Storage<F, Model>;
1714  protected:
1715  using StorageType::t0_;
1716  public:
1717  using StorageType::operand;
1718  using StorageType::operation;
1719  using typename StorageType::OperationType;
1720  using typename StorageType::FunctorType;
1721  using TraitsType = ModelTraits<Model>;
1722  using UnaryOperationType = typename F::OperationType;
1723  using ModelType = Model;
1724  using ModelDecay = std::decay_t<Model>;
1725 
1726  /* Models need to be captured by value as the entire
1727  * expression must be copyable in a way that bind(otherEntity)
1728  * does not affect the original copy.
1729  */
1730  static_assert(std::is_same<ModelType, ModelDecay>::value,
1731  "Models need to be captured by value.");
1732 
1744  template<class ModelArg, class FArg, std::enable_if_t<std::is_constructible<StorageType, FArg, ModelArg>::value, int> = 0>
1745  UnaryModelExpression(ModelArg&& model, FArg&& f)
1746  : StorageType(std::forward<FArg>(f), std::forward<ModelArg>(model))
1747  , TaggedModelMethod<ModelDecay, tag, Get<tag, Signatures>::value, F>(this->model(), operation())...
1748  {}
1749 
1750  template<class ModelArg, std::enable_if_t<std::is_constructible<StorageType, F, ModelArg>::value, int> = 0>
1751  UnaryModelExpression(ModelArg&& model)
1752  : UnaryModelExpression(std::forward<ModelArg>(model), F{})
1753  {}
1754 
1759  : StorageType(other)
1760  , TaggedModelMethod<ModelDecay, tag, Get<tag, Signatures>::value, F>(model(), operation())...
1761  {}
1762 
1767  : StorageType(std::move(other))
1768  , TaggedModelMethod<ModelDecay, tag, Get<tag, Signatures>::value, F>(model(), operation())...
1769  {}
1770 
1771  UnaryModelExpression& operator=(const UnaryModelExpression& other)
1772  {
1773  static_cast<StorageType>(*this) = other;
1774  return *this;
1775  }
1776 
1777  UnaryModelExpression& operator=(UnaryModelExpression&& other)
1778  {
1779  static_cast<StorageType>(*this) = std::move(other);
1780  return *this;
1781  }
1782 
1784  template<class T,
1785  std::enable_if_t<(Expressions::EmitByValueV<T>
1786  && std::is_same<T, ModelDecay>::value
1787  && (IsIdentityOperation<OperationType>::value
1788  ||
1789  IsClosureOperation<OperationType>::value)
1790  ), int> = 0>
1791  operator T () const { return operand(0_c); }
1792 
1794  template<class T,
1795  std::enable_if_t<(!Expressions::EmitByValueV<T>
1796  && std::is_same<T, ModelDecay>::value
1797  && (IsIdentityOperation<OperationType>::value
1798  ||
1799  IsClosureOperation<OperationType>::value)
1800  ), int> = 0>
1801  operator T () && { return operand(0_c); }
1802 
1804  template<class T,
1805  std::enable_if_t<(!Expressions::EmitByValueV<T>
1806  && std::is_same<T, ModelDecay>::value
1807  && (IsIdentityOperation<OperationType>::value
1808  ||
1809  IsClosureOperation<OperationType>::value)
1810  ), int> = 0>
1811  operator T& () & { return operand(0_c); }
1812 
1814  template<class T,
1815  std::enable_if_t<(!Expressions::EmitByValueV<T>
1816  && std::is_same<T, ModelDecay>::value
1817  && (IsIdentityOperation<OperationType>::value
1818  ||
1819  IsClosureOperation<OperationType>::value)
1820  ), int> = 0>
1821  operator const T& () const& { return operand(0_c); }
1822 
1823  template<class Entity>
1824  void bind(const Entity& entity)
1825  {
1826  model().bind(entity);
1827  }
1828 
1829  void unbind()
1830  {
1831  model().unbind();
1832  }
1833 
1834  template<class Intersection>
1835  auto classifyBoundary(const Intersection& intersection)
1836  {
1837  return model().classifyBoundary(intersection);
1838  }
1839 
1840  std::string name() const
1841  {
1842  return operationName(operation(), model().name());
1843  }
1844 
1845  protected:
1846  constexpr auto&& model() && { return t0_; }
1847  constexpr auto& model() & { return t0_; }
1848  constexpr const auto& model() const& { return t0_; }
1849  };
1850 
1857  template<class F, class T, std::enable_if_t<IsPDEModel<T>::value, int> = 0>
1858  constexpr auto operate(Expressions::DontOptimize, F, const T& t)
1859  {
1860  DUNE_ACFEM_RECORD_OPTIMIZATION;
1861 
1862  return UnaryModelExpression<F, T>(t, F{});
1863  }
1864 
1865  } // PDEModel
1866 
1868  template<class Model,
1869  std::size_t tag,
1870  std::size_t signature = Get<tag, typename ModelTraits<Model>::MethodCallSignatures>::value>
1872 
1874  template<class Model, std::size_t tag>
1877 
1879  template<class F, class Model>
1881 
1883 
1885 
1886  } // namespace ACFem
1887 
1888 } // namespace Dune
1889 
1890 
1891 #endif // __DUNE_ACFEM_MODELES_UNARYEXPRESSION_HH__
auto dirichlet(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1339
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1346
auto dirichlet(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1273
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1280
auto fluxDivergence(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1588
auto operator()(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1594
auto fluxDivergence(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1620
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1627
auto fluxDivergence(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1648
auto operator()(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1654
auto fluxDivergence(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1555
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1562
auto flux(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:178
auto operator()(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:184
auto flux(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:243
auto operator()(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:249
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:152
auto flux(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:145
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:218
auto flux(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:211
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1456
auto linearizedDirichlet(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1449
auto linearizedDirichlet(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1515
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1522
auto linearizedDirichlet(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1412
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1421
auto linearizedDirichlet(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1483
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1492
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:394
auto linearizedFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:387
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:293
auto linearizedFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:284
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:328
auto linearizedFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:321
auto linearizedFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:355
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:364
auto linearizedRobinFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:848
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:857
auto linearizedRobinFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:885
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:892
auto linearizedRobinFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:919
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:928
auto linearizedRobinFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:951
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:958
auto linearizedSingularFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1167
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1174
auto linearizedSingularFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1201
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1210
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1139
auto linearizedSingularFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1130
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1240
auto linearizedSingularFlux(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1233
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:610
auto linearizedSource(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:603
auto linearizedSource(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:566
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:575
auto linearizedSource(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:637
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:646
auto linearizedSource(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:669
auto operator()(const TupleElement< LinArgsIdx, AllArgs< Model > > &... linArgs, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:676
auto robinFlux(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:807
auto operator()(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:813
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:716
auto robinFlux(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:709
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:782
auto robinFlux(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:775
auto operator()(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:748
auto robinFlux(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:742
auto singularFlux(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1057
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1064
auto operator()(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1095
auto singularFlux(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1089
auto operator()(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:1030
auto singularFlux(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:1024
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:998
auto singularFlux(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:991
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:434
auto source(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:427
auto source(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:493
auto operator()(const QuadraturePoint< Quadrature > &x, const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:500
auto operator()(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:466
auto source(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:460
auto source(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
The proper method inherited by the derived model.
Definition: unaryexpression.hh:525
auto operator()(const TupleElement< OuterArgsIdx, AllArgs< Model > > &... args) const
Helper in order to use parametrized expression templates.
Definition: unaryexpression.hh:531
Implement the method specified by tag with the signature defined by OuterArgSeq.
Definition: unaryexpression.hh:82
UnaryModelExpression(UnaryModelExpression &&other)
Move constructor.
Definition: unaryexpression.hh:1766
UnaryModelExpression(ModelArg &&model, FArg &&f)
Constructor from given model and operation.
Definition: unaryexpression.hh:1745
UnaryModelExpression(const UnaryModelExpression &other)
Copy constructor.
Definition: unaryexpression.hh:1758
General unary model expression template.
Definition: unaryexpression.hh:1685
OptimizeTag< 0 > DontOptimize
Bottom level is overloaded to do nothing.
Definition: optimizationbase.hh:74
std::string operationName(F &&f, const std::string &arg)
Verbose print of an operation, helper function to produce noise.
Definition: operationtraits.hh:601
PDEModel::UnaryModelExpression< F, Model > UnaryModelExpression
Exports from namespace.
Definition: unaryexpression.hh:1880
PDEModel::TaggedModelMethod< Model, tag, signature > ModelMethod
Exports from namespace.
Definition: unaryexpression.hh:1871
std::tuple_element_t< N, std::decay_t< TupleLike > > TupleElement
Forward to std::tuple_element<N, std::decay_t<T> >
Definition: access.hh:125
typename MaskSequenceHelper< mask, 0 >::type MaskSequence
Generate the index-sequence type of set bits from a bit-mask.
Definition: mask.hh:74
IndexConstant< SequenceMaskHelper< I... >::value > SequenceMask
Generate a bit-mask from the given index-sequence.
Definition: mask.hh:78
constexpr auto operate(Expressions::DontOptimize, F &&f, T &&t)
Generate a unary tensor expression.
Definition: unaryexpression.hh:185
Sequence< std::size_t, V... > IndexSequence
Sequence of std::size_t values.
Definition: types.hh:64
MethodTag
An enum in order to parametrize the call-signature introspection.
Definition: modeltraits.hh:23
TraitsHelper::MethodSignatureClosure< CheckMethodTag< tag >::value > MethodSignatureClosure
Type alias extracting the "closure" of all supported call-signatures.
Definition: modeltraits.hh:631
Fem::QuadraturePointWrapper< Quadrature > QuadraturePoint
Shortcut.
Definition: quadraturepoint.hh:23
ModelIntrospection::Traits< Model > ModelTraits
Traits class for models.
Definition: modeltraits.hh:898
Gets the type of the n-th element of a tuple-like or the std::integral_constant corresponding to the ...
Definition: access.hh:42
A structure defining some basic default types and methods.
Definition: modelbase.hh:41
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 1, 22:29, 2024)