/**************************************xyt.c***********************************/ PetscInt XYT_factor(xyt_ADT xyt_handle, /* prev. allocated xyt handle */ PetscInt *local2global, /* global column mapping */ PetscInt n, /* local num rows */ PetscInt m, /* local num cols */ PetscErrorCode (*matvec)(void*,PetscScalar*,PetscScalar*), /* b_loc=A_local.x_loc */ void *grid_data) /* grid data for matvec */ { PCTFS_comm_init(); check_handle(xyt_handle); /* only 2^k for now and all nodes participating */ if ((1<<(xyt_handle->level=PCTFS_i_log2_num_nodes))!=PCTFS_num_nodes) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"only 2^k for now and MPI_COMM_WORLD!!! %D != %D\n",1<<PCTFS_i_log2_num_nodes,PCTFS_num_nodes); /* space for X info */ xyt_handle->info = (xyt_info*)malloc(sizeof(xyt_info)); /* set up matvec handles */ xyt_handle->mvi = set_mvi(local2global, n, m, (PetscErrorCode (*)(mv_info*,PetscScalar*,PetscScalar*))matvec, grid_data); /* matrix is assumed to be of full rank */ /* LATER we can reset to indicate rank def. */ xyt_handle->ns=0; /* determine separators and generate firing order - NB xyt info set here */ det_separators(xyt_handle); return(do_xyt_factor(xyt_handle)); }
/**************************************xyt.c***********************************/ PetscInt XYT_free(xyt_ADT xyt_handle) { PCTFS_comm_init(); check_handle(xyt_handle); n_xyt_handles--; free(xyt_handle->info->nsep); free(xyt_handle->info->lnsep); free(xyt_handle->info->fo); free(xyt_handle->info->stages); free(xyt_handle->info->solve_uu); free(xyt_handle->info->solve_w); free(xyt_handle->info->x); free(xyt_handle->info->xcol_vals); free(xyt_handle->info->xcol_sz); free(xyt_handle->info->xcol_indices); free(xyt_handle->info->y); free(xyt_handle->info->ycol_vals); free(xyt_handle->info->ycol_sz); free(xyt_handle->info->ycol_indices); free(xyt_handle->info); free(xyt_handle->mvi->local2global); PCTFS_gs_free(xyt_handle->mvi->PCTFS_gs_handle); free(xyt_handle->mvi); free(xyt_handle); /* if the check fails we nuke */ /* if NULL pointer passed to free we nuke */ /* if the calls to free fail that's not my problem */ return(0); }
/**************************************xyt.c***********************************/ PetscInt XYT_solve(xyt_ADT xyt_handle, PetscScalar *x, PetscScalar *b) { PCTFS_comm_init(); check_handle(xyt_handle); /* need to copy b into x? */ if (b) PCTFS_rvec_copy(x,b,xyt_handle->mvi->n);do_xyt_solve(xyt_handle,x); return(0); }
/**************************************xxt.c***********************************/ PetscInt XXT_stats(xxt_ADT xxt_handle) { PetscInt op[] = {NON_UNIFORM,GL_MIN,GL_MAX,GL_ADD,GL_MIN,GL_MAX,GL_ADD,GL_MIN,GL_MAX,GL_ADD}; PetscInt fop[] = {NON_UNIFORM,GL_MIN,GL_MAX,GL_ADD}; PetscInt vals[9], work[9]; PetscScalar fvals[3], fwork[3]; PetscErrorCode ierr; PCTFS_comm_init(); check_handle(xxt_handle); /* if factorization not done there are no stats */ if (!xxt_handle->info||!xxt_handle->mvi) { if (!PCTFS_my_id) { ierr = PetscPrintf(PETSC_COMM_WORLD,"XXT_stats() :: no stats available!\n");CHKERRQ(ierr); } return 1; } vals[0]=vals[1]=vals[2]=xxt_handle->info->nnz; vals[3]=vals[4]=vals[5]=xxt_handle->mvi->n; vals[6]=vals[7]=vals[8]=xxt_handle->info->msg_buf_sz; PCTFS_giop(vals,work,sizeof(op)/sizeof(op[0])-1,op); fvals[0]=fvals[1]=fvals[2] =xxt_handle->info->tot_solve_time/xxt_handle->info->nsolves++; PCTFS_grop(fvals,fwork,sizeof(fop)/sizeof(fop[0])-1,fop); if (!PCTFS_my_id) { ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: min xxt_nnz=%D\n",PCTFS_my_id,vals[0]);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: max xxt_nnz=%D\n",PCTFS_my_id,vals[1]);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: avg xxt_nnz=%g\n",PCTFS_my_id,1.0*vals[2]/PCTFS_num_nodes);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: tot xxt_nnz=%D\n",PCTFS_my_id,vals[2]);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: xxt C(2d) =%g\n",PCTFS_my_id,vals[2]/(PetscPowReal(1.0*vals[5],1.5)));CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: xxt C(3d) =%g\n",PCTFS_my_id,vals[2]/(PetscPowReal(1.0*vals[5],1.6667)));CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: min xxt_n =%D\n",PCTFS_my_id,vals[3]);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: max xxt_n =%D\n",PCTFS_my_id,vals[4]);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: avg xxt_n =%g\n",PCTFS_my_id,1.0*vals[5]/PCTFS_num_nodes);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: tot xxt_n =%D\n",PCTFS_my_id,vals[5]);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: min xxt_buf=%D\n",PCTFS_my_id,vals[6]);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: max xxt_buf=%D\n",PCTFS_my_id,vals[7]);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: avg xxt_buf=%g\n",PCTFS_my_id,1.0*vals[8]/PCTFS_num_nodes);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: min xxt_slv=%g\n",PCTFS_my_id,fvals[0]);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: max xxt_slv=%g\n",PCTFS_my_id,fvals[1]);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%D :: avg xxt_slv=%g\n",PCTFS_my_id,fvals[2]/PCTFS_num_nodes);CHKERRQ(ierr); } return(0); }