This commit is contained in:
exapde 2022-12-01 09:18:18 -05:00
commit db8b4af924
9 changed files with 679 additions and 631 deletions

View File

@ -27,54 +27,145 @@ Description
Fit a machine-learning interatomic potential (ML-IAP) based on proper Fit a machine-learning interatomic potential (ML-IAP) based on proper
orthogonal descriptors (POD). Two input files are required for this orthogonal descriptors (POD). Two input files are required for this
command. The first input file describes a POD potential, while the command. The first input file describes a POD potential parameter
second input file specifies the DFT data. settings, while the second input file specifies the DFT data used for
the fitting procedure.
Below is a one-line description of all the keywords that can be assigned The table below has one-line descriptions of all the keywords that can
in the first input file (``Ta_param.pod``): be used in the first input file (i.e. ``Ta_param.pod`` in the example
above):
* species (STRING): Chemical symbols for all elements in the system and have to match XYZ training files. .. list-table::
* pbc 1 1 1 (INT): three integer constants specify boundary conditions :header-rows: 1
* rin 1.0 (REAL): a real number specifies the inner cut-off radius :widths: auto
* rcut 5.0 (REAL): a real number specifies the outer cut-off radius
* bessel_polynomial_degree 3 (INT): the maximum degree of Bessel polynomials
* inverse_polynomial_degree 6 (INT): the maximum degree of inverse radial basis functions
* onebody 1 (BOOL): turns on/off one-body potential
* twobody_number_radial_basis_functions 6 (INT): number of radial basis functions for two-body potential
* threebody_number_radial_basis_functions 5 (INT): number of radial basis functions for three-body potential
* threebody_number_angular_basis_functions 5 (INT): number of angular basis functions for three-body potential
* fourbody_snap_twojmax 0 (INT): band limit for SNAP bispectrum components (0,2,4,6,8... allowed)
* fourbody_snap_chemflag 0 (BOOL): turns on/off the explicit multi-element variant of the SNAP bispectrum components
* quadratic_pod_potential 0 (BOOL): turns on/off quadratic POD potential
* basename_for_output_files pod (STRING): a basename string added to the output files
All keywords except species have default values. If keywords are not set * - Keyword
in the input file, their defaults are used. Next, we describe all the - Default
keywords that can be assigned in the second input file (``Ta_data.pod``): - Type
- Description
* - species
- (none)
- STRING
- Chemical symbols for all elements in the system and have to match XYZ training files.
* - pbc
- 1 1 1
- INT
- three integer constants specify boundary conditions
* - rin
- 1.0
- REAL
- a real number specifies the inner cut-off radius
* - rcut
- 5.0
- REAL
- a real number specifies the outer cut-off radius
* - bessel_polynomial_degree
- 3
- INT
- the maximum degree of Bessel polynomials
* - inverse_polynomial_degree
- 6
- INT
- the maximum degree of inverse radial basis functions
* - onebody
- 1
- BOOL
- turns on/off one-body potential
* - twobody_number_radial_basis_functions
- 6
- INT
- number of radial basis functions for two-body potential
* - threebody_number_radial_basis_functions
- 5
- INT
- number of radial basis functions for three-body potential
* - threebody_number_angular_basis_functions
- 5
- INT
- number of angular basis functions for three-body potential
* - fourbody_snap_twojmax
- 0
- INT
- band limit for SNAP bispectrum components (0,2,4,6,8... allowed)
* - fourbody_snap_chemflag
- 0
- BOOL
- turns on/off the explicit multi-element variant of the SNAP bispectrum components
* - quadratic_pod_potential
- 0
- BOOL
- turns on/off quadratic POD potential
* - basename_for_output_files
- pod
- STRING
- a basename string added to the output files
* file_format extxyz (STRING): only extended xyz format is currently supported All keywords except *species* have default values. If a keyword is not
* file_extension xyz (STRING): extension of the data files set in the input file, its default value is used. The next table
* path_to_training_data_set (STRING): specifies the path to training data files in double quotes describes all keywords that can be used in the second input file
* path_to_test_data_set "" (STRING): specifies the path to test data files in double quotes (i.e. ``Ta_data.pod`` in the example above):
* fraction_training_data_set 1.0 (REAL): a real number (<= 1.0) specifies the fraction of the training set used to fit POD
* randomize_training_data_set 0 (BOOL): turns on/off randomization of the training set
* fitting_weight_energy 100.0 (REAL): a real constant specifies the weight for energy in the least-squares fit
* fitting_weight_force 1.0 (REAL): a real constant specifies the weight for force in the least-squares fit
* error_analysis_for_training_data_set 0 (BOOL): turns on/off error analysis for the training data set
* error_analysis_for_test_data_set 0 (BOOL): turns on/off error analysis for the test data set
All keywords except path_to_training_data_set have default values. If .. list-table::
keywords are not set in the input file, their defaults are used. On :header-rows: 1
successful training, it produces a number of output files: :widths: auto
* ``basename_training_errors.pod`` reports the errors in energy and forces for the training data set * - Keyword
* ``basename_training_analysis.pod`` reports detailed errors for all training configurations - Default
* ``basename_test_errors.pod`` reports errors for the test data set - Type
* ``basename_test_analysis.pod`` reports detailed errors for all test configurations - Description
* ``basename_coefficients.pod`` contains the coefficients of the POD potential * - file_format
- extxyz
- STRING
- only the extended xyz format (extxyz) is currently supported
* - file_extension
- xyz
- STRING
- extension of the data files
* - path_to_training_data_set
- (none)
- STRING
- specifies the path to training data files in double quotes
* - path_to_test_data_set
- ""
- STRING
- specifies the path to test data files in double quotes
* - fraction_training_data_set
- 1.0
- REAL
- a real number (<= 1.0) specifies the fraction of the training set used to fit POD
* - randomize_training_data_set
- 0
- BOOL
- turns on/off randomization of the training set
* - fitting_weight_energy
- 100.0
- REAL
- a real constant specifies the weight for energy in the least-squares fit
* - fitting_weight_force
- 1.0
- REAL
- a real constant specifies the weight for force in the least-squares fit
* - error_analysis_for_training_data_set
- 0
- BOOL
- turns on/off error analysis for the training data set
* - error_analysis_for_test_data_set
- 0
- BOOL
- turns on/off error analysis for the test data set
After training the POD potential, ``Ta_param.pod`` and ``basename_coefficients.pod`` All keywords except *path_to_training_data_set* have default values. If
are two files needed to use the POD potential in LAMMPS. See a keyword is not set in the input file, its default value is used. After
successful training, a number of output files are produced, if enabled:
* ``<basename>_training_errors.pod`` reports the errors in energy and forces for the training data set
* ``<basename>_training_analysis.pod`` reports detailed errors for all training configurations
* ``<basename>_test_errors.pod`` reports errors for the test data set
* ``<basename>_test_analysis.pod`` reports detailed errors for all test configurations
* ``<basename>_coefficients.pod`` contains the coefficients of the POD potential
After training the POD potential, ``Ta_param.pod`` and ``<basename>_coefficients.pod``
are the two files needed to use the POD potential in LAMMPS. See
:doc:`pair_style pod <pair_pod>` for using the POD potential. Examples :doc:`pair_style pod <pair_pod>` for using the POD potential. Examples
about training and using POD potentials are found in the directory about training and using POD potentials are found in the directory
lammps/examples/PACKAGES/pod. lammps/examples/PACKAGES/pod.

