22
33import jax .numpy as jnp
44from jax import jit , vmap , lax
5+ import jax .debug as db
56from jax .tree_util import register_pytree_node_class
67
78from diffmpm .element import _Element
@@ -45,8 +46,7 @@ def __init__(
4546 self .element_ids = element_ids
4647 if len (loc .shape ) != 3 :
4748 raise ValueError (
48- f"`loc` should be of size (nparticles, 1, ndim); "
49- f"found { loc .shape } "
49+ f"`loc` should be of size (nparticles, 1, ndim); " f"found { loc .shape } "
5050 )
5151 self .loc = loc
5252
@@ -140,16 +140,13 @@ def set_mass_volume(self, m: float | jnp.ndarray):
140140 self .mass = m
141141 else :
142142 raise ValueError (
143- f"Incompatible shapes. Expected { self .mass .shape } , "
144- f"found { m .shape } ."
143+ f"Incompatible shapes. Expected { self .mass .shape } , " f"found { m .shape } ."
145144 )
146145 self .volume = jnp .divide (self .mass , self .material .properties ["density" ])
147146
148147 def compute_volume (self , elements : _Element ):
149148 elements .compute_volume ()
150- particles_per_element = jnp .bincount (
151- self .element_ids , length = len (elements .ids )
152- )
149+ particles_per_element = jnp .bincount (self .element_ids , length = len (elements .ids ))
153150 vol = (
154151 elements .volume .squeeze ((1 , 2 ))[self .element_ids ]
155152 / particles_per_element [self .element_ids ]
@@ -238,29 +235,26 @@ def compute_strain(self, elements: _Element, dt: float):
238235 dt : float
239236 Timestep.
240237 """
241- mapped_coords = vmap (elements .id_to_node_loc )(self .element_ids ).squeeze (
242- 2
243- )
238+ mapped_coords = vmap (elements .id_to_node_loc )(self .element_ids ).squeeze (2 )
244239 dn_dx_ = vmap (elements .shapefn_grad )(
245240 self .reference_loc [:, jnp .newaxis , ...], mapped_coords
246241 )
247242 self .strain_rate = self ._compute_strain_rate (dn_dx_ , elements )
248243 self .dstrain = self .dstrain .at [:].set (self .strain_rate * dt )
244+
245+ # db.print(f"compute_strain() - dstrain: {self.dstrain.squeeze()[3, :2]}")
249246 self .strain = self .strain .at [:].add (self .dstrain )
247+ # db.print(f"compute_strain() - strain: {self.strain.squeeze()[3, :2]}")
250248 centroids = jnp .zeros_like (self .loc )
251249 dn_dx_centroid_ = vmap (elements .shapefn_grad )(
252250 centroids [:, jnp .newaxis , ...], mapped_coords
253251 )
254- strain_rate_centroid = self ._compute_strain_rate (
255- dn_dx_centroid_ , elements
256- )
252+ strain_rate_centroid = self ._compute_strain_rate (dn_dx_centroid_ , elements )
257253 ndim = self .loc .shape [- 1 ]
258- self .dvolumetric_strain = dt * strain_rate_centroid [:, :ndim ].sum (
259- axis = 1
254+ self .dvolumetric_strain = dt * strain_rate_centroid [:, :ndim ].sum (axis = 1 )
255+ self .volumetric_strain_centroid = self .volumetric_strain_centroid .at [:].add (
256+ self .dvolumetric_strain
260257 )
261- self .volumetric_strain_centroid = self .volumetric_strain_centroid .at [
262- :
263- ].add (self .dvolumetric_strain )
264258
265259 def _compute_strain_rate (self , dn_dx : jnp .ndarray , elements : _Element ):
266260 """
@@ -279,6 +273,7 @@ def _compute_strain_rate(self, dn_dx: jnp.ndarray, elements: _Element):
279273 self .element_ids
280274 ) # (nparticles, 2, 1)
281275
276+ # db.print(f"mapped_val[3]: {mapped_vel[3, :, 0]}")
282277 # TODO: This will need to change to be more general for ndim.
283278 # breakpoint()
284279 # L = jnp.einsum("ijk, ikj -> ijk", dn_dx, mapped_vel.squeeze(-1)).sum(
@@ -295,9 +290,7 @@ def _step(pid, args):
295290 matmul = dndx [pid ].T @ nvel [pid ]
296291 strain_rate = strain_rate .at [pid , 0 ].add (matmul [0 , 0 ])
297292 strain_rate = strain_rate .at [pid , 1 ].add (matmul [1 , 1 ])
298- strain_rate = strain_rate .at [pid , 3 ].add (
299- matmul [0 , 1 ] + matmul [1 , 0 ]
300- )
293+ strain_rate = strain_rate .at [pid , 3 ].add (matmul [0 , 1 ] + matmul [1 , 0 ])
301294 return dndx , nvel , strain_rate
302295
303296 args = (dn_dx , temp , strain_rate )
@@ -314,18 +307,12 @@ def compute_stress(self, *args):
314307 particles. The stress calculated by the material is then
315308 added to the particles current stress values.
316309 """
317- self .stress = self .stress .at [:].add (
318- self .material .compute_stress (self .dstrain )
319- )
310+ self .stress = self .stress .at [:].add (self .material .compute_stress (self .dstrain ))
320311
321312 def update_volume (self , * args ):
322313 """Update volume based on central strain rate."""
323- self .volume = self .volume .at [:, 0 , :].multiply (
324- 1 + self .dvolumetric_strain
325- )
326- self .density = self .density .at [:, 0 , :].divide (
327- 1 + self .dvolumetric_strain
328- )
314+ self .volume = self .volume .at [:, 0 , :].multiply (1 + self .dvolumetric_strain )
315+ self .density = self .density .at [:, 0 , :].divide (1 + self .dvolumetric_strain )
329316
330317
331318if __name__ == "__main__" :
0 commit comments