Message Boards Message Boards

0
|
3398 Views
|
8 Replies
|
0 Total Likes
View groups...
Share
Share this post:

The pure translation affine conjugating transformation of a space group.

Posted 1 year ago

I want to find the pure translation affine conjugating transformation of a space group, as shown below:

In[152]:= gensSG141ITA1={
 {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0,0,0,1}},
 {{-1, 0, 0, 1/2}, {0, -1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0, 1}},
 {{0, -1, 0, 0}, {1, 0, 0, 1/2}, {0, 0, 1, 1/4}, {0,0,0, 1}},
 {{-1, 0, 0, 1/2}, {0,  1, 0,  0}, {0,  0,  -1, 3/4}, {0,0,0, 1}},
 {{-1, 0, 0, 0}, {0, -1, 0, 1/2}, {0, 0, -1, 1/4}, {0,0,0, 1}},
 {{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0, 1}}
}; 
C3={{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0,1}};

Inverse[C3] . # . C3 -# &/@gensSG141ITA1;
AffineTransform[{#[[1;;3,1;;3]],#[[1;;3,4]]}//FractionalPart]&/@%

Out[155]= {TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )], TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )], TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )], TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )], TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )], TransformationFunction[( \!\(\*
TagBox[GridBox[{
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "0"},
{"0", "0", "0", "1"}
},
AutoDelete->False,
GridBoxDividers->{"Columns" -> {{False}}, 
         "ColumnsIndexed" -> {-2 -> True}, "Rows" -> {{False}}, 
         "RowsIndexed" -> {-2 -> True}},
GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}],
#& ]\) )]}

In the above example, the C3 is the desired matrix. But how can I find this result without knowing it?

Regards, Zhao

POSTED BY: Hongyi Zhao
8 Replies
Posted 1 year ago

Using the non-translation generators of the group $I 4_1/a m d$ [origin 1] (No. 141) provided here, I finally solved this problem in GAP, as shown below:

gap> SGGenElemITA141O1:=[
>  [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0,0,0,1]],
>  [[-1, 0, 0, 1/2], [0, -1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]],
>  [[0, -1, 0, 0], [1, 0, 0, 1/2], [0, 0, 1, 1/4], [0,0,0, 1]],
>  [[-1, 0, 0, 1/2], [0,  1, 0,  0], [0,  0,  -1, 3/4], [0,0,0, 1]],
>  [[-1, 0, 0, 0], [0, -1, 0, 1/2], [0, 0, -1, 1/4], [0,0,0, 1]],
>  [[1, 0, 0, 1/2], [0, 1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]]
> ];;
gap> SGITA141O1:=AffineCrystGroupOnLeft(SGGenElemITA141O1);
<matrix group with 6 generators>
gap> TNGenElemSGITA141O1:=GeneratorsOfGroup(TranslationNormalizer(SGITA141O1));
[ [ [ 1, 0, 0, 1/2 ], [ 0, 1, 0, 1/2 ], [ 0, 0, 1, 1/2 ], [ 0, 0, 0, 1 ] ], [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ], 
  [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 1/2 ], [ 0, 0, 0, 1 ] ] ]
gap> List(TNGenElemSGITA141O1, x-> SGITA141O1^x=SGITA141O1);
[ true, true, true ]

# With the help of some custom Mathematica functions, obtain all possible translations in Mod 1 format:
# "TNGenElemSGITA141O1=[ [ [ 1, 0, 0, 1/2 ], [ 0, 1, 0, 1/2 ], [ 0, 0, 1, 1/2 ], [ 0, 0, 0, 1 ] ], [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 1 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ], 
#   [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 1/2 ], [ 0, 0, 0, 1 ] ] ];;"//StringReplace[#,{"\n "->"","["->"{","]"->"}",":="->"=",";"->""}]&//ToExpression;
# AffCrystGroupOnLeft[%];
# #[[1;;3,4]]&/@Select[%, # != IdentityMatrix[4]&]//Matrix2GAP

gap> transTNSGITA141O1:=[[0, 0, 1/2],
> [1/2, 1/2, 0],
> [1/2, 1/2, 1/2]];
[ [ 0, 0, 1/2 ], [ 1/2, 1/2, 0 ], [ 1/2, 1/2, 1/2 ] ]
gap> for i in SGGenElemITA141O1 do
>   for j in TNGenElemSGITA141O1 do
>     c:= i^j - i;
>     l:=c{[1..3]}{[1..3]};
>     t:=List(c{[1..3]}[4],x->FractionModOne(x)); 
>     # Print(l," ",l = Zero(IdentityMat(3)),"\n");
>     # Print(t," ",t =[0,0,0] or t in transTNGenElemSGITA227O1,"\n"); 
>     Print(l = Zero(IdentityMat(3)) and (t =[0,0,0] or t in transTNSGITA141O1)," ");
>   od;
> od;
true true true true true true true true true true true true true true true true true true

