Open In Colab

Simple example

Set up environment (optional)

These steps are required for Google Colab, but may work on other systems too:

[1]:
#import locale
#locale.getpreferredencoding = lambda: "UTF-8"
#!python3 -m pip install pack-mm data-tutorials weas-widget

download the data needed for the tutorial.

[2]:
from data_tutorials.data import get_data

get_data(
    url="https://raw.githubusercontent.com/ddmms/pack-mm/main/examples/data/",
    filename=["UiO-66.cif", "MFI.cif"],
    folder="data",
)
try to download UiO-66.cif from https://raw.githubusercontent.com/ddmms/pack-mm/main/examples/data/ and save it in data/UiO-66.cif
saved in data/UiO-66.cif
try to download MFI.cif from https://raw.githubusercontent.com/ddmms/pack-mm/main/examples/data/ and save it in data/MFI.cif
saved in data/MFI.cif

Let us start by adding few water molecules in a MoF, UiO66. We read it using ase and visualising with weas widget

[3]:
from weas_widget import WeasWidget
from ase.io import read
viewer = WeasWidget()

mof = read("data/UiO-66.cif")

insert_centre = (10,10,10)
radius = 5.0
sphere = [{
    "type":"sphere",
    "materialType": "Standard",
    "opacity": 0.25,
    "shape":{
        "radius": radius,
        "widthSegments": 32,
        "heightSegments": 32,
        },
    "instances": [{
        "position": insert_centre,
        "scale": [1, 1, 1],

        }]
    }]
viewer.from_ase(mof)
viewer.imp.settings = sphere
viewer.avr.model_style = 1
viewer.avr.show_hydrogen_bonds = True
viewer

[3]:

to add the molecules we use, pack_molecules function from pack-mm package. We add 10 water molecules in a sphere of radius 5A centered at 10,10,10. By default intermediary configureations are saved into the current folder, you can change location by using out_path parameter. The function itself returns the energy and an Atoms object with the final system.

[4]:
from pack_mm.core.core import pack_molecules

e, final = pack_molecules(
        system=mof,
        molecule="H2O",
        nmols=10,
        arch="mace_mp",
        model="small-0b2",
        device="cpu",
        where="sphere",
        center=insert_centre,
        radius=radius,
        seed=2042,
        temperature=300,
        ntries=20,
        geometry=False,
        threshold=0.5,
       )

