Structures or Derived Types

Real Life Objects

      Often structured

   Students, Employees, Cars, Accounts, Cricket matches, flats etc

      contain heterogeneous sub-objects

   Students

   Name (string),

   Age (integer in [15, 65],)

   Height (real),

   CPI (real number in [1,10])

   Car

   Weight (Real), Volume (Real),

   Make (String), Seating capacity(Integer) ,

   Year of make (integer)

Arrays

      Two Structured Data Types

 

      Arrays and Character strings

   Both are homogeneous:

    components are of identical type

   Accessing a component through indices

    not very natural

      More natural data types desirable

 

Derived Data Types

      Fortran's solution to representing general structured data

 

      Heterogeneous collection of data values

 

      Components identified directly by names rather than indices

 

      Generalized random access

 

      Derived data type objects called structures (in C ) and Records (Pascal)

 

 

Example

Type :: Cricketer

      Character(len=25)  ::  Name     
  Integer                    ::  Age      
  Real                        ::  Height
  Character(len=10)  ::  Country
  logical                     ::  in_action
  Real                        ::  ave_score

      logical                     ::  bowler

end type Cricketer

Structure variables

      Variables declared to be of a derived type

      Similar syntax used, eg.

 

    Type (Cricketer)::  indian_top_scorer_01,                  

                                    england_captain_99,      

                                    aussie_keeper_74

    Type (Cricketer), Dimension(15):: Indian_Team_02

 

      The latter is an array of structures or records

Initialization

       Indian_top_scorer_01 = Cricketer("Tendulkar", 29, 5.2,               

                                                              "India", .true. ... )

 

        England_captain_02 = Cricketer("Hussain", 24, 5.6,            

                                                             "England", .true. , ... )

 

 

      Structure Constructor operation(inspired by C++)

 

Accessing the Components

      The components of a structure (a variable of derived type) can be accessed by the names

             top_scorer%height

             captain%ave_score

             Indian_Team_02(i)%ave_score

      Each of these is like a variable of appropriate type

      can appear wherever such variables can occur

   top_scorer%height = 5.

   if (captain%ave_score > 25) then

   top_scorer%ave_score =

   Int(captain%ave_score) + 26

   Indian_Team_02(i)%ave_score <                 

                 Eng_Team_02(i)%ave_score

Structure inside structure

      Components can be intrinsic types or even other derived types

         Type:: team_pair
            character(len=10):: team1
            character(len=10):: team2
    end type team_pair

     Type:: match
          type(team_pair):: teams
          Integer:: date
          Character(len=10):: ground
          Character(len=10):: country
     end type match

       Type:: cricketer
              ...
              type(match):: top_score_match
              ...
       end type cricketer

Component Selection

      Any component can be selected using series of component selectors

 

     Eg.

             eng_captain%topscore_match%ground = Lords

 

      Recursive Structures

   One of the component can be of the parent type itself!

 

      More on this later

Program structure

    Type:: cricketer
  Character(len=15):: name,country
  real:: average
  integer:: top_score
end type

          
type(cricketer), dimension(15):: natwest_series_team
character(len=15):: player
real:: average
integer:: i
read *, natwest_series_team
read *, player
do i = 1, 15
     if (trim(natwest_series_team(i)%name) == player) then
         average = natwest_series_team(i)%average
         print *, average
         exit
     endif

end do


Complex Data Types

      Complex data types can be defined as structured data types

      type ::  Compx
           real:: re_part
           real:: im_part
      end type Compx

       type(Compx):: xyz

      But direct support is available in Fortran 90

      Complex data type is an intrinsic type

                  Complex:: a1 = (3.1410, - 2.3456)

      declares a1 to be of type complex with given real and imaginary parts

Accessing components

      Complex numbers can be read or written component-wise
                complex:: a1
                read*, a1

      requires input to be (2.345, 6.7890)

      Print command also outputs in the same way

      To assign a variable, use

                a1 = complex(a,b)

      a1 will get the value (a,b)

      Kind parameter is an optional parameter

Intrinsic Functions

      Real(), Int() - throws the imaginary part and converts the real part to real or integer data types

 

      Aimag() - converts the imaginary part to a real number

 

      Cabs(c) - absolute value of c

 

             = sqrt(a^2 + b^2)

Example

   program quadratic
        implicit none
        real :: a, b, c, disc, x_r
        complex:: x_c1,x_c2 = (0.0, 0.0)
        real, parameter :: eps = 1.0e-6
        read *, a, b, c

        if (a == 0.0) then
          ! a is 0, not a quadratic equation
          print *, "equation is not quadratic"
        else
                disc = b*b - 4.0*a*c
                x_r = -b/(2.0*a)
                if ( abs(disc) < eps ) then
                       ! discriminant is nearly zero
                        print *, "double real root", x_r
                else
                        x_c1 = (x_r + Sqrt( Cmplx(disc,0.0))/(2.0*a))
                        x_c2 =  (x_r - Sqrt( Cmplx(disc,0.0))/(2.0*a))
                        print *, Real(x_c1),"+ i", Aimag(x_c1)
                        print *, Real(x_c2),"- i", Aimag(x_c2)
                endif
        endif
 end program quadratic