File hips-1.2-rc5-no-return-in-non-void.patch of Package hips

diff -aruN hips.orig/SRC/BLOCK/PARALLEL/DBcomm.c hips/SRC/BLOCK/PARALLEL/DBcomm.c
--- hips.orig/SRC/BLOCK/PARALLEL/DBcomm.c	2010-10-13 13:37:57.000000000 +0200
+++ hips/SRC/BLOCK/PARALLEL/DBcomm.c	2012-12-06 21:30:24.830613414 +0100
@@ -472,6 +472,7 @@
   solvmtx->coefnbr = symbmtx->hdim[0]*(symbmtx->ccblktab[0].lcolnum-symbmtx->ccblktab[0].fcolnum+1);
  
   memset(solvmtx->coeftab, 0, solvmtx->coefnbr*sizeof(COEF));
+  return 0;
 }
 
 int DBpack_matrix(VSolverMatrix* mat, COEF *coeff_buff, int *coeff_size_packed, int limitsize)
diff -aruN hips.orig/SRC/BLOCK/PARALLEL/DBcomm.c~ hips/SRC/BLOCK/PARALLEL/DBcomm.c~
--- hips.orig/SRC/BLOCK/PARALLEL/DBcomm.c~	1970-01-01 01:00:00.000000000 +0100
+++ hips/SRC/BLOCK/PARALLEL/DBcomm.c~	2010-10-13 13:37:57.000000000 +0200
@@ -0,0 +1,776 @@
+/******************************************************************************/
+/* Copyright 2008-2009 CNRS                                                   */
+/*                                                                            */
+/* File          : DBcomm.c                                                   */
+/*                                                                            */
+/* Description   : This file is part of HIPS : Hierarchical Iterative         */
+/*                 Parallel Solver (http://hips.gforge.inria.fr/).            */
+/*                                                                            */
+/* Authors       : J. GAIDAMOUR                                               */
+/******************************************************************************/
+
+/******************************************************************************/
+/* License       : CeCILL-C                                                   */
+/*                                                                            */
+/* This software is governed by the CeCILL-C license under French law and     */
+/* abiding by the rules of distribution of free software. You can use,        */
+/* modify and/or redistribute the software under the terms of the             */
+/* CeCILL-C license as circulated by CEA, CNRS and INRIA at the following     */
+/* URL: "http://www.cecill.info".                                             */
+/*                                                                            */
+/* As a counterpart to the access to the source code and rights to copy,      */
+/* modify and redistribute granted by the license, users are provided         */
+/* only with a limited warranty and the software's author, the holder of      */
+/* the economic rights, and the successive licensors have only limited        */
+/* liability.                                                                 */
+/*                                                                            */
+/* In this respect, the user's attention is drawn to the risks associated     */
+/* with loading, using, modifying and/or developing or reproducing the        */
+/* software by the user in light of its specific status of free software,     */
+/* that may mean that it is complicated to manipulate, and that also          */
+/* therefore means that it is reserved for developers and experienced         */
+/* professionals having in-depth computer knowledge. Users are therefore      */
+/* encouraged to load and test the software's suitability as regards          */
+/* their requirements in conditions enabling the security of their            */
+/* systems and/or data to be ensured and, more generally, to use and          */
+/* operate it in the same conditions as regards security.                     */
+/*                                                                            */
+/* The fact that you are presently reading this means that you have had       */
+/* knowledge of the CeCILL-C license and that you accept its terms.           */
+/******************************************************************************/
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+
+#include "db_parallel.h"
+
+#define COMM_MEMRATIO 1.0
+
+/* #define TRACE_COM */
+/* #define PRINT(arg...) printf(arg) */
+#define PRINT(arg...) 
+
+void DBMatrix_MatricesAdd(VSolverMatrix* a, int matnbr, COEF **coeff_buff);
+void DBMatrix_MatricesCopy(VSolverMatrix* a, COEF *coeff_buff);
+
+long VSolverMatrix_nnz(VSolverMatrix* mat) {
+  dim_t k;
+  long nnz=0;
+
+  SymbolMatrix* symbmtx = &mat->symbmtx;
+
+  for (k=0; k<symbmtx->cblknbr; k++) {
+    assert(symbmtx->cblknbr == 1); /* juste pour voir, inutile */
+    nnz += symbmtx->hdim[k]*(symbmtx->ccblktab[k].lcolnum-symbmtx->ccblktab[k].fcolnum+1);
+  }
+
+  return nnz;
+}
+
+int DBbuffer_size(int nnzB);
+void DBposte_block_receive(int indnum, mpi_t tag, DBMatrixFactComm *FC);
+void DBadd_contrib(VSolverMatrix* mat, DBBlockComm *bc);
+void DBgather_contrib(VSolverMatrix*, DBBlockComm *bc, VSolverMatrix* cstab);
+int DBpack_matrix(VSolverMatrix* mat, COEF *coeff_buff, int *coeff_size_packed, int limitsize);
+
+void DBMatrixFactComm_Setup(DBMatrixFactComm *FC, DBDistrMatrix *DM, PhidalDistrHID *DBL)
+{
+  dim_t i, j, k, m;
+  int ind;
+  DBBlockComm *bc;
+  PhidalHID *BL;
+  DBMatrix *M;
+
+  PRINT("comm.c : DBMatrixFactComm_Setup\n");
+
+  DBMatrixFactComm_Init(FC);
+  
+  BL = &(DBL->LHID);
+  M = &(DM->M);
+  
+  FC->comm_memratio = COMM_MEMRATIO;
+
+  FC->proc_id = DM->proc_id;
+
+  FC->bcomnbr = DM->sharenbr;
+
+  FC->mpicom = DBL->mpicom;
+
+  /* printf("-->%d\n", DM->sharenbr); */
+
+  if (DM->sharenbr > 0) 
+    FC->bcomtab = (DBBlockComm *)malloc(sizeof(DBBlockComm) * DM->sharenbr);
+  else 
+    FC->bcomtab = NULL;  
+
+  FC->maxproc = 1; /** Need at least one buffer in cstab **/ 
+
+  for(i=M->tlj; i<= M->brj; i++)
+    for(k=M->cia[i];k<M->cia[i+1];k++)
+      {
+	ind = DM->cind[k];
+
+	if(ind >= 0)
+	  {
+	    bc = FC->bcomtab+ind;
+	    if(DM->clead[k] == DM->proc_id)
+	      {
+#ifdef DEBUG_M
+		assert(DM->pset_index[ind+1]-DM->pset_index[ind] > 1);
+#endif
+		DBBlockComm_Init(bc, DM->pset_index[ind+1]-DM->pset_index[ind] - 1);
+		m = 0;
+		for(j=DM->pset_index[ind];j<DM->pset_index[ind+1];j++)
+		  if(DM->pset[j] != DM->proc_id)
+		    bc->proctab[m++] = DM->pset[j];
+		if(m  > FC->maxproc)
+		  FC->maxproc = m;
+	      }
+	    else
+	      {
+		DBBlockComm_Init(bc, 1);
+		bc->proctab[0] = DM->clead[k];
+	      }
+
+	    bc->buffsize = DBbuffer_size((int)VSolverMatrix_nnz(M->ca[k])/* ,nbcoli, nbcolj, FC->comm_memratio */);
+
+	  }
+      }
+
+  if(FC->maxproc >0)
+    {
+
+      FC->status = (MPI_Status *)malloc(sizeof(MPI_Status)*FC->maxproc);
+    }
+
+  
+}
+
+
+void DBMatrixFactComm_PosteCtrbReceive(DBMatrixFactComm *FC, DBDistrMatrix *DM, dim_t tlj, dim_t brj) {
+  int /* i, */ j, k, ind;
+  DBMatrix *M;
+  M = &(DM->M);
+  
+  PRINT("comm.c : DBMatrixFactComm_PosteCtrbReceive\n");
+
+#ifdef DEBUG_M
+  /* assert(M->tli <= tli); */
+  /* assert(M->bri >= bri); */
+  assert(M->tlj <= tlj);
+  assert(M->brj >= brj);
+#endif
+  
+  /* if(bri - tli < brj - tlj) { */
+/*     assert(0); */
+/*     for(i=tli;i<=bri;i++) */
+/*       { */
+/* 	for(k=M->ria[i];k<M->ria[i+1];k++) */
+/* 	  { */
+/* 	    ind = DM->rind[k]; */
+/* 	    if(ind >= 0 && DM->rlead[k] == DM->proc_id) */
+/* 	      DBposte_block_receive(ind, CTRB_TAG, FC); */
+/* 	  } */
+/*       } */
+/*   } else */
+/*     { */
+      for(j=tlj;j<=brj;j++)
+	{
+	  for(k=M->cia[j];k<M->cia[j+1];k++)
+	    {
+	      ind = DM->cind[k];
+	      if(ind >= 0 && DM->clead[k] == DM->proc_id)
+		{
+		  /* fprintf(stderr, "Proc %d poste ctrb receive for block %d %d \n", DM->proc_id, M->cja[k], j); */
+		  DBposte_block_receive(ind, CTRB_TAG, FC);
+		}
+	    }
+	}
+  /*   } */
+}
+
+
+void DBposte_block_receive(int indnum, mpi_t tag, DBMatrixFactComm *FC)
+{
+  dim_t k;
+  DBBlockComm *bc;
+#ifdef DEBUG_M
+  assert(indnum >= 0);
+#endif
+  
+  PRINT("comm.c : DBposte_block_receive\n");
+
+  bc = FC->bcomtab+indnum;
+  /*fprintfv(5, stderr, "indnum %d rqnbr %d \n", indnum, bc->rqnbr);*/
+
+  if(bc->posted == 1) { /** The messages are already posted **/
+#ifdef DEBUG_M
+    fprintfd(stderr, "Proc %d : poste_block_receive : receive already posted\n", FC->proc_id);
+#endif
+    return;
+  }
+ 
+  
+  for(k=0;k<bc->rqnbr;k++)
+    {
+#ifdef DEBUG_M
+      assert(bc->buffsize>0);
+#endif
+     
+      bc->cbufftab[k] = (COEF *)malloc(sizeof(COEF)*(bc->buffsize));
+      
+      assert( bc->cbufftab[k] != NULL);
+      
+      /** Poste the Irecv for indice and coeff **/
+      /*fprintfv(5, stderr, "Proc %d : poste_block_receive COEF from proc %d\n", FC->proc_id, bc->proctab[k]);*/
+      if(MPI_Irecv( bc->cbufftab[k], CC(bc->buffsize), MPI_COEF_TYPE, bc->proctab[k], 
+		    tag, MPI_COMM_WORLD, bc->crqtab+k) != MPI_SUCCESS)
+	{
+	  fprintfd(stderr, "Proc %d : Error in poste_block_receive \n", FC->proc_id);
+	  MPI_Abort(MPI_COMM_WORLD, -1);
+	}
+      
+    }
+
+  bc->posted = 1;
+  
+}
+
+
+flag_t DBreceive_contrib(flag_t mode, VSolverMatrix* mat, int indnum, DBMatrixFactComm *FC)
+{
+  /*---------------------------------------/
+    / Receive contributions for submatrix mat/
+    / identified by indnum                   /
+    / and add them to these blocks           /
+    /---------------------------------------*/
+  dim_t i;
+  DBBlockComm *bc;
+
+  PRINT("comm.c : DBreceive_contrib\n");
+
+  bc = FC->bcomtab+indnum;
+
+  if(mode == ASYNCHRONOUS)
+    {
+      int flag;
+      MPI_Testall(bc->rqnbr, bc->irqtab, &flag, FC->status);
+      if(flag != TRUE)
+	return NOT_READY;
+      MPI_Testall(bc->rqnbr, bc->crqtab, &flag, FC->status);
+      if(flag != TRUE)
+	return NOT_READY;
+    }
+
+  /** RECEIVE COEFF **/
+  if(MPI_Waitall(bc->rqnbr, bc->crqtab, FC->status) 
+     != MPI_SUCCESS)
+    {
+      fprintfd(stderr, "Proc %d, Error in receive_ctrb for block indnum = %d \n", FC->proc_id, indnum);
+      MPI_Abort(MPI_COMM_WORLD, -1);
+    }
+
+  /** ADD CONTRIBUTIONS **/
+  //printf("ICI : add contrib\n");
+  DBadd_contrib(mat, bc);
+
+  for(i=0;i<bc->rqnbr;i++)
+    if(bc->cbufftab[i] != NULL)
+      {
+	free(bc->cbufftab[i]);
+	bc->cbufftab[i] = NULL;
+      }
+
+
+  bc->posted = 0;
+  return READY;
+}
+
+int DBreceive_gather(flag_t mode, VSolverMatrix* mat, int indnum, DBMatrixFactComm *FC)
+{
+  /*---------------------------------------/
+  / Receive contributions for submatrix mat/
+  / identified by indnum                   /
+  / and add them to these blocks           /
+  /---------------------------------------*/
+  dim_t i;
+  DBBlockComm *bc;
+
+  assert(0);
+
+  bc = FC->bcomtab+indnum;
+
+  if(mode == ASYNCHRONOUS)
+    {
+      int flag;
+/*       MPI_Testall(bc->rqnbr, bc->irqtab, &flag, FC->status); */
+/*       if(flag != TRUE) */
+/* 	return NOT_READY; */
+      MPI_Testall(bc->rqnbr, bc->crqtab, &flag, FC->status);
+      if(flag != TRUE)
+	return NOT_READY;
+    }
+
+/*   /\** RECEIVE INDICE **\/ */
+/*   /\*fprintfd(stderr, "Proc %d : wait receive IND from %d procs\n", FC->proc_id, bc->rqnbr);*\/ */
+/*   if(MPI_Waitall(bc->rqnbr, bc->irqtab, FC->status) */
+/*      != MPI_SUCCESS) */
+/*     { */
+/*       fprintfd(stderr, "Proc %d, Error in receive_ctrb for block indnum = %d \n", FC->proc_id, indnum); */
+/*       MPI_Abort(FC->mpicom, -1); */
+/*     } */
+ 
+  /** RECEIVE COEFF **/
+  /*fprintfd(stderr, "Proc %d : wait receive COEFF from %d procs\n", FC->proc_id, bc->rqnbr);*/
+  if(MPI_Waitall(bc->rqnbr, bc->crqtab, FC->status) 
+     != MPI_SUCCESS)
+    {
+      fprintfd(stderr, "Proc %d, Error in receive_ctrb for block indnum = %d \n", FC->proc_id, indnum);
+      MPI_Abort(FC->mpicom, -1);
+    }
+
+  /** ADD CONTRIBUTIONS **/
+  DBgather_contrib(mat, bc, FC->cstab/* , FC->tmpj, FC->tmpa, FC->jrev */);
+
+  /** Free the receive buffers **/
+/*   for(i=0;i<bc->rqnbr;i++) */
+/*     if(bc->ibufftab[i] != NULL) */
+/*       { */
+/* 	free(bc->ibufftab[i]); */
+/* 	bc->ibufftab[i] = NULL; */
+/* 	FC->bufmem -= sizeof(dim_t)*bc->buffsize; */
+/* 	FC->posted--; */
+/*       } */
+  for(i=0;i<bc->rqnbr;i++)
+    if(bc->cbufftab[i] != NULL)
+      {
+	free(bc->cbufftab[i]);
+	bc->cbufftab[i] = NULL;
+	FC->bufmem -= sizeof(COEF)*bc->buffsize;
+	FC->posted--;
+      }
+  
+  bc->posted = 0;
+  return READY;
+}
+
+
+flag_t DBreceive_matrix(flag_t mode, VSolverMatrix* mat, int indnum, DBMatrixFactComm *FC)
+{
+  /***** ALWAYS USE SYNCHRONOUS MODE BECAUSE THERE IS NO TAG ON
+	 THE MESSAGE ******/
+
+/*   PRINT("comm.c : DBreceive_matrix\n"); */
+
+  /*-------------------------------------------/
+    / Receive a SparRow matrix from the leader   /
+    / of this matrix                             /
+    /-------------------------------------------*/
+  DBBlockComm *bc;
+
+
+  bc = FC->bcomtab+indnum;
+
+#ifdef DEBUG_M
+/*   printf("%d\n", bc->rqnbr); */
+  assert(bc->rqnbr == 1);
+#endif
+
+  if(mode == ASYNCHRONOUS)
+    {
+      int flag;
+      MPI_Test(bc->irqtab, &flag, FC->status);
+      if(flag != TRUE)
+	return NOT_READY;
+      MPI_Test(bc->crqtab, &flag, FC->status);
+      if(flag != TRUE)
+	return NOT_READY;
+    }
+#ifdef TRACE_COM
+  fprintfd(stderr, "comm.c : Proc %d receive matrix \n", FC->proc_id);
+#endif
+
+  /** RECEIVE COEFF **/
+/*   printf("%p %p\n", bc->crqtab, FC->status); */
+  if(MPI_Wait(bc->crqtab, FC->status) 
+     != MPI_SUCCESS)
+    {
+      fprintfd(stderr, "comm.c : Proc %d, Error in receive_matrix for block indnum = %d \n", FC->proc_id, indnum);
+      MPI_Abort(MPI_COMM_WORLD, -1);
+    }
+#ifdef TRACE_COM
+  fprintfd(stderr, "comm.c --- DONE Proc %d receive matrix \n", FC->proc_id);
+#endif
+  /** UNPACK THE MATRIX IN mat **/
+
+  DBMatrix_MatricesCopy(mat, bc->cbufftab[0]);
+
+  /*   memset(mat->solvmtx->coeftab, 0, sizeof(mat->solvmtx->coefnbr)); */
+  /*   DBMatrix_MatricesAdd(mat, 1, &bc->cbufftab[0]); */
+
+  if(bc->cbufftab[0] != NULL)
+    {
+      free(bc->cbufftab[0]);
+      bc->cbufftab[0] = NULL;
+    }
+
+
+  return READY;
+}
+
+void DBsend_matrix(VSolverMatrix* mat, int indnum, mpi_t tag, DBMatrixFactComm *FC)
+{
+  dim_t k;
+  DBBlockComm *bc;
+  COEF *coeff_buffptr;
+  int coeff_size_packed;
+  
+  PRINT("comm.c : DBsend_matrix\n");
+
+  bc = FC->bcomtab+indnum;
+ 
+  coeff_buffptr = (COEF *)malloc(sizeof(COEF)*bc->buffsize);
+  assert(coeff_buffptr != NULL);
+
+  /** Pack contrib of block (i,j) into buffers **/
+  coeff_size_packed = 0;
+
+  if(DBpack_matrix(mat, coeff_buffptr, &coeff_size_packed, bc->buffsize)!=0)
+    {
+      fprintfd(stderr, "Error in pack_matrix: unsufficient memory allocated for buffer \n");
+      /*       fprintfv(5, stderr, "Number of nnz in matrix to pack = %ld Dim = %ld \n", (long)CSnnz(mat), (long)mat->n); */
+      fprintfd(stderr, "buffer size in NNZ = %ld, try a higher value for comm_memratio\n", (long int)bc->buffsize);
+      MPI_Abort(MPI_COMM_WORLD, -1);
+    } 
+  
+  /** The dest. of the message is the same set of processor 
+      than the one from which the local processor waits for message **/
+  for(k=0;k<bc->rqnbr;k++)
+    {
+#ifdef TRACE_COM
+      fprintfd(stderr, "comm.c : Proc %d send matrix to proc %d\n", FC->proc_id, bc->proctab[k]);
+#endif
+      MPI_Send(coeff_buffptr, CC(coeff_size_packed), MPI_COEF_TYPE, bc->proctab[k], tag, MPI_COMM_WORLD);
+#ifdef TRACE_COM
+      fprintfd(stderr, "comm.c : --- DONE Proc %d send matrix to proc %d\n", FC->proc_id, bc->proctab[k]);
+#endif
+    }
+ 
+  free(coeff_buffptr);
+
+}
+
+int reinitVSolverMatrix(VSolverMatrix* mat)
+{
+  SymbolMatrix* symbmtx = &mat->symbmtx;
+  SolverMatrix* solvmtx = mat->solvmtx;
+
+  /* hack , pb valeur solvmtx->coeftab dans la VSolverMatrix */
+  solvmtx->coefnbr = symbmtx->hdim[0]*(symbmtx->ccblktab[0].lcolnum-symbmtx->ccblktab[0].fcolnum+1);
+ 
+  memset(solvmtx->coeftab, 0, solvmtx->coefnbr*sizeof(COEF));
+}
+
+int DBpack_matrix(VSolverMatrix* mat, COEF *coeff_buff, int *coeff_size_packed, int limitsize)
+{
+  /*** PACK THE COEFFICIENTS  ***/
+
+  SymbolMatrix* symbmtx = &mat->symbmtx;
+  SolverMatrix* solvmtx = mat->solvmtx;
+
+  PRINT("comm.c : DBpack_matrix\n");
+
+#define OLD
+#ifndef OLD
+  /* en alloc=BLK, c super simple ! */
+
+  assert(symbmtx->cblknbr == 1);
+  assert(solvmtx->coefnbr == symbmtx->hdim[0]*(symbmtx->ccblktab[0].lcolnum-symbmtx->ccblktab[0].fcolnum+1));
+ 
+  memcpy(coeff_buff, solvmtx->coeftab, solvmtx->coefnbr*sizeof(COEF));
+  (*coeff_size_packed) = solvmtx->coeftab;
+
+#else
+
+  dim_t k,i;
+  int ind = 0;
+  COEF* bc;
+  blas_t stride, hdim;
+
+  for (k=0; k<symbmtx->cblknbr; k++) {
+    hdim = symbmtx->hdim[k];
+    if (hdim == 0) continue;
+
+    bc = solvmtx->coeftab + solvmtx->bloktab[symbmtx->bcblktab[k].fbloknum].coefind;
+    stride = symbmtx->stride[k];
+
+    if (ind + hdim*(symbmtx->ccblktab[k].lcolnum-symbmtx->ccblktab[k].fcolnum+1) > limitsize) 
+      return -1;
+   
+    for(i=symbmtx->ccblktab[k].fcolnum; i<=symbmtx->ccblktab[k].lcolnum; i++) {
+      memcpy(coeff_buff+ind, bc, hdim*sizeof(COEF));
+      bc  += stride;
+      ind += hdim;
+    }
+  }
+
+  (*coeff_size_packed) = ind;
+
+#endif
+
+  return 0;
+}
+
+int DBbuffer_size(int nnzB/* , int nbcoli, int nbcolj, REAL commratio */)
+{
+  PRINT("comm.c : DBbuffer_size\n");
+
+  return nnzB;
+}
+
+void DBMatrix_MatricesCopy(VSolverMatrix* a, COEF *coeff_buff) {
+/*   memset(a->solvmtx->coeftab, 0, sizeof(a->solvmtx->coefnbr));  */
+/*   DBMatrix_MatricesAdd(a, 1, &coeff_buff); */
+
+  dim_t k,i;
+  blas_t stride, hdim;
+  int ind=0;
+  COEF* bc;
+  SymbolMatrix* symbmtx = &a->symbmtx;
+  SolverMatrix* solvmtx = a->solvmtx;
+  
+  PRINT("comm.c : DBMatrix_MatricesCopy\n");
+
+#define OLD_2
+#ifndef OLD_2
+  /* en alloc=BLK, c super simple ! */
+
+  assert(0);
+
+  /* hack , pb valeur solvmtx->coeftab dans la VSolverMatrix */
+  assert(symbmtx->cblknbr == 1);
+  solvmtx->coefnbr = symbmtx->hdim[0]*(symbmtx->ccblktab[0].lcolnum-symbmtx->ccblktab[0].fcolnum+1);
+ 
+  memcpy(coeff_buff, solvmtx->coeftab, solvmtx->coefnbr*sizeof(COEF));
+  (*coeff_size_packed) = solvmtx->coeftab;
+
+#else
+
+  for (k=0; k<symbmtx->cblknbr; k++) {
+    {
+      hdim = symbmtx->hdim[k];
+      if (hdim == 0) continue;
+      
+      bc = solvmtx->coeftab + solvmtx->bloktab[symbmtx->bcblktab[k].fbloknum].coefind;
+      stride = symbmtx->stride[k];
+
+      /**  **/
+      for(i=symbmtx->ccblktab[k].fcolnum; i<=symbmtx->ccblktab[k].lcolnum; i++) {
+	memcpy(bc, coeff_buff+ind, hdim*sizeof(COEF));
+	bc  += stride;
+	ind += hdim;
+      }
+      
+    }
+  }
+
+#endif
+}
+  
+
+/* void VSolverMatrix_p(VSolverMatrix* a) { */
+/* /\*   COEF un=1.0; *\/ */
+/* /\*   int UN=1; *\/ */
+
+/*   int /\* im,  *\/i, /\* j, *\/ k; */
+/*   blas_t stride, hdim; */
+/*   int ind=0; */
+/*   COEF* bc; */
+/*   SymbolMatrix* symbmtx = &a->symbmtx; */
+/*   SolverMatrix* solvmtx = a->solvmtx; */
+
+/*   printfd("ADD %p %d\n", a, symbmtx->cblknbr); */
+  
+/*   for (k=0; k<symbmtx->cblknbr; k++) { */
+/*     { */
+/*       hdim = symbmtx->hdim[k]; */
+/*       if (hdim == 0) continue; */
+      
+/*       bc = solvmtx->coeftab + solvmtx->bloktab[symbmtx->bcblktab[k].fbloknum].coefind; */
+/*       stride = symbmtx->stride[k]; */
+      
+/*       printfd("ICI\n"); */
+
+/*       /\** Add row i of each contribution matrices **\/ */
+/*       for(i=symbmtx->ccblktab[k].fcolnum; i<=symbmtx->ccblktab[k].lcolnum; i++) { */
+/* /\* 	for(im=0;im<matnbr;im++) *\/ */
+/* /\* 	  { *\/ */
+/* 	    /\* BLAS_AXPY(hdim, un, coeff_buff[im]+ind, UN, bc, UN); *\/ */
+
+/* 	    printfd("ADD\n"); */
+/* /\* 	  } *\/ */
+/* 	bc  += stride; */
+/* 	ind += hdim; */
+/*       } */
+/*     } */
+/*   } */
+/*   exit(1); */
+/* } */
+
+void DBMatrix_MatricesAdd(VSolverMatrix* a, int matnbr, COEF **coeff_buff) {
+
+  COEF un=1.0;
+  int UN=1;
+
+  int im, i, /* j, */ k;
+  blas_t stride, hdim;
+  int ind=0;
+  COEF* bc;
+  SymbolMatrix* symbmtx = &a->symbmtx;
+  SolverMatrix* solvmtx = a->solvmtx;
+  
+  PRINT("comm.c : DBMatrix_MatricesAdd %d\n", matnbr);
+
+#define OLD_3
+#ifndef OLD_3
+  /* en alloc=BLK, c super simple ! */
+
+  assert(0);
+
+  /* hack , pb valeur solvmtx->coeftab dans la VSolverMatrix */
+  assert(symbmtx->cblknbr == 1);
+  solvmtx->coefnbr = symbmtx->hdim[0]*(symbmtx->ccblktab[0].lcolnum-symbmtx->ccblktab[0].fcolnum+1);
+ 
+  memcpy(coeff_buff, solvmtx->coeftab, solvmtx->coefnbr*sizeof(COEF));
+  (*coeff_size_packed) = solvmtx->coeftab;
+
+#else
+
+  for (k=0; k<symbmtx->cblknbr; k++) {
+    {
+      hdim = symbmtx->hdim[k];
+      if (hdim == 0) continue;
+      
+      bc = solvmtx->coeftab + solvmtx->bloktab[symbmtx->bcblktab[k].fbloknum].coefind;
+      stride = symbmtx->stride[k];
+      
+      /** Add row i of each contribution matrices **/
+      for(i=symbmtx->ccblktab[k].fcolnum; i<=symbmtx->ccblktab[k].lcolnum; i++) {
+	for(im=0;im<matnbr;im++)
+	  {
+	    /* printf("ICI %lf <- += %lf\n", bc[0], (coeff_buff[im]+ind)[0]); */
+	    BLAS_AXPY(hdim, un, coeff_buff[im]+ind, UN, bc, UN);
+	  }
+	bc  += stride;
+	ind += hdim;
+      }
+    }
+  }
+#endif
+}
+
+void DBMatrix_MatricesGather(VSolverMatrix* a, int matnbr, COEF **coeff_buff) {
+
+  COEF un=1.0;
+  int UN=1;
+
+  int im, i, /* j, */ k;
+  blas_t stride, hdim;
+  int ind=0;
+  COEF* bc;
+  SymbolMatrix* symbmtx = &a->symbmtx;
+  SolverMatrix* solvmtx = a->solvmtx;
+  
+  PRINT("comm.c : DBMatrix_MatricesGather %d\n", matnbr);
+
+#define OLD_4
+#ifndef OLD_4
+  /* en alloc=BLK, c super simple ! */
+
+  assert(0);
+
+  /* hack , pb valeur solvmtx->coeftab dans la VSolverMatrix */
+  assert(symbmtx->cblknbr == 1);
+  solvmtx->coefnbr = symbmtx->hdim[0]*(symbmtx->ccblktab[0].lcolnum-symbmtx->ccblktab[0].fcolnum+1);
+ 
+  memcpy(coeff_buff, solvmtx->coeftab, solvmtx->coefnbr*sizeof(COEF));
+  (*coeff_size_packed) = solvmtx->coeftab;
+
+#else
+
+  for (k=0; k<symbmtx->cblknbr; k++) {
+    {
+      hdim = symbmtx->hdim[k];
+      if (hdim == 0) continue;
+      
+      bc = solvmtx->coeftab + solvmtx->bloktab[symbmtx->bcblktab[k].fbloknum].coefind;
+      stride = symbmtx->stride[k];
+      
+      /** Add row i of each contribution matrices **/
+      for(i=symbmtx->ccblktab[k].fcolnum; i<=symbmtx->ccblktab[k].lcolnum; i++) {
+	for(im=0;im<matnbr;im++)
+	  {
+	    
+	    /* if several entryies */
+	    /* a(i,j) in the contribution have not the same value then the   */
+	    /* one with the maximum modulus is retained 	*/
+	    {
+	      int l;
+	      for(l=0; l<hdim; l++) {
+		COEF val = (coeff_buff[im]+ind)[l];
+		if (coefabs(bc[l]) <  coefabs(val))
+		  bc[l] = val;
+	      }
+   	    }
+
+	  }
+	bc  += stride;
+	ind += hdim;
+      }
+    }
+  }
+#endif
+}
+  
+void DBadd_contrib(VSolverMatrix* mat, DBBlockComm *bc)
+{
+
+  PRINT("comm.c : DBadd_contrib\n");
+      
+#ifdef DEBUG_M
+  assert(bc->rqnbr>0);
+#endif
+
+  /*   DBMatrix_MatricesCopy(mat, bc->cbufftab[0]); */
+  /*   VSolverMatrix_print(stdout, mat, DIAG); */
+  
+  /** Add the contributions in matrix mat **/
+  /*   DBMatrix_MatricesAdd(mat, bc->rqnbr, cstab/\* , tmpj, tmpa, jrev *\/); */
+  DBMatrix_MatricesAdd(mat, bc->rqnbr, bc->cbufftab);
+     
+}
+
+void DBgather_contrib(VSolverMatrix* mat, DBBlockComm *bc, VSolverMatrix* cstab /*, int *tmpj, COEF *tmpa, int *jrev */)
+{
+  dim_t k;
+/*   csptr t; */
+/*   if(mat->inarow != 0) */
+/*     CSunrealloc(mat); */
+
+  assert(0);
+  
+#ifdef DEBUG_M
+/*   assert(mat->inarow == 0); */
+  assert(bc->rqnbr>0);
+#endif
+
+/*   for(k=0;k<bc->rqnbr;k++) */
+/*     unpack_matrix(cstab+k, bc->ibufftab[k], bc->cbufftab[k]); */
+  
+  /** Add the contributions in matrix mat **/
+  DBMatrix_MatricesGather(mat, bc->rqnbr, bc->cbufftab/* cstab, tmpj, tmpa, jrev */);
+
+}
openSUSE Build Service is sponsored by