00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef IMPATOM_BROWNIAN_DYNAMICS_H
00010 #define IMPATOM_BROWNIAN_DYNAMICS_H
00011
00012 #include "atom_config.h"
00013 #include "Diffusion.h"
00014 #include "SimulationParameters.h"
00015
00016 #include <IMP/Particle.h>
00017 #include <IMP/Optimizer.h>
00018 #include <IMP/internal/units.h>
00019 #include <IMP/algebra/Vector3D.h>
00020
00021 IMPATOM_BEGIN_NAMESPACE
00022
00023
00024 class SimulationParameters;
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 class IMPATOMEXPORT BrownianDynamics : public Optimizer
00054 {
00055 public:
00056
00057
00058
00059 BrownianDynamics(SimulationParameters si,
00060 SingletonContainer *sc=NULL);
00061
00062 IMP_OPTIMIZER(BrownianDynamics);
00063
00064
00065 double simulate(float time_in_fs);
00066
00067
00068
00069
00070
00071
00072 void set_minimum_feature_size(double df) {
00073 IMP_USAGE_CHECK(df > 0, "The max change must be positive");
00074 feature_size_2_=unit::SquareAngstrom(square(df));
00075 }
00076 #if !defined(SWIG) && !defined(IMP_DOXYGEN)
00077 void set_minimum_feature_size(unit::Angstrom f) {
00078 set_minimum_feature_size(unit::strip_units(f));
00079 }
00080 #endif
00081
00082 private:
00083 void copy_coordinates(SingletonContainer *sc,
00084 std::vector<algebra::VectorD<3> > &v) const;
00085 void revert_coordinates(SingletonContainer *sc,
00086 std::vector<algebra::VectorD<3> > &v);
00087
00088 void take_step(SingletonContainer *sc, unit::Femtosecond dt);
00089
00090 SingletonContainer* setup_particles();
00091
00092
00093
00094
00095
00096 unit::SquareAngstrom feature_size_2_;
00097 RefCountingDecorator<SimulationParameters> si_;
00098 IMP::internal::OwnerPointer<SingletonContainer> sc_;
00099 unsigned int failed_steps_;
00100 unsigned int successful_steps_;
00101 };
00102
00103 IMPATOM_END_NAMESPACE
00104
00105 #endif