Skip to content
Snippets Groups Projects
StaticODESolver-LorenzParallelExample.py 2.43 KiB
Newer Older
#!/usr/bin/env python3

import sys
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d, Axes3D

plt.rcParams['text.usetex'] = True

f = open( sys.argv[1], 'r' )
current_sigma = 0.0
current_rho = 0.0
current_beta = 0.0
sigma_lst = []
rho_lst = []
beta_lst = []
x_lst = []
y_lst = []
z_lst = []
x_data = []
y_data = []
z_data = []
parameters = []
data = {}
size = 0
for line in f:
   line = line.strip()
   a = line.split()
   if not a:
      continue
   if a[ 0 ] == "#":
      if x_lst:
         parameters_tuple = ( current_sigma, current_rho, current_beta )
         parameters.append( parameters_tuple )
         data_tuple = ( np.array( x_lst ), np.array( y_lst ), np.array( z_lst ) )
         data[ parameters_tuple ] = data_tuple
         x_lst.clear()
         y_lst.clear()
         z_lst.clear()

      current_sigma = float( a[ 2 ] )
      current_rho = float( a[ 4 ] )
      current_beta = float( a [ 6 ] )
      if current_sigma not in sigma_lst:
         sigma_lst.append( current_sigma )
      if current_rho not in rho_lst:
         rho_lst.append( current_rho )
      if current_beta not in beta_lst:
         beta_lst.append( current_beta )
   else:
      x_lst.append( float( a[ 0 ] ) )
      y_lst.append( float( a[ 1 ] ) )
      z_lst.append( float( a[ 2 ] ) )
parameters_tuple = ( current_sigma, current_rho, current_beta )
parameters.append( parameters_tuple )
data_tuple = ( np.array( x_lst ), np.array( y_lst ), np.array( z_lst ) )
data[ parameters_tuple ] = data_tuple

sigma_n = len( sigma_lst )
sigma_idx = 1
for sigma in sigma_lst:
   rho_n   = len( rho_lst )
   beta_n  = len( beta_lst )

   fig, ax = plt.subplots( rho_n, beta_n, figsize=(8, 8), sharey=True, sharex=True )
   fig.suptitle( f'$\sigma={sigma}$')
   #ax = Axes3D(fig)  dos not work with ax indexing
   rho_idx = 0
   beta_idx = 0
   for rho in rho_lst:
      for beta in beta_lst:
         parameters_tuple = ( sigma, rho, beta )
         data_tuple = data[ parameters_tuple ]
         ax[ rho_idx, beta_idx ].plot( data_tuple[ 1 ], data_tuple[ 2 ], linewidth=1.0 )
         if beta_idx == 0:
            ax[ rho_idx, beta_idx ].set_ylabel( f'$\\rho={rho}$' )
         if rho_idx == rho_n-1:            
            ax[ rho_idx, beta_idx ].set_xlabel( f'$\\beta={beta}$' )
         beta_idx = beta_idx + 1
      beta_idx = 0
      rho_idx = rho_idx + 1

   plt.savefig( f"{sys.argv[2]}-{sigma_idx}.png" )
   sigma_idx = sigma_idx + 1
   plt.close(fig)