freepooma-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Patch to NewField/Field.h (3/3)


From: Dave Nystrom
Subject: Patch to NewField/Field.h (3/3)
Date: Tue, 16 Oct 2001 16:26:40 -0600
User-agent: SEMI/1.13.7 (Awazu) CLIME/1.13.6 (中 ノ庄) MULE XEmacs/21.1 (patch 14) (Cuyahoga Valley) (i386-redhat-linux)

  if (numSubFields() == 0)
    {
      uncompress(f.engine());
    }
  else
    {
      for (int i = 0; i < numSubFields(); i++)
        uncompress(f[i]);
    }
}


//-----------------------------------------------------------------------------
// Functions for getting the number of materials for Arrays and Fields.
//
// This is complicated because of the recursive nature of sub-field storage.
// We assume that multi-material fields are constructed by replicating
// a centering. This means that
//   (1) multi-material fields must have sub-fields; if not, there is one
//       material
//   (2) if there is one sub-field at the top level, there is one material
//   (3) if there are multiple sub-fields and those have sub-fields themselves,
//       we assume they represent materials
//   (4) if there are multiple sub-fields and they do not have sub-fields,
//       they represent materials if the data is replicated
//-----------------------------------------------------------------------------

template<int Dim, class T, class EngineTag>
inline int numMaterials(const Array<Dim, T, EngineTag> &a)
{
  return 1;
}

template<class GeometryTag, class T, class EngineTag>
int numMaterials(const Field<GeometryTag, T, EngineTag> &f)
{
  int n0 = f.numSubFields();
  if (n0 < 2)
    {
      return 1;
    }
  else
    {
      int n1 = f[0].numSubFields();
      if (n1 > 0)
        {
          return n1;
        }
      else if (f[0].fieldEngine().offsets() == f[1].fieldEngine().offsets())
        {
          return n0;
        }
      else
        {
          return 1;
        }
    }
}


//-----------------------------------------------------------------------------
// Functions for getting the number of centering points for Arrays and Fields.
// We assume that multi-material fields are constructed by replicating
// a centering. The analysis goes much like numMaterials above.
//-----------------------------------------------------------------------------

template<int Dim, class T, class EngineTag>
inline int centeringSize(const Array<Dim, T, EngineTag> &a)
{
  return 1;
}

template<class GeometryTag, class T, class EngineTag>
int centeringSize(const Field<GeometryTag, T, EngineTag> &f)
{
  int n0 = f.numSubFields();
  if (n0 == 0)
    {
      return 1;
    }
  else
    {
      int n1 = f[0].numSubFields();
      if (n1 == 0)
        {
          if (n0 == 1 || f[0].fieldEngine().offsets() == 
f[1].fieldEngine().offsets())
            {
              return 1;
            }
          else
            {
              return n0;
            }
        }
      else
        {
          return n1;
        }
    }
}


//-----------------------------------------------------------------------------
// Functions for taking subfield views of Arrays and Fields.
//-----------------------------------------------------------------------------

template<int Dim, class T, class EngineTag>
inline Array<Dim, T, EngineTag> &subField(Array<Dim, T, EngineTag> &a, int, int)
{
  return a;
}

template<class GeometryTag, class T, class EngineTag>
typename SubFieldView<Field<GeometryTag, T, EngineTag> >::Type_t
subField(const Field<GeometryTag, T, EngineTag> &f, int m, int c)
{
  int n0 = f.numSubFields();
  if (n0 == 0)
    {
      PAssert(m == 0);
      PAssert(c == 0);
      return f;
    }
  else
    {
      if (m == 0)
        {
          PAssert(c < n0);
          return f[c];
        }
      else if (c == 0)
        {
          PAssert(m < n0);
          return f[m];
        }
      else
        {
          return subField(f[m], 0, c);
        }
    }
}

#endif // POOMA_NEWFIELD_FIELD_H

// ACL:rcsinfo
// ----------------------------------------------------------------------
// $RCSfile: Field.h,v $   $Author: haney $
// $Revision: 1.16.2.1 $   $Date: 2001/09/21 19:42:25 $
// ----------------------------------------------------------------------
// ACL:rcsinfo

reply via email to

[Prev in Thread] Current Thread [Next in Thread]