All elements of the group TNSGITA141O1 generated by TNGenElemSGITA141O1 will do the trick. Here, I checked for confirmation using all possible translations in Mod 1 format, i.e., the elements of transTNSGITA141O1.

For related discussions, see here.

POSTED BY: Hongyi Zhao
Posted 1 year ago
POSTED BY: Hongyi Zhao
POSTED BY: Hans Dolhaine

Hello Zhao,

I still don't understand what you want. And I have difficulties to see what is going on.

I learnt that space-groups operate in R3 and the elements of a space-group are (mostly) written as

g =( R, T ) , R being a Rotation( (3,3)matrix) and T a translation-(3)vector

g operates on a vector x as g.x = R.x +T .

and the composition law is

(R1,T1).(R2,T2) = ( R1.R2 , R2.T1 +T2 ).

All this in R3. What are the ideas (and procedures) to say that a (4,4)-matrix is an element of a space-group? How do you operate with a (4,4)-matrix on a (3)-vector?

And yes, of course: if a group has infinite-many elements (like a translation-group) gengroupn will not come to an end.

P.S.

Ok, it could be like this : write every (3)vector in the form {x,y,z,1}. Then

um = gensSG141ITA1[[5]]
um.{x, y, z, 1}

and conventionally

umrot = um[[1 ;; 3, 1 ;; 3]]
umtrans = um[[1 ;; 3, 4]]
umrot.{x, y, z} + umtrans

Is that the "procedure"?

POSTED BY: Hans Dolhaine
Posted 1 year ago

Hi Hans Dolhaine,

Thank you for your wonderful code snippet.

I would like to add some additional comments:

  • You said the following:

    I must admit I do not understand at all your problem and what du want to achieve.

I mean C3 is a pure translation, aka, {1/2,1/2,1/2}, and it's also an invariant transformation of the corresponding space group discussed here, as shown by the following checking:

In[78]:= gensSG141ITA1={
 {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0,0,0,1}},
 {{-1, 0, 0, 1/2}, {0, -1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0, 1}},
 {{0, -1, 0, 0}, {1, 0, 0, 1/2}, {0, 0, 1, 1/4}, {0,0,0, 1}},
 {{-1, 0, 0, 1/2}, {0,  1, 0,  0}, {0,  0,  -1, 3/4}, {0,0,0, 1}},
 {{-1, 0, 0, 0}, {0, -1, 0, 1/2}, {0, 0, -1, 1/4}, {0,0,0, 1}},
 {{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0, 1}}
}; 

