67
66
while (iarg < narg) {
68
67
if (strcmp(arg[iarg],"pair") == 0) {
69
if (iarg+6 > narg) error->all(FLERR,"Illegal pair attribute in compute fep");
68
if (iarg+6 > narg) error->all(FLERR,
69
"Illegal pair attribute in compute fep");
72
72
} else if (strcmp(arg[iarg],"atom") == 0) {
73
if (iarg+4 > narg) error->all(FLERR,"Illegal atom attribute in compute fep");
73
if (iarg+4 > narg) error->all(FLERR,
74
"Illegal atom attribute in compute fep");
244
246
"compute tail corrections");
249
// detect if package gpu is present
251
int ifixgpu = modify->find_fix("package_gpu");
252
if (ifixgpu >= 0) fixgpu = modify->fix[ifixgpu];
247
254
if (comm->me == 0) {
249
256
fprintf(screen, "FEP settings ...\n");
296
306
if (force->pair && force->pair->compute_flag) {
297
force->pair->compute(1,0);
307
force->pair->compute(eflag,vflag);
298
308
timer->stamp(TIME_PAIR);
300
if (force->kspace && force->kspace->compute_flag) {
301
force->kspace->compute(1,0);
310
if (chgflag && force->kspace && force->kspace->compute_flag) {
311
force->kspace->compute(eflag,vflag);
302
312
timer->stamp(TIME_KSPACE);
315
// accumulate force/energy/virial from /gpu pair styles
316
if (fixgpu) fixgpu->post_force(vflag);
304
318
pe0 = compute_epair();
306
320
perturb_params();
309
323
if (force->pair && force->pair->compute_flag) {
310
force->pair->compute(1,0);
324
force->pair->compute(eflag,vflag);
311
325
timer->stamp(TIME_PAIR);
313
if (force->kspace && force->kspace->compute_flag) {
314
force->kspace->compute(1,0);
327
if (chgflag && force->kspace && force->kspace->compute_flag) {
328
force->kspace->compute(eflag,vflag);
315
329
timer->stamp(TIME_KSPACE);
332
// accumulate force/energy/virial from /gpu pair styles
333
// this is required as to empty the answer queue,
334
// otherwise the force compute on the GPU in the next step would be incorrect
335
if (fixgpu) fixgpu->post_force(vflag);
317
337
pe1 = compute_epair();
319
339
restore_qfev(); // restore charge, force, energy, virial array values
324
344
vector[2] = domain->xprd * domain->yprd * domain->zprd;
326
346
vector[1] *= vector[2];
329
if (comm->me == 0 && screen)
330
fprintf(screen, "FEP U0 = %f U1 = %f DU = %f exp(-DU/kT) = %f\n",
331
pe0,pe1,vector[0],vector[1]);
374
388
for (i = pert->ilo; i <= pert->ihi; i++)
375
389
for (j = MAX(pert->jlo,i); j <= pert->jhi; j++)
376
390
pert->array[i][j] = pert->array_orig[i][j] + delta;
379
if (comm->me == 0 && screen) {
380
fprintf(screen, "###FEP change %s %s, delta = %f\n",
381
pert->pstyle, pert->pparam, delta);
382
fprintf(screen, "###FEP I J old_param new_param\n");
383
for (i = pert->ilo; i <= pert->ihi; i++)
384
for (j = MAX(pert->jlo,i); j <= pert->jhi; j++)
385
fprintf(screen, "###FEP %2d %2d %9.5f %9.5f\n", i, j,
386
pert->array_orig[i][j], pert->array[i][j]);
390
392
} else if (pert->which == ATOM) {
400
402
if (mask[i] & groupbit)
404
if (comm->me == 0 && screen) {
405
fprintf(screen, "###FEP change charge, delta = %f\n", delta);
406
fprintf(screen, "###FEP atom I old_q new_q\n");
407
for (i = 0; i < atom->nlocal; i++)
408
if (atype[i] >= pert->ilo && atype[i] <= pert->ihi)
409
if (mask[i] & groupbit)
410
fprintf(screen, "###FEP %5d %2d %9.5f %9.5f\n", i, atype[i],
457
451
for (i = pert->ilo; i <= pert->ihi; i++)
458
452
for (j = MAX(pert->jlo,i); j <= pert->jhi; j++)
459
453
pert->array[i][j] = pert->array_orig[i][j];
462
if (comm->me == 0 && screen) {
463
fprintf(screen, "###FEP restore %s %s\n", pert->pstyle, pert->pparam);
464
fprintf(screen, "###FEP I J param\n");
465
for (i = pert->ilo; i <= pert->ihi; i++)
466
for (j = MAX(pert->jlo,i); j <= pert->jhi; j++)
467
fprintf(screen, "###FEP %2d %2d %9.5f\n", i, j, pert->array[i][j]);
472
if (pert->which == ATOM) {
473
if (comm->me == 0 && screen) {
474
int *atype = atom->type;
476
int *mask = atom->mask;
477
int natom = atom->nlocal;
478
fprintf(screen, "###FEP restore charge\n");
479
fprintf(screen, "###FEP atom I q\n");
480
for (i = 0; i < natom; i++)
481
if (atype[i] >= pert->ilo && atype[i] <= pert->ihi)
482
if (mask[i] & groupbit)
483
fprintf(screen, "###FEP %5d %2d %9.5f\n", i, atype[i], q[i]);
489
// re-initialize pair styles if any PAIR settings were changed
490
// this resets other coeffs that may depend on changed values,
491
// and also offset and tail corrections
493
457
if (pairflag) force->pair->reinit();
459
// reset KSpace charges if charges have changed
461
if (chgflag && force->kspace) force->kspace->qsum_qsq();
501
469
void ComputeFEP::allocate_storage()
503
471
nmax = atom->nmax;
505
memory->create(q_orig,nmax,"fep:q_orig");
506
472
memory->create(f_orig,nmax,3,"fep:f_orig");
507
473
memory->create(peatom_orig,nmax,"fep:peatom_orig");
508
474
memory->create(pvatom_orig,nmax,6,"fep:pvatom_orig");
510
memory->create(keatom_orig,nmax,"fep:keatom_orig");
511
memory->create(kvatom_orig,nmax,6,"fep:kvatom_orig");
476
memory->create(q_orig,nmax,"fep:q_orig");
478
memory->create(keatom_orig,nmax,"fep:keatom_orig");
479
memory->create(kvatom_orig,nmax,6,"fep:kvatom_orig");
517
486
void ComputeFEP::deallocate_storage()
520
memory->destroy(q_orig);
521
488
memory->destroy(f_orig);
522
489
memory->destroy(peatom_orig);
523
490
memory->destroy(pvatom_orig);
525
memory->destroy(keatom_orig);
526
memory->destroy(kvatom_orig);
492
memory->destroy(q_orig);
494
memory->destroy(keatom_orig);
495
memory->destroy(kvatom_orig);
585
energy_orig = force->kspace->energy;
586
kvirial_orig[0] = force->kspace->virial[0];
587
kvirial_orig[1] = force->kspace->virial[1];
588
kvirial_orig[2] = force->kspace->virial[2];
589
kvirial_orig[3] = force->kspace->virial[3];
590
kvirial_orig[4] = force->kspace->virial[4];
591
kvirial_orig[5] = force->kspace->virial[5];
593
if (update->eflag_atom) {
594
double *keatom = force->kspace->eatom;
595
for (i = 0; i < natom; i++)
596
keatom_orig[i] = keatom[i];
598
if (update->vflag_atom) {
599
double **kvatom = force->kspace->vatom;
600
for (i = 0; i < natom; i++) {
601
kvatom_orig[i][0] = kvatom[i][0];
602
kvatom_orig[i][1] = kvatom[i][1];
603
kvatom_orig[i][2] = kvatom[i][2];
604
kvatom_orig[i][3] = kvatom[i][3];
605
kvatom_orig[i][4] = kvatom[i][4];
606
kvatom_orig[i][5] = kvatom[i][5];
550
for (i = 0; i < nall; i++)
554
energy_orig = force->kspace->energy;
555
kvirial_orig[0] = force->kspace->virial[0];
556
kvirial_orig[1] = force->kspace->virial[1];
557
kvirial_orig[2] = force->kspace->virial[2];
558
kvirial_orig[3] = force->kspace->virial[3];
559
kvirial_orig[4] = force->kspace->virial[4];
560
kvirial_orig[5] = force->kspace->virial[5];
562
if (update->eflag_atom) {
563
double *keatom = force->kspace->eatom;
564
for (i = 0; i < natom; i++)
565
keatom_orig[i] = keatom[i];
567
if (update->vflag_atom) {
568
double **kvatom = force->kspace->vatom;
569
for (i = 0; i < natom; i++) {
570
kvatom_orig[i][0] = kvatom[i][0];
571
kvatom_orig[i][1] = kvatom[i][1];
572
kvatom_orig[i][2] = kvatom[i][2];
573
kvatom_orig[i][3] = kvatom[i][3];
574
kvatom_orig[i][4] = kvatom[i][4];
575
kvatom_orig[i][5] = kvatom[i][5];
664
force->kspace->energy = energy_orig;
665
force->kspace->virial[0] = kvirial_orig[0];
666
force->kspace->virial[1] = kvirial_orig[1];
667
force->kspace->virial[2] = kvirial_orig[2];
668
force->kspace->virial[3] = kvirial_orig[3];
669
force->kspace->virial[4] = kvirial_orig[4];
670
force->kspace->virial[5] = kvirial_orig[5];
629
for (i = 0; i < nall; i++)
633
force->kspace->energy = energy_orig;
634
force->kspace->virial[0] = kvirial_orig[0];
635
force->kspace->virial[1] = kvirial_orig[1];
636
force->kspace->virial[2] = kvirial_orig[2];
637
force->kspace->virial[3] = kvirial_orig[3];
638
force->kspace->virial[4] = kvirial_orig[4];
639
force->kspace->virial[5] = kvirial_orig[5];
672
if (update->eflag_atom) {
673
double *keatom = force->kspace->eatom;
674
for (i = 0; i < natom; i++)
675
keatom[i] = keatom_orig[i];
677
if (update->vflag_atom) {
678
double **kvatom = force->kspace->vatom;
679
for (i = 0; i < natom; i++) {
680
kvatom[i][0] = kvatom_orig[i][0];
681
kvatom[i][1] = kvatom_orig[i][1];
682
kvatom[i][2] = kvatom_orig[i][2];
683
kvatom[i][3] = kvatom_orig[i][3];
684
kvatom[i][4] = kvatom_orig[i][4];
685
kvatom[i][5] = kvatom_orig[i][5];
641
if (update->eflag_atom) {
642
double *keatom = force->kspace->eatom;
643
for (i = 0; i < natom; i++)
644
keatom[i] = keatom_orig[i];
646
if (update->vflag_atom) {
647
double **kvatom = force->kspace->vatom;
648
for (i = 0; i < natom; i++) {
649
kvatom[i][0] = kvatom_orig[i][0];
650
kvatom[i][1] = kvatom_orig[i][1];
651
kvatom[i][2] = kvatom_orig[i][2];
652
kvatom[i][3] = kvatom_orig[i][3];
653
kvatom[i][4] = kvatom_orig[i][4];
654
kvatom[i][5] = kvatom_orig[i][5];