shell Module

Inheritance diagram of pyNastran.bdf.cards.properties.shell

All shell properties are defined in this file. This includes:

  • PCOMP
  • PCOMPG
  • PLPLANE
  • PSHEAR
  • PSHELL
  • PPLANE

All shell properties are Property objects.

class pyNastran.bdf.cards.properties.shell.CompositeShellProperty[source]

Bases: pyNastran.bdf.cards.base_card.Property

Common class for:
  • PCOMP
  • PCOMPG
MassPerArea(self, iply='all', method='nplies', tflag=1, tscales=None)[source]
MassPerArea_structure(self)[source]
Material(self, iply)[source]

Gets the material of the \(i^{th}\) ply (not the ID unless it is not cross-referenced).

Parameters:
iply : int

the ply ID (starts from 0)

Mid(self, iply)[source]

Gets the Material ID of the \(i^{th}\) ply.

Parameters:
iply : int/str; default=’all’

the string ‘all’ (default) or the mass per area of the \(i^{th}\) ply

Returns:
material_id : int

the material id of the ith ply

Mids(self)[source]
Nsm(self)[source]
Rho(self, iply)[source]
TRef
Theta(self, iply)[source]
Thickness(self, iply='all', tflag=1, tscales=None)[source]
_adjust_ply_id(self, iply)[source]

Gets the ply ID that’s stored in self.plies.

When a ply is not symmetric, this function returns the input iply. When a ply is symmetrical and the iply value is greater than the number of plies, we return the mirrored ply. For the case of a symmetrical ply, the element will always have an even number of layers.

Parameters:
iply : int

the ply ID

Raises:
  • IndexError if iply is invalid
::
Case 1 (nplies=6, len(plies)=3, lam=’SYM’):

ply 2 ply 1 ply 0 ——- sym ply 0 / 3 ply 1 / 4 ply 2 / 5

Ask for ply 3, return ply 0 Ask for ply 4, return ply 1 Ask for ply 5, return ply 2

Case 2 (nplies=5, len(plies)=5, lam=’NO’):

ply 5 ply 4 ply 3 ply 1 ply 0

Ask for ply 3, return ply 1 Ask for ply 4, return ply 2

cross_reference(self, model)[source]

Cross links the card so referenced cards can be extracted directly

Parameters:
model : BDF()

the BDF object

get_density(self, iply)[source]

Gets the density of the \(i^{th}\) ply

Parameters:
iply : int

the ply ID (starts from 0)

get_mass_per_area(self, iply='all', method='nplies')[source]

Gets the Mass/Area for the property.

\[\frac{m}{A} = \sum(\rho t) + nsm\]

or

\[\frac{m}{A} - nsm = \sum(\rho t)\]

and

\[\frac{m_i}{A} = rho_i t_i + nsm_i\]

where \(nsm_i\) is the non-structural mass of the \(i^{th}\) ply

Parameters:
iply : str/int; default=’all’

str : the string ‘all’ (default) or the mass per area of the \(i^{th}\) ply

method : str

the method to compute MassPerArea {nplies, rho*t, t}

  • Case 1 (iply = all)

    method has no effect because the total nsm is defined

  • Case 2 (iply != all)

    method ‘nplies’ smear the nsm based on \(n_{plies}\) (default)

    \(nsm_i = nsm / n_{plies}\) # smear based on nplies

  • Case 3 (iply != all)

    method ‘rho*t’ smear the nsm based on the mass distribution

    \[nsm_i = \rho_i t_i \frac{nsm}{\sum(\rho_i t_i)}\]
    \[nsm_i = \rho_i t_i \frac{nsm}{\frac{m}{A} - nsm}\]
  • Case 4 (iply != all)

    method ‘t’ smear the nsm based on the thickness distribution

    \[nsm_i = t_i \frac{nsm}{\sum(t_i)}\]
.. note:: final mass calculation will be done later
get_mass_per_area_rho(self, rhos, iply='all', method='nplies')[source]

