Source code for orchestrator.target_property.analysis.elastic_constants_analysis

#!/usr/bin/env python

# Reads in the file file generated by the script ELASTIC/in.elastic
# It prints out the 6x6 tensor of elastic constants Cij
# followed by the 6x6 tensor of compliance constants Sij
# It uses the same conventions as described in:
# Sprik, Impey and Klein PRB (1984).
# The units of Cij are whatever was used in log.lammps (usually GPa)
# The units of Sij are the inverse of that (usually 1/GPa)

from __future__ import print_function
from numpy import zeros
from numpy.linalg import inv


[docs] def elastic_compliance(data_path): """ read lammps output to extract elastic constants (and compliance matrices) :param data_path: path, including filename to the LAMMPS output file to read :type data_path: str """ # define logfile layout nvals = 21 valpos = 4 valstr = '\nElastic Constant C' # define order of Cij in logfile cindices = [0] * nvals cindices[0] = (0, 0) cindices[1] = (1, 1) cindices[2] = (2, 2) cindices[3] = (0, 1) cindices[4] = (0, 2) cindices[5] = (1, 2) cindices[6] = (3, 3) cindices[7] = (4, 4) cindices[8] = (5, 5) cindices[9] = (0, 3) cindices[10] = (0, 4) cindices[11] = (0, 5) cindices[12] = (1, 3) cindices[13] = (1, 4) cindices[14] = (1, 5) cindices[15] = (2, 3) cindices[16] = (2, 4) cindices[17] = (2, 5) cindices[18] = (3, 4) cindices[19] = (3, 5) cindices[20] = (4, 5) # open logfile with open(data_path, 'r') as logfile: txt = logfile.read() # search for 21 elastic constants c = zeros((6, 6)) s2 = 0 for ival in range(nvals): s1 = txt.find(valstr, s2) if (s1 == -1): print("Failed to find elastic constants in log file") exit(1) s1 += 1 s2 = txt.find("\n", s1) line = txt[s1:s2] # print line words = line.split() (i1, i2) = cindices[ival] c[i1, i2] = float(words[valpos]) c[i2, i1] = c[i1, i2] # apply factor of 2 to columns of off-diagonal elements for i in range(6): for j in range(3, 6): c[i][j] *= 2.0 s = inv(c) # apply factor of 1/2 to columns of off-diagonal elements for i in range(6): for j in range(3, 6): s[i][j] *= 0.5 # undo the c multiplication as well c[i][j] *= 0.5 return c, s