void Chemistry::Bond::cycleBondOrder() { quint8 order = bondOrder(); if (order == 3) setBondOrder(1); else setBondOrder(order + 1); }
bool UffBondStrechCalculation::setup() { const UffAtomParameters *pa = parameters(atom(0)); const UffAtomParameters *pb = parameters(atom(1)); if(!pa || !pb){ return false; } // n = bondorder (1.5 for aromatic, 1.366 for amide) chemkit::Real bondorder = bondOrder(atom(0), atom(1)); chemkit::Real r0 = bondLength(pa, pb, bondorder); // parameter(1) = k_ij = 664.12 * (Z*_i * Z*_j) / r_ij^3 chemkit::Real za = pa->Z; chemkit::Real zb = pb->Z; chemkit::Real kb = 664.12 * (za * zb) / pow(r0, 3); setParameter(0, kb); setParameter(1, r0); return true; }
bool UffTorsionCalculation::setup() { UffForceField *forceField = static_cast<UffForceField *>(this->forceField()); const chemkit::ForceFieldAtom *b = atom(1); const chemkit::ForceFieldAtom *c = atom(2); if(b->type().length() < 3 || c->type().length() < 3){ return false; } const UffAtomParameters *pb = parameters(b); const UffAtomParameters *pc = parameters(c); chemkit::Real V = 0; chemkit::Real n = 0; chemkit::Real phi0 = 0; // sp3-sp3 if(b->type()[2] == '3' && c->type()[2] == '3'){ // exception for two group six atoms if(forceField->isGroupSix(b) && forceField->isGroupSix(c)){ if(b->atom()->is(chemkit::Atom::Oxygen) && c->atom()->is(chemkit::Atom::Oxygen)){ V = 2; // sqrt(2*2) } else if(b->atom()->is(chemkit::Atom::Oxygen) || c->atom()->is(chemkit::Atom::Oxygen)){ V = sqrt(2 * 6.8); } else{ V = sqrt(6.8 * 6.8); } n = 2; phi0 = 90; } // general case else{ // equation 16 V = sqrt(pb->V * pc->V); n = 3; phi0 = 180 * chemkit::constants::DegreesToRadians; } } // sp2-sp2 else if((b->type()[2] == '2' || b->type()[2] == 'R') && (c->type()[2] == '2' || c->type()[2] == 'R')){ chemkit::Real bondorder = bondOrder(b, c); // equation 17 V = 5 * sqrt(pb->U * pc->U) * (1 + 4.18 * log(bondorder)); n = 2; phi0 = 180 * chemkit::constants::DegreesToRadians; } // group 6 sp3 - any sp2 or R else if((forceField->isGroupSix(b) && (c->type()[2] == '2' || c->type()[2] == 'R')) || (forceField->isGroupSix(c) && (b->type()[2] == '2' || b->type()[2] == 'R'))){ chemkit::Real bondorder = bondOrder(b, c); // equation 17 V = 5 * sqrt(pb->U * pc->U) * (1 + 4.18 * log(bondorder)); n = 2; phi0 = 90 * chemkit::constants::DegreesToRadians; } // sp3-sp2 else if((b->type()[2] == '3' && (c->type()[2] == '2' || c->type()[2] == 'R')) || (c->type()[2] == '3' && (b->type()[2] == '2' || b->type()[2] == 'R'))){ V = 1; n = 6; phi0 = 0; } else{ return false; } setParameter(0, V); setParameter(1, n); setParameter(2, phi0); return true; }