00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
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
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
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_;
00343
Ref<SCMatrixKit> matrixkit_;
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_;
00456
RefSCDimension dvc_;
00457
00458
Ref<SetIntCoor> variable_;
00459
Ref<SetIntCoor> constant_;
00460
00461
Ref<SetIntCoor> fixed_;
00462
Ref<SetIntCoor> watched_;
00463
Ref<IntCoor> followed_;
00464
00465
00466
Ref<SetIntCoor> bonds_;
00467
Ref<SetIntCoor> bends_;
00468
Ref<SetIntCoor> tors_;
00469
Ref<SetIntCoor> outs_;
00470
00471
00472
Ref<SetIntCoor> extras_;
00473
00474
Ref<SetIntCoor> all_;
00475
00476
00477
00478
00479
00480
int update_bmat_;
00481
int only_totally_symmetric_;
00482
double symmetry_tolerance_;
00483
double simple_tolerance_;
00484
double coordinate_tolerance_;
00485
double cartesian_tolerance_;
00486
double scale_bonds_;
00487
double scale_bends_;
00488
double scale_tors_;
00489
double scale_outs_;
00490
00491
int nextra_bonds_;
00492
int* extra_bonds_;
00493
00494
int 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
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
00671
int change_coordinates_;
00672
00673
int transform_hessian_;
00674
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_;
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
00788
00789
00790