Merge lp:~jonmcc/esys-particle/remote-force-periodicity into lp:~llaniewski/esys-particle/remote-force

Proposed by Jon McCullough
Status: Merged
Merged at revision: 1190
Proposed branch: lp:~jonmcc/esys-particle/remote-force-periodicity
Merge into: lp:~llaniewski/esys-particle/remote-force
Diff against target: 1351 lines (+450/-91)
35 files modified
Geometry/CircularNeighbourTable.h (+4/-0)
Geometry/CircularNeighbourTable.hpp (+117/-34)
Geometry/FaultedBlock2d.cpp (+4/-0)
Geometry/GougeBlock3D.cpp (+4/-1)
Geometry/GougeConfig.hpp (+4/-1)
Geometry/SimpleNTable.cpp (+17/-0)
Geometry/SimpleNTable3D.cpp (+32/-1)
Geometry/SphAggGougeBlock.cpp (+4/-1)
Geometry/SplitBlock3D.cpp (+4/-0)
Model/Particle.cpp (+24/-8)
Model/Particle.h (+8/-3)
Model/RotParticle.cpp (+16/-7)
Model/RotParticle.h (+12/-4)
Model/RotParticleVi.cpp (+6/-4)
Model/RotParticleVi.h (+3/-1)
Model/RotThermParticle.cpp (+3/-2)
Model/RotThermParticle.h (+2/-1)
Parallel/ASubLattice.h (+1/-0)
Parallel/LatticeMaster.cpp (+16/-0)
Parallel/LatticeMaster.h (+1/-0)
Parallel/SubLattice.h (+1/-0)
Parallel/SubLattice.hpp (+28/-4)
Parallel/SubLatticeControler.cpp (+1/-0)
Parallel/sublattice_cmd.h (+1/-1)
Python/esys/lsm/LsmMpiPy.cpp (+17/-0)
Python/esys/lsm/LsmMpiPy.h (+1/-0)
Python/esys/lsm/ParticlePy.cpp (+1/-1)
Python/esys/lsm/RotParticlePy.cpp (+1/-1)
Python/esys/lsm/RotParticleViPy.cpp (+1/-1)
Python/esys/lsm/RotThermalParticlePy.cpp (+1/-1)
Tools/dump2vtk/frame_vtk.cpp (+20/-0)
ppa/src/pp_array.h (+1/-1)
ppa/src/pp_array.hpp (+92/-11)
tml/comm/cart_comm.hpp (+1/-1)
tml/comm/comm.hpp (+1/-1)
To merge this branch: bzr merge lp:~jonmcc/esys-particle/remote-force-periodicity
Reviewer Review Type Date Requested Status
Łukasz Łaniewski-Wołłk Pending
Review via email: mp+359569@code.launchpad.net

Commit message

Hopeful merge of Jon's and Lukasz's esys-particle codes for coupling with TCLB

Description of the change

