PaStiX Handbook  6.3.0
solve_strsmsp.c
Go to the documentation of this file.
1 /**
2  *
3  * @file solve_strsmsp.c
4  *
5  * PaStiX solve kernels routines
6  *
7  * @copyright 2012-2023 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
8  * Univ. Bordeaux. All rights reserved.
9  *
10  * @version 6.3.0
11  * @author Mathieu Faverge
12  * @author Pierre Ramet
13  * @author Xavier Lacoste
14  * @author Tony Delarue
15  * @author Vincent Bridonneau
16  * @author Alycia Lisito
17  * @date 2023-03-30
18  * @generated from /builds/solverstack/pastix/kernels/solve_ztrsmsp.c, normal z -> s, Mon Aug 28 13:40:38 2023
19  *
20  **/
21 #include "common.h"
22 #include "cblas.h"
23 #include "blend/solver.h"
24 #include "kernels_trace.h"
25 #include "pastix_scores.h"
26 #include "pastix_slrcores.h"
27 
28 #ifndef DOXYGEN_SHOULD_SKIP_THIS
29 static float szero = 0.0;
30 static float sone = 1.0;
31 static float msone = -1.0;
32 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
33 
34 /**
35  *******************************************************************************
36  *
37  * @brief Apply a solve trsm update related to a diagonal block of the matrix A.
38  *
39  *******************************************************************************
40  *
41  * @param[in] side
42  * Specify the side parameter of the TRSM.
43  *
44  * @param[in] uplo
45  * Specify the uplo parameter of the TRSM.
46  *
47  * @param[in] trans
48  * Specify the transposition used for the matrix A in the
49  * computation. It has to be either PastixTrans or PastixTrans.
50  *
51  * @param[in] diag
52  * Specify if the off-diagonal blocks are unit triangular. It has to be
53  * either PastixUnit or PastixNonUnit.
54  *
55  * @param[in] cblk
56  * The cblk structure that corresponds to the A and B matrix.
57  *
58  * @param[in] nrhs
59  * The number of right hand side.
60  *
61  * @param[in] dataA
62  * The pointer to the correct representation of the data of A.
63  * - coeftab if the block is in full rank. Must be of size cblk.stride -by- cblk.width.
64  * - pastix_lr_block if the block is compressed.
65  *
66  * @param[inout] b
67  * The pointer to the matrix B, that is a portion of the right hand
68  * side to solve.
69  *
70  * @param[in] ldb
71  * The leading dimension of B.
72  *
73  *******************************************************************************/
74 void
76  pastix_uplo_t uplo,
77  pastix_trans_t trans,
78  pastix_diag_t diag,
79  const SolverCblk *cblk,
80  int nrhs,
81  const void *dataA,
82  float *b,
83  int ldb )
84 {
85  pastix_int_t n, lda;
86  pastix_lrblock_t *lrA;
87  float *A;
88 
89  n = cblk_colnbr( cblk );
90 
91  if ( cblk->cblktype & CBLK_COMPRESSED ) {
92  lrA = (pastix_lrblock_t *)dataA;
93  assert( lrA->rk == -1 );
94  A = lrA->u;
95  lda = n;
96  }
97  else {
98  A = (float *)dataA;
99  lda = (cblk->cblktype & CBLK_LAYOUT_2D) ? n : cblk->stride;
100  }
101 
102  cblas_strsm(
103  CblasColMajor, (CBLAS_SIDE)side, (CBLAS_UPLO)uplo,
104  (CBLAS_TRANSPOSE)trans, (CBLAS_DIAG)diag,
105  n, nrhs,
106  (sone), A, lda,
107  b, ldb );
108 }
109 
110 /**
111  *******************************************************************************
112  *
113  * @brief Apply a solve gemm update related to a single block of the matrix A.
114  *
115  *******************************************************************************
116  *
117  * @param[in] side
118  * Specify whether the blok parameter belongs to cblk (PastixLeft), or
119  * to fcbk (PastixRight).
120  *
121  * @param[in] trans
122  * Specify the transposition used for the matrix A in the
123  * computation. It has to be either PastixTrans or PastixTrans.
124  *
125  * @param[in] nrhs
126  * The number of right hand side.
127  *
128  * @param[in] cblk
129  * The cblk structure that corresponds to the B matrix.
130  *
131  * @param[in] blok
132  * The blok structure that corresponds to the A matrix, and that
133  * belongs either to cblk or fcbk depending on the side parameter.
134  *
135  * @param[inout] fcbk
136  * The cblk structure that corresponds to the C matrix.
137  *
138  * @param[in] dataA
139  * The pointer to the correct representation of the data of A.
140  * - coeftab if the block is in full rank. Must be of size cblk.stride -by- cblk.width.
141  * - pastix_lr_block if the block is compressed.
142  *
143  * @param[in] B
144  * The pointer to the matrix B, that is a portion of the right hand
145  * side.
146  *
147  * @param[in] ldb
148  * The leading dimension of B.
149  *
150  * @param[inout] C
151  * The pointer to the matrix C, that is the updated portion of the
152  * right hand side.
153  *
154  * @param[in] ldc
155  * The leading dimension of C.
156  *
157  *******************************************************************************/
158 void
160  pastix_trans_t trans,
161  pastix_int_t nrhs,
162  const SolverCblk *cblk,
163  const SolverBlok *blok,
164  SolverCblk *fcbk,
165  const void *dataA,
166  const float *B,
167  pastix_int_t ldb,
168  float *C,
169  pastix_int_t ldc )
170 {
171  pastix_int_t m, n, lda;
172  pastix_int_t offB, offC;
173  const SolverCblk *bowner;
174 
175  if ( side == PastixLeft ) {
176  /*
177  * Blok should belong to cblk
178  */
179  bowner = cblk;
180 
181  m = blok_rownbr( blok );
182  n = cblk_colnbr( cblk );
183  lda = m;
184 
185  offB = 0;
186  offC = blok->frownum - fcbk->fcolnum;
187  }
188  else {
189  /*
190  * Blok should belong to fcbk
191  */
192  bowner = fcbk;
193 
194  m = cblk_colnbr( fcbk );
195  n = blok_rownbr( blok );
196  lda = n;
197 
198  offB = blok->frownum - cblk->fcolnum;
199  offC = 0;
200  }
201 
202  assert( (blok > bowner[0].fblokptr) &&
203  (blok < bowner[1].fblokptr) );
204 
205  if ( bowner->cblktype & CBLK_COMPRESSED ) {
206  const pastix_lrblock_t *lrA = dataA;
207  float *tmp;
208 
209  switch (lrA->rk){
210  case 0:
211  break;
212  case -1:
213  pastix_cblk_lock( fcbk );
214  cblas_sgemm(
215  CblasColMajor, (CBLAS_TRANSPOSE)trans, CblasNoTrans,
216  m, nrhs, n,
217  (msone), lrA->u, lda,
218  B + offB, ldb,
219  (sone), C + offC, ldc );
220  pastix_cblk_unlock( fcbk );
221  break;
222  default:
223  MALLOC_INTERN( tmp, lrA->rk * nrhs, float);
224  if (trans == PastixNoTrans) {
225  cblas_sgemm(
226  CblasColMajor, (CBLAS_TRANSPOSE)trans, CblasNoTrans,
227  lrA->rk, nrhs, n,
228  (sone), lrA->v, lrA->rkmax,
229  B + offB, ldb,
230  (szero), tmp, lrA->rk );
231 
232  pastix_cblk_lock( fcbk );
233  cblas_sgemm(
234  CblasColMajor, (CBLAS_TRANSPOSE)trans, CblasNoTrans,
235  m, nrhs, lrA->rk,
236  (msone), lrA->u, lda,
237  tmp, lrA->rk,
238  (sone), C + offC, ldc );
239  pastix_cblk_unlock( fcbk );
240  }
241  else {
242  cblas_sgemm(
243  CblasColMajor, (CBLAS_TRANSPOSE)trans, CblasNoTrans,
244  lrA->rk, nrhs, n,
245  (sone), lrA->u, lda,
246  B + offB, ldb,
247  (szero), tmp, lrA->rk );
248 
249  pastix_cblk_lock( fcbk );
250  cblas_sgemm(
251  CblasColMajor, (CBLAS_TRANSPOSE)trans, CblasNoTrans,
252  m, nrhs, lrA->rk,
253  (msone), lrA->v, lrA->rkmax,
254  tmp, lrA->rk,
255  (sone), C + offC, ldc );
256  pastix_cblk_unlock( fcbk );
257  }
258  memFree_null(tmp);
259  break;
260  }
261  }
262  else{
263  const float *A = dataA;
264  lda = (bowner->cblktype & CBLK_LAYOUT_2D) ? lda : bowner->stride;
265 
266  pastix_cblk_lock( fcbk );
267  cblas_sgemm(
268  CblasColMajor, (CBLAS_TRANSPOSE)trans, CblasNoTrans,
269  m, nrhs, n,
270  (msone), A, lda,
271  B + offB, ldb,
272  (sone), C + offC, ldc );
273  pastix_cblk_unlock( fcbk );
274  }
275 }
276 
277 /**
278  *******************************************************************************
279  *
280  * @brief Apply a forward solve related to one cblk to all the right hand side.
281  *
282  *******************************************************************************
283  *
284  * @param[in] enums
285  * Enums needed for the solve.
286  *
287  * @param[in] datacode
288  * The SolverMatrix structure from PaStiX.
289  *
290  * @param[in] cblk
291  * The cblk structure to which block belongs to. The A and B pointers
292  * must be the coeftab of this column block.
293  * Next column blok must be accessible through cblk[1].
294  *
295  * @param[inout] rhsb
296  * The pointer to the rhs data structure that holds the vectors of the
297  * right hand side.
298  *
299  *******************************************************************************/
300 void
302  SolverMatrix *datacode,
303  const SolverCblk *cblk,
304  pastix_rhs_t rhsb )
305 {
306  SolverCblk *fcbk;
307  const SolverBlok *blok;
308  pastix_trans_t tA;
310  const void *dataA = NULL;
311  const pastix_lrblock_t *lrA;
312  const float *A;
313  float *B, *C;
314  pastix_int_t ldb, ldc;
315  pastix_side_t side = enums->side;
316  pastix_uplo_t uplo = enums->uplo;
317  pastix_trans_t trans = enums->trans;
318  pastix_diag_t diag = enums->diag;
319  pastix_solv_mode_t mode = enums->mode;
320 
321  if ( (side == PastixRight) && (uplo == PastixUpper) && (trans == PastixNoTrans) ) {
322  /* We store U^t, so we swap uplo and trans */
323  tA = PastixTrans;
324  cs = PastixUCoef;
325 
326  /* Right is not handled yet */
327  assert( 0 );
328  }
329  else if ( (side == PastixRight) && (uplo == PastixLower) && (trans != PastixNoTrans) ) {
330  tA = trans;
331  cs = PastixLCoef;
332 
333  /* Right is not handled yet */
334  assert( 0 );
335  }
336  else if ( (side == PastixLeft) && (uplo == PastixUpper) && (trans != PastixNoTrans) ) {
337  /* We store U^t, so we swap uplo and trans */
338  tA = PastixNoTrans;
339  cs = PastixUCoef;
340 
341  /* We do not handle conjtrans in real as we store U^t */
342 #if defined(PRECISION_z) || defined(PRECISION_c)
343  assert( trans != PastixTrans );
344 #endif
345  }
346  else if ( (side == PastixLeft) && (uplo == PastixLower) && (trans == PastixNoTrans) ) {
347  tA = trans;
348  cs = PastixLCoef;
349  }
350  else {
351  /* This correspond to case treated in backward trsm */
352  assert(0);
353  return;
354  }
355 
356  assert( !( cblk->cblktype & (CBLK_FANIN|CBLK_RECV) ) );
357 
358  if ( (cblk->cblktype & CBLK_IN_SCHUR) && (mode != PastixSolvModeSchur) ) {
359  return;
360  }
361 
362  B = rhsb->b;
363  B = B + cblk->lcolidx;
364  ldb = rhsb->ld;
365 
366  /* Solve the diagonal block */
368  tA, diag, cblk, rhsb->n,
369  cblk_getdata( cblk, cs ),
370  B, ldb );
371 
372  /* Apply the update */
373  for (blok = cblk[0].fblokptr+1; blok < cblk[1].fblokptr; blok++ ) {
374  fcbk = datacode->cblktab + blok->fcblknm;
375 
376  if ( (fcbk->cblktype & CBLK_IN_SCHUR) && (mode == PastixSolvModeLocal) ) {
377  return;
378  }
379  assert( !(fcbk->cblktype & CBLK_RECV) );
380 
381  /*
382  * Make sure we get the correct pointer to the lrA, or to the right position in [lu]coeftab
383  */
384  dataA = cblk_getdata( cblk, cs );
385  if ( cblk->cblktype & CBLK_COMPRESSED ) {
386  lrA = dataA;
387  lrA += (blok - cblk->fblokptr);
388  dataA = lrA;
389  }
390  else {
391  A = dataA;
392  A += blok->coefind;
393  dataA = A;
394  }
395 
396  /*
397  * Make sure we get the correct pointer for the C matrix.
398  */
399  if ( fcbk->cblktype & CBLK_FANIN ) {
400  C = rhsb->cblkb[ - fcbk->bcscnum - 1 ];
401  ldc = cblk_colnbr( fcbk );
402  if ( C == NULL ) {
403  C = calloc( ldc * rhsb->n, sizeof( float ) );
404  if ( !pastix_atomic_cas_xxb( &(rhsb->cblkb[ - fcbk->bcscnum - 1 ]),
405  (uint64_t)NULL, (uint64_t)C, sizeof(void*) ) )
406  {
407  free( C );
408  C = rhsb->cblkb[ - fcbk->bcscnum - 1 ];
409  }
410  }
411  }
412  else {
413  C = rhsb->b;
414  C = C + fcbk->lcolidx;
415  ldc = rhsb->ld;
416  }
417 
418  solve_blok_sgemm( PastixLeft, tA, rhsb->n,
419  cblk, blok, fcbk,
420  dataA, B, ldb, C, ldc );
421  cpucblk_srelease_rhs_fwd_deps( enums, datacode,
422  rhsb, cblk, fcbk );
423  }
424 }
425 
426 /**
427  *******************************************************************************
428  *
429  * @brief Apply a backward solve related to one cblk to all the right hand side.
430  *
431  *******************************************************************************
432  *
433  * @param[in] enums
434  * Enums needed for the solve.
435  *
436  * @param[in] datacode
437  * The SolverMatrix structure from PaStiX.
438  *
439  * @param[in] cblk
440  * The cblk structure to which block belongs to. The A and B pointers
441  * must be the coeftab of this column block.
442  * Next column blok must be accessible through cblk[1].
443  *
444  * @param[inout] rhsb
445  * The pointer to the rhs data structure that holds the vectors of the
446  * right hand side.
447  *
448  *******************************************************************************/
449 void
451  SolverMatrix *datacode,
452  SolverCblk *cblk,
453  pastix_rhs_t rhsb )
454 {
455  SolverCblk *fcbk;
456  const SolverBlok *blok;
457  pastix_int_t j;
458  pastix_trans_t tA;
460  const void *dataA = NULL;
461  const pastix_lrblock_t *lrA;
462  const float *A;
463  float *B, *C;
464  pastix_int_t ldb, ldc;
465  pastix_side_t side = enums->side;
466  pastix_uplo_t uplo = enums->uplo;
467  pastix_trans_t trans = enums->trans;
468  pastix_diag_t diag = enums->diag;
469  pastix_solv_mode_t mode = enums->mode;
470 
471  /*
472  * Left / Upper / NoTrans (Backward)
473  */
474  if ( (side == PastixLeft) && (uplo == PastixUpper) && (trans == PastixNoTrans) ) {
475  /* We store U^t, so we swap uplo and trans */
476  tA = PastixTrans;
477  cs = PastixUCoef;
478  }
479  else if ( (side == PastixLeft) && (uplo == PastixLower) && (trans != PastixNoTrans) ) {
480  tA = trans;
481  cs = PastixLCoef;
482  }
483  else if ( (side == PastixRight) && (uplo == PastixUpper) && (trans != PastixNoTrans) ) {
484  /* We store U^t, so we swap uplo and trans */
485  tA = PastixNoTrans;
486  cs = PastixUCoef;
487 
488  /* Right is not handled yet */
489  assert( 0 );
490 
491  /* We do not handle conjtrans in real as we store U^t */
492  assert( trans != PastixTrans );
493  }
494  else if ( (side == PastixRight) && (uplo == PastixLower) && (trans == PastixNoTrans) ) {
495  tA = trans;
496  cs = PastixLCoef;
497 
498  /* Right is not handled yet */
499  assert( 0 );
500  }
501  else {
502  /* This correspond to case treated in forward trsm */
503  assert(0);
504  return;
505  }
506 
507  /*
508  * If cblk is in the schur complement, all brow blocks are in
509  * the interface. Thus, it doesn't generate any update in local
510  * mode, and we know that we are at least in interface mode
511  * after this test.
512  */
513  if ( (cblk->cblktype & CBLK_IN_SCHUR) && (mode == PastixSolvModeLocal) ) {
514  for (j = cblk[0].brownum; j < cblk[1].brownum; j++ ) {
515  blok = datacode->bloktab + datacode->browtab[j];
516  fcbk = datacode->cblktab + blok->lcblknm;
517 
518  if ( fcbk->cblktype & CBLK_IN_SCHUR ) {
519  break;
520  }
521  cpucblk_srelease_rhs_bwd_deps( enums, datacode,
522  rhsb, cblk, fcbk );
523  }
524  return;
525  }
526 
527  /*
528  * Make sure we get the correct pointer for the B matrix.
529  */
530  assert( !(cblk->cblktype & CBLK_RECV) );
531  if ( cblk->cblktype & CBLK_FANIN ) {
532  B = rhsb->cblkb[ - cblk->bcscnum - 1 ];
533  ldb = cblk_colnbr( cblk );
534  }
535  else {
536  B = rhsb->b;
537  B = B + cblk->lcolidx;
538  ldb = rhsb->ld;
539  }
540 
541  if ( !(cblk->cblktype & (CBLK_FANIN|CBLK_RECV) ) &&
542  (!(cblk->cblktype & CBLK_IN_SCHUR) || (mode == PastixSolvModeSchur)) )
543  {
544  /* Solve the diagonal block */
545  solve_blok_strsm( side, PastixLower, tA, diag,
546  cblk, rhsb->n,
547  cblk_getdata( cblk, cs ),
548  B, ldb );
549 
550  }
551 
552  /* Apply the update */
553  for (j = cblk[1].brownum-1; j>=cblk[0].brownum; j-- ) {
554  blok = datacode->bloktab + datacode->browtab[j];
555  fcbk = datacode->cblktab + blok->lcblknm;
556 
557  if ( (fcbk->cblktype & CBLK_IN_SCHUR) && (mode == PastixSolvModeInterface) ) {
558  continue;
559  }
560 
561  if ( fcbk->cblktype & CBLK_RECV ) {
562 #if defined( PASTIX_WITH_MPI )
563  if ( datacode->reqtab != NULL ) {
564  cpucblk_sisend_rhs_bwd( datacode, rhsb, fcbk );
565  }
566 #endif
567  continue;
568  }
569  assert( !(fcbk->cblktype & CBLK_FANIN) );
570 
571  /*
572  * Make sure we get the correct pointer to the lrA, or to the right position in [lu]coeftab
573  */
574  dataA = cblk_getdata( fcbk, cs );
575  if ( fcbk->cblktype & CBLK_COMPRESSED ) {
576  lrA = dataA;
577  lrA += (blok - fcbk->fblokptr);
578  dataA = lrA;
579  }
580  else {
581  A = dataA;
582  A += blok->coefind;
583  dataA = A;
584  }
585 
586  /*
587  * Make sure we get the correct pointer for the C matrix.
588  */
589  C = rhsb->b;
590  C = C + fcbk->lcolidx;
591  ldc = rhsb->ld;
592 
593  solve_blok_sgemm( PastixRight, tA, rhsb->n,
594  cblk, blok, fcbk,
595  dataA, B, ldb, C, ldc );
596  cpucblk_srelease_rhs_bwd_deps( enums, datacode,
597  rhsb, cblk, fcbk );
598  }
599 
600  if ( cblk->cblktype & CBLK_FANIN ) {
601  memFree_null( rhsb->cblkb[ - cblk->bcscnum - 1 ] );
602  }
603 }
604 
605 /**
606  *******************************************************************************
607  *
608  * @brief Apply the diagonal solve related to one cblk to all the right hand side.
609  *
610  *******************************************************************************
611  *
612  * @param[in] cblk
613  * The cblk structure to which diagonal block belongs to.
614  *
615  * @param[in] nrhs
616  * The number of right hand side
617  *
618  * @param[inout] b
619  * The pointer to vectors of the right hand side
620  *
621  * @param[in] ldb
622  * The leading dimension of b
623  *
624  * @param[inout] work
625  * Workspace to temporarily store the diagonal when multiple RHS are
626  * involved. Might be set to NULL for internal allocation on need.
627  *
628  *******************************************************************************/
629 void
631  int nrhs,
632  float *b,
633  int ldb,
634  float *work )
635 {
636  float *A, *tmp;
637  pastix_int_t k, j, tempn, lda;
638 
639  tempn = cblk->lcolnum - cblk->fcolnum + 1;
640  lda = (cblk->cblktype & CBLK_LAYOUT_2D) ? tempn : cblk->stride;
641  assert( blok_rownbr( cblk->fblokptr ) == tempn );
642 
643  if ( cblk->cblktype & CBLK_COMPRESSED ) {
644  A = (float*)(cblk->fblokptr->LRblock[0]->u);
645  assert( cblk->fblokptr->LRblock[0]->rkmax == lda );
646  }
647  else {
648  A = (float*)(cblk->lcoeftab);
649  }
650 
651  /* Add shift for diagonal elements */
652  lda++;
653 
654  if( nrhs == 1 ) {
655  for (j=0; j<tempn; j++, b++, A+=lda) {
656  *b = (*b) / (*A);
657  }
658  }
659  else {
660  /* Copy the diagonal to a temporary buffer */
661  tmp = work;
662  if ( work == NULL ) {
663  MALLOC_INTERN( tmp, tempn, float );
664  }
665  cblas_scopy( tempn, A, lda, tmp, 1 );
666 
667  /* Compute */
668  for (k=0; k<nrhs; k++, b+=ldb)
669  {
670  for (j=0; j<tempn; j++) {
671  b[j] /= tmp[j];
672  }
673  }
674 
675  if ( work == NULL ) {
676  memFree_null(tmp);
677  }
678  }
679 }
void cpucblk_srelease_rhs_bwd_deps(const args_solve_t *enums, SolverMatrix *solvmtx, pastix_rhs_t rhsb, const SolverCblk *cblk, SolverCblk *fcbk)
Release the dependencies of the given cblk after an update.
void cpucblk_srelease_rhs_fwd_deps(const args_solve_t *enums, SolverMatrix *solvmtx, pastix_rhs_t rhsb, const SolverCblk *cblk, SolverCblk *fcbk)
Release the dependencies of the given cblk after an update.
The block low-rank structure to hold a matrix in low-rank form.
void solve_blok_strsm(pastix_side_t side, pastix_uplo_t uplo, pastix_trans_t trans, pastix_diag_t diag, const SolverCblk *cblk, int nrhs, const void *dataA, float *b, int ldb)
Apply a solve trsm update related to a diagonal block of the matrix A.
Definition: solve_strsmsp.c:75
void solve_cblk_strsmsp_backward(const args_solve_t *enums, SolverMatrix *datacode, SolverCblk *cblk, pastix_rhs_t rhsb)
Apply a backward solve related to one cblk to all the right hand side.
void solve_cblk_strsmsp_forward(const args_solve_t *enums, SolverMatrix *datacode, const SolverCblk *cblk, pastix_rhs_t rhsb)
Apply a forward solve related to one cblk to all the right hand side.
void solve_blok_sgemm(pastix_side_t side, pastix_trans_t trans, pastix_int_t nrhs, const SolverCblk *cblk, const SolverBlok *blok, SolverCblk *fcbk, const void *dataA, const float *B, pastix_int_t ldb, float *C, pastix_int_t ldc)
Apply a solve gemm update related to a single block of the matrix A.
void solve_cblk_sdiag(const SolverCblk *cblk, int nrhs, float *b, int ldb, float *work)
Apply the diagonal solve related to one cblk to all the right hand side.
enum pastix_diag_e pastix_diag_t
Diagonal.
enum pastix_solv_mode_e pastix_solv_mode_t
Solve Schur modes.
enum pastix_uplo_e pastix_uplo_t
Upper/Lower part.
enum pastix_side_e pastix_side_t
Side of the operation.
enum pastix_trans_e pastix_trans_t
Transpostion.
enum pastix_coefside_e pastix_coefside_t
Data blocks used in the kernel.
@ PastixLCoef
Definition: api.h:478
@ PastixUCoef
Definition: api.h:479
@ PastixUpper
Definition: api.h:466
@ PastixLower
Definition: api.h:467
@ PastixRight
Definition: api.h:496
@ PastixLeft
Definition: api.h:495
@ PastixNoTrans
Definition: api.h:447
@ PastixTrans
Definition: api.h:448
static pastix_int_t blok_rownbr(const SolverBlok *blok)
Compute the number of rows of a block.
Definition: solver.h:389
pastix_int_t brownum
Definition: solver.h:166
static pastix_int_t cblk_colnbr(const SolverCblk *cblk)
Compute the number of columns in a column block.
Definition: solver.h:323
pastix_int_t fcblknm
Definition: solver.h:140
pastix_int_t frownum
Definition: solver.h:142
static void * cblk_getdata(const SolverCblk *cblk, pastix_coefside_t side)
Get the pointer to the data associated to the side part of the cblk.
Definition: solver.h:363
pastix_int_t coefind
Definition: solver.h:144
SolverBlok * fblokptr
Definition: solver.h:163
pastix_lrblock_t * LRblock[2]
Definition: solver.h:150
pastix_int_t lcblknm
Definition: solver.h:139
pastix_int_t lcolidx
Definition: solver.h:165
pastix_int_t bcscnum
Definition: solver.h:170
pastix_int_t stride
Definition: solver.h:164
int8_t cblktype
Definition: solver.h:159
pastix_int_t lcolnum
Definition: solver.h:162
void * lcoeftab
Definition: solver.h:171
pastix_int_t fcolnum
Definition: solver.h:161
Arguments for the solve.
Definition: solver.h:85
Solver block structure.
Definition: solver.h:137
Solver column block structure.
Definition: solver.h:156