OpenMD 3.0
Molecular Dynamics in the Open
Loading...
Searching...
No Matches
ShapeBuilder.cpp
1/*
2 * Copyright (c) 2004-present, The University of Notre Dame. All rights
3 * reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
32 * research, please cite the appropriate papers when you publish your
33 * work. Good starting points are:
34 *
35 * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
36 * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
37 * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).
38 * [4] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
39 * [5] Kuang & Gezelter, Mol. Phys., 110, 691-701 (2012).
40 * [6] Lamichhane, Gezelter & Newman, J. Chem. Phys. 141, 134109 (2014).
41 * [7] Lamichhane, Newman & Gezelter, J. Chem. Phys. 141, 134110 (2014).
42 * [8] Bhattarai, Newman & Gezelter, Phys. Rev. B 99, 094106 (2019).
43 */
44#include "hydrodynamics/ShapeBuilder.hpp"
45
46#include "hydrodynamics/CompositeShape.hpp"
47#include "hydrodynamics/Ellipsoid.hpp"
48#include "hydrodynamics/Sphere.hpp"
49#include "types/GayBerneAdapter.hpp"
50#include "types/LennardJonesAdapter.hpp"
51
52namespace OpenMD {
53
54 Shape* ShapeBuilder::createShape(StuntDouble* sd) {
55 Shape* currShape = NULL;
56 if (sd->isDirectionalAtom()) {
57 currShape = internalCreateShape(static_cast<DirectionalAtom*>(sd));
58 } else if (sd->isAtom()) {
59 currShape = internalCreateShape(static_cast<Atom*>(sd));
60 } else if (sd->isRigidBody()) {
61 currShape = internalCreateShape(static_cast<RigidBody*>(sd));
62 }
63 return currShape;
64 }
65
66 Shape* ShapeBuilder::createShape(Molecule* mol) {
67 Molecule::IntegrableObjectIterator j;
68 StuntDouble* sd;
69
70 if (mol->getNAtoms() == 1) {
71 Shape* molShape = createShape(mol->getAtomAt(0));
72 return molShape;
73 } else {
74 CompositeShape* molShape = new CompositeShape();
75 for (sd = mol->beginIntegrableObject(j); sd != NULL;
76 sd = mol->nextIntegrableObject(j)) {
77 Shape* currShape = createShape(sd);
78 if (currShape != NULL) { molShape->addShape(currShape); }
79 }
80 molShape->setName(mol->getType());
81 return molShape;
82 }
83 return NULL;
84 }
85
86 Shape* ShapeBuilder::internalCreateShape(Atom* atom) {
87 AtomType* atomType = atom->getAtomType();
88 Shape* currShape = NULL;
89 LennardJonesAdapter lja = LennardJonesAdapter(atomType);
90 if (lja.isLennardJones()) {
91 currShape = new Sphere(atom->getPos(), lja.getSigma() / 2.0);
92 currShape->setName(atom->getType());
93 } else {
94 int obanum(0);
95 std::vector<AtomType*> atChain = atomType->allYourBase();
96 std::vector<AtomType*>::iterator i;
97 for (i = atChain.begin(); i != atChain.end(); ++i) {
98 obanum = etab.GetAtomicNum((*i)->getName().c_str());
99 if (obanum != 0) {
100 currShape = new Sphere(atom->getPos(), etab.GetVdwRad(obanum));
101 currShape->setName(atom->getType());
102 break;
103 }
104 }
105 if (obanum == 0) {
106 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
107 "Could not find atom type in default element.txt\n");
108 painCave.severity = OPENMD_ERROR;
109 painCave.isFatal = 1;
110 simError();
111 }
112 }
113 return currShape;
114 }
115
116 Shape* ShapeBuilder::internalCreateShape(DirectionalAtom* datom) {
117 AtomType* atomType = datom->getAtomType();
118 Shape* currShape = NULL;
119 LennardJonesAdapter lja = LennardJonesAdapter(atomType);
120 GayBerneAdapter gba = GayBerneAdapter(atomType);
121 if (gba.isGayBerne()) {
122 currShape = new Ellipsoid(datom->getPos(), gba.getL() / 2.0,
123 gba.getD() / 2.0, datom->getA());
124 } else if (lja.isLennardJones()) {
125 currShape = new Sphere(datom->getPos(), lja.getSigma() / 2.0);
126 } else {
127 int obanum = etab.GetAtomicNum((datom->getType()).c_str());
128 if (obanum != 0) {
129 currShape = new Sphere(datom->getPos(), etab.GetVdwRad(obanum));
130 } else {
131 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
132 "Could not find atom type in default element.txt\n");
133 painCave.severity = OPENMD_ERROR;
134 painCave.isFatal = 1;
135 simError();
136 }
137 }
138 currShape->setName(datom->getType());
139 return currShape;
140 }
141
142 Shape* ShapeBuilder::internalCreateShape(RigidBody* rb) {
143 std::vector<Atom*>::iterator ai;
144 CompositeShape* compositeShape = new CompositeShape;
145 Atom* atom;
146 for (atom = rb->beginAtom(ai); atom != NULL; atom = rb->nextAtom(ai)) {
147 Shape* currShape = NULL;
148 if (atom->isDirectionalAtom()) {
149 currShape = internalCreateShape(static_cast<DirectionalAtom*>(atom));
150 } else if (atom->isAtom()) {
151 currShape = internalCreateShape(static_cast<Atom*>(atom));
152 }
153 if (currShape != NULL) {
154 compositeShape->addShape(currShape);
155 compositeShape->setName(rb->getType());
156 }
157 }
158 return compositeShape;
159 }
160} // namespace OpenMD
RealType GetVdwRad(int atomicnum)
int GetAtomicNum(const char *str)
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.