The FieldSymmetry class represents the symmetry group of FlowFields. Specifically, the periodic in x,z and polynomial in y expansions inherent in FlowFields allow the follow symmetries
Let G be the group generated by these symmetries. Specific choice of boundary conditions at the walls might constrain the symmetry group of a specific flow to a subgroup G. But for generality,the FieldSymmetry class can represent any symmetry in G. The FieldSymmetry class parameterizes symmetries σ ⊂ G symmetries as follows. Any element of the symmetry group is defined by six parameters
with the action of σ on a velocity field u as
The following is a brief overview of FieldSymmetry functionality. For a complete description, see the header file symmetry.h.
In C++ code, elements of the symmetry group can initialized as follows, where sx,sy,sz are of type int and ax, az are of type Real.
FieldSymmetry sigma0(sx, sy, sz, ax, az, s); FieldSymmetry sigma1(sx, sy, sz, ax, az); // the s argument s defaults to 1 FieldSymmetry sigma2(sx, sy, sz); // s defaults to 1; ax,az to 0 FieldSymmetry tau(ax, az); // pure translation: s,sx,sy,sz default to 1 FieldSymmetry identity; // the identity: s defaults to 1; ax,az to 0; sx,sy,sz to 1
FieldSymmetries act on each other and velocity fields as follows
FieldSymmetry sigma4 = sigma2 * sigma1; // group multiplication sigma4 *= sigma3; // sigma4 now equals sigma3*sigma2*sigma1 ---note order! FlowField u("u"); // read velocity field u from disk FlowField v = sigma1 * u; // Make new field v = sigma1 u v *= sigma2; // v now equals sigma2 * sigma1 * u
FieldSymmetries can be saved to / read from disk…
sigma1.save("sigma1"); // saves to ASCII file sigma1.asc FieldSymmetry sigma7("sigma1"); // make a new symmetry element sigma7 == sigma1
…compared to each other…
if (sigma1 != identity) ... else if (sigma1 == sigma7) ...
The FieldSymmetry uses ASCII input-output. The storage format is
s sx sy sz ax az
Thus, the following C++ channelflow code
FieldSymmetry sigma(-1, -1, -1, 0.3, 0.1); sigma.save("sigma");
produces the ASCII file sigma.asc
with contents
1 -1 -1 -1 0.3 0.1
which can then be read back into a channeflow program with
FieldSymmetry sigma("sigma");
Note that the order of parameters in the ASCII file is different than the order in the FieldSymmetry
constructor: the overall multiplicative sign s
goes first in the file and last in the C++ constructor. I apologize for this. The reasons for the difference are are historical. The next release of channelflow will have order (s, sx, sy, sz, ax, az) for both.
The SymmetryList
class is a essentially an array of FieldSymmetry
objects with simple ASCII IO methods. The ASCII format is
% N s0 sx0 sy0 sz0 ax0 az0 s1 sx1 sy1 sz1 ax1 az1 ...
where N is the number of symmetries listed in the file. Thus the file S.asc
with contents
% 2 1 1 1 -1 0.5 0.0 1 -1 -1 1 0.5 0.5
represents the symmetries σ0 = (1, 1, 1, -1, 0.5, 0.0) and σ1 = (1, -1, -1, 1, 0.5, 0.5). These are the generators of the S S symmetry group. The generators can be loaded into channelflow, used, and saved as follows
SymmetryList S("S"); // load generators from ASCII file FlowField foo = S[0](u); // apply (1, 1, 1, -1, 0.5, 0.0) to u FlowField bar = S[1](u); // apply (1, -1, -1, 1, 0.5, 0.5) to u S.save("Q"); // save generators into another file SymmetryList P(4); // Create another symmetry group P[0] = FieldSymmetry(1,1,1, 0.2, 0.0); P[1] = etc.;