示例#1
0
    def __call__(self, eps):
        I1 = df.tr(eps)
        J2 = 0.5 * df.tr(df.dot(eps, eps)) - 1.0 / 6.0 * df.tr(eps) * df.tr(eps)

        A = (self.T2 * I1) ** 2 + self.T3 * J2
        A_pos = max(A, 1.0e-14)

        return self.T1 * I1 + df.sqrt(A_pos) / (2.0 * self.k)
示例#2
0
 def flux_derivative(self, u, coeff):
     """First derivative of flux."""
     lmbda, mu = coeff
     Du = self.differential_op(u)
     I = Identity(u.cell().d)
     Dsigma = 2.0 * mu * div(Du) + dot(nabla_grad(lmbda), tr(Du) * I)
     if element_degree(u) >= 2:
         Dsigma += lmbda * div(tr(Du) * I)
     return Dsigma
示例#3
0
    def strain_energy(self, F_):

        F = self.Fe(F_)
        E = kinematics.GreenLagrangeStrain(F, isochoric=self.isochoric)
        W = self.lmbda / 2 * (dolfin.tr(E)**2) + self.mu * dolfin.tr(E * E)

        # Active stress
        Wactive = self.Wactive(F, diff=0)

        return W + Wactive
    def __init__(self, u):
        '''Deformation measures.'''

        self.d = d = len(u)
        self.I = I = Identity(d)
        self.F = F = variable(I + grad(u))

        self.C = C = F.T * F
        self.E = 0.5 * (C - I)
        self.J = det(F)

        self.I1 = tr(C)
        self.I2 = 0.5 * (tr(C)**2 - tr(C * C))
        self.I3 = det(C)
示例#5
0
    def strain_energy(self, F_):

        F = self.Fe(F_)

        dim = get_dimesion(F)
        gradu = F - dolfin.Identity(dim)
        epsilon = 0.5 * (gradu + gradu.T)
        W = self.lmbda / 2 * (dolfin.tr(epsilon)**2) + self.mu * dolfin.tr(
            epsilon * epsilon, )

        # Active stress
        Wactive = self.Wactive(F, diff=0)

        return W + Wactive
def _get_zero_form(block_function_space, index):
    zero = Constant(0.)
    assert len(index) in (1, 2)
    if len(index) == 2:
        test = TestFunction(block_function_space[0][index[0]],
                            block_function_space=block_function_space[0],
                            block_index=index[0])
        trial = TrialFunction(block_function_space[1][index[1]],
                              block_function_space=block_function_space[1],
                              block_index=index[1])
        len_test_shape = len(test.ufl_shape)
        len_trial_shape = len(trial.ufl_shape)
        assert len_test_shape in (0, 1, 2)
        assert len_trial_shape in (0, 1, 2)
        if len_test_shape == 0 and len_trial_shape == 0:
            return zero * test * trial * dx
        elif len_test_shape == 0 and len_trial_shape == 1:
            return zero * test * _vec_sum(trial) * dx
        elif len_test_shape == 0 and len_trial_shape == 2:
            return zero * test * tr(trial) * dx
        elif len_test_shape == 1 and len_trial_shape == 0:
            return zero * _vec_sum(test) * trial * dx
        elif len_test_shape == 1 and len_trial_shape == 1:
            return zero * inner(test, trial) * dx
        elif len_test_shape == 1 and len_trial_shape == 2:
            return zero * _vec_sum(test) * tr(trial) * dx
        elif len_test_shape == 2 and len_trial_shape == 0:
            return zero * tr(test) * trial * dx
        elif len_test_shape == 2 and len_trial_shape == 1:
            return zero * tr(test) * _vec_sum(trial) * dx
        elif len_test_shape == 2 and len_trial_shape == 2:
            return zero * inner(test, trial) * dx
        else:
            raise AssertionError("Invalid case in _get_zero_form.")
    else:
        test = TestFunction(block_function_space[0][index[0]],
                            block_function_space=block_function_space[0],
                            block_index=index[0])
        len_test_shape = len(test.ufl_shape)
        assert len_test_shape in (0, 1, 2)
        if len_test_shape == 0:
            return zero * test * dx
        elif len_test_shape == 1:
            return zero * _vec_sum(test) * dx
        elif len_test_shape == 2:
            return zero * tr(test) * dx
        else:
            raise AssertionError("Invalid case in _get_zero_form.")
示例#7
0
    def dw_int(self, u, v):
        """
        Construct internal energy.

        Parameters
        ----------
        u: TrialFunction

        v: TestFunction
        """
        # u TrialFunction (only in the linear case)
        assert isinstance(u, dlfn.function.argument.Argument)
        # v TestFunction
        assert isinstance(v, dlfn.function.argument.Argument)

        assert hasattr(self, "_elastic_ratio")
        assert hasattr(self, "_I")

        def sym_grad(w):
            return dlfn.Constant(0.5) * (grad(w).T + grad(w))

        sigma = self._elastic_ratio * dlfn.tr(sym_grad(u)) * self._I \
            + dlfn.Constant(2.0) * sym_grad(u)

        return inner(sigma, sym_grad(v))
示例#8
0
def Wactive_transversally(Ta, C, f0, eta=0.0):
    """
    Return active strain energy when activation is only
    working along the fibers, with a possible transverse
    component defined by eta

    Arguments
    ---------
    Ta : dolfin.Function or dolfin.Constant
        A scalar function representng the mangnitude of the
        active stress in the reference configuration (firt Pioala)
    C : ufl.Form
        The right Cauchy-Green deformation tensor
    f0 : dolfin.Function
        A vector function representng the direction of the
        active stress
    eta : float
        Amount of active stress in the transverse direction
        (relative to f0)
    """

    I4f = dolfin.inner(C * f0, f0)
    I1 = dolfin.tr(C)
    return dolfin.Constant(0.5) * Ta * ((I4f - 1) + eta * ((I1 - 3) -
                                                           (I4f - 1)))
示例#9
0
def get_residual_form(u, v, rho_e, method='RAMP'):

    df.dx = df.dx(metadata={"quadrature_degree": 4})
    # stiffness = rho_e/(1 + 8. * (1. - rho_e))

    if method == 'SIMP':
        stiffness = rho_e**3
    else:  #RAMP
        stiffness = rho_e / (1 + 8. * (1. - rho_e))

    # print('the value of stiffness is:', rho_e.vector().get_local())
    # Kinematics
    k = 3e1
    E = k * stiffness
    nu = 0.3
    mu, lmbda = (E / (2 * (1 + nu))), (E * nu / ((1 + nu) * (1 - 2 * nu)))

    d = len(u)
    I = df.Identity(d)  # Identity tensor
    F = I + df.grad(u)  # Deformation gradient
    C = F.T * F  # Right Cauchy-Green tensor

    E_ = 0.5 * (C - I)  # Green--Lagrange strain
    S = 2.0 * mu * E_ + lmbda * df.tr(E_) * df.Identity(
        d)  # stress tensor (C:eps)
    psi = 0.5 * df.inner(S, E_)  # 0.5*eps:C:eps

    # Total potential energy
    Pi = psi * df.dx
    # Solve weak problem obtained by differentiating Pi:
    res = df.derivative(Pi, u, v)
    return res
示例#10
0
def get_residual_form(u, v, rho_e, Th, k=199.5e9, alpha=15.4e-6):
    C = rho_e / (1 + 8. * (1. - rho_e))

    E = k * C  # C is the design variable, its values is from 0 to 1

    nu = 0.3  # Poisson's ratio
    Th = Th - df.Constant(20.)
    Th = 0.

    lambda_ = E * nu / (1. + nu) / (1 - 2 * nu)
    mu = E / 2 / (1 + nu)  #lame's parameters

    # Th = df.Constant(7)

    w_ij = 0.5 * (df.grad(u) + df.grad(u).T)
    v_ij = 0.5 * (df.grad(v) + df.grad(v).T)

    d = len(u)

    sigm = (lambda_ * df.tr(w_ij) - alpha *
            (3. * lambda_ + 2. * mu) * Th) * df.Identity(d) + 2 * mu * w_ij

    a = df.inner(sigm, v_ij) * df.dx

    return a
示例#11
0
    def dw_int(self, u, v):
        """
        Construct internal energy.

        Parameters
        ----------
        u: Function

        v: TestFunction
        """
        # u Function (in the nonlinear case)
        assert isinstance(u, dlfn.function.function.Function)
        # v TestFunction
        assert isinstance(v, dlfn.function.argument.Argument)

        assert hasattr(self, "_elastic_ratio")
        assert hasattr(self, "_I")

        # deformation gradient
        F = self._I + grad(u)
        # right Cauchy-Green tensor
        C = F.T * F

        # strain
        E = dlfn.Constant(0.5) * (C - self._I)
        # 2. Piola-Kirchhoff stress
        S = self._elastic_ratio * dlfn.tr(E) * self._I \
            + dlfn.Constant(2.0) * E

        dE = dlfn.Constant(0.5) * (F.T * grad(v) + grad(v).T * F)

        return inner(S, dE)
