Handling of side effects

  • A side effect in this context is simply a file that is being written by a recipe.

  • We typically want to avoid them, but in some cases they are hard to avoid (gs and phonons).

  • Identically named side effects can be overwritten upon multiple runs.

  • The ground state recipe is an example.

def calculate(atoms, calculator):
    ...
    atoms.calc.write('gs.gpw')
    ...

The proposed solution is to create a separate folder where the recipe is executed and register any files that the recipe has produced.

def calculate(atoms, calculator, asrcontrol):
    ...
    atoms.calc.write('gs.gpw')
    side_effect = asrcontrol.register_side_effect('gs.gpw')
    return side_effect


...

def main(...):
    side_effect = calculate(...).result
    side_effect.restore()
    ...

Then the file will be copied to a “safe” and given a unique identifier. Remember the earlier file layout.

$ tree .asr
.asr
├── records
│   ├── results-asr.gs::calculate-eb92b5bb5e.json
│   ├── results-asr.gs::main-e74d516eaa.json
│   ├── results-asr.magnetic_anisotropy::main-a11d444bf0.json
│   ├── results-asr.magstate::main-45f46e9d2c.json
│   └── run-data.json
└── side_effects
    └── eb92b5bb5e24424gs.gpw

All remaining files will be deleted automatically.