@@ -180,16 +180,12 @@ end
180180function setup_solver_cache (wrapper:: BackwardEulerStageAnnotation , solver:: AbstractNonlinearSolver )
181181 _setup_solver_cache (wrapper, wrapper. f, solver)
182182end
183- @inline function _setup_solver_cache (wrapper:: BackwardEulerStageAnnotation , f:: QuasiStaticFunction , solver:: MultiLevelNewtonRaphsonSolver )
184- @unpack integrator, dh = f
185- @unpack volume_model, face_model = integrator
186- @unpack local_solver, newton = solver
187-
188- # TODO add an abstraction layer to autoamte the steps below
189- singleQsize = local_function_size (f)
190- local_solver_cache = GenericLocalNonlinearSolverCache (
183+ function _setup_local_solver_cache (local_solver:: GenericLocalNonlinearSolver , material_model:: AbstractMaterialModel )
184+ singleQsize = local_function_size (material_model)
185+ @debug " Setting up local nonlinear solver with size(Q)=$(singleQsize) for material $(material_model) " _group= :nlsolve
186+ return GenericLocalNonlinearSolverCache (
191187 # Solver parameters
192- solver . local_solver,
188+ local_solver,
193189 # Buffers
194190 zeros (singleQsize, singleQsize),
195191 zeros (singleQsize),
199195 # Local convergence
200196 SciMLBase. ReturnCode. Default,
201197 )
198+ end
199+ function _setup_local_solver_cache (local_solver:: GenericLocalNonlinearSolver , material_models:: MultiMaterialModel )
200+ return map (material_model -> _setup_local_solver_cache (local_solver, material_model), material_models. materials)
201+ end
202+ @inline function _setup_solver_cache (wrapper:: BackwardEulerStageAnnotation , f:: QuasiStaticFunction , solver:: MultiLevelNewtonRaphsonSolver )
203+ @unpack integrator, dh = f
204+ @unpack volume_model, face_model = integrator
205+ @unpack local_solver, newton = solver
206+
207+ # TODO add an abstraction layer to autoamte the steps below
208+ local_solver_cache = _setup_local_solver_cache (solver. local_solver, f. integrator. volume_model. material_model)
202209
203210 # Extract condensable parts
204211 Q = @view wrapper. u[(ndofs (dh)+ 1 ): end ]
@@ -237,10 +244,13 @@ end
237244
238245 newton_cache = NewtonRaphsonSolverCache (op, residual, newton, inner_cache, T[], 0 )
239246
240- return MultiLevelNewtonRaphsonSolverCache (
247+ cache = MultiLevelNewtonRaphsonSolverCache (
241248 newton_cache, # setup_solver_cache(G, solver.newton),
242249 local_solver_cache, # setup_solver_cache(L, solver.local_newton), # FIXME pass
243250 )
251+ @debug " Setting up Multi-Level Newton-Raphson solver." _group= :nlsolve
252+ @debug cache _group= :nlsolve
253+ return cache
244254end
245255
246256# TODO Refactor the setup into generic parts and use multiple dispatch for the specifics.
347357 n_ivs_per_qp = local_function_size (material_model)
348358 return GenericFirstOrderRateIndependentCondensationMaterialStateCache (
349359 # Pass the model
350- wrapper . f ,
360+ material_model ,
351361 # And some cache to speed up evaluation of f and associated coefficients
352362 internal_cache,
353363 # Pass global solution info
356366 # Current time step length
357367 wrapper. Δt,
358368 # Local nonlinear solver cache
359- wrapper. local_solver_cache,
369+ wrapper. local_solver_cache[idx] ,
360370 # This one holds information about the local dofs inside u and uprev
361371 wrapper. lvh,
362372 # Buffer for Q and Qprev
@@ -367,13 +377,12 @@ end
367377 idx += 1
368378 end
369379 error (" MultiDomainIntegrator is broken: Requested to construct an element cache for a SubDofHandler which is not associated with the integrator." )
370-
371380end
372- function setup_internal_cache_backward_euler_unwrap (wrapper:: BackwardEulerStageFunctionWrapper{<:QuasiStaticModel} , material_model:: AbstractMaterialModel internal_cache:: Union{RateIndependentCondensationMaterialStateCache, RateDependentCondensationMaterialStateCache} , qr:: QuadratureRule , sdh:: SubDofHandler )
373- n_ivs_per_qp = local_function_size (wrapper . f . material_model)
381+ function setup_internal_cache_backward_euler_unwrap (wrapper:: BackwardEulerStageFunctionWrapper{<:QuasiStaticModel} , material_model:: AbstractMaterialModel , internal_cache:: Union{RateIndependentCondensationMaterialStateCache, RateDependentCondensationMaterialStateCache} , qr:: QuadratureRule , sdh:: SubDofHandler )
382+ n_ivs_per_qp = local_function_size (material_model)
374383 return GenericFirstOrderRateIndependentCondensationMaterialStateCache (
375384 # Pass the model
376- wrapper . f ,
385+ material_model ,
377386 # And some cache to speed up evaluation of f and associated coefficients
378387 internal_cache,
379388 # Pass global solution info
@@ -391,7 +400,7 @@ function setup_internal_cache_backward_euler_unwrap(wrapper::BackwardEulerStageF
391400 )
392401end
393402function setup_internal_cache (wrapper:: BackwardEulerStageFunctionWrapper{<:QuasiStaticModel} , qr:: QuadratureRule , sdh:: SubDofHandler )
394- return setup_internal_cache_backward_euler_unwrap (wrapper, setup_internal_cache (wrapper. f. material_model, qr, sdh), qr, sdh)
403+ return setup_internal_cache_backward_euler_unwrap (wrapper, wrapper . f . material_model, setup_internal_cache (wrapper. f. material_model, qr, sdh), qr, sdh)
395404end
396405
397406function setup_boundary_cache (wrapper:: BackwardEulerStageFunctionWrapper , fqr, sdh)
0 commit comments