zplghe.c 8.82 KB
Newer Older
1 2
/**
 *
Mathieu Faverge's avatar
Mathieu Faverge committed
3 4
 * @copyright 2009-2014 The University of Tennessee and The University of
 *                      Tennessee Research Foundation. All rights reserved.
5
 * @copyright (c) 2012-2016 Inria. All rights reserved.
6
 * @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
7 8 9 10 11 12 13 14 15 16 17 18
 *
 **/

/**
 *
 * @file zplghe.c
 *
 *  MORSE computational routines
 *  MORSE is a software package provided by Univ. of Tennessee,
 *  Univ. of California Berkeley and Univ. of Colorado Denver
 *
 * @version 2.5.0
19 20
 * @comment This file is a copy of zplghe.c
 *          wich has been automatically generated
21 22 23 24
 *          from Plasma 2.5.0 for MORSE 1.0.0
 * @author Mathieu Faverge
 * @author Emmanuel Agullo
 * @author Cedric Castagnede
25 26 27
 * @author Rade Mathis
 * @author Florent Pruvost
 * @date 2016-08-01
28 29 30
 * @precisions normal z -> c
 *
 **/
31
#include "control/common.h"
32

33 34
/**
 ********************************************************************************
35 36 37
 *
 * @ingroup MORSE_Complex64_t
 *
38
 *  MORSE_zplghe - Generate a random hermitian (positive definite if 'bump' is large enough) half-matrix by tiles.
39 40 41 42
 *
 *******************************************************************************
 *
 * @param[in] bump
Mathieu Faverge's avatar
Mathieu Faverge committed
43
 *          The value to add to the diagonal to be sure
44 45 46 47 48
 *          to have a positive definite matrix.
 *
 * @param[in] N
 *          The order of the matrix A. N >= 0.
 *
49 50 51
 * @param[in] uplo
 *          The part of the Matrix wich will be generated.
 *
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
 * @param[out] A
 *          On exit, The random hermitian matrix A generated.
 *
 * @param[in] LDA
 *          The leading dimension of the array A. LDA >= max(1,M).
 *
 * @param[in] seed
 *          The seed used in the random generation.
 *
 *******************************************************************************
 *
 * @return
 *          \retval MORSE_SUCCESS successful exit
 *          \retval <0 if -i, the i-th argument had an illegal value
 *
 *******************************************************************************
 *
 * @sa MORSE_zplghe_Tile
 * @sa MORSE_zplghe_Tile_Async
 * @sa MORSE_cplghe
 * @sa MORSE_dplghe
 * @sa MORSE_splghe
74
 * @sa MORSE_zplghe
75 76
 *
 ******************************************************************************/
77 78 79
int MORSE_zplghe( double bump, MORSE_enum uplo, int N,
                  MORSE_Complex64_t *A, int LDA,
                  unsigned long long int seed )
80 81 82 83 84 85
{
    int NB;
    int status;
    MORSE_context_t *morse;
    MORSE_sequence_t *sequence = NULL;
    MORSE_request_t request = MORSE_REQUEST_INITIALIZER;
Mathieu Faverge's avatar
Mathieu Faverge committed
86
    MORSE_desc_t descAl, descAt;
87 88 89 90 91 92 93 94 95 96 97

    morse = morse_context_self();
    if (morse == NULL) {
        morse_fatal_error("MORSE_zplghe", "MORSE not initialized");
        return MORSE_ERR_NOT_INITIALIZED;
    }
    /* Check input arguments */
    if (N < 0) {
        morse_error("MORSE_zplghe", "illegal value of N");
        return -2;
    }
98
    if (LDA < chameleon_max(1, N)) {
99 100 101 102
        morse_error("MORSE_zplghe", "illegal value of LDA");
        return -4;
    }
    /* Quick return */
103
    if (chameleon_max(0, N) == 0)
104 105 106 107 108 109 110 111
        return MORSE_SUCCESS;

    /* Tune NB depending on M, N & NRHS; Set NBNB */
    status = morse_tune(MORSE_FUNC_ZGEMM, N, N, 0);
    if (status != MORSE_SUCCESS) {
        morse_error("MORSE_zplghe", "morse_tune() failed");
        return status;
    }
Mathieu Faverge's avatar
Mathieu Faverge committed
112

113 114
    /* Set NT */
    NB = MORSE_NB;
115
    morse_sequence_create( morse, &sequence );
Mathieu Faverge's avatar
Mathieu Faverge committed
116

117
    /* Submit the matrix conversion */
118
    morse_zlap2tile( morse, &descAl, &descAt, MorseDescOutput, uplo,
119
                     A, NB, NB, LDA, N, N, N, sequence, &request );
120 121

    /* Call the tile interface */
122
    MORSE_zplghe_Tile_Async( bump, uplo, &descAt, seed, sequence, &request );
123

Mathieu Faverge's avatar
Cleanup  
Mathieu Faverge committed
124
    /* Submit the matrix conversion back */
Mathieu Faverge's avatar
Mathieu Faverge committed
125
    morse_ztile2lap( morse, &descAl, &descAt,
126
                     MorseDescOutput, uplo, sequence, &request );
Mathieu Faverge's avatar
Mathieu Faverge committed
127

128
    morse_sequence_wait( morse, sequence );
Mathieu Faverge's avatar
Mathieu Faverge committed
129

Mathieu Faverge's avatar
Mathieu Faverge committed
130 131
    /* Cleanup the temporary data */
    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
132 133

    status = sequence->status;
134
    morse_sequence_destroy( morse, sequence );
135 136 137 138

    return status;
}

