ortran

Lenguaje de programación orientado a aplicaciones científicas y numéricas de alto rendimiento

Datos

Tipos de datos

Los tipos de datos que permite Fortran son:

Enteros

Reales o punto flotante

Complejos

Caractéres o cadenas

Booleanos o lógicos

Arrays o arreglos

Punteros y referencias

Tipo ISO

program Tipos_iso
    use iso_fortran_env
    integer, parameter :: N = 3
    real(real64)       :: A(N,N)
    integer(int64)     :: B(N,N)

    A = .0_real64           ! Matriz de ceros reales
    B = 0_int64             ! Matriz de ceros enteros

    write (*,"(3f6.1)") A   ! Mostrar la matriz en tres filas y tres columnas
    write (*,"(3i6)") B     ! Mostrar la matriz en tres filas y tres columnas
end program Tipos_iso

Tipos de datos personalizados

Con selected_int_kind y selected_real_kind podemos definir tipos de datos en función de la precisión que necesitemos.

program real_kinds
  integer,parameter  :: p6 = selected_real_kind(6)
  integer,parameter  :: p10r100 = selected_real_kind(10,100)
  integer,parameter  :: r400 = selected_real_kind(r=400)
  real(kind=p6)      :: x
  real(kind=p10r100) :: y
  real(kind=r400)    :: z

  print *, precision(x), range(x)
  print *, precision(y), range(y)
  print *, precision(z), range(z)
end program real_kinds

Tipos derivados

En otros lenguajes se llaman registros y contienen campos

type Persona
    character(len=6)  :: id
    character(len=10) :: nombre
    real              :: edad
end type Persona

Strings

program Strings
    use iso_fortran_env
    implicit none

    character(len=5) :: s            ! Una cadena
    character(len=:) :: s_array(:)   ! Un array de cadenas

    ! SETUP -----------
    ! Reserva espacio para la 10 cadenas de 5 caractéres cada una
    allocate(character(len=5) :: s_array(10))

end program Strings

Estructura paramétrica o template

program parametric_structure
    type :: persona(n)
        integer, len     :: n = 10     ! Parámetro de la estructura con valor por defecto
        character(len=n) :: nombre, apellidos
        integer:: edad
    end type

    type(persona(20)) :: p1

    p1 % nombre = "Francisco"

end program parametric_structure

Array allocatable

Se trata de un array que reserva memoria en tiempo de ejecución. Tampoco es necesario especificar su tamaño en el código.

Reservar memoria dos veces para el mismo array genera un error, por eso es conveniente comprobar antes de reservar la memoria si ya ha sido previamente reservada.

program allocatable_array
    integer, allocatable :: a(:)
    real, allocatable    :: b(:)
    real, parameter      :: pi = 3.141592
    integer              :: i

    a = [(i, i=1,10)]                    ! a = [1, 2, .., 9, 10]
    b = [(sin(2*pi*i/1000.), i=0,1000)]  ! b = [0, 6.28e-3, ...]

    if (.not. allocated(a)) then         ! Para evitar error de doble asignación
        allocate(a(10))
    end if
end program allocatable_array

Array de estructuras

type :: body
  character(len =4) :: units
  real :: mass
  real :: pos(3), vel(3)
end type body

y la forma de usarlo es

type(body), allocatable :: vector(:)
allocate(vector(n))

Estructura de arrays

Permite vectorizar y optimizar código. En este caso se usa una estructura paramétrica.

module Body
type :: body_p(k, n)                ! Estructura paramétrica template
  integer, kind    :: k = kind(1.0) ! Tipo
  integer, len     :: n = 1         ! Número
  character(len=4) :: units
  real(kind=k)     :: mass(n)
  real(kind=k)     :: pos(n,3),   vel (n,3)
end type body_p
end module Body

program main
use tipo

end program main

y se usa de esta manera:

type(body_p(n=:)), allocatable :: vector
allocate(body_p(n=20)          :: vector)