Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.cpp

    r6e5084 r0430e3  
    1010#include "Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.hpp"
    1111#include "Actions/ActionRegistry.hpp"
    12 #include "Helpers/Log.hpp"
    13 #include "Helpers/Verbose.hpp"
    14 #include "LinearAlgebra/Line.hpp"
    15 #include "LinearAlgebra/Matrix.hpp"
    16 #include "LinearAlgebra/Vector.hpp"
    17 #include "element.hpp"
     12#include "log.hpp"
    1813#include "molecule.hpp"
     14#include "verbose.hpp"
    1915
    2016
     
    2723#include "UIElements/UIFactory.hpp"
    2824#include "UIElements/Dialog.hpp"
    29 #include "Actions/ValueStorage.hpp"
     25#include "UIElements/ValueStorage.hpp"
    3026
    3127/****** MoleculeRotateToPrincipalAxisSystemAction *****/
     
    5248{}
    5349
    54 void MoleculeRotateToPrincipalAxisSystem(Vector &Axis) {
    55   ValueStorage::getInstance().setCurrentValue(MoleculeRotateToPrincipalAxisSystemAction::NAME, Axis);
     50void MoleculeRotateToPrincipalAxisSystem() {
    5651  ActionRegistry::getInstance().getActionByName(MoleculeRotateToPrincipalAxisSystemAction::NAME)->call(Action::NonInteractive);
    5752};
    5853
    59 Dialog* MoleculeRotateToPrincipalAxisSystemAction::fillDialog(Dialog *dialog) {
    60   ASSERT(dialog,"No Dialog given when filling action dialog");
     54Dialog* MoleculeRotateToPrincipalAxisSystemAction::createDialog() {
     55  Dialog *dialog = UIFactory::getInstance().makeDialog();
    6156
    62   dialog->queryVector(NAME, false, MapOfActions::getInstance().getDescription(NAME));
     57  dialog->queryEmpty(NAME, MapOfActions::getInstance().getDescription(NAME));
    6358
    6459  return dialog;
     
    6762Action::state_ptr MoleculeRotateToPrincipalAxisSystemAction::performCall() {
    6863  molecule *mol = NULL;
    69   Vector Axis;
    70 
    71   // obtain axis to rotate to
    72   ValueStorage::getInstance().queryCurrentValue(NAME, Axis);
    7364
    7465  for (World::MoleculeSelectionIterator iter = World::getInstance().beginMoleculeSelection(); iter != World::getInstance().endMoleculeSelection(); ++iter) {
    7566    mol = iter->second;
    7667    DoLog(0) && (Log() << Verbose(0) << "Converting to prinicipal axis system." << endl);
    77     Matrix InertiaTensor;
    78     Vector *CenterOfGravity = mol->DetermineCenterOfGravity();
    79 
    80     // reset inertia tensor
    81     InertiaTensor.zero();
    82 
    83     // sum up inertia tensor
    84     for (molecule::const_iterator iter = mol->begin(); iter != mol->end(); ++iter) {
    85       Vector x = (*iter)->x;
    86       x -= *CenterOfGravity;
    87       InertiaTensor.at(0,0) += (*iter)->type->mass*(x[1]*x[1] + x[2]*x[2]);
    88       InertiaTensor.at(0,1) += (*iter)->type->mass*(-x[0]*x[1]);
    89       InertiaTensor.at(0,2) += (*iter)->type->mass*(-x[0]*x[2]);
    90       InertiaTensor.at(1,0) += (*iter)->type->mass*(-x[1]*x[0]);
    91       InertiaTensor.at(1,1) += (*iter)->type->mass*(x[0]*x[0] + x[2]*x[2]);
    92       InertiaTensor.at(1,2) += (*iter)->type->mass*(-x[1]*x[2]);
    93       InertiaTensor.at(2,0) += (*iter)->type->mass*(-x[2]*x[0]);
    94       InertiaTensor.at(2,1) += (*iter)->type->mass*(-x[2]*x[1]);
    95       InertiaTensor.at(2,2) += (*iter)->type->mass*(x[0]*x[0] + x[1]*x[1]);
    96     }
    97     // print InertiaTensor for debugging
    98     DoLog(0) && (Log() << Verbose(0) << "The inertia tensor is:" << InertiaTensor << endl);
    99 
    100     // diagonalize to determine principal axis system
    101     Vector Eigenvalues = InertiaTensor.transformToEigenbasis();
    102 
    103     for(int i=0;i<NDIM;i++)
    104       DoLog(0) && (Log() << Verbose(0) << "eigenvalue = " << Eigenvalues[i] << ", eigenvector = " << InertiaTensor.column(i) << endl);
    105 
    106     // check whether we rotate or not
    107     DoLog(0) && (Log() << Verbose(0) << "Transforming molecule into PAS ... ");
    108 
    109     // obtain first column, eigenvector to biggest eigenvalue
    110     Vector BiggestEigenvector(InertiaTensor.column(Eigenvalues.SmallestComponent()));
    111     Vector DesiredAxis(Axis);
    112 
    113     // Creation Line that is the rotation axis
    114     DesiredAxis.VectorProduct(BiggestEigenvector);
    115     Line RotationAxis(Vector(0.,0.,0.), DesiredAxis);
    116 
    117     // determine angle
    118     const double alpha = BiggestEigenvector.Angle(Axis);
    119 
    120     DoLog(0) && (Log() << Verbose(0) << alpha << endl);
    121 
    122     for (molecule::iterator iter = mol->begin(); iter != mol->end(); ++iter) {
    123       *((*iter)->node) -= *CenterOfGravity;
    124       *((*iter)->node) = RotationAxis.rotateVector(*((*iter)->node), alpha);
    125       *((*iter)->node) += *CenterOfGravity;
    126     }
    127     DoLog(0) && (Log() << Verbose(0) << "done." << endl);
    128 
    129     // summing anew for debugging (resulting matrix has to be diagonal!)
    130     // reset inertia tensor
    131     InertiaTensor.zero();
    132 
    133     // sum up inertia tensor
    134     for (molecule::const_iterator iter = mol->begin(); iter != mol->end(); ++iter) {
    135       Vector x = (*iter)->x;
    136       x -= *CenterOfGravity;
    137       InertiaTensor.at(0,0) += (*iter)->type->mass*(x[1]*x[1] + x[2]*x[2]);
    138       InertiaTensor.at(0,1) += (*iter)->type->mass*(-x[0]*x[1]);
    139       InertiaTensor.at(0,2) += (*iter)->type->mass*(-x[0]*x[2]);
    140       InertiaTensor.at(1,0) += (*iter)->type->mass*(-x[1]*x[0]);
    141       InertiaTensor.at(1,1) += (*iter)->type->mass*(x[0]*x[0] + x[2]*x[2]);
    142       InertiaTensor.at(1,2) += (*iter)->type->mass*(-x[1]*x[2]);
    143       InertiaTensor.at(2,0) += (*iter)->type->mass*(-x[2]*x[0]);
    144       InertiaTensor.at(2,1) += (*iter)->type->mass*(-x[2]*x[1]);
    145       InertiaTensor.at(2,2) += (*iter)->type->mass*(x[0]*x[0] + x[1]*x[1]);
    146       // print InertiaTensor for debugging
    147       DoLog(0) && (Log() << Verbose(0) << "The inertia tensor is:" << InertiaTensor << endl);
    148     }
    149 
    150     // free everything
    151     delete(CenterOfGravity);
     68    mol->PrincipalAxisSystem(true);
    15269  }
    15370  return Action::success;
Note: See TracChangeset for help on using the changeset viewer.