| 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: | 
|---|