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'))
cuequivariance or cuequivariance_torch is not available. Cuequivariance acceleration will be disabled.
Downloading MACE model from 'https://github.com/ACEsuit/mace-mp/releases/download/mace_mp_0b2/mace-small-density-agnesi-stress.model'
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:139: 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)
Old energy=-3381.0476613393985, new energy=-3370.6188389094477, de=10.428822429950742, acc=6.359670232199139e-176, random=0.9224082858823739
Old energy=-3381.0476613393985, new energy=-3393.021670356011, de=-11.9740090166124, acc=1.4274680168105864e+201, random=0.49465704267998434
Inserted particle 1
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/ase/io/cif.py:834: UserWarning: Occupancies present but no occupancy info for "{symbol}"
  warnings.warn(str(err))
Old energy=-3393.021670356011, new energy=-3407.164390121765, de=-14.14271976575401, acc=3.866480569146967e+237, random=0.9374033072986
Inserted particle 2
Old energy=-3407.164390121765, new energy=-3421.3792040557755, de=-14.214813934010635, acc=6.287021776674234e+238, random=0.11301187136860802
Inserted particle 3
Old energy=-3421.3792040557755, new energy=-3435.640173260148, de=-14.260969204372486, acc=3.748173134787747e+239, random=0.6368663379349846
Inserted particle 4
Old energy=-3435.640173260148, new energy=-3449.9202059394256, de=-14.28003267927761, acc=7.835595992173649e+239, random=0.039025507402559945
Inserted particle 5
Old energy=-3449.9202059394256, new energy=-3459.5876654559816, de=-9.667459516555937, acc=2.5481621181191297e+162, random=0.7816264095523812
Inserted particle 6
Old energy=-3459.5876654559816, new energy=-3436.541910685068, de=23.04575477091339, acc=0.0, random=0.7946384160766508
Old energy=-3459.5876654559816, new energy=-3473.1091019871897, de=-13.52143653120811, acc=1.4132315188155088e+227, random=0.3018355440106446
Inserted particle 7
Old energy=-3473.1091019871897, new energy=-3483.5846161623977, de=-10.47551417520799, acc=9.570893127399126e+175, random=0.8610063339435549
Inserted particle 8
Old energy=-3483.5846161623977, new energy=-3488.927758388174, de=-5.343142225776319, acc=5.765928274780072e+89, random=0.8710374922225326
Old energy=-3483.5846161623977, new energy=-3481.4354513695935, de=2.1491647928041857, acc=7.863362199031147e-37, random=0.9372407961015686
Old energy=-3483.5846161623977, new energy=-3497.8005216083743, de=-14.21590544597666, acc=6.558153308362322e+238, random=0.8108197601233099
Inserted particle 9
Old energy=-3497.8005216083743, new energy=-3509.2777757238637, de=-11.477254115489359, acc=6.44834858843512e+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:139: 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)
Old energy=-4543.984150742647, new energy=-4552.690825588798, de=-8.706674846151145, acc=1.8439515293759357e+146, random=0.9224082858823739
Inserted particle 1
/home/runner/work/pack-mm/pack-mm/.venv/lib/python3.12/site-packages/ase/io/cif.py:834: UserWarning: Occupancies present but no occupancy info for "{symbol}"
  warnings.warn(str(err))
