@@ -55,6 +55,7 @@ def __init__(
5555 jnp .ones_like (self .mass ) * self .material .properties ["density" ]
5656 )
5757 self .volume = jnp .ones_like (self .mass )
58+ self .size = jnp .zeros_like (self .loc )
5859 self .velocity = jnp .zeros_like (self .loc )
5960 self .acceleration = jnp .zeros_like (self .loc )
6061 self .momentum = jnp .zeros_like (self .loc )
@@ -63,13 +64,15 @@ def __init__(
6364 self .strain_rate = jnp .zeros ((self .loc .shape [0 ], 6 , 1 ))
6465 self .dstrain = jnp .zeros ((self .loc .shape [0 ], 6 , 1 ))
6566 self .f_ext = jnp .zeros_like (self .loc )
67+ self .traction = jnp .zeros_like (self .loc )
6668 self .reference_loc = jnp .zeros_like (self .loc )
6769 self .volumetric_strain_centroid = jnp .zeros ((self .loc .shape [0 ], 1 ))
6870 else :
6971 (
7072 self .mass ,
7173 self .density ,
7274 self .volume ,
75+ self .size ,
7376 self .velocity ,
7477 self .acceleration ,
7578 self .momentum ,
@@ -78,6 +81,7 @@ def __init__(
7881 self .strain_rate ,
7982 self .dstrain ,
8083 self .f_ext ,
84+ self .traction ,
8185 self .reference_loc ,
8286 self .volumetric_strain_centroid ,
8387 ) = data
@@ -91,6 +95,7 @@ def tree_flatten(self):
9195 self .mass ,
9296 self .density ,
9397 self .volume ,
98+ self .size ,
9499 self .velocity ,
95100 self .acceleration ,
96101 self .momentum ,
@@ -99,6 +104,7 @@ def tree_flatten(self):
99104 self .strain_rate ,
100105 self .dstrain ,
101106 self .f_ext ,
107+ self .traction ,
102108 self .reference_loc ,
103109 self .volumetric_strain_centroid ,
104110 )
@@ -152,6 +158,7 @@ def compute_volume(self, elements, total_elements):
152158 / particles_per_element [self .element_ids ]
153159 )
154160 self .volume = self .volume .at [:, 0 , 0 ].set (vol )
161+ self .size = self .size .at [:].set (self .volume ** (1 / self .size .shape [- 1 ]))
155162 self .mass = self .mass .at [:, 0 , 0 ].set (vol * self .density .squeeze ())
156163
157164 def update_natural_coords (self , elements : _Element ):
@@ -304,6 +311,14 @@ def update_volume(self, *args):
304311 self .volume = self .volume .at [:, 0 , :].multiply (1 + self .dvolumetric_strain )
305312 self .density = self .density .at [:, 0 , :].divide (1 + self .dvolumetric_strain )
306313
314+ def assign_traction (self , pids , dir , traction_ ):
315+ self .traction = self .traction .at [pids , 0 , dir ].add (
316+ traction_ * self .volume [pids , 0 , 0 ] / self .size [pids , 0 , dir ]
317+ )
318+
319+ def zero_traction (self , * args ):
320+ self .traction = self .traction .at [:].set (0 )
321+
307322
308323if __name__ == "__main__" :
309324 from diffmpm .material import SimpleMaterial
0 commit comments