[petsc-users] Segmentation violation issue when using MatSetVals in Fortran

Austin Herrema aherrema at iastate.edu
Thu Feb 2 13:49:21 CST 2017


Ah. Yes that definitely explains it. Weird that it seemed to work in some
cases but I suppose the output would be total garbage. Anyways. Thank you
both.

Austin

On Thu, Feb 2, 2017 at 1:32 PM, Matthew Knepley <knepley at gmail.com> wrote:

> On Thu, Feb 2, 2017 at 1:25 PM, Austin Herrema <aherrema at iastate.edu>
> wrote:
>
>> Hello all,
>>
>> I'm having a strange issue when using the MatSetVals function in Fortran.
>> The code is quite large, but relevant snippets of what I'm trying to do are
>> below.
>>
>>   ! PETSc variable declaration
>>   Mat LHS
>>   PetscErrorCode ier
>>   PetscInt idx1(nsd*nsd*nshl*nshl), idx2(nsd*nsd*nshl*nshl)
>>   PetscScalar vals(nsd*nsd*nshl*nshl)
>>
>
> vals should be of size nidx1 * nidx2.
>
>   Matt
>
>
>>
>>   ! Code for filling in index and value arrays... I've verified that
>> there are 2304 elements in each array.
>>
>>   ! Fill in values
>>   call MatSetValues(LHS, nvals, idx1, nvals, idx2, vals, ADD_VALUES, ier)
>>
>> Upon executing this, I get a general segmentation violation error.
>> Running in Valgrind I get:
>>
>> ==87676== Invalid read of size 8
>> ==87676==    at 0x1008D1F45: MatSetValues_SeqAIJ (aij.c:461)
>> ==87676==    by 0x1004C523C: MatSetValues (matrix.c:1190)
>> ==87676==    by 0x10053F1A5: matsetvalues_ (matrixf.c:696)
>> ==87676==    by 0x10005F47D: petsc_fillmat_ (petsc_fillMat.F90:78)
>> ==87676==    by 0x10005E5C9: intelmass_shell_ (shell_IntElmAss.F90:330)
>> ==87676==    by 0x100057259: solflowgmres_ (solflow.F90:125)
>> ==87676==    by 0x100051051: MAIN__ (driver.F90:140)
>> ==87676==    by 0x1000545C4: main (driver.F90:7)
>> ==87676==  Address 0x10a4dac60 is 0 bytes after a block of size 18,432
>> alloc'd
>> ==87676==    at 0x100088681: malloc (in /usr/local/Cellar/valgrind/3.1
>> 2.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
>> ==87676==    by 0x10005EF47: petsc_fillmat_ (petsc_fillMat.F90:23)
>> ==87676==    by 0x10005E5C9: intelmass_shell_ (shell_IntElmAss.F90:330)
>> ==87676==    by 0x100057259: solflowgmres_ (solflow.F90:125)
>> ==87676==    by 0x100051051: MAIN__ (driver.F90:140)
>> ==87676==    by 0x1000545C4: main (driver.F90:7)
>> ==87676==
>> ==87676== Conditional jump or move depends on uninitialised value(s)
>> ==87676==    at 0x1008D1F57: MatSetValues_SeqAIJ (aij.c:463)
>> ==87676==    by 0x1004C523C: MatSetValues (matrix.c:1190)
>> ==87676==    by 0x10053F1A5: matsetvalues_ (matrixf.c:696)
>> ==87676==    by 0x10005F47D: petsc_fillmat_ (petsc_fillMat.F90:78)
>> ==87676==    by 0x10005E5C9: intelmass_shell_ (shell_IntElmAss.F90:330)
>> ==87676==    by 0x100057259: solflowgmres_ (solflow.F90:125)
>> ==87676==    by 0x100051051: MAIN__ (driver.F90:140)
>> ==87676==    by 0x1000545C4: main (driver.F90:7)
>> ==87676==
>> ==87676== Conditional jump or move depends on uninitialised value(s)
>> ==87676==    at 0x1008D1F62: MatSetValues_SeqAIJ (aij.c:463)
>> ==87676==    by 0x1004C523C: MatSetValues (matrix.c:1190)
>> ==87676==    by 0x10053F1A5: matsetvalues_ (matrixf.c:696)
>> ==87676==    by 0x10005F47D: petsc_fillmat_ (petsc_fillMat.F90:78)
>> ==87676==    by 0x10005E5C9: intelmass_shell_ (shell_IntElmAss.F90:330)
>> ==87676==    by 0x100057259: solflowgmres_ (solflow.F90:125)
>> ==87676==    by 0x100051051: MAIN__ (driver.F90:140)
>> ==87676==    by 0x1000545C4: main (driver.F90:7)
>> ==87676==
>>
>> I'm not terribly experienced with Valgrind but I can't find anything too
>> helpful in that output. It shows the traceback but I still cannot
>> understand *why *the error is being produced. Strangely, if I try to set
>> the matrix values in a few smaller chunks, i.e.
>>
>>   call MatSetValues(LHS, 500, idx1(1:500), 500, idx2(1:500), vals(1:500),
>> ADD_VALUES, ier)
>>   call MatSetValues(LHS, 500, idx1(501:1000), 500, idx2(501:1000),
>> vals(501:1000), ADD_VALUES, ier)
>>   call MatSetValues(LHS, 500, idx1(1001:1500), 500, idx2(1001:1500),
>> vals(1001:1500), ADD_VALUES, ier)
>>   call MatSetValues(LHS, 500, idx1(1501:2000), 500, idx2(1501:2000),
>> vals(1501:2000), ADD_VALUES, ier)
>>   call MatSetValues(LHS, 304, idx1(2001:2304), 304, idx2(2001:2304),
>> vals(2001:2304), ADD_VALUES, ier)
>>
>> Then everything works with no errors. Is there some kind of limitation to
>> how many values you can insert into a matrix at once? Would strike me as
>> strange. I can assign elements one at a time but reducing the number of
>> calls to MatSetVals by a factor of 2000 would be fantastic. I would be
>> happy to provide more details of the matrix setup if necessary.
>>
>> Thank you for any help!
>> Austin
>>
>>
>> --
>> *Austin Herrema*
>> PhD Student | Graduate Research Assistant | Iowa State University
>> Wind Energy Science, Engineering, and Policy | Mechanical Engineering
>>
>
>
>
> --
> What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which their
> experiments lead.
> -- Norbert Wiener
>



-- 
*Austin Herrema*
PhD Student | Graduate Research Assistant | Iowa State University
Wind Energy Science, Engineering, and Policy | Mechanical Engineering
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20170202/7d33c291/attachment.html>


More information about the petsc-users mailing list