@@ -54,8 +54,7 @@ class AseMaker(Maker, ABC):
5454 class EMTStaticMaker(AseMaker):
5555 name: str = "EMT static maker"
5656
57- @property
58- def calculator(self):
57+ def _get_calculator(self):
5958 return EMT()
6059 ```
6160
@@ -95,6 +94,10 @@ def calculator(self):
9594 store_trajectory : StoreTrajectoryOption = StoreTrajectoryOption .NO
9695 tags : list [str ] | None = None
9796
97+ def __post_init__ (self ) -> None :
98+ """Enable caching of the ASE calculator via private attribute."""
99+ self ._calculator : Calculator | None = None
100+
98101 @job (data = _ASE_DATA_OBJECTS )
99102 def make (
100103 self ,
@@ -148,11 +151,18 @@ def run_ase(
148151 elapsed_time = t_f - t_i ,
149152 )
150153
151- @property
152154 @abstractmethod
155+ def _get_calculator (self ) -> Calculator :
156+ """Load ASE calculator, to be implemented by the user."""
157+
158+ @property
153159 def calculator (self ) -> Calculator :
154- """ASE calculator, method to be implemented in subclasses."""
155- raise NotImplementedError
160+ """Retrieve cached ASE calculator."""
161+ if getattr (self , "_calculator" , None ) is None :
162+ self ._calculator = self ._get_calculator ()
163+ if self ._calculator is None :
164+ raise ValueError ("ASE calculator not properly initialized." )
165+ return self ._calculator
156166
157167
158168@dataclass
@@ -208,8 +218,7 @@ class AseRelaxMaker(AseMaker):
208218
209219 def __post_init__ (self ) -> None :
210220 """Ensure that physical relaxation settings are used."""
211- if hasattr (super (), "__post_init__" ):
212- super ().__post_init__ () # type: ignore[misc]
221+ super ().__post_init__ ()
213222 if self .relax_cell and self .relax_shape :
214223 raise ValueError (
215224 "You have set both `relax_cell` (relaxing the cell shape and volume) "
@@ -299,8 +308,7 @@ class EmtRelaxMaker(AseRelaxMaker):
299308
300309 name : str = "EMT relaxation"
301310
302- @property
303- def calculator (self ) -> Calculator :
311+ def _get_calculator (self ) -> Calculator :
304312 """EMT calculator."""
305313 from ase .calculators .emt import EMT
306314
@@ -320,8 +328,7 @@ class LennardJonesRelaxMaker(AseRelaxMaker):
320328
321329 name : str = "Lennard-Jones 6-12 relaxation"
322330
323- @property
324- def calculator (self ) -> Calculator :
331+ def _get_calculator (self ) -> None :
325332 """Lennard-Jones calculator."""
326333 from ase .calculators .lj import LennardJones
327334
@@ -378,8 +385,7 @@ class GFNxTBRelaxMaker(AseRelaxMaker):
378385 }
379386 )
380387
381- @property
382- def calculator (self ) -> Calculator :
388+ def _get_calculator (self ) -> None :
383389 """GFN-xTB / TBLite calculator."""
384390 try :
385391 from tblite .ase import TBLite
0 commit comments