Adjust normalization step of nudge routine #43
1 changed files with 13 additions and 6 deletions
|
@ -5,7 +5,7 @@ use std::{collections::BTreeSet, sync::atomic::{AtomicU64, Ordering}};
|
|||
use sycamore::prelude::*;
|
||||
use web_sys::{console, wasm_bindgen::JsValue}; /* DEBUG */
|
||||
|
||||
use crate::engine::{realize_gram, local_unif_to_std, ConfigSubspace, PartialMatrix, Q};
|
||||
use crate::engine::{realize_gram, local_unif_to_std, ConfigSubspace, PartialMatrix};
|
||||
|
||||
// the types of the keys we use to access an assembly's elements and constraints
|
||||
pub type ElementKey = usize;
|
||||
|
@ -371,8 +371,8 @@ impl Assembly {
|
|||
}
|
||||
}
|
||||
|
||||
// step each element along the mass shell geodesic that matches its
|
||||
// velocity in the deformation found above
|
||||
// step the assembly along the deformation. this changes the elements'
|
||||
// normalizations, so we restore those afterward
|
||||
/* KLUDGE */
|
||||
// since our test assemblies only include spheres, we assume that every
|
||||
// element is on the 1 mass shell
|
||||
|
@ -380,9 +380,16 @@ impl Assembly {
|
|||
elt.representation.update_silent(|rep| {
|
||||
match elt.column_index {
|
||||
Some(column_index) => {
|
||||
let rep_next = &*rep + motion_proj.column(column_index);
|
||||
let normalizer = rep_next.dot(&(&*Q * &rep_next));
|
||||
rep.set_column(0, &(rep_next / normalizer));
|
||||
// step the assembly along the deformation
|
||||
*rep += motion_proj.column(column_index);
|
||||
|
||||
// restore normalization by contracting toward the last
|
||||
// coordinate axis
|
||||
let q_sp = rep.fixed_rows::<3>(0).norm_squared();
|
||||
let half_q_lt = -2.0 * rep[3] * rep[4];
|
||||
let half_q_lt_sq = half_q_lt * half_q_lt;
|
||||
let scaling = half_q_lt + (q_sp + half_q_lt_sq).sqrt();
|
||||
rep.fixed_rows_mut::<4>(0).scale_mut(1.0 / scaling);
|
||||
},
|
||||
None => {
|
||||
console::log_1(&JsValue::from(
|
||||
|
|
Loading…
Add table
Reference in a new issue