ROOT logo
// $Id: TriMeshField.cxx 2513 2011-08-29 03:24:45Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "TriMeshField.h"
#include <Glasses/TriMesh.h>
#include <Glasses/ParaSurf.h>
#include <Glasses/RGBAPalette.h>
#include "TriMeshField.c7"

#include <Opcode/Opcode.h>

#include <TMath.h>
#include <TRandom.h>
#include <TF3.h>

#include <cmath>

//==============================================================================
// TriMeshField
//==============================================================================

//______________________________________________________________________________
//
// mDim-dimensional field defined on vertices of a mesh.
// Dimensions up to 3 are supported.
//
// Link mColorArraySource is dyn-casted to TriMeshColorArraySource and used to
// get color arrays for update. If 0 is returned for vertex color-array no
// update is done. If 0 is returned for triangle color-array triangle colors
// are not updated.

ClassImp(TriMeshField);

//------------------------------------------------------------------------------

void TriMeshField::_init()
{
  mNVerts = 0; mDim = 1;

  mMinValue = 0;
  mMaxValue = 1;
}

void TriMeshField::Resize(Int_t nvert, Int_t dim)
{
  if (mNVerts != nvert || mDim != dim)
  {
    mNVerts = nvert;
    mDim    = dim;
    mField.resize(mDim*mNVerts);
    Stamp(FID_t());
  }
}

void TriMeshField::ResizeToMesh(Int_t dim)
{
  // Resize field to size of mMesh and dim.
  // If dim <= 0, keep the old dim;

  static const Exc_t _eh("TriMeshField::ResizeToMesh ");

  assert_mesh(_eh);
  if (mMesh->GetTTvor() == 0)
    throw _eh + "TringTvor does not exist.";

  if (dim <= 0) dim = mDim;

  Resize(mMesh->GetTTvor()->mNVerts, dim);
}

//------------------------------------------------------------------------------

void TriMeshField::SetField(Float_t c0)
{
  static const Exc_t _eh("TriMeshField::SetField ");

  if (mDim != 1)
    throw _eh + "argument count incompatible with field dimension";

  Float_t* F = FVec();
  for (Int_t i=0; i<mNVerts; ++i, ++F)
    F[0] = c0;
}

void TriMeshField::SetField(Float_t c0, Float_t c1)
{
  static const Exc_t _eh("TriMeshField::SetField ");

  if (mDim != 2)
    throw _eh + "argument count incompatible with field dimension";

  Float_t* F = FVec();
  for (Int_t i=0; i<mNVerts; ++i, F+=mDim)
  {
    F[0] = c0; F[1] = c1;
  }
}

void TriMeshField::SetField(Float_t c0, Float_t c1, Float_t c2)
{
  static const Exc_t _eh("TriMeshField::SetField ");

  if (mDim != 3)
    throw _eh + "argument count incompatible with field dimension";

  Float_t* F = FVec();
  for (Int_t i=0; i<mNVerts; ++i, F+=mDim)
  {
    F[0] = c0; F[1] = c1; F[2] = c2;
  }
}

//------------------------------------------------------------------------------

namespace
{
  inline Float_t std_val_1d(Float_t* F) { return F[0]; }
  inline Float_t std_val_2d(Float_t* F) { return sqrtf(F[0]*F[0] + F[1]*F[1]); }
  inline Float_t std_val_3d(Float_t* F) { return sqrtf(F[0]*F[0] + F[1]*F[1] + F[2]*F[2]); }
}

void TriMeshField::FindMinMaxField()
{
  // Find min/max field values.

  static const Exc_t _eh("TriMeshField::FindMinMaxField ");

  if (mNVerts <= 0)
  {
    mMinValue = mMaxValue = 0;
  }
  else
  {
    Float_t* F = FVec();

    if (mFormula.IsNull())
    {
      switch (mDim)
      {
        case 1:
          mMinValue = mMaxValue = std_val_1d(F);
          ++F;
          for (Int_t i=1; i<mNVerts; ++i, ++F)
            check_min_max(std_val_1d(F));
          break;
        case 2:
          mMinValue = mMaxValue = std_val_2d(F);
          F += mDim;
          for (Int_t i=1; i<mNVerts; ++i, F+=mDim)
            check_min_max(std_val_2d(F));
          break;
        case 3:
          mMinValue = mMaxValue = std_val_3d(F);
          F += mDim;
          for (Int_t i=1; i<mNVerts; ++i, F+=mDim)
            check_min_max(std_val_3d(F));
          break;
        default:
          throw _eh + "unsupported dimension.";
          break;
      }
    }
    else
    {
      TF3 tf3(GForm("TriMeshField_CT_%d", GetSaturnID()), mFormula.Data(), 0, 0);

      switch (mDim)
      {
        case 1:
          mMinValue = mMaxValue = (Float_t) tf3.Eval(F[0]);
          ++F;
          for (Int_t i=1; i<mNVerts; ++i, ++F)
            check_min_max((Float_t) tf3.Eval(F[0]));
          break;
        case 2:
          mMinValue = mMaxValue = (Float_t) tf3.Eval(F[0], F[1]);
          F += mDim;
          for (Int_t i=1; i<mNVerts; ++i, F+=mDim)
            check_min_max((Float_t) tf3.Eval(F[0], F[1]));
          break;
        case 3:
          mMinValue = mMaxValue = (Float_t) tf3.Eval(F[0], F[1], F[2]);
          F += mDim;
          for (Int_t i=1; i<mNVerts; ++i, F+=mDim)
            check_min_max((Float_t) tf3.Eval(F[0], F[1], F[2]));
          break;
        default:
          throw _eh + "unsupported dimension.";
          break;
      }
    }
  }

  Stamp(FID());
}