View File

@ -1,7 +1,7 @@
**************** Begin of Error Analysis for the Training Data Set **************** **************** Begin of Error Analysis for the Training Data Set ****************
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
File | # configs | # atoms | MAE energy | RMSE energy | MAE force | RMSE force | File | # configs | # atoms | MAE energy | RMSE energy | MAE force | RMSE force
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
Displaced_A15.xyz 9 576 0.011326 0.011373 0.113223 0.141496 Displaced_A15.xyz 9 576 0.011326 0.011373 0.113223 0.141496
Displaced_BCC.xyz 9 486 0.012158 0.013983 0.240350 0.311834 Displaced_BCC.xyz 9 486 0.012158 0.013983 0.240350 0.311834
Displaced_FCC.xyz 9 432 0.001459 0.001605 0.082874 0.104038 Displaced_FCC.xyz 9 432 0.001459 0.001605 0.082874 0.104038
@ -14,7 +14,7 @@ Surface.xyz 7 236 0.025392 0.037556 0.096037
Volume_A15.xyz 30 240 0.039262 0.048655 0.000000 0.000000 Volume_A15.xyz 30 240 0.039262 0.048655 0.000000 0.000000
Volume_BCC.xyz 21 42 0.049805 0.067608 0.000000 0.000000 Volume_BCC.xyz 21 42 0.049805 0.067608 0.000000 0.000000
Volume_FCC.xyz 31 124 0.030071 0.041758 0.000000 0.000000 Volume_FCC.xyz 31 124 0.030071 0.041758 0.000000 0.000000
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
All files 363 4224 0.012915 0.025804 0.122413 0.259832 All files 363 4224 0.012915 0.025804 0.122413 0.259832
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
**************** End of Error Analysis for the Training Data Set **************** **************** End of Error Analysis for the Training Data Set ****************

View File

