So I have hit a bit of a wall. I am able to pull out all of the types for a
subroutine declaration but I cannot determine which types are classes since
those are the ones that need to be imported. For example:
subroutine PetscMatlabEngineDestroy(a,z)
PetscMatlabEngine a ! PetscMatlabEngine
PetscErrorCode z
end subroutine PetscMatlabEngineDestroy
Is compiles completely fine but
subroutine PetscRandomDestroy(a,z)
PetscRandom a ! PetscRandom
PetscErrorCode z
end subroutine PetscRandomDestroy
Requires an “import tPetscRandom”. Previously both of these had “import
petscsys” stuck in them.
Best regards,
Jacob Faibussowitsch
(Jacob Fai - booss - oh - vitch)
Cell: (312) 694-3391
> On Mar 16, 2021, at 16:13, Satish Balay via petsc-dev <[email protected]>
> wrote:
>
> And with this change (alone) - the time to compile the f90 modules went (on
> pj01 testbox) from:
>
> 0m48.676s
> to
> 0m15.053s
>
> Satish
>
> On Tue, 16 Mar 2021, Satish Balay via petsc-dev wrote:
>
>> 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
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>>
>>>