Source code for simulators.links.models.links_lou

"""Links constitutive model: LOU.

Links (Large Strain Implicit Nonlinear Analysis of Solids Linking Scales) is
a finite element code developed by the CM2S research group at the Faculty of
Engineering, University of Porto.

Classes
-------
LinksLou(LinksConstitutiveModel)
    Lou-Zhang-Yoon constitutive model.
"""
#
#                                                                       Modules
# =============================================================================
# Third-party
import torch
# Local
from simulators.links.models.interface import LinksConstitutiveModel
#
#                                                          Authorship & Credits
# =============================================================================
__author__ = 'Bernardo Ferreira (bernardo_ferreira@brown.edu)'
__credits__ = ['Bernardo Ferreira', ]
__status__ = 'Alpha'
# =============================================================================
#
# =============================================================================
[docs]class LinksLou(LinksConstitutiveModel): """Lou-Zhang-Yoon constitutive model. Lou-Zhang-Yoon model with general differentiable yield function and isotropic hardening. Attributes ---------- _name : str Constitutive model name. Methods ------- _get_required_material_descriptors() Get required constitutive model descriptors for Links input file. _format_material_descriptors(self) Format constitutive model descriptors to Links input file. """
[docs] def __init__(self): """Constructor.""" self._name = 'LOU'
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[docs] @staticmethod def _get_required_material_descriptors(): """Get required constitutive model descriptors for Links input file. Returns ------- material_descriptors : tuple[str] Required constitutive model descriptors for Links input file. """ # Set required constitutive model descriptors material_descriptors = ('name', 'density', 'young', 'poisson', 'yield_a_init', 'a_hard_slope', 'yield_b_init', 'b_hard_slope', 'yield_c_init', 'c_hard_slope', 'yield_d_init', 'd_hard_slope', 'n_hard_point', 'hardening_law', 'hardening_parameters') # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return material_descriptors
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[docs] def _format_material_descriptors(self, mat_phase, descriptors): """Format constitutive model descriptors to Links input file. Parameters ---------- mat_phase : int Material phase identifier. descriptors : str Constitutive model descriptors. Returns ------- descriptors_input_lines : list[str] Constitutive model descriptors formatted to Links input data file. """ # Check descriptors required_descriptors = type(self)._get_required_material_descriptors() if not set(required_descriptors).issubset(set(descriptors.keys())): raise RuntimeError('Missing required constitutive model ' 'descriptors.') # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Get descriptors name = descriptors['name'] density = descriptors['density'] young = descriptors['young'] poisson = descriptors['poisson'] yield_a_init = descriptors['yield_a_init'] a_hard_slope = descriptors['a_hard_slope'] yield_b_init = descriptors['yield_b_init'] b_hard_slope = descriptors['b_hard_slope'] yield_c_init = descriptors['yield_c_init'] c_hard_slope = descriptors['c_hard_slope'] yield_d_init = descriptors['yield_d_init'] d_hard_slope = descriptors['d_hard_slope'] n_hard_point = descriptors['n_hard_point'] hardening_law = descriptors['hardening_law'] hardening_parameters = descriptors['hardening_parameters'] # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Set spacing spacing = (len(str(mat_phase)) + 1)*' ' # Initialize formatted constitutive model descriptors descriptors_input_lines = \ [str(mat_phase) + ' ' + name + '\n'] + \ [spacing + '{:<16.8e}'.format(density) + '\n'] + \ [spacing + '{:<16.8e}'.format(young) + '{:<16.8e}'.format(poisson) + '\n'] + \ [spacing + '{:<16.8e}'.format(yield_a_init) + '{:<16.8e}'.format(a_hard_slope) + '\n'] + \ [spacing + '{:<16.8e}'.format(yield_b_init) + '{:<16.8e}'.format(b_hard_slope) + '\n'] + \ [spacing + '{:<16.8e}'.format(yield_c_init) + '{:<16.8e}'.format(c_hard_slope) + '\n'] + \ [spacing + '{:<16.8e}'.format(yield_d_init) + '{:<16.8e}'.format(d_hard_slope) + '\n'] # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Set formatted constitutive model descriptors (number of hardening # points) descriptors_input_lines += \ [spacing + '{:<4d}'.format(n_hard_point) + '\n'] # Set accumulated plastic strain hardening points acc_p_strains = torch.linspace(0.0, 2.0, steps=n_hard_point) # Loop over hardening points for acc_p_strain in acc_p_strains: # Compute yield stress yield_stress, _ = \ hardening_law(hardening_parameters, acc_p_strain) # Set formatted constitutive model descriptors (hardening law) descriptors_input_lines += \ [spacing + '{:<16.8e}'.format(acc_p_strain) + '{:<16.8e}'.format(yield_stress) + '\n'] # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ return descriptors_input_lines