#pylint: disable=E1103,C0103,C0111
from __future__ import (nested_scopes, generators, division, absolute_import,
print_function, unicode_literals)
"""
All material dependency cards are defined in this file. This includes:
* MATS1 (isotropic solid/shell)
* MATT1 (isotropic solid/shell)
* MATT2 (anisotropic)
* MATT3 (linear orthotropic) - NA
* MATT4 (thermal)
* MATT5 (thermal)
* MATT8 (orthotropic shell) - NA
* MATT9 (anisotropic solid) - NA
All cards are Material objects.
"""
from pyNastran.bdf.cards.baseCard import BaseCard
from pyNastran.bdf.cards.bdf_tables import Table
from pyNastran.bdf.bdfInterface.assign_type import (integer, integer_or_blank,
double, double_or_blank, string, blank)
from pyNastran.bdf.field_writer_8 import print_card_8
from pyNastran.bdf.field_writer_16 import print_card_16
[docs]class MaterialDependence(BaseCard):
def __init__(self, card, data):
self.mid = None
[docs] def Mid(self):
if isinstance(self.mid, int):
return self.mid
return self.mid.mid # TODO: is this something that should be supported?
[docs] def _get_table(self, key):
"""internal method for accessing tables"""
table = getattr(self, key)
if table is None or isinstance(table, int):
return table
return table.tid
[docs]class MATS1(MaterialDependence):
"""
Specifies stress-dependent material properties for use in applications
involving nonlinear materials. This entry is used if a MAT1, MAT2 or MAT9
entry is specified with the same MID in a nonlinear solution sequence
(SOLs 106 and 129).
"""
type = 'MATS1'
def __init__(self, card=None, data=None, comment=''):
MaterialDependence.__init__(self, card, data)
if comment:
self._comment = comment
if card:
#: Identification number of a MAT1, MAT2, or MAT9 entry.
self.mid = integer(card, 1, 'mid')
#: Identification number of a TABLES1 or TABLEST entry. If H is
#: given, then this field must be blank.
self.tid = integer_or_blank(card, 2, 'tid')
#: Type of material nonlinearity. ('NLELAST' for nonlinear elastic
#: or 'PLASTIC' for elastoplastic.)
self.Type = string(card, 3, 'Type')
if self.Type not in ['NLELAST', 'PLASTIC']:
raise ValueError('MATS1 Type must be [NLELAST, PLASTIC]; Type=%r' % self.Type)
if self.Type == 'NLELAST':
# should we even read these?
self.h = None
self.hr = None
self.yf = None
self.limit1 = None
self.limit2 = None
#self.h = blank(card, 4, 'h')
#self.hr = blank(card, 6, 'hr')
#self.yf = blank(card, 5, 'yf')
#self.limit1 = blank(card, 7, 'yf')
#self.limit2 = blank(card, 8, 'yf')
else:
#: Work hardening slope (slope of stress versus plastic strain)
#: in units of stress. For elastic-perfectly plastic cases,
#: H=0.0. For more than a single slope in the plastic range,
#: the stress-strain data must be supplied on a TABLES1 entry
#: referenced by TID, and this field must be blank
self.h = double_or_blank(card, 4, 'H')
#: Yield function criterion, selected by one of the following
#: values (1) Von Mises (2) Tresca (3) Mohr-Coulomb
#: (4) Drucker-Prager
self.yf = integer_or_blank(card, 5, 'yf', 1)
#: Hardening Rule, selected by one of the following values
#: (Integer): (1) Isotropic (Default) (2) Kinematic
#: (3) Combined isotropic and kinematic hardening
self.hr = integer_or_blank(card, 6, 'hr', 1)
#: Initial yield point
self.limit1 = double(card, 7, 'limit1')
if self.yf == 3 or self.yf == 4:
#: Internal friction angle, measured in degrees, for the
#: Mohr-Coulomb and Drucker-Prager yield criteria
self.limit2 = double(card, 8, 'limit2')
else:
#self.limit2 = blank(card, 8, 'limit2')
self.limit2 = None
assert len(card) <= 9, 'len(MATS1 card) = %i' % len(card)
else:
(mid, tid, Type, h, yf, hr, limit1, limit2) = data
self.mid = mid
self.tid = tid
if Type == 1:
self.Type = 'NLELAST'
elif Type == 2:
self.Type = 'PLASTIC'
else:
raise RuntimeError('Invalid Type: Type=%s; must be 1=NLELAST '
'or 2=PLASTIC' % (Type))
self.h = h
self.yf = yf
self.hr = hr
self.limit1 = limit1
self.limit2 = limit2
[docs] def Yf(self):
d = {1: 'VonMises', 2: 'Tresca', 3: 'MohrCoulomb', 4: 'Drucker-Prager'}
return d[self.yf]
[docs] def Hf(self):
d = {1: 'Isotropic', 2: 'Kinematic', 3: 'Combined'}
return d[self.hr]
[docs] def E(self, strain):
"""
Gets E (Young's Modulus) for a given strain.
:param self: the object pointer
:param strain: the strain (None -> linear E value)
:returns E: Young's Modulus
"""
msg = "E (Young's Modulus) not implemented for MATS1"
raise NotImplementedError(msg)
#if self.tid:
#E = self.tid.Value(strain)
#return E
[docs] def cross_reference(self, model):
msg = 'which is required by MATS1 mid=%s' % self.mid
self.mid = model.Material(self.mid, msg=msg)
if self.tid: # then self.h is used
self.tid = model.Table(self.tid, msg=msg)
[docs] def Tid(self):
if isinstance(self.tid, Table):
return self.tid.tid
return self.tid
[docs] def raw_fields(self):
list_fields = ['MATS1', self.Mid(), self.Tid(), self.Type,
self.h, self.yf, self.hr, self.limit1, self.limit2]
return list_fields
[docs] def repr_fields(self):
return self.raw_fields()
[docs] def write_card(self, size=8, is_double=False):
card = self.repr_fields()
if size == 8:
return self.comment() + print_card_8(card)
return self.comment() + print_card_16(card)
[docs]class MATT1(MaterialDependence):
"""
Specifies temperature-dependent material properties on MAT1 entry
fields via TABLEMi entries.
+-------+-------+-------+-------+-------+--------+------+------+-------+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+=======+=======+=======+=======+=======+========+======+======+=======+
| MATT1 | MID | T(E) | T(G) | T(NU) | T(RHO) | T(A) | | T(GE) |
+-------+-------+-------+-------+-------+--------+------+------+-------+
| | T(ST) | T(SC) | T(SS) | | | | | |
+-------+-------+-------+-------+-------+--------+------+------+-------+
"""
type = 'MATT1'
def __init__(self, card=None, data=None, comment=''):
MaterialDependence.__init__(self, card, data)
if comment:
self._comment = comment
if card:
self.mid = integer(card, 1, 'mid')
self._E_table = integer_or_blank(card, 2, 'T(E)')
self._G_table = integer_or_blank(card, 3, 'T(G)')
self._nu_table = integer_or_blank(card, 4, 'T(nu)')
self._rho_table = integer_or_blank(card, 5, 'T(rho)')
self._A_table = integer_or_blank(card, 6, 'T(A)')
self._ge_table = integer_or_blank(card, 8, 'T(ge)')
self._st_table = integer_or_blank(card, 9, 'T(st)')
self._sc_table = integer_or_blank(card, 10, 'T(sc)')
self._ss_table = integer_or_blank(card, 11, 'T(ss)')
assert len(card) <= 11, 'len(MATT1 card) = %i' % len(card)
else:
raise NotImplementedError()
[docs] def E(self, temperature):
"""
Gets E (Young's Modulus) for a given temperature.
:param self: the object pointer
:param temperature: the temperature (None -> linear E value)
:returns E: Young's Modulus
"""
E = None
if self._E_table:
E = self._E_table.Value(temperature)
return E
[docs] def cross_reference(self, model):
msg = 'which is required by MATT1 mid=%s' % self.mid
self.mid = model.Material(self.mid, msg=msg)
self._xref_table(model, '_E_table', msg=msg)
self._xref_table(model, '_G_table', msg=msg)
self._xref_table(model, '_nu_table', msg=msg)
self._xref_table(model, '_rho_table', msg=msg)
self._xref_table(model, '_A_table', msg=msg)
self._xref_table(model, '_ge_table', msg=msg)
self._xref_table(model, '_st_table', msg=msg)
self._xref_table(model, '_sc_table', msg=msg)
self._xref_table(model, '_ss_table', msg=msg)
[docs] def _xref_table(self, model, key, msg):
slot = getattr(self, key)
if slot is not None:
setattr(self, key, model.Table(slot, msg))
[docs] def E_table(self):
return self._get_table('_E_table')
[docs] def G_table(self):
return self._get_table('_G_table')
[docs] def nu_table(self):
return self._get_table('_nu_table')
[docs] def rho_table(self):
return self._get_table('_rho_table')
[docs] def A_table(self):
return self._get_table('_A_table')
[docs] def ge_table(self):
return self._get_table('_ge_table')
[docs] def st_table(self):
return self._get_table('_st_table')
[docs] def sc_table(self):
return self._get_table('_sc_table')
[docs] def ss_table(self):
return self._get_table('_ss_table')
[docs] def raw_fields(self):
list_fields = [
'MATT1', self.Mid(), self.E_table(), self.G_table(),
self.nu_table(), self.rho_table(), self.A_table(), self.ge_table(),
self.st_table(), self.sc_table(), self.ss_table(),
]
return list_fields
[docs] def repr_fields(self):
return self.raw_fields()
[docs] def write_card(self, size=8, is_double=False):
card = self.repr_fields()
if size == 8:
return self.comment() + print_card_8(card)
return self.comment() + print_card_16(card)
[docs]class MATT2(MaterialDependence):
"""
Specifies temperature-dependent material properties on MAT2 entry
fields via TABLEMi entries.
+-------+-------+--------+--------+--------+--------+--------+--------+--------+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+=======+=======+========+========+========+========+========+========+========+
| MATT2 | MID | T(G12) | T(G13) | T(G13) | T(G22) | T(G23) | T(G33) | T(RHO) |
+-------+-------+--------+--------+--------+--------+--------+--------+--------+
| | T(A1) | T(A2) | T(A3) | | T(GE) | T(ST) | T(SC) | T(SS) |
+-------+-------+--------+--------+--------+--------+--------+--------+--------+
"""
type = 'MATT2'
def __init__(self, card=None, data=None, comment=''):
MaterialDependence.__init__(self, card, data)
if comment:
self._comment = comment
if card:
self.mid = integer(card, 1, 'mid')
self._G11_table = integer_or_blank(card, 2, 'T(G11)')
self._G12_table = integer_or_blank(card, 3, 'T(G12)')
self._G13_table = integer_or_blank(card, 4, 'T(G13)')
self._G22_table = integer_or_blank(card, 5, 'T(G22)')
self._G23_table = integer_or_blank(card, 6, 'T(G23)')
self._G33_table = integer_or_blank(card, 7, 'T(G33)')
self._rho_table = integer_or_blank(card, 8, 'T(rho)')
self._A1_table = integer_or_blank(card, 9, 'T(A1)')
self._A2_table = integer_or_blank(card, 10, 'T(A2)')
self._A3_table = integer_or_blank(card, 11, 'T(A3)')
self._ge_table = integer_or_blank(card, 13, 'T(ge)')
self._st_table = integer_or_blank(card, 14, 'T(st)')
self._sc_table = integer_or_blank(card, 15, 'T(sc)')
self._ss_table = integer_or_blank(card, 16, 'T(ss)')
assert len(card) <= 17, 'len(MATT2 card) = %i' % len(card)
else:
raise NotImplementedError()
[docs] def cross_reference(self, model):
msg = 'which is required by MATT2 mid=%s' % self.mid
self.mid = model.Material(self.mid, msg=msg)
self._xref_table(model, '_G11_table', msg=msg)
self._xref_table(model, '_G12_table', msg=msg)
self._xref_table(model, '_G13_table', msg=msg)
self._xref_table(model, '_G22_table', msg=msg)
self._xref_table(model, '_G23_table', msg=msg)
self._xref_table(model, '_G33_table', msg=msg)
self._xref_table(model, '_rho_table', msg=msg)
self._xref_table(model, '_A1_table', msg=msg)
self._xref_table(model, '_A2_table', msg=msg)
self._xref_table(model, '_A3_table', msg=msg)
self._xref_table(model, '_ge_table', msg=msg)
self._xref_table(model, '_st_table', msg=msg)
self._xref_table(model, '_sc_table', msg=msg)
self._xref_table(model, '_ss_table', msg=msg)
[docs] def _xref_table(self, model, key, msg):
slot = getattr(self, key)
if slot is not None:
setattr(self, key, model.Table(slot, msg))
[docs] def G11_table(self):
return self._get_table('_G11_table')
[docs] def G12_table(self):
return self._get_table('_G12_table')
[docs] def G13_table(self):
return self._get_table('_G13_table')
[docs] def G22_table(self):
return self._get_table('_G22_table')
[docs] def G23_table(self):
return self._get_table('_G23_table')
[docs] def G33_table(self):
return self._get_table('_G33_table')
[docs] def rho_table(self):
return self._get_table('_rho_table')
[docs] def A1_table(self):
return self._get_table('_A1_table')
[docs] def A2_table(self):
return self._get_table('_A2_table')
[docs] def A3_table(self):
return self._get_table('_A3_table')
[docs] def ge_table(self):
return self._get_table('_ge_table')
[docs] def st_table(self):
return self._get_table('_st_table')
[docs] def sc_table(self):
return self._get_table('_sc_table')
[docs] def ss_table(self):
return self._get_table('_ss_table')
[docs] def raw_fields(self):
list_fields = [
'MATT2', self.Mid(), self.G11_table(), self.G12_table(),
self.G13_table(), self.G22_table(), self.G23_table(),
self.G33_table(), self.rho_table(), self.A1_table(),
self.A2_table(), self.A3_table(), None, self.ge_table(),
self.st_table(), self.sc_table(), self.ss_table()
]
return list_fields
[docs] def repr_fields(self):
return self.raw_fields()
[docs] def write_card(self, size=8, is_double=False):
card = self.repr_fields()
if size == 8:
return self.comment() + print_card_8(card)
return self.comment() + print_card_16(card)
#MATT3 - CTRIAX6 only
[docs]class MATT4(MaterialDependence):
"""
Specifies temperature-dependent material properties on MAT2 entry
fields via TABLEMi entries.
+-------+-------+-------+-------+--------+-------+-------+---------+--------+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+=======+=======+=======+=======+========+=======+=======+=========+========+
| MATT4 | MID | T(K) | T(CP) | | T(H) | T(mu) | T(HGEN) | |
+-------+-------+-------+-------+--------+-------+-------+---------+--------+
"""
type = 'MATT4'
def __init__(self, card=None, data=None, comment=''):
MaterialDependence.__init__(self, card, data)
if comment:
self._comment = comment
if card:
self.mid = integer(card, 1, 'mid')
self._k_table = integer_or_blank(card, 2, 'T(K)')
self._cp_table = integer_or_blank(card, 3, 'T(CP)')
self._H_table = integer_or_blank(card, 5, 'T(H)')
self._mu_table = integer_or_blank(card, 6, 'T(mu)')
self._Hgen_table = integer_or_blank(card, 7, 'T(HGEN)')
assert len(card) <= 8, 'len(MATT4 card) = %i' % len(card)
else:
raise NotImplementedError()
[docs] def cross_reference(self, model):
msg = 'which is required by MATT4 mid=%s' % self.mid
self.mid = model.Material(self.mid, msg=msg)
self._xref_table(model, '_k_table', msg=msg)
self._xref_table(model, '_cp_table', msg=msg)
self._xref_table(model, '_H_table', msg=msg)
self._xref_table(model, '_mu_table', msg=msg)
self._xref_table(model, '_Hgen_table', msg=msg)
[docs] def _xref_table(self, model, key, msg):
slot = getattr(self, key)
if slot is not None:
setattr(self, key, model.Table(slot, msg))
[docs] def K_table(self):
return self._get_table('_k_table')
[docs] def Cp_table(self):
return self._get_table('_cp_table')
[docs] def H_table(self):
return self._get_table('_H_table')
[docs] def mu_table(self):
return self._get_table('_mu_table')
[docs] def Hgen_table(self):
return self._get_table('_Hgen_table')
[docs] def raw_fields(self):
list_fields = [
'MATT4', self.Mid(), self.K_table(), self.Cp_table(),
None,
self.H_table(), self.mu_table(), self.Hgen_table()
]
return list_fields
[docs] def repr_fields(self):
return self.raw_fields()
[docs] def write_card(self, size=8, is_double=False):
card = self.repr_fields()
if size == 8:
return self.comment() + print_card_8(card)
return self.comment() + print_card_16(card)
[docs]class MATT5(MaterialDependence):
"""
Specifies temperature-dependent material properties on MAT2 entry
fields via TABLEMi entries.
+-------+---------+---------+--------+--------+--------+--------+--------+-------+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+=======+=========+=========+========+========+========+========+========+=======+
| MATT5 | MID | T(Kxx) | T(Kxy) | T(Kxz) | T(Kyy) | T(Kyz) | T(Kzz) | T(CP) |
+-------+---------+---------+--------+--------+--------+--------+--------+-------+
| | | T(HGEN) | | | | | | |
+-------+---------+---------+--------+--------+--------+--------+--------+-------+
"""
type = 'MATT5'
def __init__(self, card=None, data=None, comment=''):
MaterialDependence.__init__(self, card, data)
if comment:
self._comment = comment
if card:
self.mid = integer(card, 1, 'mid')
self._kxx_table = integer_or_blank(card, 2, 'T(Kxx)')
self._kxy_table = integer_or_blank(card, 3, 'T(Kxy)')
self._kxz_table = integer_or_blank(card, 5, 'T(Kxz)')
self._kyy_table = integer_or_blank(card, 6, 'T(Kyy)')
self._kyz_table = integer_or_blank(card, 7, 'T(Kyz)')
self._kzz_table = integer_or_blank(card, 8, 'T(Kyz)')
self._cp_table = integer_or_blank(card, 9, 'T(Kyz)')
self._hgen_table = integer_or_blank(card, 11, 'T(HGEN)')
assert len(card) <= 12, 'len(MATT5 card) = %i' % len(card)
else:
raise NotImplementedError()
[docs] def cross_reference(self, model):
msg = 'which is required by MATT5 mid=%s' % self.mid
self.mid = model.Material(self.mid, msg=msg)
self._xref_table(model, '_kxx_table', msg=msg)
self._xref_table(model, '_kxy_table', msg=msg)
self._xref_table(model, '_kxz_table', msg=msg)
self._xref_table(model, '_kyy_table', msg=msg)
self._xref_table(model, '_kyz_table', msg=msg)
self._xref_table(model, '_kzz_table', msg=msg)
self._xref_table(model, '_cp_table', msg=msg)
self._xref_table(model, '_hgen_table', msg=msg)
[docs] def _xref_table(self, model, key, msg):
slot = getattr(self, key)
if slot is not None:
setattr(self, key, model.Table(slot, msg))
[docs] def Kxx_table(self):
return self._get_table('_kxx_table')
[docs] def Kxy_table(self):
return self._get_table('_kxy_table')
[docs] def Kxz_table(self):
return self._get_table('_kxz_table')
[docs] def Kyy_table(self):
return self._get_table('_kyy_table')
[docs] def Kyz_table(self):
return self._get_table('_kyz_table')
[docs] def Kzz_table(self):
return self._get_table('_kzz_table')
[docs] def Cp_table(self):
return self._get_table('_cp_table')
[docs] def Hgen_table(self):
return self._get_table('_hgen_table')
[docs] def raw_fields(self):
list_fields = ['MATT5', self.Mid(),
self.Kxx_table(), self.Kxy_table(), self.Kxz_table(),
self.Kyy_table(), self.Kyz_table(), self.Kzz_table(),
self.Cp_table(), None, self.Hgen_table()]
return list_fields
[docs] def repr_fields(self):
return self.raw_fields()
[docs] def write_card(self, size=8, is_double=False):
card = self.repr_fields()
if size == 8:
return self.comment() + print_card_8(card)
return self.comment() + print_card_16(card)
#MATT8
#MATT9
[docs]class MATT8(MaterialDependence):
"""
Specifies temperature-dependent material properties on MAT2 entry
fields via TABLEMi entries.
+-------+--------+--------+-------+---------+--------+--------+--------+--------+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+=======+========+========+=======+=========+========+========+========+========+
| MATT8 | MID | T(E1) | T(E2) | T(Nu12) | T(G12) | T(G1z) | T(G2z) | T(RHO) |
+-------+--------+--------+-------+---------+--------+--------+--------+--------+
| | T(A1) | T(A2) | | T(Xt) | T(Yc) | T(Yt) | T(Yc) | T(S) |
+-------+--------+--------+-------+---------+--------+--------+--------+--------+
| | T(GE) | T(F12) | | | | | | |
+-------+--------+--------+-------+---------+--------+--------+--------+--------+
"""
type = 'MATT8'
def __init__(self, card=None, data=None, comment=''):
MaterialDependence.__init__(self, card, data)
if comment:
self._comment = comment
if card:
self.mid = integer(card, 1, 'mid')
self._E1_table = integer_or_blank(card, 2, 'T(E1)')
self._E2_table = integer_or_blank(card, 3, 'T(E2)')
self._Nu12_table = integer_or_blank(card, 3, 'T(Nu12)')
self._G12_table = integer_or_blank(card, 5, 'T(G12)')
self._G1z_table = integer_or_blank(card, 6, 'T(G1z)')
self._G2z_table = integer_or_blank(card, 7, 'T(G2z)')
self._rho_table = integer_or_blank(card, 8, 'T(Rho)')
self._A1_table = integer_or_blank(card, 9, 'T(A1)')
self._A2_table = integer_or_blank(card, 10, 'T(A2)')
self._Xt_table = integer_or_blank(card, 12, 'T(Xt)')
self._Xc_table = integer_or_blank(card, 13, 'T(Xc)')
self._Yt_table = integer_or_blank(card, 14, 'T(Yt)')
self._Yc_table = integer_or_blank(card, 15, 'T(Yc)')
self._S_table = integer_or_blank(card, 16, 'T(S)')
self._GE_table = integer_or_blank(card, 17, 'T(GE)')
self._F12_table = integer_or_blank(card, 18, 'T(F12)')
assert len(card) <= 19, 'len(MATT8 card) = %i' % len(card)
else:
raise NotImplementedError()