aiida-vasp的一个bug修复

问题描述

在运行 Aiida-VASP 官网中算例 Your first workchain 时,会遇到

TypeError: port namespace inputs.dynamics received <class 'aiida.orm.nodes.data.dict.Dict'> instead of a dictionary

如下图:
erros

原因分析

出现这种情况的原因是由于端口冲突了,即是我们公开的子进程的端口与父工作链中的定义冲突了,具体问题在以下最后两行代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class EosDefWorkChain(WorkChain):

_verbose = False
_next_workchain_string = 'vasp.vasp'
_next_workchain = WorkflowFactory(_next_workchain_string)

@classmethod
def define(cls, spec):
super().define(spec)
spec.expose_inputs(cls._next_workchain, exclude=['structure'])
spec.input_namespace('structures',
valid_type=DataFactory('core.structure'),
dynamic=True,
help='a dictionary of structures to use')

在这里,我们公开了子进程 Vasp Workchain 除了 structure 的输入,查看官方定义可以看到 Vasp Workchain 还存在一个 dynamics 输入:

vaspworkchain

同时在下一行我们又在进程的公共输入中定义了一个 dynamic 类型的 structures 输入,这一定义会导致在公共输入生成一个 dynamics.structures 输入,从而与上面的定义发生冲突,出现错误, 具体参看 https://aiida.readthedocs.io/projects/aiida-core/zh-cn/latest/topics/processes/usage.html#dynamic-namespaces

解决办法

在公开子进程输入的定义中,排除 dynamics 的输入,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class EosDefWorkChain(WorkChain):

_verbose = False
_next_workchain_string = 'vasp.vasp'
_next_workchain = WorkflowFactory(_next_workchain_string)

@classmethod
def define(cls, spec):
super().define(spec)
spec.expose_inputs(cls._next_workchain, exclude=['structure', 'dynamics'])
spec.input_namespace('structures',
valid_type=DataFactory('core.structure'),
dynamic=True,
help='a dictionary of structures to use')

修改之后代码成功运行

run