Gets the Mass/Area for the property.

\[\frac{m}{A} = \sum(\rho t) + nsm\]

or

\[\frac{m}{A} - nsm = \sum(\rho t)\]

and

\[\frac{m_i}{A} = rho_i t_i + nsm_i\]

where \(nsm_i\) is the non-structural mass of the \(i^{th}\) ply

Parameters:
rhos : List[float]

the densities of each ply

iply : str/int; default=’all’

the mass per area of the \(i^{th}\) ply

method : str

the method to compute MassPerArea {nplies, rho*t, t}

  • Case 1 (iply = all)

    method has no effect because the total nsm is defined

  • Case 2 (iply != all)

    method ‘nplies’ smear the nsm based on \(n_{plies}\) (default)

    \(nsm_i = nsm / n_{plies}\) # smear based on nplies

  • Case 3 (iply != all)

    method ‘rho*t’ smear the nsm based on the mass distribution

    \[nsm_i = \rho_i t_i \frac{nsm}{\sum(\rho_i t_i)}\]
    \[nsm_i = \rho_i t_i \frac{nsm}{\frac{m}{A} - nsm}\]
  • Case 4 (iply != all)

    method ‘t’ smear the nsm based on the thickness distribution

    \[nsm_i = t_i \frac{nsm}{\sum(t_i)}\]
.. note:: final mass calculation will be done later
get_mass_per_area_structure(self, rhos)[source]

Gets the Mass/Area for the property structure only (doesn’t consider nsm).

\[\frac{m}{A} = \sum(\rho t)\]

where \(nsm_i\) is the non-structural mass of the \(i^{th}\) ply

Parameters:
rhos : List[float]

the densities of each ply

get_material_id(self, iply)[source]
get_material_ids(self)[source]
get_nonstructural_mass(self)[source]

Gets the non-structural mass \(i^{th}\) ply

get_sout(self, iply)[source]

Gets the the flag identifying stress/strain outpur of the \(i^{th}\) ply (not the ID). default=’NO’.

Parameters:
iply : int

the ply ID (starts from 0)

get_theta(self, iply)[source]

Gets the ply angle of the \(i^{th}\) ply (not the ID)

Parameters:
iply : int

the ply ID (starts from 0)

get_thetas(self)[source]
get_thickness(self, iply='all')[source]

Gets the thickness of the \(i^{th}\) ply.

Parameters:
iply : int/str; default=’all’

the string ‘all’ (default) or the mass per area of the \(i^{th}\) ply

Returns:
thickness : float

the thickness of the ply or plies

get_thicknesses(self)[source]
get_z_locations(self)[source]

Gets the z locations for the various plies.

Parameters:
iply : int

the ply ID (starts from 0)

Assume there are 2 plies, each of 1.0 thick, starting from :math:`z=0`.
>>> pcomp.get_z_locations()
[0., 1., 2.]
is_symmetrical(self)[source]

Is the laminate symmetrical?

Returns:
is_symmetrical : bool

is the SYM flag active?

material_ids

Gets the material IDs of all the plies

Returns:
mids : MATx

the material IDs

nplies

Gets the number of plies including the core.

if Lam=SYM:
  returns nplies * 2   (even)
else:
  returns nplies
sout(self, iply)[source]
uncross_reference(self)[source]

Removes cross-reference links

class pyNastran.bdf.cards.properties.shell.PCOMP(pid, mids, thicknesses, thetas=None, souts=None, nsm=0.0, sb=0.0, ft=None, tref=0.0, ge=0.0, lam=None, z0=None, comment='')[source]

Bases: pyNastran.bdf.cards.properties.shell.CompositeShellProperty

1 2 3 4 5 6 7 8 9
PCOMP PID Z0 NSM SB FT TREF GE LAM
  MID1 T1 THETA1 SOUT1 MID2 T2 THETA2 SOUT2
  MID3 T3 THETA3 SOUT3 etc.      
