[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