ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/parallel/ForceMatrixDecomposition.cpp
Revision: 1539
Committed: Fri Jan 14 22:31:31 2011 UTC (14 years, 3 months ago) by gezelter
Original Path: branches/development/src/parallel/ForceDecomposition.cpp
File size: 5671 byte(s)
Log Message:
Starting a 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 Comm<I,RealType>(nAtoms);
54 AtomCommVectorI = new Comm<I,Vector3d>(nAtoms);
55 AtomCommMatrixI = new Comm<I,Mat3x3d>(nAtoms);
56
57 AtomCommRealJ = new Comm<J,RealType>(nAtoms);
58 AtomCommVectorJ = new Comm<J,Vector3d>(nAtoms);
59 AtomCommMatrixJ = new Comm<J,Mat3x3d>(nAtoms);
60
61 cgCommVectorI = new Comm<I,Vector3d>(nGroups);
62 cgCommVectorJ = new Comm<J,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 // gather up the atomic positions
107
108 if (snap->atomData.getStorageLayout() & DataStorage::dslDensity) {
109 AtomCommRealI->scatter(snap->atomIData.density,
110 snap->atomData.density);
111 std::vector<RealType> rho_tmp;
112 int n = snap->getNumberOfAtoms();
113 rho_tmp.reserve( n );
114 AtomCommRealJ->scatter(snap->atomJData.density, rho_tmp);
115 for (int i = 0; i < n; i++)
116 snap->atomData.density[i] += rho_tmp[i];
117 }
118 #endif
119 }
120
121 void ForceDecomposition::distributeIntermediateData() {
122 #ifdef IS_MPI
123 Snapshot* snap = sman_->getCurrentSnapshot();
124 if (snap->atomData.getStorageLayout() & DataStorage::dslFunctional) {
125 AtomCommRealI->gather(snap->atomData.functional,
126 snap->atomIData.functional);
127 AtomCommRealJ->gather(snap->atomData.functional,
128 snap->atomJData.functional);
129 }
130
131 if (snap->atomData.getStorageLayout() & DataStorage::dslFunctionalDerivative) {
132 AtomCommRealI->gather(snap->atomData.functionalDerivative,
133 snap->atomIData.functionalDerivative);
134 AtomCommRealJ->gather(snap->atomData.functionalDerivative,
135 snap->atomJData.functionalDerivative);
136 }
137 #endif
138 }
139
140
141 void ForceDecomposition::collectData() {
142 #ifdef IS_MPI
143 #endif
144 }
145
146 } //end namespace OpenMD