PCOMP 701512 0.0+0 1.549-2     0.0+0 0.0+0 SYM
  300704 3.7-2 0.0+0 YES 300704 3.7-2
YES
  300704 3.7-2 -45. YES 300704 3.7-2
YES
  300705 .5 0.0+0 YES        

Creates a PCOMP card

pid : int
property id
mids : List[int, …, int]
material ids for each ply
thicknesses : List[float, …, float]
thicknesses for each ply
thetas : List[float, …, float]; default=None
ply angle None : [0.] * nplies
souts : List[str, …, str]; default=None
should the stress? be printed; {YES, NO} None : [NO] * nplies
nsm : float; default=0.
nonstructural mass per unit area
sb : float; default=0.
Allowable shear stress of the bonding material. Used by the failure theory
ft : str; default=None
failure theory; {HILL, HOFF, TSAI, STRN, None}
tref : float; default=0.
reference temperature
ge : float; default=0.
structural damping
lam : str; default=None
symmetric flag; {SYM, MEM, BEND, SMEAR, SMCORE, None} None : not symmmetric
z0 : float; default=None
Distance from the reference plane to the bottom surface None : -1/2 * total_thickness
comment : str; default=’‘
a comment for the card
classmethod _init_from_empty()[source]
_properties = ['_field_map', 'plies', 'nplies', 'material_ids']
classmethod add_card(card, comment='')[source]

Adds a PCOMP card from BDF.add_card(...)

Parameters:
card : BDFCard()

a BDFCard object

comment : str; default=’‘

a comment for the card

ft = None

Failure Theory [‘HILL’, ‘HOFF’, ‘TSAI’, ‘STRN’, None]

get_ABD_matrices(self, theta_offset=0.0)[source]

Gets the ABD matrix

Parameters:
theta_offset : float

rotates the ABD matrix; measured in degrees

get_Qbar_matrix(self, mid_ref, theta)[source]

theta must be in radians

get_Sbar_matrix(self, mid_ref, theta)[source]

theta must be in radians

get_z0_z1_zmean(self)[source]
lam = None

symmetric flag - default = No Symmetry (=None)

nsm = None

Non-Structural Mass per unit Area

pid = None

Property ID

plies
raw_fields(self)[source]
repr_fields(self)[source]

Gets the fields in their simplified form

Returns:
fields : List[varies]

the fields that define the card

tref = None

Reference Temperature (default=0.0)

type = 'PCOMP'
update_by_pname_fid(self, pname_fid, value)[source]
validate(self)[source]

card checking method that should be overwritten

write_card(self, size=8, is_double=False)[source]

Writes the card with the specified width and precision

Parameters:
size : int (default=8)

size of the field; {8, 16}

is_double : bool (default=False)

is this card double precision

Returns:
msg : str

the string representation of the card

class pyNastran.bdf.cards.properties.shell.PCOMPG(pid, global_ply_ids, mids, thicknesses, thetas=None, souts=None, nsm=0.0, sb=0.0, ft=None, tref=0.0, ge=0.0, lam=None, z0=None, comment='')[source]

Bases: pyNastran.bdf.cards.properties.shell.CompositeShellProperty

1 2 3 4 5 6 7 8 9
PCOMPG PID Z0 NSM SB FT TREF GE LAM
  GPLYID1 MID1 T1 THETA1 SOUT1      
  GPLYID2 MID2 T2 THETA2 SOUT2      

Creates a PCOMPG card

Parameters:
pid : int

property id

global_ply_ids : List[int]

the ply id

mids : List[int, …, int]

material ids for each ply

thicknesses : List[float, …, float]

thicknesses for each ply

thetas : List[float, …, float]; default=None

ply angle None : [0.] * nplies

souts : List[str, …, str]; default=None

should the stress? be printed; {YES, NO} None : [NO] * nplies

nsm : float; default=0.

nonstructural mass per unit area

