@@ -34,7 +34,11 @@ is_key (const string& input)
3434
3535
3636FixDPLR::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)
105116int 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+ }
0 commit comments