Introducció

En aquest projecte final, aplicaràs tots els coneixements adquirits al llarg del curs per desenvolupar una aplicació integral en Fortran. Aquest projecte està dissenyat per consolidar els conceptes apresos i proporcionar-te una experiència pràctica completa. L'objectiu és crear una aplicació que combini diversos aspectes de la programació en Fortran, incloent-hi la gestió de fitxers, l'ús de procediments i funcions, i la manipulació d'estructures de dades avançades.

Objectius del Projecte

  1. Aplicar els conceptes bàsics de Fortran: Sintaxi, estructures de control, arrays, cadenes, etc.
  2. Utilitzar procediments i funcions: Crear subrutines i funcions per modularitzar el codi.
  3. Gestionar fitxers: Llegir i escriure dades des de i cap a fitxers.
  4. Implementar estructures de dades avançades: Utilitzar tipus derivats, punteres i llistes enllaçades.
  5. Optimitzar i depurar el codi: Aplicar tècniques d'optimització i depuració per millorar el rendiment i la mantenibilitat del codi.

Descripció del Projecte

Tema del Projecte: Simulador de Sistemes Físics

Crearàs un simulador de sistemes físics que permeti modelar i simular el moviment d'objectes sota diferents forces. El simulador haurà de:

  1. Llegir dades d'entrada: Les dades d'entrada inclouran les propietats dels objectes (massa, velocitat inicial, posició inicial) i les forces aplicades (gravitació, fricció, etc.).
  2. Calcular el moviment: Utilitzar les equacions de moviment per calcular la posició i la velocitat dels objectes en cada instant de temps.
  3. Mostrar els resultats: Escriure els resultats en un fitxer de sortida i mostrar un resum per pantalla.

Estructura del Projecte

  1. Configuració Inicial:

    • Crear un fitxer de configuració per especificar les propietats dels objectes i les forces aplicades.
    • Llegir les dades de configuració des d'un fitxer.
  2. Càlcul del Moviment:

    • Implementar les equacions de moviment en subrutines.
    • Utilitzar arrays per emmagatzemar les posicions i velocitats dels objectes en cada instant de temps.
  3. Sortida de Resultats:

    • Escriure els resultats en un fitxer de sortida.
    • Mostrar un resum dels resultats per pantalla.

Exemples de Codi

1. Llegir Dades de Configuració

program read_config
    implicit none
    integer :: i, num_objects
    real :: mass, initial_velocity, initial_position

    ! Obre el fitxer de configuració
    open(unit=10, file='config.txt', status='old', action='read')

    ! Llegeix el nombre d'objectes
    read(10, *) num_objects

    ! Llegeix les propietats de cada objecte
    do i = 1, num_objects
        read(10, *) mass, initial_velocity, initial_position
        print *, 'Objecte', i, ': Massa =', mass, 'Velocitat Inicial =', initial_velocity, 'Posició Inicial =', initial_position
    end do

    ! Tanca el fitxer
    close(10)
end program read_config

2. Càlcul del Moviment

subroutine calculate_motion(mass, initial_velocity, initial_position, time, position, velocity)
    implicit none
    real, intent(in) :: mass, initial_velocity, initial_position, time
    real, intent(out) :: position, velocity
    real :: acceleration

    ! Suposem una acceleració constant (per exemple, gravetat)
    acceleration = -9.81

    ! Equacions de moviment
    position = initial_position + initial_velocity * time + 0.5 * acceleration * time**2
    velocity = initial_velocity + acceleration * time
end subroutine calculate_motion

3. Escriure Resultats

program write_results
    implicit none
    integer :: i, num_steps
    real :: time, position, velocity

    ! Obre el fitxer de sortida
    open(unit=20, file='results.txt', status='replace', action='write')

    ! Escriu els resultats en el fitxer
    num_steps = 100
    do i = 1, num_steps
        time = i * 0.1
        call calculate_motion(1.0, 10.0, 0.0, time, position, velocity)
        write(20, *) time, position, velocity
    end do

    ! Tanca el fitxer
    close(20)
end program write_results

Exercicis Pràctics

  1. Ampliar el Fitxer de Configuració:

    • Afegir més propietats als objectes, com ara el coeficient de fricció.
    • Modificar el codi per llegir i utilitzar aquestes noves propietats.
  2. Implementar Forces Addicionals:

    • Afegir subrutines per calcular altres forces, com ara la fricció o la resistència de l'aire.
    • Integrar aquestes forces en les equacions de moviment.
  3. Visualitzar els Resultats:

    • Crear un script en un altre llenguatge (per exemple, Python) per visualitzar els resultats del simulador.

Solucions

Solució a l'Exercici 1

program read_config_extended
    implicit none
    integer :: i, num_objects
    real :: mass, initial_velocity, initial_position, friction_coefficient

    ! Obre el fitxer de configuració
    open(unit=10, file='config_extended.txt', status='old', action='read')

    ! Llegeix el nombre d'objectes
    read(10, *) num_objects

    ! Llegeix les propietats de cada objecte
    do i = 1, num_objects
        read(10, *) mass, initial_velocity, initial_position, friction_coefficient
        print *, 'Objecte', i, ': Massa =', mass, 'Velocitat Inicial =', initial_velocity, 'Posició Inicial =', initial_position, 'Coeficient de Fricció =', friction_coefficient
    end do

    ! Tanca el fitxer
    close(10)
end program read_config_extended

Solució a l'Exercici 2

subroutine calculate_motion_with_friction(mass, initial_velocity, initial_position, friction_coefficient, time, position, velocity)
    implicit none
    real, intent(in) :: mass, initial_velocity, initial_position, friction_coefficient, time
    real, intent(out) :: position, velocity
    real :: acceleration, friction_force

    ! Suposem una acceleració constant (per exemple, gravetat)
    acceleration = -9.81

    ! Calcula la força de fricció
    friction_force = friction_coefficient * mass * acceleration

    ! Equacions de moviment amb fricció
    position = initial_position + initial_velocity * time + 0.5 * (acceleration - friction_force/mass) * time**2
    velocity = initial_velocity + (acceleration - friction_force/mass) * time
end subroutine calculate_motion_with_friction

Conclusió

Aquest projecte final t'ha permès aplicar una àmplia gamma de conceptes de Fortran en un context pràctic. Has après a modularitzar el codi, gestionar fitxers, implementar estructures de dades avançades i optimitzar el rendiment del teu programa. Aquestes habilitats són fonamentals per a qualsevol programador que vulgui treballar amb Fortran en projectes reals. Felicitats per arribar fins aquí i completar el curs!

© Copyright 2024. Tots els drets reservats