def get_fc3(supercell, primitive, displacements, forces, fc_calculator=None,
    fc_calculator_options=None, is_compact_fc=False, log_level=0):
    """Supercell 2nd order force constants (fc2) are calculated.

    The expected shape of supercell fc3 to be returned is
        (len(atom_list), num_atoms, num_atom, 3, 3, 3),
    where atom_list is either all atoms in primitive cell or supercell,
    which is chosen by is_compact_fc=True for primitive cell and False for
    supercell.

    Parameters
    ----------
    supercell : PhonopyAtoms
        Supercell
    primitive : Primitive
        Primitive cell
    displacements : array_like
        Displacements of atoms in supercell.
        shape=(num_snapshots, num_atoms, 3), dtype='double', order='C'
    forces : array_like
        Forces of atoms in supercell.
        shape=(num_snapshots, num_atoms, 3), dtype='double', order='C'
    fc_calculator : str, optional
        Currently only 'alm' is supported. Default is None, meaning invoking
        'alm'.
    fc_calculator_options : str, optional
        This is arbitrary string.
    log_level : integer or bool, optional
        Verbosity level. False or 0 means quiet. True or 1 means normal level
        of log to stdout. 2 gives verbose mode.

    Returns
    -------
    fc3 : ndarray
        3rd order force constants.
        shape=(len(atom_list), num_atoms, num_atoms, 3, 3, 3)
        dtype='double', order='C'.
        Here atom_list is either all atoms in primitive cell or supercell,
        which is chosen by is_compact_fc=True for primitive cell and False
        for supercell.

    """
    if fc_calculator == 'alm':
        from phono3py.other.alm import get_fc3
        return get_fc3(supercell, primitive, displacements, forces, options
            =fc_calculator_options, is_compact_fc=is_compact_fc, log_level=
            log_level)
    else:
        msg = ('Force constants calculator of %s was not found .' %
            fc_calculator)
        raise RuntimeError(msg)
