source: src/Fragmentation/Exporters/ExportGraph_ToJobs.hpp@ e1e108

IndependentFragmentGrids_IntegrationTest
Last change on this file since e1e108 was 160ad7, checked in by Frederik Heber <heber@…>, 9 years ago

ExportGraph_ToJobs::operator() now calculates a specific level for each fragment.

  • this is based on a set maximum mesh width that would still be acceptable.
  • added unit test on introduced static helper functions for ExportGraph_ToJobs.
  • added assert to make sure desired_level is never negative.
  • we check that conditions are met for resulting level inside getGridExtentsForGivenBoundingBox().
  • added extensive explanation.
  • Property mode set to 100644
File size: 4.8 KB
Line 
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
16#include <string>
17#include <vector>
18
19#include "Fragmentation/HydrogenSaturation_enum.hpp"
20#include "Fragmentation/Exporters/ExportGraph.hpp"
21#include "Fragmentation/Summation/SetValues/SamplingGridProperties.hpp"
22#include "LinearAlgebra/Vector.hpp"
23
24class ExportGraph_ToJobsTest;
25
26/** ExportGraph_ToJobs implements an ExportGraph by sending the created
27 * configurations of fragmentary systems as jobs to a server.
28 *
29 */
30class ExportGraph_ToJobs : public ExportGraph
31{
32 //!> grant unit test access
33 friend class ExportGraph_ToJobsTest;
34public:
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
42 * \param _globalsaturationpositions possibly empty map with global information
43 * where to place saturation hydrogens to fulfill consistency principle
44 */
45 ExportGraph_ToJobs(
46 const Graph &_graph,
47 const enum HydrogenTreatment _treatment,
48 const enum HydrogenSaturation _saturation,
49 const SaturatedFragment::GlobalSaturationPositions_t &_globalsaturationpositions);
50 virtual ~ExportGraph_ToJobs();
51
52 bool operator()();
53
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.
61 *
62 * \param _max_meshwidth maximum allowed mesh width.
63 */
64 void setMaximumMeshWidth(const double _max_meshwidth) { max_meshwidth = _max_meshwidth; }
65
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
75private:
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
123private:
124 //!> resolution of sampled electron density as \f$2^{\mathrm{level}}\f$
125 size_t level;
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;
130};
131
132#endif /* EXPORTGRAPH_TOJOBS_HPP_ */
Note: See TracBrowser for help on using the repository browser.