How to use the taichi.static function in taichi

To help you get started, we’ve selected a few taichi examples, based on popular ways it is used in public projects.

Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.

github yuanming-hu / taichi / tests / python / test_mpm88.py View on Github external
if j < bound and grid_v[i, j][1] < 0:
          grid_v[i, j][1] = 0
        if j > n_grid - bound and grid_v[i, j][1] > 0:
          grid_v[i, j][1] = 0

    for p in x:
      base = (x[p] * inv_dx - 0.5).cast(int)
      fx = x[p] * inv_dx - base.cast(float)
      w = [
          0.5 * ti.sqr(1.5 - fx), 0.75 - ti.sqr(fx - 1.0),
          0.5 * ti.sqr(fx - 0.5)
      ]
      new_v = ti.Vector.zero(ti.f32, 2)
      new_C = ti.Matrix.zero(ti.f32, 2, 2)
      for i in ti.static(range(3)):
        for j in ti.static(range(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 * weight * ti.outer_product(g_v, dpos) * inv_dx
      v[p] = new_v
      x[p] += dt * v[p]
      J[p] *= 1 + dt * new_C.trace()
      C[p] = new_C
github yuanming-hu / taichi / examples / renderer.py View on Github external
def voxel_color(pos):
  p = pos * grid_resolution

  p -= ti.Matrix.floor(p)
  boundary = 0.1
  count = 0
  for i in ti.static(range(3)):
    if p[i] < boundary or p[i] > 1 - boundary:
      count += 1
  f = 0.0
  if count >= 2:
    f = 1.0
  return ti.Vector([0.2, 0.3, 0.2]) * (2.3 - 2 * f)
github yuanming-hu / taichi / examples / difftaichi / mass_spring.py View on Github external
def nn1(t: ti.i32):
  for i in range(n_hidden):
    actuation = 0.0
    for j in ti.static(range(n_sin_waves)):
      actuation += weights1[i, j] * ti.sin(spring_omega * t * dt +
                                           2 * math.pi / n_sin_waves * j)
    for j in ti.static(range(n_objects)):
      offset = x[t, j] - center[t]
      # use a smaller weight since there are too many of them
      actuation += weights1[i, j * 4 + n_sin_waves] * offset[0] * 0.05
      actuation += weights1[i, j * 4 + n_sin_waves + 1] * offset[1] * 0.05
      actuation += weights1[i, j * 4 + n_sin_waves + 2] * v[t, i][0] * 0.05
      actuation += weights1[i, j * 4 + n_sin_waves + 3] * v[t, i][1] * 0.05
    actuation += weights1[i, n_objects * 4 + n_sin_waves] * (
        goal[None][0] - center[t][0])
    actuation += weights1[i, n_objects * 4 + n_sin_waves + 1] * (
        goal[None][1] - center[t][1])
    actuation += bias1[i]
    actuation = ti.tanh(actuation)
    hidden[t, i] = actuation
github yuanming-hu / taichi / examples / difftaichi / liquid.py View on Github external
def compute_actuation(t: ti.i32):
  for i in range(n_actuators):
    act = 0.0
    for j in ti.static(range(n_sin_waves)):
      act += weights[i, j] * ti.sin(actuation_omega * t * dt +
                                    2 * math.pi / n_sin_waves * j)
    act += bias[i]
    actuation[t, i] = ti.tanh(act)
github yuanming-hu / taichi / examples / difftaichi / diffmpm.py View on Github external
def g2p(f: ti.i32):
  for p in range(0, n_particles):
    base = ti.cast(x[f, p] * inv_dx - 0.5, ti.i32)
    fx = x[f, p] * inv_dx - ti.cast(base, real)
    w = [0.5 * ti.sqr(1.5 - fx), 0.75 - ti.sqr(fx - 1.0),
         0.5 * ti.sqr(fx - 0.5)]
    new_v = ti.Vector([0.0, 0.0])
    new_C = ti.Matrix([[0.0, 0.0], [0.0, 0.0]])
    
    for i in ti.static(range(3)):
      for j in ti.static(range(3)):
        dpos = ti.cast(ti.Vector([i, j]), real) - fx
        g_v = grid_v_out[base(0) + i, base(1) + j]
        weight = w[i](0) * w[j](1)
        new_v += weight * g_v
        new_C += 4 * weight * ti.outer_product(g_v, dpos) * inv_dx
    
    v[f + 1, p] = new_v
    x[f + 1, p] = x[f, p] + dt * v[f + 1, p]
    C[f + 1, p] = new_C
github yuanming-hu / taichi / examples / mpm_fluid.py View on Github external
@ti.kernel
def g2p():
  for p in x:
    base = ti.cast(x[p] * inv_dx - 0.5, ti.i32)
    fx = x[p] * inv_dx - ti.cast(base, ti.f32)
    w = [0.5 * ti.sqr(1.5 - fx), 0.75 - ti.sqr(fx - 1.0),
         0.5 * ti.sqr(fx - 0.5)]
    new_v = ti.Vector([0.0, 0.0])
    new_C = ti.Matrix([[0.0, 0.0], [0.0, 0.0]])

    for i in ti.static(range(3)):
      for j in ti.static(range(3)):
        dpos = ti.cast(ti.Vector([i, j]), ti.f32) - fx
        g_v = grid_v[base(0) + i, base(1) + j]
        weight = w[i](0) * w[j](1)
        new_v += weight * g_v
        new_C += 4 * weight * ti.outer_product(g_v, dpos) * inv_dx

    v[p] = new_v
    x[p] += dt * v[p]
    J[p] *= 1 + dt * new_C.trace()
    C[p] = new_C
github yuanming-hu / taichi / examples / mpm_fluid.py View on Github external
def p2g():
  for p in x:
    base = ti.cast(x[p] * inv_dx - 0.5, ti.i32)
    fx = x[p] * inv_dx - ti.cast(base, ti.f32)
    w = [0.5 * ti.sqr(1.5 - fx), 0.75 - ti.sqr(fx - 1),
         0.5 * ti.sqr(fx - 0.5)]
    stress = -dt * p_vol * (J[p] - 1) * 4 * inv_dx * inv_dx * E
    affine = ti.Matrix([[stress, 0], [0, stress]]) + p_mass * C[p]
    for i in ti.static(range(3)):
      for j in ti.static(range(3)):
        offset = ti.Vector([i, j])
        dpos = (ti.cast(ti.Vector([i, j]), ti.f32) - fx) * dx
        weight = w[i](0) * w[j](1)
        grid_v[base + offset].atomic_add(weight * (p_mass * v[p] + affine @ dpos))
        grid_m[base + offset].atomic_add(weight * p_mass)
github yuanming-hu / taichi / examples / difftaichi / diffmpm_checkpointing.py View on Github external
def p2g(f: ti.i32):
  for p in range(0, n_particles):
    base = ti.cast(x[f, p] * inv_dx - 0.5, ti.i32)
    fx = x[f, p] * inv_dx - ti.cast(base, ti.i32)
    w = [0.5 * ti.sqr(1.5 - fx), 0.75 - ti.sqr(fx - 1), 0.5 * ti.sqr(fx - 0.5)]
    new_F = (ti.Matrix.diag(dim=2, val=1) + dt * C[f, p]) @ F[f, p]
    F[f + 1, p] = new_F
    J = ti.determinant(new_F)
    r, s = ti.polar_decompose(new_F)
    cauchy = 2 * mu * (new_F - r) @ ti.transposed(new_F) + \
             ti.Matrix.diag(2, la * (J - 1) * J)
    stress = -(dt * p_vol * 4 * inv_dx * inv_dx) * cauchy
    affine = stress + p_mass * C[f, p]
    for i in ti.static(range(3)):
      for j in ti.static(range(3)):
        offset = ti.Vector([i, j])
        dpos = (ti.cast(ti.Vector([i, j]), real) - fx) * dx
        weight = w[i](0) * w[j](1)
        grid_v_in[base + offset] += weight * (p_mass * v[f, p] + affine @ dpos)
        grid_m_in[base + offset] += weight * p_mass
github yuanming-hu / taichi / examples / difftaichi / liquid.py View on Github external
A = ti.Matrix([[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 1.0]]) * act
    cauchy = ti.Matrix(zero_matrix())
    mass = 0.0
    ident = [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]
    if particle_type[p] == 0:
      mass = 4
      cauchy = ti.Matrix(ident) * (J - 1) * E
    else:
      mass = 1
      cauchy = mu * (new_F @ ti.transposed(new_F)) + ti.Matrix(ident) * (
          la * ti.log(J) - mu)
    cauchy += new_F @ A @ ti.transposed(new_F)
    stress = -(dt * p_vol * 4 * inv_dx * inv_dx) * cauchy
    affine = stress + mass * C[f, p]
    for i in ti.static(range(3)):
      for j in ti.static(range(3)):
        for k in ti.static(range(3)):
          offset = ti.Vector([i, j, k])
          dpos = (ti.cast(ti.Vector([i, j, k]), real) - fx) * dx
          weight = w[i](0) * w[j](1) * w[k](2)
          grid_v_in[base + offset].atomic_add(
              weight * (mass * v[f, p] + affine @ dpos))
          grid_m_in[base + offset].atomic_add(weight * mass)
github yuanming-hu / taichi / examples / difftaichi / diffmpm3d.py View on Github external
def g2p(f: ti.i32):
  for p in range(0, n_particles):
    base = ti.cast(x[f, p] * inv_dx - 0.5, ti.i32)
    fx = x[f, p] * inv_dx - ti.cast(base, real)
    w = [
        0.5 * ti.sqr(1.5 - fx), 0.75 - ti.sqr(fx - 1.0), 0.5 * ti.sqr(fx - 0.5)
    ]
    new_v = ti.Vector(zero_vec())
    new_C = ti.Matrix(zero_matrix())

    for i in ti.static(range(3)):
      for j in ti.static(range(3)):
        for k in ti.static(range(3)):
          dpos = ti.cast(ti.Vector([i, j, k]), real) - fx
          g_v = grid_v_out[base(0) + i, base(1) + j, base(2) + k]
          weight = w[i](0) * w[j](1) * w[k](2)
          new_v += weight * g_v
          new_C += 4 * weight * ti.outer_product(g_v, dpos) * inv_dx

    v[f + 1, p] = new_v
    x[f + 1, p] = x[f, p] + dt * v[f + 1, p]
    C[f + 1, p] = new_C