139 140
/**
 ********************************************************************************
141 142 143
 *
 * @ingroup MORSE_Complex64_t_Tile
 *
144
 *  MORSE_zplghe_Tile - Generate a random hermitian (positive definite if 'bump' is large enough) half-matrix by tiles.
145 146 147 148 149 150 151 152
 *  Tile equivalent of MORSE_zplghe().
 *  Operates on matrices stored by tiles.
 *  All matrices are passed through descriptors.
 *  All dimensions are taken from the descriptors.
 *
 *******************************************************************************
 *
 * @param[in] bump
Mathieu Faverge's avatar
Mathieu Faverge committed
153
 *          The value to add to the diagonal to be sure
154 155
 *          to have a positive definite matrix.
 *
156 157 158
 * @param[in] uplo
 *          The part of the Matrix wich will be generated.
 *
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
 * @param[in] A
 *          On exit, The random hermitian matrix A generated.
 *
 * @param[in] seed
 *          The seed used in the random generation.
 *
 *******************************************************************************
 *
 * @return
 *          \retval MORSE_SUCCESS successful exit
 *
 *******************************************************************************
 *
 * @sa MORSE_zplghe
 * @sa MORSE_zplghe_Tile_Async
 * @sa MORSE_cplghe_Tile
 * @sa MORSE_dplghe_Tile
 * @sa MORSE_splghe_Tile
177
 * @sa MORSE_zplghe_Tile
178 179
 *
 ******************************************************************************/
180 181
int MORSE_zplghe_Tile( double bump, MORSE_enum uplo, MORSE_desc_t *A,
                       unsigned long long int seed )
182 183 184 185 186 187 188 189 190 191 192
{
    MORSE_context_t *morse;
    MORSE_sequence_t *sequence = NULL;
    MORSE_request_t request = MORSE_REQUEST_INITIALIZER;
    int status;

    morse = morse_context_self();
    if (morse == NULL) {
        morse_fatal_error("MORSE_zplghe_Tile", "MORSE not initialized");
        return MORSE_ERR_NOT_INITIALIZED;
    }
193 194
    morse_sequence_create( morse, &sequence );

195
    MORSE_zplghe_Tile_Async( bump, uplo, A, seed, sequence, &request );
Mathieu Faverge's avatar
Mathieu Faverge committed
196

197
    MORSE_Desc_Flush( A, sequence );
Mathieu Faverge's avatar
Mathieu Faverge committed
198

199
    morse_sequence_wait( morse, sequence );
200
    status = sequence->status;
201
    morse_sequence_destroy( morse, sequence );
202 203 204
    return status;
}

205 206
/**
 ********************************************************************************
207 208 209
 *
 * @ingroup MORSE_Complex64_t_Tile_Async
 *
210
 *  MORSE_zplghe_Tile_Async - Generate a random hermitian (positive definite if 'bump' is large enough) half-matrix by tiles.
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
 *  Non-blocking equivalent of MORSE_zplghe_Tile().
 *  May return before the computation is finished.
 *  Allows for pipelining of operations at runtime.
 *
 *******************************************************************************
 *
 * @param[in] sequence
 *          Identifies the sequence of function calls that this call belongs to
 *          (for completion checks and exception handling purposes).
 *
 * @param[out] request
 *          Identifies this function call (for exception handling purposes).
 *
 *******************************************************************************
 *
 * @sa MORSE_zplghe
 * @sa MORSE_zplghe_Tile
 * @sa MORSE_cplghe_Tile_Async
 * @sa MORSE_dplghe_Tile_Async
 * @sa MORSE_splghe_Tile_Async
 * @sa MORSE_zplghe_Tile_Async
 *
 ******************************************************************************/
234 235 236
int MORSE_zplghe_Tile_Async( double                 bump,
                             MORSE_enum             uplo,
                             MORSE_desc_t             *A,
237
                             unsigned long long int seed,
238 239
                             MORSE_sequence_t  *sequence,
                             MORSE_request_t    *request )
240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
{
    MORSE_context_t *morse;

    morse = morse_context_self();
    if (morse == NULL) {
        morse_fatal_error("MORSE_zplghe_Tile", "MORSE not initialized");
        return MORSE_ERR_NOT_INITIALIZED;
    }
    if (sequence == NULL) {
        morse_fatal_error("MORSE_zplghe_Tile", "NULL sequence");
        return MORSE_ERR_UNALLOCATED;
    }
    if (request == NULL) {
        morse_fatal_error("MORSE_zplghe_Tile", "NULL request");
        return MORSE_ERR_UNALLOCATED;
    }
    /* Check sequence status */
Mathieu Faverge's avatar
Mathieu Faverge committed
257
    if (sequence->status == MORSE_SUCCESS) {
258
        request->status = MORSE_SUCCESS;
Mathieu Faverge's avatar
Mathieu Faverge committed
259 260
    }
    else {
261
        return morse_request_fail(sequence, request, MORSE_ERR_SEQUENCE_FLUSHED);
Mathieu Faverge's avatar
Mathieu Faverge committed
262
    }
263 264 265 266 267 268 269 270 271 272 273 274 275

    /* Check descriptors for correctness */
    if (morse_desc_check(A) != MORSE_SUCCESS) {
        morse_error("MORSE_zplghe_Tile", "invalid descriptor");
        return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE);
    }
    /* Check input arguments */
    if (A->nb != A->mb) {
        morse_error("MORSE_zplghe_Tile", "only square tiles supported");
        return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE);
    }

    /* Quick return */
Mathieu Faverge's avatar
Mathieu Faverge committed
276
    if (chameleon_min( A->m, A->n ) == 0)
277 278
        return MORSE_SUCCESS;

Mathieu Faverge's avatar
Mathieu Faverge committed
279
    morse_pzplghe( bump, uplo, A, seed, sequence, request );
280 281 282

    return MORSE_SUCCESS;
}