void TriMeshField::UpdateMinMaxField(set<Int_t> vertices)
{
  // Iterate over specified vertices and update global min/max values.

  static const Exc_t _eh("TriMeshField::ParitallyFindMinMaxField ");

  if (mNVerts <= 0)
  {
    mMinValue = mMaxValue = 0;
  }
  else
  {
    set<Int_t>::iterator i   = vertices.begin();
    set<Int_t>::iterator end = vertices.end();

    if (mFormula.IsNull())
    {
      switch (mDim)
      {
        case 1:
          for ( ; i != end; ++i)
            check_min_max(std_val_1d(FVec(*i)));
          break;
        case 2:
          for ( ; i != end; ++i)
            check_min_max(std_val_2d(FVec(*i)));
          break;
        case 3:
          for ( ; i != end; ++i)
            check_min_max(std_val_3d(FVec(*i)));
          break;
        default:
          throw _eh + "unsupported dimension.";
          break;
      }
    }
    else
    {
      TF3 tf3(GForm("TriMeshField_CT_%d", GetSaturnID()), mFormula.Data(), 0, 0);

      switch (mDim)
      {
        case 1:
          for ( ; i != end; ++i) {
            Float_t* F = FVec(*i);
            check_min_max((Float_t) tf3.Eval(F[0]));
          }
          break;
        case 2:
          for ( ; i != end; ++i) {
            Float_t* F = FVec(*i);
            check_min_max((Float_t) tf3.Eval(F[0], F[1]));
          }
          break;
        case 3:
          for ( ; i != end; ++i) {
            Float_t* F = FVec(*i);
            check_min_max((Float_t) tf3.Eval(F[0], F[1], F[2]));
          }
          break;
        default:
          throw _eh + "unsupported dimension.";
          break;
      }
    }
  }

  Stamp(FID());
}

//------------------------------------------------------------------------------

void TriMeshField::ApplyColors(Bool_t regen_tring_cols)
{
  static const Exc_t _eh("TriMeshField::ApplyColors ");

  TriMeshColorArraySource *carr_src =
    TriMeshColorArraySource::CastLens(_eh, *mColorArraySource, false);

  UChar_t *VCA = carr_src->GetVertexColorArray();
  if (!VCA)
    throw _eh + "color-array-source has no vertex-color-array.";

  assert_palette(_eh);
  assert_mesh(_eh);

  mPalette->SetMinFlt(mMinValue);
  mPalette->SetMaxFlt(mMaxValue);

  Float_t *F = FVec();
  UChar_t *C = VCA;

  if (mFormula.IsNull())
  {
    switch (mDim)
    {
      case 1:
        for (Int_t i=0; i<mNVerts; ++i, ++F, C+=4)
          mPalette->ColorFromValue(std_val_1d(F), C);
        break;
      case 2:
        for (Int_t i=0; i<mNVerts; ++i, F+=mDim, C+=4)
          mPalette->ColorFromValue(std_val_2d(F), C);
        break;
      case 3:
        for (Int_t i=0; i<mNVerts; ++i, F+=mDim, C+=4)
          mPalette->ColorFromValue(std_val_3d(F), C);
        break;
      default:
        throw _eh + "unsupported dimension.";
        break;
    }
  }
  else
  {
    TF3 tf3(GForm("TriMeshField_CT_%d", GetSaturnID()), mFormula.Data(), 0, 0);

    switch (mDim)
    {
      case 1:
        for (Int_t i=0; i<mNVerts; ++i, ++F, C+=4)
          mPalette->ColorFromValue((Float_t) tf3.Eval(F[0]), C);
        break;
      case 2:
        for (Int_t i=0; i<mNVerts; ++i, F+=mDim, C+=4)
          mPalette->ColorFromValue((Float_t) tf3.Eval(F[0], F[1]), C);
        break;
      case 3:
        for (Int_t i=0; i<mNVerts; ++i, F+=mDim, C+=4)
          mPalette->ColorFromValue((Float_t) tf3.Eval(F[0], F[1], F[2]), C);
        break;
      default:
        throw _eh + "unsupported dimension.";
        break;
    }
  }

  // Regenerate changed triangles if necessary.
  UChar_t *TCA = carr_src->GetTriangleColorArray();
  if (regen_tring_cols && TCA != 0)
  {
    mMesh->GetTTvor()->GenerateTriangleColorsFromVertexColors(VCA, TCA);
  }

  carr_src->ColorArraysModified();
}

