@@ -61,7 +61,7 @@ def __init__(self, u, material, quadrature_degree=2, bcs=None):
6161 # compute Gauss points numbers
6262 self .ngauss = Function (self .W0 ).vector ().local_size ()
6363 # Set data manager
64- self .material .set_data_manager (self .quadrature_degree , self . ngauss , self . mesh )
64+ self .material .set_data_manager (self .ngauss )
6565 # dummy function used for computing global quantity
6666 self ._dummy_function = Function (self .W0 )
6767
@@ -90,14 +90,6 @@ def __init__(self, u, material, quadrature_degree=2, bcs=None):
9090
9191 self .dt = 0
9292
93- if self .material .rotation_matrix is not None :
94- if isinstance (self .material .rotation_matrix , (list , tuple , np .ndarray )):
95- self .rotation_values = np .asarray (self .material .rotation_matrix ).ravel ()
96- else :
97- self .rotation_values = compute_on_quadrature (self .material .rotation_matrix ,
98- self .mesh , self .quadrature_degree )
99- self .rotation_values = self .rotation_values .vector ().get_local ()
100-
10193 self .state_variables = {"internal" : None ,
10294 "external" : dict .fromkeys (self .material .get_external_state_variable_names (), None )}
10395 self .gradients = dict .fromkeys (self .material .get_gradient_names (), None )
@@ -202,9 +194,12 @@ def register_external_state_variable(self, name, expression):
202194 vtype = self .material .behaviour .external_state_variables [pos ].type
203195 if vtype != mgis_bv .VariableType .Scalar :
204196 raise NotImplementedError ("Only scalar external state variables are handled" )
205- if type (expression ) == float :
206- expression = Constant (expression )
207- self .state_variables ["external" ].update ({name : Var (self .u , expression , name )})
197+ if isinstance (expression , Constant ):
198+ self .state_variables ["external" ].update ({name : expression })
199+ elif type (expression ) == float :
200+ self .state_variables ["external" ].update ({name : Constant (expression )})
201+ else :
202+ self .state_variables ["external" ].update ({name : Var (self .u , expression , name )})
208203
209204 def set_loading (self , Fext ):
210205 """
@@ -217,20 +212,38 @@ def set_loading(self, Fext):
217212 """
218213 self ._Fext = ufl .replace (Fext , {self .u : self .u_ })
219214
215+ def set_quadrature_function_spaces (self ):
216+ cell = self .mesh .ufl_cell ()
217+ W0e = get_quadrature_element (cell , self .quadrature_degree )
218+ # scalar quadrature space
219+ self .W0 = FunctionSpace (self .mesh , W0e )
220+ # compute Gauss points numbers
221+ self .ngauss = Function (self .W0 ).vector ().local_size ()
222+ # Set data manager
223+ self .material .set_data_manager (self .ngauss )
224+
225+ # Get strain measure dimension
226+ self .strain_dim = ufl .shape (self .strain_measure (self .u ))[0 ]
227+ # Define quadrature spaces for stress/strain and tangent matrix
228+ Wsige = get_quadrature_element (cell , self .quadrature_degree , self .strain_dim )
229+ # stress/strain quadrature space
230+ self .Wsig = FunctionSpace (self .mesh , Wsige )
231+ Wce = get_quadrature_element (cell , self .quadrature_degree , (self .strain_dim , self .strain_dim ))
232+ # tangent matrix quadrature space
233+ self .WCt = FunctionSpace (self .mesh , Wce )
234+
220235 def initialize_external_state_variables (self ):
221236 for (s , size ) in zip (self .material .get_external_state_variable_names (), self .material .get_external_state_variable_sizes ()):
222237 state_var = self .state_variables ["external" ][s ]
223- if isinstance (state_var , Constant ):
224- mgis_bv .setExternalStateVariable (self .material .data_manager .s0 , s , float (state_var ))
225- else :
226- if isinstance (state_var , Var ):
227- state_var .initialize_function (self .mesh , self .quadrature_degree )
228- values = state_var .function .vector ().get_local ()
229- else :
230- values = compute_on_quadrature (state_var , self .mesh ,
231- self .quadrature_degree ).vector ().get_local ()
238+ if isinstance (state_var , Gradient ):
239+ state_var .initialize_function (self .mesh , self .quadrature_degree )
240+ values = state_var .function .vector ().get_local ()
232241 mgis_bv .setExternalStateVariable (self .material .data_manager .s0 , s ,
233242 values , mgis_bv .MaterialStateManagerStorageMode .LocalStorage )
243+ elif isinstance (state_var , Constant ):
244+ mgis_bv .setExternalStateVariable (self .material .data_manager .s0 , s , float (state_var ))
245+ else :
246+ raise ValueError ("External state variable '{}' has not been registered." .format (s ))
234247
235248 def initialize_gradients (self ):
236249 buff = 0
@@ -274,7 +287,7 @@ def initialize_tangent_blocks(self):
274287 except :
275288 value = self .state_variables ["external" ].get (t [1 ], None )
276289 if value is not None and isinstance (value , Var ):
277- flux_gradients .append (value )
290+ flux_gradients .append (value )
278291 else :
279292 raise ValueError ("'{}' could not be associated with a registered gradient or state variable." .format (t [1 ]))
280293 self .fluxes [f ].initialize_tangent_blocks (flux_gradients )
@@ -334,23 +347,15 @@ def update_tangent_blocks(self):
334347 except KeyError :
335348 raise KeyError ("'{}' could not be found as a flux or an internal state variable." )
336349 block_shape = self .flattened_block_shapes [i ]
337- tang_block_vals = self .material .data_manager .K [:,buff :buff + block_shape ].ravel ()
338- if self .material .rotation_matrix is not None :
339- mgis_bv .rotateTangentOperatorBlocks (tang_block_vals , self .material .behaviour ,
340- self .rotation_values )
341- t .vector ().set_local (tang_block_vals )
350+ t .vector ().set_local (self .material .data_manager .K [:,buff :buff + block_shape ].flatten ())
342351 buff += block_shape
343352
344353 def update_fluxes (self ):
345354 buff = 0
346355 for (i , f ) in enumerate (self .material .get_flux_names ()):
347356 flux = self .fluxes [f ]
348357 block_shape = self .material .get_flux_sizes ()[i ]
349- flux_vals = self .material .data_manager .s1 .thermodynamic_forces [:,buff :buff + block_shape ].ravel ()
350- if self .material .rotation_matrix is not None :
351- mgis_bv .rotateThermodynamicForces (flux_vals , self .material .behaviour ,
352- self .rotation_values )
353- flux .function .vector ().set_local (flux_vals )
358+ flux .function .vector ().set_local (self .material .data_manager .s1 .thermodynamic_forces [:,buff :buff + block_shape ].flatten ())
354359 buff += block_shape
355360
356361 def update_gradients (self ):
@@ -360,9 +365,6 @@ def update_gradients(self):
360365 gradient .update ()
361366 block_shape = self .material .get_gradient_sizes ()[i ]
362367 grad_vals = gradient .function .vector ().get_local ()
363- if self .material .rotation_matrix is not None :
364- mgis_bv .rotateGradients (grad_vals , self .material .behaviour ,
365- self .rotation_values )
366368 if gradient .shape > 0 :
367369 grad_vals = grad_vals .reshape ((self .material .data_manager .n , gradient .shape ))
368370 else :
@@ -382,8 +384,7 @@ def update_internal_state_variables(self):
382384 def update_constitutive_law (self ):
383385 """Performs the consitutive law update"""
384386 self .update_gradients ()
385- self .material .update_external_state_variables (self .quadrature_degree , self .mesh ,
386- self .state_variables ["external" ])
387+ self .material .update_external_state_variables (self .state_variables ["external" ])
387388 # integrate the behaviour
388389 mgis_bv .integrate (self .material .data_manager , self .integration_type ,
389390 self .dt , 0 , self .material .data_manager .n );
0 commit comments