https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | List of all members
ComputeFVFluxJacobianThread< RangeType > Class Template Reference

#include <ComputeFVFluxThread.h>

Inheritance diagram for ComputeFVFluxJacobianThread< RangeType >:
[legend]

Public Member Functions

 ComputeFVFluxJacobianThread (FEProblemBase &fe_problem, const unsigned int nl_system_num, const std::set< TagID > &tags, bool on_displaced)
 
 ComputeFVFluxJacobianThread (ComputeFVFluxJacobianThread &x, Threads::split split)
 
virtual void onFace (const FaceInfo &fi) override
 
virtual void pre () override
 This is called once before all face-looping.
 
virtual void post () override
 This is called once after all face-looping is finished.
 
virtual void onBoundary (const FaceInfo &fi, BoundaryID boundary) override
 This is called once for every face that is on a boundary after onFace is called for the face.
 
virtual void subdomainChanged () override
 Called every time the current subdomain changes (i.e.
 
virtual void neighborSubdomainChanged () override
 Called every time the neighbor subdomain changes (i.e.
 
virtual void operator() (const RangeType &range, bool bypass_threading=false)
 
void join (const ThreadedFaceLoop &y)
 
void caughtMooseException (MooseException &e)
 Called if a MooseException is caught anywhere during the computation.
 

Protected Member Functions

void postFace (const FaceInfo &fi) override
 This is called once for each face after all face and boundary callbacks have been finished for that face.
 
void compute (FVFaceResidualObject &ro, const FaceInfo &fi) override
 call either computeResidual, computeJacobian, or computeResidualAndJacobian on the provided residual object depending on what derived class of this class is instantiated
 
void setup (SetupInterface &obj) override
 call either residualSetup or jacobianSetup depending on what derived class of this class is instantiated
 
void addCached () override
 call either addCachedJacobian or addCachedResidual or both depending on what derived class of this class is instantiated
 
void resetExecutionPrinting ()
 Reset lists of blocks and boundaries for which execution printing has been done.
 

Protected Attributes

unsigned int _num_cached
 
FEProblemBase_fe_problem
 
MooseMesh_mesh
 
const std::set< TagID > & _tags
 
THREAD_ID _tid
 
const unsigned int _nl_system_num
 
const bool _on_displaced
 Whether this loop is operating on the displaced mesh.
 
SubProblem_subproblem
 FEProblemBase or DisplacedProblem depending on _on_displaced.
 
SubdomainID _subdomain
 The subdomain for the current element.
 
SubdomainID _old_subdomain
 The subdomain for the last element.
 
SubdomainID _neighbor_subdomain
 The subdomain for the current neighbor.
 
SubdomainID _old_neighbor_subdomain
 The subdomain for the last neighbor.
 
std::set< std::pair< const SubdomainID, const SubdomainID > > _blocks_exec_printed
 Set to keep track of blocks for which we have printed the execution pattern.
 
std::set< BoundaryID_boundaries_exec_printed
 Set to keep track of boundaries for which we have printed the execution pattern.
 
std::string _error_message
 Holds caught runtime error messages.
 

Private Member Functions

void reinitVariables (const FaceInfo &fi)
 
void finalizeContainers ()
 
virtual void printGeneralExecutionInformation () const override
 Print list of object types executed and in which order.
 
virtual void printBlockExecutionInformation () const override
 Print ordering of objects executed on each block.
 
virtual void printBoundaryExecutionInformation (const BoundaryID bnd_id) const override
 Print ordering of objects exected on each boundary.
 
std::pair< SubdomainName, SubdomainName > getBlockNames () const
 Utility to get the subdomain names from the ids.
 

Private Attributes

std::set< MooseVariableFieldBase * > _fv_vars
 Variables.
 
std::set< MooseVariableFieldBase * > _elem_sub_fv_vars
 
std::set< MooseVariableFieldBase * > _neigh_sub_fv_vars
 
std::set< FVFluxKernel * > _fv_flux_kernels
 FVFluxKernels.
 
std::set< FVFluxKernel * > _elem_sub_fv_flux_kernels
 
std::set< FVFluxKernel * > _neigh_sub_fv_flux_kernels
 
std::vector< std::shared_ptr< MaterialBase > > _elem_face_mats
 Element face materials.
 
std::vector< std::shared_ptr< MaterialBase > > _elem_sub_elem_face_mats
 
std::vector< std::shared_ptr< MaterialBase > > _neigh_sub_elem_face_mats
 
std::vector< std::shared_ptr< MaterialBase > > _neigh_face_mats
 
std::vector< std::shared_ptr< MaterialBase > > _elem_sub_neigh_face_mats
 
std::vector< std::shared_ptr< MaterialBase > > _neigh_sub_neigh_face_mats
 
const bool _scaling_jacobian
 
const bool _scaling_residual
 
const bool _zeroth_copy
 Whether this is the zeroth threaded copy of this body.
 
const bool _incoming_throw_on_error
 The value of Moose::_throw_on_error at the time of construction.
 

Detailed Description

template<typename RangeType>
class ComputeFVFluxJacobianThread< RangeType >

Definition at line 871 of file ComputeFVFluxThread.h.

Constructor & Destructor Documentation

◆ ComputeFVFluxJacobianThread() [1/2]

template<typename RangeType >
ComputeFVFluxJacobianThread< RangeType >::ComputeFVFluxJacobianThread ( FEProblemBase fe_problem,
const unsigned int  nl_system_num,
const std::set< TagID > &  tags,
bool  on_displaced 
)

Definition at line 893 of file ComputeFVFluxThread.h.

898 : ComputeFVFluxThread<RangeType, AttribMatrixTags>(fe_problem, nl_system_num, tags, on_displaced)
899{
900}
Base class for assembly-like calculations.

◆ ComputeFVFluxJacobianThread() [2/2]

template<typename RangeType >
ComputeFVFluxJacobianThread< RangeType >::ComputeFVFluxJacobianThread ( ComputeFVFluxJacobianThread< RangeType > &  x,
Threads::split  split 
)

Definition at line 903 of file ComputeFVFluxThread.h.

Member Function Documentation

◆ addCached()

template<typename RangeType >
void ComputeFVFluxJacobianThread< RangeType >::addCached ( )
inlineoverrideprotectedvirtual

call either addCachedJacobian or addCachedResidual or both depending on what derived class of this class is instantiated

Implements ComputeFVFluxThread< RangeType, AttribMatrixTags >.

Definition at line 889 of file ComputeFVFluxThread.h.

889{ this->_subproblem.SubProblem::addCachedJacobian(_tid); }
SubProblem & _subproblem
FEProblemBase or DisplacedProblem depending on _on_displaced.

◆ caughtMooseException()

template<typename RangeType >
void ThreadedFaceLoop< RangeType >::caughtMooseException ( MooseException e)
inlineinherited

Called if a MooseException is caught anywhere during the computation.

Definition at line 116 of file ComputeFVFluxThread.h.

117 {
118 Threads::spin_mutex::scoped_lock lock(threaded_element_mutex);
119 std::string what(e.what());
121 }
static Threads::spin_mutex threaded_element_mutex
This mutex is used by all derived classes of the ThreadedElementLoop.
virtual void setException(const std::string &message)
Set an exception, which is stored at this point by toggling a member variable in this class,...
virtual const char * what() const
Get out the error message.
FEProblemBase & _fe_problem

◆ compute()

template<typename RangeType >
void ComputeFVFluxJacobianThread< RangeType >::compute ( FVFaceResidualObject ro,
const FaceInfo fi 
)
inlineoverrideprotectedvirtual

call either computeResidual, computeJacobian, or computeResidualAndJacobian on the provided residual object depending on what derived class of this class is instantiated

Implements ComputeFVFluxThread< RangeType, AttribMatrixTags >.

Definition at line 887 of file ComputeFVFluxThread.h.

887{ ro.computeJacobian(fi); }
virtual void computeJacobian(const FaceInfo &fi)=0
Compute the jacobian on the supplied face.

◆ finalizeContainers()

void ComputeFVFluxThread< RangeType, AttribMatrixTags >::finalizeContainers ( )
privateinherited

Definition at line 408 of file ComputeFVFluxThread.h.

579{
580 //
581 // Finalize our variables
582 //
583 std::set_union(_elem_sub_fv_vars.begin(),
584 _elem_sub_fv_vars.end(),
585 _neigh_sub_fv_vars.begin(),
586 _neigh_sub_fv_vars.end(),
587 std::inserter(_fv_vars, _fv_vars.begin()));
588
589 //
590 // Finalize our kernels
591 //
592 const bool same_kernels = _elem_sub_fv_flux_kernels == _neigh_sub_fv_flux_kernels;
593 if (same_kernels)
595 else
596 std::set_union(_elem_sub_fv_flux_kernels.begin(),
600 std::inserter(_fv_flux_kernels, _fv_flux_kernels.begin()));
601 const bool need_ghosting = !same_kernels;
602
603 //
604 // Finalize our element face materials
605 //
607
608 if (need_ghosting)
609 // Add any element face materials from the neighboring subdomain that do not exist on the
610 // element subdomain
611 for (std::shared_ptr<MaterialBase> neigh_sub_elem_face_mat : _neigh_sub_elem_face_mats)
614 neigh_sub_elem_face_mat) == _elem_sub_elem_face_mats.end())
615 _elem_face_mats.push_back(neigh_sub_elem_face_mat);
616
617 //
618 // Finalize our neighbor face materials
619 //
621
622 if (need_ghosting)
623 // Add any neighbor face materials from the element subdomain that do not exist on the
624 // neighbor subdomain
625 for (std::shared_ptr<MaterialBase> elem_sub_neigh_face_mat : _elem_sub_neigh_face_mats)
628 elem_sub_neigh_face_mat) == _neigh_sub_neigh_face_mats.end())
629 _neigh_face_mats.push_back(elem_sub_neigh_face_mat);
630}
if(!dmm->_nl) SETERRQ(PETSC_COMM_WORLD
std::vector< std::shared_ptr< MaterialBase > > _elem_face_mats
Element face materials.
std::vector< std::shared_ptr< MaterialBase > > _neigh_sub_elem_face_mats
std::set< MooseVariableFieldBase * > _neigh_sub_fv_vars
std::vector< std::shared_ptr< MaterialBase > > _elem_sub_elem_face_mats
std::set< FVFluxKernel * > _fv_flux_kernels
FVFluxKernels.
std::set< MooseVariableFieldBase * > _fv_vars
Variables.
std::set< MooseVariableFieldBase * > _elem_sub_fv_vars
std::vector< std::shared_ptr< MaterialBase > > _neigh_face_mats
std::vector< std::shared_ptr< MaterialBase > > _neigh_sub_neigh_face_mats
std::vector< std::shared_ptr< MaterialBase > > _elem_sub_neigh_face_mats
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
Definition KokkosUtils.h:40

◆ getBlockNames()

std::pair< SubdomainName, SubdomainName > ComputeFVFluxThread< RangeType, AttribMatrixTags >::getBlockNames ( ) const
privateinherited

Utility to get the subdomain names from the ids.

Definition at line 420 of file ComputeFVFluxThread.h.

1096{
1097 auto block_names = std::make_pair(_mesh.getSubdomainName(_subdomain),
1099 if (block_names.first == "")
1100 block_names.first = Moose::stringify(_subdomain);
1101 if (block_names.second == "")
1102 block_names.second = Moose::stringify(_neighbor_subdomain);
1103 return block_names;
1104}
const std::string & getSubdomainName(SubdomainID subdomain_id) const
Return the name of a block given an id.
Definition MooseMesh.C:1751
SubdomainID _subdomain
The subdomain for the current element.
SubdomainID _neighbor_subdomain
The subdomain for the current neighbor.
std::string stringify(const T &t)
conversion to string
Definition Conversion.h:64

◆ join()

template<typename RangeType >
void ThreadedFaceLoop< RangeType >::join ( const ThreadedFaceLoop< RangeType > &  y)
inherited

Definition at line 227 of file ComputeFVFluxThread.h.

228{
229 if (_error_message.empty() && !y._error_message.empty())
231}
std::string _error_message
Holds caught runtime error messages.

◆ neighborSubdomainChanged()

void ComputeFVFluxThread< RangeType, AttribMatrixTags >::neighborSubdomainChanged ( )
overridevirtualinherited

Called every time the neighbor subdomain changes (i.e.

the subdomain of this face's neighbor element is not the same as the subdomain of the last face's neighbor element).

Reimplemented from ThreadedFaceLoop< RangeType >.

Definition at line 372 of file ComputeFVFluxThread.h.

695{
697
698 // Clear variables
699 _fv_vars.clear();
700 _neigh_sub_fv_vars.clear();
701
702 // Clear kernels
703 _fv_flux_kernels.clear();
705
706 // Clear element face materials
707 _elem_face_mats.clear();
709
710 // Clear neighbor face materials
711 _neigh_face_mats.clear();
713
714 // TODO: do this for other relevant objects - like FV BCs, FV source term
715 // kernels, etc. - but we don't need to add them for other types of objects
716 // like FE or DG kernels because those kernels don't run in this loop. Do we
717 // really want to integrate fv source kernels into this loop?
718 std::vector<FVFluxKernel *> kernels;
720 .query()
721 .template condition<AttribSysNum>(_nl_system_num)
722 .template condition<AttribSystem>("FVFluxKernel")
723 .template condition<AttribDisplaced>(_on_displaced)
724 .template condition<AttribSubdomains>(_neighbor_subdomain)
725 .template condition<AttribThread>(_tid)
726 .template condition<AttributeTagType>(_tags)
727 .queryInto(kernels);
728
729 _neigh_sub_fv_flux_kernels = std::set<FVFluxKernel *>(kernels.begin(), kernels.end());
730
731 for (auto * k : _neigh_sub_fv_flux_kernels)
732 {
733 // TODO: we need a better way to do this - especially when FE objects begin to
734 // couple to FV vars. This code shoud be refactored out into one place
735 // where it is easy for users to say initialize all materials and
736 // variables needed by these objects for me.
737 const auto & deps = k->getMooseVariableDependencies();
738 for (auto var : deps)
739 {
740 mooseAssert(var->isFV(),
741 "We do not currently support coupling of FE variables into FV objects");
742 _neigh_sub_fv_vars.insert(var);
743 }
744 }
745
750 _tid);
751
753}
void getFVMatsAndDependencies(SubdomainID block_id, std::vector< std::shared_ptr< MaterialBase > > &face_materials, std::vector< std::shared_ptr< MaterialBase > > &neighbor_materials, std::set< MooseVariableFieldBase * > &variables, const THREAD_ID tid)
Get the materials and variables potentially needed for FV.
TheWarehouse & theWarehouse() const
std::vector< T * > & queryInto(std::vector< T * > &results, Args &&... args)
queryInto executes the query and stores the results in the given vector.
Query query()
query creates and returns an initialized a query object for querying objects from the warehouse.
const unsigned int _nl_system_num
const std::set< TagID > & _tags
const bool _on_displaced
Whether this loop is operating on the displaced mesh.
virtual void neighborSubdomainChanged()
Called every time the neighbor subdomain changes (i.e.

◆ onBoundary()

void ComputeFVFluxThread< RangeType, AttribMatrixTags >::onBoundary ( const FaceInfo fi,
BoundaryID  boundary 
)
overridevirtualinherited

This is called once for every face that is on a boundary after onFace is called for the face.

Implements ThreadedFaceLoop< RangeType >.

Definition at line 369 of file ComputeFVFluxThread.h.

531{
533 return;
534
535 std::vector<FVFluxBC *> bcs;
537 .query()
538 .template condition<AttribSysNum>(_nl_system_num)
539 .template condition<AttribSystem>("FVFluxBC")
540 .template condition<AttribDisplaced>(_on_displaced)
541 .template condition<AttribThread>(_tid)
542 .template condition<AttributeTagType>(_tags)
543 .template condition<AttribBoundaries>(bnd_id)
544 .queryInto(bcs);
545
546 for (auto * const bc : bcs)
547 compute(*bc, fi);
548
549 std::vector<FVInterfaceKernel *> iks;
551 .query()
552 .template condition<AttribSysNum>(_nl_system_num)
553 .template condition<AttribSystem>("FVInterfaceKernel")
554 .template condition<AttribDisplaced>(_on_displaced)
555 .template condition<AttribThread>(_tid)
556 .template condition<AttributeTagType>(_tags)
557 .template condition<AttribBoundaries>(bnd_id)
558 .queryInto(iks);
559
560 for (auto * const ik : iks)
561 compute(*ik, fi);
562}
virtual void compute(FVFaceResidualObject &ro, const FaceInfo &fi)=0
call either computeResidual, computeJacobian, or computeResidualAndJacobian on the provided residual ...

◆ onFace()

void ComputeFVFluxThread< RangeType, AttribMatrixTags >::onFace ( const FaceInfo fi)
overridevirtualinherited

Implements ThreadedFaceLoop< RangeType >.

Definition at line 365 of file ComputeFVFluxThread.h.

521{
522 reinitVariables(fi);
523
524 for (auto * const k : _fv_flux_kernels)
525 compute(*k, fi);
526}

◆ operator()()

template<typename RangeType >
void ThreadedFaceLoop< RangeType >::operator() ( const RangeType &  range,
bool  bypass_threading = false 
)
virtualinherited

Definition at line 241 of file ComputeFVFluxThread.h.

242{
243 // TODO: make this query fv flux kernel specific or somehow integrate the
244 // fv source kernels into this loop. Also this check will need to increase
245 // in generality if/when other systems and objects besides FV stuff get
246 // added to this loop.
247 std::vector<FVKernel *> kernels;
249 .query()
250 .template condition<AttribSysNum>(_nl_system_num)
251 .template condition<AttribSystem>("FVFluxKernel")
252 .template condition<AttribDisplaced>(_on_displaced)
253 .queryInto(kernels);
254 if (kernels.size() == 0)
255 return;
256
257 try
258 {
259 try
260 {
261 ParallelUniqueId puid;
262 _tid = bypass_threading ? 0 : puid.id;
263
264 pre();
266
269
270 typename RangeType::const_iterator faceinfo = range.begin();
271 for (faceinfo = range.begin(); faceinfo != range.end(); ++faceinfo)
272 {
273 const Elem & elem = (*faceinfo)->elem();
274
276
278 _subdomain = elem.subdomain_id();
280 {
283 }
284
286 if (const Elem * const neighbor = (*faceinfo)->neighborPtr())
287 {
289 _neighbor_subdomain = neighbor->subdomain_id();
290 }
291 else
293
295 {
297 // This is going to cause a lot more printing
299 }
300
301 onFace(**faceinfo);
302 // Cache data now because onBoundary may clear it. E.g. there was a nasty bug for two
303 // variable FV systems where if one variable was executing an FVFluxKernel on a boundary
304 // while the other was executing an FVFluxBC, the FVFluxKernel data would get lost because
305 // onBoundary would clear the residual/Jacobian data before it was cached
306 postFace(**faceinfo);
307
308 const std::set<BoundaryID> boundary_ids = (*faceinfo)->boundaryIDs();
309 for (auto & it : boundary_ids)
310 {
312 onBoundary(**faceinfo, it);
313 }
314
315 postFace(**faceinfo);
316
317 } // range
318 post();
319
320 // Clear execution printing sets to start printing on every block and boundary again
322 }
323 catch (MetaPhysicL::LogicError & e)
324 {
326 }
327 catch (std::exception & e)
328 {
329 // Continue if we find a libMesh degenerate map exception, but
330 // just throw for any real error
331 if (!strstr(e.what(), "Jacobian") && !strstr(e.what(), "singular") &&
332 !strstr(e.what(), "det != 0"))
333 throw;
334
335 mooseException("We caught a libMesh degeneracy exception in ComputeFVFluxThread:\n",
336 e.what());
337 }
338 }
339 catch (MooseException & e)
340 {
342 }
343 catch (std::runtime_error & e)
344 {
345 _error_message = e.what();
346 }
347}
virtual void setCurrentSubdomainID(const Elem *elem, const THREAD_ID tid) override
virtual void setNeighborSubdomainID(const Elem *elem, unsigned int side, const THREAD_ID tid) override
Provides a way for users to bail out of the current solve.
virtual void subdomainChanged()
Called every time the current subdomain changes (i.e.
SubdomainID _old_subdomain
The subdomain for the last element.
virtual void post()
This is called once after all face-looping is finished.
virtual void printBlockExecutionInformation() const
Print ordering of objects executed on each block.
virtual void pre()
This is called once before all face-looping.
virtual void postFace(const FaceInfo &)
This is called once for each face after all face and boundary callbacks have been finished for that f...
virtual void printBoundaryExecutionInformation(const BoundaryID) const
Print ordering of objects exected on each boundary.
virtual void onFace(const FaceInfo &fi)=0
virtual void printGeneralExecutionInformation() const
Print list of object types executed and in which order.
void caughtMooseException(MooseException &e)
Called if a MooseException is caught anywhere during the computation.
virtual void onBoundary(const FaceInfo &fi, BoundaryID boundary)=0
This is called once for every face that is on a boundary after onFace is called for the face.
SubdomainID _old_neighbor_subdomain
The subdomain for the last neighbor.
void resetExecutionPrinting()
Reset lists of blocks and boundaries for which execution printing has been done.
const SubdomainID INVALID_BLOCK_ID
Definition MooseTypes.C:20
void translateMetaPhysicLError(const MetaPhysicL::LogicError &)
emit a relatively clear error message when we catch a MetaPhysicL logic error
Definition MooseError.C:155

◆ post()

void ComputeFVFluxThread< RangeType, AttribMatrixTags >::post ( )
overridevirtualinherited

This is called once after all face-looping is finished.

Reimplemented from ThreadedFaceLoop< RangeType >.

Definition at line 367 of file ComputeFVFluxThread.h.

567{
568 // make sure we add any remaining cached residuals/jacobians to add/record
569 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
570 addCached();
571
574}
virtual void addCached()=0
call either addCachedJacobian or addCachedResidual or both depending on what derived class of this cl...
void clearActiveMaterialProperties(const THREAD_ID tid)
Clear the active material properties.
virtual void clearActiveElementalMooseVariables(const THREAD_ID tid) override
Clear the active elemental MooseVariableFEBase.
spin_mutex spin_mtx

◆ postFace()

template<typename RangeType >
void ComputeFVFluxJacobianThread< RangeType >::postFace ( const FaceInfo )
overrideprotectedvirtual

This is called once for each face after all face and boundary callbacks have been finished for that face.

Reimplemented from ThreadedFaceLoop< RangeType >.

Definition at line 911 of file ComputeFVFluxThread.h.

912{
913 _num_cached++;
914 // FV objects do not store their Jacobian data in TaggingInterface data structures; instead they
915 // add into the cache directly. So we do not need the same cache calls for the Jacobian that we
916 // need for the residual
917 if (_num_cached % 20 == 0)
918 {
919 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
920 this->_subproblem.SubProblem::addCachedJacobian(_tid);
921 }
922}

◆ pre()

void ComputeFVFluxThread< RangeType, AttribMatrixTags >::pre ( )
overridevirtualinherited

This is called once before all face-looping.

Reimplemented from ThreadedFaceLoop< RangeType >.

Definition at line 366 of file ComputeFVFluxThread.h.

758{
759 std::vector<FVFluxBC *> bcs;
761 .query()
762 .template condition<AttribSysNum>(_nl_system_num)
763 .template condition<AttribSystem>("FVFluxBC")
764 .template condition<AttribDisplaced>(_on_displaced)
765 .template condition<AttribThread>(_tid)
766 .template condition<AttributeTagType>(_tags)
767 .queryInto(bcs);
768
769 std::vector<FVInterfaceKernel *> iks;
771 .query()
772 .template condition<AttribSysNum>(_nl_system_num)
773 .template condition<AttribSystem>("FVInterfaceKernel")
774 .template condition<AttribDisplaced>(_on_displaced)
775 .template condition<AttribThread>(_tid)
776 .template condition<AttributeTagType>(_tags)
777 .queryInto(iks);
778
779 std::vector<FVFluxKernel *> kernels;
781 .query()
782 .template condition<AttribSysNum>(_nl_system_num)
783 .template condition<AttribSystem>("FVFluxKernel")
784 .template condition<AttribDisplaced>(_on_displaced)
785 .template condition<AttribThread>(_tid)
786 .template condition<AttributeTagType>(_tags)
787 .queryInto(kernels);
788
789 for (auto * const bc : bcs)
790 setup(*bc);
791 for (auto * const ik : iks)
792 setup(*ik);
793 for (auto * const kernel : kernels)
794 setup(*kernel);
795
796 // Clear variables
797 _fv_vars.clear();
798 _elem_sub_fv_vars.clear();
799 _neigh_sub_fv_vars.clear();
800
801 // Clear kernels
802 _fv_flux_kernels.clear();
805
806 // Clear element face materials
807 _elem_face_mats.clear();
810
811 // Clear neighbor face materials
812 _neigh_face_mats.clear();
815}
virtual void setup(SetupInterface &obj)=0
call either residualSetup or jacobianSetup depending on what derived class of this class is instantia...

◆ printBlockExecutionInformation()

void ComputeFVFluxThread< RangeType, AttribMatrixTags >::printBlockExecutionInformation ( ) const
overrideprivatevirtualinherited

Print ordering of objects executed on each block.

Reimplemented from ThreadedFaceLoop< RangeType >.

Definition at line 414 of file ComputeFVFluxThread.h.

1010{
1012 return;
1013
1014 // Print the location of the execution
1015 const auto block_pair = std::make_pair(_subdomain, _neighbor_subdomain);
1016 const auto block_pair_names = this->getBlockNames();
1017 if (_blocks_exec_printed.count(block_pair))
1018 return;
1019 auto & console = _fe_problem.console();
1020 console << "[DBG] Flux kernels on block " << block_pair_names.first;
1022 console << " and neighbor " << block_pair_names.second << std::endl;
1023 else
1024 console << " with no neighbor block" << std::endl;
1025
1026 // Print the list of objects
1027 std::vector<MooseObject *> fv_flux_kernels;
1028 for (const auto & fv_kernel : _fv_flux_kernels)
1029 fv_flux_kernels.push_back(dynamic_cast<MooseObject *>(fv_kernel));
1031 "[DBG]")
1032 << std::endl;
1033 _blocks_exec_printed.insert(block_pair);
1034}
std::pair< SubdomainName, SubdomainName > getBlockNames() const
Utility to get the subdomain names from the ids.
bool shouldPrintExecution(const THREAD_ID tid) const
Check whether the problem should output execution orders at this time.
Every object that can be built by the factory should be derived from this class.
Definition MooseObject.h:31
const ConsoleStream & console() const
Return console handle.
Definition Problem.h:48
std::set< std::pair< const SubdomainID, const SubdomainID > > _blocks_exec_printed
Set to keep track of blocks for which we have printed the execution pattern.
std::string formatString(std::string message, const std::string &prefix)
Add new lines and prefixes to a string for pretty display in output NOTE: This makes a copy of the st...
std::string mooseObjectVectorToString(const std::vector< MooseObject * > &objs, const std::string &sep=" ")
Routine to output the name of MooseObjects in a string.

◆ printBoundaryExecutionInformation()

void ComputeFVFluxThread< RangeType, AttribMatrixTags >::printBoundaryExecutionInformation ( const BoundaryID  bnd_id) const
overrideprivatevirtualinherited

Print ordering of objects exected on each boundary.

Reimplemented from ThreadedFaceLoop< RangeType >.

Definition at line 417 of file ComputeFVFluxThread.h.

1040{
1042 return;
1043 if (_boundaries_exec_printed.count(bnd_id))
1044 return;
1045 std::vector<MooseObject *> bcs;
1047 .query()
1048 .template condition<AttribSystem>("FVFluxBC")
1049 .template condition<AttribDisplaced>(_on_displaced)
1050 .template condition<AttribThread>(_tid)
1051 .template condition<AttributeTagType>(_tags)
1052 .template condition<AttribBoundaries>(bnd_id)
1053 .queryInto(bcs);
1054
1055 std::vector<MooseObject *> iks;
1057 .query()
1058 .template condition<AttribSystem>("FVInterfaceKernel")
1059 .template condition<AttribDisplaced>(_on_displaced)
1060 .template condition<AttribThread>(_tid)
1061 .template condition<AttributeTagType>(_tags)
1062 .template condition<AttribBoundaries>(bnd_id)
1063 .queryInto(iks);
1064
1065 const auto block_pair_names = this->getBlockNames();
1066 if (bcs.size())
1067 {
1068 auto & console = _fe_problem.console();
1069 console << "[DBG] FVBCs on boundary " << bnd_id << " between subdomain "
1070 << block_pair_names.first;
1072 console << " and neighbor " << block_pair_names.second << std::endl;
1073 else
1074 console << " and the exterior of the mesh " << std::endl;
1075 const std::string fv_bcs = ConsoleUtils::mooseObjectVectorToString(bcs);
1076 console << ConsoleUtils::formatString(fv_bcs, "[DBG]") << std::endl;
1077 }
1078 if (iks.size())
1079 {
1080 auto & console = _fe_problem.console();
1081 console << "[DBG] FVIKs on boundary " << bnd_id << " between subdomain "
1082 << block_pair_names.first;
1084 console << " and neighbor " << block_pair_names.second << std::endl;
1085 else
1086 console << " and the exterior of the mesh " << std::endl;
1087 const std::string fv_iks = ConsoleUtils::mooseObjectVectorToString(iks);
1088 console << ConsoleUtils::formatString(fv_iks, "[DBG]") << std::endl;
1089 }
1090 _boundaries_exec_printed.insert(bnd_id);
1091}
std::set< BoundaryID > _boundaries_exec_printed
Set to keep track of boundaries for which we have printed the execution pattern.

◆ printGeneralExecutionInformation()

void ComputeFVFluxThread< RangeType, AttribMatrixTags >::printGeneralExecutionInformation ( ) const
overrideprivatevirtualinherited

Print list of object types executed and in which order.

Reimplemented from ThreadedFaceLoop< RangeType >.

Definition at line 411 of file ComputeFVFluxThread.h.

994{
996 return;
997 auto & console = _fe_problem.console();
998 auto execute_on = _fe_problem.getCurrentExecuteOnFlag();
999 console << "[DBG] Beginning finite volume flux objects loop on " << execute_on << std::endl;
1000 mooseDoOnce(console << "[DBG] Loop on faces (FaceInfo), objects ordered on each face: "
1001 << std::endl;
1002 console << "[DBG] - (finite volume) flux kernels" << std::endl;
1003 console << "[DBG] - (finite volume) flux boundary conditions" << std::endl;
1004 console << "[DBG] - (finite volume) interface kernels" << std::endl;);
1005}
const ExecFlagType & getCurrentExecuteOnFlag() const
Return/set the current execution flag.

◆ reinitVariables()

void ComputeFVFluxThread< RangeType, AttribMatrixTags >::reinitVariables ( const FaceInfo fi)
privateinherited

Definition at line 407 of file ComputeFVFluxThread.h.

475{
476 // TODO: this skips necessary FE reinit. In addition to this call, we need
477 // to conditionally do some FE-specific reinit here if we have any active FE
478 // variables. However, we still want to keep/do FV-style quadrature.
479 // Figure out how to do all this some day.
480 this->_subproblem.reinitFVFace(_tid, fi);
481
482 // TODO: for FE variables, this is handled via setting needed vars through
483 // fe problem API which passes the value on to the system class. Then
484 // reinit is called on fe problem which forwards its calls to the system
485 // function and then fe problem also calls displaced problem reinit. All
486 // the call forwarding seems silly, but it does allow the displaced problem
487 // to be easily kept in sync. However, the displaced problem has different
488 // pointers for its own face info objects, etc, we can't just pass in fe
489 // problem's face info down to the sub-problem -- centroids are different,
490 // volumes are different, etc. To support displaced meshes correctly, we
491 // need to be able to reinit the subproblems variables using its equivalent
492 // face info object. How? See https://github.com/idaholab/moose/issues/15064
493
494 for (auto var : _fv_vars)
495 var->computeFaceValues(fi);
496
498
499 for (std::shared_ptr<MaterialBase> mat : _elem_face_mats)
500 {
501 mat->setFaceInfo(fi);
502 mat->computeProperties();
503 }
504
505 if (fi.neighborPtr())
506 {
509
510 for (std::shared_ptr<MaterialBase> mat : _neigh_face_mats)
511 {
512 mat->setFaceInfo(fi);
513 mat->computeProperties();
514 }
515 }
516}
void resizeMaterialData(Moose::MaterialDataType data_type, unsigned int nqp, const THREAD_ID tid)
Resize material data.
const Elem * neighborPtr() const
Definition FaceInfo.h:88
void reinitFVFace(const THREAD_ID tid, const FaceInfo &fi)
reinitialize the finite volume assembly data for the provided face and thread
@ NEIGHBOR_MATERIAL_DATA
Definition MooseTypes.h:750
@ FACE_MATERIAL_DATA
Definition MooseTypes.h:749

◆ resetExecutionPrinting()

template<typename RangeType >
void ThreadedFaceLoop< RangeType >::resetExecutionPrinting ( )
inlineprotectedinherited

Reset lists of blocks and boundaries for which execution printing has been done.

Definition at line 134 of file ComputeFVFluxThread.h.

135 {
136 _blocks_exec_printed.clear();
138 }

◆ setup()

template<typename RangeType >
void ComputeFVFluxJacobianThread< RangeType >::setup ( SetupInterface obj)
inlineoverrideprotectedvirtual

call either residualSetup or jacobianSetup depending on what derived class of this class is instantiated

Implements ComputeFVFluxThread< RangeType, AttribMatrixTags >.

Definition at line 888 of file ComputeFVFluxThread.h.

888{ obj.jacobianSetup(); }
virtual void jacobianSetup()
Gets called just before the Jacobian is computed and before this object is asked to do its job.

◆ subdomainChanged()

void ComputeFVFluxThread< RangeType, AttribMatrixTags >::subdomainChanged ( )
overridevirtualinherited

Called every time the current subdomain changes (i.e.

the subdomain of this face's elem element is not the same as the subdomain of the last face's elem element).

Reimplemented from ThreadedFaceLoop< RangeType >.

Definition at line 371 of file ComputeFVFluxThread.h.

635{
637
638 // Clear variables
639 _fv_vars.clear();
640 _elem_sub_fv_vars.clear();
641
642 // Clear kernels
643 _fv_flux_kernels.clear();
645
646 // Clear element face materials
647 _elem_face_mats.clear();
649
650 // Clear neighbor face materials
651 _neigh_face_mats.clear();
653
654 // TODO: do this for other relevant objects - like FV BCs, FV source term
655 // kernels, etc. - but we don't need to add them for other types of objects
656 // like FE or DG kernels because those kernels don't run in this loop. Do we
657 // really want to integrate fv source kernels into this loop?
658 std::vector<FVFluxKernel *> kernels;
660 .query()
661 .template condition<AttribSysNum>(_nl_system_num)
662 .template condition<AttribSystem>("FVFluxKernel")
663 .template condition<AttribDisplaced>(_on_displaced)
664 .template condition<AttribSubdomains>(_subdomain)
665 .template condition<AttribThread>(_tid)
666 .template condition<AttributeTagType>(_tags)
667 .queryInto(kernels);
668
669 _elem_sub_fv_flux_kernels = std::set<FVFluxKernel *>(kernels.begin(), kernels.end());
670
671 for (auto * k : _elem_sub_fv_flux_kernels)
672 {
673 // TODO: we need a better way to do this - especially when FE objects begin to
674 // couple to FV vars. This code shoud be refactored out into one place
675 // where it is easy for users to say initialize all materials and
676 // variables needed by these objects for me.
677 const auto & deps = k->getMooseVariableDependencies();
678 for (auto var : deps)
679 {
680 mooseAssert(var->isFV(),
681 "We do not currently support coupling of FE variables into FV objects");
682 _elem_sub_fv_vars.insert(var);
683 }
684 }
685
688
690}

Member Data Documentation

◆ _blocks_exec_printed

template<typename RangeType >
std::set<std::pair<const SubdomainID, const SubdomainID> > ThreadedFaceLoop< RangeType >::_blocks_exec_printed
mutableprotectedinherited

Set to keep track of blocks for which we have printed the execution pattern.

Definition at line 165 of file ComputeFVFluxThread.h.

Referenced by ThreadedFaceLoop< RangeType >::resetExecutionPrinting().

◆ _boundaries_exec_printed

template<typename RangeType >
std::set<BoundaryID> ThreadedFaceLoop< RangeType >::_boundaries_exec_printed
mutableprotectedinherited

Set to keep track of boundaries for which we have printed the execution pattern.

Definition at line 168 of file ComputeFVFluxThread.h.

Referenced by ThreadedFaceLoop< RangeType >::resetExecutionPrinting().

◆ _elem_face_mats

std::vector<std::shared_ptr<MaterialBase> > ComputeFVFluxThread< RangeType, AttribMatrixTags >::_elem_face_mats
privateinherited

Element face materials.

Definition at line 433 of file ComputeFVFluxThread.h.

◆ _elem_sub_elem_face_mats

std::vector<std::shared_ptr<MaterialBase> > ComputeFVFluxThread< RangeType, AttribMatrixTags >::_elem_sub_elem_face_mats
privateinherited

Definition at line 434 of file ComputeFVFluxThread.h.

◆ _elem_sub_fv_flux_kernels

std::set<FVFluxKernel *> ComputeFVFluxThread< RangeType, AttribMatrixTags >::_elem_sub_fv_flux_kernels
privateinherited

Definition at line 429 of file ComputeFVFluxThread.h.

◆ _elem_sub_fv_vars

std::set<MooseVariableFieldBase *> ComputeFVFluxThread< RangeType, AttribMatrixTags >::_elem_sub_fv_vars
privateinherited

Definition at line 424 of file ComputeFVFluxThread.h.

◆ _elem_sub_neigh_face_mats

std::vector<std::shared_ptr<MaterialBase> > ComputeFVFluxThread< RangeType, AttribMatrixTags >::_elem_sub_neigh_face_mats
privateinherited

Definition at line 439 of file ComputeFVFluxThread.h.

◆ _error_message

template<typename RangeType >
std::string ThreadedFaceLoop< RangeType >::_error_message
protectedinherited

Holds caught runtime error messages.

Definition at line 171 of file ComputeFVFluxThread.h.

Referenced by ThreadedFaceLoop< RangeType >::join().

◆ _fe_problem

template<typename RangeType >
FEProblemBase& ThreadedFaceLoop< RangeType >::_fe_problem
protectedinherited

◆ _fv_flux_kernels

std::set<FVFluxKernel *> ComputeFVFluxThread< RangeType, AttribMatrixTags >::_fv_flux_kernels
privateinherited

FVFluxKernels.

Definition at line 428 of file ComputeFVFluxThread.h.

◆ _fv_vars

std::set<MooseVariableFieldBase *> ComputeFVFluxThread< RangeType, AttribMatrixTags >::_fv_vars
privateinherited

Variables.

Definition at line 423 of file ComputeFVFluxThread.h.

◆ _incoming_throw_on_error

template<typename RangeType >
const bool ThreadedFaceLoop< RangeType >::_incoming_throw_on_error
privateinherited

The value of Moose::_throw_on_error at the time of construction.

This data member only has meaning and will only be read if this is the thread 0 copy of the class

Definition at line 179 of file ComputeFVFluxThread.h.

◆ _mesh

template<typename RangeType >
MooseMesh& ThreadedFaceLoop< RangeType >::_mesh
protectedinherited

Definition at line 141 of file ComputeFVFluxThread.h.

◆ _neigh_face_mats

std::vector<std::shared_ptr<MaterialBase> > ComputeFVFluxThread< RangeType, AttribMatrixTags >::_neigh_face_mats
privateinherited

Definition at line 438 of file ComputeFVFluxThread.h.

◆ _neigh_sub_elem_face_mats

std::vector<std::shared_ptr<MaterialBase> > ComputeFVFluxThread< RangeType, AttribMatrixTags >::_neigh_sub_elem_face_mats
privateinherited

Definition at line 435 of file ComputeFVFluxThread.h.

◆ _neigh_sub_fv_flux_kernels

std::set<FVFluxKernel *> ComputeFVFluxThread< RangeType, AttribMatrixTags >::_neigh_sub_fv_flux_kernels
privateinherited

Definition at line 430 of file ComputeFVFluxThread.h.

◆ _neigh_sub_fv_vars

std::set<MooseVariableFieldBase *> ComputeFVFluxThread< RangeType, AttribMatrixTags >::_neigh_sub_fv_vars
privateinherited

Definition at line 425 of file ComputeFVFluxThread.h.

◆ _neigh_sub_neigh_face_mats

std::vector<std::shared_ptr<MaterialBase> > ComputeFVFluxThread< RangeType, AttribMatrixTags >::_neigh_sub_neigh_face_mats
privateinherited

Definition at line 440 of file ComputeFVFluxThread.h.

◆ _neighbor_subdomain

template<typename RangeType >
SubdomainID ThreadedFaceLoop< RangeType >::_neighbor_subdomain
protectedinherited

The subdomain for the current neighbor.

Definition at line 159 of file ComputeFVFluxThread.h.

Referenced by ThreadedFaceLoop< RangeType >::neighborSubdomainChanged().

◆ _nl_system_num

template<typename RangeType >
const unsigned int ThreadedFaceLoop< RangeType >::_nl_system_num
protectedinherited

Definition at line 144 of file ComputeFVFluxThread.h.

◆ _num_cached

unsigned int ComputeFVFluxThread< RangeType, AttribMatrixTags >::_num_cached
protectedinherited

Definition at line 393 of file ComputeFVFluxThread.h.

◆ _old_neighbor_subdomain

template<typename RangeType >
SubdomainID ThreadedFaceLoop< RangeType >::_old_neighbor_subdomain
protectedinherited

The subdomain for the last neighbor.

Definition at line 162 of file ComputeFVFluxThread.h.

◆ _old_subdomain

template<typename RangeType >
SubdomainID ThreadedFaceLoop< RangeType >::_old_subdomain
protectedinherited

The subdomain for the last element.

Definition at line 156 of file ComputeFVFluxThread.h.

◆ _on_displaced

template<typename RangeType >
const bool ThreadedFaceLoop< RangeType >::_on_displaced
protectedinherited

Whether this loop is operating on the displaced mesh.

Definition at line 147 of file ComputeFVFluxThread.h.

◆ _scaling_jacobian

const bool ComputeFVFluxThread< RangeType, AttribMatrixTags >::_scaling_jacobian
privateinherited

Definition at line 442 of file ComputeFVFluxThread.h.

◆ _scaling_residual

const bool ComputeFVFluxThread< RangeType, AttribMatrixTags >::_scaling_residual
privateinherited

Definition at line 443 of file ComputeFVFluxThread.h.

◆ _subdomain

template<typename RangeType >
SubdomainID ThreadedFaceLoop< RangeType >::_subdomain
protectedinherited

The subdomain for the current element.

Definition at line 153 of file ComputeFVFluxThread.h.

Referenced by ThreadedFaceLoop< RangeType >::subdomainChanged().

◆ _subproblem

template<typename RangeType >
SubProblem& ThreadedFaceLoop< RangeType >::_subproblem
protectedinherited

◆ _tags

template<typename RangeType >
const std::set<TagID>& ThreadedFaceLoop< RangeType >::_tags
protectedinherited

Definition at line 142 of file ComputeFVFluxThread.h.

◆ _tid

template<typename RangeType >
THREAD_ID ThreadedFaceLoop< RangeType >::_tid
protectedinherited

◆ _zeroth_copy

template<typename RangeType >
const bool ThreadedFaceLoop< RangeType >::_zeroth_copy
privateinherited

Whether this is the zeroth threaded copy of this body.

Definition at line 175 of file ComputeFVFluxThread.h.


The documentation for this class was generated from the following file: