<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Fri, Oct 19, 2018 at 10:38 AM Klaij, Christiaan <<a href="mailto:C.Klaij@marin.nl">C.Klaij@marin.nl</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">As far as I (mis)understand fortran, this is a data protection<br>
thing: all arguments are passed in from above but the subroutine<br>
is only allowed to change rr and ierr, not aa and xx (if you try,<br>
you get a compiler warning). That's why I find it very odd to<br>
give an intent(in) to rr. </blockquote><div><br></div><div>rr is not changed, and it cannot be. You pass in a pointer to the object and we</div><div>fill up the object with values. We cannot change that pointer.</div><div><br></div><div>   Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">But I've tried your suggestion anyway:<br>
both intent(in) and intent(inout) for rr do work! Can't say I<br>
understand though.<br>
<br>
Below's a small example of what I was expecting. Change rr to<br>
intent(in) and the compiler complains.<br>
<br>
Chris<br>
<br>
$ cat intent.f90<br>
program intent<br>
<br>
  implicit none<br>
<br>
  real, allocatable :: aa(:), xx(:), rr(:)<br>
  integer :: ierr<br>
<br>
  allocate(aa(10),xx(10),rr(10))<br>
<br>
  aa = 1.0<br>
  xx = 2.0<br>
<br>
  call matmult(aa,xx,rr,ierr)<br>
<br>
  print *, rr(1)<br>
  print *, ierr<br>
<br>
  deallocate(aa,xx,rr)<br>
<br>
  contains<br>
<br>
    subroutine matmult(aa,xx,rr,ierr)<br>
      real, intent(in) :: aa(:), xx(:)<br>
      real, intent(out):: rr(:)<br>
      integer, intent(out) :: ierr<br>
      rr=aa*xx<br>
      ierr=0<br>
    end subroutine matmult<br>
<br>
end program intent<br>
$ ./a.out<br>
   2.000000<br>
           0<br>
<br>
<br>
<br>
<br>
dr. ir. Christiaan Klaij  | Senior Researcher | Research & Development<br>
MARIN | T +31 317 49 33 44 | mailto:<a href="mailto:C.Klaij@marin.nl" target="_blank">C.Klaij@marin.nl</a> | <a href="http://www.marin.nl" rel="noreferrer" target="_blank">http://www.marin.nl</a><br>
<br>
MARIN news: <a href="http://www.marin.nl/web/News/News-items/Seminar-Scheepsbrandstof-en-de-mondiale-zwavelnorm-2020.htm" rel="noreferrer" target="_blank">http://www.marin.nl/web/News/News-items/Seminar-Scheepsbrandstof-en-de-mondiale-zwavelnorm-2020.htm</a><br>
<br>
________________________________________<br>
From: Smith, Barry F. <<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>><br>
Sent: Friday, October 19, 2018 2:32 PM<br>
To: Klaij, Christiaan<br>
Cc: <a href="mailto:petsc-users@mcs.anl.gov" target="_blank">petsc-users@mcs.anl.gov</a><br>
Subject: Re: [petsc-users] fortran INTENT with petsc object gives segfault after upgrade from 3.8.4 to 3.10.2<br>
<br>
   Hmm, the intent of all three first arguments should be in since they are passed in from the routine above. Does it work if you replace<br>
<br>
>  Vec, INTENT(out) :: rr_system<br>
<br>
with<br>
<br>
>  Vec, INTENT(in) :: rr_system<br>
<br>
?<br>
<br>
    Barry<br>
<br>
<br>
> On Oct 19, 2018, at 3:51 AM, Klaij, Christiaan <<a href="mailto:C.Klaij@marin.nl" target="_blank">C.Klaij@marin.nl</a>> wrote:<br>
><br>
> I've recently upgraded from petsc-3.8.4 to petsc-3.10.2 and was<br>
> surprised to find a number of segmentation faults in my test<br>
> cases. These turned out to be related to user-defined MatMult and<br>
> PCApply for shell matrices. For example:<br>
><br>
> SUBROUTINE systemMatMult(aa_system,xx_system,rr_system,ierr)<br>
>  Mat, INTENT(in) :: aa_system<br>
>  Vec, INTENT(in) :: xx_system<br>
>  Vec, INTENT(out) :: rr_system<br>
>  PetscErrorCode, INTENT(out) :: ierr<br>
>  ...<br>
> END<br>
><br>
> where aa_system is the shell matrix. This code works fine with<br>
> 3.8.4 and older, but fails with 3.10.2 due to invalid<br>
> pointers (gdb backtrace shows failure of VecSetValues due to<br>
> invalid first argument). After replacing by:<br>
><br>
> SUBROUTINE mass_momentum_systemMatMult(aa_system,xx_system,rr_system,ierr)<br>
>  Mat :: aa_system<br>
>  Vec :: xx_system<br>
>  Vec :: rr_system<br>
>  PetscErrorCode :: ierr<br>
>  ...<br>
> END<br>
><br>
> everything's fine again. So clearly something has changed since<br>
> 3.8.4 that now prevents the use of INTENT in Fortran (at least<br>
> using intel 17.0.1 compilers). Any reason for this?<br>
><br>
> Chris<br>
><br>
><br>
> dr. ir. Christiaan Klaij  | Senior Researcher | Research & Development<br>
> MARIN | T +31 317 49 33 44 | mailto:<a href="mailto:C.Klaij@marin.nl" target="_blank">C.Klaij@marin.nl</a> | <a href="http://www.marin.nl" rel="noreferrer" target="_blank">http://www.marin.nl</a><br>
><br>
> MARIN news: <a href="http://www.marin.nl/web/News/News-items/ReFRESCO-successfully-coupled-to-ParaView-Catalyst-for-insitu-analysis-1.htm" rel="noreferrer" target="_blank">http://www.marin.nl/web/News/News-items/ReFRESCO-successfully-coupled-to-ParaView-Catalyst-for-insitu-analysis-1.htm</a><br>
><br>
<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener</div><div><br></div><div><a href="http://www.cse.buffalo.edu/~knepley/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div></div></div></div>