code: def G(self, singular_value):
          
          if self.__G is not None and singular_value == self.__G_sv:
              return self.__G
  
          if singular_value == 0:
              self.__G_sv = 0
              self.__G = Matrix(
                  x=np.zeros((self.jco.ncol,self.jco.nrow)),
                  row_names=self.jco.col_names, col_names=self.jco.row_names)
              return self.__G
          mn = min(self.jco.shape)
          try:
              mn = min(self.pst.npar_adj, self.pst.nnz_obs)
          except:
              pass
          if singular_value > mn:
              self.logger.warn(
                  "ErrVar.G(): singular_value > min(npar,nobs):" +
                  "resetting to min(npar,nobs): " +
                  str(min(self.pst.npar_adj, self.pst.nnz_obs)))
              singular_value = min(self.pst.npar_adj, self.pst.nnz_obs)
          self.log("calc G @" + str(singular_value))
          #v1 = self.qhalfx.v[:, :singular_value]
          v1 = self.xtqx.v[:, :singular_value]
          #s1 = ((self.qhalfx.s[:singular_value]) ** 2).inv
          s1 = (self.xtqx.s[:singular_value]).inv
          self.__G = v1 * s1 * v1.T * self.jco.T * self.obscov.inv
          self.__G_sv = singular_value
          self.__G.row_names = self.jco.col_names
          self.__G.col_names = self.jco.row_names
          self.__G.autoalign = True
          self.log("calc G @" + str(singular_value))
          return self.__G
docs: get the parameter solution Matrix at a singular value
              V_1 * S_1^(_1) * U_1^T
  
          Parameters
          ----------
          singular_value : int
              singular value to calc R at
  
          Returns
          -------
          G : pyemu.Matrix
              parameter solution matrix at singular value