NAME
    SCI_Group_operate - Create a new group from two existed groups

C Syntax
    #include <sci.h>
    int SCI_Group_operate(sci_group_t group1, sci_group_t group2, sci_op_t op, sci_group_t *newgroup)

INPUT PARAMETERS
    group1
        Existed group 1 (IN).
    group2
        Existed group 2 (IN).
    op
        Indicates how to create the new group from two existed groups (IN).
    newgroup
        The output new group (OUT).

DESCRIPTION
    This subroutine is used to create a new group from two existed groups, group1 and group2
    can be SCI_GROUP_ALL, and op can be SCI_UNION, SCI_INTERSECTION and SCI_DIFFERENCE. The 
    new newgroup can be used for SCI_Bcast to specify destination receivers.

    This is a blocking call. The caller can assume newgroup is ready to use upon the return
    of the function.

    For more information, please refer to SCI's online documents.

EXAMPLE
        {
                    int i, num_bes;
                    sci_group_t group1, group2, newgroup;
                    ...
                    SCI_Group_operate(group1, group2, SCI_UNION, &newgroup);
        }

ERRORS
    All SCI routines return an error value.

    SCI_ERR_UNINTIALIZED
        Uninitialized SCI execution environment
    SCI_ERR_INVALID_CALLER
        Can only be called in the front end
    SCI_ERR_GROUP_NOTFOUND
        The group to be freed does not exist
    SCI_ERR_INVALID_OPERATOR
        Incorrect op specified
    SCI_ERR_GROUP_EMPTY
        The new group is an empty group
    SCI_ERR_NO_MEM
        Out of memory

SEE ALSO
    SCI_Group_create(3)
    SCI_Group_free(3)
    SCI_Group_operate_ext(3)
