Implement python-side unified support, add example
This commit is contained in:
65
examples/mliap/mliap_unified_lj_Ar.py
Normal file
65
examples/mliap/mliap_unified_lj_Ar.py
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# Demonstrate how to load a unified model from python.
|
||||||
|
# This is essentially the same as in.mliap.unified.lj.Ar
|
||||||
|
# except that python is the driving program, and lammps
|
||||||
|
# is in library mode.
|
||||||
|
|
||||||
|
before_loading =\
|
||||||
|
"""# 3d Lennard-Jones melt
|
||||||
|
|
||||||
|
units lj
|
||||||
|
atom_style atomic
|
||||||
|
|
||||||
|
lattice fcc 0.8442
|
||||||
|
region box block 0 10 0 10 0 10
|
||||||
|
create_box 1 box
|
||||||
|
create_atoms 1 box
|
||||||
|
mass 1 1.0
|
||||||
|
|
||||||
|
velocity all create 3.0 87287 loop geom
|
||||||
|
"""
|
||||||
|
after_loading =\
|
||||||
|
"""
|
||||||
|
|
||||||
|
pair_style mliap unified EXISTS
|
||||||
|
pair_coeff * * Ar
|
||||||
|
|
||||||
|
neighbor 0.3 bin
|
||||||
|
neigh_modify every 20 delay 0 check no
|
||||||
|
|
||||||
|
fix 1 all nve
|
||||||
|
|
||||||
|
thermo 50
|
||||||
|
run 250
|
||||||
|
"""
|
||||||
|
|
||||||
|
import lammps
|
||||||
|
|
||||||
|
lmp = lammps.lammps(cmdargs=['-echo','both'])
|
||||||
|
|
||||||
|
# Before defining the pair style, you must do the following:
|
||||||
|
import lammps.mliap
|
||||||
|
lammps.mliap.activate_mliappy(lmp)
|
||||||
|
# Otherwise, when running lammps in library mode,
|
||||||
|
# you will get an error
|
||||||
|
|
||||||
|
# Setup the simulation to just before declaring
|
||||||
|
# the mliap unified pair style
|
||||||
|
lmp.commands_string(before_loading)
|
||||||
|
|
||||||
|
# Define the model however you like. In this example
|
||||||
|
# we simply import the unified L-J example from mliap
|
||||||
|
from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ
|
||||||
|
unified = MLIAPUnifiedLJ()
|
||||||
|
|
||||||
|
# You can also load the model from a pickle file.
|
||||||
|
# import pickle
|
||||||
|
# with open('mliap_unified_lj_Ar.pkl', 'rb') as pfile:
|
||||||
|
# unified = pickle.load(pfile)
|
||||||
|
|
||||||
|
# Connect the L-J model to the mliap unified pair style.
|
||||||
|
lammps.mliap.load_unified(unified)
|
||||||
|
|
||||||
|
|
||||||
|
# Run the simulation with the mliap unified pair style
|
||||||
|
# Use pre-loaded model by specifying model filename as "EXISTS"
|
||||||
|
lmp.commands_string(after_loading)
|
||||||
@ -17,4 +17,4 @@ if not pylib.Py_IsInitialized():
|
|||||||
raise RuntimeError("This interpreter is not compatible with python-based mliap for LAMMPS.")
|
raise RuntimeError("This interpreter is not compatible with python-based mliap for LAMMPS.")
|
||||||
del sysconfig, ctypes, library, pylib
|
del sysconfig, ctypes, library, pylib
|
||||||
|
|
||||||
from .loader import load_model, activate_mliappy
|
from .loader import load_model, load_unified, activate_mliappy
|
||||||
|
|||||||
@ -80,3 +80,12 @@ def load_model(model):
|
|||||||
"the pair style. Call lammps.mliap.activate_mliappy(lmp)."
|
"the pair style. Call lammps.mliap.activate_mliappy(lmp)."
|
||||||
) from ie
|
) from ie
|
||||||
mliap_model_python_couple.load_from_python(model)
|
mliap_model_python_couple.load_from_python(model)
|
||||||
|
|
||||||
|
def load_unified(model):
|
||||||
|
try:
|
||||||
|
import mliap_unifiedpy
|
||||||
|
except ImportError as ie:
|
||||||
|
raise ImportError("ML-IAP python module must be activated before loading\n"
|
||||||
|
"the pair style. Call lammps.mliap.activate_mliappy(lmp)."
|
||||||
|
) from ie
|
||||||
|
mliap_unifiedpy.load_from_python(model)
|
||||||
|
|||||||
@ -98,6 +98,9 @@ cdef extern from "mliap_unified.h" namespace "LAMMPS_NS":
|
|||||||
cdef void update_pair_forces(MLIAPData *, double *) except +
|
cdef void update_pair_forces(MLIAPData *, double *) except +
|
||||||
|
|
||||||
|
|
||||||
|
LOADED_MODEL = None
|
||||||
|
|
||||||
|
|
||||||
# @property sans getter
|
# @property sans getter
|
||||||
def write_only_property(fset):
|
def write_only_property(fset):
|
||||||
return property(fget=None, fset=fset)
|
return property(fget=None, fset=fset)
|
||||||
@ -334,6 +337,14 @@ cdef public void compute_forces_python(unified_int, MLIAPData *data) except * wi
|
|||||||
cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model,
|
cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model,
|
||||||
MLIAPDummyDescriptor * descriptor) with gil:
|
MLIAPDummyDescriptor * descriptor) with gil:
|
||||||
str_fname = fname.decode('utf-8')
|
str_fname = fname.decode('utf-8')
|
||||||
|
if str_fname == 'EXISTS':
|
||||||
|
if LOADED_MODEL is None:
|
||||||
|
raise ValueError("No unified model loaded")
|
||||||
|
unified = LOADED_MODEL
|
||||||
|
elif str_fname.endswith(".pt") or str_fname.endswith('.pth'):
|
||||||
|
import torch
|
||||||
|
unified = torch.load(str_fname)
|
||||||
|
else:
|
||||||
with open(str_fname, 'rb') as pfile:
|
with open(str_fname, 'rb') as pfile:
|
||||||
unified = pickle.load(pfile)
|
unified = pickle.load(pfile)
|
||||||
|
|
||||||
@ -370,3 +381,8 @@ cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model,
|
|||||||
|
|
||||||
free(elements)
|
free(elements)
|
||||||
return unified_int
|
return unified_int
|
||||||
|
|
||||||
|
|
||||||
|
def load_from_python(unified):
|
||||||
|
global LOADED_MODEL
|
||||||
|
LOADED_MODEL = unified
|
||||||
|
|||||||
Reference in New Issue
Block a user