Refine custom posts by author

Three steps need to be followed to accomplish it.

1. Add rewrite rules

add_action('generate_rewrite_rules', 'author_cpt_add_rewrite_rules');
function author_cpt_add_rewrite_rules( $wp_rewrite ) 
{
  $new_rules = array( 
     'author/(.+)/(.+)' => 'index.php?author=".$wp_rewrite->preg_index(1) .
                            "&post_type=" .$wp_rewrite->preg_index(2) );

  //​ Add the new rewrite rule into the top of the global rules array
  $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}

2. Redirect to specific templates

function author_cpt_template_redirect() {
    global $wp_query;
    // check for the target request
    if (!empty($wp_query->query_vars["author']) && !empty($wp_query->query_vars['post_type'])) {
        // turn off 404 error
        $wp_query->is_404 = false;

        // include if template is available
        if(file_exists('author-'.$wp_query->query_vars['post_type'].'.php'))
            include('author-'.$wp_query->query_vars['post_type'].'.php');
        else if(file_exists('author.php'))
            include('author.php');
        else
            include('index.php');

        return;
    }

}

3. Query posts to populate the page or template

add_action('template_redirect', 'author_cpt_template_redirect', 1);
function query_author_cpts( $query ) {
    // check for the target request
    if (!empty($query->query_vars['author']) && !empty($query->query_vars['post_type'])) 
    {
        // query posts accordingly
        query_posts( array( 
                        'post_type' => $query->query_vars['post_type'],
                        'author_name' => $query->query_vars['author'],
                        'paged' => get_query_var( 'paged' ) )
                    );
    }
}
add_action( 'wp', 'query_author_cpts' );