示例#12
0
def neumann_elasticity_data():
    '''
    Return:
        a  bilinear form in the neumann elasticity problem
        L  linear form in therein
        V  function space, where a, L are defined
        bc homog. dirichlet conditions for case where we want pos. def problem
        z  list of orthonormal vectors in the nullspace of A that form basis
           of ker(A)
    '''
    mesh = UnitSquareMesh(40, 40)

    V = VectorFunctionSpace(mesh, 'CG', 1)
    u = TrialFunction(V)
    v = TestFunction(V)

    f = Expression(('sin(pi*x[0])', 'cos(pi*x[1])'))

    epsilon = lambda u: sym(grad(u))

    # Material properties
    E, nu = 10.0, 0.3
    mu, lmbda = Constant(E/(2*(1 + nu))), Constant(E*nu/((1 + nu)*(1 - 2*nu)))

    sigma = lambda u: 2*mu*epsilon(u) + lmbda*tr(epsilon(u))*Identity(2)

    a = inner(sigma(u), epsilon(v))*dx
    L = inner(f, v)*dx  # Zero stress

    bc = DirichletBC(V, Constant((0, 0)), DomainBoundary())

    z0 = interpolate(Constant((1, 0)), V).vector()
    normalize(z0, 'l2')

    z1 = interpolate(Constant((0, 1)), V).vector()
    normalize(z1, 'l2')

    X = mesh.coordinates().reshape((-1, 2))
    c0, c1 = np.sum(X, axis=0)/len(X)
    z2 = interpolate(Expression(('x[1]-c1',
                                 '-(x[0]-c0)'), c0=c0, c1=c1), V).vector()
    normalize(z2, 'l2')

    z = [z0, z1, z2]

    # Check that this is orthonormal basis
    I = np.zeros((3, 3))
    for i, zi in enumerate(z):
        for j, zj in enumerate(z):
            I[i, j] = zi.inner(zj)

    print I
    print la.norm(I-np.eye(3))
    assert la.norm(I-np.eye(3)) < 1E-13

    return a, L, V, bc, z
示例#13
0
def cal_neoHookean(F, physParams):
    """
        neoHookean elastic energy density: psi
    """
    lmbda, mu = physParams.lmbda, physParams.mu
    ln = dl.ln
    J = dl.det(F)
    Ic = dl.tr(F.T * F)  # Invariants of deformation tensors
    return (lmbda / 4) * (J**2 - 2 * ln(J) - 1) + (mu / 2) * (Ic -
                                                              2) - mu * ln(J)
示例#14
0
文件: Wale.py 项目: ChaliZhg/Oasis
def les_setup(u_, mesh, Wale, bcs, CG1Function, nut_krylov_solver, **NS_namespace):
    """Set up for solving Wale LES model
    """
    DG = FunctionSpace(mesh, "DG", 0)
    CG1 = FunctionSpace(mesh, "CG", 1)
    delta = Function(DG)
    delta.vector().zero()
    delta.vector().axpy(1.0, assemble(TestFunction(DG)*dx))
    Gij = grad(u_)
    Sij = sym(Gij)
    Skk = tr(Sij)
    dim = mesh.geometry().dim()
    Sd = sym(Gij*Gij) - 1./3.*Identity(mesh.geometry().dim())*Skk*Skk 
    nut_form = Wale['Cw']**2 * pow(delta, 2./dim) * pow(inner(Sd, Sd), 1.5) / (Max(pow(inner(Sij, Sij), 2.5) + pow(inner(Sd, Sd), 1.25), 1e-6))
    ff = FacetFunction("size_t", mesh, 0)
    bcs_nut = derived_bcs(CG1, bcs['u0'], u_)
    nut_ = CG1Function(nut_form, mesh, method=nut_krylov_solver, bcs=bcs_nut, name='nut', bounded=True)
    return dict(Sij=Sij, Sd=Sd, Skk=Skk, nut_=nut_, delta=delta, bcs_nut=bcs_nut)
