Source code for modelos.material

from .elastic import Elastic
from .hardening import Hardening
from .plastic import Plastic
from .tensortypes import Vetor6x1
from .funcs import octa, desv, epsV, vetor_para_linha, tensor
import numpy as np


[docs] class Material(Plastic, Elastic, Hardening): """Classe do modelo de Material, que pode possuir os metodos dos modelos: - `Elastic` - `Hardening` - `Plastic` """ def __init__(self, sigma0: Vetor6x1, epsilon0: Vetor6x1) -> None: self.sigma = sigma0 self.epsilon = epsilon0
[docs] def update_state( self, sigma: Vetor6x1, depsilon: Vetor6x1 | None = None, depsilonP: Vetor6x1 | None = None, ) -> None: """Atualiza as variaveis de estado do material""" self.sigma = sigma self.p = octa(self.sigma) self.q = desv(self.sigma) if depsilon is not None: self.e -= (1 + self.e) * epsV(depsilon) self.epsilon += depsilon if depsilonP is not None: self.update_hardening(depsilonP)
[docs] def apply_strain(self, deps: Vetor6x1) -> list[float]: """Aplica incremento de deformação e retorna novo estado do material em uma lista de valores Ordem dos valores de retorno: `Sx`, `Sy`, `Sz`, `Txy`, `Tyz`, `Tzx`, `Ex`, `Ey`, `Ez`, `Gxy`, `Gyz`, `Gzx`, `e`, `s`, `Ev`, `Eq`, `Eve`, `Eqe`, `Evp`, `Eqp`, `p`, `q`, `f`, `qui`, `S1`, `S2`, `S3` """ sig = self.sigma # Tentativa elastica De = self.matriz_elastica() dsig = De @ deps sig += dsig # Atualiza estado de tensao e grava self.update_state(sig) # TODO: verificar se precisa fazer isso (isso atualiza a De). # Correcao plastica f: float = self.func_plastica() depsP: Vetor6x1 = np.zeros((6, 1)) chi: float = 0 if f > 0: chi: float = self.multiplicador_plastico(deps) nablaG: Vetor6x1 = self.grad_g() depsP: Vetor6x1 = chi * nablaG sig -= De @ depsP self.update_state(sig, deps, depsP) # Deformacoes volumetrica e desviadora depsV = epsV(deps) depsQ = desv(deps) depsVP = epsV(depsP) depsQP = desv(depsP) depsVE = depsV - depsVP depsQE = depsQ - depsQP S3, S2, S1 = sorted( [float(s) for s in np.linalg.eig(tensor(self.sigma)).eigenvalues] ) return ( vetor_para_linha(self.sigma) + vetor_para_linha(self.epsilon) + [ self.e, self.s, depsV, depsQ, depsVE, depsQE, depsVP, depsQP, self.p, self.q, f, chi, S1, S2, S3, ] )