ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/parallel/ForceMatrixDecomposition.cpp
Revision: 1540
Committed: Mon Jan 17 21:34:36 2011 UTC (14 years, 3 months ago) by gezelter
Original Path: branches/development/src/parallel/ForceDecomposition.cpp
File size: 6673 byte(s)
Log Message:
changes for new parallel architecture

File Contents

# Content
1 /*
2 * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3 *
4 * The University of Notre Dame grants you ("Licensee") a
5 * non-exclusive, royalty free, license to use, modify and
6 * redistribute this software in source and binary code form, provided
7 * that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the
15 * distribution.
16 *
17 * This software is provided "AS IS," without a warranty of any
18 * kind. All express or implied conditions, representations and
19 * warranties, including any implied warranty of merchantability,
20 * fitness for a particular purpose or non-infringement, are hereby
21 * excluded. The University of Notre Dame and its licensors shall not
22 * be liable for any damages suffered by licensee as a result of
23 * using, modifying or distributing the software or its
24 * derivatives. In no event will the University of Notre Dame or its
25 * licensors be liable for any lost revenue, profit or data, or for
26 * direct, indirect, special, consequential, incidental or punitive
27 * damages, however caused and regardless of the theory of liability,
28 * arising out of the use of or inability to use software, even if the
29 * University of Notre Dame has been advised of the possibility of
30 * such damages.
31 *
32 * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
33 * research, please cite the appropriate papers when you publish your
34 * work. Good starting points are:
35 *
36 * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
37 * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
38 * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).
39 * [4] Vardeman & Gezelter, in progress (2009).
40 */
41 #include "parallel/ForceDecomposition.hpp"
42 #include "parallel/Communicator.hpp"
43 #include "math/SquareMatrix3.hpp"
44
45 namespace OpenMD {
46
47 void ForceDecomposition::distributeInitialData() {
48 #ifdef IS_MPI
49
50 int nAtoms;
51 int nGroups;
52
53 AtomCommRealI = new Communicator<Row,RealType>(nAtoms);
54 AtomCommVectorI = new Communicator<Row,Vector3d>(nAtoms);
55 AtomCommMatrixI = new Communicator<Row,Mat3x3d>(nAtoms);
56
57 AtomCommRealJ = new Communicator<Column,RealType>(nAtoms);
58 AtomCommVectorJ = new Communicator<Column,Vector3d>(nAtoms);
59 AtomCommMatrixJ = new Communicator<Column,Mat3x3d>(nAtoms);
60
61 cgCommVectorI = new Communicator<Row,Vector3d>(nGroups);
62 cgCommVectorJ = new Communicator<Column,Vector3d>(nGroups);
63 // more to come
64 #endif
65 }
66
67
68
69 void ForceDecomposition::distributeData() {
70 #ifdef IS_MPI
71 Snapshot* snap = sman_->getCurrentSnapshot();
72
73 // gather up the atomic positions
74 AtomCommVectorI->gather(snap->atomData.position,
75 snap->atomIData.position);
76 AtomCommVectorJ->gather(snap->atomData.position,
77 snap->atomJData.position);
78
79 // gather up the cutoff group positions
80 cgCommVectorI->gather(snap->cgData.position,
81 snap->cgIData.position);
82 cgCommVectorJ->gather(snap->cgData.position,
83 snap->cgJData.position);
84
85 // if needed, gather the atomic rotation matrices
86 if (snap->atomData.getStorageLayout() & DataStorage::dslAmat) {
87 AtomCommMatrixI->gather(snap->atomData.aMat,
88 snap->atomIData.aMat);
89 AtomCommMatrixJ->gather(snap->atomData.aMat,
90 snap->atomJData.aMat);
91 }
92
93 // if needed, gather the atomic eletrostatic frames
94 if (snap->atomData.getStorageLayout() & DataStorage::dslElectroFrame) {
95 AtomCommMatrixI->gather(snap->atomData.electroFrame,
96 snap->atomIData.electroFrame);
97 AtomCommMatrixJ->gather(snap->atomData.electroFrame,
98 snap->atomJData.electroFrame);
99 }
100 #endif
101 }
102
103 void ForceDecomposition::collectIntermediateData() {
104 #ifdef IS_MPI
105 Snapshot* snap = sman_->getCurrentSnapshot();
106
107 if (snap->atomData.getStorageLayout() & DataStorage::dslDensity) {
108 AtomCommRealI->scatter(snap->atomIData.density,
109 snap->atomData.density);
110 std::vector<RealType> rho_tmp;
111 int n = snap->getNumberOfAtoms();
112 rho_tmp.reserve( n );
113 AtomCommRealJ->scatter(snap->atomJData.density, rho_tmp);
114 for (int i = 0; i < n; i++)
115 snap->atomData.density[i] += rho_tmp[i];
116 }
117 #endif
118 }
119
120 void ForceDecomposition::distributeIntermediateData() {
121 #ifdef IS_MPI
122 Snapshot* snap = sman_->getCurrentSnapshot();
123 if (snap->atomData.getStorageLayout() & DataStorage::dslFunctional) {
124 AtomCommRealI->gather(snap->atomData.functional,
125 snap->atomIData.functional);
126 AtomCommRealJ->gather(snap->atomData.functional,
127 snap->atomJData.functional);
128 }
129
130 if (snap->atomData.getStorageLayout() & DataStorage::dslFunctionalDerivative) {
131 AtomCommRealI->gather(snap->atomData.functionalDerivative,
132 snap->atomIData.functionalDerivative);
133 AtomCommRealJ->gather(snap->atomData.functionalDerivative,
134 snap->atomJData.functionalDerivative);
135 }
136 #endif
137 }
138
139
140 void ForceDecomposition::collectData() {
141 #ifdef IS_MPI
142 Snapshot* snap = sman_->getCurrentSnapshot();
143 int n = snap->getNumberOfAtoms();
144
145 std::vector<Vector3d> frc_tmp;
146 frc_tmp.reserve( n );
147
148 AtomCommVectorI->scatter(snap->atomIData.force, frc_tmp);
149 for (int i = 0; i < n; i++)
150 snap->atomData.force[i] += frc_tmp[i];
151
152 AtomCommVectorJ->scatter(snap->atomJData.force, frc_tmp);
153 for (int i = 0; i < n; i++)
154 snap->atomData.force[i] += frc_tmp[i];
155
156
157 if (snap->atomData.getStorageLayout() & DataStorage::dslTorque) {
158 std::vector<Vector3d> trq_tmp;
159 trq_tmp.reserve( n );
160
161 AtomCommVectorI->scatter(snap->atomIData.torque, trq_tmp);
162 for (int i = 0; i < n; i++)
163 snap->atomData.torque[i] += trq_tmp[i];
164
165 AtomCommVectorJ->scatter(snap->atomJData.torque, trq_tmp);
166 for (int i = 0; i < n; i++)
167 snap->atomData.torque[i] += trq_tmp[i];
168 }
169
170 // Still need pot!
171
172
173
174 #endif
175 }
176
177 } //end namespace OpenMD