| [48ab414] | 1 | /*
 | 
|---|
 | 2 |  * RandomInserter.hpp
 | 
|---|
 | 3 |  *
 | 
|---|
 | 4 |  *  Created on: Feb 21, 2012
 | 
|---|
 | 5 |  *      Author: heber
 | 
|---|
 | 6 |  */
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | #ifndef RANDOMINSERTER_HPP_
 | 
|---|
 | 9 | #define RANDOMINSERTER_HPP_
 | 
|---|
 | 10 | 
 | 
|---|
 | 11 | 
 | 
|---|
 | 12 | // include config.h
 | 
|---|
 | 13 | #ifdef HAVE_CONFIG_H
 | 
|---|
 | 14 | #include <config.h>
 | 
|---|
 | 15 | #endif
 | 
|---|
 | 16 | 
 | 
|---|
 | 17 | #include "InserterBase.hpp"
 | 
|---|
 | 18 | 
 | 
|---|
 | 19 | #include <vector>
 | 
|---|
 | 20 | 
 | 
|---|
 | 21 | #include "LinearAlgebra/Vector.hpp"
 | 
|---|
 | 22 | 
 | 
|---|
 | 23 | class RandomNumberGenerator;
 | 
|---|
 | 24 | class RealSpaceMatrix;
 | 
|---|
 | 25 | 
 | 
|---|
 | 26 | /** RandomInserter implements Inserter interface such that the given \a Cluster
 | 
|---|
 | 27 |  * is inserted at the position with a slight random variation.
 | 
|---|
 | 28 |  *
 | 
|---|
 | 29 |  * \warning As the RandomInserter rotates the molecule, the only bounding shape in
 | 
|---|
 | 30 |  * Cluster that makes sense is a sphere. Otherwise, RandomInserter::Max_Attempts
 | 
|---|
 | 31 |  * attempts are made at finding a lucky shot where all atoms, though rotated
 | 
|---|
 | 32 |  * and randomly translated, remain inside but after that the cluster is inserted
 | 
|---|
 | 33 |  * as it is.
 | 
|---|
 | 34 |  */
 | 
|---|
 | 35 | class RandomInserter : public InserterBase
 | 
|---|
 | 36 | {
 | 
|---|
 | 37 | public:
 | 
|---|
 | 38 |   RandomInserter(const double _MaxAtomComponent, const double _MaxMoleculeComponent, const bool _DoRandomRotation);
 | 
|---|
 | 39 |   ~RandomInserter();
 | 
|---|
 | 40 | 
 | 
|---|
 | 41 |   bool operator()(ClusterInterface::Cluster_impl cluster, const Vector &offset) const;
 | 
|---|
 | 42 | 
 | 
|---|
 | 43 | private:
 | 
|---|
 | 44 |   bool AreClustersAtomsInside(ClusterInterface::Cluster_impl cluster) const;
 | 
|---|
 | 45 |   Vector getRandomVector(const double range, const double offset) const;
 | 
|---|
 | 46 | 
 | 
|---|
 | 47 |   void doTranslation(
 | 
|---|
 | 48 |       ClusterInterface::Cluster_impl cluster,
 | 
|---|
 | 49 |       const RealSpaceMatrix &Rotations,
 | 
|---|
 | 50 |       const std::vector<Vector> &RandomAtomTranslations,
 | 
|---|
 | 51 |       const Vector &RandomMoleculeTranslations) const;
 | 
|---|
 | 52 |   void undoTranslation(
 | 
|---|
 | 53 |       ClusterInterface::Cluster_impl cluster,
 | 
|---|
 | 54 |       const RealSpaceMatrix &Rotations,
 | 
|---|
 | 55 |       const std::vector<Vector> &RandomAtomTranslations,
 | 
|---|
 | 56 |       const Vector &RandomMoleculeTranslations) const;
 | 
|---|
 | 57 | 
 | 
|---|
 | 58 | private:
 | 
|---|
 | 59 |   //!> internal random number generator
 | 
|---|
 | 60 |   RandomNumberGenerator &random;
 | 
|---|
 | 61 |   //!> minimum value of the random number distribution
 | 
|---|
 | 62 |   const double rng_min;
 | 
|---|
 | 63 |   //!> maximum value of the random number distribution
 | 
|---|
 | 64 |   const double rng_max;
 | 
|---|
 | 65 |   //!> range is maximum component for atom translations
 | 
|---|
 | 66 |   const double MaxAtomComponent;
 | 
|---|
 | 67 |   //!> range is maximum component for molecule translations
 | 
|---|
 | 68 |   const double MaxMoleculeComponent;
 | 
|---|
 | 69 |   //!> whether to randomly rotate or not
 | 
|---|
 | 70 |   const bool DoRandomRotation;
 | 
|---|
 | 71 | 
 | 
|---|
 | 72 |   //!> maximum number of tries to find a suitable randomized position
 | 
|---|
 | 73 |   static size_t Max_Attempts;
 | 
|---|
 | 74 | };
 | 
|---|
 | 75 | 
 | 
|---|
 | 76 | 
 | 
|---|
 | 77 | #endif /* RANDOMINSERTER_HPP_ */
 | 
|---|