示例#15
0
def les_setup(u_, mesh, Wale, bcs, CG1Function, nut_krylov_solver, **NS_namespace):
    """Set up for solving Wale LES model
    """
    DG = FunctionSpace(mesh, "DG", 0)
    CG1 = FunctionSpace(mesh, "CG", 1)
    
    # Compute cell size and put in delta
    delta = Function(DG)
    delta.vector().zero()
    delta.vector().axpy(1.0, assemble(TestFunction(DG)*dx))
    
    # Set up Wale form
    Gij = grad(u_)
    Sij = sym(Gij)
    Skk = tr(Sij)
    dim = mesh.geometry().dim()
    Sd = sym(Gij*Gij) - 1./3.*Identity(mesh.geometry().dim())*Skk*Skk 
    nut_form = Wale['Cw']**2 * pow(delta, 2./dim) * pow(inner(Sd, Sd), 1.5) / (Max(pow(inner(Sij, Sij), 2.5) + pow(inner(Sd, Sd), 1.25), 1e-6))
    ff = FacetFunction("size_t", mesh, 0)
    bcs_nut = derived_bcs(CG1, bcs['u0'], u_)
    nut_ = CG1Function(nut_form, mesh, method=nut_krylov_solver, bcs=bcs_nut, name='nut', bounded=True)
    return dict(Sij=Sij, Sd=Sd, Skk=Skk, nut_=nut_, delta=delta, bcs_nut=bcs_nut)
示例#16
0
    def initialize_with_field(self, u):
        super().initialize_with_field(u)

        I = Identity(len(u))
        eps = sym(grad(u))

        for m in self.material_parameters:

            E = m.get('E', None)
            nu = m.get('nu', None)

            mu = m.get('mu', None)
            lm = m.get('lm', None)

            if mu is None:
                if E is None or nu is None:
                    raise RuntimeError(
                        'Material model requires parameter "mu"; '
                        'otherwise, require parameters "E" and "nu".')

                mu = E / (2 * (1 + nu))

            if lm is None:
                if E is None or nu is None:
                    raise RuntimeError(
                        'Material model requires parameter "lm"; '
                        'otherwise, require parameters "E" and "nu".')

                lm = E * nu / ((1 + nu) * (1 - 2 * nu))

            sig = 2 * mu * eps + lm * tr(eps) * I
            psi = 0.5 * inner(sig, eps)

            self.psi.append(psi)
            self.pk1.append(sig)
            self.pk2.append(sig)
示例#17
0
def stress_strain(eps):
    return lambda_*dolfin.tr(eps)*I2+2*mu*eps
示例#18
0
 def sigma(v):
     return 2.0 * mu * sym(grad(v)) + lmbda * tr(sym(
         grad(v))) * Identity(2)
