Beispiel #1
0
static int pmatfactor(void*MM, int *flag){
  plapackM* ctx=(plapackM*)MM;
  int info,dummy;
  double ddxerror;
  DSDPFunctionBegin;
  wallclock(&ctx->t1);
  info=PLA_Obj_set_to_one(ctx->wVec);DSDPCHKERR(info);
  info=PLA_Obj_set_to_zero(ctx->vVec);DSDPCHKERR(info);
  info=PLA_Symv( PLA_LOWER_TRIANGULAR, ctx->one, ctx->AMat, ctx->wVec, ctx->zero, ctx->vVec ); DSDPCHKERR(info);
  *flag=0;
  info = PLA_Chol(PLA_LOWER_TRIANGULAR, ctx->AMat); DSDPCHKERR(info);
  if (info!=0) {
    *flag=1;
    printf("PLAPACK WARNING: Non positive-definite Matrix M : Row: %d\n",info);
  }
  info = PLA_Trsv(PLA_LOWER_TRIANGULAR, PLA_NO_TRANSPOSE, PLA_NONUNIT_DIAG, ctx->AMat, ctx->vVec);DSDPCHKERR(info);
  info = PLA_Trsv(PLA_LOWER_TRIANGULAR, PLA_TRANSPOSE, PLA_NONUNIT_DIAG, ctx->AMat,ctx->vVec); DSDPCHKERR(info);  

  info=PLA_Obj_set_to_minus_one(ctx->wVec);DSDPCHKERR(info); 
  info=PLA_Axpy( ctx->one, ctx->vVec, ctx->wVec );DSDPCHKERR(info); 
  info=PLA_Nrm2( ctx->wVec, ctx->dxerror );DSDPCHKERR(info); 
  PLA_Obj_get_local_contents( ctx->dxerror, PLA_NO_TRANS, &dummy, &dummy,
			      &ddxerror, 1, 1 );
  if (ddxerror/sqrt(1.0*ctx->global_size) > 0.1){
    *flag=1;
    if (ctx->rank==-1){
      printf("PDSDPPLAPACK: Non positive-definite Matrix. %4.2e\n",ddxerror);
    }
  }
  wallclock(&ctx->t2);
  ctx->tsolve+=ctx->t2-ctx->t1;
  PPDSDPPrintTime(ctx->rank,"PLAPACK: Factor M",ctx->t2-ctx->t1,ctx->tsolve);
  PPDSDPPrintTime(ctx->rank,"Subtotal Time",0,ctx->t2-ctx->t1);
  DSDPFunctionReturn(0);
}
int PLA_Conjugate( PLA_Obj x )
{
	int original_error = 0;


	int i;
	int object_type_x;
	int local_length_x, local_width_x, ld_x;
	int stride_x;

	MPI_Datatype datatype_x;
        PLA_Template platemplate;
	PLA_Obj Neg_one = NULL;

	void *x_buffer, *x_buffer_cur;
	void *Neg_one_buffer;

	PLA_Obj_local_length(x, &local_length_x);
	PLA_Obj_local_width (x, &local_width_x);
	PLA_Obj_datatype(x, &datatype_x);
        PLA_Obj_template(x, &platemplate);
	if( (MPI_DOUBLE == datatype_x) || (MPI_DOUBLE_COMPLEX == datatype_x))
		PLA_Mscalar_create( MPI_DOUBLE, PLA_ALL_ROWS, PLA_ALL_COLS,
								  1, 1, platemplate, &Neg_one );
	else PLA_Mscalar_create( MPI_FLOAT, PLA_ALL_ROWS, PLA_ALL_COLS,
								  1, 1, platemplate, &Neg_one );
	PLA_Obj_set_to_minus_one(Neg_one);
	PLA_Obj_local_buffer(Neg_one, &Neg_one_buffer);
	PLA_Obj_local_ldim(x, &ld_x);
	PLA_Obj_objtype(x,  &object_type_x);
	PLA_Obj_local_buffer(x, &x_buffer);
		  PLA_Obj_local_stride(x, &stride_x);
	x_buffer_cur = x_buffer;
	if ( (MPI_DOUBLE == datatype_x) || (MPI_FLOAT == datatype_x))
		local_length_x = local_length_x/2; /* treat AS complex -- not negate */
	if(local_length_x * local_width_x > 0)
	{
		 if( (MPI_DOUBLE_COMPLEX == datatype_x) || (MPI_DOUBLE == datatype_x))
		 {
			 stride_x = stride_x * 2;
			 for(i = 0; i < local_width_x; i++)
			 {
				 PLA_dscal(&local_length_x,(double*)Neg_one_buffer,
							  (((double*)(x_buffer_cur))+1),&stride_x);
				 x_buffer_cur = (void*)(((double*)(x_buffer_cur))+ld_x*2);
			 }
		  }
		 if( (MPI_COMPLEX == datatype_x) || (MPI_FLOAT == datatype_x))
		 {
			 stride_x = stride_x * 2;
			 for(i = 0; i < local_width_x; i++)
			 {
				 PLA_sscal(&local_length_x,(float*)Neg_one_buffer,
							  (((float*)(x_buffer_cur))+1),&stride_x);
				 x_buffer_cur = (void*)(((float*)(x_buffer_cur))+ld_x*2);
			 }
		  }
	}
	PLA_Obj_free(&Neg_one);
	return(PLA_SUCCESS);
}