
HELP FILE FOR DEBUGGING ON THE BASIS OF "MAKE ABIAUTY"
======================================================

After executing
make abiauty
in the src directory, one can get several types of messages.
However, they are not always very indicative of what should be corrected.
Here follows a set of hints to fix the problem identified by abiauty.

Index

0. SOME INFORMATION ...

1. QUESTION ...
How to debug ABINIT when he following diagnostic is obtained :
ERROR(32_util/interpol3d.F90): found end statement at line 166 for '' subroutine interpol3d_indices '' before executable section

2. QUESTION ...
How to debug ABINIT when he following diagnostic is obtained :
ERROR(66_paw/qijb_bk.F90): found end statement at line 183 for '' subroutine  '' instead of '' subroutine qijb_bk ''

3. QUESTION ...
How to debug ABINIT when the following diagnostics are obtained :
ERROR(72_response/nstpaw3.F90): found end statement at line 652 for '' if  '' instead of '' do construct ''
ERROR(42_parser/instrng.F90): found end statement at line 316 for '' subroutine instrng '' instead of '' do construct ''

4. QUESTION ...
How to debug ABINIT when the following diagnostic is obtained :
ERROR(95_drive/timana.F90): semicolon found at line 853 with case(1)  statement

=====================================================================================================================================

0. SOME INFORMATION ...

The goal of abiauty is to indent correctly the lines inside the F90 source files of ABINIT.
In order to do this, the F90 source files must respect some rules...
It will be quite long to explain them. You can get a feeling by simply looking at existing files !

=====================================================================================================================================

1. QUESTION ...

How to debug ABINIT when he following diagnostic is obtained :
ERROR(32_util/interpol3d.F90): found end statement at line 166 for '' subroutine interpol3d_indices '' before executable section

* Answer ...

The script abiauty relies heavily on the structuration of the source file.
In particular, after a section where variables are declared, abiauty expects
the following line :

! *************************************************************************

(namely, a '!', then a blank, then 73 stars - copy it from here, it is the simplest)

In the above mentioned case, such a line was missing at the line 138 of the file 32_util/interpol3d.F90,
preventing abiauty to understand the structure of the file.

More explicitly, here is the old section (that does not follow the abirules) :

 real(dp) :: d1,d2,d3
 d1=one/nr1

And here is the new section (that follows the abirules) :

 real(dp) :: d1,d2,d3

! *************************************************************************

 d1=one/nr1



=====================================================================================================================================

2. QUESTION ...

How to debug ABINIT when he following diagnostic is obtained :
ERROR(66_paw/qijb_bk.F90): found end statement at line 183 for '' subroutine  '' instead of '' subroutine qijb_bk '' 

* Answer ...

Simply, you have not mentioned the name of the routine at the "end subroutine statement".
So, in the routine name_of_routine.F90, replace :

end subroutine 

by

end subroutine name_of_routine

====================================================================================================================================

3. QUESTION ...

How to debug ABINIT when the following diagnostics are obtained : 
ERROR(72_response/nstpaw3.F90): found end statement at line 652 for '' if  '' instead of '' do construct ''
ERROR(42_parser/instrng.F90): found end statement at line 316 for '' subroutine instrng '' instead of '' do construct ''

* Answer ...

There are some fundamental limitations of the abiauty script, moreover accompanied with a diagnostic that
is of no help...


(1) abiauty cannot treat a "if" statement, followed by a conditional that is split on two lines, with moreover, a comment at the 
end of the first line. E.g. it cannot treate :

 if(  conditional1 .and. &   ! Here is a comment, that cannot be treated correctly by abiauty
&     conditional2         ) then

You can choose between different possibilities avoid this problem :

! Here is a comment BEFORE the if
 if(  conditional1 .and. &   
&     conditional2         ) then


OR

 if(  conditional1 .and. conditional2 ) then ! Here is a comment for the whole line

OR


 if(  conditional1 .and. &
&     conditional2 ) then ! Here is a comment for the split line



(2) in certain cases, abiauty cannot treat a "call" that appears immediately after a "if". E.g it cannot treate :

if(condition) call name_of_subroutine

You have to replace it by

if(condition) then
  call name_of_subroutine
endif



(3) abiauty cannot treat a "enddo" that appears on the same line than another command thanks to a ";". E.g. it cannot treate :

           do ii=1,nn ; mm=mm+ii ; enddo

You have to replace it by

   do ii=1,nn
     mm=mm+ii
   enddo


The indication of the line where the script realizes that there is a problem, is not the indication of the line at which the
problem occurs.
However, the abiauty script identifies also, earlier, that there is a problem with this line. Typically, the two error messages appear :

ERROR(42_parser/instrng.F90): semicolon found at line 102 with do  statement
ERROR(42_parser/instrng.F90): found end statement at line 103 for '' if  '' instead of '' do construct '' 

or

ERROR(42_parser/instrng.F90): semicolon found at line 101 with do  statement
ERROR(42_parser/instrng.F90): found end statement at line 316 for '' subroutine instrng '' instead of '' do construct ''

Suggestion : examine  first the 'semicolon found at line 102 with do  statement' error message ...


=====================================================================================================================================

4. QUESTION ...

How to debug ABINIT when the following diagnostic is obtained :

ERROR(95_drive/timana.F90): semicolon found at line 853 with case(1)  statement

* Answer ...

Following the abirules, one should not have the following syntax :

case(xx) ; instruction

The instruction should instead appear in the line following the case condition :

case(xx)
  instruction
