116 KiB
116 KiB
In [1]:
import numpy as np
import igl
import meshplot as mp
import time
import torch
import sys as _sys
_sys.path.append("../src")
from elasticsolid import *
from elasticenergy import *
from vis_utils import *
from matplotlib import gridspec
import matplotlib.pyplot as plt
torch.set_default_dtype(torch.float64)
shadingOptions = {
"flat":True,
"wireframe":False,
}
rot = np.array(
[[1, 0, 0 ],
[0, 0, 1],
[0, -1, 0 ]]
)In [2]:
vNP, _, _, tNP, _, _ = igl.read_obj("../data/beam.obj")
aabb = np.max(vNP, axis=0) - np.min(vNP, axis=0)
v = torch.tensor(vNP)In [3]:
rho = 131 # [kg.m-3]
young = 10e6 # [Pa]
poisson = 0.2
force_mass = torch.zeros(size = (3,))
force_mass[2] = - rho * 9.81
minX = torch.min(v[:, 0])
pin_idx = torch.arange(v.shape[0])[v[:, 0] < minX + 0.2*aabb[0]]
ee_lin = LinearElasticEnergy(young, poisson)
ee_neo = NeoHookeanElasticEnergy(young, poisson)
solid_lin = ElasticSolid(v, tNP, ee_lin, rho=rho, pin_idx=pin_idx, f_mass=force_mass)
solid_neo = ElasticSolid(v, tNP, ee_neo, rho=rho, pin_idx=pin_idx, f_mass=force_mass)
In [4]:
solid_lin.update_def_shape(v)
solid_neo.update_def_shape(v)
fd_validation_elastic(solid_lin)
fd_validation_elastic(solid_neo)In [5]:
maxX = torch.max(v[:, 0])
f_point_idx = torch.arange(v.shape[0])[v[:, 0] > maxX - 0.01*aabb[0]]
f_point = torch.zeros(size=(f_point_idx.shape[0], 3))
f_point[:, 2] = -5e3
solid_lin.add_point_load(f_point_idx, f_point)
solid_neo.add_point_load(f_point_idx, f_point)
solid_lin.update_def_shape(v)
solid_neo.update_def_shape(v)
fd_validation_ext(solid_lin)
fd_validation_ext(solid_neo)In [6]:
solid_lin.update_def_shape(v)
solid_neo.update_def_shape(v)
fd_validation_elastic_differentials(solid_lin)
fd_validation_elastic_differentials(solid_neo)