C3={{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0,0,0,1}};
Inverse[C3] . # . C3 -# &/@gensSG141ITA1;
AffineTransform[{#[[1;;3,1;;3]],#[[1;;3,4]]}//FractionalPart]&/@%;
TM=TransformationMatrix/@%

generalC3={{1, 0, 0, n1+ 1/2}, {0, 1, 0, n2+1/2}, {0, 0, 1, n3+1/2}, {0,0,0,1}};
Inverse[generalC3] . # . generalC3 -# &/@gensSG141ITA1;
AffineTransform[{#[[1;;3,1;;3]],#[[1;;3,4]]}//FractionalPart]&/@%//FullSimplify[#, Element[{n1, n2, n3}, Integers]]&;
TM==TransformationMatrix/@%

Out[82]= {{{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 
   1}}, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0,
    0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0, 0, 0, 
   0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0, 0, 0, 0}, {0, 
   0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 1}}, {{0, 0, 0, 0}, {0, 0, 0, 
   0}, {0, 0, 0, 0}, {0, 0, 0, 1}}}

Out[86]= True

Also see the following GAP code snippet for further confirmation/verification of this fact:

gap> gensSG141ITA1:=[
>  [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0,0,0,1]],
>  [[-1, 0, 0, 1/2], [0, -1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]],
>  [[0, -1, 0, 0], [1, 0, 0, 1/2], [0, 0, 1, 1/4], [0,0,0, 1]],
>  [[-1, 0, 0, 1/2], [0,  1, 0,  0], [0,  0,  -1, 3/4], [0,0,0, 1]],
>  [[-1, 0, 0, 0], [0, -1, 0, 1/2], [0, 0, -1, 1/4], [0,0,0, 1]],
>  [[1, 0, 0, 1/2], [0, 1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]]
> ];;
gap> SG141ITA1:=AffineCrystGroupOnLeft(gensSG141ITA1);
<matrix group with 6 generators>
gap> C3:=[[1, 0, 0, 1/2], [0, 1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0,1]];
[ [ 1, 0, 0, 1/2 ], [ 0, 1, 0, 1/2 ], [ 0, 0, 1, 1/2 ], [ 0, 0, 0, 1 ] ]
gap> SG141ITA1^C3=SG141ITA1;
true
gap> AffineCrystGroupOnLeft(List(GeneratorsOfGroup(SG141ITA1),x-> C3^-1 * x * C3 ))=SG141ITA1;
true

And I just want to find such transformations.

  • gensSG141ITA1 are the generators of space group I 41/a m d [origin 1] (No. 141), corresponding to the data given here.

The 3 * 3 sub-matrices resided in the up-left portion are the corresponding point group elements. For your information: the following results, given by GAP, are consistent with the results of the approach you used here:

    gap> gensSG141ITA1:=[
    >  [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0,0,0,1]],
    >  [[-1, 0, 0, 1/2], [0, -1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]],
    >  [[0, -1, 0, 0], [1, 0, 0, 1/2], [0, 0, 1, 1/4], [0,0,0, 1]],
    >  [[-1, 0, 0, 1/2], [0,  1, 0,  0], [0,  0,  -1, 3/4], [0,0,0, 1]],
    >  [[-1, 0, 0, 0], [0, -1, 0, 1/2], [0, 0, -1, 1/4], [0,0,0, 1]],
    >  [[1, 0, 0, 1/2], [0, 1, 0, 1/2], [0, 0, 1, 1/2], [0,0,0, 1]]
    > ];;
    gap> SG141ITA1:=AffineCrystGroupOnLeft(gensSG141ITA1);
    <matrix group with 6 generators>
    gap> PG141ITA1:=PointGroup(SG141ITA1);
    <matrix group of size 16 with 4 generators>
    gap> GeneratorsOfGroup(PG141ITA1);
    [ [ [ -1, 0, 0 ], [ 0, -1, 0 ], [ 0, 0, 1 ] ], [ [ 0, -1, 0 ], [ 1, 0, 0 ], [ 0, 0, 1 ] ], [ [ -1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, -1 ] ], 
      [ [ -1, 0, 0 ], [ 0, -1, 0 ], [ 0, 0, -1 ] ] ]
    gap> IdGroup(PG141ITA1);
    [ 16, 11 ]
    gap> ccl:=ConjugacyClasses(PG141ITA1);
    [ [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]^G, [ [ -1, 0, 0 ], [ 0, -1, 0 ], [ 0, 0, 1 ] ]^G, [ [ -1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, -1 ] ]^G, 
      [ [ -1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]^G, [ [ 0, -1, 0 ], [ -1, 0, 0 ], [ 0, 0, -1 ] ]^G, [ [ 0, -1, 0 ], [ -1, 0, 0 ], [ 0, 0, 1 ] ]^G, 
      [ [ 0, -1, 0 ], [ 1, 0, 0 ], [ 0, 0, -1 ] ]^G, [ [ 0, -1, 0 ], [ 1, 0, 0 ], [ 0, 0, 1 ] ]^G, [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, -1 ] ]^G, 
      [ [ -1, 0, 0 ], [ 0, -1, 0 ], [ 0, 0, -1 ] ]^G ]
    gap> Size(ccl);
    10
    gap> List(ccl, x-> [TraceMat(Representative(x)), Size(x)]);
    [ [ 3, 1 ], [ -1, 1 ], [ -1, 2 ], [ 1, 2 ], [ -1, 2 ], [ 1, 2 ], [ -1, 2 ], [ 1, 2 ], [ 1, 1 ], [ -3, 1 ] ]
  • The space group is an infinite affine matrix group, so, your gengroupn function will fall into an infinite loop:

    In[1]:= gengroupn[ge1_] := Module[{}, ge = ge1;
      ne = Length[ge];
      l1 = 1;
      ne = Length[ge];
      While[l1 <= ne, l2 = 1;
       While[l2 <= ne, res = FullSimplify[Together[ge[[l1]] . ge[[l2]]]];
        If[! MemberQ[ge, res], ne++; AppendTo[ge, res]];
        l2++];
       l1++];
      ge]
    
    In[2]:= gensSG141ITA1 = {{{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 
         0}, {0, 0, 0, 1}}, {{-1, 0, 0, 1/2}, {0, -1, 0, 1/2}, {0, 0, 1, 
         1/2}, {0, 0, 0, 1}}, {{0, -1, 0, 0}, {1, 0, 0, 1/2}, {0, 0, 1, 
         1/4}, {0, 0, 0, 1}}, {{-1, 0, 0, 1/2}, {0, 1, 0, 0}, {0, 0, -1, 
         3/4}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, -1, 0, 1/2}, {0, 0, -1, 
         1/4}, {0, 0, 0, 1}}, {{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 
         1/2}, {0, 0, 0, 1}}};
    
    In[3]:= gengroupn[gensSG141ITA1]
    
    Out[3]= $Aborted
    

