Line data Source code
1 : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 : Copyright (c) 2013-2019 The plumed team
3 : (see the PEOPLE file at the root of the distribution for a list of names)
4 :
5 : See http://www.plumed.org for more information.
6 :
7 : This file is part of plumed, version 2.
8 :
9 : plumed is free software: you can redistribute it and/or modify
10 : it under the terms of the GNU Lesser General Public License as published by
11 : the Free Software Foundation, either version 3 of the License, or
12 : (at your option) any later version.
13 :
14 : plumed is distributed in the hope that it will be useful,
15 : but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : GNU Lesser General Public License for more details.
18 :
19 : You should have received a copy of the GNU Lesser General Public License
20 : along with plumed. If not, see <http://www.gnu.org/licenses/>.
21 : +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
22 : #include "Colvar.h"
23 : #include "ActionRegister.h"
24 :
25 : #include <string>
26 : #include <cmath>
27 :
28 : using namespace std;
29 :
30 : namespace PLMD {
31 : namespace colvar {
32 :
33 : //+PLUMEDOC COLVAR CELL
34 : /*
35 : Calculate the components of the simulation cell
36 :
37 : \par Examples
38 :
39 : The following input tells plumed to print the squared modulo of each of the three lattice vectors
40 : \plumedfile
41 : cell: CELL
42 : aaa: COMBINE ARG=cell.ax,cell.ay,cell.az POWERS=2,2,2 PERIODIC=NO
43 : bbb: COMBINE ARG=cell.bx,cell.by,cell.bz POWERS=2,2,2 PERIODIC=NO
44 : ccc: COMBINE ARG=cell.cx,cell.cy,cell.cz POWERS=2,2,2 PERIODIC=NO
45 : PRINT ARG=aaa,bbb,ccc
46 : \endplumedfile
47 :
48 : */
49 : //+ENDPLUMEDOC
50 :
51 :
52 18 : class Cell : public Colvar {
53 : Value* components[3][3];
54 :
55 : public:
56 : explicit Cell(const ActionOptions&);
57 : // active methods:
58 : virtual void calculate();
59 : /// Register all the keywords for this action
60 : static void registerKeywords( Keywords& keys );
61 : };
62 :
63 6461 : PLUMED_REGISTER_ACTION(Cell,"CELL")
64 :
65 9 : Cell::Cell(const ActionOptions&ao):
66 9 : PLUMED_COLVAR_INIT(ao)
67 : {
68 : std::vector<AtomNumber> atoms;
69 9 : checkRead();
70 :
71 36 : addComponentWithDerivatives("ax"); componentIsNotPeriodic("ax"); components[0][0]=getPntrToComponent("ax");
72 36 : addComponentWithDerivatives("ay"); componentIsNotPeriodic("ay"); components[0][1]=getPntrToComponent("ay");
73 36 : addComponentWithDerivatives("az"); componentIsNotPeriodic("az"); components[0][2]=getPntrToComponent("az");
74 36 : addComponentWithDerivatives("bx"); componentIsNotPeriodic("bx"); components[1][0]=getPntrToComponent("bx");
75 36 : addComponentWithDerivatives("by"); componentIsNotPeriodic("by"); components[1][1]=getPntrToComponent("by");
76 36 : addComponentWithDerivatives("bz"); componentIsNotPeriodic("bz"); components[1][2]=getPntrToComponent("bz");
77 36 : addComponentWithDerivatives("cx"); componentIsNotPeriodic("cx"); components[2][0]=getPntrToComponent("cx");
78 36 : addComponentWithDerivatives("cy"); componentIsNotPeriodic("cy"); components[2][1]=getPntrToComponent("cy");
79 36 : addComponentWithDerivatives("cz"); componentIsNotPeriodic("cz"); components[2][2]=getPntrToComponent("cz");
80 9 : requestAtoms(atoms);
81 9 : }
82 :
83 10 : void Cell::registerKeywords( Keywords& keys ) {
84 10 : Action::registerKeywords( keys );
85 10 : ActionWithValue::registerKeywords( keys );
86 10 : ActionAtomistic::registerKeywords( keys );
87 10 : componentsAreNotOptional(keys);
88 40 : keys.addOutputComponent("ax","default","the ax component of the cell matrix");
89 40 : keys.addOutputComponent("ay","default","the ay component of the cell matrix");
90 40 : keys.addOutputComponent("az","default","the az component of the cell matrix");
91 40 : keys.addOutputComponent("bx","default","the bx component of the cell matrix");
92 40 : keys.addOutputComponent("by","default","the by component of the cell matrix");
93 40 : keys.addOutputComponent("bz","default","the bz component of the cell matrix");
94 40 : keys.addOutputComponent("cx","default","the cx component of the cell matrix");
95 40 : keys.addOutputComponent("cy","default","the cy component of the cell matrix");
96 40 : keys.addOutputComponent("cz","default","the cz component of the cell matrix");
97 10 : }
98 :
99 :
100 : // calculator
101 150 : void Cell::calculate() {
102 :
103 3300 : for(int i=0; i<3; i++) for(int j=0; j<3; j++) components[i][j]->set(getBox()[i][j]);
104 1950 : for(int l=0; l<3; l++) for(int m=0; m<3; m++) {
105 5400 : Tensor der; for(int i=0; i<3; i++) der[i][m]=getBox()[l][i];
106 1350 : setBoxDerivatives(components[l][m],-der);
107 : }
108 150 : }
109 :
110 : }
111 4839 : }
112 :
113 :
114 :
|