mcodev31 / libmsym

molecular point group symmetry lib
MIT License
73 stars 33 forks source link

Symmetry-Adapted Linear Displacemets #6

Closed ghost closed 2 years ago

ghost commented 7 years ago

Hi, libmsym developers. I have symmetyrical molecule in xyz-format (it has C2V symmetry)

16
geometry
H                     2.06707000    -1.28986600     0.01947554
C                     1.07879150    -0.80754400    -0.05355871
H                     2.06707000     1.28986600     0.01947554
C                     1.07879150     0.80754400    -0.05355871
H                     0.00000000    -1.50171250    -2.07126346
C                     0.00000000    -1.33186400    -0.98544646
H                     0.00000000     1.50171250    -2.07126346
C                     0.00000000     1.33186400    -0.98544646
H                     0.00000000    -1.45758000     1.96862754
C                     0.00000000    -0.77875300     1.10317804
H                     0.00000000     1.45758000     1.96862754
C                     0.00000000     0.77875300     1.10317804
H                    -2.06707000    -1.28986600     0.01947554
C                    -1.07879150    -0.80754400    -0.05355871
H                    -2.06707000     1.28986600     0.01947554
C                    -1.07879150     0.80754400    -0.05355871

I want to get all (2*13) symmetrycally distorted geometries (for C2V symmetry group) with displacement of for example 1e-3 to calculate gradient by numerical differentiation. How should I get this with libmsym?

Best, Vladimir.

mcodev31 commented 7 years ago

No entirely sure what you want here. What do you mean by "all" and where did the 13 come from?

Do you want to displace a single atom and make sure that the symmetry remains the same? In that case msymApplyTranslation(msym_context ctx, msym_element_t *element, double v[3]) will do that.

ghost commented 7 years ago

I mean to find energy minimum on PEC, but I suggest that symmetry of final state is C2V. My program has no analytical derivatives of energy for the method I use (CCSD(T)). To reduce computation time I want to displace atoms symmetrically i.e displace in symmetry coordinates. It's like symmetry-adapted linear combinations of orbitals (IMHO) but using displacement vectors in the x, y, and z directions on each atom instead of the basis functions, and then will form SALC’s from these displacement vectors to see what the symmetry-adapted linear combinations of displacements should look like.

Molecule given has 6 symmetry-unique atoms, that is

H                     2.06707000    -1.28986600     0.01947554
C                     1.07879150    -0.80754400    -0.05355871
H                     0.00000000    -1.50171250    -2.07126346
C                     0.00000000    -1.33186400    -0.98544646
H                     0.00000000    -1.45758000     1.96862754
C                     0.00000000    -0.77875300     1.10317804

First two atoms can be displaced by 3-coordinates each (simultaneously with their symmetrical brothers) and last four atoms lie in YZ symmetry plane and can be displaced by 2-coordinates each. It gives 14 in sum, but one linear combination of all this displacements just move whole molecule along Z-axis and should be substracted. Thus only 13 symmetrical displacements are linear independent and don`t contain translations. If these 13 symmetrical displacements are applied with increments of 1e-3 in both directions relative to the original geometry it will give me a set of "ALL" geometries to compute a gradient numerically, preserving C2V symmetry.

mcodev31 commented 7 years ago

If I'm not mistaken this would be the A1 space of the vibrational modes. There currently is no vibrational support, but the p-orbitals would suffice for giving you the SALCs.

In order to view/verify: First use msym_example to symmetrise the molecule and align it to the xyz axes, then run it again on the symmetric+aligned version (msym_example calculates SALCs on the not aligned to demonstrate certain functionality, you can also rewrite the example :D) Add basis functions to entire molecule (principal:2, angular:1) you should get 14 SALCs in A1. You can view these in the example.

This type of functionality is really something that a program like Avogadro would provide by using libmsym but if you are willing to write some code:

The symmetrisation that libmsym is essentially a projection of xyz coordinate vectors on each atom onto the A1 space (same as your description), so the simplest method to generate the data you want would probably be this: 1) symmetrize 2) align to xyz (since abelian yz plane will align. see example code) 3) iterate over the equivalence sets (ES) 4) choose the first atom in ES 5) run msymApplyTranslation for x, y, z 5a) If you try to apply an x translation to one of the atoms in the yz plane it won't move, so optionally check if atom moved by more than 1e-6 or some small number and filter out. 6) print to file 7) go to 3

The more correct/proper way would be to get the translation vectors from the SALCs, but that seems a bit unnecessary in this case.