def METHOD_NAME(
        self, space, out=None):
    """
    """
    assert ~isinstance(self.space, tuple) 
    source = self.source
    mesh = space.mesh # 获取网格对像
    GD = mesh.geo_dimension()
    if isinstance(threshold, np.ndarray) or isinstance(threshold, slice):
        # 在实际应用中，一般直接给出相应网格实体编号
        # threshold 有以下几种情况：
        # 1. 编号数组
        # 2. slice
        # 3. 逻辑数组
        index = threshold 
    else:
        index = mesh.ds.boundary_face_index()
        if callable(threshold): 
            bc = mesh.entity_barycenter('face', index=index)
            index = index[threshold(bc)] # 通过边界的重心来判断
    facemeasure = mesh.entity_measure('face', index=index)
    NF = len(facemeasure)
    ldof = space.number_of_face_dofs() 
    if out is None:
        bb = np.zeros((NC, ldof), dtype=space.ftype)
    else:
        bb = out
    qf = mesh.integrator(self.q, 'face')
    bcs, ws = qf.get_quadrature_points_and_weights()
    if callable(source):
        if ~hasattr(source, 'coordtype') or source.coordtype == 'cartesian':
            ps = mesh.bc_to_point(bcs, index=index)
            n = mesh.face_unit_normal(index=index)
            # 在实际问题当中，法向 n  这个参数一般不需要
            # 传入 n， 用户可根据需要来计算 Neumann 边界的法向梯度
            val = source(ps, n) 
        elif source.coordtype == 'barycentric':
            # 这个时候 source 是一个有限元函数，一定不需要算面法向
            val = source(bcs, index=index) 
    else:
        val = source 
    phi = space.face_basis(bcs, index=index) # (NQ, NF, ldof, GD)
    if isinstance(val, np.ndarray):
        if val.shape == (GD, ): # GD << NC
                bb += np.einsum('q, d, qfid, f->fi', ws, val, phi, facemeasure, optimize=True)
        elif val.shape == (NF, GD): 
                bb += np.einsum('q, fd, qfid, f->fi', ws, val, phi, facemeasure, optimize=True)
        elif val.shape == (NQ, NF, GD):
                bb += np.einsum('q, qfd, qfid, f->fi', ws, val, phi, facemeasure, optimize=True)
        else:
            raise ValueError(f"val with shape {val.shape}, I can't deal with it!")
    else:
        raise ValueError(f"val is not a np.ndarray object! It is {type(val)}")
    if out is None:
        return bb 