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/3.14159265358979323846;
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