PaStiX Handbook  6.3.0
cpucblk_sinit.c
Go to the documentation of this file.
1 /**
2  *
3  * @file cpucblk_sinit.c
4  *
5  * Precision dependent coeficient array initialization routines.
6  *
7  * @copyright 2015-2023 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
8  * Univ. Bordeaux. All rights reserved.
9  *
10  * @version 6.3.0
11  * @author Xavier Lacoste
12  * @author Pierre Ramet
13  * @author Mathieu Faverge
14  * @author Esragul Korkmaz
15  * @author Tony Delarue
16  * @date 2022-08-24
17  *
18  * @generated from /builds/solverstack/pastix/kernels/cpucblk_zinit.c, normal z -> s, Thu Jun 8 12:22:43 2023
19  *
20  **/
21 #include "common/common.h"
22 #include "blend/solver.h"
23 #include "bcsc/bcsc.h"
24 #include "pastix_scores.h"
25 #include "pastix_slrcores.h"
26 
27 /**
28  *******************************************************************************
29  *
30  * @brief Initialize a lrblock structure from a workspace from a specific block to the end of all
31  * blocks.
32  *
33  * The lrblock structure must be allocated before.
34  *
35  *******************************************************************************
36  *
37  * @param[inout] cblk
38  * The column block associated to the initialization.
39  *
40  * @param[in] blok
41  * The block representation associated to the initialization.
42  *
43  * @param[in] lrblok
44  * The structure blok to initialize. Must be allocated before.
45  *
46  * @param[in] ws
47  * The workspace associated with the data that will be used for initialize lrblok.
48  *
49  *******************************************************************************/
50 void
52  const SolverBlok *blok,
53  pastix_lrblock_t *lrblok,
54  float *ws )
55 {
56  SolverBlok *lblok = cblk[1].fblokptr;
57  pastix_int_t fcblknm = blok->fcblknm;
58  pastix_int_t ncols = cblk_colnbr( cblk );
59 
60  /* H then split */
61  assert( cblk->cblktype & CBLK_LAYOUT_2D );
62  assert( lrblok != NULL );
63 
64  for (; (blok < lblok) && (blok->fcblknm == fcblknm); blok++, lrblok++)
65  {
66  pastix_int_t nrows = blok_rownbr( blok );
67  lrblok->rk = -1;
68  lrblok->rkmax = nrows;
69  lrblok->u = ws;
70  lrblok->v = NULL;
71 
72  ws += nrows * ncols;
73  }
74 }
75 
76 /**
77  *******************************************************************************
78  *
79  * @brief Initialize lrblock structure from a workspace from all blocks of the cblk associated.
80  *
81  * The lrblock structure must be allocated before.
82  *
83  *******************************************************************************
84  *
85  * @param[inout] cblk
86  * The column block associated to the initialization.
87  *
88  * @param[in] lrblok
89  * The structure blok to initialize. Must be allocated before.
90  *
91  * @param[in] ws
92  * The workspace associated with the data that will be used for initialize lrblok.
93  *
94  *******************************************************************************/
95 void
97  pastix_lrblock_t *lrblok,
98  float *ws )
99 {
100  pastix_int_t ncols = cblk_colnbr( cblk );
101  const SolverBlok *blok = cblk[0].fblokptr;
102  const SolverBlok *lblok = cblk[1].fblokptr;
103 
104  /* H then split */
105  assert( cblk->cblktype & CBLK_LAYOUT_2D );
106  assert( lrblok != NULL );
107 
108  for (; blok<lblok; blok++, lrblok++)
109  {
110  pastix_int_t nrows = blok_rownbr( blok );
111  lrblok->rk = -1;
112  lrblok->rkmax = nrows;
113  lrblok->u = ws;
114  lrblok->v = NULL;
115 
116  ws += nrows * ncols;
117  }
118 }
119 
120 /**
121  *******************************************************************************
122  *
123  * @brief Allocate the cblk structure to store the coefficient
124  *
125  * When stored in low-rank format, the data pointer in the low-rank structure of
126  * each block must be initialized.
127  * This routines performs only the allocation and is thread-safe if called in
128  * parallel on the Lower and upper part.
129  *
130  *******************************************************************************
131  *
132  * @param[in] side
133  * Define which side of the matrix must be initialized.
134  * @arg PastixLCoef if lower part only
135  * @arg PastixUCoef if upper part only
136  * @arg PastixLUCoef if both sides.
137  *
138  * @param[inout] cblk
139  * The column block to allocate.
140  *
141  * @param[in] rkmax
142  * TODO
143  *
144  *******************************************************************************/
145 void
147  SolverCblk *cblk,
148  int rkmax )
149 {
150  pastix_int_t ncols = cblk_colnbr( cblk );
151  pastix_lrblock_t *LRblocks = NULL;
152  SolverBlok *blok = cblk[0].fblokptr;
153  SolverBlok *lblok = cblk[1].fblokptr;
154  size_t size = lblok - blok;
155 
156  /* H then split */
157  assert( cblk->cblktype & CBLK_LAYOUT_2D );
158 
159  LRblocks = blok->LRblock[0];
160 
161  if ( LRblocks == NULL ) {
162  /* One allocation per cblk */
163  LRblocks = malloc( 2 * size * sizeof(pastix_lrblock_t) );
164  memset( LRblocks, 0, 2 * size * sizeof(pastix_lrblock_t) );
165  if (!pastix_atomic_cas_xxb( &(blok->LRblock[0]), (uint64_t)NULL, (uint64_t)LRblocks, sizeof(void*) )) {
166  free( LRblocks );
167  LRblocks = blok->LRblock[0];
168  }
169  }
170  assert( LRblocks != NULL );
171 
172  for (; blok<lblok; blok++)
173  {
174  pastix_int_t nrows = blok_rownbr( blok );
175  blok->LRblock[0] = LRblocks;
176  blok->LRblock[1] = LRblocks + size;
177 
178  if ( side != PastixUCoef ) {
179  core_slralloc( nrows, ncols, rkmax, blok->LRblock[0] );
180  }
181 
182  if ( side != PastixLCoef ) {
183  core_slralloc( nrows, ncols, rkmax, blok->LRblock[1] );
184  }
185  LRblocks++;
186  }
187 
188  /* Backup the fact that the cblk has been initialized */
189  if ( side != PastixUCoef ) {
190  cblk->lcoeftab = (void*)-1;
191  }
192  if ( side != PastixLCoef ) {
193  cblk->ucoeftab = (void*)-1;
194  }
195 }
196 
197 /**
198  *******************************************************************************
199  *
200  * @brief Allocate the cblk structure to store the coefficient
201  *
202  * When stored in low-rank format, the data pointer in the low-rank structure of
203  * each block must be initialized.
204  * This routines performs only the allocation and is thread-safe if called in
205  * parallel on the Lower and upper part.
206  *
207  *******************************************************************************
208  *
209  * @param[in] side
210  * Define which side of the matrix must be initialized.
211  * @arg PastixLCoef if lower part only
212  * @arg PastixUCoef if upper part only
213  * @arg PastixLUCoef if both sides.
214  *
215  * @param[inout] cblk
216  * The column block to allocate.
217  *
218  *******************************************************************************/
219 void
221  SolverCblk *cblk )
222 {
223  size_t ncols = cblk_colnbr( cblk );
224  size_t coefnbr = cblk->stride * ncols;
225 
226  if ( side == PastixLCoef ) {
227  assert( cblk->lcoeftab == NULL );
228  MALLOC_INTERN( cblk->lcoeftab, coefnbr, float );
229  memset( cblk->lcoeftab, 0, coefnbr * sizeof(float) );
230  }
231  else {
232  assert( cblk->lcoeftab == NULL );
233  assert( cblk->ucoeftab == NULL );
234 
235  MALLOC_INTERN( cblk->lcoeftab, 2 * coefnbr, float );
236  memset( cblk->lcoeftab, 0, 2 * coefnbr * sizeof(float) );
237 
238  cblk->ucoeftab = (float *)cblk->lcoeftab + coefnbr;
239  assert( cblk->ucoeftab );
240  }
241  assert( cblk->lcoeftab );
242 }
243 
244 /**
245  *******************************************************************************
246  *
247  * @brief Allocate the cblk structure to store the coefficient
248  *
249  * When stored in low-rank format, the data pointer in the low-rank structure of
250  * each block must be initialized.
251  * This routines performs only the allocation and is thread-safe if called in
252  * parallel on the Lower and upper part.
253  *
254  *******************************************************************************
255  *
256  * @param[in] side
257  * Define which side of the matrix must be initialized.
258  * @arg PastixLCoef if lower part only
259  * @arg PastixUCoef if upper part only
260  * @arg PastixLUCoef if both sides.
261  *
262  * @param[inout] cblk
263  * The column block to allocate.
264  *
265  *******************************************************************************/
266 void
268  SolverCblk *cblk )
269 {
270  /* Make sure they have the correct values */
271  assert( PastixLCoef == 0 );
272  assert( PastixUCoef == 1 );
273 
274  pastix_cblk_lock( cblk );
275 
276  /* Shift to play with bitmasks */
277  side += 1;
278  if ( cblk->lcoeftab != NULL ) {
279  side &= ( ~(PastixLCoef+1) );
280  }
281  if ( cblk->ucoeftab != NULL ) {
282  side &= ( ~(PastixUCoef+1) );
283  }
284  if ( !side ) {
285  pastix_cblk_unlock( cblk );
286  return;
287  }
288  side -= 1;
289 
290  if ( cblk->cblktype & CBLK_COMPRESSED ) {
291  cpucblk_salloc_lr( side, cblk, cblk->cblktype & CBLK_FANIN ? 0 : -1 );
292  }
293  else {
294  cpucblk_salloc_fr( side, cblk );
295  }
296  pastix_cblk_unlock( cblk );
297 }
298 
299 /**
300  *******************************************************************************
301  *
302  * @brief Free the cblk structure that store the coefficient
303  *
304  * This routines performs the free and is thread-safe if called in
305  * parallel on the Lower and upper part.
306  *
307  *******************************************************************************
308  *
309  * @param[in] side
310  * Define which side of the matrix must be initialized.
311  * @arg PastixLCoef if lower part only
312  * @arg PastixUCoef if upper part only
313  * @arg PastixLUCoef if both sides.
314  *
315  * @param[inout] cblk
316  * The column block to free.
317  *
318  *******************************************************************************/
319 void
321  SolverCblk *cblk )
322 {
323  pastix_cblk_lock( cblk );
324  if ( (side != PastixUCoef) && (cblk->lcoeftab != NULL) ) {
325 
326  if ( cblk->cblktype & CBLK_COMPRESSED ) {
327  SolverBlok *blok = cblk[0].fblokptr;
328  SolverBlok *lblok = cblk[1].fblokptr;
329 
330  assert( blok->LRblock[0] != NULL );
331  for (; blok<lblok; blok++) {
332  core_slrfree(blok->LRblock[0]);
333  }
334 
335  if ( cblk->lcoeftab != (void*)-1 ) {
336  memFree_null( cblk->lcoeftab );
337  }
338  }
339  else {
340  memFree_null( cblk->lcoeftab );
341  }
342  cblk->lcoeftab = NULL;
343  }
344  if ( (side != PastixLCoef) && (cblk->ucoeftab != NULL) ) {
345 
346  if ( cblk->cblktype & CBLK_COMPRESSED ) {
347  SolverBlok *blok = cblk[0].fblokptr;
348  SolverBlok *lblok = cblk[1].fblokptr;
349 
350  assert( blok->LRblock[1] != NULL );
351  for (; blok<lblok; blok++) {
352  core_slrfree(blok->LRblock[1]);
353  }
354  }
355  cblk->ucoeftab = NULL;
356  }
357  if ( (cblk->cblktype & CBLK_COMPRESSED) &&
358  (cblk->lcoeftab == NULL) &&
359  (cblk->ucoeftab == NULL) )
360  {
361  free( cblk->fblokptr->LRblock[0] );
362  cblk->fblokptr->LRblock[0] = NULL;
363  cblk->fblokptr->LRblock[1] = NULL;
364  }
365  pastix_cblk_unlock( cblk );
366 }
367 
368 /**
369  *******************************************************************************
370  *
371  * @brief Initialize the full-rank coeftab structure from the internat bcsc.
372  *
373  *******************************************************************************
374  *
375  * @param[in] side
376  * Define which side of the matrix must be initialized.
377  * @arg PastixLCoef if lower part only
378  * @arg PastixUCoef if upper part only
379  * @arg PastixLUCoef if both sides.
380  *
381  * @param[in] solvmtx
382  * PaStiX structure to store numerical data and flags
383  *
384  * @param[in] bcsc
385  * The internal bcsc structure that hold the graph with permutation
386  * stored by cblk.
387  *
388  * @param[in] itercblk
389  * The index of the cblk to fill in both bcsc and solvmtx structures.
390  *
391  *******************************************************************************/
392 static inline void
394  const SolverMatrix *solvmtx,
395  const pastix_bcsc_t *bcsc,
396  pastix_int_t itercblk )
397 {
398  SolverCblk *solvcblk = solvmtx->cblktab + itercblk;
399  const bcsc_cblk_t *csccblk = bcsc->cscftab + solvcblk->bcscnum;
400  SolverBlok *solvblok;
401  SolverBlok *lsolvblok = (solvcblk+1)->fblokptr;
402  float *lcoeftab = solvcblk->lcoeftab;
403  float *ucoeftab = solvcblk->ucoeftab;
404  float *Lvalues = bcsc->Lvalues;
405  float *Uvalues = bcsc->Uvalues;
406  pastix_int_t ldd = solvcblk->stride;
407  pastix_int_t itercoltab, iterval, coefindx;
408  int is2d = solvcblk->cblktype & CBLK_LAYOUT_2D;
409 
410  assert( (side != PastixUCoef) || (ucoeftab != NULL) );
411 
412  for (itercoltab=0; itercoltab<csccblk->colnbr; itercoltab++)
413  {
414  pastix_int_t frow = csccblk->coltab[itercoltab];
415  pastix_int_t lrow = csccblk->coltab[itercoltab+1];
416  solvblok = solvcblk->fblokptr;
417  if ( is2d ) {
418  ldd = blok_rownbr( solvblok );
419  }
420 
421  for (iterval=frow; iterval<lrow; iterval++)
422  {
423  pastix_int_t rownum = bcsc->rowtab[iterval];
424 #if !defined(NDEBUG) && defined(PASTIX_DEBUG_DUMP_COEFTAB)
425  if ( isnan( (float)Lvalues[iterval] ) || isinf( (float)Lvalues[iterval] ) ) {
426  printf( "cpucblk_sfillin_fr: Lvalues not initialised correctly.\n" );
427  assert( 0 );
428  }
429  if ( isnan( (float)Uvalues[iterval] ) || isinf( (float)Uvalues[iterval] ) ) {
430  printf( "cpucblk_sfillin_fr: Uvalues not initialised correctly.\n" );
431  assert( 0 );
432  }
433 #endif
434  /* If values in the lower part of the matrix */
435  if (rownum >= (solvcblk->fcolnum+itercoltab))
436  {
437  while ((solvblok < lsolvblok) &&
438  ((solvblok->lrownum < rownum) ||
439  (solvblok->frownum > rownum)))
440  {
441  solvblok++;
442  if ( is2d ) {
443  ldd = blok_rownbr( solvblok );
444  }
445  }
446 
447  if ( solvblok < lsolvblok )
448  {
449  coefindx = solvblok->coefind;
450  coefindx += rownum - solvblok->frownum; /* Row shift */
451  coefindx += itercoltab * ldd; /* Column shift */
452  pastix_cblk_lock( solvcblk );
453  solvblok->iluklvl = 0;
454  pastix_cblk_unlock( solvcblk );
455 
456  if ( side != PastixUCoef ) {
457  lcoeftab[coefindx] = Lvalues[iterval];
458  }
459 
460  if ( (side != PastixLCoef) &&
461  (rownum > (solvcblk->fcolnum + itercoltab)) )
462  {
463 #if defined(PRECISION_z) || defined(PRECISION_c)
464  if (bcsc->mtxtype == PastixSymmetric) {
465  ucoeftab[coefindx] = (Uvalues[iterval]);
466  }
467  else
468 #endif
469  {
470  ucoeftab[coefindx] = Uvalues[iterval];
471  }
472  }
473  }
474  else {
475 #if defined(PASTIX_DEBUG_COEFTAB)
476  fprintf(stderr, "cpucblk_sfillin: drop coeff from CSC c=%ld(%ld) l=%ld(%ld) cblk=%ld fcol=%ld lcol=%ld\n",
477  (long)solvcblk->fcolnum + itercoltab, (long)itercoltab,
478  (long)rownum, (long)iterval, (long)itercblk,
479  (long)solvcblk->fcolnum, (long)solvcblk->lcolnum );
480 #endif
481  }
482  }
483  }
484  }
485 }
486 
487 /**
488  *******************************************************************************
489  *
490  * @brief Initialize the low-rank coeftab structure from the internal bcsc.
491  *
492  *******************************************************************************
493  *
494  * @param[in] side
495  * Define which side of the matrix must be initialized.
496  * @arg PastixLCoef if lower part only
497  * @arg PastixUCoef if upper part only
498  * @arg PastixLUCoef if both sides.
499  *
500  * @param[in] solvmtx
501  * PaStiX structure to store numerical data and flags
502  *
503  * @param[in] bcsc
504  * The internal bcsc structure that hold the graph with permutation
505  * stored by cblk.
506  *
507  * @param[in] itercblk
508  * The index of the cblk to fill in both bcsc and solvmtx structures.
509  *
510  *******************************************************************************/
511 static inline void
513  const SolverMatrix *solvmtx,
514  const pastix_bcsc_t *bcsc,
515  pastix_int_t itercblk )
516 {
517  SolverCblk *solvcblk = solvmtx->cblktab + itercblk;
518  const bcsc_cblk_t *csccblk = bcsc->cscftab + solvcblk->bcscnum;
519  SolverBlok *solvblok;
520  SolverBlok *lsolvblok = (solvcblk+1)->fblokptr;
521  float *lcoeftab, *ucoeftab;
522  float *Lvalues = bcsc->Lvalues;
523  float *Uvalues = bcsc->Uvalues;
524  pastix_int_t itercoltab, iterval, coefindx, ldd;
525 
526  assert( solvcblk->cblktype & CBLK_LAYOUT_2D );
527 
528  for (itercoltab=0; itercoltab<csccblk->colnbr; itercoltab++)
529  {
530  pastix_int_t frow = csccblk->coltab[itercoltab];
531  pastix_int_t lrow = csccblk->coltab[itercoltab+1];
532 
533  solvblok = solvcblk->fblokptr;
534  ldd = blok_rownbr( solvblok );
535  lcoeftab = (float*)(solvblok->LRblock[0]->u);
536  ucoeftab = (float*)(solvblok->LRblock[1]->u);
537 
538  for (iterval=frow; iterval<lrow; iterval++)
539  {
540  pastix_int_t rownum = bcsc->rowtab[iterval];
541 
542 #if !defined(NDEBUG)
543  if ( isnan( (float)Lvalues[iterval] ) || isinf( (float)Lvalues[iterval] ) ) {
544  printf( "cpucblk_sfillin_lr: Lvalues not initialised correctly.\n" );
545  assert( 0 );
546  }
547  if ( isnan( (float)Uvalues[iterval] ) || isinf( (float)Uvalues[iterval] ) ) {
548  printf( "cpucblk_sfillin_lr: Uvalues not initialised correctly.\n" );
549  assert( 0 );
550  }
551 #endif
552  /* If values in the lower part of the matrix */
553  if (rownum >= (solvcblk->fcolnum+itercoltab))
554  {
555  while ((solvblok < lsolvblok) &&
556  ((solvblok->lrownum < rownum) ||
557  (solvblok->frownum > rownum)))
558  {
559  solvblok++;
560  ldd = blok_rownbr( solvblok );
561  lcoeftab = (float*)(solvblok->LRblock[0]->u);
562  ucoeftab = (float*)(solvblok->LRblock[1]->u);
563  }
564 
565  if ( solvblok < lsolvblok )
566  {
567  coefindx = rownum - solvblok->frownum; /* Row shift */
568  coefindx += itercoltab * ldd; /* Column shift */
569  pastix_cblk_lock( solvcblk );
570  solvblok->iluklvl = 0;
571  pastix_cblk_unlock( solvcblk );
572 
573  if ( side != PastixUCoef ) {
574  lcoeftab[coefindx] = Lvalues[iterval];
575  }
576 
577  if ( (side != PastixLCoef) &&
578  (rownum > (solvcblk->fcolnum + itercoltab)) )
579  {
580 #if defined(PRECISION_z) || defined(PRECISION_c)
581  if (bcsc->mtxtype == PastixSymmetric)
582  ucoeftab[coefindx] = (Uvalues[iterval]);
583  else
584 #endif
585  ucoeftab[coefindx] = Uvalues[iterval];
586  }
587  }
588  else {
589 #if defined(PASTIX_DEBUG_COEFTAB)
590  fprintf(stderr, "cpucblk_sfillin: drop coeff from CSC c=%ld(%ld) l=%ld(%ld) cblk=%ld fcol=%ld lcol=%ld\n",
591  (long)solvcblk->fcolnum + itercoltab, (long)itercoltab,
592  (long)rownum, (long)iterval, (long)itercblk,
593  (long)solvcblk->fcolnum, (long)solvcblk->lcolnum );
594 #endif
595  }
596  }
597  }
598  }
599 }
600 
601 /**
602  *******************************************************************************
603  *
604  * @brief Initialize the coeftab structure from the internal bcsc.
605  *
606  *******************************************************************************
607  *
608  * @param[in] side
609  * Define which side of the matrix must be initialized.
610  * @arg PastixLCoef if lower part only
611  * @arg PastixUCoef if upper part only
612  * @arg PastixLUCoef if both sides.
613  *
614  * @param[in] solvmtx
615  * PaStiX structure to store numerical data and flags
616  *
617  * @param[in] bcsc
618  * The internal bcsc structure that hold the graph with permutation
619  * stored by cblk.
620  *
621  * @param[in] itercblk
622  * The index of the cblk to fill in both bcsc and solvmtx structures.
623  *
624  *******************************************************************************/
625 void
627  const SolverMatrix *solvmtx,
628  const pastix_bcsc_t *bcsc,
629  pastix_int_t itercblk )
630 {
631  if ( (solvmtx->cblktab + itercblk)->cblktype & CBLK_COMPRESSED ) {
632  cpucblk_sfillin_lr( side, solvmtx, bcsc, itercblk );
633  }
634  else {
635  cpucblk_sfillin_fr( side, solvmtx, bcsc, itercblk );
636  }
637 }
static void cpucblk_sfillin_lr(pastix_coefside_t side, const SolverMatrix *solvmtx, const pastix_bcsc_t *bcsc, pastix_int_t itercblk)
Initialize the low-rank coeftab structure from the internal bcsc.
static void cpucblk_sfillin_fr(pastix_coefside_t side, const SolverMatrix *solvmtx, const pastix_bcsc_t *bcsc, pastix_int_t itercblk)
Initialize the full-rank coeftab structure from the internat bcsc.
void cpublok_salloc_lrws(const SolverCblk *cblk, const SolverBlok *blok, pastix_lrblock_t *lrblok, float *ws)
Initialize a lrblock structure from a workspace from a specific block to the end of all blocks.
Definition: cpucblk_sinit.c:51
pastix_int_t colnbr
Definition: bcsc.h:111
pastix_int_t * coltab
Definition: bcsc.h:113
Compressed colptr format for the bcsc.
Definition: bcsc.h:110
void cpucblk_salloc_lr(pastix_coefside_t side, SolverCblk *cblk, int rkmax)
Allocate the cblk structure to store the coefficient.
void cpucblk_sfillin(pastix_coefside_t side, const SolverMatrix *solvmtx, const pastix_bcsc_t *bcsc, pastix_int_t itercblk)
Initialize the coeftab structure from the internal bcsc.
void cpucblk_salloc_lrws(const SolverCblk *cblk, pastix_lrblock_t *lrblok, float *ws)
Initialize lrblock structure from a workspace from all blocks of the cblk associated.
Definition: cpucblk_sinit.c:96
void cpucblk_salloc_fr(pastix_coefside_t side, SolverCblk *cblk)
Allocate the cblk structure to store the coefficient.
void cpucblk_salloc(pastix_coefside_t side, SolverCblk *cblk)
Allocate the cblk structure to store the coefficient.
void cpucblk_sfree(pastix_coefside_t side, SolverCblk *cblk)
Free the cblk structure that store the coefficient.
The block low-rank structure to hold a matrix in low-rank form.
void core_slralloc(pastix_int_t M, pastix_int_t N, pastix_int_t rkmax, pastix_lrblock_t *A)
Allocate a low-rank matrix.
Definition: core_sgelrops.c:56
void core_slrfree(pastix_lrblock_t *A)
Free a low-rank matrix.
#define PastixSymmetric
Definition: api.h:456
enum pastix_coefside_e pastix_coefside_t
Data blocks used in the kernel.
@ PastixLCoef
Definition: api.h:475
@ PastixUCoef
Definition: api.h:476
static pastix_int_t blok_rownbr(const SolverBlok *blok)
Compute the number of rows of a block.
Definition: solver.h:388
void * ucoeftab
Definition: solver.h:172
pastix_int_t lrownum
Definition: solver.h:143
static pastix_int_t cblk_colnbr(const SolverCblk *cblk)
Compute the number of columns in a column block.
Definition: solver.h:322
int iluklvl
Definition: solver.h:147
pastix_int_t fcblknm
Definition: solver.h:140
pastix_int_t frownum
Definition: solver.h:142
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 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
Solver block structure.
Definition: solver.h:137
Solver column block structure.
Definition: solver.h:156