[newfield_revision] Patch: Support Multimaterials
Jeffrey Oldham
oldham at codesourcery.com
Sat Aug 4 00:18:14 UTC 2001
This patch finishes Stephen Smith's field revisions began today.
Fields have two dimensions: materials and centering values. We add
better support for determining the number of materials and centering
values as well as initializing fields. The underlying implementation
still makes differentiating a multimaterial field with one value per
material from a unimaterial field with a centering with multiple
values; this is on Scott's todo list.
Also, we add some error checking for centerings.
The newfield_revision branch is a development branch supporting
collaboration between filesystem-separated collaborators. Compilation
and correctness on the branch are not guaranteed at any time.
2001-08-03 Jeffrey D. Oldham <oldham at codesourcery.com> and
Stephen Smith <stephens at codesourcery.com>
* Field.h (Field::centering): Move definition.
(Field::numMaterials): New function.
* FieldCentering.h (Centering::operator[]): Add error checking.
(Centering::size()): Likewise.
* FieldEngine/FieldEngineBase.h:
(FieldEngineBase::num_materials_m): New member.
(FieldEngineBase::FieldEngineBase): Add num_materials_m
initialization.
(FieldEngineBase::initialize): Set centering_m and
num_materials_m.
(FieldEngineBase::addSubFields): Add error checking.
(FieldEngineBase::centeringSize): New function.
(FieldEngineBase::numMaterials): New function.
Tested on KCC Linux and sequential gcc 3.0 Linux
Approved by each other :)
Applied by newfield_revision
Thanks,
Jeffrey D. Oldham
oldham at codesourcery.com
-------------- next part --------------
Index: Field.h
===================================================================
RCS file: /home/pooma/Repository/r2/src/NewField/Field.h,v
retrieving revision 1.15.2.5
diff -c -p -r1.15.2.5 Field.h
*** Field.h 2001/08/03 16:07:12 1.15.2.5
--- Field.h 2001/08/04 00:11:42
*************** public:
*** 1155,1165 ****
--- 1155,1176 ----
return fieldEngine_m;
}
+ // FIXME: This function is deprecated.
inline int numSubFields() const
{
return fieldEngine_m.numSubFields();
}
+ const Centering<dimensions> ¢ering()
+ {
+ return fieldEngine().centering();
+ }
+
+ inline int numMaterials() const
+ {
+ return fieldEngine().numMaterials();
+ }
+
inline const Domain_t physicalCellDomain() const
{
return fieldEngine_m.physicalCellDomain();
*************** public:
*** 1194,1204 ****
{
return fieldEngine_m.physicalDomain();
}
-
- const Centering<dimensions> ¢ering()
- {
- return fieldEngine().centering();
- }
//---------------------------------------------------------------------------
// Instruct the field to make its own copy of its data.
--- 1205,1210 ----
Index: FieldCentering.h
===================================================================
RCS file: /home/pooma/Repository/r2/src/NewField/Attic/FieldCentering.h,v
retrieving revision 1.1.2.6
diff -c -p -r1.1.2.6 FieldCentering.h
*** FieldCentering.h 2001/08/03 19:46:24 1.1.2.6
--- FieldCentering.h 2001/08/04 00:11:43
***************
*** 50,55 ****
--- 50,56 ----
//-----------------------------------------------------------------------------
#include "Tiny/Vector.h"
+ #include "Utilities/PAssert.h"
#include <vector>
//-----------------------------------------------------------------------------
*************** public:
*** 275,280 ****
--- 276,283 ----
// Return a centering with one specified value.
const Centering<Dim> operator[](int iSubField) const
{
+ PInsist(iSubField >= 0 && iSubField < size(),
+ "Illegal attempt to extract a non-existent centering.");
return Centering<Dim>(centering_type_m, discontinuous_m,
Orientations(1, orientations_m[iSubField]),
Positions(1, positions_m[iSubField]));
*************** public:
*** 316,321 ****
--- 319,326 ----
inline int size() const
{
+ PInsist(orientations_m.size() == positions_m.size(),
+ "In a centering, the number of orientations must match the number of positions.");
return orientations_m.size();
}
Index: FieldEngine/FieldEngineBase.h
===================================================================
RCS file: /home/pooma/Repository/r2/src/NewField/FieldEngine/FieldEngineBase.h,v
retrieving revision 1.13.2.2
diff -c -p -r1.13.2.2 FieldEngineBase.h
*** FieldEngine/FieldEngineBase.h 2001/08/03 16:07:13 1.13.2.2
--- FieldEngine/FieldEngineBase.h 2001/08/04 00:11:43
*************** public:
*** 148,154 ****
FieldEngineBase()
: physicalCellDomain_m(Pooma::NoInit()),
! guards_m(0)
{ }
// -----------------------------------------------
--- 148,155 ----
FieldEngineBase()
: physicalCellDomain_m(Pooma::NoInit()),
! guards_m(0),
! num_materials_m(0)
{ }
// -----------------------------------------------
*************** public:
*** 161,167 ****
const FieldEngineBase<Dim, T2, ET2> &model)
: physicalCellDomain_m(model.physicalCellDomain()),
guards_m(model.guardLayers()),
! centering_m(centering)
{
if (centering.size() > 1)
{
--- 162,169 ----
const FieldEngineBase<Dim, T2, ET2> &model)
: physicalCellDomain_m(model.physicalCellDomain()),
guards_m(model.guardLayers()),
! centering_m(centering),
! num_materials_m(0)
{
if (centering.size() > 1)
{
*************** public:
*** 188,201 ****
const Layout_t &layout, int materials = 0)
: physicalCellDomain_m(layout.domain()),
guards_m(layout.externalGuards()),
! centering_m(centering)
{
shrinkInPlace(physicalCellDomain_m, guards_m);
shrinkRightInPlace(physicalCellDomain_m, 1);
! if (materials > 0)
{
! addSubFields(materials);
! for (int m = 0; m < materials; ++m)
{
if (centering.size() > 1)
{
--- 190,204 ----
const Layout_t &layout, int materials = 0)
: physicalCellDomain_m(layout.domain()),
guards_m(layout.externalGuards()),
! centering_m(centering),
! num_materials_m(materials)
{
shrinkInPlace(physicalCellDomain_m, guards_m);
shrinkRightInPlace(physicalCellDomain_m, 1);
! if (num_materials_m > 0)
{
! addSubFields(num_materials_m);
! for (int m = 0; m < num_materials_m; ++m)
{
if (centering.size() > 1)
{
*************** public:
*** 242,261 ****
: subFields_m(model.subFields_m),
data_m(model.data_m),
physicalCellDomain_m(model.physicalCellDomain_m),
centering_m(model.centering_m),
! guards_m(model.guards_m)
{ }
// Sub-field view constructor. This is when we want to construct a view of
// one of the subFields in our top-level list.
! FieldEngineBase(const This_t &model, const int &iSubField)
: subFields_m(model.subFields_m[iSubField].subFields_m),
data_m(model.subFields_m[iSubField].data_m),
physicalCellDomain_m(model.physicalCellDomain_m),
centering_m(model.subFields_m[iSubField].centering_m),
! guards_m(model.guards_m)
! { }
// View constructor.
--- 245,269 ----
: subFields_m(model.subFields_m),
data_m(model.data_m),
physicalCellDomain_m(model.physicalCellDomain_m),
+ guards_m(model.guards_m),
centering_m(model.centering_m),
! num_materials_m(model.num_materials_m)
{ }
// Sub-field view constructor. This is when we want to construct a view of
// one of the subFields in our top-level list.
! FieldEngineBase(const This_t &model, int iSubField)
: subFields_m(model.subFields_m[iSubField].subFields_m),
data_m(model.subFields_m[iSubField].data_m),
physicalCellDomain_m(model.physicalCellDomain_m),
+ guards_m(model.guards_m),
centering_m(model.subFields_m[iSubField].centering_m),
! num_materials_m(model.num_materials_m)
! {
! PInsist(iSubField >= 0 && iSubField < model.numSubFields(),
! "Illegal attempt to extract a non-existent subfield.");
! }
// View constructor.
*************** public:
*** 294,308 ****
subFields_m = model.subFields_m;
data_m = model.data_m;
physicalCellDomain_m = model.physicalCellDomain_m;
- centering_m = model.centering_m;
guards_m = model.guards_m;
}
template<int Dim2, class T2, class EngineTag2>
void initialize(This_t &s,
! const FieldEngineBase<Dim2, T2, EngineTag2> &model, const Domain_t &d)
{
int n = model.numSubFields();
if (n == 0)
{
s.physicalCellDomain_m = shrinkRight(d - d.firsts(),
--- 302,319 ----
subFields_m = model.subFields_m;
data_m = model.data_m;
physicalCellDomain_m = model.physicalCellDomain_m;
guards_m = model.guards_m;
+ centering_m = model.centering_m;
+ num_materials_m = model.num_materials_m;
}
template<int Dim2, class T2, class EngineTag2>
void initialize(This_t &s,
! const FieldEngineBase<Dim2, T2, EngineTag2> &model,
! const Domain_t &d)
{
int n = model.numSubFields();
+ s.centering_m = model.centering();
if (n == 0)
{
s.physicalCellDomain_m = shrinkRight(d - d.firsts(),
*************** public:
*** 312,321 ****
else
{
s.physicalCellDomain_m = d - d.firsts();
! s.addSubFields(n);
for (int i = 0; i < n; i++)
initialize(s.subFields_m[i], model.subField(i),
! model.subField(i).translateDomain(d));
}
}
--- 323,333 ----
else
{
s.physicalCellDomain_m = d - d.firsts();
! num_materials_m = model.numMaterials();
! s.addSubFields(n);
for (int i = 0; i < n; i++)
initialize(s.subFields_m[i], model.subField(i),
! model.subField(i).translateDomain(d));
}
}
*************** public:
*** 324,329 ****
--- 336,342 ----
const FieldEngineBase<Dim2, T2, EngineTag2> &model, const INode<Dim> &i)
{
int n = model.numSubFields();
+ s.centering_m = model.centering();
if (n == 0)
{
s.physicalCellDomain_m =
*************** public:
*** 333,338 ****
--- 346,352 ----
else
{
s.physicalCellDomain_m = i.domain() - i.domain().firsts();
+ num_materials_m = model.numMaterials();
s.addSubFields(n);
for (int j = 0; j < n; j++)
initialize(s.subFields_m[j], model.subField(j),
*************** public:
*** 347,352 ****
--- 361,367 ----
{
typedef typename FieldEngineBase<Dim2, T2, EngineTag2>::Engine_t EngIn_t;
int n = model.numSubFields();
+ s.centering_m = model.centering();
if (n == 0)
{
s.physicalCellDomain_m = model.physicalCellDomain();
*************** public:
*** 360,365 ****
--- 375,381 ----
{
s.physicalCellDomain_m = model.physicalCellDomain();
s.guards_m = model.guardLayers();
+ num_materials_m = model.numMaterials();
s.addSubFields(n);
for (int i = 0; i < n; i++)
initialize(s.subFields_m[i], model.subField(i), ev);
*************** public:
*** 381,386 ****
--- 397,403 ----
const ComponentWrapper<Components> &c)
{
int n = model.numSubFields();
+ s.centering_m = model.centering();
if (n == 0)
{
s.physicalCellDomain_m = model.physicalCellDomain();
*************** public:
*** 393,398 ****
--- 410,416 ----
{
s.physicalCellDomain_m = model.physicalCellDomain();
s.guards_m = model.guardLayers();
+ num_materials_m = model.numMaterials();
s.addSubFields(n);
for (int i = 0; i < n; i++)
initialize(s.subFields_m[i], model.subField(i), c);
*************** public:
*** 405,416 ****
--- 423,436 ----
int n = model.numSubFields();
s.physicalCellDomain_m = model.physicalCellDomain();
s.guards_m = model.guardLayers();
+ s.centering_m = model.centering();
if (n == 0)
{
s.initialize(model.offsets(), model.engine());
}
else
{
+ num_materials_m = model.numMaterials();
s.addSubFields(n);
for (int i = 0; i < n; i++)
initialize(s.subFields_m[i], model.subField(i), d);
*************** public:
*** 424,429 ****
--- 444,451 ----
void addSubFields(int n)
{
PAssert(subFields_m.size() == 0);
+ PAssert((numMaterials() == n) ||
+ (numMaterials() == 0) && (centering_m.size() == n));
subFields_m.reserve(n);
subFields_m.resize(n);
*************** public:
*** 431,437 ****
{
subFields_m[i].physicalCellDomain_m = physicalCellDomain_m;
subFields_m[i].guards_m = guards_m;
! subFields_m[i].centering_m = centering_m[i];
}
}
--- 453,462 ----
{
subFields_m[i].physicalCellDomain_m = physicalCellDomain_m;
subFields_m[i].guards_m = guards_m;
! if (numMaterials() > 0)
! subFields_m[i].centering_m = centering_m;
! else
! subFields_m[i].centering_m = centering_m[i];
}
}
*************** public:
*** 490,495 ****
--- 515,529 ----
return guards_m;
}
+ inline int centeringSize() const
+ {
+ return centering_m.size();
+ }
+
+ inline int numMaterials() const
+ {
+ return num_materials_m;
+ }
//---------------------------------------------------------------------------
// Domain accessor functions.
*************** private:
*** 591,596 ****
--- 625,631 ----
Domain_t physicalCellDomain_m;
GuardLayers_t guards_m;
Centering<Dim> centering_m;
+ unsigned int num_materials_m;
};
template<int Dim, class T, class EngineTag, class Tag>
More information about the pooma-dev
mailing list