@ -50,7 +50,7 @@ fitting weight for stress: 0
**************** Begin of Training Data Set **************** **************** Begin of Training Data Set ****************
--------------------------------------------------------------- ---------------------------------------------------------------
data file | number of configurations | number of atoms data file | number of configurations | number of atoms
=============================================================== ---------------------------------------------------------------
Displaced_A15.xyz | 9 | 576 Displaced_A15.xyz | 9 | 576
Displaced_BCC.xyz | 9 | 486 Displaced_BCC.xyz | 9 | 486
Displaced_FCC.xyz | 9 | 432 Displaced_FCC.xyz | 9 | 432
@ -91,9 +91,9 @@ Configuration: # 201
Configuration: # 301 Configuration: # 301
**************** End of Error Calculation **************** **************** End of Error Calculation ****************
**************** Begin of Error Analysis for the Training Data Set **************** **************** Begin of Error Analysis for the Training Data Set ****************
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
File | # configs | # atoms | MAE energy | RMSE energy | MAE force | RMSE force | File | # configs | # atoms | MAE energy | RMSE energy | MAE force | RMSE force
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
Displaced_A15.xyz 9 576 0.011326 0.011373 0.113223 0.141496 Displaced_A15.xyz 9 576 0.011326 0.011373 0.113223 0.141496
Displaced_BCC.xyz 9 486 0.012158 0.013983 0.240350 0.311834 Displaced_BCC.xyz 9 486 0.012158 0.013983 0.240350 0.311834
Displaced_FCC.xyz 9 432 0.001459 0.001605 0.082874 0.104038 Displaced_FCC.xyz 9 432 0.001459 0.001605 0.082874 0.104038
@ -106,9 +106,9 @@ Surface.xyz 7 236 0.025392 0.037556 0.096037
Volume_A15.xyz 30 240 0.039262 0.048655 0.000000 0.000000 Volume_A15.xyz 30 240 0.039262 0.048655 0.000000 0.000000
Volume_BCC.xyz 21 42 0.049805 0.067608 0.000000 0.000000 Volume_BCC.xyz 21 42 0.049805 0.067608 0.000000 0.000000
Volume_FCC.xyz 31 124 0.030071 0.041758 0.000000 0.000000 Volume_FCC.xyz 31 124 0.030071 0.041758 0.000000 0.000000
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
All files 363 4224 0.012915 0.025804 0.122413 0.259832 All files 363 4224 0.012915 0.025804 0.122413 0.259832
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
**************** End of Error Analysis for the Training Data Set **************** **************** End of Error Analysis for the Training Data Set ****************
Total wall time: 0:00:01 Total wall time: 0:00:01

View File

@ -50,7 +50,7 @@ fitting weight for stress: 0
**************** Begin of Training Data Set **************** **************** Begin of Training Data Set ****************
--------------------------------------------------------------- ---------------------------------------------------------------
data file | number of configurations | number of atoms data file | number of configurations | number of atoms
=============================================================== ---------------------------------------------------------------
Displaced_A15.xyz | 9 | 576 Displaced_A15.xyz | 9 | 576
Displaced_BCC.xyz | 9 | 486 Displaced_BCC.xyz | 9 | 486
Displaced_FCC.xyz | 9 | 432 Displaced_FCC.xyz | 9 | 432
@ -91,9 +91,9 @@ Configuration: # 201
Configuration: # 301 Configuration: # 301
**************** End of Error Calculation **************** **************** End of Error Calculation ****************
**************** Begin of Error Analysis for the Training Data Set **************** **************** Begin of Error Analysis for the Training Data Set ****************
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
File | # configs | # atoms | MAE energy | RMSE energy | MAE force | RMSE force | File | # configs | # atoms | MAE energy | RMSE energy | MAE force | RMSE force
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
Displaced_A15.xyz 9 576 0.011326 0.011373 0.113223 0.141496 Displaced_A15.xyz 9 576 0.011326 0.011373 0.113223 0.141496
Displaced_BCC.xyz 9 486 0.012158 0.013983 0.240350 0.311834 Displaced_BCC.xyz 9 486 0.012158 0.013983 0.240350 0.311834
Displaced_FCC.xyz 9 432 0.001459 0.001605 0.082874 0.104038 Displaced_FCC.xyz 9 432 0.001459 0.001605 0.082874 0.104038
@ -106,9 +106,9 @@ Surface.xyz 7 236 0.025392 0.037556 0.096037
Volume_A15.xyz 30 240 0.039262 0.048655 0.000000 0.000000 Volume_A15.xyz 30 240 0.039262 0.048655 0.000000 0.000000
Volume_BCC.xyz 21 42 0.049805 0.067608 0.000000 0.000000 Volume_BCC.xyz 21 42 0.049805 0.067608 0.000000 0.000000
Volume_FCC.xyz 31 124 0.030071 0.041758 0.000000 0.000000 Volume_FCC.xyz 31 124 0.030071 0.041758 0.000000 0.000000
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
All files 363 4224 0.012915 0.025804 0.122413 0.259832 All files 363 4224 0.012915 0.025804 0.122413 0.259832
---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
**************** End of Error Analysis for the Training Data Set **************** **************** End of Error Analysis for the Training Data Set ****************
Total wall time: 0:00:00 Total wall time: 0:00:00

View File

