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 private:
00151
00152 #define SimpleCo_IMPL_eq(classname) \
00153 SimpleCo& classname::operator=(const SimpleCo& c) \
00154 { \
00155 classname *cp = dynamic_cast<classname*>((SimpleCo*)&c); \
00156 if(cp) { \
00157 *this=*cp; \
00158 } \
00159 else { \
00160 natoms_ = 0; \
00161 atoms = 0; \
00162 } \
00163 \
00164 return *this; \
00165 }
00166
00167 #define SimpleCo_IMPL_StateIn(classname) \
00168 classname::classname(StateIn&si): \
00169 SimpleCo(si) \
00170 { \
00171 }
00172
00173 #define SimpleCo_IMPL_save_data_state(classname) \
00174 void classname::save_data_state(StateOut&so) \
00175 { \
00176 SimpleCo::save_data_state(so); \
00177 }
00178
00179 #define SimpleCo_IMPL(classname) \
00180 SimpleCo_IMPL_eq(classname) \
00181 SimpleCo_IMPL_StateIn(classname) \
00182 SimpleCo_IMPL_save_data_state(classname)
00183
00184
00185
00194 class StreSimpleCo : public SimpleCo {
00195 SimpleCo_DECLARE(StreSimpleCo)
00196 public:
00197 StreSimpleCo();
00198 StreSimpleCo(const StreSimpleCo&);
00202 StreSimpleCo(const char*, int, int);
00205 StreSimpleCo(const Ref<KeyVal>&);
00206
00207 ~StreSimpleCo();
00208
00210 const char * ctype() const;
00211
00213 double bohr() const;
00215 double angstrom() const;
00217 double preferred_value() const;
00218 };
00219
00220 typedef StreSimpleCo Stre;
00221
00222
00223
00224 static const double rtd = 180.0/3.14159265358979323846;
00225
00239 class BendSimpleCo : public SimpleCo {
00240 SimpleCo_DECLARE(BendSimpleCo)
00241 public:
00242 BendSimpleCo();
00243 BendSimpleCo(const BendSimpleCo&);
00247 BendSimpleCo(const char*, int, int, int);
00250 BendSimpleCo(const Ref<KeyVal>&);
00251
00252 ~BendSimpleCo();
00253
00255 const char * ctype() const;
00256
00258 double radians() const;
00260 double degrees() const;
00262 double preferred_value() const;
00263 };
00264
00265 typedef BendSimpleCo Bend;
00266
00267
00268
00297 class TorsSimpleCo : public SimpleCo {
00298 SimpleCo_DECLARE(TorsSimpleCo)
00299 public:
00300 TorsSimpleCo();
00301 TorsSimpleCo(const TorsSimpleCo&);
00305 TorsSimpleCo(const char *refr, int, int, int, int);
00308 TorsSimpleCo(const Ref<KeyVal>&);
00309
00310 ~TorsSimpleCo();
00311
00313 const char * ctype() const;
00314
00316 double radians() const;
00318 double degrees() const;
00320 double preferred_value() const;
00321 };
00322
00323 typedef TorsSimpleCo Tors;
00324
00325
00326
00358 class ScaledTorsSimpleCo : public SimpleCo {
00359 SimpleCo_DECLARE(ScaledTorsSimpleCo)
00360 private:
00361 double old_torsion_;
00362 public:
00363 ScaledTorsSimpleCo();
00364 ScaledTorsSimpleCo(const ScaledTorsSimpleCo&);
00368 ScaledTorsSimpleCo(const char *refr, int, int, int, int);
00371 ScaledTorsSimpleCo(const Ref<KeyVal>&);
00372
00373 ~ScaledTorsSimpleCo();
00374
00376 const char * ctype() const;
00377
00379 double radians() const;
00381 double degrees() const;
00383 double preferred_value() const;
00384 };
00385
00386 typedef ScaledTorsSimpleCo ScaledTors;
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408 class OutSimpleCo : public SimpleCo {
00409 SimpleCo_DECLARE(OutSimpleCo)
00410 public:
00411 OutSimpleCo();
00412 OutSimpleCo(const OutSimpleCo&);
00417 OutSimpleCo(const char *refr, int, int, int, int);
00420 OutSimpleCo(const Ref<KeyVal>&);
00421
00422 ~OutSimpleCo();
00423
00425 const char * ctype() const;
00426
00428 double radians() const;
00430 double degrees() const;
00432 double preferred_value() const;
00433 };
00434
00435 typedef OutSimpleCo Out;
00436
00437
00438
00460 class LinIPSimpleCo : public SimpleCo {
00461 SimpleCo_DECLARE(LinIPSimpleCo)
00462 private:
00463 SCVector3 u2;
00464 public:
00465 LinIPSimpleCo();
00466 LinIPSimpleCo(const LinIPSimpleCo&);
00472 LinIPSimpleCo(const char *refr, int, int, int, const SCVector3 &u);
00475 LinIPSimpleCo(const Ref<KeyVal>&);
00476
00477 ~LinIPSimpleCo();
00478
00480 const char * ctype() const;
00481
00483 double radians() const;
00485 double degrees() const;
00487 double preferred_value() const;
00488 };
00489
00490 typedef LinIPSimpleCo LinIP;
00491
00492
00493
00518 class LinOPSimpleCo : public SimpleCo {
00519 SimpleCo_DECLARE(LinOPSimpleCo)
00520 private:
00521 SCVector3 u2;
00522 public:
00523 LinOPSimpleCo();
00524 LinOPSimpleCo(const LinOPSimpleCo&);
00530 LinOPSimpleCo(const char *refr, int, int, int, const SCVector3 &u);
00533 LinOPSimpleCo(const Ref<KeyVal>&);
00534
00535 ~LinOPSimpleCo();
00536
00538 const char * ctype() const;
00539
00541 double radians() const;
00543 double degrees() const;
00545 double preferred_value() const;
00546 };
00547
00548 typedef LinOPSimpleCo LinOP;
00549
00550 }
00551
00552 #endif
00553
00554
00555
00556
00557