program variablesAndTypes

!////////////////////////////////////////////////////////
!/  Este programa ejemplifica las declaraciones y uso   /
!/  de los tipos de datos y variables mas usados en     /
!/  Fortran.                                            /
!////////////////////////////////////////////////////////

!print*;print*,"===== TIPOS DE DATOS Y VARIABLES ======";print*;

! Los tipos de datos intrinsecos pertenecen a tres clases:
!       Numericos:  real
!                   integer
!                   complex
!
!       logicos:    logical
!
!       caracteres: character




! Ejemplos basicos:
 
 real        :: rea11, real2 = 3.0
 integer     :: int1, int2 = 2
 character   :: char1 = "A"
 character(len=26) :: char2 = "abcdefghijklmnopqrstuvxyz"
 logical     :: bool1 = .true. , bool2 = .false.




! Las declaraciones aceptan ciertos tipos de "parametros" y/o "atributos"
! que especifican aun mas el tipo de dato (por ej. el len(..) en character)

! Con "kind" podemos especidicar cuantos Bytes se utilizan para definir el real:
!   kind=4 (sp, por defecto): se usan 4 Bytes (32 bits) , precision ~ 7 cs  - rango ~ [-1e30,1e30] 
!   kind=8  (db)            : se usan 8 Bytes (64 bits)	, precision ~ 15 cs - rango ~ [-1e308,1e308]
!   sp='simple precision' |  dp='doble precision' |  cs='cifras significativas' 

real(kind=4)    :: real3     ! equivalente a: real::real3
real(kind=8)    :: real4     ! doble precision
complex(kind=8) :: complex1  ! la parte real e imaginaria se representan con 8 Bytes


! Tambien los enteros aceptan el uso de kind:
!    kind=1               : se usa 1 byte,  rango= [-128,127]
!    kind=2	              : se usa 2 bytes, rango= [-32768,32767]
!    kind=4 (por defecto) : se usa 4 bytes, rango= [-2147483648,2147483647]
!    kind=8               : se usa 8 bytes, rango~  +- 9.2x10^18

integer(kind=8) :: int3




! Tipo de dato ARRAY. Un ARRAy o ARREGLO de rango K es un conjunto
! indexado de K tipos de variables independientes entre si. LA DIMENSION
! de cada una de las variables determina el la cantidad de elementos que
! tiene c/una

integer               :: vectorInteger(3)
real, dimension(5)    :: vector
real, dimension(2,2)  :: matrix




! TIPOS DE DATOS DERIVADOS
! Es un tipo de dato definido por el usuario en base a tipos de datos intrinsecos

type planet
   integer        :: planetNumber
   real           :: radiusKM
	character(10)  :: name
end type

! Puedo declarar variables de tipo "planeta", al igual que con los tipos de
! datos intrinsecos:

type(planet)  :: Tierra, Marte





!Ejemplos de uso
print*
print*,"---- TIPOS DE DATOS Y VARIABLES -----";print*
print*,"  REALES Y ENTEROS DE DISTINTA PRECISION ";print*

! Asigno PI para algunas de las variables reales, real3 es de simple precision:
real3 = 3.14159265358979323846
print*,"pi_sp=",real3

! real4 es de tipo real kind=8, o sea doble precision.
real4 = 3.14159265358979323846
print*,"pi_dp=",real4

! int1 esta def. con kind=4, si le sumo al maximo posible del rango (2147483647) 1 entonces:
! DESCOMENTAR LAS DOS SENTENCIAS DE ABAJO Y COMPILAR
!int1 = 2147483647+1
!print*,"El entero 2147483647+1=",int1

! int3 es kind=8 entonces el resultado anterior devuelve:
int3 = 2147483647
int3 = int3 + 1
print*,"El entero (kind=8) 2147483647+1=",int3
print*

!Ejemplos de uso de ARRAYS
print*;print*,"---- USO DE ARRAYS ----";print*
! Hay varias formas de instanciar un array, la primera es asignandole 
!    un valor a c/componente:
vectorInteger(1) = 1
vectorInteger(2) = 4
vectorInteger(3) = 8
print*,"vectorInteger=",vectorInteger 

! Otra forma es instanciando varias componentes al mismo tiempo con los
! delimitadores (/../) :
vectorInteger(1:2) = (/2,9/)
vectorInteger(3)   = 15
print*,"vectorInteger=",vectorInteger

! Otra forma es instanciar las componentes mediante un "do implicito":
vector(1:5) = (/(sqrt(real(I)),I=1,5)/)
print*,"vector=",vector

! La declaracion de arrays de rango mayor que uno:
matrix(1,1) = 1
matrix(1,2) = 2
print*,"matrix=",matrix


! Para instanciar un tipo de dato derivado:
tierra = planet(1,12478.5,"TIERRA")
print*,"Datos del planeta Tierra:",tierra
! Puedo referirme a una componente de la estructura con el simbolo %
print*,"EL radio en KM de la tierra es:",tierra%radiusKM



end program variablesAndTypes