From 8b5314c262670d6628659b3d43a6004f9d147e90 Mon Sep 17 00:00:00 2001 From: Luthaf Date: Mon, 15 Apr 2024 18:48:49 +0200 Subject: [PATCH] Update to the latest metatensor-torch --- drivers/py/pes/ase.py | 4 +- drivers/py/pes/metatensor.py | 73 ++++++++++++-- drivers/py/pes/pet.py | 6 +- examples/clients/metatensor/.gitignore | 7 ++ examples/clients/metatensor/README.md | 21 +++-- examples/clients/metatensor/create-model.py | 27 ++++++ examples/clients/metatensor/harmonic-model.pt | Bin 23324 -> 0 bytes examples/clients/metatensor/initial.xyz | 56 ----------- examples/clients/metatensor/input.xml | 89 +++++++++--------- examples/clients/metatensor/nickel-lj.pt | Bin 0 -> 30587 bytes examples/clients/metatensor/nickel.xyz | 34 +++++++ 11 files changed, 193 insertions(+), 124 deletions(-) create mode 100644 examples/clients/metatensor/.gitignore create mode 100644 examples/clients/metatensor/create-model.py delete mode 100644 examples/clients/metatensor/harmonic-model.pt delete mode 100644 examples/clients/metatensor/initial.xyz create mode 100644 examples/clients/metatensor/nickel-lj.pt create mode 100644 examples/clients/metatensor/nickel.xyz diff --git a/drivers/py/pes/ase.py b/drivers/py/pes/ase.py index d17ffe545..7d5597a52 100644 --- a/drivers/py/pes/ase.py +++ b/drivers/py/pes/ase.py @@ -18,9 +18,9 @@ ERROR_MSG = """ This ASE driver requires specification of and ASE calculator -and an ASE-readable template file that describes the chemical makeup of the structure. +and an ASE-readable template file that describes the chemical makeup of the structure. -Example: python driver.py -m ase -u -o template.xyz,model_parameters +Example: python driver.py -m ase -u -o template.xyz,model_parameters """ diff --git a/drivers/py/pes/metatensor.py b/drivers/py/pes/metatensor.py index 14d4dd527..8c1585e20 100644 --- a/drivers/py/pes/metatensor.py +++ b/drivers/py/pes/metatensor.py @@ -1,25 +1,32 @@ -"""Interface with the [metatensor](https://lab-cosmo.github.io/metatensor/latest/atomistic/index.html) -calculator, that can be used to perform calculations based on different types of machine learning potentials""" +""" +Interface with metatensor +(https://lab-cosmo.github.io/metatensor/latest/atomistic/index.html), that can +be used to perform calculations based on different types of machine learning +potentials +""" import sys -from .ase import ASEDriver from ipi.utils.messages import warning +from .ase import ASEDriver + try: + import metatensor.torch from metatensor.torch.atomistic.ase_calculator import MetatensorCalculator -except ImportError: - warning("Could not find or import the metatensor module") +except ImportError as e: + warning(f"Could not find or import metatensor.torch: {e}") MetatensorCalculator = None __DRIVER_NAME__ = "metatensor" __DRIVER_CLASS__ = "MetatensorDriver" ERROR_MSG = """ -The metatensor driver requires specification of a .pt torchscript model -and an ASE-readable template file that describes the chemical makeup of the structure. +The metatensor driver requires specification of a .pt TorchScript model and an +ASE-readable template file that describes the chemical makeup of the structure. -Example: python driver.py -m metatensor -u -o model.pt,template.xyz +Example: python driver.py -m metatensor -u -o template.xyz,model.pt,device=cpu,\ +extensions=path/to/extensions,check_consistency=False """ @@ -34,11 +41,57 @@ def check_arguments(self): """ if MetatensorCalculator is None: - raise ImportError("Couldn't load metatensor bindings") + raise ImportError("could not import metatensor.torch, is it installed?") + + metatensor_major, metatensor_minor, *_ = metatensor.torch.__version__.split(".") + metatensor_major = int(metatensor_major) + metatensor_minor = int(metatensor_minor) + + if metatensor_major != 0 or metatensor_minor != 4: + raise ImportError( + "this code is only compatible with metatensor-torch v0.4.x, " + f"found version v{metatensor.torch.__version__} " + f"at '{metatensor.torch.__file__}'" + ) + super().check_arguments() if len(self.args) < 2: sys.exit(self.error_msg) self.model_path = self.args[1] - self.ase_calculator = MetatensorCalculator(self.model_path) + device = None + extensions_directory = None + check_consistency = False + for arg in self.args[2:]: + if arg.startswith("device="): + device = arg[7:] + elif arg.startswith("extensions="): + extensions_directory = arg[11:] + elif arg.startswith("check_consistency="): + arg = arg[18:] + if arg == "True": + check_consistency = True + elif arg == "False": + check_consistency = False + else: + raise ValueError( + "invalid value for check_consistency, expected True or False, " + f"got {arg}" + ) + + else: + sys.exit(self.error_msg) + + # print("device = ", device) + # print(device) + + self.ase_calculator = MetatensorCalculator( + self.model_path, + device=device, + extensions_directory=extensions_directory, + check_consistency=check_consistency, + ) + + # Show the model metadata to the users + print(self.ase_calculator.metadata()) diff --git a/drivers/py/pes/pet.py b/drivers/py/pes/pet.py index 4a5234782..1d33f7cf6 100644 --- a/drivers/py/pes/pet.py +++ b/drivers/py/pes/pet.py @@ -26,9 +26,9 @@ class PET_driver(Dummy_driver): def __init__(self, args=None, verbose=False): self.error_msg = """ -The PET driver requires specification of a .json model file fitted with - the PET tools, and a template file that describes the chemical makeup of -the structure. +The PET driver requires specification of a .json model file fitted with +the PET tools, and a template file that describes the chemical makeup of +the structure. Example: python driver.py -m pet -u -o model.json,template.xyz """ diff --git a/examples/clients/metatensor/.gitignore b/examples/clients/metatensor/.gitignore new file mode 100644 index 000000000..6052486bc --- /dev/null +++ b/examples/clients/metatensor/.gitignore @@ -0,0 +1,7 @@ +collected-extensions/ +nickel-lj-extensions.pt + +lj-nickel.out +lj-nickel.restart +lj-nickel.xc.xyz +RESTART diff --git a/examples/clients/metatensor/README.md b/examples/clients/metatensor/README.md index 95409a854..5f53e7286 100644 --- a/examples/clients/metatensor/README.md +++ b/examples/clients/metatensor/README.md @@ -1,16 +1,19 @@ metatensor - i-PI example ======================== -Runs a _very_ contrieved example of a metatensor model. -The model is just a hard-coded Einstein crystal model for a -chunk of diamond. No periodic boundary conditions, no ability -to work with a different number of atoms or just a differently -oriented sample. Really, this is just to show how to run the -driver. Given that metatensor model takes a torchsript file -for a model, the very same machinery can be used for actual -ML potentials, or torchscript-implemented models. +Runs an example of a metatensor model, implementing a basic Lennard-Jones model +with the parameters for Nickel. + +This driver can be used with any model following the [metatensor atomistic +models](https://lab-cosmo.github.io/metatensor/latest/atomistic/index.html) +interface. This can be used for classical force-fields, but it more intended for +machine learning potentials. + ```bash i-pi input.xml; sleep 1 & -i-pi-py_driver -a metatensor -u -m metatensor -o initial.xyz,harmonic-model.pt +i-pi-py_driver -a metatensor -u -m metatensor -o nickel.xyz,nickel-lj.pt + +# with all the optional parameters: +i-pi-py_driver -a metatensor -u -m metatensor -o nickel.xyz,nickel-lj.pt,device=cpu,extensions=some-extensions-dir/,check_consistency=True ``` diff --git a/examples/clients/metatensor/create-model.py b/examples/clients/metatensor/create-model.py new file mode 100644 index 000000000..cfd039ad4 --- /dev/null +++ b/examples/clients/metatensor/create-model.py @@ -0,0 +1,27 @@ +# Use https://github.com/Luthaf/metatensor-lj-test/ to define a basic LJ model, +# with and without a custom TorchScript extension +import metatensor_lj_test + +model = metatensor_lj_test.lennard_jones_model( + atomic_type=28, + cutoff=6.5, + sigma=1.5808, + epsilon=0.1729, + length_unit="Angstrom", + energy_unit="eV", + with_extension=False, +) + +model.export("nickel-lj.pt") + + +model = metatensor_lj_test.lennard_jones_model( + atomic_type=28, + cutoff=6.5, + sigma=1.5808, + epsilon=0.1729, + length_unit="Angstrom", + energy_unit="eV", + with_extension=True, +) +model.export("nickel-lj-extensions.pt", collect_extensions="collected-extensions/") diff --git a/examples/clients/metatensor/harmonic-model.pt b/examples/clients/metatensor/harmonic-model.pt deleted file mode 100644 index 809daadc403a33608eefe1f334e164347a88fb5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23324 zcmbq)1y~hZ*FPy;(%miH-Cfch2ROi?yBh=r>Fx$;2|>EMK?I}@rIeJEQh(6Pt?#|} z{eRCl&ogH;d)05RwP&$r&z|QB&@d1X@bD1-;~<5QfUp8M+d0^S%$V#P%z?HnKu=d^ zz{4-l-UZ}f?;e{np}T&w`>T-*;-ATJ*e8vwv&%E<}jaIsPN89rBlgKvp+9O=(K^P#x!{5c4AR(4J%RyHPfE)6zLelB)?HV$Sk zRvtD^9!6GHepc3pK{?t2TrC`&?H-189~y2>CP{#^2gshn?*ZYp-&%p}J-UbUpAphR zQ2sN*U;bxu2Rc6lSX!L)&shIcq*<9cm|2<4f$nTv4-f=iP%R%)K|GB;Xt^Zo&QTX)cgXfL~tmtF=S2<+SU)RW@kNoF!1~J{U7^08uU-|#g z`>X$2ndfB5N< z{;2oy`WHX)Z*lx%9FKf|AID$yKjL_l|6@Kp%0KG=d;3WLd;1F)_TTXQ;m=1rk8*$2 z`#5i~fA{0#I3ML6^*_ozUO&TU-=*P{V|Uo>5sS`uOIdQRqvyJVSo42BmV!)_lG|p`5xOxfBcgB!%vU& zM?8<$kNW@G68(o>R=i!I*pHnd| z1mk~7#mtU2w$kFX|G&vN5X#K>*FSw@W9C091?FFs0>IV54&>qrGGqQ(z#uC9USfzn zQj{Jl8$>4v`XE0#orf~$zQh69gX}GxAYbX=++Q1mT#PN;Y;BEA0cJKH0B3V!D+dP~ zCn#kdf(NQI(8&$x;tDi3wg-YNtxO%9U5st-ZMrx?oBaY|4RU2Rb_AK(*a8uq?^zw3 zfyS<0j`u$ROGGCaLpq?2(7h(bdm;Tl#_~(n%ogC{0(ANF$dn(=JP4>bx;_+QhEA|y zYC0$nc+3Ef08@}H$Q1;1aeDG6=lqjG#Gf9J_>&l-6C8bzju0dSgbyOw{Xt<1w6}D% zGIp~Exjs}LV)m9UuFej26wiK<9o$?U-CSMnNx%4i$^h+w&X!((>HF31>1Ycw1GySo zIs?o>K>MF^`i8$$J#ai66plb=ng%Ub|!U4VZhJGlYuT|ur7>M4FR^f!(N2R~4M z4o>AKz~A8hvT$$XaX3INil5_nAo%_K%kQ^=xi|vN?%jB=NB?&Y?w^1ChL_?mX8!C$ z3Pe9AcvB|?9gK&d*w{OG*c<pN?p~{FH-Ba!lo%=@s z2vY|uXD4(S5%3`_QW2S%&Vy2WfW5;#8lbZihKwlH1M59A)cudWozv6bd)#!;@4F;H zX0H18^Wqtqg{=d?)zAquOwG;o=NNy5$O+5pCtNF(pDKXvPS{qzkYN9T1o~c+-8~6M zM&!Av()4lZwGP~U*ZqTtt1}SjgexN|z)fs^<45*$kTzxjTNXP9TPHjjkz$T1Fm=Ml zPlGnrKYQ_IL|*VMHJn>=x>@~1mOZvV~a%#S`dbRxLF)gCYz-{%xJTc8u+ zAE85({q2G2x2!_+5FRVYS627g0`*?xzIHbQ8k^nUv99+M*ojz16oLFoLy`$k2m79S zpGod-TvKO|o1L+vgUkIbe9!1a@>?1)c5?;Ux**;s9MgL?bK_s7y0JSuq7x|{-A_ah zxdmVebRzpDf+*?WW@-ym|J94=M6PpxOGB_aQRqB)+04<+iBcioRn>_~0fJ6}TLIdY zP61j0()E>@nS-q@(CnvqL=|Uqpfk|?A-af8)bwhuYECq6rcSi?Cmr)cwx5r4F7Ut4 z^bhAlw#T}En*5)SlVT8`qv7c^{WF zJ`=_zb>3pGe9v$;Aw_pF9<5@8U+bOQx0otnEIaK@(p_Rk;>!ySb`LiR_@aS|A=C;p zB?WpfvOSc$W}&YaA4{r+BFf&73`N-PHB08^7hS3APTM7mbeNAt3(uZ$WZr3L?{DnI zkt_BH=jbff5LfCPU)EO!Ss>)sLtKblHWk;GXI#Hh%egys!OD7fD~51*N5zJ*_Qg#5 zgXT!lXq{OD({Mf`-gHYaR>xfjGAGqHgIN~r8{gqF<@g^SaUOdOHi98<#H1%D3bk(3 zHC-$30>svmM%=;t4TV1(J`(Mg@j!L%&u8!NJ<pVR z)1KQkqs%<~zTWnwcU1eG5Tgn{#o1>J*Av=gkr|@fC-gc=9f+$=L#wyKrE9u0q~BxE z7M$wVLqQPs-=6?g$>scZqf4r=sl+2gI~Q}xh_)smiU7-{rQSqAwGfGm2c=dBvREwd8N2c2DuR1VvHZ%z-iz%nn^=fxBzScay$3Tx(${*=COV4}kN8H2^r^aq`qoFj67_Sd&?!5EwRq}1T2 z4n({k(_}JNMhrVVkbVsE%Z5bnVKmA}Er24dZEJVq_{62C%QKA#s~G#@*uvvq)^REE z?6QUk()&RbB4lL;?_C(99FS&Uej5y^t(_HNEwOI$9y%zd;^0l2#>ihlGI@?SB7nI< z2^qSPWkaSbk2GGICb0?~TDfiFD}hOloG6G@xg?epRJJkcgGPjZP0%_+&)|sXMhi`R zEwK(om;WNj&2ki28DJX`a;KnGzkfr@w_$OJ{lr?(JWB#Myu_S+A6!nhB_49?2 zI!_~w{u7#-CL(fRDO!Fu@*Xjrbh_`;&dHIqGI|tNq`X(5d1_2Q`UHnN%e!B=Gm@F^ z)RhD=3o6*7U~wl$Q7Xg^EoSU4&(X>P(7Mkm59thT<#ACe#z4@!RA}hWR&>B%5#<0h zT;G>|PjJ`Ypj&gV88Mt{A*<}!?xQ~8yxX#HrBVrYSs5j7AIhOrN#7N?SrAkst%N}P zk^qI0pehV+=o&n5@Cx^-0PUn>sbG=#HyVrdY;hN08ia->p7c#7mZRq+C4Bexj6~pB zC2vcTy+jX|gR53?>5qC|{oL-BxO5y#P-Oa2F!D<}2t(rl*x4eI=~?QYe3C3&%gnxl zy7g1o7!Qq_XHnVY)WgmJL&j+7FX2Fasj0v=Y7id5#y(G_RJ` z1y*skIaCG6F90o^2SnTADes^V1ccbU1ZBq}MM-iCU~Ufi?SxHVA?67py-g{Bs)C15 z!^c*1%(kv1iM=DRvMaVF&8fSI7Q2YbqNE!-5A>`+_lWYP#$4_qKd8X5qiTLROTAz@ z5O;0Zf!3`p(b&iU0(7#NX4P&})L_LWkoK*9TOehhc+lP3k5~G?$%+u0K_pkfL z5er|ejjD5~&h%xiQ>cr49<5sntuq*MX$M0bMiv2ebSk((iFP3huhP-!cQk5IKYlr= zMCwph7@UlY)w<=RLvcMH2ZY^t806F46cwOyMAYb!5n!i5BPRfs=4lG>Shl zOZbYYr7Kj`t|jPIN#`uXgcsG>M9r4{B_H0N*J>9Xbz?a$wxB$!Q~k=m*gY^=z-5YK zMTwF)b-^A^D;R-N;~j4^PccdATERP6*oAgd80>M1lOI1Iwn?1dV}Nkyuq3Ow z9m~yW4oDmI)_pP@bZaXW2O~Z=BWJJ@a{IaZHkFc<7+y631eLHlB zqNxQ$u><=xlp&ta146t?)CDn(lXz$k&64Yx1jvA-5fePrHy zjO>rN0SvO!aRV{Vdq zcpcNHFO_=mEzTX)Ld=)8LpmGYj27quOOE14|l_SXsa~L;W z${e?zb`Mrn3AgQC@}~-R1;iHkY{gx}#F)d?jx;Nx51+K!yB~4V)>cP6na4{_(u{KC zY-&ta`Q(i46W0I0OY`vghW4AHbch{x&Kz=!72x(X!P%(-w&e3J zLW2Tit1+unD*_?QqiI)E^>Vv)kh_)&-dZ61!mb`N6MeCaOkE#OAQYh%SwrYC4rkDv zWIv8un!#NxFc?B+^tRHi$|^?>CX9LYiNd_ik5Ui5Uj+IGkGLTgmR)(yTBiJAY5anpgJ5Q zLXVj@gVmJ?^o)XR&Ztqh6*9YKI;TAdP;L+`?sO#}K~YSCuV@S60@k#Nvp}}YIN=l4 z@Ox!aHFO%KP4r3wQi4HOuTNTe;#Pzt6#eYPkUwsNKZ2a|LPvPchTgEgA?%uBlp^i! zX~rPqR4S<-PYS#9bf3ptjY=X`it-yf9xTfeL(gVM-jzP!5p_)qE65Omd?*(&Enl}+ z-alIeQvX}Ir~pCme=isBm!(bJERBCIDB%3PaQtm8H%Sk{)nL}^BlCCN45n7_*?pFY zV~S~oY_Rn*ZZaS=#}`32J>~pXi0{M6;eazDK0lB5-ojXXzA+Z1j>tPcLBesG8YGXZ zklr9CE1|Cp0_AOG7K7-hg%E}=Rxd0*FQ>&heFjhY9=2R`+}#}B-CcBCIMsHi8fs}Z z*aWbwe!}IgZ*))riy9xU__aX$={FkI%rJk$&mGx!HY2#*z6`AZ`0-{FaU_uESZL!# z9k~1`tk`xevCt+!YC{`P2ib7WRvKf-6*?$JaIgsxH=NcKrpfA%`z4-Ej_Js%=xU*F2}< z&L7~|k)+8wv2o8*{VG4RPan1x*E$wl^Gqo1Ro@#Vgt&NtV~+Ug0g5TQ!v1Kzp?WGf zIAR|Z)Ln88yWO6l%QsXN^RiSHpazTmvzHUS6x+BHBS|X!XR^=m#$>6LkkRWXDA)2l z*^6WVm5C(Xjrd4G*_NT?xKlAC!D(FXVu<*)*gZ2UbL^6~}J<3rUVjeVs9< z*CD#nZ%t;R%8`nb5>i)?zloF1ok+Z`r*3m_e9Mwn1Fkg#FcwP~nR^=iF#702_j=lC z%%0613!ao{2`H`pfd@7G!@vgqvSe!^`=uJ^2;UZ~0UUSh;QT&U5N6@>4=rAg=gRD9 z`m45hn^`kwx?|aZ59J`yI!gj1!5E4j>ix2XI%F-@IPPjCP+=z8CWZM2#e_WzLf$f% zu~d>^kOiSWBGr@3pyd@|`KnvdNySu&IJ%Eh@@^J}eTNM@llzg_6Lh6I3;@_Efju?* zdfs6-9GP__emYFf5{J`N&W~+e&8*MsHG=k#_43TdplFVJkp^E* zbRrzrBF~NiSx&MMcQ`nD;w9Usx0R|2vxGNE&w>BOG*laL_L56l$2 zkyxOt7QijNgMS}Wn2Ytn*v7y>9HS9iy16%1J9t7LLW!9vEo*D{iJ*1BZ3QzU2ulW6 zN)41z#gWW#kitYdX2LJw7Ke{wk$84VB zmyX(GKlYsZ+wg*~(q>9|f{fO%^bXU)afkWB(i0>S-%fj-9nz^jCFU=`VuQ(OWS-j} zlP@m3M(2>JRBmJe=I%q%i6@-8k-cres#G3Clva|*6)MV~O`24R$I#P{Y~{!q_eLzw zvMsTblA>mpaM$S|?Ab`1(APh^ZqVozyZK5@oHaZs`}*lsbpB2f5u#U#C;H1(U1wuD zRn>hpWl8IHcP+-a(2F&gk{LPt07V9Z2u{A0>~hvmw1Wnofkdr~^CG351MkP5fceU| z=JNdVJ?(217t9n{$g!2*&&}(JZlZ|jwlk$8;`}(FIDG!pp`j?r56dcY028`hPSTQI@)w3if&Sr5{3ww-`8unZZ*rB z)drt2KD9V{$!A*BDzv$ir=T@f>Pj`gm3fP~aSmx#Tt0#GCDe&G{#<`x8@^z{uL%=* z*;L72c5XkU-+7|GwJ+pgNj6QjS%V;O@oSG4Lg~e>L2$~P@=2|Yu@*D=1x+M#4k~^d z$xaIs?KGkTnQR93()od37ozfkXJYj%&S}Txv8xz7UgDIo*X3 z7TQIa;51iXPfy3^byrcz-4d3)5n-&`ZvCe3@J_Y-F-mNU7CKj;rFKqT7#b!@#akuF zI}EF_^l+5v@i?AqV9}XT=vtlU)@EH#$;VUevOP9!4`VA=UKR~Yw(vf!)|H5!O zoPDS;i?_{DVenP4_9B`Nx8i$LO)tWV5cbyjN9CQqxGBjG1X3Se$7KNpC55fF2-0(g zm_=CUq&59)a~rW3Y{TRdb!dzk3KY==YtKIf3uINl;WstV0t4A0bzEnV^tU|t3x}+z z@Z{i}^Thi9cS~- zKW{QKiEL`Js`8q-Iwr_}TVj#J>~-Qy-Hp?TWmi%=8aoT-F0&!u_$U_%DDl;_%Tn)R zvS%B#qpk)O%A_WKP#5~He1LiSG=YXZ!bgKl)*w6jd-%4G#dJF_m|Wqx@Wttvh~(;G zq&%grUvQH|Q?)COUc1t>_hUttt}lE_PON9?i+sP+5W6<#y>Da0byz?%f}Yt+O3d*$ zK{(*%PMR#$Y|EBZjkH6%q|ckFQst)H$?Uc>2KArxNbLI!UmYwJ zj*+d9PcKSPxj!4ek?IR~t>9GVQElCcIIoZ{fJ-E#MKs{EI1tW2$5}^`%5WC*9ZD*y zR(5Fpob7HhMaua}p}0RWCmO#dmgNqbZAk>lK2uuI zuj|+)Jks4U(&`@$z2W)}cXzxp%*s}gsrgo3tFKHKr5xyHi#T&6lr+2162w(Y^KrDe zW~T!7l7bt0m1E%yah0DAFcg&b2(!6-_#t_BF;ZO6X4WUfHubslI#J2eQ%nQm5 z!QXXp^@p@-W;<=>_1qC!5)Eml_#3j_>QHPc_aHy@a@R50GA{NvKz}t6SYU3*_}X>Y zw(s0;9>a)dc{T6vPVH~pH*6K%w%-wYV;&|~~%V)nSsEm#v?xSS!g zvGX}LZvf??HCBb%5h=Q&_HmjzO!?DmLx-79){cjo$HrO+T1=Ow!J4zJMS5=ux_CFy!X4E5}cddlk?1o2kyMjuq8ckm65CLC0ak^44pOtTn1>z#KO90`D=@_lc z_OsNnhAv9?Zy2s9y4v~at;4|8PX#pw;JU`Ku4Ndm%=oIHEfH?_=;g^i*dQ*xp_jH( zU!YE>@JcC$k?;6i^8vJOl+!H&!J~iV(0s(v83~XHCgpRC2H)k?l4AJUAqD`;Ok7~^ zM5+x|H5@rO+qE!lv%x+H?$*92VBfB4wFPJxhYy!+fk-eSY_pWxeCy-Z*WqBC?kj|Y zxl6KKW>1N>k{#d~c(nAIX1h-I2)^rX%9Gfn9E^r}J*-h`mjPZ?ThQK1YVuuA5~vKS zl@W5N!nLgd6T;h9e`yO;0CzF?yfkUeUPXMbab(8eL)nG4`+XqrYp{s&5$)M^wndk( zEDcJw>Yc&Xik0JZfUdobCu+bj>>m2{VcU)W6#6*F;T!SWnZ>sis%yIhLQ4ee=>(qI zAtocS0`LbQFm&KZ+*5>T?xUH&tl)sf7qk%C@VDwoei`5~)KdxVB)@?dD$wp-2T}4z zHyy(txgoQi!17(V?~m9zHFa>4zJk>Hmn&-ZGq8r>;7RPkUm&!R{Gq!@d5%;d=Ey1x zFDC+RU<2fU#x$4h&@33&Oi4F3!46zUB7Mbf^e46nwc$6}WHy^~kVZ6@OBOHeC@;ke z_FGVQ41kRo6)y8A3RJeU`t{h%n0V#8qsdRYOQ%#gGb70?#9VLSh z1wz2PH0_v4%iw(D%2Bwf|23;w|a>6dna889m4`)t9+Hu0$M@k?KV7ij!Z_i?&N zsV^g-8!0q2&Jo@ns>1|K_1+QhbHhw?PMo$^J6B`)j_foU9u@Bd=5QUC1`5C!uZg2L z(w;v_THfkz3T%OyKwnxJ^?~$|kP2qZDB2X7KP>S{ynMcOyEt+a@m_~R1l7J8>>UYR zy0hhIfSV0r9(<_1u&0kDpjhu2e0PgO-AQ`tjP}kG%X5C@`mGc~7f;(#jK(Wc&lj2L zYgBKbE6}ia#oW29CnQEiD?LzJlFy(G!>yeI4JV*Hxd#<}(SYThjW7I?JM_mpRLSSD zgLBd_ghy5xzvP(eFkfmT`0sc61?Olkd_nkp)y~^fpfRH8sD!7E_C7y$>H5 zq7>*-F?82xFh5ZjV0wt?{to;VH$3MHA;YD#l?!}YU~YB1hlwOKH3M1Q0zy|6#a8_&Fm3CHF+?{c z^o~MQkZfViTI(uqLB2P?g7JpQxbv z_#rHjI4b3(FJAx(E8XQX3@Ou>iJo-wLXTk5ujAcuWpM5gF zT7IZjRCB@-Fxt&P%Ji(!jW5zk2hOW<_eYZp_b;H>1}_gr*J1KjO3y3pQwj9hTa+v? z?Q6LcV(ufi81{c8-dA?Vy*?pvXK9I9X2}uiY!5tyJ3fqDfG@8`KS%NfVLJ?9utQcG zgm)HlK!<&9(JLmNY7DCWfsk002E*8sWAg$G~0rB7l@s{oV#!;abT4UP#oupP2Q)PJnRB*JsJ;X}r2L;DgHB{%P zS3F{ypIp#g5sN^CU|HA>*dq(`fZ%G)lbnKMkS9`CK>20|WGn1hHIfKSEB0*4a5Br2 z>kmPV2uAk{3gz&(3e?6gG%Ti>FxW^_w4`Q`>+0af0qOV>3>{$4@Pv@s6iT@3~o?fMflFbGydfSCI zyfHzDcJB^t81pmRYNVFLwnDKt2cZ$X@!Ii=C`EUEGHTC8-qQyilpc&`TzrnoQRi90 zJE_~4MrNJoCqWXJ}eNwkPe>BHl|`fnX+%I5Ll1 zGKYO@lT?+1SD^oPDVS4U-8g@#tddphLwyf|gwGjN8vM>yn>QWx5B2YvzTf5j=@2|x za2R4d2q(J+lr|NcOG`2|y3D56*z~PpN@!n0at>%YjvCB3lcTKA!s3Le9fZS>IFlHl zPp`Ke$4ugFN0xEb&zdR(I03-t4k(pUWxD5Mc#{XmS~f+D@mmRoU&2$q&ZUw%8c1^- zS(*ddi7d2X>32*DudAgw=am)i$}Zx{b8=T$aq}m_#%F!OzUfB}I`K@CZXbuDG+3rX z25)xu7H>deiMH;WXHkwQy{>lU^)Ci08c8^*N0$`EYM&h%wsbp=NVf%^=L+tym>Nqg z9`R2m4oa}AGz^enON3?-V@k3tamXOOmfI4xcE=%p?KXlIis2=!)3-O#z464|qR{BG z7ZD#;Bx|#l_sG}ROy@`&aIV=KN+kSKI`vWk--@A0Gd+trUFC3kDh*eJW~g#NJSe%< z7YMIOgflwdY3bvb;aO|dII-Ta7;*KtV7GZHCmfPDAjOv$92Q)Rkr1v5`|pN~)AjE| zy*hA(OQ`#{YIi>-qM&5;yu|O>nqtzLrVp zA=dJ07Hmta^9{rQe%!tlAE>isq?wfk*K|2)AJAh`eU6a3FND*L}r_5ZMYUQf?Y zb0G#x3NI(EEw>2}1cYR=n45&=SVo6`8m~!CWU3qN^EL@wT+&!#QIeK@uw&MVLe6Fc zY{fW4Vv+PBV+-3Zf7Rc6iTj59xXYt}t(T``H#@7+0#_iT^!DuV%Kywz^GY%r)to)8 zfL3~_%gOBI@-n1<{&M?RCK`VO4o%3ncj67!_UoMcmkMG>8amkcVP8MR0p5_ilu2>g zbz8UWLm(F9zI-+zG!i^{zH|h^Z>vAGbLldBJZe?uD0=L|xr&1sGdcO14~26&PW_s> z*?@iY%eRPCrGY{f;%c1U5Iyqp+%nwUHx}W84r%u0GIdhs{HVUBY9?>2_2O_t=_$?U0`O9 zgYBj^Z^p*rR*HNO2&4H|u%&X5>`eJoRy;dOW zW4bscrB!2t!g0zB|NA{mFwQOq)1uR;R>)4WHo!YX$^xdwJE%%(Wy8C#PJFqhNch=4LUMK>uZ543cP~Ls6=m^Fs5^J;`Eh7xJjcN9b z8fXoazj%e+??t^#w`HZB09fLNf=1eBh@jFEWD|<7pFSS15oMygwdVgJVgYHxKS{zB zb0QVXM8*kIw{VmzC$}p3J&n5{&v}`hxG*H3$7Oi3g-fGF$&*=pE)wS}0ZbeB{o-17 zXT3z2a+-1^F#;6JbL;@(ES=uxg0sFOl`SiLJPWp0UNr{uMv~ckqxs)ZKNuRmeMdv1 z%Y?;D#=Cn{3QaHK#Wn~iUpNhZsoCi&WZ3eOKG6;OYs$+&sme|}()Fm*+@&35^sma= z(A5CfPlllhR)ra)tCr8pA%8so5zpVB-&dWXgPAl!yyL7(bmZJrX~;aFy+l){5KL^A z`r^IOw4yujplj?wVobXSZ4NgyNd|~ssBv1$)HCkAoX`$5RSPxOo|@9eMspI0vCh{Q zC2dUnux8D%`!H-pmmX5L%M9Z>$DrBqPBGT>22GDtb`%dW*jpqi(`YQxQgwz%X{RTa z?>m@`z%hyzHo;xGnLUQ@2`@SwSPnu~sXam0RbU`5rC`bi_R>UxzAk&}#wE3~(dfsM z%?X(H(IJ(EPptqg11imFBSa;8t|YDEZL4qes} zc;h?Kc)gg%gjrl~qo=|%4KO!-OZ{czL=aC|cA#AGKU4HAE52|k*RM+cL<#FrK)W+1 zEf~nNCWbdM=81G|pS71fd;{>sH~w--seHR#in5V&Tul^!Ji85hgth}WtHO&f8~gIJ zIvoUA{7C;1hw>>_6XO;yy<&>FndgfH4v-4%7`Iwgm1scR)7%L@FTK=*!Tuu#+KJ-9 z$Tqd8sh z*-r>fG(QDg?}pNVd|na$MU?4woJj5DSe+g6GlVRX58S&o;mNVrb(7J9USHKuw9b8@ zpgx{joIGiQ%R-TNT`*R(y4_t(*UwttCfZON%O!!^Hh`8IUXlN1$?IK|s4<1*q?{59 z`84}|b>Nl8vNMByk~vu_io)UhptRRtmb6ztE8~hN+kGARbRsMqm56HwT_XHrN)Sab z+jbb1hBc~YqEp6|i8m+!EWi7{a4+$hm;;iV0*~+{4$lPhM5Ji~OT?MGTirrML!^>- zkb#?Xu%;LchLCDS$41SU1q8Y=ZaMMpaZGW=C8@26ZPY#|ID}Ii$>4GM>+f5YZjmml z=D29kr_O6gxqWaX#++z**SW_RY|BO4F`B4enQ|9RWyU+l#(;Ayqfb@y3EPA_OjTnn z&z|x~*CYs0Po`18eBV!Ugc1qhml%WI^?cdJZOpCzL*z68UuUhWxh86PmW&keYKwjd zay_$uiK~LhU2y%AesQ)oT;q$wb9G}?CuHU-#tz%n(krCZ>ye}jHG@@-)LMwt_>--t zB{ZoUqeeIGU6o^`PBzAS7*K1M64^GHNS7p?NrZeB817#fsJqd}cd_=j_L=TWAO^bzGu7Psl}4}o!_cvW*l&=bqvu?@iMc^l=#Yqe6Po?xfLCEFSPo8U& za%9mLF&$x!FB>XcFd&#IJ>6P7%skBWA@MjHdf7~mg{U-6M7vS5rG#@@1mo6>pnK+R=UGT_KrL&ucAG;v=wC=U^tj59B4is5h0GC0_3d+n6rn z2rG6Q$Z8po_-2Bwt{$AE>tW-DTY8mnGpU)WJNfsiLCR&*=uf z#h-VJ^E5vfzk{meUCJv+lSV`#ei~|7x|Yg4W&O=8Vz$&@BX;@KDePu4ec1{4&B1fR zq|>MDint3O%G3v>(u3ZJeeHX~V4Y;zmVZ15s#jFi6_9EI>GI&j+2qHU>L9qK?^{BAbs zG}$mfzUE{709piVqgv*7#i&o&Fulg*%GJWcm*fYH(*@uWzr0NilOXq%cVuTT? zR_dTW!NbnYEs9@VkU|VQ*R1ri?bE9!!99h}AoBdw=lt2fCt8Cbs&h4d z@y(RMk*z&mgb6=?4m0hBYOH4rKNbA9H{RaV5?N>#ZSrr zL%Ey^%(zD3cM8vD-*mX=v8LsCR`909lbsL*FCuI;JQONJY4RA{-o<~m_Qmx~xIR{^ zAeuJ{EG-(11O9;i!?Ai^T62d#|D?2 zX$Hp^o7WpX*zcr>9qJr8h2JQTcl4WNwLbeXBVLQ2;r&$>HR`BFE@=ECBgJu0*jFwC zTAl%xo{XxO8g)wZ*xI!75y8eVg~dnZfC+>nii_&OQ2yEEY21`^|t(JJv!z*Ef2@9|%4& zb0OzPyj#pbxy|R4_vR|iOTzRyBu^!q9}*H<2o46}+ashM*!>u95cqKiyIR;RcK)KM zn(L%)No4j^#9Qeu2rM*nT5Vlbxtby}4EtpEYmn&KC;Y+?ibgC8Y@0V*USH?a7zJY( zv_AUCII9G_UCeAFMSaeF+f1V6V;&&Wk#o{2^8p4OZVeVqiO)RBy91}yd>32AG0)VR zd31#9>Eiu|3NMfxkF6ryT-2XbCCv`*JEY)mvNw8mxV65@Emv*QG^8y*-FiQ2r-W}^ zDg9ZrMR7a<--cwk6j!UjrKMTw!?DLyZsd^ou*hmxv8kNMJAys~M*-OgZl+yF#;$4x z=Ka~bSexaz-n@JV$La%%6Rx)R8hP@N$qk9&rEfZ2=|0NDf0NrK8MuF<{rLU@Hem3s z2RII9jRw<2ukjvqX7L8KybW$ScDwYxGzyvP?$|r>UJ7yOZ1aT9jk=U>MR4fXKhpBW zTnTI3AjVr0UW$2rB{hvVZ}%0@QsdZfqIV(-grGaxW7zP zg_htHsKS~*T)|wY5a+zd`vrKw9&QYu-~j0xA9um$+Z(=WK}C=>&l`>wHna%Q(Ibl% zu5xumFD=dII~2YO+zcJf-aJ}hZGt%RdHn(CuB&xR5ncno@TABqJuV!29_a{QdR)3_ zIx}Hm0J!>v5BW;-R+ti(SMlly?)A0yxV538sgG&=AzAp{>(~IuYjR3;wg6V~vAibC zc2T-M*|?0b{6e1LqZmAT*yoU!&nU4`F;%Bwj|3?-)40r6Rr-dRmQ`F1qTs&^6dsvL zw_{-P`y{&@N)P&U3JnYvP+TZ29MZ@6M7vxSm_J>=360a1Jb3!WT`G?i`7SZ8E~l>3I;ReemLvOCxWhiV%x-8;^pa!raqu&e^GIH(l6usHF+eSJ z^c9D6_F6h^{wAl@Es-~VDEJ6>QUNu^_fkQcxxc8)D1Kq2_OQJ6q#u=h(LB5t<>eC8 z7o(T)DM44*lsS8`rowb}mXZ_SGJW8hk+-}dPY_Iqz}5I(3KlK=+KAi{7i$^E{=P`< z*sEb^U^ZU?;g>GrUC|H$fotloPu+e{v{H5e%u{>bv7y~2$6=%qe|^>{i01L*mCJ#Y zG$N5vbi7CppZ|cYl7$`WVRW2VV29=A2$8>_G-n{L2{Q1UDBS(EAjA>%ymFdfd=HP= z<|>47Sd}XxtWT7SL*L-y{iEC99>qn8GU($fdJ_+Dti$or6!~-dTBKt=OlKt9iA-P$ zUK0;_jk35-!vrnN>o2_DOQng7?BIQ}D^FwkH{VYfZdf zP+-zr74|D_w%$A5i!@$7l%>75%*)dwUl^BzceGoIOnnVEN#btC5i@O+YDeK73Yqq2 zYOt*LYu=$x|E-W=gJApjLgu&6%q-mOe}3u)`1OSu)BmoX8B^=B4`D@a`-UxyLoYG8 z96Rqc@O4^WQy2L)K@`nvs;gT*DqGeE5qVAHF%FP4oTAfwHf-#ix(;B85W=%6N& z#TSZzxm+VvutRXryO;&IVpW-CY2^1b3{`mC}LW--}Movv-EY~ zY4IukoTX=Ly}{G1j8mkp%u0@no&mPdTZmoDAX}t_$=}9E8UJv9emP*f?~nFfg(5wW_md2=^g`!)`Mt9QR)%4&K+J|6Gd- zKv4bfL-^<7lv*+1% z4awXBdjwrp;lAx(ik}0*K2_5hfAYG=60re(G5z(d;aYwmkGo0t&u0B1s>0z zbj|T1Gze5EIxCEdjl}}$;Z^GGW*1sj9Kw{Xwxp=3Z*?fnu0Lou&60EYnF;> zrus>hwu5GdVF`1wR!j7b9plZ5Q?%{KScBHYT9{YQR)Cu2%QbH5Gg`&_3CUY1x8#P% zO$-6pve>KU2LWHMF@y-5QQb75klSObz@ngqfuW+aD&V3;#)UYj{J2H&tnd63aYe zcE(}4Cz{dJ#m)L=d&wI*-AZrD0AUXD{Q0HaTZ<5{a0#)i% zD(QtXw(C(_A-Q>*CJ*qTF+aI#>nZC56QO zidFtNT}h)MB&v9I;d^dJzjwABvIlj=3-6q`UK3dyA)V$Lt+0(STXWHuupm(3hSO|d zgxLr)5ag@HiB>RAuTScyUcHGLd>RsCk4fDRR}T%Q9FUi10WiTRTZH zt{P`ff@D+cqY;Af1Oyre%WdgZ+X5k`x*iw}4a}Ds#4&5uw0my(WO&!|PbS{W?`u8% zWFeFLj3BY94Rl20$KE;fwIsB?L0;bw4nUv&PJOL`M#V6}FI;=+9rcn+h@s`+QRWA*@294qj zBKudHCeXPHxI}ciXPpT)T&SPw(CCM#%*+hoR7^Z~?kVLs)%&cmPj%X>SZ;NstEZsI zWU5XByoQ?fuutlf_;5rZlrha(l-5-}N{-0;qKo%3f}TmNU4W|v!9N{hmM2yEg(@BkJ0Zz zD4|Ls!wq#IXr&NmbN1oU#fWs+Uc<_Jdy49pRqJYSijpy3m#Xuu{(#f63}srQz4#r( zF`^cSc16EdP~vf0gu=FC$1-7_qnu(#!=OmzFFroZEKn^xbFv*`JqR`W%0h-M>~>{!!AjnGKh%RTMUb zT53#kFWJjolGspe|MN4h0eXO=Q z_s-&0S+i{`N`uWV%+A~M|94}Y?1R~7-Z-{|wk!DDl2G=Ml2Be_R&%b$EPb2(@f!V* za|%yqT}#dgjZRuT?`HFaiaiT;xuwcP=0%nXFXkxNW9i~xvd=E2;ZQ|(M}voR_q>~q z&W*3Pm&AKCs&8Sdch~2icXPXdrJRv3Q++u=)A-;#WNPJ9nQduukp_zU(kB=&{tJEZdV4)bhj_J~e$Hc+rfuf*`}xTLIkx+JKl&{tR%(akuU!!FHsWi!nenv`@jAS7 z1UfDYHUHPzJ}dbkQ_lg9{{K<`I=;(CB{8@q@_aiG_k&@-eM^6W%Y=8U|J3>S|6evq zer=5W+k^9~raCWPTaop2{^G26bp{U@YI=Z9onfCJ!Smv|@ z7f78u5NW|a|8S*(MH!>sqwf|mP5KXvVj5+hBr>gYVpRKBDQK@cqbc*x+{VbtQr>l^ zck3VCz5YS=p8breJ38yPC-AM$dw4&$Qq=Z0Tjsk1Hg{U93*_YvI9IUrKjgGwZAiBW zYkdBJ$vy5-I{%&~)`%9>J#lWku76 zYw*)gou|GE+y3xgzp0!jfBDt7@zqmnlW)DKE4)3wIzdNp;Uo!T|Bx7!ztQVIZT9=6 zUs(M;<*Dkue|y6tZ!PZqw`cizjR*VRivDK?HIpk?pD@eMGRp+Mn)ZWQu?km^VVF)-Y~XB6r=l<0;cpY^DOVrVolP_ViWyw(hMvLw2B$Oo2z z4&p(8tC;3N&Wl7h0{IjiafE&#D*-rCf#xKT5ul6-F$8g74)We;M-)T+fTstc8G^Q) z56@yW*zq~&)*-JX^hU9+7PzL4V(SncaadqsU#N&|^FCcd7UNko2(t!u{1EawKWAiH z7##E{um;^GnO - - [ step, time{picosecond}, conserved{electronvolt}, - temperature{kelvin}, kinetic_md{electronvolt}, potential{electronvolt}, pressure_md{bar}, volume{angstrom3}, - ensemble_temperature{kelvin}, cell_abcABC] - x_centroid{angstrom} - - - 1000 - 12345 - - 1.00000000e-02 - 4 - 12345 - 60.000000e+00 -
metatensor
-
- - - initial.xyz - 250.0 - - - - - - - 0.5 - -
- [ - 4.498098855452e-3, 6.594810718477e-6, 2.788030342989e-4, -8.808265165053e-4, 5.605371493938e-3, - -6.726802271646e-6, 2.079069559861e-9, 1.746169548818e-5, -4.800164465960e-6, 1.025830873432e-5, - -3.586191452340e-4, -1.746169548818e-5, 3.287481976399e-5, 1.245698716799e-4, -2.417657162526e-4, - -2.508912543565e-4, 4.800164465960e-6, -1.245698716799e-4, 6.449207766266e-4, 2.783583234046e-4, - 5.273493443008e-3, -1.025830873432e-5, 2.417657162526e-4, -2.783583234046e-4, 7.488477456790e-3 - ] - - - - - - 250.0 - - + + + [step, time{picosecond}, conserved{electronvolt}, temperature{kelvin}, + kinetic_md{electronvolt}, potential{electronvolt}, pressure_md{bar}, + volume{angstrom3}, ensemble_temperature{kelvin}, cell_abcABC] + + x_centroid{angstrom} + + + 1000 +12345 + + + 12345 +
metatensor
+
+ + + + nickel.xyz + 250.0 + + + + + + + + 0.5 + + [ + 4.49e-3, 6.59e-6, 2.79e-4, -8.81e-4, 5.61e-3, + -6.73e-6, 2.08e-9, 1.75e-5, -4.80e-6, 1.03e-5, + -3.59e-4, -1.75e-5, 3.29e-5, 1.24e-4, -2.42e-4, + -2.51e-4, 4.80e-6, -1.24e-4, 6.45e-4, 2.78e-4, + 5.27e-3, -1.03e-5, 2.42e-4, -2.78e-4, 7.49e-3 + ] + + + + + + 250.0 + + diff --git a/examples/clients/metatensor/nickel-lj.pt b/examples/clients/metatensor/nickel-lj.pt new file mode 100644 index 0000000000000000000000000000000000000000..4f7ca0249f5575c15b5bd18bcc92e64631927fdd GIT binary patch literal 30587 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

hM7Xn{SOM}k3 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 literal 0 HcmV?d00001 diff --git a/examples/clients/metatensor/nickel.xyz b/examples/clients/metatensor/nickel.xyz new file mode 100644 index 000000000..ef3986a7e --- /dev/null +++ b/examples/clients/metatensor/nickel.xyz @@ -0,0 +1,34 @@ +32 +Lattice="7.2 0.0 0.0 0.0 7.2 0.0 0.0 0.0 7.2" Properties=species:S:1:pos:R:3 pbc="T T T" +Ni 0.04454187 0.15457874 0.12596108 +Ni 0.04370318 1.95000420 1.91184154 +Ni 1.83573509 0.12884331 1.91958398 +Ni 1.92303186 1.89265686 0.07165795 +Ni 0.19190924 0.04701160 3.61889659 +Ni 0.04116880 1.91517186 5.56317915 +Ni 1.91817295 0.03169102 5.58591245 +Ni 1.90862314 1.82490488 3.69025253 +Ni 0.16624021 3.78437918 0.07411722 +Ni 0.11502732 5.41155667 1.80895247 +Ni 1.88561487 3.68501992 1.91533902 +Ni 1.89092684 5.47334069 0.13616005 +Ni 0.13256096 3.78185764 3.77535577 +Ni 0.01409603 5.46866518 5.46642113 +Ni 1.97184883 3.60053345 5.44955058 +Ni 1.95063962 5.40970450 3.62949639 +Ni 3.61636855 0.00654232 0.19947714 +Ni 3.76729948 1.93207137 1.83696219 +Ni 5.47783206 0.09663835 1.87546754 +Ni 5.51789413 1.88532203 0.15452776 +Ni 3.66412964 0.13315923 3.68647837 +Ni 3.71818983 1.96085601 5.43543213 +Ni 5.54731704 0.16090601 5.59503045 +Ni 5.40527227 1.81865617 3.73525599 +Ni 3.77409855 3.77888268 0.04458552 +Ni 3.77575860 5.56995384 1.83599413 +Ni 5.49352058 3.71215650 1.92995287 +Ni 5.53270737 5.51022677 0.07537065 +Ni 3.60323764 3.73888965 3.76030754 +Ni 3.77150406 5.57225362 5.48239838 +Ni 5.48403719 3.68038819 5.43621244 +Ni 5.51535161 5.56333248 3.64169044