Mentions légales du service

Skip to content
Snippets Groups Projects
Commit e291cbe1 authored by Mathieu Faverge's avatar Mathieu Faverge
Browse files

Move to the attic unused files

parent 661a48a6
No related branches found
No related tags found
No related merge requests found
This diff is collapsed.
/**
* PaStiX CSC management routines.
*
* PaStiX is a software package provided by Inria Bordeaux - Sud-Ouest,
* LaBRI, University of Bordeaux 1 and IPB.
*
* @version 1.0.0
* @author Mathieu Faverge
* @author Pierre Ramet
* @author Xavier Lacoste
* @date 2011-11-11
* @precisions normal z -> c d s
*
**/
#ifndef CSC_UTILS_H
#define CSC_UTILS_H
/**
*
* @ingroup csc_utils
*
* Modify the CSC to a symetric graph one.
* Don't use it on a lower symetric CSC
* it would give you all the CSC upper + lower.
*
* @param[in] n Number of columns/vertices
* @param[in] ia Starting index of each column in *ja* and *a*
* @param[in] ja Row index of each element
* @param[in] a Value of each element,can be NULL
* @param[out] newn New number of column
* @param[out] newia Starting index of each column in *ja* and *a*
* @param[out] newja Row index of each element
* @param[out] newa Value of each element,can be NULL
**/
int z_csc_symgraph ( pastix_int_t n,
const pastix_int_t *ia,
const pastix_int_t *ja,
const pastix_complex64_t *a,
pastix_int_t *newn,
pastix_int_t **newia,
pastix_int_t **newja,
pastix_complex64_t **newa);
/**
*
* @ingroup csc_utils
*
* Modify the CSC to a symetric graph one.
* Don't use it on a lower symetric CSC
* it would give you all the CSC upper + lower.
*
* Internal function.
*
* @param[in] n Number of columns/vertices
* @param[in] ia Starting index of each column in *ja* and *a*
* @param[in] ja Row index of each element
* @param[in] a Value of each element,can be NULL
* @param[out] newn New number of column
* @param[out] newia Starting index of each column in *ja* and *a*
* @param[out] newja Row index of each element
* @param[out] newa Value of each element,can be NULL
* @param[in] malloc_flag flag to indicate if function call is intern to pastix
* or extern.
**/
int z_csc_symgraph_int ( pastix_int_t n,
const pastix_int_t *ia,
const pastix_int_t *ja,
const pastix_complex64_t *a,
pastix_int_t *newn,
pastix_int_t **newia,
pastix_int_t **newja,
pastix_complex64_t **newa,
int malloc_flag);
/**
*
* @ingroup csc_utils
*
* Supress diagonal term.
* After this call, *ja* can be reallocated to *ia[n] -1*.
*
* @param[in] baseval Initial numbering value (0 or 1).
* @param[in] n Number of columns/vertices
* @param[in,out] ia Starting index of each column in *ja* and *a*
* @param[in,out] ja Row index of each element
* @param[in,out] a Value of each element,can be NULL
**/
void z_csc_noDiag( pastix_int_t baseval,
pastix_int_t n,
pastix_int_t *ia,
pastix_int_t *ja,
pastix_complex64_t *a);
/**
*
* @ingroup csc_utils
*
* Check if the csc contains doubles and if correct if asked
*
* Assumes that the CSC is sorted.
*
* Assumes that the CSC is Fortran numeroted (base 1)
*
* @param[in] n Size of the matrix.
* @param[in,out] colptr Index in *rows* and *values* of the first element
* of each column
* @param[in,out] rows row of each element
* @param[in,out] values value of each element
* @param[in] dof Number of degrees of freedom
* @param[in] flag Indicate if user wants correction (<API_BOOLEAN>)
* @param[in] flagalloc indicate if allocation on CSC uses internal malloc.
*
*
* @Returns:
* API_YES - If the matrix contained no double or was successfully corrected.
* API_NO - Otherwise.
*/
int z_csc_check_doubles(pastix_int_t n,
pastix_int_t *colptr,
pastix_int_t **rows,
pastix_complex64_t **values,
int dof,
int flag,
int flagalloc);
/**
*
* @ingroup csc_utils
*
* Check if the CSC graph is symetric.
*
* For all local column C,
*
* For all row R in the column C,
*
* We look in column R if we have the row number C.
*
* If we can correct we had missing non zeros.
*
* Assumes that the CSC is Fortran numbered (1 based).
*
* Assumes that the matrix is sorted.
*
* @param[in] n Number of local columns
* @param[in,out] colptr Starting index of each columns in *ja*
* @param[in,out] rows Row of each element.
* @param[in,out] values Value of each element.
* @param[in] correct Flag indicating if we can correct the symmetry.
* @param[in] alloc indicate if allocation on CSC uses internal malloc.
* @param[in] dof Number of degrees of freedom.
*/
int z_csc_checksym(pastix_int_t n,
pastix_int_t *colptr,
pastix_int_t **rows,
pastix_complex64_t **values,
int correct,
int alloc,
int dof);
void z_csc_colPerm(pastix_int_t n, pastix_int_t *ia, pastix_int_t *ja, pastix_complex64_t *a, pastix_int_t *cperm);
void z_csc_colScale(pastix_int_t n, pastix_int_t *ia, pastix_int_t *ja, pastix_complex64_t *a, pastix_complex64_t *dcol);
void z_csc_rowScale(pastix_int_t n, pastix_int_t *ia, pastix_int_t *ja, pastix_complex64_t *a, pastix_complex64_t *drow);
void z_csc_sort(pastix_int_t n, pastix_int_t *ia, pastix_int_t *ja, pastix_complex64_t *a, pastix_int_t ndof);
void z_csc_Fnum2Cnum(pastix_int_t *ja, pastix_int_t *ia, pastix_int_t n);
void z_csc_Cnum2Fnum(pastix_int_t *ja, pastix_int_t *ia, pastix_int_t n);
/*
Function: CSC_buildZerosAndNonZerosGraphs
Separate a graph in two graphs, following
wether the diagonal term of a column is null or not.
Parameters:
n, colptr, rows, values - The initial CSC
n_nz, colptr_nz, rows_nz - The graph of the non-null diagonal part.
n_z, colptr_z, rows_z - The graph of the null diagonal part.
perm - Permutation to go from the first graph to
the one composed of the two graph concatenated.
revperm - Reverse permutation tabular.
criteria - Value beside which a number is said null.
*/
int z_csc_buildZerosAndNonZerosGraphs(pastix_int_t n,
pastix_int_t *colptr,
pastix_int_t *rows,
pastix_complex64_t *values,
pastix_int_t *n_nz,
pastix_int_t **colptr_nz,
pastix_int_t **rows_nz,
pastix_int_t *n_z,
pastix_int_t **colptr_z,
pastix_int_t **rows_z,
pastix_int_t *perm,
pastix_int_t *revperm,
double criteria);
/*
Function: CSC_isolate
Isolate a list of unknowns at the end of the CSC.
Parameters:
n - Number of columns.
colptr - Index of first element of each column in *ia*.
rows - Rows of each non zeros.
n_isolate - Number of unknow to isolate.
isolate_list - List of unknown to isolate.
*/
int z_csc_isolate(pastix_int_t n,
pastix_int_t *colptr,
pastix_int_t *rows,
pastix_int_t n_isolate,
pastix_int_t *isolate_list,
pastix_int_t *perm,
pastix_int_t *revperm);
/*
Function: csc_save
Save a csc on disk.
Parameters:
n - number of columns
colptr - First cscd starting index of each column in *ja* and *a*
rows - Row of each element in first CSCD
values - value of each cscd in first CSCD (can be NULL)
dof - Number of degrees of freedom
outfile - Output stream.
Return:
NO_ERR
*/
int z_csc_save(pastix_int_t n,
pastix_int_t * colptr,
pastix_int_t * rows,
pastix_complex64_t * values,
int dof,
FILE * outfile);
/*
Function: csc_load
Load a csc from disk.
Fill *n*, *colptr*, *rows*, *values* and *dof* from *infile*.
Parameters:
n - number of columns
colptr - First cscd starting index of each column in *ja* and *a*
rows - Row of each element in first CSCD
values - value of each cscd in first CSCD (can be NULL)
dof - Number of degrees of freedom
outfile - Output stream.
Return:
NO_ERR
*/
int z_csc_load(pastix_int_t * n,
pastix_int_t ** colptr,
pastix_int_t ** rows,
pastix_complex64_t ** values,
int * dof,
FILE * infile);
#endif /* CSC_UTILS_H */
This diff is collapsed.
/**
* PaStiX distributed CSC management routines.
*
* PaStiX is a software package provided by Inria Bordeaux - Sud-Ouest,
* LaBRI, University of Bordeaux 1 and IPB.
*
* @version 1.0.0
* @author Mathieu Faverge
* @author Pierre Ramet
* @author Xavier Lacoste
* @date 2011-11-11
* @precisions normal z -> c d s
*
**/
#ifndef Z_CSCD_UTILS_H
#define Z_CSCD_UTILS_H
/*
* Enum: CSCD_OPERATIONS
*
* Operation when adding CSCD
*
* CSCD_ADD - Add coefficient values.
* CSCD_KEEP - Keep value from first CSCD.
* CSCD_MAX - Keep maximum of first and second CSCD.
* CSCD_MIN - Keep minimum of first and second CSCD.
* CSCD_OVW - Overwrite with second CSCD value.
*/
enum CSCD_OPERATIONS {
CSCD_ADD,
CSCD_KEEP,
CSCD_MAX,
CSCD_MIN,
CSCD_OVW
};
typedef enum CSCD_OPERATIONS CSCD_OPERATIONS_t;
/*
* Enum: CSC_DISPATCH_OP
*
* Operation when dispatching the csc into a cscd
*
* CSC_DISP_SIMPLE - Reparts linearly the columns over the proc.
* CSC_DISP_CYCLIC - Reparts cyclicly the columns over the proc.
*
*/
enum CSC_DISPATCH_OP {
CSC_DISP_SIMPLE,
CSC_DISP_CYCLIC
};
typedef enum CSC_DISPATCH_OP CSCD_DISPATCH_OP_t;
/* Section: Functions */
/*
* Function: z_csc_dispatch
*
* Distribute a CSC to a CSCD
*
* Parameters:
* gN - global number of columns
* gcolptr - global starting index of each column in grows ans gavals.
* grows - global rows of each element.
* gavals - global values of each element.
* gperm - global permutation tabular.
* ginvp - global reverse permutation tabular.
* lN - local number of columns (output).
* lcolptr - starting index of each local column (output).
* lrowptr - row number of each local element (output).
* lavals - values of each local element (output).
* lrhs - local part of the right hand side (output).
* lperm - local part of the permutation tabular (output).
* loc2glob - global numbers of local columns (before permutation).
* dispatch - choose how to dispatch the csc
* pastix_comm - PaStiX MPI communicator.
*/
void z_csc_dispatch(pastix_int_t gN, pastix_int_t * gcolptr, pastix_int_t * grow, pastix_complex64_t * gavals,
pastix_complex64_t * grhs, pastix_int_t * gperm, pastix_int_t * ginvp,
pastix_int_t *lN, pastix_int_t ** lcolptr, pastix_int_t ** lrow, pastix_complex64_t ** lavals,
pastix_complex64_t ** lrhs, pastix_int_t ** lperm,
pastix_int_t **loc2glob, int dispatch, MPI_Comm pastix_comm);
/*
* Function: csc_cyclic_distribution
*
* Distribute the CSC cyclicaly.
*
* Parameters:
* column - column number to distribute
* columnnbr - Number of colmuns.
* pastix_comm - PaStiX MPI communicator
*
* Return:
* owner of the column (column%commSize)
*/
pastix_int_t z_csc_cyclic_distribution(pastix_int_t column, pastix_int_t columnnbr, MPI_Comm pastix_comm);
/*
* Function: csc_simple_distribution
*
* Distribute the CSC.
* First columns are for first proc and so on.
*
* Parameters:
* column - column number to distribute
* columnnbr - Number of colmuns.
* pastix_comm - PaStiX MPI communicator
*
* Return:
* owner of the column (column/commSize)
*/
pastix_int_t z_csc_simple_distribution(pastix_int_t column, pastix_int_t columnnbr, MPI_Comm pastix_comm);
/*
* Function: cscd_symgraph
*
* Check if the CSCD graph is symetric.
*
* Parameters:
* n - Number of local columns
* ia - Starting index of each columns in *ja* and *a*
* ja - Row of each element.
* a - Values of each element.
* newn - New number of local columns
* newia - Starting index of each columns in *newja* and *newa*
* newja - Row of each element.
* newa - Values of each element.
* l2g - global number of each local column.
* malloc_flag - flag to indicate if function call is intern to pastix or extern.
*/
int z_cscd_symgraph(pastix_int_t n, const pastix_int_t *ia, const pastix_int_t *ja, const pastix_complex64_t *a,
pastix_int_t * newn, pastix_int_t ** newia, pastix_int_t ** newja, pastix_complex64_t ** newa,
pastix_int_t * l2g, MPI_Comm comm);
/*
* Function: cscd_addlocal
*
* Add second cscd to first cscd into third cscd (unallocated)
*
* Parameters:
* n - First cscd size
* ia - First cscd starting index of each column in *ja* and *a*
* ja - Row of each element in first CSCD
* a - value of each cscd in first CSCD (can be NULL)
* l2g - local 2 global column numbers for first cscd
* addn - CSCD to add size
* addia - CSCD to add starting index of each column in *addja* and *adda*
* addja - Row of each element in second CSCD
* adda - value of each cscd in second CSCD (can be NULL -> add 0)
* addl2g - local 2 global column numbers for second cscd
* newn - new cscd size (same as first)
* newia - CSCD to add starting index of each column in *newja* and *newwa*
* newja - Row of each element in third CSCD
* newa - value of each cscd in third CSCD
* OP - Operation to manage common CSCD coefficients.
* dof - Number of degrees of freedom.
*/
int z_cscd_addlocal(pastix_int_t n , pastix_int_t * ia , pastix_int_t * ja , pastix_complex64_t * a , pastix_int_t * l2g,
pastix_int_t addn, pastix_int_t * addia, pastix_int_t * addja, pastix_complex64_t * adda, pastix_int_t * addl2g,
pastix_int_t * newn, pastix_int_t ** newia, pastix_int_t ** newja, pastix_complex64_t ** newa, CSCD_OPERATIONS_t OP, int dof);
/**
* Function: csc2cscd
*
* Transform a csc to a cscd.
* Allocate the CSCD.
* If grhs == NULL forget right hand side part.
* If gperm == NULL forget permutation and reverse permutation part.
*
* Parameters:
* gN - global number of columns
* gcolptr - global starting index of each column in grows ans gavals.
* grows - global rows of each element.
* gavals - global values of each element.
* gperm - global permutation tabular.
* ginvp - global reverse permutation tabular.
* lN - local number of columns.
* lcolptr - starting index of each local column.
* lrowptr - row number of each local element.
* lavals - values of each local element.
* lrhs - local part of the right hand side (output).
* lperm - local part of the permutation tabular (output).
* linvp - local part of the reverse permutation tabular (output).
* loc2glob - global numbers of local columns (before permutation).
*/
void z_csc2cscd(pastix_int_t gN, pastix_int_t * gcolptr, pastix_int_t * grow, pastix_complex64_t * gavals,
pastix_complex64_t * grhs, pastix_int_t * gperm, pastix_int_t * ginvp,
pastix_int_t lN, pastix_int_t ** lcolptr, pastix_int_t ** lrow, pastix_complex64_t ** lavals,
pastix_complex64_t ** lrhs, pastix_int_t ** lperm, pastix_int_t ** linvp,
pastix_int_t *loc2glob);
/**
* Function: cscd2csc
*
* Transform a cscd to a csc.
* colptr2, row2, avals2, rhs2, perm2, invp2 are allocated here.
*
* Parameters:
* lN - number of local column.
* lcolptr - starting index of each local column in row and avals.
* lrow _ row number of each local element.
* lavals - values of each local element.
* lrhs - local part of the right hand side.
* lperm - local part of the permutation tabular.
* linvp - local part of the reverse permutation tabular.
* gN - global number of columns (output).
* gcolptr - starting index of each column in row2 and avals2 (output).
* grow - row number of each element (output).
* gavals - values of each element (output).
* grhs - global right hand side (output).
* gperm - global permutation tabular (output).
* ginvp - global reverse permutation tabular (output).
* loc2glob - global number of each local column.
* pastix_comm - PaStiX MPI communicator.
* ndof - Number of degree f freedom by node.
*
*/
void z_cscd2csc(pastix_int_t lN, pastix_int_t * lcolptr, pastix_int_t * lrow, pastix_complex64_t * lavals,
pastix_complex64_t * lrhs, pastix_int_t * lperm, pastix_int_t * linvp,
pastix_int_t *gN, pastix_int_t ** gcolptr, pastix_int_t **grow, pastix_complex64_t **gavals,
pastix_complex64_t **grhs, pastix_int_t **gperm, pastix_int_t **ginvp,
pastix_int_t *loc2glob, MPI_Comm pastix_comm, pastix_int_t ndof);
/*
* Function: cscd_redispatch
*
* Redistribute the first cscd into a new one using *dl2g*.
*
* - gather all new loc2globs on all processors.
* - allocate *dia*, *dja* and *da*.
* - Create new CSC for each processor and send it.
* - Merge all new CSC to the new local CSC with <cscd_addlocal_int>.
*
* If communicator size is one, check that n = dn and
* l2g = dl2g and simply create a copy of the first cscd.
*
* Parameters:
* n - Number of local columns
* ia - First cscd starting index of each column in *ja* and *a*
* ja - Row of each element in first CSCD
* a - value of each cscd in first CSCD (can be NULL)
* rhs - right-hand-side member corresponding to the first CSCD
* (can be NULL)
* nrhs - number of right-hand-side.
* l2g - local 2 global column numbers for first cscd
* dn - Number of local columns
* dia - New cscd starting index of each column in *ja* and *a*
* dja - Row of each element in new CSCD
* da - value of each cscd in new CSCD
* rhs - right-hand-side member corresponding to the new CSCD
* dl2g - local 2 global column numbers for new cscd
* comm - MPI communicator
*
* Returns:
* EXIT_SUCCESS - If all goes well
* EXIT_FAILURE - If commsize = 1 and *n* != *dn* or *l2g* != *dl2g*.
*/
int z_cscd_redispatch(pastix_int_t n, pastix_int_t * ia, pastix_int_t * ja, pastix_complex64_t * a,
pastix_complex64_t * rhs, pastix_int_t nrhs, pastix_int_t * l2g,
pastix_int_t dn, pastix_int_t ** dia, pastix_int_t ** dja, pastix_complex64_t ** da,
pastix_complex64_t ** drhs, pastix_int_t * dl2g,
MPI_Comm comm, pastix_int_t dof);
/*
* Function: cscd_save
*
* save a distributed csc to disk.
* files are called $(filename) and $(filename)$(RANK)
* if filename is NULL then filename = cscd_matrix.
*
* file filename contains the number of processors/files
* on first line. Then each line contain the name of each file
* (here $(filename)$(RANK)).
*
*
*
* Parameters:
* n - Number of local columns
* ia - First cscd starting index of each column in *ja* and *a*
* ja - Row of each element in first CSCD
* a - value of each cscd in first CSCD (can be NULL)
* rhs - Right hand side.
* l2g - local 2 global column numbers for first cscd
* dof - Number of degrees of freedom
* filename - name of the files.
* comm - MPI communicator
*/
int z_cscd_save(pastix_int_t n, pastix_int_t *ia, pastix_int_t *ja, pastix_complex64_t * a, pastix_complex64_t * rhs, pastix_int_t* l2g,
int dof, const char * filename, MPI_Comm comm);
/*
* Function: cscd_load
*
* Loads a distributed csc from disk.
* if filename is NULL then filename = cscd_matrix.
*
* Parameters:
* n - Number of local columns
* ia - First cscd starting index of each column in *ja* and *a*
* ja - Row of each element in first CSCD
* a - value of each cscd in first CSCD (can be NULL)
* rhs - Right hand side.
* l2g - local 2 global column numbers for first cscd
* filename - name of the files.
* comm - MPI communicator
*/
int z_cscd_load(pastix_int_t *n, pastix_int_t ** ia, pastix_int_t ** ja, pastix_complex64_t ** a, pastix_complex64_t ** rhs, pastix_int_t ** l2g,
const char * filename, MPI_Comm mpi_comm);
#endif /* Z_CSCD_UTILS_H */
/**
* PaStiX CSC management routines.
*
* PaStiX is a software package provided by Inria Bordeaux - Sud-Ouest,
* LaBRI, University of Bordeaux 1 and IPB.
*
* @version 1.0.0
* @author Mathieu Faverge
* @author Pierre Ramet
* @author Xavier Lacoste
* @date 2011-11-11
* @precisions normal z -> c d s
*
**/
/*
File: pastix_fortran.c
Interface to the PaStiX API functions.
*/
#include "common.h"
#include "z_cscd_utils.h"
#define FORTRAN_NAME(nu,nl,pl,pc) \
void nl pl; \
void nu pl \
{ nl pc; } \
void nl ## _ pl \
{ nl pc; } \
void nl ## __ pl \
{ nl pc; }
/*
Struct: csc_data_
Contains the new CSCD
*/
struct csc_data_ {
pastix_int_t n;
pastix_int_t *colptr;
pastix_int_t *rows;
pastix_complex64_t *values;
pastix_complex64_t *rhs;
pastix_int_t nrhs;
pastix_int_t *perm;
pastix_int_t *l2g;
pastix_int_t dof;
};
/*
Typedef: csc_data_t
Type coresponding to the struct <csc_data_>
*/
typedef struct csc_data_ csc_data_t;
FORTRAN_NAME(Z_CSC_DISPATCH_FORTRAN,
z_csc_dispatch_fortran,
(csc_data_t **csc_data,
pastix_int_t *gN,
pastix_int_t *gcolptr,
pastix_int_t *grow,
pastix_complex64_t *gavals,
pastix_complex64_t *grhs,
pastix_int_t *gperm,
pastix_int_t *ginvp,
int *dispatch,
pastix_int_t *newn,
pastix_int_t *newnnz,
MPI_Fint *fortran_comm),
(csc_data,
gN,
gcolptr,
grow,
gavals,
grhs,
gperm,
ginvp,
dispatch,
newn,
newnnz,
fortran_comm))
void z_csc_dispatch_fortran(csc_data_t **csc_data,
pastix_int_t *gN,
pastix_int_t *gcolptr,
pastix_int_t *grow,
pastix_complex64_t *gavals,
pastix_complex64_t *grhs,
pastix_int_t *gperm,
pastix_int_t *ginvp,
int *dispatch,
pastix_int_t *newn,
pastix_int_t *newnnz,
MPI_Fint *fortran_comm)
{
MPI_Comm pastix_comm;
(void)fortran_comm;
pastix_comm = MPI_Comm_f2c(*fortran_comm);
MALLOC_INTERN(*csc_data, 1, struct csc_data_);
(*csc_data)->n = 0;
(*csc_data)->colptr = NULL;
(*csc_data)->rows = NULL;
(*csc_data)->values = NULL;
(*csc_data)->rhs = NULL;
(*csc_data)->perm = NULL;
(*csc_data)->l2g = NULL;
z_csc_dispatch(*gN, gcolptr, grow, gavals, grhs, gperm, ginvp,
&((*csc_data)->n), &((*csc_data)->colptr), &((*csc_data)->rows), &((*csc_data)->values),
&((*csc_data)->rhs), &((*csc_data)->perm),
&((*csc_data)->l2g), *dispatch, pastix_comm);
*newn = (*csc_data)->n;
*newnnz = (*csc_data)->colptr[(*csc_data)->n]-1;
}
FORTRAN_NAME(Z_CSC_DISPATCH_FORTRAN_END,
z_csc_dispatch_fortran_end,
(csc_data_t **csc_data,
pastix_int_t *lcolptr,
pastix_int_t *lrow,
pastix_complex64_t *lavals,
pastix_complex64_t *lrhs,
pastix_int_t *lperm,
pastix_int_t *l2g),
(csc_data,
lcolptr,
lrow,
lavals,
lrhs,
lperm,
l2g))
void z_csc_dispatch_fortran_end(csc_data_t **csc_data,
pastix_int_t *lcolptr,
pastix_int_t *lrow,
pastix_complex64_t *lavals,
pastix_complex64_t *lrhs,
pastix_int_t *lperm,
pastix_int_t *l2g)
{
pastix_int_t nnz = 0;
if ((*csc_data)->colptr != NULL) {
nnz = (*csc_data)->colptr[(*csc_data)->n]-1;
memcpy(lcolptr, (*csc_data)->colptr, (1+(*csc_data)->n)*sizeof(pastix_int_t));
free((*csc_data)->colptr);
}
if ((*csc_data)->rows != NULL) {
memcpy(lrow, (*csc_data)->rows, nnz*sizeof(pastix_int_t));
free((*csc_data)->rows);
}
if ((*csc_data)->values != NULL) {
memcpy(lavals, (*csc_data)->values, nnz*sizeof(pastix_complex64_t));
free((*csc_data)->values);
}
if ((*csc_data)->rhs != NULL) {
memcpy(lrhs, (*csc_data)->rhs, (*csc_data)->n*sizeof(pastix_complex64_t));
free((*csc_data)->rhs);
}
if ((*csc_data)->perm != NULL) {
memcpy(lperm, (*csc_data)->perm, (*csc_data)->n*sizeof(pastix_int_t));
free((*csc_data)->perm);
}
if ((*csc_data)->l2g != NULL) {
memcpy(l2g, (*csc_data)->l2g, (*csc_data)->n*sizeof(pastix_int_t));
free((*csc_data)->l2g);
}
}
FORTRAN_NAME(Z_CSCD_REDISPATCH_FORTRAN,
z_cscd_redispatch_fortran,
(csc_data_t **csc_data,
pastix_int_t *n,
pastix_int_t *ia,
pastix_int_t *ja,
pastix_complex64_t *a,
pastix_complex64_t *rhs,
pastix_int_t *nrhs,
pastix_int_t *l2g,
pastix_int_t *newn,
pastix_int_t *newl2g,
pastix_int_t *newnnz,
MPI_Fint *fortran_comm,
pastix_int_t *dof,
int *ierr),
(csc_data,
n,
ia,
ja,
a,
rhs,
nrhs,
l2g,
newn,
newl2g,
newnnz,
fortran_comm,
dof,
ierr))
void z_cscd_redispatch_fortran(csc_data_t **csc_data,
pastix_int_t *n,
pastix_int_t *ia,
pastix_int_t *ja,
pastix_complex64_t *a,
pastix_complex64_t *rhs,
pastix_int_t *nrhs,
pastix_int_t *l2g,
pastix_int_t *newn,
pastix_int_t *newl2g,
pastix_int_t *newnnz,
MPI_Fint *fortran_comm,
pastix_int_t *dof,
int *ierr)
{
MPI_Comm pastix_comm;
(void)newnnz; (void)fortran_comm;
pastix_comm = MPI_Comm_f2c(*fortran_comm);
MALLOC_INTERN(*csc_data, 1, struct csc_data_);
(*csc_data)->n = 0;
(*csc_data)->colptr = NULL;
(*csc_data)->rows = NULL;
(*csc_data)->values = NULL;
(*csc_data)->rhs = NULL;
(*csc_data)->nrhs = *nrhs;
(*csc_data)->perm = NULL;
(*csc_data)->l2g = NULL;
(*csc_data)->dof = *dof;
*ierr = z_cscd_redispatch(*n, ia, ja, a, rhs, *nrhs, l2g,
*newn, &((*csc_data)->colptr), &((*csc_data)->rows), &((*csc_data)->values), &((*csc_data)->rhs), newl2g,
pastix_comm, (*csc_data)->dof);
}
FORTRAN_NAME(Z_CSCD_REDISPATCH_FORTRAN_END,
z_cscd_redispatch_fortran_end,
(csc_data_t **csc_data,
pastix_int_t *dcolptr,
pastix_int_t *drow,
pastix_complex64_t *davals,
pastix_complex64_t *drhs),
(csc_data,
dcolptr,
drow,
davals,
drhs))
void z_cscd_redispatch_fortran_end(csc_data_t **csc_data,
pastix_int_t *dcolptr,
pastix_int_t *drow,
pastix_complex64_t *davals,
pastix_complex64_t *drhs)
{
pastix_int_t nnz = 0;
if ((*csc_data)->colptr != NULL) {
nnz = (*csc_data)->colptr[(*csc_data)->n]-1;
memcpy(dcolptr, (*csc_data)->colptr, (1+(*csc_data)->n)*sizeof(pastix_int_t));
free((*csc_data)->colptr);
}
if ((*csc_data)->rows != NULL) {
memcpy(drow, (*csc_data)->rows, nnz*sizeof(pastix_int_t));
free((*csc_data)->rows);
}
if ((*csc_data)->values != NULL) {
memcpy(davals, (*csc_data)->values,
(*csc_data)->dof*(*csc_data)->dof*nnz*sizeof(pastix_complex64_t));
free((*csc_data)->values);
}
if ((*csc_data)->rhs != NULL) {
memcpy(drhs, (*csc_data)->rhs, (*csc_data)->nrhs*(*csc_data)->n*sizeof(pastix_complex64_t));
free((*csc_data)->rhs);
}
memFree_null(*csc_data);
}
/**
* PaStiX distributed CSC management routines.
*
* PaStiX is a software package provided by Inria Bordeaux - Sud-Ouest,
* LaBRI, University of Bordeaux 1 and IPB.
*
* @version 1.0.0
* @author Mathieu Faverge
* @author Pierre Ramet
* @author Xavier Lacoste
* @date 2011-11-11
* @precisions normal z -> c d s
*
**/
#include "z_cscd_utils.h"
#ifndef CSCD_UTILS_INTERN_H
#define CSCD_UTILS_INTERN_H
int z_cscd_addlocal_int(pastix_int_t n , const pastix_int_t * ia , const pastix_int_t * ja , const pastix_complex64_t * a , const pastix_int_t * l2g,
pastix_int_t addn, const pastix_int_t * addia, pastix_int_t * addja, const pastix_complex64_t * adda, const pastix_int_t * addl2g,
pastix_int_t * newn, pastix_int_t ** newia, pastix_int_t ** newja, pastix_complex64_t ** newa,
CSCD_OPERATIONS_t OP, int dof, int malloc_flag);
/*
* Function: cscd_redispatch_int
*
* Redistribute the first cscd into a new one using *dl2g*.
*
* - gather all new loc2globs on all processors.
* - allocate *dia*, *dja* and *da*.
* - Create new CSC for each processor and send it.
* - Merge all new CSC to the new local CSC with <cscd_addlocal_int>.
*
* If communicator size is one, check that n = dn and
* l2g = dl2g and simply create a copy of the first cscd.
*
* Parameters:
* n - Number of local columns
* ia - First cscd starting index of each column in *ja* and *a*
* ja - Row of each element in first CSCD
* a - value of each cscd in first CSCD (can be NULL)
* rhs - right-hand-side member corresponding to the first CSCD (can be NULL)
* nrhs - number of right-hand-side.
* l2g - local 2 global column numbers for first cscd
* dn - Number of local columns
* dia - New cscd starting index of each column in *ja* and *a*
* dja - Row of each element in new CSCD
* da - value of each cscd in new CSCD
* rhs - right-hand-side member corresponding to the new CSCD
* dl2g - local 2 global column numbers for new cscd
* malloc_flag - Internal (API_YES) or external (API_NO) malloc use.
* comm - MPI communicator
*
* Returns:
* EXIT_SUCCESS - If all goes well
* EXIT_FAILURE - If commsize = 1 and *n* != *dn* or *l2g* != *dl2g*.
*/
int z_cscd_redispatch_int(pastix_int_t n, pastix_int_t * ia, pastix_int_t * ja, pastix_complex64_t * a, pastix_complex64_t * rhs, pastix_int_t nrhs, pastix_int_t * l2g,
pastix_int_t dn, pastix_int_t ** dia, pastix_int_t ** dja, pastix_complex64_t ** da, pastix_complex64_t ** drhs, pastix_int_t * dl2g,
int malloc_flag, MPI_Comm comm, pastix_int_t dof);
int z_cscd_symgraph_int(pastix_int_t n, const pastix_int_t *ia, const pastix_int_t *ja, const pastix_complex64_t *a,
pastix_int_t * newn, pastix_int_t ** newia, pastix_int_t ** newja, pastix_complex64_t ** newa,
pastix_int_t * l2g, MPI_Comm comm, int malloc_flag);
/*
Function: cscd_build_g2l
Construct global to local tabular containing local number of global columns
if one column is local, and -owner if column is not local.
For i in 0, gN
g2l[i] = i local number if i is local
g2l[i] = -p if p is the owner of the column i
Parameters:
n - Number of local columns
colptr - Starting index of each columns in *ja*
rows - Row of each element.
values - Value of each element.
l2g - global number of each local column.
correct - Flag indicating if we can correct the symmetry.
dof - Number of degrees of freedom.
comm - MPI communicator
*/
int z_cscd_build_g2l( pastix_int_t ncol,
pastix_int_t *loc2glob,
MPI_Comm comm,
pastix_int_t *gN,
pastix_int_t **g2l);
/*
Function: cscd_noDiag
Removes diagonal elements from a CSCD.
*ja* and *a* can be reallocated to
ia[n]-1 elements after this call.
Parameters:
n - Number of local columns
ia - First cscd starting index of each column in *ja* and *a*
ja - Row of each element in first CSCD
a - value of each cscd in first CSCD (can be NULL)
l2g - local 2 global column numbers for first cscd
*/
int z_cscd_noDiag(pastix_int_t n, pastix_int_t *ia, pastix_int_t *ja, pastix_complex64_t * a, const pastix_int_t * l2g);
/*
Function: cscd_checksym
Check if the CSCD graph is symetric.
Parameters:
n - Number of local columns
ia - Starting index of each columns in *ja*
ja - Row of each element.
l2g - global number of each local column.
correct - Flag indicating if we can correct the symmetry.
alloc - indicate if allocation on CSC uses internal malloc.
dof - Number of degrees of freedom.
comm - MPI communicator
*/
int z_cscd_checksym(pastix_int_t n,
pastix_int_t *colptr,
pastix_int_t **rows,
pastix_complex64_t **values,
pastix_int_t *l2g,
int correct,
int alloc,
int dof,
MPI_Comm comm);
/**
* Function: cscd2csc_int
*
* Transform a cscd to a csc.
* colptr2, row2, avals2, rhs2, perm2, invp2 are allocated here.
*
* External function, allocation are not of the internal type.
*
* Parameters:
* lN - number of local column.
* lcolptr - starting index of each local column in row and avals.
* lrow _ row number of each local element.
* lavals - values of each local element.
* lrhs - local part of the right hand side.
* lperm - local part of the permutation tabular.
* linvp - Means nothing, to suppress.
* gN - global number of columns (output).
* gcolptr - starting index of each column in row2 and avals2 (output).
* grow - row number of each element (output).
* gavals - values of each element (output).
* grhs - global right hand side (output).
* gperm - global permutation tabular (output).
* ginvp - global reverse permutation tabular (output).
* loc2glob - global number of each local column.
* pastix_comm - PaStiX MPI communicator.
* ndof - Number of degree of freedom per node.
* intern_flag - Decide if malloc will use internal or external macros.
*/
void z_cscd2csc_int(pastix_int_t lN, pastix_int_t * lcolptr, pastix_int_t * lrow, pastix_complex64_t * lavals,
pastix_complex64_t * lrhs, pastix_int_t * lperm, pastix_int_t * linvp,
pastix_int_t *gN, pastix_int_t ** gcolptr, pastix_int_t **grow, pastix_complex64_t **gavals,
pastix_complex64_t **grhs, pastix_int_t **gperm, pastix_int_t **ginvp,
pastix_int_t *loc2glob, MPI_Comm pastix_comm, pastix_int_t ndof, int intern_flag);
/*
Function: cscd_redispatch_scotch
Renumber the columns to have first columns on first proc for Scotch
Parameters:
n - Number of local columns
ia - First cscd starting index of each column in *ja* and *a*
ja - Row of each element in first CSCD
a - value of each cscd in first CSCD (can be NULL)
l2g - local 2 global column numbers for first cscd
dn - Number of local columns
dia - First cscd starting index of each column in *ja* and *a*
dja - Row of each element in first CSCD
da - value of each cscd in first CSCD (can be NULL)
l2g - local 2 global column numbers for first cscd
comm - MPI communicator
Returns:
EXIT_SUCCESS if already well distributed, 2 if redistributed
*/
int z_cscd_redispatch_scotch(pastix_int_t n, pastix_int_t * ia, pastix_int_t * ja, pastix_complex64_t * a, pastix_int_t * l2g,
pastix_int_t *dn, pastix_int_t ** dia, pastix_int_t ** dja, pastix_complex64_t ** da, pastix_int_t ** dl2g,
MPI_Comm comm);
#endif /* CSCD_UTILS_INTERN_H */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment