Lab fenòmens: afegir informe i ultims canvis al codi

Change-Id: I7f01665996295625fc390f9382dd0ba1c9882bbc
diff --git a/quad10/fenomens/lab/p4/MC-2.f90 b/quad10/fenomens/lab/p4/MC-2.f90
index 554890d..ccc2941 100644
--- a/quad10/fenomens/lab/p4/MC-2.f90
+++ b/quad10/fenomens/lab/p4/MC-2.f90
@@ -7,19 +7,25 @@
   integer*4 :: I, J, IMC, MCTOT, MCINI, MCD, IPAS, N, SEED, NSEED, SEED0, pbc
   integer :: genrand_int31
   character(100) :: NOM
-  logical :: SAVEFINALCONF
+  logical :: SAVEFINALCONF, SAVEEVOLUTION
 
   integer :: SUMI
-  real(dp) :: SUME, SUME2, SUMM, SUMAM, SUMM2, VARE, VARM, CV, CHI
+  real(dp) :: SUME, SUME2, SUMM, SUMAM, SUMM2, VARE_TIMES_SUMI, VARM_TIMES_SUMI, CV, CHI
 
-  ! This should be replaced by L but it doesn't work dynamically, so we're
-  ! setting 64 as the upper limit which should be higher than L.
-  integer*2 :: S(1:64, 1:64)
+  ! Donat que les matrius a Fortran han de tenir una mida fixada i no poden
+  ! dependre dinàmicament d'un paràmetre L, fem S de mida 128x128, i establim
+  ! 128 com el valor màxim de L.
+  integer*2 :: S(1:128, 1:128)
 
-  ! Inicialitzem algunes variables sobre el problema
-  namelist /DADES/ L, NOM, TEMP, NSEED, SEED0, MCTOT, MCINI, MCD, SAVEFINALCONF
+  ! Inicialitzem algunes variables sobre el problema, que es passen al programa amb un namelist
+  namelist /DADES/ L, NOM, TEMP, NSEED, SEED0, MCTOT, MCINI, MCD, SAVEFINALCONF, SAVEEVOLUTION
   read(nml = DADES, unit = 5)
 
+  if (L < 1 .or. L > 128) then
+    print *, "ERROR: L ha de ser un enter entre 1 i 128."
+    stop
+  endif
+
   N = L*L
 
   ! Cache dels valors de l'exponencial
@@ -27,6 +33,7 @@
     W(I) = (2**30 - 1 + 2**30)*exp(-float(I)/TEMP)
   enddo
 
+  ! Variables on anirem sumant les magnituds per fer el promig posteriorment
   SUMI = 0
   SUME = 0
   SUME2 = 0
@@ -35,6 +42,12 @@
   SUMAM = 0
   SUMM2 = 0
 
+  ! Si s'ha especificat de guardar l'evolució temporal, obrim el fitxer on la guardarem
+  if (SAVEEVOLUTION) then
+    open(12, file = "data_out/" // trim(NOM) // ".ev")
+  endif
+
+  ! Fem la simulació per NSEED seeds inicials.
   do SEED = SEED0, SEED0 + NSEED - 1
     print *, "Seed: ", SEED
 
@@ -43,11 +56,13 @@
 
     E = energ(S, L)
     M = magne(S, L)
+    if (SAVEEVOLUTION) then
+      write (12, *) "0", E, M
+    endif
 
     ! Iterem amb el mètode de Montecarlo
     do IMC = 1, MCTOT
       do IPAS = 1, N
-        ! LOS LOOPS HACEN COSAS
         I = mod(genrand_int31(), L) + 1
         J = mod(genrand_int31(), L) + 1
         SUMA = S(PBC(I - 1, L), J) + &
@@ -59,7 +74,7 @@
         if (DIFE > 0) then
           DELTA = genrand_int31()
           if (DELTA >= W(int(DIFE))) then
-            ! NO ho acceptem
+            ! NO ho acceptem, passem a la següent volta del loop
             cycle
           endif
         endif
@@ -70,6 +85,12 @@
         M = M + 2*S(I, J)
       enddo
 
+      if (SAVEEVOLUTION) then
+        write (12, *) IMC, E, M
+      endif
+
+      ! Per evitar les correlacions de configuracions consecutives, només
+      ! prenem mesures cada MCD configuracions.
       if (IMC > MCINI .and. mod(IMC, MCD) == 0) then
         SUMI = SUMI + 1
 
@@ -89,15 +110,15 @@
   SUMM = SUMM/SUMI
   SUMAM = SUMAM/SUMI
   SUMM2 = SUMM2/SUMI
-  VARE = SUME2 - SUME**2
-  VARM = SUMM2 - SUMM**2
+  VARE_TIMES_SUMI = SUME2 - SUME**2
+  VARM_TIMES_SUMI = SUMM2 - SUMM**2
   CV = (SUME2 - SUME**2)/real(N*TEMP**2)
   CHI = (SUMM2 - SUMAM**2)/real(N*TEMP)
 
-  ! Guardem a un fiter els promitjos
+  ! Guardem a un fitxer els promitjos
   open(unit = 13, file = "data_out/" // trim(NOM) // ".res")
-  ! Valors: L, T, <E>, <E**2>, Var(E), <M>, <|M|>, <M**2>, Var(M), C_V, CHI
-  write(13, *) L, TEMP, SUME, SUME2, VARE, SUMM, SUMAM, SUMM2, VARM, CV, CHI
+  ! Valors: L, T, <E>, <E**2>, Var(E)*SUMI, <M>, <|M|>, <M**2>, Var(M)*SUMI, C_V, CHI
+  write(13, *) L, TEMP, SUME, SUME2, VARE_TIMES_SUMI, SUMM, SUMAM, SUMM2, VARM_TIMES_SUMI, CV, CHI
 
   if (SAVEFINALCONF) then
     call writeConfig(S, L, "data_out/" // trim(NOM) // ".conf")
@@ -105,4 +126,7 @@
 
   ! Tanquem els fitxers de sortida
   close(13)
+  if (SAVEEVOLUTION) then
+    close(12)
+  endif
 endprogram main