@ -99,31 +99,31 @@ Neighbor list info ...
bin: standard bin: standard
Per MPI rank memory allocation (min/avg/max) = 3.082 | 3.082 | 3.082 Mbytes Per MPI rank memory allocation (min/avg/max) = 3.082 | 3.082 | 3.082 Mbytes
Step Temp E_pair E_mol TotEng Press Step Temp E_pair E_mol TotEng Press
0 300 -11.841653 0 -11.803178 -15932.81 0 300 -11.841652 0 -11.803177 -15932.736
10 296.91627 -11.841257 0 -11.803178 -15691.292 10 296.91627 -11.841257 0 -11.803177 -15691.219
20 287.83193 -11.840092 0 -11.803178 -14982.943 20 287.83193 -11.840092 0 -11.803177 -14982.869
30 273.2481 -11.838222 0 -11.803177 -13854.289 30 273.2481 -11.838221 0 -11.803177 -13854.215
40 253.97579 -11.83575 0 -11.803177 -12377.385 40 253.97579 -11.835749 0 -11.803177 -12377.312
50 231.08941 -11.832815 0 -11.803177 -10642.841 50 231.08941 -11.832814 0 -11.803177 -10642.767
60 205.86307 -11.829579 0 -11.803177 -8751.3479 60 205.86306 -11.829579 0 -11.803177 -8751.2744
70 179.69197 -11.826223 0 -11.803177 -6804.808 70 179.69196 -11.826222 0 -11.803177 -6804.7346
80 154.00241 -11.822928 0 -11.803177 -4898.2688 80 154.0024 -11.822927 0 -11.803177 -4898.1954
90 130.15527 -11.819869 0 -11.803177 -3113.7145 90 130.15526 -11.819869 0 -11.803176 -3113.6412
100 109.34992 -11.817201 0 -11.803177 -1516.1852 100 109.34991 -11.8172 0 -11.803176 -1516.1119
Loop time of 2.33037 on 1 procs for 100 steps with 128 atoms Loop time of 2.21891 on 1 procs for 100 steps with 128 atoms
Performance: 1.854 ns/day, 12.947 hours/ns, 42.912 timesteps/s, 5.493 katom-step/s Performance: 1.947 ns/day, 12.327 hours/ns, 45.067 timesteps/s, 5.769 katom-step/s
99.8% CPU use with 1 MPI tasks x 1 OpenMP threads 99.9% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown: MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total Section | min time | avg time | max time |%varavg| %total
--------------------------------------------------------------- ---------------------------------------------------------------
Pair | 2.3293 | 2.3293 | 2.3293 | 0.0 | 99.95 Pair | 2.2179 | 2.2179 | 2.2179 | 0.0 | 99.95
Neigh | 0 | 0 | 0 | 0.0 | 0.00 Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0.00039757 | 0.00039757 | 0.00039757 | 0.0 | 0.02 Comm | 0.00038894 | 0.00038894 | 0.00038894 | 0.0 | 0.02
Output | 0.00023376 | 0.00023376 | 0.00023376 | 0.0 | 0.01 Output | 0.00020551 | 0.00020551 | 0.00020551 | 0.0 | 0.01
Modify | 0.00017018 | 0.00017018 | 0.00017018 | 0.0 | 0.01 Modify | 0.00016188 | 0.00016188 | 0.00016188 | 0.0 | 0.01
Other | | 0.0003112 | | | 0.01 Other | | 0.0002651 | | | 0.01
Nlocal: 128 ave 128 max 128 min Nlocal: 128 ave 128 max 128 min
Histogram: 1 0 0 0 0 0 0 0 0 0 Histogram: 1 0 0 0 0 0 0 0 0 0

View File

