En este módulo, aprenderemos cómo integrar código Fortran con C. Esta habilidad es crucial para aprovechar bibliotecas escritas en C y para mejorar la interoperabilidad entre estos dos lenguajes de programación. Exploraremos los conceptos básicos, la sintaxis y los métodos para llamar funciones de C desde Fortran y viceversa.

Contenido

  1. Introducción a la Interoperabilidad Fortran-C
  2. Declaraciones y Tipos de Datos Compatibles
  3. Llamando Funciones de C desde Fortran
  4. Llamando Funciones de Fortran desde C
  5. Ejemplos Prácticos
  6. Ejercicios

  1. Introducción a la Interoperabilidad Fortran-C

Fortran y C son dos lenguajes de programación ampliamente utilizados en la computación científica y de ingeniería. La interoperabilidad entre estos lenguajes permite a los desarrolladores aprovechar las fortalezas de ambos. Fortran es conocido por su eficiencia en cálculos numéricos, mientras que C es popular por su flexibilidad y control de bajo nivel.

  1. Declaraciones y Tipos de Datos Compatibles

Para que Fortran y C puedan comunicarse, es esencial que los tipos de datos sean compatibles. Fortran 2003 introdujo el módulo ISO_C_BINDING que facilita esta interoperabilidad.

Tipos de Datos Compatibles

Fortran Type C Type
INTEGER(C_INT) int
REAL(C_FLOAT) float
DOUBLE PRECISION double
CHARACTER(C_CHAR) char
LOGICAL(C_BOOL) _Bool

Ejemplo de Declaración

USE ISO_C_BINDING
INTEGER(C_INT) :: i
REAL(C_FLOAT) :: x
CHARACTER(C_CHAR) :: c

  1. Llamando Funciones de C desde Fortran

Para llamar a una función de C desde Fortran, se debe declarar la función en Fortran utilizando la palabra clave BIND(C).

Ejemplo de Función C

// archivo: my_c_functions.c
#include <stdio.h>

void c_function(int x) {
    printf("Valor desde C: %d\n", x);
}

Declaración en Fortran

MODULE my_c_functions
  USE ISO_C_BINDING
  INTERFACE
    SUBROUTINE c_function(x) BIND(C, NAME="c_function")
      USE ISO_C_BINDING
      INTEGER(C_INT), VALUE :: x
    END SUBROUTINE c_function
  END INTERFACE
END MODULE my_c_functions

Llamada a la Función

PROGRAM call_c_function
  USE my_c_functions
  IMPLICIT NONE
  INTEGER(C_INT) :: x

  x = 10
  CALL c_function(x)
END PROGRAM call_c_function

  1. Llamando Funciones de Fortran desde C

Para llamar a una función de Fortran desde C, se debe declarar la función en C utilizando la palabra clave extern.

Ejemplo de Función Fortran

SUBROUTINE fortran_function(x) BIND(C, NAME="fortran_function")
  USE ISO_C_BINDING
  INTEGER(C_INT), VALUE :: x
  PRINT *, "Valor desde Fortran: ", x
END SUBROUTINE fortran_function

Declaración en C

// archivo: call_fortran_function.c
#include <stdio.h>

extern void fortran_function(int x);

int main() {
    int x = 20;
    fortran_function(x);
    return 0;
}

  1. Ejemplos Prácticos

Ejemplo Completo: Intercambio de Datos

Código Fortran

MODULE my_c_functions
  USE ISO_C_BINDING
  INTERFACE
    SUBROUTINE c_function(x) BIND(C, NAME="c_function")
      USE ISO_C_BINDING
      INTEGER(C_INT), VALUE :: x
    END SUBROUTINE c_function
  END INTERFACE
END MODULE my_c_functions

PROGRAM call_c_function
  USE my_c_functions
  IMPLICIT NONE
  INTEGER(C_INT) :: x

  x = 10
  CALL c_function(x)
END PROGRAM call_c_function

Código C

// archivo: my_c_functions.c
#include <stdio.h>

void c_function(int x) {
    printf("Valor desde C: %d\n", x);
}

Ejemplo Completo: Llamada de Fortran desde C

Código Fortran

SUBROUTINE fortran_function(x) BIND(C, NAME="fortran_function")
  USE ISO_C_BINDING
  INTEGER(C_INT), VALUE :: x
  PRINT *, "Valor desde Fortran: ", x
END SUBROUTINE fortran_function

Código C

// archivo: call_fortran_function.c
#include <stdio.h>

extern void fortran_function(int x);

int main() {
    int x = 20;
    fortran_function(x);
    return 0;
}

  1. Ejercicios

Ejercicio 1: Llamar una Función de C desde Fortran

Objetivo: Escribir una función en C que sume dos números y llamarla desde Fortran.

Instrucciones:

  1. Escribir una función en C que reciba dos enteros y devuelva su suma.
  2. Declarar y llamar esta función desde un programa Fortran.

Solución:

Código C

// archivo: sum.c
int sum(int a, int b) {
    return a + b;
}

Código Fortran

MODULE my_c_functions
  USE ISO_C_BINDING
  INTERFACE
    FUNCTION sum(a, b) BIND(C, NAME="sum")
      USE ISO_C_BINDING
      INTEGER(C_INT), VALUE :: a, b
      INTEGER(C_INT) :: sum
    END FUNCTION sum
  END INTERFACE
END MODULE my_c_functions

PROGRAM call_sum
  USE my_c_functions
  IMPLICIT NONE
  INTEGER(C_INT) :: a, b, result

  a = 5
  b = 7
  result = sum(a, b)
  PRINT *, "La suma es: ", result
END PROGRAM call_sum

Ejercicio 2: Llamar una Función de Fortran desde C

Objetivo: Escribir una función en Fortran que multiplique dos números y llamarla desde C.

Instrucciones:

  1. Escribir una función en Fortran que reciba dos enteros y devuelva su producto.
  2. Declarar y llamar esta función desde un programa C.

Solución:

Código Fortran

FUNCTION multiply(a, b) BIND(C, NAME="multiply")
  USE ISO_C_BINDING
  INTEGER(C_INT), VALUE :: a, b
  INTEGER(C_INT) :: multiply

  multiply = a * b
END FUNCTION multiply

Código C

// archivo: call_multiply.c
#include <stdio.h>

extern int multiply(int a, int b);

int main() {
    int a = 3, b = 4;
    int result = multiply(a, b);
    printf("El producto es: %d\n", result);
    return 0;
}

Conclusión

En este módulo, hemos aprendido cómo integrar Fortran con C, lo que nos permite aprovechar las fortalezas de ambos lenguajes. Hemos cubierto la declaración de tipos de datos compatibles, cómo llamar funciones de C desde Fortran y viceversa, y hemos trabajado con ejemplos prácticos y ejercicios. Esta habilidad es esencial para cualquier programador que trabaje en proyectos que requieran la interoperabilidad entre estos dos lenguajes.

© Copyright 2024. Todos los derechos reservados