//  [python]
def compute_reference_properties(self):
        """Compute elastic reference material properties.

        Returns
        -------
        E : float
            Young modulus of elastic reference material.
        v : float
            Poisson ratio of elastic reference material.
        """
        # Set strain/stress components order
        if self._strain_formulation == 'infinitesimal':
            comp_order = self._comp_order_sym
        elif self._strain_formulation == 'finite':
            if self._is_symmetrized:
                comp_order = self._comp_order_sym
            else:
                comp_order = self._comp_order_nsym
        else:
            raise RuntimeError('Unknown problem strain formulation.')
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        if np.all([abs(self._inc_strain_mf[i]) < 1e-10
                   for i in range(self._inc_strain_mf.shape[0])]):
            # Get last loading increment converged elastic reference material
            # properties
            E = self._material_properties_old['E']
            v = self._material_properties_old['v']
            # Return
            return E, v
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        # Set second-order identity tensor
        soid, _, _, _, _, _, _ = top.get_id_operators(self._n_dim)
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        # Initialize self-consistent scheme system of linear equations
        # coefficient matrix and right-hand side
        scs_matrix = np.zeros((2, 2))
        scs_rhs = np.zeros(2)
        # Get incremental strain and stress tensors
        inc_strain = mop.get_tensor_from_mf(self._inc_strain_mf, self._n_dim,
                                            comp_order)
        inc_stress = mop.get_tensor_from_mf(self._inc_stress_mf, self._n_dim,
                                            comp_order)
        # Compute self-consistent scheme system of linear equations right-hand
        # side
        scs_rhs[0] = np.trace(inc_stress)
        scs_rhs[1] = top.ddot22_1(inc_stress, inc_strain)
        # Compute self-consistent scheme system of linear equations coefficient
        # matrix
        scs_matrix[0, 0] = np.trace(inc_strain)*np.trace(soid)
        scs_matrix[0, 1] = 2.0*np.trace(inc_strain)
        scs_matrix[1, 0] = np.trace(inc_strain)**2
        scs_matrix[1, 1] = 2.0*top.ddot22_1(inc_strain, inc_strain)
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        # Limitation 1: Under isochoric loading conditions the first equation
        # of the self-consistent scheme system of linear equations vanishes
        # (derivative with respect to lambda). In this case, adopt the previous
        # converged lambda and compute miu from the second equation of the
        # self-consistent scheme system of linear equations
        if (abs(np.trace(inc_strain))/np.linalg.norm(inc_strain)) < 1e-10 \
                or np.linalg.solve(scs_matrix, scs_rhs)[0] < 0:
            # Get previous converged reference material elastic properties
            E_old = self._material_properties_old['E']
            v_old = self._material_properties_old['v']
            # Compute previous converged lambda
            lam = (E_old*v_old)/((1.0 + v_old)*(1.0 - 2.0*v_old))
            # Compute miu
            miu = scs_rhs[1]/scs_matrix[1, 1]
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        # Limitation 2: Under hydrostatic loading conditions both equations of
        # the self-consistent scheme system of linear equations become linearly
        # dependent. In this case, assume that the ratio between lambda and miu
        # is the same as in the previous converged values and solve the first
        # equation of self-consistent scheme system of linear equations
        elif np.all([abs(inc_strain[0, 0] - inc_strain[i, i])
                     / np.linalg.norm(inc_strain) < 1e-10
                     for i in range(self._n_dim)]) and \
                np.allclose(inc_strain, np.diag(np.diag(inc_strain)),
                            atol=1e-10):
            # Get previous converged reference material elastic properties
            E_old = self._material_properties_old['E']
            v_old = self._material_properties_old['v']
            # Compute previous converged reference material Lamé parameters
            lam_old = (E_old*v_old)/((1.0 + v_old)*(1.0 - 2.0*v_old))
            miu_old = E_old/(2.0*(1.0 + v_old))
            # Compute reference material Lamé parameters
            lam = (scs_rhs[0]/scs_matrix[0, 0])*(lam_old/(lam_old + miu_old))
            miu = (scs_rhs[0]/scs_matrix[0, 0])*(miu_old/(lam_old + miu_old))
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        # Solve self-consistent scheme system of linear equations
        else:
            scs_solution = np.linalg.solve(scs_matrix, scs_rhs)
            # Get reference material Lamé parameters
            lam = scs_solution[0]
            miu = scs_solution[1]
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        # Compute reference material Young modulus and Poisson ratio
        E, v = ElasticReferenceMaterial.technical_from_lame(lam, miu)
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        # Return
        return E, v