> To me the best solution is to first split the files when possible (it is 
> often not or just too painful) and then adding imports if needed. 

I’m not sure I agree. Bear in mind my familiarity with fortran is very limited, 
but to me the “use” statement is similar to #include <header> in C or using 
namespace xxx in cpp.

Our fortran interface is not optimal code atm, it’s as if we put a  "#include 
<petscvec.h>” before every Vec function in the C source (assuming include 
guards are not used). Sure you can fix this by splitting the vec src files in 
two, but at the end of the day that’s a bandaid solution. I think I can get the 
import stuff to work reasonably well (a lot of the infrastructure to capture 
types is already present in the current generatefortranstubs).

Best regards,

Jacob Faibussowitsch
(Jacob Fai - booss - oh - vitch)
Cell: (312) 694-3391

> On Mar 16, 2021, at 12:56, Barry Smith <bsm...@petsc.dev> wrote:
> 
> 
>    Jacob,
> 
>      I split  the mat definitions in the MR 
> https://gitlab.com/petsc/petsc/-/merge_requests/3696 
> <https://gitlab.com/petsc/petsc/-/merge_requests/3696> and this reduced 
> memory requirements enough to get builds through on some VM that failed 
> previously ran out of memory (with gfortran). 
> 
>      The petsc*mod.F90 files are all handwritten so it is ok to manually 
> change them with imports if that helps the IBM compiler. To me the best 
> solution is to first split the files when possible (it is often not or just 
> too painful) and then adding imports if needed. 
> 
>      Note also the MR 
> https://gitlab.com/petsc/petsc/-/merge_requests/3715/diffs 
> <https://gitlab.com/petsc/petsc/-/merge_requests/3715/diffs> which may help a 
> great deal with the IBM compiler or not.
> 
>      Thanks
> 
>      Barry
> 
> 
> 
>> On Mar 16, 2021, at 11:47 AM, Jacob Faibussowitsch <jacob....@gmail.com 
>> <mailto:jacob....@gmail.com>> 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
>>  end function isnotequal
>> 
>> This works for everything wrapped in a module which contains an interface 
>> block. For dangling functions the following works:
>> 
>>  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 <ba...@mcs.anl.gov 
>>> <mailto:ba...@mcs.anl.gov>> 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 
>>>>> <petsc-dev@mcs.anl.gov <mailto:petsc-dev@mcs.anl.gov>> 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