source: ThirdParty/mpqc_open/src/lib/chemistry/molecule/coor.h

Candidate_v1.6.1
Last change on this file was 860145, checked in by Frederik Heber <heber@…>, 8 years ago

Merge commit '0b990dfaa8c6007a996d030163a25f7f5fc8a7e7' as 'ThirdParty/mpqc_open'

  • Property mode set to 100644
File size: 30.3 KB
Line 
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
42namespace sc {
43
44/** The IntCoor abstract class describes an internal coordinate of a
45molecule. */
46class 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
107coordinates.
108
109The 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*/
120class 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.
170It can automatically generate these coordinates using a integral coordinate
171generator object (see the IntCoorGen class) or the internal
172coordinates can be explicity given.
173
174The following is a sample ParsedKeyVal input for
175a 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*/
189class 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
241class BitArrayLTri;
242
243/** IntCoorGen generates a set of simple internal coordinates
244 for a molecule. */
245class 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
336to describe a molecule. It is used to convert a molecule's cartesian
337coordinates to and from this coordinate system. */
338class 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
444in terms of internal coordinates. */
445class 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
659a unique set of totally symmetric internal coordinates. Giving an
660MolecularEnergy object a coor is usually the best way to optimize a
661molecular structure. However, for some classes of molecules
662SymmMolecularCoor doesn't work very well. For example, enediyne can cause
663problems. In these cases, cartesian coordinates (obtained by not giving
664the MolecularEnergy object the coor keyword) might be better or you can
665manually specify the coordinates that the SymmMolecularCoor object uses
666with the variable keyword (see the IntMolecularCoor class description). */
667class 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
723internal coordinates. */
724class 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. */
751class 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:
Note: See TracBrowser for help on using the repository browser.