Enrere Mòdul 4
Fonaments de Programació. Llenguatge C/C++---
Pràctica  Resum teòric Exercicis
Pràctica d'ampliació Annex: la depuració

 
Absorció de neutrons

La simulació és una part molt important de moltes branques de les ciències. La física nuclear és una d'elles. En aquesta pràctica farem una simulació del comportament dels neutrons al travessar una paret de plom en un reactor nuclear.

 

Desenvolupament de la pràctica

La figura mostra un esquema molt simplificat d'una secció transversal d'una paret blindada de plom d'un reactor nuclear. També mostra la trajectòria de dos neutrons que han xocat contra aquesta paret. Els neutrons entren a la paret per la part de sota i cada vegada que es troba en una intersecció, trien a l'atzar un dels quatre camins possibles (tornar enrera, avançar, girar a la dreta o girar a l'esquerra). Això és la interpretació que fem d'una col·lisió entre un neutró i un àtom de plom. Suposem que l'energia del neutró li permet només 10 col·lisions amb àtoms de plom, després dels quals el neutró perd totalment la seva energia cinètica i s'atura. En el dibuix, el neutró de l'esquerra no ha pogut travessar la paret i sí ha pogut el neutró de la dreta. Farem una simulació que ens pugui dir quin percentatge de neutrons travessarà la paret en funció del gruix de la paret de plom. També ens interessa el percentatge de neutrons que són reflectits cap enrera.

Anomenarem n el gruix de la paret, és a dir, el nom de capes d'àtoms de plom (en el dibuix anterior n = 4. Cada una de les capes serà anomenada 0, 1,..n-1. El neutró comença sempre xocant amb un àtom de la capa 0. En aquest moment, es tria un nombre enter a l'atzar entre 0 i 3. 0 vol dir anar enrera, 1 i 2 seguir en la mateixa capa (pot interpretar-se dreta i esquerra) i 3 vol dir avançar. Un neutró ha travessat la paret si ha arribat a la capa n abans de 10 xocs i s'ha reflectit si arriba a la capa -1 abans de 10 xocs.

Creeu un nou arxiu font C anomenat m4p08.c. i escriviu el següent codi:

//m4p08.c - ABSORCIÓ DE NEUTRONS -

#define N_NEUTRONS 100000
#include <stdio.h>
#include <stdlib.h>
 

int main(){

   int n=4;       //nombre de capes de la paret de plom
   int energia=10;//energia cinètica inicial dels neutrons
                  //mesurat en nombre de xocs màxim.
   int dau;       //nombre aleatori entre 0 i 3.
   int capa;      //nivell actual del neutró.
   int trav=0;    //nombre de neutrons que travessen.
   int ref=0;     //nombre de neutrons que són reflectits.
   int abs=0;     //nombre de neutrons absorbits
   int neutrons=N_NEUTRONS; //nombre de neutrons.


   system("clear");

   while(neutrons--){
       capa=0;
       energia=10;
          while(energia--){
            dau=rand()%4;
            switch (dau){
              case 0:
                      capa--;
                      break;
              case 3:
                      capa++;
                      break;
             }
             if (capa==n) {
                  trav++;
                  break;
             }
             if (capa<0) {
                  ref++;
                  break;
             }
          }
    }
    abs=N_NEUTRONS-trav-ref;


 
    printf("%d neutrons en total\n", N_NEUTRONS);
    printf("Han passat %d neutrons  %f%%\n",trav,(float)(trav)*100/N_NEUTRONS);
    printf("Han rebotat %d neutrons, %f%%\n",ref,
            (float)(ref)*100/N_NEUTRONS);
    printf("Han estat absorbits %d neutrons,%f%%\n",abs,
            (float)(abs)*100/N_NEUTRONS);
    return 0;
}

 

Captura de l'execució del programa.

 

 

Explicació del programa

En aquest programa, es simula la trajectòria de N_NEUTRONS passant per la paret de plom. El bucle principal comença amb:

 while(neutrons--){

on la variable neutrons comença amb N_NEUTRONS i va disminuint en una unitat cada vegada que s'executa el bucle. En el moment en què neutrons sigui 0, la condició serà falsa i se sortirà del bucle.

Per cada neutró s'inicialitza el seu estat (posició: capa=0 i energia =10). El bucle de xocs de cada electró s'executa fins que l'energia sigui 0. En cada xoc, aquesta energia disminueix en una unitat.

A la variable dau se l'assigna un nombre aleatori entre 0 i 3 i, segons aquest valor, canvia la posició del neutró. Això és el que fa la sentència switch. Després d'aquesta sentència, dues sentències if comproven si el neutró ha travessat la paret o ha rebotat.

Per últim, es mostra per pantalla el resultat d'aquesta simulació. Es mostra el nombre total i el percentatge de neutrons que travessen, que són reflectits i que són absorbits per la paret.

En aquesta simulació s'ha optat per assignar directament els valors en el programa, però es podria també demanar aquestes dades i fer el programa més general.