Showing preview only (2,975K chars total). Download the full file or copy to clipboard to get everything.
Repository: phys-sim-book/solid-sim-tutorial
Branch: main
Commit: f463ddc4cb51
Files: 141
Total size: 2.8 MB
Directory structure:
gitextract_jxhlhlxe/
├── .gitignore
├── .python-version
├── 0_getting_started/
│ ├── readme.md
│ ├── simulator0.py
│ ├── simulator1.py
│ ├── simulator2.py
│ └── square_mesh.py
├── 10_mpm_elasticity/
│ ├── readme.md
│ └── simulator.py
├── 11_mpm_plastic/
│ ├── readme.md
│ ├── simulator.py
│ └── simulator_viscoplastic.py
├── 11_mpm_sand/
│ ├── readme.md
│ └── simulator.py
├── 12_pbd_cloth/
│ ├── cloth_data.json
│ ├── constraints/
│ │ ├── __init__.py
│ │ ├── bending.py
│ │ └── stretching.py
│ ├── imgui.ini
│ ├── main.py
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── cloth_utils.py
│ │ ├── constraint_finder.py
│ │ └── mesh_loader.py
│ └── xpbd_base.py
├── 13_pbd_mesh/
│ ├── constraints/
│ │ ├── __init__.py
│ │ ├── edge.py
│ │ └── volume.py
│ ├── dragon_data.json
│ ├── imgui.ini
│ ├── main.py
│ ├── skinning/
│ │ ├── __init__.py
│ │ ├── hash_grid.py
│ │ └── skinning.py
│ └── xpbd_base.py
├── 14_pbf/
│ ├── constraints/
│ │ ├── __init__.py
│ │ ├── density.py
│ │ ├── viscosity.py
│ │ └── vorticity.py
│ ├── main.py
│ ├── scene.py
│ └── sph_base.py
├── 1_mass_spring/
│ ├── InertiaEnergy.py
│ ├── MassSpringEnergy.py
│ ├── readme.md
│ ├── simulator.py
│ ├── square_mesh.py
│ ├── time_integrator.py
│ └── utils.py
├── 2_dirichlet/
│ ├── GravityEnergy.py
│ ├── InertiaEnergy.py
│ ├── MassSpringEnergy.py
│ ├── readme.md
│ ├── simulator.py
│ ├── square_mesh.py
│ ├── time_integrator.py
│ └── utils.py
├── 3_contact/
│ ├── BarrierEnergy.py
│ ├── GravityEnergy.py
│ ├── InertiaEnergy.py
│ ├── MassSpringEnergy.py
│ ├── readme.md
│ ├── simulator.py
│ ├── square_mesh.py
│ ├── time_integrator.py
│ └── utils.py
├── 4_friction/
│ ├── BarrierEnergy.py
│ ├── FrictionEnergy.py
│ ├── GravityEnergy.py
│ ├── InertiaEnergy.py
│ ├── MassSpringEnergy.py
│ ├── readme.md
│ ├── simulator.py
│ ├── square_mesh.py
│ ├── time_integrator.py
│ └── utils.py
├── 5_mov_dirichlet/
│ ├── BarrierEnergy.py
│ ├── FrictionEnergy.py
│ ├── GravityEnergy.py
│ ├── InertiaEnergy.py
│ ├── MassSpringEnergy.py
│ ├── SpringEnergy.py
│ ├── readme.md
│ ├── simulator.py
│ ├── square_mesh.py
│ ├── time_integrator.py
│ └── utils.py
├── 6_inv_free/
│ ├── BarrierEnergy.py
│ ├── FrictionEnergy.py
│ ├── GravityEnergy.py
│ ├── InertiaEnergy.py
│ ├── NeoHookeanEnergy.py
│ ├── SpringEnergy.py
│ ├── readme.md
│ ├── simulator.py
│ ├── square_mesh.py
│ ├── time_integrator.py
│ └── utils.py
├── 7_self_contact/
│ ├── BarrierEnergy.py
│ ├── FrictionEnergy.py
│ ├── GravityEnergy.py
│ ├── InertiaEnergy.py
│ ├── NeoHookeanEnergy.py
│ ├── SpringEnergy.py
│ ├── distance/
│ │ ├── CCD.py
│ │ ├── PointEdgeDistance.py
│ │ ├── PointLineDistance.py
│ │ └── PointPointDistance.py
│ ├── readme.md
│ ├── simulator.py
│ ├── square_mesh.py
│ ├── time_integrator.py
│ └── utils.py
├── 8_self_friction/
│ ├── BarrierEnergy.py
│ ├── FrictionEnergy.py
│ ├── GravityEnergy.py
│ ├── InertiaEnergy.py
│ ├── NeoHookeanEnergy.py
│ ├── SpringEnergy.py
│ ├── distance/
│ │ ├── CCD.py
│ │ ├── PointEdgeDistance.py
│ │ ├── PointLineDistance.py
│ │ └── PointPointDistance.py
│ ├── readme.md
│ ├── simulator.py
│ ├── square_mesh.py
│ ├── time_integrator.py
│ └── utils.py
├── 9_reduced_DOF/
│ ├── BarrierEnergy.py
│ ├── GravityEnergy.py
│ ├── InertiaEnergy.py
│ ├── NeoHookeanEnergy.py
│ ├── linear.py
│ ├── readme.md
│ ├── simulator.py
│ ├── square_mesh.py
│ ├── time_integrator.py
│ └── utils.py
├── LICENSE
├── pyproject.toml
└── readme.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
.DS_Store
test.py
*.pyc
output/
================================================
FILE: .python-version
================================================
3.13
================================================
FILE: 0_getting_started/readme.md
================================================
# Getting Started with Solid Simulation
Free fall, spring, and mass-spring solid simulation with symplectic Euler time integration.
## Dependencies
```
pip install numpy scipy pygame
```
## Run
Free falling particle:
```
python simulator0.py
```
Hanging particle:
```
python simulator1.py
```
Hanging square:
```
python simulator2.py
```
================================================
FILE: 0_getting_started/simulator0.py
================================================
# Free Fall Simulation
import math
import numpy as np # for vector data structure and computations
import pygame # for visualization
# simulation setup
x = np.array([0.0, 0.0]) # position of particle
v = np.array([0.0, 0.0]) # velocity of particle
g = np.array([0.0, -10.0]) # gravitational acceleration
h = 0.01 # time step size in seconds
# visualization/rendering setup
pygame.init()
render_FPS = 100 # number of frames to render per second
resolution = np.array([900, 900]) # visualization window size in pixels
offset = resolution / 2 # offset between window coordinates and simulated coordinates
scale = 200 # scale between window coordinates and simulated coordinates
def screen_projection(x): # convert simulated coordinates to window coordinates
return [offset[0] + scale * x[0], resolution[1] - (offset[1] + scale * x[1])]
screen = pygame.display.set_mode(resolution) # initialize visualizer
time_step = 0 # the number of the current time step
running = True # flag indicating whether the simulation is still running
while running:
# run until the user asks to quit
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# update the frame to display according to render_FPS
if time_step % int(math.ceil((1.0 / render_FPS) / h)) == 0:
# fill the background with white color, display simulation time at the top,
# render a floor at y=-1, and render the particle as a circle:
screen.fill((255, 255, 255))
pygame.display.set_caption('Current time: ' + f'{time_step * h: .2f}s')
pygame.draw.aaline(screen, (0, 0, 255), screen_projection([-2, -1]), screen_projection([2, -1]))
pygame.draw.circle(screen, (0, 0, 255), screen_projection(x), 0.1 * scale)
pygame.display.flip() # flip the display
pygame.time.wait(int(1000.0 / render_FPS)) # wait to render the next frame
# pause the simulation when the particle touches on the ground
if x[1] <= -1:
input()
break
# step forward the simulation by updating particle velocity and position
v += h * g
x += h * v
time_step += 1 # update time step counter
================================================
FILE: 0_getting_started/simulator1.py
================================================
# Spring Simulation
import math
import numpy as np # for vector data structure and computations
import pygame # for visualization
# simulation setup
m = 1000 # mass of particle
x = np.array([0.4, 0.0]) # position of particle
v = np.array([0.0, 0.0]) # velocity of particle
g = np.array([0.0, -10.0]) # gravitational acceleration
spring_rest_len = 0.3 # rest length of the spring ###
spring_stiffness = 1e5 # stiffness of the spring ###
h = 0.01 # time step size in seconds
# visualization/rendering setup
pygame.init()
render_FPS = 100 # number of frames to render per second
resolution = np.array([900, 900]) # visualization window size in pixels
offset = resolution / 2 # offset between window coordinates and simulated coordinates
scale = 200 # scale between window coordinates and simulated coordinates
def screen_projection(x): # convert simulated coordinates to window coordinates
return [offset[0] + scale * x[0], resolution[1] - (offset[1] + scale * x[1])]
screen = pygame.display.set_mode(resolution) # initialize visualizer
time_step = 0 # the number of the current time step
running = True # flag indicating whether the simulation is still running
while running:
# run until the user asks to quit
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# update the frame to display according to render_FPS
if time_step % int(math.ceil((1.0 / render_FPS) / h)) == 0:
# fill the background with white color, display simulation time at the top,
# draw the spring segment, and render the particle as a circle:
screen.fill((255, 255, 255))
pygame.display.set_caption('Current time: ' + f'{time_step * h: .2f}s')
pygame.draw.aaline(screen, (0, 0, 255), screen_projection([0, 0]), screen_projection(x)) ###
pygame.draw.circle(screen, (0, 0, 255), screen_projection(x), 0.1 * scale)
pygame.display.flip() # flip the display
pygame.time.wait(int(1000.0 / render_FPS)) # wait to render the next frame
# step forward the simulation by updating particle velocity and position
spring_cur_len = math.sqrt(x[0] * x[0] + x[1] * x[1]) ###
spring_displacement = spring_cur_len - spring_rest_len ###
spring_force = -spring_stiffness * spring_displacement * (x / spring_cur_len) ###
v += h * (g + spring_force / m)
x += h * v
time_step += 1 # update time step counter
================================================
FILE: 0_getting_started/simulator2.py
================================================
# Mass-Spring Solid Simulation
import math
import numpy as np # for vector data structure and computations
import pygame # for visualization
import square_mesh # for generating a square mesh
# simulation setup
side_length = 1 # side length of the square
n_seg = 4 # number of springs per side of the square
m = 1000 # mass of each particle
[x, e] = square_mesh.generate(side_length, n_seg) # array of particle positions and springs ###
v = np.array([[0.0, 0.0]] * len(x)) # velocity array of particles ###
g = np.array([0.0, -10.0]) # gravitational acceleration
spring_rest_len = [] # rest length array of the springs ###
for i in range(0, len(e)): # calculate the rest length of each spring
spring_vec = x[e[i][0]] - x[e[i][1]] # the vector connecting two ends of spring i
spring_rest_len.append(math.sqrt(spring_vec[0] * spring_vec[0] + spring_vec[1] * spring_vec[1]))
spring_stiffness = 1e6 # stiffness of the spring
h = 0.01 # time step size in seconds
# visualization/rendering setup
pygame.init()
render_FPS = 100 # number of frames to render per second
resolution = np.array([900, 900]) # visualization window size in pixels
offset = resolution / 2 # offset between window coordinates and simulated coordinates
scale = 200 # scale between window coordinates and simulated coordinates
def screen_projection(x): # convert simulated coordinates to window coordinates
return [offset[0] + scale * x[0], resolution[1] - (offset[1] + scale * x[1])]
screen = pygame.display.set_mode(resolution) # initialize visualizer
time_step = 0 # the number of the current time step
running = True # flag indicating whether the simulation is still running
while running:
# run until the user asks to quit
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# update the frame to display according to render_FPS
if time_step % int(math.ceil((1.0 / render_FPS) / h)) == 0:
# fill the background with white color, display simulation time at the top,
# draw each spring segment, and render each particle as a circle:
screen.fill((255, 255, 255))
pygame.display.set_caption('Current time: ' + f'{time_step * h: .2f}s')
for i in range(0, len(e)): ###
pygame.draw.aaline(screen, (0, 0, 255), screen_projection(x[e[i][0]]), screen_projection(x[e[i][1]]))
for i in range(0, len(x)): ###
pygame.draw.circle(screen, (0, 0, 255), screen_projection(x[i]), 0.02 * scale)
pygame.display.flip() # flip the display
pygame.time.wait(int(1000.0 / render_FPS)) # wait to render the next frame
# step forward the simulation by updating particle velocity and position ###
for i in range(0, len(e)):
# calculate elasticity force of spring i:
spring_vec = x[e[i][0]] - x[e[i][1]]
spring_cur_len = math.sqrt(spring_vec[0] * spring_vec[0] + spring_vec[1] * spring_vec[1])
spring_displacement = spring_cur_len - spring_rest_len[i]
spring_force = -spring_stiffness * spring_displacement * (spring_vec / spring_cur_len)
# update the velocity of the two ends of spring i
v[e[i][0]] += h * (g + spring_force / m)
v[e[i][1]] += h * (g - spring_force / m)
# fix the top left and top right corner by setting velocity to 0:
v[n_seg] = v[(n_seg + 1) * (n_seg + 1) - 1] = np.array([0, 0])
# update the position of each particle:
for i in range(0, len(x)):
x[i] += h * v[i]
time_step += 1 # update time step counter
================================================
FILE: 0_getting_started/square_mesh.py
================================================
import numpy as np
def generate(side_length, n_seg):
# sample nodes uniformly on a square
x = np.array([[0.0, 0.0]] * ((n_seg + 1) ** 2))
step = side_length / n_seg
for i in range(0, n_seg + 1):
for j in range(0, n_seg + 1):
x[i * (n_seg + 1) + j] = [-side_length / 2 + i * step, -side_length / 2 + j * step]
# connect the nodes with edges
e = []
# horizontal edges
for i in range(0, n_seg):
for j in range(0, n_seg + 1):
e.append([i * (n_seg + 1) + j, (i + 1) * (n_seg + 1) + j])
# vertical edges
for i in range(0, n_seg + 1):
for j in range(0, n_seg):
e.append([i * (n_seg + 1) + j, i * (n_seg + 1) + j + 1])
# diagonals
for i in range(0, n_seg):
for j in range(0, n_seg):
e.append([i * (n_seg + 1) + j, (i + 1) * (n_seg + 1) + j + 1])
e.append([(i + 1) * (n_seg + 1) + j, i * (n_seg + 1) + j + 1])
return [x, e]
================================================
FILE: 10_mpm_elasticity/readme.md
================================================
# Two Colliding Elastic Blocks in 2D
Two elastic blocks with opposite initial velocities collide head-on using the simplest PIC transfer scheme, illustrating a minimal yet complete implementation of the Material Point Method (MPM).

## Dependencies
```
pip install numpy taichi
```
## Run
```
python simulator.py
```
================================================
FILE: 10_mpm_elasticity/simulator.py
================================================
# Material Point Method Simulation
import numpy as np # numpy for linear algebra
import taichi as ti # taichi for fast and parallelized computation
ti.init(arch=ti.cpu)
# ANCHOR: property_def
# simulation setup
grid_size = 128 # background Eulerian grid's resolution, in 2D is [128, 128]
dx = 1.0 / grid_size # the domain size is [1m, 1m] in 2D, so dx for each cell is (1/128)m
dt = 2e-4 # time step size in second
ppc = 8 # average particles per cell
density = 1000 # mass density, unit: kg / m^3
E, nu = 1e4, 0.3 # block's Young's modulus and Poisson's ratio
mu, lam = E / (2 * (1 + nu)), E * nu / ((1 + nu) * (1 - 2 * nu)) # Lame parameters
# ANCHOR_END: property_def
# ANCHOR: setting
# uniformly sampling material particles
def uniform_grid(x0, y0, x1, y1, dx):
xx, yy = np.meshgrid(np.arange(x0, x1 + dx, dx), np.arange(y0, y1 + dx, dx))
return np.column_stack((xx.ravel(), yy.ravel()))
box1_samples = uniform_grid(0.2, 0.4, 0.4, 0.6, dx / np.sqrt(ppc))
box1_velocities = np.tile(np.array([10.0, 0]), (len(box1_samples), 1))
box2_samples = uniform_grid(0.6, 0.4, 0.8, 0.6, dx / np.sqrt(ppc))
box2_velocities = np.tile(np.array([-10.0, 0]), (len(box1_samples), 1))
all_samples = np.concatenate([box1_samples, box2_samples], axis=0)
all_velocities = np.concatenate([box1_velocities, box2_velocities], axis=0)
# ANCHOR_END: setting
# ANCHOR: data_def
# material particles data
N_particles = len(all_samples)
x = ti.Vector.field(2, float, N_particles) # the position of particles
x.from_numpy(all_samples)
v = ti.Vector.field(2, float, N_particles) # the velocity of particles
v.from_numpy(all_velocities)
vol = ti.field(float, N_particles) # the volume of particle
vol.fill(0.2 * 0.4 / N_particles) # get the volume of each particle as V_rest / N_particles
m = ti.field(float, N_particles) # the mass of particle
m.fill(vol[0] * density)
F = ti.Matrix.field(2, 2, float, N_particles) # the deformation gradient of particles
F.from_numpy(np.tile(np.eye(2), (N_particles, 1, 1)))
# grid data
grid_m = ti.field(float, (grid_size, grid_size))
grid_v = ti.Vector.field(2, float, (grid_size, grid_size))
# ANCHOR_END: data_def
# ANCHOR: reset_grid
def reset_grid():
# after each transfer, the grid is reset
grid_m.fill(0)
grid_v.fill(0)
# ANCHOR_END: reset_grid
################################
# Stvk Hencky Elasticity
################################
# ANCHOR: stvk
@ti.func
def StVK_Hencky_PK1_2D(F):
U, sig, V = ti.svd(F)
inv_sig = sig.inverse()
e = ti.Matrix([[ti.log(sig[0, 0]), 0], [0, ti.log(sig[1, 1])]])
return U @ (2 * mu * inv_sig @ e + lam * e.trace() * inv_sig) @ V.transpose()
# ANCHOR_END: stvk
# Particle-to-Grid (P2G) Transfers
# ANCHOR: p2g
@ti.kernel
def particle_to_grid_transfer():
for p in range(N_particles):
base = (x[p] / dx - 0.5).cast(int)
fx = x[p] / dx - base.cast(float)
# quadratic B-spline interpolating functions (Section 26.2)
w = [0.5 * (1.5 - fx) ** 2, 0.75 - (fx - 1) ** 2, 0.5 * (fx - 0.5) ** 2]
# gradient of the interpolating function (Section 26.2)
dw_dx = [fx - 1.5, 2 * (1.0 - fx), fx - 0.5]
P = StVK_Hencky_PK1_2D(F[p])
for i in ti.static(range(3)):
for j in ti.static(range(3)):
offset = ti.Vector([i, j])
weight = w[i][0] * w[j][1]
grad_weight = ti.Vector([(1. / dx) * dw_dx[i][0] * w[j][1],
w[i][0] * (1. / dx) * dw_dx[j][1]])
grid_m[base + offset] += weight * m[p] # mass transfer
grid_v[base + offset] += weight * m[p] * v[p] # momentum Transfer, PIC formulation
# internal force (stress) transfer
fi = -vol[p] * P @ F[p].transpose() @ grad_weight
grid_v[base + offset] += dt * fi
# ANCHOR_END: p2g
# Grid Update
# ANCHOR: grid_update
@ti.kernel
def update_grid():
for i, j in grid_m:
if grid_m[i, j] > 0:
grid_v[i, j] = grid_v[i, j] / grid_m[i, j] # extract updated nodal velocity from transferred nodal momentum
# Dirichlet BC near the bounding box
if i <= 3 or i > grid_size - 3 or j <= 2 or j > grid_size - 3:
grid_v[i, j] = 0
# ANCHOR_END: grid_update
# Grid-to-Particle (G2P) Transfers
# ANCHOR: g2p
@ti.kernel
def grid_to_particle_transfer():
for p in range(N_particles):
base = (x[p] / dx - 0.5).cast(int)
fx = x[p] / dx - base.cast(float)
# quadratic B-spline interpolating functions (Section 26.2)
w = [0.5 * (1.5 - fx) ** 2, 0.75 - (fx - 1) ** 2, 0.5 * (fx - 0.5) ** 2]
# gradient of the interpolating function (Section 26.2)
dw_dx = [fx - 1.5, 2 * (1.0 - fx), fx - 0.5]
new_v = ti.Vector.zero(float, 2)
v_grad_wT = ti.Matrix.zero(float, 2, 2)
for i in ti.static(range(3)):
for j in ti.static(range(3)):
offset = ti.Vector([i, j])
weight = w[i][0] * w[j][1]
grad_weight = ti.Vector([(1. / dx) * dw_dx[i][0] * w[j][1],
w[i][0] * (1. / dx) * dw_dx[j][1]])
new_v += weight * grid_v[base + offset]
v_grad_wT += grid_v[base + offset].outer_product(grad_weight)
v[p] = new_v
F[p] = (ti.Matrix.identity(float, 2) + dt * v_grad_wT) @ F[p]
# ANCHOR_END: g2p
# Deformation Gradient and Particle State Update
# ANCHOR: particle_update
@ti.kernel
def update_particle_state():
for p in range(N_particles):
x[p] += dt * v[p] # advection
# ANCHOR_END: particle_update
# ANCHOR: time_step
def step():
# a single time step of the Material Point Method (MPM) simulation
reset_grid()
particle_to_grid_transfer()
update_grid()
grid_to_particle_transfer()
update_particle_state()
# ANCHOR_END: time_step
################################
# Main
################################
gui = ti.GUI("2D MPM Elasticity", res = 512, background_color = 0xFFFFFF)
while True:
for s in range(50): step()
gui.circles(x.to_numpy()[:len(box1_samples)], radius=3, color=0xFF0000)
gui.circles(x.to_numpy()[len(box1_samples):], radius=3, color=0x0000FF)
gui.show()
================================================
FILE: 11_mpm_plastic/readme.md
================================================
# 2D Sand with a Sphere Collider
A 2D sand block falling onto a static red sphere collider simulated by Material Point Method (MPM). The sand undergoes irreversible deformation and splashing upon impact, demonstrating granular flow and frictional boundary response.

## Dependencies
```
pip install numpy taichi
```
## Run
```
python simulator.py
```
================================================
FILE: 11_mpm_plastic/simulator.py
================================================
# Material Point Method Simulation
import numpy as np # numpy for linear algebra
import taichi as ti # taichi for fast and parallelized computation
ti.init(arch=ti.cpu)
# sampling material particles with poisson-disk sampling
################################
# Poisson Disk Sampling Tool
################################
def poisson_disk_sampling(radius, domain_size, k=30):
"""Bridson's algorithm for Poisson-disk sampling in 2D"""
cell_size = radius / np.sqrt(2)
grid_shape = (int(domain_size[0] / cell_size) + 1, int(domain_size[1] / cell_size) + 1)
grid = -np.ones(grid_shape, dtype=int)
samples = []
active_list = []
def in_domain(p):
return 0 <= p[0] < domain_size[0] and 0 <= p[1] < domain_size[1]
def get_cell_coords(p):
return int(p[0] / cell_size), int(p[1] / cell_size)
def get_nearby_samples(p):
i, j = get_cell_coords(p)
neighbors = []
for di in [-2, -1, 0, 1, 2]:
for dj in [-2, -1, 0, 1, 2]:
ni, nj = i + di, j + dj
if 0 <= ni < grid.shape[0] and 0 <= nj < grid.shape[1]:
idx = grid[ni, nj]
if idx != -1:
neighbors.append(samples[idx])
return neighbors
# Start with a random point
first_point = np.array([np.random.uniform(0, domain_size[0]), np.random.uniform(0, domain_size[1])])
samples.append(first_point)
active_list.append(0)
grid[get_cell_coords(first_point)] = 0
while active_list:
idx = np.random.choice(active_list)
base_point = samples[idx]
found = False
for _ in range(k):
angle = np.random.uniform(0, 2 * np.pi)
r = np.random.uniform(radius, 2 * radius)
new_point = base_point + r * np.array([np.cos(angle), np.sin(angle)])
if in_domain(new_point):
neighbors = get_nearby_samples(new_point)
if all(np.linalg.norm(new_point - n) >= radius for n in neighbors):
samples.append(new_point)
active_list.append(len(samples) - 1)
grid[get_cell_coords(new_point)] = len(samples) - 1
found = True
if not found:
active_list.remove(idx)
return np.array(samples)
# ANCHOR: data_def
# simulation setup
grid_size = 128 # background Eulerian grid's resolution, in 2D is [128, 128]
dx = 1.0 / grid_size # the domain size is [1m, 1m] in 2D, so dx for each cell is (1/128)m
dt = 2e-4 # time step size in second
ppc = 8 # average particle-per-cell
density = 400 # kg / m^3
E, nu = 3.537e5, 0.3 # sand's Young's modulus and Poisson's ratio
mu, lam = E / (2 * (1 + nu)), E * nu / ((1 + nu) * (1 - 2 * nu)) # sand's Lame parameters
sdf_friction = 0.5 # frictional coefficient of SDF boundary condition
friction_angle_in_degrees = 25.0 # Drucker Prager friction angle
# ANCHOR: D_def
D = (1./4.) * dx * dx # constant D for Quadratic B-spline used for APIC
# ANCHOR_END: D_def
# sampling material particles with poisson-disk sampling
poisson_samples = poisson_disk_sampling(dx / np.sqrt(ppc), [0.2, 0.4]) # simulating a [30cm, 50cm] sand block
# material particles data
N_particles = len(poisson_samples)
x = ti.Vector.field(2, float, N_particles) # the position of particles
x.from_numpy(np.array(poisson_samples) + [0.4, 0.55])
v = ti.Vector.field(2, float, N_particles) # the velocity of particles
vol = ti.field(float, N_particles) # the volume of particle
vol.fill(0.2 * 0.4 / N_particles) # get the volume of each particle as V_rest / N_particles
m = ti.field(float, N_particles) # the mass of particle
m.fill(vol[0] * density)
F = ti.Matrix.field(2, 2, float, N_particles) # the deformation gradient of particles
F.from_numpy(np.tile(np.eye(2), (N_particles, 1, 1)))
C = ti.Matrix.field(2, 2, float, N_particles) # the affine-matrix of particles
diff_log_J = ti.field(float, N_particles) # tracks changes in the log of the volume gained during extension
# grid data
grid_m = ti.field(float, (grid_size, grid_size))
grid_v = ti.Vector.field(2, float, (grid_size, grid_size))
# ANCHOR_END: data_def
# ANCHOR: reset_grid
def reset_grid():
# after each transfer, the grid is reset
grid_m.fill(0)
grid_v.fill(0)
# ANCHOR_END: reset_grid
################################
# Stvk Hencky Elasticity
################################
# ANCHOR: stvk
@ti.func
def StVK_Hencky_PK1_2D(F):
U, sig, V = ti.svd(F)
inv_sig = sig.inverse()
e = ti.Matrix([[ti.log(sig[0, 0]), 0], [0, ti.log(sig[1, 1])]])
return U @ (2 * mu * inv_sig @ e + lam * e.trace() * inv_sig) @ V.transpose()
# ANCHOR_END: stvk
################################
# Drucker Prager plasticity
################################
# ANCHOR: drucker_prager
@ti.func
def Drucker_Prager_return_mapping(F, diff_log_J):
dim = ti.static(F.n)
sin_phi = ti.sin(friction_angle_in_degrees/ 180.0 * ti.math.pi)
friction_alpha = ti.sqrt(2.0 / 3.0) * 2.0 * sin_phi / (3.0 - sin_phi)
U, sig_diag, V = ti.svd(F)
sig = ti.Vector([ti.max(sig_diag[i,i], 0.05) for i in ti.static(range(dim))])
epsilon = ti.log(sig)
epsilon += diff_log_J / dim # volume correction treatment
trace_epsilon = epsilon.sum()
shifted_trace = trace_epsilon
if shifted_trace >= 0:
for d in ti.static(range(dim)):
epsilon[d] = 0.
else:
epsilon_hat = epsilon - (trace_epsilon / dim)
epsilon_hat_norm = ti.sqrt(epsilon_hat.dot(epsilon_hat)+1e-8)
delta_gamma = epsilon_hat_norm + (dim * lam + 2. * mu) / (2. * mu) * (shifted_trace) * friction_alpha
epsilon -= (ti.max(delta_gamma, 0) / epsilon_hat_norm) * epsilon_hat
sig_out = ti.exp(epsilon)
for d in ti.static(range(dim)):
sig_diag[d,d] = sig_out[d]
return U @ sig_diag @ V.transpose()
# ANCHOR_END: drucker_prager
# Particle-to-Grid (P2G) Transfers
# ANCHOR: p2g
@ti.kernel
def particle_to_grid_transfer():
for p in range(N_particles):
base = (x[p] / dx - 0.5).cast(int)
fx = x[p] / dx - base.cast(float)
# quadratic B-spline interpolating functions
w = [0.5 * (1.5 - fx) ** 2, 0.75 - (fx - 1) ** 2, 0.5 * (fx - 0.5) ** 2]
# gradient of the interpolating function
dw_dx = [fx - 1.5, 2 * (1.0 - fx), fx - 0.5]
P = StVK_Hencky_PK1_2D(F[p])
for i in ti.static(range(3)):
for j in ti.static(range(3)):
offset = ti.Vector([i, j])
dpos = (offset.cast(float) - fx) * dx
weight = w[i][0] * w[j][1]
grad_weight = ti.Vector([(1. / dx) * dw_dx[i][0] * w[j][1],
w[i][0] * (1. / dx) * dw_dx[j][1]])
grid_m[base + offset] += weight * m[p] # mass transfer
# ANCHOR: apic_p2g
grid_v[base + offset] += weight * m[p] * (v[p] + C[p] @ dpos) # momentum Transfer, APIC formulation
# ANCHOR_END: apic_p2g
# internal force (stress) transfer
fi = -vol[p] * P @ F[p].transpose() @ grad_weight
grid_v[base + offset] += dt * fi
# ANCHOR_END: p2g
# Grid Update
@ti.kernel
def update_grid():
for i, j in grid_m:
if grid_m[i, j] > 0:
grid_v[i, j] = grid_v[i, j] / grid_m[i, j] # extract updated nodal velocity from transferred nodal momentum
grid_v[i, j] += ti.Vector([0, -9.81]) * dt # gravity
# Dirichlet BC near the bounding box
if i <= 3 or i > grid_size - 3 or j <= 2 or j > grid_size - 3:
grid_v[i, j] = 0
x_i = (ti.Vector([i, j])) * dx # position of the grid-node
# ANCHOR: sphere_sdf
# a sphere SDF as boundary condition
sphere_center = ti.Vector([0.5, 0.5])
sphere_radius = 0.05 + dx # add a dx-gap to avoid penetration
if (x_i - sphere_center).norm() < sphere_radius:
normal = (x_i - sphere_center).normalized()
diff_vel = -grid_v[i, j]
dotnv = normal.dot(diff_vel)
dotnv_frac = dotnv * (1.0 - sdf_friction)
grid_v[i, j] += diff_vel * sdf_friction + normal * dotnv_frac
# ANCHOR_END: sphere_sdf
# Grid-to-Particle (G2P) Transfers
# ANCHOR: g2p
@ti.kernel
def grid_to_particle_transfer():
for p in range(N_particles):
base = (x[p] / dx - 0.5).cast(int)
fx = x[p] / dx - base.cast(float)
# quadratic B-spline interpolating functions
w = [0.5 * (1.5 - fx) ** 2, 0.75 - (fx - 1) ** 2, 0.5 * (fx - 0.5) ** 2]
# gradient of the interpolating function
dw_dx = [fx - 1.5, 2 * (1.0 - fx), fx - 0.5]
new_v = ti.Vector.zero(float, 2)
new_C = ti.Matrix.zero(float, 2, 2)
v_grad_wT = ti.Matrix.zero(float, 2, 2)
for i in ti.static(range(3)):
for j in ti.static(range(3)):
offset = ti.Vector([i, j])
dpos = (offset.cast(float) - fx) * dx
weight = w[i][0] * w[j][1]
grad_weight = ti.Vector([(1. / dx) * dw_dx[i][0] * w[j][1],
w[i][0] * (1. / dx) * dw_dx[j][1]])
new_v += weight * grid_v[base + offset]
# ANCHOR: apic_g2p
new_C += weight * grid_v[base + offset].outer_product(dpos) / D
# ANCHOR_END: apic_g2p
v_grad_wT += grid_v[base + offset].outer_product(grad_weight)
v[p] = new_v
C[p] = new_C
# note the updated F here is the trial elastic deformation gradient
F[p] = (ti.Matrix.identity(float, 2) + dt * v_grad_wT) @ F[p]
# ANCHOR_END: g2p
# Deformation Gradient and Particle State Update
# ANCHOR: particle_update
@ti.kernel
def update_particle_state():
for p in range(N_particles):
# trial elastic deformation gradient
F_tr = F[p]
# apply return mapping to correct the trial elastic state, projecting the stress induced by F_tr
# back onto the yield surface, following the direction specified by the plastic flow rule.
new_F = Drucker_Prager_return_mapping(F_tr, diff_log_J[p])
# track the volume change incurred by return mapping to correct volume, following https://dl.acm.org/doi/10.1145/3072959.3073651 sec 4.3.4
diff_log_J[p] += -ti.log(new_F.determinant()) + ti.log(F_tr.determinant())
F[p] = new_F
# advection
x[p] += dt * v[p]
# ANCHOR_END: particle_update
# ANCHOR: time_step
def step():
# a single time step of the Material Point Method (MPM) simulation
reset_grid()
particle_to_grid_transfer()
update_grid()
grid_to_particle_transfer()
update_particle_state()
# ANCHOR_END: time_step
################################
# Main
################################
gui = ti.GUI("2D MPM Sand", res = 512, background_color = 0xFFFFFF)
frame = 0
while True:
for s in range(50):
step()
gui.circles(np.array([[0.5, 0.5]]), radius = 0.05 * gui.res[0], color = 0xFF0000)
gui.circles(x.to_numpy(), radius = 1.5, color = 0xD6B588)
gui.show()
================================================
FILE: 11_mpm_plastic/simulator_viscoplastic.py
================================================
import taichi as ti
import os
import shutil
ti.init(arch=ti.cuda)
quality = 6
n_particles, n_grid = 9000 * quality**2, 256 * quality
dx, inv_dx = 1 / n_grid, float(n_grid)
dt = 1e-4 / quality
p_vol, p_rho = (dx * 0.5) ** 2, 1
p_mass = p_vol * p_rho
nu = 0.2
E_toothpaste = 350.0
mu_toothpaste = E_toothpaste / (2 * (1 + nu))
lam_toothpaste = E_toothpaste * nu / ((1 + nu) * (1 - 2 * nu))
yield_stress_bar1 = 1.2
plastic_viscosity_bar1 = 0.7
yield_stress_bar2 = 1.0
plastic_viscosity_bar2 = 0.3
ground_friction = 0.3
x = ti.Vector.field(2, dtype=float, shape=n_particles)
v = ti.Vector.field(2, dtype=float, shape=n_particles)
C = ti.Matrix.field(2, 2, dtype=float, shape=n_particles)
F = ti.Matrix.field(2, 2, dtype=float, shape=n_particles)
color_stripe = ti.field(dtype=int, shape=n_particles)
yield_stress = ti.field(dtype=float, shape=n_particles)
plastic_viscosity = ti.field(dtype=float, shape=n_particles)
grid_v = ti.Vector.field(2, dtype=float, shape=(n_grid, n_grid))
grid_m = ti.field(dtype=float, shape=(n_grid, n_grid))
gravity = ti.Vector.field(2, dtype=float, shape=())
@ti.func
def viscoplastic_return_mapping_stvk_2d(F_trial, mu_p, lam_p, yield_stress_p, plastic_viscosity_p, dt_val):
"""Viscoplastic return mapping for toothpaste-like material (2D version)"""
U, sig, V = ti.svd(F_trial)
# Clamp singular values to prevent numerical issues
sig0 = ti.max(sig[0, 0], 0.01)
sig1 = ti.max(sig[1, 1], 0.01)
# Compute logarithmic strain (2D)
epsilon = ti.Vector([ti.log(sig0), ti.log(sig1)])
trace_epsilon = epsilon[0] + epsilon[1]
# Deviatoric strain
epsilon_hat = epsilon - ti.Vector([trace_epsilon / 2.0, trace_epsilon / 2.0])
# Deviatoric stress in logarithmic strain space
s_trial = 2.0 * mu_p * epsilon_hat
s_trial_norm = s_trial.norm()
# Yield condition - using similar factor to 3D version (sqrt(2/3) ≈ 0.816)
# For 2D, we use sqrt(2/3) to match the 3D implementation's scaling
y = s_trial_norm - ti.sqrt(2.0 / 3.0) * yield_stress_p
F_elastic_res = F_trial
if y > 0:
# Compute b_trial for mu_hat (2D adaptation)
b_trial = sig0 * sig0 + sig1 * sig1
mu_hat = mu_p * b_trial / 2.0
# Rate-dependent plastic flow
denom = 1.0 + plastic_viscosity_p / (2.0 * mu_hat * dt_val)
s_new_norm = s_trial_norm - y / denom
s_scale = s_new_norm / s_trial_norm if s_trial_norm > 1e-10 else 1.0
s_new = s_scale * s_trial
# Reconstruct strain
epsilon_new = 1.0 / (2.0 * mu_p) * s_new + ti.Vector([trace_epsilon / 2.0, trace_epsilon / 2.0])
# Reconstruct deformation gradient
sig_elastic = ti.Matrix([[ti.exp(epsilon_new[0]), 0.0], [0.0, ti.exp(epsilon_new[1])]])
F_elastic_res = U @ sig_elastic @ V.transpose()
return F_elastic_res
@ti.func
def stvk_stress_2d(F_elastic, U, V, sig, mu_p, lam_p):
"""Saint Venant-Kirchhoff stress model (2D version)"""
sig0 = ti.max(sig[0, 0], 0.01)
sig1 = ti.max(sig[1, 1], 0.01)
epsilon = ti.Vector([ti.log(sig0), ti.log(sig1)])
log_sig_sum = ti.log(sig0) + ti.log(sig1)
ONE = ti.Vector([1.0, 1.0])
tau = 2.0 * mu_p * epsilon + lam_p * log_sig_sum * ONE
tau_mat = ti.Matrix([[tau[0], 0.0], [0.0, tau[1]]])
return U @ tau_mat @ V.transpose() @ F_elastic.transpose()
@ti.kernel
def p2g2p():
for i, j in grid_m:
grid_v[i, j] = [0, 0]
grid_m[i, j] = 0
for p in x:
if x[p][0] < 0.0 or x[p][1] < 0.0 or x[p][0] > 1.0 or x[p][1] > 1.0:
continue
base = (x[p] * inv_dx - 0.5).cast(int)
fx = x[p] * inv_dx - base.cast(float)
w = [0.5 * (1.5 - fx) ** 2, 0.75 - (fx - 1) ** 2, 0.5 * (fx - 0.5) ** 2]
F_trial = (ti.Matrix.identity(float, 2) + dt * C[p]) @ F[p]
F[p] = viscoplastic_return_mapping_stvk_2d(
F_trial, mu_toothpaste, lam_toothpaste, yield_stress[p], plastic_viscosity[p], dt
)
U, sig, V = ti.svd(F[p])
stress = stvk_stress_2d(F[p], U, V, sig, mu_toothpaste, lam_toothpaste)
stress = (-dt * p_vol * 4 * inv_dx * inv_dx) * stress
affine = stress + p_mass * C[p]
for i, j in ti.static(ti.ndrange(3, 3)):
offset = ti.Vector([i, j])
dpos = (offset.cast(float) - fx) * dx
weight = w[i][0] * w[j][1]
grid_v[base + offset] += weight * (p_mass * v[p] + affine @ dpos)
grid_m[base + offset] += weight * p_mass
for i, j in grid_m:
if grid_m[i, j] > 0:
grid_v[i, j] = (1 / grid_m[i, j]) * grid_v[i, j]
grid_v[i, j] += dt * gravity[None] * 30
if i < 3 and grid_v[i, j][0] < 0:
grid_v[i, j][0] = 0
if i > n_grid - 3 and grid_v[i, j][0] > 0:
grid_v[i, j][0] = 0
if j < 3 and grid_v[i, j][1] < 0:
v_y = grid_v[i, j][1]
v_x = grid_v[i, j][0]
normal_component = ti.abs(v_y)
tangential_velocity = v_x
if ti.abs(tangential_velocity) > 1e-20:
friction_reduction = ground_friction * normal_component
v_x_new = tangential_velocity
if v_x_new > 0:
v_x_new = ti.max(0.0, v_x_new - friction_reduction)
else:
v_x_new = ti.min(0.0, v_x_new + friction_reduction)
grid_v[i, j] = ti.Vector([v_x_new, 0.0])
else:
grid_v[i, j] = ti.Vector([0.0, 0.0])
if j > n_grid - 3 and grid_v[i, j][1] > 0:
grid_v[i, j][1] = 0
for p in x:
if x[p][0] < 0.0 or x[p][1] < 0.0 or x[p][0] > 1.0 or x[p][1] > 1.0:
continue
base = (x[p] * inv_dx - 0.5).cast(int)
fx = x[p] * inv_dx - base.cast(float)
w = [0.5 * (1.5 - fx) ** 2, 0.75 - (fx - 1.0) ** 2, 0.5 * (fx - 0.5) ** 2]
new_v = ti.Vector.zero(float, 2)
new_C = ti.Matrix.zero(float, 2, 2)
for i, j in ti.static(ti.ndrange(3, 3)):
dpos = ti.Vector([i, j]).cast(float) - fx
g_v = grid_v[base + ti.Vector([i, j])]
weight = w[i][0] * w[j][1]
new_v += weight * g_v
new_C += 4 * inv_dx * weight * g_v.outer_product(dpos)
v[p], C[p] = new_v, new_C
x[p] += dt * v[p]
@ti.kernel
def reset():
bar_width = 0.015
bar_height = 0.85
bar_bottom_y = 0.1
bar_spacing = 0.2
bar1_center_x = 0.5 - bar_spacing / 2.0
bar2_center_x = 0.5 + bar_spacing / 2.0
particles_per_bar = n_particles // 2
for i in range(n_particles):
bar_center_x = 0.5
bar_yield_stress = 1.2
bar_plastic_viscosity = 0.7
if i < particles_per_bar:
bar_center_x = bar1_center_x
bar_yield_stress = 1.2
bar_plastic_viscosity = 0.7
else:
bar_center_x = bar2_center_x
bar_yield_stress = 1.0
bar_plastic_viscosity = 0.3
x_pos = ti.random() * bar_width + (bar_center_x - bar_width / 2.0)
y_pos = ti.random() * bar_height + bar_bottom_y
x[i] = [x_pos, y_pos]
stripe_width = bar_width / 3.0
relative_x = x_pos - (bar_center_x - bar_width / 2.0)
if relative_x < stripe_width:
color_stripe[i] = 0
elif relative_x < 2.0 * stripe_width:
color_stripe[i] = 1
else:
color_stripe[i] = 2
v[i] = [0, 0]
F[i] = ti.Matrix([[1, 0], [0, 1]])
C[i] = ti.Matrix.zero(float, 2, 2)
yield_stress[i] = bar_yield_stress
plastic_viscosity[i] = bar_plastic_viscosity
gui = ti.GUI("Taichi MLS-MPM-128", res=1024, background_color=0xEEEEF0, show_gui=False)
reset()
gravity[None] = [0, -1]
save_duration = 10.0
output_fps = 30
frame_time = 3e-2
total_frames_to_run = int(save_duration / frame_time)
frames_per_save = int(1.0 / (output_fps * frame_time))
total_saves = int(save_duration * output_fps)
save_counter = 0
output_dir = os.path.join(os.path.dirname(__file__), "frames")
os.makedirs(output_dir, exist_ok=True)
video_output = os.path.join(os.path.dirname(__file__), "viscoplastic_animation.mp4")
for frame in range(total_frames_to_run):
substeps_per_frame = int(2e-3 // dt)
for s in range(substeps_per_frame):
p2g2p()
if frame % frames_per_save == 0 and save_counter < total_saves:
gui.circles(
x.to_numpy(),
radius=1.5,
palette=[0x3366FF, 0xFFFF00, 0xFF3333],
palette_indices=color_stripe,
)
filename = os.path.join(output_dir, f'{save_counter:06d}.png')
gui.show(filename)
save_counter += 1
if save_counter % 30 == 0:
print(f"Saved {save_counter}/{total_saves} frames...")
print(f"Frame saving complete! Saved {save_counter} frames.")
ffmpeg_path = shutil.which("ffmpeg")
if ffmpeg_path is not None and save_counter > 0:
pattern = os.path.join(output_dir, "%06d.png")
cmd = (
f'"{ffmpeg_path}" -y -framerate {output_fps} -i "{pattern}" '
f'-c:v libx264 -pix_fmt yuv420p -crf 18 "{video_output}"'
)
print("Running:", cmd)
os.system(cmd)
print(f"Video written to: {video_output}")
else:
print("ffmpeg not found or no frames saved. To build video manually, run:")
print(
f"ffmpeg -y -framerate {output_fps} -i '{os.path.join(output_dir, '%06d.png')}' "
f"-c:v libx264 -pix_fmt yuv420p -crf 18 '{video_output}'"
)
================================================
FILE: 11_mpm_sand/readme.md
================================================
# 2D Sand with a Sphere Collider
A 2D sand block falling onto a static red sphere collider simulated by Material Point Method (MPM). The sand undergoes irreversible deformation and splashing upon impact, demonstrating granular flow and frictional boundary response.

## Dependencies
```
pip install numpy taichi
```
## Run
```
python simulator.py
```
================================================
FILE: 11_mpm_sand/simulator.py
================================================
# Material Point Method Simulation
import numpy as np # numpy for linear algebra
import taichi as ti # taichi for fast and parallelized computation
ti.init(arch=ti.cpu)
# sampling material particles with poisson-disk sampling
################################
# Poisson Disk Sampling Tool
################################
def poisson_disk_sampling(radius, domain_size, k=30):
"""Bridson's algorithm for Poisson-disk sampling in 2D"""
cell_size = radius / np.sqrt(2)
grid_shape = (int(domain_size[0] / cell_size) + 1, int(domain_size[1] / cell_size) + 1)
grid = -np.ones(grid_shape, dtype=int)
samples = []
active_list = []
def in_domain(p):
return 0 <= p[0] < domain_size[0] and 0 <= p[1] < domain_size[1]
def get_cell_coords(p):
return int(p[0] / cell_size), int(p[1] / cell_size)
def get_nearby_samples(p):
i, j = get_cell_coords(p)
neighbors = []
for di in [-2, -1, 0, 1, 2]:
for dj in [-2, -1, 0, 1, 2]:
ni, nj = i + di, j + dj
if 0 <= ni < grid.shape[0] and 0 <= nj < grid.shape[1]:
idx = grid[ni, nj]
if idx != -1:
neighbors.append(samples[idx])
return neighbors
# Start with a random point
first_point = np.array([np.random.uniform(0, domain_size[0]), np.random.uniform(0, domain_size[1])])
samples.append(first_point)
active_list.append(0)
grid[get_cell_coords(first_point)] = 0
while active_list:
idx = np.random.choice(active_list)
base_point = samples[idx]
found = False
for _ in range(k):
angle = np.random.uniform(0, 2 * np.pi)
r = np.random.uniform(radius, 2 * radius)
new_point = base_point + r * np.array([np.cos(angle), np.sin(angle)])
if in_domain(new_point):
neighbors = get_nearby_samples(new_point)
if all(np.linalg.norm(new_point - n) >= radius for n in neighbors):
samples.append(new_point)
active_list.append(len(samples) - 1)
grid[get_cell_coords(new_point)] = len(samples) - 1
found = True
if not found:
active_list.remove(idx)
return np.array(samples)
# ANCHOR: data_def
# simulation setup
grid_size = 128 # background Eulerian grid's resolution, in 2D is [128, 128]
dx = 1.0 / grid_size # the domain size is [1m, 1m] in 2D, so dx for each cell is (1/128)m
dt = 2e-4 # time step size in second
ppc = 8 # average particle-per-cell
density = 400 # kg / m^3
E, nu = 3.537e5, 0.3 # sand's Young's modulus and Poisson's ratio
mu, lam = E / (2 * (1 + nu)), E * nu / ((1 + nu) * (1 - 2 * nu)) # sand's Lame parameters
sdf_friction = 0.5 # frictional coefficient of SDF boundary condition
friction_angle_in_degrees = 25.0 # Drucker Prager friction angle
# ANCHOR: D_def
D = (1./4.) * dx * dx # constant D for Quadratic B-spline used for APIC
# ANCHOR_END: D_def
# sampling material particles with poisson-disk sampling
poisson_samples = poisson_disk_sampling(dx / np.sqrt(ppc), [0.2, 0.4]) # simulating a [30cm, 50cm] sand block
# material particles data
N_particles = len(poisson_samples)
x = ti.Vector.field(2, float, N_particles) # the position of particles
x.from_numpy(np.array(poisson_samples) + [0.4, 0.55])
v = ti.Vector.field(2, float, N_particles) # the velocity of particles
vol = ti.field(float, N_particles) # the volume of particle
vol.fill(0.2 * 0.4 / N_particles) # get the volume of each particle as V_rest / N_particles
m = ti.field(float, N_particles) # the mass of particle
m.fill(vol[0] * density)
F = ti.Matrix.field(2, 2, float, N_particles) # the deformation gradient of particles
F.from_numpy(np.tile(np.eye(2), (N_particles, 1, 1)))
C = ti.Matrix.field(2, 2, float, N_particles) # the affine-matrix of particles
diff_log_J = ti.field(float, N_particles) # tracks changes in the log of the volume gained during extension
# grid data
grid_m = ti.field(float, (grid_size, grid_size))
grid_v = ti.Vector.field(2, float, (grid_size, grid_size))
# ANCHOR_END: data_def
# ANCHOR: reset_grid
def reset_grid():
# after each transfer, the grid is reset
grid_m.fill(0)
grid_v.fill(0)
# ANCHOR_END: reset_grid
################################
# Stvk Hencky Elasticity
################################
# ANCHOR: stvk
@ti.func
def StVK_Hencky_PK1_2D(F):
U, sig, V = ti.svd(F)
inv_sig = sig.inverse()
e = ti.Matrix([[ti.log(sig[0, 0]), 0], [0, ti.log(sig[1, 1])]])
return U @ (2 * mu * inv_sig @ e + lam * e.trace() * inv_sig) @ V.transpose()
# ANCHOR_END: stvk
################################
# Drucker Prager plasticity
################################
# ANCHOR: drucker_prager
@ti.func
def Drucker_Prager_return_mapping(F, diff_log_J):
dim = ti.static(F.n)
sin_phi = ti.sin(friction_angle_in_degrees/ 180.0 * ti.math.pi)
friction_alpha = ti.sqrt(2.0 / 3.0) * 2.0 * sin_phi / (3.0 - sin_phi)
U, sig_diag, V = ti.svd(F)
sig = ti.Vector([ti.max(sig_diag[i,i], 0.05) for i in ti.static(range(dim))])
epsilon = ti.log(sig)
epsilon += diff_log_J / dim # volume correction treatment
trace_epsilon = epsilon.sum()
shifted_trace = trace_epsilon
if shifted_trace >= 0:
for d in ti.static(range(dim)):
epsilon[d] = 0.
else:
epsilon_hat = epsilon - (trace_epsilon / dim)
epsilon_hat_norm = ti.sqrt(epsilon_hat.dot(epsilon_hat)+1e-8)
delta_gamma = epsilon_hat_norm + (dim * lam + 2. * mu) / (2. * mu) * (shifted_trace) * friction_alpha
epsilon -= (ti.max(delta_gamma, 0) / epsilon_hat_norm) * epsilon_hat
sig_out = ti.exp(epsilon)
for d in ti.static(range(dim)):
sig_diag[d,d] = sig_out[d]
return U @ sig_diag @ V.transpose()
# ANCHOR_END: drucker_prager
# Particle-to-Grid (P2G) Transfers
# ANCHOR: p2g
@ti.kernel
def particle_to_grid_transfer():
for p in range(N_particles):
base = (x[p] / dx - 0.5).cast(int)
fx = x[p] / dx - base.cast(float)
# quadratic B-spline interpolating functions
w = [0.5 * (1.5 - fx) ** 2, 0.75 - (fx - 1) ** 2, 0.5 * (fx - 0.5) ** 2]
# gradient of the interpolating function
dw_dx = [fx - 1.5, 2 * (1.0 - fx), fx - 0.5]
P = StVK_Hencky_PK1_2D(F[p])
for i in ti.static(range(3)):
for j in ti.static(range(3)):
offset = ti.Vector([i, j])
dpos = (offset.cast(float) - fx) * dx
weight = w[i][0] * w[j][1]
grad_weight = ti.Vector([(1. / dx) * dw_dx[i][0] * w[j][1],
w[i][0] * (1. / dx) * dw_dx[j][1]])
grid_m[base + offset] += weight * m[p] # mass transfer
# ANCHOR: apic_p2g
grid_v[base + offset] += weight * m[p] * (v[p] + C[p] @ dpos) # momentum Transfer, APIC formulation
# ANCHOR_END: apic_p2g
# internal force (stress) transfer
fi = -vol[p] * P @ F[p].transpose() @ grad_weight
grid_v[base + offset] += dt * fi
# ANCHOR_END: p2g
# Grid Update
@ti.kernel
def update_grid():
for i, j in grid_m:
if grid_m[i, j] > 0:
grid_v[i, j] = grid_v[i, j] / grid_m[i, j] # extract updated nodal velocity from transferred nodal momentum
grid_v[i, j] += ti.Vector([0, -9.81]) * dt # gravity
# Dirichlet BC near the bounding box
if i <= 3 or i > grid_size - 3 or j <= 2 or j > grid_size - 3:
grid_v[i, j] = 0
x_i = (ti.Vector([i, j])) * dx # position of the grid-node
# ANCHOR: sphere_sdf
# a sphere SDF as boundary condition
sphere_center = ti.Vector([0.5, 0.5])
sphere_radius = 0.05 + dx # add a dx-gap to avoid penetration
if (x_i - sphere_center).norm() < sphere_radius:
normal = (x_i - sphere_center).normalized()
diff_vel = -grid_v[i, j]
dotnv = normal.dot(diff_vel)
dotnv_frac = dotnv * (1.0 - sdf_friction)
grid_v[i, j] += diff_vel * sdf_friction + normal * dotnv_frac
# ANCHOR_END: sphere_sdf
# Grid-to-Particle (G2P) Transfers
# ANCHOR: g2p
@ti.kernel
def grid_to_particle_transfer():
for p in range(N_particles):
base = (x[p] / dx - 0.5).cast(int)
fx = x[p] / dx - base.cast(float)
# quadratic B-spline interpolating functions
w = [0.5 * (1.5 - fx) ** 2, 0.75 - (fx - 1) ** 2, 0.5 * (fx - 0.5) ** 2]
# gradient of the interpolating function
dw_dx = [fx - 1.5, 2 * (1.0 - fx), fx - 0.5]
new_v = ti.Vector.zero(float, 2)
new_C = ti.Matrix.zero(float, 2, 2)
v_grad_wT = ti.Matrix.zero(float, 2, 2)
for i in ti.static(range(3)):
for j in ti.static(range(3)):
offset = ti.Vector([i, j])
dpos = (offset.cast(float) - fx) * dx
weight = w[i][0] * w[j][1]
grad_weight = ti.Vector([(1. / dx) * dw_dx[i][0] * w[j][1],
w[i][0] * (1. / dx) * dw_dx[j][1]])
new_v += weight * grid_v[base + offset]
# ANCHOR: apic_g2p
new_C += weight * grid_v[base + offset].outer_product(dpos) / D
# ANCHOR_END: apic_g2p
v_grad_wT += grid_v[base + offset].outer_product(grad_weight)
v[p] = new_v
C[p] = new_C
# note the updated F here is the trial elastic deformation gradient
F[p] = (ti.Matrix.identity(float, 2) + dt * v_grad_wT) @ F[p]
# ANCHOR_END: g2p
# Deformation Gradient and Particle State Update
# ANCHOR: particle_update
@ti.kernel
def update_particle_state():
for p in range(N_particles):
# trial elastic deformation gradient
F_tr = F[p]
# apply return mapping to correct the trial elastic state, projecting the stress induced by F_tr
# back onto the yield surface, following the direction specified by the plastic flow rule.
new_F = Drucker_Prager_return_mapping(F_tr, diff_log_J[p])
# track the volume change incurred by return mapping to correct volume, following https://dl.acm.org/doi/10.1145/3072959.3073651 sec 4.3.4
diff_log_J[p] += -ti.log(new_F.determinant()) + ti.log(F_tr.determinant())
F[p] = new_F
# advection
x[p] += dt * v[p]
# ANCHOR_END: particle_update
# ANCHOR: time_step
def step():
# a single time step of the Material Point Method (MPM) simulation
reset_grid()
particle_to_grid_transfer()
update_grid()
grid_to_particle_transfer()
update_particle_state()
# ANCHOR_END: time_step
################################
# Main
################################
gui = ti.GUI("2D MPM Sand", res = 512, background_color = 0xFFFFFF)
frame = 0
while True:
for s in range(50):
step()
gui.circles(np.array([[0.5, 0.5]]), radius = 0.05 * gui.res[0], color = 0xFF0000)
gui.circles(x.to_numpy(), radius = 1.5, color = 0xD6B588)
gui.show()
================================================
FILE: 12_pbd_cloth/cloth_data.json
================================================
{
"name" : "cloth",
"vertices" : [
-0.200000, 1.145859, -0.000000, -0.200000, 1.105859, -0.000000, -0.200000, 1.065859, -0.000000, -0.200000, 1.025859, -0.000000, -0.200000, 0.985859, -0.000000,
-0.200000, 0.945859, -0.000000, -0.200000, 0.905859, -0.000000, -0.200000, 0.865859, -0.000000, -0.200000, 0.825859, -0.000000, -0.200000, 0.785859, -0.000000,
-0.200000, 0.745859, -0.000000, -0.200000, 0.705859, -0.000000, -0.200000, 0.665859, -0.000000, -0.200000, 0.625859, -0.000000, -0.200000, 0.585859, -0.000000,
-0.200000, 0.545859, -0.000000, -0.200000, 0.505859, -0.000000, -0.200000, 0.465859, -0.000000, -0.200000, 0.425859, -0.000000, -0.200000, 0.385859, -0.000000,
-0.200000, 0.345859, -0.000000, -0.160000, 1.145859, -0.000000, -0.160000, 1.105859, -0.000000, -0.160000, 1.065859, -0.000000, -0.160000, 1.025859, -0.000000,
-0.160000, 0.985859, -0.000000, -0.160000, 0.945859, -0.000000, -0.160000, 0.905859, -0.000000, -0.160000, 0.865859, -0.000000, -0.160000, 0.825859, -0.000000,
-0.160000, 0.785859, -0.000000, -0.160000, 0.745859, -0.000000, -0.160000, 0.705859, -0.000000, -0.160000, 0.665859, -0.000000, -0.160000, 0.625859, -0.000000,
-0.160000, 0.585859, -0.000000, -0.160000, 0.545859, -0.000000, -0.160000, 0.505859, -0.000000, -0.160000, 0.465859, -0.000000, -0.160000, 0.425859, -0.000000,
-0.160000, 0.385859, -0.000000, -0.160000, 0.345859, -0.000000, -0.120000, 1.145859, -0.000000, -0.120000, 1.105859, -0.000000, -0.120000, 1.065859, -0.000000,
-0.120000, 1.025859, -0.000000, -0.120000, 0.985859, -0.000000, -0.120000, 0.945859, -0.000000, -0.120000, 0.905859, -0.000000, -0.120000, 0.865859, -0.000000,
-0.120000, 0.825859, -0.000000, -0.120000, 0.785859, -0.000000, -0.120000, 0.745859, -0.000000, -0.120000, 0.705859, -0.000000, -0.120000, 0.665859, -0.000000,
-0.120000, 0.625859, -0.000000, -0.120000, 0.585859, -0.000000, -0.120000, 0.545859, -0.000000, -0.120000, 0.505859, -0.000000, -0.120000, 0.465859, -0.000000,
-0.120000, 0.425859, -0.000000, -0.120000, 0.385859, -0.000000, -0.120000, 0.345859, -0.000000, -0.080000, 1.145859, -0.000000, -0.080000, 1.105859, -0.000000,
-0.080000, 1.065859, -0.000000, -0.080000, 1.025859, -0.000000, -0.080000, 0.985859, -0.000000, -0.080000, 0.945859, -0.000000, -0.080000, 0.905859, -0.000000,
-0.080000, 0.865859, -0.000000, -0.080000, 0.825859, -0.000000, -0.080000, 0.785859, -0.000000, -0.080000, 0.745859, -0.000000, -0.080000, 0.705859, -0.000000,
-0.080000, 0.665859, -0.000000, -0.080000, 0.625859, -0.000000, -0.080000, 0.585859, -0.000000, -0.080000, 0.545859, -0.000000, -0.080000, 0.505859, -0.000000,
-0.080000, 0.465859, -0.000000, -0.080000, 0.425859, -0.000000, -0.080000, 0.385859, -0.000000, -0.080000, 0.345859, -0.000000, -0.040000, 1.145859, -0.000000,
-0.040000, 1.105859, -0.000000, -0.040000, 1.065859, -0.000000, -0.040000, 1.025859, -0.000000, -0.040000, 0.985859, -0.000000, -0.040000, 0.945859, -0.000000,
-0.040000, 0.905859, -0.000000, -0.040000, 0.865859, -0.000000, -0.040000, 0.825859, -0.000000, -0.040000, 0.785859, -0.000000, -0.040000, 0.745859, -0.000000,
-0.040000, 0.705859, -0.000000, -0.040000, 0.665859, -0.000000, -0.040000, 0.625859, -0.000000, -0.040000, 0.585859, -0.000000, -0.040000, 0.545859, -0.000000,
-0.040000, 0.505859, -0.000000, -0.040000, 0.465859, -0.000000, -0.040000, 0.425859, -0.000000, -0.040000, 0.385859, -0.000000, -0.040000, 0.345859, -0.000000,
0.000000, 1.145859, -0.000000, 0.000000, 1.105859, -0.000000, 0.000000, 1.065859, -0.000000, 0.000000, 1.025859, -0.000000, 0.000000, 0.985859, -0.000000,
0.000000, 0.945859, -0.000000, 0.000000, 0.905859, -0.000000, 0.000000, 0.865859, -0.000000, 0.000000, 0.825859, -0.000000, 0.000000, 0.785859, -0.000000,
0.000000, 0.745859, -0.000000, 0.000000, 0.705859, -0.000000, -0.000000, 0.665859, -0.000000, 0.000000, 0.625859, -0.000000, -0.000000, 0.585859, -0.000000,
-0.000000, 0.545859, -0.000000, 0.000000, 0.505859, -0.000000, 0.000000, 0.465859, -0.000000, -0.000000, 0.425859, -0.000000, -0.000000, 0.385859, -0.000000,
-0.000000, 0.345859, -0.000000, 0.040000, 1.145859, -0.000000, 0.040000, 1.105859, -0.000000, 0.040000, 1.065859, -0.000000, 0.040000, 1.025859, -0.000000,
0.040000, 0.985859, -0.000000, 0.040000, 0.945859, -0.000000, 0.040000, 0.905859, -0.000000, 0.040000, 0.865859, -0.000000, 0.040000, 0.825859, -0.000000,
0.040000, 0.785859, -0.000000, 0.040000, 0.745859, -0.000000, 0.040000, 0.705859, -0.000000, 0.040000, 0.665859, -0.000000, 0.040000, 0.625859, -0.000000,
0.040000, 0.585859, -0.000000, 0.040000, 0.545859, -0.000000, 0.040000, 0.505859, -0.000000, 0.040000, 0.465859, -0.000000, 0.040000, 0.425859, -0.000000,
0.040000, 0.385859, -0.000000, 0.040000, 0.345859, -0.000000, 0.080000, 1.145859, -0.000000, 0.080000, 1.105859, -0.000000, 0.080000, 1.065859, -0.000000,
0.080000, 1.025859, -0.000000, 0.080000, 0.985859, -0.000000, 0.080000, 0.945859, -0.000000, 0.080000, 0.905859, -0.000000, 0.080000, 0.865859, -0.000000,
0.080000, 0.825859, -0.000000, 0.080000, 0.785859, -0.000000, 0.080000, 0.745859, -0.000000, 0.080000, 0.705859, -0.000000, 0.080000, 0.665859, -0.000000,
0.080000, 0.625859, -0.000000, 0.080000, 0.585859, -0.000000, 0.080000, 0.545859, -0.000000, 0.080000, 0.505859, -0.000000, 0.080000, 0.465859, -0.000000,
0.080000, 0.425859, -0.000000, 0.080000, 0.385859, -0.000000, 0.080000, 0.345859, -0.000000, 0.120000, 1.145859, -0.000000, 0.120000, 1.105859, -0.000000,
0.120000, 1.065859, -0.000000, 0.120000, 1.025859, -0.000000, 0.120000, 0.985859, -0.000000, 0.120000, 0.945859, -0.000000, 0.120000, 0.905859, -0.000000,
0.120000, 0.865859, -0.000000, 0.120000, 0.825859, -0.000000, 0.120000, 0.785859, -0.000000, 0.120000, 0.745859, -0.000000, 0.120000, 0.705859, -0.000000,
0.120000, 0.665859, -0.000000, 0.120000, 0.625859, -0.000000, 0.120000, 0.585859, -0.000000, 0.120000, 0.545859, -0.000000, 0.120000, 0.505859, -0.000000,
0.120000, 0.465859, -0.000000, 0.120000, 0.425859, -0.000000, 0.120000, 0.385859, -0.000000, 0.120000, 0.345859, -0.000000, 0.160000, 1.145859, -0.000000,
0.160000, 1.105859, -0.000000, 0.160000, 1.065859, -0.000000, 0.160000, 1.025859, -0.000000, 0.160000, 0.985859, -0.000000, 0.160000, 0.945859, -0.000000,
0.160000, 0.905859, -0.000000, 0.160000, 0.865859, -0.000000, 0.160000, 0.825859, -0.000000, 0.160000, 0.785859, -0.000000, 0.160000, 0.745859, -0.000000,
0.160000, 0.705859, -0.000000, 0.160000, 0.665859, -0.000000, 0.160000, 0.625859, -0.000000, 0.160000, 0.585859, -0.000000, 0.160000, 0.545859, -0.000000,
0.160000, 0.505859, -0.000000, 0.160000, 0.465859, -0.000000, 0.160000, 0.425859, -0.000000, 0.160000, 0.385859, -0.000000, 0.160000, 0.345859, -0.000000,
0.200000, 1.145859, -0.000000, 0.200000, 1.105859, -0.000000, 0.200000, 1.065859, -0.000000, 0.200000, 1.025859, -0.000000, 0.200000, 0.985859, -0.000000,
0.200000, 0.945859, -0.000000, 0.200000, 0.905859, -0.000000, 0.200000, 0.865859, -0.000000, 0.200000, 0.825859, -0.000000, 0.200000, 0.785859, -0.000000,
0.200000, 0.745859, -0.000000, 0.200000, 0.705859, -0.000000, 0.200000, 0.665859, -0.000000, 0.200000, 0.625859, -0.000000, 0.200000, 0.585859, -0.000000,
0.200000, 0.545859, -0.000000, 0.200000, 0.505859, -0.000000, 0.200000, 0.465859, -0.000000, 0.200000, 0.425859, -0.000000, 0.200000, 0.385859, -0.000000,
0.200000, 0.345859, -0.000000, -0.180000, 1.145859, -0.000000, -0.200000, 1.125859, -0.000000, -0.180000, 1.105859, -0.000000, -0.160000, 1.125859, -0.000000,
-0.200000, 1.085859, -0.000000, -0.180000, 1.065859, -0.000000, -0.160000, 1.085859, -0.000000, -0.200000, 1.045859, -0.000000, -0.180000, 1.025859, -0.000000,
-0.160000, 1.045859, -0.000000, -0.200000, 1.005859, -0.000000, -0.180000, 0.985859, -0.000000, -0.160000, 1.005859, -0.000000, -0.200000, 0.965859, -0.000000,
-0.180000, 0.945859, -0.000000, -0.160000, 0.965859, -0.000000, -0.200000, 0.925859, -0.000000, -0.180000, 0.905859, -0.000000, -0.160000, 0.925859, -0.000000,
-0.200000, 0.885859, -0.000000, -0.180000, 0.865859, -0.000000, -0.160000, 0.885859, -0.000000, -0.200000, 0.845859, -0.000000, -0.180000, 0.825859, -0.000000,
-0.160000, 0.845859, -0.000000, -0.200000, 0.805859, -0.000000, -0.180000, 0.785859, -0.000000, -0.160000, 0.805859, -0.000000, -0.200000, 0.765859, -0.000000,
-0.180000, 0.745859, -0.000000, -0.160000, 0.765859, -0.000000, -0.200000, 0.725859, -0.000000, -0.180000, 0.705859, -0.000000, -0.160000, 0.725859, -0.000000,
-0.200000, 0.685859, -0.000000, -0.180000, 0.665859, -0.000000, -0.160000, 0.685859, -0.000000, -0.200000, 0.645859, -0.000000, -0.180000, 0.625859, -0.000000,
-0.160000, 0.645859, -0.000000, -0.200000, 0.605859, -0.000000, -0.180000, 0.585859, -0.000000, -0.160000, 0.605859, -0.000000, -0.200000, 0.565859, -0.000000,
-0.180000, 0.545859, -0.000000, -0.160000, 0.565859, -0.000000, -0.200000, 0.525859, -0.000000, -0.180000, 0.505859, -0.000000, -0.160000, 0.525859, -0.000000,
-0.200000, 0.485859, -0.000000, -0.180000, 0.465859, -0.000000, -0.160000, 0.485859, -0.000000, -0.200000, 0.445859, -0.000000, -0.180000, 0.425859, -0.000000,
-0.160000, 0.445859, -0.000000, -0.200000, 0.405859, -0.000000, -0.180000, 0.385859, -0.000000, -0.160000, 0.405859, -0.000000, -0.200000, 0.365859, -0.000000,
-0.180000, 0.345859, -0.000000, -0.160000, 0.365859, -0.000000, -0.140000, 1.145859, -0.000000, -0.140000, 1.105859, -0.000000, -0.120000, 1.125859, -0.000000,
-0.140000, 1.065859, -0.000000, -0.120000, 1.085859, -0.000000, -0.140000, 1.025859, -0.000000, -0.120000, 1.045859, -0.000000, -0.140000, 0.985859, -0.000000,
-0.120000, 1.005859, -0.000000, -0.140000, 0.945859, -0.000000, -0.120000, 0.965859, -0.000000, -0.140000, 0.905859, -0.000000, -0.120000, 0.925859, -0.000000,
-0.140000, 0.865859, -0.000000, -0.120000, 0.885859, -0.000000, -0.140000, 0.825859, -0.000000, -0.120000, 0.845859, -0.000000, -0.140000, 0.785859, -0.000000,
-0.120000, 0.805859, -0.000000, -0.140000, 0.745859, -0.000000, -0.120000, 0.765859, -0.000000, -0.140000, 0.705859, -0.000000, -0.120000, 0.725859, -0.000000,
-0.140000, 0.665859, -0.000000, -0.120000, 0.685859, -0.000000, -0.140000, 0.625859, -0.000000, -0.120000, 0.645859, -0.000000, -0.140000, 0.585859, -0.000000,
-0.120000, 0.605859, -0.000000, -0.140000, 0.545859, -0.000000, -0.120000, 0.565859, -0.000000, -0.140000, 0.505859, -0.000000, -0.120000, 0.525859, -0.000000,
-0.140000, 0.465859, -0.000000, -0.120000, 0.485859, -0.000000, -0.140000, 0.425859, -0.000000, -0.120000, 0.445859, -0.000000, -0.140000, 0.385859, -0.000000,
-0.120000, 0.405859, -0.000000, -0.140000, 0.345859, -0.000000, -0.120000, 0.365859, -0.000000, -0.100000, 1.145859, -0.000000, -0.100000, 1.105859, -0.000000,
-0.080000, 1.125859, -0.000000, -0.100000, 1.065859, -0.000000, -0.080000, 1.085859, -0.000000, -0.100000, 1.025859, -0.000000, -0.080000, 1.045859, -0.000000,
-0.100000, 0.985859, -0.000000, -0.080000, 1.005859, -0.000000, -0.100000, 0.945859, -0.000000, -0.080000, 0.965859, -0.000000, -0.100000, 0.905859, -0.000000,
-0.080000, 0.925859, -0.000000, -0.100000, 0.865859, -0.000000, -0.080000, 0.885859, -0.000000, -0.100000, 0.825859, -0.000000, -0.080000, 0.845859, -0.000000,
-0.100000, 0.785859, -0.000000, -0.080000, 0.805859, -0.000000, -0.100000, 0.745859, -0.000000, -0.080000, 0.765859, -0.000000, -0.100000, 0.705859, -0.000000,
-0.080000, 0.725859, -0.000000, -0.100000, 0.665859, -0.000000, -0.080000, 0.685859, -0.000000, -0.100000, 0.625859, -0.000000, -0.080000, 0.645859, -0.000000,
-0.100000, 0.585859, -0.000000, -0.080000, 0.605859, -0.000000, -0.100000, 0.545859, -0.000000, -0.080000, 0.565859, -0.000000, -0.100000, 0.505859, -0.000000,
-0.080000, 0.525859, -0.000000, -0.100000, 0.465859, -0.000000, -0.080000, 0.485859, -0.000000, -0.100000, 0.425859, -0.000000, -0.080000, 0.445859, -0.000000,
-0.100000, 0.385859, -0.000000, -0.080000, 0.405859, -0.000000, -0.100000, 0.345859, -0.000000, -0.080000, 0.365859, -0.000000, -0.060000, 1.145859, -0.000000,
-0.060000, 1.105859, -0.000000, -0.040000, 1.125859, -0.000000, -0.060000, 1.065859, -0.000000, -0.040000, 1.085859, -0.000000, -0.060000, 1.025859, -0.000000,
-0.040000, 1.045859, -0.000000, -0.060000, 0.985859, -0.000000, -0.040000, 1.005859, -0.000000, -0.060000, 0.945859, -0.000000, -0.040000, 0.965859, -0.000000,
-0.060000, 0.905859, -0.000000, -0.040000, 0.925859, -0.000000, -0.060000, 0.865859, -0.000000, -0.040000, 0.885859, -0.000000, -0.060000, 0.825859, -0.000000,
-0.040000, 0.845859, -0.000000, -0.060000, 0.785859, -0.000000, -0.040000, 0.805859, -0.000000, -0.060000, 0.745859, -0.000000, -0.040000, 0.765859, -0.000000,
-0.060000, 0.705859, -0.000000, -0.040000, 0.725859, -0.000000, -0.060000, 0.665859, -0.000000, -0.040000, 0.685859, -0.000000, -0.060000, 0.625859, -0.000000,
-0.040000, 0.645859, -0.000000, -0.060000, 0.585859, -0.000000, -0.040000, 0.605859, -0.000000, -0.060000, 0.545859, -0.000000, -0.040000, 0.565859, -0.000000,
-0.060000, 0.505859, -0.000000, -0.040000, 0.525859, -0.000000, -0.060000, 0.465859, -0.000000, -0.040000, 0.485859, -0.000000, -0.060000, 0.425859, -0.000000,
-0.040000, 0.445859, -0.000000, -0.060000, 0.385859, -0.000000, -0.040000, 0.405859, -0.000000, -0.060000, 0.345859, -0.000000, -0.040000, 0.365859, -0.000000,
-0.020000, 1.145859, -0.000000, -0.020000, 1.105859, -0.000000, 0.000000, 1.125859, -0.000000, -0.020000, 1.065859, -0.000000, 0.000000, 1.085859, -0.000000,
-0.020000, 1.025859, -0.000000, 0.000000, 1.045859, -0.000000, -0.020000, 0.985859, -0.000000, 0.000000, 1.005859, -0.000000, -0.020000, 0.945859, -0.000000,
0.000000, 0.965859, -0.000000, -0.020000, 0.905859, -0.000000, 0.000000, 0.925859, -0.000000, -0.020000, 0.865859, -0.000000, 0.000000, 0.885859, -0.000000,
-0.020000, 0.825859, -0.000000, 0.000000, 0.845859, -0.000000, -0.020000, 0.785859, -0.000000, 0.000000, 0.805859, -0.000000, -0.020000, 0.745859, -0.000000,
0.000000, 0.765859, -0.000000, -0.020000, 0.705859, -0.000000, 0.000000, 0.725859, -0.000000, -0.020000, 0.665859, -0.000000, -0.000000, 0.685859, -0.000000,
-0.020000, 0.625859, -0.000000, -0.000000, 0.645859, -0.000000, -0.020000, 0.585859, -0.000000, -0.000000, 0.605859, -0.000000, -0.020000, 0.545859, -0.000000,
-0.000000, 0.565859, -0.000000, -0.020000, 0.505859, -0.000000, -0.000000, 0.525859, -0.000000, -0.020000, 0.465859, -0.000000, 0.000000, 0.485859, -0.000000,
-0.020000, 0.425859, -0.000000, -0.000000, 0.445859, -0.000000, -0.020000, 0.385859, -0.000000, -0.000000, 0.405859, -0.000000, -0.020000, 0.345859, -0.000000,
-0.000000, 0.365859, -0.000000, 0.020000, 1.145859, -0.000000, 0.020000, 1.105859, -0.000000, 0.040000, 1.125859, -0.000000, 0.020000, 1.065859, -0.000000,
0.040000, 1.085859, -0.000000, 0.020000, 1.025859, -0.000000, 0.040000, 1.045859, -0.000000, 0.020000, 0.985859, -0.000000, 0.040000, 1.005859, -0.000000,
0.020000, 0.945859, -0.000000, 0.040000, 0.965859, -0.000000, 0.020000, 0.905859, -0.000000, 0.040000, 0.925859, -0.000000, 0.020000, 0.865859, -0.000000,
0.040000, 0.885859, -0.000000, 0.020000, 0.825859, -0.000000, 0.040000, 0.845859, -0.000000, 0.020000, 0.785859, -0.000000, 0.040000, 0.805859, -0.000000,
0.020000, 0.745859, -0.000000, 0.040000, 0.765859, -0.000000, 0.020000, 0.705859, -0.000000, 0.040000, 0.725859, -0.000000, 0.020000, 0.665859, -0.000000,
0.040000, 0.685859, -0.000000, 0.020000, 0.625859, -0.000000, 0.040000, 0.645859, -0.000000, 0.020000, 0.585859, -0.000000, 0.040000, 0.605859, -0.000000,
0.020000, 0.545859, -0.000000, 0.040000, 0.565859, -0.000000, 0.020000, 0.505859, -0.000000, 0.040000, 0.525859, -0.000000, 0.020000, 0.465859, -0.000000,
0.040000, 0.485859, -0.000000, 0.020000, 0.425859, -0.000000, 0.040000, 0.445859, -0.000000, 0.020000, 0.385859, -0.000000, 0.040000, 0.405859, -0.000000,
0.020000, 0.345859, -0.000000, 0.040000, 0.365859, -0.000000, 0.060000, 1.145859, -0.000000, 0.060000, 1.105859, -0.000000, 0.080000, 1.125859, -0.000000,
0.060000, 1.065859, -0.000000, 0.080000, 1.085859, -0.000000, 0.060000, 1.025859, -0.000000, 0.080000, 1.045859, -0.000000, 0.060000, 0.985859, -0.000000,
0.080000, 1.005859, -0.000000, 0.060000, 0.945859, -0.000000, 0.080000, 0.965859, -0.000000, 0.060000, 0.905859, -0.000000, 0.080000, 0.925859, -0.000000,
0.060000, 0.865859, -0.000000, 0.080000, 0.885859, -0.000000, 0.060000, 0.825859, -0.000000, 0.080000, 0.845859, -0.000000, 0.060000, 0.785859, -0.000000,
0.080000, 0.805859, -0.000000, 0.060000, 0.745859, -0.000000, 0.080000, 0.765859, -0.000000, 0.060000, 0.705859, -0.000000, 0.080000, 0.725859, -0.000000,
0.060000, 0.665859, -0.000000, 0.080000, 0.685859, -0.000000, 0.060000, 0.625859, -0.000000, 0.080000, 0.645859, -0.000000, 0.060000, 0.585859, -0.000000,
0.080000, 0.605859, -0.000000, 0.060000, 0.545859, -0.000000, 0.080000, 0.565859, -0.000000, 0.060000, 0.505859, -0.000000, 0.080000, 0.525859, -0.000000,
0.060000, 0.465859, -0.000000, 0.080000, 0.485859, -0.000000, 0.060000, 0.425859, -0.000000, 0.080000, 0.445859, -0.000000, 0.060000, 0.385859, -0.000000,
0.080000, 0.405859, -0.000000, 0.060000, 0.345859, -0.000000, 0.080000, 0.365859, -0.000000, 0.100000, 1.145859, -0.000000, 0.100000, 1.105859, -0.000000,
0.120000, 1.125859, -0.000000, 0.100000, 1.065859, -0.000000, 0.120000, 1.085859, -0.000000, 0.100000, 1.025859, -0.000000, 0.120000, 1.045859, -0.000000,
0.100000, 0.985859, -0.000000, 0.120000, 1.005859, -0.000000, 0.100000, 0.945859, -0.000000, 0.120000, 0.965859, -0.000000, 0.100000, 0.905859, -0.000000,
0.120000, 0.925859, -0.000000, 0.100000, 0.865859, -0.000000, 0.120000, 0.885859, -0.000000, 0.100000, 0.825859, -0.000000, 0.120000, 0.845859, -0.000000,
0.100000, 0.785859, -0.000000, 0.120000, 0.805859, -0.000000, 0.100000, 0.745859, -0.000000, 0.120000, 0.765859, -0.000000, 0.100000, 0.705859, -0.000000,
0.120000, 0.725859, -0.000000, 0.100000, 0.665859, -0.000000, 0.120000, 0.685859, -0.000000, 0.100000, 0.625859, -0.000000, 0.120000, 0.645859, -0.000000,
0.100000, 0.585859, -0.000000, 0.120000, 0.605859, -0.000000, 0.100000, 0.545859, -0.000000, 0.120000, 0.565859, -0.000000, 0.100000, 0.505859, -0.000000,
0.120000, 0.525859, -0.000000, 0.100000, 0.465859, -0.000000, 0.120000, 0.485859, -0.000000, 0.100000, 0.425859, -0.000000, 0.120000, 0.445859, -0.000000,
0.100000, 0.385859, -0.000000, 0.120000, 0.405859, -0.000000, 0.100000, 0.345859, -0.000000, 0.120000, 0.365859, -0.000000, 0.140000, 1.145859, -0.000000,
0.140000, 1.105859, -0.000000, 0.160000, 1.125859, -0.000000, 0.140000, 1.065859, -0.000000, 0.160000, 1.085859, -0.000000, 0.140000, 1.025859, -0.000000,
0.160000, 1.045859, -0.000000, 0.140000, 0.985859, -0.000000, 0.160000, 1.005859, -0.000000, 0.140000, 0.945859, -0.000000, 0.160000, 0.965859, -0.000000,
0.140000, 0.905859, -0.000000, 0.160000, 0.925859, -0.000000, 0.140000, 0.865859, -0.000000, 0.160000, 0.885859, -0.000000, 0.140000, 0.825859, -0.000000,
0.160000, 0.845859, -0.000000, 0.140000, 0.785859, -0.000000, 0.160000, 0.805859, -0.000000, 0.140000, 0.745859, -0.000000, 0.160000, 0.765859, -0.000000,
0.140000, 0.705859, -0.000000, 0.160000, 0.725859, -0.000000, 0.140000, 0.665859, -0.000000, 0.160000, 0.685859, -0.000000, 0.140000, 0.625859, -0.000000,
0.160000, 0.645859, -0.000000, 0.140000, 0.585859, -0.000000, 0.160000, 0.605859, -0.000000, 0.140000, 0.545859, -0.000000, 0.160000, 0.565859, -0.000000,
0.140000, 0.505859, -0.000000, 0.160000, 0.525859, -0.000000, 0.140000, 0.465859, -0.000000, 0.160000, 0.485859, -0.000000, 0.140000, 0.425859, -0.000000,
0.160000, 0.445859, -0.000000, 0.140000, 0.385859, -0.000000, 0.160000, 0.405859, -0.000000, 0.140000, 0.345859, -0.000000, 0.160000, 0.365859, -0.000000,
0.180000, 1.145859, -0.000000, 0.180000, 1.105859, -0.000000, 0.200000, 1.125859, -0.000000, 0.180000, 1.065859, -0.000000, 0.200000, 1.085859, -0.000000,
0.180000, 1.025859, -0.000000, 0.200000, 1.045859, -0.000000, 0.180000, 0.985859, -0.000000, 0.200000, 1.005859, -0.000000, 0.180000, 0.945859, -0.000000,
0.200000, 0.965859, -0.000000, 0.180000, 0.905859, -0.000000, 0.200000, 0.925859, -0.000000, 0.180000, 0.865859, -0.000000, 0.200000, 0.885859, -0.000000,
0.180000, 0.825859, -0.000000, 0.200000, 0.845859, -0.000000, 0.180000, 0.785859, -0.000000, 0.200000, 0.805859, -0.000000, 0.180000, 0.745859, -0.000000,
0.200000, 0.765859, -0.000000, 0.180000, 0.705859, -0.000000, 0.200000, 0.725859, -0.000000, 0.180000, 0.665859, -0.000000, 0.200000, 0.685859, -0.000000,
0.180000, 0.625859, -0.000000, 0.200000, 0.645859, -0.000000, 0.180000, 0.585859, -0.000000, 0.200000, 0.605859, -0.000000, 0.180000, 0.545859, -0.000000,
0.200000, 0.565859, -0.000000, 0.180000, 0.505859, -0.000000, 0.200000, 0.525859, -0.000000, 0.180000, 0.465859, -0.000000, 0.200000, 0.485859, -0.000000,
0.180000, 0.425859, -0.000000, 0.200000, 0.445859, -0.000000, 0.180000, 0.385859, -0.000000, 0.200000, 0.405859, -0.000000, 0.180000, 0.345859, -0.000000,
0.200000, 0.365859, -0.000000, 0.180000, 0.365859, -0.000000, 0.180000, 0.405859, -0.000000, 0.180000, 0.445859, -0.000000, 0.180000, 0.485859, -0.000000,
0.180000, 0.525859, -0.000000, 0.180000, 0.565859, -0.000000, 0.180000, 0.605859, -0.000000, 0.180000, 0.645859, -0.000000, 0.180000, 0.685859, -0.000000,
0.180000, 0.725859, -0.000000, 0.180000, 0.765859, -0.000000, 0.180000, 0.805859, -0.000000, 0.180000, 0.845859, -0.000000, 0.180000, 0.885859, -0.000000,
0.180000, 0.925859, -0.000000, 0.180000, 0.965859, -0.000000, 0.180000, 1.005859, -0.000000, 0.180000, 1.045859, -0.000000, 0.180000, 1.085859, -0.000000,
0.180000, 1.125859, -0.000000, 0.140000, 0.365859, -0.000000, 0.140000, 0.405859, -0.000000, 0.140000, 0.445859, -0.000000, 0.140000, 0.485859, -0.000000,
0.140000, 0.525859, -0.000000, 0.140000, 0.565859, -0.000000, 0.140000, 0.605859, -0.000000, 0.140000, 0.645859, -0.000000, 0.140000, 0.685859, -0.000000,
0.140000, 0.725859, -0.000000, 0.140000, 0.765859, -0.000000, 0.140000, 0.805859, -0.000000, 0.140000, 0.845859, -0.000000, 0.140000, 0.885859, -0.000000,
0.140000, 0.925859, -0.000000, 0.140000, 0.965859, -0.000000, 0.140000, 1.005859, -0.000000, 0.140000, 1.045859, -0.000000, 0.140000, 1.085859, -0.000000,
0.140000, 1.125859, -0.000000, 0.100000, 0.365859, -0.000000, 0.100000, 0.405859, -0.000000, 0.100000, 0.445859, -0.000000, 0.100000, 0.485859, -0.000000,
0.100000, 0.525859, -0.000000, 0.100000, 0.565859, -0.000000, 0.100000, 0.605859, -0.000000, 0.100000, 0.645859, -0.000000, 0.100000, 0.685859, -0.000000,
0.100000, 0.725859, -0.000000, 0.100000, 0.765859, -0.000000, 0.100000, 0.805859, -0.000000, 0.100000, 0.845859, -0.000000, 0.100000, 0.885859, -0.000000,
0.100000, 0.925859, -0.000000, 0.100000, 0.965859, -0.000000, 0.100000, 1.005859, -0.000000, 0.100000, 1.045859, -0.000000, 0.100000, 1.085859, -0.000000,
0.100000, 1.125859, -0.000000, 0.060000, 0.365859, -0.000000, 0.060000, 0.405859, -0.000000, 0.060000, 0.445859, -0.000000, 0.060000, 0.485859, -0.000000,
0.060000, 0.525859, -0.000000, 0.060000, 0.565859, -0.000000, 0.060000, 0.605859, -0.000000, 0.060000, 0.645859, -0.000000, 0.060000, 0.685859, -0.000000,
0.060000, 0.725859, -0.000000, 0.060000, 0.765859, -0.000000, 0.060000, 0.805859, -0.000000, 0.060000, 0.845859, -0.000000, 0.060000, 0.885859, -0.000000,
0.060000, 0.925859, -0.000000, 0.060000, 0.965859, -0.000000, 0.060000, 1.005859, -0.000000, 0.060000, 1.045859, -0.000000, 0.060000, 1.085859, -0.000000,
0.060000, 1.125859, -0.000000, 0.020000, 0.365859, -0.000000, 0.020000, 0.405859, -0.000000, 0.020000, 0.445859, -0.000000, 0.020000, 0.485859, -0.000000,
0.020000, 0.525859, -0.000000, 0.020000, 0.565859, -0.000000, 0.020000, 0.605859, -0.000000, 0.020000, 0.645859, -0.000000, 0.020000, 0.685859, -0.000000,
0.020000, 0.725859, -0.000000, 0.020000, 0.765859, -0.000000, 0.020000, 0.805859, -0.000000, 0.020000, 0.845859, -0.000000, 0.020000, 0.885859, -0.000000,
0.020000, 0.925859, -0.000000, 0.020000, 0.965859, -0.000000, 0.020000, 1.005859, -0.000000, 0.020000, 1.045859, -0.000000, 0.020000, 1.085859, -0.000000,
0.020000, 1.125859, -0.000000, -0.020000, 0.365859, -0.000000, -0.020000, 0.405859, -0.000000, -0.020000, 0.445859, -0.000000, -0.020000, 0.485859, -0.000000,
-0.020000, 0.525859, -0.000000, -0.020000, 0.565859, -0.000000, -0.020000, 0.605859, -0.000000, -0.020000, 0.645859, -0.000000, -0.020000, 0.685859, -0.000000,
-0.020000, 0.725859, -0.000000, -0.020000, 0.765859, -0.000000, -0.020000, 0.805859, -0.000000, -0.020000, 0.845859, -0.000000, -0.020000, 0.885859, -0.000000,
-0.020000, 0.925859, -0.000000, -0.020000, 0.965859, -0.000000, -0.020000, 1.005859, -0.000000, -0.020000, 1.045859, -0.000000, -0.020000, 1.085859, -0.000000,
-0.020000, 1.125859, -0.000000, -0.060000, 0.365859, -0.000000, -0.060000, 0.405859, -0.000000, -0.060000, 0.445859, -0.000000, -0.060000, 0.485859, -0.000000,
-0.060000, 0.525859, -0.000000, -0.060000, 0.565859, -0.000000, -0.060000, 0.605859, -0.000000, -0.060000, 0.645859, -0.000000, -0.060000, 0.685859, -0.000000,
-0.060000, 0.725859, -0.000000, -0.060000, 0.765859, -0.000000, -0.060000, 0.805859, -0.000000, -0.060000, 0.845859, -0.000000, -0.060000, 0.885859, -0.000000,
-0.060000, 0.925859, -0.000000, -0.060000, 0.965859, -0.000000, -0.060000, 1.005859, -0.000000, -0.060000, 1.045859, -0.000000, -0.060000, 1.085859, -0.000000,
-0.060000, 1.125859, -0.000000, -0.100000, 0.365859, -0.000000, -0.100000, 0.405859, -0.000000, -0.100000, 0.445859, -0.000000, -0.100000, 0.485859, -0.000000,
-0.100000, 0.525859, -0.000000, -0.100000, 0.565859, -0.000000, -0.100000, 0.605859, -0.000000, -0.100000, 0.645859, -0.000000, -0.100000, 0.685859, -0.000000,
-0.100000, 0.725859, -0.000000, -0.100000, 0.765859, -0.000000, -0.100000, 0.805859, -0.000000, -0.100000, 0.845859, -0.000000, -0.100000, 0.885859, -0.000000,
-0.100000, 0.925859, -0.000000, -0.100000, 0.965859, -0.000000, -0.100000, 1.005859, -0.000000, -0.100000, 1.045859, -0.000000, -0.100000, 1.085859, -0.000000,
-0.100000, 1.125859, -0.000000, -0.140000, 0.365859, -0.000000, -0.140000, 0.405859, -0.000000, -0.140000, 0.445859, -0.000000, -0.140000, 0.485859, -0.000000,
-0.140000, 0.525859, -0.000000, -0.140000, 0.565859, -0.000000, -0.140000, 0.605859, -0.000000, -0.140000, 0.645859, -0.000000, -0.140000, 0.685859, -0.000000,
-0.140000, 0.725859, -0.000000, -0.140000, 0.765859, -0.000000, -0.140000, 0.805859, -0.000000, -0.140000, 0.845859, -0.000000, -0.140000, 0.885859, -0.000000,
-0.140000, 0.925859, -0.000000, -0.140000, 0.965859, -0.000000, -0.140000, 1.005859, -0.000000, -0.140000, 1.045859, -0.000000, -0.140000, 1.085859, -0.000000,
-0.140000, 1.125859, -0.000000, -0.180000, 0.365859, -0.000000, -0.180000, 0.405859, -0.000000, -0.180000, 0.445859, -0.000000, -0.180000, 0.485859, -0.000000,
-0.180000, 0.525859, -0.000000, -0.180000, 0.565859, -0.000000, -0.180000, 0.605859, -0.000000, -0.180000, 0.645859, -0.000000, -0.180000, 0.685859, -0.000000,
-0.180000, 0.725859, -0.000000, -0.180000, 0.765859, -0.000000, -0.180000, 0.805859, -0.000000, -0.180000, 0.845859, -0.000000, -0.180000, 0.885859, -0.000000,
-0.180000, 0.925859, -0.000000, -0.180000, 0.965859, -0.000000, -0.180000, 1.005859, -0.000000, -0.180000, 1.045859, -0.000000, -0.180000, 1.085859, -0.000000,
-0.180000, 1.125859, -0.000000, -0.190000, 1.145859, -0.000000, -0.200000, 1.115859, -0.000000, -0.170000, 1.105859, -0.000000, -0.160000, 1.135859, -0.000000,
-0.200000, 1.075859, -0.000000, -0.170000, 1.065859, -0.000000, -0.160000, 1.095859, -0.000000, -0.200000, 1.035859, -0.000000, -0.170000, 1.025859, -0.000000,
-0.160000, 1.055859, -0.000000, -0.200000, 0.995859, -0.000000, -0.170000, 0.985859, -0.000000, -0.160000, 1.015859, -0.000000, -0.200000, 0.955859, -0.000000,
-0.170000, 0.945859, -0.000000, -0.160000, 0.975859, -0.000000, -0.200000, 0.915859, -0.000000, -0.170000, 0.905859, -0.000000, -0.160000, 0.935859, -0.000000,
-0.200000, 0.875859, -0.000000, -0.170000, 0.865859, -0.000000, -0.160000, 0.895859, -0.000000, -0.200000, 0.835859, -0.000000, -0.170000, 0.825859, -0.000000,
-0.160000, 0.855859, -0.000000, -0.200000, 0.795859, -0.000000, -0.170000, 0.785859, -0.000000, -0.160000, 0.815859, -0.000000, -0.200000, 0.755859, -0.000000,
-0.170000, 0.745859, -0.000000, -0.160000, 0.775859, -0.000000, -0.200000, 0.715859, -0.000000, -0.170000, 0.705859, -0.000000, -0.160000, 0.735859, -0.000000,
-0.200000, 0.675859, -0.000000, -0.170000, 0.665859, -0.000000, -0.160000, 0.695859, -0.000000, -0.200000, 0.635859, -0.000000, -0.170000, 0.625859, -0.000000,
-0.160000, 0.655859, -0.000000, -0.200000, 0.595859, -0.000000, -0.170000, 0.585859, -0.000000, -0.160000, 0.615859, -0.000000, -0.200000, 0.555859, -0.000000,
-0.170000, 0.545859, -0.000000, -0.160000, 0.575859, -0.000000, -0.200000, 0.515859, -0.000000, -0.170000, 0.505859, -0.000000, -0.160000, 0.535859, -0.000000,
-0.200000, 0.475859, -0.000000, -0.170000, 0.465859, -0.000000, -0.160000, 0.495859, -0.000000, -0.200000, 0.435859, -0.000000, -0.170000, 0.425859, -0.000000,
-0.160000, 0.455859, -0.000000, -0.200000, 0.395859, -0.000000, -0.170000, 0.385859, -0.000000, -0.160000, 0.415859, -0.000000, -0.200000, 0.355859, -0.000000,
-0.170000, 0.345859, -0.000000, -0.160000, 0.375859, -0.000000, -0.150000, 1.145859, -0.000000, -0.130000, 1.105859, -0.000000, -0.120000, 1.135859, -0.000000,
-0.130000, 1.065859, -0.000000, -0.120000, 1.095859, -0.000000, -0.130000, 1.025859, -0.000000, -0.120000, 1.055859, -0.000000, -0.130000, 0.985859, -0.000000,
-0.120000, 1.015859, -0.000000, -0.130000, 0.945859, -0.000000, -0.120000, 0.975859, -0.000000, -0.130000, 0.905859, -0.000000, -0.120000, 0.935859, -0.000000,
-0.130000, 0.865859, -0.000000, -0.120000, 0.895859, -0.000000, -0.130000, 0.825859, -0.000000, -0.120000, 0.855859, -0.000000, -0.130000, 0.785859, -0.000000,
-0.120000, 0.815859, -0.000000, -0.130000, 0.745859, -0.000000, -0.120000, 0.775859, -0.000000, -0.130000, 0.705859, -0.000000, -0.120000, 0.735859, -0.000000,
-0.130000, 0.665859, -0.000000, -0.120000, 0.695859, -0.000000, -0.130000, 0.625859, -0.000000, -0.120000, 0.655859, -0.000000, -0.130000, 0.585859, -0.000000,
-0.120000, 0.615859, -0.000000, -0.130000, 0.545859, -0.000000, -0.120000, 0.575859, -0.000000, -0.130000, 0.505859, -0.000000, -0.120000, 0.535859, -0.000000,
-0.130000, 0.465859, -0.000000, -0.120000, 0.495859, -0.000000, -0.130000, 0.425859, -0.000000, -0.120000, 0.455859, -0.000000, -0.130000, 0.385859, -0.000000,
-0.120000, 0.415859, -0.000000, -0.130000, 0.345859, -0.000000, -0.120000, 0.375859, -0.000000, -0.110000, 1.145859, -0.000000, -0.090000, 1.105859, -0.000000,
-0.080000, 1.135859, -0.000000, -0.090000, 1.065859, -0.000000, -0.080000, 1.095859, -0.000000, -0.090000, 1.025859, -0.000000, -0.080000, 1.055859, -0.000000,
-0.090000, 0.985859, -0.000000, -0.080000, 1.015859, -0.000000, -0.090000, 0.945859, -0.000000, -0.080000, 0.975859, -0.000000, -0.090000, 0.905859, -0.000000,
-0.080000, 0.935859, -0.000000, -0.090000, 0.865859, -0.000000, -0.080000, 0.895859, -0.000000, -0.090000, 0.825859, -0.000000, -0.080000, 0.855859, -0.000000,
-0.090000, 0.785859, -0.000000, -0.080000, 0.815859, -0.000000, -0.090000, 0.745859, -0.000000, -0.080000, 0.775859, -0.000000, -0.090000, 0.705859, -0.000000,
-0.080000, 0.735859, -0.000000, -0.090000, 0.665859, -0.000000, -0.080000, 0.695859, -0.000000, -0.090000, 0.625859, -0.000000, -0.080000, 0.655859, -0.000000,
-0.090000, 0.585859, -0.000000, -0.080000, 0.615859, -0.000000, -0.090000, 0.545859, -0.000000, -0.080000, 0.575859, -0.000000, -0.090000, 0.505859, -0.000000,
-0.080000, 0.535859, -0.000000, -0.090000, 0.465859, -0.000000, -0.080000, 0.495859, -0.000000, -0.090000, 0.425859, -0.000000, -0.080000, 0.455859, -0.000000,
-0.090000, 0.385859, -0.000000, -0.080000, 0.415859, -0.000000, -0.090000, 0.345859, -0.000000, -0.080000, 0.375859, -0.000000, -0.070000, 1.145859, -0.000000,
-0.050000, 1.105859, -0.000000, -0.040000, 1.135859, -0.000000, -0.050000, 1.065859, -0.000000, -0.040000, 1.095859, -0.000000, -0.050000, 1.025859, -0.000000,
-0.040000, 1.055859, -0.000000, -0.050000, 0.985859, -0.000000, -0.040000, 1.015859, -0.000000, -0.050000, 0.945859, -0.000000, -0.040000, 0.975859, -0.000000,
-0.050000, 0.905859, -0.000000, -0.040000, 0.935859, -0.000000, -0.050000, 0.865859, -0.000000, -0.040000, 0.895859, -0.000000, -0.050000, 0.825859, -0.000000,
-0.040000, 0.855859, -0.000000, -0.050000, 0.785859, -0.000000, -0.040000, 0.815859, -0.000000, -0.050000, 0.745859, -0.000000, -0.040000, 0.775859, -0.000000,
-0.050000, 0.705859, -0.000000, -0.040000, 0.735859, -0.000000, -0.050000, 0.665859, -0.000000, -0.040000, 0.695859, -0.000000, -0.050000, 0.625859, -0.000000,
-0.040000, 0.655859, -0.000000, -0.050000, 0.585859, -0.000000, -0.040000, 0.615859, -0.000000, -0.050000, 0.545859, -0.000000, -0.040000, 0.575859, -0.000000,
-0.050000, 0.505859, -0.000000, -0.040000, 0.535859, -0.000000, -0.050000, 0.465859, -0.000000, -0.040000, 0.495859, -0.000000, -0.050000, 0.425859, -0.000000,
-0.040000, 0.455859, -0.000000, -0.050000, 0.385859, -0.000000, -0.040000, 0.415859, -0.000000, -0.050000, 0.345859, -0.000000, -0.040000, 0.375859, -0.000000,
-0.030000, 1.145859, -0.000000, -0.010000, 1.105859, -0.000000, 0.000000, 1.135859, -0.000000, -0.010000, 1.065859, -0.000000, 0.000000, 1.095859, -0.000000,
-0.010000, 1.025859, -0.000000, 0.000000, 1.055859, -0.000000, -0.010000, 0.985859, -0.000000, 0.000000, 1.015859, -0.000000, -0.010000, 0.945859, -0.000000,
0.000000, 0.975859, -0.000000, -0.010000, 0.905859, -0.000000, 0.000000, 0.935859, -0.000000, -0.010000, 0.865859, -0.000000, 0.000000, 0.895859, -0.000000,
-0.010000, 0.825859, -0.000000, 0.000000, 0.855859, -0.000000, -0.010000, 0.785859, -0.000000, 0.000000, 0.815859, -0.000000, -0.010000, 0.745859, -0.000000,
0.000000, 0.775859, -0.000000, -0.010000, 0.705859, -0.000000, 0.000000, 0.735859, -0.000000, -0.010000, 0.665859, -0.000000, -0.000000, 0.695859, -0.000000,
-0.010000, 0.625859, -0.000000, -0.000000, 0.655859, -0.000000, -0.010000, 0.585859, -0.000000, -0.000000, 0.615859, -0.000000, -0.010000, 0.545859, -0.000000,
-0.000000, 0.575859, -0.000000, -0.010000, 0.505859, -0.000000, -0.000000, 0.535859, -0.000000, -0.010000, 0.465859, -0.000000, 0.000000, 0.495859, -0.000000,
-0.010000, 0.425859, -0.000000, -0.000000, 0.455859, -0.000000, -0.010000, 0.385859, -0.000000, -0.000000, 0.415859, -0.000000, -0.010000, 0.345859, -0.000000,
-0.000000, 0.375859, -0.000000, 0.010000, 1.145859, -0.000000, 0.030000, 1.105859, -0.000000, 0.040000, 1.135859, -0.000000, 0.030000, 1.065859, -0.000000,
0.040000, 1.095859, -0.000000, 0.030000, 1.025859, -0.000000, 0.040000, 1.055859, -0.000000, 0.030000, 0.985859, -0.000000, 0.040000, 1.015859, -0.000000,
0.030000, 0.945859, -0.000000, 0.040000, 0.975859, -0.000000, 0.030000, 0.905859, -0.000000, 0.040000, 0.935859, -0.000000, 0.030000, 0.865859, -0.000000,
0.040000, 0.895859, -0.000000, 0.030000, 0.825859, -0.000000, 0.040000, 0.855859, -0.000000, 0.030000, 0.785859, -0.000000, 0.040000, 0.815859, -0.000000,
0.030000, 0.745859, -0.000000, 0.040000, 0.775859, -0.000000, 0.030000, 0.705859, -0.000000, 0.040000, 0.735859, -0.000000, 0.030000, 0.665859, -0.000000,
0.040000, 0.695859, -0.000000, 0.030000, 0.625859, -0.000000, 0.040000, 0.655859, -0.000000, 0.030000, 0.585859, -0.000000, 0.040000, 0.615859, -0.000000,
0.030000, 0.545859, -0.000000, 0.040000, 0.575859, -0.000000, 0.030000, 0.505859, -0.000000, 0.040000, 0.535859, -0.000000, 0.030000, 0.465859, -0.000000,
0.040000, 0.495859, -0.000000, 0.030000, 0.425859, -0.000000, 0.040000, 0.455859, -0.000000, 0.030000, 0.385859, -0.000000, 0.040000, 0.415859, -0.000000,
0.030000, 0.345859, -0.000000, 0.040000, 0.375859, -0.000000, 0.050000, 1.145859, -0.000000, 0.070000, 1.105859, -0.000000, 0.080000, 1.135859, -0.000000,
0.070000, 1.065859, -0.000000, 0.080000, 1.095859, -0.000000, 0.070000, 1.025859, -0.000000, 0.080000, 1.055859, -0.000000, 0.070000, 0.985859, -0.000000,
0.080000, 1.015859, -0.000000, 0.070000, 0.945859, -0.000000, 0.080000, 0.975859, -0.000000, 0.070000, 0.905859, -0.000000, 0.080000, 0.935859, -0.000000,
0.070000, 0.865859, -0.000000, 0.080000, 0.895859, -0.000000, 0.070000, 0.825859, -0.000000, 0.080000, 0.855859, -0.000000, 0.070000, 0.785859, -0.000000,
0.080000, 0.815859, -0.000000, 0.070000, 0.745859, -0.000000, 0.080000, 0.775859, -0.000000, 0.070000, 0.705859, -0.000000, 0.080000, 0.735859, -0.000000,
0.070000, 0.665859, -0.000000, 0.080000, 0.695859, -0.000000, 0.070000, 0.625859, -0.000000, 0.080000, 0.655859, -0.000000, 0.070000, 0.585859, -0.000000,
0.080000, 0.615859, -0.000000, 0.070000, 0.545859, -0.000000, 0.080000, 0.575859, -0.000000, 0.070000, 0.505859, -0.000000, 0.080000, 0.535859, -0.000000,
0.070000, 0.465859, -0.000000, 0.080000, 0.495859, -0.000000, 0.070000, 0.425859, -0.000000, 0.080000, 0.455859, -0.000000, 0.070000, 0.385859, -0.000000,
0.080000, 0.415859, -0.000000, 0.070000, 0.345859, -0.000000, 0.080000, 0.375859, -0.000000, 0.090000, 1.145859, -0.000000, 0.110000, 1.105859, -0.000000,
0.120000, 1.135859, -0.000000, 0.110000, 1.065859, -0.000000, 0.120000, 1.095859, -0.000000, 0.110000, 1.025859, -0.000000, 0.120000, 1.055859, -0.000000,
0.110000, 0.985859, -0.000000, 0.120000, 1.015859, -0.000000, 0.110000, 0.945859, -0.000000, 0.120000, 0.975859, -0.000000, 0.110000, 0.905859, -0.000000,
0.120000, 0.935859, -0.000000, 0.110000, 0.865859, -0.000000, 0.120000, 0.895859, -0.000000, 0.110000, 0.825859, -0.000000, 0.120000, 0.855859, -0.000000,
0.110000, 0.785859, -0.000000, 0.120000, 0.815859, -0.000000, 0.110000, 0.745859, -0.000000, 0.120000, 0.775859, -0.000000, 0.110000, 0.705859, -0.000000,
0.120000, 0.735859, -0.000000, 0.110000, 0.665859, -0.000000, 0.120000, 0.695859, -0.000000, 0.110000, 0.625859, -0.000000, 0.120000, 0.655859, -0.000000,
0.110000, 0.585859, -0.000000, 0.120000, 0.615859, -0.000000, 0.110000, 0.545859, -0.000000, 0.120000, 0.575859, -0.000000, 0.110000, 0.505859, -0.000000,
0.120000, 0.535859, -0.000000, 0.110000, 0.465859, -0.000000, 0.120000, 0.495859, -0.000000, 0.110000, 0.425859, -0.000000, 0.120000, 0.455859, -0.000000,
0.110000, 0.385859, -0.000000, 0.120000, 0.415859, -0.000000, 0.110000, 0.345859, -0.000000, 0.120000, 0.375859, -0.000000, 0.130000, 1.145859, -0.000000,
0.150000, 1.105859, -0.000000, 0.160000, 1.135859, -0.000000, 0.150000, 1.065859, -0.000000, 0.160000, 1.095859, -0.000000, 0.150000, 1.025859, -0.000000,
0.160000, 1.055859, -0.000000, 0.150000, 0.985859, -0.000000, 0.160000, 1.015859, -0.000000, 0.150000, 0.945859, -0.000000, 0.160000, 0.975859, -0.000000,
0.150000, 0.905859, -0.000000, 0.160000, 0.935859, -0.000000, 0.150000, 0.865859, -0.000000, 0.160000, 0.895859, -0.000000, 0.150000, 0.825859, -0.000000,
0.160000, 0.855859, -0.000000, 0.150000, 0.785859, -0.000000, 0.160000, 0.815859, -0.000000, 0.150000, 0.745859, -0.000000, 0.160000, 0.775859, -0.000000,
0.150000, 0.705859, -0.000000, 0.160000, 0.735859, -0.000000, 0.150000, 0.665859, -0.000000, 0.160000, 0.695859, -0.000000, 0.150000, 0.625859, -0.000000,
0.160000, 0.655859, -0.000000, 0.150000, 0.585859, -0.000000, 0.160000, 0.615859, -0.000000, 0.150000, 0.545859, -0.000000, 0.160000, 0.575859, -0.000000,
0.150000, 0.505859, -0.000000, 0.160000, 0.535859, -0.000000, 0.150000, 0.465859, -0.000000, 0.160000, 0.495859, -0.000000, 0.150000, 0.425859, -0.000000,
0.160000, 0.455859, -0.000000, 0.150000, 0.385859, -0.000000, 0.160000, 0.415859, -0.000000, 0.150000, 0.345859, -0.000000, 0.160000, 0.375859, -0.000000,
0.170000, 1.145859, -0.000000, 0.190000, 1.105859, -0.000000, 0.200000, 1.135859, -0.000000, 0.190000, 1.065859, -0.000000, 0.200000, 1.095859, -0.000000,
0.190000, 1.025859, -0.000000, 0.200000, 1.055859, -0.000000, 0.190000, 0.985859, -0.000000, 0.200000, 1.015859, -0.000000, 0.190000, 0.945859, -0.000000,
0.200000, 0.975859, -0.000000, 0.190000, 0.905859, -0.000000, 0.200000, 0.935859, -0.000000, 0.190000, 0.865859, -0.000000, 0.200000, 0.895859, -0.000000,
0.190000, 0.825859, -0.000000, 0.200000, 0.855859, -0.000000, 0.190000, 0.785859, -0.000000, 0.200000, 0.815859, -0.000000, 0.190000, 0.745859, -0.000000,
0.200000, 0.775859, -0.000000, 0.190000, 0.705859, -0.000000, 0.200000, 0.735859, -0.000000, 0.190000, 0.665859, -0.000000, 0.200000, 0.695859, -0.000000,
0.190000, 0.625859, -0.000000, 0.200000, 0.655859, -0.000000, 0.190000, 0.585859, -0.000000, 0.200000, 0.615859, -0.000000, 0.190000, 0.545859, -0.000000,
0.200000, 0.575859, -0.000000, 0.190000, 0.505859, -0.000000, 0.200000, 0.535859, -0.000000, 0.190000, 0.465859, -0.000000, 0.200000, 0.495859, -0.000000,
0.190000, 0.425859, -0.000000, 0.200000, 0.455859, -0.000000, 0.190000, 0.385859, -0.000000, 0.200000, 0.415859, -0.000000, 0.190000, 0.345859, -0.000000,
0.200000, 0.375859, -0.000000, -0.170000, 1.145859, -0.000000, -0.200000, 1.135859, -0.000000, -0.190000, 1.105859, -0.000000, -0.160000, 1.115859, -0.000000,
-0.200000, 1.095859, -0.000000, -0.190000, 1.065859, -0.000000, -0.160000, 1.075859, -0.000000, -0.200000, 1.055859, -0.000000, -0.190000, 1.025859, -0.000000,
-0.160000, 1.035859, -0.000000, -0.200000, 1.015859, -0.000000, -0.190000, 0.985859, -0.000000, -0.160000, 0.995859, -0.000000, -0.200000, 0.975859, -0.000000,
-0.190000, 0.945859, -0.000000, -0.160000, 0.955859, -0.000000, -0.200000, 0.935859, -0.000000, -0.190000, 0.905859, -0.000000, -0.160000, 0.915859, -0.000000,
-0.200000, 0.895859, -0.000000, -0.190000, 0.865859, -0.000000, -0.160000, 0.875859, -0.000000, -0.200000, 0.855859, -0.000000, -0.190000, 0.825859, -0.000000,
-0.160000, 0.835859, -0.000000, -0.200000, 0.815859, -0.000000, -0.190000, 0.785859, -0.000000, -0.160000, 0.795859, -0.000000, -0.200000, 0.775859, -0.000000,
-0.190000, 0.745859, -0.000000, -0.160000, 0.755859, -0.000000, -0.200000, 0.735859, -0.000000, -0.190000, 0.705859, -0.000000, -0.160000, 0.715859, -0.000000,
-0.200000, 0.695859, -0.000000, -0.190000, 0.665859, -0.000000, -0.160000, 0.675859, -0.000000, -0.200000, 0.655859, -0.000000, -0.190000, 0.625859, -0.000000,
-0.160000, 0.635859, -0.000000, -0.200000, 0.615859, -0.000000, -0.190000, 0.585859, -0.000000, -0.160000, 0.595859, -0.000000, -0.200000, 0.575859, -0.000000,
-0.190000, 0.545859, -0.000000, -0.160000, 0.555859, -0.000000, -0.200000, 0.535859, -0.000000, -0.190000, 0.505859, -0.000000, -0.160000, 0.515859, -0.000000,
-0.200000, 0.495859, -0.000000, -0.190000, 0.465859, -0.000000, -0.160000, 0.475859, -0.000000, -0.200000, 0.455859, -0.000000, -0.190000, 0.425859, -0.000000,
-0.160000, 0.435859, -0.000000, -0.200000, 0.415859, -0.000000, -0.190000, 0.385859, -0.000000, -0.160000, 0.395859, -0.000000, -0.200000, 0.375859, -0.000000,
-0.190000, 0.345859, -0.000000, -0.160000, 0.355859, -0.000000, -0.130000, 1.145859, -0.000000, -0.150000, 1.105859, -0.000000, -0.120000, 1.115859, -0.000000,
-0.150000, 1.065859, -0.000000, -0.120000, 1.075859, -0.000000, -0.150000, 1.025859, -0.000000, -0.120000, 1.035859, -0.000000, -0.150000, 0.985859, -0.000000,
-0.120000, 0.995859, -0.000000, -0.150000, 0.945859, -0.000000, -0.120000, 0.955859, -0.000000, -0.150000, 0.905859, -0.000000, -0.120000, 0.915859, -0.000000,
-0.150000, 0.865859, -0.000000, -0.120000, 0.875859, -0.000000, -0.150000, 0.825859, -0.000000, -0.120000, 0.835859, -0.000000, -0.150000, 0.785859, -0.000000,
-0.120000, 0.795859, -0.000000, -0.150000, 0.745859, -0.000000, -0.120000, 0.755859, -0.000000, -0.150000, 0.705859, -0.000000, -0.120000, 0.715859, -0.000000,
-0.150000, 0.665859, -0.000000, -0.120000, 0.675859, -0.000000, -0.150000, 0.625859, -0.000000, -0.120000, 0.635859, -0.000000, -0.150000, 0.585859, -0.000000,
-0.120000, 0.595859, -0.000000, -0.150000, 0.545859, -0.000000, -0.120000, 0.555859, -0.000000, -0.150000, 0.505859, -0.000000, -0.120000, 0.515859, -0.000000,
-0.150000, 0.465859, -0.000000, -0.120000, 0.475859, -0.000000, -0.150000, 0.425859, -0.000000, -0.120000, 0.435859, -0.000000, -0.150000, 0.385859, -0.000000,
-0.120000, 0.395859, -0.000000, -0.150000, 0.345859, -0.000000, -0.120000, 0.355859, -0.000000, -0.090000, 1.145859, -0.000000, -0.110000, 1.105859, -0.000000,
-0.080000, 1.115859, -0.000000, -0.110000, 1.065859, -0.000000, -0.080000, 1.075859, -0.000000, -0.110000, 1.025859, -0.000000, -0.080000, 1.035859, -0.000000,
-0.110000, 0.985859, -0.000000, -0.080000, 0.995859, -0.000000, -0.110000, 0.945859, -0.000000, -0.080000, 0.955859, -0.000000, -0.110000, 0.905859, -0.000000,
-0.080000, 0.915859, -0.000000, -0.110000, 0.865859, -0.000000, -0.080000, 0.875859, -0.000000, -0.110000, 0.825859, -0.000000, -0.080000, 0.835859, -0.000000,
-0.110000, 0.785859, -0.000000, -0.080000, 0.795859, -0.000000, -0.110000, 0.745859, -0.000000, -0.080000, 0.755859, -0.000000, -0.110000, 0.705859, -0.000000,
-0.080000, 0.715859, -0.000000, -0.110000, 0.665859, -0.000000, -0.080000, 0.675859, -0.000000, -0.110000, 0.625859, -0.000000, -0.080000, 0.635859, -0.000000,
-0.110000, 0.585859, -0.000000, -0.080000, 0.595859, -0.000000, -0.110000, 0.545859, -0.000000, -0.080000, 0.555859, -0.000000, -0.110000, 0.505859, -0.000000,
-0.080000, 0.515859, -0.000000, -0.110000, 0.465859, -0.000000, -0.080000, 0.475859, -0.000000, -0.110000, 0.425859, -0.000000, -0.080000, 0.435859, -0.000000,
-0.110000, 0.385859, -0.000000, -0.080000, 0.395859, -0.000000, -0.110000, 0.345859, -0.000000, -0.080000, 0.355859, -0.000000, -0.050000, 1.145859, -0.000000,
-0.070000, 1.105859, -0.000000, -0.040000, 1.115859, -0.000000, -0.070000, 1.065859, -0.000000, -0.040000, 1.075859, -0.000000, -0.070000, 1.025859, -0.000000,
-0.040000, 1.035859, -0.000000, -0.070000, 0.985859, -0.000000, -0.040000, 0.995859, -0.000000, -0.070000, 0.945859, -0.000000, -0.040000, 0.955859, -0.000000,
-0.070000, 0.905859, -0.000000, -0.040000, 0.915859, -0.000000, -0.070000, 0.865859, -0.000000, -0.040000, 0.875859, -0.000000, -0.070000, 0.825859, -0.000000,
-0.040000, 0.835859, -0.000000, -0.070000, 0.785859, -0.000000, -0.040000, 0.795859, -0.000000, -0.070000, 0.745859, -0.000000, -0.040000, 0.755859, -0.000000,
-0.070000, 0.705859, -0.000000, -0.040000, 0.715859, -0.000000, -0.070000, 0.665859, -0.000000, -0.040000, 0.675859, -0.000000, -0.070000, 0.625859, -0.000000,
-0.040000, 0.635859, -0.000000, -0.070000, 0.585859, -0.000000, -0.040000, 0.595859, -0.000000, -0.070000, 0.545859, -0.000000, -0.040000, 0.555859, -0.000000,
-0.070000, 0.505859, -0.000000, -0.040000, 0.515859, -0.000000, -0.070000, 0.465859, -0.000000, -0.040000, 0.475859, -0.000000, -0.070000, 0.425859, -0.000000,
-0.040000, 0.435859, -0.000000, -0.070000, 0.385859, -0.000000, -0.040000, 0.395859, -0.000000, -0.070000, 0.345859, -0.000000, -0.040000, 0.355859, -0.000000,
-0.010000, 1.145859, -0.000000, -0.030000, 1.105859, -0.000000, 0.000000, 1.115859, -0.000000, -0.030000, 1.065859, -0.000000, 0.000000, 1.075859, -0.000000,
-0.030000, 1.025859, -0.000000, 0.000000, 1.035859, -0.000000, -0.030000, 0.985859, -0.000000, 0.000000, 0.995859, -0.000000, -0.030000, 0.945859, -0.000000,
0.000000, 0.955859, -0.000000, -0.030000, 0.905859, -0.000000, 0.000000, 0.915859, -0.000000, -0.030000, 0.865859, -0.000000, 0.000000, 0.875859, -0.000000,
-0.030000, 0.825859, -0.000000, 0.000000, 0.835859, -0.000000, -0.030000, 0.785859, -0.000000, 0.000000, 0.795859, -0.000000, -0.030000, 0.745859, -0.000000,
0.000000, 0.755859, -0.000000, -0.030000, 0.705859, -0.000000, 0.000000, 0.715859, -0.000000, -0.030000, 0.665859, -0.000000, -0.000000, 0.675859, -0.000000,
-0.030000, 0.625859, -0.000000, -0.000000, 0.635859, -0.000000, -0.030000, 0.585859, -0.000000, -0.000000, 0.595859, -0.000000, -0.030000, 0.545859, -0.000000,
-0.000000, 0.555859, -0.000000, -0.030000, 0.505859, -0.000000, -0.000000, 0.515859, -0.000000, -0.030000, 0.465859, -0.000000, 0.000000, 0.475859, -0.000000,
-0.030000, 0.425859, -0.000000, -0.000000, 0.435859, -0.000000, -0.030000, 0.385859, -0.000000, -0.000000, 0.395859, -0.000000, -0.030000, 0.345859, -0.000000,
-0.000000, 0.355859, -0.000000, 0.030000, 1.145859, -0.000000, 0.010000, 1.105859, -0.000000, 0.040000, 1.115859, -0.000000, 0.010000, 1.065859, -0.000000,
0.040000, 1.075859, -0.000000, 0.010000, 1.025859, -0.000000, 0.040000, 1.035859, -0.000000, 0.010000, 0.985859, -0.000000, 0.040000, 0.995859, -0.000000,
0.010000, 0.945859, -0.000000, 0.040000, 0.955859, -0.000000, 0.010000, 0.905859, -0.000000, 0.040000, 0.915859, -0.000000, 0.010000, 0.865859, -0.000000,
0.040000, 0.875859, -0.000000, 0.010000, 0.825859, -0.000000, 0.040000, 0.835859, -0.000000, 0.010000, 0.785859, -0.000000, 0.040000, 0.795859, -0.000000,
0.010000, 0.745859, -0.000000, 0.040000, 0.755859, -0.000000, 0.010000, 0.705859, -0.000000, 0.040000, 0.715859, -0.000000, 0.010000, 0.665859, -0.000000,
0.040000, 0.675859, -0.000000, 0.010000, 0.625859, -0.000000, 0.040000, 0.635859, -0.000000, 0.010000, 0.585859, -0.000000, 0.040000, 0.595859, -0.000000,
0.010000, 0.545859, -0.000000, 0.040000, 0.555859, -0.000000, 0.010000, 0.505859, -0.000000, 0.040000, 0.515859, -0.000000, 0.010000, 0.465859, -0.000000,
0.040000, 0.475859, -0.000000, 0.010000, 0.425859, -0.000000, 0.040000, 0.435859, -0.000000, 0.010000, 0.385859, -0.000000, 0.040000, 0.395859, -0.000000,
0.010000, 0.345859, -0.000000, 0.040000, 0.355859, -0.000000, 0.070000, 1.145859, -0.000000, 0.050000, 1.105859, -0.000000, 0.080000, 1.115859, -0.000000,
0.050000, 1.065859, -0.000000, 0.080000, 1.075859, -0.000000, 0.050000, 1.025859, -0.000000, 0.080000, 1.035859, -0.000000, 0.050000, 0.985859, -0.000000,
0.080000, 0.995859, -0.000000, 0.050000, 0.945859, -0.000000, 0.080000, 0.955859, -0.000000, 0.050000, 0.905859, -0.000000, 0.080000, 0.915859, -0.000000,
0.050000, 0.865859, -0.000000, 0.080000, 0.875859, -0.000000, 0.050000, 0.825859, -0.000000, 0.080000, 0.835859, -0.000000, 0.050000, 0.785859, -0.000000,
0.080000, 0.795859, -0.000000, 0.050000, 0.745859, -0.000000, 0.080000, 0.755859, -0.000000, 0.050000, 0.705859, -0.000000, 0.080000, 0.715859, -0.000000,
0.050000, 0.665859, -0.000000, 0.080000, 0.675859, -0.000000, 0.050000, 0.625859, -0.000000, 0.080000, 0.635859, -0.000000, 0.050000, 0.585859, -0.000000,
0.080000, 0.595859, -0.000000, 0.050000, 0.545859, -0.000000, 0.080000, 0.555859, -0.000000, 0.050000, 0.505859, -0.000000, 0.080000, 0.515859, -0.000000,
0.050000, 0.465859, -0.000000, 0.080000, 0.475859, -0.000000, 0.050000, 0.425859, -0.000000, 0.080000, 0.435859, -0.000000, 0.050000, 0.385859, -0.000000,
0.080000, 0.395859, -0.000000, 0.050000, 0.345859, -0.000000, 0.080000, 0.355859, -0.000000, 0.110000, 1.145859, -0.000000, 0.090000, 1.105859, -0.000000,
0.120000, 1.115859, -0.000000, 0.090000, 1.065859, -0.000000, 0.120000, 1.075859, -0.000000, 0.090000, 1.025859, -0.000000, 0.120000, 1.035859, -0.000000,
0.090000, 0.985859, -0.000000, 0.120000, 0.995859, -0.000000, 0.090000, 0.945859, -0.000000, 0.120000, 0.955859, -0.000000, 0.090000, 0.905859, -0.000000,
0.120000, 0.915859, -0.000000, 0.090000, 0.865859, -0.000000, 0.120000, 0.875859, -0.000000, 0.090000, 0.825859, -0.000000, 0.120000, 0.835859, -0.000000,
0.090000, 0.785859, -0.000000, 0.120000, 0.795859, -0.000000, 0.090000, 0.745859, -0.000000, 0.120000, 0.755859, -0.000000, 0.090000, 0.705859, -0.000000,
0.120000, 0.715859, -0.000000, 0.090000, 0.665859, -0.000000, 0.120000, 0.675859, -0.000000, 0.090000, 0.625859, -0.000000, 0.120000, 0.635859, -0.000000,
0.090000, 0.585859, -0.000000, 0.120000, 0.595859, -0.000000, 0.090000, 0.545859, -0.000000, 0.120000, 0.555859, -0.000000, 0.090000, 0.505859, -0.000000,
0.120000, 0.515859, -0.000000, 0.090000, 0.465859, -0.000000, 0.120000, 0.475859, -0.000000, 0.090000, 0.425859, -0.000000, 0.120000, 0.435859, -0.000000,
0.090000, 0.385859, -0.000000, 0.120000, 0.395859, -0.000000, 0.090000, 0.345859, -0.000000, 0.120000, 0.355859, -0.000000, 0.150000, 1.145859, -0.000000,
0.130000, 1.105859, -0.000000, 0.160000, 1.115859, -0.000000, 0.130000, 1.065859, -0.000000, 0.160000, 1.075859, -0.000000, 0.130000, 1.025859, -0.000000,
0.160000, 1.035859, -0.000000, 0.130000, 0.985859, -0.000000, 0.160000, 0.995859, -0.000000, 0.130000, 0.945859, -0.000000, 0.160000, 0.955859, -0.000000,
0.130000, 0.905859, -0.000000, 0.160000, 0.915859, -0.000000, 0.130000, 0.865859, -0.000000, 0.160000, 0.875859, -0.000000, 0.130000, 0.825859, -0.000000,
0.160000, 0.835859, -0.000000, 0.130000, 0.785859, -0.000000, 0.160000, 0.795859, -0.000000, 0.130000, 0.745859, -0.000000, 0.160000, 0.755859, -0.000000,
0.130000, 0.705859, -0.000000, 0.160000, 0.715859, -0.000000, 0.130000, 0.665859, -0.000000, 0.160000, 0.675859, -0.000000, 0.130000, 0.625859, -0.000000,
0.160000, 0.635859, -0.000000, 0.130000, 0.585859, -0.000000, 0.160000, 0.595859, -0.000000, 0.130000, 0.545859, -0.000000, 0.160000, 0.555859, -0.000000,
0.130000, 0.505859, -0.000000, 0.160000, 0.515859, -0.000000, 0.130000, 0.465859, -0.000000, 0.160000, 0.475859, -0.000000, 0.130000, 0.425859, -0.000000,
0.160000, 0.435859, -0.000000, 0.130000, 0.385859, -0.000000, 0.160000, 0.395859, -0.000000, 0.130000, 0.345859, -0.000000, 0.160000, 0.355859, -0.000000,
0.190000, 1.145859, -0.000000, 0.170000, 1.105859, -0.000000, 0.200000, 1.115859, -0.000000, 0.170000, 1.065859, -0.000000, 0.200000, 1.075859, -0.000000,
0.170000, 1.025859, -0.000000, 0.200000, 1.035859, -0.000000, 0.170000, 0.985859, -0.000000, 0.200000, 0.995859, -0.000000, 0.170000, 0.945859, -0.000000,
0.200000, 0.955859, -0.000000, 0.170000, 0.905859, -0.000000, 0.200000, 0.915859, -0.000000, 0.170000, 0.865859, -0.000000, 0.200000, 0.875859, -0.000000,
0.170000, 0.825859, -0.000000, 0.200000, 0.835859, -0.000000, 0.170000, 0.785859, -0.000000, 0.200000, 0.795859, -0.000000, 0.170000, 0.745859, -0.000000,
0.200000, 0.755859, -0.000000, 0.170000, 0.705859, -0.000000, 0.200000, 0.715859, -0.000000, 0.170000, 0.665859, -0.000000, 0.200000, 0.675859, -0.000000,
0.170000, 0.625859, -0.000000, 0.200000, 0.635859, -0.000000, 0.170000, 0.585859, -0.000000, 0.200000, 0.595859, -0.000000, 0.170000, 0.545859, -0.000000,
0.200000, 0.555859, -0.000000, 0.170000, 0.505859, -0.000000, 0.200000, 0.515859, -0.000000, 0.170000, 0.465859, -0.000000, 0.200000, 0.475859, -0.000000,
0.170000, 0.425859, -0.000000, 0.200000, 0.435859, -0.000000, 0.170000, 0.385859, -0.000000, 0.200000, 0.395859, -0.000000, 0.170000, 0.345859, -0.000000,
0.200000, 0.355859, -0.000000, 0.190000, 0.365859, -0.000000, 0.170000, 0.365859, -0.000000, 0.180000, 0.375859, -0.000000, 0.180000, 0.355859, -0.000000,
0.190000, 0.405859, -0.000000, 0.170000, 0.405859, -0.000000, 0.180000, 0.415859, -0.000000, 0.180000, 0.395859, -0.000000, 0.190000, 0.445859, -0.000000,
0.170000, 0.445859, -0.000000, 0.180000, 0.455859, -0.000000, 0.180000, 0.435859, -0.000000, 0.190000, 0.485859, -0.000000, 0.170000, 0.485859, -0.000000,
0.180000, 0.495859, -0.000000, 0.180000, 0.475859, -0.000000, 0.190000, 0.525859, -0.000000, 0.170000, 0.525859, -0.000000, 0.180000, 0.535859, -0.000000,
0.180000, 0.515859, -0.000000, 0.190000, 0.565859, -0.000000, 0.170000, 0.565859, -0.000000, 0.180000, 0.575859, -0.000000, 0.180000, 0.555859, -0.000000,
0.190000, 0.605859, -0.000000, 0.170000, 0.605859, -0.000000, 0.180000, 0.615859, -0.000000, 0.180000, 0.595859, -0.000000, 0.190000, 0.645859, -0.000000,
0.170000, 0.645859, -0.000000, 0.180000, 0.655859, -0.000000, 0.180000, 0.635859, -0.000000, 0.190000, 0.685859, -0.000000, 0.170000, 0.685859, -0.000000,
0.180000, 0.695859, -0.000000, 0.180000, 0.675859, -0.000000, 0.190000, 0.725859, -0.000000, 0.170000, 0.725859, -0.000000, 0.180000, 0.735859, -0.000000,
0.180000, 0.715859, -0.000000, 0.190000, 0.765859, -0.000000, 0.170000, 0.765859, -0.000000, 0.180000, 0.775859, -0.000000, 0.180000, 0.755859, -0.000000,
0.190000, 0.805859, -0.000000, 0.170000, 0.805859, -0.000000, 0.180000, 0.815859, -0.000000, 0.180000, 0.795859, -0.000000, 0.190000, 0.845859, -0.000000,
0.170000, 0.845859, -0.000000, 0.180000, 0.855859, -0.000000, 0.180000, 0.835859, -0.000000, 0.190000, 0.885859, -0.000000, 0.170000, 0.885859, -0.000000,
0.180000, 0.895859, -0.000000, 0.180000, 0.875859, -0.000000, 0.190000, 0.925859, -0.000000, 0.170000, 0.925859, -0.000000, 0.180000, 0.935859, -0.000000,
0.180000, 0.915859, -0.000000, 0.190000, 0.965859, -0.000000, 0.170000, 0.965859, -0.000000, 0.180000, 0.975859, -0.000000, 0.180000, 0.955859, -0.000000,
0.190000, 1.005859, -0.000000, 0.170000, 1.005859, -0.000000, 0.180000, 1.015859, -0.000000, 0.180000, 0.995859, -0.000000, 0.190000, 1.045859, -0.000000,
0.170000, 1.045859, -0.000000, 0.180000, 1.055859, -0.000000, 0.180000, 1.035859, -0.000000, 0.190000, 1.085859, -0.000000, 0.170000, 1.085859, -0.000000,
0.180000, 1.095859, -0.000000, 0.180000, 1.075859, -0.000000, 0.190000, 1.125859, -0.000000, 0.170000, 1.125859, -0.000000, 0.180000, 1.135859, -0.000000,
0.180000, 1.115859, -0.000000, 0.150000, 0.365859, -0.000000, 0.130000, 0.365859, -0.000000, 0.140000, 0.375859, -0.000000, 0.140000, 0.355859, -0.000000,
0.150000, 0.405859, -0.000000, 0.130000, 0.405859, -0.000000, 0.140000, 0.415859, -0.000000, 0.140000, 0.395859, -0.000000, 0.150000, 0.445859, -0.000000,
0.130000, 0.445859, -0.000000, 0.140000, 0.455859, -0.000000, 0.140000, 0.435859, -0.000000, 0.150000, 0.485859, -0.000000, 0.130000, 0.485859, -0.000000,
0.140000, 0.495859, -0.000000, 0.140000, 0.475859, -0.000000, 0.150000, 0.525859, -0.000000, 0.130000, 0.525859, -0.000000, 0.140000, 0.535859, -0.000000,
0.140000, 0.515859, -0.000000, 0.150000, 0.565859, -0.000000, 0.130000, 0.565859, -0.000000, 0.140000, 0.575859, -0.000000, 0.140000, 0.555859, -0.000000,
0.150000, 0.605859, -0.000000, 0.130000, 0.605859, -0.000000, 0.140000, 0.615859, -0.000000, 0.140000, 0.595859, -0.000000, 0.150000, 0.645859, -0.000000,
0.130000, 0.645859, -0.000000, 0.140000, 0.655859, -0.000000, 0.140000, 0.635859, -0.000000, 0.150000, 0.685859, -0.000000, 0.130000, 0.685859, -0.000000,
0.140000, 0.695859, -0.000000, 0.140000, 0.675859, -0.000000, 0.150000, 0.725859, -0.000000, 0.130000, 0.725859, -0.000000, 0.140000, 0.735859, -0.000000,
0.140000, 0.715859, -0.000000, 0.150000, 0.765859, -0.000000, 0.130000, 0.765859, -0.000000, 0.140000, 0.775859, -0.000000, 0.140000, 0.755859, -0.000000,
0.150000, 0.805859, -0.000000, 0.130000, 0.805859, -0.000000, 0.140000, 0.815859, -0.000000, 0.140000, 0.795859, -0.000000, 0.150000, 0.845859, -0.000000,
0.130000, 0.845859, -0.000000, 0.140000, 0.855859, -0.000000, 0.140000, 0.835859, -0.000000, 0.150000, 0.885859, -0.000000, 0.130000, 0.885859, -0.000000,
0.140000, 0.895859, -0.000000, 0.140000, 0.875859, -0.000000, 0.150000, 0.925859, -0.000000, 0.130000, 0.925859, -0.000000, 0.140000, 0.935859, -0.000000,
0.140000, 0.915859, -0.000000, 0.150000, 0.965859, -0.000000, 0.130000, 0.965859, -0.000000, 0.140000, 0.975859, -0.000000, 0.140000, 0.955859, -0.000000,
0.150000, 1.005859, -0.000000, 0.130000, 1.005859, -0.000000, 0.140000, 1.015859, -0.000000, 0.140000, 0.995859, -0.000000, 0.150000, 1.045859, -0.000000,
0.130000, 1.045859, -0.000000, 0.140000, 1.055859, -0.000000, 0.140000, 1.035859, -0.000000, 0.150000, 1.085859, -0.000000, 0.130000, 1.085859, -0.000000,
0.140000, 1.095859, -0.000000, 0.140000, 1.075859, -0.000000, 0.150000, 1.125859, -0.000000, 0.130000, 1.125859, -0.000000, 0.140000, 1.135859, -0.000000,
0.140000, 1.115859, -0.000000, 0.110000, 0.365859, -0.000000, 0.090000, 0.365859, -0.000000, 0.100000, 0.375859, -0.000000, 0.100000, 0.355859, -0.000000,
0.110000, 0.405859, -0.000000, 0.090000, 0.405859, -0.000000, 0.100000, 0.415859, -0.000000, 0.100000, 0.395859, -0.000000, 0.110000, 0.445859, -0.000000,
0.090000, 0.445859, -0.000000, 0.100000, 0.455859, -0.000000, 0.100000, 0.435859, -0.000000, 0.110000, 0.485859, -0.000000, 0.090000, 0.485859, -0.000000,
0.100000, 0.495859, -0.000000, 0.100000, 0.475859, -0.000000, 0.110000, 0.525859, -0.000000, 0.090000, 0.525859, -0.000000, 0.100000, 0.535859, -0.000000,
0.100000, 0.515859, -0.000000, 0.110000, 0.565859, -0.000000, 0.090000, 0.565859, -0.000000, 0.100000, 0.575859, -0.000000, 0.100000, 0.555859, -0.000000,
0.110000, 0.605859, -0.000000, 0.090000, 0.605859, -0.000000, 0.100000, 0.615859, -0.000000, 0.100000, 0.595859, -0.000000, 0.110000, 0.645859, -0.000000,
0.090000, 0.645859, -0.000000, 0.100000, 0.655859, -0.000000, 0.100000, 0.635859, -0.000000, 0.110000, 0.685859, -0.000000, 0.090000, 0.685859, -0.000000,
0.100000, 0.695859, -0.000000, 0.100000, 0.675859, -0.000000, 0.110000, 0.725859, -0.000000, 0.090000, 0.725859, -0.000000, 0.100000, 0.735859, -0.000000,
0.100000, 0.715859, -0.000000, 0.110000, 0.765859, -0.000000, 0.090000, 0.765859, -0.000000, 0.100000, 0.775859, -0.000000, 0.100000, 0.755859, -0.000000,
0.110000, 0.805859, -0.000000, 0.090000, 0.805859, -0.000000, 0.100000, 0.815859, -0.000000, 0.100000, 0.795859, -0.000000, 0.110000, 0.845859, -0.000000,
0.090000, 0.845859, -0.000000, 0.100000, 0.855859, -0.000000, 0.100000, 0.835859, -0.000000, 0.110000, 0.885859, -0.000000, 0.090000, 0.885859, -0.000000,
0.100000, 0.895859, -0.000000, 0.100000, 0.875859, -0.000000, 0.110000, 0.925859, -0.000000, 0.090000, 0.925859, -0.000000, 0.100000, 0.935859, -0.000000,
0.100000, 0.915859, -0.000000, 0.110000, 0.965859, -0.000000, 0.090000, 0.965859, -0.000000, 0.100000, 0.975859, -0.000000, 0.100000, 0.955859, -0.000000,
0.110000, 1.005859, -0.000000, 0.090000, 1.005859, -0.000000, 0.100000, 1.015859, -0.000000, 0.100000, 0.995859, -0.000000, 0.110000, 1.045859, -0.000000,
0.090000, 1.045859, -0.000000, 0.100000, 1.055859, -0.000000, 0.100000, 1.035859, -0.000000, 0.110000, 1.085859, -0.000000, 0.090000, 1.085859, -0.000000,
0.100000, 1.095859, -0.000000, 0.100000, 1.075859, -0.000000, 0.110000, 1.125859, -0.000000, 0.090000, 1.125859, -0.000000, 0.100000, 1.135859, -0.000000,
0.100000, 1.115859, -0.000000, 0.070000, 0.365859, -0.000000, 0.050000, 0.365859, -0.000000, 0.060000, 0.375859, -0.000000, 0.060000, 0.355859, -0.000000,
0.070000, 0.405859, -0.000000, 0.050000, 0.405859, -0.000000, 0.060000, 0.415859, -0.000000, 0.060000, 0.395859, -0.000000, 0.070000, 0.445859, -0.000000,
0.050000, 0.445859, -0.000000, 0.060000, 0.455859, -0.000000, 0.060000, 0.435859, -0.000000, 0.070000, 0.485859, -0.000000, 0.050000, 0.485859, -0.000000,
0.060000, 0.495859, -0.000000, 0.060000, 0.475859, -0.000000, 0.070000, 0.525859, -0.000000, 0.050000, 0.525859, -0.000000, 0.060000, 0.535859, -0.000000,
0.060000, 0.515859, -0.000000, 0.070000, 0.565859, -0.000000, 0.050000, 0.565859, -0.000000, 0.060000, 0.575859, -0.000000, 0.060000, 0.555859, -0.000000,
0.070000, 0.605859, -0.000000, 0.050000, 0.605859, -0.000000, 0.060000, 0.615859, -0.000000, 0.060000, 0.595859, -0.000000, 0.070000, 0.645859, -0.000000,
0.050000, 0.645859, -0.000000, 0.060000, 0.655859, -0.000000, 0.060000, 0.635859, -0.000000, 0.070000, 0.685859, -0.000000, 0.050000, 0.685859, -0.000000,
0.060000, 0.695859, -0.000000, 0.060000, 0.675859, -0.000000, 0.070000, 0.725859, -0.000000, 0.050000, 0.725859, -0.000000, 0.060000, 0.735859, -0.000000,
0.060000, 0.715859, -0.000000, 0.070000, 0.765859, -0.000000, 0.050000, 0.765859, -0.000000, 0.060000, 0.775859, -0.000000, 0.060000, 0.755859, -0.000000,
0.070000, 0.805859, -0.000000, 0.050000, 0.805859, -0.000000, 0.060000, 0.815859, -0.000000, 0.060000, 0.795859, -0.000000, 0.070000, 0.845859, -0.000000,
0.050000, 0.845859, -0.000000, 0.060000, 0.855859, -0.000000, 0.060000, 0.835859, -0.000000, 0.070000, 0.885859, -0.000000, 0.050000, 0.885859, -0.000000,
0.060000, 0.895859, -0.000000, 0.060000, 0.875859, -0.000000, 0.070000, 0.925859, -0.000000, 0.050000, 0.925859, -0.000000, 0.060000, 0.935859, -0.000000,
0.060000, 0.915859, -0.000000, 0.070000, 0.965859, -0.000000, 0.050000, 0.965859, -0.000000, 0.060000, 0.975859, -0.000000, 0.060000, 0.955859, -0.000000,
0.070000, 1.005859, -0.000000, 0.050000, 1.005859, -0.000000, 0.060000, 1.015859, -0.000000, 0.060000, 0.995859, -0.000000, 0.070000, 1.045859, -0.000000,
0.050000, 1.045859, -0.000000, 0.060000, 1.055859, -0.000000, 0.060000, 1.035859, -0.000000, 0.070000, 1.085859, -0.000000, 0.050000, 1.085859, -0.000000,
0.060000, 1.095859, -0.000000, 0.060000, 1.075859, -0.000000, 0.070000, 1.125859, -0.000000, 0.050000, 1.125859, -0.000000, 0.060000, 1.135859, -0.000000,
0.060000, 1.115859, -0.000000, 0.030000, 0.365859, -0.000000, 0.010000, 0.365859, -0.000000, 0.020000, 0.375859, -0.000000, 0.020000, 0.355859, -0.000000,
0.030000, 0.405859, -0.000000, 0.010000, 0.405859, -0.000000, 0.020000, 0.415859, -0.000000, 0.020000, 0.395859, -0.000000, 0.030000, 0.445859, -0.000000,
0.010000, 0.445859, -0.000000, 0.020000, 0.455859, -0.000000, 0.020000, 0.435859, -0.000000, 0.030000, 0.485859, -0.000000, 0.010000, 0.485859, -0.000000,
0.020000, 0.495859, -0.000000, 0.020000, 0.475859, -0.000000, 0.030000, 0.525859, -0.000000, 0.010000, 0.525859, -0.000000, 0.020000, 0.535859, -0.000000,
0.020000, 0.515859, -0.000000, 0.030000, 0.565859, -0.000000, 0.010000, 0.565859, -0.000000, 0.020000, 0.575859, -0.000000, 0.020000, 0.555859, -0.000000,
0.030000, 0.605859, -0.000000, 0.010000, 0.605859, -0.000000, 0.020000, 0.615859, -0.000000, 0.020000, 0.595859, -0.000000, 0.030000, 0.645859, -0.000000,
0.010000, 0.645859, -0.000000, 0.020000, 0.655859, -0.000000, 0.020000, 0.635859, -0.000000, 0.030000, 0.685859, -0.000000, 0.010000, 0.685859, -0.000000,
0.020000, 0.695859, -0.000000, 0.020000, 0.675859, -0.000000, 0.030000, 0.725859, -0.000000, 0.010000, 0.725859, -0.000000, 0.020000, 0.735859, -0.000000,
0.020000, 0.715859, -0.000000, 0.030000, 0.765859, -0.000000, 0.010000, 0.765859, -0.000000, 0.020000, 0.775859, -0.000000, 0.020000, 0.755859, -0.000000,
0.030000, 0.805859, -0.000000, 0.010000, 0.805859, -0.000000, 0.020000, 0.815859, -0.000000, 0.020000, 0.795859, -0.000000, 0.030000, 0.845859, -0.000000,
0.010000, 0.845859, -0.000000, 0.020000, 0.855859, -0.000000, 0.020000, 0.835859, -0.000000, 0.030000, 0.885859, -0.000000, 0.010000, 0.885859, -0.000000,
0.020000, 0.895859, -0.000000, 0.020000, 0.875859, -0.000000, 0.030000, 0.925859, -0.000000, 0.010000, 0.925859, -0.000000, 0.020000, 0.935859, -0.000000,
0.020000, 0.915859, -0.000000, 0.030000, 0.965859, -0.000000, 0.010000, 0.965859, -0.000000, 0.020000, 0.975859, -0.000000, 0.020000, 0.955859, -0.000000,
0.030000, 1.005859, -0.000000, 0.010000, 1.005859, -0.000000, 0.020000, 1.015859, -0.000000, 0.020000, 0.995859, -0.000000, 0.030000, 1.045859, -0.000000,
0.010000, 1.045859, -0.000000, 0.020000, 1.055859, -0.000000, 0.020000, 1.035859, -0.000000, 0.030000, 1.085859, -0.000000, 0.010000, 1.085859, -0.000000,
0.020000, 1.095859, -0.000000, 0.020000, 1.075859, -0.000000, 0.030000, 1.125859, -0.000000, 0.010000, 1.125859, -0.000000, 0.020000, 1.135859, -0.000000,
0.020000, 1.115859, -0.000000, -0.010000, 0.365859, -0.000000, -0.030000, 0.365859, -0.000000, -0.020000, 0.375859, -0.000000, -0.020000, 0.355859, -0.000000,
-0.010000, 0.405859, -0.000000, -0.030000, 0.405859, -0.000000, -0.020000, 0.415859, -0.000000, -0.020000, 0.395859, -0.000000, -0.010000, 0.445859, -0.000000,
-0.030000, 0.445859, -0.000000, -0.020000, 0.455859, -0.000000, -0.020000, 0.435859, -0.000000, -0.010000, 0.485859, -0.000000, -0.030000, 0.485859, -0.000000,
-0.020000, 0.495859, -0.000000, -0.020000, 0.475859, -0.000000, -0.010000, 0.525859, -0.000000, -0.030000, 0.525859, -0.000000, -0.020000, 0.535859, -0.000000,
-0.020000, 0.515859, -0.000000, -0.010000, 0.565859, -0.000000, -0.030000, 0.565859, -0.000000, -0.020000, 0.575859, -0.000000, -0.020000, 0.555859, -0.000000,
-0.010000, 0.605859, -0.000000, -0.030000, 0.605859, -0.000000, -0.020000, 0.615859, -0.000000, -0.020000, 0.595859, -0.000000, -0.010000, 0.645859, -0.000000,
-0.030000, 0.645859, -0.000000, -0.020000, 0.655859, -0.000000, -0.020000, 0.635859, -0.000000, -0.010000, 0.685859, -0.000000, -0.030000, 0.685859, -0.000000,
-0.020000, 0.695859, -0.000000, -0.020000, 0.675859, -0.000000, -0.010000, 0.725859, -0.000000, -0.030000, 0.725859, -0.000000, -0.020000, 0.735859, -0.000000,
-0.020000, 0.715859, -0.000000, -0.010000, 0.765859, -0.000000, -0.030000, 0.765859, -0.000000, -0.020000, 0.775859, -0.000000, -0.020000, 0.755859, -0.000000,
-0.010000, 0.805859, -0.000000, -0.030000, 0.805859, -0.000000, -0.020000, 0.815859, -0.000000, -0.020000, 0.795859, -0.000000, -0.010000, 0.845859, -0.000000,
-0.030000, 0.845859, -0.000000, -0.020000, 0.855859, -0.000000, -0.020000, 0.835859, -0.000000, -0.010000, 0.885859, -0.000000, -0.030000, 0.885859, -0.000000,
-0.020000, 0.895859, -0.000000, -0.020000, 0.875859, -0.000000, -0.010000, 0.925859, -0.000000, -0.030000, 0.925859, -0.000000, -0.020000, 0.935859, -0.000000,
-0.020000, 0.915859, -0.000000, -0.010000, 0.965859, -0.000000, -0.030000, 0.965859, -0.000000, -0.020000, 0.975859, -0.000000, -0.020000, 0.955859, -0.000000,
-0.010000, 1.005859, -0.000000, -0.030000, 1.005859, -0.000000, -0.020000, 1.015859, -0.000000, -0.020000, 0.995859, -0.000000, -0.010000, 1.045859, -0.000000,
-0.030000, 1.045859, -0.000000, -0.020000, 1.055859, -0.000000, -0.020000, 1.035859, -0.000000, -0.010000, 1.085859, -0.000000, -0.030000, 1.085859, -0.000000,
-0.020000, 1.095859, -0.000000, -0.020000, 1.075859, -0.000000, -0.010000, 1.125859, -0.000000, -0.030000, 1.125859, -0.000000, -0.020000, 1.135859, -0.000000,
-0.020000, 1.115859, -0.000000, -0.050000, 0.365859, -0.000000, -0.070000, 0.365859, -0.000000, -0.060000, 0.375859, -0.000000, -0.060000, 0.355859, -0.000000,
-0.050000, 0.405859, -0.000000, -0.070000, 0.405859, -0.000000, -0.060000, 0.415859, -0.000000, -0.060000, 0.395859, -0.000000, -0.050000, 0.445859, -0.000000,
-0.070000, 0.445859, -0.000000, -0.060000, 0.455859, -0.000000, -0.060000, 0.435859, -0.000000, -0.050000, 0.485859, -0.000000, -0.070000, 0.485859, -0.000000,
-0.060000, 0.495859, -0.000000, -0.060000, 0.475859, -0.000000, -0.050000, 0.525859, -0.000000, -0.070000, 0.525859, -0.000000, -0.060000, 0.535859, -0.000000,
-0.060000, 0.515859, -0.000000, -0.050000, 0.565859, -0.000000, -0.070000, 0.565859, -0.000000, -0.060000, 0.575859, -0.000000, -0.060000, 0.555859, -0.000000,
-0.050000, 0.605859, -0.000000, -0.070000, 0.605859, -0.000000, -0.060000, 0.615859, -0.000000, -0.060000, 0.595859, -0.000000, -0.050000, 0.645859, -0.000000,
-0.070000, 0.645859, -0.000000, -0.060000, 0.655859, -0.000000, -0.060000, 0.635859, -0.000000, -0.050000, 0.685859, -0.000000, -0.070000, 0.685859, -0.000000,
-0.060000, 0.695859, -0.000000, -0.060000, 0.675859, -0.000000, -0.050000, 0.725859, -0.000000, -0.070000, 0.725859, -0.000000, -0.060000, 0.735859, -0.000000,
-0.060000, 0.715859, -0.000000, -0.050000, 0.765859, -0.000000, -0.070000, 0.765859, -0.000000, -0.060000, 0.775859, -0.000000, -0.060000, 0.755859, -0.000000,
-0.050000, 0.805859, -0.000000, -0.070000, 0.805859, -0.000000, -0.060000, 0.815859, -0.000000, -0.060000, 0.795859, -0.000000, -0.050000, 0.845859, -0.000000,
-0.070000, 0.845859, -0.000000, -0.060000, 0.855859, -0.000000, -0.060000, 0.835859, -0.000000, -0.050000, 0.885859, -0.000000, -0.070000, 0.885859, -0.000000,
-0.060000, 0.895859, -0.000000, -0.060000, 0.875859, -0.000000, -0.050000, 0.925859, -0.000000, -0.070000, 0.925859, -0.000000, -0.060000, 0.935859, -0.000000,
-0.060000, 0.915859, -0.000000, -0.050000, 0.965859, -0.000000, -0.070000, 0.965859, -0.000000, -0.060000, 0.975859, -0.000000, -0.060000, 0.955859, -0.000000,
-0.050000, 1.005859, -0.000000, -0.070000, 1.005859, -0.000000, -0.060000, 1.015859, -0.000000, -0.060000, 0.995859, -0.000000, -0.050000, 1.045859, -0.000000,
-0.070000, 1.045859, -0.000000, -0.060000, 1.055859, -0.000000, -0.060000, 1.035859, -0.000000, -0.050000, 1.085859, -0.000000, -0.070000, 1.085859, -0.000000,
-0.060000, 1.095859, -0.000000, -0.060000, 1.075859, -0.000000, -0.050000, 1.125859, -0.000000, -0.070000, 1.125859, -0.000000, -0.060000, 1.135859, -0.000000,
-0.060000, 1.115859, -0.000000, -0.090000, 0.365859, -0.000000, -0.110000, 0.365859, -0.000000, -0.100000, 0.375859, -0.000000, -0.100000, 0.355859, -0.000000,
-0.090000, 0.405859, -0.000000, -0.110000, 0.405859, -0.000000, -0.100000, 0.415859, -0.000000, -0.100000, 0.395859, -0.000000, -0.090000, 0.445859, -0.000000,
-0.110000, 0.445859, -0.000000, -0.100000, 0.455859, -0.000000, -0.100000, 0.435859, -0.000000, -0.090000, 0.485859, -0.000000, -0.110000, 0.485859, -0.000000,
-0.100000, 0.495859, -0.000000, -0.100000, 0.475859, -0.000000, -0.090000, 0.525859, -0.000000, -0.110000, 0.525859, -0.000000, -0.100000, 0.535859, -0.000000,
-0.100000, 0.515859, -0.000000, -0.090000, 0.565859, -0.000000, -0.110000, 0.565859, -0.000000, -0.100000, 0.575859, -0.000000, -0.100000, 0.555859, -0.000000,
-0.090000, 0.605859, -0.000000, -0.110000, 0.605859, -0.000000, -0.100000, 0.615859, -0.000000, -0.100000, 0.595859, -0.000000, -0.090000, 0.645859, -0.000000,
-0.110000, 0.645859, -0.000000, -0.100000, 0.655859, -0.000000, -0.100000, 0.635859, -0.000000, -0.090000, 0.685859, -0.000000, -0.110000, 0.685859, -0.000000,
-0.100000, 0.695859, -0.000000, -0.100000, 0.675859, -0.000000, -0.090000, 0.725859, -0.000000, -0.110000, 0.725859, -0.000000, -0.100000, 0.735859, -0.000000,
-0.100000, 0.715859, -0.000000, -0.090000, 0.765859, -0.000000, -0.110000, 0.765859, -0.000000, -0.100000, 0.775859, -0.000000, -0.100000, 0.755859, -0.000000,
-0.090000, 0.805859, -0.000000, -0.110000, 0.805859, -0.000000, -0.100000, 0.815859, -0.000000, -0.100000, 0.795859, -0.000000, -0.090000, 0.845859, -0.000000,
-0.110000, 0.845859, -0.000000, -0.100000, 0.855859, -0.000000, -0.100000, 0.835859, -0.000000, -0.090000, 0.885859, -0.000000, -0.110000, 0.885859, -0.000000,
-0.100000, 0.895859, -0.000000, -0.100000, 0.875859, -0.000000, -0.090000, 0.925859, -0.000000, -0.110000, 0.925859, -0.000000, -0.100000, 0.935859, -0.000000,
-0.100000, 0.915859, -0.000000, -0.090000, 0.965859, -0.000000, -0.110000, 0.965859, -0.000000, -0.100000, 0.975859, -0.000000, -0.100000, 0.955859, -0.000000,
-0.090000, 1.005859, -0.000000, -0.110000, 1.005859, -0.000000, -0.100000, 1.015859, -0.000000, -0.100000, 0.995859, -0.000000, -0.090000, 1.045859, -0.000000,
-0.110000, 1.045859, -0.000000, -0.100000, 1.055859, -0.000000, -0.100000, 1.035859, -0.000000, -0.090000, 1.085859, -0.000000, -0.110000, 1.085859, -0.000000,
-0.100000, 1.095859, -0.000000, -0.100000, 1.075859, -0.000000, -0.090000, 1.125859, -0.000000, -0.110000, 1.125859, -0.000000, -0.100000, 1.135859, -0.000000,
-0.100000, 1.115859, -0.000000, -0.130000, 0.365859, -0.000000, -0.150000, 0.365859, -0.000000, -0.140000, 0.375859, -0.000000, -0.140000, 0.355859, -0.000000,
-0.130000, 0.405859, -0.000000, -0.150000, 0.405859, -0.000000, -0.140000, 0.415859, -0.000000, -0.140000, 0.395859, -0.000000, -0.130000, 0.445859, -0.000000,
-0.150000, 0.445859, -0.000000, -0.140000, 0.455859, -0.000000, -0.140000, 0.435859, -0.000000, -0.130000, 0.485859, -0.000000, -0.150000, 0.485859, -0.000000,
-0.140000, 0.495859, -0.000000, -0.140000, 0.475859, -0.000000, -0.130000, 0.525859, -0.000000, -0.150000, 0.525859, -0.000000, -0.140000, 0.535859, -0.000000,
-0.140000, 0.515859, -0.000000, -0.130000, 0.565859, -0.000000, -0.150000, 0.565859, -0.000000, -0.140000, 0.575859, -0.000000, -0.140000, 0.555859, -0.000000,
-0.130000, 0.605859, -0.000000, -0.150000, 0.605859, -0.000000, -0.140000, 0.615859, -0.000000, -0.140000, 0.595859, -0.000000, -0.130000, 0.645859, -0.000000,
-0.150000, 0.645859, -0.000000, -0.140000, 0.655859, -0.000000, -0.140000, 0.635859, -0.000000, -0.130000, 0.685859, -0.000000, -0.150000, 0.685859, -0.000000,
-0.140000, 0.695859, -0.000000, -0.140000, 0.675859, -0.000000, -0.130000, 0.725859, -0.000000, -0.150000, 0.725859, -0.000000, -0.140000, 0.735859, -0.000000,
-0.140000, 0.715859, -0.000000, -0.130000, 0.765859, -0.000000, -0.150000, 0.765859, -0.000000, -0.140000, 0.775859, -0.000000, -0.140000, 0.755859, -0.000000,
-0.130000, 0.805859, -0.000000, -0.150000, 0.805859, -0.000000, -0.140000, 0.815859, -0.000000, -0.140000, 0.795859, -0.000000, -0.130000, 0.845859, -0.000000,
-0.150000, 0.845859, -0.000000, -0.140000, 0.855859, -0.000000, -0.140000, 0.835859, -0.000000, -0.130000, 0.885859, -0.000000, -0.150000, 0.885859, -0.000000,
-0.140000, 0.895859, -0.000000, -0.140000, 0.875859, -0.000000, -0.130000, 0.925859, -0.000000, -0.150000, 0.925859, -0.000000, -0.140000, 0.935859, -0.000000,
-0.140000, 0.915859, -0.000000, -0.130000, 0.965859, -0.000000, -0.150000, 0.965859, -0.000000, -0.140000, 0.975859, -0.000000, -0.140000, 0.955859, -0.000000,
-0.130000, 1.005859, -0.000000, -0.150000, 1.005859, -0.000000, -0.140000, 1.015859, -0.000000, -0.140000, 0.995859, -0.000000, -0.130000, 1.045859, -0.000000,
-0.150000, 1.045859, -0.000000, -0.140000, 1.055859, -0.000000, -0.140000, 1.035859, -0.000000, -0.130000, 1.085859, -0.000000, -0.150000, 1.085859, -0.000000,
-0.140000, 1.095859, -0.000000, -0.140000, 1.075859, -0.000000, -0.130000, 1.125859, -0.000000, -0.150000, 1.125859, -0.000000, -0.140000, 1.135859, -0.000000,
-0.140000, 1.115859, -0.000000, -0.170000, 0.365859, -0.000000, -0.190000, 0.365859, -0.000000, -0.180000, 0.375859, -0.000000, -0.180000, 0.355859, -0.000000,
-0.170000, 0.405859, -0.000000, -0.190000, 0.405859, -0.000000, -0.180000, 0.415859, -0.000000, -0.180000, 0.395859, -0.000000, -0.170000, 0.445859, -0.000000,
-0.190000, 0.445859, -0.000000, -0.180000, 0.455859, -0.000000, -0.180000, 0.435859, -0.000000, -0.170000, 0.485859, -0.000000, -0.190000, 0.485859, -0.000000,
-0.180000, 0.495859, -0.000000, -0.180000, 0.475859, -0.000000, -0.170000, 0.525859, -0.000000, -0.190000, 0.525859, -0.000000, -0.180000, 0.535859, -0.000000,
-0.180000, 0.515859, -0.000000, -0.170000, 0.565859, -0.000000, -0.190000, 0.565859, -0.000000, -0.180000, 0.575859, -0.000000, -0.180000, 0.555859, -0.000000,
-0.170000, 0.605859, -0.000000, -0.190000, 0.605859, -0.000000, -0.180000, 0.615859, -0.000000, -0.180000, 0.595859, -0.000000, -0.170000, 0.645859, -0.000000,
-0.190000, 0.645859, -0.000000, -0.180000, 0.655859, -0.000000, -0.180000, 0.635859, -0.000000, -0.170000, 0.685859, -0.000000, -0.190000, 0.685859, -0.000000,
-0.180000, 0.695859, -0.000000, -0.180000, 0.675859, -0.000000, -0.170000, 0.725859, -0.000000, -0.190000, 0.725859, -0.000000, -0.180000, 0.735859, -0.000000,
-0.180000, 0.715859, -0.000000, -0.170000, 0.765859, -0.000000, -0.190000, 0.765859, -0.000000, -0.180000, 0.775859, -0.000000, -0.180000, 0.755859, -0.000000,
-0.170000, 0.805859, -0.000000, -0.190000, 0.805859, -0.000000, -0.180000, 0.815859, -0.000000, -0.180000, 0.795859, -0.000000, -0.170000, 0.845859, -0.000000,
-0.190000, 0.845859, -0.000000, -0.180000, 0.855859, -0.000000, -0.180000, 0.835859, -0.000000, -0.170000, 0.885859, -0.000000, -0.190000, 0.885859, -0.000000,
-0.180000, 0.895859, -0.000000, -0.180000, 0.875859, -0.000000, -0.170000, 0.925859, -0.000000, -0.190000, 0.925859, -0.000000, -0.180000, 0.935859, -0.000000,
-0.180000, 0.915859, -0.000000, -0.170000, 0.965859, -0.000000, -0.190000, 0.965859, -0.000000, -0.180000, 0.975859, -0.000000, -0.180000, 0.955859, -0.000000,
-0.170000, 1.005859, -0.000000, -0.190000, 1.005859, -0.000000, -0.180000, 1.015859, -0.000000, -0.180000, 0.995859, -0.000000, -0.170000, 1.045859, -0.000000,
-0.190000, 1.045859, -0.000000, -0.180000, 1.055859, -0.000000, -0.180000, 1.035859, -0.000000, -0.170000, 1.085859, -0.000000, -0.190000, 1.085859, -0.000000,
-0.180000, 1.095859, -0.000000, -0.180000, 1.075859, -0.000000, -0.170000, 1.125859, -0.000000, -0.190000, 1.125859, -0.000000, -0.180000, 1.135859, -0.000000,
-0.180000, 1.115859, -0.000000, -0.190000, 1.115859, -0.000000, -0.190000, 1.135859, -0.000000, -0.170000, 1.135859, -0.000000, -0.190000, 1.075859, -0.000000,
-0.190000, 1.095859, -0.000000, -0.170000, 1.095859, -0.000000, -0.190000, 1.035859, -0.000000, -0.190000, 1.055859, -0.000000, -0.170000, 1.055859, -0.000000,
-0.190000, 0.995859, -0.000000, -0.190000, 1.015859, -0.000000, -0.170000, 1.015859, -0.000000, -0.190000, 0.955859, -0.000000, -0.190000, 0.975859, -0.000000,
-0.170000, 0.975859, -0.000000, -0.190000, 0.915859, -0.000000, -0.190000, 0.935859, -0.000000, -0.170000, 0.935859, -0.000000, -0.190000, 0.875859, -0.000000,
-0.190000, 0.895859, -0.000000, -0.170000, 0.895859, -0.000000, -0.190000, 0.835859, -0.000000, -0.190000, 0.855859, -0.000000, -0.170000, 0.855859, -0.000000,
-0.190000, 0.795859, -0.000000, -0.190000, 0.815859, -0.000000, -0.170000, 0.815859, -0.000000, -0.190000, 0.755859, -0.000000, -0.190000, 0.775859, -0.000000,
-0.170000, 0.775859, -0.000000, -0.190000, 0.715859, -0.000000, -0.190000, 0.735859, -0.000000, -0.170000, 0.735859, -0.000000, -0.190000, 0.675859, -0.000000,
-0.190000, 0.695859, -0.000000, -0.170000, 0.695859, -0.000000, -0.190000, 0.635859, -0.000000, -0.190000, 0.655859, -0.000000, -0.170000, 0.655859, -0.000000,
-0.190000, 0.595859, -0.000000, -0.190000, 0.615859, -0.000000, -0.170000, 0.615859, -0.000000, -0.190000, 0.555859, -0.000000, -0.190000, 0.575859, -0.000000,
-0.170000, 0.575859, -0.000000, -0.190000, 0.515859, -0.000000, -0.190000, 0.535859, -0.000000, -0.170000, 0.535859, -0.000000, -0.190000, 0.475859, -0.000000,
-0.190000, 0.495859, -0.000000, -0.170000, 0.495859, -0.000000, -0.190000, 0.435859, -0.000000, -0.190000, 0.455859, -0.000000, -0.170000, 0.455859, -0.000000,
-0.190000, 0.395859, -0.000000, -0.190000, 0.415859, -0.000000, -0.170000, 0.415859, -0.000000, -0.190000, 0.355859, -0.000000, -0.190000, 0.375859, -0.000000,
-0.170000, 0.375859, -0.000000, -0.150000, 1.115859, -0.000000, -0.150000, 1.135859, -0.000000, -0.130000, 1.135859, -0.000000, -0.150000, 1.075859, -0.000000,
-0.150000, 1.095859, -0.000000, -0.130000, 1.095859, -0.000000, -0.150000, 1.035859, -0.000000, -0.150000, 1.055859, -0.000000, -0.130000, 1.055859, -0.000000,
-0.150000, 0.995859, -0.000000, -0.150000, 1.015859, -0.000000, -0.130000, 1.015859, -0.000000, -0.150000, 0.955859, -0.000000, -0.150000, 0.975859, -0.000000,
-0.130000, 0.975859, -0.000000, -0.150000, 0.915859, -0.000000, -0.150000, 0.935859, -0.000000, -0.130000, 0.935859, -0.000000, -0.150000, 0.875859, -0.000000,
-0.150000, 0.895859, -0.000000, -0.130000, 0.895859, -0.000000, -0.150000, 0.835859, -0.000000, -0.150000, 0.855859, -0.000000, -0.130000, 0.855859, -0.000000,
-0.150000, 0.795859, -0.000000, -0.150000, 0.815859, -0.000000, -0.130000, 0.815859, -0.000000, -0.150000, 0.755859, -0.000000, -0.150000, 0.775859, -0.000000,
-0.130000, 0.775859, -0.000000, -0.150000, 0.715859, -0.000000, -0.150000, 0.735859, -0.000000, -0.130000, 0.735859, -0.000000, -0.150000, 0.675859, -0.000000,
-0.150000, 0.695859, -0.000000, -0.130000, 0.695859, -0.000000, -0.150000, 0.635859, -0.000000, -0.150000, 0.655859, -0.000000, -0.130000, 0.655859, -0.000000,
-0.150000, 0.595859, -0.000000, -0.150000, 0.615859, -0.000000, -0.130000, 0.615859, -0.000000, -0.150000, 0.555859, -0.000000, -0.150000, 0.575859, -0.000000,
-0.130000, 0.575859, -0.000000, -0.150000, 0.515859, -0.000000, -0.150000, 0.535859, -0.000000, -0.130000, 0.535859, -0.000000, -0.150000, 0.475859, -0.000000,
-0.150000, 0.495859, -0.000000, -0.130000, 0.495859, -0.000000, -0.150000, 0.435859, -0.000000, -0.150000, 0.455859, -0.000000, -0.130000, 0.455859, -0.000000,
-0.150000, 0.395859, -0.000000, -0.150000, 0.415859, -0.000000, -0.130000, 0.415859, -0.000000, -0.150000, 0.355859, -0.000000, -0.150000, 0.375859, -0.000000,
-0.130000, 0.375859, -0.000000, -0.110000, 1.115859, -0.000000, -0.110000, 1.135859, -0.000000, -0.090000, 1.135859, -0.000000, -0.110000, 1.075859, -0.000000,
-0.110000, 1.095859, -0.000000, -0.090000, 1.095859, -0.000000, -0.110000, 1.035859, -0.000000, -0.110000, 1.055859, -0.000000, -0.090000, 1.055859, -0.000000,
-0.110000, 0.995859, -0.000000, -0.110000, 1.015859, -0.000000, -0.090000, 1.015859, -0.000000, -0.110000, 0.955859, -0.000000, -0.110000, 0.975859, -0.000000,
-0.090000, 0.975859, -0.000000, -0.110000, 0.915859, -0.000000, -0.110000, 0.935859, -0.000000, -0.090000, 0.935859, -0.000000, -0.110000, 0.875859, -0.000000,
-0.110000, 0.895859, -0.000000, -0.090000, 0.895859, -0.000000, -0.110000, 0.835859, -0.000000, -0.110000, 0.855859, -0.000000, -0.090000, 0.855859, -0.000000,
-0.110000, 0.795859, -0.000000, -0.110000, 0.815859, -0.000000, -0.090000, 0.815859, -0.000000, -0.110000, 0.755859, -0.000000, -0.110000, 0.775859, -0.000000,
-0.090000, 0.775859, -0.000000, -0.110000, 0.715859, -0.000000, -0.110000, 0.735859, -0.000000, -0.090000, 0.735859, -0.000000, -0.110000, 0.675859, -0.000000,
-0.110000, 0.695859, -0.000000, -0.090000, 0.695859, -0.000000, -0.110000, 0.635859, -0.000000, -0.110000, 0.655859, -0.000000, -0.090000, 0.655859, -0.000000,
-0.110000, 0.595859, -0.000000, -0.110000, 0.615859, -0.000000, -0.090000, 0.615859, -0.000000, -0.110000, 0.555859, -0.000000, -0.110000, 0.575859, -0.000000,
-0.090000, 0.575859, -0.000000, -0.110000, 0.515859, -0.000000, -0.110000, 0.535859, -0.000000, -0.090000, 0.535859, -0.000000, -0.110000, 0.475859, -0.000000,
-0.110000, 0.495859, -0.000000, -0.090000, 0.495859, -0.000000, -0.110000, 0.435859, -0.000000, -0.110000, 0.455859, -0.000000, -0.090000, 0.455859, -0.000000,
-0.110000, 0.395859, -0.000000, -0.110000, 0.415859, -0.000000, -0.090000, 0.415859, -0.000000, -0.110000, 0.355859, -0.000000, -0.110000, 0.375859, -0.000000,
-0.090000, 0.375859, -0.000000, -0.070000, 1.115859, -0.000000, -0.070000, 1.135859, -0.000000, -0.050000, 1.135859, -0.000000, -0.070000, 1.075859, -0.000000,
-0.070000, 1.095859, -0.000000, -0.050000, 1.095859, -0.000000, -0.070000, 1.035859, -0.000000, -0.070000, 1.055859, -0.000000, -0.050000, 1.055859, -0.000000,
-0.070000, 0.995859, -0.000000, -0.070000, 1.015859, -0.000000, -0.050000, 1.015859, -0.000000, -0.070000, 0.955859, -0.000000, -0.070000, 0.975859, -0.000000,
-0.050000, 0.975859, -0.000000, -0.070000, 0.915859, -0.000000, -0.070000, 0.935859, -0.000000, -0.050000, 0.935859, -0.000000, -0.070000, 0.875859, -0.000000,
-0.070000, 0.895859, -0.000000, -0.050000, 0.895859, -0.000000, -0.070000, 0.835859, -0.000000, -0.070000, 0.855859, -0.000000, -0.050000, 0.855859, -0.000000,
-0.070000, 0.795859, -0.000000, -0.070000, 0.815859, -0.000000, -0.050000, 0.815859, -0.000000, -0.070000, 0.755859, -0.000000, -0.070000, 0.775859, -0.000000,
-0.050000, 0.775859, -0.000000, -0.070000, 0.715859, -0.000000, -0.070000, 0.735859, -0.000000, -0.050000, 0.735859, -0.000000, -0.070000, 0.675859, -0.000000,
-0.070000, 0.695859, -0.000000, -0.050000, 0.695859, -0.000000, -0.070000, 0.635859, -0.000000, -0.070000, 0.655859, -0.000000, -0.050000, 0.655859, -0.000000,
-0.070000, 0.595859, -0.000000, -0.070000, 0.615859, -0.000000, -0.050000, 0.615859, -0.000000, -0.070000, 0.555859, -0.000000, -0.070000, 0.575859, -0.000000,
-0.050000, 0.575859, -0.000000, -0.070000, 0.515859, -0.000000, -0.070000, 0.535859, -0.000000, -0.050000, 0.535859, -0.000000, -0.070000, 0.475859, -0.000000,
-0.070000, 0.495859, -0.000000, -0.050000, 0.495859, -0.000000, -0.070000, 0.435859, -0.000000, -0.070000, 0.455859, -0.000000, -0.050000, 0.455859, -0.000000,
-0.070000, 0.395859, -0.000000, -0.070000, 0.415859, -0.000000, -0.050000, 0.415859, -0.000000, -0.070000, 0.355859, -0.000000, -0.070000, 0.375859, -0.000000,
-0.050000, 0.375859, -0.000000, -0.030000, 1.115859, -0.000000, -0.030000, 1.135859, -0.000000, -0.010000, 1.135859, -0.000000, -0.030000, 1.075859, -0.000000,
-0.030000, 1.095859, -0.000000, -0.010000, 1.095859, -0.000000, -0.030000, 1.035859, -0.000000, -0.030000, 1.055859, -0.000000, -0.010000, 1.055859, -0.000000,
-0.030000, 0.995859, -0.000000, -0.030000, 1.015859, -0.000000, -0.010000, 1.015859, -0.000000, -0.030000, 0.955859, -0.000000, -0.030000, 0.975859, -0.000000,
-0.010000, 0.975859, -0.000000, -0.030000, 0.915859, -0.000000, -0.030000, 0.935859, -0.000000, -0.010000, 0.935859, -0.000000, -0.030000, 0.875859, -0.000000,
-0.030000, 0.895859, -0.000000, -0.010000, 0.895859, -0.000000, -0.030000, 0.835859, -0.000000, -0.030000, 0.855859, -0.000000, -0.010000, 0.855859, -0.000000,
-0.030000, 0.795859, -0.000000, -0.030000, 0.815859, -0.000000, -0.010000, 0.815859, -0.000000, -0.030000, 0.755859, -0.000000, -0.030000, 0.775859, -0.000000,
-0.010000, 0.775859, -0.000000, -0.030000, 0.715859, -0.000000, -0.030000, 0.735859, -0.000000, -0.010000, 0.735859, -0.000000, -0.030000, 0.675859, -0.000000,
-0.030000, 0.695859, -0.000000, -0.010000, 0.695859, -0.000000, -0.030000, 0.635859, -0.000000, -0.030000, 0.655859, -0.000000, -0.010000, 0.655859, -0.000000,
-0.030000, 0.595859, -0.000000, -0.030000, 0.615859, -0.000000, -0.010000, 0.615859, -0.000000, -0.030000, 0.555859, -0.000000, -0.030000, 0.575859, -0.000000,
-0.010000, 0.575859, -0.000000, -0.030000, 0.515859, -0.000000, -0.030000, 0.535859, -0.000000, -0.010000, 0.535859, -0.000000, -0.030000, 0.475859, -0.000000,
-0.030000, 0.495859, -0.000000, -0.010000, 0.495859, -0.000000, -0.030000, 0.435859, -0.000000, -0.030000, 0.455859, -0.000000, -0.010000, 0.455859, -0.000000,
-0.030000, 0.395859, -0.000000, -0.030000, 0.415859, -0.000000, -0.010000, 0.415859, -0.000000, -0.030000, 0.355859, -0.000000, -0.030000, 0.375859, -0.000000,
-0.010000, 0.375859, -0.000000, 0.010000, 1.115859, -0.000000, 0.010000, 1.135859, -0.000000, 0.030000, 1.135859, -0.000000, 0.010000, 1.075859, -0.000000,
0.010000, 1.095859, -0.000000, 0.030000, 1.095859, -0.000000, 0.010000, 1.035859, -0.000000, 0.010000, 1.055859, -0.000000, 0.030000, 1.055859, -0.000000,
0.010000, 0.995859, -0.000000, 0.010000, 1.015859, -0.000000, 0.030000, 1.015859, -0.000000, 0.010000, 0.955859, -0.000000, 0.010000, 0.975859, -0.000000,
0.030000, 0.975859, -0.000000, 0.010000, 0.915859, -0.000000, 0.010000, 0.935859, -0.000000, 0.030000, 0.935859, -0.000000, 0.010000, 0.875859, -0.000000,
0.010000, 0.895859, -0.000000, 0.030000, 0.895859, -0.000000, 0.010000, 0.835859, -0.000000, 0.010000, 0.855859, -0.000000, 0.030000, 0.855859, -0.000000,
0.010000, 0.795859, -0.000000, 0.010000, 0.815859, -0.000000, 0.030000, 0.815859, -0.000000, 0.010000, 0.755859, -0.000000, 0.010000, 0.775859, -0.000000,
0.030000, 0.775859, -0.000000, 0.010000, 0.715859, -0.000000, 0.010000, 0.735859, -0.000000, 0.030000, 0.735859, -0.000000, 0.010000, 0.675859, -0.000000,
0.010000, 0.695859, -0.000000, 0.030000, 0.695859, -0.000000, 0.010000, 0.635859, -0.000000, 0.010000, 0.655859, -0.000000, 0.030000, 0.655859, -0.000000,
0.010000, 0.595859, -0.000000, 0.010000, 0.615859, -0.000000, 0.030000, 0.615859, -0.000000, 0.010000, 0.555859, -0.000000, 0.010000, 0.575859, -0.000000,
0.030000, 0.575859, -0.000000, 0.010000, 0.515859, -0.000000, 0.010000, 0.535859, -0.000000, 0.030000, 0.535859, -0.000000, 0.010000, 0.475859, -0.000000,
0.010000, 0.495859, -0.000000, 0.030000, 0.495859, -0.000000, 0.010000, 0.435859, -0.000000, 0.010000, 0.455859, -0.000000, 0.030000, 0.455859, -0.000000,
0.010000, 0.395859, -0.000000, 0.010000, 0.415859, -0.000000, 0.030000, 0.415859, -0.000000, 0.010000, 0.355859, -0.000000, 0.010000, 0.375859, -0.000000,
0.030000, 0.375859, -0.000000, 0.050000, 1.115859, -0.000000, 0.050000, 1.135859, -0.000000, 0.070000, 1.135859, -0.000000, 0.050000, 1.075859, -0.000000,
0.050000, 1.095859, -0.000000, 0.070000, 1.095859, -0.000000, 0.050000, 1.035859, -0.000000, 0.050000, 1.055859, -0.000000, 0.070000, 1.055859, -0.000000,
0.050000, 0.995859, -0.000000, 0.050000, 1.015859, -0.000000, 0.070000, 1.015859, -0.000000, 0.050000, 0.955859, -0.000000, 0.050000, 0.975859, -0.000000,
0.070000, 0.975859, -0.000000, 0.050000, 0.915859, -0.000000, 0.050000, 0.935859, -0.000000, 0.070000, 0.935859, -0.000000, 0.050000, 0.875859, -0.000000,
0.050000, 0.895859, -0.000000, 0.070000, 0.895859, -0.000000, 0.050000, 0.835859, -0.000000, 0.050000, 0.855859, -0.000000, 0.070000, 0.855859, -0.000000,
0.050000, 0.795859, -0.000000, 0.050000, 0.815859, -0.000000, 0.070000, 0.815859, -0.000000, 0.050000, 0.755859, -0.000000, 0.050000, 0.775859, -0.000000,
0.070000, 0.775859, -0.000000, 0.050000, 0.715859, -0.000000, 0.050000, 0.735859, -0.000000, 0.070000, 0.735859, -0.000000, 0.050000, 0.675859, -0.000000,
0.050000, 0.695859, -0.000000, 0.070000, 0.695859, -0.000000, 0.050000, 0.635859, -0.000000, 0.050000, 0.655859, -0.000000, 0.070000, 0.655859, -0.000000,
0.050000, 0.595859, -0.000000, 0.050000, 0.615859, -0.000000, 0.070000, 0.615859, -0.000000, 0.050000, 0.555859, -0.000000, 0.050000, 0.575859, -0.000000,
0.070000, 0.575859, -0.000000, 0.050000, 0.515859, -0.000000, 0.050000, 0.535859, -0.000000, 0.070000, 0.535859, -0.000000, 0.050000, 0.475859, -0.000000,
0.050000, 0.495859, -0.000000, 0.070000, 0.495859, -0.000000, 0.050000, 0.435859, -0.000000, 0.050000, 0.455859, -0.000000, 0.070000, 0.455859, -0.000000,
0.050000, 0.395859, -0.000000, 0.050000, 0.415859, -0.000000, 0.070000, 0.415859, -0.000000, 0.050000, 0.355859, -0.000000, 0.050000, 0.375859, -0.000000,
0.070000, 0.375859, -0.000000, 0.090000, 1.115859, -0.000000, 0.090000, 1.135859, -0.000000, 0.110000, 1.135859, -0.000000, 0.090000, 1.075859, -0.000000,
0.090000, 1.095859, -0.000000, 0.110000, 1.095859, -0.000000, 0.090000, 1.035859, -0.000000, 0.090000, 1.055859, -0.000000, 0.110000, 1.055859, -0.000000,
0.090000, 0.995859, -0.000000, 0.090000, 1.015859, -0.000000, 0.110000, 1.015859, -0.000000, 0.090000, 0.955859, -0.000000, 0.090000, 0.975859, -0.000000,
0.110000, 0.975859, -0.000000, 0.090000, 0.915859, -0.000000, 0.090000, 0.935859, -0.000000, 0.110000, 0.935859, -0.000000, 0.090000, 0.875859, -0.000000,
0.090000, 0.895859, -0.000000, 0.110000, 0.895859, -0.000000, 0.090000, 0.835859, -0.000000, 0.090000, 0.855859, -0.000000, 0.110000, 0.855859, -0.000000,
0.090000, 0.795859, -0.000000, 0.090000, 0.815859, -0.000000, 0.110000, 0.815859, -0.000000, 0.090000, 0.755859, -0.000000, 0.090000, 0.775859, -0.000000,
0.110000, 0.775859, -0.000000, 0.090000, 0.715859, -0.000000, 0.090000, 0.735859, -0.000000, 0.110000, 0.735859, -0.000000, 0.090000, 0.675859, -0.000000,
0.090000, 0.695859, -0.000000, 0.110000, 0.695859, -0.000000, 0.090000, 0.635859, -0.000000, 0.090000, 0.655859, -0.000000, 0.110000, 0.655859, -0.000000,
0.090000, 0.595859, -0.000000, 0.090000, 0.615859, -0.000000, 0.110000, 0.615859, -0.000000, 0.090000, 0.555859, -0.000000, 0.090000, 0.575859, -0.000000,
0.110000, 0.575859, -0.000000, 0.090000, 0.515859, -0.000000, 0.090000, 0.535859, -0.000000, 0.110000, 0.535859, -0.000000, 0.090000, 0.475859, -0.000000,
0.090000, 0.495859, -0.000000, 0.110000, 0.495859, -0.000000, 0.090000, 0.435859, -0.000000, 0.090000, 0.455859, -0.000000, 0.110000, 0.455859, -0.000000,
0.090000, 0.395859, -0.000000, 0.090000, 0.415859, -0.000000, 0.110000, 0.415859, -0.000000, 0.090000, 0.355859, -0.000000, 0.090000, 0.375859, -0.000000,
0.110000, 0.375859, -0.000000, 0.130000, 1.115859, -0.000000, 0.130000, 1.135859, -0.000000, 0.150000, 1.135859, -0.000000, 0.130000, 1.075859, -0.000000,
0.130000, 1.095859, -0.000000, 0.150000, 1.095859, -0.000000, 0.130000, 1.035859, -0.000000, 0.130000, 1.055859, -0.000000, 0.150000, 1.055859, -0.000000,
0.130000, 0.995859, -0.000000, 0.130000, 1.015859, -0.000000, 0.150000, 1.015859, -0.000000, 0.130000, 0.955859, -0.000000, 0.130000, 0.975859, -0.000000,
0.150000, 0.975859, -0.000000, 0.130000, 0.915859, -0.000000, 0.130000, 0.935859, -0.000000, 0.150000, 0.935859, -0.000000, 0.130000, 0.875859, -0.000000,
0.130000, 0.895859, -0.000000, 0.150000, 0.895859, -0.000000, 0.130000, 0.835859, -0.000000, 0.130000, 0.855859, -0.000000, 0.150000, 0.855859, -0.000000,
0.130000, 0.795859, -0.000000, 0.130000, 0.815859, -0.000000, 0.150000, 0.815859, -0.000000, 0.130000, 0.755859, -0.000000, 0.130000, 0.775859, -0.000000,
0.150000, 0.775859, -0.000000, 0.130000, 0.715859, -0.000000, 0.130000, 0.735859, -0.000000, 0.150000, 0.735859, -0.000000, 0.130000, 0.675859, -0.000000,
0.130000, 0.695859, -0.000000, 0.150000, 0.695859, -0.000000, 0.130000, 0.635859, -0.000000, 0.130000, 0.655859, -0.000000, 0.150000, 0.655859, -0.000000,
0.130000, 0.595859, -0.000000, 0.130000, 0.615859, -0.000000, 0.150000, 0.615859, -0.000000, 0.130000, 0.555859, -0.000000, 0.130000, 0.575859, -0.000000,
0.150000, 0.575859, -0.000000, 0.130000, 0.515859, -0.000000, 0.130000, 0.535859, -0.000000, 0.150000, 0.535859, -0.000000, 0.130000, 0.475859, -0.000000,
0.130000, 0.495859, -0.000000, 0.150000, 0.495859, -0.000000, 0.130000, 0.435859, -0.000000, 0.130000, 0.455859, -0.000000, 0.150000, 0.455859, -0.000000,
0.130000, 0.395859, -0.000000, 0.130000, 0.415859, -0.000000, 0.150000, 0.415859, -0.000000, 0.130000, 0.355859, -0.000000, 0.130000, 0.375859, -0.000000,
0.150000, 0.375859, -0.000000, 0.170000, 1.115859, -0.000000, 0.170000, 1.135859, -0.000000, 0.190000, 1.135859, -0.000000, 0.170000, 1.075859, -0.000000,
0.170000, 1.095859, -0.000000, 0.190000, 1.095859, -0.000000, 0.170000, 1.035859, -0.000000, 0.170000, 1.055859, -0.000000, 0.190000, 1.055859, -0.000000,
0.170000, 0.995859, -0.000000, 0.170000, 1.015859, -0.000000, 0.190000, 1.015859, -0.000000, 0.170000, 0.955859, -0.000000, 0.170000, 0.975859, -0.000000,
0.190000, 0.975859, -0.000000, 0.170000, 0.915859, -0.000000, 0.170000, 0.935859, -0.000000, 0.190000, 0.935859, -0.000000, 0.170000, 0.875859, -0.000000,
0.170000, 0.895859, -0.000000, 0.190000, 0.895859, -0.000000, 0.170000, 0.835859, -0.000000, 0.170000, 0.855859, -0.000000, 0.190000, 0.855859, -0.000000,
0.170000, 0.795859, -0.000000, 0.170000, 0.815859, -0.000000, 0.190000, 0.815859, -0.000000, 0.170000, 0.755859, -0.000000, 0.170000, 0.775859, -0.000000,
0.190000, 0.775859, -0.000000, 0.170000, 0.715859, -0.000000, 0.170000, 0.735859, -0.000000, 0.190000, 0.735859, -0.000000, 0.170000, 0.675859, -0.000000,
0.170000, 0.695859, -0.000000, 0.190000, 0.695859, -0.000000, 0.170000, 0.635859, -0.000000, 0.170000, 0.655859, -0.000000, 0.190000, 0.655859, -0.000000,
0.170000, 0.595859, -0.000000, 0.170000, 0.615859, -0.000000, 0.190000, 0.615859, -0.000000, 0.170000, 0.555859, -0.000000, 0.170000, 0.575859, -0.000000,
0.190000, 0.575859, -0.000000, 0.170000, 0.515859, -0.000000, 0.170000, 0.535859, -0.000000, 0.190000, 0.535859, -0.000000, 0.170000, 0.475859, -0.000000,
0.170000, 0.495859, -0.000000, 0.190000, 0.495859, -0.000000, 0.170000, 0.435859, -0.000000, 0.170000, 0.455859, -0.000000, 0.190000, 0.455859, -0.000000,
0.170000, 0.395859, -0.000000, 0.170000, 0.415859, -0.000000, 0.190000, 0.415859, -0.000000, 0.170000, 0.355859, -0.000000, 0.170000, 0.375859, -0.000000,
0.190000, 0.375859, -0.000000, 0.190000, 0.355859, -0.000000, 0.190000, 0.395859, -0.000000, 0.190000, 0.435859, -0.000000, 0.190000, 0.475859, -0.000000,
0.190000, 0.515859, -0.000000, 0.190000, 0.555859, -0.000000, 0.190000, 0.595859, -0.000000, 0.190000, 0.635859, -0.000000, 0.190000, 0.675859, -0.000000,
0.190000, 0.715859, -0.000000, 0.190000, 0.755859, -0.000000, 0.190000, 0.795859, -0.000000, 0.190000, 0.835859, -0.000000, 0.190000, 0.875859, -0.000000,
0.190000, 0.915859, -0.000000, 0.190000, 0.955859, -0.000000, 0.190000, 0.995859, -0.000000, 0.190000, 1.035859, -0.000000, 0.190000, 1.075859, -0.000000,
0.190000, 1.115859, -0.000000, 0.150000, 0.355859, -0.000000, 0.150000, 0.395859, -0.000000, 0.150000, 0.435859, -0.000000, 0.150000, 0.475859, -0.000000,
0.150000, 0.515859, -0.000000, 0.150000, 0.555859, -0.000000, 0.150000, 0.595859, -0.000000, 0.150000, 0.635859, -0.000000, 0.150000, 0.675859, -0.000000,
0.150000, 0.715859, -0.000000, 0.150000, 0.755859, -0.000000, 0.150000, 0.795859, -0.000000, 0.150000, 0.835859, -0.000000, 0.150000, 0.875859, -0.000000,
0.150000, 0.915859, -0.000000, 0.150000, 0.955859, -0.000000, 0.150000, 0.995859, -0.000000, 0.150000, 1.035859, -0.000000, 0.150000, 1.075859, -0.000000,
0.150000, 1.115859, -0.000000, 0.110000, 0.355859, -0.000000, 0.110000, 0.395859, -0.000000, 0.110000, 0.435859, -0.000000, 0.110000, 0.475859, -0.000000,
0.110000, 0.515859, -0.000000, 0.110000, 0.555859, -0.000000, 0.110000, 0.595859, -0.000000, 0.110000, 0.635859, -0.000000, 0.110000, 0.675859, -0.000000,
0.110000, 0.715859, -0.000000, 0.110000, 0.755859, -0.000000, 0.110000, 0.795859, -0.000000, 0.110000, 0.835859, -0.000000, 0.110000, 0.875859, -0.000000,
0.110000, 0.915859, -0.000000, 0.110000, 0.955859, -0.000000, 0.110000, 0.995859, -0.000000, 0.110000, 1.035859, -0.000000, 0.110000, 1.075859, -0.000000,
0.110000, 1.115859, -0.000000, 0.070000, 0.355859, -0.000000, 0.070000, 0.395859, -0.000000, 0.070000, 0.435859, -0.000000, 0.070000, 0.475859, -0.000000,
0.070000, 0.515859, -0.000000, 0.070000, 0.555859, -0.000000, 0.070000, 0.595859, -0.000000, 0.070000, 0.635859, -0.000000, 0.070000, 0.675859, -0.000000,
0.070000, 0.715859, -0.000000, 0.070000, 0.755859, -0.000000, 0.070000, 0.795859, -0.000000, 0.070000, 0.835859, -0.000000, 0.070000, 0.875859, -0.000000,
0.070000, 0.915859, -0.000000, 0.070000, 0.955859, -0.000000, 0.070000, 0.995859, -0.000000, 0.070000, 1.035859, -0.000000, 0.070000, 1.075859, -0.000000,
0.070000, 1.115859, -0.000000, 0.030000, 0.355859, -0.000000, 0.030000, 0.395859, -0.000000, 0.030000, 0.435859, -0.000000, 0.030000, 0.475859, -0.000000,
0.030000, 0.515859, -0.000000, 0.030000, 0.555859, -0.000000, 0.030000, 0.595859, -0.000000, 0.030000, 0.635859, -0.000000, 0.030000, 0.675859, -0.000000,
0.030000, 0.715859, -0.000000, 0.030000, 0.755859, -0.000000, 0.030000, 0.795859, -0.000000, 0.030000, 0.835859, -0.000000, 0.030000, 0.875859, -0.000000,
0.030000, 0.915859, -0.000000, 0.030000, 0.955859, -0.000000, 0.030000, 0.995859, -0.000000, 0.030000, 1.035859, -0.000000, 0.030000, 1.075859, -0.000000,
0.030000, 1.115859, -0.000000, -0.010000, 0.355859, -0.000000, -0.010000, 0.395859, -0.000000, -0.010000, 0.435859, -0.000000, -0.010000, 0.475859, -0.000000,
-0.010000, 0.515859, -0.000000, -0.010000, 0.555859, -0.000000, -0.010000, 0.595859, -0.000000, -0.010000, 0.635859, -0.000000, -0.010000, 0.675859, -0.000000,
-0.010000, 0.715859, -0.000000, -0.010000, 0.755859, -0.000000, -0.010000, 0.795859, -0.000000, -0.010000, 0.835859, -0.000000, -0.010000, 0.875859, -0.000000,
-0.010000, 0.915859, -0.000000, -0.010000, 0.955859, -0.000000, -0.010000, 0.995859, -0.000000, -0.010000, 1.035859, -0.000000, -0.010000, 1.075859, -0.000000,
-0.010000, 1.115859, -0.000000, -0.050000, 0.355859, -0.000000, -0.050000, 0.395859, -0.000000, -0.050000, 0.435859, -0.000000, -0.050000, 0.475859, -0.000000,
-0.050000, 0.515859, -0.000000, -0.050000, 0.555859, -0.000000, -0.050000, 0.595859, -0.000000, -0.050000, 0.635859, -0.000000, -0.050000, 0.675859, -0.000000,
-0.050000, 0.715859, -0.000000, -0.050000, 0.755859, -0.000000, -0.050000, 0.795859, -0.000000, -0.050000, 0.835859, -0.000000, -0.050000, 0.875859, -0.000000,
-0.050000, 0.915859, -0.000000, -0.050000, 0.955859, -0.000000, -0.050000, 0.995859, -0.000000, -0.050000, 1.035859, -0.000000, -0.050000, 1.075859, -0.000000,
-0.050000, 1.115859, -0.000000, -0.090000, 0.355859, -0.000000, -0.090000, 0.395859, -0.000000, -0.090000, 0.435859, -0.000000, -0.090000, 0.475859, -0.000000,
-0.090000, 0.515859, -0.000000, -0.090000, 0.555859, -0.000000, -0.090000, 0.595859, -0.000000, -0.090000, 0.635859, -0.000000, -0.090000, 0.675859, -0.000000,
-0.090000, 0.715859, -0.000000, -0.090000, 0.755859, -0.000000, -0.090000, 0.795859, -0.000000, -0.090000, 0.835859, -0.000000, -0.090000, 0.875859, -0.000000,
-0.090000, 0.915859, -0.000000, -0.090000, 0.955859, -0.000000, -0.090000, 0.995859, -0.000000, -0.090000, 1.035859, -0.000000, -0.090000, 1.075859, -0.000000,
-0.090000, 1.115859, -0.000000, -0.130000, 0.355859, -0.000000, -0.130000, 0.395859, -0.000000, -0.130000, 0.435859, -0.000000, -0.130000, 0.475859, -0.000000,
-0.130000, 0.515859, -0.000000, -0.130000, 0.555859, -0.000000, -0.130000, 0.595859, -0.000000, -0.130000, 0.635859, -0.000000, -0.130000, 0.675859, -0.000000,
-0.130000, 0.715859, -0.000000, -0.130000, 0.755859, -0.000000, -0.130000, 0.795859, -0.000000, -0.130000, 0.835859, -0.000000, -0.130000, 0.875859, -0.000000,
-0.130000, 0.915859, -0.000000, -0.130000, 0.955859, -0.000000, -0.130000, 0.995859, -0.000000, -0.130000, 1.035859, -0.000000, -0.130000, 1.075859, -0.000000,
-0.130000, 1.115859, -0.000000, -0.170000, 0.355859, -0.000000, -0.170000, 0.395859, -0.000000, -0.170000, 0.435859, -0.000000, -0.170000, 0.475859, -0.000000,
-0.170000, 0.515859, -0.000000, -0.170000, 0.555859, -0.000000, -0.170000, 0.595859, -0.000000, -0.170000, 0.635859, -0.000000, -0.170000, 0.675859, -0.000000,
-0.170000, 0.715859, -0.000000, -0.170000, 0.755859, -0.000000, -0.170000, 0.795859, -0.000000, -0.170000, 0.835859, -0.000000, -0.170000, 0.875859, -0.000000,
-0.170000, 0.915859, -0.000000, -0.170000, 0.955859, -0.000000, -0.170000, 0.995859, -0.000000, -0.170000, 1.035859, -0.000000, -0.170000, 1.075859, -0.000000,
-0.170000, 1.115859, -0.000000
],
"faceTriIds" : [
863, 1294, 3320, 866, 1297, 3319, 869, 1300, 3318, 872, 1303, 3317, 875, 1306, 3316,
878, 1309, 3315, 3314, 28, 1312, 3313, 29, 1315, 887, 1318, 3312, 3311, 31, 1321,
893, 1324, 3310, 896, 1327, 3309, 3308, 34, 1330, 902, 1333, 3307, 905, 1336, 3306,
908, 1339, 3305, 911, 1342, 3304, 914, 1345, 3303, 917, 1348, 3302, 920, 1351, 3301,
923, 1354, 3300, 925, 1356, 3299, 927, 1358, 3298, 929, 1360, 3297, 931, 1362, 3296,
933, 1364, 3295, 935, 1366, 3294, 937, 1368, 3293, 939, 1370, 3292, 941, 1372, 3291,
943, 1374, 3290, 945, 1376, 3289, 947, 1378, 3288, 949, 1380, 3287, 951, 1382, 3286,
953, 1384, 3285, 955, 1386, 3284, 957, 1388, 3283, 959, 1390, 3282, 961, 1392, 3281,
964, 1395, 3280, 966, 1397, 3279, 968, 1399, 3278, 970, 1401, 3277, 972, 1403, 3276,
3275, 69, 1405, 976, 1407, 3274, 978, 1409, 3273, 980, 1411, 3272, 982, 1413, 3271,
984, 1415, 3270, 3269, 75, 1417, 988, 1419, 3268, 3267, 77, 1421, 992, 1423, 3266,
994, 1425, 3265, 996, 1427, 3264, 998, 1429, 3263, 1000, 1431, 3262, 1002, 1433, 3261,
1005, 1436, 3260, 1007, 1438, 3259, 3258, 87, 1440, 1011, 1442, 3257, 3256, 89, 1444,
3255, 90, 1446, 1017, 1448, 3254, 3253, 92, 1450, 1021, 1452, 3252, 1023, 1454, 3251,
3250, 95, 1456, 1027, 1458, 3249, 1029, 1460, 3248, 1031, 1462, 3247, 1033, 1464, 3246,
3245, 100, 1466, 1037, 1468, 3244, 1039, 1470, 3243, 1041, 1472, 3242, 3241, 104, 1474,
3240, 106, 1477, 1048, 1479, 3239, 1050, 1481, 3238, 3237, 109, 1483, 1054, 1485, 3236,
3235, 111, 1487, 1058, 1489, 3234, 1060, 1491, 3233, 1062, 1493, 3232, 1064, 1495, 3231,
1066, 1497, 3230, 3229, 117, 1499, 1070, 1501, 3228, 3227, 119, 1503, 1074, 1505, 3226,
1076, 1507, 3225, 3224, 122, 1509, 3223, 123, 1511, 3222, 124, 1513, 3221, 125, 1515,
1087, 1518, 3220, 1089, 1520, 3219, 3218, 129, 1522, 1093, 1524, 3217, 1095, 1526, 3216,
1097, 1528, 3215, 1099, 1530, 3214, 1101, 1532, 3213, 3212, 135, 1534, 1105, 1536, 3211,
3210, 137, 1538, 1109, 1540, 3209, 1111, 1542, 3208, 1113, 1544, 3207, 1115, 1546, 3206,
1117, 1548, 3205, 3204, 143, 1550, 1121, 1552, 3203, 1123, 1554, 3202, 1125, 1556, 3201,
1128, 1559, 3200, 1130, 1561, 3199, 1132, 1563, 3198, 3197, 151, 1565, 1136, 1567, 3196,
1138, 1569, 3195, 1140, 1571, 3194, 3193, 155, 1573, 1144, 1575, 3192, 1146, 1577, 3191,
1148, 1579, 3190, 3189, 159, 1581, 1152, 1583, 3188, 1154, 1585, 3187, 3186, 162, 1587,
1158, 1589, 3185, 1160, 1591, 3184, 1162, 1593, 3183, 3182, 166, 1595, 1166, 1597, 3181,
1169, 1600, 3180, 1171, 1602, 3179, 1173, 1604, 3178, 1175, 1606, 3177, 1177, 1608, 3176,
1179, 1610, 3175, 1181, 1612, 3174, 1183, 1614, 3173, 1185, 1616, 3172, 1187, 1618, 3171,
1189, 1620, 3170, 1191, 1622, 3169, 1193, 1624, 3168, 3167, 182, 1626, 1197, 1628, 3166,
1199, 1630, 3165, 1201, 1632, 3164, 1203, 1634, 3163, 1205, 1636, 3162, 1207, 1638, 3161,
1210, 1641, 3160, 1212, 1643, 3159, 1214, 1645, 3158, 1216, 1647, 3157, 1218, 1649, 3156,
1220, 1651, 3155, 1222, 1653, 3154, 1224, 1655, 3153, 1226, 1657, 3152, 1228, 1659, 3151,
1230, 1661, 3150, 1232, 1663, 3149, 1234, 1665, 3148, 3147, 203, 1667, 1238, 1669, 3146,
1240, 1671, 3145, 1242, 1673, 3144, 1244, 1675, 3143, 1246, 1677, 3142, 1248, 1679, 3141,
1251, 1682, 3140, 1253, 1684, 3139, 1255, 1686, 3138, 3137, 214, 1688, 1259, 1690, 3136,
1261, 1692, 3135, 3134, 217, 1694, 1265, 1696, 3133, 1267, 1698, 3132, 3131, 220, 1700,
1271, 1702, 3130, 1273, 1704, 3129, 1275, 1706, 3128, 3127, 224, 1708, 1279, 1710, 3126,
1281, 1712, 3125, 1283, 1714, 3124, 1285, 1716, 3123, 1287, 1718, 3122, 1289, 1720, 3121,
1721, 1290, 3120, 3119, 661, 1723, 1719, 1724, 3118, 1725, 1288, 3117, 1726, 1727, 3116,
1717, 1728, 3115, 1729, 1286, 3114, 1730, 1731, 3113, 1715, 1732, 3112, 1733, 1284, 3111,
3110, 664, 1735, 1713, 1736, 3109, 1737, 1282, 3108, 1738, 1739, 3107, 1711, 1740, 3106,
1741, 1280, 3105, 1742, 1743, 3104, 1709, 1744, 3103, 1745, 1278, 3102, 1746, 1747, 3101,
1707, 1748, 3100, 1749, 1276, 3099, 1750, 1751, 3098, 1705, 1752, 3097, 1753, 1274, 3096,
1754, 1755, 3095, 1703, 1756, 3094, 3093, 642, 1272, 3092, 670, 1759, 1701, 1760, 3091,
1761, 1270, 3090, 1762, 1763, 3089, 1699, 1764, 3088, 1765, 1268, 3087, 1766, 1767, 3086,
1697, 1768, 3085, 1769, 1266, 3084, 1770, 1771, 3083, 1695, 1772, 3082, 1773, 1264, 3081,
1774, 1775, 3080, 3079, 633, 1776, 1777, 1262, 3078, 1778, 1779, 3077, 1691, 1780, 3076,
1781, 1260, 3075, 1782, 1783, 3074, 1689, 1784, 3073, 3072, 628, 1258, 3071, 677, 1787,
3070, 627, 1788, 1789, 1256, 3069, 1790, 1791, 3068, 1685, 1792, 3067, 1793, 1254, 3066,
1794, 1795, 3065, 1683, 1796, 3064, 1797, 1252, 3063, 1798, 1799, 3062, 1681, 1800, 3061,
1801, 1249, 3060, 1802, 1803, 3059, 1678, 1804, 3058, 1805, 1247, 3057, 1806, 1807, 3056,
1676, 1808, 3055, 1809, 1245, 3054, 1810, 1811, 3053, 1674, 1812, 3052, 1813, 1243, 3051,
1814, 1815, 3050, 1672, 1816, 3049, 1817, 1241, 3048, 1818, 1819, 3047, 1670, 1820, 3046,
1821, 1239, 3045, 1822, 1823, 3044, 1668, 1824, 3043, 1825, 1237, 3042, 1826, 1827, 3041,
1666, 1828, 3040, 1829, 1235, 3039, 1830, 1831, 3038, 1664, 1832, 3037, 1833, 1233, 3036,
1834, 1835, 3035, 1662, 1836, 3034, 1837, 1231, 3033, 1838, 1839, 3032, 1660, 1840, 3031,
1841, 1229, 3030, 1842, 1843, 3029, 3028, 598, 1844, 1845, 1227, 3027, 1846, 1847, 3026,
1656, 1848, 3025, 1849, 1225, 3024, 1850, 1851, 3023, 1654, 1852, 3022, 1853, 1223, 3021,
1854, 1855, 3020, 1652, 1856, 3019, 1857, 1221, 3018, 1858, 1859, 3017, 1650, 1860, 3016,
1861, 1219, 3015, 1862, 1863, 3014, 1648, 1864, 3013, 3012, 587, 1217, 3011, 697, 1867,
1646, 1868, 3010, 1869, 1215, 3009, 1870, 1871, 3008, 1644, 1872, 3007, 1873, 1213, 3006,
1874, 1875, 3005, 1642, 1876, 3004, 1877, 1211, 3003, 1878, 1879, 3002, 1640, 1880, 3001,
1881, 1208, 3000, 1882, 1883, 2999, 1637, 1884, 2998, 1885, 1206, 2997, 2996, 702, 1887,
2995, 575, 1888, 1889, 1204, 2994, 1890, 1891, 2993, 1633, 1892, 2992, 1893, 1202, 2991,
1894, 1895, 2990, 1631, 1896, 2989, 1897, 1200, 2988, 1898, 1899, 2987, 1629, 1900, 2986,
1901, 1198, 2985, 1902, 1903, 2984, 1627, 1904, 2983, 1905, 1196, 2982, 1906, 1907, 2981,
2980, 565, 1908, 1909, 1194, 2979, 1910, 1911, 2978, 1623, 1912, 2977, 1913, 1192, 2976,
1914, 1915, 2975, 1621, 1916, 2974, 1917, 1190, 2973, 1918, 1919, 2972, 1619, 1920, 2971,
1921, 1188, 2970, 1922, 1923, 2969, 1617, 1924, 2968, 1925, 1186, 2967, 1926, 1927, 2966,
1615, 1928, 2965, 1929, 1184, 2964, 1930, 1931, 2963, 2962, 553, 1932, 1933, 1182, 2961,
1934, 1935, 2960, 1611, 1936, 2959, 1937, 1180, 2958, 1938, 1939, 2957, 1609, 1940, 2956,
1941, 1178, 2955, 1942, 1943, 2954, 1607, 1944, 2953, 2952, 546, 1176, 2951, 717, 1947,
1605, 1948, 2950, 1949, 1174, 2949, 1950, 1951, 2948, 1603, 1952, 2947, 1953, 1172, 2946,
1954, 1955, 2945, 1601, 1956, 2944, 1957, 1170, 2943, 1958, 1959, 2942, 1599, 1960, 2941,
1961, 1167, 2940, 1962, 1963, 2939, 1596, 1964, 2938, 2937, 535, 1165, 2936, 722, 1967,
1594, 1968, 2935, 1969, 1163, 2934, 1970, 1971, 2933, 1592, 1972, 2932, 1973, 1161, 2931,
2930, 724, 1975, 1590, 1976, 2929, 1977, 1159, 2928, 1978, 1979, 2927, 1588, 1980, 2926,
2925, 527, 1157, 2924, 726, 1983, 2923, 526, 1984, 1985, 1155, 2922, 1986, 1987, 2921,
1584, 1988, 2920, 2919, 523, 1153, 1990, 1991, 2918, 1582, 1992, 2917, 1993, 1151, 2916,
1994, 1995, 2915, 2914, 520, 1996, 1997, 1149, 2913, 1998, 1999, 2912, 1578, 2000, 2911,
2001, 1147, 2910, 2002, 2003, 2909, 1576, 2004, 2908, 2005, 1145, 2907, 2006, 2007, 2906,
1574, 2008, 2905, 2009, 1143, 2904, 2010, 2011, 2903, 2902, 512, 2012, 2013, 1141, 2901,
2014, 2015, 2900, 1570, 2016, 2899, 2017, 1139, 2898, 2018, 2019, 2897, 1568, 2020, 2896,
2021, 1137, 2895, 2022, 2023, 2894, 1566, 2024, 2893, 2892, 505, 1135, 2026, 2027, 2891,
1564, 2028, 2890, 2889, 503, 1133, 2888, 738, 2031, 1562, 2032, 2887, 2033, 1131, 2886,
2034, 2035, 2885, 1560, 2036, 2884, 2037, 1129, 2883, 2038, 2039, 2882, 1558, 2040, 2881,
2041, 1126, 2880, 2042, 2043, 2879, 1555, 2044, 2878, 2045, 1124, 2877, 2046, 2047, 2876,
1553, 2048, 2875, 2874, 492, 1122, 2873, 743, 2051, 2872, 491, 2052, 2871, 490, 1120,
2054, 2055, 2870, 1549, 2056, 2869, 2057, 1118, 2868, 2058, 2059, 2867, 1547, 2060, 2866,
2061, 1116, 2865, 2062, 2063, 2864, 1545, 2064, 2863, 2862, 484, 1114, 2861, 747, 2067,
2860, 483, 2068, 2069, 1112, 2859, 2070, 2071, 2858, 1541, 2072, 2857, 2073, 1110, 2856,
2855, 749, 2075, 2854, 479, 2076, 2077, 1108, 2853, 2078, 2079, 2852, 1537, 2080, 2851,
2081, 1106, 2850, 2082, 2083, 2849, 1535, 2084, 2848, 2085, 1104, 2847, 2846, 752, 2087,
2845, 473, 2088, 2844, 472, 1102, 2090, 2091, 2843, 1531, 2092, 2842, 2093, 1100, 2841,
2840, 754, 2095, 1529, 2096, 2839, 2097, 1098, 2838, 2098, 2099, 2837, 1527, 2100, 2836,
2835, 466, 1096, 2102, 2103, 2834, 1525, 2104, 2833, 2105, 1094, 2832, 2106, 2107, 2831,
2830, 463, 2108, 2829, 462, 1092, 2110, 2111, 2828, 2827, 461, 2112, 2113, 1090, 2826,
2114, 2115, 2825, 1519, 2116, 2824, 2117, 1088, 2823, 2118, 2119, 2822, 1517, 2120, 2821,
2820, 455, 1085, 2819, 761, 2123, 2818, 454, 2124, 2817, 453, 1083, 2126, 2127, 2816,
1512, 2128, 2815, 2814, 451, 1081, 2813, 763, 2131, 2812, 450, 2132, 2133, 1079, 2811,
2134, 2135, 2810, 1508, 2136, 2809, 2137, 1077, 2808, 2807, 765, 2139, 1506, 2140, 2806,
2141, 1075, 2805, 2142, 2143, 2804, 1504, 2144, 2803, 2802, 443, 1073, 2801, 767, 2147,
1502, 2148, 2800, 2149, 1071, 2799, 2150, 2151, 2798, 1500, 2152, 2797, 2796, 439, 1069,
2795, 769, 2155, 1498, 2156, 2794, 2157, 1067, 2793, 2158, 2159, 2792, 2791, 436, 2160,
2790, 435, 1065, 2162, 2163, 2789, 1494, 2164, 2788, 2787, 433, 1063, 2166, 2167, 2786,
1492, 2168, 2785, 2169, 1061, 2784, 2170, 2171, 2783, 2782, 430, 2172, 2781, 429, 1059,
2780, 774, 2175, 1488, 2176, 2779, 2177, 1057, 2778, 2777, 775, 2179, 2776, 426, 2180,
2181, 1055, 2775, 2182, 2183, 2774, 1484, 2184, 2773, 2772, 423, 1053, 2771, 777, 2187,
2770, 422, 2188, 2189, 1051, 2769, 2190, 2191, 2768, 1480, 2192, 2767, 2193, 1049, 2766,
2194, 2195, 2765, 1478, 2196, 2764, 2197, 1047, 2763, 2198, 2199, 2762, 2761, 416, 2200,
2201, 1044, 2760, 2759, 781, 2203, 1473, 2204, 2758, 2205, 1042, 2757, 2206, 2207, 2756,
1471, 2208, 2755, 2209, 1040, 2754, 2210, 2211, 2753, 1469, 2212, 2752, 2213, 1038, 2751,
2214, 2215, 2750, 1467, 2216, 2749, 2748, 406, 1036, 2218, 2219, 2747, 1465, 2220, 2746,
2221, 1034, 2745, 2222, 2223, 2744, 1463, 2224, 2743, 2225, 1032, 2742, 2226, 2227, 2741,
1461, 2228, 2740, 2229, 1030, 2739, 2230, 2231, 2738, 1459, 2232, 2737, 2233, 1028, 2736,
2234, 2235, 2735, 2734, 397, 2236, 2237, 1026, 2733, 2238, 2239, 2732, 1455, 2240, 2731,
2241, 1024, 2730, 2242, 2243, 2729, 1453, 2244, 2728, 2245, 1022, 2727, 2726, 792, 2247,
1451, 2248, 2725, 2249, 1020, 2724, 2250, 2251, 2723, 1449, 2252, 2722, 2253, 1018, 2721,
2254, 2255, 2720, 1447, 2256, 2719, 2718, 386, 1016, 2258, 2259, 2717, 2716, 385, 2260,
2261, 1014, 2715, 2262, 2263, 2714, 1443, 2264, 2713, 2265, 1012, 2712, 2266, 2267, 2711,
1441, 2268, 2710, 2269, 1010, 2709, 2708, 798, 2271, 2707, 379, 2272, 2273, 1008, 2706,
2274, 2275, 2705, 1437, 2276, 2704, 2277, 1006, 2703, 2278, 2279, 2702, 1435, 2280, 2701,
2281, 1003, 2700, 2282, 2283, 2699, 1432, 2284, 2698, 2285, 1001, 2697, 2286, 2287, 2696,
1430, 2288, 2695, 2289, 999, 2694, 2290, 2291, 2693, 1428, 2292, 2692, 2293, 997, 2691,
2294, 2295, 2690, 1426, 2296, 2689, 2297, 995, 2688, 2298, 2299, 2687, 1424, 2300, 2686,
2301, 993, 2685, 2302, 2303, 2684, 1422, 2304, 2683, 2305, 991, 2682, 2306, 2307, 2681,
2680, 360, 2308, 2309, 989, 2679, 2310, 2311, 2678, 1418, 2312, 2677, 2313, 987, 2676,
2314, 2315, 2675, 1416, 2316, 2674, 2317, 985, 2673, 2318, 2319, 2672, 1414, 2320, 2671,
2321, 983, 2670, 2322, 2323, 2669, 1412, 2324, 2668, 2325, 981, 2667, 2326, 2327, 2666,
1410, 2328, 2665, 2329, 979, 2664, 2330, 2331, 2663, 1408, 2332, 2662, 2661, 347, 977,
2660, 814, 2335, 1406, 2336, 2659, 2337, 975, 2658, 2338, 2339, 2657, 1404, 2340, 2656,
2341, 973, 2655, 2342, 2343, 2654, 1402, 2344, 2653, 2345, 971, 2652, 2346, 2347, 2651,
1400, 2348, 2650, 2649, 339, 969, 2648, 818, 2351, 1398, 2352, 2647, 2353, 967, 2646,
2354, 2355, 2645, 1396, 2356, 2644, 2357, 965, 2643, 2358, 2359, 2642, 1394, 2360, 2641,
2361, 962, 2640, 2362, 2363, 2639, 1391, 2364, 2638, 2365, 960, 2637, 2366, 2367, 2636,
1389, 2368, 2635, 2369, 958, 2634, 2370, 2371, 2633, 1387, 2372, 2632, 2373, 956, 2631,
2374, 2375, 2630, 1385, 2376, 2629, 2377, 954, 2628, 2378, 2379, 2627, 1383, 2380, 2626,
2381, 952, 2625, 2382, 2383, 2624, 1381, 2384, 2623, 2385, 950, 2622, 2386, 2387, 2621,
1379, 2388, 2620, 2389, 948, 2619, 2390, 2391, 2618, 1377, 2392, 2617, 2393, 946, 2616,
2394, 2395, 2615, 1375, 2396, 2614, 2397, 944, 2613, 2398, 2399, 2612, 1373, 2400, 2611,
2401, 942, 2610, 2402, 2403, 2609, 1371, 2404, 2608, 2405, 940, 2607, 2406, 2407, 2606,
1369, 2408, 2605, 2409, 938, 2604, 2410, 2411, 2603, 1367, 2412, 2602, 2413, 936, 2601,
2600, 834, 2415, 1365, 2416, 2599, 2417, 934, 2598, 2418, 2419, 2597, 1363, 2420, 2596,
2421, 932, 2595, 2422, 2423, 2594, 1361, 2424, 2593, 2425, 930, 2592, 2426, 2427, 2591,
1359, 2428, 2590, 2429, 928, 2589, 2430, 2431, 2588, 1357, 2432, 2587, 2433, 926, 2586,
2434, 2435, 2585, 1355, 2436, 2584, 2437, 924, 2583, 2438, 2439, 2582, 1353, 2440, 2581,
2441, 921, 2580, 2442, 2443, 2579, 1350, 2444, 2578, 2445, 918, 2577, 2446, 2447, 2576,
1347, 2448, 2575, 2449, 915, 2574, 2450, 2451, 2573, 1344, 2452, 2572, 2453, 912, 2571,
2570, 844, 2455, 2569, 281, 2456, 2457, 909, 2568, 2458, 2459, 2567, 1338, 2460, 2566,
2461, 906, 2565, 2462, 2463, 2564, 1335, 2464, 2563, 2465, 903, 2562, 2466, 2467, 2561,
1332, 2468, 2560, 2469, 900, 2559, 2470, 2471, 2558, 1329, 2472, 2557, 2473, 897, 2556,
2474, 2475, 2555, 1326, 2476, 2554, 2553, 264, 894, 2552, 850, 2479, 1323, 2480, 2551,
2550, 261, 891, 2482, 2483, 2549, 1320, 2484, 2548, 2547, 258, 888, 2486, 2487, 2546,
1317, 2488, 2545, 2544, 255, 885, 2490, 2491, 2543, 2542, 254, 2492, 2493, 882, 2541,
2494, 2495, 2540, 1311, 2496, 2539, 2497, 879, 2538, 2498, 2499, 2537, 1308, 2500, 2536,
2535, 246, 876, 2502, 2503, 2534, 1305, 2504, 2533, 2505, 873, 2532, 2506, 2507, 2531,
2530, 242, 2508, 2509, 870, 2529, 2510, 2511, 2528, 1299, 2512, 2527, 2526, 237, 867,
2514, 2515, 2525, 1296, 2516, 2524, 2523, 234, 864, 2518, 2519, 2522, 2521, 233, 2520,
2521, 860, 2518, 232, 2521, 2518, 862, 1293, 2521, 2522, 231, 861, 1292, 861, 0,
232, 2522, 1292, 2523, 21, 1291, 231, 2523, 1291, 2519, 2517, 2523, 2524, 859, 2514,
865, 2514, 235, 2, 2524, 865, 1293, 2515, 233, 1295, 1293, 1, 235, 2525, 1295,
863, 867, 22, 233, 2526, 863, 2515, 2513, 2526, 2527, 858, 2510, 868, 2510, 238,
3, 2527, 868, 2528, 236, 1296, 1298, 1296, 2, 238, 2528, 1298, 2529, 23, 866,
2511, 866, 236, 858, 2529, 2511, 2506, 2508, 857, 241, 2530, 2506, 871, 1302, 2530,
2531, 239, 1299, 1301, 1299, 3, 1301, 2506, 2531, 2532, 24, 869, 2507, 869, 239,
857, 2532, 2507, 2533, 856, 2502, 874, 2502, 244, 5, 2533, 874, 1302, 2503, 242,
1304, 1302, 4, 244, 2534, 1304, 872, 876, 25, 242, 2535, 872, 2503, 2501, 2535,
2536, 855, 2498, 877, 2498, 247, 6, 2536, 877, 2537, 245, 1305, 1307, 1305, 5,
247, 2537, 1307, 2538, 26, 875, 2499, 875, 245, 855, 2538, 2499, 2539, 854, 2494,
880, 2494, 250, 7, 2539, 880, 1308, 2495, 248, 6, 2540, 1308, 250, 2540, 1310,
2541, 27, 878, 2495, 878, 248, 854, 2541, 2495, 2542, 853, 2490, 883, 2490, 253,
8, 2542, 883, 2543, 251, 1311, 1313, 1311, 7, 253, 2543, 1313, 881, 885, 28,
251, 2544, 881, 2491, 2489, 2544, 2545, 852, 2486, 886, 2486, 256, 9, 2545, 886,
1314, 2487, 254, 1316, 1314, 8, 256, 2546, 1316, 884, 888, 29, 254, 2547, 884,
2487, 2485, 2547, 2482, 2484, 851, 889, 2482, 259, 889, 1320, 2548, 2549, 257, 1317,
1319, 1317, 9, 259, 2549, 1319, 887, 891, 30, 2483, 887, 257, 851, 2550, 2483,
2551, 850, 2478, 892, 2478, 262, 892, 1323, 2551, 1320, 2479, 260, 10, 2552, 1320,
1322, 2478, 2552, 2553, 31, 890, 2479, 890, 260, 2479, 2477, 2553, 2554, 849, 2474,
895, 2474, 265, 12, 2554, 895, 2555, 263, 1323, 1325, 1323, 11, 265, 2555, 1325,
2556, 32, 893, 2475, 893, 263, 849, 2556, 2475, 2557, 848, 2470, 898, 2470, 268,
13, 2557, 898, 2558, 266, 1326, 1328, 1326, 12, 268, 2558, 1328, 2559, 33, 896,
2471, 896, 266, 848, 2559, 2471, 2560, 847, 2466, 901, 2466, 271, 14, 2560, 901,
2561, 269, 1329, 1331, 1329, 13, 271, 2561, 1331, 2562, 34, 899, 2467, 899, 269,
847, 2562, 2467, 2563, 846, 2462, 904, 2462, 274, 15, 2563, 904, 2564, 272, 1332,
1334, 1332, 14, 274, 2564, 1334, 2565, 35, 902, 2463, 902, 272, 846, 2565, 2463,
2566, 845, 2458, 907, 2458, 277, 16, 2566, 907, 2567, 275, 1335, 1337, 1335, 15,
277, 2567, 1337, 905, 909, 36, 2459, 905, 275, 845, 2568, 2459, 2454, 2456, 844,
910, 2454, 280, 910, 1341, 2569, 2570, 278, 1338, 16, 2570, 1338, 1340, 2454, 2570,
2571, 37, 908, 2455, 908, 278, 2455, 2453, 2571, 2572, 843, 2450, 913, 2450, 283,
18, 2572, 913, 2573, 281, 1341, 1343, 1341, 17, 283, 2573, 1343, 2574, 38, 911,
2451, 911, 281, 843, 2574, 2451, 2575, 842, 2446, 916, 2446, 286, 19, 2575, 916,
2576, 284, 1344, 1346, 1344, 18, 286, 2576, 1346, 2577, 39, 914, 2447, 914, 284,
842, 2577, 2447, 2578, 841, 2442, 919, 2442, 289, 919, 1350, 2578, 2579, 287, 1347,
1349, 1347, 19, 289, 2579, 1349, 2580, 40, 917, 2443, 917, 287, 841, 2580, 2443,
2581, 840, 2438, 1294, 2438, 234, 22, 2581, 1294, 2582, 292, 922, 864, 922, 21,
234, 2582, 864, 2583, 42, 1352, 2439, 1352, 292, 840, 2583, 2439, 2584, 839, 2434,
1297, 2434, 237, 23, 2584, 1297, 2585, 293, 1353, 867, 1353, 22, 237, 2585, 867,
2586, 43, 923, 2435, 923, 293, 839, 2586, 2435, 2587, 838, 2430, 1300, 2430, 240,
24, 2587, 1300, 2588, 295, 1355, 870, 1355, 23, 240, 2588, 870, 2589, 44, 925,
2431, 925, 295, 838, 2589, 2431, 2590, 837, 2426, 1303, 2426, 243, 25, 2590, 1303,
2591, 297, 1357, 873, 1357, 24, 243, 2591, 873, 2592, 45, 927, 2427, 927, 297,
837, 2592, 2427, 2593, 836, 2422, 1306, 2422, 246, 26, 2593, 1306, 2594, 299, 1359,
876, 1359, 25, 246, 2594, 876, 2595, 46, 929, 2423, 929, 299, 836, 2595, 2423,
2596, 835, 2418, 1309, 2418, 249, 27, 2596, 1309, 2597, 301, 1361, 879, 1361, 26,
249, 2597, 879, 2598, 47, 931, 2419, 931, 301, 835, 2598, 2419, 2414, 2416, 834,
1312, 2414, 252, 28, 2599, 1312, 2600, 303, 1363, 882, 1363, 27, 252, 2600, 882,
933, 936, 48, 2415, 933, 303, 2415, 2413, 2601, 2602, 833, 2410, 1315, 2410, 255,
29, 2602, 1315, 2603, 305, 1365, 885, 1365, 28, 255, 2603, 885, 2604, 49, 935,
2411, 935, 305, 833, 2604, 2411, 2605, 832, 2406, 1318, 2406, 258, 30, 2605, 1318,
2606, 307, 1367, 888, 1367, 29, 258, 2606, 888, 2607, 50, 937, 2407, 937, 307,
832, 2607, 2407, 2608, 831, 2402, 1321, 2402, 261, 31, 2608, 1321, 2609, 309, 1369,
891, 1369, 30, 261, 2609, 891, 2610, 51, 939, 2403, 939, 309, 831, 2610, 2403,
2611, 830, 2398, 1324, 2398, 264, 32, 2611, 1324, 2612, 311, 1371, 894, 1371, 31,
264, 2612, 894, 2613, 52, 941, 2399, 941, 311, 830, 2613, 2399, 2614, 829, 2394,
1327, 2394, 267, 33, 2614, 1327, 2615, 313, 1373, 897, 1373, 32, 267, 2615, 897,
2616, 53, 943, 2395, 943, 313, 829, 2616, 2395, 2617, 828, 2390, 1330, 2390, 270,
1330, 1377, 2617, 2618, 315, 1375, 900, 1375, 33, 270, 2618, 900, 2619, 54, 945,
2391, 945, 315, 828, 2619, 2391, 2620, 827, 2386, 1333, 2386, 273, 35, 2620, 1333,
1377, 2387, 317, 903, 1377, 34, 273, 2621, 903, 2622, 55, 947, 317, 2622, 947,
827, 2622, 2387, 2623, 826, 2382, 1336, 2382, 276, 36, 2623, 1336, 2624, 319, 1379,
906, 1379, 35, 276, 2624, 906, 2625, 56, 949, 2383, 949, 319, 826, 2625, 2383,
2626, 825, 2378, 1339, 2378, 279, 37, 2626, 1339, 1381, 2379, 321, 36, 2627, 1381,
279, 2627, 909, 2628, 57, 951, 2379, 951, 321, 825, 2628, 2379, 2629, 824, 2374,
1342, 2374, 282, 38, 2629, 1342, 2630, 323, 1383, 912, 1383, 37, 282, 2630, 912,
2631, 58, 953, 2375, 953, 323, 824, 2631, 2375, 2632, 823, 2370, 1345, 2370, 285,
39, 2632, 1345, 2633, 325, 1385, 915, 1385, 38, 285, 2633, 915, 2634, 59, 955,
2371, 955, 325, 823, 2634, 2371, 2635, 822, 2366, 1348, 2366, 288, 40, 2635, 1348,
2636, 327, 1387, 918, 1387, 39, 288, 2636, 918, 2637, 60, 957, 2367, 957, 327,
822, 2637, 2367, 2638, 821, 2362, 1351, 2362, 291, 41, 2638, 1351, 2639, 329, 1389,
921, 1389, 40, 291, 2639, 921, 2640, 61, 959, 2363, 959, 329, 821, 2640, 2363,
2641, 820, 2358, 1354, 2358, 294, 43, 2641, 1354, 2642, 333, 963, 924, 963, 42,
294, 2642, 924, 2643, 63, 1393, 2359, 1393, 333, 820, 2643, 2359, 2644, 819, 2354,
1356, 2354, 296, 1356, 1396, 2644, 2645, 334, 1394, 926, 1394, 43, 296, 2645, 926,
2646, 64, 964, 2355, 964, 334, 819, 2646, 2355, 2647, 818, 2350, 1358, 2350, 298,
45, 2647, 1358, 1396, 2351, 336, 44, 2648, 1396, 298, 2648, 928, 966, 969, 65,
336, 2649, 966, 2351, 2349, 2649, 2650, 817, 2346, 1360, 2346, 300, 46, 2650, 1360,
2651, 338, 1398, 930, 1398, 45, 300, 2651, 930, 2652, 66, 968, 2347, 968, 338,
817, 2652, 2347, 2653, 816, 2342, 1362, 2342, 302, 47, 2653, 1362, 2654, 340, 1400,
932, 1400, 46, 302, 2654, 932, 2655, 67, 970, 2343, 970, 340, 816, 2655, 2343,
2656, 815, 2338, 1364, 2338, 304, 48, 2656, 1364, 2657, 342, 1402, 934, 1402, 47,
304, 2657, 934, 2658, 68, 972, 2339, 972, 342, 815, 2658, 2339, 2659, 814, 2334,
1366, 2334, 306, 49, 2659, 1366, 1404, 2335, 344, 48, 2660, 1404, 306, 2660, 936,
974, 977, 69, 344, 2661, 974, 2335, 2333, 2661, 2662, 813, 2330, 1368, 2330, 308,
50, 2662, 1368, 2663, 346, 1406, 938, 1406, 49, 308, 2663, 938, 2664, 70, 976,
2331, 976, 346, 813, 2664, 2331, 2665, 812, 2326, 1370, 2326, 310, 51, 2665, 1370,
2666, 348, 1408, 940, 1408, 50, 310, 2666, 940, 978, 981, 71, 2327, 978, 348,
812, 2667, 2327, 2668, 811, 2322, 1372, 2322, 312, 52, 2668, 1372, 2669, 350, 1410,
942, 1410, 51, 312, 2669, 942, 2670, 72, 980, 2323, 980, 350, 811, 2670, 2323,
2671, 810, 2318, 1374, 2318, 314, 53, 2671, 1374, 2672, 352, 1412, 944, 1412, 52,
314, 2672, 944, 2673, 73, 982, 2319, 982, 352, 810, 2673, 2319, 2674, 809, 2314,
1376, 2314, 316, 54, 2674, 1376, 2675, 354, 1414, 946, 1414, 53, 316, 2675, 946,
2676, 74, 984, 2315, 984, 354, 809, 2676, 2315, 2677, 808, 2310, 1378, 2310, 318,
55, 2677, 1378, 2678, 356, 1416, 948, 1416, 54, 318, 2678, 948, 986, 989, 75,
356, 2679, 986, 808, 2679, 2311, 2680, 807, 2306, 1380, 2306, 320, 1380, 1420, 2680,
1418, 2307, 358, 55, 2681, 1418, 320, 2681, 950, 2682, 76, 988, 2307, 988, 358,
807, 2682, 2307, 2683, 806, 2302, 1382, 2302, 322, 57, 2683, 1382, 2684, 360, 1420,
952, 1420, 56, 322, 2684, 952, 2685, 77, 990, 2303, 990, 360, 806, 2685, 2303,
2686, 805, 2298, 1384, 2298, 324, 58, 2686, 1384, 2687, 362, 1422, 954, 1422, 57,
324, 2687, 954, 2688, 78, 992, 2299, 992, 362, 805, 2688, 2299, 2689, 804, 2294,
1386, 2294, 326, 59, 2689, 1386, 2690, 364, 1424, 956, 1424, 58, 326, 2690, 956,
2691, 79, 994, 2295, 994, 364, 804, 2691, 2295, 2692, 803, 2290, 1388, 2290, 328,
60, 2692, 1388, 2693, 366, 1426, 958, 1426, 59, 328, 2693, 958, 2694, 80, 996,
2291, 996, 366, 803, 2694, 2291, 2695, 802, 2286, 1390, 2286, 330, 61, 2695, 1390,
2696, 368, 1428, 960, 1428, 60, 330, 2696, 960, 2697, 81, 998, 2287, 998, 368,
802, 2697, 2287, 2698, 801, 2282, 1392, 2282, 332, 62, 2698, 1392, 2699, 370, 1430,
962, 1430, 61, 332, 2699, 962, 2700, 82, 1000, 2283, 1000, 370, 801, 2700, 2283,
2701, 800, 2278, 1395, 2278, 335, 64, 2701, 1395, 2702, 374, 1004, 965, 1004, 63,
335, 2702, 965, 2703, 84, 1434, 2279, 1434, 374, 800, 2703, 2279, 2704, 799, 2274,
1397, 2274, 337, 65, 2704, 1397, 2705, 375, 1435, 967, 1435, 64, 337, 2705, 967,
2706, 85, 1005, 2275, 1005, 375, 799, 2706, 2275, 2707, 798, 2270, 339, 2707, 2270,
66, 2707, 1399, 2708, 377, 1437, 969, 1437, 65, 969, 2270, 2708, 2709, 86, 1007,
2271, 1007, 377, 798, 2709, 2271, 2710, 797, 2266, 1401, 2266, 341, 67, 2710, 1401,
2711, 379, 1439, 971, 1439, 66, 341, 2711, 971, 2712, 87, 1009, 2267, 1009, 379,
797, 2712, 2267, 2713, 796, 2262, 1403, 2262, 343, 68, 2713, 1403, 2714, 381, 1441,
973, 1441, 67, 343, 2714, 973, 2715, 88, 1011, 2263, 1011, 381, 796, 2715, 2263,
2716, 795, 2258, 1405, 2258, 345, 1405, 1445, 2716, 1443, 2259, 383, 68, 2717, 1443,
345, 2717, 975, 1013, 1016, 89, 383, 2718, 1013, 2259, 2257, 2718, 2719, 794, 2254,
1407, 2254, 347, 70, 2719, 1407, 2720, 385, 1445, 977, 1445, 69, 347, 2720, 977,
1015, 1018, 90, 2255, 1015, 385, 794, 2721, 2255, 2722, 793, 2250, 1409, 2250, 349,
71, 2722, 1409, 2723, 387, 1447, 979, 1447, 70, 349, 2723, 979, 2724, 91, 1017,
2251, 1017, 387, 793, 2724, 2251, 2725, 792, 2246, 1411, 2246, 351, 72, 2725, 1411,
2726, 389, 1449, 71, 2726, 1449, 351, 2726, 981, 2727, 92, 1019, 2247, 1019, 389,
792, 2727, 2247, 2728, 791, 2242, 1413, 2242, 353, 73, 2728, 1413, 2729, 391, 1451,
983, 1451, 72, 353, 2729, 983, 1021, 1024, 93, 391, 2730, 1021, 791, 2730, 2243,
2731, 790, 2238, 1415, 2238, 355, 74, 2731, 1415, 2732, 393, 1453, 985, 1453, 73,
355, 2732, 985, 2733, 94, 1023, 2239, 1023, 393, 790, 2733, 2239, 2734, 789, 2234,
1417, 2234, 357, 1417, 1457, 2734, 1455, 2235, 395, 74, 2735, 1455, 357, 2735, 987,
2736, 95, 1025, 395, 2736, 1025, 789, 2736, 2235, 2737, 788, 2230, 1419, 2230, 359,
76, 2737, 1419, 2738, 397, 1457, 75, 2738, 1457, 359, 2738, 989, 2739, 96, 1027,
2231, 1027, 397, 788, 2739, 2231, 2740, 787, 2226, 1421, 2226, 361, 77, 2740, 1421,
2741, 399, 1459, 991, 1459, 76, 361, 2741, 991, 2742, 97, 1029, 2227, 1029, 399,
787, 2742, 2227, 2743, 786, 2222, 1423, 2222, 363, 78, 2743, 1423, 2744, 401, 1461,
993, 1461, 77, 363, 2744, 993, 2745, 98, 1031, 2223, 1031, 401, 786, 2745, 2223,
2746, 785, 2218, 1425, 2218, 365, 79, 2746, 1425, 2747, 403, 1463, 995, 1463, 78,
365, 2747, 995, 2748, 99, 1033, 2219, 1033, 403, 785, 2748, 2219, 2749, 784, 2214,
1427, 2214, 367, 80, 2749, 1427, 2750, 405, 1465, 997, 1465, 79, 367, 2750, 997,
2751, 100, 1035, 2215, 1035, 405, 784, 2751, 2215, 2752, 783, 2210, 1429, 2210, 369,
81, 2752, 1429, 2753, 407, 1467, 999, 1467, 80, 369, 2753, 999, 2754, 101, 1037,
2211, 1037, 407, 783, 2754, 2211, 2755, 782, 2206, 1431, 2206, 371, 82, 2755, 1431,
2756, 409, 1469, 1001, 1469, 81, 371, 2756, 1001, 2757, 102, 1039, 2207, 1039, 409,
782, 2757, 2207, 2758, 781, 2202, 1433, 2202, 373, 83, 2758, 1433, 2759, 411, 1471,
1003, 1471, 82, 1003, 2202, 2759, 1041, 1044, 103, 411, 2760, 1041, 2203, 2201, 2760,
2198, 2200, 780, 376, 2761, 2198, 85, 2761, 1436, 2762, 415, 1045, 1006, 1045, 84,
1006, 2198, 2762, 1475, 1047, 105, 2199, 1475, 415, 780, 2763, 2199, 2764, 779, 2194,
1438, 2194, 378, 86, 2764, 1438, 2765, 416, 1476, 1008, 1476, 85, 378, 2765, 1008,
1046, 1049, 106, 2195, 1046, 416, 779, 2766, 2195, 2767, 778, 2190, 1440, 2190, 380,
87, 2767, 1440, 2768, 418, 1478, 1010, 1478, 86, 380, 2768, 1010, 2769, 107, 1048,
2191, 1048, 418, 778, 2769, 2191, 2186, 2188, 777, 382, 2770, 2186, 88, 2770, 1442,
2771, 420, 1480, 1012, 1480, 87, 1012, 2186, 2771, 1050, 1053, 108, 420, 2772, 1050,
2187, 2185, 2772, 2773, 776, 2182, 1444, 2182, 384, 89, 2773, 1444, 2774, 422, 1482,
1014, 1482, 88, 384, 2774, 1014, 1052, 1055, 109, 2183, 1052, 422, 776, 2775, 2183,
2178, 2180, 775, 386, 2776, 2178, 1446, 1486, 2776, 1484, 2179, 424, 89, 2777, 1484,
1016, 2178, 2777, 1054, 1057, 110, 424, 2778, 1054, 2179, 2177, 2778, 2779, 774, 2174,
1448, 2174, 388, 91, 2779, 1448, 2780, 426, 1486, 1018, 1486, 90, 388, 2780, 1018,
1056, 1059, 111, 2175, 1056, 426, 2175, 2173, 2781, 2782, 773, 2170, 1450, 2170, 390,
1450, 1490, 2782, 2783, 428, 1488, 1020, 1488, 91, 390, 2783, 1020, 2784, 112, 1058,
2171, 1058, 428, 773, 2784, 2171, 2785, 772, 2166, 1452, 2166, 392, 93, 2785, 1452,
1490, 2167, 430, 1022, 1490, 92, 392, 2786, 1022, 1060, 1063, 113, 430, 2787, 1060,
772, 2787, 2167, 2788, 771, 2162, 1454, 2162, 394, 94, 2788, 1454, 2789, 432, 1492,
93, 2789, 1492, 394, 2789, 1024, 2790, 114, 1062, 2163, 1062, 432, 2163, 2161, 2790,
2791, 770, 2158, 1456, 2158, 396, 1456, 1496, 2791, 2792, 434, 1494, 1026, 1494, 94,
396, 2792, 1026, 2793, 115, 1064, 2159, 1064, 434, 770, 2793, 2159, 2154, 2156, 769,
1458, 2154, 398, 96, 2794, 1458, 1496, 2155, 436, 95, 2795, 1496, 1028, 2154, 2795,
2796, 116, 1066, 436, 2796, 1066, 2155, 2153, 2796, 2797, 768, 2150, 1460, 2150, 400,
97, 2797, 1460, 2798, 438, 1498, 1030, 1498, 96, 400, 2798, 1030, 2799, 117, 1068,
2151, 1068, 438, 768, 2799, 2151, 2800, 767, 2146, 1462, 2146, 402, 98, 2800, 1462,
2801, 440, 1500, 1032, 1500, 97, 1032, 2146, 2801, 1070, 1073, 118, 2147, 1070, 440,
2147, 2145, 2802, 2803, 766, 2142, 1464, 2142, 404, 99, 2803, 1464, 2804, 442, 1502,
1034, 1502, 98, 404, 2804, 1034, 2805, 119, 1072, 2143, 1072, 442, 766, 2805, 2143,
2806, 765, 2138, 406, 2806, 2138, 1466, 1506, 2806, 2807, 444, 1504, 99, 2807, 1504,
1036, 2138, 2807, 2808, 120, 1074, 2139, 1074, 444, 765, 2808, 2139, 2809, 764, 2134,
1468, 2134, 408, 101, 2809, 1468, 2810, 446, 1506, 1038, 1506, 100, 408, 2810, 1038,
2811, 121, 1076, 2135, 1076, 446, 764, 2811, 2135, 2130, 2132, 763, 410, 2812, 2130,
102, 2812, 1470, 2813, 448, 1508, 1040, 1508, 101, 1040, 2130, 2813, 1078, 1081, 122,
448, 2814, 1078, 2131, 2129, 2814, 2815, 762, 2126, 1472, 2126, 412, 103, 2815, 1472,
2816, 450, 1510, 1042, 1510, 102, 412, 2816, 1042, 1080, 1083, 123, 2127, 1080, 450,
762, 2817, 2127, 2122, 2124, 761, 414, 2818, 2122, 1474, 1514, 2818, 1512, 2123, 452,
103, 2819, 1512, 1044, 2122, 2819, 1082, 1085, 124, 452, 2820, 1082, 2123, 2121, 2820,
2821, 760, 2118, 1477, 2118, 417, 106, 2821, 1477, 2822, 456, 1086, 1047, 1086, 105,
417, 2822, 1047, 2823, 126, 1516, 2119, 1516, 456, 760, 2823, 2119, 2824, 759, 2114,
1479, 2114, 419, 107, 2824, 1479, 2825, 457, 1517, 1049, 1517, 106, 419, 2825, 1049,
2826, 127, 1087, 2115, 1087, 457, 759, 2826, 2115, 2110, 2112, 758, 1481, 2110, 421,
108, 2827, 1481, 1519, 2111, 459, 107, 2828, 1519, 421, 2828, 1051, 1089, 1092, 128,
459, 2829, 1089, 2111, 2109, 2829, 2106, 2108, 757, 423, 2830, 2106, 1483, 1523, 2830,
1521, 2107, 461, 108, 2831, 1521, 1053, 2106, 2831, 2832, 129, 1091, 2107, 1091, 461,
757, 2832, 2107, 2833, 756, 2102, 1485, 2102, 425, 110, 2833, 1485, 2834, 463, 1523,
1055, 1523, 109, 425, 2834, 1055, 1093, 1096, 130, 2103, 1093, 463, 2103, 2101, 2835,
2836, 755, 2098, 1487, 2098, 427, 111, 2836, 1487, 2837, 465, 1525, 1057, 1525, 110,
427, 2837, 1057, 2838, 131, 1095, 2099, 1095, 465, 755, 2838, 2099, 2094, 2096, 754,
429, 2839, 2094, 112, 2839, 1489, 1527, 2095, 467, 111, 2840, 1527, 1059, 2094, 2840,
2841, 132, 1097, 467, 2841, 1097, 2095, 2093, 2841, 2842, 753, 2090, 1491, 2090, 431,
113, 2842, 1491, 2843, 469, 1529, 1061, 1529, 112, 431, 2843, 1061, 2844, 133, 1099,
2091, 1099, 469, 753, 2844, 2091, 2845, 752, 2086, 433, 2845, 2086, 114, 2845, 1493,
2846, 471, 1531, 113, 2846, 1531, 1063, 2086, 2846, 2847, 134, 1101, 2087, 1101, 471,
2087, 2085, 2847, 2848, 751, 2082, 1495, 2082, 435, 1495, 1535, 2848, 2849, 473, 1533,
1065, 1533, 114, 435, 2849, 1065, 1103, 1106, 135, 473, 2850, 1103, 751, 2850, 2083,
2851, 750, 2078, 1497, 2078, 437, 116, 2851, 1497, 2852, 475, 1535, 1067, 1535, 115,
437, 2852, 1067, 2853, 136, 1105, 475, 2853, 1105, 750, 2853, 2079, 2854, 749, 2074,
1499, 2074, 439, 117, 2854, 1499, 2855, 477, 1537, 1069, 1537, 116, 439, 2855, 1069,
2856, 137, 1107, 2075, 1107, 477, 749, 2856, 2075, 2857, 748, 2070, 1501, 2070, 441,
118, 2857, 1501, 2858, 479, 1539, 1071, 1539, 117, 441, 2858, 1071, 1109, 1112, 138,
479, 2859, 1109, 748, 2859, 2071, 2066, 2068, 747, 443, 2860, 2066, 1503, 1543, 2860,
1541, 2067, 481, 118, 2861, 1541, 1073, 2066, 2861, 2862, 139, 1111, 2067, 1111, 481,
2067, 2065, 2862, 2863, 746, 2062, 1505, 2062, 445, 120, 2863, 1505, 2864, 483, 1543,
1075, 1543, 119, 445, 2864, 1075, 2865, 140, 1113, 2063, 1113, 483, 746, 2865, 2063,
2866, 745, 2058, 1507, 2058, 447, 121, 2866, 1507, 2867, 485, 1545, 1077, 1545, 120,
447, 2867, 1077, 2868, 141, 1115, 2059, 1115, 485, 745, 2868, 2059, 2054, 2056, 744,
1509, 205
gitextract_jxhlhlxe/ ├── .gitignore ├── .python-version ├── 0_getting_started/ │ ├── readme.md │ ├── simulator0.py │ ├── simulator1.py │ ├── simulator2.py │ └── square_mesh.py ├── 10_mpm_elasticity/ │ ├── readme.md │ └── simulator.py ├── 11_mpm_plastic/ │ ├── readme.md │ ├── simulator.py │ └── simulator_viscoplastic.py ├── 11_mpm_sand/ │ ├── readme.md │ └── simulator.py ├── 12_pbd_cloth/ │ ├── cloth_data.json │ ├── constraints/ │ │ ├── __init__.py │ │ ├── bending.py │ │ └── stretching.py │ ├── imgui.ini │ ├── main.py │ ├── utils/ │ │ ├── __init__.py │ │ ├── cloth_utils.py │ │ ├── constraint_finder.py │ │ └── mesh_loader.py │ └── xpbd_base.py ├── 13_pbd_mesh/ │ ├── constraints/ │ │ ├── __init__.py │ │ ├── edge.py │ │ └── volume.py │ ├── dragon_data.json │ ├── imgui.ini │ ├── main.py │ ├── skinning/ │ │ ├── __init__.py │ │ ├── hash_grid.py │ │ └── skinning.py │ └── xpbd_base.py ├── 14_pbf/ │ ├── constraints/ │ │ ├── __init__.py │ │ ├── density.py │ │ ├── viscosity.py │ │ └── vorticity.py │ ├── main.py │ ├── scene.py │ └── sph_base.py ├── 1_mass_spring/ │ ├── InertiaEnergy.py │ ├── MassSpringEnergy.py │ ├── readme.md │ ├── simulator.py │ ├── square_mesh.py │ ├── time_integrator.py │ └── utils.py ├── 2_dirichlet/ │ ├── GravityEnergy.py │ ├── InertiaEnergy.py │ ├── MassSpringEnergy.py │ ├── readme.md │ ├── simulator.py │ ├── square_mesh.py │ ├── time_integrator.py │ └── utils.py ├── 3_contact/ │ ├── BarrierEnergy.py │ ├── GravityEnergy.py │ ├── InertiaEnergy.py │ ├── MassSpringEnergy.py │ ├── readme.md │ ├── simulator.py │ ├── square_mesh.py │ ├── time_integrator.py │ └── utils.py ├── 4_friction/ │ ├── BarrierEnergy.py │ ├── FrictionEnergy.py │ ├── GravityEnergy.py │ ├── InertiaEnergy.py │ ├── MassSpringEnergy.py │ ├── readme.md │ ├── simulator.py │ ├── square_mesh.py │ ├── time_integrator.py │ └── utils.py ├── 5_mov_dirichlet/ │ ├── BarrierEnergy.py │ ├── FrictionEnergy.py │ ├── GravityEnergy.py │ ├── InertiaEnergy.py │ ├── MassSpringEnergy.py │ ├── SpringEnergy.py │ ├── readme.md │ ├── simulator.py │ ├── square_mesh.py │ ├── time_integrator.py │ └── utils.py ├── 6_inv_free/ │ ├── BarrierEnergy.py │ ├── FrictionEnergy.py │ ├── GravityEnergy.py │ ├── InertiaEnergy.py │ ├── NeoHookeanEnergy.py │ ├── SpringEnergy.py │ ├── readme.md │ ├── simulator.py │ ├── square_mesh.py │ ├── time_integrator.py │ └── utils.py ├── 7_self_contact/ │ ├── BarrierEnergy.py │ ├── FrictionEnergy.py │ ├── GravityEnergy.py │ ├── InertiaEnergy.py │ ├── NeoHookeanEnergy.py │ ├── SpringEnergy.py │ ├── distance/ │ │ ├── CCD.py │ │ ├── PointEdgeDistance.py │ │ ├── PointLineDistance.py │ │ └── PointPointDistance.py │ ├── readme.md │ ├── simulator.py │ ├── square_mesh.py │ ├── time_integrator.py │ └── utils.py ├── 8_self_friction/ │ ├── BarrierEnergy.py │ ├── FrictionEnergy.py │ ├── GravityEnergy.py │ ├── InertiaEnergy.py │ ├── NeoHookeanEnergy.py │ ├── SpringEnergy.py │ ├── distance/ │ │ ├── CCD.py │ │ ├── PointEdgeDistance.py │ │ ├── PointLineDistance.py │ │ └── PointPointDistance.py │ ├── readme.md │ ├── simulator.py │ ├── square_mesh.py │ ├── time_integrator.py │ └── utils.py ├── 9_reduced_DOF/ │ ├── BarrierEnergy.py │ ├── GravityEnergy.py │ ├── InertiaEnergy.py │ ├── NeoHookeanEnergy.py │ ├── linear.py │ ├── readme.md │ ├── simulator.py │ ├── square_mesh.py │ ├── time_integrator.py │ └── utils.py ├── LICENSE ├── pyproject.toml └── readme.md
SYMBOL INDEX (396 symbols across 114 files)
FILE: 0_getting_started/simulator0.py
function screen_projection (line 19) | def screen_projection(x): # convert simulated coordinates to w...
FILE: 0_getting_started/simulator1.py
function screen_projection (line 22) | def screen_projection(x): # convert simulated coordinates to w...
FILE: 0_getting_started/simulator2.py
function screen_projection (line 28) | def screen_projection(x): # convert simulated coordinates to w...
FILE: 0_getting_started/square_mesh.py
function generate (line 3) | def generate(side_length, n_seg):
FILE: 10_mpm_elasticity/simulator.py
function uniform_grid (line 21) | def uniform_grid(x0, y0, x1, y1, dx):
function reset_grid (line 53) | def reset_grid():
function StVK_Hencky_PK1_2D (line 64) | def StVK_Hencky_PK1_2D(F):
function particle_to_grid_transfer (line 74) | def particle_to_grid_transfer():
function update_grid (line 101) | def update_grid():
function grid_to_particle_transfer (line 115) | def grid_to_particle_transfer():
function update_particle_state (line 143) | def update_particle_state():
function step (line 149) | def step():
FILE: 11_mpm_plastic/simulator.py
function poisson_disk_sampling (line 11) | def poisson_disk_sampling(radius, domain_size, k=30):
function reset_grid (line 102) | def reset_grid():
function StVK_Hencky_PK1_2D (line 113) | def StVK_Hencky_PK1_2D(F):
function Drucker_Prager_return_mapping (line 125) | def Drucker_Prager_return_mapping(F, diff_log_J):
function particle_to_grid_transfer (line 152) | def particle_to_grid_transfer():
function update_grid (line 181) | def update_grid():
function grid_to_particle_transfer (line 209) | def grid_to_particle_transfer():
function update_particle_state (line 244) | def update_particle_state():
function step (line 259) | def step():
FILE: 11_mpm_plastic/simulator_viscoplastic.py
function viscoplastic_return_mapping_stvk_2d (line 39) | def viscoplastic_return_mapping_stvk_2d(F_trial, mu_p, lam_p, yield_stre...
function stvk_stress_2d (line 85) | def stvk_stress_2d(F_elastic, U, V, sig, mu_p, lam_p):
function p2g2p (line 101) | def p2g2p():
function reset (line 178) | def reset():
FILE: 11_mpm_sand/simulator.py
function poisson_disk_sampling (line 11) | def poisson_disk_sampling(radius, domain_size, k=30):
function reset_grid (line 102) | def reset_grid():
function StVK_Hencky_PK1_2D (line 113) | def StVK_Hencky_PK1_2D(F):
function Drucker_Prager_return_mapping (line 125) | def Drucker_Prager_return_mapping(F, diff_log_J):
function particle_to_grid_transfer (line 152) | def particle_to_grid_transfer():
function update_grid (line 181) | def update_grid():
function grid_to_particle_transfer (line 209) | def grid_to_particle_transfer():
function update_particle_state (line 244) | def update_particle_state():
function step (line 259) | def step():
FILE: 12_pbd_cloth/constraints/bending.py
function solve_bending_constraints (line 5) | def solve_bending_constraints(
FILE: 12_pbd_cloth/constraints/stretching.py
function solve_stretching_constraints (line 5) | def solve_stretching_constraints(
FILE: 12_pbd_cloth/main.py
class USDExporter (line 18) | class USDExporter:
method __init__ (line 21) | def __init__(self, output_path="cloth_animation.usd", fps=60, scale=10...
method export_frame (line 36) | def export_frame(self, positions, indices):
method save (line 52) | def save(self):
function reset_constraint_lambdas (line 141) | def reset_constraint_lambdas(
function substep (line 151) | def substep(grab_id, grab_x, grab_y, grab_z):
FILE: 12_pbd_cloth/utils/cloth_utils.py
function pin_top_vertices (line 5) | def pin_top_vertices(
function initialize_colors (line 20) | def initialize_colors(
function apply_grab (line 36) | def apply_grab(
FILE: 12_pbd_cloth/utils/constraint_finder.py
function find_constraint_indices (line 4) | def find_constraint_indices(tri_ids_np):
function find_bottom_corner (line 33) | def find_bottom_corner(pos_np):
function calculate_quadratic_path_pos (line 55) | def calculate_quadratic_path_pos(start_pos, end_pos, t):
FILE: 12_pbd_cloth/utils/mesh_loader.py
function load_cloth_data_from_json (line 5) | def load_cloth_data_from_json(filepath="cloth_data.json"):
function create_cloth_mesh_data (line 30) | def create_cloth_mesh_data(width=20, height=15, spacing=0.1):
FILE: 12_pbd_cloth/xpbd_base.py
function init_physics (line 11) | def init_physics(
function pre_solve (line 52) | def pre_solve(
function post_solve (line 74) | def post_solve(
FILE: 13_pbd_mesh/constraints/edge.py
function solve_edges (line 5) | def solve_edges(
FILE: 13_pbd_mesh/constraints/volume.py
function solve_volumes (line 12) | def solve_volumes(
FILE: 13_pbd_mesh/main.py
function load_dual_mesh_from_json (line 27) | def load_dual_mesh_from_json(filepath):
class USDExporter (line 53) | class USDExporter:
method __init__ (line 56) | def __init__(self, output_path="dragon_animation.usd", fps=60, scale=1...
method export_frame (line 72) | def export_frame(self, vertices, faces):
method save (line 89) | def save(self):
function reset_constraint_lambdas (line 202) | def reset_constraint_lambdas(
function substep (line 212) | def substep():
FILE: 13_pbd_mesh/skinning/hash_grid.py
function build_hash_grid (line 15) | def build_hash_grid(
FILE: 13_pbd_mesh/skinning/skinning.py
function compute_skinning_info_hashed (line 18) | def compute_skinning_info_hashed(
function update_vis_mesh (line 64) | def update_vis_mesh(
FILE: 13_pbd_mesh/xpbd_base.py
function get_tet_volume (line 12) | def get_tet_volume(p_indices, pos):
function get_barycentric_coords (line 19) | def get_barycentric_coords(p, a, b, c, d):
function get_grid_cell (line 30) | def get_grid_cell(p, inv_cell_spacing, grid_size):
function clamp_to_box (line 36) | def clamp_to_box(p, box_min, box_max):
function init_physics (line 46) | def init_physics(
function pre_solve (line 78) | def pre_solve(
function post_solve (line 101) | def post_solve(
FILE: 14_pbf/constraints/density.py
function compute_scorr (line 11) | def compute_scorr(pos_ji, h_, poly6_factor_, corr_deltaQ_coeff_, corrK_):
function solve_density_constraints (line 18) | def solve_density_constraints(
FILE: 14_pbf/constraints/viscosity.py
function apply_xsph_viscosity (line 19) | def apply_xsph_viscosity(
FILE: 14_pbf/constraints/vorticity.py
function calculate_vorticity (line 19) | def calculate_vorticity(
function apply_vorticity_confinement (line 45) | def apply_vorticity_confinement(
FILE: 14_pbf/main.py
function round_up (line 28) | def round_up(f, s):
function substep (line 86) | def substep():
function main (line 132) | def main():
FILE: 14_pbf/scene.py
function init_particles (line 5) | def init_particles(
function move_wall (line 31) | def move_wall(
function update_particle_colors (line 67) | def update_particle_colors(
function create_box_edges (line 96) | def create_box_edges(wall_states, boundary):
function create_original_box_edges (line 120) | def create_original_box_edges(boundary, epsilon):
FILE: 14_pbf/sph_base.py
function poly6_value (line 13) | def poly6_value(s, h_, poly6_factor_):
function spiky_gradient (line 23) | def spiky_gradient(r, h_, spiky_grad_factor_):
function get_cell (line 35) | def get_cell(pos, cell_recpr_):
function is_in_grid (line 41) | def is_in_grid(c, grid_size_x: int, grid_size_y: int, grid_size_z: int):
function confine_position_to_boundary (line 47) | def confine_position_to_boundary(p, wall_states_, boundary_x: float, bou...
function pre_solve (line 62) | def pre_solve(
function post_solve (line 125) | def post_solve(
FILE: 1_mass_spring/InertiaEnergy.py
function val (line 3) | def val(x, x_tilde, m):
function grad (line 10) | def grad(x, x_tilde, m):
function hess (line 16) | def hess(x, x_tilde, m):
FILE: 1_mass_spring/MassSpringEnergy.py
function val (line 4) | def val(x, e, l2, k):
function grad (line 11) | def grad(x, e, l2, k):
function hess (line 20) | def hess(x, e, l2, k):
FILE: 1_mass_spring/simulator.py
function screen_projection (line 36) | def screen_projection(x):
FILE: 1_mass_spring/square_mesh.py
function generate (line 5) | def generate(side_length, n_seg):
function write_to_file (line 33) | def write_to_file(frameNum, x, n_seg):
FILE: 1_mass_spring/time_integrator.py
function step_forward (line 12) | def step_forward(x, e, v, m, l2, k, h, tol):
function IP_val (line 38) | def IP_val(x, e, x_tilde, m, l2, k, h):
function IP_grad (line 41) | def IP_grad(x, e, x_tilde, m, l2, k, h):
function IP_hess (line 44) | def IP_hess(x, e, x_tilde, m, l2, k, h):
function search_dir (line 52) | def search_dir(x, e, x_tilde, m, l2, k, h):
FILE: 1_mass_spring/utils.py
function make_PSD (line 4) | def make_PSD(hess):
FILE: 2_dirichlet/GravityEnergy.py
function val (line 5) | def val(x, m):
function grad (line 11) | def grad(x, m):
FILE: 2_dirichlet/InertiaEnergy.py
function val (line 3) | def val(x, x_tilde, m):
function grad (line 10) | def grad(x, x_tilde, m):
function hess (line 16) | def hess(x, x_tilde, m):
FILE: 2_dirichlet/MassSpringEnergy.py
function val (line 4) | def val(x, e, l2, k):
function grad (line 11) | def grad(x, e, l2, k):
function hess (line 20) | def hess(x, e, l2, k):
FILE: 2_dirichlet/simulator.py
function screen_projection (line 40) | def screen_projection(x):
FILE: 2_dirichlet/square_mesh.py
function generate (line 4) | def generate(side_length, n_seg):
function write_to_file (line 30) | def write_to_file(frameNum, x, n_seg):
FILE: 2_dirichlet/time_integrator.py
function step_forward (line 13) | def step_forward(x, e, v, m, l2, k, is_DBC, h, tol):
function IP_val (line 40) | def IP_val(x, e, x_tilde, m, l2, k, h):
function IP_grad (line 43) | def IP_grad(x, e, x_tilde, m, l2, k, h):
function IP_hess (line 47) | def IP_hess(x, e, x_tilde, m, l2, k, h):
function search_dir (line 56) | def search_dir(x, e, x_tilde, m, l2, k, is_DBC, h):
FILE: 2_dirichlet/utils.py
function make_PSD (line 4) | def make_PSD(hess):
FILE: 3_contact/BarrierEnergy.py
function val (line 8) | def val(x, y_ground, contact_area):
function grad (line 17) | def grad(x, y_ground, contact_area):
function hess (line 26) | def hess(x, y_ground, contact_area):
function init_step_size (line 40) | def init_step_size(x, y_ground, p):
FILE: 3_contact/GravityEnergy.py
function val (line 5) | def val(x, m):
function grad (line 11) | def grad(x, m):
FILE: 3_contact/InertiaEnergy.py
function val (line 3) | def val(x, x_tilde, m):
function grad (line 10) | def grad(x, x_tilde, m):
function hess (line 16) | def hess(x, x_tilde, m):
FILE: 3_contact/MassSpringEnergy.py
function val (line 4) | def val(x, e, l2, k):
function grad (line 11) | def grad(x, e, l2, k):
function hess (line 20) | def hess(x, e, l2, k):
FILE: 3_contact/simulator.py
function screen_projection (line 41) | def screen_projection(x):
FILE: 3_contact/square_mesh.py
function generate (line 4) | def generate(side_length, n_seg):
function write_to_file (line 30) | def write_to_file(frameNum, x, n_seg):
FILE: 3_contact/time_integrator.py
function step_forward (line 14) | def step_forward(x, e, v, m, l2, k, y_ground, contact_area, is_DBC, h, t...
function IP_val (line 42) | def IP_val(x, e, x_tilde, m, l2, k, y_ground, contact_area, h):
function IP_grad (line 45) | def IP_grad(x, e, x_tilde, m, l2, k, y_ground, contact_area, h):
function IP_hess (line 48) | def IP_hess(x, e, x_tilde, m, l2, k, y_ground, contact_area, h):
function search_dir (line 59) | def search_dir(x, e, x_tilde, m, l2, k, y_ground, contact_area, is_DBC, h):
FILE: 3_contact/utils.py
function make_PSD (line 4) | def make_PSD(hess):
FILE: 4_friction/BarrierEnergy.py
function val (line 8) | def val(x, n, o, contact_area):
function grad (line 17) | def grad(x, n, o, contact_area):
function hess (line 26) | def hess(x, n, o, contact_area):
function init_step_size (line 41) | def init_step_size(x, n, o, p):
function compute_mu_lambda (line 51) | def compute_mu_lambda(x, n, o, contact_area, mu):
FILE: 4_friction/FrictionEnergy.py
function f0 (line 7) | def f0(vbarnorm, epsv, hhat):
function f1_div_vbarnorm (line 15) | def f1_div_vbarnorm(vbarnorm, epsv):
function f_hess_term (line 21) | def f_hess_term(vbarnorm, epsv):
function val (line 29) | def val(v, mu_lambda, hhat, n):
function grad (line 38) | def grad(v, mu_lambda, hhat, n):
function hess (line 47) | def hess(v, mu_lambda, hhat, n):
FILE: 4_friction/GravityEnergy.py
function val (line 5) | def val(x, m):
function grad (line 11) | def grad(x, m):
FILE: 4_friction/InertiaEnergy.py
function val (line 3) | def val(x, x_tilde, m):
function grad (line 10) | def grad(x, x_tilde, m):
function hess (line 16) | def hess(x, x_tilde, m):
FILE: 4_friction/MassSpringEnergy.py
function val (line 4) | def val(x, e, l2, k):
function grad (line 11) | def grad(x, e, l2, k):
function hess (line 20) | def hess(x, e, l2, k):
FILE: 4_friction/simulator.py
function screen_projection (line 46) | def screen_projection(x):
FILE: 4_friction/square_mesh.py
function generate (line 4) | def generate(side_length, n_seg):
function write_to_file (line 30) | def write_to_file(frameNum, x, n_seg):
FILE: 4_friction/time_integrator.py
function step_forward (line 16) | def step_forward(x, e, v, m, l2, k, n, o, contact_area, mu, is_DBC, h, t...
function IP_val (line 44) | def IP_val(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda, h):
function IP_grad (line 47) | def IP_grad(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda, h):
function IP_hess (line 50) | def IP_hess(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda, h):
function search_dir (line 64) | def search_dir(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda...
FILE: 4_friction/utils.py
function make_PSD (line 4) | def make_PSD(hess):
FILE: 5_mov_dirichlet/BarrierEnergy.py
function val (line 7) | def val(x, n, o, contact_area):
function grad (line 25) | def grad(x, n, o, contact_area):
function hess (line 45) | def hess(x, n, o, contact_area):
function init_step_size (line 74) | def init_step_size(x, n, o, p):
function compute_mu_lambda (line 90) | def compute_mu_lambda(x, n, o, contact_area, mu):
FILE: 5_mov_dirichlet/FrictionEnergy.py
function f0 (line 6) | def f0(vbarnorm, epsv, hhat):
function f1_div_vbarnorm (line 14) | def f1_div_vbarnorm(vbarnorm, epsv):
function f_hess_term (line 20) | def f_hess_term(vbarnorm, epsv):
function val (line 26) | def val(v, mu_lambda, hhat, n):
function grad (line 35) | def grad(v, mu_lambda, hhat, n):
function hess (line 44) | def hess(v, mu_lambda, hhat, n):
FILE: 5_mov_dirichlet/GravityEnergy.py
function val (line 5) | def val(x, m):
function grad (line 11) | def grad(x, m):
FILE: 5_mov_dirichlet/InertiaEnergy.py
function val (line 3) | def val(x, x_tilde, m):
function grad (line 10) | def grad(x, x_tilde, m):
function hess (line 16) | def hess(x, x_tilde, m):
FILE: 5_mov_dirichlet/MassSpringEnergy.py
function val (line 4) | def val(x, e, l2, k):
function grad (line 11) | def grad(x, e, l2, k):
function hess (line 20) | def hess(x, e, l2, k):
FILE: 5_mov_dirichlet/SpringEnergy.py
function val (line 3) | def val(x, m, DBC, DBC_target, k):
function grad (line 10) | def grad(x, m, DBC, DBC_target, k):
function hess (line 16) | def hess(x, m, DBC, DBC_target, k):
FILE: 5_mov_dirichlet/simulator.py
function screen_projection (line 50) | def screen_projection(x):
FILE: 5_mov_dirichlet/square_mesh.py
function generate (line 4) | def generate(side_length, n_seg):
function write_to_file (line 30) | def write_to_file(frameNum, x, n_seg):
FILE: 5_mov_dirichlet/time_integrator.py
function step_forward (line 16) | def step_forward(x, e, v, m, l2, k, n, o, contact_area, mu, is_DBC, DBC,...
function IP_val (line 58) | def IP_val(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda, DB...
function IP_grad (line 66) | def IP_grad(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda, D...
function IP_hess (line 74) | def IP_hess(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda, D...
function search_dir (line 90) | def search_dir(x, e, x_tilde, m, l2, k, n, o, contact_area, v, mu_lambda...
FILE: 5_mov_dirichlet/utils.py
function make_PSD (line 4) | def make_PSD(hess):
FILE: 6_inv_free/BarrierEnergy.py
function val (line 7) | def val(x, n, o, contact_area):
function grad (line 24) | def grad(x, n, o, contact_area):
function hess (line 43) | def hess(x, n, o, contact_area):
function init_step_size (line 71) | def init_step_size(x, n, o, p):
function compute_mu_lambda (line 86) | def compute_mu_lambda(x, n, o, contact_area, mu):
FILE: 6_inv_free/FrictionEnergy.py
function f0 (line 6) | def f0(vbarnorm, epsv, hhat):
function f1_div_vbarnorm (line 14) | def f1_div_vbarnorm(vbarnorm, epsv):
function f_hess_term (line 20) | def f_hess_term(vbarnorm, epsv):
function val (line 26) | def val(v, mu_lambda, hhat, n):
function grad (line 35) | def grad(v, mu_lambda, hhat, n):
function hess (line 44) | def hess(v, mu_lambda, hhat, n):
FILE: 6_inv_free/GravityEnergy.py
function val (line 5) | def val(x, m):
function grad (line 11) | def grad(x, m):
FILE: 6_inv_free/InertiaEnergy.py
function val (line 3) | def val(x, x_tilde, m):
function grad (line 10) | def grad(x, x_tilde, m):
function hess (line 16) | def hess(x, x_tilde, m):
FILE: 6_inv_free/NeoHookeanEnergy.py
function polar_svd (line 6) | def polar_svd(F):
function dPsi_div_dsigma (line 16) | def dPsi_div_dsigma(s, mu, lam):
function d2Psi_div_dsigma2 (line 24) | def d2Psi_div_dsigma2(s, mu, lam):
function B_left_coef (line 33) | def B_left_coef(s, mu, lam):
function Psi (line 37) | def Psi(F, mu, lam):
function dPsi_div_dF (line 42) | def dPsi_div_dF(F, mu, lam):
function d2Psi_div_dF2 (line 46) | def d2Psi_div_dF2(F, mu, lam):
function deformation_grad (line 85) | def deformation_grad(x, elemVInd, IB):
function dPsi_div_dx (line 89) | def dPsi_div_dx(P, IB): # applying chain-rule, dPsi_div_dx = dPsi_div_d...
function d2Psi_div_dx2 (line 96) | def d2Psi_div_dx2(dP_div_dF, IB): # applying chain-rule, d2Psi_div_dx2 ...
function val (line 133) | def val(x, e, vol, IB, mu, lam):
function grad (line 140) | def grad(x, e, vol, IB, mu, lam):
function hess (line 150) | def hess(x, e, vol, IB, mu, lam):
function init_step_size (line 168) | def init_step_size(x, e, p):
FILE: 6_inv_free/SpringEnergy.py
function val (line 3) | def val(x, m, DBC, DBC_target, k):
function grad (line 10) | def grad(x, m, DBC, DBC_target, k):
function hess (line 16) | def hess(x, m, DBC, DBC_target, k):
FILE: 6_inv_free/simulator.py
function screen_projection (line 54) | def screen_projection(x):
FILE: 6_inv_free/square_mesh.py
function generate (line 4) | def generate(side_length, n_seg):
function write_to_file (line 28) | def write_to_file(frameNum, x, e):
FILE: 6_inv_free/time_integrator.py
function step_forward (line 19) | def step_forward(x, e, v, m, vol, IB, mu_lame, lam, n, o, contact_area, ...
function IP_val (line 59) | def IP_val(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, contact_area, ...
function IP_grad (line 67) | def IP_grad(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, contact_area,...
function IP_hess (line 75) | def IP_hess(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, contact_area,...
function search_dir (line 91) | def search_dir(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, contact_ar...
FILE: 6_inv_free/utils.py
function make_PSD (line 5) | def make_PSD(hess):
function smallest_positive_real_root_quad (line 13) | def smallest_positive_real_root_quad(a, b, c, tol = 1e-6):
FILE: 7_self_contact/BarrierEnergy.py
function val (line 12) | def val(x, n, o, bp, be, contact_area):
function grad (line 41) | def grad(x, n, o, bp, be, contact_area):
function hess (line 75) | def hess(x, n, o, bp, be, contact_area):
function init_step_size (line 125) | def init_step_size(x, n, o, bp, be, p):
function compute_mu_lambda (line 150) | def compute_mu_lambda(x, n, o, bp, be, contact_area, mu):
FILE: 7_self_contact/FrictionEnergy.py
function f0 (line 6) | def f0(vbarnorm, epsv, hhat):
function f1_div_vbarnorm (line 14) | def f1_div_vbarnorm(vbarnorm, epsv):
function f_hess_term (line 20) | def f_hess_term(vbarnorm, epsv):
function val (line 26) | def val(v, mu_lambda, hhat, n):
function grad (line 36) | def grad(v, mu_lambda, hhat, n):
function hess (line 46) | def hess(v, mu_lambda, hhat, n):
FILE: 7_self_contact/GravityEnergy.py
function val (line 5) | def val(x, m):
function grad (line 11) | def grad(x, m):
FILE: 7_self_contact/InertiaEnergy.py
function val (line 3) | def val(x, x_tilde, m):
function grad (line 10) | def grad(x, x_tilde, m):
function hess (line 16) | def hess(x, x_tilde, m):
FILE: 7_self_contact/NeoHookeanEnergy.py
function polar_svd (line 5) | def polar_svd(F):
function dPsi_div_dsigma (line 15) | def dPsi_div_dsigma(s, mu, lam):
function d2Psi_div_dsigma2 (line 23) | def d2Psi_div_dsigma2(s, mu, lam):
function B_left_coef (line 32) | def B_left_coef(s, mu, lam):
function Psi (line 36) | def Psi(F, mu, lam):
function dPsi_div_dF (line 41) | def dPsi_div_dF(F, mu, lam):
function d2Psi_div_dF2 (line 45) | def d2Psi_div_dF2(F, mu, lam):
function deformation_grad (line 82) | def deformation_grad(x, elemVInd, IB):
function dPsi_div_dx (line 86) | def dPsi_div_dx(P, IB): # applying chain-rule, dPsi_div_dx = dPsi_div_d...
function d2Psi_div_dx2 (line 93) | def d2Psi_div_dx2(dP_div_dF, IB): # applying chain-rule, d2Psi_div_dx2 ...
function val (line 128) | def val(x, e, vol, IB, mu, lam):
function grad (line 135) | def grad(x, e, vol, IB, mu, lam):
function hess (line 145) | def hess(x, e, vol, IB, mu, lam):
function init_step_size (line 161) | def init_step_size(x, e, p):
FILE: 7_self_contact/SpringEnergy.py
function val (line 3) | def val(x, m, DBC, DBC_target, k):
function grad (line 10) | def grad(x, m, DBC, DBC_target, k):
function hess (line 16) | def hess(x, m, DBC, DBC_target, k):
FILE: 7_self_contact/distance/CCD.py
function bbox_overlap (line 9) | def bbox_overlap(p, e0, e1, dp, de0, de1, toc_upperbound):
function narrow_phase_CCD (line 23) | def narrow_phase_CCD(_p, _e0, _e1, _dp, _de0, _de1, toc_upperbound):
FILE: 7_self_contact/distance/PointEdgeDistance.py
function val (line 7) | def val(p, e0, e1):
function grad (line 17) | def grad(p, e0, e1):
function hess (line 30) | def hess(p, e0, e1):
FILE: 7_self_contact/distance/PointLineDistance.py
function val (line 4) | def val(p, e0, e1):
function grad (line 9) | def grad(p, e0, e1):
function hess (line 29) | def hess(p, e0, e1):
FILE: 7_self_contact/distance/PointPointDistance.py
function val (line 3) | def val(p0, p1):
function grad (line 7) | def grad(p0, p1):
function hess (line 11) | def hess(p0, p1):
FILE: 7_self_contact/simulator.py
function screen_projection (line 55) | def screen_projection(x):
FILE: 7_self_contact/square_mesh.py
function generate (line 4) | def generate(side_length, n_seg):
function find_boundary (line 27) | def find_boundary(e):
function write_to_file (line 47) | def write_to_file(frameNum, x, e):
FILE: 7_self_contact/time_integrator.py
function step_forward (line 16) | def step_forward(x, e, v, m, vol, IB, mu_lame, lam, n, o, bp, be, contac...
function IP_val (line 54) | def IP_val(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, bp, be, contac...
function IP_grad (line 62) | def IP_grad(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, bp, be, conta...
function IP_hess (line 70) | def IP_hess(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, bp, be, conta...
function search_dir (line 86) | def search_dir(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, bp, be, co...
FILE: 7_self_contact/utils.py
function make_PSD (line 5) | def make_PSD(hess):
function smallest_positive_real_root_quad (line 12) | def smallest_positive_real_root_quad(a, b, c, tol = 1e-6):
FILE: 8_self_friction/BarrierEnergy.py
function val (line 12) | def val(x, n, o, bp, be, contact_area):
function grad (line 39) | def grad(x, n, o, bp, be, contact_area):
function hess (line 71) | def hess(x, n, o, bp, be, contact_area):
function init_step_size (line 119) | def init_step_size(x, n, o, bp, be, p):
function compute_mu_lambda (line 142) | def compute_mu_lambda(x, n, o, bp, be, contact_area, mu):
FILE: 8_self_friction/FrictionEnergy.py
function f0 (line 6) | def f0(vbarnorm, epsv, hhat):
function f1_div_vbarnorm (line 14) | def f1_div_vbarnorm(vbarnorm, epsv):
function f_hess_term (line 20) | def f_hess_term(vbarnorm, epsv):
function val (line 26) | def val(v, mu_lambda, mu_lambda_self, hhat, n):
function grad (line 45) | def grad(v, mu_lambda, mu_lambda_self, hhat, n):
function hess (line 67) | def hess(v, mu_lambda, mu_lambda_self, hhat, n):
FILE: 8_self_friction/GravityEnergy.py
function val (line 5) | def val(x, m):
function grad (line 11) | def grad(x, m):
FILE: 8_self_friction/InertiaEnergy.py
function val (line 3) | def val(x, x_tilde, m):
function grad (line 10) | def grad(x, x_tilde, m):
function hess (line 16) | def hess(x, x_tilde, m):
FILE: 8_self_friction/NeoHookeanEnergy.py
function polar_svd (line 5) | def polar_svd(F):
function dPsi_div_dsigma (line 15) | def dPsi_div_dsigma(s, mu, lam):
function d2Psi_div_dsigma2 (line 23) | def d2Psi_div_dsigma2(s, mu, lam):
function B_left_coef (line 32) | def B_left_coef(s, mu, lam):
function Psi (line 36) | def Psi(F, mu, lam):
function dPsi_div_dF (line 41) | def dPsi_div_dF(F, mu, lam):
function d2Psi_div_dF2 (line 45) | def d2Psi_div_dF2(F, mu, lam):
function deformation_grad (line 82) | def deformation_grad(x, elemVInd, IB):
function dPsi_div_dx (line 86) | def dPsi_div_dx(P, IB): # applying chain-rule, dPsi_div_dx = dPsi_div_d...
function d2Psi_div_dx2 (line 93) | def d2Psi_div_dx2(dP_div_dF, IB): # applying chain-rule, d2Psi_div_dx2 ...
function val (line 128) | def val(x, e, vol, IB, mu, lam):
function grad (line 135) | def grad(x, e, vol, IB, mu, lam):
function hess (line 145) | def hess(x, e, vol, IB, mu, lam):
function init_step_size (line 161) | def init_step_size(x, e, p):
FILE: 8_self_friction/SpringEnergy.py
function val (line 3) | def val(x, m, DBC, DBC_target, k):
function grad (line 10) | def grad(x, m, DBC, DBC_target, k):
function hess (line 16) | def hess(x, m, DBC, DBC_target, k):
FILE: 8_self_friction/distance/CCD.py
function bbox_overlap (line 8) | def bbox_overlap(p, e0, e1, dp, de0, de1, toc_upperbound):
function narrow_phase_CCD (line 20) | def narrow_phase_CCD(_p, _e0, _e1, _dp, _de0, _de1, toc_upperbound):
FILE: 8_self_friction/distance/PointEdgeDistance.py
function val (line 6) | def val(p, e0, e1):
function grad (line 16) | def grad(p, e0, e1):
function hess (line 28) | def hess(p, e0, e1):
function tangent (line 52) | def tangent(p, e0, e1):
FILE: 8_self_friction/distance/PointLineDistance.py
function val (line 3) | def val(p, e0, e1):
function grad (line 8) | def grad(p, e0, e1):
function hess (line 27) | def hess(p, e0, e1):
FILE: 8_self_friction/distance/PointPointDistance.py
function val (line 3) | def val(p0, p1):
function grad (line 7) | def grad(p0, p1):
function hess (line 11) | def hess(p0, p1):
FILE: 8_self_friction/simulator.py
function screen_projection (line 53) | def screen_projection(x):
FILE: 8_self_friction/square_mesh.py
function generate (line 4) | def generate(side_length, n_seg):
function find_boundary (line 26) | def find_boundary(e):
function write_to_file (line 45) | def write_to_file(frameNum, x, e):
FILE: 8_self_friction/time_integrator.py
function step_forward (line 16) | def step_forward(x, e, v, m, vol, IB, mu_lame, lam, n, o, bp, be, contac...
function IP_val (line 54) | def IP_val(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, bp, be, contac...
function IP_grad (line 62) | def IP_grad(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, bp, be, conta...
function IP_hess (line 70) | def IP_hess(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, bp, be, conta...
function search_dir (line 86) | def search_dir(x, e, x_tilde, m, vol, IB, mu_lame, lam, n, o, bp, be, co...
FILE: 8_self_friction/utils.py
function make_PSD (line 5) | def make_PSD(hess):
function smallest_positive_real_root_quad (line 12) | def smallest_positive_real_root_quad(a, b, c, tol = 1e-6):
FILE: 9_reduced_DOF/BarrierEnergy.py
function val (line 8) | def val(x, y_ground, contact_area):
function grad (line 17) | def grad(x, y_ground, contact_area):
function hess (line 26) | def hess(x, y_ground, contact_area):
function init_step_size (line 40) | def init_step_size(x, y_ground, p):
FILE: 9_reduced_DOF/GravityEnergy.py
function val (line 5) | def val(x, m):
function grad (line 11) | def grad(x, m):
FILE: 9_reduced_DOF/InertiaEnergy.py
function val (line 3) | def val(x, x_tilde, m):
function grad (line 10) | def grad(x, x_tilde, m):
function hess (line 16) | def hess(x, x_tilde, m):
FILE: 9_reduced_DOF/NeoHookeanEnergy.py
function polar_svd (line 6) | def polar_svd(F):
function dPsi_div_dsigma (line 16) | def dPsi_div_dsigma(s, mu, lam):
function d2Psi_div_dsigma2 (line 24) | def d2Psi_div_dsigma2(s, mu, lam):
function B_left_coef (line 33) | def B_left_coef(s, mu, lam):
function Psi (line 37) | def Psi(F, mu, lam):
function dPsi_div_dF (line 42) | def dPsi_div_dF(F, mu, lam):
function d2Psi_div_dF2 (line 46) | def d2Psi_div_dF2(F, mu, lam, project_PSD = True):
function deformation_grad (line 89) | def deformation_grad(x, elemVInd, IB):
function dPsi_div_dx (line 93) | def dPsi_div_dx(P, IB): # applying chain-rule, dPsi_div_dx = dPsi_div_d...
function d2Psi_div_dx2 (line 100) | def d2Psi_div_dx2(dP_div_dF, IB): # applying chain-rule, d2Psi_div_dx2 ...
function val (line 137) | def val(x, e, vol, IB, mu, lam):
function grad (line 144) | def grad(x, e, vol, IB, mu, lam):
function hess (line 154) | def hess(x, e, vol, IB, mu, lam, project_PSD = True):
function init_step_size (line 172) | def init_step_size(x, e, p):
FILE: 9_reduced_DOF/linear.py
function generate_2d_mesh (line 38) | def generate_2d_mesh(L_mesh, H_mesh, Nx_mesh, Ny_mesh):
function get_element_matrices (line 53) | def get_element_matrices(element_nodes, D, rho, t):
function animate (line 206) | def animate(frame):
FILE: 9_reduced_DOF/simulator.py
function screen_projection (line 55) | def screen_projection(x):
FILE: 9_reduced_DOF/square_mesh.py
function generate (line 4) | def generate(side_length, n_seg):
function write_to_file (line 28) | def write_to_file(frameNum, x, e):
FILE: 9_reduced_DOF/time_integrator.py
function step_forward (line 14) | def step_forward(x, e, v, m, vol, IB, mu_lame, lam, y_ground, contact_ar...
function IP_val (line 42) | def IP_val(x, e, x_tilde, m, vol, IB, mu_lame, lam, y_ground, contact_ar...
function IP_grad (line 45) | def IP_grad(x, e, x_tilde, m, vol, IB, mu_lame, lam, y_ground, contact_a...
function IP_hess (line 48) | def IP_hess(x, e, x_tilde, m, vol, IB, mu_lame, lam, y_ground, contact_a...
function search_dir (line 60) | def search_dir(x, e, x_tilde, m, vol, IB, mu_lame, lam, y_ground, contac...
FILE: 9_reduced_DOF/utils.py
function make_PSD (line 10) | def make_PSD(hess):
function smallest_positive_real_root_quad (line 18) | def smallest_positive_real_root_quad(a, b, c, tol = 1e-6):
function compute_abd_anchor_basis (line 38) | def compute_abd_anchor_basis(x):
function compute_reduced_basis (line 54) | def compute_reduced_basis(x, e, vol, IB, mu_lame, lam, method, order):
Condensed preview — 141 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,011K chars).
[
{
"path": ".gitignore",
"chars": 31,
"preview": ".DS_Store\ntest.py\n*.pyc\noutput/"
},
{
"path": ".python-version",
"chars": 5,
"preview": "3.13\n"
},
{
"path": "0_getting_started/readme.md",
"chars": 340,
"preview": "# Getting Started with Solid Simulation\n\nFree fall, spring, and mass-spring solid simulation with symplectic Euler time "
},
{
"path": "0_getting_started/simulator0.py",
"chars": 2296,
"preview": "# Free Fall Simulation\n\nimport math\nimport numpy as np # for vector data structure and computations\nimport pygame "
},
{
"path": "0_getting_started/simulator1.py",
"chars": 2569,
"preview": "# Spring Simulation\n\nimport math\nimport numpy as np # for vector data structure and computations\nimport pygame # "
},
{
"path": "0_getting_started/simulator2.py",
"chars": 3722,
"preview": "# Mass-Spring Solid Simulation\n\nimport math\nimport numpy as np # for vector data structure and computations\nimport pyga"
},
{
"path": "0_getting_started/square_mesh.py",
"chars": 965,
"preview": "import numpy as np\n\ndef generate(side_length, n_seg):\n # sample nodes uniformly on a square\n x = np.array([[0.0, 0"
},
{
"path": "10_mpm_elasticity/readme.md",
"chars": 343,
"preview": "# Two Colliding Elastic Blocks in 2D\n\nTwo elastic blocks with opposite initial velocities collide head-on using the simp"
},
{
"path": "10_mpm_elasticity/simulator.py",
"chars": 6256,
"preview": "# Material Point Method Simulation\nimport numpy as np # numpy for linear algebra\nimport taichi as ti # taichi for fast "
},
{
"path": "11_mpm_plastic/readme.md",
"chars": 377,
"preview": "# 2D Sand with a Sphere Collider\n\nA 2D sand block falling onto a static red sphere collider simulated by Material Point "
},
{
"path": "11_mpm_plastic/simulator.py",
"chars": 11210,
"preview": "# Material Point Method Simulation\nimport numpy as np # numpy for linear algebra\nimport taichi as ti # taichi for fast "
},
{
"path": "11_mpm_plastic/simulator_viscoplastic.py",
"chars": 9777,
"preview": "import taichi as ti\nimport os\nimport shutil\n\nti.init(arch=ti.cuda)\n\nquality = 6\nn_particles, n_grid = 9000 * quality**2,"
},
{
"path": "11_mpm_sand/readme.md",
"chars": 377,
"preview": "# 2D Sand with a Sphere Collider\n\nA 2D sand block falling onto a static red sphere collider simulated by Material Point "
},
{
"path": "11_mpm_sand/simulator.py",
"chars": 11210,
"preview": "# Material Point Method Simulation\nimport numpy as np # numpy for linear algebra\nimport taichi as ti # taichi for fast "
},
{
"path": "12_pbd_cloth/cloth_data.json",
"chars": 237123,
"preview": "\t\t\t\t{\n\t\t\t\t\t\"name\" : \"cloth\",\n\t\t\t\t\t\"vertices\" : [\n\t\t\t\t\t\t-0.200000, 1.145859, -0.000000, -0.200000, 1.105859, -0.000000, "
},
{
"path": "12_pbd_cloth/constraints/__init__.py",
"chars": 184,
"preview": "from .stretching import solve_stretching_constraints\nfrom .bending import solve_bending_constraints\n\n__all__ = [\n 'so"
},
{
"path": "12_pbd_cloth/constraints/bending.py",
"chars": 871,
"preview": "import taichi as ti\n\n\n@ti.kernel\ndef solve_bending_constraints(\n compliance: ti.f64, dt: ti.f64, num_bending_constrai"
},
{
"path": "12_pbd_cloth/constraints/stretching.py",
"chars": 895,
"preview": "import taichi as ti\n\n\n@ti.kernel\ndef solve_stretching_constraints(\n compliance: ti.f64, dt: ti.f64, num_stretching_co"
},
{
"path": "12_pbd_cloth/imgui.ini",
"chars": 116,
"preview": "[Window][Debug##Default]\nPos=60,60\nSize=400,400\nCollapsed=0\n\n[Window][Controls]\nPos=51,51\nSize=307,409\nCollapsed=0\n\n"
},
{
"path": "12_pbd_cloth/main.py",
"chars": 12295,
"preview": "import taichi as ti\nimport numpy as np\nimport time\nimport warp as wp\nimport warp.render\n\n# Import all modules\nfrom xpbd_"
},
{
"path": "12_pbd_cloth/utils/__init__.py",
"chars": 491,
"preview": "from .mesh_loader import load_cloth_data_from_json, create_cloth_mesh_data\nfrom .constraint_finder import find_constrain"
},
{
"path": "12_pbd_cloth/utils/cloth_utils.py",
"chars": 1233,
"preview": "import taichi as ti\n\n\n@ti.kernel\ndef pin_top_vertices(\n num_particles: ti.i32,\n pos: ti.template(), inv_mass: ti.t"
},
{
"path": "12_pbd_cloth/utils/constraint_finder.py",
"chars": 1923,
"preview": "import numpy as np\n\n\ndef find_constraint_indices(tri_ids_np):\n \n edge_to_tri_map = {}\n \n # Build a map from ed"
},
{
"path": "12_pbd_cloth/utils/mesh_loader.py",
"chars": 1781,
"preview": "import json\nimport numpy as np\n\n\ndef load_cloth_data_from_json(filepath=\"cloth_data.json\"):\n \"\"\"\n Load cloth mesh "
},
{
"path": "12_pbd_cloth/xpbd_base.py",
"chars": 2661,
"preview": "\"\"\"\nThis module contains: \n- Time integration (pre_solve, post_solve)\n- Physics initialization (init_physics)\n\"\"\"\n\nimpor"
},
{
"path": "13_pbd_mesh/constraints/__init__.py",
"chars": 345,
"preview": "\"\"\"\nConstraints Package\n\nThis package contains all constraint solvers for the XPBD mesh simulation:\n- edge: Edge length "
},
{
"path": "13_pbd_mesh/constraints/edge.py",
"chars": 790,
"preview": "import taichi as ti\n\n\n@ti.kernel\ndef solve_edges(\n compliance: ti.f64, dt: ti.f64, num_edges: ti.i32,\n pos: ti.tem"
},
{
"path": "13_pbd_mesh/constraints/volume.py",
"chars": 1360,
"preview": "import taichi as ti\nimport sys\nimport os\n# Add parent directory to path to import xpbd_base\n_parent_dir = os.path.dirnam"
},
{
"path": "13_pbd_mesh/dragon_data.json",
"chars": 2370157,
"preview": "\n{\n \"verts\" : [\n-0.067935, 1.288305, -0.082477, 0.003506, 1.248151, -0.070033, 0.001571, 1.244475, -0.167807, -0"
},
{
"path": "13_pbd_mesh/imgui.ini",
"chars": 116,
"preview": "[Window][Debug##Default]\nPos=60,60\nSize=400,400\nCollapsed=0\n\n[Window][Controls]\nPos=51,51\nSize=307,256\nCollapsed=0\n\n"
},
{
"path": "13_pbd_mesh/main.py",
"chars": 12609,
"preview": "\"\"\"\nMain Orchestrator - XPBD Mesh Simulation\n\nThis module ties everything together:\n- Allocates all Taichi fields (memor"
},
{
"path": "13_pbd_mesh/skinning/__init__.py",
"chars": 204,
"preview": "from .hash_grid import build_hash_grid\nfrom .skinning import compute_skinning_info_hashed, update_vis_mesh\n\n__all__ = [\n"
},
{
"path": "13_pbd_mesh/skinning/hash_grid.py",
"chars": 2517,
"preview": "\"\"\"\nThis module builds a spatial hash grid for efficient nearest-neighbor queries used in the skinning computation.\n\"\"\"\n"
},
{
"path": "13_pbd_mesh/skinning/skinning.py",
"chars": 3836,
"preview": "\"\"\"\nThis module handles the computation of skinning weights and updates the visual mesh.\nSkinning maps visual mesh verti"
},
{
"path": "13_pbd_mesh/xpbd_base.py",
"chars": 3585,
"preview": "\"\"\"\nThis module contains:\n- Helper functions (tet volume, barycentric coords, grid cell, box clamping)\n- Time integratio"
},
{
"path": "14_pbf/constraints/__init__.py",
"chars": 301,
"preview": "from .density import solve_density_constraints\nfrom .vorticity import calculate_vorticity, apply_vorticity_confinement\nf"
},
{
"path": "14_pbf/constraints/density.py",
"chars": 2517,
"preview": "import taichi as ti\nimport sys\nimport os\n_parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nif _p"
},
{
"path": "14_pbf/constraints/viscosity.py",
"chars": 1427,
"preview": "\"\"\"\nViscosity Module - XSPH Viscosity\n\nThis module implements XSPH (eXtended Smoothed Particle Hydrodynamics) viscosity,"
},
{
"path": "14_pbf/constraints/vorticity.py",
"chars": 2965,
"preview": "\"\"\"\nVorticity Confinement Module\n\nThis module restores energy lost to numerical damping by detecting and amplifying\nvort"
},
{
"path": "14_pbf/main.py",
"chars": 10070,
"preview": "import math\nimport numpy as np\nimport taichi as ti\n\n# Import all modules\nfrom sph_base import pre_solve, post_solve\nfrom"
},
{
"path": "14_pbf/scene.py",
"chars": 4018,
"preview": "import taichi as ti\n\n\n@ti.kernel\ndef init_particles(\n positions: ti.template(),\n velocities: ti.template(),\n wa"
},
{
"path": "14_pbf/sph_base.py",
"chars": 4752,
"preview": "\"\"\"\nThis module contains:\n- Smoothing kernels (poly6, spiky_gradient)\n- Grid hashing and neighbor search\n- Boundary coll"
},
{
"path": "1_mass_spring/InertiaEnergy.py",
"chars": 637,
"preview": "import numpy as np\n\ndef val(x, x_tilde, m):\n sum = 0.0\n for i in range(0, len(x)):\n diff = x[i] - x_tilde[i"
},
{
"path": "1_mass_spring/MassSpringEnergy.py",
"chars": 1339,
"preview": "import numpy as np\nimport utils\n\ndef val(x, e, l2, k):\n sum = 0.0\n for i in range(0, len(e)):\n diff = x[e[i"
},
{
"path": "1_mass_spring/readme.md",
"chars": 341,
"preview": "# Mass-Spring Solids Simulation\n\nAn initially stretched square is simulated with mass-spring elasticity potential and im"
},
{
"path": "1_mass_spring/simulator.py",
"chars": 2092,
"preview": "# Mass-Spring Solids Simulation\n\nimport numpy as np # numpy for linear algebra\nimport pygame # pygame for visuali"
},
{
"path": "1_mass_spring/square_mesh.py",
"chars": 1885,
"preview": "# ANCHOR: generate\nimport numpy as np\nimport os\n\ndef generate(side_length, n_seg):\n # sample nodes uniformly on a squ"
},
{
"path": "1_mass_spring/time_integrator.py",
"chars": 1859,
"preview": "import copy\nfrom cmath import inf\n\nimport numpy as np\nimport numpy.linalg as LA\nimport scipy.sparse as sparse\nfrom scipy"
},
{
"path": "1_mass_spring/utils.py",
"chars": 310,
"preview": "import numpy as np\nimport numpy.linalg as LA\n\ndef make_PSD(hess):\n [lam, V] = LA.eigh(hess) # Eigen decomposition "
},
{
"path": "2_dirichlet/GravityEnergy.py",
"chars": 295,
"preview": "import numpy as np\n\ngravity = [0.0, -9.81]\n\ndef val(x, m):\n sum = 0.0\n for i in range(0, len(x)):\n sum += -"
},
{
"path": "2_dirichlet/InertiaEnergy.py",
"chars": 637,
"preview": "import numpy as np\n\ndef val(x, x_tilde, m):\n sum = 0.0\n for i in range(0, len(x)):\n diff = x[i] - x_tilde[i"
},
{
"path": "2_dirichlet/MassSpringEnergy.py",
"chars": 1339,
"preview": "import numpy as np\nimport utils\n\ndef val(x, e, l2, k):\n sum = 0.0\n for i in range(0, len(e)):\n diff = x[e[i"
},
{
"path": "2_dirichlet/readme.md",
"chars": 382,
"preview": "# Mass-Spring Solids Simulation\n\nA square hanging under gravity with its right and left top nodes fixed is simulated wit"
},
{
"path": "2_dirichlet/simulator.py",
"chars": 2245,
"preview": "# Mass-Spring Solids Simulation\n\nimport numpy as np # numpy for linear algebra\nimport pygame # pygame for visuali"
},
{
"path": "2_dirichlet/square_mesh.py",
"chars": 1791,
"preview": "import numpy as np\nimport os\n\ndef generate(side_length, n_seg):\n # sample nodes uniformly on a square\n x = np.arra"
},
{
"path": "2_dirichlet/time_integrator.py",
"chars": 2395,
"preview": "import copy\nfrom cmath import inf\n\nimport numpy as np\nimport numpy.linalg as LA\nimport scipy.sparse as sparse\nfrom scipy"
},
{
"path": "2_dirichlet/utils.py",
"chars": 310,
"preview": "import numpy as np\nimport numpy.linalg as LA\n\ndef make_PSD(hess):\n [lam, V] = LA.eigh(hess) # Eigen decomposition "
},
{
"path": "3_contact/BarrierEnergy.py",
"chars": 1292,
"preview": "# ANCHOR: val_grad_hess\nimport math\nimport numpy as np\n\ndhat = 0.01\nkappa = 1e5\n\ndef val(x, y_ground, contact_area):\n "
},
{
"path": "3_contact/GravityEnergy.py",
"chars": 295,
"preview": "import numpy as np\n\ngravity = [0.0, -9.81]\n\ndef val(x, m):\n sum = 0.0\n for i in range(0, len(x)):\n sum += -"
},
{
"path": "3_contact/InertiaEnergy.py",
"chars": 637,
"preview": "import numpy as np\n\ndef val(x, x_tilde, m):\n sum = 0.0\n for i in range(0, len(x)):\n diff = x[i] - x_tilde[i"
},
{
"path": "3_contact/MassSpringEnergy.py",
"chars": 1339,
"preview": "import numpy as np\nimport utils\n\ndef val(x, e, l2, k):\n sum = 0.0\n for i in range(0, len(e)):\n diff = x[e[i"
},
{
"path": "3_contact/readme.md",
"chars": 358,
"preview": "# Mass-Spring Solids Simulation\n\nA square falling onto the ground under gravity is simulated with mass-spring elasticity"
},
{
"path": "3_contact/simulator.py",
"chars": 2465,
"preview": "# Mass-Spring Solids Simulation\n\nimport numpy as np # numpy for linear algebra\nimport pygame # pygame for visuali"
},
{
"path": "3_contact/square_mesh.py",
"chars": 1791,
"preview": "import numpy as np\nimport os\n\ndef generate(side_length, n_seg):\n # sample nodes uniformly on a square\n x = np.arra"
},
{
"path": "3_contact/time_integrator.py",
"chars": 3003,
"preview": "import copy\nfrom cmath import inf\n\nimport numpy as np\nimport numpy.linalg as LA\nimport scipy.sparse as sparse\nfrom scipy"
},
{
"path": "3_contact/utils.py",
"chars": 310,
"preview": "import numpy as np\nimport numpy.linalg as LA\n\ndef make_PSD(hess):\n [lam, V] = LA.eigh(hess) # Eigen decomposition "
},
{
"path": "4_friction/BarrierEnergy.py",
"chars": 1795,
"preview": "# ANCHOR: slope_barrier\nimport math\nimport numpy as np\n\ndhat = 0.01\nkappa = 1e5\n\ndef val(x, n, o, contact_area):\n sum"
},
{
"path": "4_friction/FrictionEnergy.py",
"chars": 2238,
"preview": "# ANCHOR: f_terms\nimport numpy as np\nimport utils\n\nepsv = 1e-3\n\ndef f0(vbarnorm, epsv, hhat):\n if vbarnorm >= epsv:\n "
},
{
"path": "4_friction/GravityEnergy.py",
"chars": 295,
"preview": "import numpy as np\n\ngravity = [0.0, -9.81]\n\ndef val(x, m):\n sum = 0.0\n for i in range(0, len(x)):\n sum += -"
},
{
"path": "4_friction/InertiaEnergy.py",
"chars": 637,
"preview": "import numpy as np\n\ndef val(x, x_tilde, m):\n sum = 0.0\n for i in range(0, len(x)):\n diff = x[i] - x_tilde[i"
},
{
"path": "4_friction/MassSpringEnergy.py",
"chars": 1339,
"preview": "import numpy as np\nimport utils\n\ndef val(x, e, l2, k):\n sum = 0.0\n for i in range(0, len(e)):\n diff = x[e[i"
},
{
"path": "4_friction/readme.md",
"chars": 362,
"preview": "# Mass-Spring Solids Simulation\n\nA square sliding/residing on a slope under gravity is simulated with mass-spring elasti"
},
{
"path": "4_friction/simulator.py",
"chars": 2892,
"preview": "# Mass-Spring Solids Simulation\n\nimport numpy as np # numpy for linear algebra\nimport pygame # pygame for visuali"
},
{
"path": "4_friction/square_mesh.py",
"chars": 1791,
"preview": "import numpy as np\nimport os\n\ndef generate(side_length, n_seg):\n # sample nodes uniformly on a square\n x = np.arra"
},
{
"path": "4_friction/time_integrator.py",
"chars": 3531,
"preview": "import copy\nfrom cmath import inf\n\nimport numpy as np\nimport numpy.linalg as LA\nimport scipy.sparse as sparse\nfrom scipy"
},
{
"path": "4_friction/utils.py",
"chars": 310,
"preview": "import numpy as np\nimport numpy.linalg as LA\n\ndef make_PSD(hess):\n [lam, V] = LA.eigh(hess) # Eigen decomposition "
},
{
"path": "5_mov_dirichlet/BarrierEnergy.py",
"chars": 3266,
"preview": "import math\nimport numpy as np\n\ndhat = 0.01\nkappa = 1e5\n\ndef val(x, n, o, contact_area):\n sum = 0.0\n # floor:\n "
},
{
"path": "5_mov_dirichlet/FrictionEnergy.py",
"chars": 2146,
"preview": "import numpy as np\nimport utils\n\nepsv = 1e-3\n\ndef f0(vbarnorm, epsv, hhat):\n if vbarnorm >= epsv:\n return vbar"
},
{
"path": "5_mov_dirichlet/GravityEnergy.py",
"chars": 295,
"preview": "import numpy as np\n\ngravity = [0.0, -9.81]\n\ndef val(x, m):\n sum = 0.0\n for i in range(0, len(x)):\n sum += -"
},
{
"path": "5_mov_dirichlet/InertiaEnergy.py",
"chars": 637,
"preview": "import numpy as np\n\ndef val(x, x_tilde, m):\n sum = 0.0\n for i in range(0, len(x)):\n diff = x[i] - x_tilde[i"
},
{
"path": "5_mov_dirichlet/MassSpringEnergy.py",
"chars": 1339,
"preview": "import numpy as np\nimport utils\n\ndef val(x, e, l2, k):\n sum = 0.0\n for i in range(0, len(e)):\n diff = x[e[i"
},
{
"path": "5_mov_dirichlet/SpringEnergy.py",
"chars": 699,
"preview": "import numpy as np\n\ndef val(x, m, DBC, DBC_target, k):\n sum = 0.0\n for i in range(0, len(DBC)):\n diff = x[D"
},
{
"path": "5_mov_dirichlet/readme.md",
"chars": 389,
"preview": "# Mass-Spring Solids Simulation\n\nA square falling onto a ground under gravity and then compressed by a ceiling is simula"
},
{
"path": "5_mov_dirichlet/simulator.py",
"chars": 3439,
"preview": "# Mass-Spring Solids Simulation\n\nimport numpy as np # numpy for linear algebra\nimport pygame # pygame for visuali"
},
{
"path": "5_mov_dirichlet/square_mesh.py",
"chars": 1791,
"preview": "import numpy as np\nimport os\n\ndef generate(side_length, n_seg):\n # sample nodes uniformly on a square\n x = np.arra"
},
{
"path": "5_mov_dirichlet/time_integrator.py",
"chars": 5497,
"preview": "import copy\nfrom cmath import inf\n\nimport numpy as np\nimport numpy.linalg as LA\nimport scipy.sparse as sparse\nfrom scipy"
},
{
"path": "5_mov_dirichlet/utils.py",
"chars": 310,
"preview": "import numpy as np\nimport numpy.linalg as LA\n\ndef make_PSD(hess):\n [lam, V] = LA.eigh(hess) # Eigen decomposition "
},
{
"path": "6_inv_free/BarrierEnergy.py",
"chars": 3086,
"preview": "import math\nimport numpy as np\n\ndhat = 0.01\nkappa = 1e5\n\ndef val(x, n, o, contact_area):\n sum = 0.0\n # floor:\n "
},
{
"path": "6_inv_free/FrictionEnergy.py",
"chars": 2146,
"preview": "import numpy as np\nimport utils\n\nepsv = 1e-3\n\ndef f0(vbarnorm, epsv, hhat):\n if vbarnorm >= epsv:\n return vbar"
},
{
"path": "6_inv_free/GravityEnergy.py",
"chars": 295,
"preview": "import numpy as np\n\ngravity = [0.0, -9.81]\n\ndef val(x, m):\n sum = 0.0\n for i in range(0, len(x)):\n sum += -"
},
{
"path": "6_inv_free/InertiaEnergy.py",
"chars": 637,
"preview": "import numpy as np\n\ndef val(x, x_tilde, m):\n sum = 0.0\n for i in range(0, len(x)):\n diff = x[i] - x_tilde[i"
},
{
"path": "6_inv_free/NeoHookeanEnergy.py",
"chars": 7449,
"preview": "# ANCHOR: helper_func\nimport utils\nimport numpy as np\nimport math\n\ndef polar_svd(F):\n [U, s, VT] = np.linalg.svd(F)\n "
},
{
"path": "6_inv_free/SpringEnergy.py",
"chars": 699,
"preview": "import numpy as np\n\ndef val(x, m, DBC, DBC_target, k):\n sum = 0.0\n for i in range(0, len(DBC)):\n diff = x[D"
},
{
"path": "6_inv_free/readme.md",
"chars": 413,
"preview": "# Inversion-free Hyperelastic Solids Simulation\n\nA square falling onto a ground under gravity and then compressed by a c"
},
{
"path": "6_inv_free/simulator.py",
"chars": 3955,
"preview": "# FEM Solids Simulation\n\nimport numpy as np # numpy for linear algebra\nimport pygame # pygame for visualization\np"
},
{
"path": "6_inv_free/square_mesh.py",
"chars": 1691,
"preview": "import numpy as np\nimport os\n\ndef generate(side_length, n_seg):\n # sample nodes uniformly on a square\n x = np.arra"
},
{
"path": "6_inv_free/time_integrator.py",
"chars": 5617,
"preview": "import copy\nfrom cmath import inf\n\nimport numpy as np\nimport numpy.linalg as LA\nimport scipy.sparse as sparse\nfrom scipy"
},
{
"path": "6_inv_free/utils.py",
"chars": 1121,
"preview": "import numpy as np\nimport numpy.linalg as LA\nimport math\n\ndef make_PSD(hess):\n [lam, V] = LA.eigh(hess) # Eigen de"
},
{
"path": "7_self_contact/BarrierEnergy.py",
"chars": 6383,
"preview": "import math\nimport numpy as np\n\nimport distance.PointEdgeDistance as PE\nimport distance.CCD as CCD\n\nimport utils\n\ndhat ="
},
{
"path": "7_self_contact/FrictionEnergy.py",
"chars": 2185,
"preview": "import numpy as np\nimport utils\n\nepsv = 1e-3\n\ndef f0(vbarnorm, epsv, hhat):\n if vbarnorm >= epsv:\n return vbar"
},
{
"path": "7_self_contact/GravityEnergy.py",
"chars": 295,
"preview": "import numpy as np\n\ngravity = [0.0, -9.81]\n\ndef val(x, m):\n sum = 0.0\n for i in range(0, len(x)):\n sum += -"
},
{
"path": "7_self_contact/InertiaEnergy.py",
"chars": 637,
"preview": "import numpy as np\n\ndef val(x, x_tilde, m):\n sum = 0.0\n for i in range(0, len(x)):\n diff = x[i] - x_tilde[i"
},
{
"path": "7_self_contact/NeoHookeanEnergy.py",
"chars": 7237,
"preview": "import utils\nimport numpy as np\nimport math\n\ndef polar_svd(F):\n [U, s, VT] = np.linalg.svd(F)\n if np.linalg.det(U)"
},
{
"path": "7_self_contact/SpringEnergy.py",
"chars": 699,
"preview": "import numpy as np\n\ndef val(x, m, DBC, DBC_target, k):\n sum = 0.0\n for i in range(0, len(DBC)):\n diff = x[D"
},
{
"path": "7_self_contact/distance/CCD.py",
"chars": 2278,
"preview": "# ANCHOR: broad_phase\nfrom copy import deepcopy\nimport numpy as np\nimport math\n\nimport distance.PointEdgeDistance as PE\n"
},
{
"path": "7_self_contact/distance/PointEdgeDistance.py",
"chars": 2198,
"preview": "# ANCHOR: PE_val_grad\nimport numpy as np\n\nimport distance.PointPointDistance as PP\nimport distance.PointLineDistance as "
},
{
"path": "7_self_contact/distance/PointLineDistance.py",
"chars": 3570,
"preview": "# ANCHOR: PL_val_grad\nimport numpy as np\n\ndef val(p, e0, e1):\n e = e1 - e0\n numerator = e[1] * p[0] - e[0] * p[1] "
},
{
"path": "7_self_contact/distance/PointPointDistance.py",
"chars": 320,
"preview": "import numpy as np\n\ndef val(p0, p1):\n e = p0 - p1\n return np.dot(e, e)\n\ndef grad(p0, p1):\n e = p0 - p1\n retu"
},
{
"path": "7_self_contact/readme.md",
"chars": 456,
"preview": "# Inversion-free Hyperelastic Solids Simulation\n\nTwo squares falling onto the ground under gravity, contacting with each"
},
{
"path": "7_self_contact/simulator.py",
"chars": 4186,
"preview": "# FEM Solids Simulation\n\nimport numpy as np # numpy for linear algebra\nimport pygame # pygame for visualization\np"
},
{
"path": "7_self_contact/square_mesh.py",
"chars": 2257,
"preview": "import numpy as np\nimport os\n\ndef generate(side_length, n_seg):\n # sample nodes uniformly on a square\n x = np.arra"
},
{
"path": "7_self_contact/time_integrator.py",
"chars": 5692,
"preview": "import copy\nfrom cmath import inf\n\nimport numpy as np\nimport numpy.linalg as LA\nimport scipy.sparse as sparse\nfrom scipy"
},
{
"path": "7_self_contact/utils.py",
"chars": 1049,
"preview": "import numpy as np\nimport numpy.linalg as LA\nimport math\n\ndef make_PSD(hess):\n [lam, V] = LA.eigh(hess) # Eigen de"
},
{
"path": "8_self_friction/BarrierEnergy.py",
"chars": 7159,
"preview": "import math\nimport numpy as np\n\nimport distance.PointEdgeDistance as PE\nimport distance.CCD as CCD\n\nimport utils\n\ndhat ="
},
{
"path": "8_self_friction/FrictionEnergy.py",
"chars": 4134,
"preview": "import numpy as np\nimport utils\n\nepsv = 1e-3\n\ndef f0(vbarnorm, epsv, hhat):\n if vbarnorm >= epsv:\n return vbar"
},
{
"path": "8_self_friction/GravityEnergy.py",
"chars": 295,
"preview": "import numpy as np\n\ngravity = [0.0, -9.81]\n\ndef val(x, m):\n sum = 0.0\n for i in range(0, len(x)):\n sum += -"
},
{
"path": "8_self_friction/InertiaEnergy.py",
"chars": 637,
"preview": "import numpy as np\n\ndef val(x, x_tilde, m):\n sum = 0.0\n for i in range(0, len(x)):\n diff = x[i] - x_tilde[i"
},
{
"path": "8_self_friction/NeoHookeanEnergy.py",
"chars": 7237,
"preview": "import utils\nimport numpy as np\nimport math\n\ndef polar_svd(F):\n [U, s, VT] = np.linalg.svd(F)\n if np.linalg.det(U)"
},
{
"path": "8_self_friction/SpringEnergy.py",
"chars": 699,
"preview": "import numpy as np\n\ndef val(x, m, DBC, DBC_target, k):\n sum = 0.0\n for i in range(0, len(DBC)):\n diff = x[D"
},
{
"path": "8_self_friction/distance/CCD.py",
"chars": 2196,
"preview": "from copy import deepcopy\nimport numpy as np\nimport math\n\nimport distance.PointEdgeDistance as PE\n\n# check whether the b"
},
{
"path": "8_self_friction/distance/PointEdgeDistance.py",
"chars": 2639,
"preview": "import numpy as np\n\nimport distance.PointPointDistance as PP\nimport distance.PointLineDistance as PL\n\ndef val(p, e0, e1)"
},
{
"path": "8_self_friction/distance/PointLineDistance.py",
"chars": 3522,
"preview": "import numpy as np\n\ndef val(p, e0, e1):\n e = e1 - e0\n numerator = e[1] * p[0] - e[0] * p[1] + e1[0] * e0[1] - e1[1"
},
{
"path": "8_self_friction/distance/PointPointDistance.py",
"chars": 320,
"preview": "import numpy as np\n\ndef val(p0, p1):\n e = p0 - p1\n return np.dot(e, e)\n\ndef grad(p0, p1):\n e = p0 - p1\n retu"
},
{
"path": "8_self_friction/readme.md",
"chars": 456,
"preview": "# Inversion-free Hyperelastic Solids Simulation\n\nTwo squares falling onto the ground under gravity, contacting with each"
},
{
"path": "8_self_friction/simulator.py",
"chars": 4142,
"preview": "# FEM Solids Simulation\n\nimport numpy as np # numpy for linear algebra\nimport pygame # pygame for visualization\np"
},
{
"path": "8_self_friction/square_mesh.py",
"chars": 2205,
"preview": "import numpy as np\nimport os\n\ndef generate(side_length, n_seg):\n # sample nodes uniformly on a square\n x = np.arra"
},
{
"path": "8_self_friction/time_integrator.py",
"chars": 5950,
"preview": "import copy\nfrom cmath import inf\n\nimport numpy as np\nimport numpy.linalg as LA\nimport scipy.sparse as sparse\nfrom scipy"
},
{
"path": "8_self_friction/utils.py",
"chars": 1049,
"preview": "import numpy as np\nimport numpy.linalg as LA\nimport math\n\ndef make_PSD(hess):\n [lam, V] = LA.eigh(hess) # Eigen de"
},
{
"path": "9_reduced_DOF/BarrierEnergy.py",
"chars": 1292,
"preview": "# ANCHOR: val_grad_hess\nimport math\nimport numpy as np\n\ndhat = 0.01\nkappa = 1e5\n\ndef val(x, y_ground, contact_area):\n "
},
{
"path": "9_reduced_DOF/GravityEnergy.py",
"chars": 295,
"preview": "import numpy as np\n\ngravity = [0.0, -9.81]\n\ndef val(x, m):\n sum = 0.0\n for i in range(0, len(x)):\n sum += -"
},
{
"path": "9_reduced_DOF/InertiaEnergy.py",
"chars": 637,
"preview": "import numpy as np\n\ndef val(x, x_tilde, m):\n sum = 0.0\n for i in range(0, len(x)):\n diff = x[i] - x_tilde[i"
},
{
"path": "9_reduced_DOF/NeoHookeanEnergy.py",
"chars": 7618,
"preview": "# ANCHOR: helper_func\nimport utils\nimport numpy as np\nimport math\n\ndef polar_svd(F):\n [U, s, VT] = np.linalg.svd(F)\n "
},
{
"path": "9_reduced_DOF/linear.py",
"chars": 9953,
"preview": "\n\"\"\"\n2D Modal Analysis with Combined Animation of Mode Shapes\n\nThis program performs a dynamic modal analysis of a 2D ve"
},
{
"path": "9_reduced_DOF/readme.md",
"chars": 478,
"preview": "# Reduced Simulation of Neo-Hookean Solids \n\nA square falling onto the ground under gravity is simulated using neo-Hooke"
},
{
"path": "9_reduced_DOF/simulator.py",
"chars": 4220,
"preview": "# Mass-Spring Solids Simulation\n\nimport numpy as np # numpy for linear algebra\nimport pygame # pygame for visuali"
},
{
"path": "9_reduced_DOF/square_mesh.py",
"chars": 1691,
"preview": "import numpy as np\nimport os\n\ndef generate(side_length, n_seg):\n # sample nodes uniformly on a square\n x = np.arra"
},
{
"path": "9_reduced_DOF/time_integrator.py",
"chars": 3581,
"preview": "import copy\nfrom cmath import inf\n\nimport numpy as np\nimport numpy.linalg as LA\nimport scipy.sparse as sparse\nfrom scipy"
},
{
"path": "9_reduced_DOF/utils.py",
"chars": 4696,
"preview": "import math\nimport numpy as np\nimport numpy.linalg as LA\n\nimport scipy.sparse as sparse\nfrom scipy.sparse.linalg import "
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "pyproject.toml",
"chars": 238,
"preview": "[project]\nname = \"solid-sim-tutorial\"\nversion = \"0.1.0\"\ndescription = \"Add your description here\"\nreadme = \"README.md\"\nr"
},
{
"path": "readme.md",
"chars": 718,
"preview": "# Solid Simulation Tutorials\n\nA curated collection of Python examples focused on optimization-based solid simulation wit"
}
]
About this extraction
This page contains the full source code of the phys-sim-book/solid-sim-tutorial GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 141 files (2.8 MB), approximately 744.0k tokens, and a symbol index with 396 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.