source: src/Filling/Generators/NodeGenerator.cpp@ 70f2a1

Action_Thermostats Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests AutomationFragmentation_failures Candidate_v1.6.1 ChemicalSpaceEvaluator Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph Fix_Verbose_Codepatterns ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion Gui_displays_atomic_force_velocity JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool PythonUI_with_named_parameters Recreated_GuiChecks StoppableMakroAction TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps
Last change on this file since 70f2a1 was 9eb71b3, checked in by Frederik Heber <frederik.heber@…>, 8 years ago

Commented out MemDebug include and Memory::ignore.

  • MemDebug clashes with various allocation operators that use a specific placement in memory. It is so far not possible to wrap new/delete fully. Hence, we stop this effort which so far has forced us to put ever more includes (with clashes) into MemDebug and thereby bloat compilation time.
  • MemDebug does not add that much usefulness which is not also provided by valgrind.
  • Property mode set to 100644
File size: 3.8 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2012 University of Bonn. All rights reserved.
5 *
6 *
7 * This file is part of MoleCuilder.
8 *
9 * MoleCuilder is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * MoleCuilder is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23/*
24 * NodeGenerator.cpp
25 *
26 *
27 * Created on: Jan 16, 2012
28 * Author: heber
29 */
30
31
32// include config.h
33#ifdef HAVE_CONFIG_H
34#include <config.h>
35#endif
36
37//#include "CodePatterns/MemDebug.hpp"
38
39#include "NodeGenerator.hpp"
40
41#include <cmath>
42#include <vector>
43
44#include "Shapes/Shape.hpp"
45#include "Shapes/ShapeOps.hpp"
46
47/** Constructor for NodeGenerator.
48 *
49 * @param _shape Shape which is to be filled with nodes
50 */
51NodeGenerator::NodeGenerator(const Shape &_shape) :
52 shape(_shape)
53{}
54
55/** Destructor for NodeGenerator.
56 *
57 */
58NodeGenerator::~NodeGenerator()
59{}
60
61/** Returns a set of points contained in the \a NodeGenerator::_shape
62 * with a homogeneous density.
63 *
64 * The central idea of the algorithm is to make use of the present function
65 * for obtaining homogeneously distributed points on all surfaces of
66 * presently implemented Shape's.
67 *
68 * The given \a _shape is shrinked such that eventually the volume is filled
69 * with points. Points filled in that actually reside outside the given
70 * Shape are eventually extracted as all are checked for inclusion.
71 *
72 * \note Although a certain density of points given as it has to be converted
73 * to an discrete regime this density can in general be matched only
74 * approximately.
75 *
76 * @param density desired density of points, the unit is the inverse of the
77 * required volume per point
78 * @return set of nodes
79 */
80NodeSet NodeGenerator::operator()(const double density)
81{
82 // calculate volume and surface of the given Shape
83 const double volume = shape.getVolume();
84 const double surface = shape.getSurfaceArea();
85
86 // calculate the number of shrinking operations
87 const double radius = shape.getRadius();
88 const double fraction = surface/volume;
89 const int factor = floor(radius * fraction);
90
91 // calculate correction for surface density due to discrete number of layers
92 const double surfaceDensity = volume/(double)factor;
93
94 // fill the shrinking vector
95 std::vector<double> shrinking_factors;
96 for(int f=0; f < factor; ++f)
97 shrinking_factors.push_back(radius*((double)f/(double)factor));
98
99 // go through the shrinking operations
100 NodeSet nodes;
101 for (std::vector<double>::const_iterator iter = shrinking_factors.begin();
102 iter != shrinking_factors.end(); ++iter) {
103 const Shape currentShape = resize(shape, *iter);
104 std::vector<Vector> pointsOnSurface =
105 currentShape.getHomogeneousPointsOnSurface(surfaceDensity);
106 nodes.insert(nodes.end(), pointsOnSurface.begin(), pointsOnSurface.end());
107 }
108
109 // check each point whether its inside the surface
110 return filterOutsidePoints(nodes);
111}
112
113/** Filters out all points that are not contained inside NodeGenerator::shape.
114 *
115 * @param nodes nodes to check
116 * @return subset of nodes that fulfill Shape::isInisde().
117 */
118NodeSet NodeGenerator::filterOutsidePoints(const NodeSet &nodes) const
119{
120 NodeSet return_nodes;
121 return_nodes.reserve(nodes.size());
122 for (NodeSet::const_iterator iter = nodes.begin(); iter != nodes.end(); ++iter) {
123 if (shape.isInside(*iter))
124 return_nodes.push_back(*iter);
125 }
126
127 return return_nodes;
128}
Note: See TracBrowser for help on using the repository browser.