00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef BALL_MOLMEC_AMBER_AMBERTORSION_H
00010 #define BALL_MOLMEC_AMBER_AMBERTORSION_H
00011
00012 #ifndef BALL_COMMON_H
00013 # include <BALL/common.h>
00014 #endif
00015
00016 #ifndef BALL_MOLMEC_PARAMETER_COSINETORSION_H
00017 # include <BALL/MOLMEC/PARAMETER/cosineTorsion.h>
00018 #endif
00019
00020 #ifndef BALL_MOLMEC_COMMON_FORCEFIELDCOMPONENT_H
00021 # include <BALL/MOLMEC/COMMON/forceFieldComponent.h>
00022 #endif
00023
00024 #ifndef BALL_MOLMEC_COMMON_FORCEFIELD_H
00025 # include <BALL/MOLMEC/COMMON/forceField.h>
00026 #endif
00027
00028 namespace BALL
00029 {
00033 class BALL_EXPORT AmberTorsion
00034 : public ForceFieldComponent
00035 {
00036 public:
00037
00039 #define AMBER_TORSIONS_ENABLED "enable Torsions"
00040
00044
00045 struct SingleAmberTorsion
00046 {
00047 Atom::StaticAtomAttributes* atom1;
00048 Atom::StaticAtomAttributes* atom2;
00049 Atom::StaticAtomAttributes* atom3;
00050 Atom::StaticAtomAttributes* atom4;
00051
00052 float V;
00053 unsigned char f;
00054 float phase;
00055
00056 SingleAmberTorsion()
00057 : atom1(0),
00058 atom2(0),
00059 atom3(0),
00060 atom4(0),
00061 V(0),
00062 f(0),
00063 phase(0)
00064 {
00065 }
00066
00067
00068 SingleAmberTorsion(CosineTorsion::SingleData& t)
00069 {
00070 atom1 = &Atom::getAttributes()[t.atom1->getIndex()];
00071 atom2 = &Atom::getAttributes()[t.atom2->getIndex()];
00072 atom3 = &Atom::getAttributes()[t.atom3->getIndex()];
00073 atom4 = &Atom::getAttributes()[t.atom4->getIndex()];
00074
00075 V = t.values.V / t.values.n;
00076 f = (unsigned char)t.values.f;
00077 phase = ((2.0 * BALL::Constants::PI)/360.0) * t.values.phase;
00078 }
00079 };
00080
00082
00086
00087 BALL_CREATE(AmberTorsion)
00088
00089
00091 AmberTorsion();
00092
00095 AmberTorsion(ForceField& force_field);
00096
00099 AmberTorsion(const AmberTorsion& amber_stretch);
00100
00103 virtual ~AmberTorsion();
00104
00106
00109
00112 virtual bool setup()
00113 throw(Exception::TooManyErrors);
00114
00116
00119
00122 virtual double updateEnergy();
00123
00126 virtual void updateForces();
00127
00129
00130 private:
00131
00132
00133
00134
00135
00136
00137
00138 vector<SingleAmberTorsion> torsion_;
00139
00140 CosineTorsion torsion_parameters_;
00141
00142 CosineTorsion improper_parameters_;
00143
00144 ParameterSection impropers_;
00145
00146
00147
00148 };
00149 }
00150
00151 #endif // BALL_MOLMEC_AMBER_AMBERTORSION_H