Inserting 10 H2O molecules in C192H112O128Zr24+.
    Using mace_mp model small-0b2 on cpu.
    Insert in sphere.
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/e3nn/o3/_wigner.py:10: UserWarning: Environment variable TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD detected, since the`weights_only` argument was not explicitly passed to `torch.load`, forcing weights_only=False.
  _Jd, _W3j_flat, _W3j_indices = torch.load(os.path.join(os.path.dirname(__file__), 'constants.pt'))
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/torch/jit/_script.py:1491: FutureWarning: `torch.jit.script` is deprecated. Please switch to `torch.compile` or `torch.export`.
  warnings.warn(
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/torch/jit/_script.py:1491: FutureWarning: `torch.jit.script` is deprecated. Please switch to `torch.compile` or `torch.export`.
  warnings.warn(
cuequivariance or cuequivariance_torch is not available. Cuequivariance acceleration will be disabled.
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/torch/jit/_script.py:1491: FutureWarning: `torch.jit.script` is deprecated. Please switch to `torch.compile` or `torch.export`.
  warnings.warn(
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/graph_longrange/slabs.py:186: SyntaxWarning: invalid escape sequence '\D'
  """
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/graph_longrange/kspace.py:224: SyntaxWarning: invalid escape sequence '\p'
  """
Downloading MACE model from 'https://github.com/ACEsuit/mace-mp/releases/download/mace_mp_0b2/mace-small-density-agnesi-stress.model'
Downloading: 100.0% (64.5 MB / 64.5 MB)
Cached MACE model to /home/runner/.cache/mace/macesmalldensityagnesistressmodel
Using Materials Project MACE for MACECalculator with /home/runner/.cache/mace/macesmalldensityagnesistressmodel
Using float64 for MACECalculator, which is slower but more accurate. Recommended for geometry optimization.
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/mace/calculators/mace.py:226: UserWarning: Environment variable TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD detected, since the`weights_only` argument was not explicitly passed to `torch.load`, forcing weights_only=False.
  torch.load(f=model_path, map_location=device)
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/torch/jit/_serialization.py:176: FutureWarning: `torch.jit.load` is deprecated. Please switch to `torch.export`.
  warnings.warn(
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/torch/jit/_serialization.py:176: FutureWarning: `torch.jit.load` is deprecated. Please switch to `torch.export`.
  warnings.warn(
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/torch/jit/_serialization.py:176: FutureWarning: `torch.jit.load` is deprecated. Please switch to `torch.export`.
  warnings.warn(
Old energy=-3381.0476613470964, new energy=-3370.6188389941453, de=10.428822352951101, acc=np.float64(6.35968917437856e-176), random=0.9224082858823739
Old energy=-3381.0476613470964, new energy=-3393.0216703637134, de=-11.974009016616947, acc=np.float64(1.4274680170617213e+201), random=0.49465704267998434
Inserted particle 1
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/ase/io/cif.py:837: UserWarning: Occupancies present but no occupancy info for "{symbol}"
  warnings.warn(str(err))
Old energy=-3393.0216703637134, new energy=-3407.1643901294656, de=-14.14271976575219, acc=np.float64(3.866480568874874e+237), random=0.9374033072986
Inserted particle 2
Old energy=-3407.1643901294656, new energy=-3421.379204063478, de=-14.214813934012454, acc=np.float64(6.28702177711595e+238), random=0.11301187136860802
Inserted particle 3
Old energy=-3421.379204063478, new energy=-3435.6401732678505, de=-14.260969204372486, acc=np.float64(3.748173134787747e+239), random=0.6368663379349846
Inserted particle 4
Old energy=-3435.6401732678505, new energy=-3449.920205947128, de=-14.28003267927761, acc=np.float64(7.835595992173649e+239), random=0.039025507402559945
Inserted particle 5
Old energy=-3449.920205947128, new energy=-3459.587665463683, de=-9.667459516555027, acc=np.float64(2.54816211802947e+162), random=0.7816264095523812
Inserted particle 6
Old energy=-3459.587665463683, new energy=-3436.541910691698, de=23.04575477198523, acc=np.float64(0.0), random=0.7946384160766508
Old energy=-3459.587665463683, new energy=-3473.109101994892, de=-13.52143653120902, acc=np.float64(1.4132315188651544e+227), random=0.3018355440106446
Inserted particle 7
Old energy=-3473.109101994892, new energy=-3483.5846161700983, de=-10.475514175206172, acc=np.float64(9.570893126725602e+175), random=0.8610063339435549
Inserted particle 8
Old energy=-3483.5846161700983, new energy=-3488.9277583955713, de=-5.343142225473002, acc=np.float64(5.765928207129622e+89), random=0.8710374922225326
Old energy=-3483.5846161700983, new energy=-3481.4354513726066, de=2.1491647974917214, acc=np.float64(7.86336077323043e-37), random=0.9372407961015686
Old energy=-3483.5846161700983, new energy=-3497.8005216160755, de=-14.215905445977114, acc=np.float64(6.558153308477886e+238), random=0.8108197601233099
Inserted particle 9
Old energy=-3497.8005216160755, new energy=-3509.2777757315635, de=-11.477254115487995, acc=np.float64(6.448348588094965e+192), random=0.44068985410214423
Inserted particle 10

visualise the final configurations.

[5]:
viewer2 = WeasWidget()
viewer2.from_ase(final)
viewer2.avr.model_style = 1
viewer2.imp.settings = sphere
viewer2.avr.show_hydrogen_bonds = True
viewer2
[5]:

adding water in a cylindrical channel in a zeolite.

[6]:
zeo = read("data/MFI.cif")
insert_centre = (10,10,13)
radius = 3.0
height = 19

cylinder= [{
    "type":"cylinder",
    "materialType": "Standard",
    "opacity": 0.5,
    "shape": {
        "radiusTop": radius,
        "radiusBottom": radius,
        "height": height,
        "radialSegments": 32,
        "heightSegments": 32,
        "openEnded": False,
      },
    "instances": [{
        "position": insert_centre,
        "scale": [1, 1, 1],
        "rotation": [0, 0, 0],
        }]
    }]

viewer3 = WeasWidget()
viewer3.from_ase(zeo)
viewer3.avr.model_style = 1
viewer3.imp.settings = cylinder
viewer3.avr.show_hydrogen_bonds = True
viewer3
[6]:
[7]:
e, final = pack_molecules(
        system=zeo,
        molecule="H2O",
        nmols=20,
        arch="mace_mp",
        model="small-0b2",
        device="cpu",
        where="cylinderY",
        center=insert_centre,
        radius=radius,
        height=height,
        seed=2042,
        temperature=300,
        ntries=20,
        geometry=False,
        threshold=0.5,
        )
Inserting 20 H2O molecules in O384Si192+.
    Using mace_mp model small-0b2 on cpu.
    Insert in cylinderY.
Using Materials Project MACE for MACECalculator with /home/runner/.cache/mace/macesmalldensityagnesistressmodel
Using float64 for MACECalculator, which is slower but more accurate. Recommended for geometry optimization.
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/mace/calculators/mace.py:226: UserWarning: Environment variable TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD detected, since the`weights_only` argument was not explicitly passed to `torch.load`, forcing weights_only=False.
  torch.load(f=model_path, map_location=device)
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/torch/jit/_serialization.py:176: FutureWarning: `torch.jit.load` is deprecated. Please switch to `torch.export`.
  warnings.warn(
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/torch/jit/_serialization.py:176: FutureWarning: `torch.jit.load` is deprecated. Please switch to `torch.export`.
  warnings.warn(
Old energy=-4543.984150644415, new energy=-4552.690825490565, de=-8.706674846149326, acc=np.float64(1.8439515292461727e+146), random=0.9224082858823739
Inserted particle 1
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/ase/io/cif.py:837: UserWarning: Occupancies present but no occupancy info for "{symbol}"
  warnings.warn(str(err))
Old energy=-4552.690825490565, new energy=-4566.2022660167895, de=-13.51144052622476, acc=np.float64(9.600365441610992e+226), random=0.49465704267998434
Inserted particle 2
Old energy=-4566.2022660167895, new energy=-4571.521794768441, de=-5.319528751651887, acc=np.float64(2.3130242987011004e+89), random=0.9374033072986
Old energy=-4566.2022660167895, new energy=-4580.333308720133, de=-14.131042703343155, acc=np.float64(2.461216119045759e+237), random=0.11301187136860802
Inserted particle 3
Old energy=-4580.333308720133, new energy=-4560.127906205715, de=20.205402514417983, acc=np.float64(0.0), random=0.6368663379349846
Old energy=-4580.333308720133, new energy=-4582.399505664007, de=-2.0661969438742744, acc=np.float64(5.135618201667795e+34), random=0.039025507402559945
Old energy=-4580.333308720133, new energy=-4594.482336527393, de=-14.149027807260609, acc=np.float64(4.934990275439833e+237), random=0.7816264095523812
Inserted particle 4
Old energy=-4594.482336527393, new energy=-4584.121419013303, de=10.360917514090033, acc=np.float64(8.794018253632758e-175), random=0.7946384160766508
Old energy=-4594.482336527393, new energy=-4605.817221986984, de=-11.334885459590623, acc=np.float64(2.616733779266562e+190), random=0.3018355440106446
Inserted particle 5
Old energy=-4605.817221986984, new energy=-4619.169331375433, de=-13.352109388449207, acc=np.float64(2.021350137722641e+224), random=0.8610063339435549
Inserted particle 6
Old energy=-4619.169331375433, new energy=-4628.30954335333, de=-9.140211977896797, acc=np.float64(3.538793628161449e+153), random=0.8710374922225326
Inserted particle 7
Old energy=-4628.30954335333, new energy=-4642.0787430817645, de=-13.769199728434614, acc=np.float64(2.0533039813926956e+231), random=0.9372407961015686
Inserted particle 8
Old energy=-4642.0787430817645, new energy=-4643.504790735269, de=-1.426047653504611, acc=np.float64(9.048035919855822e+23), random=0.8108197601233099
Old energy=-4642.0787430817645, new energy=-4626.9616981129175, de=15.11704496884704, acc=np.float64(1.1084997489782294e-254), random=0.44068985410214423
Old energy=-4642.0787430817645, new energy=-4641.840970690631, de=0.23777239113314863, acc=np.float64(0.00010129739518974789), random=0.8847889911084612
Old energy=-4642.0787430817645, new energy=-4656.116235496684, de=-14.037492414919143, acc=np.float64(6.600449934059548e+235), random=0.2117478385102951
Inserted particle 9
Old energy=-4656.116235496684, new energy=-4669.819961058277, de=-13.703725561593274, acc=np.float64(1.6313054361157868e+230), random=0.8188187672234769
Inserted particle 10
Old energy=-4669.819961058277, new energy=-4679.548273549709, de=-9.728312491432007, acc=np.float64(2.6823311082475752e+163), random=0.2555871566261533
Inserted particle 11
Old energy=-4679.548273549709, new energy=-4671.260037962477, de=8.288235587231611, acc=np.float64(5.803941794169964e-140), random=0.5587630356823694
Old energy=-4679.548273549709, new energy=-4690.688155850054, de=-11.139882300344652, acc=np.float64(1.3862754598681705e+187), random=0.807305293242636
Inserted particle 12
Old energy=-4690.688155850054, new energy=-4699.7711438392125, de=-9.082987989158937, acc=np.float64(3.8684252551328153e+152), random=0.6110986123209559
Inserted particle 13
Old energy=-4699.7711438392125, new energy=-4705.374837846813, de=-5.603694007600097, acc=np.float64(1.373877492111203e+94), random=0.631222202449424
Old energy=-4699.7711438392125, new energy=-4701.75014363262, de=-1.9789997934076382, acc=np.float64(1.7609400720336653e+33), random=0.8612732489649417
Old energy=-4699.7711438392125, new energy=-4699.878914482492, de=-0.10777064327976404, acc=np.float64(64.63499773408141), random=0.5019879170553969
Old energy=-4699.7711438392125, new energy=-4713.812785344842, de=-14.041641505629741, acc=np.float64(7.749527451258295e+235), random=0.8002614415162514
Inserted particle 14
Old energy=-4713.812785344842, new energy=-4719.350651243367, de=-5.537865898524615, acc=np.float64(1.076673621480359e+93), random=0.7117058040956253
Old energy=-4713.812785344842, new energy=-4716.289805740412, de=-2.477020395569525, acc=np.float64(4.093787587655895e+41), random=0.8707401703354793
Old energy=-4713.812785344842, new energy=-4718.037072635966, de=-4.224287291123801, acc=np.float64(9.224168233543556e+70), random=0.2190248203340861
Old energy=-4713.812785344842, new energy=-4650.435851534244, de=63.37693381059853, acc=np.float64(0.0), random=0.0113592443716658
Old energy=-4713.812785344842, new energy=-4688.3935592835305, de=25.419226061311747, acc=np.float64(0.0), random=0.15251555599374556
Old energy=-4713.812785344842, new energy=-4727.719363689371, de=-13.906578344528498, acc=np.float64(4.171701328179117e+233), random=0.1678701161691194
Inserted particle 15
Old energy=-4727.719363689371, new energy=-4719.16728912486, de=8.552074564510804, acc=np.float64(2.1449728699886036e-144), random=0.11413860595939296
Old energy=-4727.719363689371, new energy=-4728.270987823262, de=-0.5516241338909822, acc=np.float64(1848760841.044574), random=0.029367546958943724
Old energy=-4727.719363689371, new energy=-4737.001169408992, de=-9.281805719620934, acc=np.float64(8.463036483164684e+155), random=0.2750773454072263
Inserted particle 16
Old energy=-4737.001169408992, new energy=-4640.620354277912, de=96.38081513107954, acc=np.float64(0.0), random=0.5402198145844561
Old energy=-4737.001169408992, new energy=-4725.965056233109, de=11.036113175882747, acc=np.float64(3.993885612893672e-186), random=0.4216516721709844
Old energy=-4737.001169408992, new energy=-4723.46116233873, de=13.540007070261709, acc=np.float64(3.449969486519337e-228), random=0.6592666257236905
Old energy=-4737.001169408992, new energy=-4749.52833749435, de=-12.527168085358426, acc=np.float64(2.8004827346729075e+210), random=0.46744517389126106
Inserted particle 17
Old energy=-4749.52833749435, new energy=-4754.55167690948, de=-5.023339415130067, acc=np.float64(2.445775835426757e+84), random=0.5694534391371324
Old energy=-4749.52833749435, new energy=-4731.6343374588005, de=17.894000035549652, acc=np.float64(2.4770106582055226e-301), random=0.8152928855896102
Old energy=-4749.52833749435, new energy=-4740.110802435236, de=9.417535059114016, acc=np.float64(6.198983285690767e-159), random=0.40523460212456675
Old energy=-4749.52833749435, new energy=-4753.81601692029, de=-4.287679425940041, acc=np.float64(1.0711950830565258e+72), random=0.7055389365261121
Old energy=-4749.52833749435, new energy=-4763.47832420085, de=-13.949986706499658, acc=np.float64(2.236360644499292e+234), random=0.6432392501802755
Inserted particle 18
Old energy=-4763.47832420085, new energy=-4767.401970526241, de=-3.9236463253910188, acc=np.float64(8.210688294721809e+65), random=0.1356976586795393
Old energy=-4763.47832420085, new energy=-4772.058489063222, de=-8.58016486237193, acc=np.float64(1.3818935547490008e+144), random=0.9278720134044764
Inserted particle 19
Old energy=-4772.058489063222, new energy=-4775.743582310772, de=-3.6850932475499576, acc=np.float64(8.069802001016204e+61), random=0.8265773396186502
Old energy=-4772.058489063222, new energy=-4753.3391798158245, de=18.719309247397177, acc=np.float64(3.38328536e-315), random=0.4831199317082193
Old energy=-4772.058489063222, new energy=-4778.499643662688, de=-6.441154599466245, acc=np.float64(1.609427892932299e+108), random=0.34988309255726047
Old energy=-4772.058489063222, new energy=-4775.801985302112, de=-3.743496238890657, acc=np.float64(7.726632998370274e+62), random=0.5895780411613539
Old energy=-4772.058489063222, new energy=-4758.325468648649, de=13.73302041457282, acc=np.float64(1.9739342362082364e-231), random=0.10757791997248489
Old energy=-4772.058489063222, new energy=-4781.851382910407, de=-9.792893847185042, acc=np.float64(3.261608129658829e+164), random=0.6708568138211254
Inserted particle 20
[8]:
viewer4 = WeasWidget()
viewer4.from_ase(final)
viewer4.avr.model_style = 1
viewer4.imp.settings = cylinder
viewer4.avr.show_hydrogen_bonds = True
viewer4
[8]: