Problems with VecGetArray in Fortran

Satish Balay balay at mcs.anl.gov
Tue Dec 15 14:05:45 CST 2009


In fortran - try and avoid passing constants with implicit types - and
explicitly define them.

i.e

        PetscScalar one
        one = 1.0d0
        call VecSet(tmp, one, ierr)

etc..

Also - VecGetArrayF90() can be prefered over the old VecGetArray() [assuming
f77 is nolonger needed]

Satish

        


On Tue, 15 Dec 2009, Barai, Pallab wrote:

> Hello,
> 
> I am initializing a Petsc Vector with 1.0 using the VecSet function. When I try to extract the values using VecGetArray, I get junk output in Fortran. I implemented the same thing in C and it works fine in C. 
> 
> The output and test code for both the Fortran and C are given below.
> 
> Is this a problem with the VecGetArray or am I missing something in my Fortran version of the code. Any help will be highly appreciated.
> 
> I ran it on 1 processor in a Cray XT-4 machine using PGI compilers.
> 
> Thanking you.
> Pallab
> 
> 
> 
> The output from Fortran code looks like: [The correct value is 1.0]
> 
> ********************************************
>  arr(            1 )=   4.5088266034982808E-313
>  arr(            2 )=   4.5088266034982808E-313
>  arr(            3 )=   4.5088266034982808E-313
>  arr(            4 )=   4.5088266034982808E-313
>  arr(            5 )=   4.5088266034982808E-313
>  arr(            6 )=   4.5088266034982808E-313
>  arr(            7 )=   4.5088266034982808E-313
>  arr(            8 )=   4.5088266034982808E-313
>  arr(            9 )=   4.5088266034982808E-313
>  arr(           10 )=   4.5088266034982808E-313
> ***********************************************
> 
> The output from the C code is: [this is the correct output]
> 
> ************************************************
> arr[0] = 1.000000
> arr[1] = 1.000000
> arr[2] = 1.000000
> arr[3] = 1.000000
> arr[4] = 1.000000
> arr[5] = 1.000000
> arr[6] = 1.000000
> arr[7] = 1.000000
> arr[8] = 1.000000
> arr[9] = 1.000000
> **************************************************
> 
> 
> The test codes are as follows:
> 
> Fortran:
> **************************************************
> program F_test_Vec
> 
> #include "finclude/petsc.h"
> #include "finclude/petscvec.h"
> 
>       Vec tmp
>       PetscScalar arr(1)
>       integer i
>       PetscOffset i_x
> 
>       call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
> 
>       call VecCreate(PETSC_COMM_WORLD, tmp, ierr)
>       call VecSetSizes(tmp, 10, PETSC_DECIDE, ierr)
>       call VecSetType(tmp,VECSEQ,ierr)
>       call VecSet(tmp, 1.0, ierr)
> 
>       call VecGetArray(tmp, arr, i_x, ierr)
> 
>       do i=1,10
>         write(*,*) 'arr(',i,')=',arr(i_x+i)
>       enddo
> 
>       call VecRestoreArray(tmp, arr, i_x, ierr)
> 
>       call VecDestroy(tmp, ierr)
> 
>       call PetscFinalize(ierr)
>       end
> **********************************************************
> 
> 
> 
> C:
> ***********************************************************
> #include "petsc.h"
> #include "petscvec.h"
> #include "stdio.h"
> 
> int main(int argc, char** argv) {
>   Vec tmp;
>   PetscScalar* arr;
>   int i;
> 
>   PetscInitialize(&argc, &argv, NULL, NULL);
> 
>   VecCreate(PETSC_COMM_WORLD, &tmp);
>   VecSetSizes(tmp, 10, PETSC_DECIDE);
>   VecSetType(tmp,VECSEQ);
>   VecSet(tmp, 1.0);
> 
>   VecGetArray(tmp, &arr);
> 
>   for(i = 0; i < 10; i++) {
>     printf("arr[%d] = %lf\n", i, arr[i]);
>   }
> 
>   VecRestoreArray(tmp, &arr);
> 
>   VecDestroy(tmp);
> 
>   PetscFinalize();
> }
> ****************************************************



More information about the petsc-users mailing list