|
energy.h00001 // 00002 // energy.h 00003 // 00004 // Copyright (C) 1996 Limit Point Systems, Inc. 00005 // 00006 // Author: Curtis Janssen <cljanss@limitpt.com> 00007 // Maintainer: LPS 00008 // 00009 // This file is part of the SC Toolkit. 00010 // 00011 // The SC Toolkit is free software; you can redistribute it and/or modify 00012 // it under the terms of the GNU Library General Public License as published by 00013 // the Free Software Foundation; either version 2, or (at your option) 00014 // any later version. 00015 // 00016 // The SC Toolkit is distributed in the hope that it will be useful, 00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 // GNU Library General Public License for more details. 00020 // 00021 // You should have received a copy of the GNU Library General Public License 00022 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to 00023 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 00024 // 00025 // The U.S. Government is granted a limited license as per AL 91-7. 00026 // 00027 00028 #ifndef _chemistry_molecule_energy_h 00029 #define _chemistry_molecule_energy_h 00030 00031 #ifdef __GNUC__ 00032 #pragma interface 00033 #endif 00034 00035 #include <iostream> 00036 00037 #include <math/optimize/function.h> 00038 #include <math/optimize/conv.h> 00039 #include <chemistry/molecule/molecule.h> 00040 #include <chemistry/molecule/coor.h> 00041 #include <chemistry/molecule/hess.h> 00042 00043 namespace sc { 00044 00048 class MolecularEnergy: public Function { 00049 private: 00050 RefSCDimension moldim_; // the number of cartesian variables 00051 Ref<MolecularCoor> mc_; 00052 Ref<Molecule> mol_; 00053 Ref<MolecularHessian> hess_; 00054 Ref<MolecularHessian> guesshess_; 00055 00056 RefSCVector cartesian_gradient_; 00057 RefSymmSCMatrix cartesian_hessian_; 00058 protected: 00059 Ref<PointGroup> initial_pg_; 00060 00061 void failure(const char *); 00062 00064 virtual void set_energy(double); 00065 00068 virtual void set_gradient(RefSCVector&); 00069 virtual void set_hessian(RefSymmSCMatrix&); 00070 00071 void x_to_molecule(); 00072 void molecule_to_x(); 00073 00074 int print_molecule_when_changed_; 00075 public: 00076 MolecularEnergy(const MolecularEnergy&); 00101 MolecularEnergy(const Ref<KeyVal>&); 00102 MolecularEnergy(StateIn&); 00103 ~MolecularEnergy(); 00104 00105 void save_data_state(StateOut&); 00106 00107 MolecularEnergy & operator=(const MolecularEnergy&); 00108 00110 virtual double energy(); 00111 00112 virtual Ref<Molecule> molecule() const; 00113 virtual RefSCDimension moldim() const; 00114 00115 void guess_hessian(RefSymmSCMatrix&); 00116 RefSymmSCMatrix inverse_hessian(RefSymmSCMatrix&); 00117 00120 RefSymmSCMatrix hessian(); 00121 int hessian_implemented() const; 00122 00123 void set_x(const RefSCVector&); 00124 00126 RefSCVector get_cartesian_x(); 00128 RefSCVector get_cartesian_gradient(); 00130 RefSymmSCMatrix get_cartesian_hessian(); 00131 00132 Ref<MolecularCoor> molecularcoor() { return mc_; } 00133 00136 virtual void symmetry_changed(); 00137 00138 Ref<NonlinearTransform> change_coordinates(); 00139 00141 void print_natom_3(const RefSCVector &, 00142 const char *t=0, std::ostream&o=ExEnv::out0()) const; 00143 void print_natom_3(double **, const char *t=0, std::ostream&o=ExEnv::out0()) const; 00144 void print_natom_3(double *, const char *t=0, std::ostream&o=ExEnv::out0()) const; 00145 00146 virtual void print(std::ostream& = ExEnv::out0()) const; 00147 }; 00148 00149 00150 class SumMolecularEnergy: public MolecularEnergy { 00151 protected: 00152 int n_; 00153 Ref<MolecularEnergy> *mole_; 00154 double *coef_; 00155 void compute(); 00156 public: 00157 SumMolecularEnergy(const Ref<KeyVal> &); 00158 SumMolecularEnergy(StateIn&); 00159 ~SumMolecularEnergy(); 00160 00161 void save_data_state(StateOut&); 00162 00163 int value_implemented() const; 00164 int gradient_implemented() const; 00165 int hessian_implemented() const; 00166 00167 void set_x(const RefSCVector&); 00168 }; 00169 00170 00171 /* The MolEnergyConvergence class derives from the Convergence class. The 00172 MolEnergyConvergence class allows the user to request that cartesian 00173 coordinates be used in evaluating the convergence criteria. This is 00174 useful, since the internal coordinates can be somewhat arbitary. If the 00175 optimization is constrained, then the fixed internal coordinates will be 00176 projected out of the cartesian gradients. The input is similar to that for 00177 Convergence class with the exception that giving none of the convergence 00178 criteria keywords is the same as providing the following input to the 00179 KeyVal constructor: 00180 00181 <pre> 00182 conv<MolEnergyConvergence>: ( 00183 max_disp = 1.0e-4 00184 max_grad = 1.0e-4 00185 graddisp = 1.0e-4 00186 ) 00187 </pre> 00188 00189 For MolEnergyConverence to work, the Function object given to the Optimizer 00190 object must derive from MolecularEnergy. 00191 */ 00192 class MolEnergyConvergence: public Convergence { 00193 protected: 00194 Ref<MolecularEnergy> mole_; 00195 int cartesian_; 00196 00197 void set_defaults(); 00198 public: 00199 // Standard constructors and destructor. 00200 MolEnergyConvergence(); 00201 MolEnergyConvergence(StateIn&); 00219 MolEnergyConvergence(const Ref<KeyVal>&); 00220 virtual ~MolEnergyConvergence(); 00221 00222 void save_data_state(StateOut&); 00223 00224 // Set the current gradient and position information. These 00225 //will possibly grab the cartesian infomation if we have a 00226 //MolecularEnergy. 00227 void get_grad(const Ref<Function> &); 00228 void get_x(const Ref<Function> &); 00229 void set_nextx(const RefSCVector &); 00230 00231 // Return nonzero if the optimization has converged. 00232 int converged(); 00233 }; 00234 00235 } 00236 00237 #endif 00238 00239 // Local Variables: 00240 // mode: c++ 00241 // c-file-style: "CLJ" 00242 // End: Generated at Fri Jan 10 08:14:08 2003 for MPQC 2.1.3 using the documentation package Doxygen 1.2.14. |