示例#19
0
 def STVK(U, alfa_mu, alfa_lam):
     return alfa_lam * tr(eps(U)) * Identity(
         len(U)) + 2.0 * alfa_mu * eps(U)
    def __init__(self, mesh):

        self.mesh = mesh

        # Write mesh to file (for debugging only)
        # write_mesh(self.mesh, '/tmp/meshfromslicer.vtu')

        # define function space
        element_degree = 1
        quadrature_degree = element_degree + 1
        print("Degree of element: ", element_degree)
        print("Degree of quadrature: ", quadrature_degree)
        self.V = dolfin.VectorFunctionSpace(self.mesh, "Lagrange",
                                            element_degree)

        # Mark boundary subdomains
        zmin = min(self.mesh.coordinates()[:, 2])
        zmax = max(self.mesh.coordinates()[:, 2])
        print("zmin:", zmin)
        print("zmax:", zmax)
        bot = dolfin.CompiledSubDomain("near(x[2], side) && on_boundary",
                                       side=zmin)
        top = dolfin.CompiledSubDomain("near(x[2], side) && on_boundary",
                                       side=zmax)

        # Define Dirichlet boundary (z = 0 or z = 1)
        c = dolfin.Constant((0.0, 0.0, 0.0))
        self.r = dolfin.Expression((
            "scale*(x0 + (x[0] - x0)*cos(theta) - (x[1] - y0)*sin(theta) - x[0])",
            "scale*(y0 + (x[0] - x0)*sin(theta) + (x[1] - y0)*cos(theta) - x[1])",
            "displacement"),
                                   scale=1.0,
                                   x0=0.5,
                                   y0=0.5,
                                   theta=0.0,
                                   displacement=0.0,
                                   degree=2)

        self.bcs = [
            dolfin.DirichletBC(self.V, c, bot),
            dolfin.DirichletBC(self.V, self.r, top)
        ]

        # Define functions
        du = dolfin.TrialFunction(self.V)  # Incremental displacement
        v = dolfin.TestFunction(self.V)  # Test function
        # Displacement from previous iteration
        self.u = dolfin.Function(self.V)
        # Body force per unit volume
        self.B = dolfin.Constant((0.0, 0.0, 0.0))
        # Traction force on the boundary
        self.T = dolfin.Constant((0.0, 0.0, 0.0))

        # Kinematics
        d = len(self.u)
        I = dolfin.Identity(d)  # Identity tensor
        F = I + dolfin.grad(self.u)  # Deformation gradient
        C = F.T * F  # Right Cauchy-Green tensor

        # Invariants of deformation tensors
        Ic = dolfin.tr(C)
        J = dolfin.det(F)

        # Elasticity parameters
        E = 10.0
        nu = 0.3
        mu = dolfin.Constant(E / (2 * (1 + nu)))
        lmbda = dolfin.Constant(E * nu / ((1 + nu) * (1 - 2 * nu)))

        # Stored strain energy density (compressible neo-Hookean model)
        psi = (mu / 2) * (Ic - 3) - mu * dolfin.ln(J) + (lmbda /
                                                         2) * (dolfin.ln(J))**2

        dx = dolfin.Measure("dx",
                            domain=mesh,
                            metadata={'quadrature_degree': quadrature_degree})
        ds = dolfin.Measure("ds",
                            domain=mesh,
                            metadata={'quadrature_degree': quadrature_degree})
        print(dx)
        print(ds)
        Pi = psi*dx - dolfin.dot(self.B, self.u)*dx - \
            dolfin.dot(self.T, self.u)*ds
        self.F = dolfin.derivative(Pi, self.u, v)
        self.J = dolfin.derivative(self.F, self.u, du)
def stress(eps, lamb, mu):
    return lamb * dolfin.tr(eps) * dolfin.Identity(
        mesh.geometric_dimension()) + 2 * mu * eps
