forked from lijiext/lammps
git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@4379 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
parent
eae2292f8f
commit
6f023fe957
|
@ -11,6 +11,11 @@
|
||||||
See the README file in the top-level LAMMPS directory.
|
See the README file in the top-level LAMMPS directory.
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing author: Craig Tenney (UND) added support
|
||||||
|
for swapping atoms of different masses
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
#include "mpi.h"
|
#include "mpi.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
@ -225,7 +230,8 @@ void FixThermalConductivity::end_of_step()
|
||||||
// exchange kinetic energy between the 2 particles
|
// exchange kinetic energy between the 2 particles
|
||||||
// if I own both particles just swap, else point2point comm of velocities
|
// if I own both particles just swap, else point2point comm of velocities
|
||||||
|
|
||||||
double sbuf[3],rbuf[3];
|
double sbuf[4],rbuf[4],vcm[3];
|
||||||
|
double eswap = 0.0;
|
||||||
|
|
||||||
mine[0].proc = mine[1].proc = me;
|
mine[0].proc = mine[1].proc = me;
|
||||||
int ilo = 0;
|
int ilo = 0;
|
||||||
|
@ -239,45 +245,80 @@ void FixThermalConductivity::end_of_step()
|
||||||
|
|
||||||
MPI_Allreduce(mine,all,2,MPI_DOUBLE_INT,MPI_MINLOC,world);
|
MPI_Allreduce(mine,all,2,MPI_DOUBLE_INT,MPI_MINLOC,world);
|
||||||
if (all[0].value == BIG || all[1].value == BIG) continue;
|
if (all[0].value == BIG || all[1].value == BIG) continue;
|
||||||
all[0].value = -all[0].value;
|
|
||||||
e_exchange += force->mvv2e * (all[0].value - all[1].value);
|
|
||||||
|
|
||||||
if (me == all[0].proc && me == all[1].proc) {
|
if (me == all[0].proc && me == all[1].proc) {
|
||||||
i = index_lo[ilo++];
|
i = index_lo[ilo++];
|
||||||
j = index_hi[ihi++];
|
j = index_hi[ihi++];
|
||||||
|
sbuf[0] = v[j][0];
|
||||||
|
sbuf[1] = v[j][1];
|
||||||
|
sbuf[2] = v[j][2];
|
||||||
|
if (rmass) sbuf[3] = rmass[j];
|
||||||
|
else sbuf[3] = mass[type[j]];
|
||||||
rbuf[0] = v[i][0];
|
rbuf[0] = v[i][0];
|
||||||
rbuf[1] = v[i][1];
|
rbuf[1] = v[i][1];
|
||||||
rbuf[2] = v[i][2];
|
rbuf[2] = v[i][2];
|
||||||
v[i][0] = v[j][0];
|
if (rmass) rbuf[3] = rmass[i];
|
||||||
v[i][1] = v[j][1];
|
else rbuf[3] = mass[type[i]];
|
||||||
v[i][2] = v[j][2];
|
vcm[0] = (sbuf[3]*sbuf[0] + rbuf[3]*rbuf[0]) / (sbuf[3] + rbuf[3]);
|
||||||
v[j][0] = rbuf[0];
|
vcm[1] = (sbuf[3]*sbuf[1] + rbuf[3]*rbuf[1]) / (sbuf[3] + rbuf[3]);
|
||||||
v[j][1] = rbuf[1];
|
vcm[2] = (sbuf[3]*sbuf[2] + rbuf[3]*rbuf[2]) / (sbuf[3] + rbuf[3]);
|
||||||
v[j][2] = rbuf[2];
|
v[j][0] = 2.0 * vcm[0] - sbuf[0];
|
||||||
|
v[j][1] = 2.0 * vcm[1] - sbuf[1];
|
||||||
|
v[j][2] = 2.0 * vcm[2] - sbuf[2];
|
||||||
|
eswap += sbuf[3] * (vcm[0] * (vcm[0] - sbuf[0]) +
|
||||||
|
vcm[1] * (vcm[1] - sbuf[1]) +
|
||||||
|
vcm[2] * (vcm[2] - sbuf[2]));
|
||||||
|
v[i][0] = 2.0 * vcm[0] - rbuf[0];
|
||||||
|
v[i][1] = 2.0 * vcm[1] - rbuf[1];
|
||||||
|
v[i][2] = 2.0 * vcm[2] - rbuf[2];
|
||||||
|
eswap -= rbuf[3] * (vcm[0] * (vcm[0] - rbuf[0]) +
|
||||||
|
vcm[1] * (vcm[1] - rbuf[1]) +
|
||||||
|
vcm[2] * (vcm[2] - rbuf[2]));
|
||||||
|
|
||||||
} else if (me == all[0].proc) {
|
} else if (me == all[0].proc) {
|
||||||
i = index_lo[ilo++];
|
j = index_lo[ilo++];
|
||||||
sbuf[0] = v[i][0];
|
sbuf[0] = v[j][0];
|
||||||
sbuf[1] = v[i][1];
|
sbuf[1] = v[j][1];
|
||||||
sbuf[2] = v[i][2];
|
sbuf[2] = v[j][2];
|
||||||
MPI_Sendrecv(sbuf,3,MPI_DOUBLE,all[1].proc,0,
|
if (rmass) sbuf[3] = rmass[j];
|
||||||
rbuf,3,MPI_DOUBLE,all[1].proc,0,world,&status);
|
else sbuf[3] = mass[type[j]];
|
||||||
v[i][0] = rbuf[0];
|
MPI_Sendrecv(sbuf,4,MPI_DOUBLE,all[1].proc,0,
|
||||||
v[i][1] = rbuf[1];
|
rbuf,4,MPI_DOUBLE,all[1].proc,0,world,&status);
|
||||||
v[i][2] = rbuf[2];
|
vcm[0] = (sbuf[3]*sbuf[0] + rbuf[3]*rbuf[0]) / (sbuf[3] + rbuf[3]);
|
||||||
|
vcm[1] = (sbuf[3]*sbuf[1] + rbuf[3]*rbuf[1]) / (sbuf[3] + rbuf[3]);
|
||||||
|
vcm[2] = (sbuf[3]*sbuf[2] + rbuf[3]*rbuf[2]) / (sbuf[3] + rbuf[3]);
|
||||||
|
v[j][0] = 2.0 * vcm[0] - sbuf[0];
|
||||||
|
v[j][1] = 2.0 * vcm[1] - sbuf[1];
|
||||||
|
v[j][2] = 2.0 * vcm[2] - sbuf[2];
|
||||||
|
eswap -= sbuf[3] * (vcm[0] * (vcm[0] - sbuf[0]) +
|
||||||
|
vcm[1] * (vcm[1] - sbuf[1]) +
|
||||||
|
vcm[2] * (vcm[2] - sbuf[2]));
|
||||||
|
|
||||||
} else if (me == all[1].proc) {
|
} else if (me == all[1].proc) {
|
||||||
j = index_hi[ihi++];
|
j = index_hi[ihi++];
|
||||||
sbuf[0] = v[j][0];
|
sbuf[0] = v[j][0];
|
||||||
sbuf[1] = v[j][1];
|
sbuf[1] = v[j][1];
|
||||||
sbuf[2] = v[j][2];
|
sbuf[2] = v[j][2];
|
||||||
MPI_Sendrecv(sbuf,3,MPI_DOUBLE,all[0].proc,0,
|
if (rmass) sbuf[3] = rmass[j];
|
||||||
rbuf,3,MPI_DOUBLE,all[0].proc,0,world,&status);
|
else sbuf[3] = mass[type[j]];
|
||||||
v[j][0] = rbuf[0];
|
MPI_Sendrecv(sbuf,4,MPI_DOUBLE,all[0].proc,0,
|
||||||
v[j][1] = rbuf[1];
|
rbuf,4,MPI_DOUBLE,all[0].proc,0,world,&status);
|
||||||
v[j][2] = rbuf[2];
|
vcm[0] = (sbuf[3]*sbuf[0] + rbuf[3]*rbuf[0]) / (sbuf[3] + rbuf[3]);
|
||||||
|
vcm[1] = (sbuf[3]*sbuf[1] + rbuf[3]*rbuf[1]) / (sbuf[3] + rbuf[3]);
|
||||||
|
vcm[2] = (sbuf[3]*sbuf[2] + rbuf[3]*rbuf[2]) / (sbuf[3] + rbuf[3]);
|
||||||
|
v[j][0] = 2.0 * vcm[0] - sbuf[0];
|
||||||
|
v[j][1] = 2.0 * vcm[1] - sbuf[1];
|
||||||
|
v[j][2] = 2.0 * vcm[2] - sbuf[2];
|
||||||
|
eswap += sbuf[3] * (vcm[0] * (vcm[0] - sbuf[0]) +
|
||||||
|
vcm[1] * (vcm[1] - sbuf[1]) +
|
||||||
|
vcm[2] * (vcm[2] - sbuf[2]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// tally energy exchange from all swaps
|
||||||
|
|
||||||
|
double eswap_all;
|
||||||
|
MPI_Allreduce(&eswap,&eswap_all,1,MPI_DOUBLE,MPI_SUM,world);
|
||||||
|
e_exchange += force->mvv2e * eswap_all;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
|
@ -11,6 +11,11 @@
|
||||||
See the README file in the top-level LAMMPS directory.
|
See the README file in the top-level LAMMPS directory.
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
Contributing author: Craig Tenney (UND) added support
|
||||||
|
for swapping atoms of different masses
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
#include "mpi.h"
|
#include "mpi.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
@ -234,7 +239,7 @@ void FixViscosity::end_of_step()
|
||||||
double *rmass = atom->rmass;
|
double *rmass = atom->rmass;
|
||||||
|
|
||||||
int ipos,ineg;
|
int ipos,ineg;
|
||||||
double sbuf[2],rbuf[2];
|
double sbuf[2],rbuf[2],vcm;
|
||||||
|
|
||||||
double pswap = 0.0;
|
double pswap = 0.0;
|
||||||
mine[0].proc = mine[1].proc = me;
|
mine[0].proc = mine[1].proc = me;
|
||||||
|
@ -260,9 +265,10 @@ void FixViscosity::end_of_step()
|
||||||
sbuf[0] = v[ineg][vdim];
|
sbuf[0] = v[ineg][vdim];
|
||||||
if (rmass) sbuf[1] = rmass[ineg];
|
if (rmass) sbuf[1] = rmass[ineg];
|
||||||
else sbuf[1] = mass[type[ineg]];
|
else sbuf[1] = mass[type[ineg]];
|
||||||
v[ineg][vdim] = rbuf[0] * rbuf[1]/sbuf[1];
|
vcm = (sbuf[1]*sbuf[0] + rbuf[1]*rbuf[0]) / (sbuf[1] + rbuf[1]);
|
||||||
v[ipos][vdim] = sbuf[0] * sbuf[1]/rbuf[1];
|
v[ineg][vdim] = 2.0 * vcm - sbuf[0];
|
||||||
pswap += rbuf[0]*rbuf[1] - sbuf[0]*sbuf[1];
|
v[ipos][vdim] = 2.0 * vcm - rbuf[0];
|
||||||
|
pswap += rbuf[1] * (vcm - rbuf[0]) - sbuf[1] * (vcm - sbuf[0]);
|
||||||
|
|
||||||
} else if (me == all[0].proc) {
|
} else if (me == all[0].proc) {
|
||||||
ipos = pos_index[ipositive++];
|
ipos = pos_index[ipositive++];
|
||||||
|
@ -271,8 +277,9 @@ void FixViscosity::end_of_step()
|
||||||
else sbuf[1] = mass[type[ipos]];
|
else sbuf[1] = mass[type[ipos]];
|
||||||
MPI_Sendrecv(sbuf,2,MPI_DOUBLE,all[1].proc,0,
|
MPI_Sendrecv(sbuf,2,MPI_DOUBLE,all[1].proc,0,
|
||||||
rbuf,2,MPI_DOUBLE,all[1].proc,0,world,&status);
|
rbuf,2,MPI_DOUBLE,all[1].proc,0,world,&status);
|
||||||
v[ipos][vdim] = rbuf[0] * rbuf[1]/sbuf[1];
|
vcm = (sbuf[1]*sbuf[0] + rbuf[1]*rbuf[0]) / (sbuf[1] + rbuf[1]);
|
||||||
pswap += sbuf[0]*sbuf[1];
|
v[ipos][vdim] = 2.0 * vcm - sbuf[0];
|
||||||
|
pswap += sbuf[1] * (vcm - sbuf[0]);
|
||||||
|
|
||||||
} else if (me == all[1].proc) {
|
} else if (me == all[1].proc) {
|
||||||
ineg = neg_index[inegative++];
|
ineg = neg_index[inegative++];
|
||||||
|
@ -281,8 +288,9 @@ void FixViscosity::end_of_step()
|
||||||
else sbuf[1] = mass[type[ineg]];
|
else sbuf[1] = mass[type[ineg]];
|
||||||
MPI_Sendrecv(sbuf,2,MPI_DOUBLE,all[0].proc,0,
|
MPI_Sendrecv(sbuf,2,MPI_DOUBLE,all[0].proc,0,
|
||||||
rbuf,2,MPI_DOUBLE,all[0].proc,0,world,&status);
|
rbuf,2,MPI_DOUBLE,all[0].proc,0,world,&status);
|
||||||
v[ineg][vdim] = rbuf[0] * rbuf[1]/sbuf[1];
|
vcm = (sbuf[1]*sbuf[0] + rbuf[1]*rbuf[0]) / (sbuf[1] + rbuf[1]);
|
||||||
pswap -= sbuf[0]*sbuf[1];
|
v[ineg][vdim] = 2.0 * vcm - sbuf[0];
|
||||||
|
pswap -= sbuf[1] * (vcm - sbuf[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue