00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _intco_simple_h
00023 #define _intco_simple_h
00024
00025 #ifdef __GNUC__
00026 #pragma interface
00027 #endif
00028
00029
00030 #include <iostream>
00031
00032 #include <util/class/class.h>
00033 #include <util/state/state.h>
00034 #include <util/keyval/keyval.h>
00035 #include <chemistry/molecule/molecule.h>
00036 #include <chemistry/molecule/coor.h>
00037
00038 #include <math/scmat/vector3.h>
00039
00040 namespace sc {
00041
00042
00043
00083 class SimpleCo : public IntCoor {
00084 protected:
00085 int natoms_;
00086 int *atoms;
00087
00088 public:
00089 SimpleCo();
00094 SimpleCo(int,const char* =0);
00096 SimpleCo(const Ref<KeyVal>&,int natom);
00097
00098 virtual ~SimpleCo();
00099
00101 int natoms() const;
00103 int operator[](int i) const;
00104
00105 void save_data_state(StateOut&);
00106 SimpleCo(StateIn&);
00107
00108 virtual int operator==(SimpleCo&);
00109 int operator!=(SimpleCo&u);
00110
00111
00112
00114 double force_constant(Ref<Molecule>&);
00117 void update_value(const Ref<Molecule>&);
00119 void bmat(const Ref<Molecule>&,RefSCVector&bmat,double coef = 1.0);
00120
00122 virtual double calc_force_con(Molecule&) = 0;
00127 virtual double calc_intco(Molecule&, double* =0, double =1) = 0;
00128
00130 void print_details(const Ref<Molecule> &,
00131 std::ostream& = ExEnv::out0()) const;
00132
00135 int equivalent(Ref<IntCoor>&);
00136 };
00137
00138
00139
00140
00141
00142 #define SimpleCo_DECLARE(classname) \
00143 public: \
00144 virtual classname& operator=(const classname&); \
00145 SimpleCo& operator=(const SimpleCo&); \
00146 double calc_force_con(Molecule&); \
00147 double calc_intco(Molecule&, double* =0, double =1); \
00148 classname(StateIn&); \
00149 void save_data_state(StateOut&)
00150
00151 #define SimpleCo_IMPL_eq(classname) \
00152 SimpleCo& classname::operator=(const SimpleCo& c) \
00153 { \
00154 classname *cp = dynamic_cast<classname*>((SimpleCo*)&c); \
00155 if(cp) { \
00156 *this=*cp; \
00157 } \
00158 else { \
00159 natoms_ = 0; \
00160 atoms = 0; \
00161 } \
00162 \
00163 return *this; \
00164 }
00165
00166 #define SimpleCo_IMPL_StateIn(classname) \
00167 classname::classname(StateIn&si): \
00168 SimpleCo(si) \
00169 { \
00170 }
00171
00172 #define SimpleCo_IMPL_save_data_state(classname) \
00173 void classname::save_data_state(StateOut&so) \
00174 { \
00175 SimpleCo::save_data_state(so); \
00176 }
00177
00178 #define SimpleCo_IMPL(classname) \
00179 SimpleCo_IMPL_eq(classname) \
00180 SimpleCo_IMPL_StateIn(classname) \
00181 SimpleCo_IMPL_save_data_state(classname)
00182
00183
00184
00193 class StreSimpleCo : public SimpleCo {
00194 SimpleCo_DECLARE(StreSimpleCo);
00195 public:
00196 StreSimpleCo();
00197 StreSimpleCo(const StreSimpleCo&);
00201 StreSimpleCo(const char*, int, int);
00204 StreSimpleCo(const Ref<KeyVal>&);
00205
00206 ~StreSimpleCo();
00207
00209 const char * ctype() const;
00210
00212 double bohr() const;
00214 double angstrom() const;
00216 double preferred_value() const;
00217 };
00218
00219 typedef StreSimpleCo Stre;
00220
00221
00222
00223 static const double rtd = 180.0/M_PI;
00224
00238 class BendSimpleCo : public SimpleCo {
00239 SimpleCo_DECLARE(BendSimpleCo);
00240 public:
00241 BendSimpleCo();
00242 BendSimpleCo(const BendSimpleCo&);
00246 BendSimpleCo(const char*, int, int, int);
00249 BendSimpleCo(const Ref<KeyVal>&);
00250
00251 ~BendSimpleCo();
00252
00254 const char * ctype() const;
00255
00257 double radians() const;
00259 double degrees() const;
00261 double preferred_value() const;
00262 };
00263
00264 typedef BendSimpleCo Bend;
00265
00266
00267
00296 class TorsSimpleCo : public SimpleCo {
00297 SimpleCo_DECLARE(TorsSimpleCo);
00298 public:
00299 TorsSimpleCo();
00300 TorsSimpleCo(const TorsSimpleCo&);
00304 TorsSimpleCo(const char *refr, int, int, int, int);
00307 TorsSimpleCo(const Ref<KeyVal>&);
00308
00309 ~TorsSimpleCo();
00310
00312 const char * ctype() const;
00313
00315 double radians() const;
00317 double degrees() const;
00319 double preferred_value() const;
00320 };
00321
00322 typedef TorsSimpleCo Tors;
00323
00324
00325
00357 class ScaledTorsSimpleCo : public SimpleCo {
00358 SimpleCo_DECLARE(ScaledTorsSimpleCo);
00359 private:
00360 double old_torsion_;
00361 public:
00362 ScaledTorsSimpleCo();
00363 ScaledTorsSimpleCo(const ScaledTorsSimpleCo&);
00367 ScaledTorsSimpleCo(const char *refr, int, int, int, int);
00370 ScaledTorsSimpleCo(const Ref<KeyVal>&);
00371
00372 ~ScaledTorsSimpleCo();
00373
00375 const char * ctype() const;
00376
00378 double radians() const;
00380 double degrees() const;
00382 double preferred_value() const;
00383 };
00384
00385 typedef ScaledTorsSimpleCo ScaledTors;
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407 class OutSimpleCo : public SimpleCo {
00408 SimpleCo_DECLARE(OutSimpleCo);
00409 public:
00410 OutSimpleCo();
00411 OutSimpleCo(const OutSimpleCo&);
00416 OutSimpleCo(const char *refr, int, int, int, int);
00419 OutSimpleCo(const Ref<KeyVal>&);
00420
00421 ~OutSimpleCo();
00422
00424 const char * ctype() const;
00425
00427 double radians() const;
00429 double degrees() const;
00431 double preferred_value() const;
00432 };
00433
00434 typedef OutSimpleCo Out;
00435
00436
00437
00459 class LinIPSimpleCo : public SimpleCo {
00460 SimpleCo_DECLARE(LinIPSimpleCo);
00461 private:
00462 SCVector3 u2;
00463 public:
00464 LinIPSimpleCo();
00465 LinIPSimpleCo(const LinIPSimpleCo&);
00471 LinIPSimpleCo(const char *refr, int, int, int, const SCVector3 &u);
00474 LinIPSimpleCo(const Ref<KeyVal>&);
00475
00476 ~LinIPSimpleCo();
00477
00479 const char * ctype() const;
00480
00482 double radians() const;
00484 double degrees() const;
00486 double preferred_value() const;
00487 };
00488
00489 typedef LinIPSimpleCo LinIP;
00490
00491
00492
00517 class LinOPSimpleCo : public SimpleCo {
00518 SimpleCo_DECLARE(LinOPSimpleCo);
00519 private:
00520 SCVector3 u2;
00521 public:
00522 LinOPSimpleCo();
00523 LinOPSimpleCo(const LinOPSimpleCo&);
00529 LinOPSimpleCo(const char *refr, int, int, int, const SCVector3 &u);
00532 LinOPSimpleCo(const Ref<KeyVal>&);
00533
00534 ~LinOPSimpleCo();
00535
00537 const char * ctype() const;
00538
00540 double radians() const;
00542 double degrees() const;
00544 double preferred_value() const;
00545 };
00546
00547 typedef LinOPSimpleCo LinOP;
00548
00549 }
00550
00551 #endif
00552
00553
00554
00555
00556