mirror of https://github.com/phonopy/phonopy.git
185 lines
6.8 KiB
Python
Executable File
185 lines
6.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
# Copyright (C) 2011 Atsushi Togo
|
|
# All rights reserved.
|
|
#
|
|
# This file is part of phonopy.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
#
|
|
# * Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
#
|
|
# * Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in
|
|
# the documentation and/or other materials provided with the
|
|
# distribution.
|
|
#
|
|
# * Neither the name of the phonopy project nor the names of its
|
|
# contributors may be used to endorse or promote products derived
|
|
# from this software without specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
# Thermal properties plot (propplot)
|
|
#
|
|
# Usage:
|
|
# propplot
|
|
|
|
import numpy as np
|
|
|
|
try:
|
|
import yaml
|
|
except ImportError:
|
|
print "You need to install python-yaml."
|
|
exit(1)
|
|
|
|
try:
|
|
from yaml import CLoader as Loader
|
|
from yaml import CDumper as Dumper
|
|
except ImportError:
|
|
from yaml import Loader, Dumper
|
|
|
|
# Parse options
|
|
from optparse import OptionParser
|
|
parser = OptionParser()
|
|
parser.set_defaults( output_filename = None,
|
|
factor = 1.0,
|
|
is_heat_capacity = False,
|
|
is_entropy = False,
|
|
is_free_energy = False,
|
|
is_diff = False,
|
|
is_gnuplot = False,
|
|
ymax = None,
|
|
ymin = None,
|
|
tmax = None,
|
|
tmin = None )
|
|
parser.add_option("--factor", dest="factor", type="float",
|
|
help="Conversion factor of energy unit to internal electronic energy")
|
|
parser.add_option("--ymax", dest="ymax", type="float",
|
|
help="Maximum value of y axis")
|
|
parser.add_option("--ymin", dest="ymin", type="float",
|
|
help="Minimum value of y axis")
|
|
parser.add_option("--tmax", dest="tmax", type="float",
|
|
help="Maximum value of temperature")
|
|
parser.add_option("--tmin", dest="tmin", type="float",
|
|
help="Minimum value of temperature")
|
|
parser.add_option("--cv", "--heat_capacity", dest="is_heat_capacity",
|
|
action="store_true",
|
|
help="Plot heat capacity")
|
|
parser.add_option("-s", "--entropy", dest="is_entropy",
|
|
action="store_true",
|
|
help="Plot entropy")
|
|
parser.add_option("--fe", "--free_energy", dest="is_free_energy",
|
|
action="store_true",
|
|
help="Plot free energy")
|
|
parser.add_option("-o", "--output", dest="output_filename",
|
|
action="store", type="string",
|
|
help="Output filename")
|
|
parser.add_option("-d", "--diff", dest="is_diff",
|
|
action="store_true",
|
|
help="Calculate difference")
|
|
parser.add_option("--gnuplot", dest="is_gnuplot",
|
|
action="store_true",
|
|
help="Damp thermal properties in gnuplot data style")
|
|
(options, args) = parser.parse_args()
|
|
|
|
if options.is_gnuplot:
|
|
print "# temperature[K] Free energy [kJ/mol] Entropy [J/K/mol] Heat capacity [J/K/mol] Energy [kJ/mol]"
|
|
else:
|
|
import matplotlib.pyplot as plt
|
|
if ( ( not options.is_heat_capacity ) and
|
|
( not options.is_entropy ) and
|
|
( not options.is_free_energy ) ):
|
|
print "Set --cv, --entropy or --fe"
|
|
exit(0)
|
|
|
|
if len( args ) == 0:
|
|
filenames = ['thermal_properties.yaml']
|
|
else:
|
|
filenames = args
|
|
|
|
if options.is_heat_capacity:
|
|
prop_target = 'heat_capacity'
|
|
elif options.is_entropy:
|
|
prop_target = 'entropy'
|
|
elif options.is_free_energy:
|
|
prop_target = 'free_energy'
|
|
|
|
thermal_properties_0 = yaml.load( open( filenames[0] ).read(),
|
|
Loader=Loader )['thermal_properties']
|
|
temperatures = [ v['temperature'] for v in thermal_properties_0 ]
|
|
|
|
tmin_index = 0
|
|
tmax_index = len( temperatures )
|
|
if not options.tmin == None:
|
|
for i, t in enumerate( temperatures ):
|
|
if t > options.tmin - ( temperatures[1] - temperatures[0] ) * 0.1:
|
|
tmin_index = i
|
|
break
|
|
|
|
if not options.tmax == None:
|
|
for i, t in enumerate( temperatures ):
|
|
if t > options.tmax + ( temperatures[1] - temperatures[0] ) * 0.1:
|
|
tmax_index = i
|
|
break
|
|
|
|
if options.is_diff:
|
|
props_0 = [ v[prop_target] for v in thermal_properties_0 ]
|
|
props_0 = np.array( props_0 ) * options.factor
|
|
|
|
for filename in filenames:
|
|
thermal_properties = yaml.load( open( filename ).read(),
|
|
Loader=Loader )['thermal_properties']
|
|
|
|
if options.is_gnuplot:
|
|
props = []
|
|
for name in ('temperature', 'free_energy', 'entropy', 'heat_capacity'):
|
|
props.append([ v[name] for v in thermal_properties ])
|
|
|
|
for t, f, e, h in zip( props[0][tmin_index:tmax_index],
|
|
props[1][tmin_index:tmax_index],
|
|
props[2][tmin_index:tmax_index],
|
|
props[3][tmin_index:tmax_index] ):
|
|
print t, f, e, h, f+e*t/1000
|
|
print
|
|
print
|
|
else:
|
|
temperatures = [ v['temperature'] for v in thermal_properties ]
|
|
props = [ v[prop_target] for v in thermal_properties ]
|
|
props = np.array( props ) * options.factor
|
|
if options.is_diff:
|
|
props -= props_0
|
|
plt.plot( temperatures[tmin_index:tmax_index],
|
|
props[tmin_index:tmax_index] )
|
|
|
|
|
|
|
|
if not options.is_gnuplot:
|
|
if ( not options.ymin == None ) and ( not options.ymax == None ):
|
|
plt.ylim( options.ymin, options.ymax )
|
|
elif options.ymin == None and ( not options.ymax == None ):
|
|
plt.ylim( ymax=options.ymax )
|
|
elif ( not options.ymin == None ) and options.ymax == None:
|
|
plt.ylim( ymin=options.ymin )
|
|
|
|
if not options.output_filename == None:
|
|
plt.rcParams['pdf.fonttype'] = 42
|
|
plt.rcParams['font.family'] = 'serif'
|
|
plt.savefig(options.output_filename)
|
|
else:
|
|
plt.show()
|