Programming in *.f90 free format with PETSc

Ben Tay zonexo at gmail.com
Thu Aug 9 03:20:46 CDT 2007


Hi Satish,

I am sorry if I have made you angry. I may have missed out some 
important points which you tried to highlight. I was converting several 
of my .F fixed format files to .f90 (or .F90) free format and some files 
which don't need declaration of PETSc type variable worked while some 
don't.

However, I must clarify that the .f90 or .F90 did not bother me after a 
while since in visual fortran or ifort, using the option -fpp enables 
the .f90 files to be preprocessed too. Of course, if .F90 was used, -fpp 
is not required.

In my sample file shown just now, I did not have any include statments 
in my subroutine. They're only present in the module 's section. 
Checking your prev. email, you indeed mention that the PETSc includes 
files must be in each and every subroutine. However, doing this  gave me 
more errors. Hence, I've followed another user (Paul T Bauman) 's 
recommendation which states that only preprocessed statements not inside 
the module needs to be placed inside the subroutine. With this, I only 
has 3 errors, which concerns PETSC_COMM_SELF, PETSC_NULL_INTEGER and 
PETSC_NULL_CHARACTER not having an explicit type. I figured out that using:

MPI_Comm PETSC_COMM_SELF


will eliminate 1 error, although it was not required before. However, 
what about the other 2? Should I defined them as integer or character 
and give them a value using parameter? What value should I give them? 
You mention this in your prev email:

integer NORM_MAX
parameter NORM_MAX=3


You also give a template to follow. I also tried to cut and paste and 
use it but it gave lots of error. I had used it in visual fortran :

#define PETSC_AVOID_DECLARATIONS
#include "include/finclude/petsc.h"
#include "include/finclude/petscvec.h"
#undef PETSC_AVOID_DECLARATIONS

module foobar

Vec abc

contains
subroutine xyz()
use foobar
implicit none
#include "include/finclude/petsc.h"
#include "include/finclude/petscvec.h"
#include "include/finclude/petscvec.h90"

 Vec fbar
 

end subroutine
end module

As said above, upon removing the include files in the subroutine and the 
"use foobar" statement, everything's ok. You can give it a try too.

Lastly, I understand that you have been helping a lot of users and 
there's really a lot of stupid users around (I know I'm one of them ;-) 
). Thank you for your patience.

Satish Balay wrote:
> On Thu, 9 Aug 2007, Ben Tay wrote:
>
>   
>> Hi,
>>
>> Guess I'm too used to typing .f90 ;-) .... I've changed it to .F90 before but
>> perhaps at that time the error I got didn't disappear so I didn't bother after
>> that. 
>>     
>
> I'm sorry - but you can't keep silently discarding the sugestions we
> make and keep reporting the same issues multiple times..
>
> This is frustrating.
>
>   
>> I'm working in windows so I thought the capital letter doesn't really
>> matter.
>>     
>
> I've indicated this before. Most compilers use .F90 for prerpocessed
> free form.  And you keep indicating this is what you require. [Most
> compilers don't preprocess .f90 files]
>
>   
>> Moreover, .f90 also works with my ifort in linux. Is it really
>> important? If so, I'll change all my .f90 to F90. Thanks for highlighting.
>>
>> Here's a sample code test.F90:
>>     
>
> I'll need a test code that can reproduce the problems you report.
>
>   
>> module global_data
>>
>> implicit none
>>
>> save
>>
>> #define PETSC_AVOID_DECLARATIONS
>> #include "include/finclude/petsc.h"
>> #include "include/finclude/petscvec.h"
>> #include "include/finclude/petscmat.h"
>> #include "include/finclude/petscksp.h"
>> #include "include/finclude/petscpc.h"
>> #undef PETSC_AVOID_DECLARATIONS
>>
>> integer :: size_x,size_y
>>
>> Mat    A_mat      !  /* sparse matrix */
>>
>> !MPI_Comm PETSC_COMM_SELF   -   commented out will result in error
>>
>> contains
>>
>> subroutine allo_var
>>     
>
> Again you are ignoring the sample template I sent you. You need to
> include PETSc include files in every subroutine.
>
> I'm sorry I can't repeat this anymore.
>
> Satish
>
>   
>> !allocate memory for variables
>>
>> integer :: status(2),ierr,k
>>
>> size_x=10;size_y=10
>>
>> call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
>>
>> call
>> MatCreateSeqAIJ(PETSC_COMM_SELF,size_x*size_y,size_x*size_y,13,PETSC_NULL_INTEGER,A_mat,ierr)
>>
>> end subroutine allo_var
>>
>> end module global_data
>>
>> I got "Error: This name does not have a type, and must have an explicit type.
>> [PETSC_NULL_CHARACTER]". Same for PETSC_NULL_INTEGER and PETSC_COMM_SELF.
>>
>> It was ok when I'm programming in fixed format.
>>
>> Thanks
>>
>> Satish Balay wrote:
>>     
>>> On Thu, 9 Aug 2007, Ben Tay wrote:
>>>
>>>   
>>>       
>>>> Hi,
>>>>
>>>> when I changed my global.F to global.f90,
>>>>     
>>>>         
>>> Any perticular reason why you keep using .f90 suffix even though I've
>>> recommended using .F90 suffix [for preprocessed free form] a few
>>> times?
>>>
>>>   
>>>       
>>>> I was told that PETSC_COMM_SELF, PETSC_NULL_INTEGER and
>>>> PETSC_NULL_CHARACTER does not have a type.
>>>>     
>>>>         
>>> Please send a test code that demonstrates this problem.
>>>
>>> Satish
>>>
>>>
>>>   
>>>       
>>     
>
>
>   




More information about the petsc-users mailing list