@ -99,31 +99,31 @@ Neighbor list info ...
bin: standard bin: standard
Per MPI rank memory allocation (min/avg/max) = 3.062 | 3.062 | 3.062 Mbytes Per MPI rank memory allocation (min/avg/max) = 3.062 | 3.062 | 3.062 Mbytes
Step Temp E_pair E_mol TotEng Press Step Temp E_pair E_mol TotEng Press
0 300 -11.841653 0 -11.803178 -15932.81 0 300 -11.841652 0 -11.803177 -15932.736
10 296.91627 -11.841257 0 -11.803178 -15691.292 10 296.91627 -11.841257 0 -11.803177 -15691.219
20 287.83193 -11.840092 0 -11.803178 -14982.943 20 287.83193 -11.840092 0 -11.803177 -14982.869
30 273.2481 -11.838222 0 -11.803177 -13854.289 30 273.2481 -11.838221 0 -11.803177 -13854.215
40 253.97579 -11.83575 0 -11.803177 -12377.385 40 253.97579 -11.835749 0 -11.803177 -12377.312
50 231.08941 -11.832815 0 -11.803177 -10642.841 50 231.08941 -11.832814 0 -11.803177 -10642.767
60 205.86307 -11.829579 0 -11.803177 -8751.3479 60 205.86306 -11.829579 0 -11.803177 -8751.2744
70 179.69197 -11.826223 0 -11.803177 -6804.808 70 179.69196 -11.826222 0 -11.803177 -6804.7346
80 154.00241 -11.822928 0 -11.803177 -4898.2688 80 154.0024 -11.822927 0 -11.803177 -4898.1954
90 130.15527 -11.819869 0 -11.803177 -3113.7145 90 130.15526 -11.819869 0 -11.803176 -3113.6412
100 109.34992 -11.817201 0 -11.803177 -1516.1852 100 109.34991 -11.8172 0 -11.803176 -1516.1119
Loop time of 0.615992 on 4 procs for 100 steps with 128 atoms Loop time of 0.593779 on 4 procs for 100 steps with 128 atoms
Performance: 7.013 ns/day, 3.422 hours/ns, 162.340 timesteps/s, 20.779 katom-step/s Performance: 7.275 ns/day, 3.299 hours/ns, 168.413 timesteps/s, 21.557 katom-step/s
99.6% CPU use with 4 MPI tasks x 1 OpenMP threads 99.6% CPU use with 4 MPI tasks x 1 OpenMP threads
MPI task timing breakdown: MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total Section | min time | avg time | max time |%varavg| %total
--------------------------------------------------------------- ---------------------------------------------------------------
Pair | 0.59266 | 0.5987 | 0.60449 | 0.6 | 97.19 Pair | 0.57816 | 0.58286 | 0.58797 | 0.5 | 98.16
Neigh | 0 | 0 | 0 | 0.0 | 0.00 Neigh | 0 | 0 | 0 | 0.0 | 0.00
Comm | 0.010733 | 0.016433 | 0.022459 | 3.7 | 2.67 Comm | 0.0049949 | 0.010104 | 0.01481 | 3.5 | 1.70
Output | 0.00020418 | 0.00021619 | 0.00025121 | 0.0 | 0.04 Output | 0.00018367 | 0.00020879 | 0.00024911 | 0.0 | 0.04
Modify | 9.9553e-05 | 0.00010738 | 0.0001217 | 0.0 | 0.02 Modify | 9.0609e-05 | 0.00010382 | 0.00012125 | 0.0 | 0.02
Other | | 0.000532 | | | 0.09 Other | | 0.0005076 | | | 0.09
Nlocal: 32 ave 32 max 32 min Nlocal: 32 ave 32 max 32 min
Histogram: 4 0 0 0 0 0 0 0 0 0 Histogram: 4 0 0 0 0 0 0 0 0 0

View File

