> On Jan 31, 2018, at 3:12 PM, Jed Brown <j...@jedbrown.org> wrote:
> 
> I think his point is that Fortran has a one-line if statement (no then
> and no endif), which simplifies the macro and usage.
> 
>  if (cond) SETERRQ(...)

   That doesn't work because the SETERRQ() has both the call to the error 
handler followed by a return which is two lines in Fortran.

> 
> "Smith, Barry F." <bsm...@mcs.anl.gov> writes:
> 
>>  No, that is CHKERRQ()
>> 
>> 
>>> On Jan 31, 2018, at 2:02 PM, Lisandro Dalcin <dalc...@gmail.com> wrote:
>>> 
>>> Maybe I'm missing something, but maybe this define is all what you need?
>>> 
>>> #define SETERRQ(ierr) if (ierr/=0) call PetscError(comm,ierr,0,"message")
>>> 
>>> program main
>>> integer ierr,comm
>>> call something(ierr); SETERRQ(ierr)
>>> end program main
>>> 
>>> 
>>> 
>>> On 6 January 2018 at 02:33, Smith, Barry F. <bsm...@mcs.anl.gov> wrote:
>>>> 
>>>> 
>>>>> On Jan 5, 2018, at 5:00 PM, Jed Brown <j...@jedbrown.org> wrote:
>>>>> 
>>>>> "Smith, Barry F." <bsm...@mcs.anl.gov> writes:
>>>>> 
>>>>>>> On Jan 5, 2018, at 4:18 PM, Jed Brown <j...@jedbrown.org> wrote:
>>>>>>> 
>>>>>>> "Smith, Barry F." <bsm...@mcs.anl.gov> writes:
>>>>>>> 
>>>>>>>>> On Jan 5, 2018, at 12:45 PM, Jed Brown <j...@jedbrown.org> wrote:
>>>>>>>>> 
>>>>>>>>> "Smith, Barry F." <bsm...@mcs.anl.gov> writes:
>>>>>>>>> 
>>>>>>>>>>> On Jan 4, 2018, at 5:10 PM, Blaise A Bourdin <bour...@lsu.edu> 
>>>>>>>>>>> wrote:
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> On Jan 4, 2018, at 3:16 PM, Smith, Barry F. <bsm...@mcs.anl.gov> 
>>>>>>>>>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> It's changed a bit.  It is better but you need to understand how 
>>>>>>>>>>>> the new one works, so take a few minutes to see how it works 
>>>>>>>>>>>> before converting.
>>>>>>>>>>> Got it.
>>>>>>>>>>> An example or a link to the fortran macro definition from the man 
>>>>>>>>>>> page would be nice
>>>>>>>>>>> I am confused about the rationale for putting the endif in the 
>>>>>>>>>>> macro, though.
>>>>>>>>>> 
>>>>>>>>>> It matches the C paradigm
>>>>>>>>> 
>>>>>>>>> Hardly.
>>>>>>>> 
>>>>>>>> It matches the paradigm as close as can be reasonable done.
>>>>>>>> 
>>>>>>>> I debated putting the then into the macros also.
>>>>>>>> 
>>>>>>>>> #define SETERRQ(c,ierr,s)  then ;call 
>>>>>>>>> PetscError(c,ierr,0,s);return;endif
>>>>>>>> 
>>>>>>>> So usage would be
>>>>>>>> 
>>>>>>>>   if (bad) SETERRQ();
>>>>>>>> 
>>>>>>>> would that be better.
>>>>>>> 
>>>>>>> No, Fortran isn't C.
>>>>>>> 
>>>>>>> if (bad) then
>>>>>>>   SETERRQ(...)
>>>>>>> endif
>>>>>>> 
>>>>>>> It doesn't get used so much from Fortran that we need to conceal the
>>>>>>> language constructs.
>>>>>> 
>>>>>> It will, eventually I want all Fortran examples/tests to have checks on 
>>>>>> every call (like with have in C).
>>>>> 
>>>>> CHKERRQ does the if internally, so it also has the endif.
>>>> 
>>>> What is the relevance of this statement.
>>>>> 
>>>>> SETERRA/SETERRQ is used a total of 34 times in 17 Fortran files.
>>>>> SETERRQ is used a median of zero times and an average of less than 1 in
>>>>> the C examples.
>>>> 
>>>>  I am not sure why you are saying this. My resistance to change has 
>>>> nothing to do with how often it is used.
>>>> 
>>>>  I am leaning to changing it but don't want to until all the test harness 
>>>> branches etc get into master. So it will be a few days.
>>>> 
>>>>> 
>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> This Fortran:
>>>>>>>>> 
>>>>>>>>> #define SETERRQ(c,ierr,s)  ;call PetscError(c,ierr,0,s);return;endif
>>>>>>>>> 
>>>>>>>>> This would be like writing this C
>>>>>>>>> 
>>>>>>>>> #define SETERRQ(c,ierr,s) return PetscError(...); }
>>>>>>>>> 
>>>>>>>>> to be used like
>>>>>>>>> 
>>>>>>>>> if (BAD) { SETERRQ(comm, ierr, "why")
>>>>>>>>> 
>>>>>>>>> which is just bananas and still not as gross as the Fortran.  You 
>>>>>>>>> might
>>>>>>>>> not have noticed this because SETERRQ is not called from any of 
>>>>>>>>> PETSc's
>>>>>>>>> Fortran examples.
>>>>>>>> 
>>>>>>>> But SETERRA() is and has the same pattern.
>>>>>>> 
>>>>>>> It isn't syntactically correct when !defined(PETSC_USE_ERRORCHECKING).
>>>>>>> The endif isn't going to kill anyone and pulling it out of the macro
>>>>>>> will make it easier to understand and avoid the circus antics when used
>>>>>>> in any context other than a positive conditional with no else clause.
>>>>>> 
>>>>>> I'll take this under advisement. Of course in our examples the endif 
>>>>>> will ALWAYS be on the same line as the rest. Using three lines for a 
>>>>>> SETERRQ() is ugly.
>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>>>>> 
>>>>>>>>>>> Beside not having unmatched if / end if in my code, in a select 
>>>>>>>>>>> case construct, I have to write something as ugly as
>>>>>>>>>>> 
>>>>>>>>>>> select case (i)
>>>>>>>>>>>       case(1)
>>>>>>>>>>>               !do something
>>>>>>>>>>>       case(2)
>>>>>>>>>>>               !do something else
>>>>>>>>>>>       case default
>>>>>>>>>>>               if (0 == 0) then
>>>>>>>>>>>                       
>>>>>>>>>>> SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANG,”invalid value”)
>>>>>>>>>>> end select
>>>>>>>>>>> 
>>>>>>>>>> What is ugly about this ? except that you put the SETERRQ on a new 
>>>>>>>>>> line which you did not need to do.
>>>>>>>>> 
>>>>>>>>> Reread the above code.  Requiring the dummy opening if statement is 
>>>>>>>>> nuts.
>>>>>>>> 
>>>>>>>> Agreed. He should not use SETERRQ() in this case, should call the 
>>>>>>>> error functions directly)
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> How do you want to write it so it is prettier?
>>>>>>>>> 
>>>>>>>>> SETERRQ should not include that endif.  CHKERRQ has the opening if and
>>>>>>>>> thus needs the closing too (so it's as intended).  Also note that your
>>>>>>>>> first reply to Blaise was talking about CHKERRQ when he was asking 
>>>>>>>>> about
>>>>>>>>> SETERRQ.
>>>>>>>> 
>>>>>>>> Hmm, I'm not sure about. Oh well, it doesn't matter. You have 
>>>>>>>> convinced me of anything.
>>>> 
>>> 
>>> 
>>> 
>>> -- 
>>> Lisandro Dalcin
>>> ============
>>> Research Scientist
>>> Computer, Electrical and Mathematical Sciences & Engineering (CEMSE)
>>> Extreme Computing Research Center (ECRC)
>>> King Abdullah University of Science and Technology (KAUST)
>>> http://ecrc.kaust.edu.sa/
>>> 
>>> 4700 King Abdullah University of Science and Technology
>>> al-Khawarizmi Bldg (Bldg 1), Office # 0109
>>> Thuwal 23955-6900, Kingdom of Saudi Arabia
>>> http://www.kaust.edu.sa
>>> 
>>> Office Phone: +966 12 808-0459

Reply via email to