Commit b2927e09 authored by Carl Poelking's avatar Carl Poelking
Browse files

GAP conversion implementation.

parent ce07a7cc
......@@ -67,7 +67,7 @@ def parse(output_file_name):
base_dir = os.path.dirname(os.path.abspath(output_file_name))
terminal_gap = LibAtomsGapParser(osio)
terminal_gap.ParseOutput(output_file_name)
terminal_gap.ParseOutput(output_file_name, base_dir)
terminal_trj = terminal_gap.trj
......@@ -81,6 +81,68 @@ def parse(output_file_name):
push(jbe, gap, 'program_name')
push(jbe, gap, 'program_version', key2='GAP_params.svn_version')
# SYSTEM DESCRIPTION
refs_system_description = []
all_frames = trj.frames # <- Initial config + trajectory
for frame in all_frames:
with open_section(jbe, 'section_system') as gid:
refs_system_description.append(gid)
# Configuration core
atom_labels = np.array(frame.ase_config.get_chemical_symbols())
push_array_values(jbe, atom_labels, 'atom_labels')
push_array_values(jbe, frame.ase_config.get_positions(), 'atom_positions')
# CAREFUL, OBSERVE CELL CONVENTION: 1st index -> x,y,z, 2nd index -> a,b,c
# Hence use transpose here:
push_array_values(jbe, frame.ase_config.get_cell().T, 'simulation_cell')
push_array_values(jbe, frame.ase_config.get_pbc(), 'configuration_periodic_dimensions')
if frame.ase_config.has('velocities'):
push_array_values(jbe, frame.ase_config.get_velocities(), 'atom_velocities')
if frame.ase_config.has('forces'):
# TODO Wouldn't it be nicer if forces were added here?
pass
pass
# SINGLE CONFIGURATIONS
refs_single_configuration = []
i_frame = -1
for frame in all_frames:
i_frame += 1
with open_section(jbe, 'section_single_configuration_calculation') as gid:
refs_single_configuration.append(gid)
# Reference system description section
ref_system = refs_system_description[i_frame]
push_value(jbe, ref_system, 'single_configuration_calculation_to_system_ref')
# Energy
if frame.has_energy:
push_value(jbe, frame.energy, 'energy_total') # TODO Check units
# Virial
if frame.has_virial:
push_array_values(jbe, frame.virial, 'x_lib_atoms_virial_tensor')
# Forces
if frame.ase_config.has('forces'):
push_array_values(jbe, frame.ase_config.get_forces(), 'atom_forces')
# Type label
if frame.has_config_type:
push_value(jbe, frame.config_type, 'x_lib_atoms_config_type')
pass
# GAP DESCRIPTION
if gap.has_gap_data:
with open_section(jbe, 'x_lib_atoms_section_gap') as gap_gid:
push_array_values(jbe, np.array(refs_single_configuration), 'x_lib_atoms_training_config_refs')
push_value(jbe, gap['GAP_params.label'].As(), 'x_lib_atoms_GAP_params_label')
push_value(jbe, gap['GAP_params.svn_version'].As(), 'x_lib_atoms_GAP_params_svn_version')
push_value(jbe, gap['GAP_data.do_core'].As(), 'x_lib_atoms_GAP_data_do_core')
push_value(jbe, gap['GAP_data.e0'].As(float), 'x_lib_atoms_GAP_data_e0')
push_value(jbe, gap['command_line.command_line'].As(), 'x_lib_atoms_command_line_command_line')
push_value(jbe, gap['gpSparse.n_coordinate'].As(int), 'x_lib_atoms_gpSparse_n_coordinate')
types = [int, int, int, str, float, float, float, str, str, float, str, int, int ]
keys = ['n_sparseX', 'dimensions', 'n_permutations', 'sparsified', 'signal_variance', 'signal_mean', 'covariance_type', 'label', 'sparseX_filename', 'theta', 'descriptor', 'perm.permutation', 'perm.i']
for i,key in enumerate(keys):
push_value(jbe, gap['gpCoordinates.%s' % key].As(types[i]), 'x_lib_atoms_gpCoordinates_%s' % key.replace('.', '_'))
for key in ['alpha', 'sparseX']:
push_array_values(jbe, gap['gpCoordinates.%s' % key].As(), 'x_lib_atoms_gpCoordinates_%s' % key.replace('.', '_'))
jbe.finishedParsingSession("ParseSuccess", None)
return
......
......@@ -176,8 +176,9 @@ class LibAtomsGapParser(LibAtomsParser):
super(LibAtomsGapParser, self).__init__(log)
self.logtag = 'gap-xml'
self.trj = None
self.has_gap_data = False
return
def ParseOutput(self, output_file):
def ParseOutput(self, output_file, base_dir=''):
self.Set('program_name', 'libAtoms')
dom = xml.dom.minidom.parse(output_file)
root = XmlGetUnique(dom, 'GAP_params')
......@@ -210,6 +211,7 @@ class LibAtomsGapParser(LibAtomsParser):
# 'GAP_params/gpSparse'
key = 'gpSparse'
if key in child_nodes:
self.has_gap_data = True
node = child_nodes[key][0]
atts = XmlGetAttributes(node)
keys = ['n_coordinate']
......@@ -249,6 +251,7 @@ class LibAtomsGapParser(LibAtomsParser):
n_sparseX = self['gpCoordinates.n_sparseX'].As(int)
n_dim = self['gpCoordinates.dimensions'].As(int)
sparseX_filename = self['gpCoordinates.sparseX_filename'].As(str)
sparseX_filename = os.path.join(base_dir, sparseX_filename)
# Read alpha coefficients
nodes = gp_coord_child_nodes[key]
alpha_cutoff = np.zeros((n_sparseX, 2), dtype='float64')
......@@ -315,8 +318,31 @@ class LibAtomsFrame(LibAtomsParser):
def __init__(self, log=None):
super(LibAtomsFrame, self).__init__(log)
self.ase_config = None
self.has_energy = False
self.energy = None
self.has_virial = False
self.virial = None
self.has_config_type = False
self.config_type = None
def LoadAseConfig(self, ase_config):
self.ase_atoms = ase_config
self.ase_config = ase_config
key = 'energy'
if key in self.ase_config.info:
has_energy = True
self.energy = self.ase_config.info[key]
key = 'config_type'
if key in self.ase_config.info:
self.has_config_type = True
self.config_type = self.ase_config.info[key]
key = 'virial'
if key in self.ase_config.info:
self.has_virial = True
self.virial = np.array(self.ase_config.info[key])
return
# ===================
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment