[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Programming in *.f90 free format with PETSc



Hi,

Thanks Paul. I finally realised where my problem lies. It's becos I forgot to add -fpp to the ifort option. It's working now.

However, why can't I include

#include "include/finclude/petscmat.h90"

in the declaration? It seems to cause some conflicts...

Thanks

Paul T. Bauman wrote:
Hi Ben,

Here is the format I use in my .f90 modules. Note I do not know what the standard is, but this "style" has worked with ifort, gfortran, g95 and Visual Studio (so I'm told).
module IAmAModule


implicit none

private !(you don't need this if you don't want it)

#PREPROCESSING STATEMENTS HERE (these will be seen by all subroutines contained in the module)

public :: whatever needs to be public

integer :: declare variables you want in the module

contains

subroutine IAmASubroutine (note this format works for a subroutine not in a module

implicit none

#PREPROCESSING STATEMENTS NOT INCLUDED IN THE MODULE

variable declarations

code here...

end subroutine IAmASubroutine

end module IAmAModule

It looks like in your case below, the preprocessing statements are before the program - they must be inside the program. Put them after implicit none and before any variable declarations (in case you use a PETSc type variable).

Good Luck,

Paul

Ben Tay wrote:
Hi,
I can compile and run with visual fortran by putting all the declarations inside a subroutine e.g.
module ada


...

subroutine ddd


#define PETSC_AVOID_DECLARATIONS
#include "include/finclude/ petsc.h"
<other includes>
#undef PETSC_AVOID_DECLARATIONS

....

end subroutine ddd


end module ada
However, on my school's server which uses ifort, I get errors both using your way and my way e.g.


#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"
#include "include/finclude/petscmat.h90"
#undef PETSC_AVOID_DECLARATIONS

program test

implicit none

integer :: x,y

Vec test_vec

x=1

print *, x

end program test

I compile using
ifort -r8 -132 -fPIC -g -c -static-libcxa -O3 -I/lsftmp/g0306332/petsc-2.3.3-p0 -I/lsftmp/g0306332/petsc-2.3.3-p0/bmake/atlas3 -I/lsftmp/g0306332/petsc-2.3.3-p0/include -I/lsftmp/g0306332/petsc-2.3.3-p0/externalpackages/hypre- 2.0.0/atlas3/include -I/lsftmp/g0306332/mpich2/include temp.f90
and get the error msg:
fortcom: Warning: Bad # preprocessor line
fortcom: Warning: Bad # preprocessor line
fortcom: Warning: Bad # preprocessor line
fortcom: Warning: Bad # preprocessor line
fortcom: Warning: Bad # preprocessor line
fortcom: Warning: Bad # preprocessor line
fortcom: Warning: Bad # preprocessor line
fortcom: Warning: Bad # preprocessor line
fortcom: Error: temp.f90, line 18: Syntax error, found IDENTIFIER 'TEST_VEC' when expecting one of: => = . ( : %
Vec test_vec
----^
fortcom: Error: temp.f90, line 18: This name does not have a type, and must have an explicit type. [VEC]
Vec test_vec
^
fortcom: Error: temp.f90, line 18: This name does not have a type, and must have an explicit type. [TEST_VEC]
Vec test_vec
----^
compilation aborted for temp.f90 (code 1)
I also tried shifting the declarations after the "program test" line but it also failed. There is no problem if I changed the code to fixed format.
Thanks


On 8/6/07, *Satish Balay* <balay@xxxxxxxxxxx <mailto:balay@xxxxxxxxxxx>> wrote:

    This is incorrect usage.

    If you are getting errors with the correct usage, send us the error
    messages, with your code, and we can sugest fixes.

    - one issue could be

    > > #define PETSC_AVOID_DECLARATIONS
    > > #include "include/finclude/petsc.h"
    > > #include "include/finclude/petscvec.h90"  <--- This should be
    removed from here..
    > > <other includes>
    > > #undef PETSC_AVOID_DECLARATIONS
    > >
    > > moudle foobar
    > > <other module stuff>
    > > end module


Satish

    On Mon, 6 Aug 2007, Ben Tay wrote:

    > Hi,
    >
    > I tried to use
    >
    > #define PETSC_AVOID_DECLARATIONS
    > #include "include/finclude/petsc.h"
    > <other includes>
    > #undef PETSC_AVOID_DECLARATIONS
    >
    >
    > module ada
    > ...
    >
    > subroutine ....
    >
    > end module ada
    >
    > but the compiler says that the module is placed in the wrong
    order. Anyway, I
    > just move the top 4 lines into the subroutine instead and it
    worked. Thanks
    >
    > module ada
    >
    > ...
    >
    > subroutine ddd
    >
    > #define PETSC_AVOID_DECLARATIONS
    > #include "include/finclude/petsc.h"
    > <other includes>
    > #undef PETSC_AVOID_DECLARATIONS
    >
    > ....
    >
    > end subroutine ddd
    >
    >
    >
    >
    > Satish Balay wrote:
    > > you can use .F90 suffix for free-from preprocesed code. [or use
    > > compiler options to force it always use free-form]
    > >
    > > And when using fortran modules use the following organization:
    > >
    > >
    > > #define PETSC_AVOID_DECLARATIONS
    > > #include "include/finclude/petsc.h"
    > > <other includes>
    > > #undef PETSC_AVOID_DECLARATIONS
    > >
    > > moudle foobar
    > > <other module stuff>
    > > end module
    > >
    > > subroutine xyz()
    > > use foobar
    > > implicit none
    > > #include "include/finclude/petsc.h"
    > > <other includes>
    > > <code>
    > > end subroutine
    > > <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    > >
    > > Satish
    > >
    > > On Mon, 6 Aug 2007, Ben Tay wrote:
    > >
    > >
    > > > Hi,
    > > >
    > > > I've no problem writing out codes in fortran fixed format
    with PETSc.
    > > > However,
    > > > is it possible to do it in fortran free format as well?
    > > >
    > > > I'm using visual fortran and there's error.
    > > >
    > > > original :
    > > >
    > > > test.F
    > > >
    > > > module global_data
    > > >
    > > >    implicit none
    > > >
    > > >    save
    > > >
    > > > #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"
    > > > #include "include/finclude/petscmat.h90"
    > > >
    > > >    Vec    xx,b_rhs
    > > >
    > > > ....
    > > >
    > > > How can I change this code to fortran free format *.f90?
    > > >
    > > > Thanks
    > > >
    > > >
    > > >
    > >
    > >
    > >
    >
    >