83 {
84 using V = typename CELL::value_t;
85 using DESCRIPTOR = typename CELL::descriptor_t;
86
87 auto psi = cell.template getField<descriptors::PSI>();
88 auto psi0 = cell.template getField<descriptors::PSI0>();
89 auto epsilon =
parameters.template get<descriptors::EPSILON>();
91 V normGradPsi = 1.;
93 V a = psi - cell.neighbor({-1,0}).template getField<descriptors::PSI>();
94 V b = cell.neighbor({1,0}).template getField<descriptors::PSI>() - psi;
95 V
c = psi - cell.neighbor({0,-1}).
template getField<descriptors::PSI>();
96 V
d = cell.neighbor({0,1}).
template getField<descriptors::PSI>() - psi;
97 V gradX, gradY;
98 if (psi0 > 0) {
99 if (a<0) a = 0;
100 if (b>0) b = 0;
103 gradX = a;
104 if (b*b>a*a) gradX = b;
106 if (d*d>c*c) gradY =
d;
107 normGradPsi =
util::sqrt(gradX*gradX+gradY*gradY);
108 }
109 else if (psi0 < 0) {
110 if (a>0) a = 0;
111 if (b<0) b = 0;
114 gradX = a;
115 if (b*b>a*a) gradX = b;
117 if (d*d>c*c) gradY =
d;
118 normGradPsi =
util::sqrt(gradX*gradX+gradY*gradY);
119 }
120 else {}
121 cell.template setField<descriptors::NORMGRADPSI>(normGradPsi);
122 } else {
123 cell.template setField<descriptors::NORMGRADPSI>(normGradPsi);
124 }
125 }
platform_constant int c[Q][D]
constexpr int d() any_platform
Vector(T &&t, Ts &&... ts) -> Vector< std::remove_cvref_t< T >, 1+sizeof...(Ts)>
meta::list< descriptors::EPSILON > parameters