A possible method is to find the fractional part of the shifted part modulo 1 as the representative elements of the group. But I still don't know how to generate such a group using Wolfram language.

Regards, Zhao

POSTED BY: Hongyi Zhao

Hello Hongyi Zhao,

I must admit I do not understand at all your problem and what du want to achieve. Looking at

gensSG141ITA1 = {{{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 
     1}}, {{-1, 0, 0, 1/2}, {0, -1, 0, 1/2}, {0, 0, 1, 1/2}, {0, 0, 0,
      1}}, {{0, -1, 0, 0}, {1, 0, 0, 1/2}, {0, 0, 1, 1/4}, {0, 0, 0, 
     1}}, {{-1, 0, 0, 1/2}, {0, 1, 0, 0}, {0, 0, -1, 3/4}, {0, 0, 0, 
     1}}, {{-1, 0, 0, 0}, {0, -1, 0, 1/2}, {0, 0, -1, 1/4}, {0, 0, 0, 
     1}}, {{1, 0, 0, 1/2}, {0, 1, 0, 1/2}, {0, 0, 1, 1/2}, {0, 0, 0,1}}};
MatrixForm /@ gensSG141ITA1

I noticed that the first 3 entries in the fourth line are always zero. So I got the idea that the (3,3)-matrices in the upper left portion might be of interest. Therefore I isolated them and deleted duplicates.

newmat = DeleteDuplicates[#[[1 ;; 3, 1 ;; 3]] & /@ gensSG141ITA1];
MatrixForm /@ newmat
Length[newmat]

That there are duplicates (the IdentityMatrix occurs twice) already shows that these (3,3)-matrices are not likely to be of significance. And these matrices do not form a group: there is at least one product that is not member of the set of matrices (newmat)

i = 2; j = 3;
MemberQ[newmat, newmat[[i]].newmat[[j]]]

Apply the following procedure to construct a group from generating elements (matrices)

gengroupn[ge1_] := Module[{},
  ge = ge1;
  ne = Length[ge];
  l1 = 1;
  ne = Length[ge];
  While[l1 <= ne,
   l2 = 1;
   While[l2 <= ne,
    res = FullSimplify[Together[ge[[l1]].ge[[l2]]]];
    If[! MemberQ[ge, res],
     ne++; AppendTo[ge, res]];
    l2++];
   l1++];
  ge
  ]

and

gg = gengroupn[newmat];
ne = Length[gg]
MatrixForm /@ gg

Interesting enough the resulting group is hermitian: Transpose[g] == Inverse[g]

gginv = Inverse /@ gg;
gginv - Transpose /@ gg

Now I determined the classes of conjugated elements. There are two types of classes. 4 which contain just one element and six containing two elements

kL = {{gg[[1]]}};
ind = Range[Length[gg]];
nk = 1;
Do[
 If[ind[[j1]] =!= 0,
  nk = nk + 1;
  k1 = {};                                  (*start class with empty \
set  *)
  t1 = gg[[j1]];                   (*get group element *) 
  AppendTo[k1, t1];
  ind[[j1]] = 0;
  Do[                                               (* 
   look for a conjugated element  *)
   If[
    ind[[j2]] =!= 0,
    t2 = gg[[j2]];     (* get element   *)
    pt = 2;
    flag = 0;
    While[flag == 0 && pt <= Length[gg],
     t3 = gg[[pt]];
     If[t3.t2 == t1.t3,
      flag = 1;
      ind[[j2]] = 0;
      AppendTo[k1, t2]];
     pt++
     ]
    ],
   {j2, j1 + 1, Length[gg]}];
  AppendTo[kL, k1]
  ],
 {j1, 2, Length[gg]}]

ColumnForm[Map[MatrixForm, #] & /@ kL]
Map[Tr, #] & /@ kL

The classes may be constructed with a considerable shorter method

kL2 = DeleteDuplicates[Function[x, Union[Transpose[#].x.# & /@ gg]] /@ gg];

ColumnForm[Map[MatrixForm, #] & /@ kL2]
Map[Tr, #] & /@ kL2

The elements of the classes of Length one form a (sub)group of gg. Get all elements of classes with length 1

klen1 = Flatten[Select[kL, Length[#] == 1 &], 1];
MatrixForm /@ klen1

and take these as generating elements

gsub = gengroupn[klen1];
Length[gsub]
MatrixForm /@ gsub

giving the set klen1 again. So klen1 is a subgroup of gg.

I am afraid (and pretty sure) that will not help you with your problem, but I just wanted to let you know.

POSTED BY: Hans Dolhaine
Posted 1 year ago
POSTED BY: Hongyi Zhao

On my machine (version 7.0) this

Inverse[C3] . # . C3 -# &/@gensSG141ITA1;

doesn't produce "zero-matrices" .

POSTED BY: Hans Dolhaine
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract