docs:classes:fieldsymmetry

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.;

docs/classes/fieldsymmetry.txt · Last modified: 2010/02/02 07:55 (external edit)