void TriMeshField::PartiallyApplyColors(set<Int_t> vertices,
					Bool_t regen_tring_cols)
{
  static const Exc_t _eh("TriMeshField::PartiallyApplyColors ");

  TriMeshColorArraySource *carr_src =
    TriMeshColorArraySource::CastLens(_eh, *mColorArraySource, false);

  UChar_t *VCA = carr_src->GetVertexColorArray();
  if (!VCA)
    throw _eh + "color-array-source has no vertex-color-array.";

  assert_palette(_eh);
  assert_mesh(_eh);

  mPalette->SetMinFlt(mMinValue);
  mPalette->SetMaxFlt(mMaxValue);

  UChar_t *C = VCA;

  set<Int_t>::iterator i   = vertices.begin();
  set<Int_t>::iterator end = vertices.end();

  if (mFormula.IsNull())
  {
    switch (mDim)
    {
      case 1:
        for ( ; i != end; ++i)
          mPalette->ColorFromValue(std_val_1d(FVec(*i)), C+*i*4);
        break;
      case 2:
        for ( ; i != end; ++i)
          mPalette->ColorFromValue(std_val_2d(FVec(*i)), C+*i*4);
        break;
      case 3:
        for ( ; i != end; ++i)
          mPalette->ColorFromValue(std_val_3d(FVec(*i)), C+*i*4);
        break;
      default:
        throw(_eh + "unsupported dimension.");
        break;
    }
  }
  else
  {
    // !!! should cache formula as data-member.
    TF3 tf3(GForm("TriMeshField_CT_%d", GetSaturnID()), mFormula.Data(), 0, 0);

    switch (mDim)
    {
      case 1:
        for ( ; i != end; ++i) {
          Float_t* F = FVec(*i);
          mPalette->ColorFromValue((Float_t) tf3.Eval(F[0]), C+*i*4);
        }
        break;
      case 2:
        for ( ; i != end; ++i) {
          Float_t* F = FVec(*i);
          mPalette->ColorFromValue((Float_t) tf3.Eval(F[0], F[1]), C+*i*4);
        }
        break;
      case 3:
        for ( ; i != end; ++i) {
          Float_t* F = FVec(*i);
          mPalette->ColorFromValue((Float_t) tf3.Eval(F[0], F[1], F[2]), C+*i*4);
        }
        break;
      default:
        throw(_eh + "unsupported dimension.");
        break;
    }
  }

  // Regenerate changed triangles if necessary.
  UChar_t *TCA = carr_src->GetTriangleColorArray();
  if (regen_tring_cols && TCA != 0)
  {
    set<Int_t> ct; // changed triangles
    for (set<Int_t>::iterator v = vertices.begin(); v != vertices.end(); ++v)
    {
      const TriMesh::VertexData & vd = mMesh->RefVDataVec()[*v];
      for (Int_t e = 0; e < vd.n_edges(); ++e)
      {
        const TriMesh::EdgeData& ed = mMesh->RefEDataVec()[vd.edge(e)];
        ct.insert(ed.fT1);
        ct.insert(ed.fT2); // Not needed for closed surfaces.
      }
    }
    if (*ct.begin() == -1) // Potentially remove no-tring entry.
      ct.erase(ct.begin());

    mMesh->GetTTvor()->GenerateTriangleColorsFromVertexColors(ct, VCA, TCA);
  }

  carr_src->ColorArraysModified();
}

/**************************************************************************/

namespace
{
  struct GaussBlob { Float_t x, y, z, A, sgm, efc; };

  struct GaussSprayer : public TriMesh::VertexVisitorMaxDist
  {
    TriMeshField *mField;
    Float_t       mA, mExpFac;

    GaussSprayer(TriMesh* m, const Float_t origin[3], Float_t max_dist,
		 TriMeshField* mf, Float_t a, Float_t exp_fac) :
      TriMesh::VertexVisitorMaxDist(m, origin, max_dist),
      mField (mf),
      mA     (a),
      mExpFac(exp_fac)
    {}
    virtual ~GaussSprayer() {}

    virtual Bool_t VisitVertex(Int_t vertex)
    {
      if (TriMesh::VertexVisitorMaxDist::VisitVertex(vertex))
      {
	mField->F(vertex) += mA * expf(mExpFac*mLastDistSqr);
	return kTRUE;
      }
      else
      {
	return kFALSE;
      }
    }
  };
}

