Source code for sigmaepsilon.solid.material.hooke.utils

# -*- coding: utf-8 -*-
from dewloosh.core.tools.kwargtools import getasany


standard_keys_ortho = ['E1', 'E2', 'E3',
                       'NU12', 'NU13', 'NU23', 'G12', 'G13', 'G23']
keys_ortho_all = standard_keys_ortho + ['NU21', 'NU32', 'NU31']
bulk_keys_ortho = ['E1', 'E2', 'E3', 'NU12',
                   'NU13', 'NU23', 'NU21', 'NU32', 'NU31']


[docs]class HookeError(Exception): ...
[docs]def group_mat_params(**params) -> tuple: """ Groups and returns all input material parameters as a 3-tuple of dictionaries. Returns ------- tuple 3 dictionaries for Young's moduli, Poisson's ratios and shear moduli. """ PARAMS = {key.upper(): value for key, value in params.items()} keys = list(PARAMS.keys()) E = {key: PARAMS[key] for key in keys if key[0] == 'E'} NU = {key: PARAMS[key] for key in keys if key[:2] == 'NU'} G = {key: PARAMS[key] for key in keys if key[0] == 'G'} return E, NU, G
[docs]def missing_std_params_ortho(**params): """Returns the ones missing from the 9 standard orthotropic parameters.""" return [k for k in standard_keys_ortho if k not in params]
[docs]def missing_params_ortho(**params): """Returns the ones missing from the 12 orthotropic parameters.""" return [k for k in keys_ortho_all if k not in params]
[docs]def has_std_params_ortho(**params) -> bool: """ Returns True, if all 9 standard keys are provided. Standard keys are the 3 Young's moduli, the 3 shear moduli and the minor Poisson's ratios. """ return len(missing_std_params_ortho(**params)) == 0
[docs]def has_all_params_ortho(**params) -> bool: """ Returns True, if all 12 keys of an orthotropic material are provided.""" return len(missing_params_ortho(**params)) == 0
[docs]def get_iso_params(*args, **kwargs): """ Returns all 12 orthotropic engineering constants for an isotropic material. Requires 2 independent constants to be provided. """ KWARGS = {key.upper(): value for key, value in kwargs.items()} E = KWARGS.get('E', None) G = KWARGS.get('G', None) NU = KWARGS.get('NU', None) try: if E is None: E = 2*G*(1+NU) elif G is None: G = E/2/(1+NU) elif NU is None: NU = E/2/G - 1 except TypeError: raise HookeError("At least 2 independent constants" " must be defined for an isotropic material") params = \ {'E1': E, 'E2': E, 'E3': E, 'NU12': NU, 'NU13': NU, 'NU23': NU, 'NU21': NU, 'NU31': NU, 'NU32': NU, 'G12': G, 'G13': G, 'G23': G} return params
[docs]def get_triso_params(*args, **kwargs) -> dict: """ Returns all 12 orthotropic engineering constants for a transversely isotropic material. From the total of 12 constants, exactly 5 must to be provided, from which 1 must be the out-of-plane shear moduli. The remaining 4 necessary constants can be provided in any combination. """ KWARGS = {key.upper(): value for key, value in kwargs.items()} G12 = getasany(['G12', 'G21'], None, **KWARGS) G23 = getasany(['G23', 'G32'], None, **KWARGS) G13 = getasany(['G13', 'G23'], None, **KWARGS) E1 = KWARGS.get('E1', None) E2 = KWARGS.get('E2', None) E3 = KWARGS.get('E3', None) NU12 = KWARGS.get('NU12', None) NU21 = KWARGS.get('NU21', None) NU23 = KWARGS.get('NU23', None) NU32 = KWARGS.get('NU32', None) NU13 = KWARGS.get('NU13', None) NU31 = KWARGS.get('NU31', None) params = \ {'E1': E1, 'E2': E2, 'E3': E3, 'NU12': NU12, 'NU13': NU13, 'NU23': NU23, 'NU21': NU21, 'NU31': NU31, 'NU32': NU32, 'G12': G12, 'G13': G13, 'G23': G23} return params
[docs]def get_ortho_params(*args, **kwargs) -> dict: """ Returns all 12 orthotropic engineering constants for an orthotropic material. From the total of 12 constants, 9 must to be provided, from which 3 must be shear moduli. The remaining 6 necessary constants can be provided in any combination. """ KWARGS = {key.upper(): value for key, value in kwargs.items()} G12 = getasany(['G12', 'G21'], None, **KWARGS) assert G12 is not None, "Shear modulus G12 \ must be provided as either G12 or G21!" G23 = getasany(['G23', 'G32'], None, **KWARGS) assert G23 is not None, "Shear modulus G23 \ must be provided as either G23 or G32!" G13 = getasany(['G13', 'G23'], None, **KWARGS) assert G13 is not None, "Shear modulus G13 \ must be provided as either G13 or G31!" E1 = KWARGS.get('E1', None) E2 = KWARGS.get('E2', None) E3 = KWARGS.get('E3', None) NU12 = KWARGS.get('NU12', None) NU21 = KWARGS.get('NU21', None) NU23 = KWARGS.get('NU23', None) NU32 = KWARGS.get('NU32', None) NU13 = KWARGS.get('NU13', None) NU31 = KWARGS.get('NU31', None) params = \ {'E1': E1, 'E2': E2, 'E3': E3, 'NU12': NU12, 'NU13': NU13, 'NU23': NU23, 'NU21': NU21, 'NU31': NU31, 'NU32': NU32, 'G12': G12, 'G13': G13, 'G23': G23} return params
if __name__ == '__main__': get_iso_params(E=1, NU=0.2)