Module tools
@author: Alexandre Sac–Morane alexandre.sac-morane@uclouvain.be
Different functions used in the script.
Expand source code
# -*- encoding=utf-8 -*-
from pathlib import Path
import shutil, os, pickle, math
import numpy as np
import matplotlib.pyplot as plt
# own
from pf_to_dem import *
#------------------------------------------------------------------------------------------------------------------------------------------ #
def create_folder(name):
'''
Create a new folder. If it already exists, it is erased.
'''
if Path(name).exists():
shutil.rmtree(name)
os.mkdir(name)
#------------------------------------------------------------------------------------------------------------------------------------------ #
def save_mesh_database(dict_user, dict_sample):
'''
Save mesh database.
'''
# creating a database
if not Path('mesh_map.database').exists():
dict_data = {
'n_proc': dict_user['n_proc'],
'n_mesh_x': len(dict_sample['x_L']),
'n_mesh_y': len(dict_sample['y_L']),
'n_mesh_z': len(dict_sample['z_L']),
'L_L_i_XYZ_used': dict_sample['L_L_i_XYZ_used'],
}
dict_database = {'Run_1': dict_data}
with open('mesh_map.database', 'wb') as handle:
pickle.dump(dict_database, handle, protocol=pickle.HIGHEST_PROTOCOL)
# updating a database
else :
with open('mesh_map.database', 'rb') as handle:
dict_database = pickle.load(handle)
dict_data = {
'n_proc': dict_user['n_proc'],
'n_mesh_x': len(dict_sample['x_L']),
'n_mesh_y': len(dict_sample['y_L']),
'n_mesh_z': len(dict_sample['z_L']),
'L_L_i_XYZ_used': dict_sample['L_L_i_XYZ_used']
}
mesh_map_known = False
for i_run in range(1,len(dict_database.keys())+1):
if dict_database['Run_'+str(int(i_run))]['n_proc'] == dict_data['n_proc'] and \
dict_database['Run_'+str(int(i_run))]['n_mesh_x'] == dict_data['n_mesh_x'] and \
dict_database['Run_'+str(int(i_run))]['n_mesh_y'] == dict_data['n_mesh_y'] and \
dict_database['Run_'+str(int(i_run))]['n_mesh_z'] == dict_data['n_mesh_z']:
mesh_map_known = True
# new entry
if not mesh_map_known:
key_entry = 'Run_'+str(int(len(dict_database.keys())+1))
dict_database[key_entry] = dict_data
with open('mesh_map.database', 'wb') as handle:
pickle.dump(dict_database, handle, protocol=pickle.HIGHEST_PROTOCOL)
#------------------------------------------------------------------------------------------------------------------------------------------ #
def check_mesh_database(dict_user, dict_sample):
'''
Check mesh database.
'''
if Path('mesh_map.database').exists():
with open('mesh_map.database', 'rb') as handle:
dict_database = pickle.load(handle)
dict_data = {
'n_proc': dict_user['n_proc'],
'n_mesh_x': len(dict_sample['x_L']),
'n_mesh_y': len(dict_sample['y_L']),
'n_mesh_z': len(dict_sample['z_L'])
}
mesh_map_known = False
for i_run in range(1,len(dict_database.keys())+1):
if dict_database['Run_'+str(int(i_run))]['n_proc'] == dict_data['n_proc'] and \
dict_database['Run_'+str(int(i_run))]['n_mesh_x'] == dict_data['n_mesh_x'] and \
dict_database['Run_'+str(int(i_run))]['n_mesh_y'] == dict_data['n_mesh_y'] and \
dict_database['Run_'+str(int(i_run))]['n_mesh_z'] == dict_data['n_mesh_z']:
mesh_map_known = True
i_known = i_run
if mesh_map_known :
dict_sample['Map_known'] = True
dict_sample['L_L_i_XYZ_used'] = dict_database['Run_'+str(int(i_known))]['L_L_i_XYZ_used']
else :
dict_sample['Map_known'] = False
else :
dict_sample['Map_known'] = False
#------------------------------------------------------------------------------------------------------------------------------------------ #
def plot_sum_mean_etai_c(dict_user, dict_sample):
'''
Plot figure illustrating the sum and the mean of etai and c.
'''
# compute tracker
# sum
s_eta_i = 0
if dict_user['L_L_sum_eta_i'] == []:
for i_grain in range(len(dict_sample['L_etai_map'])):
dict_user['L_L_sum_eta_i'].append([np.sum(dict_sample['L_etai_map'][i_grain])])
s_eta_i = s_eta_i + np.sum(dict_sample['L_etai_map'][i_grain])
else :
for i_grain in range(len(dict_sample['L_etai_map'])):
dict_user['L_L_sum_eta_i'][i_grain].append(np.sum(dict_sample['L_etai_map'][i_grain]))
s_eta_i = s_eta_i + np.sum(dict_sample['L_etai_map'][i_grain])
dict_user['L_sum_c'].append(np.sum(dict_sample['c_map']))
dict_user['L_sum_mass'].append(1/dict_user['V_m']*s_eta_i+np.sum(dict_sample['c_map']))
# mean
m_eta_i = 0
if dict_user['L_L_m_eta_i'] == []:
for i_grain in range(len(dict_sample['L_etai_map'])):
dict_user['L_L_m_eta_i'].append([np.mean(dict_sample['L_etai_map'][i_grain])])
m_eta_i = m_eta_i + np.mean(dict_sample['L_etai_map'][i_grain])
else :
for i_grain in range(len(dict_sample['L_etai_map'])):
dict_user['L_L_m_eta_i'][i_grain].append(np.mean(dict_sample['L_etai_map'][i_grain]))
m_eta_i = m_eta_i + np.mean(dict_sample['L_etai_map'][i_grain])
dict_user['L_m_c'].append(np.mean(dict_sample['c_map']))
dict_user['L_m_mass'].append(1/dict_user['V_m']*m_eta_i+np.mean(dict_sample['c_map']))
# plot sum eta_i, c
if 'sum_etai_c' in dict_user['L_figures']:
fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2,ncols=2,figsize=(16,9))
for i_grain in range(len(dict_sample['L_L_sum_eta_i'])):
ax1.plot(dict_user['L_L_sum_eta_i'][i_grain])
ax1.set_title(r'$\Sigma\eta_i$')
ax3.plot(dict_user['L_sum_c'])
ax3.set_title(r'$\Sigma C$')
ax4.plot(dict_user['L_sum_mass'])
ax4.set_title(r'$\Sigma mass$')
fig.tight_layout()
fig.savefig('plot/sum_etai_c.png')
plt.close(fig)
# plot mean eta_i, c
if 'mean_etai_c' in dict_user['L_figures']:
fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2,ncols=2,figsize=(16,9))
for i_grain in range(len(dict_user['L_L_m_eta_i'])):
ax1.plot(dict_user['L_L_m_eta_i'][i_grain])
ax1.set_title(r'Mean $\eta_i$')
ax3.plot(dict_user['L_m_c'])
ax3.set_title(r'Mean $c$')
ax4.plot(dict_user['L_m_mass'])
ax4.set_title(r'Mean mass')
fig.tight_layout()
fig.savefig('plot/mean_etai_c.png')
plt.close(fig)
#------------------------------------------------------------------------------------------------------------------------------------------ #
def compute_mass(dict_user, dict_sample):
'''
Compute the mass at a certain time.
Mass is sum of etai and c.
'''
# sum of masses
L_sum_eta_i_tempo = []
s_eta_i = 0
for i_grain in range(len(dict_sample['L_etai_map'])):
L_sum_eta_i_tempo.append([np.sum(dict_sample['L_etai_map'][i_grain])])
s_eta_i = s_eta_i + np.sum(dict_sample['L_etai_map'][i_grain])
dict_user['L_sum_eta_i_tempo'] = L_sum_eta_i_tempo
dict_user['sum_c_tempo'] = np.sum(dict_sample['c_map'])
dict_user['sum_mass_tempo'] = 1/dict_user['V_m']*s_eta_i+np.sum(dict_sample['c_map'])
#------------------------------------------------------------------------------------------------------------------------------------------ #
def compute_mass_loss(dict_user, dict_sample, tracker_key):
'''
Compute the mass loss from the previous compute_mass() call.
Plot in the given tracker.
Mass is sum of etai and c.
'''
# delta masses
if dict_user['L_'+tracker_key+'_eta_i'] == []:
s_eta_i = 0
for i_grain in range(len(dict_sample['L_etai_map'])):
detai = np.sum(dict_sample['L_etai_map'][i_grain]) - dict_user['L_sum_eta_i_tempo'][i_grain]
s_eta_i = s_eta_i + np.sum(dict_sample['L_etai_map'][i_grain])
# save
dict_user['L_'+tracker_key+'_eta_i'].append([detai])
else :
s_eta_i = 0
for i_grain in range(len(dict_sample['L_etai_map'])):
detai = np.sum(dict_sample['L_etai_map'][i_grain]) - dict_user['L_sum_eta_i_tempo'][i_grain]
s_eta_i = s_eta_i + np.sum(dict_sample['L_etai_map'][i_grain])
# save
dict_user['L_'+tracker_key+'_eta_i'][i_grain].append(detai)
dc = np.sum(dict_sample['c_map']) - dict_user['sum_c_tempo']
dm = 1/dict_user['V_m']*s_eta_i+np.sum(dict_sample['c_map']) - dict_user['sum_mass_tempo']
# save
dict_user[tracker_key+'_c'].append(dc)
dict_user[tracker_key+'_m'].append(dm)
# plot
if 'mass_loss' in dict_user['L_figures']:
fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2,ncols=2,figsize=(16,9))
for i_grain in range(len(dict_sample['L_'+tracker_key+'_eta_i'])):
ax1.plot(dict_user['L_'+tracker_key+'_eta_i'][i_grain])
ax1.set_title(r'$\eta_i$ loss')
ax3.plot(dict_user[tracker_key+'_c'])
ax3.set_title(r'$c$ loss')
ax4.plot(dict_user[tracker_key+'_m'])
ax4.set_title(r'mass loss')
fig.tight_layout()
fig.savefig('plot/'+tracker_key+'.png')
plt.close(fig)
#------------------------------------------------------------------------------------------------------------------------------------------ #
def plot_performances(dict_user, dict_sample):
'''
Plot figure illustrating the time performances of the algorithm.
'''
if 'performances' in dict_user['L_figures']:
fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9))
ax1.plot(dict_user['L_t_dem'], label='DEM')
ax1.plot(dict_user['L_t_pf'], label='PF')
ax1.plot(dict_user['L_t_dem_to_pf'], label='DEM to PF')
ax1.plot(dict_user['L_t_pf_to_dem_1'], label='PF to DEM 1')
ax1.plot(dict_user['L_t_pf_to_dem_2'], label='PF to DEM 2')
ax1.legend()
ax1.set_title('Performances (s)')
ax1.set_xlabel('Iterations (-)')
fig.tight_layout()
fig.savefig('plot/performances.png')
plt.close(fig)
#------------------------------------------------------------------------------------------------------------------------------------------ #
def plot_dem(dict_user, dict_sample):
'''
Plot figure illustrating the overlap and force transmitted.
'''
# Need to be adapted to multiple contacts
if 'overlap' in dict_user['L_figures']:
fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9))
for i_contact in range(len(dict_user['L_L_overlap'])):
ax1.plot(dict_user['L_L_overlap'][i_contact])
ax1.set_xlabel('iterations (-)')
ax1.set_ylabel('overlap in DEM (-)')
fig.tight_layout()
fig.savefig('plot/dem_overlap.png')
plt.close(fig)
if 'normal_force' in dict_user['L_figures']:
fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9))
for i_contact in range(len(dict_user['L_L_normal_force'])):
ax1.plot(dict_user['L_L_normal_force'][i_contact])
ax1.plot([0, len(dict_user['L_normal_force'])-1],\
[dict_user['force_applied'], dict_user['force_applied']], color='k', label='target')
ax1.set_xlabel('iterations (-)')
ax1.set_ylabel('normal force (-)')
fig.tight_layout()
fig.savefig('plot/dem_normal_force.png')
plt.close(fig)
#------------------------------------------------------------------------------------------------------------------------------------------ #
def plot_contact(dict_user, dict_sample):
'''
Plot figure illustrating the contact characteristics.
'''
# Need to be adapted to multiple contacts
if 'contact_box' in dict_user['L_figures']:
fig, (ax1,ax2,ax3) = plt.subplots(nrows=1,ncols=3,figsize=(16,9))
for i_contact in range(len(dict_user['L_L_contact_box_x'])):
ax1.plot(dict_user['L_L_contact_box_x'][i_contact])
ax2.plot(dict_user['L_L_contact_box_y'][i_contact])
ax3.plot(dict_user['L_L_contact_box_z'][i_contact])
ax1.set_suptitle('x')
ax2.set_suptitle('y')
ax3.set_suptitle('z')
ax1.set_ylabel('contact box dimensions (-)')
ax2.set_xlabel('iterations (-)')
fig.tight_layout()
fig.savefig('plot/contact_box.png')
plt.close(fig)
if 'contact_volume' in dict_user['L_figures']:
fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9))
for i_contact in range(len(dict_user['L_L_contact_volume'])):
ax1.plot(dict_user['L_L_contact_volume'][i_contact])
ax1.set_xlabel('iterations (-)')
ax1.set_ylabel('contact volume (-)')
fig.tight_layout()
fig.savefig('plot/contact_volume.png')
plt.close(fig)
if 'contact_surface' in dict_user['L_figures']:
fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9))
for i_contact in range(len(dict_user['L_L_contact_surface'])):
ax1.plot(dict_user['L_L_contact_surface'][i_contact])
ax1.set_xlabel('iterations (-)')
ax1.set_ylabel('contact surface (-)')
fig.tight_layout()
fig.savefig('plot/contact_surface.png')
plt.close(fig)
#------------------------------------------------------------------------------------------------------------------------------------------ #
def plot_as_pressure(dict_user, dict_sample):
'''
Plot figure illustrating the solid activity and pressure at the contact.
'''
if 'as' in dict_user['L_figures']:
fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9))
for i_contact in range(len(dict_user['L_L_contact_as'])):
ax1.plot(dict_user['L_L_contact_as'][i_contact])
ax1.set_xlabel('iterations (-)')
ax1.set_ylabel('solid activity (-)')
fig.tight_layout()
fig.savefig('plot/contact_as.png')
plt.close(fig)
if 'pressure' in dict_user['L_figures']:
fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9))
for i_contact in range(len(dict_user['L_L_contact_pressure'])):
ax1.plot(dict_user['L_L_contact_pressure'][i_contact])
ax1.set_xlabel('iterations (-)')
ax1.set_ylabel('solid pressure (-)')
fig.tight_layout()
fig.savefig('plot/contact_pressure.png')
plt.close(fig)
#------------------------------------------------------------------------------------------------------------------------------------------ #
def plot_slices(dict_user, dict_sample):
'''
Plot slices of the configuration.
'''
# determine the index of the slices
i_x_slice = int(len(dict_sample['x_L'])/2)
i_y_slice = int(len(dict_sample['y_L'])/2)
i_z_slice = int(len(dict_sample['z_L'])/2)
if 'configuration_eta' in dict_user['L_figures'] :
for i_grain in range(len(dict_sample['L_etai_map'])):
# plot
fig, (ax1, ax2, ax3) = plt.subplots(nrows=1,ncols=3,figsize=(16,9))
# y-z
im = ax1.imshow(dict_sample['L_etai_map'][i_grain][i_x_slice,:,:], interpolation = 'nearest')
fig.colorbar(im, ax=ax1)
ax1.set_title(r'slice y-z',fontsize = 30)
# x-z
im = ax2.imshow(dict_sample['L_etai_map'][i_grain][:,i_y_slice,:], interpolation = 'nearest')
fig.colorbar(im, ax=ax2)
ax2.set_title(r'slice x-z',fontsize = 30)
# x-y
im = ax3.imshow(dict_sample['L_etai_map'][i_grain][:,:,i_z_slice], interpolation = 'nearest')
fig.colorbar(im, ax=ax3)
ax3.set_title(r'slice x-y',fontsize = 30)
# close
fig.tight_layout()
fig.savefig('plot/configuration/eta_'+str(i_grain+1)+'_'+str(dict_sample['i_DEMPF_ite'])+'.png')
plt.close(fig)
if 'configuration_c' in dict_user['L_figures']:
# plot
fig, (ax1, ax2, ax3) = plt.subplots(nrows=1,ncols=3,figsize=(16,9))
# y-z
im = ax1.imshow(dict_sample['c_map'][i_x_slice,:,:], interpolation = 'nearest')
fig.colorbar(im, ax=ax1)
ax1.set_title(r'slice y-z',fontsize = 30)
# x-z
im = ax2.imshow(dict_sample['c_map'][:,i_y_slice,:], interpolation = 'nearest')
fig.colorbar(im, ax=ax2)
ax2.set_title(r'slice x-z',fontsize = 30)
# x-y
im = ax3.imshow(dict_sample['c_map'][:,:,i_z_slice], interpolation = 'nearest')
fig.colorbar(im, ax=ax3)
ax3.set_title(r'slice x-y',fontsize = 30)
# close
fig.tight_layout()
fig.savefig('plot/configuration/c_'+str(dict_sample['i_DEMPF_ite'])+'.png')
plt.close(fig)
if 'configuration_s_eta' in dict_user['L_figures']:
# initialization
map_sum_etas = np.zeros((dict_sample['c_map'].shape[0], dict_sample['c_map'].shape[2]))
# iterate on grains
for i_grain in range(len(dict_sample['L_etai_map'])):
# x-z
map_sum_etas = map_sum_etas + dict_sample['L_etai_map'][i_grain][:,i_y_slice,:]
# plot
fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9))
im = ax1.imshow(map_sum_etas, interpolation = 'nearest')
ax1.set_title(r'slice x-z',fontsize = 30)
fig.colorbar(im, ax=ax1)
fig.tight_layout()
fig.savefig('plot/configuration/s_eta_'+str(dict_sample['i_DEMPF_ite'])+'.png')
plt.close(fig)
#------------------------------------------------------------------------------------------------------------------------------------------ #
def plot_displacement(dict_user, dict_sample):
'''
Plot figure illustrating the cumulative displacement.
'''
# pp data
L_L_strain = []
for i_grain in range(len(dict_user['L_L_displacement'][0])):
L_strain = []
for i_displacement in range(len(dict_user['L_L_displacement'])):
if i_displacement == 0:
L_displacement_cum = [dict_user['L_L_displacement'][i_displacement][i_grain][2]]
else :
L_displacement_cum.append(L_displacement_cum[-1]+dict_user['L_L_displacement'][i_displacement][i_grain][2])
L_strain.append(L_displacement_cum[-1]/(2*dict_user['radius']))
L_L_strain.append(L_strain)
# plot
fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9))
for i_grain in range(len(L_L_strain)):
ax1.plot(L_L_strain[i_grain])
ax1.set_xlabel('iterations (-)')
ax1.set_ylabel('vertical strain (-)')
fig.tight_layout()
fig.savefig('plot/vertical_strain_grain.png')
plt.close(fig)
#------------------------------------------------------------------------------------------------------------------------------------------ #
def plot_settlement(dict_user, dict_sample):
'''
Plot figure illustrating the settlement curve.
'''
# pp data
L_strain = []
for i_size in range(len(dict_user['L_delta_z_sample'])):
L_strain.append((dict_user['L_delta_z_sample'][i_size]-dict_user['L_delta_z_sample'][0])/dict_user['L_delta_z_sample'][0])
# plot
fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9))
ax1.plot(L_strain)
ax1.set_xlabel('iterations (-)')
ax1.set_ylabel('vertical strain (-)')
fig.tight_layout()
fig.savefig('plot/vertical_strain.png')
plt.close(fig)
Functions
def create_folder()
-
Createa new folder.
If it already exists, it is erased.
Expand source code
def create_folder(name): ''' Create a new folder. If it already exists, it is erased. ''' if Path(name).exists(): shutil.rmtree(name) os.mkdir(name)
def save_mesh_database()
-
Save mesh database.
Expand source code
def save_mesh_database(dict_user, dict_sample): ''' Save mesh database. ''' # creating a database if not Path('mesh_map.database').exists(): dict_data = { 'n_proc': dict_user['n_proc'], 'n_mesh_x': len(dict_sample['x_L']), 'n_mesh_y': len(dict_sample['y_L']), 'n_mesh_z': len(dict_sample['z_L']), 'L_L_i_XYZ_used': dict_sample['L_L_i_XYZ_used'], } dict_database = {'Run_1': dict_data} with open('mesh_map.database', 'wb') as handle: pickle.dump(dict_database, handle, protocol=pickle.HIGHEST_PROTOCOL) # updating a database else : with open('mesh_map.database', 'rb') as handle: dict_database = pickle.load(handle) dict_data = { 'n_proc': dict_user['n_proc'], 'n_mesh_x': len(dict_sample['x_L']), 'n_mesh_y': len(dict_sample['y_L']), 'n_mesh_z': len(dict_sample['z_L']), 'L_L_i_XYZ_used': dict_sample['L_L_i_XYZ_used'] } mesh_map_known = False for i_run in range(1,len(dict_database.keys())+1): if dict_database['Run_'+str(int(i_run))]['n_proc'] == dict_data['n_proc'] and \ dict_database['Run_'+str(int(i_run))]['n_mesh_x'] == dict_data['n_mesh_x'] and \ dict_database['Run_'+str(int(i_run))]['n_mesh_y'] == dict_data['n_mesh_y'] and \ dict_database['Run_'+str(int(i_run))]['n_mesh_z'] == dict_data['n_mesh_z']: mesh_map_known = True # new entry if not mesh_map_known: key_entry = 'Run_'+str(int(len(dict_database.keys())+1)) dict_database[key_entry] = dict_data with open('mesh_map.database', 'wb') as handle: pickle.dump(dict_database, handle, protocol=pickle.HIGHEST_PROTOCOL)
def check_mesh_database()
-
Check mesh database.
Expand source code
def check_mesh_database(dict_user, dict_sample): ''' Check mesh database. ''' if Path('mesh_map.database').exists(): with open('mesh_map.database', 'rb') as handle: dict_database = pickle.load(handle) dict_data = { 'n_proc': dict_user['n_proc'], 'n_mesh_x': len(dict_sample['x_L']), 'n_mesh_y': len(dict_sample['y_L']), 'n_mesh_z': len(dict_sample['z_L']) } mesh_map_known = False for i_run in range(1,len(dict_database.keys())+1): if dict_database['Run_'+str(int(i_run))]['n_proc'] == dict_data['n_proc'] and \ dict_database['Run_'+str(int(i_run))]['n_mesh_x'] == dict_data['n_mesh_x'] and \ dict_database['Run_'+str(int(i_run))]['n_mesh_y'] == dict_data['n_mesh_y'] and \ dict_database['Run_'+str(int(i_run))]['n_mesh_z'] == dict_data['n_mesh_z']: mesh_map_known = True i_known = i_run if mesh_map_known : dict_sample['Map_known'] = True dict_sample['L_L_i_XYZ_used'] = dict_database['Run_'+str(int(i_known))]['L_L_i_XYZ_used'] else : dict_sample['Map_known'] = False else : dict_sample['Map_known'] = False
def plot_sum_mean_etai_c()
-
Plot figure illustrating the sum and the mean of etai and c.
Expand source code
def plot_sum_mean_etai_c(dict_user, dict_sample): ''' Plot figure illustrating the sum and the mean of etai and c. ''' # compute tracker # sum s_eta_i = 0 if dict_user['L_L_sum_eta_i'] == []: for i_grain in range(len(dict_sample['L_etai_map'])): dict_user['L_L_sum_eta_i'].append([np.sum(dict_sample['L_etai_map'][i_grain])]) s_eta_i = s_eta_i + np.sum(dict_sample['L_etai_map'][i_grain]) else : for i_grain in range(len(dict_sample['L_etai_map'])): dict_user['L_L_sum_eta_i'][i_grain].append(np.sum(dict_sample['L_etai_map'][i_grain])) s_eta_i = s_eta_i + np.sum(dict_sample['L_etai_map'][i_grain]) dict_user['L_sum_c'].append(np.sum(dict_sample['c_map'])) dict_user['L_sum_mass'].append(1/dict_user['V_m']*s_eta_i+np.sum(dict_sample['c_map'])) # mean m_eta_i = 0 if dict_user['L_L_m_eta_i'] == []: for i_grain in range(len(dict_sample['L_etai_map'])): dict_user['L_L_m_eta_i'].append([np.mean(dict_sample['L_etai_map'][i_grain])]) m_eta_i = m_eta_i + np.mean(dict_sample['L_etai_map'][i_grain]) else : for i_grain in range(len(dict_sample['L_etai_map'])): dict_user['L_L_m_eta_i'][i_grain].append(np.mean(dict_sample['L_etai_map'][i_grain])) m_eta_i = m_eta_i + np.mean(dict_sample['L_etai_map'][i_grain]) dict_user['L_m_c'].append(np.mean(dict_sample['c_map'])) dict_user['L_m_mass'].append(1/dict_user['V_m']*m_eta_i+np.mean(dict_sample['c_map'])) # plot sum eta_i, c if 'sum_etai_c' in dict_user['L_figures']: fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2,ncols=2,figsize=(16,9)) for i_grain in range(len(dict_sample['L_L_sum_eta_i'])): ax1.plot(dict_user['L_L_sum_eta_i'][i_grain]) ax1.set_title(r'$\Sigma\eta_i$') ax3.plot(dict_user['L_sum_c']) ax3.set_title(r'$\Sigma C$') ax4.plot(dict_user['L_sum_mass']) ax4.set_title(r'$\Sigma mass$') fig.tight_layout() fig.savefig('plot/sum_etai_c.png') plt.close(fig) # plot mean eta_i, c if 'mean_etai_c' in dict_user['L_figures']: fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2,ncols=2,figsize=(16,9)) for i_grain in range(len(dict_user['L_L_m_eta_i'])): ax1.plot(dict_user['L_L_m_eta_i'][i_grain]) ax1.set_title(r'Mean $\eta_i$') ax3.plot(dict_user['L_m_c']) ax3.set_title(r'Mean $c$') ax4.plot(dict_user['L_m_mass']) ax4.set_title(r'Mean mass') fig.tight_layout() fig.savefig('plot/mean_etai_c.png') plt.close(fig)
def compute_mass()
-
Compute the mass at a certain time.
Mass is sum of etai and c.
Expand source code
def compute_mass(dict_user, dict_sample): ''' Compute the mass at a certain time. Mass is sum of etai and c. ''' # sum of masses L_sum_eta_i_tempo = [] s_eta_i = 0 for i_grain in range(len(dict_sample['L_etai_map'])): L_sum_eta_i_tempo.append([np.sum(dict_sample['L_etai_map'][i_grain])]) s_eta_i = s_eta_i + np.sum(dict_sample['L_etai_map'][i_grain]) dict_user['L_sum_eta_i_tempo'] = L_sum_eta_i_tempo dict_user['sum_c_tempo'] = np.sum(dict_sample['c_map']) dict_user['sum_mass_tempo'] = 1/dict_user['V_m']*s_eta_i+np.sum(dict_sample['c_map'])
def compute_mass_loss()
-
Compute the mass loss from the previous compute_mass() call.
Plot in the given tracker. Mass is sum of etai and c.
Expand source code
def compute_mass_loss(dict_user, dict_sample, tracker_key): ''' Compute the mass loss from the previous compute_mass() call. Plot in the given tracker. Mass is sum of etai and c. ''' # delta masses if dict_user['L_'+tracker_key+'_eta_i'] == []: s_eta_i = 0 for i_grain in range(len(dict_sample['L_etai_map'])): detai = np.sum(dict_sample['L_etai_map'][i_grain]) - dict_user['L_sum_eta_i_tempo'][i_grain] s_eta_i = s_eta_i + np.sum(dict_sample['L_etai_map'][i_grain]) # save dict_user['L_'+tracker_key+'_eta_i'].append([detai]) else : s_eta_i = 0 for i_grain in range(len(dict_sample['L_etai_map'])): detai = np.sum(dict_sample['L_etai_map'][i_grain]) - dict_user['L_sum_eta_i_tempo'][i_grain] s_eta_i = s_eta_i + np.sum(dict_sample['L_etai_map'][i_grain]) # save dict_user['L_'+tracker_key+'_eta_i'][i_grain].append(detai) dc = np.sum(dict_sample['c_map']) - dict_user['sum_c_tempo'] dm = 1/dict_user['V_m']*s_eta_i+np.sum(dict_sample['c_map']) - dict_user['sum_mass_tempo'] # save dict_user[tracker_key+'_c'].append(dc) dict_user[tracker_key+'_m'].append(dm) # plot if 'mass_loss' in dict_user['L_figures']: fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2,ncols=2,figsize=(16,9)) for i_grain in range(len(dict_sample['L_'+tracker_key+'_eta_i'])): ax1.plot(dict_user['L_'+tracker_key+'_eta_i'][i_grain]) ax1.set_title(r'$\eta_i$ loss') ax3.plot(dict_user[tracker_key+'_c']) ax3.set_title(r'$c$ loss') ax4.plot(dict_user[tracker_key+'_m']) ax4.set_title(r'mass loss') fig.tight_layout() fig.savefig('plot/'+tracker_key+'.png') plt.close(fig)
def plot_performances()
-
Plot figure illustrating the time performances of the algorithm.
Expand source code
def plot_performances(dict_user, dict_sample): ''' Plot figure illustrating the time performances of the algorithm. ''' if 'performances' in dict_user['L_figures']: fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9)) ax1.plot(dict_user['L_t_dem'], label='DEM') ax1.plot(dict_user['L_t_pf'], label='PF') ax1.plot(dict_user['L_t_dem_to_pf'], label='DEM to PF') ax1.plot(dict_user['L_t_pf_to_dem_1'], label='PF to DEM 1') ax1.plot(dict_user['L_t_pf_to_dem_2'], label='PF to DEM 2') ax1.legend() ax1.set_title('Performances (s)') ax1.set_xlabel('Iterations (-)') fig.tight_layout() fig.savefig('plot/performances.png') plt.close(fig)
def plot_dem()
-
Plot figure illustrating the overlap and force transmitted.
Expand source code
def plot_dem(dict_user, dict_sample): ''' Plot figure illustrating the overlap and force transmitted. ''' # Need to be adapted to multiple contacts if 'overlap' in dict_user['L_figures']: fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9)) for i_contact in range(len(dict_user['L_L_overlap'])): ax1.plot(dict_user['L_L_overlap'][i_contact]) ax1.set_xlabel('iterations (-)') ax1.set_ylabel('overlap in DEM (-)') fig.tight_layout() fig.savefig('plot/dem_overlap.png') plt.close(fig) if 'normal_force' in dict_user['L_figures']: fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9)) for i_contact in range(len(dict_user['L_L_normal_force'])): ax1.plot(dict_user['L_L_normal_force'][i_contact]) ax1.plot([0, len(dict_user['L_normal_force'])-1],\ [dict_user['force_applied'], dict_user['force_applied']], color='k', label='target') ax1.set_xlabel('iterations (-)') ax1.set_ylabel('normal force (-)') fig.tight_layout() fig.savefig('plot/dem_normal_force.png') plt.close(fig)
def plot_contact()
-
Plot figure illustrating the contact characteristics.
Expand source code
def plot_contact(dict_user, dict_sample): ''' Plot figure illustrating the contact characteristics. ''' # Need to be adapted to multiple contacts if 'contact_box' in dict_user['L_figures']: fig, (ax1,ax2,ax3) = plt.subplots(nrows=1,ncols=3,figsize=(16,9)) for i_contact in range(len(dict_user['L_L_contact_box_x'])): ax1.plot(dict_user['L_L_contact_box_x'][i_contact]) ax2.plot(dict_user['L_L_contact_box_y'][i_contact]) ax3.plot(dict_user['L_L_contact_box_z'][i_contact]) ax1.set_suptitle('x') ax2.set_suptitle('y') ax3.set_suptitle('z') ax1.set_ylabel('contact box dimensions (-)') ax2.set_xlabel('iterations (-)') fig.tight_layout() fig.savefig('plot/contact_box.png') plt.close(fig) if 'contact_volume' in dict_user['L_figures']: fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9)) for i_contact in range(len(dict_user['L_L_contact_volume'])): ax1.plot(dict_user['L_L_contact_volume'][i_contact]) ax1.set_xlabel('iterations (-)') ax1.set_ylabel('contact volume (-)') fig.tight_layout() fig.savefig('plot/contact_volume.png') plt.close(fig) if 'contact_surface' in dict_user['L_figures']: fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9)) for i_contact in range(len(dict_user['L_L_contact_surface'])): ax1.plot(dict_user['L_L_contact_surface'][i_contact]) ax1.set_xlabel('iterations (-)') ax1.set_ylabel('contact surface (-)') fig.tight_layout() fig.savefig('plot/contact_surface.png') plt.close(fig)
def plot_as_pressure()
-
Plot figure illustrating the solid activity and pressure at the contact.
Expand source code
def plot_as_pressure(dict_user, dict_sample): ''' Plot figure illustrating the solid activity and pressure at the contact. ''' if 'as' in dict_user['L_figures']: fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9)) for i_contact in range(len(dict_user['L_L_contact_as'])): ax1.plot(dict_user['L_L_contact_as'][i_contact]) ax1.set_xlabel('iterations (-)') ax1.set_ylabel('solid activity (-)') fig.tight_layout() fig.savefig('plot/contact_as.png') plt.close(fig) if 'pressure' in dict_user['L_figures']: fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9)) for i_contact in range(len(dict_user['L_L_contact_pressure'])): ax1.plot(dict_user['L_L_contact_pressure'][i_contact]) ax1.set_xlabel('iterations (-)') ax1.set_ylabel('solid pressure (-)') fig.tight_layout() fig.savefig('plot/contact_pressure.png') plt.close(fig)
def plot_slices()
-
Plot slices of the configuration.
Expand source code
def plot_slices(dict_user, dict_sample): ''' Plot slices of the configuration. ''' # determine the index of the slices i_x_slice = int(len(dict_sample['x_L'])/2) i_y_slice = int(len(dict_sample['y_L'])/2) i_z_slice = int(len(dict_sample['z_L'])/2) if 'configuration_eta' in dict_user['L_figures'] : for i_grain in range(len(dict_sample['L_etai_map'])): # plot fig, (ax1, ax2, ax3) = plt.subplots(nrows=1,ncols=3,figsize=(16,9)) # y-z im = ax1.imshow(dict_sample['L_etai_map'][i_grain][i_x_slice,:,:], interpolation = 'nearest') fig.colorbar(im, ax=ax1) ax1.set_title(r'slice y-z',fontsize = 30) # x-z im = ax2.imshow(dict_sample['L_etai_map'][i_grain][:,i_y_slice,:], interpolation = 'nearest') fig.colorbar(im, ax=ax2) ax2.set_title(r'slice x-z',fontsize = 30) # x-y im = ax3.imshow(dict_sample['L_etai_map'][i_grain][:,:,i_z_slice], interpolation = 'nearest') fig.colorbar(im, ax=ax3) ax3.set_title(r'slice x-y',fontsize = 30) # close fig.tight_layout() fig.savefig('plot/configuration/eta_'+str(i_grain+1)+'_'+str(dict_sample['i_DEMPF_ite'])+'.png') plt.close(fig) if 'configuration_c' in dict_user['L_figures']: # plot fig, (ax1, ax2, ax3) = plt.subplots(nrows=1,ncols=3,figsize=(16,9)) # y-z im = ax1.imshow(dict_sample['c_map'][i_x_slice,:,:], interpolation = 'nearest') fig.colorbar(im, ax=ax1) ax1.set_title(r'slice y-z',fontsize = 30) # x-z im = ax2.imshow(dict_sample['c_map'][:,i_y_slice,:], interpolation = 'nearest') fig.colorbar(im, ax=ax2) ax2.set_title(r'slice x-z',fontsize = 30) # x-y im = ax3.imshow(dict_sample['c_map'][:,:,i_z_slice], interpolation = 'nearest') fig.colorbar(im, ax=ax3) ax3.set_title(r'slice x-y',fontsize = 30) # close fig.tight_layout() fig.savefig('plot/configuration/c_'+str(dict_sample['i_DEMPF_ite'])+'.png') plt.close(fig) if 'configuration_s_eta' in dict_user['L_figures']: # initialization map_sum_etas = np.zeros((dict_sample['c_map'].shape[0], dict_sample['c_map'].shape[2])) # iterate on grains for i_grain in range(len(dict_sample['L_etai_map'])): # x-z map_sum_etas = map_sum_etas + dict_sample['L_etai_map'][i_grain][:,i_y_slice,:] # plot fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9)) im = ax1.imshow(map_sum_etas, interpolation = 'nearest') ax1.set_title(r'slice x-z',fontsize = 30) fig.colorbar(im, ax=ax1) fig.tight_layout() fig.savefig('plot/configuration/s_eta_'+str(dict_sample['i_DEMPF_ite'])+'.png') plt.close(fig)
def plot_displacement()
-
Plot figure illustrating the cumulative displacement.
Expand source code
def plot_displacement(dict_user, dict_sample): ''' Plot figure illustrating the cumulative displacement. ''' # pp data L_L_strain = [] for i_grain in range(len(dict_user['L_L_displacement'][0])): L_strain = [] for i_displacement in range(len(dict_user['L_L_displacement'])): if i_displacement == 0: L_displacement_cum = [dict_user['L_L_displacement'][i_displacement][i_grain][2]] else : L_displacement_cum.append(L_displacement_cum[-1]+dict_user['L_L_displacement'][i_displacement][i_grain][2]) L_strain.append(L_displacement_cum[-1]/(2*dict_user['radius'])) L_L_strain.append(L_strain) # plot fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9)) for i_grain in range(len(L_L_strain)): ax1.plot(L_L_strain[i_grain]) ax1.set_xlabel('iterations (-)') ax1.set_ylabel('vertical strain (-)') fig.tight_layout() fig.savefig('plot/vertical_strain_grain.png') plt.close(fig)
def plot_settlement()
-
Plot figure illustrating the settlement curve.
Expand source code
def plot_settlement(dict_user, dict_sample): ''' Plot figure illustrating the settlement curve. ''' # pp data L_strain = [] for i_size in range(len(dict_user['L_delta_z_sample'])): L_strain.append((dict_user['L_delta_z_sample'][i_size]-dict_user['L_delta_z_sample'][0])/dict_user['L_delta_z_sample'][0]) # plot fig, (ax1) = plt.subplots(nrows=1,ncols=1,figsize=(16,9)) ax1.plot(L_strain) ax1.set_xlabel('iterations (-)') ax1.set_ylabel('vertical strain (-)') fig.tight_layout() fig.savefig('plot/vertical_strain.png') plt.close(fig)