问题描述
在运行 Aiida-VASP 官网中算例 Your first workchain 时,会遇到
TypeError: port namespace inputs.dynamics
received <class 'aiida.orm.nodes.data.dict.Dict'>
instead of a dictionary
如下图:
原因分析
出现这种情况的原因是由于端口冲突了,即是我们公开的子进程的端口与父工作链中的定义冲突了,具体问题在以下最后两行代码:
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 输入:
同时在下一行我们又在进程的公共输入中定义了一个 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')
|
修改之后代码成功运行