PaStiX Handbook 6.4.0
Loading...
Searching...
No Matches
coeftab_s.c
Go to the documentation of this file.
1/**
2 *
3 * @file coeftab_s.c
4 *
5 * Precision dependent sequential routines to apply operation of the full matrix.
6 *
7 * @copyright 2015-2024 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
8 * Univ. Bordeaux. All rights reserved.
9 *
10 * @version 6.4.0
11 * @author Pierre Ramet
12 * @author Xavier Lacoste
13 * @author Gregoire Pichon
14 * @author Mathieu Faverge
15 * @author Esragul Korkmaz
16 * @author Tony Delarue
17 * @date 2024-07-05
18 *
19 * @generated from /builds/2mk6rsew/0/solverstack/pastix/sopalin/coeftab_z.c, normal z -> s, Tue Feb 25 14:36:05 2025
20 *
21 **/
22#ifndef DOXYGEN_SHOULD_SKIP_THIS
23#define _GNU_SOURCE 1
24#endif /* DOXYGEN_SHOULD_SKIP_THIS */
25#include "common.h"
26#include "blend/solver.h"
27#include "lapacke.h"
28#include "sopalin/coeftab_s.h"
29#include "pastix_scores.h"
30
31/**
32 *******************************************************************************
33 *
34 * @brief Dump the solver matrix coefficients into a file in human readable
35 * format.
36 *
37 * All non-zeroes coefficients are dumped in the format:
38 * i j val
39 * with one value per row.
40 *
41 *******************************************************************************
42 *
43 * @param[inout] pastix_data
44 * The pastix_data instance to access the unique directory id in which
45 * output the files.
46 *
47 * @param[in] solvmtx
48 * The solver matrix to print.
49 *
50 * @param[in] prefix
51 * The filename where to store the output matrix.
52 *
53 *******************************************************************************/
54void
56 const SolverMatrix *solvmtx,
57 const char *prefix )
58{
59 SolverCblk *cblk = solvmtx->cblktab;
60 pastix_int_t itercblk;
61 char filename[256];
62 FILE *stream = NULL;
63
64 pastix_gendirectories( pastix_data );
65
66 /*
67 * TODO: there is a problem right here for now, because there are no
68 * distinctions between L and U coeffcients in the final file
69 */
70 for (itercblk=0; itercblk<solvmtx->cblknbr; itercblk++, cblk++)
71 {
72 if ( cblk->cblktype & (CBLK_FANIN|CBLK_RECV) ) {
73 continue;
74 }
75 if ( solvmtx->clustnum != cblk->ownerid ) {
76 continue;
77 }
78
79 sprintf( filename, "%s_%ld.txt", prefix, (long)cblk->gcblknum );
80 stream = pastix_fopenw( pastix_data->dir_global, filename, "w" );
81 if ( stream == NULL ){
82 continue;
83 }
84
85 cpucblk_sdump( PastixLCoef, cblk, stream );
86 if ( NULL != cblk->ucoeftab ) {
87 cpucblk_sdump( PastixUCoef, cblk, stream );
88 }
89
90 fclose( stream );
91 }
92}
93
94/**
95 *******************************************************************************
96 *
97 * @brief Dump a single column block into a FILE in a human readale format.
98 *
99 * All non-zeroes coefficients are dumped in the format:
100 * i j val
101 * with one value per row.
102 *
103 * The filename is as follows : {L, U}cblk{Index of the cblk}_init.txt
104 *
105 *******************************************************************************
106 *
107 * @param[in] side
108 * Define which side of the matrix must be initialized.
109 * @arg PastixLCoef if lower part only
110 * @arg PastixUCoef if upper part only
111 * @arg PastixLUCoef if both sides.
112 *
113 * @param[in] cblk
114 * The column block to dump into the file.
115 *
116 * @param[in] itercblk
117 * The index of the cblk to dump
118 *
119 * @param[inout] directory
120 * The pointer to the temporary directory where to store the output
121 * files.
122 *
123 *******************************************************************************/
124void
126 SolverCblk *cblk,
127 pastix_int_t itercblk,
128 const char *directory )
129{
130 FILE *f = NULL;
131 char *filename;
132 int rc;
133
134 /* Lower part */
135 if ( side != PastixUCoef )
136 {
137 rc = asprintf( &filename, "Lcblk%05ld_init.txt", (long int) itercblk );
138 f = pastix_fopenw( directory, filename, "w" );
139 if ( f != NULL ) {
140 cpucblk_sdump( PastixLCoef, cblk, f );
141 fclose( f );
142 }
143 free( filename );
144 }
145
146 /* Upper part */
147 if ( side != PastixLCoef )
148 {
149 rc = asprintf( &filename, "Ucblk%05ld_init.txt", (long int) itercblk );
150 f = pastix_fopenw( directory, filename, "w" );
151 if ( f != NULL ) {
152 cpucblk_sdump( PastixUCoef, cblk, f );
153 fclose( f );
154 }
155 free( filename );
156 }
157 (void)rc;
158}
159
160/**
161 *******************************************************************************
162 *
163 * @brief Compare two solver matrices in full-rank format with the same data
164 * distribution.
165 *
166 * The second solver matrix is overwritten by the difference of the two
167 * matrices. The frobenius norm of the difference of each column block is
168 * computed and the functions returns 0 if the result for all the column blocks
169 * of:
170 * || B_k - A_k || / ( || A_k || * eps )
171 *
172 * is below 10. Otherwise, an error message is printed and 1 is returned.
173 *
174 *******************************************************************************
175 *
176 * @param[in] side
177 * Define which side of the cblk must be tested.
178 * @arg PastixLCoef if lower part only
179 * @arg PastixUCoef if upper part only
180 * @arg PastixLUCoef if both sides.
181 *
182 * @param[in] solvA
183 * The solver matrix A.
184 *
185 * @param[inout] solvB
186 * The solver matrix B.
187 * On exit, B coefficient arrays are overwritten by the result of
188 * (B-A).
189 *
190 *******************************************************************************
191 *
192 * @return 0 if the test is passed, >= 0 otherwise.
193 *
194 *******************************************************************************/
195int
197 const SolverMatrix *solvA,
198 SolverMatrix *solvB )
199{
200 SolverCblk *cblkA = solvA->cblktab;
201 SolverCblk *cblkB = solvB->cblktab;
202 pastix_int_t cblknum;
203 int rc = 0;
204 int saved_rc = 0;
205
206 for(cblknum=0; cblknum<solvA->cblknbr; cblknum++, cblkA++, cblkB++) {
207 rc += cpucblk_sdiff( side, cblkA, cblkB );
208 if ( rc != saved_rc ){
209 fprintf(stderr, "CBLK %ld was not correctly compressed\n", (long)cblknum);
210 saved_rc = rc;
211 }
212 }
213
214 return rc;
215}
216
217/**
218 *******************************************************************************
219 *
220 * @brief Compress all the cblks marked as valid for low-rank format.
221 *
222 * All the cblk in the top levels of the elimination tree marked as candidates
223 * for compression are compressed if there is a gain to compress them. The
224 * compression to low-rank format is parameterized by the input information
225 * stored in the lowrank structure. On exit, all the cblks marked for
226 * compression are stored through the low-rank structure, even if they are kept
227 * in their full-rank form.
228 *
229 * @remark This routine is sequential
230 *
231 *******************************************************************************
232 *
233 * @param[inout] solvmtx
234 * The solver matrix of the problem to compress.
235 *
236 *******************************************************************************
237 *
238 * @return The memory gain resulting from the compression to low-rank format in
239 * Bytes.
240 *
241 *******************************************************************************/
244{
245 SolverCblk *cblk = solvmtx->cblktab;
247 int ilu_lvl;
248 pastix_int_t cblknum, gain = 0;
249
250 ilu_lvl = solvmtx->lowrank.compress_preselect ? -1 : solvmtx->lowrank.ilu_lvl;
251
252 for(cblknum=0; cblknum<solvmtx->cblknbr; cblknum++, cblk++) {
253 if ( cblk->cblktype & CBLK_COMPRESSED ) {
254 gain += cpucblk_scompress( solvmtx, side, ilu_lvl, cblk );
255 }
256 }
257 return gain;
258}
259
260/**
261 *******************************************************************************
262 *
263 * @brief Uncompress all column block in low-rank format into full-rank format
264 *
265 *******************************************************************************
266 *
267 * @param[inout] solvmtx
268 * The solver matrix of the problem.
269 *
270 *******************************************************************************/
271void
273{
274 SolverCblk *cblk = solvmtx->cblktab;
275 pastix_int_t cblknum;
277
278 for(cblknum=0; cblknum<solvmtx->cblknbr; cblknum++, cblk++) {
279 if (cblk->cblktype & CBLK_COMPRESSED) {
280 cpucblk_suncompress( side, cblk );
281 }
282 }
283}
284
285/**
286 *******************************************************************************
287 *
288 * @brief Compute the memory gain of the low-rank form over the full-rank form
289 * for the entire matrix.
290 *
291 * This function returns the memory gain in bytes for the full matrix when
292 * column blocks are stored in low-rank format compared to a full rank storage.
293 *
294 *******************************************************************************
295 *
296 * @param[in] solvmtx
297 * The solver matrix of the problem.
298 *
299 * @param[in] iparm
300 * The integer parameter array
301 *
302 * @param[inout] dparm
303 * The float parameter array which is going to be updated.
304 *
305 *******************************************************************************/
306void
308 const pastix_int_t *iparm,
309 pastix_fixdbl_t *dparm )
310{
312 SolverCblk *cblk = solvmtx->cblktab;
313 const SolverBlok *blok;
314 pastix_int_t i, cblknum;
315 pastix_int_t gain[MEMORY_STATS_SIZE] = { 0 };
316 pastix_int_t orig[MEMORY_STATS_SIZE] = { 0 };
317 pastix_fixdbl_t memlr[MEMORY_STATS_SIZE] = { 0. };
318 pastix_fixdbl_t memfr[MEMORY_STATS_SIZE] = { 0. };
319 pastix_fixdbl_t totlr, totfr;
320
321#if defined(PASTIX_SUPERNODE_STATS)
322 pastix_int_t last[3] = { 0 };
323 pastix_fixdbl_t memlast[4];
324 const SolverBlok *solvblok = solvmtx->bloktab;
325
326 for(i=0; i<solvmtx->bloknbr; i++, solvblok++ ) {
327 const SolverCblk *lcblk = solvmtx->cblktab + solvblok->lcblknm;
328 pastix_int_t ncols = cblk_colnbr( lcblk );
329 pastix_int_t nrows = blok_rownbr( solvblok );
330 pastix_int_t size = ncols * nrows;
331
332 /* Skip remote data */
333 if ( cblk->ownerid != solvmtx->clustnum ) {
334 continue;
335 }
336
337 /* Let's skip recv and fanin for now */
338 if ( lcblk->cblktype & (CBLK_RECV|CBLK_FANIN) ) {
339 continue;
340 }
341
342 if ( !(lcblk->cblktype & CBLK_COMPRESSED) ) {
343 if ( side != PastixLCoef ) {
344 last[solvblok->inlast] += 2 * size;
345 }
346 else{
347 last[solvblok->inlast] += size;
348 }
349 }
350 else{
351 if ( side != PastixUCoef ) {
352 if ( solvblok->LRblock[0].rk >= 0 ) {
353 assert( solvblok->LRblock[0].rk <= core_get_rklimit( nrows, ncols ) );
354 assert( ((nrows+ncols) * solvblok->LRblock[0].rkmax) <= size );
355 last[solvblok->inlast] += ((nrows+ncols) * solvblok->LRblock[0].rkmax);
356 }
357 else {
358 last[solvblok->inlast] += size;
359 }
360 }
361
362 if ( side != PastixLCoef ) {
363 if ( solvblok->LRblock[1].rk >= 0 ) {
364 assert( solvblok->LRblock[1].rk <= core_get_rklimit( nrows, ncols ) );
365 assert( ((nrows+ncols) * solvblok->LRblock[1].rkmax) <= size );
366 last[solvblok->inlast] += ((nrows+ncols) * solvblok->LRblock[1].rkmax);
367 }
368 else {
369 last[solvblok->inlast] += size;
370 }
371 }
372 }
373 }
374 for (i=0; i<3; i++) {
375 memlast[i] = last[i] * pastix_size_of( PastixFloat );
376 }
377 memlast[3] = memlast[0] + memlast[1] + memlast[2];
378
379 pastix_print( solvmtx->clustnum, 0,
380 " Compression on LAST\n"
381 " ------------------------------------------------\n"
382 " A11 %8.3g %co\n"
383 " A12 %8.3g %co\n"
384 " A22 %8.3g %co\n"
385 " SUM %8.3g %co\n",
386 pastix_print_value(memlast[0]), pastix_print_unit(memlast[0]),
387 pastix_print_value(memlast[1]), pastix_print_unit(memlast[1]),
388 pastix_print_value(memlast[2]), pastix_print_unit(memlast[2]),
389 pastix_print_value(memlast[3]), pastix_print_unit(memlast[3]));
390#endif
391
392 for(cblknum=0; cblknum<solvmtx->cblknbr; cblknum++, cblk++) {
393 pastix_int_t colnbr = cblk_colnbr( cblk );
394
395 /* Skip remote data */
396 if ( cblk->ownerid != solvmtx->clustnum ) {
397 continue;
398 }
399
400 /* Let's skip recv and fanin for now */
401 if ( cblk->cblktype & (CBLK_RECV|CBLK_FANIN) ) {
402 continue;
403 }
404
405 if ( !(cblk->cblktype & CBLK_COMPRESSED) )
406 {
407 pastix_int_t in_height = 0;
408 pastix_int_t off_height = cblk->stride;
409
410 /* Compute the size of the original supernode diagonal block */
411 blok = cblk->fblokptr;
412 while( (blok < cblk[1].fblokptr) &&
413 ((solvmtx->cblktab + blok->fcblknm)->sndeidx == cblk->sndeidx) )
414 {
415 in_height += blok_rownbr( blok );
416 blok++;
417 }
418
419 /* Size of the cblk outside the diagonal block */
420 off_height -= in_height;
421
422 orig[FR_InDiag] += colnbr * in_height;
423 orig[FR_OffDiag] += colnbr * off_height;
424 }
425 else {
426 /* The gain for the diagonal block is always 0 */
427 orig[LR_DInD] += colnbr * colnbr;
428 cpucblk_smemory( side, solvmtx, cblk, orig, gain );
429 }
430 }
431
432 if ( side == PastixLUCoef ) {
433 orig[FR_InDiag] *= 2;
434 orig[FR_OffDiag] *= 2;
435 orig[LR_InDiag] *= 2;
436 orig[LR_OffDiag] *= 2;
437 orig[LR_InSele] *= 2;
438 }
439
440 totlr = 0.;
441 totfr = 0.;
442
443 for (i=0; i<MEMORY_STATS_SIZE; i++) {
444 memlr[i] = (orig[i] - gain[i]) * pastix_size_of( PastixFloat );
445 memfr[i] = orig[i] * pastix_size_of( PastixFloat );
446 totlr += memlr[i];
447 totfr += memfr[i];
448 }
449
450 if( iparm[IPARM_VERBOSE] > PastixVerboseNot ) {
451 pastix_print( solvmtx->clustnum, 0,
452 " Compression:\n"
453 " ------------------------------------------------\n"
454 " Full-rank supernodes\n"
455 " Inside %8.3g %co\n"
456 " Outside %8.3g %co\n"
457 " Low-rank supernodes\n"
458 " Diag in diag %8.3g %co\n"
459 " Inside not selected %8.3g %co / %8.3g %co\n"
460 " Inside selected %8.3g %co / %8.3g %co\n"
461 " Outside %8.3g %co / %8.3g %co\n"
462 " ------------------------------------------------\n"
463 " Total %8.3g %co / %8.3g %co\n",
464 pastix_print_value(memfr[FR_InDiag] ), pastix_print_unit(memfr[FR_InDiag] ),
465 pastix_print_value(memfr[FR_OffDiag]), pastix_print_unit(memfr[FR_OffDiag]),
466
467 pastix_print_value(memfr[LR_DInD]), pastix_print_unit(memfr[LR_DInD]),
468
469 pastix_print_value(memlr[LR_InDiag] ), pastix_print_unit(memlr[LR_InDiag] ),
470 pastix_print_value(memfr[LR_InDiag] ), pastix_print_unit(memfr[LR_InDiag] ),
471
472 pastix_print_value(memlr[LR_InSele] ), pastix_print_unit(memlr[LR_InSele]),
473 pastix_print_value(memfr[LR_InSele] ), pastix_print_unit(memfr[LR_InSele]),
474
475 pastix_print_value(memlr[LR_OffDiag]), pastix_print_unit(memlr[LR_OffDiag]),
476 pastix_print_value(memfr[LR_OffDiag]), pastix_print_unit(memfr[LR_OffDiag]),
477
478 pastix_print_value(totlr), pastix_print_unit(totlr),
479 pastix_print_value(totfr), pastix_print_unit(totfr) );
480 }
481
482 dparm[DPARM_MEM_FR] = totfr;
483 dparm[DPARM_MEM_LR] = totlr;
484
485 return;
486}
487
488/**
489 *******************************************************************************
490 *
491 * @brief Compute the memory usage of the full-rank form for the entire matrix.
492 *
493 * This function returns the memory usage in bytes for the full matrix when
494 * column blocks are stored in full-rank format.
495 *
496 *******************************************************************************
497 *
498 * @param[in] solvmtx
499 * The solver matrix of the problem.
500 *
501 * @param[inout] dparm
502 * The float parameter array which is going to be updated.
503 *
504 * @param[in] iparm
505 * The integer parameter array
506 *
507 *******************************************************************************/
508void
510 const pastix_int_t *iparm,
511 pastix_fixdbl_t *dparm )
512{
514 const SolverCblk *cblk = solvmtx->cblktab;
515 pastix_int_t cblknum;
516 pastix_fixdbl_t totmem = 0.;
517
518 for(cblknum=0; cblknum<solvmtx->cblknbr; cblknum++, cblk++) {
519 pastix_int_t colnbr = cblk_colnbr( cblk );
520 pastix_int_t rownbr = cblk->stride;
521
522 /* Skip remote data */
523 if ( cblk->ownerid != solvmtx->clustnum ) {
524 continue;
525 }
526
527 /* Let's skip recv and fanin for now */
528 if ( cblk->cblktype & (CBLK_RECV|CBLK_FANIN) ) {
529 continue;
530 }
531
532 totmem += (float)colnbr * (float)rownbr;
533 }
534
535 if ( side == PastixLUCoef ) {
536 totmem *= 2.;
537 }
538
539 totmem *= (float)pastix_size_of( PastixFloat );
540
541 dparm[DPARM_MEM_FR] = totmem;
542
543 if( iparm[IPARM_VERBOSE] > PastixVerboseNot ) {
544 pastix_print( solvmtx->clustnum, 0,
545 " Memory usage of coeftab %8.3g %co\n",
546 pastix_print_value(dparm[DPARM_MEM_FR]), pastix_print_unit(dparm[DPARM_MEM_FR]) );
547 }
548
549 return;
550}
551
552/**
553 *******************************************************************************
554 *
555 * @brief Compute the memory usage for the entire matrix.
556 *
557 * This functions computes the memory usage and gain if the matrix is compressed
558 *
559 *******************************************************************************
560 *
561 * @param[in] solvmtx
562 * The solver matrix of the problem.
563 *
564 * @param[in] iparm
565 * The integer parameter array. Uses IPARM_COMPRESS_WHEN, IPARM_VERBOSE
566 *
567 * @param[inout] dparm
568 * The float parameter array which is going to be updated.
569 * Update DPARM_MEM_FR and DPARM_MEM_LR.
570 *
571 *******************************************************************************/
572void
574 const pastix_int_t *iparm,
575 pastix_fixdbl_t *dparm )
576{
578 coeftab_smemory_lr( solvmtx, iparm, dparm );
579 }
580 else {
581 coeftab_smemory_fr( solvmtx, iparm, dparm );
582 }
583}
584
585/**
586 *******************************************************************************
587 *
588 * @brief Extract the Schur complement
589 *
590 * This routine is sequential and returns the full Schur complement
591 * uncommpressed in Lapack format.
592 *
593 *******************************************************************************
594 *
595 * @param[in] solvmtx
596 * The solver matrix structure describing the problem.
597 *
598 * @param[inout] S
599 * The pointer to the allocated matrix array that will store the Schur
600 * complement.
601 *
602 * @param[in] lds
603 * The leading dimension of the S array.
604 *
605 *******************************************************************************/
606void
608 float *S, pastix_int_t lds )
609{
610 SolverCblk *cblk = solvmtx->cblktab + solvmtx->cblkschur;
611 float *localS;
612 pastix_int_t itercblk, fcolnum, nbcol;
613 pastix_int_t ret;
614 int upper_part = (solvmtx->factotype == PastixFactLU);
615 fcolnum = cblk->fcolnum;
616
617 nbcol = solvmtx->nodenbr - fcolnum;
618 assert( nbcol <= lds );
619
620 /* Initialize the array to 0 */
621 ret = LAPACKE_slaset_work( LAPACK_COL_MAJOR, 'A', nbcol, nbcol, 0., 0., S, lds );
622 assert( ret == 0 );
623
624 for (itercblk=solvmtx->cblkschur; itercblk<solvmtx->cblknbr; itercblk++, cblk++)
625 {
626 assert( cblk->cblktype & CBLK_IN_SCHUR );
627 assert( lds >= cblk->stride );
628
629 localS = S + (cblk->fcolnum - fcolnum) * lds + (cblk->fcolnum - fcolnum);
630
631 cpucblk_sgetschur( cblk, upper_part, localS, lds );
632 }
633 (void)ret;
634}
635
636/**
637 *******************************************************************************
638 *
639 * @brief Extract the diagonal
640 *
641 * This routine is sequential and returns the full diagonal in the vector D,
642 * such that:
643 * D[incD*i]= A(i, i)
644 *
645 *******************************************************************************
646 *
647 * @param[in] solvmtx
648 * The solver matrix structure describing the problem.
649 *
650 * @param[inout] D
651 * The pointer to the allocated vector array that will store the diagonal.
652 * D must be of size solvmtx->nodenbr * incD.
653 *
654 * @param[in] incD
655 * The increment bewteen two elements of D. incD > 0.
656 *
657 *******************************************************************************/
658void
660 float *D, pastix_int_t incD )
661{
662 SolverCblk *cblk = solvmtx->cblktab;
663 float *A;
664 pastix_int_t lda, itercblk, nbcol, i;
665
666 for (itercblk=0; itercblk<solvmtx->cblknbr; itercblk++, cblk++)
667 {
668 nbcol = cblk_colnbr( cblk );
669 if ( cblk->cblktype & CBLK_COMPRESSED ) {
670 assert( cblk->fblokptr->LRblock[0]->rk == -1 );
671 A = cblk->fblokptr->LRblock[0]->u;
672 lda = cblk_colnbr( cblk ) + 1;
673 }
674 else {
675 A = cblk->lcoeftab;
676
677 if ( cblk->cblktype & CBLK_LAYOUT_2D ) {
678 lda = cblk_colnbr( cblk ) + 1;
679 }
680 else {
681 lda = cblk->stride + 1;
682 }
683 }
684
685 for (i=0; i<nbcol; i++, D += incD, A += lda ) {
686 *D = *A;
687 }
688 }
689}
void coeftab_smemory_lr(const SolverMatrix *solvmtx, const pastix_int_t *iparm, pastix_fixdbl_t *dparm)
Compute the memory gain of the low-rank form over the full-rank form for the entire matrix.
Definition coeftab_s.c:307
void coeftab_smemory_fr(const SolverMatrix *solvmtx, const pastix_int_t *iparm, pastix_fixdbl_t *dparm)
Compute the memory usage of the full-rank form for the entire matrix.
Definition coeftab_s.c:509
BEGIN_C_DECLS typedef int pastix_int_t
Definition datatypes.h:51
double pastix_fixdbl_t
Definition datatypes.h:65
int coeftab_sdiff(pastix_coefside_t side, const SolverMatrix *solvA, SolverMatrix *solvB)
Compare two solver matrices in full-rank format with the same data distribution.
Definition coeftab_s.c:196
void coeftab_sgetschur(const SolverMatrix *solvmtx, float *S, pastix_int_t lds)
Extract the Schur complement.
Definition coeftab_s.c:607
void cpucblk_sdumpfile(pastix_coefside_t side, SolverCblk *cblk, pastix_int_t itercblk, const char *directory)
Dump a single column block into a FILE in a human readale format.
Definition coeftab_s.c:125
void coeftab_sdump(pastix_data_t *pastix_data, const SolverMatrix *solvmtx, const char *prefix)
Dump the solver matrix coefficients into a file in human readable format.
Definition coeftab_s.c:55
void coeftab_smemory(const SolverMatrix *solvmtx, const pastix_int_t *iparm, pastix_fixdbl_t *dparm)
Compute the memory usage for the entire matrix.
Definition coeftab_s.c:573
void coeftab_sgetdiag(const SolverMatrix *solvmtx, float *D, pastix_int_t incD)
Extract the diagonal.
Definition coeftab_s.c:659
void coeftab_suncompress(SolverMatrix *solvmtx)
Uncompress all column block in low-rank format into full-rank format.
Definition coeftab_s.c:272
pastix_int_t coeftab_scompress(SolverMatrix *solvmtx)
Compress all the cblks marked as valid for low-rank format.
Definition coeftab_s.c:243
void cpucblk_sgetschur(const SolverCblk *cblk, int upper_part, float *S, pastix_int_t lds)
Extract a cblk panel of the Schur complement to a dense lapack form.
void cpucblk_suncompress(pastix_coefside_t side, SolverCblk *cblk)
Uncompress a single column block from low-rank format to full-rank format.
void cpucblk_smemory(pastix_coefside_t side, const SolverMatrix *solvmtx, SolverCblk *cblk, pastix_int_t *orig, pastix_int_t *gain)
Return the memory gain of the low-rank form over the full-rank form for a single column-block.
int cpucblk_sdiff(pastix_coefside_t side, const SolverCblk *cblkA, SolverCblk *cblkB)
Compare two column blocks in full-rank format.
pastix_int_t cpucblk_scompress(const SolverMatrix *solvmtx, pastix_coefside_t side, int max_ilulvl, SolverCblk *cblk)
Compress a single column block from full-rank to low-rank format.
void cpucblk_sdump(pastix_coefside_t side, const SolverCblk *cblk, FILE *stream)
Dump a single column block into a FILE in a human readale format.
pastix_int_t(* core_get_rklimit)(pastix_int_t, pastix_int_t)
Compute the maximal rank accepted for a given matrix size. The pointer is set according to the low-ra...
@ FR_InDiag
@ LR_DInD
@ LR_InSele
@ FR_OffDiag
@ LR_InDiag
@ LR_OffDiag
FILE * pastix_fopenw(const char *dirname, const char *filename, const char *mode)
Open a file in the unique directory of the pastix instance.
Definition api.c:251
void pastix_gendirectories(pastix_data_t *pastix_data)
Generate a unique temporary directory to store output files.
Definition api.c:85
enum pastix_coefside_e pastix_coefside_t
Data blocks used in the kernel.
@ PastixFactLU
Definition api.h:317
@ DPARM_MEM_FR
Definition api.h:175
@ DPARM_MEM_LR
Definition api.h:176
@ PastixLCoef
Definition api.h:478
@ PastixLUCoef
Definition api.h:480
@ PastixUCoef
Definition api.h:479
@ PastixCompressNever
Definition api.h:385
@ IPARM_COMPRESS_WHEN
Definition api.h:131
@ IPARM_VERBOSE
Definition api.h:36
@ PastixVerboseNot
Definition api.h:220
char * dir_global
Definition pastixdata.h:110
Main PaStiX data structure.
Definition pastixdata.h:68
pastix_int_t nodenbr
Definition solver.h:208
static pastix_int_t blok_rownbr(const SolverBlok *blok)
Compute the number of rows of a block.
Definition solver.h:395
void * ucoeftab
Definition solver.h:178
pastix_lr_t lowrank
Definition solver.h:236
static pastix_int_t cblk_colnbr(const SolverCblk *cblk)
Compute the number of columns in a column block.
Definition solver.h:329
pastix_int_t fcblknm
Definition solver.h:144
pastix_int_t sndeidx
Definition solver.h:173
pastix_int_t cblknbr
Definition solver.h:211
SolverBlok *restrict bloktab
Definition solver.h:229
pastix_factotype_t factotype
Definition solver.h:237
SolverBlok * fblokptr
Definition solver.h:168
pastix_int_t bloknbr
Definition solver.h:224
pastix_lrblock_t * LRblock[2]
Definition solver.h:155
pastix_int_t lcblknm
Definition solver.h:143
pastix_int_t gcblknum
Definition solver.h:174
int8_t inlast
Definition solver.h:151
SolverCblk *restrict cblktab
Definition solver.h:228
pastix_int_t stride
Definition solver.h:169
int8_t cblktype
Definition solver.h:164
pastix_int_t cblkschur
Definition solver.h:221
void * lcoeftab
Definition solver.h:177
pastix_int_t fcolnum
Definition solver.h:166
Solver block structure.
Definition solver.h:141
Solver column block structure.
Definition solver.h:161
Solver column block structure.
Definition solver.h:203