Как использовать маскировку структурами для изменения только выбранных атомов?

#pyiron

Вопрос:

Я хочу изменить положение атомов, которые удовлетворяют определенному условию.

В настоящее время я могу применить перевод ко всем атомам или к одному атому, но не к нескольким выбранным атомам.

 from pyiron import Project
pr = Project('test')
uc = pr.create_ase_bulk('Fe',cubic=True)
uc.set_repeat(2)
shift = [.1,.2,.3]
uc.positions
 

Например, я хочу перевести только атомы, координата Z которых меньше 1:

 uc[uc.positions[:,2] < 1].positions  = shift
uc.positions
 

Он не перемещает атомы и не возвращает никаких ошибок.

Однако перевод только одного атома или всех атомов работает должным образом.

 uc.positions  = shift
uc.positions
 
 uc[0].position  = shift
uc[0]
 

Ответ №1:

Это должно сработать:

 uc.positions[uc.positions[:,2] < 1]  = shift
 

В принципе , когда вы работаете с positions и cell т. Д., Всегда безопаснее использовать установщик/получатель атрибутов (а не установщик/получатель Atoms ). Я лично использую сеттер Atoms только для изменения вида атомов, например uc[0] = 'Ni' .