OpenLB 1.7
Loading...
Searching...
No Matches
analyticalF.h
Go to the documentation of this file.
1/* This file is part of the OpenLB library
2 *
3 * Copyright (C) 2012 Lukas Baron, Tim Dornieden, Mathias J. Krause, Albert Mink
4 * E-mail contact: info@openlb.net
5 * The most recent release of OpenLB can be downloaded at
6 * <http://www.openlb.net/>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
22*/
23
24#ifndef ANALYTICAL_F_H
25#define ANALYTICAL_F_H
26
27#include <vector>
28#include <random>
29
30#include "analyticalBaseF.h"
34#include "utilities/adHelpers.h"
37
38
45namespace olb {
46
47template<typename T, typename S, bool> class SmoothIndicatorSphere3D;
48template<typename T, typename DESCRIPTOR> class RadiativeUnitConverter;
49
53
54template <unsigned D, typename T, typename S>
55class AnalyticalComposed final : public AnalyticalF<D,T,S> {
56private:
57 std::vector<std::reference_wrapper<AnalyticalF<D,T,S>>> _f;
58public:
59 template <unsigned otherD=D, typename = typename std::enable_if_t<otherD==2>>
61 : AnalyticalF<D,T,S>(2), _f{f0, f1}
62 {
63 this->getName() = "composed";
64 }
65 template <unsigned otherD=D, typename = typename std::enable_if_t<otherD==3>>
67 : AnalyticalF<D,T,S>(3), _f{f0, f1, f2}
68 {
69 this->getName() = "composed";
70 }
72 bool operator() (T output[], const S x[]) override;
73};
74
75
77template <unsigned D, typename T, typename S>
78class AnalyticalConst final: public AnalyticalF<D,T,S> {
79private:
80 // is constant return value of operator()
81 std::vector<T> _c;
82public:
83 AnalyticalConst(T value);
84 AnalyticalConst(T value0, T value1);
85 AnalyticalConst(T value0, T value1, T value2);
86 AnalyticalConst(const Vector<T,2>& value);
87 AnalyticalConst(const Vector<T,3>& value);
88 AnalyticalConst(const std::vector<T>& value);
89 bool operator() (T output[], const S x[]) override;
90
91 template<typename V, typename U>
93
94 template<typename V, typename U>
95 auto copyAs() const {
96 return exchange_type<V,U>(util::copyAs<V,T,util::StdVector>(_c));
97 }
98};
99
101template <unsigned D, typename T, typename S>
102class AnalyticalNormal final: public AnalyticalF<D,T,S> {
103private:
104 // is constant return value of operator()
105 std::vector<T> _mean;
106 T _stdDev;
107public:
108 AnalyticalNormal(std::vector<T> mean, T stdDev);
109 bool operator() (T output[], const S x[]) override;
110};
111
113template <unsigned D, typename T, typename S>
114class AnalyticalRandomBase : public AnalyticalF<D,T,S> {
115protected:
117 std::random_device rd;
118 std::mt19937 gen;
119};
120
122template <unsigned D, typename T, typename S, unsigned seed>
124protected:
126 std::random_device rd;
127 std::mt19937 gen;
128};
129
131template <unsigned D, typename T, typename S>
133public:
134 AnalyticalRandomUniform(T minVal=0., T maxVal=1.);
135 bool operator() (T output[], const S x[]) override;
136private:
137 std::uniform_real_distribution<T> distro;
138};
139
141template <unsigned D, typename T, typename S>
143public:
144 AnalyticalRandomNormal(T mean=0., T stdDev=1.);
145 bool operator() (T output[], const S x[]) override;
146protected:
147 std::normal_distribution<T> distro;
148};
149
151template <unsigned D, typename T, typename S, unsigned seed>
153public:
154 AnalyticalRandomSeededNormal(T mean=0., T stdDev=1.);
155 bool operator() (T output[], const S x[]) override;
156protected:
157 std::normal_distribution<T> distro;
158};
159
162template <unsigned D, typename T, typename S>
164public:
165 AnalyticalRandomTruncatedNormal(T mean=0., T stdDev=1., T n=3.);
166 bool operator() (T output[], const S x[]) override;
167private:
168 T _min;
169 T _max;
170};
171
172
174template <unsigned D, typename T, typename S>
175class AnalyticalRandomOld : public AnalyticalF<D,T,S> {
176public:
178 bool operator() (T output[], const S x[]) override;
179};
180
181
187template <typename T, typename S, typename DESCRIPTOR>
199
206template <typename T, typename S, typename DESCRIPTOR>
220
221
222
225template <unsigned D, typename T, typename S>
226class AnalyticalSquareWave : public AnalyticalF<D,T,S> {
227public:
228 AnalyticalSquareWave(T period=1, T amplitude=1, T difference=0.5);
229 bool operator() (T output[], const S x[]) override;
230protected:
234};
235
236
238template <unsigned D, typename T, typename S>
240public:
241 AnalyticalSmoothedSquareWave(T period=1, T amplitude=1, T difference=0.5, T epsilon=1.e-3);
242 bool operator() (T output[], const S x[]) override;
243protected:
245};
246
247
260template <unsigned D, typename U, typename T, typename S,
261 bool ComponentWise, bool ReturnArray>
263protected:
264 using return_type_g = std::conditional_t<ReturnArray,U*,U>;
265 using function_t = std::conditional_t<ComponentWise,
266 std::function<return_type_g(T)>, std::function<return_type_g(T*)>>;
267
270
271public:
275 template <typename G>
276 AnalyticalConcatenation(AnalyticalF<D,T,S>& f, G g, unsigned targetDim=1)
277 : AnalyticalF<D,U,S>((ComponentWise) ? f.getTargetDim() : targetDim),
278 _f(f), _g(g) { }
279
284 : AnalyticalF<D,U,S>(f.getTargetDim()), _f(f), _g(g) {
285 static_assert(ComponentWise);
286 static_assert(! std::is_pointer_v<U>);
287 }
288
292 // wrapped_U equals U or a pointer to U
293 template<typename wrapped_U>
295 AnalyticalF<D,T,S>& f, wrapped_U (*g)(T*), unsigned targetDim=1)
296 : AnalyticalF<D,U,S>(targetDim),
297 _f(f), _g(g) {
298 static_assert(! ComponentWise);
299 }
300
304 // wrapped_U equals U or a pointer to U
305 template<typename wrapped_U>
307 AnalyticalF<D,T,S>& f, wrapped_U (*g)(const T*), unsigned targetDim=1)
308 : AnalyticalF<D,U,S>(targetDim),
309 _f(f), _g(g) {
310 static_assert(! ComponentWise);
311 }
312
313 bool operator() (U output[], const S x[]) override {
314 T outputTmp[_f.getTargetDim()];
315 _f(outputTmp, x);
316 if constexpr (ComponentWise) {
317 for (int i = 0; i < _f.getTargetDim(); ++i) {
318 output[i] = _g(outputTmp[i]);
319 }
320 } else { // g works on the vector
321 if constexpr (ReturnArray) {
322 for (int i = 0; i < this->getTargetDim(); ++i) {
323 const auto* outputTmp2 = _g(outputTmp);
324 output[i] = outputTmp2[i];
325 }
326 } else { // g returns value
327 output[0] = _g(outputTmp);
328 }
329 }
330 return true;
331 }
332};
333
334template <unsigned D, typename T, typename S, typename G>
337 std::remove_pointer_t<decltype(
338 g(std::conditional_t<std::is_invocable_v<G,T>,T,T*>{}))>,T,S,
339 std::is_invocable_v<G,T>,
340 std::is_pointer_v<decltype(
341 g(std::conditional_t<std::is_invocable_v<G,T>,T,T*>{}))>>;
342
343// default for U seems to be necessary for multiply overloaded functions
344template <unsigned D, typename T, typename S, typename U=T>
347
348template <unsigned D, typename wrapped_U, typename T, typename S>
351 false,std::is_pointer_v<wrapped_U>>;
352
353template <unsigned D, typename wrapped_U, typename T, typename S>
354AnalyticalConcatenation(AnalyticalF<D,T,S>&, wrapped_U(const T*), unsigned)
356 false,std::is_pointer_v<wrapped_U>>;
357
359
360template <typename T, typename S>
362template <typename T, typename S>
364template <typename T, typename S>
366
367template <typename T, typename S>
369template <typename T, typename S>
371
372template <typename T, typename S>
374template <typename T, typename S>
376template <typename T, typename S>
378
379
380
381
382
383
385
386
388
390// Punktsteigungsform
391template <typename T, typename S>
393private:
394 T _a;
395 T _b;
396public:
397 AnalyticalLinear1D(T a, T b);
398 AnalyticalLinear1D(S x0, T v0, S x1, T v1);
399 bool operator() (T output[], const S x[]) override;
400
401 template<typename V, typename U>
403
404 template<typename V, typename U>
405 auto copyAs() const {
406 return exchange_type<V,U>(_a, _b);
407 }
408};
409
410
413template <typename T, typename S>
415private:
416 S _cp;
417 S _r;
418 T _maxi;
419public:
420 AnalyticalSquare1D(S cp, S r, T maxi);
421 bool operator() (T output[], const S x[]) override;
422};
423
424
426template <typename T, typename S>
427class SinusStartScale : public AnalyticalF1D<T,S> {
428protected:
431public:
432 SinusStartScale(int numTimeSteps=1, T maxValue=1);
433 bool operator() (T output[], const S x[]) override;
434};
435
436
438template <typename T, typename S>
440protected:
443public:
444 PolynomialStartScale(S numTimeSteps=S(1), T maxValue=T(1));
445 bool operator() (T output[], const S x[]) override;
446};
447
449template <typename T, typename S>
450class Sinus : public AnalyticalF1D<T,S> {
451protected:
454public:
455 Sinus (T period=1, T amplitude=1);
456 bool operator() (T output[], const S x[]) override;
457};
458
460template <typename T, typename S>
461class Cosinus : public AnalyticalF1D<T,S> {
462protected:
465public:
466 Cosinus(T period=1, T amplitude=1);
467 bool operator() (T output[], const S x[]) override;
468
469 template<typename V, typename U>
471
472 template<typename V, typename U>
473 auto copyAs() const {
475 }
476};
477
479template <typename T, typename S>
480class CosinusComposite : public AnalyticalF1D<T,S> {
481protected:
485public:
486 CosinusComposite(T period=1, T amplitude=1, T difference = 1);
487 bool operator() (T output[], const S x[]) override;
488};
489
490
491
493
495template <typename T, typename S>
496class AnalyticalLinear2D final : public AnalyticalF2D<T,S> {
497protected:
498 T _a;
499 T _b;
500 T _c;
501public:
502 AnalyticalLinear2D(T a, T b, T c);
503 AnalyticalLinear2D(S x0, S y0, T v0, S x1, S y1, T v1, S x2, S y2, T v2);
504 bool operator() (T output[], const S x[]) override;
505
506 template<typename V, typename U>
508
509 template<typename V, typename U>
510 auto copyAs() const {
511 return exchange_type<V,U>(_a, _b, _c);
512 }
513};
514
516template <typename T, typename S>
518protected:
522public:
523 AnalyticalParticleAdsorptionLinear2D(T center[], T radius, T maxValue);
524 bool operator() (T output[], const S x[]);
525};
526
527
530template <typename T, typename S>
531class AnalyticalLinear3D final : public AnalyticalF3D<T,S> {
532protected:
533 T _a;
534 T _b;
535 T _c;
536 T _d;
537public:
538 AnalyticalLinear3D(T a, T b, T c, T d);
539 AnalyticalLinear3D(S x0, S y0, S z0, T v0, S x1, S y1, S z1, T v1, S x2, S y2,
540 S z2, T v2, S x3, S y3, S z3, T v3);
541 bool operator() (T output[], const S x[]) override;
542};
543
545template <typename T, typename S>
546class AnalyticalScaled3D final : public AnalyticalF3D<T,S> {
547private:
549 T _scale;
550public:
552 bool operator() (T output[], const S x[]) override;
553};
554
556template <typename T, typename S, typename DESCRIPTOR>
557class PLSsolution3D : public AnalyticalF3D<T,S> {
558private:
559 T _physSigmaEff;
560 T _physDiffusionCoefficient;
561public:
563 bool operator()(T output[1], const S x[3]) override;
564};
565
567template <typename T, typename S, typename DESCRIPTOR>
569private:
570 T _physSigmaEff;
571 T _physDiffusionCoefficient;
572 Vector<T,3> _center;
573public:
574 LightSourceCylindrical3D(RadiativeUnitConverter<T,DESCRIPTOR> const& converter, Vector<T,3> center = {T(0), T(0), T(0)});
575 bool operator()(T output[1], const S x[3]) override;
576};
577
583template <typename T, typename S>
584class Spotlight : public AnalyticalF3D<T,S> {
585private:
586 Vector<T,3> const _position;
587 Vector<T,3> const _orientation;
588 T const _falloff;
589public:
590 Spotlight(Vector<T,3> position, Vector<T,3> direction, T falloff);
591 bool operator()(T output[1], const S x[3]) override;
592};
593
595template <typename T, typename S>
596class GaussianHill2D : public AnalyticalF2D<T,S> {
597private:
598 T _sigma;
599 Vector<T,2> _x0;
600 T _c0;
601public:
602 GaussianHill2D(T sigma, Vector<T,2> x0, T c0);
603 bool operator()(T output[1], const S x[2]) override;
604};
605
607template <typename T, typename S>
609private:
610 T _sigma02;
611 T _D;
612 T _t;
613 Vector<T,2> _x0;
614 Vector<T,2> _u;
615 T _c0;
616public:
617 GaussianHillTimeEvolution2D(T sigma0, T D, T t, Vector<T,2> x0, Vector<T,2> u, T c0);
618 bool operator()(T output[1], const S x[2]) override;
619};
620
629template <unsigned D, typename T, typename S>
630class AnalyticalCuboidwiseConst final : public AnalyticalF<D,T,S>{
631private:
632 const unsigned _numberOfCuboids;
633
634 std::shared_ptr<const CuboidGeometry<T,D>> _cuboids;
635 const std::vector<T> _values;
636
637public:
639 const std::vector<T>& values, unsigned targetDim=D)
640 : AnalyticalF<D,T,S>(targetDim),
641 _numberOfCuboids(values.size()),
642 _cuboids(std::make_shared<CuboidGeometry<T,D>>(
643 sGeometry.getCuboidGeometry().getMotherCuboid(),
644 _numberOfCuboids)),
645 _values(values)
646 {
647 this->getName() = "cuboidwiseConst";
648 }
649
650 bool operator() (T output[], const S input[]) override {
651 const auto index = _cuboids->get_iC(input[0], input[1], input[2]);
652 for (int i = 0; i < this->getTargetDim(); ++i) {
653 output[i] = _values[index];
654 }
655 return true;
656 }
657};
658
659} // end namespace olb
660#endif
Some helper functions for the ADf data type.
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
AnalyticalComposed(AnalyticalF< D, T, S > &f0, AnalyticalF< D, T, S > &f1, AnalyticalF< D, T, S > &f2)
Definition analyticalF.h:66
AnalyticalComposed(AnalyticalF< D, T, S > &f0, AnalyticalF< D, T, S > &f1)
Definition analyticalF.h:60
AnalyticalF< D, T, S > & _f
AnalyticalConcatenation(AnalyticalF< D, T, S > &f, G g, unsigned targetDim=1)
concatenate functor f and some lambda expression g.
bool operator()(U output[], const S x[]) override
std::conditional_t< ReturnArray, U *, U > return_type_g
std::conditional_t< ComponentWise, std::function< return_type_g(T)>, std::function< return_type_g(T *)> > function_t
AnalyticalConcatenation(AnalyticalF< D, T, S > &f, wrapped_U(*g)(const T *), unsigned targetDim=1)
concatenate functor f and some function g.
AnalyticalConcatenation(AnalyticalF< D, T, S > &f, wrapped_U(*g)(T *), unsigned targetDim=1)
concatenate functor f and some function g.
AnalyticalConcatenation(AnalyticalF< D, T, S > &f, U(*g)(T))
concatenate functor f and some function g.
AnalyticalConst: DD -> XD, where XD is defined by value.size()
Definition analyticalF.h:78
auto copyAs() const
Definition analyticalF.h:95
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
Returns a constant value on every cuboids.
bool operator()(T output[], const S input[]) override
has to be implemented for 'every' derived class
AnalyticalCuboidwiseConst(SuperGeometry< T, D > &sGeometry, const std::vector< T > &values, unsigned targetDim=D)
AnalyticalF are applications from DD to XD, where X is set by the constructor.
AnalyticalLinear1D: 1D -> 1D troughout given points (x0,v0) and (x1,v1)
bool operator()(T output[], const S x[]) override
returns line _a*x + _b
AnalyticalLinear2D: 2D -> 1D troughout given points (x0,y0,v0), (x1,y1,v1), (x2,y2,...
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
AnalyticalLinear2D(T a, T b, T c)
3D//////////////////////////////////////////// AnalyticalLinear3D: 3D -> 1D troughout given points (x...
AnalyticalLinear3D(T a, T b, T c, T d)
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
AnalyticalNormal: DD -> XD, where XD is defined by value.size()
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
AnalyticalNormal(std::vector< T > mean, T stdDev)
AnalyticalRandom2D: 2D -> 1D with maxValue in the center decreasing linearly with the distrance to th...
bool operator()(T output[], const S x[])
has to be implemented for 'every' derived class
AnalyticalParticleAdsorptionLinear2D(T center[], T radius, T maxValue)
AnalyticalRandomBase: virtual base class for all the random functionals.
std::random_device rd
AnalyticalRandomNormal: DD -> 1D with random image in (0,1)
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
std::normal_distribution< T > distro
AnalyticalRandomNormal(T mean=0., T stdDev=1.)
AnalyticalRandomOld: DD -> 1D with random image in (0,1)
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
AnalyticalRamdomSeededBase: alternative version with seed specification.
AnalyticalRamdomSeededNormal: alternative version with seed specification.
AnalyticalRandomSeededNormal(T mean=0., T stdDev=1.)
std::normal_distribution< T > distro
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
AnalyticalRandomNormal: DD -> 1D with random image in (0,1) Normal distribution cut off outside [mean...
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
AnalyticalRandomTruncatedNormal(T mean=0., T stdDev=1., T n=3.)
AnalyticalRandomUniform: DD -> 1D with random image in (0,1)
AnalyticalRandomUniform(T minVal=0., T maxVal=1.)
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
AnalyticalScaled3D: 3D -> Image(AnalyticalF) scales AnalyticalF by _scale.
AnalyticalScaled3D(AnalyticalF3D< T, S > &f, T scale)
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
Smoothed square wave. epsilon = width of the mollified interval.
AnalyticalSmoothedSquareWave(T period=1, T amplitude=1, T difference=0.5, T epsilon=1.e-3)
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
represents an inverse parabola profile like it is used in Poiseuille inflow note: output depends only...
AnalyticalSquare1D(S cp, S r, T maxi)
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
Square wave with given period length, amplitude, difference (= length of positive time / length of pe...
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
AnalyticalSquareWave(T period=1, T amplitude=1, T difference=0.5)
CosinusComposite: Composition of two Cosinus to shift the low point within a period - difference deno...
CosinusComposite(T period=1, T amplitude=1, T difference=1)
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
Cosinus: Cosinus with period and amplitude.
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
Cosinus(T period=1, T amplitude=1)
auto copyAs() const
Computes resulting lattice velocity of an object from translational and rotational velocity.
Vector< T, DESCRIPTOR::d > _position
UnitConverter< T, DESCRIPTOR > const & _converter
EccentricLatticeVelocityField(Vector< T, DESCRIPTOR::d > position, Vector< T, DESCRIPTOR::d > velocity, Vector< T, utilities::dimensions::convert< DESCRIPTOR::d >::rotation > angularVelocity, UnitConverter< T, DESCRIPTOR > const &converter)
Vector< T, utilities::dimensions::convert< DESCRIPTOR::d >::rotation > _angularVelocity
bool operator()(T output[], const S input[]) override
has to be implemented for 'every' derived class
Vector< T, DESCRIPTOR::d > _velocity
Computes resulting velocity of an object from translational and rotational velocity.
bool operator()(T output[], const S input[]) override
has to be implemented for 'every' derived class
Vector< T, DESCRIPTOR::d > _velocity
Vector< T, utilities::dimensions::convert< DESCRIPTOR::d >::rotation > _angularVelocity
Vector< T, DESCRIPTOR::d > _position
EccentricVelocityField(Vector< T, DESCRIPTOR::d > position, Vector< T, DESCRIPTOR::d > velocity, Vector< T, utilities::dimensions::convert< DESCRIPTOR::d >::rotation > angularVelocity)
8.6.1 Gauss Hill inital values
bool operator()(T output[1], const S x[2]) override
GaussianHill2D(T sigma, Vector< T, 2 > x0, T c0)
8.6.1 Gauss Hill time evolution
bool operator()(T output[1], const S x[2]) override
GaussianHillTimeEvolution2D(T sigma0, T D, T t, Vector< T, 2 > x0, Vector< T, 2 > u, T c0)
int getTargetDim() const
read only access to member variable _n
Definition genericF.hh:45
std::string & getName()
read and write access to name
Definition genericF.hh:51
light source as a cylinder along z-axis
bool operator()(T output[1], const S x[3]) override
LightSourceCylindrical3D(RadiativeUnitConverter< T, DESCRIPTOR > const &converter, Vector< T, 3 > center={T(0), T(0), T(0)})
see Mink et al. 2016 in Sec.3.1.
PLSsolution3D(RadiativeUnitConverter< T, DESCRIPTOR > const &converter)
bool operator()(T output[1], const S x[3]) override
PolynomialStartScale: 1D -> 1D a start curve based on a polynomial fifth order for a continuous trans...
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
PolynomialStartScale(S numTimeSteps=S(1), T maxValue=T(1))
Conversion between physical and lattice units, as well as discretization.
SinusStartScale: 1D -> 1D a start curve based on sinus for a continuous transition at 0 and 1.
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
SinusStartScale(int numTimeSteps=1, T maxValue=1)
Sinus: Sinus with period and amplitude.
bool operator()(T output[], const S x[]) override
has to be implemented for 'every' derived class
Sinus(T period=1, T amplitude=1)
bool operator()(T output[1], const S x[3]) override
Spotlight(Vector< T, 3 > position, Vector< T, 3 > direction, T falloff)
Representation of a statistic for a parallel 2D geometry.
Conversion between physical and lattice units, as well as discretization.
Plain old scalar vector.
Definition vector.h:47
Top level namespace for all of OpenLB.
std::conditional_t< D==2, CuboidGeometry2D< T >, CuboidGeometry3D< T > > CuboidGeometry
Definition aliases.h:47
AnalyticalConcatenation(AnalyticalF< D, T, S > &, G g, unsigned _=1) -> AnalyticalConcatenation< D, std::remove_pointer_t< decltype(g(std::conditional_t< std::is_invocable_v< G, T >, T, T * >{}))>, T, S, std::is_invocable_v< G, T >, std::is_pointer_v< decltype(g(std::conditional_t< std::is_invocable_v< G, T >, T, T * >{}))> >
Converts dimensions by deriving from given cartesian dimension D.
Representation of a parallel 2D geometry – header file.