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
141protected:
142 /// \brief Use the #ic object to initialize#Temp
143 void Initialize(int lev) override
144 {
145 BL_PROFILE("Integrator::Base::Mechanics::Initialize");
147
148 disp_mf[lev]->setVal(Set::Vector::Zero());
149 //disp_old_mf[lev]->setVal(Set::Vector::Zero());
150
151 if (m_type == Type::Dynamic)
152 if (velocity_ic)
153 {
155 }
156
157 if (ic_rhs) ic_rhs->Initialize(lev, rhs_mf);
158 else rhs_mf[lev]->setVal(Set::Vector::Zero());
159 }
160
161 virtual void UpdateModel(int a_step, Set::Scalar a_time) = 0;
162
163 virtual void TimeStepBegin(Set::Scalar a_time, int a_step) override
164 {
165 BL_PROFILE("Integrator::Base::Mechanics::TimeStepBegin");
167
168 for (int lev = 0; lev <= finest_level; ++lev)
169 {
170 if (m_zero_out_displacement) disp_mf[lev]->setVal(Set::Vector::Zero());
171 rhs_mf[lev]->setVal(Set::Vector::Zero());
172 if (ic_rhs) ic_rhs->Initialize(lev, rhs_mf);
173 }
174
175 UpdateModel(a_step, a_time);
176
177 bc->SetTime(a_time);
178 bc->Init(rhs_mf, geom);
179
181 if (a_time < tstart) return;
182 if (m_interval && a_step % m_interval) return;
183
184 amrex::LPInfo info;
185 if (m_max_coarsening_level >= 0)
186 info.setMaxCoarseningLevel(m_max_coarsening_level);
187 Operator::Elastic<MODEL::sym> elastic_op(Geom(0, finest_level), grids, DistributionMap(0, finest_level), info);
188 elastic_op.SetUniform(false);
189 elastic_op.SetHomogeneous(false);
190 elastic_op.SetBC(bc);
191 IO::ParmParse pp("elasticop");
192 pp_queryclass(elastic_op);
193
194 Set::Scalar tol_rel = 1E-8, tol_abs = 1E-8;
195
196 solver.Define(elastic_op);
198 solver.solve(disp_mf, rhs_mf, model_mf, tol_rel, tol_abs);
200 solver.Clear();
201
202 for (int lev = 0; lev <= disp_mf.finest_level; lev++)
203 {
204 amrex::Box domain = geom[lev].Domain();
205 domain.convert(amrex::IntVect::TheNodeVector());
206
207 const amrex::Real* DX = geom[lev].CellSize();
208 for (MFIter mfi(*disp_mf[lev], false); mfi.isValid(); ++mfi)
209 {
210 amrex::Box bx = mfi.nodaltilebox();
211 bx.grow(2);
212 bx = bx & domain;
213 amrex::Array4<MODEL> const& model = model_mf[lev]->array(mfi);
214 amrex::Array4<Set::Matrix> const& stress = stress_mf[lev]->array(mfi);
215 amrex::Array4<Set::Matrix> const& strain = strain_mf[lev]->array(mfi);
216 amrex::Array4<const Set::Vector> const& disp = disp_mf[lev]->array(mfi);
217
218
219 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
220 {
221 auto sten = Numeric::GetStencil(i, j, k, bx);
222 if (model(i, j, k).kinvar == Model::Solid::KinematicVariable::F)
223 {
224 Set::Matrix F = Set::Matrix::Identity() + Numeric::Gradient(disp, i, j, k, DX, sten);
225 stress(i, j, k) = model(i, j, k).DW(F);
226 strain(i, j, k) = F;
227 }
228 else
229 {
230 Set::Matrix gradu = Numeric::Gradient(disp, i, j, k, DX, sten);
231 stress(i, j, k) = model(i, j, k).DW(gradu);
232 strain(i, j, k) = 0.5 * (gradu + gradu.transpose());
233 }
234 });
235 }
236 Util::RealFillBoundary(*stress_mf[lev], geom[lev]);
237 Util::RealFillBoundary(*strain_mf[lev], geom[lev]);
238 }
239 }
240
241 void Advance(int lev, Set::Scalar time, Set::Scalar dt) override
242 {
243 BL_PROFILE("Integrator::Base::Mechanics::Advance");
245 const amrex::Real* DX = geom[lev].CellSize();
246
247 amrex::Box domain = geom[lev].Domain();
248 domain.convert(amrex::IntVect::TheNodeVector());
249 const amrex::Dim3 lo = amrex::lbound(domain), hi = amrex::ubound(domain);
250
251 if (m_type == Type::Dynamic)
252 {
253
254 std::swap(*disp_mf[lev], *disp_old_mf[lev]);
255 std::swap(*vel_mf[lev], *vel_old_mf[lev]);
256
257
258 for (amrex::MFIter mfi(*disp_mf[lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
259 {
263
264 Set::Patch<Set::Vector> unew = disp_mf.Patch(lev,mfi);
265 Set::Patch<Set::Vector> vnew = vel_mf.Patch(lev,mfi);
268 //Set::Patch<MATRIX4> ddw = ddw_mf.Patch(lev,mfi);
269 Set::Patch<MODEL> model = model_mf.Patch(lev,mfi);
270
271 amrex::Box bx = mfi.grownnodaltilebox() & domain;
272 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
273 {
274 auto sten = Numeric::GetStencil(i,j,k,bx);
275 eps(i, j, k) = Numeric::Gradient(u, i, j, k, DX,sten);
276 sig(i, j, k) = model(i, j, k).DW(eps(i, j, k));
277 //ddw(i,j,k) = model(i,j,k).DDW(eps(i,j,k));
278 });
279
280 bx = mfi.nodaltilebox() & domain;
281 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
282 {
283
284 bool AMREX_D_DECL(xmin = (i == lo.x), ymin = (j == lo.y), zmin = (k == lo.z));
285 bool AMREX_D_DECL(xmax = (i == hi.x), ymax = (j == hi.y), zmax = (k == hi.z));
286
287 if (AMREX_D_TERM(xmax || xmin, || ymax || ymin, || zmax || zmin))
288 {
289 auto sten = Numeric::GetStencil(i,j,k,domain);
290
291 auto bctype = bc->getType(i,j,k,domain);
292
293 for (int d = 0; d < AMREX_SPACEDIM; d++)
294 {
296 {
297 unew(i,j,k)(d) = b(i,j,k)(d);
298 }
300 {
301
302 Set::Vector N = Set::Normal(AMREX_D_DECL(xmin,ymin,zmin),
303 AMREX_D_DECL(xmax,ymax,zmax));
304
305 auto [phi, offdiag] = Numeric::GradientSplit(u,i,j,k,DX,sten);
306
307 Set::Matrix A = Set::Matrix::Zero();
308 Set::Vector rhs = b(i,j,k);
309 Set::Matrix DW_F0 = model(i,j,k).DW(Set::Matrix::Zero());
310 MATRIX4 ddw = model(i,j,k).DDW(eps(i,j,k));
311 //Util::Message(INFO,b(i,j,k).transpose());
312
313 for (int p = 0; p < AMREX_SPACEDIM; p++)
314 for (int q = 0; q < AMREX_SPACEDIM; q++)
315 {
316 for (int r = 0; r < AMREX_SPACEDIM; r++)
317 for (int s = 0; s < AMREX_SPACEDIM; s++)
318 {
319 A(p,r) += ddw(p,q,r,s) * phi(s) * N(q);
320
321 rhs(p) -= ddw(p,q,r,s) * eps(i,j,k)(r,s) * N(q);
322 }
323
324 rhs(p) -= DW_F0(p,q)*N(q);
325 }
326 Set::Vector delta_u = (A.inverse() * rhs);
327
328 unew(i,j,k)(d) = u(i,j,k)(d) + delta_u(d);
329 vnew(i,j,k)(d) = (unew(i,j,k)(d) - u(i,j,k)(d))/dt;
330 }
331 else
332 {
333 Util::Abort(INFO,"Elastic dynamics not supported for other BCs yet");
334 }
335 }
336 }
337 else
338 {
339 //Set::Matrix gradu = Numeric::Gradient(u,i,j,k,DX);
340 //Set::Matrix3 gradgradu = Numeric::Hessian(u,i,j,k,DX);
341
342 //Set::Vector f = ddw(i,j,k)*gradgradu;
343 Set::Vector f = Numeric::Divergence(sig, i, j, k, DX);
344
345 //MATRIX4 AMREX_D_DECL(
346 // Cgrad1 = (Numeric::Stencil<MATRIX4, 1, 0, 0>::D(ddw, i, j, k, 0, DX)),
347 // Cgrad2 = (Numeric::Stencil<MATRIX4, 0, 1, 0>::D(ddw, i, j, k, 0, DX)),
348 // Cgrad3 = (Numeric::Stencil<MATRIX4, 0, 0, 1>::D(ddw, i, j, k, 0, DX)));
349
350 //f += AMREX_D_TERM( ( Cgrad1*gradu).col(0),
351 // +(Cgrad2*gradu).col(1),
352 // +(Cgrad3*gradu).col(2));
353
354 Set::Vector lapv = Numeric::Laplacian(v, i, j, k, DX);
355 f += mu_newton * lapv + b(i,j,k) - mu_dashpot*v(i,j,k);
356
357 Set::Vector udotdot = f / rho;
358 vnew(i, j, k) = v(i, j, k) + dt * udotdot;
359 unew(i, j, k) = u(i, j, k) + dt * v(i, j, k);
360 }
361 });
362 }
363 }
364
365 for (amrex::MFIter mfi(*disp_mf[lev], false); mfi.isValid(); ++mfi)
366 {
367 amrex::Box bx = mfi.grownnodaltilebox() & domain;
368 amrex::Array4<Set::Matrix> const& eps = (*strain_mf[lev]).array(mfi);
369 amrex::Array4<Set::Matrix> const& sig = (*stress_mf[lev]).array(mfi);
370 amrex::Array4<MODEL> const& model = (*model_mf[lev]).array(mfi);
371 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
372 {
373 model(i, j, k).Advance(dt, eps(i, j, k), sig(i, j, k),time);
374 });
375 }
376 Util::RealFillBoundary(*model_mf[lev], geom[lev]);
377
378 }
379
380 void Integrate(int amrlev, Set::Scalar /*time*/, int /*step*/,
381 const amrex::MFIter& mfi, const amrex::Box& a_box) override
382 {
383 BL_PROFILE("Integrator::Base::Mechanics::Integrate");
384 if (m_type == Type::Disable) return;
385
386 if (amrex::ParallelDescriptor::NProcs() > 1 && a_box.contains(amrex::IntVect::TheZeroVector()) &&
387 amrlev == 0)
388 {
389 Util::Warning(INFO,"There is a known bug when calculating trac/disp in Base::Mechanics in parallel.");
390 Util::Warning(INFO,"The thermo.dat values likely will not be correct; use the boxlib output instead.");
391 }
392
393 const amrex::Real* DX = geom[amrlev].CellSize();
394 amrex::Box domain = geom[amrlev].Domain();
395 domain.convert(amrex::IntVect::TheNodeVector());
396
397 amrex::Box box = a_box;
398 box.convert(amrex::IntVect::TheNodeVector());
399
400
401 //Set::Scalar dv = AMREX_D_TERM(DX[0], *DX[1], *DX[2]);
402#if AMREX_SPACEDIM == 2
403 Set::Vector da0(DX[1], 0);
404 Set::Vector da1(0, DX[0]);
405#elif AMREX_SPACEDIM == 3
406 Set::Vector da(DX[1] * DX[2], 0, 0);
407#endif
408
409 const Dim3 /*lo= amrex::lbound(domain),*/ hi = amrex::ubound(domain);
410 const Dim3 /*boxlo= amrex::lbound(box),*/ boxhi = amrex::ubound(box);
411
412 amrex::Array4<const Set::Matrix> const& stress = (*stress_mf[amrlev]).array(mfi);
413 amrex::Array4<const Set::Vector> const& disp = (*disp_mf[amrlev]).array(mfi);
414 amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k)
415 {
416#if AMREX_SPACEDIM == 2
417 if (i == hi.x && j < boxhi.y)
418 {
419 trac_hi[0] += (0.5 * (stress(i, j, k) + stress(i, j + 1, k)) * da0);
420 disp_hi[0] = disp(i, j, k);
421 }
422 if (j == hi.y && i < boxhi.x)
423 {
424 trac_hi[1] += (0.5 * (stress(i, j, k) + stress(i + 1, j, k)) * da1);
425 disp_hi[1] = disp(i, j, k);
426 }
427#elif AMREX_SPACEDIM == 3
428 if (i == hi.x && (j < boxhi.y && k < boxhi.z))
429 {
430 trac_hi[0] += (0.25 * (stress(i, j, k) + stress(i, j + 1, k)
431 + stress(i, j, k + 1) + stress(i, j + 1, k + 1)) * da);
432 disp_hi[0] = disp(i, j, k);
433 }
434#endif
435 });
436
437 }
438
439 void TagCellsForRefinement(int lev, amrex::TagBoxArray& a_tags, Set::Scalar /*time*/, int /*ngrow*/) override
440 {
441 BL_PROFILE("Integrator::Base::Mechanics::TagCellsForRefinement");
442 if (m_type == Type::Disable) return;
443
444 Set::Vector DX(geom[lev].CellSize());
445 Set::Scalar DXnorm = DX.lpNorm<2>();
446 for (amrex::MFIter mfi(*strain_mf[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi)
447 {
448 amrex::Box bx = mfi.tilebox();
449 bx.convert(amrex::IntVect::TheCellVector());
450 amrex::Array4<char> const& tags = a_tags.array(mfi);
451 amrex::Array4<Set::Matrix> const& eps = strain_mf[lev]->array(mfi);
452 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
453 {
454 Set::Matrix3 grad = Numeric::NodeGradientOnCell(eps, i, j, k, DX.data());
455 if (grad.norm() * DXnorm > m_elastic_ref_threshold)
456 tags(i, j, k) = amrex::TagBox::SET;
457 });
458 }
459 }
460
461protected:
466 bool psi_on = false;
467
468 int m_interval = 0;
470
476
477 // Only use these if using the "dynamics" option
481 //Set::Field<Set::Matrix4<AMREX_SPACEDIM,MODEL::sym>> ddw_mf;
485
486 //Set::Vector trac_lo[AMREX_SPACEDIM];
487 Set::Vector trac_hi[AMREX_SPACEDIM];
488 Set::Vector disp_hi[AMREX_SPACEDIM];
489
490
492
494
497
499 bool m_print_model = false;
500 bool m_print_residual = false;
501 bool m_time_evolving = false;
503
505
506 bool plot_disp = true;
507 bool plot_stress = true;
508 bool plot_strain = true;
509 bool plot_psi = true;
510 bool plot_rhs = true;
511
512
514};
515}
516}
517#endif
#define pp_query_validate(...)
Definition ParmParse.H:101
#define pp_query_default(...)
Definition ParmParse.H:100
#define pp_forbid(...)
Definition ParmParse.H:108
#define pp_queryclass(...)
Definition ParmParse.H:107
#define INFO
Definition Util.H:21
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:172
void select(std::string name, PTRTYPE *&ic_eta, Args &&... args)
Definition ParmParse.H:768
Set::Field< Set::Vector > disp_mf
Definition Mechanics.H:471
virtual void TimeStepBegin(Set::Scalar a_time, int a_step) override
Definition Mechanics.H:163
Set::Field< Set::Matrix > strain_mf
Definition Mechanics.H:475
Set::Field< MATRIX4 > ddw_mf
Definition Mechanics.H:464
IC::IC< Set::Vector > * ic_rhs
Definition Mechanics.H:491
void Integrate(int amrlev, Set::Scalar, int, const amrex::MFIter &mfi, const amrex::Box &a_box) override
Definition Mechanics.H:380
Set::Field< Set::Vector > vel_old_mf
Definition Mechanics.H:480
Set::Field< Set::Vector > vel_mf
Definition Mechanics.H:479
static void Parse(Mechanics &value, IO::ParmParse &pp)
Definition Mechanics.H:42
Set::Scalar m_elastic_ref_threshold
Definition Mechanics.H:498
IC::IC< Set::Vector > * velocity_ic
Definition Mechanics.H:493
Set::Vector disp_hi[AMREX_SPACEDIM]
Definition Mechanics.H:488
void Initialize(int lev) override
Use the #ic object to initialize::Temp.
Definition Mechanics.H:143
Set::Matrix4< AMREX_SPACEDIM, MODEL::sym > MATRIX4
Definition Mechanics.H:462
void Advance(int lev, Set::Scalar time, Set::Scalar dt) override
Definition Mechanics.H:241
Set::Field< Set::Vector > disp_old_mf
Definition Mechanics.H:478
Solver::Nonlocal::Newton< MODEL > solver
Definition Mechanics.H:495
void TagCellsForRefinement(int lev, amrex::TagBoxArray &a_tags, Set::Scalar, int) override
Definition Mechanics.H:439
Set::Field< Set::Matrix > stress_mf
Definition Mechanics.H:474
Set::Field< Set::Vector > res_mf
Definition Mechanics.H:473
Set::Field< Set::Vector > rhs_mf
Definition Mechanics.H:472
BC::Operator::Elastic::Elastic * bc
Definition Mechanics.H:496
Set::Field< Set::Scalar > psi_mf
Definition Mechanics.H:465
virtual void UpdateModel(int a_step, Set::Scalar a_time)=0
Set::Field< MODEL > model_mf
Definition Mechanics.H:463
Set::Vector trac_hi[AMREX_SPACEDIM]
Definition Mechanics.H:487
std::vector< amrex::Box > box
Definition Integrator.H:448
amrex::Vector< amrex::Real > dt
Timesteps for each level of refinement.
Definition Integrator.H:381
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:41
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:546
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:36
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:811
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:672
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:581
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:781
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
AMREX_FORCE_INLINE void RealFillBoundary(amrex::FabArray< amrex::BaseFab< T > > &a_mf, const amrex::Geometry &)
Definition Util.H:307
void Abort(const char *msg)
Definition Util.cpp:171
void Warning(std::string file, std::string func, int line, Args const &... args)
Definition Util.H:166