1 | //
|
---|
2 | // coor.h
|
---|
3 | //
|
---|
4 | // Copyright (C) 1996 Limit Point Systems, Inc.
|
---|
5 | //
|
---|
6 | // Author: Curtis Janssen <cljanss@limitpt.com>
|
---|
7 | // Maintainer: LPS
|
---|
8 | //
|
---|
9 | // This file is part of the SC Toolkit.
|
---|
10 | //
|
---|
11 | // The SC Toolkit is free software; you can redistribute it and/or modify
|
---|
12 | // it under the terms of the GNU Library General Public License as published by
|
---|
13 | // the Free Software Foundation; either version 2, or (at your option)
|
---|
14 | // any later version.
|
---|
15 | //
|
---|
16 | // The SC Toolkit is distributed in the hope that it will be useful,
|
---|
17 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
18 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
19 | // GNU Library General Public License for more details.
|
---|
20 | //
|
---|
21 | // You should have received a copy of the GNU Library General Public License
|
---|
22 | // along with the SC Toolkit; see the file COPYING.LIB. If not, write to
|
---|
23 | // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
---|
24 | //
|
---|
25 | // The U.S. Government is granted a limited license as per AL 91-7.
|
---|
26 | //
|
---|
27 |
|
---|
28 | #ifndef _chemistry_molecule_coor_h
|
---|
29 | #define _chemistry_molecule_coor_h
|
---|
30 |
|
---|
31 | #ifdef __GNUC__
|
---|
32 | #pragma interface
|
---|
33 | #endif
|
---|
34 |
|
---|
35 | #include <iostream>
|
---|
36 | #include <vector>
|
---|
37 |
|
---|
38 | #include <math/scmat/matrix.h>
|
---|
39 | #include <math/optimize/transform.h>
|
---|
40 | #include <chemistry/molecule/molecule.h>
|
---|
41 |
|
---|
42 | namespace sc {
|
---|
43 |
|
---|
44 | /** The IntCoor abstract class describes an internal coordinate of a
|
---|
45 | molecule. */
|
---|
46 | class IntCoor: public SavableState {
|
---|
47 | protected:
|
---|
48 | // conversion factors from radians, bohr to the preferred units
|
---|
49 | static double bohr_conv;
|
---|
50 | static double radian_conv;
|
---|
51 | char *label_;
|
---|
52 | double value_;
|
---|
53 | public:
|
---|
54 | IntCoor(StateIn&);
|
---|
55 | IntCoor(const IntCoor&);
|
---|
56 | /** This constructor takes a string containing a label for the
|
---|
57 | internal coordinate. The string is copied. */
|
---|
58 | IntCoor(const char* label = 0);
|
---|
59 | /** The KeyVal constructor.
|
---|
60 | <dl>
|
---|
61 |
|
---|
62 | <dt><tt>label</tt><dd> A label for the coordinate using only to
|
---|
63 | identify the coordinate to the user in printouts. The default is
|
---|
64 | no label.
|
---|
65 |
|
---|
66 | <dt><tt>value</tt><dd> A value for the coordinate. In the way that
|
---|
67 | coordinates are usually used, the default is to compute a value
|
---|
68 | from the cartesian coordinates in a Molecule object.
|
---|
69 |
|
---|
70 | <dt><tt>unit</tt><dd> The unit in which the value is given. This
|
---|
71 | can be bohr, anstrom, radian, and degree. The default is bohr for
|
---|
72 | lengths and radian for angles.
|
---|
73 |
|
---|
74 | </dl> */
|
---|
75 | IntCoor(const Ref<KeyVal>&);
|
---|
76 |
|
---|
77 | virtual ~IntCoor();
|
---|
78 | void save_data_state(StateOut&);
|
---|
79 |
|
---|
80 | /// Returns the string containing the label for the internal coordinate.
|
---|
81 | virtual const char* label() const;
|
---|
82 | /// Returns the value of the coordinate in atomic units or radians.
|
---|
83 | virtual double value() const;
|
---|
84 | /// Sets the value of the coordinate in atomic units or radians.
|
---|
85 | virtual void set_value(double);
|
---|
86 | /// Returns the value of the coordinate in more familiar units.
|
---|
87 | virtual double preferred_value() const;
|
---|
88 | /// Returns a string representation of the type of coordinate this is.
|
---|
89 | virtual const char* ctype() const = 0;
|
---|
90 | /// Print information about the coordinate.
|
---|
91 | virtual void print(std::ostream & o=ExEnv::out0()) const;
|
---|
92 | virtual void print_details(const Ref<Molecule> &, std::ostream& =ExEnv::out0()) const;
|
---|
93 | /** Returns the value of the force constant associated with this
|
---|
94 | coordinate. */
|
---|
95 | virtual double force_constant(Ref<Molecule>&) = 0;
|
---|
96 | /// Recalculate the value of the coordinate.
|
---|
97 | virtual void update_value(const Ref<Molecule>&) = 0;
|
---|
98 | /// Fill in a row the the B matrix.
|
---|
99 | virtual void bmat(const Ref<Molecule>&,RefSCVector&bmat,double coef=1.0) = 0;
|
---|
100 | /** Test to see if this internal coordinate is equivalent to that one.
|
---|
101 | The definition of equivalence is left up to the individual
|
---|
102 | coordinates. */
|
---|
103 | virtual int equivalent(Ref<IntCoor>&) = 0;
|
---|
104 | };
|
---|
105 |
|
---|
106 | /** SumIntCoor is used to construct linear combinations of internal
|
---|
107 | coordinates.
|
---|
108 |
|
---|
109 | The following is a sample ParsedKeyVal input for a SumIntCoor object:
|
---|
110 | <pre>
|
---|
111 | sumintcoor\<SumIntCoor>: (
|
---|
112 | coor: [
|
---|
113 | \<StreSimpleCo>:( atoms = [ 1 2 ] )
|
---|
114 | \<StreSimpleCo>:( atoms = [ 2 3 ] )
|
---|
115 | ]
|
---|
116 | coef = [ 1.0 1.0 ]
|
---|
117 | )
|
---|
118 | </pre>
|
---|
119 | */
|
---|
120 | class SumIntCoor: public IntCoor {
|
---|
121 | private:
|
---|
122 | std::vector<double> coef_;
|
---|
123 | std::vector<Ref<IntCoor> > coor_;
|
---|
124 | public:
|
---|
125 | SumIntCoor(StateIn&);
|
---|
126 | /** This constructor takes a string containing a label for this
|
---|
127 | coordinate. */
|
---|
128 | SumIntCoor(const char *);
|
---|
129 | /** The KeyVal constructor.
|
---|
130 | <dl>
|
---|
131 |
|
---|
132 | <dt><tt>coor</tt><dd> A vector of IntCoor objects that define the
|
---|
133 | summed coordinates.
|
---|
134 |
|
---|
135 | <dt><tt>coef</tt><dd> A vector of floating point numbers that gives
|
---|
136 | the coefficients of the summed coordinates.
|
---|
137 |
|
---|
138 | </dl> */
|
---|
139 | SumIntCoor(const Ref<KeyVal>&);
|
---|
140 |
|
---|
141 | ~SumIntCoor();
|
---|
142 | void save_data_state(StateOut&);
|
---|
143 |
|
---|
144 | /// Returns the number of coordinates in this linear combination.
|
---|
145 | int n();
|
---|
146 | /** Add a coordinate to the linear combination. coef is the
|
---|
147 | coefficient for the added coordinate. */
|
---|
148 | void add(Ref<IntCoor>&,double coef);
|
---|
149 | /// This function normalizes all the coefficients.
|
---|
150 | void normalize();
|
---|
151 |
|
---|
152 | // IntCoor overrides
|
---|
153 | /// Returns the value of the coordinate in a.u. and radians.
|
---|
154 | double preferred_value() const;
|
---|
155 | /// Always returns ``SUM''.
|
---|
156 | const char* ctype() const;
|
---|
157 | /// Print the individual coordinates in the sum with their coefficients.
|
---|
158 | void print_details(const Ref<Molecule> &, std::ostream& =ExEnv::out0()) const;
|
---|
159 | /// Returns the weighted sum of the individual force constants.
|
---|
160 | double force_constant(Ref<Molecule>&);
|
---|
161 | /// Recalculate the value of the coordinate.
|
---|
162 | void update_value(const Ref<Molecule>&);
|
---|
163 | /// Fill in a row the the B matrix.
|
---|
164 | void bmat(const Ref<Molecule>&,RefSCVector&bmat,double coef = 1.0);
|
---|
165 | /// Always returns 0.
|
---|
166 | int equivalent(Ref<IntCoor>&);
|
---|
167 | };
|
---|
168 |
|
---|
169 | /** The SetIntCoor class describes a set of internal coordinates.
|
---|
170 | It can automatically generate these coordinates using a integral coordinate
|
---|
171 | generator object (see the IntCoorGen class) or the internal
|
---|
172 | coordinates can be explicity given.
|
---|
173 |
|
---|
174 | The following is a sample ParsedKeyVal input for
|
---|
175 | a SetIntCoor object.
|
---|
176 | <pre>
|
---|
177 | setintcoor<SetIntCoor>: [
|
---|
178 | \<SumIntCoor>: (
|
---|
179 | coor: [
|
---|
180 | \<StreSimpleCo>:( atoms = [ 1 2 ] )
|
---|
181 | \<StreSimpleCo>:( atoms = [ 2 3 ] )
|
---|
182 | ]
|
---|
183 | coef = [ 1.0 1.0 ]
|
---|
184 | )
|
---|
185 | \<BendSimpleCo>:( atoms = [ 1 2 3 ] )
|
---|
186 | ]
|
---|
187 | </pre>
|
---|
188 | */
|
---|
189 | class SetIntCoor: public SavableState {
|
---|
190 | private:
|
---|
191 | std::vector<Ref<IntCoor> > coor_;
|
---|
192 | public:
|
---|
193 | SetIntCoor();
|
---|
194 | SetIntCoor(StateIn&);
|
---|
195 | /** The KeyVal constructor.
|
---|
196 | <dl>
|
---|
197 |
|
---|
198 | <dt><tt>generator</tt><dd> A IntCoorGen object that will be used to
|
---|
199 | generate the internal coordinates.
|
---|
200 |
|
---|
201 | <dt><tt>i</tt><dd> A sequence of integer keywords, all \f$i\f$ for
|
---|
202 | \f$0 \leq i < n\f$, can be assigned to IntCoor objects.
|
---|
203 |
|
---|
204 | </dl> */
|
---|
205 | SetIntCoor(const Ref<KeyVal>&);
|
---|
206 |
|
---|
207 | virtual ~SetIntCoor();
|
---|
208 | void save_data_state(StateOut&);
|
---|
209 |
|
---|
210 | /// Adds an internal coordinate to the set.
|
---|
211 | void add(const Ref<IntCoor>&);
|
---|
212 | /// Adds all the elements of another set to this one.
|
---|
213 | void add(const Ref<SetIntCoor>&);
|
---|
214 | /// Removes the last coordinate from this set.
|
---|
215 | void pop();
|
---|
216 | /// Removes all coordinates from the set.
|
---|
217 | void clear();
|
---|
218 | /// Returns the number of coordinates in the set.
|
---|
219 | int n() const;
|
---|
220 | /// Returns a reference to the i'th coordinate in the set.
|
---|
221 | Ref<IntCoor> coor(int i) const;
|
---|
222 | /// Compute the B matrix by finite displacements.
|
---|
223 | virtual void fd_bmat(const Ref<Molecule>&,RefSCMatrix&);
|
---|
224 | /// Compute the B matrix the old-fashioned way.
|
---|
225 | virtual void bmat(const Ref<Molecule>&, RefSCMatrix&);
|
---|
226 | /** Create an approximate Hessian for this set of coordinates. This
|
---|
227 | Hessian is a symmetric matrix whose i'th diagonal is the force
|
---|
228 | constant for the i'th coordinate in the set. */
|
---|
229 | virtual void guess_hessian(Ref<Molecule>&,RefSymmSCMatrix&);
|
---|
230 | /// Print the coordinates in the set.
|
---|
231 | virtual void print_details(const Ref<Molecule> &,std::ostream& =ExEnv::out0()) const;
|
---|
232 | /// Recalculate the values of the internal coordinates in the set.
|
---|
233 | virtual void update_values(const Ref<Molecule>&);
|
---|
234 | /// Copy the values of the internal coordinates to a vector.
|
---|
235 | virtual void values_to_vector(const RefSCVector&);
|
---|
236 | };
|
---|
237 |
|
---|
238 |
|
---|
239 | // ////////////////////////////////////////////////////////////////////////
|
---|
240 |
|
---|
241 | class BitArrayLTri;
|
---|
242 |
|
---|
243 | /** IntCoorGen generates a set of simple internal coordinates
|
---|
244 | for a molecule. */
|
---|
245 | class IntCoorGen: public SavableState
|
---|
246 | {
|
---|
247 | protected:
|
---|
248 | Ref<Molecule> molecule_;
|
---|
249 |
|
---|
250 | int linear_bends_;
|
---|
251 | int linear_lbends_;
|
---|
252 | int linear_tors_;
|
---|
253 | int linear_stors_;
|
---|
254 | int nextra_bonds_;
|
---|
255 | int *extra_bonds_;
|
---|
256 | double linear_bend_thres_;
|
---|
257 | double linear_tors_thres_;
|
---|
258 | double radius_scale_factor_;
|
---|
259 |
|
---|
260 | void init_constants();
|
---|
261 |
|
---|
262 | double cos_ijk(Molecule& m, int i, int j, int k);
|
---|
263 | int hterminal(Molecule& m, BitArrayLTri& bonds, int i);
|
---|
264 | int nearest_contact(int i, Molecule& m);
|
---|
265 |
|
---|
266 | void add_bonds(const Ref<SetIntCoor>& list, BitArrayLTri& bonds, Molecule& m);
|
---|
267 | void add_bends(const Ref<SetIntCoor>& list, BitArrayLTri& bonds, Molecule& m);
|
---|
268 | void add_tors(const Ref<SetIntCoor>& list, BitArrayLTri& bonds, Molecule& m);
|
---|
269 | void add_out(const Ref<SetIntCoor>& list, BitArrayLTri& bonds, Molecule& m);
|
---|
270 | public:
|
---|
271 | /** Create an IntCoorGen given a Molecule and, optionally, extra bonds.
|
---|
272 | IntCoorGen keeps a reference to extra and deletes it when the
|
---|
273 | destructor is called. */
|
---|
274 | IntCoorGen(const Ref<Molecule>&, int nextra=0, int *extra=0);
|
---|
275 | /** The KeyVal constructor.
|
---|
276 | <dl>
|
---|
277 |
|
---|
278 | <dt><tt>molecule</tt><dd> A Molecule object. There is no default.
|
---|
279 |
|
---|
280 | <dt><tt>radius_scale_factor</tt><dd> If the distance between two
|
---|
281 | atoms is less than the radius scale factor times the sum of the
|
---|
282 | atoms' atomic radii, then a bond is placed between the two atoms
|
---|
283 | for the purpose of finding internal coordinates. The default is
|
---|
284 | 1.1.
|
---|
285 |
|
---|
286 | <dt><tt>linear_bend_threshold</tt><dd> A bend angle in degress
|
---|
287 | greater than 180 minus this keyword's floating point value is
|
---|
288 | considered a linear bend. The default is 1.0.
|
---|
289 |
|
---|
290 | <dt><tt>linear_tors_threshold</tt><dd> The angles formed by atoms
|
---|
291 | a-b-c and b-c-d are checked for near linearity. If an angle in
|
---|
292 | degrees is greater than 180 minus this keyword's floating point
|
---|
293 | value, then the torsion is classified as a linear torsion. The
|
---|
294 | default is 1.0.
|
---|
295 |
|
---|
296 | <dt><tt>linear_bend</tt><dd> Generate BendSimpleCo objects to
|
---|
297 | describe linear bends. The default is false.
|
---|
298 |
|
---|
299 | <dt><tt>linear_lbend</tt><dd> Generate pairs of LinIPSimpleCo and
|
---|
300 | LinIPSimpleCo objects to describe linear bends. The default is
|
---|
301 | true.
|
---|
302 |
|
---|
303 | <dt><tt>linear_tors</tt><dd> Generate TorsSimpleCo objects to
|
---|
304 | described linear torsions. The default is false.
|
---|
305 |
|
---|
306 | <dt><tt>linear_stors</tt><dd> Generate ScaledTorsSimpleCo objects
|
---|
307 | to described linear torsions. The default is true.
|
---|
308 |
|
---|
309 | <dt><tt>extra_bonds</tt><dd> This is a vector of atom numbers,
|
---|
310 | where elements \f$2 (i-1) + 1\f$ and \f$2 i\f$ specify the atoms
|
---|
311 | which are bound in extra bond \f$i\f$. The extra_bonds keyword
|
---|
312 | should only be needed for weakly interacting fragments, otherwise
|
---|
313 | all the needed bonds will be found.
|
---|
314 |
|
---|
315 | </dl> */
|
---|
316 | IntCoorGen(const Ref<KeyVal>&);
|
---|
317 | IntCoorGen(StateIn&);
|
---|
318 |
|
---|
319 | ~IntCoorGen();
|
---|
320 |
|
---|
321 | /// Standard member.
|
---|
322 | void save_data_state(StateOut&);
|
---|
323 |
|
---|
324 | /// This generates a set of internal coordinates.
|
---|
325 | virtual void generate(const Ref<SetIntCoor>&);
|
---|
326 |
|
---|
327 | /// Print out information about this.
|
---|
328 | virtual void print(std::ostream& out=ExEnv::out0()) const;
|
---|
329 | };
|
---|
330 |
|
---|
331 |
|
---|
332 | // ////////////////////////////////////////////////////////////////////////
|
---|
333 |
|
---|
334 |
|
---|
335 | /** The MolecularCoor abstract class describes the coordinate system used
|
---|
336 | to describe a molecule. It is used to convert a molecule's cartesian
|
---|
337 | coordinates to and from this coordinate system. */
|
---|
338 | class MolecularCoor: public SavableState
|
---|
339 | {
|
---|
340 | protected:
|
---|
341 | Ref<Molecule> molecule_;
|
---|
342 | RefSCDimension dnatom3_; // the number of atoms x 3
|
---|
343 | Ref<SCMatrixKit> matrixkit_; // used to construct matrices
|
---|
344 |
|
---|
345 | int debug_;
|
---|
346 | public:
|
---|
347 | MolecularCoor(Ref<Molecule>&);
|
---|
348 | MolecularCoor(StateIn&);
|
---|
349 | /** The KeyVal constructor.
|
---|
350 | <dl>
|
---|
351 |
|
---|
352 | <dt><tt>molecule</tt><dd> A Molecule object. There is no default.
|
---|
353 |
|
---|
354 | <dt><tt>debug</tt><dd> An integer which, if nonzero, will cause
|
---|
355 | extra output.
|
---|
356 |
|
---|
357 | <dt><tt>matrixkit</tt><dd> A SCMatrixKit object. It is usually
|
---|
358 | unnecessary to give this keyword.
|
---|
359 |
|
---|
360 | <dt><tt>natom3</tt><dd> An SCDimension object for the dimension of
|
---|
361 | the vector of cartesian coordinates. It is usually unnecessary to
|
---|
362 | give this keyword.
|
---|
363 |
|
---|
364 | </dl> */
|
---|
365 | MolecularCoor(const Ref<KeyVal>&);
|
---|
366 |
|
---|
367 | virtual ~MolecularCoor();
|
---|
368 |
|
---|
369 | void save_data_state(StateOut&);
|
---|
370 |
|
---|
371 | /** Returns a smart reference to an SCDimension equal to the
|
---|
372 | number of atoms in the molecule times 3. */
|
---|
373 | RefSCDimension dim_natom3() { return dnatom3_; }
|
---|
374 |
|
---|
375 | /// Returns the molecule.
|
---|
376 | Ref<Molecule> molecule() const { return molecule_; }
|
---|
377 |
|
---|
378 | /// Print the coordinate.
|
---|
379 | virtual void print(std::ostream& =ExEnv::out0()) const = 0;
|
---|
380 | virtual void print_simples(std::ostream& =ExEnv::out0()) const = 0;
|
---|
381 |
|
---|
382 | /** Returns a smart reference to an SCDimension equal to the number of
|
---|
383 | coordinates (be they Cartesian, internal, or whatever) that are
|
---|
384 | being optimized. */
|
---|
385 | virtual RefSCDimension dim() = 0;
|
---|
386 |
|
---|
387 | /** Given a set of displaced internal coordinates, update the cartesian
|
---|
388 | coordinates of the Molecule contained herein. This function does
|
---|
389 | not change the vector ``internal''. */
|
---|
390 | int to_cartesian(const RefSCVector&internal);
|
---|
391 | virtual int to_cartesian(const Ref<Molecule>&mol,
|
---|
392 | const RefSCVector&internal) = 0;
|
---|
393 |
|
---|
394 | /** Fill in the vector ``internal'' with the current internal
|
---|
395 | coordinates. Note that this member will update the values of the
|
---|
396 | variable internal coordinates. */
|
---|
397 | virtual int to_internal(RefSCVector&internal) = 0;
|
---|
398 |
|
---|
399 | /** Convert the internal coordinate gradients in ``internal'' to
|
---|
400 | Cartesian coordinates and copy these Cartesian coordinate gradients
|
---|
401 | to ``cartesian''. Only the variable internal coordinate gradients
|
---|
402 | are transformed. */
|
---|
403 | virtual int to_cartesian(RefSCVector&cartesian,RefSCVector&internal) = 0;
|
---|
404 |
|
---|
405 | /** Convert the Cartesian coordinate gradients in ``cartesian'' to
|
---|
406 | internal coordinates and copy these internal coordinate gradients
|
---|
407 | to ``internal''. Only the variable internal coordinate gradients
|
---|
408 | are calculated. */
|
---|
409 | virtual int to_internal(RefSCVector&internal,RefSCVector&cartesian) = 0;
|
---|
410 |
|
---|
411 | /** Convert the internal coordinate Hessian ``internal'' to Cartesian
|
---|
412 | coordinates and copy the result to ``cartesian''. Only the variable
|
---|
413 | internal coordinate force constants are transformed. */
|
---|
414 | virtual int to_cartesian(RefSymmSCMatrix&cartesian,
|
---|
415 | RefSymmSCMatrix&internal) =0;
|
---|
416 |
|
---|
417 | /** Convert the Cartesian coordinate Hessian ``cartesian'' to internal
|
---|
418 | coordinates and copy the result to ``internal''. Only the variable
|
---|
419 | internal coordinate force constants are calculated. */
|
---|
420 | virtual int to_internal(RefSymmSCMatrix&internal,
|
---|
421 | RefSymmSCMatrix&cartesian) = 0;
|
---|
422 |
|
---|
423 | /** Calculate an approximate hessian and place the result in
|
---|
424 | ``hessian''. */
|
---|
425 | virtual void guess_hessian(RefSymmSCMatrix&hessian) = 0;
|
---|
426 |
|
---|
427 | /** Given an Hessian, return the inverse of that hessian. For singular
|
---|
428 | matrices this should return the generalized inverse. */
|
---|
429 | virtual RefSymmSCMatrix inverse_hessian(RefSymmSCMatrix&) = 0;
|
---|
430 |
|
---|
431 | /// Returns the number of constrained coordinates.
|
---|
432 | virtual int nconstrained();
|
---|
433 |
|
---|
434 | /** When this is called, MoleculeCoor may select a new internal
|
---|
435 | coordinate system and return a transform to it. The default action
|
---|
436 | is to not change anything and return an IdentityTransform. */
|
---|
437 | virtual Ref<NonlinearTransform> change_coordinates();
|
---|
438 |
|
---|
439 | Ref<SCMatrixKit> matrixkit() const { return matrixkit_; }
|
---|
440 | };
|
---|
441 |
|
---|
442 |
|
---|
443 | /** The IntMolecularCoor abstract class describes a molecule's coordinates
|
---|
444 | in terms of internal coordinates. */
|
---|
445 | class IntMolecularCoor: public MolecularCoor
|
---|
446 | {
|
---|
447 | protected:
|
---|
448 | Ref<IntCoorGen> generator_;
|
---|
449 |
|
---|
450 | void form_K_matrix(RefSCDimension& dredundant,
|
---|
451 | RefSCDimension& dfixed,
|
---|
452 | RefSCMatrix& K,
|
---|
453 | int*& is_totally_symmetric);
|
---|
454 |
|
---|
455 | RefSCDimension dim_; // corresponds to the number of variable coordinates
|
---|
456 | RefSCDimension dvc_; // the number of variable + constant coordinates
|
---|
457 |
|
---|
458 | Ref<SetIntCoor> variable_; // the variable internal coordinates
|
---|
459 | Ref<SetIntCoor> constant_; // the constant internal coordinates
|
---|
460 |
|
---|
461 | Ref<SetIntCoor> fixed_;
|
---|
462 | Ref<SetIntCoor> watched_;
|
---|
463 | Ref<IntCoor> followed_;
|
---|
464 |
|
---|
465 | // these are all of the basic coordinates
|
---|
466 | Ref<SetIntCoor> bonds_;
|
---|
467 | Ref<SetIntCoor> bends_;
|
---|
468 | Ref<SetIntCoor> tors_;
|
---|
469 | Ref<SetIntCoor> outs_;
|
---|
470 | // these are provided by the user or generated coordinates that
|
---|
471 | // could not be assigned to any of the above catagories
|
---|
472 | Ref<SetIntCoor> extras_;
|
---|
473 |
|
---|
474 | Ref<SetIntCoor> all_;
|
---|
475 |
|
---|
476 | // Useful relationships
|
---|
477 | // variable_->n() + constant_->n() = 3N-6(5)
|
---|
478 | // symm_->n() + asymm_->n() = 3N-6(5)
|
---|
479 |
|
---|
480 | int update_bmat_; // if 1 recompute the b matrix during to_cartesian
|
---|
481 | int only_totally_symmetric_; // only coors with tot. symm comp. are varied
|
---|
482 | double symmetry_tolerance_; // tol used to find coors with tot. sym. comp.
|
---|
483 | double simple_tolerance_; // tol used to see if a simple is included
|
---|
484 | double coordinate_tolerance_; // tol used to see if a coor is included
|
---|
485 | double cartesian_tolerance_; // tol used in intco->cart transformation
|
---|
486 | double scale_bonds_; // scale factor for bonds
|
---|
487 | double scale_bends_; // scale factor for bends
|
---|
488 | double scale_tors_; // scale factor for tors
|
---|
489 | double scale_outs_; // scale factor for outs
|
---|
490 |
|
---|
491 | int nextra_bonds_;
|
---|
492 | int* extra_bonds_;
|
---|
493 |
|
---|
494 | int given_fixed_values_; // if true make molecule have given fixed values
|
---|
495 |
|
---|
496 | int decouple_bonds_;
|
---|
497 | int decouple_bends_;
|
---|
498 |
|
---|
499 | int max_update_steps_;
|
---|
500 | double max_update_disp_;
|
---|
501 |
|
---|
502 | /** This is called by the constructors of classes derived from
|
---|
503 | IntMolecularCoor. It initialized the lists of simple internal
|
---|
504 | coordinates, and then calls the form_coordinates() member. */
|
---|
505 | virtual void init();
|
---|
506 | /** Allocates memory for the SetIntCoor's used to store the
|
---|
507 | simple and internal coordinates. */
|
---|
508 | virtual void new_coords();
|
---|
509 | /// Reads the KeyVal input.
|
---|
510 | virtual void read_keyval(const Ref<KeyVal>&);
|
---|
511 |
|
---|
512 | // control whether or not to print coordinates when they are formed
|
---|
513 | int form_print_simples_;
|
---|
514 | int form_print_variable_;
|
---|
515 | int form_print_constant_;
|
---|
516 | int form_print_molecule_;
|
---|
517 | public:
|
---|
518 | IntMolecularCoor(StateIn&);
|
---|
519 | IntMolecularCoor(Ref<Molecule>&mol);
|
---|
520 | /** The KeyVal constructor.
|
---|
521 | <dl>
|
---|
522 |
|
---|
523 | <dt><tt>variable</tt><dd> Gives a SetIntCoor object that specifies
|
---|
524 | the internal coordinates that can be varied. If this is not given,
|
---|
525 | the variable coordinates will be generated.
|
---|
526 |
|
---|
527 | <dt><tt>followed</tt><dd> Gives a IntCoor object that specifies a
|
---|
528 | coordinate to used as the first coordinate in the variable
|
---|
529 | coordinate list. The remaining coordinates will be automatically
|
---|
530 | generated. The default is no followed coordinate. This option is
|
---|
531 | usually used to set the initial search direction for a transition
|
---|
532 | state optimization, where it is used in conjunction with the
|
---|
533 | mode_following keyword read by the EFCOpt class.
|
---|
534 |
|
---|
535 | <dt><tt>fixed</tt><dd> Gives a SetIntCoor object that specifies the
|
---|
536 | internal coordinates that will be fixed. The default is no fixed
|
---|
537 | coordinates.
|
---|
538 |
|
---|
539 | <dt><tt>watched</tt><dd> Gives a SetIntCoor object that specifies
|
---|
540 | internal coordinates that will be printed out whenever the
|
---|
541 | coordinates are changed. The default is none.
|
---|
542 |
|
---|
543 | <dt><tt>have_fixed_values</tt><dd> If true, then values for the
|
---|
544 | fixed coordinates must be given in fixed and an attempt will be
|
---|
545 | made to displace the initial geometry to the given fixed
|
---|
546 | values. The default is false.
|
---|
547 |
|
---|
548 | <dt><tt>extra_bonds</tt><dd> This is only read if the generator
|
---|
549 | keyword is not given. It is a vector of atom numbers, where
|
---|
550 | elements \f$(i-1)\times 2 + 1\f$ and \f$i\times 2\f$ specify the
|
---|
551 | atoms which are bound in extra bond \f$i\f$. The extra_bonds
|
---|
552 | keyword should only be needed for weakly interacting fragments,
|
---|
553 | otherwise all the needed bonds will be found.
|
---|
554 |
|
---|
555 | <dt><tt>generator</tt><dd> Specifies an IntCoorGen object that
|
---|
556 | creates simple, redundant internal coordinates. If this keyword is
|
---|
557 | not given, then a vector giving extra bonds to be added is read
|
---|
558 | from extra_bonds and this is used to create an IntCoorGen object.
|
---|
559 |
|
---|
560 | <dt><tt>decouple_bonds</tt><dd> Automatically generated internal
|
---|
561 | coordinates are linear combinations of possibly any mix of simple
|
---|
562 | internal coordinates. If decouple_bonds is true, an attempt will
|
---|
563 | be made to form some of the internal coordinates from just stretch
|
---|
564 | simple coordinates. The default is false.
|
---|
565 |
|
---|
566 | <dt><tt>decouple_bends</tt><dd> This is like decouple_bonds except
|
---|
567 | it applies to the bend-like coordinates. The default is false.
|
---|
568 |
|
---|
569 | <dt><tt>max_update_disp</tt><dd> The maximum displacement to be
|
---|
570 | used in the displacement to fixed internal coordinates values.
|
---|
571 | Larger displacements will be broken into several smaller
|
---|
572 | displacements and new coordinates will be formed for each of these
|
---|
573 | displacments. This is only used when fixed and have_fixed_values
|
---|
574 | are given. The default is 0.5.
|
---|
575 |
|
---|
576 | <dt><tt>max_update_steps</tt><dd> The maximum number of steps
|
---|
577 | permitted to convert internal coordinate displacements to cartesian
|
---|
578 | coordinate displacements. The default is 100.
|
---|
579 |
|
---|
580 | <dt><tt>update_bmat</tt><dd> Displacements in internal coordinates
|
---|
581 | are converted to a cartesian displacements iteratively. If there
|
---|
582 | are large changes in the cartesian coordinates during conversion,
|
---|
583 | then recompute the \f$B\f$ matrix, which is using to do the
|
---|
584 | conversion. The default is false.
|
---|
585 |
|
---|
586 | <dt><tt>only_totally_symmetric</tt><dd> If a simple test reveals
|
---|
587 | that an internal coordinate is not totally symmetric, then it will
|
---|
588 | not be added to the internal coordinate list. The default is true.
|
---|
589 |
|
---|
590 | <dt><tt>simple_tolerance</tt><dd> The internal coordinates are
|
---|
591 | formed as linear combinations of simple, redundant internal
|
---|
592 | coordinates. Coordinates with coefficients smaller then
|
---|
593 | simple_tolerance will be omitted. The default is 1.0e-3.
|
---|
594 |
|
---|
595 | <dt><tt>cartesian_tolerance</tt><dd> The tolerance for conversion
|
---|
596 | of internal coordinate displacements to cartesian displacements.
|
---|
597 | The default is 1.0e-12.
|
---|
598 |
|
---|
599 | <dt><tt>form:print_simple</tt><dd> Print the simple internal
|
---|
600 | coordinates. The default is false.
|
---|
601 |
|
---|
602 | <dt><tt>form:print_variable</tt><dd> Print the variable internal
|
---|
603 | coordinates. The default is false.
|
---|
604 |
|
---|
605 | <dt><tt>form:print_constant</tt><dd> Print the constant internal
|
---|
606 | coordinates. The default is false.
|
---|
607 |
|
---|
608 | <dt><tt>form:print_molecule</tt><dd> Print the molecule when
|
---|
609 | forming coordinates. The default is false.
|
---|
610 |
|
---|
611 | <dt><tt>scale_bonds</tt><dd> Obsolete. The default value is 1.0.
|
---|
612 |
|
---|
613 | <dt><tt>scale_bends</tt><dd> Obsolete. The default value is 1.0.
|
---|
614 |
|
---|
615 | <dt><tt>scale_tors</tt><dd> Obsolete. The default value is 1.0.
|
---|
616 |
|
---|
617 | <dt><tt>scale_outs</tt><dd> Obsolete. The default value is 1.0.
|
---|
618 |
|
---|
619 | <dt><tt>symmetry_tolerance</tt><dd> Obsolete. The default is 1.0e-5.
|
---|
620 |
|
---|
621 | <dt><tt>coordinate_tolerance</tt><dd> Obsolete. The default is 1.0e-7.
|
---|
622 |
|
---|
623 | </dl> */
|
---|
624 | IntMolecularCoor(const Ref<KeyVal>&);
|
---|
625 |
|
---|
626 | virtual ~IntMolecularCoor();
|
---|
627 | void save_data_state(StateOut&);
|
---|
628 |
|
---|
629 | /** Actually form the variable and constant internal coordinates from
|
---|
630 | the simple internal coordinates. */
|
---|
631 | virtual void form_coordinates(int keep_variable=0) =0;
|
---|
632 |
|
---|
633 | /** Like to_cartesians(), except all internal coordinates are
|
---|
634 | considered, not just the variable ones. */
|
---|
635 | virtual int all_to_cartesian(const Ref<Molecule> &,RefSCVector&internal);
|
---|
636 | /** Like to_internal(), except all internal coordinates are
|
---|
637 | considered, not just the variable ones. */
|
---|
638 | virtual int all_to_internal(const Ref<Molecule> &,RefSCVector&internal);
|
---|
639 |
|
---|
640 | /** These implement the virtual functions inherited from
|
---|
641 | MolecularCoor. */
|
---|
642 | virtual RefSCDimension dim();
|
---|
643 | virtual int to_cartesian(const Ref<Molecule> &,const RefSCVector&internal);
|
---|
644 | virtual int to_internal(RefSCVector&internal);
|
---|
645 | virtual int to_cartesian(RefSCVector&cartesian,RefSCVector&internal);
|
---|
646 | virtual int to_internal(RefSCVector&internal,RefSCVector&cartesian);
|
---|
647 | virtual int to_cartesian(RefSymmSCMatrix&cart,RefSymmSCMatrix&internal);
|
---|
648 | virtual int to_internal(RefSymmSCMatrix&internal,RefSymmSCMatrix&cart);
|
---|
649 | virtual void print(std::ostream& =ExEnv::out0()) const;
|
---|
650 | virtual void print_simples(std::ostream& =ExEnv::out0()) const;
|
---|
651 | virtual void print_variable(std::ostream& =ExEnv::out0()) const;
|
---|
652 | virtual void print_constant(std::ostream& =ExEnv::out0()) const;
|
---|
653 | int nconstrained();
|
---|
654 | };
|
---|
655 |
|
---|
656 | // ///////////////////////////////////////////////////////////////////////
|
---|
657 |
|
---|
658 | /** The SymmMolecularCoor class derives from IntMolecularCoor. It provides
|
---|
659 | a unique set of totally symmetric internal coordinates. Giving an
|
---|
660 | MolecularEnergy object a coor is usually the best way to optimize a
|
---|
661 | molecular structure. However, for some classes of molecules
|
---|
662 | SymmMolecularCoor doesn't work very well. For example, enediyne can cause
|
---|
663 | problems. In these cases, cartesian coordinates (obtained by not giving
|
---|
664 | the MolecularEnergy object the coor keyword) might be better or you can
|
---|
665 | manually specify the coordinates that the SymmMolecularCoor object uses
|
---|
666 | with the variable keyword (see the IntMolecularCoor class description). */
|
---|
667 | class SymmMolecularCoor: public IntMolecularCoor
|
---|
668 | {
|
---|
669 | protected:
|
---|
670 | // true if coordinates should be changed during optimization
|
---|
671 | int change_coordinates_;
|
---|
672 | // true if hessian should be transformed too (should always be true)
|
---|
673 | int transform_hessian_;
|
---|
674 | // max value for the condition number if coordinates can be changed
|
---|
675 | double max_kappa2_;
|
---|
676 |
|
---|
677 | void init();
|
---|
678 | public:
|
---|
679 | SymmMolecularCoor(Ref<Molecule>&mol);
|
---|
680 | SymmMolecularCoor(StateIn&);
|
---|
681 | /** The KeyVal constructor.
|
---|
682 | <dl>
|
---|
683 |
|
---|
684 | <dt><tt>change_coordinates</tt><dd> If true, the quality of the
|
---|
685 | internal coordinates will be checked periodically and if they are
|
---|
686 | beginning to become linearly dependent a new set of internal
|
---|
687 | coordinates will be computed. The default is false.
|
---|
688 |
|
---|
689 | <dt><tt>max_kappa2</tt><dd> A measure of the quality of the
|
---|
690 | internal coordinates. Values of the 2-norm condition,
|
---|
691 | \f$\kappa_2\f$, larger than max_kappa2 are considered linearly
|
---|
692 | dependent. The default is 10.0.
|
---|
693 |
|
---|
694 | <dt><tt>transform_hessian</tt><dd> If true, the hessian will be
|
---|
695 | transformed every time the internal coordinates are formed. The
|
---|
696 | default is true.
|
---|
697 |
|
---|
698 | </dl> */
|
---|
699 | SymmMolecularCoor(const Ref<KeyVal>&);
|
---|
700 |
|
---|
701 | virtual ~SymmMolecularCoor();
|
---|
702 | void save_data_state(StateOut&);
|
---|
703 |
|
---|
704 | /** Actually form the variable and constant internal coordinates from
|
---|
705 | simple internal coordinates. */
|
---|
706 | void form_coordinates(int keep_variable=0);
|
---|
707 |
|
---|
708 | /// Form the approximate hessian.
|
---|
709 | void guess_hessian(RefSymmSCMatrix&hessian);
|
---|
710 | /// Invert the hessian.
|
---|
711 | RefSymmSCMatrix inverse_hessian(RefSymmSCMatrix&);
|
---|
712 |
|
---|
713 | /** This overrides MoleculeCoor's change_coordinates
|
---|
714 | and might transform to a new set of coordinates. */
|
---|
715 | Ref<NonlinearTransform> change_coordinates();
|
---|
716 |
|
---|
717 | void print(std::ostream& =ExEnv::out0()) const;
|
---|
718 | };
|
---|
719 |
|
---|
720 | // ///////////////////////////////////////////////////////////////////////
|
---|
721 |
|
---|
722 | /** The RedundMolecularCoor class provides a redundant set of simple
|
---|
723 | internal coordinates. */
|
---|
724 | class RedundMolecularCoor: public IntMolecularCoor
|
---|
725 | {
|
---|
726 |
|
---|
727 | public:
|
---|
728 | RedundMolecularCoor(Ref<Molecule>&mol);
|
---|
729 | RedundMolecularCoor(StateIn&);
|
---|
730 | /// The KeyVal constructor.
|
---|
731 | RedundMolecularCoor(const Ref<KeyVal>&);
|
---|
732 |
|
---|
733 | virtual ~RedundMolecularCoor();
|
---|
734 | void save_data_state(StateOut&);
|
---|
735 |
|
---|
736 | /** Actually form the variable and constant internal coordinates from
|
---|
737 | the simple internal coordinates. */
|
---|
738 | void form_coordinates(int keep_variable=0);
|
---|
739 | /// Form the approximate hessian.
|
---|
740 | void guess_hessian(RefSymmSCMatrix&hessian);
|
---|
741 | /// Invert the hessian.
|
---|
742 | RefSymmSCMatrix inverse_hessian(RefSymmSCMatrix&);
|
---|
743 | };
|
---|
744 |
|
---|
745 | // ///////////////////////////////////////////////////////////////////////
|
---|
746 |
|
---|
747 | /** The CartMolecularCoor class implements Cartesian coordinates in a way
|
---|
748 | suitable for use in geometry optimizations. CartMolecularCoor is a
|
---|
749 | SavableState has StateIn and KeyVal constructors. CartMolecularCoor is
|
---|
750 | derived from MolecularCoor. */
|
---|
751 | class CartMolecularCoor: public MolecularCoor
|
---|
752 | {
|
---|
753 | private:
|
---|
754 | protected:
|
---|
755 | RefSCDimension dim_; // the number of atoms x 3
|
---|
756 |
|
---|
757 | /// Initializes the dimensions.
|
---|
758 | virtual void init();
|
---|
759 | public:
|
---|
760 | CartMolecularCoor(Ref<Molecule>&mol);
|
---|
761 | CartMolecularCoor(StateIn&);
|
---|
762 | /// The KeyVal constructor.
|
---|
763 | CartMolecularCoor(const Ref<KeyVal>&);
|
---|
764 |
|
---|
765 | virtual ~CartMolecularCoor();
|
---|
766 |
|
---|
767 | void save_data_state(StateOut&);
|
---|
768 |
|
---|
769 | /// These implement the virtual functions inherited from MolecularCoor.
|
---|
770 | virtual RefSCDimension dim();
|
---|
771 | virtual int to_cartesian(const Ref<Molecule>&,const RefSCVector&internal);
|
---|
772 | virtual int to_internal(RefSCVector&internal);
|
---|
773 | virtual int to_cartesian(RefSCVector&cartesian,RefSCVector&internal);
|
---|
774 | virtual int to_internal(RefSCVector&internal,RefSCVector&cartesian);
|
---|
775 | virtual int to_cartesian(RefSymmSCMatrix&cart,RefSymmSCMatrix&internal);
|
---|
776 | virtual int to_internal(RefSymmSCMatrix&internal,RefSymmSCMatrix&cart);
|
---|
777 | virtual void print(std::ostream& =ExEnv::out0()) const;
|
---|
778 | virtual void print_simples(std::ostream& =ExEnv::out0()) const;
|
---|
779 | void guess_hessian(RefSymmSCMatrix&hessian);
|
---|
780 | RefSymmSCMatrix inverse_hessian(RefSymmSCMatrix&);
|
---|
781 | };
|
---|
782 |
|
---|
783 | }
|
---|
784 |
|
---|
785 | #endif
|
---|
786 |
|
---|
787 | // Local Variables:
|
---|
788 | // mode: c++
|
---|
789 | // c-file-style: "CLJ"
|
---|
790 | // End:
|
---|