示例#1
0
int lis_vector_scatter(LIS_SCALAR value[], LIS_VECTOR v)
{
#ifdef USE_MPI
	int err,i,is,n,my_rank,nprocs,*sendcounts;

	err = lis_vector_check(v,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	my_rank = v->my_rank;
	nprocs  = v->nprocs;
	n       = v->n;
	is      = v->is;

	sendcounts = (int *)lis_malloc( (nprocs+1)*sizeof(int),"lis_vector_scatter::sendcounts" );
	for(i=0; i<nprocs; i++)
	{
	  sendcounts[i] = v->ranges[i+1] - v->ranges[i];
	}
	MPI_Scatterv(&value[0],sendcounts,v->ranges,MPI_DOUBLE,&value[is],n,MPI_DOUBLE,0,v->comm);
	#ifdef USE_VEC_COMP
	#pragma cdir nodep
	#endif
	#ifdef _OPENMP
	#pragma omp parallel for private(i)
	#endif
	for(i=0; i<n; i++)
	{
	  v->value[i] = value[i+is];
	}

	return LIS_SUCCESS;
#else
	int err,i,n;

	err = lis_vector_check(v,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	n = v->n;

	#ifdef USE_VEC_COMP
	#pragma cdir nodep
	#endif
	#ifdef _OPENMP
	#pragma omp parallel for private(i)
	#endif
	for(i=0; i<n; i++)
	{
	  v->value[i] = value[i];
	}

	return LIS_SUCCESS;
#endif
}
示例#2
0
文件: lis_vector.c 项目: florianl/lis
LIS_INT lis_vector_gather(LIS_VECTOR v, LIS_SCALAR value[])
{
#ifdef USE_MPI
	LIS_INT err,i,is,n,nprocs,*recvcounts;

	err = lis_vector_check(v,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	nprocs  = v->nprocs;
	n       = v->n;
	is      = v->is;

	#ifdef USE_VEC_COMP
	#pragma cdir nodep
	#endif
	#ifdef _OPENMP
	#pragma omp parallel for private(i)
	#endif
	for(i=0; i<n; i++)
	{
	  value[i+is] = v->value[i];
	}
	recvcounts = (LIS_INT *)lis_malloc( (nprocs+1)*sizeof(LIS_INT),"lis_vector_gather::recvcounts" );
	for(i=0; i<nprocs; i++)
	{
	  recvcounts[i] = v->ranges[i+1] - v->ranges[i];
	}
	MPI_Allgatherv(&value[is],n,MPI_DOUBLE,&value[0],recvcounts,v->ranges,MPI_DOUBLE,v->comm);

	return LIS_SUCCESS;
#else
	LIS_INT err,i,n;

	err = lis_vector_check(v,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	n = v->n;

	#ifdef USE_VEC_COMP
	#pragma cdir nodep
	#endif
	#ifdef _OPENMP
	#pragma omp parallel for private(i)
	#endif
	for(i=0; i<n; i++)
	{
	  value[i] = v->value[i];
	}

	return LIS_SUCCESS;
#endif
}
示例#3
0
int lis_vector_print(LIS_VECTOR x)
{
#ifdef USE_MPI
	int err,i,ii,is,n,k,nprocs,my_rank;

	err = lis_vector_check(x,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	nprocs  = x->nprocs;
	my_rank = x->my_rank;
	n       = x->n;
	is      = x->is;

	for(k=0;k<nprocs;k++)
	{
		if( k==my_rank )
		{
			for(i=0;i<n;i++)
			{
				ii = i+is;
				if( x->origin ) ii++;
				printf("%6d  %e\n",ii,x->value[i]);
			}
		}
		MPI_Barrier(x->comm);
	}
	return LIS_SUCCESS;
#else
	int err,i,ii,n;

	err = lis_vector_check(x,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	n = x->n;

	for(i=0; i<n; i++)
	{
		ii = i;
		if( x->origin ) ii++;
		if( x->precision==LIS_PRECISION_DEFAULT )
		{
			printf("%6d  %e\n",ii,x->value[i]);
		}
		else
		{
			printf("%6d  %e,%e\n",ii,x->value[i],x->value_lo[i]);
		}
	}

	return LIS_SUCCESS;
#endif
}
示例#4
0
文件: lis_vector.c 项目: florianl/lis
LIS_INT lis_vector_get_value(LIS_VECTOR v, LIS_INT i, LIS_SCALAR *value)
{
	LIS_INT err,is,ie;

	LIS_DEBUG_FUNC_IN;

	err = lis_vector_check(v,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	is  = v->is;
	ie  = v->ie;
	if( v->origin ) i--;
	if( i<is || i>=ie )
	{
		if( v->origin )
		{
			i++;
			is++;
			ie++;
		}
		LIS_SETERR3(LIS_ERR_ILL_ARG, "i(=%d) is less than %d or not less than %d\n",i,is,ie);
		return LIS_ERR_ILL_ARG;
	}

	*value = v->value[i-is];
	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
LIS_INT lis_output_vector(LIS_VECTOR v, LIS_INT format, char *filename)
{
  LIS_INT        err;

  LIS_DEBUG_FUNC_IN;

  #ifdef USE_MPI
    MPI_Barrier(v->comm);
  #endif
  err = lis_vector_check(v,LIS_VECTOR_CHECK_NULL);
  if( err ) return err;

  switch( format )
  {
  case LIS_FMT_PLAIN:
    err = lis_output_vector_plain(v,filename);
    break;
  case LIS_FMT_MM:
    err = lis_output_vector_mm(v,filename);
    break;
  case LIS_FMT_LIS:
    err = lis_output_vector_lis_ascii(v,filename);
    break;
  default:
    LIS_SETERR(LIS_ERR_ILL_ARG,"ill format option\n");
    return LIS_ERR_ILL_ARG;
    break;
  }

  LIS_DEBUG_FUNC_OUT;
  return err;
}
示例#6
0
文件: lis_vector.c 项目: florianl/lis
LIS_INT lis_vector_reuse(LIS_VECTOR *vec)
{
	LIS_INT	err,np,precision;

	LIS_DEBUG_FUNC_IN;

	err = lis_vector_check(*vec,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	np = (*vec)->np;
	if( (*vec)->status==LIS_VECTOR_NULL )
	{
		precision = ((LIS_VECTOR)*vec)->precision;
		if( !precision )
		{
			(*vec)->value = (LIS_SCALAR *)lis_malloc( np*sizeof(LIS_SCALAR),"lis_vector_reuse::vec->value" );
			if( NULL==(*vec)->value )
			{
				LIS_SETERR_MEM(np*sizeof(LIS_SCALAR));
				return LIS_OUT_OF_MEMORY;
			}
			(*vec)->is_copy = LIS_TRUE;
		}
		else
		{
			(*vec)->value = (LIS_SCALAR *)lis_malloc( (2*np+np%2)*sizeof(LIS_SCALAR),"lis_vector_reuse::vec->value" );
			if( NULL==(*vec)->value )
			{
				LIS_SETERR_MEM((2*np+np%2)*sizeof(LIS_SCALAR));
				return LIS_OUT_OF_MEMORY;
			}
			(*vec)->is_copy = LIS_TRUE;
			(*vec)->value_lo = (*vec)->value + np + np%2;
			(*vec)->work = (LIS_SCALAR *)lis_malloc( 32*sizeof(LIS_SCALAR),"lis_vector_reuse::vec->work" );
			if( NULL==(*vec)->work )
			{
				LIS_SETERR_MEM(32*sizeof(LIS_SCALAR));
				lis_vector_destroy(*vec);
				*vec = NULL;
				return LIS_OUT_OF_MEMORY;
			}
		}
	}

	(*vec)->status = LIS_VECTOR_ASSEMBLED;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
示例#7
0
文件: lis_vector.c 项目: florianl/lis
LIS_INT lis_vector_get_range(LIS_VECTOR v, LIS_INT *is, LIS_INT *ie)
{
	LIS_INT	err;

	LIS_DEBUG_FUNC_IN;

	err = lis_vector_check(v,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	*is = v->is;
	*ie = v->ie;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
示例#8
0
文件: lis_vector.c 项目: florianl/lis
LIS_INT lis_vector_get_size(LIS_VECTOR v, LIS_INT *local_n, LIS_INT *global_n)
{
	LIS_INT	err;

	LIS_DEBUG_FUNC_IN;

	err = lis_vector_check(v,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	*local_n  = v->n;
	*global_n = v->gn;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
示例#9
0
文件: lis_vector.c 项目: florianl/lis
LIS_INT lis_vector_unset(LIS_VECTOR vec)
{
	LIS_INT	err;

	LIS_DEBUG_FUNC_IN;

	err = lis_vector_check(vec,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	if( vec->is_copy ) lis_free(vec->value);
	vec->value  = NULL;
	vec->status = LIS_VECTOR_NULL;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
示例#10
0
文件: lis_vector.c 项目: florianl/lis
LIS_INT lis_vector_set(LIS_VECTOR vec, LIS_SCALAR *value)
{
	LIS_INT	err;

	LIS_DEBUG_FUNC_IN;

	err = lis_vector_check(vec,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	if( vec->is_destroy ) lis_free(vec->value);
	vec->value   = value;
	vec->is_copy = LIS_FALSE;

	vec->status = LIS_VECTOR_ASSEMBLING;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
示例#11
0
int lis_vector_get_values(LIS_VECTOR v, int start, int count, LIS_SCALAR value[])
{
	int err,n,gn,i,is,ie;

	LIS_DEBUG_FUNC_IN;

	err = lis_vector_check(v,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	n   = v->n;
	gn  = v->gn;
	is  = v->is;
	ie  = v->ie;
	if( v->origin ) start--;
	if( start<is || start>=ie )
	{
		if( v->origin )
		{
			start++;
			is++;
			ie++;
		}
		LIS_SETERR3(LIS_ERR_ILL_ARG, "start(=%d) is less than %d or larger than %d\n",start,is,ie);
		return LIS_ERR_ILL_ARG;
	}
	if( (start-is+count)>n )
	{
		LIS_SETERR3(LIS_ERR_ILL_ARG, "start(=%d) + count(=%d) exceeds the range of vector v(=%d).\n",start,count,ie);
		return LIS_ERR_ILL_ARG;
	}
	for(i=0;i<count;i++)
	{
		value[i] = v->value[start-is + i];
	}

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
示例#12
0
int lis_vector_get_range(LIS_VECTOR v, int *is, int *ie)
{
	int		err;

	LIS_DEBUG_FUNC_IN;

	err = lis_vector_check(v,LIS_VECTOR_CHECK_NULL);
	if( err ) return err;

	if( v->origin )
	{
		*is = v->is + 1;
		*ie = v->ie + 1;
	}
	else
	{
		*is = v->is;
		*ie = v->ie;
	}

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
示例#13
0
文件: lis_input.c 项目: huahbo/lis
LIS_INT lis_input(LIS_MATRIX A, LIS_VECTOR b, LIS_VECTOR x, char *filename)
{
	LIS_INT	err;
	LIS_INT	fileformat;
	char buf[256],banner[128];
	FILE *file;

	LIS_DEBUG_FUNC_IN;

	err = lis_matrix_check(A,LIS_MATRIX_CHECK_NULL);
	if( err ) return err;
	if( b!=NULL && x!=NULL )
	{
		err = lis_vector_check(b,LIS_VECTOR_CHECK_NULL);
		if( err ) return err;
		err = lis_vector_check(x,LIS_VECTOR_CHECK_NULL);
		if( err ) return err;
	}

	if( filename==NULL )
	{
		LIS_SETERR(LIS_ERR_ILL_ARG,"filname is NULL\n");
		return LIS_ERR_ILL_ARG;
	}
	file = fopen(filename, "r");
	if( file==NULL )
	{
		LIS_SETERR1(LIS_ERR_FILE_IO,"cannot open file %s\n",filename);
		return LIS_ERR_FILE_IO;
	}

	/* file format check */
	if( fgets(buf, 256, file) == NULL )
	{
		fclose(file);
		return LIS_ERR_FILE_IO;
	}
	sscanf(buf, "%s", banner);
	if( strncmp(banner, MM_BANNER, strlen(MM_BANNER)) == 0)
	{
		fileformat = LIS_FMT_MM;
	}
/*	else if( strncmp(banner, LISBanner, strlen(LISBanner)) == 0)
	{
		fileformat = LIS_FMT_LIS;
	}
	else if( strncmp(banner, ITBLBanner, strlen(ITBLBanner)) == 0)
	{
		fileformat = LIS_FMT_ITBL;
	}
*/
	else
	{
		fileformat = LIS_FMT_HB;
	}
	rewind(file);

/*
	if( fileformat==LIS_FMT_FREE )
	{
		fclose(file);
		err = lis_input_option(&option, filename);
		if( err ) return err;
		file = fopen(option.filename, "r");
		if( file==NULL )
		{
			LIS_SETERR1(LIS_ERR_FILE_IO,"cannot open file %s\n",filename);
			return LIS_ERR_FILE_IO;
		}
	}
*/

	switch( fileformat )
	{
	case LIS_FMT_MM:
		err = lis_input_mm(A,b,x,file);
		break;
	case LIS_FMT_HB:
		err = lis_input_hb(A,b,x,file);
		break;
/*
	case LIS_FMT_ITBL:
		err = lis_input_mmm(A,b,x,file,comm,matrix_type,bnr,bnc,row,col);
		break;
	case LIS_FMT_LIS:
		err = lis_input_lis(A,b,x,filename,file,comm,matrix_type,bnr,bnc,row,col);
		break;
	case LIS_FMT_FREE:
		err = lis_input_free(A,b,x,option,file,comm,matrix_type,bnr,bnc,row,col);
		break;
*/
	default:
		fclose(file);
		return err;
	}
	fclose(file);
#ifdef USE_MPI
	MPI_Barrier(A->comm);
#endif

	LIS_DEBUG_FUNC_OUT;
	return err;
}