//  TRANSIT.C
//  Function to calculate transition probabilities.
//  © 2021 Peter J. Meyer

#include "iss.h"

/*  For T=1.0
Glauber transition probabilities (1/(1+e^n)) with J=1.0:
 -8:0.99966465  -7:0.99908895  -6:0.99752738  -5:0.99330715  -4:0.98201379
 -3:0.95257413  -2:0.88079708  -1:0.73105858   0:0.50000000   1:0.26894142
  2:0.11920292   3:0.04742587   4:0.01798621   5:0.00669285   6:0.00247262
  7:0.00091105   8:0.00033535
    For T=2.5 we have:
Glauber transition probabilities (1/(1+e^n)) with J=1.0:
 -8:0.96083428  -7:0.94267582  -6:0.91682730  -5:0.88079708  -4:0.83201839
 -3:0.76852478  -2:0.68997448  -1:0.59868766   0:0.50000000   1:0.40131234
  2:0.31002552   3:0.23147522   4:0.16798161   5:0.11920292   6:0.08317270
  7:0.05732418   8:0.03916572
    For T=3.5 we have:
Glauber transition probabilities (1/(1+e^n)) with J=1.0:
 -8:0.90768697  -7:0.88079708  -6:0.84739134  -5:0.80667863  -4:0.75820383
 -3:0.70206337  -2:0.63909275  -1:0.57094660   0:0.50000000   1:0.42905340
  2:0.36090725   3:0.29793663   4:0.24179617   5:0.19332137   6:0.15260866
  7:0.11920292   8:0.09231303
    For T=10.0 we have:
Glauber transition probabilities (1/(1+e^n)) with J=1.0:
 -8:0.68997448  -7:0.66818777  -6:0.64565631  -5:0.62245933  -4:0.59868766
 -3:0.57444252  -2:0.54983400  -1:0.52497919   0:0.50000000   1:0.47502081
  2:0.45016600   3:0.42555748   4:0.40131234   5:0.37754067   6:0.35434369
  7:0.33181223   8:0.31002552
*/

//  DO FOR METROPOLIS

//  This assumes temperature > 0.
/*-----------------------------------------*/
void calculate_transition_probabilities(void)
{
#if DISPLAY_TRANSITION_PROBABILITIES
int i;
#endif
int s; 

//  If coordination number is n then
//      s:  -2n  -2n+1 -2n+2 ...  -2   -1  0    1    2 ... 2n-1 2n
//  index:    0      1     2    2n-2 2n-1 2n 2n+1 2n+2 ... 4n-1 4n
for ( s=-2*coord_num; s<=2*coord_num; s++ )
    {
    if ( dynamics_is_metropolis )
        w[s+2*coord_num] = ( s <= 0 ? 1.0 : exp((-s*J)/temperature) );
    else    //  dynamics is glauber    
        w[s+2*coord_num] = 1/(1+exp(s*J/temperature));
    }

#if DISPLAY_TRANSITION_PROBABILITIES
if ( dynamics_is_metropolis )
    printf("Metropolis transition probabilities (e^-n) with J=%.1f:",J);
else
    printf("Glauber transition probabilities (1/(1+e^n)) with J=%.1f:",J);
i = 0;
for ( s=-2*coord_num; s<=2*coord_num; s++ )
    {
    if ( w[s+2*coord_num] != 1.0 )
        {
        if ( !(i%5) )
            printf("\n");
        printf("%3d:%10.8f ",s,w[s+2*coord_num]);
        i++;
        }
    }

printf("\n\n");
#endif
}