LAMMPS driver ============= **MaxwellLink** ships a C++ ``fix mxl`` for `LAMMPS `_ so classical molecular dynamics jobs can exchange electric fields and dipole currents with the EM solver. The sources live in :mod:`maxwelllink.mxl_drivers.lammps` alongside a convenience installer. .. note:: During the run the ``fix mxl`` connects to the ``SocketHub``, receives the electric field, applies .. math:: \mathbf{F}_i = Q_i \widetilde{\mathbf{E}}, and returns .. math:: \mathrm{d}\boldsymbol{\mu}/\mathrm{d}t = \sum_i Q_i \mathbf{v}_i, where :math:`Q_i` and :math:`\mathbf{v}_i` are the partial charge and velocity of atom :math:`i`. Requirements ------------ - POSIX-like environment (the fix uses BSD sockets). - A `LAMMPS `_ build with atom IDs enabled and non-LJ units (such as ``units real`` or ``metal``). Usage ----- Socket preparation ^^^^^^^^^^^^^^^^^^ On the **MaxwellLink** side create a socket hub, for example in `Meep `_: .. code-block:: python hub = mxl.SocketHub(host="0.0.0.0", port=31415, timeout=60.0) LAMMPS build helper ^^^^^^^^^^^^^^^^^^^ Use the bundled script to build a `LAMMPS `_ executable that contains the fix: .. code-block:: bash mxl_install_lammps The script clones `LAMMPS `_, copies ``fix_maxwelllink.cpp``/``.h`` into ``src/MISC``, and compiles an ``lmp_mxl`` binary placed on ``PATH``. Advanced users may copy the fix into an existing source tree and rebuild manually. LAMMPS input ^^^^^^^^^^^^ Add the fix to the group of atoms to be coupled: .. code-block:: none fix 1 all mxl localhost 31415 Parameters ---------- .. list-table:: :header-rows: 1 * - Name - Description * - ``host`` - Hostname or IP address of the **MaxwellLink** process (third argument in the ``fix`` command). Required. * - ``port`` - TCP port exposed by :class:`~maxwelllink.sockets.sockets.SocketHub`. Must lie in ``(1024, 65536]`` for TCP mode. Required. * - ``unix`` - Optional flag (append ``unix`` to the ``fix`` command) to connect via a Unix-domain socket at ``/tmp/socketmxl_``. * - ``reset_dipole`` - Optional flag (append ``reset_dipole`` to the ``fix`` command) to subtract the molecular dipole moment by that at time zero. Returned data ------------- - ``time_au`` – Simulation time in atomic units. - ``mux_au``, ``muy_au``, ``muz_au`` – Molecular dipole components in atomic units at half a time step after the force evaluation time. - ``mux_m_au``, ``muy_m_au``, ``muz_m_au`` – Molecular dipole components in atomic units at the force evaluation time. - ``energy_au`` – Sum of kinetic and potential energy in atomic units. - ``temp_K`` – Instantaneous temperature in Kelvin. - ``pe_au`` – Potential energy contribution in atomic units (currently zero with pairwise-only setups). - ``ke_au`` – Kinetic energy contribution in atomic units. Notes ----- - Ensure every atom has a charge (``Q``) defined; otherwise the external force is zero. - The fix forces neighbor-list rebuilds every step, matching the requirement of exchanging fields at the FDTD cadence. - See :mod:`maxwelllink.mxl_drivers.lammps.install` for scripting helpers that manage download and compilation.