- Introduction of full periodicity to esys in the remote force periodicity framework.
- should ensure it works when periodicity is not required. Anecdotally this works but I am skeptical.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'Geometry/CircularNeighbourTable.h'
--- Geometry/CircularNeighbourTable.h 2017-01-04 08:26:43 +0000
+++ Geometry/CircularNeighbourTable.h 2018-11-27 02:58:52 +0000
@@ -109,6 +109,10 @@
109 ParticleSet m_clonedParticleSet;109 ParticleSet m_clonedParticleSet;
110 int m_circGridWidth;110 int m_circGridWidth;
111 int m_periodicDimIndex;111 int m_periodicDimIndex;
112
113 //JM
114 int m_periodicDimList[3];// = {-1,-1,-1};
115 int m_circGridList[3];// = {0,0,0};
112 };116 };
113 }117 }
114}118}
115119
=== modified file 'Geometry/CircularNeighbourTable.hpp'
--- Geometry/CircularNeighbourTable.hpp 2017-01-04 08:26:43 +0000
+++ Geometry/CircularNeighbourTable.hpp 2018-11-27 02:58:52 +0000
@@ -48,6 +48,21 @@
48 circBorderWidth = this->getGridSpacing();48 circBorderWidth = this->getGridSpacing();
49 }49 }
50 setCircularBorderWidth(circBorderWidth, this->getGridSpacing());50 setCircularBorderWidth(circBorderWidth, this->getGridSpacing());
51
52 //JM
53 for (int i = 0; i < 3; i++) {
54 double checkcircBorderWidth =
55 min(
56 (bBox.getSizes()[i]),
57 circBorderWidth
58 );
59
60 m_circGridList[i] = int(ceil(checkcircBorderWidth/gridSpacing));
61 //m_circGridList[i] = m_circGridWidth;
62 }
63
64 //JM
65 cerr << "init1 circGridlist = " << m_circGridList[0] << "," << m_circGridList[1] << "," << m_circGridList[2] << endl;
51 }66 }
5267
53 template <class TmplParticle>68 template <class TmplParticle>
@@ -70,6 +85,14 @@
70 circBorderWidth = this->getGridSpacing();85 circBorderWidth = this->getGridSpacing();
71 }86 }
72 setCircularBorderWidth(circBorderWidth, this->getGridSpacing());87 setCircularBorderWidth(circBorderWidth, this->getGridSpacing());
88
89 //JM
90 for (int i = 0; i < 3; i++) {
91 m_circGridList[i] = m_circGridWidth;
92 }
93
94 //JM
95 cerr << "init2 circGridlist = " << m_circGridList[0] << "," << m_circGridList[1] << "," << m_circGridList[2] << endl;
73 }96 }
7497
75 template <class TmplParticle>98 template <class TmplParticle>
@@ -86,20 +109,26 @@
86 }109 }
87 int numPeriodic = 0;110 int numPeriodic = 0;
88 for (int i = 0; i < 3; i++) {111 for (int i = 0; i < 3; i++) {
112 m_periodicDimList[i] = -1;
89 if (m_periodicDimensions[i])113 if (m_periodicDimensions[i])
90 {114 {
91 m_periodicDimIndex = i;115 m_periodicDimIndex = i; // JM need to select multiple indices here
92 numPeriodic++;116 numPeriodic++;
117
118 //JM
119 m_periodicDimList[i] = i;
93 }120 }
94 }121 }
95122 cerr << "dimlist = " << m_periodicDimList[0] << "," << m_periodicDimList[1] << "," << m_periodicDimList[2] << endl;
123
96 if (numPeriodic > 1) {124 if (numPeriodic > 1) {
97 std::stringstream msg;125 std::stringstream msg;
98 msg126 msg
99 << "CircularNeighbourTable::CircularNeighbourTable -"127 << "CircularNeighbourTable::CircularNeighbourTable -"
100 << " only a single dimension may be periodic.";128 << " only a single dimension may be periodic.";
101 throw std::runtime_error(msg.str());129 //throw std::runtime_error(msg.str());
102 }130 }
131
103 }132 }
104133
105 template <class TmplParticle>134 template <class TmplParticle>
@@ -133,13 +162,30 @@
133 {162 {
134 if (havePeriodicDimensions())163 if (havePeriodicDimensions())
135 {164 {
136 circBorderWidth =165 //JM repeat for each periodic direction
166 /* circBorderWidth =
137 min(167 min(
138 (bBox.getSizes()[m_periodicDimIndex])/2.0,168 (bBox.getSizes()[m_periodicDimIndex])/2.0,
139 circBorderWidth169 circBorderWidth
140 );170 ); */
171 // end loop
172
173 for (int i = 0; i < 3; i++) {
174 if (m_periodicDimList[i] != -1) {
175 circBorderWidth =
176 min(
177 (bBox.getSizes()[m_periodicDimList[i]])/2.0,
178 circBorderWidth
179 );
180
181 m_circGridList[i] = int(ceil(circBorderWidth/gridSpacing)); //JM direct use of setCircularBorderWidth(circBorderWidth, gridSpacing);
182 }
183 }
184 }
185 else { //JM
186 setCircularBorderWidth(circBorderWidth, gridSpacing); //JM now included in loop above when periodic in place.
141 }187 }
142 setCircularBorderWidth(circBorderWidth, gridSpacing);188 //JM setCircularBorderWidth(circBorderWidth, gridSpacing);
143 ParticleVector particles = getNonClonedParticles();189 ParticleVector particles = getNonClonedParticles();
144 clearClonedParticles();190 clearClonedParticles();
145 this->clearAndRecomputeGrid(bBox, gridSpacing);191 this->clearAndRecomputeGrid(bBox, gridSpacing);
@@ -151,6 +197,9 @@
151 {197 {
152 this->insert(*it);198 this->insert(*it);
153 }199 }
200
201 //JM
202 cerr << "Resize circGridlist = " << m_circGridList[0] << "," << m_circGridList[1] << "," << m_circGridList[2] << endl;
154 }203 }
155204
156 template <class TmplParticle>205 template <class TmplParticle>
@@ -189,33 +238,45 @@
189 havePeriodicDimensions()238 havePeriodicDimensions()
190 )239 )
191 {240 {
192 const int &dimIdx = m_periodicDimIndex;241
193 if (242 Vec3 moddedPosn = posn;
194 (posn[dimIdx] < this->getBBox().getMinPt()[dimIdx])243
195 ||244 for (int i = 0; i < 3; i++) {
196 (posn[dimIdx] > this->getBBox().getMaxPt()[dimIdx])245 if (m_periodicDimList[i] != -1) {
197 )246
198 {247 //JM repeat this loop over each periodic direction
199 Vec3 moddedPosn = posn;248 //const int &dimIdx = m_periodicDimIndex;
200 const double dimSize = this->getBBox().getSizes()[dimIdx];249 const int &dimIdx = m_periodicDimList[i];
201 moddedPosn[dimIdx] -= this->getBBox().getMinPt()[dimIdx];250
202 moddedPosn[dimIdx] =251 if (
203 (moddedPosn[dimIdx] > 0.0)252 (posn[dimIdx] < this->getBBox().getMinPt()[dimIdx])
204 ?253 ||
205 (254 (posn[dimIdx] > this->getBBox().getMaxPt()[dimIdx])
206 this->getBBox().getMinPt()[dimIdx]255 )
207 +256 {
208 moddedPosn[dimIdx] - (floor(moddedPosn[dimIdx]/dimSize)*dimSize)257 //Vec3 moddedPosn = posn;
209 )258 const double dimSize = this->getBBox().getSizes()[dimIdx];
210 :259 moddedPosn[dimIdx] -= this->getBBox().getMinPt()[dimIdx];
211 (260 moddedPosn[dimIdx] =
212 this->getBBox().getMaxPt()[dimIdx]261 (moddedPosn[dimIdx] > 0.0)
213 -262 ?
214 (fabs(moddedPosn[dimIdx]) - (floor(fabs(moddedPosn[dimIdx])/dimSize)*dimSize))263 (
215 );264 this->getBBox().getMinPt()[dimIdx]
216265 +
217 return moddedPosn;266 moddedPosn[dimIdx] - (floor(moddedPosn[dimIdx]/dimSize)*dimSize)
218 }267 )
268 :
269 (
270 this->getBBox().getMaxPt()[dimIdx]
271 -
272 (fabs(moddedPosn[dimIdx]) - (floor(fabs(moddedPosn[dimIdx])/dimSize)*dimSize))
273 );
274 }
275 }
276 }
277 //JM end periodic repeat here
278 return moddedPosn;
279 //}
219 }280 }
220 return posn;281 return posn;
221 }282 }
@@ -223,6 +284,9 @@
223 template <class TmplParticle>284 template <class TmplParticle>
224 void CircularNeighbourTable<TmplParticle>::insert(Particle *pParticle)285 void CircularNeighbourTable<TmplParticle>::insert(Particle *pParticle)
225 {286 {
287 //JM
288 //cerr << "insert circGridlist = " << m_circGridList[0] << "," << m_circGridList[1] << "," << m_circGridList[2] << endl;
289
226 pParticle->moveTo(getModdedPosn(pParticle->getPos()));290 pParticle->moveTo(getModdedPosn(pParticle->getPos()));
227 const Vec3L minIdx = this->getVecIndex(pParticle->getPos() - pParticle->getRad());291 const Vec3L minIdx = this->getVecIndex(pParticle->getPos() - pParticle->getRad());
228 const Vec3L maxIdx = this->getVecIndex(pParticle->getPos() + pParticle->getRad());292 const Vec3L maxIdx = this->getVecIndex(pParticle->getPos() + pParticle->getRad());
@@ -230,6 +294,7 @@
230 this->insertInTable(pParticle, minIdx, maxIdx);294 this->insertInTable(pParticle, minIdx, maxIdx);
231 this->addInserted(pParticle);295 this->addInserted(pParticle);
232296
297 //original
233 if (havePeriodicDimensions())298 if (havePeriodicDimensions())
234 {299 {
235 for (int dimIdx = 0; dimIdx < 3; dimIdx++) {300 for (int dimIdx = 0; dimIdx < 3; dimIdx++) {
@@ -247,6 +312,24 @@
247 }312 }
248 }313 }
249 }314 }
315
316 /* //modified
317 if (havePeriodicDimensions())
318 {
319 Vec3 shift = Vec3::ZERO;
320 for (int dimIdx = 0; dimIdx < 3; dimIdx++) {
321 if (m_periodicDimensions[dimIdx]) {
322 if (minIdx[dimIdx] < (this->getMinVecIndex()[dimIdx] + m_circGridList[dimIdx])) { //JM
323 shift[dimIdx] = this->getBBox().getSizes()[dimIdx];
324 }
325 if (maxIdx[dimIdx] > (this->getMaxVecIndex()[dimIdx] - m_circGridList[dimIdx])) { //JM
326 shift[dimIdx] = -1.0d*this->getBBox().getSizes()[dimIdx];
327 }
328 }
329 }
330 this->insertClone(pParticle, pParticle->getPos() + shift);
331 }
332 */
250 }333 }
251334
252 template <class TmplParticle>335 template <class TmplParticle>
253336
=== modified file 'Geometry/FaultedBlock2d.cpp'
--- Geometry/FaultedBlock2d.cpp 2017-01-04 08:26:43 +0000
+++ Geometry/FaultedBlock2d.cpp 2018-11-27 02:58:52 +0000
@@ -29,6 +29,10 @@
29 \param rmax maximum particle radius29 \param rmax maximum particle radius
30 \param pad thickness of the padding region at each diving edge30 \param pad thickness of the padding region at each diving edge
31 \param circ_x circular boudary condition in x-direction31 \param circ_x circular boudary condition in x-direction
32
33 JM
34 \param circ_y circular or open boundary conditions in y-direction
35 \param circ_z circular or open boundary conditions in z-direction
32*/36*/
33FaultedBlock2D::FaultedBlock2D(double xmin,double xmax,double ymin,double ymax,double rmin,double rmax,double pad,bool circ_x) :37FaultedBlock2D::FaultedBlock2D(double xmin,double xmax,double ymin,double ymax,double rmin,double rmax,double pad,bool circ_x) :
34 CRandomBlock2D(xmin,xmax,ymin,ymax,rmin,rmax,circ_x)38 CRandomBlock2D(xmin,xmax,ymin,ymax,rmin,rmax,circ_x)
3539
=== modified file 'Geometry/GougeBlock3D.cpp'
--- Geometry/GougeBlock3D.cpp 2017-01-04 08:26:43 +0000
+++ Geometry/GougeBlock3D.cpp 2018-11-27 02:58:52 +0000
@@ -454,7 +454,10 @@
454 m_prms.getPeriodicDimensions()[2] ? 1 : 0454 m_prms.getPeriodicDimensions()[2] ? 1 : 0
455 )*m_prms.getMaxRadius();455 )*m_prms.getMaxRadius();
456 if (m_prms.getBBox().getSizes().Z() >= 4*m_prms.getMaxRadius()) {456 if (m_prms.getBBox().getSizes().Z() >= 4*m_prms.getMaxRadius()) {
457 ntableAdjust += Vec3(m_prms.getMaxRadius(), 0, 0);457 //ntableAdjust += Vec3(m_prms.getMaxRadius(), 0, 0);
458
459 //JM For y/z circular bounds
460 ntableAdjust += Vec3(m_prms.getMaxRadius(), m_prms.getMaxRadius(), m_prms.getMaxRadius());
458 }461 }
459 const BoundingBox nTableBBox(bBox.getMinPt(), bBox.getMaxPt() - ntableAdjust);462 const BoundingBox nTableBBox(bBox.getMinPt(), bBox.getMaxPt() - ntableAdjust);
460 m_nTablePtr =463 m_nTablePtr =
461464
=== modified file 'Geometry/GougeConfig.hpp'
--- Geometry/GougeConfig.hpp 2017-01-04 08:26:43 +0000
+++ Geometry/GougeConfig.hpp 2018-11-27 02:58:52 +0000
@@ -652,7 +652,10 @@
652 m_prms.getPeriodicDimensions()[2] ? 1 : 0652 m_prms.getPeriodicDimensions()[2] ? 1 : 0
653 )*m_prms.getMaxRadius();653 )*m_prms.getMaxRadius();
654 if (m_prms.getBBox().getSizes().Z() >= 4*m_prms.getMaxRadius()) {654 if (m_prms.getBBox().getSizes().Z() >= 4*m_prms.getMaxRadius()) {
655 ntableAdjust += Vec3(m_prms.getMaxRadius(), 0, 0);655 //ntableAdjust += Vec3(m_prms.getMaxRadius(), 0, 0);
656
657 //JM For y/z circular bounds
658 ntableAdjust += Vec3(m_prms.getMaxRadius(), m_prms.getMaxRadius(), m_prms.getMaxRadius());
656 }659 }
657 const BoundingBox nTableBBox(bBox.getMinPt(), bBox.getMaxPt() - ntableAdjust);660 const BoundingBox nTableBBox(bBox.getMinPt(), bBox.getMaxPt() - ntableAdjust);
658 m_nTablePtr =661 m_nTablePtr =
659662
=== modified file 'Geometry/SimpleNTable.cpp'
--- Geometry/SimpleNTable.cpp 2017-01-04 08:26:43 +0000
+++ Geometry/SimpleNTable.cpp 2018-11-27 02:58:52 +0000
@@ -142,6 +142,23 @@
142 }142 }
143 }143 }
144 }144 }
145
146 // JM Circular y bound addition
147 if(m_ycirc){
148 if (int((cbp.getPos().Y()-m_p0.Y())/m_dim)==1) {
149 cbp.moveTo(cbp.getPos()+m_yshift);
150 const vector<int> idy=allidx(cbp.getPos());
151 for(vector<int>::const_iterator citer=idy.begin();citer!=idy.end();citer++){
152 m_data[*citer].push_back(cbp);
153 }
154 } else if (int((cbp.getPos().Y()-m_p0.Y())/m_dim)==m_ysize-2) {
155 cbp.moveTo(cbp.getPos()-m_yshift);
156 const vector<int> idy=allidx(cbp.getPos());
157 for(vector<int>::const_iterator citer=idy.begin();citer!=idy.end();citer++){
158 m_data[*citer].push_back(cbp);
159 }
160 }
161 }
145}162}
146163
147/*!164/*!
148165
=== modified file 'Geometry/SimpleNTable3D.cpp'
--- Geometry/SimpleNTable3D.cpp 2017-01-04 08:26:43 +0000
+++ Geometry/SimpleNTable3D.cpp 2018-11-27 02:58:52 +0000
@@ -152,6 +152,37 @@
152 }152 }
153 }153 }
154 }154 }
155 // JM Circular y/z bound addition
156 if(m_ycirc){
157 if (int((cbp.getPos().Y()-m_p0.Y())/m_dim)==1) {
158 cbp.moveTo(cbp.getPos()+m_yshift);
159 const vector<int> idy=allidx(cbp.getPos());
160 for(vector<int>::const_iterator citer=idy.begin();citer!=idy.end();citer++){
161 m_data[*citer].push_back(cbp);
162 }
163 } else if (int((cbp.getPos().Y()-m_p0.Y())/m_dim)==m_ysize-2) {
164 cbp.moveTo(cbp.getPos()-m_yshift);
165 const vector<int> idy=allidx(cbp.getPos());
166 for(vector<int>::const_iterator citer=idy.begin();citer!=idy.end();citer++){
167 m_data[*citer].push_back(cbp);
168 }
169 }
170 }
171 if(m_zcirc){
172 if (int((cbp.getPos().Z()-m_p0.Z())/m_dim)==1) {
173 cbp.moveTo(cbp.getPos()+m_zshift);
174 const vector<int> idz=allidx(cbp.getPos());
175 for(vector<int>::const_iterator citer=idz.begin();citer!=idz.end();citer++){
176 m_data[*citer].push_back(cbp);
177 }
178 } else if (int((cbp.getPos().Z()-m_p0.Z())/m_dim)==m_zsize-2) {
179 cbp.moveTo(cbp.getPos()-m_zshift);
180 const vector<int> idz=allidx(cbp.getPos());
181 for(vector<int>::const_iterator citer=idz.begin();citer!=idz.end();citer++){
182 m_data[*citer].push_back(cbp);
183 }
184 }
185 }
155}186}
156187
157188
@@ -187,7 +218,7 @@
187 if (m_zcirc) {218 if (m_zcirc) {
188 m_zsize+=2;219 m_zsize+=2;
189 m_p0-=Vec3(0.0,0.0,r);220 m_p0-=Vec3(0.0,0.0,r);
190 m_yshift=Vec3(0.0,0.0,dim.Z());221 m_zshift=Vec3(0.0,0.0,dim.Z());
191 }222 }
192 //cout << "NT size : " << m_xsize << " , " << m_ysize << " , " << m_zsize << endl;223 //cout << "NT size : " << m_xsize << " , " << m_ysize << " , " << m_zsize << endl;
193 m_data=new vector<SimpleParticle>[m_xsize*m_ysize*m_zsize];224 m_data=new vector<SimpleParticle>[m_xsize*m_ysize*m_zsize];
194225
=== modified file 'Geometry/SphAggGougeBlock.cpp'
--- Geometry/SphAggGougeBlock.cpp 2017-01-04 08:26:43 +0000
+++ Geometry/SphAggGougeBlock.cpp 2018-11-27 02:58:52 +0000
@@ -162,7 +162,10 @@
162 const BoundingBox bBox = m_prms.getBBox();162 const BoundingBox bBox = m_prms.getBBox();
163 Vec3 ntableAdjust = Vec3(0.0,0.0,0.0);163 Vec3 ntableAdjust = Vec3(0.0,0.0,0.0);
164 if (m_prms.getBBox().getSizes().Z() >= 4*m_prms.getMaxRadius()) {164 if (m_prms.getBBox().getSizes().Z() >= 4*m_prms.getMaxRadius()) {
165 ntableAdjust += Vec3(m_prms.getMaxRadius(), 0, 0);165 //ntableAdjust += Vec3(m_prms.getMaxRadius(), 0, 0);
166
167 //JM For y/z circular bounds
168 ntableAdjust += Vec3(m_prms.getMaxRadius(), m_prms.getMaxRadius(), m_prms.getMaxRadius());
166 }169 }
167 const BoundingBox nTableBBox(bBox.getMinPt(), bBox.getMaxPt() - ntableAdjust);170 const BoundingBox nTableBBox(bBox.getMinPt(), bBox.getMaxPt() - ntableAdjust);
168 m_nTablePtr2 =171 m_nTablePtr2 =
169172
=== modified file 'Geometry/SplitBlock3D.cpp'
--- Geometry/SplitBlock3D.cpp 2017-01-04 08:26:43 +0000
+++ Geometry/SplitBlock3D.cpp 2018-11-27 02:58:52 +0000
@@ -27,6 +27,10 @@
27 \param ysplit the position of the split plane 27 \param ysplit the position of the split plane
28 \param dir the direction of the split plane (2=y,3=z)28 \param dir the direction of the split plane (2=y,3=z)
29 \param circ_x circular or open boundary conditions in x-direction29 \param circ_x circular or open boundary conditions in x-direction
30
31 JM
32 \param circ_y circular or open boundary conditions in y-direction
33 \param circ_z circular or open boundary conditions in z-direction
30*/34*/
31CSplitBlock3D::CSplitBlock3D(double xmin,double xmax,double ymin,double ymax,double zmin,double zmax,double rmin,double rmax,double ysplit,int dir, bool circ_x,bool rough):CRandomBlock3D(xmin,xmax,ymin,ymax,zmin,zmax,rmin,rmax,1.05,circ_x)35CSplitBlock3D::CSplitBlock3D(double xmin,double xmax,double ymin,double ymax,double zmin,double zmax,double rmin,double rmax,double ysplit,int dir, bool circ_x,bool rough):CRandomBlock3D(xmin,xmax,ymin,ymax,zmin,zmax,rmin,rmax,1.05,circ_x)
32{36{
3337
=== modified file 'Model/Particle.cpp'
--- Model/Particle.cpp 2017-01-04 08:26:43 +0000
+++ Model/Particle.cpp 2018-11-27 02:58:52 +0000
@@ -34,7 +34,8 @@
34 m_mass(0.0),34 m_mass(0.0),
35 m_div_mass(0.0),35 m_div_mass(0.0),
36 flag(false),36 flag(false),
37 m_is_dynamic(true)37 m_is_dynamic(true),
38 m_is_acc(true)
38{39{
39}40}
4041
@@ -49,7 +50,8 @@
49 m_mass(data.getMass()),50 m_mass(data.getMass()),
50 m_div_mass((data.getMass() != 0) ? 1.0/data.getMass() : 0.0),51 m_div_mass((data.getMass() != 0) ? 1.0/data.getMass() : 0.0),
51 flag(false),52 flag(false),
52 m_is_dynamic(true) //! SimpleParticleData has no is_dynamic info -> default to true 53 m_is_dynamic(true), //! SimpleParticleData has no is_dynamic info -> default to true
54 m_is_acc(true) //! SimpleParticleData has no is_dynamic info -> default to true
53{55{
54}56}
5557
@@ -63,7 +65,7 @@
63 \param force currently applied force65 \param force currently applied force
64 \param id particle id66 \param id particle id
65*/67*/
66CParticle::CParticle(double rad,double mass,const Vec3& pos,const Vec3& vel,const Vec3& force,int id,bool is_dyn) : CBasicParticle(pos,rad)68CParticle::CParticle(double rad,double mass,const Vec3& pos,const Vec3& vel,const Vec3& force,int id,bool is_dyn,bool is_acc) : CBasicParticle(pos,rad)
67{69{
68 m_oldpos=pos;70 m_oldpos=pos;
69 m_initpos=pos;71 m_initpos=pos;
@@ -79,9 +81,10 @@
79 m_circular_shift = zeroVec3;81 m_circular_shift = zeroVec3;
80 flag=false;82 flag=false;
81 m_is_dynamic=is_dyn;83 m_is_dynamic=is_dyn;
84 m_is_acc=is_acc;
82}85}
8386
84CParticle::CParticle(double rad,double mass,const Vec3& pos,const Vec3& oldpos,const Vec3& initpos,const Vec3& vel,const Vec3& force,int id,bool is_dyn) : CBasicParticle(pos,rad)87CParticle::CParticle(double rad,double mass,const Vec3& pos,const Vec3& oldpos,const Vec3& initpos,const Vec3& vel,const Vec3& force,int id,bool is_dyn,bool is_acc) : CBasicParticle(pos,rad)
85{88{
86 m_oldpos=oldpos;89 m_oldpos=oldpos;
87 m_initpos=initpos;90 m_initpos=initpos;
@@ -97,6 +100,7 @@
97 m_circular_shift = zeroVec3;100 m_circular_shift = zeroVec3;
98 flag=false;101 flag=false;
99 m_is_dynamic=is_dyn;102 m_is_dynamic=is_dyn;
103 m_is_acc=is_acc;
100}104}
101105
102/*!106/*!
@@ -211,6 +215,7 @@
211 append(p.m_rad);215 append(p.m_rad);
212 append(p.m_mass);216 append(p.m_mass);
213 append(p.m_is_dynamic);217 append(p.m_is_dynamic);
218 append(p.m_is_acc);
214}219}
215220
216/*!221/*!
@@ -240,6 +245,7 @@
240 p.m_div_mass=0.0;245 p.m_div_mass=0.0;
241 }246 }
242 p.m_is_dynamic=pop_bool();247 p.m_is_dynamic=pop_bool();
248 p.m_is_acc=pop_bool();
243}249}
244250
245/*!251/*!
@@ -253,6 +259,9 @@
253 if (getDo2dCalculations()) {259 if (getDo2dCalculations()) {
254 m_force = Vec3(m_force.X(), m_force.Y(), 0);260 m_force = Vec3(m_force.X(), m_force.Y(), 0);
255 }261 }
262 if (!m_is_acc) {
263 m_force = Vec3(0.0,0.0,0.0);
264 }
256#if 1265#if 1
257 // 1st order scheme, 13 Flops266 // 1st order scheme, 13 Flops
258 m_vel+=m_force*m_div_mass*dt; // 7 Flops 267 m_vel+=m_force*m_div_mass*dt; // 7 Flops
@@ -303,7 +312,8 @@
303 m_initpos - m_circular_shift,312 m_initpos - m_circular_shift,
304 m_oldpos - m_circular_shift,313 m_oldpos - m_circular_shift,
305 m_vel,314 m_vel,
306 m_is_dynamic315 m_is_dynamic,
316 m_is_acc
307 );317 );
308}318}
309319
@@ -319,6 +329,7 @@
319 m_oldpos = E.m_oldPos + m_circular_shift;329 m_oldpos = E.m_oldPos + m_circular_shift;
320 m_vel = E.m_vel;330 m_vel = E.m_vel;
321 m_is_dynamic = E.m_is_dynamic;331 m_is_dynamic = E.m_is_dynamic;
332 m_is_acc = E.m_is_acc;
322}333}
323334
324/*!335/*!
@@ -355,6 +366,7 @@
355 append(p.m_vel.Y());366 append(p.m_vel.Y());
356 append(p.m_vel.Z());367 append(p.m_vel.Z());
357 append(p.m_is_dynamic);368 append(p.m_is_dynamic);
369 append(p.m_is_acc);
358}370}
359371
360/*!372/*!
@@ -372,6 +384,7 @@
372 p.m_oldPos = Vec3(db[6], db[7], db[8]);384 p.m_oldPos = Vec3(db[6], db[7], db[8]);
373 p.m_vel = Vec3(db[9], db[10], db[11]);385 p.m_vel = Vec3(db[9], db[10], db[11]);
374 p.m_is_dynamic=pop_bool();386 p.m_is_dynamic=pop_bool();
387 p.m_is_acc=pop_bool();
375}388}
376389
377390
@@ -448,7 +461,8 @@
448 << getVel() << delim // 13,14,15461 << getVel() << delim // 13,14,15
449 << getForce() << delim // 16,17,18462 << getForce() << delim // 16,17,18
450 << m_circular_shift << delim // 19,20,21463 << m_circular_shift << delim // 19,20,21
451 << m_is_dynamic;464 << m_is_dynamic << delim
465 << m_is_acc;
452}466}
453467
454/*!468/*!
@@ -467,6 +481,7 @@
467 int id;481 int id;
468 int tag;482 int tag;
469 bool is_dyn;483 bool is_dyn;
484 bool is_acc;
470485
471 iStream486 iStream
472 >> pos487 >> pos
@@ -479,7 +494,8 @@
479 >> vel494 >> vel
480 >> force495 >> force
481 >> circular_shift496 >> circular_shift
482 >> is_dyn;497 >> is_dyn
498 >> is_acc;
483499
484 CParticle 500 CParticle
485 particle501 particle
@@ -491,7 +507,7 @@
491 initpos + circular_shift,507 initpos + circular_shift,
492 vel,508 vel,
493 force,509 force,
494 id, is_dyn510 id, is_dyn, is_acc
495 );511 );
496 particle.setTag(tag);512 particle.setTag(tag);
497 513
498514
=== modified file 'Model/Particle.h'
--- Model/Particle.h 2017-01-04 08:26:43 +0000
+++ Model/Particle.h 2018-11-27 02:58:52 +0000
@@ -60,15 +60,17 @@
60 m_vel()60 m_vel()
61 {61 {
62 m_is_dynamic=true;62 m_is_dynamic=true;
63 m_is_acc=true;
63 }64 }
6465
65 exchangeType(const Vec3 &pos, const Vec3 &initPos, const Vec3 &oldPos, const Vec3 &vel,bool is_dyn)66 exchangeType(const Vec3 &pos, const Vec3 &initPos, const Vec3 &oldPos, const Vec3 &vel,bool is_dyn,bool is_acc)
66 : m_pos(pos),67 : m_pos(pos),
67 m_initPos(initPos),68 m_initPos(initPos),
68 m_oldPos(oldPos),69 m_oldPos(oldPos),
69 m_vel(vel)70 m_vel(vel)
70 {71 {
71 m_is_dynamic=is_dyn;72 m_is_dynamic=is_dyn;
73 m_is_acc=is_acc;
72 }74 }
73 75
74 Vec3 m_pos;76 Vec3 m_pos;
@@ -76,6 +78,7 @@
76 Vec3 m_oldPos; 78 Vec3 m_oldPos;
77 Vec3 m_vel;79 Vec3 m_vel;
78 bool m_is_dynamic;80 bool m_is_dynamic;
81 bool m_is_acc;
79 };82 };
80 83
81 typedef double (CParticle::* ScalarFieldFunction)() const; 84 typedef double (CParticle::* ScalarFieldFunction)() const;
@@ -92,13 +95,14 @@
9295
93 bool flag;96 bool flag;
94 bool m_is_dynamic; 97 bool m_is_dynamic;
98 bool m_is_acc;
9599
96 void setForce(const Vec3 &force) {m_force = force;}100 void setForce(const Vec3 &force) {m_force = force;}
97101
98 public:102 public:
99 CParticle();103 CParticle();
100 CParticle(double,double,const Vec3&,const Vec3&,const Vec3&,int,bool);104 CParticle(double,double,const Vec3&,const Vec3&,const Vec3&,int,bool,bool);
101 CParticle(double,double,const Vec3&,const Vec3&,const Vec3&,const Vec3&,const Vec3&,int,bool); // including oldpos105 CParticle(double,double,const Vec3&,const Vec3&,const Vec3&,const Vec3&,const Vec3&,int,bool,bool); // including oldpos
102 CParticle(const esys::lsm::SimpleParticleData &particleData);106 CParticle(const esys::lsm::SimpleParticleData &particleData);
103 virtual ~CParticle(){};107 virtual ~CParticle(){};
104108
@@ -136,6 +140,7 @@
136 virtual void setNonDynamic() {m_is_dynamic=false;};140 virtual void setNonDynamic() {m_is_dynamic=false;};
137 virtual void setNonDynamicLinear() {m_is_dynamic=false;};141 virtual void setNonDynamicLinear() {m_is_dynamic=false;};
138 virtual void setNonDynamicRot(){}; // do nothing142 virtual void setNonDynamicRot(){}; // do nothing
143 virtual void setNonDynamicAcc(){m_is_dynamic=true; m_is_acc=false;}; // JM
139144
140 void setFlag(bool b=true){flag=b;};145 void setFlag(bool b=true){flag=b;};
141 bool isFlagged() const {return flag;};146 bool isFlagged() const {return flag;};
142147
=== modified file 'Model/RotParticle.cpp'
--- Model/RotParticle.cpp 2017-01-04 08:26:43 +0000
+++ Model/RotParticle.cpp 2018-11-27 02:58:52 +0000
@@ -66,8 +66,9 @@
66 const Vec3& force,66 const Vec3& force,
67 int id,67 int id,
68 bool is_dyn,68 bool is_dyn,
69 bool is_rot69 bool is_rot,
70 ) : CParticle(rad, mass, pos, vel, force, id, is_dyn)70 bool is_acc
71 ) : CParticle(rad, mass, pos, vel, force, id, is_dyn, is_acc)
71{72{
72 m_quat = Quaternion(1.0,Vec3(0.0,0.0,0.0));73 m_quat = Quaternion(1.0,Vec3(0.0,0.0,0.0));
73 m_initquat = m_quat;74 m_initquat = m_quat;
@@ -109,8 +110,9 @@
109 const Vec3& moment,110 const Vec3& moment,
110 const Vec3& angvel,111 const Vec3& angvel,
111 bool is_dyn,112 bool is_dyn,
112 bool is_rot113 bool is_rot,
113 ) :CParticle(rad, mass,pos,vel,force,id,is_dyn)114 bool is_acc
115 ) :CParticle(rad, mass,pos,vel,force,id,is_dyn,is_acc)
114{116{
115 m_circular_shift=Vec3(0.0,0.0,0.0);117 m_circular_shift=Vec3(0.0,0.0,0.0);
116 flag=false;118 flag=false;
@@ -139,8 +141,9 @@
139 const Vec3& moment,141 const Vec3& moment,
140 const Vec3& angvel,142 const Vec3& angvel,
141 bool is_dyn,143 bool is_dyn,
142 bool is_rot144 bool is_rot,
143 ) :CParticle(rad, mass,pos,oldpos, initpos,vel,force,id,is_dyn)145 bool is_acc
146 ) :CParticle(rad, mass,pos,oldpos, initpos,vel,force,id,is_dyn,is_acc)
144{147{
145 m_circular_shift=Vec3(0.0,0.0,0.0);148 m_circular_shift=Vec3(0.0,0.0,0.0);
146 flag=false;149 flag=false;
@@ -228,6 +231,7 @@
228 231
229 append(p.m_is_dynamic);232 append(p.m_is_dynamic);
230 append(p.m_is_rot);233 append(p.m_is_rot);
234 append(p.m_is_acc);
231}235}
232236
233237
@@ -265,6 +269,7 @@
265 p.m_global_id=pop_int();269 p.m_global_id=pop_int();
266 p.m_is_dynamic=pop_bool();270 p.m_is_dynamic=pop_bool();
267 p.m_is_rot=pop_bool();271 p.m_is_rot=pop_bool();
272 p.m_is_acc=pop_bool();
268}273}
269274
270/*!275/*!
@@ -339,7 +344,8 @@
339 m_angVel,344 m_angVel,
340 m_quat,345 m_quat,
341 m_is_dynamic,346 m_is_dynamic,
342 m_is_rot347 m_is_rot,
348 m_is_acc
343 );349 );
344}350}
345351
@@ -357,6 +363,7 @@
357 m_quat = E.m_quat;363 m_quat = E.m_quat;
358 m_is_dynamic = E.m_is_dynamic;364 m_is_dynamic = E.m_is_dynamic;
359 m_is_rot = E.m_is_rot;365 m_is_rot = E.m_is_rot;
366 m_is_acc = E.m_is_acc;
360}367}
361368
362template<>369template<>
@@ -380,6 +387,7 @@
380 append(p.m_quat.return_vec().Z());387 append(p.m_quat.return_vec().Z());
381 append(p.m_is_dynamic);388 append(p.m_is_dynamic);
382 append(p.m_is_rot);389 append(p.m_is_rot);
390 append(p.m_is_acc);
383}391}
384392
385/*!393/*!
@@ -399,6 +407,7 @@
399 p.m_quat = Quaternion(db[12],Vec3(db[13],db[14],db[15]));407 p.m_quat = Quaternion(db[12],Vec3(db[13],db[14],db[15]));
400 p.m_is_dynamic = pop_bool();408 p.m_is_dynamic = pop_bool();
401 p.m_is_rot = pop_bool();409 p.m_is_rot = pop_bool();
410 p.m_is_acc = pop_bool();
402}411}
403412
404CRotParticle::ScalarFieldFunction CRotParticle::getScalarFieldFunction(const string& name)413CRotParticle::ScalarFieldFunction CRotParticle::getScalarFieldFunction(const string& name)
405414
=== modified file 'Model/RotParticle.h'
--- Model/RotParticle.h 2017-01-04 08:26:43 +0000
+++ Model/RotParticle.h 2018-11-27 02:58:52 +0000
@@ -66,6 +66,7 @@
66 {66 {
67 m_is_dynamic=true;67 m_is_dynamic=true;
68 m_is_rot=true;68 m_is_rot=true;
69 m_is_acc=true;
69 }70 }
7071
71 exchangeType(72 exchangeType(
@@ -75,7 +76,8 @@
75 const Vec3 &currAngVel,76 const Vec3 &currAngVel,
76 const Quaternion &quat,77 const Quaternion &quat,
77 const bool is_dyn,78 const bool is_dyn,
78 const bool is_rot79 const bool is_rot,
80 const bool is_acc
79 )81 )
80 : m_pos(pos),82 : m_pos(pos),
81 m_initPos(initPos),83 m_initPos(initPos),
@@ -85,6 +87,7 @@
85 {87 {
86 m_is_dynamic=is_dyn;88 m_is_dynamic=is_dyn;
87 m_is_rot=is_rot;89 m_is_rot=is_rot;
90 m_is_acc=is_acc;
88 }91 }
89 public:92 public:
90 Vec3 m_pos;93 Vec3 m_pos;
@@ -94,6 +97,7 @@
94 Quaternion m_quat;97 Quaternion m_quat;
95 bool m_is_dynamic;98 bool m_is_dynamic;
96 bool m_is_rot;99 bool m_is_rot;
100 bool m_is_acc;
97101
98 friend class TML_PackedMessageInterface; 102 friend class TML_PackedMessageInterface;
99 };103 };
@@ -124,7 +128,8 @@
124 const Vec3& force,128 const Vec3& force,
125 int id,129 int id,
126 bool is_dyn,130 bool is_dyn,
127 bool is_rot131 bool is_rot,
132 bool is_acc
128 );133 );
129 CRotParticle(134 CRotParticle(
130 double rad,135 double rad,
@@ -138,7 +143,8 @@
138 const Vec3& moment,143 const Vec3& moment,
139 const Vec3& angvel, 144 const Vec3& angvel,
140 bool is_dyn, 145 bool is_dyn,
141 bool is_rot146 bool is_rot,
147 bool is_acc
142 );148 );
143 CRotParticle(149 CRotParticle(
144 double rad,150 double rad,
@@ -155,7 +161,8 @@
155 const Vec3& moment,161 const Vec3& moment,
156 const Vec3& angvel, 162 const Vec3& angvel,
157 bool is_dyn,163 bool is_dyn,
158 bool is_rot164 bool is_rot,
165 bool is_acc
159 );166 );
160 167
161 virtual ~CRotParticle(){};168 virtual ~CRotParticle(){};
@@ -200,6 +207,7 @@
200 virtual void setNonDynamic() {m_is_dynamic=false;m_is_rot=false;};207 virtual void setNonDynamic() {m_is_dynamic=false;m_is_rot=false;};
201 virtual void setNonDynamicLinear() {m_is_dynamic=false;};208 virtual void setNonDynamicLinear() {m_is_dynamic=false;};
202 virtual void setNonDynamicRot() {m_is_rot=false;};209 virtual void setNonDynamicRot() {m_is_rot=false;};
210 virtual void setNonDynamicAcc() {m_is_dynamic=true; m_is_acc=false;};
203211
204 inline Quaternion getQuatFromRotVec(const Vec3 &vec) const212 inline Quaternion getQuatFromRotVec(const Vec3 &vec) const
205 {213 {
206214
=== modified file 'Model/RotParticleVi.cpp'
--- Model/RotParticleVi.cpp 2017-01-04 08:26:43 +0000
+++ Model/RotParticleVi.cpp 2018-11-27 02:58:52 +0000
@@ -42,8 +42,9 @@
42 const Vec3& vel,42 const Vec3& vel,
43 const Vec3& force,43 const Vec3& force,
44 int id,44 int id,
45 bool is_dyn45 bool is_dyn,
46) : CParticle(rad, mass, pos, vel, force, id, is_dyn)46 bool is_acc
47) : CParticle(rad, mass, pos, vel, force, id, is_dyn,is_acc)
47{48{
48 m_quat = Quaternion(1.0,Vec3(0.0,0.0,0.0));49 m_quat = Quaternion(1.0,Vec3(0.0,0.0,0.0));
49 m_initquat = m_quat;50 m_initquat = m_quat;
@@ -53,6 +54,7 @@
53 m_angVel_t = Vec3(0.0,0.0,0.0) ;54 m_angVel_t = Vec3(0.0,0.0,0.0) ;
54 m_moment = Vec3(0.0,0.0,0.0);55 m_moment = Vec3(0.0,0.0,0.0);
55 m_is_dynamic=is_dyn;56 m_is_dynamic=is_dyn;
57 m_is_acc=is_acc;
56}58}
5759
58CRotParticleVi::CRotParticleVi(const CParticle &particle) : CParticle(particle)60CRotParticleVi::CRotParticleVi(const CParticle &particle) : CParticle(particle)
@@ -91,7 +93,7 @@
91 const Vec3& moment,93 const Vec3& moment,
92 const Vec3& angvel,94 const Vec3& angvel,
93 const Vec3& angvel_t95 const Vec3& angvel_t
94) :CParticle(rad, mass,pos,vel,force,id,true)96) :CParticle(rad, mass,pos,vel,force,id,true,true)
95{97{
96 m_circular_shift=Vec3(0.0,0.0,0.0);98 m_circular_shift=Vec3(0.0,0.0,0.0);
97 flag=false;99 flag=false;
@@ -120,7 +122,7 @@
120 const Vec3& moment,122 const Vec3& moment,
121 const Vec3& angvel,123 const Vec3& angvel,
122 const Vec3& angvel_t124 const Vec3& angvel_t
123) :CParticle(rad, mass,pos,oldpos, initpos,vel,force,id,true)125) :CParticle(rad, mass,pos,oldpos, initpos,vel,force,id,true,true)
124{126{
125 m_circular_shift=Vec3(0.0,0.0,0.0);127 m_circular_shift=Vec3(0.0,0.0,0.0);
126 flag=false;128 flag=false;
127129
=== modified file 'Model/RotParticleVi.h'
--- Model/RotParticleVi.h 2017-01-04 08:26:43 +0000
+++ Model/RotParticleVi.h 2018-11-27 02:58:52 +0000
@@ -105,6 +105,7 @@
105 double m_inertRot;105 double m_inertRot;
106 double m_div_inertRot;106 double m_div_inertRot;
107 bool m_is_dynamic; 107 bool m_is_dynamic;
108 bool m_is_acc;
108109
109 public:110 public:
110 CRotParticleVi();111 CRotParticleVi();
@@ -116,7 +117,8 @@
116 const Vec3& vel,117 const Vec3& vel,
117 const Vec3& force,118 const Vec3& force,
118 int id,119 int id,
119 bool is_dyn120 bool is_dyn,
121 bool is_acc
120 );122 );
121 CRotParticleVi(123 CRotParticleVi(
122 double rad,124 double rad,
123125
=== modified file 'Model/RotThermParticle.cpp'
--- Model/RotThermParticle.cpp 2017-01-04 08:26:43 +0000
+++ Model/RotThermParticle.cpp 2018-11-27 02:58:52 +0000
@@ -52,9 +52,10 @@
52 const Vec3& vel,52 const Vec3& vel,
53 const Vec3& force,53 const Vec3& force,
54 int id,54 int id,
55 bool is_dyn55 bool is_dyn,
56 bool is_acc
56) :57) :
57 CRotParticleVi(rad, mass, pos, vel, force, id, is_dyn),58 CRotParticleVi(rad, mass, pos, vel, force, id, is_dyn, is_acc),
58 CThermParticle(rad)59 CThermParticle(rad)
59{60{
60}61}
6162
=== modified file 'Model/RotThermParticle.h'
--- Model/RotThermParticle.h 2017-01-04 08:26:43 +0000
+++ Model/RotThermParticle.h 2018-11-27 02:58:52 +0000
@@ -136,7 +136,8 @@
136 const Vec3& vel,136 const Vec3& vel,
137 const Vec3& force,137 const Vec3& force,
138 int id,138 int id,
139 bool is_dyn139 bool is_dyn,
140 bool is_acc
140 );141 );
141142
142 CRotThermParticle(143 CRotThermParticle(
143144
=== modified file 'Parallel/ASubLattice.h'
--- Parallel/ASubLattice.h 2017-09-07 08:07:19 +0000
+++ Parallel/ASubLattice.h 2018-11-27 02:58:52 +0000
@@ -131,6 +131,7 @@
131 virtual void setParticleAngularVelocity(){};131 virtual void setParticleAngularVelocity(){};
132 virtual void setParticleNonDynamic()=0;132 virtual void setParticleNonDynamic()=0;
133 virtual void setParticleNonRot()=0;133 virtual void setParticleNonRot()=0;
134 virtual void setParticleNonAcc()=0;
134 virtual void tagParticleNearestTo()=0;135 virtual void tagParticleNearestTo()=0;
135 virtual void moveSingleNode()=0;136 virtual void moveSingleNode()=0;
136 virtual void moveTaggedNodes()=0;137 virtual void moveTaggedNodes()=0;
137138
=== modified file 'Parallel/LatticeMaster.cpp'
--- Parallel/LatticeMaster.cpp 2017-12-11 00:23:07 +0000
+++ Parallel/LatticeMaster.cpp 2018-11-27 02:58:52 +0000
@@ -1091,6 +1091,22 @@
1091}1091}
10921092
1093/*!1093/*!
1094 Set all particles with a given tag to be linear non-dynamic, i.e. switch off velocity updates JM version
1095
1096 \param tag the tag
1097*/
1098void CLatticeMaster::setParticleNonAcc(int tag)
1099{
1100 CMPILCmdBuffer cmd_buffer(m_global_comm,m_global_rank);
1101 CVarMPIBuffer buffer(m_global_comm);
1102 CMPIBarrier barrier(m_global_comm);
1103
1104 cmd_buffer.broadcast(CMD_PSETNA);
1105 buffer.append(tag);
1106 buffer.broadcast(m_global_rank);
1107 barrier.wait("setParticleNonAcc");
1108}
1109/*!
1094 Set all particles with a given tag to be linear non-dynamic, i.e. switch off velocity updates1110 Set all particles with a given tag to be linear non-dynamic, i.e. switch off velocity updates
10951111
1096 \param tag the tag1112 \param tag the tag
10971113
=== modified file 'Parallel/LatticeMaster.h'
--- Parallel/LatticeMaster.h 2017-12-11 00:23:07 +0000
+++ Parallel/LatticeMaster.h 2018-11-27 02:58:52 +0000
@@ -303,6 +303,7 @@
303 void setParticleNonDynamic(int);303 void setParticleNonDynamic(int);
304 void setParticleNonRot(int);304 void setParticleNonRot(int);
305 void setParticleNonTrans(int);305 void setParticleNonTrans(int);
306 void setParticleNonAcc(int);
306 void setParticleVel(int,const Vec3&);307 void setParticleVel(int,const Vec3&);
307 void setParticleAngVel(int,const Vec3&);308 void setParticleAngVel(int,const Vec3&);
308 void setParticleDensity(int tag,int mask,double rho);309 void setParticleDensity(int tag,int mask,double rho);
309310
=== modified file 'Parallel/SubLattice.h'
--- Parallel/SubLattice.h 2017-09-07 08:07:19 +0000
+++ Parallel/SubLattice.h 2018-11-27 02:58:52 +0000
@@ -226,6 +226,7 @@
226 virtual void setParticleNonDynamic();226 virtual void setParticleNonDynamic();
227 virtual void setParticleNonRot();227 virtual void setParticleNonRot();
228 virtual void setParticleNonTrans();228 virtual void setParticleNonTrans();
229 virtual void setParticleNonAcc();
229 virtual void setParticleDensity();230 virtual void setParticleDensity();
230 virtual void setTaggedParticleVel();231 virtual void setTaggedParticleVel();
231 virtual void tagParticleNearestTo();232 virtual void tagParticleNearestTo();
232233
=== modified file 'Parallel/SubLattice.hpp'
--- Parallel/SubLattice.hpp 2017-12-11 00:23:07 +0000
+++ Parallel/SubLattice.hpp 2018-11-27 02:58:52 +0000
@@ -293,9 +293,13 @@
293 ysize=max.Y()-min.Y();293 ysize=max.Y()-min.Y();
294 if(fabs(ysize/m_nrange-lrint(ysize/m_nrange))>1e-6)294 if(fabs(ysize/m_nrange-lrint(ysize/m_nrange))>1e-6)
295 {295 {
296 console.Critical() << "circular y-dimension doesn't fit range !\n";296 //JM as per x-dim
297 //console.Critical() << "circular y-dimension doesn't fit range !\n";
298 console.Info() << "Circular y-size incompatible with range, adjusting...\n";
299 m_nrange = ysize/floor(ysize/m_nrange);
300 console.Info() << "New range = " << m_nrange << "\n";
297 }301 }
298 ysize+=2.0*m_nrange; // padding on the circular ends302 //ysize+=2.0*m_nrange; // padding on the circular ends
299 }303 }
300 else304 else
301 {305 {
@@ -308,9 +312,13 @@
308 zsize=max.Z()-min.Z();312 zsize=max.Z()-min.Z();
309 if(fabs(zsize/m_nrange-lrint(zsize/m_nrange))>1e-6)313 if(fabs(zsize/m_nrange-lrint(zsize/m_nrange))>1e-6)
310 {314 {
311 console.Critical() << "circular z-dimension doesn't fit range !\n";315 //JM as per x-dim
316 //console.Critical() << "circular z-dimension doesn't fit range !\n";
317 console.Info() << "Circular z-size incompatible with range, adjusting...\n";
318 m_nrange = zsize/floor(zsize/m_nrange);
319 console.Info() << "New range = " << m_nrange << "\n";
312 }320 }
313 zsize+=2.0*m_nrange; // padding on the circular ends321 //zsize+=2.0*m_nrange; // padding on the circular ends
314 }322 }
315 else323 else
316 {324 {
@@ -2537,6 +2545,22 @@
2537}2545}
25382546
2539/*!2547/*!
2548 Make tagged particles non-accelerating, i.e. don't change velocity based on forces JM
2549 Parameters (tag) are received from master.
2550*/
2551template <class T>
2552void TSubLattice<T>::setParticleNonAcc()
2553{
2554 console.Debug() << "TSubLattice<T>::setParticleNonAcc()\n";
2555 CVarMPIBuffer buffer(m_comm);
2556
2557 buffer.receiveBroadcast(0); // get data from master
2558 int tag=buffer.pop_int();
2559 m_ppa->forParticleTag(tag,(void (T::*)())(&T::setNonDynamicAcc));
2560 console.Debug() << "end TSubLattice<T>::setParticleNonAcc()\n";
2561}
2562
2563/*!
2540 Make tagged particles lieanr non-dynamic, i.e. don't update linear velocity 2564 Make tagged particles lieanr non-dynamic, i.e. don't update linear velocity
2541 Parameters (tag) are received from master. 2565 Parameters (tag) are received from master.
2542*/2566*/
25432567
=== modified file 'Parallel/SubLatticeControler.cpp'
--- Parallel/SubLatticeControler.cpp 2017-12-11 00:23:07 +0000
+++ Parallel/SubLatticeControler.cpp 2018-11-27 02:58:52 +0000
@@ -551,6 +551,7 @@
551 case CMD_PMOVETAGGEDBY : m_lattice->moveTaggedParticlesBy(); break;551 case CMD_PMOVETAGGEDBY : m_lattice->moveTaggedParticlesBy(); break;
552 case CMD_PSETND : m_lattice->setParticleNonDynamic(); break;552 case CMD_PSETND : m_lattice->setParticleNonDynamic(); break;
553 case CMD_PSETNR : m_lattice->setParticleNonRot(); break;553 case CMD_PSETNR : m_lattice->setParticleNonRot(); break;
554 case CMD_PSETNA : m_lattice->setParticleNonAcc(); break;
554 case CMD_PVEL : m_lattice->setParticleVelocity(); break;555 case CMD_PVEL : m_lattice->setParticleVelocity(); break;
555 case CMD_PANGVEL : m_lattice->setParticleAngularVelocity(); break;556 case CMD_PANGVEL : m_lattice->setParticleAngularVelocity(); break;
556 case CMD_PDENS : m_lattice->setParticleDensity(); break; 557 case CMD_PDENS : m_lattice->setParticleDensity(); break;
557558
=== modified file 'Parallel/sublattice_cmd.h'
--- Parallel/sublattice_cmd.h 2017-09-07 08:07:19 +0000
+++ Parallel/sublattice_cmd.h 2018-11-27 02:58:52 +0000
@@ -101,7 +101,7 @@
101const int CMD_SETCONSOLEFNAME=1113;101const int CMD_SETCONSOLEFNAME=1113;
102const int CMD_SETCONSOLEBUFF=1114;102const int CMD_SETCONSOLEBUFF=1114;
103const int CMD_SETINTERACTIONPARAMS=1115;103const int CMD_SETINTERACTIONPARAMS=1115;
104104const int CMD_PSETNA = 1116;
105105
106106
107// ---------------------------------107// ---------------------------------
108108
=== modified file 'Python/esys/lsm/LsmMpiPy.cpp'
--- Python/esys/lsm/LsmMpiPy.cpp 2017-12-11 00:49:38 +0000
+++ Python/esys/lsm/LsmMpiPy.cpp 2018-11-27 02:58:52 +0000
@@ -1134,6 +1134,12 @@
1134 {1134 {
1135 getLatticeMaster().setParticleNonTrans(id);1135 getLatticeMaster().setParticleNonTrans(id);
1136 }1136 }
1137
1138 //JM non-accelerative flag for fluid coupling
1139 void LsmMpiPy::setParticleNonAcc(int id)
1140 {
1141 getLatticeMaster().setParticleNonAcc(id);
1142 }
11371143
1138 // --- modifying interaction parameters ---1144 // --- modifying interaction parameters ---
1139 void LsmMpiPy::setInteractionParameter(const std::string& igname,const std::string& pname,double val)1145 void LsmMpiPy::setInteractionParameter(const std::string& igname,const std::string& pname,double val)
@@ -2879,6 +2885,17 @@
2879 "@type tag: int\n"2885 "@type tag: int\n"
2880 "@kwarg tag: the tag of the particle."2886 "@kwarg tag: the tag of the particle."
2881 )2887 )
2888 //JM
2889 .def(
2890 "setParticleNonAccelerating",
2891 &LsmMpiPy::setParticleNonAcc,
2892 (arg("tag")),
2893 "Set the particle with tag C{tag} to be non-accelerating,"
2894 " this is to allow for fluid coupled particles to mainain\n"
2895 " a constant velocity e.g. for shear platen tests"
2896 "@type tag: int\n"
2897 "@kwarg tag: the tag of the particle."
2898 )
2882 .def(2899 .def(
2883 "addPreTimeStepRunnable",2900 "addPreTimeStepRunnable",
2884 &LsmMpiPy::addPreTimeStepRunnable,2901 &LsmMpiPy::addPreTimeStepRunnable,
28852902
=== modified file 'Python/esys/lsm/LsmMpiPy.h'
--- Python/esys/lsm/LsmMpiPy.h 2017-12-11 00:23:07 +0000
+++ Python/esys/lsm/LsmMpiPy.h 2018-11-27 02:58:52 +0000
@@ -205,6 +205,7 @@
205 void setParticleNonDynamic(int);205 void setParticleNonDynamic(int);
206 void setParticleNonRot(int);206 void setParticleNonRot(int);
207 void setParticleNonTrans(int);207 void setParticleNonTrans(int);
208 void setParticleNonAcc(int); //JM non-accelerating to allow constant velocity in fluid
208 209
209 // --- modifying interaction parameters ---210 // --- modifying interaction parameters ---
210 void setInteractionParameter(const std::string&,const std::string&,double);211 void setInteractionParameter(const std::string&,const std::string&,double);
211212
=== modified file 'Python/esys/lsm/ParticlePy.cpp'
--- Python/esys/lsm/ParticlePy.cpp 2017-12-04 00:00:38 +0000
+++ Python/esys/lsm/ParticlePy.cpp 2018-11-27 02:58:52 +0000
@@ -23,7 +23,7 @@
23 }23 }
2424
25 ParticlePy::ParticlePy(int id, const Vec3Py &posn, double radius, double mass)25 ParticlePy::ParticlePy(int id, const Vec3Py &posn, double radius, double mass)
26 : CParticle(radius, mass, posn, Vec3(), Vec3(), id, true)26 : CParticle(radius, mass, posn, Vec3(), Vec3(), id, true,true)
27 {27 {
28 }28 }
2929
3030
=== modified file 'Python/esys/lsm/RotParticlePy.cpp'
--- Python/esys/lsm/RotParticlePy.cpp 2017-01-04 08:26:43 +0000
+++ Python/esys/lsm/RotParticlePy.cpp 2018-11-27 02:58:52 +0000
@@ -34,7 +34,7 @@
3434
35 // dynamic & rotational default to true35 // dynamic & rotational default to true
36 RotParticlePy::RotParticlePy(int id, const Vec3Py &posn, double radius, double mass)36 RotParticlePy::RotParticlePy(int id, const Vec3Py &posn, double radius, double mass)
37 : CRotParticle(radius, mass, posn, Vec3(), Vec3(), id,true,true)37 : CRotParticle(radius, mass, posn, Vec3(), Vec3(), id,true,true,true)
38 {38 {
39 }39 }
4040
4141
=== modified file 'Python/esys/lsm/RotParticleViPy.cpp'
--- Python/esys/lsm/RotParticleViPy.cpp 2017-01-04 08:26:43 +0000
+++ Python/esys/lsm/RotParticleViPy.cpp 2018-11-27 02:58:52 +0000
@@ -24,7 +24,7 @@
24 }24 }
2525
26 RotParticleViPy::RotParticleViPy(int id, const Vec3Py &posn, double radius, double mass)26 RotParticleViPy::RotParticleViPy(int id, const Vec3Py &posn, double radius, double mass)
27 : CRotParticleVi(radius, mass, posn, Vec3(), Vec3(), id, true)27 : CRotParticleVi(radius, mass, posn, Vec3(), Vec3(), id, true,true)
28 {28 {
29 }29 }
30 30
3131
=== modified file 'Python/esys/lsm/RotThermalParticlePy.cpp'
--- Python/esys/lsm/RotThermalParticlePy.cpp 2017-01-04 08:26:43 +0000
+++ Python/esys/lsm/RotThermalParticlePy.cpp 2018-11-27 02:58:52 +0000
@@ -24,7 +24,7 @@
24 }24 }
2525
26 RotThermalParticlePy::RotThermalParticlePy(int id, const Vec3Py &posn, double radius, double mass)26 RotThermalParticlePy::RotThermalParticlePy(int id, const Vec3Py &posn, double radius, double mass)
27 : CRotThermParticle(radius, mass, posn, Vec3(), Vec3(), id, true)27 : CRotThermParticle(radius, mass, posn, Vec3(), Vec3(), id, true, true)
28 {28 {
29 }29 }
30 30
3131
=== modified file 'Tools/dump2vtk/frame_vtk.cpp'
--- Tools/dump2vtk/frame_vtk.cpp 2017-09-07 08:07:19 +0000
+++ Tools/dump2vtk/frame_vtk.cpp 2018-11-27 02:58:52 +0000
@@ -345,6 +345,16 @@
345 vtkfile << (iter->second).angvel << endl;;345 vtkfile << (iter->second).angvel << endl;;
346 } 346 }
347 vtkfile << "</DataArray>\n";347 vtkfile << "</DataArray>\n";
348
349 // force - JM addition
350 vtkfile << "<DataArray type=\"Float64\" Name=\"force\" NumberOfComponents=\"3\" format=\"ascii\">\n";
351 for(map<int,r_part>::iterator iter=datamap.begin();
352 iter!=datamap.end();
353 iter++){
354 vtkfile << (iter->second).force << endl;;
355 }
356 vtkfile << "</DataArray>\n";
357
348 // displacement358 // displacement
349 vtkfile << "<DataArray type=\"Float64\" Name=\"displacement\" NumberOfComponents=\"3\" format=\"ascii\">\n";359 vtkfile << "<DataArray type=\"Float64\" Name=\"displacement\" NumberOfComponents=\"3\" format=\"ascii\">\n";
350 for(map<int,r_part>::iterator iter=datamap.begin();360 for(map<int,r_part>::iterator iter=datamap.begin();
@@ -440,6 +450,16 @@
440 vtkfile << (iter->second).vel << endl;;450 vtkfile << (iter->second).vel << endl;;
441 } 451 }
442 vtkfile << "</DataArray>\n";452 vtkfile << "</DataArray>\n";
453
454 // force - JM addition
455 vtkfile << "<DataArray type=\"Float64\" Name=\"force\" NumberOfComponents=\"3\" format=\"ascii\">\n";
456 for(map<int,nr_part>::iterator iter=datamap.begin();
457 iter!=datamap.end();
458 iter++){
459 vtkfile << (iter->second).force << endl;;
460 }
461 vtkfile << "</DataArray>\n";
462
443 // displacement463 // displacement
444 vtkfile << "<DataArray type=\"Float64\" Name=\"displacement\" NumberOfComponents=\"3\" format=\"ascii\">\n";464 vtkfile << "<DataArray type=\"Float64\" Name=\"displacement\" NumberOfComponents=\"3\" format=\"ascii\">\n";
445 for(map<int,nr_part>::iterator iter=datamap.begin();465 for(map<int,nr_part>::iterator iter=datamap.begin();
446466
=== modified file 'ppa/src/pp_array.h'
--- ppa/src/pp_array.h 2017-12-11 00:23:07 +0000
+++ ppa/src/pp_array.h 2018-11-27 02:58:52 +0000
@@ -84,7 +84,7 @@
84 NeighborTable<T>* m_nt;84 NeighborTable<T>* m_nt;
85 Vec3 m_minpos,m_maxpos; //!< local minimum and maximum positions85 Vec3 m_minpos,m_maxpos; //!< local minimum and maximum positions
86 double m_xshift,m_yshift,m_zshift; //!< circular shift values86 double m_xshift,m_yshift,m_zshift; //!< circular shift values
87 bool m_circ_edge_x_up,m_circ_edge_x_down; //!< circular edge flags87 bool m_circ_edge_x_up,m_circ_edge_x_down,m_circ_edge_y_up,m_circ_edge_y_down,m_circ_edge_z_up,m_circ_edge_z_down; //!< circular edge flags JM addition for y/z
88 static const int m_exchg_tag;88 static const int m_exchg_tag;
89 89
90 // helper fnc90 // helper fnc
9191
=== modified file 'ppa/src/pp_array.hpp'
--- ppa/src/pp_array.hpp 2017-01-04 08:26:43 +0000
+++ ppa/src/pp_array.hpp 2018-11-27 02:58:52 +0000
@@ -64,6 +64,12 @@
64 //- set x-edges to non-circular64 //- set x-edges to non-circular
65 m_circ_edge_x_down=false;65 m_circ_edge_x_down=false;
66 m_circ_edge_x_up=false;66 m_circ_edge_x_up=false;
67 //JM - set y-edges to non-circular
68 m_circ_edge_y_down=false;
69 m_circ_edge_y_up=false;
70 //JM - set z-edges to non-circular
71 m_circ_edge_z_down=false;
72 m_circ_edge_z_up=false;
67 //- get own process coords73 //- get own process coords
68 vector<int> pcoords=m_comm.get_coords();74 vector<int> pcoords=m_comm.get_coords();
69 //- initialize ntable75 //- initialize ntable
@@ -159,6 +165,12 @@
159 // setup circular edges165 // setup circular edges
160 m_circ_edge_x_down=(circ[0] && (pcoords[0]==0)) ? true : false ;166 m_circ_edge_x_down=(circ[0] && (pcoords[0]==0)) ? true : false ;
161 m_circ_edge_x_up=(circ[0] && (pcoords[0]==m_comm.get_dim(0)-1)) ? true : false ;167 m_circ_edge_x_up=(circ[0] && (pcoords[0]==m_comm.get_dim(0)-1)) ? true : false ;
168 //JM setup circular edges
169 m_circ_edge_y_down=(circ[1] && (pcoords[1]==0)) ? true : false ;
170 m_circ_edge_y_up=(circ[1] && (pcoords[1]==m_comm.get_dim(1)-1)) ? true : false ;
171 //JM setup circular edges
172 m_circ_edge_z_down=(circ[2] && (pcoords[2]==0)) ? true : false ;
173 m_circ_edge_z_up=(circ[2] && (pcoords[2]==m_comm.get_dim(2)-1)) ? true : false ;
162 }174 }
163 // init time stamp175 // init time stamp
164 m_timestamp=0; 176 m_timestamp=0;
@@ -325,13 +337,46 @@
325 // define tranfer slabs337 // define tranfer slabs
326 up_slab=m_nt->xz_slab(m_nt->ysize()-2);338 up_slab=m_nt->xz_slab(m_nt->ysize()-2);
327 down_slab=m_nt->xz_slab(1);339 down_slab=m_nt->xz_slab(1);
328 if(!circ_edge){ // normal boundary340
329 // upstream341 // upstream
342 if(m_circ_edge_y_up){ // circ. bdry
343 // cout << "circular shift, node " << m_comm.rank() << " y-dim, up slab size " << up_slab.size() << endl;
344 // copy particles from transfer slab into buffer
345 vector<T> buffer;
346 for(typename NTSlab<T>::iterator iter=up_slab.begin();
347 iter!=up_slab.end();
348 iter++){
349 buffer.push_back(*iter);
350 }
351 // shift particles in buffer by circular shift value
352 for(typename vector<T>::iterator iter=buffer.begin();
353 iter!=buffer.end();
354 iter++){
355 iter->setCircular(Vec3(0.0,-1.0*m_yshift,0.0));
356 }
357 m_comm.shift_cont_packed(buffer,*m_nt,1,1,m_exchg_tag);
358 } else {
330 m_comm.shift_cont_packed(up_slab,*m_nt,1,1,m_exchg_tag);359 m_comm.shift_cont_packed(up_slab,*m_nt,1,1,m_exchg_tag);
331 // downstream360 }
361 // downstream
362 if(m_circ_edge_y_down){// circ. bdry
363 // cout << "circular shift , node " << m_comm.rank() << " y-dim, down slab size " << down_slab.size() << endl;
364 // copy particles from transfer slab into buffer
365 vector<T> buffer;
366 for(typename NTSlab<T>::iterator iter=down_slab.begin();
367 iter!=down_slab.end();
368 iter++){
369 buffer.push_back(*iter);
370 }
371 // shift particles in buffer by circular shift value
372 for(typename vector<T>::iterator iter=buffer.begin();
373 iter!=buffer.end();
374 iter++){
375 iter->setCircular(Vec3(0.0,m_yshift,0.0));
376 }
377 m_comm.shift_cont_packed(buffer,*m_nt,1,-1,m_exchg_tag);
378 } else {
332 m_comm.shift_cont_packed(down_slab,*m_nt,1,-1,m_exchg_tag);379 m_comm.shift_cont_packed(down_slab,*m_nt,1,-1,m_exchg_tag);
333 } else { // circular edge -> buffer & shift received particles
334 cout << "circular y shift not implemented" << endl;
335 }380 }
336 }381 }
337 // z-dir382 // z-dir
@@ -346,13 +391,46 @@
346 // define tranfer slabs391 // define tranfer slabs
347 up_slab=m_nt->xy_slab(m_nt->zsize()-2);392 up_slab=m_nt->xy_slab(m_nt->zsize()-2);
348 down_slab=m_nt->xy_slab(1);393 down_slab=m_nt->xy_slab(1);
349 if(!circ_edge){ // normal boundary394
350 // upstream395 // upstream
396 if(m_circ_edge_z_up){ // circ. bdry
397 // cout << "circular shift, node " << m_comm.rank() << " z-dim, up slab size " << up_slab.size() << endl;
398 // copy particles from transfer slab into buffer
399 vector<T> buffer;
400 for(typename NTSlab<T>::iterator iter=up_slab.begin();
401 iter!=up_slab.end();
402 iter++){
403 buffer.push_back(*iter);
404 }
405 // shift particles in buffer by circular shift value
406 for(typename vector<T>::iterator iter=buffer.begin();
407 iter!=buffer.end();
408 iter++){
409 iter->setCircular(Vec3(0.0,0.0,-1.0*m_zshift));
410 }
411 m_comm.shift_cont_packed(buffer,*m_nt,2,1,m_exchg_tag);
412 } else {
351 m_comm.shift_cont_packed(up_slab,*m_nt,2,1,m_exchg_tag);413 m_comm.shift_cont_packed(up_slab,*m_nt,2,1,m_exchg_tag);
352 // downstream414 }
415 // downstream
416 if(m_circ_edge_z_down){// circ. bdry
417 // cout << "circular shift , node " << m_comm.rank() << " z-dim, down slab size " << down_slab.size() << endl;
418 // copy particles from transfer slab into buffer
419 vector<T> buffer;
420 for(typename NTSlab<T>::iterator iter=down_slab.begin();
421 iter!=down_slab.end();
422 iter++){
423 buffer.push_back(*iter);
424 }
425 // shift particles in buffer by circular shift value
426 for(typename vector<T>::iterator iter=buffer.begin();
427 iter!=buffer.end();
428 iter++){
429 iter->setCircular(Vec3(0.0,0.0,m_zshift));
430 }
431 m_comm.shift_cont_packed(buffer,*m_nt,2,-1,m_exchg_tag);
432 } else {
353 m_comm.shift_cont_packed(down_slab,*m_nt,2,-1,m_exchg_tag);433 m_comm.shift_cont_packed(down_slab,*m_nt,2,-1,m_exchg_tag);
354 } else { // circular edge -> buffer & shift received particles
355 cout << "circular x shift not implemented" << endl;
356 }434 }
357 }435 }
358 // update timestamp436 // update timestamp
@@ -424,12 +502,14 @@
424 send_data.push_back(((*iter).*rdf)());502 send_data.push_back(((*iter).*rdf)());
425// cout << "put exchange values from particle " << iter->getID() << " into buffer" << endl; 503// cout << "put exchange values from particle " << iter->getID() << " into buffer" << endl;
426 }504 }
505
427 // exchange506 // exchange
428 m_comm.shift_cont_packed(send_data,recv_data,dir,dist,m_exchg_tag);507 m_comm.shift_cont_packed(send_data,recv_data,dir,dist,m_exchg_tag);
429508
430 // apply received data509 // apply received data
431 // check if sizes are correct510 // check if sizes are correct
432 if(recv_data.size()==recv_slab.size()){511 if(recv_data.size()==recv_slab.size()){
512
433 int count=0;513 int count=0;
434 for(typename NTSlab<T>::iterator iter=recv_slab.begin();514 for(typename NTSlab<T>::iterator iter=recv_slab.begin();
435 iter!=recv_slab.end();515 iter!=recv_slab.end();
@@ -438,6 +518,7 @@
438// cout << "wrote exchange value to particle " << iter->getID() << endl;518// cout << "wrote exchange value to particle " << iter->getID() << endl;
439 count++;519 count++;
440 }520 }
521
441 }else{522 }else{
442 cerr << "rank = " << m_comm.rank() << ":ParallelParticleArray<T>::exchange_single ERROR: size mismatch in received data, recv_data.size()!=recv_slab.size() - (" << recv_data.size() << "!=" << recv_slab.size() << "). dir = " << dir << ", dist = " << dist << endl;523 cerr << "rank = " << m_comm.rank() << ":ParallelParticleArray<T>::exchange_single ERROR: size mismatch in received data, recv_data.size()!=recv_slab.size() - (" << recv_data.size() << "!=" << recv_slab.size() << "). dir = " << dir << ", dist = " << dist << endl;
443 }524 }
444525
=== modified file 'tml/comm/cart_comm.hpp'
--- tml/comm/cart_comm.hpp 2017-01-04 08:26:43 +0000
+++ tml/comm/cart_comm.hpp 2018-11-27 02:58:52 +0000
@@ -129,7 +129,7 @@
129void TML_CartComm::shift_cont_packed(T send_data,P& recv_data,int dir,int dist,int tag)129void TML_CartComm::shift_cont_packed(T send_data,P& recv_data,int dir,int dist,int tag)
130{130{
131 int source,dest;131 int source,dest;
132132
133 if(dir<m_ndims){133 if(dir<m_ndims){
134 MPI_Cart_shift(m_comm,dir,dist,&source,&dest);134 MPI_Cart_shift(m_comm,dir,dist,&source,&dest);
135 sendrecv_cont_packed(send_data,recv_data,dest,source,false,tag);135 sendrecv_cont_packed(send_data,recv_data,dest,source,false,tag);
136136
=== modified file 'tml/comm/comm.hpp'
--- tml/comm/comm.hpp 2017-01-04 08:26:43 +0000
+++ tml/comm/comm.hpp 2018-11-27 02:58:52 +0000
@@ -389,7 +389,7 @@
389389
390 //send/receive data390 //send/receive data
391 sendrecv_array(send_msg->buffer(),send_msg_size,recv_msg->buffer(),recv_msg_size,dest,source,tag+1024);391 sendrecv_array(send_msg->buffer(),send_msg_size,recv_msg->buffer(),recv_msg_size,dest,source,tag+1024);
392392
393 if(source!=MPI_PROC_NULL){ // if the source exists393 if(source!=MPI_PROC_NULL){ // if the source exists
394 // extract nuber of items394 // extract nuber of items
395 recv_nb_data=recv_msg->pop_int();395 recv_nb_data=recv_msg->pop_int();

Subscribers

People subscribed via source and target branches