calculate unit-cell volume at given pressure and temperature

        :param p: pressure in GPa
        :param temp: temperature in K
        :param min_strain: minimum strain searched for volume root
        :param max_strain: maximum strain searched for volume root
        :return: unit-cell volume in A^3
        :note: 2017/05/10 I found wrap function is not compatible with
            OrderedDict. So I convert unp array to np array.

def cal_v(self, p, temp, min_strain=0.3, max_strain=1.0):
        """
        calculate unit-cell volume at given pressure and temperature

        :param p: pressure in GPa
        :param temp: temperature in K
        :param min_strain: minimum strain searched for volume root
        :param max_strain: maximum strain searched for volume root
        :return: unit-cell volume in A^3
        :note: 2017/05/10 I found wrap function is not compatible with
            OrderedDict. So I convert unp array to np array.
        """
        v0 = self.params_therm['v0'].nominal_value
        self.force_norm = True
        pp = unp.nominal_values(p)
        ttemp = unp.nominal_values(temp)

        def _cal_v_single(pp, ttemp):
            if (pp <= 1.e-5) and (ttemp == 300.):
                return v0

            def f_diff(v, ttemp, pp):
                return self.cal_p(v, ttemp) - pp
            # print(f_diff(v0 * 0.3, temp, p))
            v = brenth(f_diff, v0 * max_strain, v0 * min_strain,
                       args=(ttemp, pp))
            return v
        f_vu = np.vectorize(_cal_v_single)
        v = f_vu(pp, ttemp)
        self.force_norm = False
        return v