Function that generates all adsorption structures for a given
        molecular adsorbate on both surfaces of a slab. This is useful
        for calculating surface energy where both surfaces need to be
        equivalent or if we want to calculate nonpolar systems.

        Args:
            molecule (Molecule): molecule corresponding to adsorbate
            repeat (3-tuple or list): repeat argument for supercell generation
            min_lw (float): minimum length and width of the slab, only used
                if repeat is None
            reorient (bool): flag on whether or not to reorient adsorbate
                along the miller index
            find_args (dict): dictionary of arguments to be passed to the
                call to self.find_adsorption_sites, e.g. {"distance":2.0}

def adsorb_both_surfaces(self, molecule, repeat=None, min_lw=5.0,
                             reorient=True, find_args={}):
        """
        Function that generates all adsorption structures for a given
        molecular adsorbate on both surfaces of a slab. This is useful
        for calculating surface energy where both surfaces need to be
        equivalent or if we want to calculate nonpolar systems.

        Args:
            molecule (Molecule): molecule corresponding to adsorbate
            repeat (3-tuple or list): repeat argument for supercell generation
            min_lw (float): minimum length and width of the slab, only used
                if repeat is None
            reorient (bool): flag on whether or not to reorient adsorbate
                along the miller index
            find_args (dict): dictionary of arguments to be passed to the
                call to self.find_adsorption_sites, e.g. {"distance":2.0}
        """

        # Get the adsorbed surfaces first
        adslabs = self.generate_adsorption_structures(molecule, repeat=repeat,
                                                      min_lw=min_lw,
                                                      reorient=reorient,
                                                      find_args=find_args)

        new_adslabs = []
        for adslab in adslabs:

            # Find the adsorbate sites and indices in each slab
            symmetric, adsorbates, indices = False, [], []
            for i, site in enumerate(adslab.sites):
                if site.surface_properties == "adsorbate":
                    adsorbates.append(site)
                    indices.append(i)

            # Start with the clean slab
            adslab.remove_sites(indices)
            slab = adslab.copy()

            # For each site, we add it back to the slab along with a
            # symmetrically equivalent position on the other side of
            # the slab using symmetry operations
            for adsorbate in adsorbates:
                p2 = adslab.get_symmetric_site(adsorbate.frac_coords)
                slab.append(adsorbate.specie, p2,
                            properties={"surface_properties": "adsorbate"})
                slab.append(adsorbate.specie, adsorbate.frac_coords,
                            properties={"surface_properties": "adsorbate"})
            new_adslabs.append(slab)

        return new_adslabs