[petsc-users] error: invalid types ‘PetscScalar* {aka double*}[PetscScalar {aka double}]’ for array subscript
Smit Thijs
thijs.smit at hest.ethz.ch
Fri Aug 21 03:49:45 CDT 2020
Hi All,
I am having the following error when I try to do a mapping with vectors and I can’t figure out how to solve this or what is going wrong:
error: invalid types ‘PetscScalar* {aka double*}[PetscScalar {aka double}]’ for array subscript
xpMMA[i] = xp[indicesMap[i]];
Herewith two code snippets:
// total number of elements on core
PetscInt nel;
VecGetLocalSize(xPhys, &nel);
// create xPassive vector
ierr = VecDuplicate(xPhys, &xPassive);
CHKERRQ(ierr);
// create mapping vector
ierr = VecDuplicate(xPhys, &indicator);
CHKERRQ(ierr);
// index set for xPassive and indicator
PetscScalar *xpPassive, *xpIndicator;
ierr = VecGetArray(xPassive, &xpPassive);
CHKERRQ(ierr);
ierr = VecGetArray(indicator, &xpIndicator);
CHKERRQ(ierr);
// counters for total and active elements on this processor
PetscInt tcount = 0; // total number of elements
PetscInt acount = 0; // number of active elements
PetscInt scount = 0; // number of solid elements
PetscInt rcount = 0; // number of rigid element
// loop over all elements and update xPassive from wrapper data
// count number of active elements, acount
// set indicator vector
for (PetscInt el = 0; el < nel; el++) {
if (data.xPassive_w.size() > 1) {
xpPassive[el] = data.xPassive_w[el];
tcount++;
if (xpPassive[el] < 0) {
xpIndicator[acount] = el;
acount++;
}
} else {
xpPassive[el] = -1.0; // default, if no xPassive_w than all elements are active = -1.0
}
}
// printing
//PetscPrintf(PETSC_COMM_WORLD, "tcount: %i\n", tcount);
//PetscPrintf(PETSC_COMM_WORLD, "acount: %i\n", acount);
// Allreduce, get number of active elements over all processes
// tmp number of var on proces
// acount total number of var sumed
PetscInt tmp = acount;
acount = 0.0;
MPI_Allreduce(&tmp, &(acount), 1, MPIU_INT, MPI_SUM, PETSC_COMM_WORLD);
//// create xMMA vector
VecCreateMPI(PETSC_COMM_WORLD, tmp, acount, &xMMA);
// Pointers to the vectors
PetscScalar *xp, *xpMMA, *indicesMap;
//PetscInt indicesMap;
ierr = VecGetArray(MMAVector, &xpMMA);
CHKERRQ(ierr);
ierr = VecGetArray(elementVector, &xp);
CHKERRQ(ierr);
// Index set
PetscInt nLocalVar;
VecGetLocalSize(xMMA, &nLocalVar);
// print number of var on pocessor
PetscPrintf(PETSC_COMM_WORLD, "Local var: %i\n", nLocalVar);
ierr = VecGetArray(indicator, &indicesMap);
CHKERRQ(ierr);
// Run through the indices
for (PetscInt i = 0; i < nLocalVar; i++) {
if (updateDirection > 0) {
//PetscPrintf(PETSC_COMM_WORLD, "i: %i, xp[%i] = %f\n", i, indicesMap[i], xp[indicesMap[i]]);
xpMMA[i] = xp[indicesMap[i]];
} else if (updateDirection < 0) {
xp[indicesMap[i]] = xpMMA[i];
//PetscPrintf(PETSC_COMM_WORLD, "i: %i, xp[%i] = %f\n", i, indicesMap[i], xp[indicesMap[i]]);
}
}
// Restore
ierr = VecRestoreArray(elementVector, &xp);
CHKERRQ(ierr);
ierr = VecRestoreArray(MMAVector, &xpMMA);
CHKERRQ(ierr);
ierr = VecRestoreArray(indicator, &indicesMap);
CHKERRQ(ierr);
PetscPrintf(PETSC_COMM_WORLD, "FINISHED UpdateVariables \n");
The error message says that the type with which I try to index is wrong, I think. But VecGetArray only excepts scalars. Furthermore, the el variable is an int, but is seams like to turn out to be a scalar. Does anybody see how to proceed with this?
Best regards,
Thijs Smit
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20200821/19352c7c/attachment.html>
More information about the petsc-users
mailing list