Ah - the issue is 'import IS' vs 'import tIS'

Pushed a fix now. [and reverted my earlier source split change]. My build goes 
through fine now.

Satish

On Tue, 16 Mar 2021, Barry Smith wrote:

> 
>   Satish,
> 
>     The  import tIS might only work because the IS is already defined in the 
> same file so the compiler can pull in just part of the use petscisdefdummy ? 
> If the original module that contains the PetscRandom is in a different file 
> then I don't see how the compiler can find and import PetscRandom. Is there a 
> version of import where you also list the module (file) that the beast is 
> from so the compiler can get it from that module?
> 
>   Barry
> 
>     Do both the manually generated petsc*mod.F90 and the automatically 
> generated files need to be switched to not use use everywhere? Or is it 
> enough just to fix the manual ones for now and not mess with sowing?
> 
> 
> 
> > On Mar 16, 2021, at 2:34 PM, Satish Balay via petsc-dev 
> > <[email protected]> wrote:
> > 
> > On Tue, 16 Mar 2021, Satish Balay via petsc-dev wrote:
> > 
> >> 
> >> 
> >> Tue, 16 Mar 2021, Jacob Faibussowitsch wrote:
> >> 
> >>> Ok something I have gotten to work, but only doing things by hand in 
> >>> petscvecmod.F90:
> >>> 
> >>> diff --git a/src/vec/f90-mod/petscvecmod.F90 
> >>> b/src/vec/f90-mod/petscvecmod.F90
> >>> index 0c447156b9..ef3e2e2e55 100644
> >>> --- a/src/vec/f90-mod/petscvecmod.F90
> >>> +++ b/src/vec/f90-mod/petscvecmod.F90
> >>> module petscisdef
> >>> use petscisdefdummy
> >>> interface operator(.ne.)
> >>> function isnotequal(A,B)
> >>> -  use petscisdefdummy
> >>> + import tIS
> >>>   logical isnotequal                                                      
> >>>                
> >>>   type(tIS), intent(in) :: A,B
> >> 
> >> generatefortranstubs.py has some hakey parsing code. I guess it can be 
> >> updated to do this.
> >> 
> >> i.e - look for 'type(tIS)' and add 'import tIS'
> > 
> > I pushed changes to generatefortranstubs.py for this (to
> > balay/reorg-f90-for-xlf branch). But there are errors. (I don't completely 
> > understand this issue yet)
> > 
> >>>> 
> >          FC arch-linux-c-debug/obj/sys/f90-mod/petscsysmod.o
> > /home/balay/petsc/include/../src/sys/f90-mod/ftn-auto-interfaces/petscsys.h90:6:19:
> > 
> >    6 |        import PetscRandom
> >      |                   1
> > Error: Cannot IMPORT ‘type’ from host scoping unit at (1) - does not exist.
> > /home/balay/petsc/include/../src/sys/f90-mod/ftn-auto-interfaces/petscsys.h90:7:26:
> > 
> >    7 |        PetscRandom a ! PetscRandom
> >      |                          1
> > Error: Derived type ‘tpetscrandom’ at (1) is being used before it is defined
> > <<<<
> > 
> > 
> > Satish
> > 
> >> 
> >>> end function isnotequal
> >>> 
> >>> This works for everything wrapped in a module which contains an interface 
> >>> block. For dangling functions the following works:
> >> 
> >> Hm - maybe these are only on the custom side [and not ftn-auto side]
> >> 
> >> Satish
> >>> 
> >>> function isnotequal(A,B)
> >>> -  use petscisdefdummy
> >>> + use petscisdef, only: tIs
> >> 
> >> 
> >>>   logical isnotequal
> >>>   type(tIS), intent(in) :: A,B
> >>>   isnotequal = (A%v .ne. B%v)
> >>> end function isnotequal
> >>> 
> >>> Do our fortran stub generators have any notion of types? Specifically 
> >>> types that originate from petsc?
> >>> 
> >>> Best regards,
> >>> 
> >>> Jacob Faibussowitsch
> >>> (Jacob Fai - booss - oh - vitch)
> >>> Cell: (312) 694-3391
> >>> 
> >>>> On Mar 16, 2021, at 11:11, Satish Balay <[email protected]> wrote:
> >>>> 
> >>>> On Tue, 16 Mar 2021, Jacob Faibussowitsch wrote:
> >>>> 
> >>>>>> My [partial] change is in branch balay/reorg-f90-for-xlf
> >>>>> 
> >>>>> Satish is this branch pushed? I’d like to send it to the ibm folks to 
> >>>>> see if it works for them as well.
> >>>> 
> >>>> Sorry - pushed now. From what I remember - it didn't work.
> >>>> 
> >>>> Satish
> >>>> 
> >>>> 
> >>>>> They also added this extra follow up:
> >>>>> 
> >>>>> The change we did in the source files is to replace all the "use pet*" 
> >>>>> statements in all the Interface blocks with IMPORT statement.
> >>>>> 
> >>>>> The nature of this workaround is to reduce the number of symbols that 
> >>>>> the compiler have to create, which exceeded the limitation and caused 
> >>>>> ICE.
> >>>>> 
> >>>>> Every USE statement in an interface block opens up the module symbol 
> >>>>> file and reads all the symbols from it and creates an entity for each 
> >>>>> symbol in compiler. This is unnecessary when the module already has the 
> >>>>> same USE statement in the module scope. Instead, users can use IMPORT 
> >>>>> statement to make the module symbols accessible inside interface face 
> >>>>> blocks.
> >>>>> 
> >>>>> With the change, the compiler would only read the module symbol file 
> >>>>> once and create one set of symbols where the old code reads the module 
> >>>>> symbol files as many times as the number of the USE statements in 
> >>>>> Interface blocks and create that many sets of duplicate symbols. 
> >>>>> Replacing those USE statements with IMPORT statements also shortens the 
> >>>>> compile time significantly.
> >>>>> 
> >>>>> Best regards,
> >>>>> 
> >>>>> Jacob Faibussowitsch
> >>>>> (Jacob Fai - booss - oh - vitch)
> >>>>> Cell: (312) 694-3391
> >>>>> 
> >>>>>> On Mar 3, 2021, at 13:43, Satish Balay via petsc-dev 
> >>>>>> <[email protected]> wrote:
> >>>>>> 
> >>>>>> The only change I can get working (i.e avoid compile errors) is to 
> >>>>>> split petscvecmod.F90 into 2 source files - but I don't know if this 
> >>>>>> will help with xlf..
> >>>>>> 
> >>>>>> My [partial] change is in branch balay/reorg-f90-for-xlf
> >>>>>> 
> >>>>>> Satish
> >>>>>> 
> >>>>>> On Wed, 3 Mar 2021, Satish Balay via petsc-dev wrote:
> >>>>>> 
> >>>>>>> On Wed, 3 Mar 2021, Satish Balay via petsc-dev wrote:
> >>>>>>> 
> >>>>>>>> Sure - once any change works locally [for gcc and xlf]
> >>>>>>>> 
> >>>>>>>> When I try - I get a bunch of errors.. [yet to digest them.]
> >>>>>>> 
> >>>>>>>>>>>> Can you please give the following source code workaround a try?
> >>>>>>>>>>>> Since there is already "use petscvecdefdummy" at the module 
> >>>>>>>>>>>> scope, one workaround might be to remove the unnecessary "use 
> >>>>>>>>>>>> petscvecdefdummy" in vecnotequal and vecequals 
> >>>>>>>>>>>> and all similar procedures.
> >>>>>>>>>>>> 
> >>>>>>>>>>>> For example, the test case has:
> >>>>>>>>>>>>     module petscvecdef
> >>>>>>>>>>>>     use petscvecdefdummy
> >>>>>>>>>>>> ...
> >>>>>>>>>>>>     function vecnotequal(A,B)
> >>>>>>>>>>>>       use petscvecdefdummy
> >>>>>>>>>>>>       logical vecnotequal
> >>>>>>>>>>>>       type(tVec), intent(in) :: A,B
> >>>>>>>>>>>>       vecnotequal = (A%v .ne. B%v)
> >>>>>>>>>>>>     end function
> >>>>>>> 
> >>>>>>> 
> >>>>>>> Ok - try this suggestion:
> >>>>>>> 
> >>>>>>> diff --git a/src/vec/f90-mod/petscvecmod.F90 
> >>>>>>> b/src/vec/f90-mod/petscvecmod.F90
> >>>>>>> index 0c447156b9..81968c7ca1 100644
> >>>>>>> --- a/src/vec/f90-mod/petscvecmod.F90
> >>>>>>> +++ b/src/vec/f90-mod/petscvecmod.F90
> >>>>>>> @@ -77,7 +77,6 @@
> >>>>>>>       use petscvecdefdummy
> >>>>>>>       interface operator(.ne.)
> >>>>>>>         function vecnotequal(A,B)
> >>>>>>> -            use petscvecdefdummy
> >>>>>>>           logical vecnotequal
> >>>>>>>           type(tVec), intent(in) :: A,B
> >>>>>>>         end function
> >>>>>>> 
> >>>>>>> 
> >>>>>>>>>>>> 
> >>>>>>>        FC arch-linux-c-debug/obj/vec/f90-mod/petscvecmod.o
> >>>>>>> /home/balay/petsc/src/vec/f90-mod/petscvecmod.F90:81:22:
> >>>>>>> 
> >>>>>>> 81 |             type(tVec), intent(in) :: A,B
> >>>>>>>    |                      1
> >>>>>>> Error: Derived type ‘tvec’ at (1) is being used before it is defined
> >>>>>>> /home/balay/petsc/include/../src/vec/f90-mod/ftn-auto-interfaces/petscis.h90:2:10:
> >>>>>>> 
> >>>>>>>  2 |       use petscvecdef
> >>>>>>>    |          1
> >>>>>>> Fatal Error: Cannot open module file ‘petscvecdef.mod’ for reading at 
> >>>>>>> (1): No such file or directory
> >>>>>>> <<<<<<
> >>>>>>> 
> >>>>>>> Satish
> >>>>> 
> >>>>> 
> >>> 
> >>> 
> 

Reply via email to