code: def add_adsorbate(self, molecule, ads_coord, repeat=None, reorient=True):
          
          if reorient:
              # Reorient the molecule along slab m_index
              sop = get_rot(self.slab)
              molecule.apply_operation(sop.inverse)
          struct = self.slab.copy()
          if repeat:
              struct.make_supercell(repeat)
          if 'surface_properties' in struct.site_properties.keys():
              molecule.add_site_property("surface_properties",
                                         ["adsorbate"] * molecule.num_sites)
          if 'selective_dynamics' in struct.site_properties.keys():
              molecule.add_site_property("selective_dynamics",
                                         [[True, True, True]] * molecule.num_sites)
          for site in molecule:
              struct.append(site.specie, ads_coord + site.coords, coords_are_cartesian=True,
                            properties=site.properties)
          return struct
docs: Adds an adsorbate at a particular coordinate.  Adsorbate
          represented by a Molecule object, and is positioned relative
          to the input adsorbate coordinate.
  
          Args:
              molecule (Molecule): molecule object representing the adsorbate
              ads_coord (array): coordinate of adsorbate position
              repeat (3-tuple or list): input for making a supercell of slab
                  prior to placing the adsorbate
              reorient (bool): flag on whether to reorient the molecule to
                  have its z-axis concurrent with miller index