- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I can define a user defined data type with allocatable array as its data type. Allocation works perfectly while we are still in the same subroutine. But i don't know how to pass this type of user defined data type as a subroutine argument. Intel compiler shows the error # 6530:
"Error 1 error #6530: The array spec for this component must be of explicit shape and each bound must be an initialization expression."
The code has been shared below to show the error. It is written in FORTRAN 77. I am working in FORTRAN 77, as i will have to append this code in user subroutine of abaqus that accepts only FORTRAN 77 files.
-------------------------
SUBROUTINE DERIVED_DATA_TYPE_CHECK IMPLICIT NONE INTEGER :: I,J,A,B TYPE SS SEQUENCE DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: S1 END TYPE SS TYPE (SS),DIMENSION(:,:),ALLOCATABLE :: SS_ A=10 B=10 ALLOCATE (SS_(A,B)) ! ALLOCATING THE VARIABLE S1 DIMENSIONS ! EVERY ALLOCATABLE VARIABLE HAS THE SAME SIZE AS ! THE TOTAL NUMBER OF STRUCTURE (TYPE) DO I = 1,A DO J = 1,B ALLOCATE(SS_(I,J)%S1(A,B)) ENDDO ENDDO CALL PASS_ARG(SS_,A,B) END SUBROUTINE PASS_ARG(SS_,A,B) IMPLICIT NONE INTEGER :: A,B TYPE SS SEQUENCE DOUBLE PRECISION, DIMENSION(A,B) :: S1 END TYPE SS TYPE (SS), DIMENSION (A,B) :: SS_ END
----------------------------------
The program on compilation gives the error as shown below:
Error 2 error #6530: The array spec for this component must be of explicit shape and each bound must be an initialization expression. [S1]
There must be a way to solve this problem. I want to stay away from common blocks or modules. Anyway i cant use module in FORTRAN 77.
In order to avoid this error, I had used allocatable variables in main program as well as called subroutine. Program is then compiled, but on execution, it show the error "that allocation has been done more than once".
At last i think i will have to use some global constants..... i guess. Thanks
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
If you have more than one instance of a type declaration, those types are not considered the same, even if the multiple declarations match one another exactly.
When you call a subroutine with certain types of actual arguments, you need to provide an explicit interface to the subroutine.
It is incorrect to conflate "fixed form source" with "Fortran 77". Standard Fortran-77 certainly did not have modules, derived types and modules.
MODULE SS_MOD TYPE SS SEQUENCE DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: S1 END TYPE SS END MODULE MODULE PASS_ARG_INT INTERFACE SUBROUTINE PASS_ARG(SS_,A,B) USE SS_MOD IMPLICIT NONE INTEGER :: A, B TYPE(SS), dimension(:,:) :: SS_ END SUBROUTINE END INTERFACE END MODULE SUBROUTINE DERIVED_DATA_TYPE_CHECK USE SS_MOD USE PASS_ARG_INT IMPLICIT NONE INTEGER :: I,J,A,B TYPE (SS),DIMENSION(:,:),ALLOCATABLE :: SS_ A=10 B=10 ALLOCATE (SS_(A,B)) ! ALLOCATING THE VARIABLE S1 DIMENSIONS ! EVERY ALLOCATABLE VARIABLE HAS THE SAME SIZE AS ! THE TOTAL NUMBER OF STRUCTURE (TYPE) DO I = 1,A DO J = 1,B ALLOCATE(SS_(I,J)%S1(A,B)) ENDDO ENDDO CALL PASS_ARG(SS_,A,B) END SUBROUTINE PASS_ARG(SS_,A,B) USE SS_MOD IMPLICIT NONE INTEGER :: A,B TYPE (SS), DIMENSION (A,B) :: SS_ END
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Actually, you can get by with separate but identical definitions of a derived type provided the type has the SEQUENCE or BIND attribute. Thus the syntax in the original post would be OK except for the fact that the declaration of type(SS) in subroutine PASS_ARG is inconsistent with that of type(SS) in subroutine DERIVED_TYPE_DATA_CHECK not to mention being syntactically incorrect. Just copy the derived type definition for the latter subroutine to the former and everything should fly.
BTW, if component S1 in all elements of an array of type(SS) are to be allocated and the same shape, you might be better served by making SS a parameterized derived type although that definitely would require a module to propagate the derived type definition to both subroutines.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page