[WIP] Add fix cboamd for cavity Born-Oppenheimer MD#4972
Conversation
There was a problem hiding this comment.
Pull Request Overview
This PR implements the MD framework to study vibrational strong coupling based on the cavity Born-Oppenheimer approximation by adding a new fix style fix cboamd for DeePMD-kit's LAMMPS interface.
- Adds a new LAMMPS fix implementation for cavity Born-Oppenheimer molecular dynamics
- Integrates DeepMD models for computing molecular dipoles and polarizabilities
- Implements photon coordinate evolution using velocity Verlet integration
Reviewed Changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.
| File | Description |
|---|---|
| source/lmp/plugin/deepmdplugin.cpp | Registers the new fix cboamd plugin with LAMMPS |
| source/lmp/fix_cboamd.h | Header file defining the FixCBOAMD class interface and member variables |
| source/lmp/fix_cboamd.cpp | Implementation of the cavity Born-Oppenheimer MD fix with DeepMD integration |
| fprintf(output_file, "%d %.6f %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e", | ||
| current_step, update->dt * current_step, | ||
| dipole[0], dipole[1], dipole[2], | ||
| polarizability[0], polarizability[1], polarizability[2], | ||
| polarizability[3], polarizability[4], polarizability[5], | ||
| polarizability[6], polarizability[7], polarizability[8]); |
There was a problem hiding this comment.
The output format writes 15 values but the header comment at line 160 indicates it should write Energy which is missing. The scalar energy value from compute_scalar() is not being written to the output file, creating a mismatch between the header and data columns.
| fprintf(output_file, "%d %.6f %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e", | |
| current_step, update->dt * current_step, | |
| dipole[0], dipole[1], dipole[2], | |
| polarizability[0], polarizability[1], polarizability[2], | |
| polarizability[3], polarizability[4], polarizability[5], | |
| polarizability[6], polarizability[7], polarizability[8]); | |
| double energy = compute_scalar(); | |
| fprintf(output_file, "%d %.6f %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e %.6e", | |
| current_step, update->dt * current_step, | |
| dipole[0], dipole[1], dipole[2], | |
| polarizability[0], polarizability[1], polarizability[2], | |
| polarizability[3], polarizability[4], polarizability[5], | |
| polarizability[6], polarizability[7], polarizability[8], | |
| energy); |
| for (int i=0; i<nphoton; i++) { | ||
| if (n == i) return pa[i]; | ||
| if (n == nphoton+i) return qa[i]; | ||
| if (n == 2*nphoton+i) return ea[i]; | ||
| } |
There was a problem hiding this comment.
The vector size is set to 3 at line 67, but compute_vector() attempts to return values for up to 3*nphoton indices. This will cause out-of-bounds access when n >= 3 and nphoton > 1, potentially leading to crashes or undefined behavior.
| int idx = dp * nlocal * 3 + i * 3 + di; // index in dipole_grad_deepmd: dipole component dp, atom i, coordinate di | ||
| for (int alpha = 0; alpha < nphoton; alpha++) { | ||
| // CBOA force contribution from photon alpha | ||
| f[i][di] -= ea[alpha] * lambda_photon[alpha] * lambda_vector[alpha][di] * dipole_grad_deepmd[idx] / EV_TO_HARTREE; |
There was a problem hiding this comment.
Indexing error in lambda_vector access. The code uses lambda_vector[alpha][di] but should use lambda_vector[alpha][dp] since the lambda_vector represents the coupling vector for dipole component dp, not the atomic coordinate direction di.
| f[i][di] -= ea[alpha] * lambda_photon[alpha] * lambda_vector[alpha][di] * dipole_grad_deepmd[idx] / EV_TO_HARTREE; | |
| f[i][di] -= ea[alpha] * lambda_photon[alpha] * lambda_vector[alpha][dp] * dipole_grad_deepmd[idx] / EV_TO_HARTREE; |
| static constexpr double EV_TO_HARTREE = 0.0367493; | ||
| static constexpr double ANGSTROM_TO_BOHR = 1.88973; | ||
| static constexpr double EV_PER_ANGSTROM_TO_HARTREE_PER_BOHR = 0.0194467; | ||
| static constexpr double PS_TO_AU = 41.3413745758e3; // 1 fs = 41.3413745758 a.u. of time |
There was a problem hiding this comment.
The comment incorrectly states '1 fs' when the constant name indicates picoseconds (PS). The comment should read '1 ps = 41.3413745758e3 a.u. of time' to match the PS_TO_AU constant name.
| static constexpr double PS_TO_AU = 41.3413745758e3; // 1 fs = 41.3413745758 a.u. of time | |
| static constexpr double PS_TO_AU = 41.3413745758e3; // 1 ps = 41.3413745758 a.u. of time |
for more information, see https://pre-commit.ci
✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
| FLERR, | ||
| "fix cboamd: lambda_vector must be specified when photons enabled"); | ||
| } | ||
| // if (dt <= 0.0) error->all(FLERR,"fix cboamd: dt must be > 0"); |
Check notice
Code scanning / CodeQL
Commented-out code Note
| init_deepmd_models(); | ||
|
|
||
| // Open output file | ||
| output_file = fopen("cboamd_output.dat", "w"); |
Check failure
Code scanning / CodeQL
File created without restricting permissions High
| // // Initialize DeepMD calculations | ||
| // convert_coordinates_to_deepmd_format(); | ||
| // compute_deepmd_dipole(); | ||
| // // compute_deepmd_polarizability(); |
Check notice
Code scanning / CodeQL
Commented-out code Note
| // if (photons_enabled) { | ||
| // compute_cboa_forces(); | ||
| // } |
Check notice
Code scanning / CodeQL
Commented-out code Note
| // Update photon coordinates if enabled | ||
| // if (photons_enabled) { | ||
| // update_photon_coordinates(); | ||
| // } |
Check notice
Code scanning / CodeQL
Commented-out code Note
| // Extract dipole components (DeepMD returns in eV/A, convert to a.u.) | ||
| // dipole[0] = dipole_deepmd[0] * ANGSTROM_TO_BOHR; | ||
| // dipole[1] = dipole_deepmd[1] * ANGSTROM_TO_BOHR; | ||
| // dipole[2] = dipole_deepmd[2] * ANGSTROM_TO_BOHR; |
Check notice
Code scanning / CodeQL
Commented-out code Note
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #4972 +/- ##
==========================================
- Coverage 81.95% 81.11% -0.85%
==========================================
Files 714 872 +158
Lines 73441 97331 +23890
Branches 3616 4329 +713
==========================================
+ Hits 60187 78946 +18759
- Misses 12091 17084 +4993
- Partials 1163 1301 +138 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
for more information, see https://pre-commit.ci
This PR is a work in progress and not ready for review right not.
This PR implements the MD framework to study vibrational strong coupling based on the cavity Born-Oppenheimer approximation. It adds a new fix style
fix cboamdfor DeePMD-kit's LAMMPS interface.