Skip to content

Commit 7a0b41b

Browse files
authored
Merge pull request #243 from amcadmus/devel
add efield support to fix/dplr
2 parents b0f11a9 + 2362a2f commit 7a0b41b

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

source/lmp/fix_dplr.cpp

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ is_key (const string& input)
3434

3535

3636
FixDPLR::FixDPLR(LAMMPS *lmp, int narg, char **arg)
37-
:Fix(lmp, narg, arg)
37+
:Fix(lmp, narg, arg),
38+
efield(3, 0.0),
39+
efield_fsum(4, 0.0),
40+
efield_fsum_all(4, 0.0),
41+
efield_force_flag(0)
3842
{
3943
virial_flag = 1;
4044

@@ -54,6 +58,13 @@ FixDPLR::FixDPLR(LAMMPS *lmp, int narg, char **arg)
5458
model = string(arg[iarg+1]);
5559
iarg += 2;
5660
}
61+
if (string(arg[iarg]) == string("efield")) {
62+
if (iarg+3 > narg) error->all(FLERR,"Illegal fix adapt command, efield should be provided 3 float numbers");
63+
efield[0] = atof(arg[iarg+1]);
64+
efield[1] = atof(arg[iarg+2]);
65+
efield[2] = atof(arg[iarg+3]);
66+
iarg += 4;
67+
}
5768
if (string(arg[iarg]) == string("type_associate")) {
5869
int iend = iarg+1;
5970
while (iend < narg && (! is_key(arg[iend]) )) {
@@ -105,6 +116,7 @@ FixDPLR::FixDPLR(LAMMPS *lmp, int narg, char **arg)
105116
int FixDPLR::setmask()
106117
{
107118
int mask = 0;
119+
mask |= THERMO_ENERGY;
108120
mask |= POST_INTEGRATE;
109121
mask |= PRE_FORCE;
110122
mask |= POST_FORCE;
@@ -347,6 +359,7 @@ void FixDPLR::post_force(int vflag)
347359
int nall = nlocal + nghost;
348360
vector<FLOAT_PREC> dcoord(nall*3, 0.0), dbox(9, 0.0), dfele(nlocal*3, 0.0);
349361
vector<int> dtype(nall, 0);
362+
// set values for dcoord, dbox, dfele
350363
{
351364
int *type = atom->type;
352365
for (int ii = 0; ii < nall; ++ii){
@@ -366,9 +379,36 @@ void FixDPLR::post_force(int vflag)
366379
}
367380
}
368381
assert(dfele_.size() == nlocal * 3);
382+
// revise force according to efield
369383
for (int ii = 0; ii < nlocal*3; ++ii){
370384
dfele[ii] = dfele_[ii];
371385
}
386+
// revise force and virial according to efield
387+
double * q = atom->q;
388+
imageint *image = atom->image;
389+
double unwrap[3];
390+
double v[6];
391+
efield_fsum[0] = efield_fsum[1] = efield_fsum[2] = efield_fsum[3] = 0.0;
392+
efield_force_flag = 0;
393+
for (int ii = 0; ii < nlocal; ++ii){
394+
for (int dd = 0; dd < 3; ++dd){
395+
dfele[ii*3+dd] += q[ii] * efield[dd];
396+
}
397+
domain->unmap(x[ii],image[ii],unwrap);
398+
efield_fsum[0] -= efield[0]*unwrap[0]+efield[1]*unwrap[1]+efield[2]*unwrap[2];
399+
efield_fsum[1] += efield[0];
400+
efield_fsum[2] += efield[1];
401+
efield_fsum[3] += efield[2];
402+
if (evflag) {
403+
v[0] = q[ii] * efield[0] *unwrap[0];
404+
v[1] = q[ii] * efield[1] *unwrap[1];
405+
v[2] = q[ii] * efield[2] *unwrap[2];
406+
v[3] = q[ii] * efield[0] *unwrap[1];
407+
v[4] = q[ii] * efield[0] *unwrap[2];
408+
v[5] = q[ii] * efield[1] *unwrap[2];
409+
v_tally(ii, v);
410+
}
411+
}
372412
}
373413
// lmp nlist
374414
NeighList * list = pair_nnp->list;
@@ -466,5 +506,28 @@ void FixDPLR::unpack_reverse_comm(int n, int *list, double *buf)
466506
}
467507
}
468508

509+
/* ----------------------------------------------------------------------
510+
return energy added by fix
511+
------------------------------------------------------------------------- */
512+
513+
double FixDPLR::compute_scalar(void)
514+
{
515+
if (efield_force_flag == 0) {
516+
MPI_Allreduce(&efield_fsum[0],&efield_fsum_all[0],4,MPI_DOUBLE,MPI_SUM,world);
517+
efield_force_flag = 1;
518+
}
519+
return efield_fsum_all[0];
520+
}
469521

522+
/* ----------------------------------------------------------------------
523+
return total extra force due to fix
524+
------------------------------------------------------------------------- */
470525

526+
double FixDPLR::compute_vector(int n)
527+
{
528+
if (efield_force_flag == 0) {
529+
MPI_Allreduce(&efield_fsum[0],&efield_fsum_all[0],4,MPI_DOUBLE,MPI_SUM,world);
530+
efield_force_flag = 1;
531+
}
532+
return efield_fsum_all[n+1];
533+
}

source/lmp/fix_dplr.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ namespace LAMMPS_NS {
3232
void post_force(int);
3333
int pack_reverse_comm(int, int, double *);
3434
void unpack_reverse_comm(int, int *, double *);
35+
double compute_scalar(void);
36+
double compute_vector(int);
3537
private:
3638
PairNNP * pair_nnp;
3739
DeepTensor dpt;
@@ -45,6 +47,9 @@ namespace LAMMPS_NS {
4547
map<int,int > bk_type_asso;
4648
vector<FLOAT_PREC> dipole_recd;
4749
vector<double> dfcorr_buff;
50+
vector<double> efield;
51+
vector<double> efield_fsum, efield_fsum_all;
52+
int efield_force_flag;
4853
void get_valid_pairs(vector<pair<int,int> >& pairs);
4954
};
5055
}

0 commit comments

Comments
 (0)