Mentions légales du service

Skip to content
Snippets Groups Projects
z_cscd_utils_fortran.c 9.05 KiB
Newer Older
/**
 *  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);
}