编写三维8节点和20节点等参单元程序
时间: 2024-03-10 16:45:41 浏览: 315
以下是三维8节点和20节点等参单元程序的示例代码:
```python
import numpy as np
# 8节点等参单元
class Element8:
def __init__(self, nodes):
self.nodes = nodes
def shape_func(self, xi, eta, zeta):
N = np.zeros((8, 1))
N[0] = (1 - xi) * (1 - eta) * (1 - zeta) / 8
N[1] = (1 + xi) * (1 - eta) * (1 - zeta) / 8
N[2] = (1 + xi) * (1 + eta) * (1 - zeta) / 8
N[3] = (1 - xi) * (1 + eta) * (1 - zeta) / 8
N[4] = (1 - xi) * (1 - eta) * (1 + zeta) / 8
N[5] = (1 + xi) * (1 - eta) * (1 + zeta) / 8
N[6] = (1 + xi) * (1 + eta) * (1 + zeta) / 8
N[7] = (1 - xi) * (1 + eta) * (1 + zeta) / 8
return N
def jacobian(self, xi, eta, zeta):
J = np.zeros((3, 3))
J[0, :] = (-self.nodes[0] + self.nodes[1] + self.nodes[2] - self.nodes[3] - self.nodes[4] + self.nodes[5] + self.nodes[6] - self.nodes[7]) / 8
J[1, :] = (-self.nodes[0] - self.nodes[1] + self.nodes[2] + self.nodes[3] - self.nodes[4] - self.nodes[5] + self.nodes[6] + self.nodes[7]) / 8
J[2, :] = (-self.nodes[0] - self.nodes[1] - self.nodes[2] - self.nodes[3] + self.nodes[4] + self.nodes[5] + self.nodes[6] + self.nodes[7]) / 8
return J
# 20节点等参单元
class Element20:
def __init__(self, nodes):
self.nodes = nodes
def shape_func(self, xi, eta, zeta):
N = np.zeros((20, 1))
N[0] = (1 - xi) * (1 - eta) * (1 - zeta) * (-xi - eta - zeta - 2) / 8
N[1] = (1 + xi) * (1 - eta) * (1 - zeta) * (xi - eta - zeta - 2) / 8
N[2] = (1 + xi) * (1 + eta) * (1 - zeta) * (xi + eta - zeta - 2) / 8
N[3] = (1 - xi) * (1 + eta) * (1 - zeta) * (-xi + eta - zeta - 2) / 8
N[4] = (1 - xi) * (1 - eta) * (1 + zeta) * (-xi - eta + zeta - 2) / 8
N[5] = (1 + xi) * (1 - eta) * (1 + zeta) * (xi - eta + zeta - 2) / 8
N[6] = (1 + xi) * (1 + eta) * (1 + zeta) * (xi + eta + zeta - 2) / 8
N[7] = (1 - xi) * (1 + eta) * (1 + zeta) * (-xi + eta + zeta - 2) / 8
N[8] = (1 - xi ** 2) * (1 - eta) * (1 - zeta) / 4
N[9] = (1 + xi) * (1 - eta ** 2) * (1 - zeta) / 4
N[10] = (1 - xi ** 2) * (1 + eta) * (1 - zeta) / 4
N[11] = (1 - xi) * (1 - eta ** 2) * (1 - zeta) / 4
N[12] = (1 - xi) * (1 - eta) * (1 - zeta ** 2) / 4
N[13] = (1 + xi) * (1 - eta) * (1 - zeta ** 2) / 4
N[14] = (1 + xi) * (1 + eta) * (1 - zeta ** 2) / 4
N[15] = (1 - xi) * (1 + eta) * (1 - zeta ** 2) / 4
N[16] = (1 - xi ** 2) * (1 - eta) * (1 + zeta) / 4
N[17] = (1 + xi) * (1 - eta ** 2) * (1 + zeta) / 4
N[18] = (1 - xi ** 2) * (1 + eta) * (1 + zeta) / 4
N[19] = (1 - xi) * (1 - eta ** 2) * (1 + zeta) / 4
return N
def jacobian(self, xi, eta, zeta):
J = np.zeros((3, 3))
for i in range(20):
J[0, :] += self.nodes[i, :] * (1 + eta * self.shape_func(xi, eta, zeta)[i]) * (1 + zeta * self.shape_func(xi, eta, zeta)[i])
J[1, :] += self.nodes[i, :] * (1 + xi * self.shape_func(xi, eta, zeta)[i]) * (1 + zeta * self.shape_func(xi, eta, zeta)[i])
J[2, :] += self.nodes[i, :] * (1 + xi * self.shape_func(xi, eta, zeta)[i]) * (1 + eta * self.shape_func(xi, eta, zeta)[i])
return J
```
在以上代码中,Element8 类和 Element20 类分别表示三维8节点和20节点等参单元。它们都包含了 shape_func 方法和 jacobian 方法。
shape_func 方法用于计算单元内任意位置的形函数值。它接受三个输入参数:xi、eta 和 zeta,表示单元内的局部坐标。该方法返回一个包含所有节点形函数值的向量。
jacobian 方法用于计算单元内任意位置的雅可比矩阵。它接受三个输入参数:xi、eta 和 zeta,表示单元内的局部坐标。该方法返回一个3x3的矩阵,表示该位置的雅可比矩阵。
以上代码仅为示例,请根据具体情况进行修改和完善。
阅读全文