LIS_INT lis_input_hb_csr(LIS_MATRIX A, LIS_VECTOR b, LIS_VECTOR x, FILE *file)
{
  char      buf[BUFSIZE];
  char      title[128], key[128], mtx[64], dat[128];
  char      *p;
  char      MXTYPE_F,MXTYPE_S,MXTYPE_T;
  char      RHSTYP_F,RHSTYP_S,RHSTYP_T;
  LIS_INT        TOTCRD,PTRCRD,INDCRD,VALCRD,RHSCRD;
  LIS_INT        NROW,NCOL,NNZERO,NELTVL;
  LIS_INT        NRHS,NRHSIX;
  LIS_INT        iptr,iind,ival,irhs;
  LIS_INT        wptr,wind,wval,wrhs;
  LIS_INT        i,k,j,my_rank;
  LIS_INT        err;
  LIS_INT        n,is,ie;
  LIS_INT        *ptr, *index;
  LIS_INT        matrix_type;
  LIS_SCALAR    *value;
  LIS_MATRIX    B;

  #ifdef USE_MPI
    MPI_Comm_rank(A->comm,&my_rank);
  #else
    my_rank = 0;
  #endif

  matrix_type = A->matrix_type;

  /* Line 1 */
  if( fgets(buf, BUFSIZE, file) == NULL )
  {
    LIS_SETERR_FIO;
    return LIS_ERR_FILE_IO;
  }
  strncpy(title, buf    ,72); title[72] = '\0';
  strncpy(key  ,&buf[72], 8); key[8]    = '\0';
  printf("title: %s\n",title);
  printf("key  : %s\n",key);

  /* Line 2 */
  if( fgets(buf, BUFSIZE, file) == NULL )
  {
    LIS_SETERR_FIO;
    return LIS_ERR_FILE_IO;
  }
#ifdef _LONGLONG
  if( sscanf(buf, "%14lld%14lld%14lld%14lld%14lld", &TOTCRD, &PTRCRD, &INDCRD, &VALCRD, &RHSCRD) != 5 )
#else
  if( sscanf(buf, "%14d%14d%14d%14d%14d", &TOTCRD, &PTRCRD, &INDCRD, &VALCRD, &RHSCRD) != 5 )
#endif
  {
    LIS_SETERR_FIO;
    return LIS_ERR_FILE_IO;
  }
#ifdef _LONGLONG
  printf("%14lld%14lld%14lld%14lld%14lld\n",TOTCRD, PTRCRD, INDCRD, VALCRD, RHSCRD);
#else
  printf("%14d%14d%14d%14d%14d\n",TOTCRD, PTRCRD, INDCRD, VALCRD, RHSCRD);
#endif

  /* Line 3 */
  if( fgets(buf, BUFSIZE, file) == NULL )
  {
    LIS_SETERR_FIO;
    return LIS_ERR_FILE_IO;
  }
#ifdef _LONGLONG
  if( sscanf(buf, "%s %lld %lld %lld %lld", mtx, &NROW, &NCOL, &NNZERO, &NELTVL) != 5 )
#else
  if( sscanf(buf, "%s %d %d %d %d", mtx, &NROW, &NCOL, &NNZERO, &NELTVL) != 5 )
#endif
  {
    LIS_SETERR_FIO;
    return LIS_ERR_FILE_IO;
  }
  for(p=mtx;*p!='\0';p++)     *p = (char)tolower(*p);
  MXTYPE_F = mtx[0];
  MXTYPE_S = mtx[1];
  MXTYPE_T = mtx[2];
  if( mtx[0]!='r' )
  {
    LIS_SETERR(LIS_ERR_FILE_IO,"Not real\n");
    return LIS_ERR_FILE_IO;
  }
  /*
  if( mtx[1]!='u' )
  {
    LIS_SETERR(LIS_ERR_FILE_IO,"Not unsymmetric\n");
    return LIS_ERR_FILE_IO;
  }
  */
  if( mtx[2]!='a' )
  {
    LIS_SETERR(LIS_ERR_FILE_IO,"Not assembled\n");
    return LIS_ERR_FILE_IO;
  }
  if( NROW!=NCOL )
  {
    LIS_SETERR(LIS_ERR_FILE_IO,"matrix is not square\n");
    return LIS_ERR_FILE_IO;
  }
#ifdef _LONGLONG
  printf("%c%c%c %lld %lld %lld %lld\n",MXTYPE_F, MXTYPE_S, MXTYPE_T, NROW, NCOL, NNZERO, NELTVL);
#else
  printf("%c%c%c %d %d %d %d\n",MXTYPE_F, MXTYPE_S, MXTYPE_T, NROW, NCOL, NNZERO, NELTVL);
#endif

  /* Line 4 */
  if( fgets(buf, BUFSIZE, file) == NULL )
  {
    LIS_SETERR_FIO;
    return LIS_ERR_FILE_IO;
  }
  lis_input_hb_get_fmt( buf    ,16,&iptr,&wptr);
  lis_input_hb_get_fmt(&buf[16],16,&iind,&wind);
  lis_input_hb_get_fmt(&buf[32],20,&ival,&wval);
  lis_input_hb_get_fmt(&buf[52],20,&irhs,&wrhs);
#ifdef _LONGLONG
  printf("%lld %lld %lld %lld\n",iptr,iind,ival,irhs);
  printf("%lld %lld %lld %lld\n",wptr,wind,wval,wrhs);
#else
  printf("%d %d %d %d\n",iptr,iind,ival,irhs);
  printf("%d %d %d %d\n",wptr,wind,wval,wrhs);
#endif

  /* Line 5 */
  if( RHSCRD!=0 )
  {
    if( fgets(buf, BUFSIZE, file) == NULL )
    {
      LIS_SETERR_FIO;
      return LIS_ERR_FILE_IO;
    }
#ifdef _LONGLONG
    sscanf(buf, "%s %lld %lld", mtx, &NRHS, &NRHSIX);
#else
    sscanf(buf, "%s %d %d", mtx, &NRHS, &NRHSIX);
#endif
/*
#ifdef _LONGLONG
    if( sscanf(buf, "%s %lld %lld", mtx, &NRHS, &NRHSIX) != 3 )
#else
    if( sscanf(buf, "%s %d %d", mtx, &NRHS, &NRHSIX) != 3 )
#endif
    {
      LIS_SETERR_FIO;
      return LIS_ERR_FILE_IO;
    }
*/
    for(p=mtx;*p!='\0';p++)     *p = (char)tolower(*p);
    RHSTYP_F = mtx[0];
    RHSTYP_S = mtx[1];
    RHSTYP_T = mtx[2];
#ifdef _LONGLONG
    printf("%c%c%c %lld %lld\n",RHSTYP_F, RHSTYP_S, RHSTYP_T, NRHS, NRHSIX);
#else
    printf("%c%c%c %d %d\n",RHSTYP_F, RHSTYP_S, RHSTYP_T, NRHS, NRHSIX);
#endif
  }

  err = lis_matrix_set_size(A,0,NROW);
  if( err )
  {
    return err;
  }
  n = A->n;
  lis_matrix_get_range(A,&is,&ie);
  err = lis_matrix_malloc_csr(n,NNZERO,&ptr,&index,&value);
  if( err )
  {
    return err;
  }

  /* read data */
  k = 0;
  for( i=0; i<PTRCRD; i++ )
  {
    if( fgets(buf, BUFSIZE, file) == NULL )
    {
      LIS_SETERR_FIO;
      return LIS_ERR_FILE_IO;
    }
    p = buf;
    for(j=0;j<iptr&&k<n+1;j++)
    {
      strncpy(dat, p, wptr); dat[wptr] = '\0';
      ptr[k] = atoi(dat) - 1;
      p += wptr;
      k++;
    }
  }

  k = 0;
  for( i=0; i<INDCRD; i++ )
  {
    if( fgets(buf, BUFSIZE, file) == NULL )
    {
      LIS_SETERR_FIO;
      return LIS_ERR_FILE_IO;
    }
    p = buf;
    for(j=0;j<iind&&k<NNZERO;j++)
    {
      strncpy(dat, p, wind); dat[wind] = '\0';
      index[k] = atoi(dat) - 1;
      p += wind;
      k++;
    }
  }

  k = 0;
  for( i=0; i<VALCRD; i++ )
  {
    if( fgets(buf, BUFSIZE, file) == NULL )
    {
      LIS_SETERR_FIO;
      return LIS_ERR_FILE_IO;
    }
    p = buf;
    for(j=0;j<ival&&k<NNZERO;j++)
    {
      strncpy(dat, p, wval); dat[wval] = '\0';
      value[k] = atof(dat);
      p += wval;
      k++;
    }
  }

  if( RHSCRD>0 )
  {
    /*
    k = 0;
    for( i=0; i<RHSCRD; i++ )
    {
      if( fgets(buf, BUFSIZE, file) == NULL )
      {
        LIS_SETERR_FIO;
        return LIS_ERR_FILE_IO;
      }
      p = buf;
      for(j=0;j<ival&&k<NNZERO;j++)
      {
        strncpy(dat, p, wval); dat[wval] = '\0';
        value[k] = atof(dat);
        p += wval;
        printf("%e ",value[k]);
        k++;
      }
      printf("\n");
    }
    */
  }
  err = lis_matrix_set_csc(NNZERO,ptr,index,value,A);
  if( err )
  {
    return err;
  }
  err = lis_matrix_assemble(A);
  if( err ) return err;

  if( matrix_type!=LIS_MATRIX_CSC )
  {
    err = lis_matrix_duplicate(A,&B);
    if( err ) return err;
    lis_matrix_set_type(B,LIS_MATRIX_CSR);
    err = lis_matrix_convert_csc2csr(A,B);
    if( err ) return err;
    lis_matrix_storage_destroy(A);
    lis_matrix_DLU_destroy(A);
    lis_matrix_diag_destroy(A->WD);
    if( A->l2g_map ) lis_free( A->l2g_map );
    if( A->commtable ) lis_commtable_destroy( A->commtable );
    if( A->ranges ) lis_free( A->ranges );
    err = lis_matrix_copy_struct(B,A);
    if( err ) return err;
    lis_free(B);
  }

  return LIS_SUCCESS;
}
예제 #2
0
LIS_INT lis_matrix_convert_rco2csc(LIS_MATRIX Ain, LIS_MATRIX Aout)
{
	LIS_INT i,j,k,l,n,nnz,err;
	LIS_INT *ptr,*index,*iw;
	LIS_SCALAR *value;

	LIS_DEBUG_FUNC_IN;

	ptr     = NULL;
	index   = NULL;
	value   = NULL;
	iw      = NULL;
	n       = Ain->n;


	iw = (LIS_INT *)lis_malloc(n*sizeof(LIS_INT),"lis_matrix_convert_rco2csc::iw");
	if( iw==NULL )
	{
		LIS_SETERR_MEM(n*sizeof(LIS_INT));
		lis_free2(4,ptr,index,value,iw);
		return LIS_OUT_OF_MEMORY;
	}
	ptr = (LIS_INT *)lis_malloc((n+1)*sizeof(LIS_INT),"lis_matrix_convert_rco2csc::ptr");
	if( ptr==NULL )
	{
		LIS_SETERR_MEM((n+1)*sizeof(LIS_INT));
		lis_free2(4,ptr,index,value,iw);
		return LIS_OUT_OF_MEMORY;
	}

	for(i=0;i<n;i++) iw[i] = 0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<Ain->w_row[i];j++)
		{
			iw[Ain->w_index[i][j]]++;
		}
	}
	ptr[0] = 0;
	for(i=0;i<n;i++)
	{
		ptr[i+1] = ptr[i] + iw[i];
		iw[i]    = ptr[i];
	}
	nnz = ptr[n];

	index = (LIS_INT *)lis_malloc( nnz*sizeof(LIS_INT),"lis_matrix_convert_rco2csc::index" );
	if( index==NULL )
	{
		LIS_SETERR_MEM(nnz*sizeof(LIS_INT));
		lis_free2(4,ptr,index,value,iw);
		return LIS_OUT_OF_MEMORY;
	}
	value = (LIS_SCALAR *)lis_malloc( nnz*sizeof(LIS_SCALAR),"lis_matrix_convert_rco2csc::value" );
	if( value==NULL )
	{
		LIS_SETERR_MEM(nnz*sizeof(LIS_SCALAR));
		lis_free2(4,ptr,index,value,iw);
		return LIS_OUT_OF_MEMORY;
	}

	for(i=0;i<n;i++)
	{
		for(j=0;j<Ain->w_row[i];j++)
		{
			k        = Ain->w_index[i][j];
			l        = iw[k];
			value[l] = Ain->w_value[i][j];
			index[l] = i;
			iw[k]++;
		}
	}

	err = lis_matrix_set_csc(nnz,ptr,index,value,Aout);
	if( err )
	{
		lis_free2(4,ptr,index,value,iw);
		return err;
	}
	err = lis_matrix_assemble(Aout);
	if( err )
	{
		lis_matrix_storage_destroy(Aout);
		return err;
	}

	lis_free(iw);

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}