source: ThirdParty/vmg/src/base/stencil.hpp@ 33a694

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests AutomationFragmentation_failures Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Docu_Python_wait EmpiricalPotential_contain_HomologyGraph_documentation Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes
Last change on this file since 33a694 was 7faa5c, checked in by Frederik Heber <heber@…>, 8 years ago

Merge commit 'de061d9d851257a04e924d4472df4523d33bb08b' as 'ThirdParty/vmg'

  • Property mode set to 100644
File size: 2.8 KB
Line 
1/*
2 * vmg - a versatile multigrid solver
3 * Copyright (C) 2012 Institute for Numerical Simulation, University of Bonn
4 *
5 * vmg is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * vmg is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19/**
20 * @file stencil.hpp
21 * @author Julian Iseringhausen <isering@ins.uni-bonn.de>
22 * @date Mon Apr 18 12:25:05 2011
23 *
24 * @brief VMG::Stencil
25 *
26 */
27
28#ifndef STENCIL_HPP_
29#define STENCIL_HPP_
30
31#include <cstddef>
32#include <vector>
33
34#include "grid/grid.hpp"
35#include "base/index.hpp"
36
37namespace VMG
38{
39
40class Displacement
41{
42public:
43 Displacement() :
44 disp(0),
45 val(0.0)
46 {}
47
48 Displacement(const Index& disp_, const vmg_float& val_) :
49 disp(disp_),
50 val(val_)
51 {}
52
53 const Index& Disp() const {return disp;}
54 const vmg_float& Val() const {return val;}
55
56private:
57 Index disp;
58 vmg_float val;
59};
60
61class Stencil
62{
63public:
64 typedef std::vector<Displacement>::const_iterator iterator;
65
66 Stencil(const vmg_float& diag_) :
67 diag(diag_)
68 {}
69
70 Stencil(const Stencil& stencil_)
71 {
72 this->diag = stencil_.GetDiag();
73
74 for (Stencil::iterator iter=stencil_.begin(); iter!=stencil_.end(); iter++)
75 this->push_back(*iter);
76 }
77
78 const vmg_float& GetDiag() const {return diag;}
79 void SetDiag(const vmg_float& diag_) {diag = diag_;}
80
81 const Displacement& operator[](const int& index) const {return disp[index];}
82
83 void push_back(const int& x, const int& y, const int& z, const vmg_float& val)
84 {
85 disp.push_back(Displacement(Index(x,y,z), val));
86 }
87
88 void push_back(const Displacement& displacement)
89 {
90 disp.push_back(displacement);
91 }
92
93 iterator begin() const
94 {
95 return disp.begin();
96 }
97
98 iterator end() const
99 {
100 return disp.end();
101 }
102
103 size_t size() const
104 {
105 return disp.size();
106 }
107
108 void clear()
109 {
110 disp.clear();
111 }
112
113 vmg_float Apply(const Grid& grid, const Index& index) const
114 {
115 vmg_float result = diag * grid.GetVal(index);
116 for (Stencil::iterator iter=disp.begin(); iter!=disp.end(); ++iter)
117 result += iter->Val() * grid.GetVal(index.X() + iter->Disp().X(),
118 index.Y() + iter->Disp().Y(),
119 index.Z() + iter->Disp().Z());
120 return result;
121 }
122
123 void Apply(Grid& grid) const;
124
125private:
126 std::vector<Displacement> disp;
127 vmg_float diag;
128};
129
130}
131
132#endif /* STENCIL_HPP_ */
Note: See TracBrowser for help on using the repository browser.