# coding: utf-8
# Copyright (c) Max-Planck-Institut für Eisenforschung GmbH - Computational Materials Design (CM) Department
# Distributed under the terms of "New BSD License", see the LICENSE file.
import numpy as np
from pyiron_atomistics.atomistics.master.parallel import ParallelMaster
from pyiron_base import JobGenerator
__author__ = "Jan Janssen"
__copyright__ = "Copyright 2020, Max-Planck-Institut für Eisenforschung GmbH - " \
"Computational Materials Design (CM) Department"
__version__ = "1.0"
__maintainer__ = "Jan Janssen"
__email__ = "janssen@mpie.de"
__status__ = "development"
__date__ = "Sep 1, 2018"
[docs]def random_displacement(basis, displacement=0.05):
basis_copy = basis.copy()
random_vec = (np.random.random([len(basis_copy), 3]) - 0.5) * displacement
basis_copy.positions += random_vec
return basis_copy
[docs]class DisplacementJobGenerator(JobGenerator):
@property
def parameter_list(self):
"""
Returns:
(list)
"""
return list(range(self._job.input['num_points']))
[docs] @staticmethod
def job_name(parameter):
return "rsdis_job_" + str(parameter)
[docs] def modify_job(self, job, parameter):
job.structure = random_displacement(basis=job.structure, displacement=float(self._job.input['displacement']))
return job
[docs]class RandomDisMaster(ParallelMaster):
"""
Args:
project:
job_name:
"""
def __init__(self, project, job_name):
super(RandomDisMaster, self).__init__(project, job_name)
self.__name__ = 'RandomDisMaster'
self.__version__ = '0.0.1'
self.input['num_points'] = (100, 'number of points')
self.input['displacement'] = (0.05, 'displacement')
self._job_generator = DisplacementJobGenerator(self)
[docs] def collect_output(self):
"""
Returns:
"""
pass
[docs]class RandomMDJobGenerator(JobGenerator):
@property
def parameter_list(self):
"""
Returns:
(list)
"""
return list(enumerate([int(job_id) for job_id in self._job.input['job_ids'].split()]))
[docs] @staticmethod
def job_name(parameter):
return "md_job_" + str(parameter[1]) + '_' + str(parameter[0])
[docs] def modify_job(self, job, parameter):
job.structure = self._job.project.load(parameter[1]).structure
job.server.accept_crash = True
return job
[docs]class RandomMDMaster(ParallelMaster):
"""
Args:
project:
job_name:
"""
def __init__(self, project, job_name):
super(RandomMDMaster, self).__init__(project, job_name)
self.__name__ = 'RandomMDMaster'
self.__version__ = '0.0.1'
self.input['num_points'] = (100, 'number of points')
self._job_generator = RandomMDJobGenerator(self)
@property
def structure_job_id_lst(self):
return [int(job_id) for job_id in self.input['job_ids'].split()]
@structure_job_id_lst.setter
def structure_job_id_lst(self, job_id_lst):
self.input['job_ids'] = ' '.join([str(job_id) for job_id in job_id_lst])
[docs] def run_static(self):
if 'job_ids' not in self.input._dataset['Parameter']:
self.input['job_ids'] = ' '.join([str(job_id) for job_id in np.random.choice(self.structure_job_id_lst,
self.input['num_points'])])
self.to_hdf()
super(RandomMDMaster, self).run_static()
[docs] def collect_output(self):
"""
Returns:
"""
pass