示例#22
0
def get_residual_form(u,
                      v,
                      rho_e,
                      V_density,
                      tractionBC,
                      T,
                      iteration_number,
                      additive='strain',
                      k=8.,
                      method='RAMP'):

    df.dx = df.dx(metadata={"quadrature_degree": 4})
    # stiffness = rho_e/(1 + 8. * (1. - rho_e))

    if method == 'SIMP':
        stiffness = rho_e**3
    else:
        stiffness = rho_e / (1 + 8. * (1. - rho_e))

    # print('the value of stiffness is:', rho_e.vector().get_local())
    # Kinematics
    d = len(u)
    I = df.Identity(d)  # Identity tensor
    F = I + df.grad(u)  # Deformation gradient
    C = F.T * F  # Right Cauchy-Green tensor
    # Invariants of deformation tensors
    Ic = df.tr(C)
    J = df.det(F)
    stiffen_pow = 1.
    threshold_vol = 1.

    eps_star = 0.05
    # print("eps_star--------")

    if additive == 'strain':
        print("additive == strain")

        if iteration_number == 1:
            print('iteration_number == 1')
            eps = df.sym(df.grad(u))
            eps_dev = eps - 1 / 3 * df.tr(eps) * df.Identity(2)
            eps_eq = df.sqrt(2.0 / 3.0 * df.inner(eps_dev, eps_dev))
            # eps_eq_proj = df.project(eps_eq, density_function_space)
            ratio = eps_eq / eps_star
            ratio_proj = df.project(ratio, V_density)

            c1_e = k * (5.e-2) / (1 + 8. * (1. - (5.e-2))) / 6

            c2_e = df.Function(V_density)
            c2_e.vector().set_local(5e-4 * np.ones(V_density.dim()))

            fFile = df.HDF5File(df.MPI.comm_world, "c2_e_proj.h5", "w")
            fFile.write(c2_e, "/f")
            fFile.close()

            fFile = df.HDF5File(df.MPI.comm_world, "ratio_proj.h5", "w")
            fFile.write(ratio_proj, "/f")
            fFile.close()
            iteration_number += 1
            E = k * stiffness
            phi_add = (1 - stiffness) * ((c1_e * (Ic - 3)) + (c2_e *
                                                              (Ic - 3))**2)

        else:
            ratio_proj = df.Function(V_density)
            fFile = df.HDF5File(df.MPI.comm_world, "ratio_proj.h5", "r")
            fFile.read(ratio_proj, "/f")
            fFile.close()

            c2_e = df.Function(V_density)
            fFile = df.HDF5File(df.MPI.comm_world, "c2_e_proj.h5", "r")
            fFile.read(c2_e, "/f")
            fFile.close()
            c1_e = k * (5.e-2) / (1 + 8. * (1. - (5.e-2))) / 6

            c2_e = df.conditional(df.le(ratio_proj, eps_star),
                                  c2_e * df.sqrt(ratio_proj),
                                  c2_e * (ratio_proj**3))
            phi_add = (1 - stiffness) * ((c1_e * (Ic - 3)) + (c2_e *
                                                              (Ic - 3))**2)
            E = k * stiffness

            c2_e_proj = df.project(c2_e, V_density)
            print('c2_e projected -------------')

            eps = df.sym(df.grad(u))
            eps_dev = eps - 1 / 3 * df.tr(eps) * df.Identity(2)
            eps_eq = df.sqrt(2.0 / 3.0 * df.inner(eps_dev, eps_dev))
            # eps_eq_proj = df.project(eps_eq, V_density)
            ratio = eps_eq / eps_star
            ratio_proj = df.project(ratio, V_density)

            fFile = df.HDF5File(df.MPI.comm_world, "c2_e_proj.h5", "w")
            fFile.write(c2_e_proj, "/f")
            fFile.close()

            fFile = df.HDF5File(df.MPI.comm_world, "ratio_proj.h5", "w")
            fFile.write(ratio_proj, "/f")
            fFile.close()

    elif additive == 'vol':
        print("additive == vol")
        stiffness = stiffness / (df.det(F)**stiffen_pow)

        # stiffness = df.conditional(df.le(df.det(F),threshold_vol), (stiffness/(df.det(F)/threshold_vol))**stiffen_pow, stiffness)
        E = k * stiffness

    elif additive == 'False':
        print("additive == False")
        E = k * stiffness  # rho_e is the design variable, its values is from 0 to 1

    nu = 0.4  # Poisson's ratio

    lambda_ = E * nu / (1. + nu) / (1 - 2 * nu)
    mu = E / 2 / (1 + nu)  #lame's parameters

    # Stored strain energy density (compressible neo-Hookean model)
    psi = (mu / 2) * (Ic - 3) - mu * df.ln(J) + (lambda_ / 2) * (df.ln(J))**2
    # print('the length of psi is:',len(psi.vector()))
    if additive == 'strain':
        psi += phi_add
    B = df.Constant((0.0, 0.0))

    # Total potential energy
    '''The first term in this equation provided this error'''
    Pi = psi * df.dx - df.dot(B, u) * df.dx - df.dot(T, u) * tractionBC

    res = df.derivative(Pi, u, v)

    return res
示例#23
0
    def _I1(self, F):

        C = RightCauchyGreen(F, self._isochoric)
        I1 = tr(C)
        return I1
示例#24
0
 def flux(self, u, coeff):
     lmbda, mu = coeff
     Du = self.differential_op(u)
     I = Identity(u.cell().d)
     return 2.0 * mu * Du + lmbda * tr(Du) * I
示例#25
0
bcs.append(DirichletBC(Vz, zero, fixed_vertex_010, "pointwise"))

### Define hyperelastic material model

material_parameters = {'E': Constant(1.0), 'nu': Constant(0.0)}

E, nu = material_parameters.values()

d = len(u)  # Displacement dimension

I = dolfin.Identity(d)
F = dolfin.variable(I + dolfin.grad(u))

C = F.T * F
J = dolfin.det(F)
I1 = dolfin.tr(C)

# Lame material parameters
lm = E * nu / ((1.0 + nu) * (1.0 - 2.0 * nu))
mu = E / (2.0 + 2.0 * nu)

# Energy density of a Neo-Hookean material model
psi = (mu / 2.0) * (I1 - d - 2.0 * dolfin.ln(J)) + (lm / 2.0) * dolfin.ln(J)**2

# First Piola-Kirchhoff
pk1 = dolfin.diff(psi, F)

# Boundary traction
N = dolfin.FacetNormal(mesh)
PN = dolfin.dot(pk1, N)
示例#26
0
 def _I2(self, F):
     C = RightCauchyGreen(F, self._isochoric)
     return 0.5 * (self._I1(F) * self._I1(F) - tr(C * C))