Old energy=-4552.690825588798, new energy=-4566.202266115021, de=-13.511440526222941, acc=9.600365440935392e+226, random=0.49465704267998434
Inserted particle 2
Old energy=-4566.202266115021, new energy=-4571.521794866674, de=-5.319528751652797, acc=2.3130242987824865e+89, random=0.9374033072986
Old energy=-4566.202266115021, new energy=-4580.333308818365, de=-14.131042703344065, acc=2.4612161191322195e+237, random=0.11301187136860802
Inserted particle 3
Old energy=-4580.333308818365, new energy=-4560.12790634858, de=20.20540246978544, acc=0.0, random=0.6368663379349846
Old energy=-4580.333308818365, new energy=-4582.399505762689, de=-2.066196944323565, acc=5.135618290921427e+34, random=0.039025507402559945
Old energy=-4580.333308818365, new energy=-4594.48233662563, de=-14.149027807264247, acc=4.934990276134405e+237, random=0.7816264095523812
Inserted particle 4
Old energy=-4594.48233662563, new energy=-4584.12141911385, de=10.360917511779917, acc=8.794019039460393e-175, random=0.7946384160766508
Old energy=-4594.48233662563, new energy=-4605.8172220852175, de=-11.334885459587895, acc=2.616733778990344e+190, random=0.3018355440106446
Inserted particle 5
Old energy=-4605.8172220852175, new energy=-4619.169331473668, de=-13.352109388450117, acc=2.0213501377936496e+224, random=0.8610063339435549
Inserted particle 6
Old energy=-4619.169331473668, new energy=-4628.309543451563, de=-9.140211977894978, acc=3.538793627912416e+153, random=0.8710374922225326
Inserted particle 7
Old energy=-4628.309543451563, new energy=-4642.078743180002, de=-13.769199728439162, acc=2.0533039817540508e+231, random=0.9372407961015686
Inserted particle 8
Old energy=-4642.078743180002, new energy=-4643.504790833504, de=-1.4260476535018825, acc=9.048035918900856e+23, random=0.8108197601233099
Old energy=-4642.078743180002, new energy=-4626.961698219595, de=15.117044960406929, acc=1.1085001108793395e-254, random=0.44068985410214423
Old energy=-4642.078743180002, new energy=-4641.8409707888695, de=0.23777239113223914, acc=0.0001012973951933116, random=0.8847889911084612
Old energy=-4642.078743180002, new energy=-4656.116235594917, de=-14.037492414915505, acc=6.600449933130571e+235, random=0.2117478385102951
Inserted particle 9
Old energy=-4656.116235594917, new energy=-4669.819961156509, de=-13.703725561591455, acc=1.6313054360009885e+230, random=0.8188187672234769
Inserted particle 10
Old energy=-4669.819961156509, new energy=-4679.548273647943, de=-9.728312491433826, acc=2.6823311084363367e+163, random=0.2555871566261533
Inserted particle 11
Old energy=-4679.548273647943, new energy=-4671.26003806082, de=8.288235587122472, acc=5.803941818672488e-140, random=0.5587630356823694
Old energy=-4679.548273647943, new energy=-4690.688155948287, de=-11.139882300344652, acc=1.3862754598681705e+187, random=0.807305293242636
Inserted particle 12
Old energy=-4690.688155948287, new energy=-4699.771143937449, de=-9.082987989161666, acc=3.868425255541159e+152, random=0.6110986123209559
Inserted particle 13
Old energy=-4699.771143937449, new energy=-4705.37483794505, de=-5.603694007601007, acc=1.3738774921595053e+94, random=0.631222202449424
Old energy=-4699.771143937449, new energy=-4701.750143730852, de=-1.9789997934030907, acc=1.7609400717239125e+33, random=0.8612732489649417
Old energy=-4699.771143937449, new energy=-4699.878914580726, de=-0.10777064327703556, acc=64.63499772725962, random=0.5019879170553969
Old energy=-4699.771143937449, new energy=-4713.812785443077, de=-14.041641505627922, acc=7.749527450712944e+235, random=0.8002614415162514
Inserted particle 14
Old energy=-4713.812785443077, new energy=-4719.350651341602, de=-5.537865898525524, acc=1.0766736215182428e+93, random=0.7117058040956253
Old energy=-4713.812785443077, new energy=-4716.2898058386445, de=-2.477020395567706, acc=4.093787587367806e+41, random=0.8707401703354793
Old energy=-4713.812785443077, new energy=-4718.0370727342, de=-4.2242872911228915, acc=9.224168233218994e+70, random=0.2190248203340861
Old energy=-4713.812785443077, new energy=-4650.435851688589, de=63.376933754488164, acc=0.0, random=0.0113592443716658
Old energy=-4713.812785443077, new energy=-4688.393559388811, de=25.41922605426589, acc=0.0, random=0.15251555599374556
Old energy=-4713.812785443077, new energy=-4727.719363787602, de=-13.90657834452486, acc=4.1717013275924475e+233, random=0.1678701161691194
Inserted particle 15
Old energy=-4727.719363787602, new energy=-4719.16728922509, de=8.552074562511734, acc=2.144973035854028e-144, random=0.11413860595939296
Old energy=-4727.719363787602, new energy=-4728.270987921493, de=-0.5516241338909822, acc=1848760841.044574, random=0.029367546958943724
Old energy=-4727.719363787602, new energy=-4737.001169507221, de=-9.281805719619115, acc=8.463036482569603e+155, random=0.2750773454072263
Inserted particle 16
Old energy=-4737.001169507221, new energy=-4640.620354414233, de=96.38081509298809, acc=0.0, random=0.5402198145844561
Old energy=-4737.001169507221, new energy=-4725.965056333371, de=11.036113173850026, acc=3.993885926929598e-186, random=0.4216516721709844
Old energy=-4737.001169507221, new energy=-4723.461162437476, de=13.540007069745116, acc=3.449969555459165e-228, random=0.6592666257236905
Old energy=-4737.001169507221, new energy=-4749.528337592576, de=-12.527168085354788, acc=2.800482734278755e+210, random=0.46744517389126106
Inserted particle 17
Old energy=-4749.528337592576, new energy=-4754.5516770077065, de=-5.023339415130977, acc=2.445775835512814e+84, random=0.5694534391371324
Old energy=-4749.528337592576, new energy=-4731.6343375595625, de=17.89400003301307, acc=2.4770109012482297e-301, random=0.8152928855896102
Old energy=-4749.528337592576, new energy=-4740.110802533656, de=9.417535058919384, acc=6.198983332360949e-159, random=0.40523460212456675
Old energy=-4749.528337592576, new energy=-4753.816017018522, de=-4.287679425946408, acc=1.0711950833203333e+72, random=0.7055389365261121
Old energy=-4749.528337592576, new energy=-4763.47832429908, de=-13.949986706504205, acc=2.2363606448926088e+234, random=0.6432392501802755
Inserted particle 18
Old energy=-4763.47832429908, new energy=-4767.401970624469, de=-3.9236463253891998, acc=8.210688294144005e+65, random=0.1356976586795393
Old energy=-4763.47832429908, new energy=-4772.058489161457, de=-8.580164862377387, acc=1.3818935550407413e+144, random=0.9278720134044764
Inserted particle 19
Old energy=-4772.058489161457, new energy=-4775.743582409003, de=-3.68509324754541, acc=8.069801999596481e+61, random=0.8265773396186502
Old energy=-4772.058489161457, new energy=-4753.3391799189885, de=18.719309242468626, acc=3.383286005e-315, random=0.4831199317082193
Old energy=-4772.058489161457, new energy=-4778.499643760922, de=-6.441154599464426, acc=1.60942789281904e+108, random=0.34988309255726047
Old energy=-4772.058489161457, new energy=-4775.801985400347, de=-3.7434962388897475, acc=7.726632998098404e+62, random=0.5895780411613539
Old energy=-4772.058489161457, new energy=-4758.325468747975, de=13.733020413482336, acc=1.9739343194725535e-231, random=0.10757791997248489
Old energy=-4772.058489161457, new energy=-4781.851383008641, de=-9.792893847184132, acc=3.261608129544066e+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]: