Introducción

En este proyecto final, aplicarás todos los conceptos y técnicas que has aprendido a lo largo del curso para desarrollar una aplicación integral en Fortran. Este proyecto te permitirá consolidar tus conocimientos y habilidades en programación, manejo de datos, estructuras de control, procedimientos y funciones, manejo de archivos, y optimización de código.

Objetivo del Proyecto

El objetivo del proyecto es desarrollar una aplicación que simule un sistema físico complejo. La aplicación debe ser capaz de:

  1. Leer datos de entrada desde un archivo.
  2. Procesar los datos utilizando algoritmos numéricos.
  3. Almacenar y manipular datos en estructuras adecuadas.
  4. Generar resultados y escribirlos en un archivo de salida.
  5. Optimizar el rendimiento del código.
  6. Implementar buenas prácticas de programación para asegurar la mantenibilidad y portabilidad del código.

Descripción del Proyecto

Simulación de un Sistema de Partículas

Desarrollarás una aplicación que simule el movimiento de partículas en un espacio tridimensional bajo la influencia de fuerzas gravitacionales. La simulación debe considerar las siguientes características:

  1. Inicialización de Partículas: Las partículas deben ser inicializadas con posiciones, velocidades y masas aleatorias.
  2. Cálculo de Fuerzas: Implementar el cálculo de fuerzas gravitacionales entre las partículas.
  3. Actualización de Posiciones y Velocidades: Utilizar métodos numéricos para actualizar las posiciones y velocidades de las partículas en cada paso de tiempo.
  4. Manejo de Colisiones: Detectar y manejar colisiones entre partículas.
  5. Salida de Datos: Guardar el estado del sistema en un archivo de salida en cada paso de tiempo.

Estructura del Proyecto

  1. Configuración del Entorno

Asegúrate de tener tu entorno de desarrollo configurado correctamente. Revisa el módulo 1 si necesitas ayuda con la configuración.

  1. Diseño del Programa

a. Definición de Tipos Derivados

Define un tipo derivado para representar una partícula:

type :: Particle
    real :: mass
    real :: position(3)
    real :: velocity(3)
end type Particle

b. Inicialización de Partículas

Escribe una subrutina para inicializar las partículas con valores aleatorios:

subroutine initialize_particles(particles, n)
    type(Particle), dimension(:), intent(out) :: particles
    integer, intent(in) :: n
    integer :: i

    do i = 1, n
        particles(i)%mass = random_number()
        call random_number(particles(i)%position)
        call random_number(particles(i)%velocity)
    end do
end subroutine initialize_particles

c. Cálculo de Fuerzas

Escribe una función para calcular la fuerza gravitacional entre dos partículas:

function calculate_force(p1, p2) result(force)
    type(Particle), intent(in) :: p1, p2
    real :: force(3)
    real :: G = 6.67430e-11
    real :: r(3), distance

    r = p2%position - p1%position
    distance = sqrt(sum(r**2))
    force = G * p1%mass * p2%mass / distance**2 * r / distance
end function calculate_force

d. Actualización de Posiciones y Velocidades

Escribe una subrutina para actualizar las posiciones y velocidades de las partículas:

subroutine update_particles(particles, n, dt)
    type(Particle), dimension(:), intent(inout) :: particles
    integer, intent(in) :: n
    real, intent(in) :: dt
    integer :: i, j
    real :: force(3)

    do i = 1, n
        force = 0.0
        do j = 1, n
            if (i /= j) then
                force = force + calculate_force(particles(i), particles(j))
            end if
        end do
        particles(i)%velocity = particles(i)%velocity + force / particles(i)%mass * dt
        particles(i)%position = particles(i)%position + particles(i)%velocity * dt
    end do
end subroutine update_particles

e. Manejo de Colisiones

Escribe una subrutina para detectar y manejar colisiones entre partículas:

subroutine handle_collisions(particles, n)
    type(Particle), dimension(:), intent(inout) :: particles
    integer, intent(in) :: n
    integer :: i, j
    real :: distance

    do i = 1, n
        do j = i + 1, n
            distance = sqrt(sum((particles(i)%position - particles(j)%position)**2))
            if (distance < 1.0e-3) then
                ! Manejar colisión (por ejemplo, fusionar partículas)
                particles(i)%mass = particles(i)%mass + particles(j)%mass
                particles(j)%mass = 0.0
            end if
        end do
    end do
end subroutine handle_collisions

f. Salida de Datos

Escribe una subrutina para guardar el estado del sistema en un archivo de salida:

subroutine write_output(particles, n, step)
    type(Particle), dimension(:), intent(in) :: particles
    integer, intent(in) :: n, step
    integer :: i
    character(len=20) :: filename

    write(filename, '("output_", I4.4, ".txt")') step
    open(unit=10, file=filename, status='replace')

    do i = 1, n
        write(10, *) particles(i)%mass, particles(i)%position, particles(i)%velocity
    end do

    close(10)
end subroutine write_output

  1. Implementación del Programa Principal

Combina todas las subrutinas y funciones en el programa principal:

program particle_simulation
    implicit none
    integer, parameter :: n = 100, steps = 1000
    real, parameter :: dt = 0.01
    type(Particle), dimension(n) :: particles
    integer :: step

    call initialize_particles(particles, n)

    do step = 1, steps
        call update_particles(particles, n, dt)
        call handle_collisions(particles, n)
        call write_output(particles, n, step)
    end do
end program particle_simulation

  1. Optimización y Mejores Prácticas

Revisa el módulo 8 para aplicar técnicas de optimización y asegurar que tu código sigue las mejores prácticas de programación.

  1. Pruebas y Depuración

Realiza pruebas exhaustivas y depura tu código para asegurarte de que funciona correctamente. Utiliza herramientas de perfilado para identificar y optimizar las partes más lentas del código.

Conclusión

Este proyecto final te ha permitido aplicar una amplia gama de conceptos y técnicas de programación en Fortran. Al completar este proyecto, habrás consolidado tus habilidades y estarás preparado para abordar problemas complejos en el futuro. ¡Felicidades por llegar hasta aquí y completar el curso de programación en Fortran!

© Copyright 2024. Todos los derechos reservados