[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> &centering()
+   {
+     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> &centering()
-   {
-     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