void TriMeshField::FillByGaussBlobs(Bool_t  reset_field, Int_t   n_blobs,
                                    Float_t A_min,       Float_t A_max,
                                    Float_t sigma_min,   Float_t sigma_max,
                                    Bool_t  minmax_p,    Bool_t  recolor_p)
{
  // Generate random 3D gaussian blobs on the surface of the mesh and
  // initialize field with the sum of contributions from all the blobs.
  //
  // gRandom is used for generation of the blob parameters.

  static const Exc_t _eh("TriMeshField::FillByXYGaussBlobs ");

  if (reset_field)
  {
    ResizeToMesh(1);
    SetField(0);
  }

  set<Int_t> all_changed;

  Float_t fgh[3], h_out;
  Int_t   triangle = Opcode::OPC_INVALID_ID;
  for (Int_t i=0; i<n_blobs; ++i)
  {
    GaussBlob B;
    B.A   = gRandom->Uniform(A_min, A_max);
    B.sgm = gRandom->Uniform(sigma_min, sigma_max);
    B.efc = -0.5f/(B.sgm*B.sgm);       // exp-factor
    //printf("Blob %3d: x,y,z=(%f,%f,%f); A,sgm=(%f,%f); efc=(%f)\n",
    //       i, B.x, B.y, B.z, B.A, B.sgm, B.efc);

    mMesh->GetParaSurf()->random_fgh(*gRandom, fgh);
    mMesh->FindPointFromFGH(fgh, false, &B.x, &h_out, &triangle);
    Int_t vertex = mMesh->FindClosestVertex(triangle, &B.x);

    GaussSprayer gs(*mMesh, &B.x, 3*B.sgm, this, B.A, B.efc);

    set<Int_t> visited;
    mMesh->VisitVertices(vertex, gs, visited, all_changed);
  }

  if (reset_field)
  {
    if (minmax_p)  FindMinMaxField();
    if (recolor_p) ApplyColors();
  }
  else
  {
    if (minmax_p)  UpdateMinMaxField(all_changed);
    if (recolor_p) PartiallyApplyColors(all_changed);
  }
}

//------------------------------------------------------------------------------

