Skip to content

Commit

Permalink
Size stateful neighbor materials - refs idaholab#2972
Browse files Browse the repository at this point in the history
  • Loading branch information
permcody authored and backmari committed Apr 29, 2014
1 parent 6fe595b commit 57887a4
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 12 deletions.
7 changes: 4 additions & 3 deletions framework/include/base/ComputeMaterialsObjectThread.h
Expand Up @@ -30,9 +30,9 @@ class ComputeMaterialsObjectThread : public ThreadedElementLoop<ConstElemRange>
{
public:
ComputeMaterialsObjectThread(FEProblem & fe_problem, NonlinearSystem & sys, std::vector<MaterialData *> & material_data,
std::vector<MaterialData *> & bmd_material_data, MaterialPropertyStorage & material_props,
MaterialPropertyStorage & bnd_material_props, std::vector<MaterialWarehouse> & materials,
std::vector<Assembly *> & assembly);
std::vector<MaterialData *> & bnd_material_data, std::vector<MaterialData *> & neighbor_material_data,
MaterialPropertyStorage & material_props, MaterialPropertyStorage & bnd_material_props,
std::vector<MaterialWarehouse> & materials, std::vector<Assembly *> & assembly);

// Splitting Constructor
ComputeMaterialsObjectThread(ComputeMaterialsObjectThread & x, Threads::split split);
Expand All @@ -51,6 +51,7 @@ class ComputeMaterialsObjectThread : public ThreadedElementLoop<ConstElemRange>
NonlinearSystem & _sys;
std::vector<MaterialData *> & _material_data;
std::vector<MaterialData *> & _bnd_material_data;
std::vector<MaterialData *> & _neighbor_material_data;
MaterialPropertyStorage & _material_props;
MaterialPropertyStorage & _bnd_material_props;
std::vector<MaterialWarehouse> & _materials;
Expand Down
23 changes: 18 additions & 5 deletions framework/src/base/ComputeMaterialsObjectThread.C
Expand Up @@ -26,14 +26,15 @@
#include "libmesh/threads.h"

ComputeMaterialsObjectThread::ComputeMaterialsObjectThread(FEProblem & fe_problem, NonlinearSystem & sys, std::vector<MaterialData *> & material_data,
std::vector<MaterialData *> & bnd_material_data, MaterialPropertyStorage & material_props,
MaterialPropertyStorage & bnd_material_props, std::vector<MaterialWarehouse> & materials,
std::vector<Assembly *> & assembly) :
std::vector<MaterialData *> & bnd_material_data, std::vector<MaterialData *> & neighbor_material_data,
MaterialPropertyStorage & material_props, MaterialPropertyStorage & bnd_material_props,
std::vector<MaterialWarehouse> & materials, std::vector<Assembly *> & assembly) :
ThreadedElementLoop<ConstElemRange>(fe_problem, sys),
_fe_problem(fe_problem),
_sys(sys),
_material_data(material_data),
_bnd_material_data(bnd_material_data),
_neighbor_material_data(neighbor_material_data),
_material_props(material_props),
_bnd_material_props(bnd_material_props),
_materials(materials),
Expand All @@ -49,6 +50,7 @@ ComputeMaterialsObjectThread::ComputeMaterialsObjectThread(ComputeMaterialsObjec
_sys(x._sys),
_material_data(x._material_data),
_bnd_material_data(x._bnd_material_data),
_neighbor_material_data(x._neighbor_material_data),
_material_props(x._material_props),
_bnd_material_props(x._bnd_material_props),
_materials(x._materials),
Expand Down Expand Up @@ -98,8 +100,19 @@ ComputeMaterialsObjectThread::onInternalSide(const Elem *elem, unsigned int side
if (_need_internal_side_material)
{
_assembly[_tid]->reinit(elem, side);
unsigned int n_points = _assembly[_tid]->qRuleFace()->n_points();
_bnd_material_props.initStatefulProps(*_bnd_material_data[_tid], _materials[_tid].getFaceMaterials(_subdomain), n_points, *elem, side);
unsigned int face_n_points = _assembly[_tid]->qRuleFace()->n_points();
_bnd_material_props.initStatefulProps(*_bnd_material_data[_tid], _materials[_tid].getFaceMaterials(_subdomain), face_n_points, *elem, side);

const Elem * neighbor = elem->neighbor(side);
unsigned int neighbor_side = neighbor->which_neighbor_am_i(_assembly[_tid]->elem());
const unsigned int elem_id = elem->id();
const unsigned int neighbor_id = neighbor->id();
unsigned int neighbor_n_points = _assembly[_tid]->qRule()->n_points();
if ((neighbor->active() && (neighbor->level() == elem->level()) && (elem_id < neighbor_id)) || (neighbor->level() < elem->level()))
{
_assembly[_tid]->reinitElemAndNeighbor(elem, side, neighbor, neighbor_side);
_bnd_material_props.initStatefulProps(*_neighbor_material_data[_tid], _materials[_tid].getNeighborMaterials(_subdomain), face_n_points, *neighbor, neighbor_side);
}
}
}

Expand Down
6 changes: 4 additions & 2 deletions framework/src/base/FEProblem.C
Expand Up @@ -425,7 +425,8 @@ void FEProblem::initialSetup()
if (_material_props.hasStatefulProperties())
{
ConstElemRange & elem_range = *_mesh.getActiveLocalElementRange();
ComputeMaterialsObjectThread cmt(*this, _nl, _material_data, _bnd_material_data, _material_props, _bnd_material_props, _materials, _assembly);
ComputeMaterialsObjectThread cmt(*this, _nl, _material_data, _bnd_material_data, _neighbor_material_data,
_material_props, _bnd_material_props, _materials, _assembly);
Threads::parallel_reduce(elem_range, cmt);
_has_initialized_stateful = true;
}
Expand Down Expand Up @@ -523,7 +524,8 @@ void FEProblem::initialSetup()
else
{
ConstElemRange & elem_range = *_mesh.getActiveLocalElementRange();
ComputeMaterialsObjectThread cmt(*this, _nl, _material_data, _bnd_material_data, _material_props, _bnd_material_props, _materials, _assembly);
ComputeMaterialsObjectThread cmt(*this, _nl, _material_data, _bnd_material_data, _neighbor_material_data,
_material_props, _bnd_material_props, _materials, _assembly);
Threads::parallel_reduce(elem_range, cmt);
}
}
Expand Down
2 changes: 0 additions & 2 deletions test/tests/materials/stateful_internal_side_uo/tests
Expand Up @@ -3,7 +3,5 @@
type = 'Exodiff'
input = 'internal_side_uo_stateful.i'
exodiff = 'internal_side_uo_stateful_out.e'
max_parallel = 1 # Restricting due to stateful neighbor material issues #2972
max_threads = 1
[../]
[]

0 comments on commit 57887a4

Please sign in to comment.