code: def get_orthogonal_c_slab(self):
          
          a, b, c = self.lattice.matrix
          new_c = np.cross(a, b)
          new_c /= np.linalg.norm(new_c)
          new_c = np.dot(c, new_c) * new_c
          new_latt = Lattice([a, b, new_c])
          return Slab(lattice=new_latt, species=self.species_and_occu,
                      coords=self.cart_coords, miller_index=self.miller_index,
                      oriented_unit_cell=self.oriented_unit_cell,
                      shift=self.shift, scale_factor=self.scale_factor,
                      coords_are_cartesian=True, energy=self.energy,
                      reorient_lattice=self.reorient_lattice,
                      site_properties=self.site_properties)
docs: This method returns a Slab where the normal (c lattice vector) is
          "forced" to be exactly orthogonal to the surface a and b lattice
          vectors. **Note that this breaks inherent symmetries in the slab.**
          It should be pointed out that orthogonality is not required to get good
          surface energies, but it can be useful in cases where the slabs are
          subsequently used for postprocessing of some kind, e.g. generating
          GBs or interfaces.