static PetscErrorCode VecView_Nest(Vec x,PetscViewer viewer) { Vec_Nest *bx = (Vec_Nest*)x->data; PetscBool isascii; PetscInt i; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); if (isascii) { ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); ierr = PetscViewerASCIIPrintf(viewer,"VecNest, rows=%D, structure: \n",bx->nb);CHKERRQ(ierr); for (i=0; i<bx->nb; i++) { VecType type; char name[256] = "",prefix[256] = ""; PetscInt NR; ierr = VecGetSize(bx->v[i],&NR);CHKERRQ(ierr); ierr = VecGetType(bx->v[i],&type);CHKERRQ(ierr); if (((PetscObject)bx->v[i])->name) {ierr = PetscSNPrintf(name,sizeof(name),"name=\"%s\", ",((PetscObject)bx->v[i])->name);CHKERRQ(ierr);} if (((PetscObject)bx->v[i])->prefix) {ierr = PetscSNPrintf(prefix,sizeof(prefix),"prefix=\"%s\", ",((PetscObject)bx->v[i])->prefix);CHKERRQ(ierr);} ierr = PetscViewerASCIIPrintf(viewer,"(%D) : %s%stype=%s, rows=%D \n",i,name,prefix,type,NR);CHKERRQ(ierr); ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); /* push1 */ ierr = VecView(bx->v[i],viewer);CHKERRQ(ierr); ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); /* pop1 */ } ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); /* pop0 */ } PetscFunctionReturn(0); }
/* name[] is operator name */ PetscErrorCode BSSCR_VecInfoLog(PetscViewer v,Vec x,const char name[]) { PetscReal nrm_1,nrm_f,nrm_inf; VecType vectype; PetscInt M; PetscViewerType vtype; PetscTruth isascii; PetscViewerGetType( v, &vtype ); Stg_PetscObjectTypeCompare( (PetscObject)v,PETSC_VIEWER_ASCII,&isascii ); if (!isascii) { PetscFunctionReturn(0); } VecGetSize( x, &M); VecGetType( x, &vectype ); VecNorm( x, NORM_1, &nrm_1 ); VecNorm( x, NORM_2, &nrm_f ); VecNorm( x, NORM_INFINITY, &nrm_inf ); PetscViewerASCIIPrintf( v, "VecInfo: %s \n", name ); PetscViewerASCIIPushTab(v); PetscViewerASCIIPrintf( v, "type=%s \n", vectype ); PetscViewerASCIIPrintf( v, "dimension=%Dx1 \n", M); PetscViewerASCIIPrintf( v, "|x|_1 = %1.12e\n", nrm_1 ); PetscViewerASCIIPrintf( v, "|x|_2 = %1.12e\n", nrm_f ); PetscViewerASCIIPrintf( v, "|x|_inf = %1.12e\n", nrm_inf ); PetscViewerASCIIPopTab(v); PetscFunctionReturn(0); }
PetscErrorCode MatAllocate_LMVM(Mat B, Vec X, Vec F) { Mat_LMVM *lmvm = (Mat_LMVM*)B->data; PetscErrorCode ierr; PetscBool same, allocate = PETSC_FALSE; PetscInt m, n, M, N; VecType type; PetscFunctionBegin; if (lmvm->allocated) { VecCheckMatCompatible(B, X, 2, F, 3); ierr = VecGetType(X, &type);CHKERRQ(ierr); ierr = PetscObjectTypeCompare((PetscObject)lmvm->Xprev, type, &same);CHKERRQ(ierr); if (!same) { /* Given X vector has a different type than allocated X-type data structures. We need to destroy all of this and duplicate again out of the given vector. */ allocate = PETSC_TRUE; ierr = MatLMVMReset(B, PETSC_TRUE);CHKERRQ(ierr); } } else { allocate = PETSC_TRUE; } if (allocate) { ierr = VecGetLocalSize(X, &n);CHKERRQ(ierr); ierr = VecGetSize(X, &N);CHKERRQ(ierr); ierr = VecGetLocalSize(F, &m);CHKERRQ(ierr); ierr = VecGetSize(F, &M);CHKERRQ(ierr); ierr = MatSetSizes(B, m, n, M, N);CHKERRQ(ierr); ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); ierr = VecDuplicate(X, &lmvm->Xprev);CHKERRQ(ierr); ierr = VecDuplicate(F, &lmvm->Fprev);CHKERRQ(ierr); if (lmvm->m > 0) { ierr = VecDuplicateVecs(lmvm->Xprev, lmvm->m, &lmvm->S);CHKERRQ(ierr); ierr = VecDuplicateVecs(lmvm->Fprev, lmvm->m, &lmvm->Y);CHKERRQ(ierr); } lmvm->allocated = PETSC_TRUE; B->preallocated = PETSC_TRUE; B->assembled = PETSC_TRUE; } PetscFunctionReturn(0); }
inline PetscVector::PetscVector (Vec v) : _array_is_present(false), _local_form(NULL), _values(NULL), _global_to_local_map(), _destroy_vec_on_exit(false) { this->_vec = v; this->_is_closed = true; this->_is_initialized = true; /* We need to ask PETSc about the (local to global) ghost value mapping and create the inverse mapping out of it. */ int ierr=0; int petsc_local_size=0; ierr = VecGetLocalSize(_vec, &petsc_local_size); CHKERRABORT(MPI_COMM_WORLD,ierr); // // Get the vector type from PETSc. // const VecType type; // ierr = VecGetType(_vec, &type); // CHKERRABORT(MPI_COMM_WORLD,ierr); // Get the vector type from PETSc. // As of Petsc 3.0.0, the VecType #define lost its const-ness, so we // need to have it in the code #if PETSC_VERSION_LESS_THAN(3,0,0) || !PETSC_VERSION_LESS_THAN(3,4,0) // Pre-3.0 and petsc-dev (as of October 2012) use non-const versions VecType ptype; #else const VecType ptype; #endif ierr = VecGetType(_vec, &ptype); CHKERRABORT(MPI_COMM_WORLD,ierr); if((strcmp(ptype,VECSHARED) == 0) || (strcmp(ptype,VECMPI) == 0)) { #if PETSC_VERSION_RELEASE && PETSC_VERSION_LESS_THAN(3,1,1) ISLocalToGlobalMapping mapping = _vec->mapping; #else ISLocalToGlobalMapping mapping; ierr = VecGetLocalToGlobalMapping(_vec, &mapping); CHKERRABORT(MPI_COMM_WORLD,ierr); #endif // ISLocalToGlobalMapping mapping; // ierr = VecGetLocalToGlobalMapping(_vec, &mapping); // CHKERRABORT(MPI_COMM_WORLD,ierr); // If is a sparsely stored vector, set up our new mapping if (mapping) { const unsigned int local_size = static_cast<unsigned int>(petsc_local_size); const unsigned int ghost_begin = static_cast<unsigned int>(petsc_local_size); #if PETSC_VERSION_RELEASE && PETSC_VERSION_LESS_THAN(3,4,0) const numeric_index_type ghost_end = static_cast<numeric_index_type>(mapping->n); #else PetscInt n; ierr = ISLocalToGlobalMappingGetSize(mapping, &n); CHKERRABORT(MPI_COMM_WORLD,ierr); const unsigned int ghost_end = static_cast<unsigned int>(n); #endif #if PETSC_VERSION_RELEASE && PETSC_VERSION_LESS_THAN(3,1,1) const PetscInt *indices = mapping->indices; #else const PetscInt *indices; ierr = ISLocalToGlobalMappingGetIndices(mapping,&indices); CHKERRABORT(MPI_COMM_WORLD,ierr); #endif for(unsigned int i=ghost_begin; i<ghost_end; i++) _global_to_local_map[indices[i]] = i-local_size; this->_type = GHOSTED; #if !PETSC_VERSION_RELEASE || !PETSC_VERSION_LESS_THAN(3,1,1) ierr = ISLocalToGlobalMappingRestoreIndices(mapping, &indices); CHKERRABORT(MPI_COMM_WORLD,ierr); #endif // const unsigned int ghost_end = static_cast<unsigned int>(mapping->n); // const int *indices = mapping->indices; // ierr = ISLocalToGlobalMappingGetIndices(mapping,&indices); // CHKERRABORT(MPI_COMM_WORLD,ierr); // for(unsigned int i=ghost_begin; i<ghost_end; i++) // _global_to_local_map[indices[i]] = i-local_size; // this->_type = GHOSTED; } else this->_type = PARALLEL; } else this->_type = SERIAL; this->close(); }
/*@C TaoVecGetSubVec - Gets a subvector using the IS Input Parameters: + vfull - the full matrix . is - the index set for the subvector . reduced_type - the method TAO is using for subsetting (TAO_SUBSET_SUBVEC, TAO_SUBSET_MASK, TAO_SUBSET_MATRIXFREE) - maskvalue - the value to set the unused vector elements to (for TAO_SUBSET_MASK or TAO_SUBSET_MATRIXFREE) Output Parameters: . vreduced - the subvector Notes: maskvalue should usually be 0.0, unless a pointwise divide will be used. @*/ PetscErrorCode TaoVecGetSubVec(Vec vfull, IS is, TaoSubsetType reduced_type, PetscReal maskvalue, Vec *vreduced) { PetscErrorCode ierr; PetscInt nfull,nreduced,nreduced_local,rlow,rhigh,flow,fhigh; PetscInt i,nlocal; PetscReal *fv,*rv; const PetscInt *s; IS ident; VecType vtype; VecScatter scatter; MPI_Comm comm; PetscFunctionBegin; PetscValidHeaderSpecific(vfull,VEC_CLASSID,1); PetscValidHeaderSpecific(is,IS_CLASSID,2); ierr = VecGetSize(vfull, &nfull);CHKERRQ(ierr); ierr = ISGetSize(is, &nreduced);CHKERRQ(ierr); if (nreduced == nfull) { ierr = VecDestroy(vreduced);CHKERRQ(ierr); ierr = VecDuplicate(vfull,vreduced);CHKERRQ(ierr); ierr = VecCopy(vfull,*vreduced);CHKERRQ(ierr); } else { switch (reduced_type) { case TAO_SUBSET_SUBVEC: ierr = VecGetType(vfull,&vtype);CHKERRQ(ierr); ierr = VecGetOwnershipRange(vfull,&flow,&fhigh);CHKERRQ(ierr); ierr = ISGetLocalSize(is,&nreduced_local);CHKERRQ(ierr); ierr = PetscObjectGetComm((PetscObject)vfull,&comm);CHKERRQ(ierr); if (*vreduced) { ierr = VecDestroy(vreduced);CHKERRQ(ierr); } ierr = VecCreate(comm,vreduced);CHKERRQ(ierr); ierr = VecSetType(*vreduced,vtype);CHKERRQ(ierr); ierr = VecSetSizes(*vreduced,nreduced_local,nreduced);CHKERRQ(ierr); ierr = VecGetOwnershipRange(*vreduced,&rlow,&rhigh);CHKERRQ(ierr); ierr = ISCreateStride(comm,nreduced_local,rlow,1,&ident);CHKERRQ(ierr); ierr = VecScatterCreate(vfull,is,*vreduced,ident,&scatter);CHKERRQ(ierr); ierr = VecScatterBegin(scatter,vfull,*vreduced,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(scatter,vfull,*vreduced,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterDestroy(&scatter);CHKERRQ(ierr); ierr = ISDestroy(&ident);CHKERRQ(ierr); break; case TAO_SUBSET_MASK: case TAO_SUBSET_MATRIXFREE: /* vr[i] = vf[i] if i in is vr[i] = 0 otherwise */ if (!*vreduced) { ierr = VecDuplicate(vfull,vreduced);CHKERRQ(ierr); } ierr = VecSet(*vreduced,maskvalue);CHKERRQ(ierr); ierr = ISGetLocalSize(is,&nlocal);CHKERRQ(ierr); ierr = VecGetOwnershipRange(vfull,&flow,&fhigh);CHKERRQ(ierr); ierr = VecGetArray(vfull,&fv);CHKERRQ(ierr); ierr = VecGetArray(*vreduced,&rv);CHKERRQ(ierr); ierr = ISGetIndices(is,&s);CHKERRQ(ierr); if (nlocal > (fhigh-flow)) SETERRQ2(PETSC_COMM_WORLD,1,"IS local size %d > Vec local size %d",nlocal,fhigh-flow); for (i=0;i<nlocal;i++) { rv[s[i]-flow] = fv[s[i]-flow]; } ierr = ISRestoreIndices(is,&s);CHKERRQ(ierr); ierr = VecRestoreArray(vfull,&fv);CHKERRQ(ierr); ierr = VecRestoreArray(*vreduced,&rv);CHKERRQ(ierr); break; } } PetscFunctionReturn(0); }
static PetscErrorCode IPMInitializeBounds(Tao tao) { TAO_IPM *ipmP = (TAO_IPM*)tao->data; Vec xtmp; PetscInt xstart,xend; PetscInt ucstart,ucend; /* user ci */ PetscInt ucestart,uceend; /* user ce */ PetscInt sstart,send; PetscInt bigsize; PetscInt i,counter,nloc; PetscInt *cind,*xind,*ucind,*uceind,*stepind; VecType vtype; const PetscInt *xli,*xui; PetscInt xl_offset,xu_offset; IS bigxl,bigxu,isuc,isc,isx,sis,is1; PetscErrorCode ierr; MPI_Comm comm; PetscFunctionBegin; cind=xind=ucind=uceind=stepind=0; ipmP->mi=0; ipmP->nxlb=0; ipmP->nxub=0; ipmP->nb=0; ipmP->nslack=0; ierr = VecDuplicate(tao->solution,&xtmp);CHKERRQ(ierr); if (!tao->XL && !tao->XU && tao->ops->computebounds) { ierr = TaoComputeVariableBounds(tao);CHKERRQ(ierr); } if (tao->XL) { ierr = VecSet(xtmp,PETSC_NINFINITY);CHKERRQ(ierr); ierr = VecWhichGreaterThan(tao->XL,xtmp,&ipmP->isxl);CHKERRQ(ierr); ierr = ISGetSize(ipmP->isxl,&ipmP->nxlb);CHKERRQ(ierr); } else { ipmP->nxlb=0; } if (tao->XU) { ierr = VecSet(xtmp,PETSC_INFINITY);CHKERRQ(ierr); ierr = VecWhichLessThan(tao->XU,xtmp,&ipmP->isxu);CHKERRQ(ierr); ierr = ISGetSize(ipmP->isxu,&ipmP->nxub);CHKERRQ(ierr); } else { ipmP->nxub=0; } ierr = VecDestroy(&xtmp);CHKERRQ(ierr); if (tao->constraints_inequality) { ierr = VecGetSize(tao->constraints_inequality,&ipmP->mi);CHKERRQ(ierr); } else { ipmP->mi = 0; } ipmP->nb = ipmP->nxlb + ipmP->nxub + ipmP->mi; comm = ((PetscObject)(tao->solution))->comm; bigsize = ipmP->n+2*ipmP->nb+ipmP->me; ierr = PetscMalloc1(bigsize,&stepind);CHKERRQ(ierr); ierr = PetscMalloc1(ipmP->n,&xind);CHKERRQ(ierr); ierr = PetscMalloc1(ipmP->me,&uceind);CHKERRQ(ierr); ierr = VecGetOwnershipRange(tao->solution,&xstart,&xend);CHKERRQ(ierr); if (ipmP->nb > 0) { ierr = VecCreate(comm,&ipmP->s);CHKERRQ(ierr); ierr = VecSetSizes(ipmP->s,PETSC_DECIDE,ipmP->nb);CHKERRQ(ierr); ierr = VecSetFromOptions(ipmP->s);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->ds);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->rhs_s);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->complementarity);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->ci);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->lamdai);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->dlamdai);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->rhs_lamdai);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->save_lamdai);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->save_s);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->rpi);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->Zero_nb);CHKERRQ(ierr); ierr = VecSet(ipmP->Zero_nb,0.0);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->One_nb);CHKERRQ(ierr); ierr = VecSet(ipmP->One_nb,1.0);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->s,&ipmP->Inf_nb);CHKERRQ(ierr); ierr = VecSet(ipmP->Inf_nb,PETSC_INFINITY);CHKERRQ(ierr); ierr = PetscMalloc1(ipmP->nb,&cind);CHKERRQ(ierr); ierr = PetscMalloc1(ipmP->mi,&ucind);CHKERRQ(ierr); ierr = VecGetOwnershipRange(ipmP->s,&sstart,&send);CHKERRQ(ierr); if (ipmP->mi > 0) { ierr = VecGetOwnershipRange(tao->constraints_inequality,&ucstart,&ucend);CHKERRQ(ierr); counter=0; for (i=ucstart;i<ucend;i++) { cind[counter++] = i; } ierr = ISCreateGeneral(comm,counter,cind,PETSC_COPY_VALUES,&isuc);CHKERRQ(ierr); ierr = ISCreateGeneral(comm,counter,cind,PETSC_COPY_VALUES,&isc);CHKERRQ(ierr); ierr = VecScatterCreate(tao->constraints_inequality,isuc,ipmP->ci,isc,&ipmP->ci_scat);CHKERRQ(ierr); ierr = ISDestroy(&isuc);CHKERRQ(ierr); ierr = ISDestroy(&isc);CHKERRQ(ierr); } /* need to know how may xbound indices are on each process */ /* TODO better way */ if (ipmP->nxlb) { ierr = ISAllGather(ipmP->isxl,&bigxl);CHKERRQ(ierr); ierr = ISGetIndices(bigxl,&xli);CHKERRQ(ierr); /* find offsets for this processor */ xl_offset = ipmP->mi; for (i=0;i<ipmP->nxlb;i++) { if (xli[i] < xstart) { xl_offset++; } else break; } ierr = ISRestoreIndices(bigxl,&xli);CHKERRQ(ierr); ierr = ISGetIndices(ipmP->isxl,&xli);CHKERRQ(ierr); ierr = ISGetLocalSize(ipmP->isxl,&nloc);CHKERRQ(ierr); for (i=0;i<nloc;i++) { xind[i] = xli[i]; cind[i] = xl_offset+i; } ierr = ISCreateGeneral(comm,nloc,xind,PETSC_COPY_VALUES,&isx);CHKERRQ(ierr); ierr = ISCreateGeneral(comm,nloc,cind,PETSC_COPY_VALUES,&isc);CHKERRQ(ierr); ierr = VecScatterCreate(tao->XL,isx,ipmP->ci,isc,&ipmP->xl_scat);CHKERRQ(ierr); ierr = ISDestroy(&isx);CHKERRQ(ierr); ierr = ISDestroy(&isc);CHKERRQ(ierr); ierr = ISDestroy(&bigxl);CHKERRQ(ierr); } if (ipmP->nxub) { ierr = ISAllGather(ipmP->isxu,&bigxu);CHKERRQ(ierr); ierr = ISGetIndices(bigxu,&xui);CHKERRQ(ierr); /* find offsets for this processor */ xu_offset = ipmP->mi + ipmP->nxlb; for (i=0;i<ipmP->nxub;i++) { if (xui[i] < xstart) { xu_offset++; } else break; } ierr = ISRestoreIndices(bigxu,&xui);CHKERRQ(ierr); ierr = ISGetIndices(ipmP->isxu,&xui);CHKERRQ(ierr); ierr = ISGetLocalSize(ipmP->isxu,&nloc);CHKERRQ(ierr); for (i=0;i<nloc;i++) { xind[i] = xui[i]; cind[i] = xu_offset+i; } ierr = ISCreateGeneral(comm,nloc,xind,PETSC_COPY_VALUES,&isx);CHKERRQ(ierr); ierr = ISCreateGeneral(comm,nloc,cind,PETSC_COPY_VALUES,&isc);CHKERRQ(ierr); ierr = VecScatterCreate(tao->XU,isx,ipmP->ci,isc,&ipmP->xu_scat);CHKERRQ(ierr); ierr = ISDestroy(&isx);CHKERRQ(ierr); ierr = ISDestroy(&isc);CHKERRQ(ierr); ierr = ISDestroy(&bigxu);CHKERRQ(ierr); } } ierr = VecCreate(comm,&ipmP->bigrhs);CHKERRQ(ierr); ierr = VecGetType(tao->solution,&vtype);CHKERRQ(ierr); ierr = VecSetType(ipmP->bigrhs,vtype);CHKERRQ(ierr); ierr = VecSetSizes(ipmP->bigrhs,PETSC_DECIDE,bigsize);CHKERRQ(ierr); ierr = VecSetFromOptions(ipmP->bigrhs);CHKERRQ(ierr); ierr = VecDuplicate(ipmP->bigrhs,&ipmP->bigstep);CHKERRQ(ierr); /* create scatters for step->x and x->rhs */ for (i=xstart;i<xend;i++) { stepind[i-xstart] = i; xind[i-xstart] = i; } ierr = ISCreateGeneral(comm,xend-xstart,stepind,PETSC_COPY_VALUES,&sis);CHKERRQ(ierr); ierr = ISCreateGeneral(comm,xend-xstart,xind,PETSC_COPY_VALUES,&is1);CHKERRQ(ierr); ierr = VecScatterCreate(ipmP->bigstep,sis,tao->solution,is1,&ipmP->step1);CHKERRQ(ierr); ierr = VecScatterCreate(tao->solution,is1,ipmP->bigrhs,sis,&ipmP->rhs1);CHKERRQ(ierr); ierr = ISDestroy(&sis);CHKERRQ(ierr); ierr = ISDestroy(&is1);CHKERRQ(ierr); if (ipmP->nb > 0) { for (i=sstart;i<send;i++) { stepind[i-sstart] = i+ipmP->n; cind[i-sstart] = i; } ierr = ISCreateGeneral(comm,send-sstart,stepind,PETSC_COPY_VALUES,&sis);CHKERRQ(ierr); ierr = ISCreateGeneral(comm,send-sstart,cind,PETSC_COPY_VALUES,&is1);CHKERRQ(ierr); ierr = VecScatterCreate(ipmP->bigstep,sis,ipmP->s,is1,&ipmP->step2);CHKERRQ(ierr); ierr = ISDestroy(&sis);CHKERRQ(ierr); for (i=sstart;i<send;i++) { stepind[i-sstart] = i+ipmP->n+ipmP->me; cind[i-sstart] = i; } ierr = ISCreateGeneral(comm,send-sstart,stepind,PETSC_COPY_VALUES,&sis);CHKERRQ(ierr); ierr = VecScatterCreate(ipmP->s,is1,ipmP->bigrhs,sis,&ipmP->rhs3);CHKERRQ(ierr); ierr = ISDestroy(&sis);CHKERRQ(ierr); ierr = ISDestroy(&is1);CHKERRQ(ierr); } if (ipmP->me > 0) { ierr = VecGetOwnershipRange(tao->constraints_equality,&ucestart,&uceend);CHKERRQ(ierr); for (i=ucestart;i<uceend;i++) { stepind[i-ucestart] = i + ipmP->n+ipmP->nb; uceind[i-ucestart] = i; } ierr = ISCreateGeneral(comm,uceend-ucestart,stepind,PETSC_COPY_VALUES,&sis);CHKERRQ(ierr); ierr = ISCreateGeneral(comm,uceend-ucestart,uceind,PETSC_COPY_VALUES,&is1);CHKERRQ(ierr); ierr = VecScatterCreate(ipmP->bigstep,sis,tao->constraints_equality,is1,&ipmP->step3);CHKERRQ(ierr); ierr = ISDestroy(&sis);CHKERRQ(ierr); for (i=ucestart;i<uceend;i++) { stepind[i-ucestart] = i + ipmP->n; } ierr = ISCreateGeneral(comm,uceend-ucestart,stepind,PETSC_COPY_VALUES,&sis);CHKERRQ(ierr); ierr = VecScatterCreate(tao->constraints_equality,is1,ipmP->bigrhs,sis,&ipmP->rhs2);CHKERRQ(ierr); ierr = ISDestroy(&sis);CHKERRQ(ierr); ierr = ISDestroy(&is1);CHKERRQ(ierr); } if (ipmP->nb > 0) { for (i=sstart;i<send;i++) { stepind[i-sstart] = i + ipmP->n + ipmP->nb + ipmP->me; cind[i-sstart] = i; } ierr = ISCreateGeneral(comm,send-sstart,cind,PETSC_COPY_VALUES,&is1);CHKERRQ(ierr); ierr = ISCreateGeneral(comm,send-sstart,stepind,PETSC_COPY_VALUES,&sis);CHKERRQ(ierr); ierr = VecScatterCreate(ipmP->bigstep,sis,ipmP->s,is1,&ipmP->step4);CHKERRQ(ierr); ierr = VecScatterCreate(ipmP->s,is1,ipmP->bigrhs,sis,&ipmP->rhs4);CHKERRQ(ierr); ierr = ISDestroy(&sis);CHKERRQ(ierr); ierr = ISDestroy(&is1);CHKERRQ(ierr); } ierr = PetscFree(stepind);CHKERRQ(ierr); ierr = PetscFree(cind);CHKERRQ(ierr); ierr = PetscFree(ucind);CHKERRQ(ierr); ierr = PetscFree(uceind);CHKERRQ(ierr); ierr = PetscFree(xind);CHKERRQ(ierr); PetscFunctionReturn(0); }