code: def optimizer(self, temperature):
          
          G_V = []  # G for each volume
          # G = E(V) + PV + A_vib(V, T)
          for i, v in enumerate(self.volumes):
              G_V.append(self.energies[i] +
                         self.pressure * v * self.gpa_to_ev_ang +
                         self.vibrational_free_energy(temperature, v))
  
          # fit equation of state, G(V, T, P)
          eos_fit = self.eos.fit(self.volumes, G_V)
          # minimize the fit eos wrt volume
          # Note: the ref energy and the ref volume(E0 and V0) not necessarily
          # the same as minimum energy and min volume.
          volume_guess = eos_fit.volumes[np.argmin(eos_fit.energies)]
          min_wrt_vol = minimize(eos_fit.func, volume_guess)
          # G_opt=G(V_opt, T, P), V_opt
          return min_wrt_vol.fun, min_wrt_vol.x[0]
docs: Evaluate G(V, T, P) at the given temperature(and pressure) and
          minimize it wrt V.
  
          1. Compute the  vibrational helmholtz free energy, A_vib.
          2. Compute the gibbs free energy as a function of volume, temperature
              and pressure, G(V,T,P).
          3. Preform an equation of state fit to get the functional form of
              gibbs free energy:G(V, T, P).
          4. Finally G(V, P, T) is minimized with respect to V.
  
          Args:
              temperature (float): temperature in K
  
          Returns:
              float, float: G_opt(V_opt, T, P) in eV and V_opt in Ang^3.