Google

Main Page   Class Hierarchy   Compound List   File List   Compound Members   Related Pages  

coor.h

00001 //
00002 // coor.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_coor_h
00029 #define _chemistry_molecule_coor_h
00030 
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034 
00035 #include <iostream>
00036 #include <vector>
00037 
00038 #include <math/scmat/matrix.h>
00039 #include <math/optimize/transform.h>
00040 #include <chemistry/molecule/molecule.h>
00041 
00042 namespace sc {
00043 
00046 class IntCoor: public SavableState {
00047   protected:
00048     // conversion factors from radians, bohr to the preferred units
00049     static double bohr_conv;
00050     static double radian_conv;
00051     char *label_;
00052     double value_;
00053   public:
00054     IntCoor(StateIn&);
00055     IntCoor(const IntCoor&);
00058     IntCoor(const char* label = 0);
00075     IntCoor(const Ref<KeyVal>&);
00076     
00077     virtual ~IntCoor();
00078     void save_data_state(StateOut&);
00079 
00081     virtual const char* label() const;
00083     virtual double value() const;
00085     virtual void set_value(double);
00087     virtual double preferred_value() const;
00089     virtual const char* ctype() const = 0;
00091     virtual void print(std::ostream & o=ExEnv::out0()) const;
00092     virtual void print_details(const Ref<Molecule> &, std::ostream& =ExEnv::out0()) const;
00095     virtual double force_constant(Ref<Molecule>&) = 0;
00097     virtual void update_value(const Ref<Molecule>&) = 0;
00099     virtual void bmat(const Ref<Molecule>&,RefSCVector&bmat,double coef=1.0) = 0;
00103     virtual int equivalent(Ref<IntCoor>&) = 0;
00104 };
00105 
00120 class SumIntCoor: public IntCoor {
00121   private:
00122     std::vector<double> coef_;
00123     std::vector<Ref<IntCoor> > coor_;
00124   public:
00125     SumIntCoor(StateIn&);
00128     SumIntCoor(const char *);
00139     SumIntCoor(const Ref<KeyVal>&);
00140 
00141     ~SumIntCoor();
00142     void save_data_state(StateOut&);
00143 
00145     int n();
00148     void add(Ref<IntCoor>&,double coef);
00150     void normalize();
00151 
00152     // IntCoor overrides
00154     double preferred_value() const;
00156     const char* ctype() const;
00158     void print_details(const Ref<Molecule> &, std::ostream& =ExEnv::out0()) const;
00160     double force_constant(Ref<Molecule>&);
00162     void update_value(const Ref<Molecule>&);
00164     void bmat(const Ref<Molecule>&,RefSCVector&bmat,double coef = 1.0);
00166     int equivalent(Ref<IntCoor>&);
00167 };
00168 
00189 class SetIntCoor: public SavableState {
00190   private:
00191     std::vector<Ref<IntCoor> > coor_;
00192   public:
00193     SetIntCoor();
00194     SetIntCoor(StateIn&);
00205     SetIntCoor(const Ref<KeyVal>&);
00206 
00207     virtual ~SetIntCoor();
00208     void save_data_state(StateOut&);
00209 
00211     void add(const Ref<IntCoor>&);
00213     void add(const Ref<SetIntCoor>&);
00215     void pop();
00217     void clear();
00219     int n() const;
00221     Ref<IntCoor> coor(int i) const;
00223     virtual void fd_bmat(const Ref<Molecule>&,RefSCMatrix&);
00225     virtual void bmat(const Ref<Molecule>&, RefSCMatrix&);
00229     virtual void guess_hessian(Ref<Molecule>&,RefSymmSCMatrix&);
00231     virtual void print_details(const Ref<Molecule> &,std::ostream& =ExEnv::out0()) const;
00233     virtual void update_values(const Ref<Molecule>&);
00235     virtual void values_to_vector(const RefSCVector&);
00236 };
00237 
00238 
00239 // ////////////////////////////////////////////////////////////////////////
00240 
00241 class BitArrayLTri;
00242 
00245 class IntCoorGen: public SavableState
00246 {
00247   protected:
00248     Ref<Molecule> molecule_;
00249     
00250     int linear_bends_;
00251     int linear_lbends_;
00252     int linear_tors_;
00253     int linear_stors_;
00254     int nextra_bonds_;
00255     int *extra_bonds_;
00256     double linear_bend_thres_;
00257     double linear_tors_thres_;
00258     double radius_scale_factor_;
00259 
00260     void init_constants();
00261 
00262     double cos_ijk(Molecule& m, int i, int j, int k);
00263     int hterminal(Molecule& m, BitArrayLTri& bonds, int i);
00264     int nearest_contact(int i, Molecule& m);
00265 
00266     void add_bonds(const Ref<SetIntCoor>& list, BitArrayLTri& bonds, Molecule& m);
00267     void add_bends(const Ref<SetIntCoor>& list, BitArrayLTri& bonds, Molecule& m);
00268     void add_tors(const Ref<SetIntCoor>& list, BitArrayLTri& bonds, Molecule& m);
00269     void add_out(const Ref<SetIntCoor>& list, BitArrayLTri& bonds, Molecule& m);
00270   public:
00274     IntCoorGen(const Ref<Molecule>&, int nextra=0, int *extra=0);
00316     IntCoorGen(const Ref<KeyVal>&);
00317     IntCoorGen(StateIn&);
00318 
00319     ~IntCoorGen();
00320 
00322     void save_data_state(StateOut&);
00323 
00325     virtual void generate(const Ref<SetIntCoor>&);
00326 
00328     virtual void print(std::ostream& out=ExEnv::out0()) const;
00329 };
00330 
00331 
00332 // ////////////////////////////////////////////////////////////////////////
00333 
00334 
00338 class MolecularCoor: public SavableState
00339 {
00340   protected:
00341     Ref<Molecule> molecule_;
00342     RefSCDimension dnatom3_; // the number of atoms x 3
00343     Ref<SCMatrixKit> matrixkit_; // used to construct matrices
00344 
00345     int debug_;
00346   public:
00347     MolecularCoor(Ref<Molecule>&);
00348     MolecularCoor(StateIn&);
00365     MolecularCoor(const Ref<KeyVal>&);
00366 
00367     virtual ~MolecularCoor();
00368 
00369     void save_data_state(StateOut&);
00370 
00373     RefSCDimension dim_natom3() { return dnatom3_; }
00374 
00376     Ref<Molecule> molecule() const { return molecule_; }
00377 
00379     virtual void print(std::ostream& =ExEnv::out0()) const = 0;
00380     virtual void print_simples(std::ostream& =ExEnv::out0()) const = 0;
00381 
00385     virtual RefSCDimension dim() = 0;
00386     
00390     int to_cartesian(const RefSCVector&internal);
00391     virtual int to_cartesian(const Ref<Molecule>&mol,
00392                              const RefSCVector&internal) = 0;
00393 
00397     virtual int to_internal(RefSCVector&internal) = 0;
00398 
00403     virtual int to_cartesian(RefSCVector&cartesian,RefSCVector&internal) = 0;
00404 
00409     virtual int to_internal(RefSCVector&internal,RefSCVector&cartesian) = 0;
00410 
00414     virtual int to_cartesian(RefSymmSCMatrix&cartesian,
00415                               RefSymmSCMatrix&internal) =0;
00416 
00420     virtual int to_internal(RefSymmSCMatrix&internal,
00421                              RefSymmSCMatrix&cartesian) = 0;
00422 
00425     virtual void guess_hessian(RefSymmSCMatrix&hessian) = 0;
00426 
00429     virtual RefSymmSCMatrix inverse_hessian(RefSymmSCMatrix&) = 0;
00430 
00432     virtual int nconstrained();
00433 
00437     virtual Ref<NonlinearTransform> change_coordinates();
00438 
00439     Ref<SCMatrixKit> matrixkit() const { return matrixkit_; }
00440 };
00441 
00442 
00445 class IntMolecularCoor: public MolecularCoor
00446 {
00447   protected:
00448     Ref<IntCoorGen> generator_;
00449 
00450     void form_K_matrix(RefSCDimension& dredundant,
00451                        RefSCDimension& dfixed,
00452                        RefSCMatrix& K,
00453                        int*& is_totally_symmetric);
00454 
00455     RefSCDimension dim_; // corresponds to the number of variable coordinates
00456     RefSCDimension dvc_; // the number of variable + constant coordinates
00457 
00458     Ref<SetIntCoor> variable_; // the variable internal coordinates
00459     Ref<SetIntCoor> constant_; // the constant internal coordinates
00460     
00461     Ref<SetIntCoor> fixed_;
00462     Ref<SetIntCoor> watched_;
00463     Ref<IntCoor> followed_;
00464 
00465     // these are all of the basic coordinates
00466     Ref<SetIntCoor> bonds_;
00467     Ref<SetIntCoor> bends_;
00468     Ref<SetIntCoor> tors_;
00469     Ref<SetIntCoor> outs_;
00470     // these are provided by the user or generated coordinates that
00471     // could not be assigned to any of the above catagories
00472     Ref<SetIntCoor> extras_;
00473 
00474     Ref<SetIntCoor> all_;
00475 
00476     // Useful relationships
00477     // variable_->n() + constant_->n() = 3N-6(5)
00478     // symm_->n() + asymm_->n() = 3N-6(5)
00479 
00480     int update_bmat_;  // if 1 recompute the b matrix during to_cartesian
00481     int only_totally_symmetric_; // only coors with tot. symm comp. are varied
00482     double symmetry_tolerance_; // tol used to find coors with tot. sym. comp.
00483     double simple_tolerance_; // tol used to see if a simple is included
00484     double coordinate_tolerance_; // tol used to see if a coor is included
00485     double cartesian_tolerance_;  // tol used in intco->cart transformation
00486     double scale_bonds_; // scale factor for bonds
00487     double scale_bends_; // scale factor for bends
00488     double scale_tors_;  // scale factor for tors
00489     double scale_outs_;  // scale factor for outs
00490 
00491     int nextra_bonds_;
00492     int* extra_bonds_;
00493 
00494     int given_fixed_values_; // if true make molecule have given fixed values
00495 
00496     int decouple_bonds_;
00497     int decouple_bends_;
00498 
00499     int max_update_steps_;
00500     double max_update_disp_;
00501 
00505     virtual void init();
00508     virtual void new_coords();
00510     virtual void read_keyval(const Ref<KeyVal>&);
00511 
00512     // control whether or not to print coordinates when they are formed
00513     int form_print_simples_;
00514     int form_print_variable_;
00515     int form_print_constant_;
00516     int form_print_molecule_;
00517   public:
00518     IntMolecularCoor(StateIn&);
00519     IntMolecularCoor(Ref<Molecule>&mol);
00624     IntMolecularCoor(const Ref<KeyVal>&);
00625 
00626     virtual ~IntMolecularCoor();
00627     void save_data_state(StateOut&);
00628   
00631     virtual void form_coordinates(int keep_variable=0) =0;
00632     
00635     virtual int all_to_cartesian(const Ref<Molecule> &,RefSCVector&internal);
00638     virtual int all_to_internal(const Ref<Molecule> &,RefSCVector&internal);
00639 
00642     virtual RefSCDimension dim();
00643     virtual int to_cartesian(const Ref<Molecule> &,const RefSCVector&internal);
00644     virtual int to_internal(RefSCVector&internal);
00645     virtual int to_cartesian(RefSCVector&cartesian,RefSCVector&internal);
00646     virtual int to_internal(RefSCVector&internal,RefSCVector&cartesian);
00647     virtual int to_cartesian(RefSymmSCMatrix&cart,RefSymmSCMatrix&internal);
00648     virtual int to_internal(RefSymmSCMatrix&internal,RefSymmSCMatrix&cart);
00649     virtual void print(std::ostream& =ExEnv::out0()) const;
00650     virtual void print_simples(std::ostream& =ExEnv::out0()) const;
00651     virtual void print_variable(std::ostream& =ExEnv::out0()) const;
00652     virtual void print_constant(std::ostream& =ExEnv::out0()) const;
00653     int nconstrained();
00654 };
00655 
00656 // ///////////////////////////////////////////////////////////////////////
00657 
00667 class SymmMolecularCoor: public IntMolecularCoor
00668 {
00669   protected:
00670     // true if coordinates should be changed during optimization
00671     int change_coordinates_;
00672     // true if hessian should be transformed too (should always be true)
00673     int transform_hessian_;
00674     // max value for the condition number if coordinates can be changed
00675     double max_kappa2_;
00676 
00677     void init();
00678   public:
00679     SymmMolecularCoor(Ref<Molecule>&mol);
00680     SymmMolecularCoor(StateIn&);
00699     SymmMolecularCoor(const Ref<KeyVal>&);
00700 
00701     virtual ~SymmMolecularCoor();
00702     void save_data_state(StateOut&);
00703 
00706     void form_coordinates(int keep_variable=0);
00707 
00709     void guess_hessian(RefSymmSCMatrix&hessian);
00711     RefSymmSCMatrix inverse_hessian(RefSymmSCMatrix&);
00712 
00715     Ref<NonlinearTransform> change_coordinates();
00716 
00717     void print(std::ostream& =ExEnv::out0()) const;
00718 };
00719 
00720 // ///////////////////////////////////////////////////////////////////////
00721 
00724 class RedundMolecularCoor: public IntMolecularCoor
00725 {
00726 
00727   public:
00728     RedundMolecularCoor(Ref<Molecule>&mol);
00729     RedundMolecularCoor(StateIn&);
00731     RedundMolecularCoor(const Ref<KeyVal>&);
00732 
00733     virtual ~RedundMolecularCoor();
00734     void save_data_state(StateOut&);
00735 
00738     void form_coordinates(int keep_variable=0);
00740     void guess_hessian(RefSymmSCMatrix&hessian);
00742     RefSymmSCMatrix inverse_hessian(RefSymmSCMatrix&);
00743 };
00744 
00745 // ///////////////////////////////////////////////////////////////////////
00746 
00751 class CartMolecularCoor: public MolecularCoor
00752 {
00753   private:
00754   protected:
00755     RefSCDimension dim_; // the number of atoms x 3
00756 
00758     virtual void init();
00759   public:
00760     CartMolecularCoor(Ref<Molecule>&mol);
00761     CartMolecularCoor(StateIn&);
00763     CartMolecularCoor(const Ref<KeyVal>&);
00764 
00765     virtual ~CartMolecularCoor();
00766   
00767     void save_data_state(StateOut&);
00768 
00770     virtual RefSCDimension dim();
00771     virtual int to_cartesian(const Ref<Molecule>&,const RefSCVector&internal);
00772     virtual int to_internal(RefSCVector&internal);
00773     virtual int to_cartesian(RefSCVector&cartesian,RefSCVector&internal);
00774     virtual int to_internal(RefSCVector&internal,RefSCVector&cartesian);
00775     virtual int to_cartesian(RefSymmSCMatrix&cart,RefSymmSCMatrix&internal);
00776     virtual int to_internal(RefSymmSCMatrix&internal,RefSymmSCMatrix&cart);
00777     virtual void print(std::ostream& =ExEnv::out0()) const;
00778     virtual void print_simples(std::ostream& =ExEnv::out0()) const;
00779     void guess_hessian(RefSymmSCMatrix&hessian);
00780     RefSymmSCMatrix inverse_hessian(RefSymmSCMatrix&);
00781 };
00782 
00783 }
00784 
00785 #endif
00786 
00787 // Local Variables:
00788 // mode: c++
00789 // c-file-style: "CLJ"
00790 // End:

Generated at Fri Jan 10 08:14:08 2003 for MPQC 2.1.3 using the documentation package Doxygen 1.2.14.