Alamo
Mechanics.H
Go to the documentation of this file.
1#ifndef INTEGRATOR_BASE_MECHANICS_H
2#define INTEGRATOR_BASE_MECHANICS_H
3
4#include "AMReX.H"
10#include "Numeric/Stencil.H"
11#include "Model/Solid/Solid.H"
14#include "Operator/Operator.H"
15#include "IC/Constant.H"
16#include "IC/Expression.H"
17#include "IC/Trig.H"
18
19namespace Integrator
20{
21namespace Base
22{
23template<class MODEL>
24class Mechanics: virtual public Integrator
25{
26public:
27
29
31 {}
32
34 {
35 delete ic_rhs;
36 delete velocity_ic;
37 delete bc;
38 }
39
40 // The mechanics integrator manages the solution of an elastic
41 // solve using the MLMG solver.
42 static void Parse(Mechanics& value, IO::ParmParse& pp)
43 {
44 BL_PROFILE("Integrator::Base::Mechanics::Parse");
45 if (pp.contains("type"))
46 {
47 std::string type_str;
48 // Type of mecahnics to use.
49 // Static: do full implicit solve.
50 // Dynamic: evolve dynamic equations with explicit dynamics
51 // Disable: do nothing.
52 pp_query_validate("type", type_str, {"disable","static","dynamic"});
53 if (type_str == "static") value.m_type = Type::Static;
54 else if (type_str == "dynamic") value.m_type = Type::Dynamic;
55 else if (type_str == "disable") value.m_type = Type::Disable;
56 else Util::Abort(INFO, "Invalid type ", type_str, " specified");
57 }
58 if (value.m_type == Type::Disable) return;
59
60 // Treat mechanics fields as changing in time. [false]
61 // You should use this if you care about other physics driven by
62 // the output of this integrator.
63 pp_query_default("time_evolving", value.m_time_evolving,false);
64
65 pp_query_default("plot_disp", value.plot_disp, true); // Include displacement field in output
66 pp_query_default("plot_rhs", value.plot_rhs, true); // Include right-hand side in output
67 pp_query_default("plot_psi", value.plot_psi, true); // Include :math:`\psi` field in output
68 pp_query_default("plot_stress", value.plot_stress, true); // Include stress in output
69 pp_query_default("plot_strain", value.plot_strain, true); // Include strain in output
70
71 value.RegisterGeneralFab(value.disp_mf, 1, 2, value.plot_disp, "disp", value.m_time_evolving);
72 value.RegisterGeneralFab(value.rhs_mf, 1, 2, value.plot_rhs, "rhs", value.m_time_evolving);
73 value.RegisterGeneralFab(value.stress_mf, 1, 2, value.plot_stress, "stress", value.m_time_evolving);
74 value.RegisterGeneralFab(value.strain_mf, 1, 2, value.plot_strain, "strain", value.m_time_evolving);
75
76 if (value.m_type == Type::Static)
77 {
78 // Read parameters for :ref:`Solver::Nonlocal::Newton` solver
79 pp_queryclass("solver", value.solver);
80 }
81 if (value.m_type == Type::Dynamic)
82 {
83 value.RegisterGeneralFab(value.vel_mf, 1, 2, "vel",true);
84 value.RegisterGeneralFab(value.disp_old_mf, 1, 2, "dispold");
85 value.RegisterGeneralFab(value.vel_old_mf, 1, 2, "velold");
86 value.RegisterGeneralFab(value.ddw_mf, 1, 2);
87 pp_forbid("viscous.mu","replaced with viscous.mu_dashpot");
88 pp_query_default("viscous.mu_dashpot", value.mu_dashpot,0.0); // Dashpot damping (damps velocity)
89 pp_forbid("viscous.mu2","replaced with viscous.mu_newton");
90 pp_query_default("viscous.mu_newton", value.mu_newton,0.0); // Newtonian viscous damping (damps velocity gradient)
91
92 std::string velocity_ic_str;
93 pp_query_validate("velocity.ic.type",velocity_ic_str,{"none","expression"}); // Initializer for RHS
94 if (velocity_ic_str == "expression") value.velocity_ic = new IC::Expression(value.geom, pp,"velocity.ic.expression");
95 }
96
97 // Select the mechanical boundary conditions
99
100 pp_query_default("print_model", value.m_print_model, false); // Print out model variables (if enabled by model)
101 if (value.m_print_model) value.RegisterGeneralFab(value.model_mf, 1, 2, "model", value.m_time_evolving);
102 else value.RegisterGeneralFab(value.model_mf, 1, 2, value.m_time_evolving);
103
104 // This if is here because the code currently allows for no
105 // body force to be defined, in which case value.ic_rhs is set to
106 // a nullptr. This should eventually be fixed - this is a stopgap.
107 if (pp.contains("rhs.type"))
108 // initial condition for right hand side (body force)
109 pp.select<IC::Constant,IC::Expression,IC::Trig>("rhs",value.ic_rhs,value.geom);
110
111 // Timestep interval for elastic solves (default - solve every time)
112 pp_query_default("interval", value.m_interval, 0);
113
114 value.RegisterIntegratedVariable(&(value.disp_hi[0].data()[0]), "disp_xhi_x");
115 value.RegisterIntegratedVariable(&(value.disp_hi[0].data()[1]), "disp_xhi_y");
116 value.RegisterIntegratedVariable(&(value.disp_hi[1].data()[0]), "disp_yhi_x");
117 value.RegisterIntegratedVariable(&(value.disp_hi[1].data()[1]), "disp_yhi_y");
118 value.RegisterIntegratedVariable(&(value.trac_hi[0].data()[0]), "trac_xhi_x");
119 value.RegisterIntegratedVariable(&(value.trac_hi[0].data()[1]), "trac_xhi_y");
120 value.RegisterIntegratedVariable(&(value.trac_hi[1].data()[0]), "trac_yhi_x");
121 value.RegisterIntegratedVariable(&(value.trac_hi[1].data()[1]), "trac_yhi_y");
122
123 // Maximum multigrid coarsening level (default - none, maximum coarsening)
124 pp_query_default("max_coarsening_level", value.m_max_coarsening_level,-1);
125
126 // Whether to include residual output field
127 pp_query_default("print_residual", value.m_print_residual,false);
128 if (value.m_print_residual) value.RegisterGeneralFab(value.res_mf, 1, 2, "res", false);
129
130 // Whether to refine based on elastic solution
131 pp_query_default("elastic_ref_threshold", value.m_elastic_ref_threshold,0.01);
132
133 // Set this to true to zero out the displacement before each solve.
134 // (This is a temporary fix - we need to figure out why this is needed.)
135 pp_query_default("zero_out_displacement", value.m_zero_out_displacement,false);
136
137 // Time to start doing the elastic solve (by default, start immediately)
138 pp_query_default("tstart", value.tstart,-1.0);
139
140
141 // Relative tolerance in mechanics solve
142 pp.query_default("tol_rel",value.tol_rel,1E-8);
143
144 // Absolute tolerance in mechanics solve
145 pp.query_default("tol_abs",value.tol_abs,1E-8);
146 }
147
148protected:
149 /// \brief Use the #ic object to initialize#Temp
150 void Initialize(int lev) override
151 {
152 BL_PROFILE("Integrator::Base::Mechanics::Initialize");
154
155 disp_mf[lev]->setVal(Set::Vector::Zero());
156 //disp_old_mf[lev]->setVal(Set::Vector::Zero());
157
158 if (m_type == Type::Dynamic)
159 if (velocity_ic)
160 {
162 }
163
164 if (ic_rhs) ic_rhs->Initialize(lev, rhs_mf);
165 else rhs_mf[lev]->setVal(Set::Vector::Zero());
166 }
167
168 virtual void UpdateModel(int a_step, Set::Scalar a_time) = 0;
169
170 virtual void TimeStepBegin(Set::Scalar a_time, int a_step) override
171 {
172 BL_PROFILE("Integrator::Base::Mechanics::TimeStepBegin");
174
175 for (int lev = 0; lev <= finest_level; ++lev)
176 {
177 if (m_zero_out_displacement) disp_mf[lev]->setVal(Set::Vector::Zero());
178 rhs_mf[lev]->setVal(Set::Vector::Zero());
179 if (ic_rhs) ic_rhs->Initialize(lev, rhs_mf);
180 }
181
182 UpdateModel(a_step, a_time);
183
184 bc->SetTime(a_time);
185 bc->Init(rhs_mf, geom);
186
188 if (a_time < tstart) return;
189 if (m_interval && a_step % m_interval) return;
190
191 amrex::LPInfo info;
192 if (m_max_coarsening_level >= 0)
193 info.setMaxCoarseningLevel(m_max_coarsening_level);
194 Operator::Elastic<MODEL::sym> elastic_op(Geom(0, finest_level), grids, DistributionMap(0, finest_level), info);
195 elastic_op.SetUniform(false);
196 elastic_op.SetHomogeneous(false);
197 elastic_op.SetBC(bc);
198 IO::ParmParse pp("elasticop");
199 pp_queryclass(elastic_op);
200
201 solver.Define(elastic_op);
205 solver.Clear();
206
207 for (int lev = 0; lev <= disp_mf.finest_level; lev++)
208 {
209 amrex::Box domain = geom[lev].Domain();
210 domain.convert(amrex::IntVect::TheNodeVector());
211
212 const amrex::Real* DX = geom[lev].CellSize();
213 for (MFIter mfi(*disp_mf[lev], false); mfi.isValid(); ++mfi)
214 {
215 amrex::Box bx = mfi.nodaltilebox();
216 bx.grow(2);
217 bx = bx & domain;
218 amrex::Array4<MODEL> const& model = model_mf[lev]->array(mfi);
219 amrex::Array4<Set::Matrix> const& stress = stress_mf[lev]->array(mfi);
220 amrex::Array4<Set::Matrix> const& strain = strain_mf[lev]->array(mfi);
221 amrex::Array4<const Set::Vector> const& disp = disp_mf[lev]->array(mfi);
222
223
224 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
225 {
226 auto sten = Numeric::GetStencil(i, j, k, bx);
227 if (model(i, j, k).kinvar == Model::Solid::KinematicVariable::F)
228 {
229 Set::Matrix F = Set::Matrix::Identity() + Numeric::Gradient(disp, i, j, k, DX, sten);
230 stress(i, j, k) = model(i, j, k).DW(F);
231 strain(i, j, k) = F;
232 }
233 else
234 {
235 Set::Matrix gradu = Numeric::Gradient(disp, i, j, k, DX, sten);
236 stress(i, j, k) = model(i, j, k).DW(gradu);
237 strain(i, j, k) = 0.5 * (gradu + gradu.transpose());
238 }
239 });
240 }
241 Util::RealFillBoundary(*stress_mf[lev], geom[lev]);
242 Util::RealFillBoundary(*strain_mf[lev], geom[lev]);
243 }
244 }
245
246 void Advance(int lev, Set::Scalar time, Set::Scalar dt) override
247 {
248 BL_PROFILE("Integrator::Base::Mechanics::Advance");
250 const amrex::Real* DX = geom[lev].CellSize();
251
252 amrex::Box domain = geom[lev].Domain();
253 domain.convert(amrex::IntVect::TheNodeVector());
254 const amrex::Dim3 lo = amrex::lbound(domain), hi = amrex::ubound(domain);
255
256 if (m_type == Type::Dynamic)
257 {
258
259 std::swap(*disp_mf[lev], *disp_old_mf[lev]);
260 std::swap(*vel_mf[lev], *vel_old_mf[lev]);
261
262
263 for (amrex::MFIter mfi(*disp_mf[lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
264 {
268
269 Set::Patch<Set::Vector> unew = disp_mf.Patch(lev,mfi);
270 Set::Patch<Set::Vector> vnew = vel_mf.Patch(lev,mfi);
273 //Set::Patch<MATRIX4> ddw = ddw_mf.Patch(lev,mfi);
274 Set::Patch<MODEL> model = model_mf.Patch(lev,mfi);
275
276 amrex::Box bx = mfi.grownnodaltilebox() & domain;
277 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
278 {
279 auto sten = Numeric::GetStencil(i,j,k,bx);
280 eps(i, j, k) = Numeric::Gradient(u, i, j, k, DX,sten);
281 sig(i, j, k) = model(i, j, k).DW(eps(i, j, k));
282 //ddw(i,j,k) = model(i,j,k).DDW(eps(i,j,k));
283 });
284
285 bx = mfi.nodaltilebox() & domain;
286 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
287 {
288
289 bool AMREX_D_DECL(xmin = (i == lo.x), ymin = (j == lo.y), zmin = (k == lo.z));
290 bool AMREX_D_DECL(xmax = (i == hi.x), ymax = (j == hi.y), zmax = (k == hi.z));
291
292 if (AMREX_D_TERM(xmax || xmin, || ymax || ymin, || zmax || zmin))
293 {
294 auto sten = Numeric::GetStencil(i,j,k,domain);
295
296 auto bctype = bc->getType(i,j,k,domain);
297
298 for (int d = 0; d < AMREX_SPACEDIM; d++)
299 {
301 {
302 unew(i,j,k)(d) = b(i,j,k)(d);
303 }
305 {
306
307 Set::Vector N = Set::Normal(AMREX_D_DECL(xmin,ymin,zmin),
308 AMREX_D_DECL(xmax,ymax,zmax));
309
310 auto [phi, offdiag] = Numeric::GradientSplit(u,i,j,k,DX,sten);
311
312 Set::Matrix A = Set::Matrix::Zero();
313 Set::Vector rhs = b(i,j,k);
314 Set::Matrix DW_F0 = model(i,j,k).DW(Set::Matrix::Zero());
315 MATRIX4 ddw = model(i,j,k).DDW(eps(i,j,k));
316 //Util::Message(INFO,b(i,j,k).transpose());
317
318 for (int p = 0; p < AMREX_SPACEDIM; p++)
319 for (int q = 0; q < AMREX_SPACEDIM; q++)
320 {
321 for (int r = 0; r < AMREX_SPACEDIM; r++)
322 for (int s = 0; s < AMREX_SPACEDIM; s++)
323 {
324 A(p,r) += ddw(p,q,r,s) * phi(s) * N(q);
325
326 rhs(p) -= ddw(p,q,r,s) * eps(i,j,k)(r,s) * N(q);
327 }
328
329 rhs(p) -= DW_F0(p,q)*N(q);
330 }
331 Set::Vector delta_u = (A.inverse() * rhs);
332
333 unew(i,j,k)(d) = u(i,j,k)(d) + delta_u(d);
334 vnew(i,j,k)(d) = (unew(i,j,k)(d) - u(i,j,k)(d))/dt;
335 }
336 else
337 {
338 Util::Abort(INFO,"Elastic dynamics not supported for other BCs yet");
339 }
340 }
341 }
342 else
343 {
344 //Set::Matrix gradu = Numeric::Gradient(u,i,j,k,DX);
345 //Set::Matrix3 gradgradu = Numeric::Hessian(u,i,j,k,DX);
346
347 //Set::Vector f = ddw(i,j,k)*gradgradu;
348 Set::Vector f = Numeric::Divergence(sig, i, j, k, DX);
349
350 //MATRIX4 AMREX_D_DECL(
351 // Cgrad1 = (Numeric::Stencil<MATRIX4, 1, 0, 0>::D(ddw, i, j, k, 0, DX)),
352 // Cgrad2 = (Numeric::Stencil<MATRIX4, 0, 1, 0>::D(ddw, i, j, k, 0, DX)),
353 // Cgrad3 = (Numeric::Stencil<MATRIX4, 0, 0, 1>::D(ddw, i, j, k, 0, DX)));
354
355 //f += AMREX_D_TERM( ( Cgrad1*gradu).col(0),
356 // +(Cgrad2*gradu).col(1),
357 // +(Cgrad3*gradu).col(2));
358
359 Set::Vector lapv = Numeric::Laplacian(v, i, j, k, DX);
360 f += mu_newton * lapv + b(i,j,k) - mu_dashpot*v(i,j,k);
361
362 Set::Vector udotdot = f / rho;
363 vnew(i, j, k) = v(i, j, k) + dt * udotdot;
364 unew(i, j, k) = u(i, j, k) + dt * v(i, j, k);
365 }
366 });
367 }
368 }
369
370 for (amrex::MFIter mfi(*disp_mf[lev], false); mfi.isValid(); ++mfi)
371 {
372 amrex::Box bx = mfi.grownnodaltilebox() & domain;
373 amrex::Array4<Set::Matrix> const& eps = (*strain_mf[lev]).array(mfi);
374 amrex::Array4<Set::Matrix> const& sig = (*stress_mf[lev]).array(mfi);
375 amrex::Array4<MODEL> const& model = (*model_mf[lev]).array(mfi);
376 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
377 {
378 model(i, j, k).Advance(dt, eps(i, j, k), sig(i, j, k),time);
379 });
380 }
381 Util::RealFillBoundary(*model_mf[lev], geom[lev]);
382
383 }
384
385 void Integrate(int amrlev, Set::Scalar /*time*/, int /*step*/,
386 const amrex::MFIter& mfi, const amrex::Box& a_box) override
387 {
388 BL_PROFILE("Integrator::Base::Mechanics::Integrate");
389 if (m_type == Type::Disable) return;
390
391 if (amrex::ParallelDescriptor::NProcs() > 1 && a_box.contains(amrex::IntVect::TheZeroVector()) &&
392 amrlev == 0)
393 {
394 Util::Warning(INFO,"There is a known bug when calculating trac/disp in Base::Mechanics in parallel.");
395 Util::Warning(INFO,"The thermo.dat values likely will not be correct; use the boxlib output instead.");
396 }
397
398 const amrex::Real* DX = geom[amrlev].CellSize();
399 amrex::Box domain = geom[amrlev].Domain();
400 domain.convert(amrex::IntVect::TheNodeVector());
401
402 amrex::Box box = a_box;
403 box.convert(amrex::IntVect::TheNodeVector());
404
405
406 //Set::Scalar dv = AMREX_D_TERM(DX[0], *DX[1], *DX[2]);
407#if AMREX_SPACEDIM == 2
408 Set::Vector da0(DX[1], 0);
409 Set::Vector da1(0, DX[0]);
410#elif AMREX_SPACEDIM == 3
411 Set::Vector da(DX[1] * DX[2], 0, 0);
412#endif
413
414 const Dim3 /*lo= amrex::lbound(domain),*/ hi = amrex::ubound(domain);
415 const Dim3 /*boxlo= amrex::lbound(box),*/ boxhi = amrex::ubound(box);
416
417 amrex::Array4<const Set::Matrix> const& stress = (*stress_mf[amrlev]).array(mfi);
418 amrex::Array4<const Set::Vector> const& disp = (*disp_mf[amrlev]).array(mfi);
419 amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k)
420 {
421#if AMREX_SPACEDIM == 2
422 if (i == hi.x && j < boxhi.y)
423 {
424 trac_hi[0] += (0.5 * (stress(i, j, k) + stress(i, j + 1, k)) * da0);
425 disp_hi[0] = disp(i, j, k);
426 }
427 if (j == hi.y && i < boxhi.x)
428 {
429 trac_hi[1] += (0.5 * (stress(i, j, k) + stress(i + 1, j, k)) * da1);
430 disp_hi[1] = disp(i, j, k);
431 }
432#elif AMREX_SPACEDIM == 3
433 if (i == hi.x && (j < boxhi.y && k < boxhi.z))
434 {
435 trac_hi[0] += (0.25 * (stress(i, j, k) + stress(i, j + 1, k)
436 + stress(i, j, k + 1) + stress(i, j + 1, k + 1)) * da);
437 disp_hi[0] = disp(i, j, k);
438 }
439#endif
440 });
441
442 }
443
444 void TagCellsForRefinement(int lev, amrex::TagBoxArray& a_tags, Set::Scalar /*time*/, int /*ngrow*/) override
445 {
446 BL_PROFILE("Integrator::Base::Mechanics::TagCellsForRefinement");
447 if (m_type == Type::Disable) return;
448
449 Set::Vector DX(geom[lev].CellSize());
450 Set::Scalar DXnorm = DX.lpNorm<2>();
451 for (amrex::MFIter mfi(*strain_mf[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi)
452 {
453 amrex::Box bx = mfi.tilebox();
454 bx.convert(amrex::IntVect::TheCellVector());
455 amrex::Array4<char> const& tags = a_tags.array(mfi);
456 amrex::Array4<Set::Matrix> const& eps = strain_mf[lev]->array(mfi);
457 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
458 {
459 Set::Matrix3 grad = Numeric::NodeGradientOnCell(eps, i, j, k, DX.data());
460 if (grad.norm() * DXnorm > m_elastic_ref_threshold)
461 tags(i, j, k) = amrex::TagBox::SET;
462 });
463 }
464 }
465
466protected:
471 bool psi_on = false;
472
473 int m_interval = 0;
475
481
482 // Only use these if using the "dynamics" option
486 //Set::Field<Set::Matrix4<AMREX_SPACEDIM,MODEL::sym>> ddw_mf;
490
491 //Set::Vector trac_lo[AMREX_SPACEDIM];
492 Set::Vector trac_hi[AMREX_SPACEDIM];
493 Set::Vector disp_hi[AMREX_SPACEDIM];
494
495
497
499
502
504 bool m_print_model = false;
505 bool m_print_residual = false;
506 bool m_time_evolving = false;
508
510
511 bool plot_disp = true;
512 bool plot_stress = true;
513 bool plot_strain = true;
514 bool plot_psi = true;
515 bool plot_rhs = true;
516
517
519
521};
522}
523}
524#endif
#define pp_query_validate(...)
Definition ParmParse.H:103
#define pp_query_default(...)
Definition ParmParse.H:102
#define pp_forbid(...)
Definition ParmParse.H:110
#define pp_queryclass(...)
Definition ParmParse.H:109
#define INFO
Definition Util.H:23
void SetTime(const Set::Scalar a_time)
Definition Elastic.H:49
virtual void Init(amrex::MultiFab *a_rhs, const amrex::Geometry &a_geom, bool a_homogeneous=false) const =0
virtual std::array< Type, AMREX_SPACEDIM > getType(const int &i, const int &j, const int &k, const amrex::Box &domain)=0
Pure abstract IC object from which all other IC objects inherit.
Definition IC.H:23
void Initialize(const int &a_lev, Set::Field< T > &a_field, Set::Scalar a_time=0.0)
Definition IC.H:39
Initialize using a trigonometric series.
Definition Trig.H:23
bool contains(std::string name)
Definition ParmParse.H:173
void select(std::string name, PTRTYPE *&ic_eta, Args &&... args)
Definition ParmParse.H:1056
int query_default(std::string name, T &value, T defaultvalue)
Definition ParmParse.H:293
Set::Field< Set::Vector > disp_mf
Definition Mechanics.H:476
virtual void TimeStepBegin(Set::Scalar a_time, int a_step) override
Definition Mechanics.H:170
Set::Field< Set::Matrix > strain_mf
Definition Mechanics.H:480
Set::Field< MATRIX4 > ddw_mf
Definition Mechanics.H:469
IC::IC< Set::Vector > * ic_rhs
Definition Mechanics.H:496
void Integrate(int amrlev, Set::Scalar, int, const amrex::MFIter &mfi, const amrex::Box &a_box) override
Definition Mechanics.H:385
Set::Field< Set::Vector > vel_old_mf
Definition Mechanics.H:485
Set::Field< Set::Vector > vel_mf
Definition Mechanics.H:484
static void Parse(Mechanics &value, IO::ParmParse &pp)
Definition Mechanics.H:42
Set::Scalar m_elastic_ref_threshold
Definition Mechanics.H:503
IC::IC< Set::Vector > * velocity_ic
Definition Mechanics.H:498
Set::Vector disp_hi[AMREX_SPACEDIM]
Definition Mechanics.H:493
void Initialize(int lev) override
Use the #ic object to initialize::Temp.
Definition Mechanics.H:150
Set::Matrix4< AMREX_SPACEDIM, MODEL::sym > MATRIX4
Definition Mechanics.H:467
void Advance(int lev, Set::Scalar time, Set::Scalar dt) override
Definition Mechanics.H:246
Set::Field< Set::Vector > disp_old_mf
Definition Mechanics.H:483
Solver::Nonlocal::Newton< MODEL > solver
Definition Mechanics.H:500
void TagCellsForRefinement(int lev, amrex::TagBoxArray &a_tags, Set::Scalar, int) override
Definition Mechanics.H:444
Set::Field< Set::Matrix > stress_mf
Definition Mechanics.H:479
Set::Field< Set::Vector > res_mf
Definition Mechanics.H:478
Set::Field< Set::Vector > rhs_mf
Definition Mechanics.H:477
BC::Operator::Elastic::Elastic * bc
Definition Mechanics.H:501
Set::Field< Set::Scalar > psi_mf
Definition Mechanics.H:470
virtual void UpdateModel(int a_step, Set::Scalar a_time)=0
Set::Field< MODEL > model_mf
Definition Mechanics.H:468
Set::Vector trac_hi[AMREX_SPACEDIM]
Definition Mechanics.H:492
std::vector< amrex::Box > box
Definition Integrator.H:465
amrex::Vector< amrex::Real > dt
Timesteps for each level of refinement.
Definition Integrator.H:394
void RegisterGeneralFab(Set::Field< T > &new_fab, int ncomp, int nghost, bool evolving=true)
Add a templated nodal field.
void RegisterIntegratedVariable(Set::Scalar *integrated_variable, std::string name, bool extensive=true)
Register a variable to be integrated over the spatial domain using the Integrate function.
void SetBC(::BC::Operator::Elastic::Elastic *a_bc)
The different types of Boundary Condtiions are listed in the BC::Operator::Elastic documentation.
Definition Elastic.H:61
void SetUniform(bool a_uniform)
Definition Elastic.H:109
virtual void SetHomogeneous(bool a_homogeneous) override
Definition Elastic.H:48
amrex::Array4< T > Patch(int lev, amrex::MFIter &mfi) const &
Definition Set.H:76
int finest_level
Definition Set.H:67
AMREX_FORCE_INLINE Set::Scalar norm()
Definition Matrix3.H:29
void setPsi(Set::Field< Set::Scalar > &a_psi)
Definition Newton.H:46
void Define(Operator::Elastic< T::sym > &a_op)
Definition Newton.H:30
void compLinearSolverResidual(Set::Field< Set::Vector > &a_res_mf, Set::Field< Set::Vector > &a_u_mf, Set::Field< Set::Vector > &a_b_mf)
Definition Newton.H:499
Set::Scalar solve(const Set::Field< Set::Vector > &a_u_mf, const Set::Field< Set::Vector > &a_b_mf, Set::Field< T > &a_model_mf, Real a_tol_rel, Real a_tol_abs, const char *checkpoint_file=nullptr)
Definition Newton.H:275
Collection of numerical integrator objects.
Definition AllenCahn.H:42
AMREX_FORCE_INLINE Set::Scalar Laplacian(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > &stencil=DefaultType)
Definition Stencil.H:555
static AMREX_FORCE_INLINE std::array< StencilType, AMREX_SPACEDIM > GetStencil(const int i, const int j, const int k, const amrex::Box domain)
Definition Stencil.H:45
AMREX_FORCE_INLINE Set::Vector NodeGradientOnCell(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const Set::Scalar dx[AMREX_SPACEDIM])
Definition Stencil.H:820
AMREX_FORCE_INLINE Set::Vector Gradient(const amrex::Array4< const Set::Scalar > &f, const int &i, const int &j, const int &k, const int &m, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
Definition Stencil.H:681
AMREX_FORCE_INLINE Set::Vector Divergence(const amrex::Array4< const Set::Matrix > &dw, const int &i, const int &j, const int &k, const Set::Scalar DX[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > &stencil=DefaultType)
Definition Stencil.H:590
AMREX_FORCE_INLINE std::pair< Set::Vector, Set::Matrix > GradientSplit(const amrex::Array4< const Set::Vector > &f, const int &i, const int &j, const int &k, const Set::Scalar dx[AMREX_SPACEDIM], std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
Definition Stencil.H:790
amrex::Real Scalar
Definition Base.H:18
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:19
AMREX_FORCE_INLINE Vector Normal(AMREX_D_DECL(bool xmin, bool ymin, bool zmin), AMREX_D_DECL(bool xmax, bool ymax, bool zmax))
Definition Base.H:141
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
Definition Base.H:22
void Abort(const char *msg)
Definition Util.cpp:263
void Warning(std::string file, std::string func, int line, Args const &... args)
Definition Util.H:201
AMREX_FORCE_INLINE void RealFillBoundary(amrex::FabArray< amrex::BaseFab< T > > &a_mf, const amrex::Geometry &, const int nghost=2)
Definition Util.H:338