Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add aparam_from_compute to pair deepmd #2929

Merged
merged 7 commits into from
Oct 18, 2023
Merged
8 changes: 7 additions & 1 deletion doc/third-party/lammps-command.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ pair_style deepmd models ... keyword value ...
- models = frozen model(s) to compute the interaction.
If multiple models are provided, then only the first model serves to provide energy and force prediction for each timestep of molecular dynamics,
and the model deviation will be computed among all models every `out_freq` timesteps.
- keyword = *out_file* or *out_freq* or *fparam* or *fparam_from_compute* or *atomic* or *relative* or *relative_v* or *aparam* or *ttm*
- keyword = *out_file* or *out_freq* or *fparam* or *fparam_from_compute* or *aparam_from_compute* or *atomic* or *relative* or *relative_v* or *aparam* or *ttm*
<pre>
<i>out_file</i> value = filename
filename = The file name for the model deviation output. Default is model_devi.out
Expand All @@ -48,6 +48,8 @@ and the model deviation will be computed among all models every `out_freq` times
parameters = one or more frame parameters required for model evaluation.
<i>fparam_from_compute</i> value = id
id = compute id used to update the frame parameter.
<i>aparam_from_compute</i> value = id
id = compute id used to update the atom parameter.
<i>atomic</i> = no value is required.
If this keyword is set, the force model deviation of each atom will be output.
<i>relative</i> value = level
Expand All @@ -69,6 +71,9 @@ pair_coeff * * O H
pair_style deepmd cp.pb fparam_from_compute TEMP
compute TEMP all temp
pair_style deepmd ener.pb aparam_from_compute 1
compute 1 all ke/atom
```

### Description
Expand All @@ -89,6 +94,7 @@ $$E_{v_i}=\frac{\left|D_{v_i}\right|}{\left|v_i\right|+l}$$

If the keyword `fparam` is set, the given frame parameter(s) will be fed to the model.
If the keyword `fparam_from_compute` is set, the global parameter(s) from compute command (e.g., temperature from [compute temp command](https://docs.lammps.org/compute_temp.html)) will be fed to the model as the frame parameter(s).
If the keyword `aparam_from_compute` is set, the atomic parameter(s) from compute command (e.g., per-atom translational kinetic energy from [compute ke/atom command](https://docs.lammps.org/compute_ke_atom.html)) will be fed to the model as the atom parameter(s).
If the keyword `aparam` is set, the given atomic parameter(s) will be fed to the model, where each atom is assumed to have the same atomic parameter(s).
If the keyword `ttm` is set, electronic temperatures from [fix ttm command](https://docs.lammps.org/fix_ttm.html) will be fed to the model as the atomic parameters.

Expand Down
86 changes: 68 additions & 18 deletions source/lmp/pair_deepmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -213,26 +213,59 @@
}

void PairDeepMD::make_fparam_from_compute(vector<double> &fparam) {
assert(do_compute);
assert(do_compute_fparam);

int icompute = modify->find_compute(compute_id);
int icompute = modify->find_compute(compute_fparam_id);

Check warning on line 218 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L218

Added line #L218 was not covered by tests
Compute *compute = modify->compute[icompute];

assert(compute);
fparam.resize(dim_fparam);

if (dim_fparam == 1) {
compute->compute_scalar();
if (!(compute->invoked_flag & Compute::INVOKED_SCALAR)) {
compute->compute_scalar();
compute->invoked_flag |= Compute::INVOKED_SCALAR;

Check warning on line 227 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L226-L227

Added lines #L226 - L227 were not covered by tests
}
fparam[0] = compute->scalar;
} else if (dim_fparam > 1) {
compute->compute_vector();
if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) {
compute->compute_vector();
compute->invoked_flag |= Compute::INVOKED_VECTOR;

Check warning on line 233 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L232-L233

Added lines #L232 - L233 were not covered by tests
}
double *cvector = compute->vector;
for (int jj = 0; jj < dim_fparam; ++jj) {
fparam[jj] = cvector[jj];
}
}
}

void PairDeepMD::make_aparam_from_compute(vector<double> &aparam) {

Check warning on line 242 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L242

Added line #L242 was not covered by tests
assert(do_compute_aparam);

int icompute = modify->find_compute(compute_aparam_id);
Compute *compute = modify->compute[icompute];

Check warning on line 246 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L245-L246

Added lines #L245 - L246 were not covered by tests

assert(compute);
int nlocal = atom->nlocal;
aparam.resize(dim_aparam * nlocal);

Check warning on line 250 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L249-L250

Added lines #L249 - L250 were not covered by tests

if (!(compute->invoked_flag & Compute::INVOKED_PERATOM)) {
compute->compute_peratom();
compute->invoked_flag |= Compute::INVOKED_PERATOM;

Check warning on line 254 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L253-L254

Added lines #L253 - L254 were not covered by tests
}
if (dim_aparam == 1) {
double *cvector = compute->vector_atom;
aparam.assign(cvector, cvector + nlocal);

Check warning on line 258 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L257-L258

Added lines #L257 - L258 were not covered by tests
} else if (dim_aparam > 1) {
double **carray = compute->array_atom;

Check warning on line 260 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L260

Added line #L260 was not covered by tests
for (int ii = 0; ii < nlocal; ++ii) {
for (int jj = 0; jj < dim_aparam; ++jj) {
aparam[ii * dim_aparam + jj] = carray[ii][jj];

Check warning on line 263 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L263

Added line #L263 was not covered by tests
}
}
}
}

#ifdef USE_TTM
void PairDeepMD::make_ttm_fparam(vector<double> &fparam) {
assert(do_ttm);
Expand Down Expand Up @@ -379,7 +412,8 @@
eps_v = 0.;
scale = NULL;
do_ttm = false;
do_compute = false;
do_compute_fparam = false;
do_compute_aparam = false;
single_model = false;
multi_models_mod_devi = false;
multi_models_no_mod_devi = false;
Expand Down Expand Up @@ -492,8 +526,10 @@
}
}

// uniform aparam
if (aparam.size() > 0) {
if (do_compute_aparam) {
make_aparam_from_compute(daparam);

Check warning on line 530 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L530

Added line #L530 was not covered by tests
} else if (aparam.size() > 0) {
// uniform aparam
make_uniform_aparam(daparam, aparam, nlocal);
} else if (do_ttm) {
#ifdef USE_TTM
Expand All @@ -505,7 +541,7 @@
#endif
}

if (do_compute) {
if (do_compute_fparam) {
make_fparam_from_compute(fparam);
}

Expand Down Expand Up @@ -884,6 +920,7 @@
keys.push_back("fparam");
keys.push_back("aparam");
keys.push_back("fparam_from_compute");
keys.push_back("aparam_from_compute");
keys.push_back("ttm");
keys.push_back("atomic");
keys.push_back("relative");
Expand Down Expand Up @@ -1019,15 +1056,24 @@
if (iarg + 1 + ii >= narg || is_key(arg[iarg + 1 + ii])) {
error->all(FLERR,
"invalid fparam_from_compute key: should be "
"fparam_from_compute compute_id(str)");
"fparam_from_compute compute_fparam_id(str)");
}
}
do_compute = true;
compute_id = arg[iarg + 1];
do_compute_fparam = true;
compute_fparam_id = arg[iarg + 1];

Check warning on line 1063 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L1062-L1063

Added lines #L1062 - L1063 were not covered by tests
iarg += 1 + 1;
}

else if (string(arg[iarg]) == string("atomic")) {
} else if (string(arg[iarg]) == string("aparam_from_compute")) {
for (int ii = 0; ii < 1; ++ii) {
if (iarg + 1 + ii >= narg || is_key(arg[iarg + 1 + ii])) {
error->all(FLERR,

Check warning on line 1068 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L1068

Added line #L1068 was not covered by tests
"invalid aparam_from_compute key: should be "
"aparam_from_compute compute_aparam_id(str)");
}
}
do_compute_aparam = true;
compute_aparam_id = arg[iarg + 1];
iarg += 1 + 1;

Check warning on line 1075 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L1073-L1075

Added lines #L1073 - L1075 were not covered by tests
} else if (string(arg[iarg]) == string("atomic")) {
out_each = 1;
iarg += 1;
} else if (string(arg[iarg]) == string("relative")) {
Expand Down Expand Up @@ -1059,7 +1105,7 @@
if (do_ttm && aparam.size() > 0) {
error->all(FLERR, "aparam and ttm should NOT be set simultaneously");
ChiahsinChu marked this conversation as resolved.
Show resolved Hide resolved
}
if (do_compute && fparam.size() > 0) {
if (do_compute_fparam && fparam.size() > 0) {
error->all(
FLERR,
"fparam and fparam_from_compute should NOT be set simultaneously");
Expand Down Expand Up @@ -1104,9 +1150,13 @@
}
cout << endl;
}
if (do_compute) {
cout << pre << "using compute id: ";
cout << compute_id << " " << endl;
if (do_compute_fparam) {
cout << pre << "using compute id (fparam): ";
cout << compute_fparam_id << " " << endl;

Check warning on line 1155 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L1154-L1155

Added lines #L1154 - L1155 were not covered by tests
}
if (do_compute_aparam) {
cout << pre << "using compute id (aparam): ";
cout << compute_aparam_id << " " << endl;

Check warning on line 1159 in source/lmp/pair_deepmd.cpp

View check run for this annotation

Codecov / codecov/patch

source/lmp/pair_deepmd.cpp#L1158-L1159

Added lines #L1158 - L1159 were not covered by tests
}
if (aparam.size() > 0) {
cout << pre << "using aparam(s): ";
Expand Down
7 changes: 5 additions & 2 deletions source/lmp/pair_deepmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,11 @@ class PairDeepMD : public Pair {
double eps_v;

void make_fparam_from_compute(std::vector<double> &fparam);
bool do_compute;
std::string compute_id;
bool do_compute_fparam;
std::string compute_fparam_id;
void make_aparam_from_compute(std::vector<double> &fparam);
ChiahsinChu marked this conversation as resolved.
Show resolved Hide resolved
bool do_compute_aparam;
std::string compute_aparam_id;

void make_ttm_fparam(std::vector<double> &fparam);

Expand Down