void TriMeshField::Diffuse(Float_t diff_const, Float_t dt, Bool_t limit_df, Bool_t recolor_p)
{
  static const Exc_t _eh("TriMeshField::Diffuse ");

  if (mDim != 1)
    throw _eh + "unsupported dimension.";

  assert_mesh(_eh);
  mMesh->AssertVertexConnections();

  printf("%sD=%f, dt=%f\n", _eh.Data(), diff_const, dt);

  vector<Float_t> delta(mField.size());
  const vector<TriMesh::VertexData>& vertex_data_vec = mMesh->RefVDataVec();
  const vector<TriMesh::EdgeData>  &   edge_data_vec = mMesh->RefEDataVec();

  Float_t Ddt = diff_const*dt;

  // !!! This could be rewritten as loop over edges, now that we have them.
  for (Int_t i=0; i<mNVerts; ++i)
  {
    const TriMesh::VertexData&    vdata = vertex_data_vec[i];
    for (Int_t ei = 0; ei < vdata.n_edges(); ++ei)
    {
      const TriMesh::EdgeData& ed = edge_data_vec[vdata.edge(ei)];
      Int_t j = ed.other_vertex(i);

      if (limit_df)
      {
        // Diffuse, but keep minimum value at zero.
        // This is reasonable for non-negative fields (eg. gas concentration).

        // Each edge is visited twice; the action is taken when
        // "giving field away", as limits can be applied there more
        // sensibly.

        // Ddt can be negative!
        Float_t delta_f = (mField[j] - mField[i])*Ddt;
        if (delta_f < 0)
        {
          Float_t df     = delta_f*ed.spread(i)/ed.distance();
          Float_t lim_df = TMath::Max(-mField[i] * ed.surface() / vdata.fSurface,
                                      0.5f * delta_f);
          if (df < lim_df)
            df = lim_df;
          delta[i] += df;
          delta[j] -= df;
        }
      }
      else
      {
        // Diffuse without limits; explodes for large time steps.

        // Visit each edge only once. Should introduce edge object / array.
        if (j > i)
        {
          // For now we forget about the "capacity" (surface) belonging
          // to each vertex, but we take into account the spread of the
          // edge and its length.
          // These should all be optional.
          Float_t df = (mField[j] - mField[i])*ed.spread(i)/ed.distance()*Ddt;
          delta[i] += df;
          delta[j] -= df;
        }
      }
    }
  }

  for (Int_t i=0; i<mNVerts; ++i)
  {
    mField[i] += delta[i];
    if (limit_df && mField[i] < 0) mField[i] = 0;
  }

  if (recolor_p) ApplyColors();
}
 TriMeshField.cxx:1
 TriMeshField.cxx:2
 TriMeshField.cxx:3
 TriMeshField.cxx:4
 TriMeshField.cxx:5
 TriMeshField.cxx:6
 TriMeshField.cxx:7
 TriMeshField.cxx:8
 TriMeshField.cxx:9
 TriMeshField.cxx:10
 TriMeshField.cxx:11
 TriMeshField.cxx:12
 TriMeshField.cxx:13
 TriMeshField.cxx:14
 TriMeshField.cxx:15
 TriMeshField.cxx:16
 TriMeshField.cxx:17
 TriMeshField.cxx:18
 TriMeshField.cxx:19
 TriMeshField.cxx:20
 TriMeshField.cxx:21
 TriMeshField.cxx:22
 TriMeshField.cxx:23
 TriMeshField.cxx:24
 TriMeshField.cxx:25
 TriMeshField.cxx:26
 TriMeshField.cxx:27
 TriMeshField.cxx:28
 TriMeshField.cxx:29
 TriMeshField.cxx:30
 TriMeshField.cxx:31
 TriMeshField.cxx:32
 TriMeshField.cxx:33
 TriMeshField.cxx:34
 TriMeshField.cxx:35
 TriMeshField.cxx:36
 TriMeshField.cxx:37
 TriMeshField.cxx:38
 TriMeshField.cxx:39
 TriMeshField.cxx:40
 TriMeshField.cxx:41
 TriMeshField.cxx:42
 TriMeshField.cxx:43
 TriMeshField.cxx:44
 TriMeshField.cxx:45
 TriMeshField.cxx:46
 TriMeshField.cxx:47
 TriMeshField.cxx:48
 TriMeshField.cxx:49
 TriMeshField.cxx:50
 TriMeshField.cxx:51
 TriMeshField.cxx:52
 TriMeshField.cxx:53
 TriMeshField.cxx:54
 TriMeshField.cxx:55
 TriMeshField.cxx:56
 TriMeshField.cxx:57
 TriMeshField.cxx:58
 TriMeshField.cxx:59
 TriMeshField.cxx:60
 TriMeshField.cxx:61
 TriMeshField.cxx:62
 TriMeshField.cxx:63
 TriMeshField.cxx:64
 TriMeshField.cxx:65
 TriMeshField.cxx:66
 TriMeshField.cxx:67
 TriMeshField.cxx:68
 TriMeshField.cxx:69
 TriMeshField.cxx:70
 TriMeshField.cxx:71
 TriMeshField.cxx:72
 TriMeshField.cxx:73
 TriMeshField.cxx:74
 TriMeshField.cxx:75
 TriMeshField.cxx:76
 TriMeshField.cxx:77
 TriMeshField.cxx:78
 TriMeshField.cxx:79
 TriMeshField.cxx:80
 TriMeshField.cxx:81
 TriMeshField.cxx:82
 TriMeshField.cxx:83
 TriMeshField.cxx:84
 TriMeshField.cxx:85
 TriMeshField.cxx:86
 TriMeshField.cxx:87
 TriMeshField.cxx:88
 TriMeshField.cxx:89
 TriMeshField.cxx:90
 TriMeshField.cxx:91
 TriMeshField.cxx:92
 TriMeshField.cxx:93
 TriMeshField.cxx:94
 TriMeshField.cxx:95
 TriMeshField.cxx:96
 TriMeshField.cxx:97
 TriMeshField.cxx:98
 TriMeshField.cxx:99
 TriMeshField.cxx:100
 TriMeshField.cxx:101
 TriMeshField.cxx:102
 TriMeshField.cxx:103
 TriMeshField.cxx:104
 TriMeshField.cxx:105
 TriMeshField.cxx:106
 TriMeshField.cxx:107
 TriMeshField.cxx:108
 TriMeshField.cxx:109
 TriMeshField.cxx:110
 TriMeshField.cxx:111
 TriMeshField.cxx:112
 TriMeshField.cxx:113
 TriMeshField.cxx:114
 TriMeshField.cxx:115
 TriMeshField.cxx:116
 TriMeshField.cxx:117
 TriMeshField.cxx:118
 TriMeshField.cxx:119
 TriMeshField.cxx:120
 TriMeshField.cxx:121
 TriMeshField.cxx:122
 TriMeshField.cxx:123
 TriMeshField.cxx:124
 TriMeshField.cxx:125
 TriMeshField.cxx:126
 TriMeshField.cxx:127
 TriMeshField.cxx:128
 TriMeshField.cxx:129
 TriMeshField.cxx:130
 TriMeshField.cxx:131
 TriMeshField.cxx:132
 TriMeshField.cxx:133
 TriMeshField.cxx:134
 TriMeshField.cxx:135
 TriMeshField.cxx:136
 TriMeshField.cxx:137
 TriMeshField.cxx:138
 TriMeshField.cxx:139
 TriMeshField.cxx:140
 TriMeshField.cxx:141
 TriMeshField.cxx:142
 TriMeshField.cxx:143
 TriMeshField.cxx:144
 TriMeshField.cxx:145
 TriMeshField.cxx:146
 TriMeshField.cxx:147
 TriMeshField.cxx:148
 TriMeshField.cxx:149
 TriMeshField.cxx:150
 TriMeshField.cxx:151
 TriMeshField.cxx:152
 TriMeshField.cxx:153
 TriMeshField.cxx:154
 TriMeshField.cxx:155
 TriMeshField.cxx:156
 TriMeshField.cxx:157
 TriMeshField.cxx:158
 TriMeshField.cxx:159
 TriMeshField.cxx:160
 TriMeshField.cxx:161
 TriMeshField.cxx:162
 TriMeshField.cxx:163
 TriMeshField.cxx:164
 TriMeshField.cxx:165
 TriMeshField.cxx:166
 TriMeshField.cxx:167
 TriMeshField.cxx:168
 TriMeshField.cxx:169
 TriMeshField.cxx:170
 TriMeshField.cxx:171
 TriMeshField.cxx:172
 TriMeshField.cxx:173
 TriMeshField.cxx:174
 TriMeshField.cxx:175
 TriMeshField.cxx:176
 TriMeshField.cxx:177
 TriMeshField.cxx:178
 TriMeshField.cxx:179
 TriMeshField.cxx:180
 TriMeshField.cxx:181
 TriMeshField.cxx:182
 TriMeshField.cxx:183
 TriMeshField.cxx:184
 TriMeshField.cxx:185
 TriMeshField.cxx:186
 TriMeshField.cxx:187
 TriMeshField.cxx:188
 TriMeshField.cxx:189
 TriMeshField.cxx:190
 TriMeshField.cxx:191
 TriMeshField.cxx:192
 TriMeshField.cxx:193
 TriMeshField.cxx:194
 TriMeshField.cxx:195
 TriMeshField.cxx:196
 TriMeshField.cxx:197
 TriMeshField.cxx:198
 TriMeshField.cxx:199
 TriMeshField.cxx:200
 TriMeshField.cxx:201
 TriMeshField.cxx:202
 TriMeshField.cxx:203
 TriMeshField.cxx:204
 TriMeshField.cxx:205
 TriMeshField.cxx:206
 TriMeshField.cxx:207
 TriMeshField.cxx:208
 TriMeshField.cxx:209
 TriMeshField.cxx:210
 TriMeshField.cxx:211
 TriMeshField.cxx:212
 TriMeshField.cxx:213
 TriMeshField.cxx:214
 TriMeshField.cxx:215
 TriMeshField.cxx:216
 TriMeshField.cxx:217
 TriMeshField.cxx:218
 TriMeshField.cxx:219
 TriMeshField.cxx:220
 TriMeshField.cxx:221
 TriMeshField.cxx:222
 TriMeshField.cxx:223
 TriMeshField.cxx:224
 TriMeshField.cxx:225
 TriMeshField.cxx:226
 TriMeshField.cxx:227
 TriMeshField.cxx:228
 TriMeshField.cxx:229
 TriMeshField.cxx:230
 TriMeshField.cxx:231
 TriMeshField.cxx:232
 TriMeshField.cxx:233
 TriMeshField.cxx:234
 TriMeshField.cxx:235
 TriMeshField.cxx:236
 TriMeshField.cxx:237
 TriMeshField.cxx:238
 TriMeshField.cxx:239
 TriMeshField.cxx:240
 TriMeshField.cxx:241
 TriMeshField.cxx:242
 TriMeshField.cxx:243
 TriMeshField.cxx:244
 TriMeshField.cxx:245
 TriMeshField.cxx:246
 TriMeshField.cxx:247
 TriMeshField.cxx:248
 TriMeshField.cxx:249
 TriMeshField.cxx:250
 TriMeshField.cxx:251
 TriMeshField.cxx:252
 TriMeshField.cxx:253
 TriMeshField.cxx:254
 TriMeshField.cxx:255
 TriMeshField.cxx:256
 TriMeshField.cxx:257
 TriMeshField.cxx:258
 TriMeshField.cxx:259
 TriMeshField.cxx:260
 TriMeshField.cxx:261
 TriMeshField.cxx:262
 TriMeshField.cxx:263
 TriMeshField.cxx:264
 TriMeshField.cxx:265
 TriMeshField.cxx:266
 TriMeshField.cxx:267
 TriMeshField.cxx:268
 TriMeshField.cxx:269
 TriMeshField.cxx:270
 TriMeshField.cxx:271
 TriMeshField.cxx:272
 TriMeshField.cxx:273
 TriMeshField.cxx:274
 TriMeshField.cxx:275
 TriMeshField.cxx:276
 TriMeshField.cxx:277
 TriMeshField.cxx:278
 TriMeshField.cxx:279
 TriMeshField.cxx:280
 TriMeshField.cxx:281
 TriMeshField.cxx:282
 TriMeshField.cxx:283
 TriMeshField.cxx:284
 TriMeshField.cxx:285
 TriMeshField.cxx:286
 TriMeshField.cxx:287
 TriMeshField.cxx:288
 TriMeshField.cxx:289
 TriMeshField.cxx:290
 TriMeshField.cxx:291
 TriMeshField.cxx:292
 TriMeshField.cxx:293
 TriMeshField.cxx:294
 TriMeshField.cxx:295
 TriMeshField.cxx:296
 TriMeshField.cxx:297
 TriMeshField.cxx:298
 TriMeshField.cxx:299
 TriMeshField.cxx:300
 TriMeshField.cxx:301
 TriMeshField.cxx:302
 TriMeshField.cxx:303
 TriMeshField.cxx:304
 TriMeshField.cxx:305
 TriMeshField.cxx:306
 TriMeshField.cxx:307
 TriMeshField.cxx:308
 TriMeshField.cxx:309
 TriMeshField.cxx:310
 TriMeshField.cxx:311
 TriMeshField.cxx:312
 TriMeshField.cxx:313
 TriMeshField.cxx:314
 TriMeshField.cxx:315
 TriMeshField.cxx:316
 TriMeshField.cxx:317
 TriMeshField.cxx:318
 TriMeshField.cxx:319
 TriMeshField.cxx:320
 TriMeshField.cxx:321
 TriMeshField.cxx:322
 TriMeshField.cxx:323
 TriMeshField.cxx:324
 TriMeshField.cxx:325
 TriMeshField.cxx:326
 TriMeshField.cxx:327
 TriMeshField.cxx:328
 TriMeshField.cxx:329
 TriMeshField.cxx:330
 TriMeshField.cxx:331
 TriMeshField.cxx:332
 TriMeshField.cxx:333
 TriMeshField.cxx:334
 TriMeshField.cxx:335
 TriMeshField.cxx:336
 TriMeshField.cxx:337
 TriMeshField.cxx:338
 TriMeshField.cxx:339
 TriMeshField.cxx:340
 TriMeshField.cxx:341
 TriMeshField.cxx:342
 TriMeshField.cxx:343
 TriMeshField.cxx:344
 TriMeshField.cxx:345
 TriMeshField.cxx:346
 TriMeshField.cxx:347
 TriMeshField.cxx:348
 TriMeshField.cxx:349
 TriMeshField.cxx:350
 TriMeshField.cxx:351
 TriMeshField.cxx:352
 TriMeshField.cxx:353
 TriMeshField.cxx:354
 TriMeshField.cxx:355
 TriMeshField.cxx:356
 TriMeshField.cxx:357
 TriMeshField.cxx:358
 TriMeshField.cxx:359
 TriMeshField.cxx:360
 TriMeshField.cxx:361
 TriMeshField.cxx:362
 TriMeshField.cxx:363
 TriMeshField.cxx:364
 TriMeshField.cxx:365
 TriMeshField.cxx:366
 TriMeshField.cxx:367
 TriMeshField.cxx:368
 TriMeshField.cxx:369
 TriMeshField.cxx:370
 TriMeshField.cxx:371
 TriMeshField.cxx:372
 TriMeshField.cxx:373
 TriMeshField.cxx:374
 TriMeshField.cxx:375
 TriMeshField.cxx:376
 TriMeshField.cxx:377
 TriMeshField.cxx:378
 TriMeshField.cxx:379
 TriMeshField.cxx:380
 TriMeshField.cxx:381
 TriMeshField.cxx:382
 TriMeshField.cxx:383
 TriMeshField.cxx:384
 TriMeshField.cxx:385
 TriMeshField.cxx:386
 TriMeshField.cxx:387
 TriMeshField.cxx:388
 TriMeshField.cxx:389
 TriMeshField.cxx:390
 TriMeshField.cxx:391
 TriMeshField.cxx:392
 TriMeshField.cxx:393
 TriMeshField.cxx:394
 TriMeshField.cxx:395
 TriMeshField.cxx:396
 TriMeshField.cxx:397
 TriMeshField.cxx:398
 TriMeshField.cxx:399
 TriMeshField.cxx:400
 TriMeshField.cxx:401
 TriMeshField.cxx:402
 TriMeshField.cxx:403
 TriMeshField.cxx:404
 TriMeshField.cxx:405
 TriMeshField.cxx:406
 TriMeshField.cxx:407
 TriMeshField.cxx:408
 TriMeshField.cxx:409
 TriMeshField.cxx:410
 TriMeshField.cxx:411
 TriMeshField.cxx:412
 TriMeshField.cxx:413
 TriMeshField.cxx:414
 TriMeshField.cxx:415
 TriMeshField.cxx:416
 TriMeshField.cxx:417
 TriMeshField.cxx:418
 TriMeshField.cxx:419
 TriMeshField.cxx:420
 TriMeshField.cxx:421
 TriMeshField.cxx:422
 TriMeshField.cxx:423
 TriMeshField.cxx:424
 TriMeshField.cxx:425
 TriMeshField.cxx:426
 TriMeshField.cxx:427
 TriMeshField.cxx:428
 TriMeshField.cxx:429
 TriMeshField.cxx:430
 TriMeshField.cxx:431
 TriMeshField.cxx:432
 TriMeshField.cxx:433
 TriMeshField.cxx:434
 TriMeshField.cxx:435
 TriMeshField.cxx:436
 TriMeshField.cxx:437
 TriMeshField.cxx:438
 TriMeshField.cxx:439
 TriMeshField.cxx:440
 TriMeshField.cxx:441
 TriMeshField.cxx:442
 TriMeshField.cxx:443
 TriMeshField.cxx:444
 TriMeshField.cxx:445
 TriMeshField.cxx:446
 TriMeshField.cxx:447
 TriMeshField.cxx:448
 TriMeshField.cxx:449
 TriMeshField.cxx:450
 TriMeshField.cxx:451
 TriMeshField.cxx:452
 TriMeshField.cxx:453
 TriMeshField.cxx:454
 TriMeshField.cxx:455
 TriMeshField.cxx:456
 TriMeshField.cxx:457
 TriMeshField.cxx:458
 TriMeshField.cxx:459
 TriMeshField.cxx:460
 TriMeshField.cxx:461
 TriMeshField.cxx:462
 TriMeshField.cxx:463
 TriMeshField.cxx:464
 TriMeshField.cxx:465
 TriMeshField.cxx:466
 TriMeshField.cxx:467
 TriMeshField.cxx:468
 TriMeshField.cxx:469
 TriMeshField.cxx:470
 TriMeshField.cxx:471
 TriMeshField.cxx:472
 TriMeshField.cxx:473
 TriMeshField.cxx:474
 TriMeshField.cxx:475
 TriMeshField.cxx:476
 TriMeshField.cxx:477
 TriMeshField.cxx:478
 TriMeshField.cxx:479
 TriMeshField.cxx:480
 TriMeshField.cxx:481
 TriMeshField.cxx:482
 TriMeshField.cxx:483
 TriMeshField.cxx:484
 TriMeshField.cxx:485
 TriMeshField.cxx:486
 TriMeshField.cxx:487
 TriMeshField.cxx:488
 TriMeshField.cxx:489
 TriMeshField.cxx:490
 TriMeshField.cxx:491
 TriMeshField.cxx:492
 TriMeshField.cxx:493
 TriMeshField.cxx:494
 TriMeshField.cxx:495
 TriMeshField.cxx:496
 TriMeshField.cxx:497
 TriMeshField.cxx:498
 TriMeshField.cxx:499
 TriMeshField.cxx:500
 TriMeshField.cxx:501
 TriMeshField.cxx:502
 TriMeshField.cxx:503
 TriMeshField.cxx:504
 TriMeshField.cxx:505
 TriMeshField.cxx:506
 TriMeshField.cxx:507
 TriMeshField.cxx:508
 TriMeshField.cxx:509
 TriMeshField.cxx:510
 TriMeshField.cxx:511
 TriMeshField.cxx:512
 TriMeshField.cxx:513
 TriMeshField.cxx:514
 TriMeshField.cxx:515
 TriMeshField.cxx:516
 TriMeshField.cxx:517
 TriMeshField.cxx:518
 TriMeshField.cxx:519
 TriMeshField.cxx:520
 TriMeshField.cxx:521
 TriMeshField.cxx:522
 TriMeshField.cxx:523
 TriMeshField.cxx:524
 TriMeshField.cxx:525
 TriMeshField.cxx:526
 TriMeshField.cxx:527
 TriMeshField.cxx:528
 TriMeshField.cxx:529
 TriMeshField.cxx:530
 TriMeshField.cxx:531
 TriMeshField.cxx:532
 TriMeshField.cxx:533
 TriMeshField.cxx:534
 TriMeshField.cxx:535
 TriMeshField.cxx:536
 TriMeshField.cxx:537
 TriMeshField.cxx:538
 TriMeshField.cxx:539
 TriMeshField.cxx:540
 TriMeshField.cxx:541
 TriMeshField.cxx:542
 TriMeshField.cxx:543
 TriMeshField.cxx:544
 TriMeshField.cxx:545
 TriMeshField.cxx:546
 TriMeshField.cxx:547
 TriMeshField.cxx:548
 TriMeshField.cxx:549
 TriMeshField.cxx:550
 TriMeshField.cxx:551
 TriMeshField.cxx:552
 TriMeshField.cxx:553
 TriMeshField.cxx:554
 TriMeshField.cxx:555
 TriMeshField.cxx:556
 TriMeshField.cxx:557
 TriMeshField.cxx:558
 TriMeshField.cxx:559
 TriMeshField.cxx:560
 TriMeshField.cxx:561
 TriMeshField.cxx:562
 TriMeshField.cxx:563
 TriMeshField.cxx:564
 TriMeshField.cxx:565
 TriMeshField.cxx:566
 TriMeshField.cxx:567
 TriMeshField.cxx:568
 TriMeshField.cxx:569
 TriMeshField.cxx:570
 TriMeshField.cxx:571
 TriMeshField.cxx:572
 TriMeshField.cxx:573
 TriMeshField.cxx:574
 TriMeshField.cxx:575
 TriMeshField.cxx:576
 TriMeshField.cxx:577
 TriMeshField.cxx:578
 TriMeshField.cxx:579
 TriMeshField.cxx:580
 TriMeshField.cxx:581
 TriMeshField.cxx:582
 TriMeshField.cxx:583
 TriMeshField.cxx:584
 TriMeshField.cxx:585
 TriMeshField.cxx:586
 TriMeshField.cxx:587
 TriMeshField.cxx:588
 TriMeshField.cxx:589
 TriMeshField.cxx:590
 TriMeshField.cxx:591
 TriMeshField.cxx:592
 TriMeshField.cxx:593
 TriMeshField.cxx:594
 TriMeshField.cxx:595
 TriMeshField.cxx:596
 TriMeshField.cxx:597
 TriMeshField.cxx:598
 TriMeshField.cxx:599
 TriMeshField.cxx:600
 TriMeshField.cxx:601
 TriMeshField.cxx:602
 TriMeshField.cxx:603
 TriMeshField.cxx:604
 TriMeshField.cxx:605
 TriMeshField.cxx:606
 TriMeshField.cxx:607
 TriMeshField.cxx:608
 TriMeshField.cxx:609
 TriMeshField.cxx:610
 TriMeshField.cxx:611