[petsc-users] how to use MatSetValues?

Tomasz Jankowski tomjan at jay.au.poznan.pl
Tue Mar 8 03:38:51 CST 2011


> You should do a loop over the values
>
> for (int i = 0; i < 5; i++)
> MatSetValues(xx,1,row[i],1,col[i],val[i],INSERT_VALUES);

here is the point Gianluca,
I don't want to store one by one values because It will take the ages with 
hundreds of milions of values(even with preallocation). I would like to 
set size of row,col and val arrays to e.g. one milion than fill them with
data and such prepared large chunk of data pass to MatSetValues. What is
suggested by petsc's developers. But it doesn't work properly for me - I 
dont know what i'm doing wrong...

tom

>
>
> On 8 March 2011 10:16, Tomasz Jankowski <tomjan at jay.au.poznan.pl> wrote:
>>> I think m and n are the number of rows and columns you are inserting
>>> in the matrix. If you insert one value at a time, that would be
>>>
>>> MatSetValues(xx,1,row,1,col,val,INSERT_VALUES);
>>>
>>> I hope it helps
>>>
>>> Gianluca
>>
>> hello Gianluca, thanks for re.
>>
>> your sugestion doesn't work.
>>
>> my code
>>
>>  Mat xx;
>>  PetscInitialize(&argc,&argv,(char *)0,help);
>>
>>  MatCreateSeqAIJ(PETSC_COMM_SELF,5,5,PETSC_DECIDE,PETSC_NULL,&xx);
>>
>>  PetscInt row [] ={0, 1, 2, 3, 4};
>>  PetscInt col [] = {1, 0, 4, 2, 3};
>>  PetscScalar val[] = {1.1,2.2,3.3,4.4,5.5};
>>
>>  MatSetValues(xx,5,row,5,col,val,INSERT_VALUES);
>>
>>  MatAssemblyBegin(xx,MAT_FINAL_ASSEMBLY);
>>  MatAssemblyEnd(xx,MAT_FINAL_ASSEMBLY);
>>
>>  MatView(xx,PETSC_VIEWER_STDOUT_WORLD);
>>  PetscFinalize();
>>
>> and here few examples of results
>>
>>  MatSetValues(xx,1,row,1,col,val,INSERT_VALUES);
>>
>> row 0: (1, 1.1)
>> row 1:
>> row 2:
>> row 3:
>> row 4:
>>
>>
>>  MatSetValues(xx,5,row,1,col,val,INSERT_VALUES);
>>
>> row 0: (1, 1.1)
>> row 1: (1, 2.2)
>> row 2: (1, 3.3)
>> row 3: (1, 4.4)
>> row 4: (1, 5.5)
>>
>>  MatSetValues(xx,5,row,5,col,val,INSERT_VALUES);
>>
>> row 0: (0, 2.2)  (1, 1.1)  (2, 4.4)  (3, 5.5)  (4, 3.3)
>> row 1: (0, 4.94066e-324)  (1, 2.07411e-317)  (2, 1.4822e-323)  (3,
>> 2.07356e-317)  (4, 4.24399e-314)
>> row 2: (0, 6.36599e-314)  (1, 2.122e-314)  (2, 2.07402e-317)  (3,
>> 1.5957e-316)  (4, 1.18832e-312)
>> row 3: (0, 6.95332e-310)  (1, 2.07367e-317)  (2, 0)  (3, 1.20407e-312)  (4,
>> 0)
>> row 4: (0, 6.95332e-310)  (1, 0)  (2, 2.07378e-317)  (3, 0)  (4, 2.122e-314)
>>
>> tom
>>
>> ########################################################
>> #               tomjan at jay.au.poznan.pl                #
>> #              jay.au.poznan.pl/~tomjan/               #
>> ########################################################
>>
>> On Tue, 8 Mar 2011, Gianluca Meneghello wrote:
>>
>>> I think m and n are the number of rows and columns you are inserting
>>> in the matrix. If you insert one value at a time, that would be
>>>
>>> MatSetValues(xx,1,row,1,col,val,INSERT_VALUES);
>>>
>>> I hope it helps
>>>
>>> Gianluca
>>>
>>> On 8 March 2011 09:39, Tomasz Jankowski <tomjan at jay.au.poznan.pl> wrote:
>>>>
>>>> hello,
>>>>
>>>> Could someone give me a hand with MatSetValues function?
>>>>
>>>> suppose such example sparse matrix
>>>>
>>>> 0   1.1 0   0   0
>>>> 2.2 0   0   0   0
>>>> 0   0   0   0   3.3
>>>> 0   0   4.4 0   0
>>>> 0   0   0   5.5 0
>>>>
>>>> after storing it in row, col and val arrays we have
>>>>
>>>> row[0] = 0;col[0]=1;val[0]=1.1;
>>>> row[1] = 1;col[1]=0;val[1]=2.2;
>>>> row[2] = 2;col[2]=4;val[2]=3.3;
>>>> row[3] = 3;col[3]=2;val[3]=4.4;
>>>> row[3] = 4;col[3]=3;val[4]=5.5;
>>>>
>>>> question is: how to use MatSetValues with it?
>>>>
>>>> I thought that 'MatSetValues(xx,5,row,1,col,val,INSERT_VALUES);' would be
>>>> good but it doesn't .(I suppose I don't fully anderstand how it works...)
>>>>
>>>> thanks,
>>>>
>>>> tom
>>>>
>>>> ########################################################
>>>> #               tomjan at jay.au.poznan.pl                #
>>>> #              jay.au.poznan.pl/~tomjan/               #
>>>> ########################################################
>>>>
>>>
>>>
>>>
>>> --
>>> "[Je pense que] l'homme est un monde qui vaut des fois les mondes et
>>> que les plus ardentes ambitions sont celles qui ont eu l'orgueil de
>>> l'Anonymat" -- Non omnibus, sed mihi et tibi
>>> Amedeo Modigliani
>>
>
>
>
> -- 
> "[Je pense que] l'homme est un monde qui vaut des fois les mondes et
> que les plus ardentes ambitions sont celles qui ont eu l'orgueil de
> l'Anonymat" -- Non omnibus, sed mihi et tibi
> Amedeo Modigliani
>


More information about the petsc-users mailing list