sb : float; default=0.

Allowable shear stress of the bonding material. Used by the failure theory

ft : str; default=None

failure theory; {HILL, HOFF, TSAI, STRN, None}

tref : float; default=0.

reference temperature

ge : float; default=0.

structural damping

lam : str; default=None

symmetric flag; {SYM, MEM, BEND, SMEAR, SMCORE, None} None : not symmmetric

z0 : float; default=None

Distance from the reference plane to the bottom surface None : -1/2 * total_thickness

comment : str; default=’‘

a comment for the card

GlobalPlyID(self, iply)[source]

returns the global ply id for the specified layer

classmethod _init_from_empty()[source]
_properties = ['_field_map', 'plies', 'nplies', 'material_ids']
classmethod add_card(card, comment='')[source]

Adds a PCOMPG card from BDF.add_card(...)

Parameters:
card : BDFCard()

a BDFCard object

comment : str; default=’‘

a comment for the card

ft = None

Failure Theory

[‘HILL’, ‘HOFF’, ‘TSAI’, ‘STRN’, None]

lam = None

symmetric flag - default = No Symmetry (NO)

nsm = None

Non-Structural Mass per unit Area

pid = None

Property ID

plies
pname_fid_map = {}
raw_fields(self)[source]
repr_fields(self)[source]

Gets the fields in their simplified form

Returns:
fields : List[varies]

the fields that define the card

tref = None

Reference Temperature (default=0.0)

type = 'PCOMPG'
update_by_pname_fid(self, pname_fid, value)[source]
validate(self)[source]

card checking method that should be overwritten

write_card(self, size=8, is_double=False)[source]

Writes the card with the specified width and precision

Parameters:
size : int (default=8)

size of the field; {8, 16}

is_double : bool (default=False)

is this card double precision

Returns:
msg : str

the string representation of the card

class pyNastran.bdf.cards.properties.shell.PLPLANE(pid, mid, cid=0, stress_strain_output_location='GRID', comment='')[source]

Bases: pyNastran.bdf.cards.base_card.Property

Fully Nonlinear Plane Element Properties (SOL 601) Defines the properties of a fully nonlinear (i.e., large strain and large rotation) hyperelastic plane strain or axisymmetric element.

1 2 3 4 5
PLPLANE PID MID CID STR

MSC

1 2 3 4 5 6
PLPLANE PID MID CID STR T

NX

Referenced by:
#- CQUAD, CQUAD4, CQUAD8, CQUADX, CTRIA3, CTRIA6, CTRIAX (MSC) #- CPLSTS3, CPLSTS4, CPLSTS6, CPLSTS8 entries (NX 10)

Creates a PLPLANE card, which defines the properties of a fully nonlinear (i.e., large strain and large rotation) hyperelastic plane strain or axisymmetric element.

Parameters:
pid : int

property id

mid : int

material id; MATHP / MATHE

cid : int; default=0

???

stress_strain_output_location : str; default=’GRID’

???

comment : str; default=’‘

a comment for the card

Cid(self)[source]
Mid(self)[source]

returns the material id

classmethod _init_from_empty()[source]
classmethod add_card(card, comment='')[source]

Adds a PLPLANE card from BDF.add_card(...)

Parameters:
card : BDFCard()

a BDFCard object

comment : str; default=’‘

a comment for the card

cross_reference(self, model)[source]

Cross links the card so referenced cards can be extracted directly

Parameters:
model : BDF()

the BDF object

pid = None

Property ID

raw_fields(self)[source]
repr_fields(self)[source]

Gets the fields in their simplified form

Returns:
fields : List[varies]

the fields that define the card

type = 'PLPLANE'
uncross_reference(self)[source]

Removes cross-reference links

write_card(self, size=8, is_double=False)[source]

Writes the card with the specified width and precision

Parameters:
size : int (default=8)

size of the field; {8, 16}

is_double : bool (default=False)

is this card double precision

