Hello<div><br></div><div>I was wondering are there any effective alternatives to VecGetArrayF90. In the code I'm working on, I need to reorder variables from a field based order in the application to a packed variable ordering that I use with PETSc. The code I'm running is as follows which converts the blocked based petsc ordering to the application field based order. There is an equilivent routine that converts the field based residual back to petsc block ordering.</div>
<div><div><br></div><div> call VecGetArrayF90(wVec,wvec_pointer,ierr)</div><div>  call EChk(ierr,__FILE__,__LINE__)</div><div>  </div><div>  ii = 1</div><div>  do nn=1,nDom</div><div>     do sps=1,nTimeIntervalsSpectral</div>
<div>        call setPointersAdj(nn,1_intType,sps)</div><div><br></div><div>        do k=2,kl</div><div>           do j=2,jl</div><div>              do i=2,il</div><div>                 do l=1,nw</div><div>                    w(i,j,k,l) = wvec_pointer(ii) </div>
<div>                    ii = ii + 1</div><div>                 end do</div><div>              end do</div><div>           end do</div><div>        end do</div><div>     end do</div><div>  end do</div><div><br></div><div>
  call VecRestoreArrayF90(wVec,wvec_pointer,ierr)</div><div>  call EChk(ierr,__FILE__,__LINE__)</div></div><div><br></div><div><br></div><div> The issue is that the VecGetArrayF90 command it highly finicky and often prevents the code from compiling on various architectures.</div>
<div><br></div><div>My understanding is that the preferred way to of doing this is:</div><div><br></div><div>use petscvec</div><div>Vec wVe</div><div><div>PetscScalar, pointer :: wvec_pointer</div><div><br></div><div>call VecGetArrayF90(wVec,wvec_pointer,ierr)</div>
<div><br></div></div><div><br></div><div>However, many times the code will refuse to compile as there are incompatibilities between petscvec module that was compiled with petsc and the current compilation. </div><div><br>
</div><div>Another approach I tried is to eliminate the petscvec module and just use an integer fro the petsc vector:</div><div><br></div><div>PetscInt :: wVec</div><div>PetscScalar, pointer :: wvec_pointer</div><div><div>
<br></div><div>call VecGetArrayF90(wVec,wvec_pointer,ierr)</div><div><br></div></div><div><br></div><div>This will compile, but it throws an error code 68, invalid pointer argument. Again, this is only on some architectures with certain compilers. (Ubuntu 12.04, gfortran 64bit will give this error, Ubuntu 10.10 ifort 32bit will work with either form)</div>
<div><br></div><div>My question is if you use the F77 form:  VecGetArray(x,x_array,i_x,ierr) is there a performance penalty? Is it an actual pointer or is the data copied? Do you think it would be more robust than using the F90 pointer form?</div>
<div><br></div><div>Also, would this be a suitable place to use the application ordering in petsc? </div><div><br></div><div>Thanks,</div><div><br></div><div>Gaetan Kenway</div><div><br></div><div><br></div><div><br></div>