@ -453,9 +453,10 @@ void FitPOD::get_data(datastruct &data, std::vector<std::string> species)
size_t maxname = 9; size_t maxname = 9;
for (auto fname : data.data_files) maxname = MAX(maxname,fname.size()); for (auto fname : data.data_files) maxname = MAX(maxname,fname.size());
maxname -= data.data_path.size()+1; maxname -= data.data_path.size()+1;
const std::string sepline(maxname+46, '-');
if (comm->me == 0) if (comm->me == 0)
utils::logmesg(lmp, "{:-<{}}\n {:^{}} | number of configurations | number of atoms\n{:=<{}}\n", utils::logmesg(lmp, "{}\n {:^{}} | number of configurations | number of atoms\n{}\n",
"", maxname+46, "data file", maxname, "", maxname+46); sepline, "data file", maxname, sepline);
int i = 0; int i = 0;
for (auto fname : data.data_files) { for (auto fname : data.data_files) {
std::string filename = fname.substr(data.data_path.size()+1); std::string filename = fname.substr(data.data_path.size()+1);
@ -466,7 +467,7 @@ void FitPOD::get_data(datastruct &data, std::vector<std::string> species)
++i; ++i;
} }
if (comm->me == 0) { if (comm->me == 0) {
utils::logmesg(lmp, "{:-<{}}\n", "", maxname+46); utils::logmesg(lmp, "{}\n", sepline);
utils::logmesg(lmp, "number of files: {}\n", data.data_files.size()); utils::logmesg(lmp, "number of files: {}\n", data.data_files.size());
utils::logmesg(lmp, "number of configurations in all files: {}\n", data.num_config_sum); utils::logmesg(lmp, "number of configurations in all files: {}\n", data.num_config_sum);
utils::logmesg(lmp, "number of atoms in all files: {}\n", data.num_atom_sum); utils::logmesg(lmp, "number of atoms in all files: {}\n", data.num_atom_sum);
@ -1316,54 +1317,46 @@ double FitPOD::energyforce_calculation(double *force, double *coeff, datastruct
void FitPOD::print_analysis(datastruct data, double *outarray, double *errors) void FitPOD::print_analysis(datastruct data, double *outarray, double *errors)
{ {
std::string s = "All files";
int nfiles = data.data_files.size(); // number of files int nfiles = data.data_files.size(); // number of files
int lm = s.size(); int lm = 10;
for (int i = 0; i < nfiles; i++) for (int i = 0; i < nfiles; i++)
lm = MAX(lm, (int) data.filenames[i].size()); lm = MAX(lm, (int) data.filenames[i].size());
lm = lm + 2; lm = lm + 2;
std::string filename_errors = (data.training ? "training_errors" : "test_errors"); std::string filename_errors = fmt::format("{}_{}_errors.pod", podptr->pod.filenametag, data.training ? "training" : "test");
std::string filename_analysis = (data.training ? "training_analysis" : "test_analysis"); std::string filename_analysis = fmt::format("{}_{}_analysis.pod", podptr->pod.filenametag, data.training ? "training" : "test");
filename_errors = podptr->pod.filenametag + "_" + filename_errors + ".pod";
filename_analysis = podptr->pod.filenametag + "_" + filename_analysis + ".pod";
FILE *fp_errors = nullptr; FILE *fp_errors = nullptr;
FILE *fp_analysis = nullptr; FILE *fp_analysis = nullptr;
fp_errors = fopen(filename_errors.c_str(), "w"); fp_errors = fopen(filename_errors.c_str(), "w");
fp_analysis = fopen(filename_analysis.c_str(), "w"); fp_analysis = fopen(filename_analysis.c_str(), "w");
std::string sa = "**************** Begin of Error Analysis for the Training Data Set ****************"; std::string mystr = fmt::format("**************** Begin of Error Analysis for the {} Data Set ****************\n",
std::string sb = "**************** Begin of Error Analysis for the Test Data Set ****************"; data.training ? "Training" : "Test");
std::string mystr = (data.training) ? sa : sb;
utils::logmesg(lmp, "{}\n", mystr); utils::logmesg(lmp, mystr);
fmt::print(fp_errors, mystr + "\n"); fmt::print(fp_errors, mystr);
sa = "----------------------------------------------------------------------------------------\n"; std::string sa(lm+80,'-');
sb = " File | # configs | # atoms | MAE energy | RMSE energy | MAE force | RMSE force |\n"; sa += '\n';
std::string sb = fmt::format(" {:^{}} | # configs | # atoms | MAE energy | RMSE energy | MAE force | RMSE force\n",
utils::logmesg(lmp, "{}", sa); "File", lm);
utils::logmesg(lmp, "{}", sb); utils::logmesg(lmp, sa + sb + sa);
utils::logmesg(lmp, "{}", sa); fmt::print(fp_errors, sa + sb + sa);
fmt::print(fp_errors, sa);
fmt::print(fp_errors, sb);
fmt::print(fp_errors, sa);
int ci=0, m=8, nc=0, nf=0; int ci=0, m=8, nc=0, nf=0;
for (int file = 0; file < nfiles; file++) { for (int file = 0; file < nfiles; file++) {
fmt::print(fp_analysis, "# {}\n", data.filenames[file]); fmt::print(fp_analysis, "# {}\n", data.filenames[file]);
sb = "| config | # atoms | energy | DFT energy | energy error | force | DFT force | force error |\n"; fmt::print(fp_analysis, " config # atoms energy DFT energy energy error "
fmt::print(fp_analysis, sb); " force DFT force force error\n");
int nforceall = 0; int nforceall = 0;
int nconfigs = data.num_config[file]; int nconfigs = data.num_config[file];
nc += nconfigs; nc += nconfigs;
for (int ii=0; ii < nconfigs; ii++) { // loop over each configuration in a file for (int ii=0; ii < nconfigs; ii++) { // loop over each configuration in a file
fmt::print(fp_analysis, " "); fmt::print(fp_analysis, "{:6} {:8} ", outarray[m*ci], outarray[1 + m*ci]);
for(int count = 0; count < m; count ++) for(int count = 2; count < m; count ++)
fmt::print(fp_analysis, "{} ", outarray[count + m*ci]); fmt::print(fp_analysis, "{:<15.10} ", outarray[count + m*ci]);
fmt::print(fp_analysis, "\n"); fmt::print(fp_analysis, "\n");
nforceall += 3*data.num_atom[ci]; nforceall += 3*data.num_atom[ci];
@ -1372,63 +1365,25 @@ void FitPOD::print_analysis(datastruct data, double *outarray, double *errors)
nf += nforceall; nf += nforceall;
int q = file+1; int q = file+1;
std::string s = data.filenames[file]; auto s = fmt::format("{:<{}} {:>10} {:>11} {:<10.6f} {:<10.6f} {:<10.6f} {:<10.6f}\n",
s = s + std::string(lm-s.size(), ' '); data.filenames[file], lm, nconfigs, nforceall/3,
std::string s1 = std::to_string(nconfigs); errors[0 + 4*q], errors[1 + 4*q], errors[2 + 4*q], errors[3 + 4*q]);
s1 = s1 + std::string(MAX(6- (int) s1.size(),1), ' '); utils::logmesg(lmp, s);
s = s + " " + s1; fmt::print(fp_errors, s);
s1 = std::to_string(nforceall/3);
s1 = s1 + std::string(MAX(7 - (int) s1.size(),1), ' ');
s = s + " " + s1;
s1 = std::to_string(errors[0 + 4*q]);
s1 = s1 + std::string(MAX(10 - (int) s1.size(),1), ' ');
s = s + " " + s1;
s1 = std::to_string(errors[1 + 4*q]);
s1 = s1 + std::string(MAX(10 - (int) s1.size(),1), ' ');
s = s + " " + s1;
s1 = std::to_string(errors[2 + 4*q]);
s1 = s1 + std::string(MAX(10 - (int) s1.size(),1), ' ');
s = s + " " + s1;
s1 = std::to_string(errors[3 + 4*q]);
s1 = s1 + std::string(MAX(10 - (int) s1.size(),1), ' ');
s = s + " " + s1 + "\n";
utils::logmesg(lmp, "{}", s);
fmt::print(fp_errors, "{}", s);
} }
utils::logmesg(lmp, sa);
fmt::print(fp_errors, sa);
utils::logmesg(lmp, "{}", sa); auto s = fmt::format("{:<{}} {:>10} {:>11} {:<10.6f} {:<10.6f} {:<10.6f} {:<10.6f}\n",
fmt::print(fp_errors, "{}", sa); "All files", lm, nc, nf/3, errors[0], errors[1], errors[2], errors[3]);
utils::logmesg(lmp, s + sa);
fmt::print(fp_errors, "{}", s + sa);
s = s + std::string(MAX(lm - (int) s.size(),1), ' '); mystr = fmt::format("**************** End of Error Analysis for the {} Data Set ****************\n",
std::string s1 = std::to_string(nc); data.training ? "Training" : "Test");
s1 = s1 + std::string(MAX(6- (int) s1.size(),1), ' ');
s = s + " " + s1;
s1 = std::to_string(nf/3);
s1 = s1 + std::string(MAX(7 - (int) s1.size(),1), ' ');
s = s + " " + s1;
s1 = std::to_string(errors[0]);
s1 = s1 + std::string(MAX(10 - (int) s1.size(),1), ' ');
s = s + " " + s1;
s1 = std::to_string(errors[1]);
s1 = s1 + std::string(MAX(10 - (int) s1.size(),1), ' ');
s = s + " " + s1;
s1 = std::to_string(errors[2]);
s1 = s1 + std::string(MAX(10 - (int) s1.size(),1), ' ');
s = s + " " + s1;
s1 = std::to_string(errors[3]);
s1 = s1 + std::string(MAX(10 - (int) s1.size(),1), ' ');
s = s + " " + s1 + "\n";
utils::logmesg(lmp, "{}", s);
utils::logmesg(lmp, "{}", sa);
fmt::print(fp_errors, "{}", s);
fmt::print(fp_errors, "{}", sa);
sa = "**************** End of Error Analysis for the Training Data Set ****************"; utils::logmesg(lmp, mystr);
sb = "**************** End of Error Analysis for the Test Data Set ****************"; fmt::print(fp_errors, mystr);
mystr = (data.training) ? sa : sb;
utils::logmesg(lmp, "{}\n", mystr);
fmt::print(fp_errors, "{}\n", mystr);
fclose(fp_errors); fclose(fp_errors);
fclose(fp_analysis); fclose(fp_analysis);

View File

@ -86,7 +86,7 @@ void PairPOD::compute(int eflag, int vflag)
if (peratom_warn && (vflag_atom || eflag_atom)) { if (peratom_warn && (vflag_atom || eflag_atom)) {
peratom_warn = false; peratom_warn = false;
if (comm->me == 0) if (comm->me == 0)
error->warning(FLERR, "Pair style mlpod does not support per-atom energies or stresses"); error->warning(FLERR, "Pair style pod does not support per-atom energies or stresses");
} }
double **x = atom->x; double **x = atom->x;
@ -122,8 +122,8 @@ void PairPOD::compute(int eflag, int vflag)
// compute global POD descriptors for atom i // compute global POD descriptors for atom i
podptr->linear_descriptors_ij(gd, tmpmem, rij, &tmpmem[nd1234], numneighsum, podptr->linear_descriptors_ij(gd, tmpmem, rij, &tmpmem[nd1234], numneighsum, typeai, idxi, ti,
typeai, idxi, ti, tj, 1, nij); tj, 1, nij);
} }
int nd22 = podptr->pod.nd22; int nd22 = podptr->pod.nd22;
@ -153,12 +153,11 @@ void PairPOD::compute(int eflag, int vflag)
// compute atomic force for atom i // compute atomic force for atom i
podptr->calculate_force(f, forcecoeff, rij, tmpmem, numneighsum, podptr->calculate_force(f, forcecoeff, rij, tmpmem, numneighsum, typeai, idxi, ai, aj, ti, tj,
typeai, idxi, ai, aj, ti, tj, 1, nij); 1, nij);
} }
if (vflag_fdotr) virial_fdotr_compute(); if (vflag_fdotr) virial_fdotr_compute();
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -167,7 +166,7 @@ void PairPOD::compute(int eflag, int vflag)
void PairPOD::settings(int narg, char ** /* arg */) void PairPOD::settings(int narg, char ** /* arg */)
{ {
if (narg > 0) error->all(FLERR,"Pair style mlpod accepts no arguments"); if (narg > 0) error->all(FLERR, "Pair style pod accepts no arguments");
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -176,17 +175,16 @@ void PairPOD::settings(int narg, char ** /* arg */)
void PairPOD::coeff(int narg, char **arg) void PairPOD::coeff(int narg, char **arg)
{ {
int n = atom->ntypes; const int np1 = atom->ntypes + 1;
memory->destroy(setflag); memory->destroy(setflag);
memory->destroy(cutsq); memory->destroy(cutsq);
memory->create(setflag,n+1,n+1,"pair:setflag"); memory->create(setflag, np1, np1, "pair:setflag");
memory->create(cutsq,n+1,n+1,"pair:cutsq"); memory->create(cutsq, np1, np1, "pair:cutsq");
delete[] map; delete[] map;
map = new int[n+1]; map = new int[np1];
allocated = 1; allocated = 1;
if (narg != 4 + atom->ntypes) error->all(FLERR,"Incorrect args for pair coefficients"); if (narg < 4) utils::missing_cmd_args(FLERR, "pair_coeff", error);
map_element2type(narg - 4, arg + 4); map_element2type(narg - 4, arg + 4);
std::string pod_file = std::string(arg[2]); // pod input file std::string pod_file = std::string(arg[2]); // pod input file
@ -212,9 +210,8 @@ void PairPOD::coeff(int narg, char **arg)
podptr->podArrayCopy(newpodcoeff, podptr->pod.coeff, podptr->pod.nd); podptr->podArrayCopy(newpodcoeff, podptr->pod.coeff, podptr->pod.nd);
} }
for (int ii = 0; ii < n+1; ii++) for (int ii = 0; ii < np1; ii++)
for (int jj = 0; jj < n+1; jj++) for (int jj = 0; jj < np1; jj++) cutsq[ii][jj] = podptr->pod.rcut * podptr->pod.rcut;
cutsq[ii][jj] = podptr->pod.rcut*podptr->pod.rcut;
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -223,7 +220,7 @@ void PairPOD::coeff(int narg, char **arg)
void PairPOD::init_style() void PairPOD::init_style()
{ {
if (force->newton_pair == 0) error->all(FLERR,"Pair style mlpod requires newton pair on"); if (force->newton_pair == 0) error->all(FLERR, "Pair style pod requires newton pair on");
// need a full neighbor list // need a full neighbor list
@ -291,16 +288,21 @@ void PairPOD::estimate_tempmemory()
int szsnap = 0; int szsnap = 0;
if (podptr->sna.twojmax > 0) { if (podptr->sna.twojmax > 0) {
szsnap += nijmax * dim; szsnap += nijmax * dim;
szsnap += MAX(2*podptr->sna.idxu_max*nijmax, 2*podptr->sna.idxz_max*podptr->sna.ndoubles*nablockmax); // (Ur, Ui) and (Zr, Zi) szsnap += MAX(2 * podptr->sna.idxu_max * nijmax,
2 * podptr->sna.idxz_max * podptr->sna.ndoubles *
nablockmax); // (Ur, Ui) and (Zr, Zi)
szsnap += 2 * podptr->sna.idxu_max * dim * nijmax; // dUr, dUi szsnap += 2 * podptr->sna.idxu_max * dim * nijmax; // dUr, dUi
szsnap += MAX(podptr->sna.idxb_max*podptr->sna.ntriples*dim*nijmax, 2*podptr->sna.idxu_max*podptr->sna.nelements*nablockmax); // dblist and (Utotr, Utoti) szsnap += MAX(podptr->sna.idxb_max * podptr->sna.ntriples * dim * nijmax,
2 * podptr->sna.idxu_max * podptr->sna.nelements *
nablockmax); // dblist and (Utotr, Utoti)
} }
szd = MAX(szsnap, szd); szd = MAX(szsnap, szd);
szd = nablockmax * (podptr->pod.nd1234) + szd; szd = nablockmax * (podptr->pod.nd1234) + szd;
} }
void PairPOD::lammpsNeighPairs(double **x, int **firstneigh, int *atomtypes, int *map, int *numneigh, int gi) void PairPOD::lammpsNeighPairs(double **x, int **firstneigh, int *atomtypes, int *map,
int *numneigh, int gi)
{ {
double rcutsq = podptr->pod.rcut * podptr->pod.rcut; double rcutsq = podptr->pod.rcut * podptr->pod.rcut;