| [de0af2] | 1 | /* | 
|---|
|  | 2 | * ExportGraph_ToJobs.hpp | 
|---|
|  | 3 | * | 
|---|
|  | 4 | *  Created on: 08.03.2012 | 
|---|
|  | 5 | *      Author: heber | 
|---|
|  | 6 | */ | 
|---|
|  | 7 |  | 
|---|
|  | 8 | #ifndef EXPORTGRAPH_TOJOBS_HPP_ | 
|---|
|  | 9 | #define EXPORTGRAPH_TOJOBS_HPP_ | 
|---|
|  | 10 |  | 
|---|
|  | 11 | // include config.h | 
|---|
|  | 12 | #ifdef HAVE_CONFIG_H | 
|---|
|  | 13 | #include <config.h> | 
|---|
|  | 14 | #endif | 
|---|
|  | 15 |  | 
|---|
| [8652a30] | 16 | #include <string> | 
|---|
|  | 17 | #include <vector> | 
|---|
|  | 18 |  | 
|---|
|  | 19 | #include "Fragmentation/HydrogenSaturation_enum.hpp" | 
|---|
| [de0af2] | 20 | #include "Fragmentation/Exporters/ExportGraph.hpp" | 
|---|
| [b839fb] | 21 | #include "Fragmentation/Summation/SetValues/SamplingGridProperties.hpp" | 
|---|
| [160ad7] | 22 | #include "LinearAlgebra/Vector.hpp" | 
|---|
|  | 23 |  | 
|---|
|  | 24 | class ExportGraph_ToJobsTest; | 
|---|
| [de0af2] | 25 |  | 
|---|
|  | 26 | /** ExportGraph_ToJobs implements an ExportGraph by sending the created | 
|---|
|  | 27 | * configurations of fragmentary systems as jobs to a server. | 
|---|
|  | 28 | * | 
|---|
|  | 29 | */ | 
|---|
|  | 30 | class ExportGraph_ToJobs : public ExportGraph | 
|---|
|  | 31 | { | 
|---|
| [160ad7] | 32 | //!> grant unit test access | 
|---|
|  | 33 | friend class ExportGraph_ToJobsTest; | 
|---|
| [de0af2] | 34 | public: | 
|---|
| [ac9ca4] | 35 | /** Constructor for ExportGraph_ToJobs. | 
|---|
|  | 36 | * | 
|---|
|  | 37 | * Sets default level. | 
|---|
|  | 38 | * | 
|---|
|  | 39 | * \param _graph Graph with all KeySet's | 
|---|
|  | 40 | * \param _treatment whether hydrogen is excluded in the _graph or not | 
|---|
|  | 41 | * \param _saturation whether we saturate dangling bonds or not | 
|---|
| [98a293b] | 42 | * \param _globalsaturationpositions possibly empty map with global information | 
|---|
|  | 43 | *        where to place saturation hydrogens to fulfill consistency principle | 
|---|
| [ac9ca4] | 44 | */ | 
|---|
| [8652a30] | 45 | ExportGraph_ToJobs( | 
|---|
|  | 46 | const Graph &_graph, | 
|---|
|  | 47 | const enum HydrogenTreatment _treatment, | 
|---|
| [98a293b] | 48 | const enum HydrogenSaturation _saturation, | 
|---|
|  | 49 | const SaturatedFragment::GlobalSaturationPositions_t &_globalsaturationpositions); | 
|---|
| [8652a30] | 50 | virtual ~ExportGraph_ToJobs(); | 
|---|
| [de0af2] | 51 |  | 
|---|
| [c24071] | 52 | bool operator()(); | 
|---|
| [8652a30] | 53 |  | 
|---|
| [160ad7] | 54 | /** Sets the level for the sampling of the density. | 
|---|
|  | 55 | * | 
|---|
|  | 56 | * \param _level level to set | 
|---|
|  | 57 | */ | 
|---|
|  | 58 | void setLevel(const size_t _level) { level = _level; } | 
|---|
|  | 59 |  | 
|---|
|  | 60 | /** Sets how far apart discrete points may be at most per axis. | 
|---|
| [ac9ca4] | 61 | * | 
|---|
| [160ad7] | 62 | * \param _max_meshwidth maximum allowed mesh width. | 
|---|
| [ac9ca4] | 63 | */ | 
|---|
| [160ad7] | 64 | void setMaximumMeshWidth(const double _max_meshwidth) { max_meshwidth = _max_meshwidth; } | 
|---|
| [ac9ca4] | 65 |  | 
|---|
| [b839fb] | 66 | /** Helper to get the global domain grid from the current simulation box. | 
|---|
|  | 67 | * | 
|---|
|  | 68 | * Grid extensions are obtained from World::getDomain(). Level from parameter. | 
|---|
|  | 69 | * | 
|---|
|  | 70 | * \param _level level for this SamplingGrid | 
|---|
|  | 71 | * \return domain grid as SamplingGridProperties | 
|---|
|  | 72 | */ | 
|---|
|  | 73 | static SamplingGridProperties getDomainGrid(const int _level); | 
|---|
|  | 74 |  | 
|---|
| [160ad7] | 75 | private: | 
|---|
|  | 76 |  | 
|---|
|  | 77 | /** Helper function to get the discrete extent of the grid that | 
|---|
|  | 78 | * captures the whole of the fragment inside \a _minmax, and some | 
|---|
|  | 79 | * additional boundary \a _minimum_empty_boundary for a given | 
|---|
|  | 80 | * domain \a _domain with some grid level. If the fragment is larger than | 
|---|
|  | 81 | * the empty boundary, we make the small fragment grid at most three times | 
|---|
|  | 82 | * the extent of the fragment. | 
|---|
|  | 83 | * | 
|---|
|  | 84 | * We need to maintain the following properties: | 
|---|
|  | 85 | * -# the fragment grid's begin and end need to reside (exactly) on grid points | 
|---|
|  | 86 | *    of the global \a _domain | 
|---|
|  | 87 | * -# the length of the fragment grid in \a _domain's deltas needs to be a | 
|---|
|  | 88 | *    power of 2. | 
|---|
|  | 89 | * | 
|---|
|  | 90 | * In order to achieve these, we use the center of the fragment obtained from | 
|---|
|  | 91 | * its extensions in \a _minmax and convert it to the next lower and upper grid | 
|---|
|  | 92 | * points on \a _domain. For increasing powers of 2 we check the extent of the | 
|---|
|  | 93 | * gridpoints by going half of the gridpoints back and forth relative to these | 
|---|
|  | 94 | * center grid points. If their length relative to \a _domain's delta is | 
|---|
|  | 95 | * sufficient to capture the desired extent of fragment, namely \a _minmax | 
|---|
|  | 96 | * including \a _minimum_empty_boundary, we are done. We need to do this | 
|---|
|  | 97 | * iteratively, as the fragment grid may exceed \a _domain's begin or end | 
|---|
|  | 98 | * and shifting is required. | 
|---|
|  | 99 | * | 
|---|
|  | 100 | * \param _minmax minimum and maximum components of fragment's bounding box | 
|---|
|  | 101 | * \param _domain grid with begin and end components and grid level | 
|---|
|  | 102 | * \param _minimum_empty_boundary additional empty boundary around fragment | 
|---|
|  | 103 | * \return grid with begin and end points and and grid level to have same spacing as domain | 
|---|
|  | 104 | */ | 
|---|
|  | 105 | static SamplingGridProperties getGridExtentsForGivenBoundingBox( | 
|---|
|  | 106 | const std::pair<Vector, Vector> &_minmax, | 
|---|
|  | 107 | const SamplingGridProperties &_domain, | 
|---|
|  | 108 | const double & _minimum_empty_boundary); | 
|---|
|  | 109 |  | 
|---|
|  | 110 | /** Helper function to calculate the required grid level for a fragment \a _grid | 
|---|
|  | 111 | * such that is discretization mesh width is below the acceptable \a _max_meshwidth. | 
|---|
|  | 112 | * | 
|---|
|  | 113 | * \param _grid grid properties of the fragment, sets its level on return | 
|---|
|  | 114 | * \param _max_meshwidth uppermost acceptable mesh width | 
|---|
|  | 115 | */ | 
|---|
|  | 116 | static void setAcceptableFragmentLevel( | 
|---|
|  | 117 | SamplingGridProperties &_grid, | 
|---|
|  | 118 | const double &_max_meshwidth); | 
|---|
|  | 119 |  | 
|---|
|  | 120 | //>! log of two | 
|---|
|  | 121 | static const double log_two; | 
|---|
|  | 122 |  | 
|---|
| [ac9ca4] | 123 | private: | 
|---|
|  | 124 | //!> resolution of sampled electron density as \f$2^{\mathrm{level}}\f$ | 
|---|
|  | 125 | size_t level; | 
|---|
| [160ad7] | 126 | //!> maximum allowed mesh width, i.e. discrete points may be at most that far part per axis | 
|---|
|  | 127 | double max_meshwidth; | 
|---|
|  | 128 | //!> desired minimum empty boundary around the fragment | 
|---|
|  | 129 | const double minimum_empty_boundary; | 
|---|
| [de0af2] | 130 | }; | 
|---|
|  | 131 |  | 
|---|
|  | 132 | #endif /* EXPORTGRAPH_TOJOBS_HPP_ */ | 
|---|