示例#27
0
def I2(F, isochoric=False):
    C = RightCauchyGreen(F, isochoric)
    return 0.5 * (I1(F) * I1(F) - tr(C * C))
示例#28
0
def I1(F, isochoric=False):

    C = RightCauchyGreen(F, isochoric)
    I1 = tr(C)
    return I1
示例#29
0
 def sigma(v):
     return lmbda * fe.tr(eps(v)) * fe.Identity(2) + 2.0 * mu * eps(v)
示例#30
0
def S(U, lamda_s, mu_s):
    I = Identity(len(U))
    return 2 * mu_s * E(U) + lamda_s * tr(E(U)) * I
示例#31
0
## Next make a function space
V = d.VectorFunctionSpace(mesh, 'Lagrange', 1)

# Create a test function and a trial function, and a source term:
u = d.TrialFunction(V)
w = d.TestFunction(V)
b = d.Constant((1.0,0.,0.))

# Elasticity parameters:
E, nu = 10., 0.3
mu, lambda_param = E / (2. * (1.+nu)), E * nu / ((1. + nu) * (1.-2. * nu))

# Stress tensor:
# + usually of form \sigma_{ij} = \lambda e_{kk}\delta_{ij} + 2\mu e_{ij},
# + or                          = \lambda Tr(e_{ij})I + 2\mu e_{ij}, for e_{ij} the strain tensor.
sigma = lambda_param*d.tr(d.grad(u)) * d.Identity(w.cell().d) + 2 * mu * d.sym(d.grad(u))

# Governing balance equation:
F = d.inner(sigma, d.grad(w)) * d.dx - d.dot(b,w)*d.dx

# Extract the bi- and linear forms from F:
a = d.lhs(F)
L = d.rhs(F)

# Dirichlet BC on entire boundary:
c = d.Constant((0.,0.,0.))
bc = d.DirichletBC(V, c, d.DomainBoundary())

## Testing some new boundary definitions:
def bzo_boundary(r_vec, on_boundary):
示例#32
0
# Th = df.Constant(7)
I = df.Identity(len(displacements_function))

# w_ij = 0.5 * (df.grad(displacements_function) + df.grad(displacements_function).T) - ALPHA * I * temperature_function
# sigm = lambda_*df.div(displacements_function)* I + 2*mu*w_ij
# s = sigm - (1./3)*df.tr(sigm)*I
# von_Mises = df.sqrt(3./2*df.inner(s, s))
# von_Mises_form = (1/df.CellVolume(mesh)) * von_Mises * df.TestFunction(density_function_space) * df.dx

# T = df.TensorFunctionSpace(mesh, "CG", 1)
# T.vector.set_local()
T_00 = df.Constant(20)
w_ij = 0.5 * (df.grad(displacements_function) + df.grad(
    displacements_function).T) - C * ALPHA * I * (temperature_function - T_00)
sigm = lambda_ * df.div(displacements_function) * I + 2 * mu * w_ij
s = sigm - (1. / 3) * df.tr(sigm) * I
scalar_ = 5e8
# scalar_ = 5e5
von_Mises = df.sqrt(3. / 2 * df.inner(s / scalar_, s / scalar_))
von_Mises_form = (1 / df.CellVolume(mesh)) * von_Mises * df.TestFunction(
    density_function_space) * df.dx
# von_Mises_form =  von_Mises * df.TestFunction(density_function_space) /volume * df.dx
pde_problem.add_field_output('von_Mises', von_Mises_form, 'mixed_states',
                             'density')

x
'''
4. 3. Add bcs
'''

bc_displacements = df.DirichletBC(
示例#33
0
    def sigma(self):
        eps, E, nu = self.eps(), self.mat.E, self.mat.nu
        lmbda = E * nu / (1.0 + nu) / (1.0 - 2.0 * nu)
        mu = E / 2.0 / (1.0 + nu)

        return 2 * mu * eps + lmbda * df.tr(eps) * df.Identity(self.mesh.geometric_dimension())
示例#34
0
def stress_strain(eps, lambda_, mu):
    I = dolfin.Identity(DIM)
    return lambda_ * dolfin.tr(eps) * I + 2 * mu * eps
示例#35
0
	def sigma(self, uu):
		return 2.*self.mu*self.epsilon(uu) + self.ll*dolfin.tr(self.epsilon(uu))*dolfin.Identity(self.basedim)