コード例 #1
0
ファイル: lis_matrix_csr.c プロジェクト: florianl/lis
LIS_INT lis_matrix_malloc_csr(LIS_INT n, LIS_INT nnz, LIS_INT **ptr, LIS_INT **index, LIS_SCALAR **value)
{
	LIS_DEBUG_FUNC_IN;

	*ptr     = NULL;
	*index   = NULL;
	*value   = NULL;

	*ptr = (LIS_INT *)lis_malloc( (n+1)*sizeof(LIS_INT),"lis_matrix_malloc_csr::ptr" );
	if( *ptr==NULL )
	{
		LIS_SETERR_MEM((n+1)*sizeof(LIS_INT));
		lis_free2(3,*ptr,*index,*value);
		return LIS_OUT_OF_MEMORY;
	}
	*index = (LIS_INT *)lis_malloc( nnz*sizeof(LIS_INT),"lis_matrix_malloc_csr::index" );
	if( *index==NULL )
	{
		LIS_SETERR_MEM(nnz*sizeof(LIS_INT));
		lis_free2(3,*ptr,*index,*value);
		return LIS_OUT_OF_MEMORY;
	}
	*value = (LIS_SCALAR *)lis_malloc( nnz*sizeof(LIS_SCALAR),"lis_matrix_malloc_csr::value" );
	if( *value==NULL )
	{
		LIS_SETERR_MEM(nnz*sizeof(LIS_SCALAR));
		lis_free2(3,*ptr,*index,*value);
		return LIS_OUT_OF_MEMORY;
	}
	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #2
0
LIS_INT lis_matrix_ilu_setVR(LIS_MATRIX_ILU A)
{
	LIS_INT n;
	LIS_INT *bsz;
	LIS_SCALAR	***values;

	LIS_DEBUG_FUNC_IN;

	n = A->n;
	bsz = (LIS_INT *)lis_malloc( n*sizeof(LIS_INT),"lis_matrix_ilu_setVR::bsz" );
	if( bsz==NULL )
	{
		LIS_SETERR_MEM(n*sizeof(LIS_INT));
		return LIS_OUT_OF_MEMORY;
	}
	values = (LIS_SCALAR ***)lis_malloc( n*sizeof(LIS_SCALAR **),"lis_matrix_ilu_setVR::values" );
	if( values==NULL )
	{
		LIS_SETERR_MEM(n*sizeof(LIS_SCALAR *));
		return LIS_OUT_OF_MEMORY;
	}

	A->bsz    = bsz;
	A->values = values;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #3
0
LIS_INT lis_arg2args(LIS_INT argc, char *argv[], LIS_ARGS *args)
{
  char *p;
  LIS_INT  i,k1,k2;
  LIS_ARGS arg_top,arg;

  LIS_DEBUG_FUNC_IN;

  arg_top = (LIS_ARGS)lis_malloc(sizeof(struct LIS_ARGS_STRUCT),"lis_arg2args::arg_top");
  arg_top->next = arg_top;
  arg_top->prev = arg_top;
  arg_top->arg1 = NULL;
  arg_top->arg2 = NULL;

  i = 1;
  while( i<argc )
  {
    if( argv[i][0]=='-' && (i+1)<argc )
    {
      k1              = (LIS_INT)strlen(argv[i]);
      k2              = (LIS_INT)strlen(argv[i+1]);
      arg             = (LIS_ARGS)lis_malloc(sizeof(struct LIS_ARGS_STRUCT),"lis_arg2args::arg");
      arg->arg1       = (char *)lis_malloc((k1+1)*sizeof(char),"lis_arg2args::arg->arg1");
      arg->arg2       = (char *)lis_malloc((k2+1)*sizeof(char),"lis_arg2args::arg->arg2");
      arg->next       = arg_top;
      arg->prev       = arg_top->prev;
      arg->prev->next = arg;
      arg->next->prev = arg;
      strcpy(arg->arg1,argv[i]);
      strcpy(arg->arg2,argv[i+1]);
      p = arg->arg1;
      while( *p!='\0' )
      {
        *p = (char)tolower(*p);
        p++;
      }
      p = arg->arg2;
      while( *p!='\0' )
      {
        *p = (char)tolower(*p);
        p++;
      }
      i += 2;
    }
    else
    {
      i++;
    }
  }

  *args = arg_top;
  
  LIS_DEBUG_FUNC_OUT;
  return LIS_SUCCESS;
}
コード例 #4
0
LIS_INT lis_matrix_ilu_create(LIS_INT n, LIS_INT bs, LIS_MATRIX_ILU *A)
{
	LIS_INT i;
	LIS_INT *nnz;
	LIS_INT	**index;

	LIS_DEBUG_FUNC_IN;

	*A      = NULL;
	nnz     = NULL;
	index   = NULL;

	*A = (LIS_MATRIX_ILU)lis_malloc( sizeof(struct LIS_MATRIX_ILU_STRUCT),"lis_matrix_ilu_create::A" );
	if( NULL==*A )
	{
		LIS_SETERR_MEM(sizeof(struct LIS_MATRIX_ILU_STRUCT));
		return LIS_OUT_OF_MEMORY;
	}
	memset(*A,0,sizeof(struct LIS_MATRIX_ILU_STRUCT));

	nnz = (LIS_INT *)lis_malloc( n*sizeof(LIS_INT),"lis_matrix_ilu_create::nnz" );
	if( nnz==NULL )
	{
		LIS_SETERR_MEM(n*sizeof(LIS_INT));
		return LIS_OUT_OF_MEMORY;
	}
	index = (LIS_INT **)lis_malloc( n*sizeof(LIS_INT *),"lis_matrix_ilu_create::index" );
	if( index==NULL )
	{
		LIS_SETERR_MEM(n*sizeof(LIS_INT *));
		return LIS_OUT_OF_MEMORY;
	}

	#ifdef _OPENMP
	#pragma omp parallel for private(i)
	#endif
	for(i=0;i<n;i++)
	{
		nnz[i] = 0;
		index[i] = NULL;
	}

	(*A)->n      = n;
	(*A)->bs     = bs;
	(*A)->nnz    = nnz;
	(*A)->index  = index;
	(*A)->nnz_ma = NULL;
	(*A)->value  = NULL;
	(*A)->values = NULL;
	(*A)->bsz    = NULL;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #5
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;
}
コード例 #6
0
void lis_sort_jad(LIS_INT is, LIS_INT ie, LIS_INT maxnzr, LIS_INT *i1, LIS_INT *i2)
{
  LIS_INT i,j;
  LIS_INT *iw,*iw2;

  iw  = (LIS_INT *)lis_malloc((maxnzr+2)*sizeof(LIS_INT),"lis_sort_jad::iw");
  iw2 = (LIS_INT *)lis_malloc((maxnzr+2)*sizeof(LIS_INT),"lis_sort_jad::iw2");

  #ifdef USE_VEC_COMP
  #pragma cdir nodep
  #endif
  for(i=0;i<maxnzr+2;i++)
  {
    iw[i] = 0;
  }
  for(i=is;i<ie;i++)
  {
    iw[(maxnzr - i1[i])+1]++;
  }
  iw[0] = is;
  for(i=0;i<maxnzr+1;i++)
  {
    iw[i+1] += iw[i];
  }
  #ifdef USE_VEC_COMP
  #pragma cdir nodep
  #endif
  for(i=0;i<maxnzr+2;i++)
  {
    iw2[i] = iw[i];
  }

  for(i=is;i<ie;i++)
  {
    i2[iw[maxnzr - i1[i]]] = i;
    iw[maxnzr - i1[i]]++;
  }
  for(i=0;i<maxnzr+1;i++)
  {
    #ifdef USE_VEC_COMP
    #pragma cdir nodep
    #endif
    for(j=iw2[i];j<iw2[i+1];j++)
    {
      i1[j] = maxnzr - i;
    }
  }
  lis_free2(2,iw,iw2);
}
コード例 #7
0
ファイル: lis_sort.c プロジェクト: lukasa1993/HomCalculation
void lis_sort_jds(int is, int ie, int maxnzr, int *i1, int *i2)
{
	int i,j;
	int *iw,*iw2;

	iw  = (int *)lis_malloc((maxnzr+2)*sizeof(int),"lis_sort_jds::iw");
	iw2 = (int *)lis_malloc((maxnzr+2)*sizeof(int),"lis_sort_jds::iw2");

	#ifdef USE_VEC_COMP
	#pragma cdir nodep
	#endif
	for(i=0;i<maxnzr+2;i++)
	{
		iw[i] = 0;
	}
	for(i=is;i<ie;i++)
	{
		iw[(maxnzr - i1[i])+1]++;
	}
	iw[0] = is;
	for(i=0;i<maxnzr+1;i++)
	{
		iw[i+1] += iw[i];
	}
	#ifdef USE_VEC_COMP
	#pragma cdir nodep
	#endif
	for(i=0;i<maxnzr+2;i++)
	{
		iw2[i] = iw[i];
	}

	for(i=is;i<ie;i++)
	{
		i2[iw[maxnzr - i1[i]]] = i;
		iw[maxnzr - i1[i]]++;
	}
	for(i=0;i<maxnzr+1;i++)
	{
		#ifdef USE_VEC_COMP
		#pragma cdir nodep
		#endif
		for(j=iw2[i];j<iw2[i+1];j++)
		{
			i1[j] = maxnzr - i;
		}
	}
	lis_free2(2,iw,iw2);
}
コード例 #8
0
void lis_set_argv_f(LIS_INT *no, char *argv, LIS_INT *ierr, LIS_INT len)
{
  LIS_INT   i;
  char  *p;

  LIS_DEBUG_FUNC_IN;

  i = *no;
  f_argv_tmp[i] = (char *)lis_malloc((len+1)*sizeof(char),"lis_set_argv_f::f_argv_tmp");
  if( f_argv_tmp[i]==NULL )
  {
    LIS_SETERR_MEM((len+1)*sizeof(char));
    *ierr = LIS_OUT_OF_MEMORY;
    return;
  }
  memset(f_argv_tmp[i],0x20,(len+1)*sizeof(char));
  strncpy(f_argv_tmp[i],argv,len);
  p = &f_argv_tmp[i][len];
  if( len>0 )
  {
    while( *p==' ' ) p--;
    p++;
  }
  *p = '\0';
  *ierr = LIS_SUCCESS;

  LIS_DEBUG_FUNC_OUT;
  return;
}
コード例 #9
0
ファイル: lis_precon.c プロジェクト: iurisegtovich/lis
LIS_INT lis_precon_register(char *name, LIS_PRECON_CREATE_XXX pcreate, LIS_PSOLVE_XXX psolve, LIS_PSOLVET_XXX psolvet)
{

	LIS_DEBUG_FUNC_IN;

	if( precon_register_top==NULL )
	{
		precon_register_top = (LIS_PRECON_REGISTER *)lis_malloc(LIS_PRECON_REGISTER_MAX*sizeof(struct LIS_PRECON_REGISTER_STRUCT),"lis_precon_register::precon_register_top");
	}
	if( precon_register_type-LIS_PRECON_TYPE_USERDEF==LIS_PRECON_REGISTER_MAX )
	{
		LIS_SETERR(LIS_FAILS,"lis_precon_resister is max\n");
		return LIS_FAILS;
	}

	precon_register_top[precon_register_type-LIS_PRECON_TYPE_USERDEF].pcreate = pcreate;
	precon_register_top[precon_register_type-LIS_PRECON_TYPE_USERDEF].psolve  = psolve;
	precon_register_top[precon_register_type-LIS_PRECON_TYPE_USERDEF].psolvet = psolvet;
	precon_register_top[precon_register_type-LIS_PRECON_TYPE_USERDEF].precon_type = precon_register_type;
	strncpy(precon_register_top[precon_register_type-LIS_PRECON_TYPE_USERDEF].name,name,LIS_PRECONNAME_MAX);
	precon_register_top[precon_register_type-LIS_PRECON_TYPE_USERDEF].name[LIS_PRECONNAME_MAX] = '\0';
	precon_register_type++;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #10
0
ファイル: lis_precon_ads.c プロジェクト: florianl/lis
LIS_INT lis_precon_create_adds(LIS_SOLVER solver, LIS_PRECON precon)
{
	LIS_INT	i,j;
	LIS_INT	precon_type,worklen;
	LIS_INT	err;
	LIS_VECTOR *work;

	LIS_DEBUG_FUNC_IN;

	precon_type = solver->options[LIS_OPTIONS_PRECON];
	worklen     = 2;
	work        = (LIS_VECTOR *)lis_malloc( worklen*sizeof(LIS_VECTOR),"lis_precon_create_adds::work" );
	if( work==NULL )
	{
		LIS_SETERR_MEM(worklen*sizeof(LIS_VECTOR));
		return LIS_OUT_OF_MEMORY;
	}
	if( solver->precision==LIS_PRECISION_DEFAULT )
	{
		for(i=0;i<worklen;i++)
		{
			err = lis_vector_duplicate(solver->A,&work[i]);
			if( err ) break;
		}
	}
	else
	{
		for(i=0;i<worklen;i++)
		{
			err = lis_vector_duplicateex(LIS_PRECISION_QUAD,solver->A,&work[i]);
			if( err ) break;
		}
	}
	if( i<worklen )
	{
		for(j=0;j<i;j++) lis_vector_destroy(work[j]);
		lis_free(work);
		return err;
	}
	precon->worklen = worklen;
	precon->work    = work;

	err = lis_precon_create_xxx[precon_type](solver,precon);
	if( err )
	{
		lis_precon_destroy(precon);
		return err;
	}

    precon->A       = solver->A;
    precon->is_copy = LIS_FALSE;

	LIS_DEBUG_FUNC_OUT;
	return err;
}
コード例 #11
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;
}
コード例 #12
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
}
コード例 #13
0
LIS_INT lis_idrs_malloc_work(LIS_SOLVER solver)
{
	LIS_VECTOR	*work;
	LIS_INT			i,j,s,worklen,err;

	LIS_DEBUG_FUNC_IN;

	/*
	err = lis_matrix_convert(solver->A,&solver->At,LIS_MATRIX_CCS);
	if( err ) return err;
	*/

	s       = solver->options[LIS_OPTIONS_IDRS_RESTART];
	worklen = NWORK + 3*s;
	work    = (LIS_VECTOR *)lis_malloc(
worklen*sizeof(LIS_VECTOR),"lis_idrs_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=0;i<worklen;i++)
		{
			err = lis_vector_duplicate(solver->A,&work[i]);
			if( err ) break;
		}
	}
	else
	{
		for(i=0;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=0;j<i;j++) lis_vector_destroy(work[j]);
		lis_free(work);
		return err;
	}
	solver->worklen = worklen;
	solver->work    = work;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #14
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
}
コード例 #15
0
ファイル: lis_precision_vec.c プロジェクト: florianl/lis
LIS_INT lis_quad_malloc(LIS_QUAD_PTR *a, LIS_INT n)
{
	double *ah, *al;
	
	LIS_DEBUG_FUNC_IN;

	ah = (double *)lis_malloc(2*n*sizeof(double),"lis_quad_malloc::ah");
	al = &ah[n];
	a->hi = ah;
	a->lo = al;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #16
0
LIS_INT lis_matrix_malloc_dia(LIS_INT n, LIS_INT nnd, LIS_INT **index, LIS_SCALAR **value)
{
  LIS_DEBUG_FUNC_IN;

  *index   = NULL;
  *value   = NULL;

  *index = (LIS_INT *)lis_malloc( n*nnd*sizeof(LIS_INT),"lis_matrix_malloc_dia::index" );
  if( *index==NULL )
  {
    LIS_SETERR_MEM(n*nnd*sizeof(LIS_INT));
    lis_free2(2,*index,*value);
    return LIS_OUT_OF_MEMORY;
  }
  *value = (LIS_SCALAR *)lis_malloc( n*nnd*sizeof(LIS_SCALAR),"lis_matrix_malloc_dia::value" );
  if( *value==NULL )
  {
    LIS_SETERR_MEM(n*nnd*sizeof(LIS_SCALAR));
    lis_free2(2,*index,*value);
    return LIS_OUT_OF_MEMORY;
  }
  LIS_DEBUG_FUNC_OUT;
  return LIS_SUCCESS;
}
コード例 #17
0
int lis_vector_set_value(int flag, int i, LIS_SCALAR value, LIS_VECTOR v)
{
	int n,np,gn,is,ie;

	LIS_DEBUG_FUNC_IN;

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

	if(v->status==LIS_VECTOR_NULL)
	{
		v->value = (LIS_SCALAR *)lis_malloc( np*sizeof(LIS_SCALAR),"lis_vector_set_value::v->value" );
		if( NULL==v->value )
		{

			LIS_SETERR_MEM(np*sizeof(LIS_SCALAR));
			return LIS_OUT_OF_MEMORY;
		}
		v->is_copy = LIS_TRUE;
		v->status  = LIS_VECTOR_ASSEMBLING;
	}
	if(flag==LIS_INS_VALUE)
	{
		v->value[i-is] = value;
	}
	else
	{
		v->value[i-is] += value;
	}
	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #18
0
void lis_set_argv_begin_f(LIS_INT *argc, LIS_INT *ierr)
{
  LIS_DEBUG_FUNC_IN;

  f_argc_tmp = *argc+1;
  f_argv_tmp = (char **)lis_malloc(f_argc_tmp*sizeof(char *),"lis_set_argv_begin_f::f_argv_tmp");
  if( f_argv_tmp==NULL )
  {
    LIS_SETERR_MEM(f_argc_tmp*sizeof(char *));
    *ierr = LIS_OUT_OF_MEMORY;
    return;
  }
  *ierr = LIS_SUCCESS;

  LIS_DEBUG_FUNC_OUT;
  return;
}
コード例 #19
0
LIS_INT lis_solver_create(LIS_SOLVER *solver)
{
	LIS_DEBUG_FUNC_IN;

	*solver = NULL;

	*solver = (LIS_SOLVER)lis_malloc( sizeof(struct LIS_SOLVER_STRUCT),"lis_solver_create::solver" );
	if( NULL==*solver )
	{
		LIS_SETERR_MEM(sizeof(struct LIS_SOLVER_STRUCT));
		return LIS_OUT_OF_MEMORY;
	}
	lis_solver_init(*solver);

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #20
0
LIS_INT lis_input_hb(LIS_MATRIX A, LIS_VECTOR b, LIS_VECTOR x, FILE *file)
{
  LIS_INT      err;
  LIS_INT      matrix_type;
  LIS_MATRIX  B;

  LIS_DEBUG_FUNC_IN;

  matrix_type = A->matrix_type;

  err = lis_input_hb_csr(A,b,x,file);
  if( err ) return err;

  if( matrix_type!=LIS_MATRIX_CSR && matrix_type!=LIS_MATRIX_CSC )
  {
    err = lis_matrix_duplicate(A,&B);
    if( err ) return err;
    lis_matrix_set_type(B,matrix_type);
    err = lis_matrix_convert(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);
    if( A->matrix_type==LIS_MATRIX_JAD )
    {
      A->work = (LIS_SCALAR *)lis_malloc(A->n*sizeof(LIS_SCALAR),"lis_input_hb::A->work");
      if( A->work==NULL )
      {
        LIS_SETERR_MEM(A->n*sizeof(LIS_SCALAR));
        return LIS_OUT_OF_MEMORY;
      }
    }
  }


  LIS_DEBUG_FUNC_OUT;
  return LIS_SUCCESS;
}
コード例 #21
0
LIS_INT lis_esi_malloc_work(LIS_ESOLVER esolver)
{
	LIS_VECTOR	*work;
	LIS_INT			i,j,worklen,err,ss;

	LIS_DEBUG_FUNC_IN;

	ss = esolver->options[LIS_EOPTIONS_SUBSPACE];

	worklen = NWORK + ss;
	work    = (LIS_VECTOR *)lis_malloc( worklen*sizeof(LIS_VECTOR),"lis_esi_malloc_work::work" );
	if( work==NULL )
	{
		LIS_SETERR_MEM(worklen*sizeof(LIS_VECTOR));
		return LIS_ERR_OUT_OF_MEMORY;
	}
	if( esolver->eprecision==LIS_PRECISION_DEFAULT )
	{
		for(i=0;i<worklen;i++)
		{
			err = lis_vector_duplicate(esolver->A,&work[i]);
			if( err ) break;
		}
	}
	else
	{
		for(i=0;i<worklen;i++)
		{
			err = lis_vector_duplicateex(LIS_PRECISION_QUAD,esolver->A,&work[i]);
			if( err ) break;
		}
	}
	if( i<worklen )
	{
		for(j=0;j<i;j++) lis_vector_destroy(work[j]);
		lis_free(work);
		return err;
	}
	esolver->worklen = worklen;
	esolver->work    = work;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #22
0
LIS_INT lis_matrix_ilu_premalloc(LIS_INT nnzrow, LIS_MATRIX_ILU A)
{
	LIS_INT i,n;
	LIS_INT *nnz_ma;

	LIS_DEBUG_FUNC_IN;

	n = A->n;

	nnz_ma = (LIS_INT *)lis_malloc( n*sizeof(LIS_INT),"lis_matrix_ilu_premalloc::nnz_ma" );
	if( nnz_ma==NULL )
	{
		LIS_SETERR_MEM(n*sizeof(LIS_INT));
		return LIS_OUT_OF_MEMORY;
	}

	#ifdef _OPENMP
	#pragma omp parallel for private(i)
	#endif
	for(i=0;i<n;i++)
	{
		nnz_ma[i] = nnzrow;
		A->index[i] = (LIS_INT *)malloc( nnzrow*sizeof(LIS_INT) );
		A->value[i] = (LIS_SCALAR *)malloc( nnzrow*sizeof(LIS_SCALAR) );
	}
	for(i=0;i<n;i++)
	{
		if( A->index[i]==NULL )
		{
			LIS_SETERR_MEM(nnzrow*sizeof(LIS_INT));
			return LIS_OUT_OF_MEMORY;
		}
		if( A->value[i]==NULL )
		{
			LIS_SETERR_MEM(nnzrow*sizeof(LIS_SCALAR));
			return LIS_OUT_OF_MEMORY;
		}
	}

	A->nnz_ma   = nnz_ma;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #23
0
LIS_INT lis_cgs_malloc_work(LIS_SOLVER solver)
{
	LIS_VECTOR	*work;
	LIS_INT			i,j,worklen,err;

	LIS_DEBUG_FUNC_IN;

	worklen = NWORK;
	work    = (LIS_VECTOR *)lis_malloc( worklen*sizeof(LIS_VECTOR),"lis_cgs_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=0;i<worklen;i++)
		{
			err = lis_vector_duplicate(solver->A,&work[i]);
			if( err ) break;
		}
	}
	else
	{
		for(i=0;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=0;j<i;j++) lis_vector_destroy(work[j]);
		lis_free(work);
		return err;
	}
	solver->worklen = worklen;
	solver->work    = work;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #24
0
LIS_INT lis_matrix_ilu_setCR(LIS_MATRIX_ILU A)
{
	LIS_INT n;
	LIS_SCALAR **value;

	LIS_DEBUG_FUNC_IN;

	n = A->n;
	value = (LIS_SCALAR **)lis_malloc( n*sizeof(LIS_SCALAR *),"lis_matrix_ilu_setCR::value" );
	if( value==NULL )
	{
		LIS_SETERR_MEM(n*sizeof(LIS_SCALAR));
		return LIS_OUT_OF_MEMORY;
	}

	A->value = value;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #25
0
ファイル: lis_precon.c プロジェクト: iurisegtovich/lis
LIS_INT lis_precon_create(LIS_SOLVER solver, LIS_PRECON *precon)
{
	LIS_INT	err;
	LIS_INT	precon_type;

	LIS_DEBUG_FUNC_IN;

	*precon     = NULL;
	precon_type = solver->options[LIS_OPTIONS_PRECON];

	*precon = (LIS_PRECON)lis_malloc( sizeof(struct LIS_PRECON_STRUCT),"lis_precon_create::precon" );
	if( NULL==*precon )
	{
		LIS_SETERR_MEM(sizeof(struct LIS_PRECON_STRUCT));
		return LIS_OUT_OF_MEMORY;
	}
	lis_precon_init(*precon);
	(*precon)->precon_type = precon_type;

	if( precon_type>=LIS_PRECON_TYPE_USERDEF )
	{
		err = precon_register_top[precon_type-LIS_PRECON_TYPE_USERDEF].pcreate(solver,*precon);
	}
	else if( precon_type && solver->options[LIS_OPTIONS_ADDS] )
	{
		err = lis_precon_create_adds(solver,*precon);
		(*precon)->precon_type = LIS_PRECON_TYPE_ADDS;
	}
	else
	{
		err = lis_precon_create_xxx[precon_type](solver,*precon);
	}
	if( err )
	{
		lis_precon_destroy(*precon);
		return err;
	}

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #26
0
ファイル: lis_vector.c プロジェクト: florianl/lis
LIS_INT lis_vector_createex(LIS_INT precision, LIS_Comm comm, LIS_VECTOR *vec)
{

	LIS_DEBUG_FUNC_IN;

	*vec = NULL;

	*vec = (LIS_VECTOR)lis_malloc( sizeof(struct LIS_VECTOR_STRUCT),"lis_vector_createex::vec" );
	if( NULL==*vec )
	{
		LIS_SETERR_MEM(sizeof(struct LIS_VECTOR_STRUCT));
		return LIS_OUT_OF_MEMORY;
	}
	lis_vector_init(vec);
	
	(*vec)->status      = LIS_VECTOR_NULL;
	(*vec)->precision   = precision;
	(*vec)->comm        = comm;

	LIS_DEBUG_FUNC_OUT;
	return LIS_SUCCESS;
}
コード例 #27
0
ファイル: lis_solver_orthomin.c プロジェクト: anishida/lis
LIS_INT lis_orthomin_quad(LIS_SOLVER solver)
{
	LIS_Comm comm;  
	LIS_MATRIX A;
	LIS_PRECON M;
	LIS_VECTOR x;
	LIS_VECTOR r, rtld, *p, *ap, *aptld;
	LIS_QUAD *dotsave;
	LIS_QUAD_PTR alpha, beta, tmp, one;

	LIS_REAL bnrm2, nrm2, tol;
	LIS_INT iter,maxiter,output,conv;
	double time,ptime;

	LIS_INT m,l,lmax,ip,ip0;

	LIS_DEBUG_FUNC_IN;

	comm = LIS_COMM_WORLD;

	A       = solver->A;
	M       = solver->precon;
	x       = solver->x;
	maxiter = solver->options[LIS_OPTIONS_MAXITER];
	output  = solver->options[LIS_OPTIONS_OUTPUT];
	m       = solver->options[LIS_OPTIONS_RESTART];
	conv    = solver->options[LIS_OPTIONS_CONV_COND];
	ptime   = 0.0;

	LIS_QUAD_SCALAR_MALLOC(alpha,0,1);
	LIS_QUAD_SCALAR_MALLOC(beta,1,1);
	LIS_QUAD_SCALAR_MALLOC(tmp,3,1);
	LIS_QUAD_SCALAR_MALLOC(one,4,1);

	r       = solver->work[0];
	rtld    = solver->work[1];
	p       = &solver->work[2];
	ap      = &solver->work[  (m+1)+2];
	aptld   = &solver->work[2*(m+1)+2];

	one.hi[0] = 1.0;
	one.lo[0] = 0.0;

	dotsave = (LIS_QUAD *)lis_malloc( sizeof(LIS_QUAD) * (m+1),"lis_orthomin_quad::dotsave" );

	/* Initial Residual */
	if( lis_solver_get_initial_residual(solver,M,r,rtld,&bnrm2) )
	{
		LIS_DEBUG_FUNC_OUT;
		return LIS_SUCCESS;
	}
	tol     = solver->tol;

	
	iter=1;
	while( iter<=maxiter )
	{
		ip = (iter-1) % (m+1);

		/* p[ip] = rtld */
		lis_vector_copyex_mm(rtld,p[ip]);

		/* ap[ip]    = A*p[ip] */
		/* aptld[ip] = M^-1 ap[ip] */
		lis_matvec(A,p[ip],ap[ip]);
		time = lis_wtime();
		lis_psolve(solver, ap[ip], aptld[ip]);
		ptime += lis_wtime()-time;

		lmax = _min(m,iter-1);
		for(l=1;l<=lmax;l++)
		{
			ip0 = (ip+m+1-l) % (m+1);
			/* beta = -<Ar[ip],Ap[ip0]> / <Ap[ip0],Ap[ip0]> */
			lis_vector_dotex_mmm(aptld[ip],aptld[ip0],&beta);
			lis_quad_mul((LIS_QUAD *)beta.hi,(LIS_QUAD *)beta.hi,&dotsave[l-1]);
			lis_quad_minus((LIS_QUAD *)beta.hi);

			lis_vector_axpyex_mmm(beta,p[ip0]    ,p[ip]);
			lis_vector_axpyex_mmm(beta,ap[ip0]   ,ap[ip]);
			lis_vector_axpyex_mmm(beta,aptld[ip0],aptld[ip]);
		}
		for(l=m-1;l>0;l--)
		{
			dotsave[l] = dotsave[l-1];
		}

		lis_vector_dotex_mmm(aptld[ip],aptld[ip],&tmp);
		dotsave[0].hi = tmp.hi[0];
		dotsave[0].lo = tmp.lo[0];
		/* test breakdown */
		if( tmp.hi[0]==0.0 && tmp.lo[0]==0.0 )
		{
			solver->retcode   = LIS_BREAKDOWN;
			solver->iter      = iter;
			solver->resid     = nrm2;
			lis_free(dotsave);
			LIS_DEBUG_FUNC_OUT;
			return LIS_BREAKDOWN;
		}
		lis_quad_div(&dotsave[0],(LIS_QUAD *)one.hi,&dotsave[0]);

		/* alpha = <rtld,Aptld[ip]> */
		lis_vector_dotex_mmm(rtld,aptld[ip],&alpha);
		lis_quad_mul((LIS_QUAD *)alpha.hi,(LIS_QUAD *)alpha.hi,&dotsave[0]);

		lis_vector_axpyex_mmm( alpha,p[ip],x);
		lis_quad_minus((LIS_QUAD *)alpha.hi);
		lis_vector_axpyex_mmm(alpha,ap[ip],r);
		lis_vector_axpyex_mmm(alpha,aptld[ip],rtld);
		lis_quad_minus((LIS_QUAD *)alpha.hi);

		/* convergence check */
		lis_solver_get_residual[conv](r,solver,&nrm2);
		if( output )
		{
			if( output & LIS_PRINT_MEM ) solver->rhistory[iter] = nrm2;
			if( output & LIS_PRINT_OUT ) lis_print_rhistory(comm,iter,nrm2);
		}

		if( tol > nrm2 )
		{
			solver->retcode    = LIS_SUCCESS;
			solver->iter       = iter;
			solver->resid      = nrm2;
			solver->ptime      = ptime;
			lis_free(dotsave);
			LIS_DEBUG_FUNC_OUT;
			return LIS_SUCCESS;
		}

		iter++;
	}

	solver->retcode   = LIS_MAXITER;
	solver->iter      = iter;
	solver->resid     = nrm2;
	lis_free(dotsave);
	LIS_DEBUG_FUNC_OUT;
	return LIS_MAXITER;
}
コード例 #28
0
ファイル: lis_matvec_ell.c プロジェクト: florianl/lis
void lis_matvect_ell(LIS_MATRIX A, LIS_SCALAR x[], LIS_SCALAR y[])
{
	LIS_INT i,j,jj;
	LIS_INT n,np,maxnzr;
	#ifdef _OPENMP
		LIS_INT k,is,ie,nprocs;
		LIS_SCALAR t;
		LIS_SCALAR *w;
	#endif

	n      = A->n;
	np     = A->np;
	if( A->is_splited )
	{
		#ifdef USE_VEC_COMP
		#pragma cdir nodep
		#endif
		for(i=0; i<n; i++)
		{
			y[i] = A->D->value[i]*x[i];
		}
		for(j=0;j<A->L->maxnzr;j++)
		{
			jj = j*n;
			#ifdef USE_VEC_COMP
			#pragma cdir nodep
			#endif
			for(i=0;i<n;i++)
			{
				y[A->L->index[jj + i]] += A->L->value[jj + i] * x[i];
			}
		}
		for(j=0;j<A->U->maxnzr;j++)
		{
			jj = j*n;
			#ifdef USE_VEC_COMP
			#pragma cdir nodep
			#endif
			for(i=0;i<n;i++)
			{
				y[A->U->index[jj + i]] += A->U->value[jj + i] * x[i];
			}
		}
	}
	else
	{
		#ifdef _OPENMP
			maxnzr = A->maxnzr;
			nprocs = omp_get_max_threads();
			w = (LIS_SCALAR *)lis_malloc( nprocs*np*sizeof(LIS_SCALAR),"lis_matvect_ell::w" );
			#pragma omp parallel private(i,j,t,jj,k,is,ie)
			{
				k = omp_get_thread_num();
				LIS_GET_ISIE(k,nprocs,n,is,ie);
				#pragma omp for
				for(j=0;j<nprocs;j++)
				{
					memset( &w[j*np], 0, np*sizeof(LIS_SCALAR) );
				}
				for(j=0;j<maxnzr;j++)
				{
					jj = j*n;
					#ifdef USE_VEC_COMP
					#pragma cdir nodep
					#endif
					for(i=is;i<ie;i++)
					{
						w[k*np + A->index[jj + i]] += A->value[jj + i] * x[i];
					}
				}
				#pragma omp barrier
				#pragma omp for 
				#ifdef USE_VEC_COMP
				#pragma cdir nodep
				#endif
				for(i=0;i<np;i++)
				{
					t = 0.0;
					for(j=0;j<nprocs;j++)
					{
						t += w[j*np+i];
					}
					y[i] = t;
				}
			}
			lis_free(w);
		#else
			maxnzr = A->maxnzr;
			#ifdef USE_VEC_COMP
			#pragma cdir nodep
			#endif
			for(i=0; i<n; i++)
			{
				y[i] = 0.0;
			}
			for(j=0;j<maxnzr;j++)
			{
				jj = j*n;
				#ifdef USE_VEC_COMP
				#pragma cdir nodep
				#endif
				for(i=0;i<n;i++)
				{
					y[A->index[jj + i]] += A->value[jj + i] * x[i];
				}
			}
		#endif
	}
}
コード例 #29
0
LIS_INT lis_ranges_create(LIS_Comm comm, LIS_INT *local_n, LIS_INT *global_n, LIS_INT **ranges, LIS_INT *is, LIS_INT *ie, LIS_INT *nprocs, LIS_INT *my_rank)
{
  #ifdef USE_MPI
    LIS_INT    i;
  #endif
  LIS_INT    *tranges;
  int             int_nprocs,int_my_rank;

  LIS_DEBUG_FUNC_IN;

  #ifdef USE_MPI
    MPI_Comm_size(comm,&int_nprocs);
    MPI_Comm_rank(comm,&int_my_rank);

    *nprocs=int_nprocs;
    *my_rank=int_my_rank;

    tranges = (LIS_INT *)lis_malloc( (*nprocs+1)*sizeof(LIS_INT),"lis_ranges_create::tranges" );
    if( tranges==NULL )
    {
      LIS_SETERR_MEM((*nprocs+1)*sizeof(LIS_INT));
      return LIS_OUT_OF_MEMORY;
    }
  #else
    *nprocs  = 1;
    *my_rank = 0;
    tranges  = NULL;
  #endif

  #ifdef USE_MPI
    MPI_Allreduce(local_n,&i,1,LIS_MPI_INT,MPI_SUM,comm);
    if( i==0 )
  #else
    if( *local_n==0 )
  #endif
  {
    #ifdef USE_MPI
      LIS_GET_ISIE(*my_rank,*nprocs,*global_n,*is,*ie);
      *local_n = *ie-*is;
      MPI_Allgather(ie,1,LIS_MPI_INT,&tranges[1],1,LIS_MPI_INT,comm);
      tranges[0] = 0;
    #else
      *local_n = *global_n;
      *is      = 0;
      *ie      = *global_n;
    #endif
  }
  else
  {
    #ifdef USE_MPI
      MPI_Allgather(local_n,1,LIS_MPI_INT,&tranges[1],1,LIS_MPI_INT,comm);
      tranges[0] = 0;
      for(i=0;i<*nprocs;i++)
      {
        tranges[i+1] += tranges[i];
      }
      *global_n = tranges[*nprocs];
      *is       = tranges[*my_rank];
      *ie       = tranges[*my_rank+1];
    #else
      *global_n = *local_n;
      *is       = 0;
      *ie       = *local_n;
    #endif
  }
  *ranges = tranges;

  LIS_DEBUG_FUNC_OUT;
  return LIS_SUCCESS;
}
コード例 #30
0
LIS_INT lis_text2args(char *text, LIS_ARGS *args)
{
  char buf[1024];
  char *p,*s1,*s2;
  LIS_INT  k1,k2,f;
  LIS_ARGS arg_top,arg;

  LIS_DEBUG_FUNC_IN;

  arg_top = (LIS_ARGS)lis_malloc(sizeof(struct LIS_ARGS_STRUCT),"lis_text2args::arg_top");
  arg_top->next = arg_top;
  arg_top->prev = arg_top;
  arg_top->arg1 = NULL;
  arg_top->arg2 = NULL;

  strcpy(buf,text);
  p   = buf;
  f   = LIS_TRUE;
  while( *p!='\0' && f )
  {
    while( *p==' ' || *p=='\t' || *p=='\n' || *p=='\r' )
    {
      p++;
    }
    s1 = p;
    while( *p!=' ' && *p!='\t' && *p!='\n' && *p!='\r' && *p!='\0' )
    {
      *p = (char)tolower(*p);
      p++;
    }
    if( *p=='\0' ) break;
    *p++ = '\0';
    while( *p==' ' && *p=='\t' && *p=='\n' && *p=='\r' )
    {
      p++;
    }
    s2 = p;
    while( *p!=' ' && *p!='\t' && *p!='\n' && *p!='\r' && *p!='\0' )
    {
      *p = (char)tolower(*p);
      p++;
    }
    if( *p=='\0' ) f = LIS_FALSE;
    *p++ = '\0';
    k1 = (LIS_INT)strlen(s1);
    k2 = (LIS_INT)strlen(s2);
    if( k1>0 && k2>0 )
    {
      arg             = (LIS_ARGS)lis_malloc(sizeof(struct LIS_ARGS_STRUCT),"lis_text2args::arg");
      arg->arg1       = (char *)lis_malloc((k1+1)*sizeof(char),"lis_text2args::arg->arg1");
      arg->arg2       = (char *)lis_malloc((k2+1)*sizeof(char),"lis_text2args::arg->arg2");
      arg->next       = arg_top;
      arg->prev       = arg_top->prev;
      arg->prev->next = arg;
      arg->next->prev = arg;
      strcpy(arg->arg1,s1);
      strcpy(arg->arg2,s2);
    }
  }

  *args = arg_top;

  LIS_DEBUG_FUNC_OUT;
  return LIS_SUCCESS;
}