Returns:
msg : str

the string representation of the card

class pyNastran.bdf.cards.properties.shell.PPLANE(pid, mid, t=0.0, nsm=0.0, formulation_option=0, comment='')[source]

Bases: pyNastran.bdf.cards.base_card.Property

NX specific card

MassPerArea(self, tflag=1, tscales=None)[source]

Calculates mass per area.

\[\]

rac{m}{A} = nsm + ho t

Mid(self)[source]

returns the material id

Thickness(self)[source]

returns the thickness of the element

classmethod _init_from_empty()[source]
classmethod add_card(card, comment='')[source]

Adds a PPLANE card from BDF.add_card(...)

Parameters:
card : BDFCard()

a BDFCard object

comment : str; default=’‘

a comment for the card

cross_reference(self, model)[source]

Cross links the card so referenced cards can be extracted directly

Parameters:
model : BDF()

the BDF object

pid = None

Property ID

raw_fields(self)[source]
repr_fields(self)[source]

Gets the fields in their simplified form

Returns:
fields : List[varies]

the fields that define the card

type = 'PPLANE'
uncross_reference(self)[source]

Removes cross-reference links

write_card(self, size=8, is_double=False)[source]

Writes the card with the specified width and precision

Parameters:
size : int (default=8)

size of the field; {8, 16}

is_double : bool (default=False)

is this card double precision

Returns:
msg : str

the string representation of the card

class pyNastran.bdf.cards.properties.shell.PSHEAR(pid, mid, t, nsm=0.0, f1=0.0, f2=0.0, comment='')[source]

Bases: pyNastran.bdf.cards.base_card.Property

Defines the properties of a shear panel (CSHEAR entry).

1 2 3 4 5 6 7
PSHEAR PID MID T NSM F1 F2

Creates a PSHEAR card

Parameters:
pid : int

property id

mid : int

material id

t : float

shear panel thickness

nsm : float; default=0.

nonstructural mass per unit length

f1 : float; default=0.0

Effectiveness factor for extensional stiffness along edges 1-2 and 3-4

f2 : float; default=0.0

Effectiveness factor for extensional stiffness along edges 2-3 and 1-4

comment : str; default=’‘

a comment for the card

MassPerArea(self, tflag=1, tscales=None)[source]

Calculates mass per area.

\[\]

rac{m}{A} = nsm + ho t

Mid(self)[source]

returns the material id

Rho(self)[source]

returns the material density

Thickness(self)[source]

returns the thickness of the element

classmethod _init_from_empty()[source]
classmethod add_card(card, comment='')[source]

Adds a PSHEAR card from BDF.add_card(...)

Parameters:
card : BDFCard()

a BDFCard object

comment : str; default=’‘

a comment for the card

cross_reference(self, model)[source]

Cross links the card so referenced cards can be extracted directly

Parameters:
model : BDF()

the BDF object

mid = None

Material ID

pid = None

Property ID

pname_fid_map = {4: 't', 'T': 't'}
raw_fields(self)[source]
type = 'PSHEAR'
uncross_reference(self)[source]

Removes cross-reference links

write_card(self, size=8, is_double=False)[source]

Writes the card with the specified width and precision

Parameters:
size : int (default=8)

size of the field; {8, 16}

is_double : bool (default=False)

is this card double precision

Returns:
msg : str

the string representation of the card

class pyNastran.bdf.cards.properties.shell.PSHELL(pid, mid1=None, t=None, mid2=None, twelveIt3=1.0, mid3=None, tst=0.833333, nsm=0.0, z1=None, z2=None, mid4=None, comment='')[source]

Bases: pyNastran.bdf.cards.base_card.Property

1 2 3 4 5 6 7 8 9
PSHELL PID MID1 T MID2 12I/T**3 MID3 TS/T NSM
  Z1 Z2 MID4          
PSHELL 41111 1 1.0000 1   1   0.02081

Creates a PSHELL card

