Module main

@author: Alexandre Sac–Morane alexandre.sac-morane@uclouvain.be

This is the main file called the differents files when needed.

Expand source code

  # -*- encoding=utf-8 -*-

  import math, os, errno, pickle, time, shutil
  import numpy as np
  import matplotlib.pyplot as plt
  from pathlib import Path

  # own
  from dem_to_pf import *
  from pf_to_dem import *
  from ic import *
  from tools import *
  from Parameters import *

  # ------------------------------------------------------------------------------------------------------------------------------------------ #
  # Functions

  def run_moose(dict_user, dict_sample):
      '''
      Prepare and run moose simulation.
      '''
      # from dem to pf
      # compute mass
      compute_mass(dict_user, dict_sample) # from tools.py
      tic_dem_to_pf = time.perf_counter() # compute dem_to_pf performances
      tic_tempo = time.perf_counter() # compute performances
      move_phasefield(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['move_pf'] = dict_user['move_pf'] + tac_tempo-tic_tempo
      # check mass
      compute_mass_loss(dict_user, dict_sample, 'L_loss_move_pf') # from tools.py
      # compute volume contact
      tic_tempo = time.perf_counter() # compute performances
      compute_contact_volume(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['comp_con_vol'] = dict_user['comp_con_vol'] + tac_tempo-tic_tempo

      # remesh
      if dict_user['remesh']:
          remesh(dict_user, dict_sample) # from tools.py
          # write pf file
          write_eta_txt(dict_user, dict_sample) # from dem_to_pf.py

      # Control and adapt the force applied in DEM
      # YADE assumes only convex shapes. If particle is concave, it creates false volume
      # the control of the force is here to compensate this phenomena
      if dict_user['control_force']:
          tic_tempo = time.perf_counter() # compute performances
          control_force(dict_user, dict_sample) # in pf_to_dem.py
          tac_tempo = time.perf_counter() # compute performances
          dict_user['control_f'] = dict_user['control_f'] + tac_tempo-tic_tempo
          # here it is done only one times
          # can be done several times per PFDEM iteration to be sure the contact is well applied

      # plot contact characterization
      tic_tempo = time.perf_counter() # compute performances
      plot_contact_v_s_d(dict_user, dict_sample) # in tools.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['plot_con_v_s_d'] = dict_user['plot_con_v_s_d'] + tac_tempo-tic_tempo

      # from dem to pf
      # compute mass
      compute_mass(dict_user, dict_sample) # from tools.py
      # compute diffusivity map
      tic_tempo = time.perf_counter() # compute performances
      compute_kc(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['comp_kc'] = dict_user['comp_kc'] + tac_tempo-tic_tempo
      # check mass
      compute_mass_loss(dict_user, dict_sample, 'L_loss_kc') # from tools.py
      # compute activity map
      tic_tempo = time.perf_counter() # compute performances
      compute_as(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['comp_as'] = dict_user['comp_as'] + tac_tempo-tic_tempo

      # compute ed (for trackers and Aitken method)
      tic_tempo = time.perf_counter() # compute performances
      compute_ed(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['comp_ed'] = dict_user['comp_ed'] + tac_tempo-tic_tempo
      tic_tempo = time.perf_counter() # compute performances
      compute_dt_PF_Aitken(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['comp_dt'] = dict_user['comp_dt'] + tac_tempo-tic_tempo

      # generate .i file
      tic_tempo = time.perf_counter() # compute performances
      write_i(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      tac_dem_to_pf = time.perf_counter() # compute dem_to_pf performances
      dict_user['L_t_dem_to_pf'].append(tac_dem_to_pf-tic_dem_to_pf)
      dict_user['write_i'] = dict_user['write_i'] + tac_tempo-tic_tempo

      # pf
      # compute mass
      compute_mass(dict_user, dict_sample) # from tools.py
      print('Running PF')
      tic_pf = time.perf_counter() # compute pf performances
      os.system('mpiexec -n '+str(dict_user['n_proc'])+' ~/projects/moose/modules/phase_field/phase_field-opt -i pf.i')
      tac_pf = time.perf_counter() # compute pf performances
      dict_user['L_t_pf'].append(tac_pf-tic_pf)
      dict_user['solve_pf'] = dict_user['solve_pf'] + tac_pf-tic_pf

      # from pf to dem
      tic_tempo = time.perf_counter() # compute performances
      last_j_str = sort_files(dict_user, dict_sample) # in pf_to_dem.py
      tac_dem_to_pf = time.perf_counter() # compute dem_to_pf performances
      tac_tempo = time.perf_counter() # compute performances
      dict_user['sort_pf'] = dict_user['sort_pf'] + tac_tempo-tic_tempo

      print('Reading data')
      if dict_user['remesh']:
          # check if the mesh map is inside the database
          if dict_user['check_database']:
              check_mesh_database(dict_user, dict_sample) # from tools.py
          else :
              dict_sample['Map_known'] = False
      tic_pf_to_dem = time.perf_counter() # compute pf_to_dem performances
      read_vtk(dict_user, dict_sample, last_j_str) # in pf_to_dem.py
      tac_pf_to_dem = time.perf_counter() # compute pf_to_dem performances
      dict_user['L_t_pf_to_dem_2'].append(tac_pf_to_dem-tic_pf_to_dem)
      dict_user['read_pf'] = dict_user['read_pf'] + tac_pf_to_dem-tic_pf_to_dem
      # check mass
      compute_mass_loss(dict_user, dict_sample, 'L_loss_pf') # from tools.py
      if dict_user['remesh'] and dict_user['check_database']:
          # save mesh database
          save_mesh_database(dict_user, dict_sample) # from tools.py

  # ------------------------------------------------------------------------------------------------------------------------------------------ #

  def run_yade(dict_user, dict_sample):
      '''
      Prepare and run yade simulation.
      '''
      # from pf to dem
      tic_pf_to_dem = time.perf_counter() # compute pf_to_dem performances
      compute_vertices(dict_user, dict_sample) # from pf_to_dem.py
      tac_pf_to_dem = time.perf_counter() # compute pf_to_dem performances
      dict_user['L_t_pf_to_dem_1'].append(tac_pf_to_dem-tic_pf_to_dem)
      dict_user['comp_vertices'] = dict_user['comp_vertices'] + tac_pf_to_dem-tic_pf_to_dem

      # shape evolution
      tic_tempo = time.perf_counter() # compute performances
      plot_shape_evolution(dict_user, dict_sample) # from tools.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['plot_shape'] = dict_user['plot_shape'] + tac_tempo-tic_tempo

      # transmit data
      tic_tempo = time.perf_counter() # compute performances
      dict_save = {
      'E': dict_user['E'],
      'Poisson': dict_user['Poisson'],
      'force_applied': dict_user['force_applied'],
      'pos_1': dict_sample['pos_1'],
      'n_ite_max': dict_user['n_ite_max'],
      'steady_state_detection': dict_user['steady_state_detection'],
      'n_steady_state_detection': dict_user['n_steady_state_detection'],
      'print_all_contact_dem': dict_user['print_all_contact_dem'],
      'print_contact_dem': 'contact_dem' in dict_user['L_figures'],
      'i_DEMPF_ite': dict_sample['i_DEMPF_ite']
      }
      with open('data/main_to_dem.data', 'wb') as handle:
          pickle.dump(dict_save, handle, protocol=pickle.HIGHEST_PROTOCOL)
      tac_tempo = time.perf_counter() # compute performances
      dict_user['save_dem'] = dict_user['save_dem'] + tac_tempo-tic_tempo

      # dem
      print('Running DEM')
      tic_dem = time.perf_counter() # compute dem performances
      os.system('yadedaily -j '+str(dict_user['n_proc'])+' -x -n dem_base.py')
      #os.system('yadedaily -j '+str(dict_user['n_proc'])+' dem_base.py')
      #os.system('~/AlexSM/myYade/install/bin/yade-2024-01-31.git-c315081 -j '+str(dict_user['n_proc'])+' -x -n dem_base.py')
      tac_dem = time.perf_counter() # compute dem performances
      dict_user['L_t_dem'].append(tac_dem-tic_dem)
      dict_user['solve_dem'] = dict_user['solve_dem'] + tac_dem-tic_dem

      # sort files
      tic_tempo = time.perf_counter() # compute performances
      sort_files_yade() # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['sort_dem'] = dict_user['sort_dem'] + tac_tempo-tic_tempo

      # load data
      tic_tempo = time.perf_counter() # compute performances
      with open('data/dem_to_main.data', 'rb') as handle:
          dict_save = pickle.load(handle)
      # update the position
      dict_sample['pos_1'] = dict_save['pos_1']
      tac_tempo = time.perf_counter() # compute performances
      # track the y contact point
      dict_user['L_y_contactPoint'].append(dict_save['contact_point'][1])
      dict_user['read_dem'] = dict_user['read_dem'] + tac_tempo-tic_tempo

      # plot evolution of the number of vertices used in Yade
      tic_tempo = time.perf_counter() # compute performances
      plot_n_vertices(dict_user, dict_sample) # from tools.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['plot_n_vertices'] = dict_user['plot_n_vertices'] + tac_tempo-tic_tempo

  # ------------------------------------------------------------------------------------------------------------------------------------------ #
  # Plan

  # get parameters
  dict_user = get_parameters() # from Parameters.py
  dict_sample = {}

  # folders
  create_folder('vtk') # from tools.py
  create_folder('plot') # from tools.py
  if dict_user['print_all_contact_dem'] and 'contact_dem' in dict_user['L_figures']:
      create_folder('plot/contact_dem') # from tools.py
  if dict_user['print_all_shape_evolution'] and 'shape_evolution' in dict_user['L_figures']:
      create_folder('plot/shape_evolution') # from tools.py
  if dict_user['print_all_contact_detection'] and 'contact_detection' in dict_user['L_figures']:
      create_folder('plot/contact_detection') # from tools.py
  if dict_user['print_all_map_config'] and 'maps' in dict_user['L_figures']:
      create_folder('plot/map_etas_solute') # from tools.py
  create_folder('data') # from tools.py
  create_folder('input') # from tools.py
  create_folder('dict') # from tools.py

  # if saved check the folder does not exist
  if dict_user['save_simulation']:
      # name template id k_diss_k_prec_D_solute_force_applied
      name = str(int(dict_user['k_diss']))+'_'+str(int(dict_user['k_prec']))+'_'+str(int(10*dict_user['D_solute']))+'_'+str(int(dict_user['force_applied']))
      # check
      if Path('../Data_PressureSolution_2G_2D/'+name).exists():
          raise ValueError('Simulation folder exists: please change parameters')

  # check if the mesh map is inside the database
  if not dict_user['remesh']:
      check_mesh_database(dict_user, dict_sample) # from tools.py

  # compute performances
  tic = time.perf_counter()

  # ------------------------------------------------------------------------------------------------------------------------------------------ #
  # Create initial condition

  if dict_user['Shape'] == 'Sphere':
      create_1_sphere(dict_user, dict_sample) # from ic.py
  create_solute(dict_user, dict_sample) # from ic.py

  # compute tracker
  dict_user['L_sum_eta_1'].append(np.sum(dict_sample['eta_1_map']))
  dict_user['L_sum_c'].append(np.sum(dict_sample['c_map']))
  dict_user['L_sum_mass'].append(1/dict_user['V_m']*np.sum(dict_sample['eta_1_map'])+np.sum(dict_sample['c_map']))
  dict_user['L_m_eta_1'].append(np.mean(dict_sample['eta_1_map']))
  dict_user['L_m_c'].append(np.mean(dict_sample['c_map']))
  dict_user['L_m_mass'].append(1/dict_user['V_m']*np.mean(dict_sample['eta_1_map'])+np.mean(dict_sample['c_map']))

  # Plot
  if 'IC' in dict_user['L_figures']:
      fig, (ax1, ax2) = plt.subplots(1,2,figsize=(16,9))
      # eta 1
      im = ax1.imshow(dict_sample['eta_1_map'], interpolation = 'nearest', extent=(dict_sample['x_L'][0],dict_sample['x_L'][-1],dict_sample['y_L'][0],dict_sample['y_L'][-1]))
      fig.colorbar(im, ax=ax1)
      ax1.set_title(r'Map of $\eta_1$',fontsize = 30)
      # solute
      im = ax2.imshow(dict_sample['c_map'], interpolation = 'nearest', extent=(dict_sample['x_L'][0],dict_sample['x_L'][-1],dict_sample['y_L'][0],dict_sample['y_L'][-1]))
      fig.colorbar(im, ax=ax2)
      ax2.set_title(r'Map of solute',fontsize = 30)
      # close
      fig.tight_layout()
      fig.savefig('plot/IC_map_etas_solute.png')
      plt.close(fig)

  # ------------------------------------------------------------------------------------------------------------------------------------------ #
  # Performances

  dict_user['move_pf'] = 0
  dict_user['comp_con_vol'] = 0
  dict_user['control_f'] = 0
  dict_user['plot_con_v_s_d'] = 0
  dict_user['comp_kc'] = 0
  dict_user['comp_as'] = 0
  dict_user['comp_ed'] = 0
  dict_user['comp_dt'] = 0
  dict_user['write_i'] = 0
  dict_user['solve_pf'] = 0
  dict_user['sort_pf'] = 0
  dict_user['read_pf'] = 0
  dict_user['comp_vertices'] = 0
  dict_user['plot_shape'] = 0
  dict_user['save_dem'] = 0
  dict_user['solve_dem'] = 0
  dict_user['sort_dem'] = 0
  dict_user['read_dem'] = 0
  dict_user['plot_n_vertices'] = 0
  dict_user['plot_s_m_etai_c'] = 0
  dict_user['plot_perf'] = 0
  dict_user['plot_d_s_a'] = 0
  dict_user['plot_map'] = 0

  # ------------------------------------------------------------------------------------------------------------------------------------------ #
  # PFDEM iteration

  dict_sample['i_DEMPF_ite'] = 0
  while dict_sample['i_DEMPF_ite'] < dict_user['n_DEMPF_ite']:
      dict_sample['i_DEMPF_ite'] = dict_sample['i_DEMPF_ite'] + 1
      print('\nStep',dict_sample['i_DEMPF_ite'],'/',dict_user['n_DEMPF_ite'],'\n')

      # DEM
      run_yade(dict_user, dict_sample)

      # DEM->PF, PF, PF->DEM
      run_moose(dict_user, dict_sample)

      # Evolution of sum and mean of etai + c
      tic_tempo = time.perf_counter() # compute performances
      plot_sum_mean_etai_c(dict_user, dict_sample) # from tools.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['plot_s_m_etai_c'] = dict_user['plot_s_m_etai_c'] + tac_tempo-tic_tempo

      # plot performances
      tic_tempo = time.perf_counter() # compute performances
      plot_performances(dict_user, dict_sample) # from tools.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['plot_perf'] = dict_user['plot_perf'] + tac_tempo-tic_tempo

      # plot displacement, strain, fit with Andrade law
      tic_tempo = time.perf_counter() # compute performances
      #plot_disp_strain_andrade(dict_user, dict_sample) # from tools.py
      plot_disp_strain(dict_user, dict_sample) # from tools.py
      plot_y_contactPoint(dict_user, dict_sample) # from tools.py
      plot_sample_height(dict_user, dict_sample) # from tools.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['plot_d_s_a'] = dict_user['plot_d_s_a'] + tac_tempo-tic_tempo

      # plot maps configuration
      tic_tempo = time.perf_counter() # compute performances
      plot_maps_configuration(dict_user, dict_sample) # from tools.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['plot_map'] = dict_user['plot_map'] + tac_tempo-tic_tempo

  # ------------------------------------------------------------------------------------------------------------------------------------------ #
  # close simulation

  # save
  with open('dict/dict_user', 'wb') as handle:
      pickle.dump(dict_user, handle, protocol=pickle.HIGHEST_PROTOCOL)
  with open('dict/dict_sample', 'wb') as handle:
      pickle.dump(dict_sample, handle, protocol=pickle.HIGHEST_PROTOCOL)

  # compute performances
  tac = time.perf_counter()
  hours = (tac-tic)//(60*60)
  minutes = (tac-tic - hours*60*60)//(60)
  seconds = int(tac-tic - hours*60*60 - minutes*60)
  print("\nSimulation time : "+str(hours)+" hours "+str(minutes)+" minutes "+str(seconds)+" seconds")
  print('Simulation ends')

  # save mesh database
  if not dict_user['remesh']:
      #save_mesh_database(dict_user, dict_sample) # from tools.py
      pass

  # sort files
  reduce_n_vtk_files(dict_user, dict_sample) # from tools.py

  # copy and paste to Data folder
  if dict_user['save_simulation']:
      os.mkdir('../Data_PressureSolution_2G_2D/'+name)
      shutil.copytree('dict', '../Data_PressureSolution_2G_2D/'+name+'/dict')
      shutil.copytree('plot', '../Data_PressureSolution_2G_2D/'+name+'/plot')
      shutil.copy('dem.py', '../Data_PressureSolution_2G_2D/'+name+'/dem.py')
      shutil.copy('dem_base.py', '../Data_PressureSolution_2G_2D/'+name+'/dem_base.py')
      shutil.copy('dem_to_pf.py', '../Data_PressureSolution_2G_2D/'+name+'/dem_to_pf.py')
      shutil.copy('ic.py', '../Data_PressureSolution_2G_2D/'+name+'/ic.py')
      shutil.copy('main.py', '../Data_PressureSolution_2G_2D/'+name+'/main.py')
      shutil.copy('Parameters.py', '../Data_PressureSolution_2G_2D/'+name+'/Parameters.py')
      shutil.copy('pf_base.i', '../Data_PressureSolution_2G_2D/'+name+'/pf_base.i')
      shutil.copy('pf_to_dem.py', '../Data_PressureSolution_2G_2D/'+name+'/pf_to_dem.py')
      shutil.copy('tools.py', '../Data_PressureSolution_2G_2D/'+name+'/tools.py')


  #output
  print('\n')
  print('mass csv:', dict_user['L_sum_mass'][0], '->', dict_user['L_sum_mass'][-1])
  print('=', 100*abs(dict_user['L_sum_mass'][0]-dict_user['L_sum_mass'][-1])/dict_user['L_sum_mass'][0], '%')

Functions

def run_moose()

Pepare and run moose simulation.

This is the Phase-Field step.
Expand source code

  def run_moose(dict_user, dict_sample):
      '''
      Prepare and run moose simulation.
      '''
      # from dem to pf
      # compute mass
      compute_mass(dict_user, dict_sample) # from tools.py
      tic_dem_to_pf = time.perf_counter() # compute dem_to_pf performances
      tic_tempo = time.perf_counter() # compute performances
      move_phasefield(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['move_pf'] = dict_user['move_pf'] + tac_tempo-tic_tempo
      # check mass
      compute_mass_loss(dict_user, dict_sample, 'L_loss_move_pf') # from tools.py
      # compute volume contact
      tic_tempo = time.perf_counter() # compute performances
      compute_contact_volume(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['comp_con_vol'] = dict_user['comp_con_vol'] + tac_tempo-tic_tempo

      # remesh
      if dict_user['remesh']:
          remesh(dict_user, dict_sample) # from tools.py
          # write pf file
          write_eta_txt(dict_user, dict_sample) # from dem_to_pf.py

      # Control and adapt the force applied in DEM
      # YADE assumes only convex shapes. If particle is concave, it creates false volume
      # the control of the force is here to compensate this phenomena
      if dict_user['control_force']:
          tic_tempo = time.perf_counter() # compute performances
          control_force(dict_user, dict_sample) # in pf_to_dem.py
          tac_tempo = time.perf_counter() # compute performances
          dict_user['control_f'] = dict_user['control_f'] + tac_tempo-tic_tempo
          # here it is done only one times
          # can be done several times per PFDEM iteration to be sure the contact is well applied

      # plot contact characterization
      tic_tempo = time.perf_counter() # compute performances
      plot_contact_v_s_d(dict_user, dict_sample) # in tools.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['plot_con_v_s_d'] = dict_user['plot_con_v_s_d'] + tac_tempo-tic_tempo

      # from dem to pf
      # compute mass
      compute_mass(dict_user, dict_sample) # from tools.py
      # compute diffusivity map
      tic_tempo = time.perf_counter() # compute performances
      compute_kc(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['comp_kc'] = dict_user['comp_kc'] + tac_tempo-tic_tempo
      # check mass
      compute_mass_loss(dict_user, dict_sample, 'L_loss_kc') # from tools.py
      # compute activity map
      tic_tempo = time.perf_counter() # compute performances
      compute_as(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['comp_as'] = dict_user['comp_as'] + tac_tempo-tic_tempo

      # compute ed (for trackers and Aitken method)
      tic_tempo = time.perf_counter() # compute performances
      compute_ed(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['comp_ed'] = dict_user['comp_ed'] + tac_tempo-tic_tempo
      tic_tempo = time.perf_counter() # compute performances
      compute_dt_PF_Aitken(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['comp_dt'] = dict_user['comp_dt'] + tac_tempo-tic_tempo

      # generate .i file
      tic_tempo = time.perf_counter() # compute performances
      write_i(dict_user, dict_sample) # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      tac_dem_to_pf = time.perf_counter() # compute dem_to_pf performances
      dict_user['L_t_dem_to_pf'].append(tac_dem_to_pf-tic_dem_to_pf)
      dict_user['write_i'] = dict_user['write_i'] + tac_tempo-tic_tempo

      # pf
      # compute mass
      compute_mass(dict_user, dict_sample) # from tools.py
      print('Running PF')
      tic_pf = time.perf_counter() # compute pf performances
      os.system('mpiexec -n '+str(dict_user['n_proc'])+' ~/projects/moose/modules/phase_field/phase_field-opt -i pf.i')
      tac_pf = time.perf_counter() # compute pf performances
      dict_user['L_t_pf'].append(tac_pf-tic_pf)
      dict_user['solve_pf'] = dict_user['solve_pf'] + tac_pf-tic_pf

      # from pf to dem
      tic_tempo = time.perf_counter() # compute performances
      last_j_str = sort_files(dict_user, dict_sample) # in pf_to_dem.py
      tac_dem_to_pf = time.perf_counter() # compute dem_to_pf performances
      tac_tempo = time.perf_counter() # compute performances
      dict_user['sort_pf'] = dict_user['sort_pf'] + tac_tempo-tic_tempo

      print('Reading data')
      if dict_user['remesh']:
          # check if the mesh map is inside the database
          if dict_user['check_database']:
              check_mesh_database(dict_user, dict_sample) # from tools.py
          else :
              dict_sample['Map_known'] = False
      tic_pf_to_dem = time.perf_counter() # compute pf_to_dem performances
      read_vtk(dict_user, dict_sample, last_j_str) # in pf_to_dem.py
      tac_pf_to_dem = time.perf_counter() # compute pf_to_dem performances
      dict_user['L_t_pf_to_dem_2'].append(tac_pf_to_dem-tic_pf_to_dem)
      dict_user['read_pf'] = dict_user['read_pf'] + tac_pf_to_dem-tic_pf_to_dem
      # check mass
      compute_mass_loss(dict_user, dict_sample, 'L_loss_pf') # from tools.py
      if dict_user['remesh'] and dict_user['check_database']:
          # save mesh database
          save_mesh_database(dict_user, dict_sample) # from tools.py
def run_yade()

Prepare and run yade simulation.

This is the DEM step.
Expand source code

  def run_yade(dict_user, dict_sample):
      '''
      Prepare and run yade simulation.
      '''
      # from pf to dem
      tic_pf_to_dem = time.perf_counter() # compute pf_to_dem performances
      compute_vertices(dict_user, dict_sample) # from pf_to_dem.py
      tac_pf_to_dem = time.perf_counter() # compute pf_to_dem performances
      dict_user['L_t_pf_to_dem_1'].append(tac_pf_to_dem-tic_pf_to_dem)
      dict_user['comp_vertices'] = dict_user['comp_vertices'] + tac_pf_to_dem-tic_pf_to_dem

      # shape evolution
      tic_tempo = time.perf_counter() # compute performances
      plot_shape_evolution(dict_user, dict_sample) # from tools.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['plot_shape'] = dict_user['plot_shape'] + tac_tempo-tic_tempo

      # transmit data
      tic_tempo = time.perf_counter() # compute performances
      dict_save = {
      'E': dict_user['E'],
      'Poisson': dict_user['Poisson'],
      'force_applied': dict_user['force_applied'],
      'pos_1': dict_sample['pos_1'],
      'n_ite_max': dict_user['n_ite_max'],
      'steady_state_detection': dict_user['steady_state_detection'],
      'n_steady_state_detection': dict_user['n_steady_state_detection'],
      'print_all_contact_dem': dict_user['print_all_contact_dem'],
      'print_contact_dem': 'contact_dem' in dict_user['L_figures'],
      'i_DEMPF_ite': dict_sample['i_DEMPF_ite']
      }
      with open('data/main_to_dem.data', 'wb') as handle:
          pickle.dump(dict_save, handle, protocol=pickle.HIGHEST_PROTOCOL)
      tac_tempo = time.perf_counter() # compute performances
      dict_user['save_dem'] = dict_user['save_dem'] + tac_tempo-tic_tempo

      # dem
      print('Running DEM')
      tic_dem = time.perf_counter() # compute dem performances
      os.system('yadedaily -j '+str(dict_user['n_proc'])+' -x -n dem_base.py')
      #os.system('yadedaily -j '+str(dict_user['n_proc'])+' dem_base.py')
      #os.system('~/AlexSM/myYade/install/bin/yade-2024-01-31.git-c315081 -j '+str(dict_user['n_proc'])+' -x -n dem_base.py')
      tac_dem = time.perf_counter() # compute dem performances
      dict_user['L_t_dem'].append(tac_dem-tic_dem)
      dict_user['solve_dem'] = dict_user['solve_dem'] + tac_dem-tic_dem

      # sort files
      tic_tempo = time.perf_counter() # compute performances
      sort_files_yade() # in dem_to_pf.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['sort_dem'] = dict_user['sort_dem'] + tac_tempo-tic_tempo

      # load data
      tic_tempo = time.perf_counter() # compute performances
      with open('data/dem_to_main.data', 'rb') as handle:
          dict_save = pickle.load(handle)
      # update the position
      dict_sample['pos_1'] = dict_save['pos_1']
      tac_tempo = time.perf_counter() # compute performances
      # track the y contact point
      dict_user['L_y_contactPoint'].append(dict_save['contact_point'][1])
      dict_user['read_dem'] = dict_user['read_dem'] + tac_tempo-tic_tempo

      # plot evolution of the number of vertices used in Yade
      tic_tempo = time.perf_counter() # compute performances
      plot_n_vertices(dict_user, dict_sample) # from tools.py
      tac_tempo = time.perf_counter() # compute performances
      dict_user['plot_n_vertices'] = dict_user['plot_n_vertices'] + tac_tempo-tic_tempo