"""Display information during program execution.
This module includes a function that allows the output of information to both
default standard output device (e.g., terminal) and to the '.screen' output
file in a formatted and consistent manner. Some output codes may precede a
program abortion.
Functions
---------
displayinfo
Display information during program execution.
"""
#
# Modules
# =============================================================================
# Standard
import sys
import copy
# Third-party
import numpy as np
import colorama
# Local
import ioput.ioutilities as ioutil
#
# Authorship & Credits
# =============================================================================
__author__ = 'Bernardo Ferreira (bernardo_ferreira@brown.edu)'
__credits__ = ['Bernardo Ferreira', ]
__status__ = 'Stable'
# =============================================================================
#
# =============================================================================
[docs]def displayinfo(code, *args, **kwargs):
"""Display information during program execution.
Information is output to both default standard output device
(e.g., terminal) and to the '.screen' output file.
----
Parameters
----------
code : str
Code associated with the output information:
* -1 : Setting problem directory
* 0 : Program execution launched
* 1 : Program execution completed
* 2 : Execution phase started
* 3 : Execution phase completed
* 4 : Program aborted
* 5 : Execution phase task
* 6 : Clustering analysis and completion
* 7 : Loading increment header and footer
* 8 : Self-consistent scheme iteration header and footer
* 9 : Newton-Raphson header and iteration
* 11 : Loading increment cut
* 12 : Adaptive clustering step header
* 13 : Self-consistent scheme iteration header and footer \
(locked reference material properties)
* 14 : Locking reference material properties (self-consistent \
scheme convergence failure)
* 15 : Clustering adaptivity step summary
* 16 : Clustering adaptivity step triggered
* 17 : Adaptive clustering solution rewinding
* 18 : Writing increment VTK output file
"""
# Get display features
display_features = ioutil.setdisplayfeatures()
output_width, dashed_line, indent, asterisk_line = display_features[0:4]
tilde_line, equal_line = display_features[4:6]
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Set informations and formats to display
if code == '-1':
status = args[1]
arguments = [args[0], ]
info = tuple(arguments)
if status == 0:
template = 4*'\n' + 'Problem directory: {}' + '\n\n' \
+ 'Status: New problem'
elif status == 1:
template = 4*'\n' + 'Problem directory: {}' + '\n\n' \
+ 'Status: Repeating problem (considering existent ' \
+ 'offline stage)'
elif status == 2:
template = 4*'\n' + 'Problem directory: {}' + '\n\n' \
+ 'Status: New problem (overwriting existing directory)'
elif status == 3:
ioutil.print2('Please rerun the program and provide a different '
'problem name.' + '\n')
sys.exit(1)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '0':
arguments = \
['CRATE - Clustering-based Nonlinear Analysis of Materials',
'Created by Bernardo P. Ferreira', 'Release 1.0.5 (Oct 2023)'] \
+ 2*[args[0], ] + list(args[1:3])
info = tuple(arguments)
template = '\n' + colorama.Fore.WHITE + tilde_line \
+ colorama.Style.RESET_ALL \
+ colorama.Fore.WHITE + '\n{:^{width}}\n\n' \
+ '{:^{width}}\n' + '\n{:^{width}}\n\n' \
+ colorama.Fore.YELLOW + 'Problem under analysis: ' \
+ colorama.Style.RESET_ALL + '{}' + '\n\n' \
+ colorama.Fore.YELLOW + 'Input data file: ' \
+ colorama.Style.RESET_ALL + '{}.dat' + '\n\n' \
+ colorama.Fore.YELLOW + 'Starting program execution at: ' \
+ colorama.Style.RESET_ALL + '{} ({})\n' \
+ colorama.Fore.WHITE + tilde_line \
+ colorama.Style.RESET_ALL + '\n\n' + colorama.Fore.WHITE \
+ dashed_line + colorama.Style.RESET_ALL
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '1':
phase_names = args[3]
phase_times = args[4]
total_time = phase_times[0, 1] - phase_times[0, 0]
number_of_phases = len(phase_names)
phase_durations = [phase_times[i, 1] - phase_times[i, 0]
for i in range(0, number_of_phases)]
for i in range(0, number_of_phases):
phase_durations.insert(3*i, phase_names[i])
phase_durations.insert(3*i + 2,
(phase_durations[3*i + 1]/total_time)*100)
arguments = list(args[0:3]) \
+ [total_time, np.floor(total_time/3600),
(total_time % 3600)/60] + ['Phase', 'Duration (s)', '%'] \
+ phase_durations[3:] \
+ [colorama.Fore.GREEN + 'Program Completed'
+ colorama.Style.RESET_ALL]
info = tuple(arguments)
template = '\n' + colorama.Fore.WHITE + tilde_line \
+ colorama.Style.RESET_ALL + '\n' \
+ colorama.Fore.YELLOW + 'Ending program execution at: ' \
+ colorama.Style.RESET_ALL + '{} ({})\n\n' \
+ colorama.Fore.YELLOW + 'Problem analysed: ' \
+ colorama.Style.RESET_ALL + '{}\n\n' \
+ colorama.Fore.YELLOW + 'Total execution time: ' \
+ colorama.Style.RESET_ALL \
+ '{:.2e}s (~{:.0f}h{:.0f}m)\n\n' \
+ colorama.Fore.YELLOW + 'Execution times: \n\n' \
+ colorama.Style.RESET_ALL \
+ 2*indent + '{:50}{:^20}{:^5}' + '\n' \
+ 2*indent + 75*'-' + '\n' \
+ (2*indent + '{:50}{:^20.2e}{:>5.2f} \n')*(number_of_phases - 1) \
+ 2*indent + 75*'-' + '\n\n\n' + '{:^{width}}' + '\n'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '2':
arguments = [args[0], ]
info = tuple(arguments)
template = colorama.Fore.GREEN + 'Start phase: ' \
+ colorama.Fore.WHITE \
+ '{} \n' + colorama.Style.RESET_ALL
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '3':
arguments = args[0:2]
info = tuple(arguments)
template = colorama.Fore.GREEN + '\n\nEnd phase: ' \
+ colorama.Fore.WHITE + '{} (phase duration time = {:.2e}s)\n' \
+ dashed_line + colorama.Style.RESET_ALL
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '4':
summary = args[0]
description = args[1]
arguments = list(args[2:])
arguments.append('Program Aborted')
info = tuple(arguments)
template = '\n\n' + colorama.Fore.RED \
+ indent + asterisk_line[:-len(indent)] + '\n' \
+ indent + summary \
+ '\n\n' + colorama.Style.RESET_ALL \
+ indent + description \
+ '\n' + colorama.Fore.RED \
+ indent + asterisk_line[:-len(indent)] + '\n\n' \
+ '{:^{width}}' + colorama.Style.RESET_ALL + '\n'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '5':
if len(args) == 2:
n_indents = args[1]
else:
n_indents = 1
arguments = [args[0], ]
info = tuple(arguments)
template = '\n' + n_indents*indent + '> {}'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '6':
mode = args[0]
if mode == 'progress':
arguments = args[1:3]
if args[1] == 1:
print(' ')
info = tuple(arguments)
template = indent + '> Performing clustering process {} of {}...'
print(template.format(*info, width=output_width), end='\r')
if args[1] == args[2]:
print(' ')
return
elif mode == 'completed':
arguments = ['', ]
info = tuple(arguments)
template = '\n' + indent + '> Completed all clustering processes!'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '7':
mode = args[0]
if mode == 'init':
subinc_level = args[2]
if subinc_level == 0:
arguments = list([args[1], ]) + list(args[3:])
info = tuple(arguments)
template = colorama.Fore.CYAN + '\n' \
+ indent + 'Increment number: {:3d}' + '\n' \
+ indent + equal_line[:-len(indent)] + '\n' \
+ indent + 'Loading subpath: {:4d} |' + 6*' ' \
+ 'Load factor | Total = {:8.1e}' + 7*' ' \
+ 'Time | Total = {:8.1e}' + '\n' \
+ indent + 6*' ' + 'Increment: {:4d} |' + 18*' ' \
+ '| Incr. = {:8.1e}' + 12*' ' + '| Incr. = {:8.1e}' \
+ colorama.Style.RESET_ALL
else:
arguments = args[1:]
info = tuple(arguments)
template = colorama.Fore.CYAN + '\n' \
+ indent + 'Increment number: {:3d}' + 3*' ' \
+ '(Sub-inc. level: {:3d})' + '\n' \
+ indent + equal_line[:-len(indent)] + '\n' \
+ indent + 'Loading subpath: {:4d} |' + 6*' ' \
+ 'Load factor | Total = {:8.1e}' + 7*' ' \
+ 'Time | Total = {:8.1e}' + '\n' \
+ indent + 6*' ' + 'Increment: {:4d} |' + 18*' ' \
+ '| Incr. = {:8.1e}' + 12*' ' + '| Incr. = {:8.1e}' \
+ colorama.Style.RESET_ALL
elif mode == 'end':
space1 = (output_width - 84)*' '
space2 = (output_width
- (len('Homogenized strain tensor') + 48))*' '
space3 = (output_width
- (len('Increment run time (s): ') + 44))*' '
strain_formulation = args[1]
problem_type = args[2]
hom_strain = args[3]
hom_stress = args[4]
hom_strain_out = np.zeros((3, 3))
hom_stress_out = np.zeros((3, 3))
if problem_type == 1:
hom_strain_out[0:2, 0:2] = hom_strain
if strain_formulation == 'infinitesimal':
hom_strain_out[2, 2] = 0.0
else:
hom_strain_out[2, 2] = 1.0
hom_stress_out[0:2, 0:2] = hom_stress
hom_stress_out[2, 2] = args[7]
else:
hom_strain_out = copy.deepcopy(hom_strain)
hom_stress_out = copy.deepcopy(hom_stress)
if strain_formulation == 'infinitesimal':
strain_symbol = '\u03B5'
stress_symbol = '\u03C3'
else:
strain_symbol = 'F'
stress_symbol = 'P'
arguments = list()
for i in range(3):
for j in range(3):
arguments.append(hom_strain_out[i, j])
for j in range(3):
arguments.append(hom_stress_out[i, j])
arguments = arguments + [args[5], args[6]]
info = tuple(arguments)
template = '\n\n' \
+ indent + equal_line[:-len(indent)] + '\n' \
+ indent + 7*' ' + 'Homogenized strain tensor (' \
+ strain_symbol + ')' + space2 \
+ 'Homogenized stress tensor (' + stress_symbol + ')' \
+ '\n\n' \
+ indent + ' [' + 3*'{:>12.4e}' + ' ]' + space1 \
+ '[' + 3*'{:>12.4e}' + ' ]' + '\n' \
+ indent + ' [' + 3*'{:>12.4e}' + ' ]' + space1 \
+ '[' + 3*'{:>12.4e}' + ' ]' + '\n' \
+ indent + ' [' + 3*'{:>12.4e}' + ' ]' + space1 \
+ '[' + 3*'{:>12.4e}' + ' ]' + '\n' \
+ '\n' + indent + equal_line[:-len(indent)] + '\n' \
+ indent + 'Increment run time (s): {:>11.4e}' + space3 \
+ 'Total run time (s): {:>11.4e}' + '\n\n'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '8':
mode = args[0]
if mode == 'init':
if args[1] == 0:
format_1 = '{:.4e}'
format_2 = '-'
else:
format_1 = '{:.4e}'
format_2 = '{:.4e}'
arguments = args[1:]
info = tuple(arguments)
template = colorama.Fore.YELLOW + '\n\n' + indent \
+ 'Self-consistent scheme iteration: {:3d}' + '\n' \
+ indent + tilde_line[:-len(indent)] + '\n' \
+ indent + 'Young modulus (E): ' + format_1 \
+ ' (norm. change: ' + format_2 + ')' + '\n' \
+ indent + 'Poisson ratio (\u03BD): ' + format_1 \
+ ' (norm. change: ' + format_2 + ')' + '\n' \
+ indent + tilde_line[:-len(indent)] + '\n' \
+ colorama.Style.RESET_ALL
elif mode == 'end':
arguments = args[1:]
info = tuple(arguments)
template = indent + dashed_line[:-len(indent)] + '\n\n' \
+ indent + tilde_line[:-len(indent)] + '\n' \
+ indent + 'Iteration run time (s): {:>11.4e}'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '9':
mode = args[0]
space1 = (output_width - 48)*' '
space2 = (output_width - 67)*' '
if mode == 'init':
arguments = args[1:]
info = tuple(arguments)
template = indent + 5*' ' + 'Iteration' + space1 \
+ 'Normalized residuals' + '\n' \
+ indent + ' Number Run time (s)' + space2 \
+ 'Equilibrium Mac. strain Mac. stress' + '\n' \
+ indent + dashed_line[:-len(indent)]
elif mode == 'iter':
if not isinstance(args[4], float):
arguments = list(args[1:4]) + [args[5], ]
info = tuple(arguments)
template = indent + ' {:^6d} {:^12.4e}' + space2 \
+ '{:>11.4e} - {:^11.4e}'
elif not isinstance(args[5], float):
arguments = args[1:5]
info = tuple(arguments)
template = indent + ' {:^6d} {:^12.4e}' + space2 \
+ '{:>11.4e} {:^11.4e} -'
else:
arguments = args[1:]
info = tuple(arguments)
template = indent + ' {:^6d} {:^12.4e}' + space2 \
+ '{:>11.4e} {:^11.4e} {:^11.4e}'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '10':
pass
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '11':
mode = args[0]
if mode == 'max_iter':
arguments = [args[1], ]
cut_msg = ('Maximum number of iterations ({}) reached without '
'convergence.')
elif mode == 'su_fail':
arguments = [args[1]['cluster'], args[1]['mat_phase']]
cut_msg = 'State update failure in cluster {} (material phase {}).'
elif mode == 'max_scs_iter':
arguments = [args[1], ]
cut_msg = 'Maximum number of self-consistent iterations ({}) ' \
+ 'reached without' + '\n' \
+ indent + len('Increment cut: ')*' ' + 'convergence.'
else:
cut_msg = 'Undefined increment cut message.'
info = tuple(arguments)
template = '\n\n' + colorama.Fore.RED \
+ indent + asterisk_line[:-len(indent)] + '\n' \
+ indent + 'Increment cut: ' + colorama.Style.RESET_ALL + cut_msg \
+ '\n' + colorama.Fore.RED \
+ indent + asterisk_line[:-len(indent)] \
+ colorama.Style.RESET_ALL + '\n'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '12':
arguments = [args[0], ]
info = tuple(arguments)
template = '\n\n' \
+ indent + 'Adaptive clustering step: {:3d}' + '\n' \
+ indent + tilde_line[:-len(indent)]
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '13':
mode = args[0]
if mode == 'init':
if args[1] == 0:
format_1 = '{:.4e}'
format_2 = '-'
else:
format_1 = '{:.4e}'
format_2 = '{:.4e}'
arguments = args[1:]
info = tuple(arguments)
template = colorama.Fore.YELLOW \
+ '\n\n' + indent + 'Self-consistent scheme iteration: {:3d}' \
+ '\n' + indent + tilde_line[:-len(indent)] + '\n' \
+ indent + 'Young modulus (E): ' + format_1 \
+ ' (norm. change: ' + format_2 + ')' + ' \U0001F512' + '\n' \
+ indent + 'Poisson ratio (\u03BD): ' + format_1 \
+ ' (norm. change: ' + format_2 + ')' + ' \U0001F512' + '\n' \
+ indent + tilde_line[:-len(indent)] + '\n' \
+ colorama.Style.RESET_ALL
elif mode == 'end':
arguments = args[1:]
info = tuple(arguments)
template = indent + dashed_line[:-len(indent)] \
+ '\n\n' + indent + tilde_line[:-len(indent)] + '\n' \
+ indent + 'Iteration run time (s): {:>11.4e}' + ' \U0001F512'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '14':
mode = args[0]
if mode == 'max_scs_iter':
arguments = [args[1], ]
lock_msg = 'Maximum number of self-consistent iterations ({}) ' \
+ 'reached' + '\n' \
+ indent + len('Locking reference properties: ')*' ' \
+ 'without convergence.' + '\n' \
+ indent + len('Locking reference properties: ')*' ' \
+ 'Performing one last self-consistent scheme iteration ' \
+ 'with ' + '\n' + indent \
+ len('Locking reference properties: ')*' ' \
+ 'the last converged increment reference material elastic' \
+ '\n' + indent + len('Locking reference properties: ')*' ' \
+ 'properties.'
elif mode == 'inadmissible_scs_solution':
arguments = []
lock_msg = 'Inadmissible self-consistent scheme iterative ' \
'solution.' + '\n' \
+ indent + len('Locking reference properties: ')*' ' \
+ 'Performing one last self-consistent scheme iteration ' \
+ 'with ' + '\n' \
+ indent + len('Locking reference properties: ')*' ' \
+ 'the last converged increment reference material elastic ' \
+ '\n' + indent + len('Locking reference properties: ')*' ' \
+ 'properties.'
elif mode == 'locked_scs_solution':
arguments = []
lock_msg = 'Inadmissible self-consistent scheme iterative ' \
+ 'solution.' + '\n' \
+ indent + len('Locking reference properties: ')*' ' \
+ 'Accepting solution with the last converged increment ' \
+ '\n' + indent + len('Locking reference properties: ')*' ' \
+ 'reference material elastic properties.'
else:
lock_msg = 'Undefined locking message.'
info = tuple(arguments)
template = '\n\n' + colorama.Fore.YELLOW \
+ indent + asterisk_line[:-len(indent)] + '\n' \
+ indent + 'Locking reference properties: ' \
+ colorama.Style.RESET_ALL + lock_msg + '\n' \
+ colorama.Fore.YELLOW + indent + asterisk_line[:-len(indent)] \
+ colorama.Style.RESET_ALL + '\n'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '15':
# Get adaptivity manager and CRVE
adaptivity_manager = args[0]
crve = args[1]
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Get CRVE clustering summary
clustering_summary = crve.get_clustering_summary()
# Sort and get number of material phases
mat_phases = list(clustering_summary.keys())
mat_phases.sort()
n_mat_phases = len(clustering_summary.keys())
# Build output material phases clusters list and get the toal number of
# base and final clusters
output_clusters = []
base_n_clusters = 0
final_n_clusters = 0
for mat_phase in mat_phases:
output_clusters += [mat_phase, ] + clustering_summary[mat_phase]
base_n_clusters += clustering_summary[mat_phase][1]
final_n_clusters += clustering_summary[mat_phase][2]
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Get total clustering adaptivity procedures time and total online
# stage time
total_time_adapt = adaptivity_manager.adaptive_time
total_time_os = args[2]
# Set output phases designations
time_phases = ['Select clustering adaptivity target clusters',
'Perform CRVE clustering adaptivity',
'Compute CRVE cluster interaction tensors',
'Other']
n_time_phases = len(time_phases)
# Set output phases times
adapt_times = [adaptivity_manager.adaptive_evaluation_time,
crve.get_adaptive_clustering_time(),
crve.get_adaptive_cit_time()]
adapt_times.append(total_time_adapt - sum(adapt_times))
# Set output phases relative times
if total_time_adapt > 1e-10:
adapt_times_rel_1 = [(time/total_time_adapt)*100
for time in adapt_times]
else:
adapt_times_rel_1 = [0.0 for time in adapt_times]
if total_time_os > 1e-10:
adapt_times_rel_2 = [(time/total_time_os)*100
for time in adapt_times]
else:
adapt_times_rel_2 = [0.0 for time in adapt_times]
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Build output phases times list
output_times = []
for i in range(len(time_phases)):
output_times += [time_phases[i], adapt_times[i],
adapt_times_rel_1[i], adapt_times_rel_2[i]]
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Build output structure
arguments = ['Mat. phase', 'Type', 'Base clusters', 'Final clusters',
*output_clusters,
'Total', base_n_clusters, final_n_clusters,
'Phase', 'Duration (s)', '% adapt', '% total',
*output_times, 'Total', total_time_adapt,
]
info = tuple(arguments)
template = '\n\n' \
+ indent + 'Clustering adaptivity summary:' + '\n\n' \
+ 2*indent + '{:<10s}{:^21s}{:>20s}{:>20s}' + '\n' \
+ 2*indent + dashed_line[:-10*len(indent)] + '\n' \
+ (2*indent + '{:^10s}{:^21s}{:>20d}{:>20d}' + '\n')*n_mat_phases \
+ 2*indent + dashed_line[:-10*len(indent)] + '\n' \
+ 2*indent + '{:<31s}{:>20d}{:>20d}' '\n\n\n' \
+ 2*indent + '{:50s}{:^20s}{:>7s}{:>10s}' + '\n' \
+ 2*indent + dashed_line[:-2*len(indent)] + '\n' \
+ (2*indent + '{:50s}{:^20.2e}{:>7.2f}{:>10.2f}'
+ '\n')*n_time_phases \
+ 2*indent + dashed_line[:-2*len(indent)] + '\n' \
+ 2*indent + '{:50s}{:^20.2e}'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '16':
mode = args[0]
inc = args[1]
spacing = indent + len('Clustering adaptivity: ')*' '
if mode == 'repeat':
msg = 'Adaptivity condition(s) have been triggered and ' \
'clustering' + '\n' \
+ spacing + 'adaptivity will be performed.' + '\n' \
+ spacing + 'Current macroscale loading increment ({}) ' \
+ 'will be repeated' + '\n' \
+ spacing + 'considering the new clustering.'
elif mode == 'new':
msg = 'Adaptivity condition(s) have been triggered and ' \
+ 'clustering' + '\n' \
+ spacing + 'adaptivity will be performed.' + '\n' \
+ spacing + 'Performing the new macroscale loading ' \
+ 'increment ({})' + '\n' + spacing \
+ 'considering the new clustering.'
arguments = [inc, ]
info = tuple(arguments)
template = '\n\n' + colorama.Fore.CYAN + indent \
+ asterisk_line[:-len(indent)] + '\n' \
+ indent + 'Clustering adaptivity: ' + colorama.Style.RESET_ALL \
+ msg + '\n' + colorama.Fore.CYAN + indent \
+ asterisk_line[:-len(indent)] + colorama.Style.RESET_ALL + '\n'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '17':
rewind_inc = args[0]
spacing = indent + len('Analysis rewind: ')*' '
msg = 'Rewind condition(s) have been triggered and the analysis ' \
+ 'will be' + '\n' + spacing \
+ 'rewound back to the end of macroscale loading increment {}.' \
+ '\n' \
+ spacing + 'The current CRVE clustering is considered, being ' \
+ 'a suitable' + '\n' \
+ spacing + 'transference of cluster-related variables performed.'
arguments = [rewind_inc, ]
info = tuple(arguments)
template = '\n\n' + colorama.Fore.CYAN \
+ indent + asterisk_line[:-len(indent)] + '\n' \
+ indent + 'Analysis rewind: ' + colorama.Style.RESET_ALL + msg \
+ '\n' + colorama.Fore.CYAN \
+ indent + asterisk_line[:-len(indent)] \
+ colorama.Style.RESET_ALL + '\n'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elif code == '18':
msg = 'Writing increment VTK output file...'
arguments = []
info = tuple(arguments)
template = '\n' + colorama.Fore.MAGENTA \
+ indent + asterisk_line[:-len(indent)] + '\n' \
+ indent + 'VTK Output: ' + colorama.Style.RESET_ALL + msg \
+ '\n' + colorama.Fore.MAGENTA \
+ indent + asterisk_line[:-len(indent)] \
+ colorama.Style.RESET_ALL
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Display information
ioutil.print2(template.format(*info, width=output_width))
# Program abortion codes
if code in ('4',):
sys.exit(1)