Parameters:
pid : int

property id

mid1 : int; default=None

defines membrane material defines element density (unless blank)

mid2 : int; default=None

defines bending material defines element density if mid1=None

mid3 : int; default=None

defines transverse shear material (only defined if mid2 > 0)

mid4 : int; default=None

defines membrane-bending coupling material (only defined if mid1 > 0 and mid2 > 0; can’t be mid1/mid2)

twelveIt3 : float; default=1.0

Bending moment of inertia ratio, 12I/T^3. Ratio of the actual bending moment inertia of the shell, I, to the bending moment of inertia of a homogeneous shell, T^3/12. The default value is for a homogeneous shell.

nsm : float; default=0.0

non-structural mass per unit area

z1 / z2 : float; default=None

fiber distance location 1/2 for stress/strain calculations z1 default : -t/2 if thickness is defined z2 default : t/2 if thickness is defined

comment : str; default=’‘

a comment for the card

MassPerArea(self, tflag=1, tscales=None)[source]

Calculates mass per area.

\[\]

rac{m}{A} = nsm + ho t

MassPerArea_no_xref(self, model, tflag=1, tscales=None)[source]

Calculates mass per area.

\[\]

rac{m}{A} = nsm + ho t

MassPerArea_structure(self)[source]

Calculates mass per area without considering non-structural mass.

\[\]

rac{m}{A} = nsm + ho t

Mid(self)[source]

returns the material id used for mass

Mid1(self)[source]

returns the extension material id

Mid2(self)[source]

returns the bending material id

Mid3(self)[source]
Mid4(self)[source]
Nsm(self)[source]

returns the non-structural mass

Rho(self)[source]

returns the material density

Thickness(self, tflag=1, tscales=None)[source]

returns the thickness of the element

classmethod add_card(card, comment='')[source]

Adds a PSHELL card from BDF.add_card(...)

Parameters:
card : BDFCard()

a BDFCard object

comment : str; default=’‘

a comment for the card

cross_reference(self, model)[source]

Cross links the card so referenced cards can be extracted directly

Parameters:
model : BDF()

the BDF object

classmethod export_to_hdf5(h5_file, model, pids)[source]

exports the properties in a vectorized way

get_ABD_matrices(self, theta_offset=0.0)[source]

Gets the ABD matrix

Parameters:
theta_offset : float

rotates the ABD matrix; measured in degrees

get_Qbar_matrix(self, mid_ref, theta=0.0)[source]

theta must be in radians

get_Sbar_matrix(self, mid_ref, theta=0.0)[source]

theta must be in radians

get_z_locations(self)[source]

returns the locations of the bottom and top surface of the shell

material_ids

returns the material ids

materials(self)[source]

returns the material objects referenced by the shell

mid2 = None

Material identification number for bending -1 for plane strin

mid_ref

returns the material used for mass

nsm = None

Non-structural Mass

pid = None

Property ID

pname_fid_map = {4: 't', 'T': 't', 6: 'twelveIt3', 8: 'tst'}
raw_fields(self)[source]
repr_fields(self)[source]

Gets the fields in their simplified form

Returns:
fields : List[varies]

the fields that define the card

t = None

thickness

tst = None

Transverse shear thickness ratio, . Ratio of the shear thickness, ts/t, to the membrane thickness of the shell, t. The default value is for a homogeneous shell.

twelveIt3 = None

Scales the moment of interia of the element based on the moment of interia for a plate

..math:: I = frac{12I}{t^3} I_{plate}

type = 'PSHELL'
uncross_reference(self)[source]

Removes cross-reference links

write_card(self, size=8, is_double=False)[source]

Writes the card with the specified width and precision

Parameters:
size : int (default=8)

size of the field; {8, 16}

is_double : bool (default=False)

is this card double precision

Returns:
msg : str

the string representation of the card

pyNastran.bdf.cards.properties.shell.get_2d_plate_transform(theta)[source]

theta must be in radians