#!/usr/bin/env python2.7
# -*- coding: UTF-8 no BOM -*-

import os
import damask
import numpy as np
from optparse import OptionParser

scriptName = os.path.splitext(os.path.basename(__file__))[0]
scriptID = ' '.join([scriptName, damask.version])


def getCauchy(f, p):
    """Return Cauchy stress for given f and p"""
    # [Cauchy] = (1/det(F)) * [P].[F_transpose]
    f = f.reshape((3, 3))
    p = p.reshape((3, 3))
    return 1.0/np.linalg.det(f)*np.dot(p, f.T).reshape(9)


# --------------------------------------------------------------------
#                                MAIN
# --------------------------------------------------------------------
desp = "Add column(s) containing Cauchy stress based on given column(s)"
desp += "of deformation gradient and first Piola--Kirchhoff stress."
parser = OptionParser(option_class=damask.extendableOption,
                      usage='%prog options [file[s]]',
                      description=desp,
                      version=scriptID)
parser.add_option('-f', '--defgrad',
                  dest='defgrad',
                  type='string', metavar='string',
                  help='heading for deformation gradient [%default]')
parser.add_option('-p', '--stress',
                  dest='stress',
                  type='string', metavar='string',
                  help='heading for first Piola--Kirchhoff stress [%default]')

parser.set_defaults(defgrad='f',
                    stress='p')

(options, filenames) = parser.parse_args()

# ----- loop over input H5 files ----- #
for name in filenames:
    try:
        h5f = damask.H5Table(name, new_file=False)
    except:
        continue
    damask.util.report(scriptName, name)

    # ----- read in data ----- #
    f = h5f.get_data("f")
    p = h5f.get_data("p")

    # ----- calculate Cauchy stress ----- #
    cauchy = [getCauchy(f_i, p_i) for f_i, p_i in zip(f, p)]

    # ----- write to HDF5 file ----- #
    cmd_log = " ".join([scriptID, name])
    h5f.add_data('Cauchy', np.array(cauchy), cmd_log=cmd_log)