Hi;
It seems that, allocatable derived type arrays has some problems in 11.8.
When I defined a allocatable derived type array under some other derived types, Sometimes it looses lower and upper bound information when passed to a subroutine. For example
Call Print (Inputs%Initializers%Boundary_Distribution%AtDimsAndFaces)
Call Print (Inputs%Initializers%Boundary_Distribution)
First call works but second one fails. In the second call I get really weird values from LBOUND and UBOUND functions. (Here, AtDimsAndFaces is a allocatable derived type array and second subroutine calls the first one if the array allocated)
Code of the first print routine is;
SUBROUTINE PRINT_Initializers_At_Dimension_And_Face_Class_Array_2D (InitializersArray)
! Type (Initializers_At_Dimension_And_Face_Class) ,Intent(In) ,Allocatable :: InitializersArray (:,:)
Type (Initializers_At_Dimension_And_Face_Class) ,Intent(In) :: InitializersArray (:,:)
Logical :: Allocated_Component
Integer :: LowerBounds(2), UpperBounds(2), I, J
! Allocated_Component = ALLOCATED (InitializersArray)
Allocated_Component = .TRUE.
If (Allocated_Component) then
LowerBounds = LBOUND (InitializersArray)
UpperBounds = UBOUND (InitializersArray)
Write (*,*) " Lower Bounds ", LowerBounds
Write (*,*) " Upper Bounds ", UpperBounds
Do J = LowerBounds(2), UpperBounds(2)
Do I = LowerBounds(1), UpperBounds(1)
Write (*,*) " "
Write (*,*) " Element Index =>", I, J
Call PRINT_Initializers_At_Dimension_And_Face_Class (InitializersArray(I,J))
End Do
End Do
END SUBROUTINE PRINT_Initializers_At_Dimension_And_Face_Class_Array_2D
Note that 2 lines are commented out. This is a another problem; If I define this array as allocatable in the subroutine interface, it completely fails. (I get “0: LBOUND: arg not associated with array”)
Code of other print subroutine (which fails to get bound values) is;
SUBROUTINE Print_Initializers_Boundary_Distribution_Class (Initializers)
Type (Initializers_Boundary_Distribution_Class) ,Intent(In) :: Initializers
Logical :: Allocated_Component
Allocated_Component = ALLOCATED (Initializers%Allocators)
If (Allocated_Component) then
Call Print_Allocators_Boundary_Distribution_Class (Initializers%Allocoters)
Else
Write (*,*) " Allocators => NOT ALLOCATED "
End If
Allocated_Component = ALLOCATED (Initializers%AtDimsAndFaces)
If (Allocated_Component) then
Write (*,*) SIZE (Initializers%AtDimsAndFaces)
Write (*,*) LBOUND (Initializers%AtDimsAndFaces), UBOUND (Initializers%AtDimsAndFaces)
Call PRINT_Initializers_At_Dimension_And_Face_Class_Array_2D (Initializers%AtDimsAndFaces)
Else
Write (*,*) " AtDimsAndFaces => NOT ALLOCATED"
End If
END SUBROUTINE Print_Initializers_Boundary_Distribution_Class
I have added SIZE, LBOUND and UBOUND after, to see where the information get lost…
Definition of this derived types are;
TYPE ,PUBLIC ,EXTENDS (Initializer_Base_Class) :: Initializers_Boundary_Distribution_Class
Type (Allocators_Boundary_Distribution_Class) ,Allocatable :: Allocators
Type (Initializers_At_Dimension_and_Face_Class) ,Allocatable :: AtDimsAndFaces (:,:)
END type Initializers_Boundary_Distribution_Class
TYPE ,PUBLIC ,EXTENDS (Initializer_Base_Class) :: Initializers_At_Dimension_And_Face_Class
Class (Allocators_At_Dimension_And_Face_Class) ,Allocatable :: Allocators
Class (DataBase_Boundary_Condition_Class) ,Pointer :: DataBase
Type (Type_Class) ,Allocatable :: BCs (:,:)
END type Initializers_At_Dimension_And_Face_Class
This derived types also contains allocatable scalars (Type_Class has them, and DataBase is derived from Type_Class, So it is a bit complex structure for fortran)…
I get this kind of behavior from alot of subroutines, I have only given one of the simplest one as an example, since the total code is very long (tens of thousands of lines).
I hope that in 11.9 this will be corrected.
Thanks in advance…