https://mooseframework.inl.gov
Loading...
Searching...
No Matches
SubProblem.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#include "SubProblem.h"
11#include "Factory.h"
12#include "MooseMesh.h"
13#include "Conversion.h"
14#include "Function.h"
15#include "MooseApp.h"
16#include "MooseVariableFE.h"
17#include "MooseArray.h"
18#include "Assembly.h"
19#include "MooseObjectName.h"
20#include "RelationshipManager.h"
21#include "MooseUtils.h"
22#include "DisplacedSystem.h"
23#include "NonlinearSystemBase.h"
24#include "LinearSystem.h"
25
26#include "libmesh/equation_systems.h"
27#include "libmesh/system.h"
28#include "libmesh/dof_map.h"
29#include "libmesh/string_to_enum.h"
30
31#include <regex>
32
35{
37
38 params.addParam<bool>(
39 "default_ghosting",
40 false,
41 "Whether or not to use libMesh's default amount of algebraic and geometric ghosting");
42
43 params.addParamNamesToGroup("default_ghosting", "Advanced");
44
45 return params;
46}
47
48// SubProblem /////
50 : Problem(parameters),
51 _factory(_app.getFactory()),
52 _default_ghosting(getParam<bool>("default_ghosting")),
53 _currently_computing_jacobian(false),
54 _currently_computing_residual_and_jacobian(false),
55 _computing_nonlinear_residual(false),
56 _currently_computing_residual(false),
57 _safe_access_tagged_matrices(false),
58 _safe_access_tagged_vectors(false),
59 _have_ad_objects(false),
60 _show_functors(false),
61 _show_chain_control_data(false),
62 _typed_vector_tags(2)
63{
64 unsigned int n_threads = numThreads();
65 _active_elemental_moose_variables.resize(n_threads);
67
72
73 _functors.resize(n_threads);
74 _pbblf_functors.resize(n_threads);
75 _functor_to_request_info.resize(n_threads);
76}
77
79
82
84SubProblem::addVectorTag(const TagName & tag_name,
85 const Moose::VectorTagType type /* = Moose::VECTOR_TAG_RESIDUAL */)
86{
88 mooseError("Vector tag type cannot be VECTOR_TAG_ANY");
89
90 const auto tag_name_upper = MooseUtils::toUpper(tag_name);
91
92 // First, see if the tag exists already
93 for (const auto & vector_tag : _vector_tags)
94 {
95 mooseAssert(_vector_tags[vector_tag._id] == vector_tag, "Vector tags index mismatch");
96 if (vector_tag._name == tag_name_upper)
97 {
98 if (vector_tag._type != type)
99 mooseError("While attempting to add vector tag with name '",
100 tag_name_upper,
101 "' and type ",
102 type,
103 ",\na tag with the same name but type ",
104 vector_tag._type,
105 " was found.\n\nA tag can only exist with one type.");
106
107 return vector_tag._id;
108 }
109 }
110
111 // Doesn't exist - create it
112 const TagID new_tag_id = _vector_tags.size();
113 const TagTypeID new_tag_type_id = _typed_vector_tags[type].size();
114 // Primary storage for all tags where the index in the vector == the tag ID
115 _vector_tags.emplace_back(new_tag_id, new_tag_type_id, tag_name_upper, type);
116 // Secondary storage for each type so that we can have quick access to all tags of a type
117 _typed_vector_tags[type].emplace_back(new_tag_id, new_tag_type_id, tag_name_upper, type);
118 // Name map storage for quick name access
119 _vector_tags_name_map.emplace(tag_name_upper, new_tag_id);
120
121 // Make sure that _vector_tags, _typed_vector_tags, and _vector_tags_name_map are sane
123
124 return new_tag_id;
125}
126
127bool
128SubProblem::vectorTagExists(const TagName & tag_name) const
129{
130 mooseAssert(verifyVectorTags(), "Vector tag storage invalid");
131
132 const auto tag_name_upper = MooseUtils::toUpper(tag_name);
133 for (const auto & vector_tag : _vector_tags)
134 if (vector_tag._name == tag_name_upper)
135 return true;
136
137 return false;
138}
139
140void
145
146bool
148{
149 return _not_zeroed_tagged_vectors.count(tag);
150}
151
152const VectorTag &
154{
155 mooseAssert(verifyVectorTags(), "Vector tag storage invalid");
156
157 if (!vectorTagExists(tag_id))
158 mooseError("Vector tag with ID ", tag_id, " does not exist");
159
160 return _vector_tags[tag_id];
161}
162
163std::vector<VectorTag>
164SubProblem::getVectorTags(const std::set<TagID> & tag_ids) const
165{
166 mooseAssert(verifyVectorTags(), "Vector tag storage invalid");
167
168 std::vector<VectorTag> tags;
169 tags.reserve(tag_ids.size());
170 for (const auto & tag_id : tag_ids)
171 tags.push_back(getVectorTag(tag_id));
172 return tags;
173}
174
175const std::vector<VectorTag> &
176SubProblem::getVectorTags(const Moose::VectorTagType type /* = Moose::VECTOR_TAG_ANY */) const
177{
178 mooseAssert(verifyVectorTags(), "Vector tag storage invalid");
179
181 return _vector_tags;
182 else
183 return _typed_vector_tags[type];
184}
185
186unsigned int
187SubProblem::numVectorTags(const Moose::VectorTagType type /* = Moose::VECTOR_TAG_ANY */) const
188{
189 mooseAssert(verifyVectorTags(), "Vector tag storage invalid");
190
191 return getVectorTags(type).size();
192}
193
194TagID
195SubProblem::getVectorTagID(const TagName & tag_name) const
196{
197 mooseAssert(verifyVectorTags(), "Vector tag storage invalid");
198
199 const auto tag_name_upper = MooseUtils::toUpper(tag_name);
200 const auto search = _vector_tags_name_map.find(tag_name_upper);
201 if (search != _vector_tags_name_map.end())
202 return search->second;
203
204 std::string message =
205 tag_name_upper == "TIME"
206 ? ".\n\nThis may occur if "
207 "you have a TimeKernel in your problem but did not specify a transient executioner."
208 : "";
209 mooseError("Vector tag '", tag_name_upper, "' does not exist", message);
210}
211
212TagName
214{
215 mooseAssert(verifyVectorTags(), "Vector tag storage invalid");
216 if (!vectorTagExists(tag_id))
217 mooseError("Vector tag with ID ", tag_id, " does not exist");
218
219 return _vector_tags[tag_id]._name;
220}
221
224{
225 mooseAssert(verifyVectorTags(), "Vector tag storage invalid");
226 if (!vectorTagExists(tag_id))
227 mooseError("Vector tag with ID ", tag_id, " does not exist");
228
229 return _vector_tags[tag_id]._type;
230}
231
232bool
234{
235 for (TagID tag_id = 0; tag_id < _vector_tags.size(); ++tag_id)
236 {
237 const auto & vector_tag = _vector_tags[tag_id];
238
239 if (vector_tag._id != tag_id)
240 mooseError("Vector tag ", vector_tag._id, " id mismatch in _vector_tags");
241 if (vector_tag._type == Moose::VECTOR_TAG_ANY)
242 mooseError("Vector tag '", vector_tag._name, "' has type VECTOR_TAG_ANY");
243
244 const auto search = _vector_tags_name_map.find(vector_tag._name);
245 if (search == _vector_tags_name_map.end())
246 mooseError("Vector tag ", vector_tag._id, " is not in _vector_tags_name_map");
247 else if (search->second != tag_id)
248 mooseError("Vector tag ", vector_tag._id, " has incorrect id in _vector_tags_name_map");
249
250 unsigned int found_in_type = 0;
251 for (TagTypeID tag_type_id = 0; tag_type_id < _typed_vector_tags[vector_tag._type].size();
252 ++tag_type_id)
253 {
254 const auto & vector_tag_type = _typed_vector_tags[vector_tag._type][tag_type_id];
255 if (vector_tag_type == vector_tag)
256 {
257 ++found_in_type;
258 if (vector_tag_type._type_id != tag_type_id)
259 mooseError("Type ID for Vector tag ", tag_id, " is incorrect");
260 }
261 }
262
263 if (found_in_type == 0)
264 mooseError("Vector tag ", tag_id, " not found in _typed_vector_tags");
265 if (found_in_type > 1)
266 mooseError("Vector tag ", tag_id, " found multiple times in _typed_vector_tags");
267 }
268
269 unsigned int num_typed_vector_tags = 0;
270 for (const auto & typed_vector_tags : _typed_vector_tags)
271 num_typed_vector_tags += typed_vector_tags.size();
272 if (num_typed_vector_tags != _vector_tags.size())
273 mooseError("Size mismatch between _vector_tags and _typed_vector_tags");
274 if (_vector_tags_name_map.size() != _vector_tags.size())
275 mooseError("Size mismatch between _vector_tags and _vector_tags_name_map");
276
277 return true;
278}
279
280void
282 const std::vector<VectorTag> & input_vector_tags,
283 std::set<TagID> & selected_tags)
284{
285 selected_tags.clear();
286 for (const auto & vector_tag : input_vector_tags)
287 if (system.hasVector(vector_tag._id))
288 selected_tags.insert(vector_tag._id);
289}
290
291void
293 const std::map<TagName, TagID> & input_matrix_tags,
294 std::set<TagID> & selected_tags)
295{
296 selected_tags.clear();
297 for (const auto & matrix_tag_pair : input_matrix_tags)
298 if (system.hasMatrix(matrix_tag_pair.second))
299 selected_tags.insert(matrix_tag_pair.second);
300}
301
302TagID
304{
305 auto tag_name_upper = MooseUtils::toUpper(tag_name);
306 auto existing_tag = _matrix_tag_name_to_tag_id.find(tag_name_upper);
307 if (existing_tag == _matrix_tag_name_to_tag_id.end())
308 {
309 auto tag_id = _matrix_tag_name_to_tag_id.size();
310
311 _matrix_tag_name_to_tag_id[tag_name_upper] = tag_id;
312
313 _matrix_tag_id_to_tag_name[tag_id] = tag_name_upper;
314 }
315
316 return _matrix_tag_name_to_tag_id.at(tag_name_upper);
317}
318
319bool
320SubProblem::matrixTagExists(const TagName & tag_name) const
321{
322 auto tag_name_upper = MooseUtils::toUpper(tag_name);
323
324 return _matrix_tag_name_to_tag_id.find(tag_name_upper) != _matrix_tag_name_to_tag_id.end();
325}
326
327bool
329{
330 return _matrix_tag_id_to_tag_name.find(tag_id) != _matrix_tag_id_to_tag_name.end();
331}
332
333TagID
334SubProblem::getMatrixTagID(const TagName & tag_name) const
335{
336 auto tag_name_upper = MooseUtils::toUpper(tag_name);
337
338 if (!matrixTagExists(tag_name))
339 mooseError("Matrix tag: ",
340 tag_name,
341 " does not exist. ",
342 "If this is a TimeKernel then this may have happened because you didn't "
343 "specify a Transient Executioner.");
344
345 return _matrix_tag_name_to_tag_id.at(tag_name_upper);
346}
347
348TagName
353
354void
359
360void
362{
364 for (const auto sys_num : make_range(numSolverSystems()))
367}
368
369void
374
375void
380
381const std::set<TagID> &
386
387const std::set<TagID> &
392
393void
395 const THREAD_ID tid)
396{
398}
399
400void
402 const THREAD_ID tid)
403{
405 for (const auto nl_sys_num : make_range(numNonlinearSystems()))
408}
409
410void
415
416void
421
422const std::set<TagID> &
427
428const std::set<TagID> &
433
434void
435SubProblem::setActiveElementalMooseVariables(const std::set<MooseVariableFEBase *> & moose_vars,
436 const THREAD_ID tid)
437{
438 if (!moose_vars.empty())
439 {
441 _active_elemental_moose_variables[tid] = moose_vars;
442 }
443}
444
445const std::set<MooseVariableFEBase *> &
450
451bool
456
457void
463
464std::set<SubdomainID>
465SubProblem::getMaterialPropertyBlocks(const std::string & prop_name)
466{
467 std::set<SubdomainID> blocks;
468
469 for (const auto & it : _map_block_material_props)
470 {
471 const std::set<std::string> & prop_names = it.second;
472 std::set<std::string>::iterator name_it = prop_names.find(prop_name);
473 if (name_it != prop_names.end())
474 blocks.insert(it.first);
475 }
476
477 return blocks;
478}
479
480std::vector<SubdomainName>
481SubProblem::getMaterialPropertyBlockNames(const std::string & prop_name)
482{
483 std::set<SubdomainID> blocks = getMaterialPropertyBlocks(prop_name);
484 std::vector<SubdomainName> block_names;
485 block_names.reserve(blocks.size());
486 for (const auto & block_id : blocks)
487 {
488 SubdomainName name;
489 name = mesh().getMesh().subdomain_name(block_id);
490 if (name.empty())
491 {
492 std::ostringstream oss;
493 oss << block_id;
494 name = oss.str();
495 }
496 block_names.push_back(name);
497 }
498
499 return block_names;
500}
501
502bool
503SubProblem::hasBlockMaterialProperty(SubdomainID bid, const std::string & prop_name)
504{
505 auto it = _map_block_material_props.find(bid);
506 if (it == _map_block_material_props.end())
507 return false;
508
509 if (it->second.count(prop_name) > 0)
510 return true;
511 else
512 return false;
513}
514
515// TODO: remove code duplication by templating
516std::set<BoundaryID>
517SubProblem::getMaterialPropertyBoundaryIDs(const std::string & prop_name)
518{
519 std::set<BoundaryID> boundaries;
520
521 for (const auto & it : _map_boundary_material_props)
522 {
523 const std::set<std::string> & prop_names = it.second;
524 std::set<std::string>::iterator name_it = prop_names.find(prop_name);
525 if (name_it != prop_names.end())
526 boundaries.insert(it.first);
527 }
528
529 return boundaries;
530}
531
532std::vector<BoundaryName>
534{
535 std::set<BoundaryID> boundaries = getMaterialPropertyBoundaryIDs(prop_name);
536 std::vector<BoundaryName> boundary_names;
537 boundary_names.reserve(boundaries.size());
538 const BoundaryInfo & boundary_info = mesh().getMesh().get_boundary_info();
539
540 for (const auto & bnd_id : boundaries)
541 {
542 BoundaryName name;
543 if (bnd_id == Moose::ANY_BOUNDARY_ID)
544 name = "ANY_BOUNDARY_ID";
545 else
546 {
547 name = boundary_info.get_sideset_name(bnd_id);
548 if (name.empty())
549 {
550 std::ostringstream oss;
551 oss << bnd_id;
552 name = oss.str();
553 }
554 }
555 boundary_names.push_back(name);
556 }
557
558 return boundary_names;
559}
560
561bool
562SubProblem::hasBoundaryMaterialProperty(BoundaryID bid, const std::string & prop_name)
563{
564 auto it = _map_boundary_material_props.find(bid);
565 if (it == _map_boundary_material_props.end())
566 return false;
567
568 if (it->second.count(prop_name) > 0)
569 return true;
570 else
571 return false;
572}
573
574void
575SubProblem::storeSubdomainMatPropName(SubdomainID block_id, const std::string & name)
576{
577 _map_block_material_props[block_id].insert(name);
578}
579
580void
581SubProblem::storeBoundaryMatPropName(BoundaryID boundary_id, const std::string & name)
582{
583 _map_boundary_material_props[boundary_id].insert(name);
584}
585
586void
587SubProblem::storeSubdomainZeroMatProp(SubdomainID block_id, const MaterialPropertyName & name)
588{
589 _zero_block_material_props[block_id].insert(name);
590}
591
592void
593SubProblem::storeBoundaryZeroMatProp(BoundaryID boundary_id, const MaterialPropertyName & name)
594{
595 _zero_boundary_material_props[boundary_id].insert(name);
596}
597
598void
600 SubdomainID block_id,
601 const std::string & name)
602{
603 _map_block_material_props_check[block_id].insert(std::make_pair(requestor, name));
604}
605
606void
608 BoundaryID boundary_id,
609 const std::string & name)
610{
611 _map_boundary_material_props_check[boundary_id].insert(std::make_pair(requestor, name));
612}
613
614void
616{
617 // Variable for storing all available blocks/boundaries from the mesh
618 std::set<SubdomainID> all_ids(mesh().meshSubdomains());
619
620 std::stringstream errors;
621
622 // Loop through the properties to check
623 for (const auto & check_it : _map_block_material_props_check)
624 {
625 // The current id for the property being checked (BoundaryID || BlockID)
626 SubdomainID check_id = check_it.first;
627
628 std::set<SubdomainID> check_ids = {check_id};
629
630 // Loop through all the block/boundary ids
631 for (const auto & id : check_ids)
632 {
633 // Loop through all the stored properties
634 for (const auto & prop_it : check_it.second)
635 {
636 // Produce an error if the material property is not defined on the current block/boundary
637 // and any block/boundary
638 // and not is not a zero material property.
639 if (_map_block_material_props[id].count(prop_it.second) == 0 &&
640 _zero_block_material_props[id].count(prop_it.second) == 0)
641 {
642 std::string check_name = restrictionSubdomainCheckName(id);
643 if (check_name.empty())
644 check_name = std::to_string(id);
645 errors << "Material property '" << prop_it.second << "', requested by '" << prop_it.first
646 << "' is not defined on block " << check_name << "\n";
647 }
648 }
649 }
650 }
651
652 if (!errors.str().empty())
653 mooseError(errors.str());
654}
655
656void
658{
659 // Variable for storing the value for ANY_BOUNDARY_ID
661
662 // Variable for storing all available blocks/boundaries from the mesh
663 std::set<BoundaryID> all_ids(mesh().getBoundaryIDs());
664
665 std::stringstream errors;
666
667 // Loop through the properties to check
668 for (const auto & check_it : _map_boundary_material_props_check)
669 {
670 // The current id for the property being checked (BoundaryID || BlockID)
671 BoundaryID check_id = check_it.first;
672
673 // In the case when the material being checked has an ID is set to ANY, then loop through all
674 // the possible ids and verify that the material property is defined.
675 std::set<BoundaryID> check_ids{check_id};
676 if (check_id == any_id)
677 check_ids = all_ids;
678
679 // Loop through all the block/boundary ids
680 for (const auto & id : check_ids)
681 {
682 // Loop through all the stored properties
683 for (const auto & prop_it : check_it.second)
684 {
685 // Produce an error if the material property is not defined on the current block/boundary
686 // and any block/boundary
687 // and not is not a zero material property.
688 if (_map_boundary_material_props[id].count(prop_it.second) == 0 &&
689 _map_boundary_material_props[any_id].count(prop_it.second) == 0 &&
690 _zero_boundary_material_props[id].count(prop_it.second) == 0 &&
691 _zero_boundary_material_props[any_id].count(prop_it.second) == 0)
692 {
693 std::string check_name = restrictionBoundaryCheckName(id);
694 if (check_name.empty())
695 check_name = std::to_string(id);
696 errors << "Material property '" << prop_it.second << "', requested by '" << prop_it.first
697 << "' is not defined on boundary " << check_name << "\n";
698 }
699 }
700 }
701 }
702
703 if (!errors.str().empty())
704 mooseError(errors.str());
705}
706
707bool
708SubProblem::nlConverged(const unsigned int nl_sys_num)
709{
710 mooseAssert(nl_sys_num < numNonlinearSystems(),
711 "The nonlinear system number is higher than the number of systems we have!");
712 return solverSystemConverged(nl_sys_num);
713}
714
715void
716SubProblem::markMatPropRequested(const std::string & prop_name)
717{
718 _material_property_requested.insert(prop_name);
719}
720
721bool
722SubProblem::isMatPropRequested(const std::string & prop_name) const
723{
724 return _material_property_requested.find(prop_name) != _material_property_requested.end();
725}
726
727void
728SubProblem::addConsumedPropertyName(const MooseObjectName & obj_name, const std::string & prop_name)
729{
730 _consumed_material_properties[obj_name].insert(prop_name);
731}
732
733const std::map<MooseObjectName, std::set<std::string>> &
738
744
745Real
747{
748 return 0;
749}
750
751unsigned int
753{
754 return 0;
755}
756
757unsigned int
759{
760 return 0;
761}
762
763std::string
765{
766 // TODO: Put a better a interface in MOOSE
767 std::map<subdomain_id_type, std::string> & name_map = mesh().getMesh().set_subdomain_name_map();
768 std::map<subdomain_id_type, std::string>::const_iterator pos = name_map.find(check_id);
769 if (pos != name_map.end())
770 return pos->second;
771 return "";
772}
773
774std::string
776{
777 return mesh().getMesh().get_boundary_info().sideset_name(check_id);
778}
779
780void
782{
783 for (const auto sys_num : make_range(numSolverSystems()))
784 assembly(tid, sys_num).setCurrentBoundaryID(bid);
785}
786
787unsigned int
792
793bool
794SubProblem::hasLinearVariable(const std::string & var_name) const
795{
796 for (const auto i : make_range(numLinearSystems()))
797 if (systemBaseLinear(i).hasVariable(var_name))
798 return true;
799 return false;
800}
801
802bool
803SubProblem::hasAuxiliaryVariable(const std::string & var_name) const
804{
805 return systemBaseAuxiliary().hasVariable(var_name);
806}
807
808template <typename T>
811 const std::string & var_name,
812 Moose::VarKindType expected_var_type,
813 Moose::VarFieldType expected_var_field_type,
814 const std::vector<T> & systems,
815 const SystemBase & aux) const
816{
817 // Eventual return value
818 MooseVariableFEBase * var = nullptr;
819
820 const auto [var_in_sys, sys_num] = determineSolverSystem(var_name);
821
822 // First check that the variable is found on the expected system.
823 if (expected_var_type == Moose::VarKindType::VAR_ANY)
824 {
825 if (var_in_sys)
826 var = &(systems[sys_num]->getVariable(tid, var_name));
827 else if (aux.hasVariable(var_name))
828 var = &(aux.getVariable(tid, var_name));
829 else
830 mooseError("Unknown variable " + var_name);
831 }
832 else if (expected_var_type == Moose::VarKindType::VAR_SOLVER && var_in_sys &&
833 systems[sys_num]->hasVariable(var_name))
834 var = &(systems[sys_num]->getVariable(tid, var_name));
835 else if (expected_var_type == Moose::VarKindType::VAR_AUXILIARY && aux.hasVariable(var_name))
836 var = &(aux.getVariable(tid, var_name));
837 else
838 {
839 std::string expected_var_type_string =
840 (expected_var_type == Moose::VarKindType::VAR_SOLVER ? "nonlinear" : "auxiliary");
841 mooseError("No ",
842 expected_var_type_string,
843 " variable named ",
844 var_name,
845 " found. "
846 "Did you specify an auxiliary variable when you meant to specify a nonlinear "
847 "variable (or vice-versa)?");
848 }
849
850 // Now make sure the var found has the expected field type.
851 if ((expected_var_field_type == Moose::VarFieldType::VAR_FIELD_ANY) ||
852 (expected_var_field_type == var->fieldType()))
853 return *var;
854 else
855 {
856 std::string expected_var_field_type_string =
857 MooseUtils::toLower(Moose::stringify(expected_var_field_type));
858 std::string var_field_type_string = MooseUtils::toLower(Moose::stringify(var->fieldType()));
859
860 mooseError("No ",
861 expected_var_field_type_string,
862 " variable named ",
863 var_name,
864 " found. "
865 "Did you specify a ",
866 var_field_type_string,
867 " variable when you meant to specify a ",
868 expected_var_field_type_string,
869 " variable?");
870 }
871}
872
873void
875 unsigned int side,
876 Real tolerance,
877 const std::vector<Point> * const pts,
878 const std::vector<Real> * const weights,
879 const THREAD_ID tid)
880{
881 for (const auto nl_sys_num : make_range(numNonlinearSystems()))
882 {
883 // - Set our _current_elem for proper dof index getting in the moose variables
884 // - Reinitialize all of our FE objects so we have current phi, dphi, etc. data
885 // Note that our number of shape functions will reflect the number of shapes associated with the
886 // interior element while the number of quadrature points will be determined by the passed pts
887 // parameter (which presumably will have a number of pts reflective of a facial quadrature rule)
888 assembly(tid, nl_sys_num).reinitElemFaceRef(elem, side, tolerance, pts, weights);
889
890 auto & nl = systemBaseNonlinear(nl_sys_num);
891
892 // Actually get the dof indices in the moose variables
893 nl.prepare(tid);
894
895 // Let's finally compute our variable values!
896 nl.reinitElemFace(elem, side, tid);
897 }
898
899 // do same for aux as for nl
901 systemBaseAuxiliary().reinitElemFace(elem, side, tid);
902
903 // With the dof indices set in the moose variables, now let's properly size
904 // our local residuals/Jacobians
905 auto & current_assembly = assembly(tid, currentNlSysNum());
907 current_assembly.prepareJacobianBlock();
909 current_assembly.prepareResidual();
910}
911
912void
913SubProblem::reinitNeighborFaceRef(const Elem * neighbor_elem,
914 unsigned int neighbor_side,
915 Real tolerance,
916 const std::vector<Point> * const pts,
917 const std::vector<Real> * const weights,
918 const THREAD_ID tid)
919{
920 for (const auto nl_sys_num : make_range(numNonlinearSystems()))
921 {
922 // - Set our _current_neighbor_elem for proper dof index getting in the moose variables
923 // - Reinitialize all of our FE objects so we have current phi, dphi, etc. data
924 // Note that our number of shape functions will reflect the number of shapes associated with the
925 // interior element while the number of quadrature points will be determined by the passed pts
926 // parameter (which presumably will have a number of pts reflective of a facial quadrature rule)
927 assembly(tid, nl_sys_num)
928 .reinitNeighborFaceRef(neighbor_elem, neighbor_side, tolerance, pts, weights);
929
930 auto & nl = systemBaseNonlinear(nl_sys_num);
931
932 // Actually get the dof indices in the moose variables
933 nl.prepareNeighbor(tid);
934
935 // Let's finally compute our variable values!
936 nl.reinitNeighborFace(neighbor_elem, neighbor_side, tid);
937 }
938
939 // do same for aux as for nl
941 systemBaseAuxiliary().reinitNeighborFace(neighbor_elem, neighbor_side, tid);
942
943 // With the dof indices set in the moose variables, now let's properly size
944 // our local residuals/Jacobians
946}
947
948void
950 const THREAD_ID tid,
951 const std::vector<Point> * const pts,
952 const std::vector<Real> * const weights)
953{
954 for (const auto nl_sys_num : make_range(numNonlinearSystems()))
955 {
956 // - Set our _current_lower_d_elem for proper dof index getting in the moose variables
957 // - Reinitialize all of our lower-d FE objects so we have current phi, dphi, etc. data
958 assembly(tid, nl_sys_num).reinitLowerDElem(elem, pts, weights);
959
960 auto & nl = systemBaseNonlinear(nl_sys_num);
961
962 // Actually get the dof indices in the moose variables
963 nl.prepareLowerD(tid);
964
965 // With the dof indices set in the moose variables, now let's properly size
966 // our local residuals/Jacobians
967 assembly(tid, nl_sys_num).prepareLowerD();
968
969 // Let's finally compute our variable values!
970 nl.reinitLowerD(tid);
971 }
972
973 // do same for aux as for nl
976}
977
978void
979SubProblem::reinitNodes(const std::vector<dof_id_type> & nodes, const THREAD_ID tid)
980{
981 for (const auto nl_sys_num : make_range(numNonlinearSystems()))
982 systemBaseNonlinear(nl_sys_num).reinitNodes(nodes, tid);
983 systemBaseAuxiliary().reinitNodes(nodes, tid);
984}
985
986void
987SubProblem::reinitNodesNeighbor(const std::vector<dof_id_type> & nodes, const THREAD_ID tid)
988{
989 for (const auto nl_sys_num : make_range(numNonlinearSystems()))
990 systemBaseNonlinear(nl_sys_num).reinitNodesNeighbor(nodes, tid);
992}
993
994void
996{
997 for (const auto nl_sys_num : make_range(numNonlinearSystems()))
998 assembly(tid, nl_sys_num).reinitNeighborLowerDElem(elem);
999}
1000
1001void
1002SubProblem::reinitMortarElem(const Elem * elem, const THREAD_ID tid)
1003{
1004 for (const auto nl_sys_num : make_range(numNonlinearSystems()))
1005 assembly(tid, nl_sys_num).reinitMortarElem(elem);
1006}
1007
1008void
1010{
1011 EquationSystems & eq = es();
1012 const auto n_sys = eq.n_systems();
1013
1014 auto pr = _root_alg_gf_to_sys_clones.emplace(
1015 &algebraic_gf, std::vector<std::shared_ptr<libMesh::GhostingFunctor>>(n_sys - 1));
1016 mooseAssert(pr.second, "We are adding a duplicate algebraic ghosting functor");
1017 auto & clones_vec = pr.first->second;
1018
1019 for (MooseIndex(n_sys) i = 1; i < n_sys; ++i)
1020 {
1021 DofMap & dof_map = eq.get_system(i).get_dof_map();
1022 std::shared_ptr<libMesh::GhostingFunctor> clone_alg_gf = algebraic_gf.clone();
1023 std::dynamic_pointer_cast<RelationshipManager>(clone_alg_gf)
1024 ->init(mesh(), *algebraic_gf.get_mesh(), &dof_map);
1025 dof_map.add_algebraic_ghosting_functor(clone_alg_gf, to_mesh);
1026 clones_vec[i - 1] = clone_alg_gf;
1027 }
1028}
1029
1030void
1032{
1033 EquationSystems & eq = es();
1034 const auto n_sys = eq.n_systems();
1035 if (!n_sys)
1036 return;
1037
1038 eq.get_system(0).get_dof_map().add_algebraic_ghosting_functor(algebraic_gf, to_mesh);
1039 cloneAlgebraicGhostingFunctor(algebraic_gf, to_mesh);
1040}
1041
1042void
1044{
1045 const std::size_t num_nl_sys = numNonlinearSystems();
1046
1047 auto pr = _root_coupling_gf_to_sys_clones.emplace(
1048 &coupling_gf, std::vector<std::shared_ptr<libMesh::GhostingFunctor>>(num_nl_sys - 1));
1049 mooseAssert(pr.second, "We are adding a duplicate coupling functor");
1050 auto & clones_vec = pr.first->second;
1051
1052 for (const auto i : make_range(std::size_t(1), num_nl_sys))
1053 {
1054 DofMap & dof_map = systemBaseNonlinear(i).system().get_dof_map();
1055 std::shared_ptr<libMesh::GhostingFunctor> clone_coupling_gf = coupling_gf.clone();
1056 std::dynamic_pointer_cast<RelationshipManager>(clone_coupling_gf)
1057 ->init(mesh(), *coupling_gf.get_mesh(), &dof_map);
1058 dof_map.add_coupling_functor(clone_coupling_gf, to_mesh);
1059 clones_vec[i - 1] = clone_coupling_gf;
1060 }
1061}
1062
1063void
1065{
1066 const auto num_nl_sys = numNonlinearSystems();
1067 if (!num_nl_sys)
1068 return;
1069
1070 systemBaseNonlinear(0).system().get_dof_map().add_coupling_functor(coupling_gf, to_mesh);
1071 cloneCouplingGhostingFunctor(coupling_gf, to_mesh);
1072}
1073
1074void
1076{
1077 EquationSystems & eq = es();
1078 const auto n_sys = eq.n_systems();
1079 DofMap & nl_dof_map = eq.get_system(0).get_dof_map();
1080
1081 const bool found_in_root_sys =
1082 std::find(nl_dof_map.algebraic_ghosting_functors_begin(),
1083 nl_dof_map.algebraic_ghosting_functors_end(),
1084 &algebraic_gf) != nl_dof_map.algebraic_ghosting_functors_end();
1085
1086#ifndef NDEBUG
1087 const bool found_in_our_map =
1088 _root_alg_gf_to_sys_clones.find(&algebraic_gf) != _root_alg_gf_to_sys_clones.end();
1089 mooseAssert(found_in_root_sys == found_in_our_map,
1090 "If the ghosting functor exists in the root DofMap, then we need to have a key for "
1091 "it in our gf to clones map");
1092#endif
1093
1094 if (found_in_root_sys) // libMesh yells if we try to remove
1095 // something that's not there
1096 nl_dof_map.remove_algebraic_ghosting_functor(algebraic_gf);
1097
1098 auto it = _root_alg_gf_to_sys_clones.find(&algebraic_gf);
1099 if (it == _root_alg_gf_to_sys_clones.end())
1100 return;
1101
1102 auto & clones_vec = it->second;
1103 mooseAssert((n_sys - 1) == clones_vec.size(),
1104 "The size of the gf clones vector doesn't match the number of systems minus one");
1105 if (clones_vec.empty())
1106 {
1107 mooseAssert(n_sys == 1, "The clones vector should only be empty if there is only one system");
1108 return;
1109 }
1110
1111 for (const auto i : make_range(n_sys))
1112 eq.get_system(i + 1).get_dof_map().remove_algebraic_ghosting_functor(*clones_vec[i]);
1113
1114 _root_alg_gf_to_sys_clones.erase(it->first);
1115}
1116
1117void
1119{
1120 EquationSystems & eq = es();
1121 const auto num_nl_sys = numNonlinearSystems();
1122 if (!num_nl_sys)
1123 return;
1124
1125 DofMap & nl_dof_map = eq.get_system(0).get_dof_map();
1126 const bool found_in_root_sys = std::find(nl_dof_map.coupling_functors_begin(),
1127 nl_dof_map.coupling_functors_end(),
1128 &coupling_gf) != nl_dof_map.coupling_functors_end();
1129
1130#ifndef NDEBUG
1131 const bool found_in_our_map =
1133 mooseAssert(found_in_root_sys == found_in_our_map,
1134 "If the ghosting functor exists in the root DofMap, then we need to have a key for "
1135 "it in our gf to clones map");
1136#endif
1137
1138 if (found_in_root_sys) // libMesh yells if we try to remove
1139 // something that's not there
1140 nl_dof_map.remove_coupling_functor(coupling_gf);
1141
1142 auto it = _root_coupling_gf_to_sys_clones.find(&coupling_gf);
1143 if (it == _root_coupling_gf_to_sys_clones.end())
1144 return;
1145
1146 auto & clones_vec = it->second;
1147 mooseAssert((num_nl_sys - 1) == clones_vec.size(),
1148 "The size of the gf clones vector doesn't match the number of systems minus one");
1149 if (clones_vec.empty())
1150 {
1151 mooseAssert(num_nl_sys == 1,
1152 "The clones vector should only be empty if there is only one nonlinear system");
1153 return;
1154 }
1155
1156 for (const auto i : make_range(num_nl_sys))
1157 eq.get_system(i + 1).get_dof_map().remove_coupling_functor(*clones_vec[i]);
1158
1159 _root_coupling_gf_to_sys_clones.erase(it->first);
1160}
1161
1162void
1163SubProblem::automaticScaling(bool automatic_scaling)
1164{
1165 for (const auto nl_sys_num : make_range(numNonlinearSystems()))
1166 systemBaseNonlinear(nl_sys_num).automaticScaling(automatic_scaling);
1167}
1168
1169bool
1171{
1172 // Currently going to assume that we are applying or not applying automatic scaling consistently
1173 // across nonlinear systems
1175}
1176
1177void
1179{
1180 for (const auto nl_sys_num : make_range(numNonlinearSystems()))
1183}
1184
1185void
1187{
1188 for (auto & map : _pbblf_functors)
1189 for (auto & pr : map)
1190 pr.second->timestepSetup();
1193}
1194
1195void
1197{
1198 for (auto & map : _pbblf_functors)
1199 for (auto & pr : map)
1200 pr.second->customSetup(exec_type);
1201}
1202
1203void
1205{
1206 for (auto & map : _pbblf_functors)
1207 for (auto & pr : map)
1208 pr.second->residualSetup();
1209}
1210
1211void
1213{
1214 for (auto & map : _pbblf_functors)
1215 for (auto & pr : map)
1216 pr.second->jacobianSetup();
1217}
1218
1219void
1221{
1222 if (_show_functors)
1223 {
1224 showFunctors();
1226 }
1229
1230 for (const auto & functors : _functors)
1231 for (const auto & [functor_wrapper_name, functor_wrapper] : functors)
1232 {
1233 const auto & [true_functor_type, non_ad_functor, ad_functor] = functor_wrapper;
1234 mooseAssert(non_ad_functor->wrapsNull() == ad_functor->wrapsNull(), "These must agree");
1235 const auto functor_name = removeSubstring(functor_wrapper_name, "wraps_");
1236 if (non_ad_functor->wrapsNull())
1237 mooseError(
1238 "No functor ever provided with name '",
1239 functor_name,
1240 "', which was requested by '",
1241 MooseUtils::join(libmesh_map_find(_functor_to_requestors, functor_wrapper_name), ","),
1242 "'.");
1243 if (true_functor_type == TrueFunctorIs::NONAD ? non_ad_functor->ownsWrappedFunctor()
1244 : ad_functor->ownsWrappedFunctor())
1245 mooseError("Functor envelopes should not own the functors they wrap, but '",
1246 functor_name,
1247 "' is owned by the wrapper. Please open a MOOSE issue for help resolving this.");
1248 }
1249}
1250
1251void
1253{
1254 _console << "[DBG] Wrapped functors found in Subproblem" << std::endl;
1255 std::string functor_names = "[DBG] ";
1256 for (const auto & functor_pair : _functors[0])
1257 functor_names += std::regex_replace(functor_pair.first, std::regex("wraps_"), "") + " ";
1258 if (functor_names.size())
1259 functor_names.pop_back();
1260 _console << functor_names << std::endl;
1261}
1262
1263void
1265{
1266 for (const auto & [functor, requestors] : _functor_to_requestors)
1267 {
1268 _console << "[DBG] Requestors for wrapped functor "
1269 << std::regex_replace(functor, std::regex("wraps_"), "") << std::endl;
1270 _console << "[DBG] " << MooseUtils::join(requestors, " ") << std::endl;
1271 }
1272}
1273
1274bool
1275SubProblem::hasFunctor(const std::string & name, const THREAD_ID tid) const
1276{
1277 mooseAssert(tid < _functors.size(), "Too large a thread ID");
1278 auto & functors = _functors[tid];
1279 return (functors.find("wraps_" + name) != functors.end());
1280}
1281
1284{
1285 return mesh().getCoordSystem(sid);
1286}
1287
1288void
1290{
1291 for (const auto nl : make_range(numNonlinearSystems()))
1292 assembly(tid, nl).reinitFVFace(fi);
1293}
1294
1295void
1301
1302void
1308
1309void
1315
1316void
1323
1324void
1329
1330void
1335
1336void
1338{
1339 for (const auto tid : make_range(numThreads()))
1340 for (const auto s : make_range(numNonlinearSystems()))
1341 assembly(tid, s).preparePRefinement();
1342}
1343
1344bool
1346{
1347 return mesh().doingPRefinement();
1348}
1349
1350void
1351SubProblem::setCurrentLowerDElem(const Elem * const lower_d_elem, const THREAD_ID tid)
1352{
1353 for (const auto nl_sys_num : make_range(numNonlinearSystems()))
1354 assembly(tid, nl_sys_num).setCurrentLowerDElem(lower_d_elem);
1355}
1356
1357template MooseVariableFEBase &
1359 const std::string & var_name,
1360 Moose::VarKindType expected_var_type,
1361 Moose::VarFieldType expected_var_field_type,
1362 const std::vector<std::shared_ptr<SolverSystem>> & nls,
1363 const SystemBase & aux) const;
1364template MooseVariableFEBase &
1366 const std::string & var_name,
1367 Moose::VarKindType expected_var_type,
1368 Moose::VarFieldType expected_var_field_type,
1369 const std::vector<std::unique_ptr<DisplacedSystem>> & nls,
1370 const SystemBase & aux) const;
1371
1372void
boundary_id_type BoundaryID
subdomain_id_type SubdomainID
unsigned int TagID
Definition MooseTypes.h:238
unsigned int THREAD_ID
Definition MooseTypes.h:237
unsigned int TagTypeID
Definition MooseTypes.h:239
void removeSubstring(std::string &main, const std::string &sub)
unsigned int count
Definition MortarUtils.C:53
char ** blocks
Key structure for APIs manipulating global vectors/matrices.
Definition Assembly.h:837
void cacheJacobianNonlocal(GlobalDataKey)
Takes the values that are currently in _sub_Keg and appends them to the cached values.
Definition Assembly.C:4127
void prepareLowerD()
Prepare the Jacobians and residuals for a lower dimensional element.
Definition Assembly.C:2902
void reinitFVFace(const FaceInfo &fi)
Definition Assembly.C:1896
void cacheResidualNeighbor(GlobalDataKey, const std::vector< VectorTag > &tags)
Takes the values that are currently in _sub_Rn of all field variables and appends them to the cached ...
Definition Assembly.C:3494
void reinitNeighborFaceRef(const Elem *neighbor_elem, unsigned int neighbor_side, Real tolerance, const std::vector< Point > *const pts, const std::vector< Real > *const weights=nullptr)
Reinitialize FE data for the given neighbor_element on the given side with a given set of reference p...
Definition Assembly.C:2245
void prepareNeighbor()
Definition Assembly.C:2864
void cacheJacobianNeighbor(GlobalDataKey)
Takes the values that are currently in the neighbor Dense Matrices and appends them to the cached val...
Definition Assembly.C:4149
void reinitLowerDElem(const Elem *elem, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr)
Reinitialize FE data for a lower dimenesional element with a given set of reference points.
Definition Assembly.C:2344
void cacheJacobian(GlobalDataKey)
Takes the values that are currently in _sub_Kee and appends them to the cached values.
Definition Assembly.C:4097
void setCurrentBoundaryID(BoundaryID i)
set the current boundary ID
Definition Assembly.h:426
void preparePRefinement()
Prepare helper FEs for p-refinement.
Definition Assembly.C:4887
void addCachedJacobian(GlobalDataKey)
Adds the values that have been cached by calling cacheJacobian() and or cacheJacobianNeighbor() to th...
Definition Assembly.C:3852
void cacheResidual(GlobalDataKey, const std::vector< VectorTag > &tags)
Takes the values that are currently in _sub_Re of all field variables and appends them to the cached ...
Definition Assembly.C:3444
void reinitElemFaceRef(const Elem *elem, unsigned int elem_side, Real tolerance, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr)
Reinitialize FE data for the given element on the given side, optionally with a given set of referenc...
Definition Assembly.C:2058
void setCurrentLowerDElem(const Elem *const lower_d_elem)
Set the current lower dimensional element.
Definition Assembly.h:3225
void reinitNeighborLowerDElem(const Elem *elem)
reinitialize a neighboring lower dimensional element
Definition Assembly.C:2437
void reinitMortarElem(const Elem *elem)
reinitialize a mortar segment mesh element in order to get a proper JxW
Definition Assembly.C:2458
void addCachedResiduals(GlobalDataKey, const std::vector< VectorTag > &tags)
Pushes all cached residuals to the global residual vectors associated with each tag.
Definition Assembly.C:3522
std::string outputChainControlMap() const
Output the chain control map to a string.
const ConsoleStream _console
An instance of helper class to write streams to the Console objects.
The DiracKernelInfo object is a place where all the Dirac points added by different DiracKernels are ...
This data structure is used to store geometric and variable related metadata about each cell face in ...
Definition FaceInfo.h:38
void reinit()
Completely redo all geometric search objects.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
This method takes a space delimited list of parameter names and adds them to the specified group name...
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object.
ChainControlDataSystem & getChainControlDataSystem()
Gets the system that manages the ChainControls.
Definition MooseApp.h:895
THREAD_ID numThreads() const
Returns the number of threads this application uses.
Definition MooseApp.h:421
const std::string & type() const
Get the type of this class.
Definition MooseBase.h:93
const std::string & name() const
Get the name of the class.
Definition MooseBase.h:103
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
Definition MooseBase.h:271
MooseApp & getMooseApp() const
Get the MooseApp this class is associated with.
Definition MooseBase.h:87
Class for containing MooseEnum item information.
unsigned int getAxisymmetricRadialCoord() const
Returns the desired radial direction for RZ coordinate transformation.
Definition MooseMesh.C:4378
MeshBase & getMesh()
Accessor for the underlying libMesh Mesh object.
Definition MooseMesh.C:3512
Moose::CoordinateSystemType getCoordSystem(SubdomainID sid) const
Get the coordinate system type, e.g.
Definition MooseMesh.C:4259
void doingPRefinement(bool doing_p_refinement)
Indicate whether the kind of adaptivity we're doing includes p-refinement.
Definition MooseMesh.h:1502
A class for storing the names of MooseObject by tag and object name.
MooseApp & _app
The MOOSE application this is associated with.
Definition MooseBase.h:375
This class provides an interface for common operations on field variables of both FE and FV types wit...
virtual Moose::VarFieldType fieldType() const =0
Field type of this variable.
Class that hold the whole problem being solved.
Definition Problem.h:20
static InputParameters validParams()
Definition Problem.C:15
const std::map< MooseObjectName, std::set< std::string > > & getConsumedPropertyMap() const
Return the map that tracks the object with consumed material properties.
Definition SubProblem.C:734
std::vector< std::map< std::string, std::unique_ptr< Moose::FunctorAbstract > > > _pbblf_functors
Container to hold PiecewiseByBlockLambdaFunctors.
virtual void clearActiveFEVariableCoupleableVectorTags(const THREAD_ID tid)
Definition SubProblem.C:370
void showFunctorRequestors() const
Lists all functors and all the objects that requested them.
void addConsumedPropertyName(const MooseObjectName &obj_name, const std::string &prop_name)
Helper for tracking the object that is consuming a property for MaterialPropertyDebugOutput.
Definition SubProblem.C:728
THREAD_ID numThreads() const
Definition SubProblem.C:81
std::vector< VectorTag > _vector_tags
The declared vector tags.
virtual void storeSubdomainMatPropName(SubdomainID block_id, const std::string &name)
Adds the given material property to a storage map based on block ids.
Definition SubProblem.C:575
void reinitFVFace(const THREAD_ID tid, const FaceInfo &fi)
reinitialize the finite volume assembly data for the provided face and thread
void showFunctors() const
Lists all functors in the problem.
virtual MooseMesh & mesh()=0
virtual unsigned int currentNlSysNum() const =0
virtual void checkBoundaryMatProps()
Checks boundary material properties integrity.
Definition SubProblem.C:657
virtual void cacheJacobianNeighbor(const THREAD_ID tid)
virtual void storeBoundaryDelayedCheckMatProp(const std::string &requestor, BoundaryID boundary_id, const std::string &name)
Adds to a map based on boundary ids of material properties to validate.
Definition SubProblem.C:607
virtual unsigned int nLinearIterations(const unsigned int nl_sys_num) const
Definition SubProblem.C:758
virtual TagName vectorTagName(const TagID tag) const
Retrieve the name associated with a TagID.
Definition SubProblem.C:213
std::string restrictionBoundaryCheckName(BoundaryID check_id)
Definition SubProblem.C:775
void removeAlgebraicGhostingFunctor(libMesh::GhostingFunctor &algebraic_gf)
Remove an algebraic ghosting functor from this problem's DofMaps.
std::map< BoundaryID, std::multimap< std::string, std::string > > _map_boundary_material_props_check
unsigned int getAxisymmetricRadialCoord() const
Returns the desired radial direction for RZ coordinate transformation.
Definition SubProblem.C:788
std::vector< std::vector< VectorTag > > _typed_vector_tags
The vector tags associated with each VectorTagType This is kept separate from _vector_tags for quick ...
virtual void markMatPropRequested(const std::string &)
Helper method for adding a material property name to the _material_property_requested set.
Definition SubProblem.C:716
const bool & currentlyComputingJacobian() const
Returns true if the problem is in the process of computing the Jacobian.
Definition SubProblem.h:695
virtual bool hasBoundaryMaterialProperty(BoundaryID boundary_id, const std::string &prop_name)
Check if a material property is defined on a block.
Definition SubProblem.C:562
virtual void checkBlockMatProps()
Checks block material properties integrity.
Definition SubProblem.C:615
virtual TagID getVectorTagID(const TagName &tag_name) const
Get a TagID from a TagName.
Definition SubProblem.C:195
std::vector< std::set< TagID > > _active_fe_var_coupleable_vector_tags
virtual void clearActiveFEVariableCoupleableMatrixTags(const THREAD_ID tid)
Definition SubProblem.C:376
virtual Moose::VectorTagType vectorTagType(const TagID tag_id) const
Definition SubProblem.C:223
virtual std::size_t numNonlinearSystems() const =0
virtual bool hasLinearVariable(const std::string &var_name) const
Whether or not this problem has this linear variable.
Definition SubProblem.C:794
void reinitNodesNeighbor(const std::vector< dof_id_type > &nodes, const THREAD_ID tid)
Definition SubProblem.C:987
void clearAllDofIndices()
Clear dof indices from variables in nl and aux systems.
bool hasFunctor(const std::string &name, const THREAD_ID tid) const
checks whether we have a functor corresponding to name on the thread id tid
virtual void reinitElemFaceRef(const Elem *elem, unsigned int side, Real tolerance, const std::vector< Point > *const pts, const std::vector< Real > *const weights=nullptr, const THREAD_ID tid=0)
reinitialize FE objects on a given element on a given side at a given set of reference points and the...
Definition SubProblem.C:874
virtual const VectorTag & getVectorTag(const TagID tag_id) const
Get a VectorTag from a TagID.
Definition SubProblem.C:153
virtual const std::set< MooseVariableFieldBase * > & getActiveElementalMooseVariables(const THREAD_ID tid) const
Get the MOOSE variables to be reinited on each element.
Definition SubProblem.C:446
std::map< TagID, TagName > _matrix_tag_id_to_tag_name
Reverse map.
virtual void customSetup(const ExecFlagType &exec_type)
virtual const SystemBase & systemBaseNonlinear(const unsigned int sys_num) const =0
Return the nonlinear system object as a base class reference given the system number.
virtual void setCurrentBoundaryID(BoundaryID bid, const THREAD_ID tid)
sets the current boundary ID in assembly
Definition SubProblem.C:781
virtual void cacheResidual(const THREAD_ID tid)
virtual void jacobianSetup()
virtual void initialSetup()
virtual void cacheJacobian(const THREAD_ID tid)
std::vector< VectorTag > getVectorTags(const std::set< TagID > &tag_ids) const
Definition SubProblem.C:164
bool doingPRefinement() const
std::map< MooseObjectName, std::set< std::string > > _consumed_material_properties
virtual DiracKernelInfo & diracKernelInfo()
Definition SubProblem.C:740
virtual unsigned int nNonlinearIterations(const unsigned int nl_sys_num) const
Definition SubProblem.C:752
void preparePRefinement()
Prepare DofMap and Assembly classes with our p-refinement information.
static InputParameters validParams()
Definition SubProblem.C:34
virtual TagID getMatrixTagID(const TagName &tag_name) const
Get a TagID from a TagName.
Definition SubProblem.C:334
std::unordered_map< libMesh::GhostingFunctor *, std::vector< std::shared_ptr< libMesh::GhostingFunctor > > > _root_coupling_gf_to_sys_clones
A map from a root coupling ghosting functor, e.g.
void reinitNeighborLowerDElem(const Elem *elem, const THREAD_ID tid=0)
reinitialize a neighboring lower dimensional element
Definition SubProblem.C:995
virtual void storeBoundaryMatPropName(BoundaryID boundary_id, const std::string &name)
Adds the given material property to a storage map based on boundary ids.
Definition SubProblem.C:581
void removeCouplingGhostingFunctor(libMesh::GhostingFunctor &coupling_gf)
Remove a coupling ghosting functor from this problem's DofMaps.
virtual void setActiveScalarVariableCoupleableMatrixTags(std::set< TagID > &mtags, const THREAD_ID tid)
Definition SubProblem.C:394
virtual std::set< SubdomainID > getMaterialPropertyBlocks(const std::string &prop_name)
Get a vector containing the block ids the material property is defined on.
Definition SubProblem.C:465
std::map< TagName, TagID > _vector_tags_name_map
Map of vector tag TagName to TagID.
virtual void reinitNeighborFaceRef(const Elem *neighbor_elem, unsigned int neighbor_side, Real tolerance, const std::vector< Point > *const pts, const std::vector< Real > *const weights=nullptr, const THREAD_ID tid=0)
reinitialize FE objects on a given neighbor element on a given side at a given set of reference point...
Definition SubProblem.C:913
std::map< SubdomainID, std::set< MaterialPropertyName > > _zero_block_material_props
Set of properties returned as zero properties.
virtual bool hasNonlocalCoupling() const =0
Whether the simulation has active nonlocal coupling which should be accounted for in the Jacobian.
std::vector< std::set< TagID > > _active_sc_var_coupleable_vector_tags
std::vector< std::set< MooseVariableFieldBase * > > _active_elemental_moose_variables
This is the set of MooseVariableFieldBase that will actually get reinited by a call to reinit(elem)
virtual unsigned int numVectorTags(const Moose::VectorTagType type=Moose::VECTOR_TAG_ANY) const
The total number of tags, which can be limited to the tag type.
Definition SubProblem.C:187
void reinitNodes(const std::vector< dof_id_type > &nodes, const THREAD_ID tid)
Definition SubProblem.C:979
void cloneCouplingGhostingFunctor(libMesh::GhostingFunctor &coupling_gf, bool to_mesh=true)
Creates (n_sys - 1) clones of the provided coupling ghosting functor (corresponding to the nonlinear ...
std::map< std::string, std::set< std::string > > _functor_to_requestors
The requestors of functors where the key is the prop name and the value is a set of names of requesto...
virtual std::size_t numSolverSystems() const =0
virtual TagName matrixTagName(TagID tag)
Retrieve the name associated with a TagID.
Definition SubProblem.C:349
void addNotZeroedVectorTag(const TagID tag)
Adds a vector tag to the list of vectors that will not be zeroed when other tagged vectors are.
Definition SubProblem.C:141
virtual Assembly & assembly(const THREAD_ID tid, const unsigned int sys_num)=0
std::vector< std::set< TagID > > _active_sc_var_coupleable_matrix_tags
DiracKernelInfo _dirac_kernel_info
virtual bool hasActiveElementalMooseVariables(const THREAD_ID tid) const
Whether or not a list of active elemental moose variables has been set.
Definition SubProblem.C:452
virtual std::size_t numLinearSystems() const =0
bool _show_chain_control_data
Whether to output a list of all the chain control data.
virtual std::pair< bool, unsigned int > determineSolverSystem(const std::string &var_name, bool error_if_not_found=false) const =0
virtual Real finalNonlinearResidual(const unsigned int nl_sys_num) const
Definition SubProblem.C:746
void reinitMortarElem(const Elem *elem, const THREAD_ID tid=0)
Reinit a mortar element to obtain a valid JxW.
virtual void storeSubdomainZeroMatProp(SubdomainID block_id, const MaterialPropertyName &name)
Adds to a map based on block ids of material properties for which a zero value can be returned.
Definition SubProblem.C:587
virtual void setActiveFEVariableCoupleableMatrixTags(std::set< TagID > &mtags, const THREAD_ID tid)
Definition SubProblem.C:355
virtual bool solverSystemConverged(const unsigned int sys_num)
Definition SubProblem.h:103
bool verifyVectorTags() const
Verify the integrity of _vector_tags and _typed_vector_tags.
Definition SubProblem.C:233
virtual TagID addVectorTag(const TagName &tag_name, const Moose::VectorTagType type=Moose::VECTOR_TAG_RESIDUAL)
Create a Tag.
Definition SubProblem.C:84
std::unordered_set< TagID > _not_zeroed_tagged_vectors
the list of vector tags that will not be zeroed when all other tags are
void addCouplingGhostingFunctor(libMesh::GhostingFunctor &coupling_gf, bool to_mesh=true)
Add a coupling functor to this problem's DofMaps.
virtual const SystemBase & systemBaseLinear(const unsigned int sys_num) const =0
Return the linear system object as a base class reference given the system number.
void addAlgebraicGhostingFunctor(libMesh::GhostingFunctor &algebraic_gf, bool to_mesh=true)
Add an algebraic ghosting functor to this problem's DofMaps.
virtual bool hasBlockMaterialProperty(SubdomainID block_id, const std::string &prop_name)
Check if a material property is defined on a block.
Definition SubProblem.C:503
static void selectVectorTagsFromSystem(const SystemBase &system, const std::vector< VectorTag > &input_vector_tags, std::set< TagID > &selected_tags)
Select the vector tags which belong to a specific system.
Definition SubProblem.C:281
virtual void setActiveScalarVariableCoupleableVectorTags(std::set< TagID > &vtags, const THREAD_ID tid)
Definition SubProblem.C:401
const std::set< TagID > & getActiveScalarVariableCoupleableMatrixTags(const THREAD_ID tid) const
Definition SubProblem.C:423
std::map< SubdomainID, std::multimap< std::string, std::string > > _map_block_material_props_check
Data structures of the requested material properties.
virtual void clearActiveScalarVariableCoupleableVectorTags(const THREAD_ID tid)
Definition SubProblem.C:411
std::unordered_map< libMesh::GhostingFunctor *, std::vector< std::shared_ptr< libMesh::GhostingFunctor > > > _root_alg_gf_to_sys_clones
A map from a root algebraic ghosting functor, e.g.
const std::set< TagID > & getActiveFEVariableCoupleableMatrixTags(const THREAD_ID tid) const
Definition SubProblem.C:382
virtual void setActiveFEVariableCoupleableVectorTags(std::set< TagID > &vtags, const THREAD_ID tid)
Definition SubProblem.C:361
virtual void clearActiveElementalMooseVariables(const THREAD_ID tid)
Clear the active elemental MooseVariableFieldBase.
Definition SubProblem.C:458
void cloneAlgebraicGhostingFunctor(libMesh::GhostingFunctor &algebraic_gf, bool to_mesh=true)
Creates (n_sys - 1) clones of the provided algebraic ghosting functor (corresponding to the nonlinear...
static void selectMatrixTagsFromSystem(const SystemBase &system, const std::map< TagName, TagID > &input_matrix_tags, std::set< TagID > &selected_tags)
Select the matrix tags which belong to a specific system.
Definition SubProblem.C:292
std::vector< std::multimap< std::string, std::tuple< TrueFunctorIs, std::unique_ptr< Moose::FunctorEnvelopeBase >, std::unique_ptr< Moose::FunctorEnvelopeBase > > > > _functors
A container holding pointers to all the functors in our problem.
std::string restrictionSubdomainCheckName(SubdomainID check_id)
Helper functions for checking MaterialProperties.
Definition SubProblem.C:764
bool vectorTagNotZeroed(const TagID tag) const
Checks if a vector tag is in the list of vectors that will not be zeroed when other tagged vectors ar...
Definition SubProblem.C:147
virtual const SystemBase & systemBaseAuxiliary() const =0
Return the auxiliary system object as a base class reference.
Moose::CoordinateSystemType getCoordSystem(SubdomainID sid) const
virtual void clearActiveScalarVariableCoupleableMatrixTags(const THREAD_ID tid)
Definition SubProblem.C:417
virtual void setCurrentLowerDElem(const Elem *const lower_d_elem, const THREAD_ID tid)
Set the current lower dimensional element.
virtual bool matrixTagExists(const TagName &tag_name) const
Check to see if a particular Tag exists.
Definition SubProblem.C:320
MooseVariableFieldBase & getVariableHelper(const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type, Moose::VarFieldType expected_var_field_type, const std::vector< T > &nls, const SystemBase &aux) const
Helper function called by getVariable that handles the logic for checking whether Variables of the re...
virtual std::set< BoundaryID > getMaterialPropertyBoundaryIDs(const std::string &prop_name)
Get a vector containing the block ids the material property is defined on.
Definition SubProblem.C:517
std::map< BoundaryID, std::set< std::string > > _map_boundary_material_props
Map for boundary material properties (boundary_id -> list of properties)
virtual void addCachedResidual(const THREAD_ID tid)
virtual void addCachedJacobian(const THREAD_ID tid)
virtual TagID addMatrixTag(TagName tag_name)
Create a Tag.
Definition SubProblem.C:303
SubProblem(const InputParameters &parameters)
Definition SubProblem.C:49
std::map< SubdomainID, std::set< std::string > > _map_block_material_props
Map of material properties (block_id -> list of properties)
virtual libMesh::EquationSystems & es()=0
std::set< std::string > _material_property_requested
set containing all material property names that have been requested by getMaterialProperty*
bool _show_functors
Whether to output a list of the functors used and requested (currently only at initialSetup)
virtual bool hasAuxiliaryVariable(const std::string &var_name) const
Whether or not this problem has this auxiliary variable.
Definition SubProblem.C:803
std::vector< std::set< TagID > > _active_fe_var_coupleable_matrix_tags
virtual std::vector< BoundaryName > getMaterialPropertyBoundaryNames(const std::string &prop_name)
Get a vector of block id equivalences that the material property is defined on.
Definition SubProblem.C:533
std::map< BoundaryID, std::set< MaterialPropertyName > > _zero_boundary_material_props
virtual void setActiveElementalMooseVariables(const std::set< MooseVariableFieldBase * > &moose_vars, const THREAD_ID tid)
Set the MOOSE variables to be reinited on each element.
Definition SubProblem.C:435
virtual void timestepSetup()
virtual bool hasVariable(const std::string &var_name) const =0
Whether or not this problem has the variable.
virtual const std::vector< VectorTag > & currentResidualVectorTags() const =0
Return the residual vector tags we are currently computing.
std::map< TagName, TagID > _matrix_tag_name_to_tag_id
The currently declared tags.
virtual const SystemBase & systemBaseSolver(const unsigned int sys_num) const =0
Return the solver system object as a base class reference given the system number.
virtual bool nlConverged(const unsigned int nl_sys_num)
Definition SubProblem.C:708
virtual bool vectorTagExists(const TagID tag_id) const
Check to see if a particular Tag exists.
Definition SubProblem.h:204
virtual void cacheResidualNeighbor(const THREAD_ID tid)
virtual void storeSubdomainDelayedCheckMatProp(const std::string &requestor, SubdomainID block_id, const std::string &name)
Adds to a map based on block ids of material properties to validate.
Definition SubProblem.C:599
const std::set< TagID > & getActiveFEVariableCoupleableVectorTags(const THREAD_ID tid) const
Definition SubProblem.C:388
virtual std::vector< SubdomainName > getMaterialPropertyBlockNames(const std::string &prop_name)
Get a vector of block id equivalences that the material property is defined on.
Definition SubProblem.C:481
std::vector< std::multimap< std::string, std::pair< bool, bool > > > _functor_to_request_info
A multimap (for each thread) from unfilled functor requests to whether the requests were for AD funct...
virtual void residualSetup()
virtual bool isMatPropRequested(const std::string &prop_name) const
Find out if a material property has been requested by any object.
Definition SubProblem.C:722
const std::set< TagID > & getActiveScalarVariableCoupleableVectorTags(const THREAD_ID tid) const
Definition SubProblem.C:429
const bool & currentlyComputingResidualAndJacobian() const
Returns true if the problem is in the process of computing the residual and the Jacobian.
std::vector< unsigned int > _has_active_elemental_moose_variables
Whether or not there is currently a list of active elemental moose variables.
virtual GeometricSearchData & geomSearchData()=0
virtual void storeBoundaryZeroMatProp(BoundaryID boundary_id, const MaterialPropertyName &name)
Adds to a map based on boundary ids of material properties for which a zero value can be returned.
Definition SubProblem.C:593
void reinitGeomSearch()
reinitialize this object's geometric search data, e.g.
bool automaticScaling() const
Automatic scaling getter.
virtual ~SubProblem()
Definition SubProblem.C:78
virtual void reinitLowerDElem(const Elem *lower_d_elem, const THREAD_ID tid, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr)
Definition SubProblem.C:949
Base class for a system (of equations)
Definition SystemBase.h:87
virtual void prepareNeighbor(THREAD_ID tid)
Prepare the system for use.
Definition SystemBase.C:326
bool automaticScaling() const
Getter for whether we are performing automatic scaling.
Definition SystemBase.h:126
virtual void reinitNodes(const std::vector< dof_id_type > &nodes, THREAD_ID tid)
Reinit variables at a set of nodes.
Definition SystemBase.C:424
virtual void reinitNeighborFace(const Elem *elem, unsigned int side, THREAD_ID tid)
Compute the values of the variables at all the current points.
Definition SystemBase.C:376
bool hasVector(const std::string &tag_name) const
Check if the named vector exists in the system.
Definition SystemBase.C:924
MooseVariableFieldBase & getVariable(THREAD_ID tid, const std::string &var_name) const
Gets a reference to a variable of with specified name.
Definition SystemBase.C:92
void setActiveScalarVariableCoupleableVectorTags(const std::set< TagID > &vtags, THREAD_ID tid)
Set the active vector tags for the scalar variables.
virtual void reinitNodesNeighbor(const std::vector< dof_id_type > &nodes, THREAD_ID tid)
Reinit variables at a set of neighbor nodes.
Definition SystemBase.C:435
virtual void reinitLowerD(THREAD_ID tid)
Compute the values of the variables on the lower dimensional element.
Definition SystemBase.C:392
virtual void prepare(THREAD_ID tid)
Prepare the system for use.
Definition SystemBase.C:258
virtual void reinitElemFace(const Elem *elem, unsigned int side, THREAD_ID tid)
Reinit assembly info for a side of an element.
Definition SystemBase.C:368
virtual bool hasVariable(const std::string &var_name) const
Query a system for a variable.
Definition SystemBase.C:851
void clearAllDofIndices()
Clear all dof indices from moose variables.
virtual bool hasMatrix(TagID tag) const
Check if the tagged matrix exists in the system.
Definition SystemBase.h:391
void setActiveVariableCoupleableVectorTags(const std::set< TagID > &vtags, THREAD_ID tid)
Set the active vector tags for the variables.
virtual libMesh::System & system()=0
Get the reference to the libMesh system.
virtual void prepareLowerD(THREAD_ID tid)
Prepare the system for use for lower dimensional elements.
Definition SystemBase.C:334
Storage for all of the information pretaining to a vector tag.
Definition VectorTag.h:18
void add_coupling_functor(GhostingFunctor &coupling_functor, bool to_mesh=true)
unsigned int n_systems() const
const T_sys & get_system(std::string_view name) const
virtual std::unique_ptr< GhostingFunctor > clone() const=0
const MeshBase * get_mesh() const
const DofMap & get_dof_map() const
std::string toUpper(std::string name)
Convert supplied string to upper case.
std::string toLower(std::string name)
Convert supplied string to lower case.
@ VAR_FIELD_ANY
Definition MooseTypes.h:781
@ VECTOR_TAG_ANY
std::string stringify(const T &t)
conversion to string
Definition Conversion.h:65
CoordinateSystemType
Definition MooseTypes.h:864
VarKindType
Framework-wide stuff.
Definition MooseTypes.h:769
@ VAR_ANY
Definition MooseTypes.h:772
@ VAR_AUXILIARY
Definition MooseTypes.h:771
@ VAR_SOLVER
Definition MooseTypes.h:770
const BoundaryID ANY_BOUNDARY_ID
Definition MooseTypes.C:21