本文整理汇总了C++中VecRestoreArrayRead函数的典型用法代码示例。如果您正苦于以下问题:C++ VecRestoreArrayRead函数的具体用法?C++ VecRestoreArrayRead怎么用?C++ VecRestoreArrayRead使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了VecRestoreArrayRead函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: CreateSpectralPlanes
static PetscErrorCode CreateSpectralPlanes(DM dm, PetscInt numPlanes, const PetscInt planeDir[], const PetscReal planeCoord[], AppCtx *user)
{
PetscSection coordSection;
Vec coordinates;
const PetscScalar *coords;
PetscInt dim, p, vStart, vEnd, v;
PetscErrorCode ierr;
PetscFunctionBeginUser;
ierr = DMGetCoordinateDim(dm, &dim);CHKERRQ(ierr);
ierr = DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);CHKERRQ(ierr);
ierr = DMGetCoordinatesLocal(dm, &coordinates);CHKERRQ(ierr);
ierr = DMGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr);
ierr = VecGetArrayRead(coordinates, &coords);CHKERRQ(ierr);
for (p = 0; p < numPlanes; ++p) {
DMLabel label;
char name[PETSC_MAX_PATH_LEN];
ierr = PetscSNPrintf(name, PETSC_MAX_PATH_LEN, "spectral_plane_%D", p);CHKERRQ(ierr);
ierr = DMCreateLabel(dm, name);CHKERRQ(ierr);
ierr = DMGetLabel(dm, name, &label);CHKERRQ(ierr);
ierr = DMLabelAddStratum(label, 1);CHKERRQ(ierr);
for (v = vStart; v < vEnd; ++v) {
PetscInt off;
ierr = PetscSectionGetOffset(coordSection, v, &off);CHKERRQ(ierr);
if (PetscAbsReal(planeCoord[p] - PetscRealPart(coords[off+planeDir[p]])) < PETSC_SMALL) {
ierr = DMLabelSetValue(label, v, 1);CHKERRQ(ierr);
}
}
}
ierr = VecRestoreArrayRead(coordinates, &coords);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例2: RHSJacobian
static PetscErrorCode RHSJacobian(TS ts,PetscReal t,Vec X,Mat A,Mat B,void *ctx)
{
PetscErrorCode ierr;
User user = (User)ctx;
PetscReal mu = user->mu;
PetscInt rowcol[] = {0,1};
PetscScalar J[2][2];
const PetscScalar *x;
PetscFunctionBeginUser;
ierr = VecGetArrayRead(X,&x);CHKERRQ(ierr);
J[0][0] = 0;
J[1][0] = -2.*mu*x[1]*x[0]-1;
J[0][1] = 1.0;
J[1][1] = mu*(1.0-x[0]*x[0]);
ierr = MatSetValues(A,2,rowcol,2,rowcol,&J[0][0],INSERT_VALUES);CHKERRQ(ierr);
ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
if (A != B) {
ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
}
ierr = VecRestoreArrayRead(X,&x);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例3: PCApply_Redistribute
static PetscErrorCode PCApply_Redistribute(PC pc,Vec b,Vec x)
{
PC_Redistribute *red = (PC_Redistribute*)pc->data;
PetscErrorCode ierr;
PetscInt dcnt = red->dcnt,i;
const PetscInt *drows = red->drows;
PetscScalar *xwork;
const PetscScalar *bwork,*diag = red->diag;
PetscFunctionBegin;
if (!red->work) {
ierr = VecDuplicate(b,&red->work);CHKERRQ(ierr);
}
/* compute the rows of solution that have diagonal entries only */
ierr = VecSet(x,0.0);CHKERRQ(ierr); /* x = diag(A)^{-1} b */
ierr = VecGetArray(x,&xwork);CHKERRQ(ierr);
ierr = VecGetArrayRead(b,&bwork);CHKERRQ(ierr);
for (i=0; i<dcnt; i++) {
xwork[drows[i]] = diag[i]*bwork[drows[i]];
}
ierr = PetscLogFlops(dcnt);CHKERRQ(ierr);
ierr = VecRestoreArray(red->work,&xwork);CHKERRQ(ierr);
ierr = VecRestoreArrayRead(b,&bwork);CHKERRQ(ierr);
/* update the right hand side for the reduced system with diagonal rows (and corresponding columns) removed */
ierr = MatMult(pc->pmat,x,red->work);CHKERRQ(ierr);
ierr = VecAYPX(red->work,-1.0,b);CHKERRQ(ierr); /* red->work = b - A x */
ierr = VecScatterBegin(red->scatter,red->work,red->b,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
ierr = VecScatterEnd(red->scatter,red->work,red->b,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
ierr = KSPSolve(red->ksp,red->b,red->x);CHKERRQ(ierr);
ierr = VecScatterBegin(red->scatter,red->x,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
ierr = VecScatterEnd(red->scatter,red->x,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例4: StokesWriteSolution
PetscErrorCode StokesWriteSolution(Stokes *s)
{
PetscMPIInt size;
PetscInt n,i,j;
const PetscScalar *array;
PetscErrorCode ierr;
PetscFunctionBeginUser;
/* write data (*warning* only works sequential) */
MPI_Comm_size(MPI_COMM_WORLD,&size);
/*ierr = PetscPrintf(PETSC_COMM_WORLD," number of processors = %D\n",size);CHKERRQ(ierr);*/
if (size == 1) {
PetscViewer viewer;
ierr = VecGetArrayRead(s->x, &array);CHKERRQ(ierr);
ierr = PetscViewerASCIIOpen(PETSC_COMM_WORLD, "solution.dat", &viewer);CHKERRQ(ierr);
ierr = PetscViewerASCIIPrintf(viewer, "# x, y, u, v, p\n");CHKERRQ(ierr);
for (j = 0; j < s->ny; j++) {
for (i = 0; i < s->nx; i++) {
n = j*s->nx+i;
ierr = PetscViewerASCIIPrintf(viewer, "%.12g %.12g %.12g %.12g %.12g\n", (double)(i*s->hx+s->hx/2),(double)(j*s->hy+s->hy/2), (double)PetscRealPart(array[n]), (double)PetscRealPart(array[n+s->nx*s->ny]),(double)PetscRealPart(array[n+2*s->nx*s->ny]));CHKERRQ(ierr);
}
}
ierr = VecRestoreArrayRead(s->x, &array);CHKERRQ(ierr);
ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}
示例5: MatSolve_LUSOL
PetscErrorCode MatSolve_LUSOL(Mat A,Vec b,Vec x)
{
Mat_LUSOL *lusol=(Mat_LUSOL*)A->spptr;
double *xx;
const double *bb;
int mode=5;
PetscErrorCode ierr;
int i,m,n,nnz,status;
PetscFunctionBegin;
ierr = VecGetArray(x, &xx);CHKERRQ(ierr);
ierr = VecGetArrayRead(b, &bb);CHKERRQ(ierr);
m = n = lusol->n;
nnz = lusol->nnz;
for (i = 0; i < m; i++) lusol->mnsv[i] = bb[i];
LU6SOL(&mode, &m, &n, lusol->mnsv, xx, &nnz,
lusol->luparm, lusol->parmlu, lusol->data,
lusol->indc, lusol->indr, lusol->ip, lusol->iq,
lusol->lenc, lusol->lenr, lusol->locc, lusol->locr, &status);
if (status) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"solve failed, error code %d",status);
ierr = VecRestoreArray(x, &xx);CHKERRQ(ierr);
ierr = VecRestoreArrayRead(b, &bb);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例6: CostIntegrand
static PetscErrorCode CostIntegrand(TS ts,PetscReal t,Vec U,Vec R,Userctx *user)
{
PetscErrorCode ierr;
PetscScalar *r;
const PetscScalar *u;
PetscInt idx;
Vec Xgen,Xnet;
PetscScalar *xgen;
PetscInt i;
PetscFunctionBegin;
ierr = DMCompositeGetLocalVectors(user->dmpgrid,&Xgen,&Xnet);CHKERRQ(ierr);
ierr = DMCompositeScatter(user->dmpgrid,U,Xgen,Xnet);CHKERRQ(ierr);
ierr = VecGetArray(Xgen,&xgen);CHKERRQ(ierr);
ierr = VecGetArrayRead(U,&u);CHKERRQ(ierr);
ierr = VecGetArray(R,&r);CHKERRQ(ierr);
r[0] = 0.;
idx = 0;
for (i=0;i<ngen;i++) {
r[0] += PetscPowScalarInt(PetscMax(0.,PetscMax(xgen[idx+3]/(2.*PETSC_PI)-user->freq_u,user->freq_l-xgen[idx+3]/(2.*PETSC_PI))),user->pow);
idx += 9;
}
ierr = VecRestoreArray(R,&r);CHKERRQ(ierr);
ierr = VecRestoreArrayRead(U,&u);CHKERRQ(ierr);
ierr = DMCompositeRestoreLocalVectors(user->dmpgrid,&Xgen,&Xnet);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例7: VecMax_Seq
PetscErrorCode VecMax_Seq(Vec xin,PetscInt* idx,PetscReal * z)
{
PetscInt i,j=0,n = xin->map->n;
PetscReal max,tmp;
const PetscScalar *xx;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = VecGetArrayRead(xin,&xx);CHKERRQ(ierr);
if (!n) {
max = PETSC_MIN_REAL;
j = -1;
} else {
#if defined(PETSC_USE_COMPLEX)
max = PetscRealPart(*xx++); j = 0;
#else
max = *xx++; j = 0;
#endif
for (i=1; i<n; i++) {
#if defined(PETSC_USE_COMPLEX)
if ((tmp = PetscRealPart(*xx++)) > max) { j = i; max = tmp;}
#else
if ((tmp = *xx++) > max) { j = i; max = tmp; }
#endif
}
}
*z = max;
if (idx) *idx = j;
ierr = VecRestoreArrayRead(xin,&xx);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例8: SetJacobian
void SetJacobian(Geometry geo, Mat J, Vec v, int jc, int jr, int jh){
// use jc = -1 for last 2 columns, and jc = -2 for blocks (all jc)
AssembleVec(v);
int ns, ne, i;
VecGetOwnershipRange(v, &ns, &ne);
const double *vals;
VecGetArrayRead(v, &vals);
for(i=ns; i<ne; i++){
if( Last2(geo, i) || vals[i-ns] == 0.0) continue;
int col, offset = jh*(Nxyzcr(geo)+2),
ij = i%(Nxyzcr(geo)+2);
Point p;
CreatePoint_i(&p, ij, &geo->gN);
if(jc == -1) //columns
col = Nxyzcr(geo)+jr;
else if(jc == -2) //blocks
col = jr*Nxyzc(geo) + xyzc(&p);
else // tensors
col = jr*Nxyzc(geo) + jc*Nxyz(geo) + xyz(&p);
MatSetValue(J, i, col+offset, vals[i-ns], ADD_VALUES);
}
VecRestoreArrayRead(v, &vals);
}
示例9: CollectVec
void CollectVec(Geometry geo, Vec vN, Vec vM){
VecSet(vM, 0.0);
Vecfun f;
CreateVecfun(&f, geo->vf);
const double *vals;
VecGetArrayRead(vN, &vals);
int ns, ne;
VecGetOwnershipRange(vN, &ns, &ne);
if( ne > Nxyzcr(geo)-2) ne = Nxyzcr(geo)-2;
int i;
for(i=ns; i<ne; i++){
if( valr(&f, i) == 0.0) continue;
// skip if gain profile zero here
Point p;
CreatePoint_i(&p, i, &geo->gN);
if( projectmedium(&p, &geo->gM, geo->LowerPML) )
VecSetValue(vM, xyz(&p), vals[i-ns], ADD_VALUES);
}
VecRestoreArrayRead(vN, &vals);
DestroyVecfun(&f);
AssembleVec(vM);
}
示例10: MatBackwardSolve_SeqBAIJ_1_NaturalOrdering
PetscErrorCode MatBackwardSolve_SeqBAIJ_1_NaturalOrdering(Mat A,Vec bb,Vec xx)
{
Mat_SeqBAIJ *a = (Mat_SeqBAIJ*)A->data;
PetscErrorCode ierr;
const PetscInt n = a->mbs,*aj = a->j,*adiag = a->diag,*vi;
PetscScalar *x,sum;
const PetscScalar *b;
const MatScalar *aa = a->a,*v;
PetscInt i,nz;
PetscFunctionBegin;
if (!n) PetscFunctionReturn(0);
ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
/* backward solve the upper triangular */
for (i=n-1; i>=0; i--) {
v = aa + adiag[i+1] + 1;
vi = aj + adiag[i+1] + 1;
nz = adiag[i] - adiag[i+1]-1;
sum = b[i];
PetscSparseDenseMinusDot(sum,x,v,vi,nz);
x[i] = sum*v[nz]; /* x[i]=aa[adiag[i]]*sum; v++; */
}
ierr = PetscLogFlops(2.0*a->nz - A->cmap->n);CHKERRQ(ierr);
ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例11: IJacobian
static PetscErrorCode IJacobian(TS ts,PetscReal t,Vec X,Vec Xdot,PetscReal a,Mat A,Mat B,void *ptr)
{
PetscErrorCode ierr;
User user = (User)ptr;
PetscReal mu = user->mu;
PetscInt rowcol[] = {0,1};
PetscScalar J[2][2];
const PetscScalar *x;
PetscFunctionBegin;
ierr = VecGetArrayRead(X,&x);CHKERRQ(ierr);
J[0][0] = a;
J[0][1] = 0;
J[1][0] = (2.*x[0]*x[1]+1.)/mu;
J[1][1] = a - (1. - x[0]*x[0])/mu;
ierr = MatSetValues(B,2,rowcol,2,rowcol,&J[0][0],INSERT_VALUES);CHKERRQ(ierr);
ierr = VecRestoreArrayRead(X,&x);CHKERRQ(ierr);
ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
if (A != B) {
ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}
示例12: MatForwardSolve_SeqBAIJ_1_NaturalOrdering
PetscErrorCode MatForwardSolve_SeqBAIJ_1_NaturalOrdering(Mat A,Vec bb,Vec xx)
{
Mat_SeqBAIJ *a = (Mat_SeqBAIJ*)A->data;
PetscErrorCode ierr;
const PetscInt n = a->mbs,*ai = a->i,*aj = a->j,*vi;
PetscScalar *x,sum;
const PetscScalar *b;
const MatScalar *aa = a->a,*v;
PetscInt i,nz;
PetscFunctionBegin;
if (!n) PetscFunctionReturn(0);
ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
/* forward solve the lower triangular */
x[0] = b[0];
v = aa;
vi = aj;
for (i=1; i<n; i++) {
nz = ai[i+1] - ai[i];
sum = b[i];
PetscSparseDenseMinusDot(sum,x,v,vi,nz);
v += nz;
vi += nz;
x[i] = sum;
}
ierr = PetscLogFlops(a->nz - A->cmap->n);CHKERRQ(ierr);
ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例13: FormIJacobian
static PetscErrorCode FormIJacobian(TS ts,PetscReal t,Vec U, Vec Udot, PetscReal a, Mat J,Mat Jpre,void *ctx)
{
PetscErrorCode ierr;
AppCtx *user = (AppCtx *)ctx;
PetscScalar v;
const PetscScalar *x;
PetscInt i,col;
PetscFunctionBegin;
ierr = VecGetArrayRead(U,&x);
CHKERRQ(ierr);
for(i=0; i < user->mx; i++) {
v = a - 1. + 3.*x[i]*x[i];
col = i;
ierr = MatSetValues(J,1,&i,1,&col,&v,INSERT_VALUES);
CHKERRQ(ierr);
}
ierr = VecRestoreArrayRead(U,&x);
CHKERRQ(ierr);
ierr = MatAssemblyBegin(J,MAT_FINAL_ASSEMBLY);
CHKERRQ(ierr);
ierr = MatAssemblyEnd(J,MAT_FINAL_ASSEMBLY);
CHKERRQ(ierr);
if (J != Jpre) {
ierr = MatAssemblyBegin(Jpre,MAT_FINAL_ASSEMBLY);
CHKERRQ(ierr);
ierr = MatAssemblyEnd(Jpre,MAT_FINAL_ASSEMBLY);
CHKERRQ(ierr);
}
/* MatView(J,PETSC_VIEWER_STDOUT_WORLD);*/
PetscFunctionReturn(0);
}
示例14: RHSFunction
static PetscErrorCode RHSFunction(TS ts,PetscReal t,Vec X,Vec F,void *ptr)
{
PetscErrorCode ierr;
AppCtx *user = (AppCtx*)ptr;
PetscScalar *f;
const PetscScalar *x;
PetscInt i,mx;
PetscReal hx,eps;
PetscFunctionBegin;
mx = user->mx;
eps = user->param;
hx = (user->xright-user->xleft)/(mx-1);
ierr = VecGetArrayRead(X,&x);
CHKERRQ(ierr);
ierr = VecGetArray(F,&f);
CHKERRQ(ierr);
f[0] = 2.*eps*(x[1]-x[0])/(hx*hx); /*boundary*/
for(i=1; i<mx-1; i++) {
f[i]= eps*(x[i+1]-2.*x[i]+x[i-1])/(hx*hx);
}
f[mx-1] = 2.*eps*(x[mx-2]- x[mx-1])/(hx*hx); /*boundary*/
ierr = VecRestoreArrayRead(X,&x);
CHKERRQ(ierr);
ierr = VecRestoreArray(F,&f);
CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例15: KSPMonitorRange_Private
PetscErrorCode KSPMonitorRange_Private(KSP ksp,PetscInt it,PetscReal *per)
{
PetscErrorCode ierr;
Vec resid;
PetscReal rmax,pwork;
PetscInt i,n,N;
const PetscScalar *r;
PetscFunctionBegin;
ierr = KSPBuildResidual(ksp,NULL,NULL,&resid);
CHKERRQ(ierr);
ierr = VecNorm(resid,NORM_INFINITY,&rmax);
CHKERRQ(ierr);
ierr = VecGetLocalSize(resid,&n);
CHKERRQ(ierr);
ierr = VecGetSize(resid,&N);
CHKERRQ(ierr);
ierr = VecGetArrayRead(resid,&r);
CHKERRQ(ierr);
pwork = 0.0;
for (i=0; i<n; i++) pwork += (PetscAbsScalar(r[i]) > .20*rmax);
ierr = VecRestoreArrayRead(resid,&r);
CHKERRQ(ierr);
ierr = VecDestroy(&resid);
CHKERRQ(ierr);
ierr = MPIU_Allreduce(&pwork,per,1,MPIU_REAL,MPIU_SUM,PetscObjectComm((PetscObject)ksp));
CHKERRQ(ierr);
*per = *per/N;
PetscFunctionReturn(0);
}