コード例 #1
0
ファイル: lis_esolver.c プロジェクト: florianl/lis
LIS_INT lis_esolver_get_iters(LIS_ESOLVER esolver, LIS_VECTOR v)
{
	LIS_INT i,ii,ss,n,gn,is,ie;

	LIS_DEBUG_FUNC_IN;

	if ( esolver->options[LIS_EOPTIONS_ESOLVER] != LIS_ESOLVER_SI && esolver->options[LIS_EOPTIONS_ESOLVER] != LIS_ESOLVER_LI && esolver->options[LIS_EOPTIONS_ESOLVER] != LIS_ESOLVER_AI )
	{
		LIS_SETERR1(LIS_ERR_ILL_ARG,"Parameter LIS_EOPTIONS_ESOLVER is %d (Set Subspace, Lanczos, or Arnoldi)\n", esolver->options[LIS_EOPTIONS_ESOLVER]);
		return LIS_ERR_ILL_ARG;
	}

	ss = esolver->options[LIS_EOPTIONS_SUBSPACE];
	lis_vector_set_size(v,0,ss);
	lis_vector_get_size(v,&n,&gn);
	lis_vector_get_range(v,&is,&ie);
	
	for(i=0;i<n;i++)
	{
	  ii=i;
	  if( v->origin ) ii++;
	  lis_vector_set_value(LIS_INS_VALUE,ii+is,esolver->iter[i+is],v);
	}

	v->intvalue = 1;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #2
0
ファイル: LisVector.cpp プロジェクト: OlafKolditz/ogs
LisVector::LisVector(std::size_t length, double* data)
{
    lis_vector_create(0, &_vec);
    lis_vector_set_size(_vec, 0, length);
    for (std::size_t i = 0; i < length; i++)
        lis_vector_set_value(LIS_INS_VALUE, i, data[i], _vec);
}
コード例 #3
0
ファイル: lis_solver_gmres.c プロジェクト: rwl/lis
LIS_INT lis_gmres_malloc_work(LIS_SOLVER solver)
{
	LIS_VECTOR *work;
	LIS_INT	i,j,restart,worklen,err;

	LIS_DEBUG_FUNC_IN;

	restart = solver->options[LIS_OPTIONS_RESTART];
	worklen = NWORK + (restart+1);
	work    = (LIS_VECTOR *)lis_malloc( worklen*sizeof(LIS_VECTOR),"lis_gmres_malloc_work::work" );
	if( work==NULL )
	{
		LIS_SETERR_MEM(worklen*sizeof(LIS_VECTOR));
		return LIS_ERR_OUT_OF_MEMORY;
	}
	if( solver->precision==LIS_PRECISION_DEFAULT )
	{
		for(i=1;i<worklen;i++)
		{
			err = lis_vector_duplicate(solver->A,&work[i]);
			if( err ) break;
		}
	}
	else
	{
		for(i=1;i<worklen;i++)
		{
			err = lis_vector_duplicateex(LIS_PRECISION_QUAD,solver->A,&work[i]);
			if( err ) break;
			memset(work[i]->value_lo,0,solver->A->np*sizeof(LIS_SCALAR));
		}
	}
	if( i<worklen )
	{
		for(j=1;j<i;j++) lis_vector_destroy(work[j]);
		lis_free(work);
		return err;
	}
	if( solver->precision==LIS_PRECISION_DEFAULT )
	{
		lis_vector_create(solver->A->comm,&work[0]);
	}
	else
	{
		lis_vector_createex(LIS_PRECISION_QUAD,solver->A->comm,&work[0]);
	}
	lis_vector_set_size(work[0],restart+1,0);
	solver->worklen = worklen;
	solver->work    = work;


	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #4
0
ファイル: lis_input.c プロジェクト: huahbo/lis
LIS_INT lis_input_vector_plain(LIS_VECTOR v, FILE *file)
{
	char buf[BUFSIZE];
	LIS_INT i;
	LIS_INT	err;
	LIS_INT	n,is,ie;
	LIS_SCALAR val;


	/* check size */
	n = 0;
	do
	{
#ifdef _LONG__DOUBLE
		err = fscanf(file, "%Lg", &val);
#else
		err = fscanf(file, "%lg", &val);
#endif		
		if( err==1 ) n++;
	}while( err==1 );
	rewind(file);

	/* read data */
	err = lis_vector_set_size(v,0,n);
	if( err )
	{
		return err;
	}
	lis_vector_get_range(v,&is,&ie);

	for(i=0;i<n;i++)
	{
		if( fgets(buf, BUFSIZE, file) == NULL )
		{
			LIS_SETERR_FIO;
			return LIS_ERR_FILE_IO;
		}
		if( i>=is && i<ie )
		{
#ifdef _LONG__DOUBLE
			if( sscanf(buf, "%Lg", &val) != 1 )
#else
			if( sscanf(buf, "%lg", &val) != 1 )
#endif
			{
				LIS_SETERR_FIO;
				return LIS_ERR_FILE_IO;
			}
			v->value[i-is] = val;
		}
	}
	return LIS_SUCCESS;
}
コード例 #5
0
ファイル: lisf_vector.c プロジェクト: anishida/lis
void lis_vector_set_size_f(LIS_VECTOR_F *vec, LIS_INT *local_n, LIS_INT *global_n, LIS_INT *ierr)
{
	LIS_VECTOR v;

	LIS_DEBUG_FUNC_IN;

	*ierr = lis_vector_set_size((LIS_VECTOR)LIS_V2P(vec),*local_n,*global_n);
	if( *ierr )	return;

	LIS_DEBUG_FUNC_OUT;
	return;
}
コード例 #6
0
/*! \fn allocate memory for linear system solver Lis
 *
 */
int
allocateLisData(int n_row, int n_col, int nz, void** voiddata)
{
    DATA_LIS* data = (DATA_LIS*) malloc(sizeof(DATA_LIS));
    char buffer[128];
    assertStreamPrint(NULL, 0 != data, "Could not allocate data for linear solver Lis.");

    data->n_col = n_col;
    data->n_row = n_row;
    data->nnz = nz;

    lis_vector_create(LIS_COMM_WORLD, &(data->b));
    lis_vector_set_size(data->b, data->n_row, 0);

    lis_vector_create(LIS_COMM_WORLD, &(data->x));
    lis_vector_set_size(data->x, data->n_row, 0);

    lis_matrix_create(LIS_COMM_WORLD, &(data->A));
    lis_matrix_set_size(data->A, data->n_row, 0);
    lis_matrix_set_type(data->A, LIS_MATRIX_CSR);

    lis_solver_create(&(data->solver));

    lis_solver_set_option("-print none", data->solver);
    sprintf(buffer,"-maxiter %d", n_row*100);
    lis_solver_set_option(buffer, data->solver);
    lis_solver_set_option("-scale none", data->solver);
    lis_solver_set_option("-p none", data->solver);
    lis_solver_set_option("-initx_zeros 0", data->solver);
    lis_solver_set_option("-tol 1.0e-12", data->solver);

    data->work = (double*) calloc(n_col,sizeof(double));

    rt_ext_tp_tick(&(data->timeClock));


    *voiddata = (void*)data;
    return 0;
}
コード例 #7
0
/// initialize this object
void LisMPIDiscreteVector::initialize(MPI_Comm comm, int n_local, int n_global, size_t n_ghost)
{
    MPI_Comm_rank(comm, &_local_id);
    int err = lis_vector_create(comm, &_v);
    err = lis_vector_set_size(_v, n_local, n_global);
    err = lis_vector_get_size(_v, &_local_n, &_global_n);
    err = lis_vector_get_range(_v, &_i_start, &_i_end);
    CHKERR(err);
    DiscreteVector::resize(_local_n+n_ghost);
    _temp_all_x.resize(_global_n); //allocate temporary buffer
    _list_index.resize(_local_n);
    for (int i=0; i<_local_n; i++)
        _list_index[i] = _i_start + i;

    std::cout << _local_id << ": start=" << _i_start << ", end=" << _i_end << std::endl;
}
コード例 #8
0
ファイル: lis_input.c プロジェクト: huahbo/lis
LIS_INT lis_input_vector_lis_ascii(LIS_VECTOR v, FILE *file)
{
	LIS_INT	n,nprocs,my_rank,pe;
	LIS_INT	err;
	LIS_INT	ibuf[10];
	char cbuf[BUFSIZE];
	char c;
	LIS_Comm comm;

	comm = v->comm;
#ifdef USE_MPI
	MPI_Comm_size(comm,&nprocs);
	MPI_Comm_rank(comm,&my_rank);
#else
	nprocs  = 1;
	my_rank = 0;
#endif

	if( fgets(cbuf, BUFSIZE, file) == NULL )
	{
		LIS_SETERR_FIO;
		return LIS_ERR_FILE_IO;
	}
#ifdef _LONGLONG
	if( sscanf(cbuf, "%lld",&ibuf[0])!=1 )
#else
	if( sscanf(cbuf, "%d",&ibuf[0])!=1 )
#endif
	{
		LIS_SETERR_FIO;
		return LIS_ERR_FILE_IO;
	}
	if( nprocs!=ibuf[0] )
	{
#ifdef _LONGLONG
		LIS_SETERR2(LIS_ERR_FILE_IO,"The number of PE=(%lld) is different (in file PE=%lld)\n",nprocs,ibuf[0]);
#else
		LIS_SETERR2(LIS_ERR_FILE_IO,"The number of PE=(%d) is different (in file PE=%d)\n",nprocs,ibuf[0]);
#endif
		return LIS_ERR_FILE_IO;
	}
	pe=-1;
	do
	{
		if( fgets(cbuf, BUFSIZE, file) == NULL )
		{
			LIS_SETERR_FIO;
			return LIS_ERR_FILE_IO;
		}
		if( cbuf[0]=='#' )
		{
#ifdef _LONGLONG
			if( sscanf(cbuf, "%c %lld %lld",&c, &pe, &ibuf[1])!=3 )
#else
			if( sscanf(cbuf, "%c %d %d",&c, &pe, &ibuf[1])!=3 )
#endif
			{
				LIS_SETERR_FIO;
				return LIS_ERR_FILE_IO;
			}
		}
	}while(pe!=my_rank);

	n   = ibuf[1];
	err = lis_vector_set_size(v,0,n);
	if( err )
	{
		return err;
	}

	err = lis_fscan_scalar(n,file,v->value);
	if( err )
	{
		LIS_SETERR_FIO;
		return LIS_ERR_FILE_IO;
	}

	return LIS_SUCCESS;
}
コード例 #9
0
ファイル: lis_input.c プロジェクト: huahbo/lis
LIS_INT lis_input_vector_mm(LIS_VECTOR v, FILE *file)
{
	char buf[BUFSIZE];
	char banner[64], mtx[64], fmt[64], dtype[64], dstruct[64];
	char *p;
	LIS_INT i;
	LIS_INT	err;
	LIS_INT	n,is,ie;
	LIS_INT	idx;
	LIS_SCALAR val;


	/* check banner */
	if( fgets(buf, BUFSIZE, file) == NULL )
	{
		LIS_SETERR_FIO;
		return LIS_ERR_FILE_IO;
	}
	sscanf(buf, "%s %s %s %s %s", banner, mtx, fmt, dtype, dstruct);

	for(p=mtx;*p!='\0';p++)     *p = (char)tolower(*p);
	for(p=fmt;*p!='\0';p++)     *p = (char)tolower(*p);
	for(p=dtype;*p!='\0';p++)   *p = (char)tolower(*p);
	for(p=dstruct;*p!='\0';p++) *p = (char)tolower(*p);

	if( strncmp(banner, MM_BANNER, strlen(MM_BANNER))!=0 || strncmp(mtx, MM_VEC, strlen(MM_VEC))!=0 )
	{
		LIS_SETERR(LIS_ERR_FILE_IO,"Not Matrix Market banner\n");
		return LIS_ERR_FILE_IO;
	}
	if( strncmp(fmt, MM_FMT, strlen(MM_FMT))!=0 )
	{
		LIS_SETERR(LIS_ERR_FILE_IO,"Not Coodinate format\n");
		return LIS_ERR_FILE_IO;
	}
	if( strncmp(dtype, MM_TYPE_REAL, strlen(MM_TYPE_REAL))!=0 )
	{
		LIS_SETERR(LIS_ERR_FILE_IO,"Not real\n");
		return LIS_ERR_FILE_IO;
	}
	if( strncmp(dstruct, MM_TYPE_GENERAL, strlen(MM_TYPE_GENERAL))!=0 )
	{
		LIS_SETERR(LIS_ERR_FILE_IO,"Not general\n");
		return LIS_ERR_FILE_IO;
	}

	/* check size */		
	do
	{
		if( fgets(buf, BUFSIZE, file) == NULL )
		{
			LIS_SETERR_FIO;
			return LIS_ERR_FILE_IO;
		}
	}while( buf[0]=='%' );
#ifdef _LONGLONG
	if( sscanf(buf, "%lld", &n) != 1 )
#else
	if( sscanf(buf, "%d", &n) != 1 )
#endif
	{
		LIS_SETERR_FIO;
		return LIS_ERR_FILE_IO;
	}

	/* read data */
	err = lis_vector_set_size(v,0,n);
	if( err )
	{
		return err;
	}
	lis_vector_get_range(v,&is,&ie);

	for(i=0;i<n;i++)
	{
		if( fgets(buf, BUFSIZE, file) == NULL )
		{
			LIS_SETERR_FIO;
			return LIS_ERR_FILE_IO;
		}
#ifdef _LONGLONG
#ifdef _LONG__DOUBLE
		if( sscanf(buf, "%lld %Lg", &idx, &val) != 2 )
#else
		if( sscanf(buf, "%lld %lg", &idx, &val) != 2 )
#endif
#else
#ifdef _LONG__DOUBLE
		if( sscanf(buf, "%d %Lg", &idx, &val) != 2 )
#else
		if( sscanf(buf, "%d %lg", &idx, &val) != 2 )
#endif
#endif
		{
			LIS_SETERR_FIO;
			return LIS_ERR_FILE_IO;
		}
		idx--;
		if( idx>=is && idx<ie )
		{
			v->value[idx-is] = val;
		}
	}
	return LIS_SUCCESS;
}
コード例 #10
0
ファイル: LisVector.cpp プロジェクト: OlafKolditz/ogs
LisVector::LisVector(std::size_t length)
{
    lis_vector_create(0, &_vec);
    lis_vector_set_size(_vec, 0, length);
}
コード例 #11
0
ファイル: lis_input_mm.c プロジェクト: huahbo/lis
LIS_INT lis_input_mm_vec(LIS_MATRIX A, LIS_VECTOR b, LIS_VECTOR x, FILE *file, LIS_INT isb, LIS_INT isx, LIS_INT isbin)
{
	char buf[BUFSIZE];
	LIS_INT i;
	LIS_INT	mode;
	LIS_INT	gn,n,is,ie;
	LIS_INT	idx;
	LIS_SCALAR val;
	LIS_MM_VECFMT vecfmt;

	LIS_DEBUG_FUNC_IN;

	if( isb==0 && isx==0 ) return LIS_SUCCESS;

	gn  = A->gn;
	n   = A->n;
	is  = A->is;
	ie  = A->ie;
	mode = 1;
	mode = *(char *)&mode;
	if( mode!=(isbin-1) )
	{
		mode = LIS_TRUE;			
	}
	else
	{
		mode = LIS_FALSE;
	}
	if( isb )
	{
		lis_vector_set_size(b,n,0);
		for(i=0;i<gn;i++)
		{
			if( isbin )
			{
				if( fread(&vecfmt, sizeof(vecfmt), 1, file)!=1 )
				{
					LIS_SETERR_FIO;
					return LIS_ERR_FILE_IO;
				}
				idx = vecfmt.i;
				val = vecfmt.value;
				if( mode )
				{
					lis_bswap_int(1,&idx);
					lis_bswap_scalar(1,&val);
				}
			}
			else
			{
				if( fgets(buf, BUFSIZE, file) == NULL )
				{
					LIS_SETERR_FIO;
					return LIS_ERR_FILE_IO;
				}
#ifdef _LONGLONG
#ifdef _LONG__DOUBLE
				if( sscanf(buf, "%lld %Lg", &idx, &val) != 2 )
#else
				if( sscanf(buf, "%lld %lg", &idx, &val) != 2 )
#endif
#else
#ifdef _LONG__DOUBLE
				if( sscanf(buf, "%d %Lg", &idx, &val) != 2 )
#else
				if( sscanf(buf, "%d %lg", &idx, &val) != 2 )
#endif
#endif
				{
					LIS_SETERR_FIO;
					return LIS_ERR_FILE_IO;
				}
			}
			idx--;
			if( idx>=is && idx<ie )
			{
				b->value[idx-is] = val;
			}
		}
	}
	if( isx )
	{
		lis_vector_set_size(x,n,0);
		for(i=0;i<gn;i++)
		{
			if( isbin )
			{
				if( fread(&vecfmt, sizeof(vecfmt), 1, file)!=1 )
				{
					LIS_SETERR_FIO;
					return LIS_ERR_FILE_IO;
				}
				idx = vecfmt.i;
				val = vecfmt.value;
				if( mode )
				{
					lis_bswap_int(1,&idx);
					lis_bswap_scalar(1,&val);
				}
			}
			else
			{
				if( fgets(buf, BUFSIZE, file) == NULL )
				{
					LIS_SETERR_FIO;
					return LIS_ERR_FILE_IO;
				}
#ifdef _LONGLONG
#ifdef _LONG__DOUBLE
				if( sscanf(buf, "%lld %Lg", &idx, &val) != 2 )
#else
				if( sscanf(buf, "%lld %lg", &idx, &val) != 2 )
#endif
#else
#ifdef _LONG__DOUBLE
				if( sscanf(buf, "%d %Lg", &idx, &val) != 2 )
#else
				if( sscanf(buf, "%d %lg", &idx, &val) != 2 )
#endif
#endif
				{
					LIS_SETERR_FIO;
					return LIS_ERR_FILE_IO;
				}
			}
			idx--;
			if( idx>=is && idx<ie )
			{
				x->value[idx-is] = val;
			}
		}
	}

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}