[pooma-dev] RFA: Patch for fixes for regression test failures
Jeffrey Oldham
oldham at codesourcery.com
Wed Oct 10 02:55:50 UTC 2001
On Tue, Oct 09, 2001 at 06:35:25PM -0600, Mark P Mitchell wrote:
>
> The attached patch attempts to fix several regression tests.
>
> Here is a summary:
>
> src/Array/tests/ScalarAdvection.cpp:
>
> Updated to use approximately the same code that Scott used in
> examples/Field/ScalarAdvection/ScalarAdvection.cpp.
>
> Note that although this test now compiles, it still fails for dimension 2. Scott's code fails in dimension 2, as well. This code works in dimension 1 as does Scott's code.
Was the original code dimension-independent? If so, it would be nice
that the revised code is also dimension independent.
> src/Connect/Lux/tests/*:
>
> These tests failed because LuxConnector.Field.h had not been
> updated for the new fields.
For me, lux_test2 still fails, but I believe that is a particle problem.
> src/DynamicArray/tests/dynamic_array_badcreate.cpp:
>
> This test tests to make sure that you cannot dynamically change the
> size of a DynamicArray when there is a view outstanding for the
> DynamicArray. (Doing so could leave the view pointing at
> nonsense.)
>
> However, nothing in the DynamicArray code actually seems to
> enforce this constraint, so the test fails at run time.
>
> I couldn't fix this one. Should the test be changed? Should
> such a check be implemented?
>
> src/Field/tests/Positions.cpp:
> src/Field/tests/CrossBox.cpp:
>
> Also needed updating for the new fields.
>
> src/Pooma/tests/pooma.cpp:
>
> This test was written wrong -- it was not set up to exit with
> code zero on success.
>
> OK to check in?
Yes. I have attached a slightly different patch. Would you please
list on which platforms you tested the code? I compiled and tested
the code on Linux/g++.
Thanks,
Jeffrey D. Oldham
oldham at codesourcery.com
-------------- next part --------------
Index: src/Array/tests/ScalarAdvection.cpp
===================================================================
RCS file: /home/pooma/Repository/r2/src/Array/tests/ScalarAdvection.cpp,v
retrieving revision 1.4
diff -c -p -r1.4 ScalarAdvection.cpp
*** src/Array/tests/ScalarAdvection.cpp 2000/07/20 15:36:24 1.4
--- src/Array/tests/ScalarAdvection.cpp 2001/10/10 02:48:28
***************
*** 28,56 ****
// ----------------------------------------------------------------------------
// Scalar advection example, illustrating use of Field, Mesh,
! // DiscreteGeometry, and the canned second-order divergence operator
! // div<Cell>()
// ----------------------------------------------------------------------------
#include "Pooma/Fields.h"
#include "Utilities/Clock.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
// Forward declarations:
// Ensight output:
void ensightCaseOut(char *fn, int increment, int lastTimeStep, double dt);
template<int Dim>
void ensightGeometryOut(char *fn, UniformRectilinearMesh<Dim> &mesh);
! template<class T, class EngineTag>
! void ensightVariableOut(char *fn, const Array<1, T, EngineTag> &a);
! template<class T, class EngineTag>
! void ensightVariableOut(char *fn, const Array<2, T, EngineTag> &a);
! template<class T, class EngineTag>
! void ensightVariableOut(char *fn, const Array<3, T, EngineTag> &a);
// Workaround for not-yet-correct canned stencil-based div():
template<class Geometry, class EngineTag>
--- 28,64 ----
// ----------------------------------------------------------------------------
// Scalar advection example, illustrating use of Field, Mesh,
! // DiscreteGeometry, and the canned second-order divergence operator div
// ----------------------------------------------------------------------------
#include "Pooma/Fields.h"
#include "Utilities/Clock.h"
+ #if POOMA_CHEETAH
+ typedef DistributedTag LayoutTag_t;
+ typedef Remote<CompressibleBrick> BrickTag_t;
+ #else
+ typedef ReplicatedTag LayoutTag_t;
+ typedef CompressibleBrick BrickTag_t;
+ #endif
+
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
+ // Typedefs and constants.
+ const int Dim = 2;
+ typedef UniformRectilinearMesh<Dim> Mesh_t;
+ typedef MultiPatch<UniformTag, BrickTag_t> MP_t;
+ typedef Field<Mesh_t, double, MP_t> Field_t;
+
// Forward declarations:
// Ensight output:
void ensightCaseOut(char *fn, int increment, int lastTimeStep, double dt);
template<int Dim>
void ensightGeometryOut(char *fn, UniformRectilinearMesh<Dim> &mesh);
! void ensightVariableOut(char *fn, Field_t &f);
// Workaround for not-yet-correct canned stencil-based div():
template<class Geometry, class EngineTag>
*************** private:
*** 136,187 ****
};
- template<int Dim>
- struct PeriodicBCThing
- {
- };
-
- template<>
- struct PeriodicBCThing<2>
- {
- template<class Layout>
- PeriodicBCThing(const Layout &layout)
- {
- Interval<2> dom = layout.domain();
- int x1 = dom[0].first();
- int x2 = dom[0].last();
- int y1 = dom[1].first();
- int y2 = dom[1].last();
-
- Interval<1> xinterior(x1 + 1, x2 - 1);
- // Interval<1> yinterior(y1 + 1, y2 - 1);
- Interval<1> yinterior(y1, y2);
-
- north_m = Interval<2>(xinterior, Interval<1>(y1, y1));
- south_m = Interval<2>(xinterior, Interval<1>(y2, y2));
- east_m = Interval<2>(Interval<1>(x1, x1), yinterior);
- west_m = Interval<2>(Interval<1>(x2, x2), yinterior);
-
- northFrom_m = Interval<2>(xinterior, Interval<1>(y2 - 1, y2 - 1));
- southFrom_m = Interval<2>(xinterior, Interval<1>(y1 + 1, y1 + 1));
- eastFrom_m = Interval<2>(Interval<1>(x2 - 1, x2 - 1), yinterior);
- westFrom_m = Interval<2>(Interval<1>(x1 + 1, x1 + 1), yinterior);
- }
-
- template<class Array>
- void apply(const Array &a)
- {
- a(north_m) = a(northFrom_m);
- a(south_m) = a(southFrom_m);
- a(west_m) = a(westFrom_m);
- a(east_m) = a(eastFrom_m);
- }
-
- Interval<2> north_m, south_m, east_m, west_m;
- Interval<2> northFrom_m, southFrom_m, eastFrom_m, westFrom_m;
- };
-
-
int main(int argc, char *argv[])
{
Pooma::initialize(argc,argv); // Initialize the library
--- 144,149 ----
*************** int main(int argc, char *argv[])
*** 189,250 ****
// PrintArray class, to format output as desired:
PrintArray pa(3, 10, 3, 6, true, 1);
- const int Dim = 2; // Set the dimensionality
-
// The SAOptions object sets the default option values
// and parses argv for options that override the defaults.
SAOptions<Dim> opts(argc, argv);
opts.print(pout);
! // Create the physical domains:
! Interval<Dim> vertexDomain, cellDomain;
int d;
for (d = 0; d < Dim; d++) {
vertexDomain[d] = Interval<1>(opts.nVerts[d]);
- cellDomain[d] = Interval<1>(opts.nCells[d]);
}
// Create the (uniform, logically rectilinear) mesh.
- Vector<Dim> origin(0.0), spacings(0.2);
- typedef UniformRectilinearMesh<Dim> Mesh_t;
- Mesh_t mesh(vertexDomain, origin, spacings);
! // Create two geometry objects - one allowing 1 guard layer to account for
! // stencil width and another with no guard layers to support temporaries:
! typedef DiscreteGeometry<Cell, UniformRectilinearMesh<Dim> > Geometry_t;
! Geometry_t geom(mesh, GuardLayers<Dim>(1));
! Geometry_t geomNG(mesh);
!
! // Create the layouts
! Loc<Dim> patches(8);
! for (d = 0; d < Dim; d++) { patches[d] = Loc<1>(opts.nPatches[d]); }
! GridLayout<Dim> layoutc(cellDomain, patches,
! GuardLayers<Dim>(1), GuardLayers<Dim>(1),
! ReplicatedTag());
! GridLayout<Dim> layoutcNG(cellDomain, patches, ReplicatedTag());
! typedef MultiPatch<GridTag, CompressibleBrick> MP_t;
// Create the Fields:
-
- // The flow Field u(x,t), a duplicate (stored at the previous
- // timestep for staggered leapfrog), and a useful temporary:
-
- Array<Dim, double, MP_t>
- u(layoutc), uPrev(layoutcNG), uTemp(layoutcNG),
- uTemp2(layoutcNG);
-
- Interval<2> physical = uPrev.domain();
! // Needed for div() bug WORKAROUND below:
! Array<Dim, Vector<Dim, double>, MP_t> uv(layoutc);
// Initialize Fields to zero everywhere, even global guard layers:
! u = 0.0;
! PeriodicBCThing<Dim> pbc(u.engine().layout());
// Load initial condition u(x,0), a symmetric pulse centered around nCells/4
// and decaying to zero away from nCells/4 all directions, with a height of
--- 151,206 ----
// PrintArray class, to format output as desired:
PrintArray pa(3, 10, 3, 6, true, 1);
// The SAOptions object sets the default option values
// and parses argv for options that override the defaults.
SAOptions<Dim> opts(argc, argv);
opts.print(pout);
+
+ // Create the physical domains
! Interval<Dim> vertexDomain;
int d;
for (d = 0; d < Dim; d++) {
vertexDomain[d] = Interval<1>(opts.nVerts[d]);
}
+ // Create some layouts.
+ Loc<Dim> patches(opts.nPatches[0]);
+ UniformGridLayout<Dim> layout(vertexDomain, patches,
+ GuardLayers<Dim>(1), GuardLayers<Dim>(1),
+ LayoutTag_t());
+ UniformGridLayout<Dim> layoutNG(vertexDomain, patches, LayoutTag_t());
+
// Create the (uniform, logically rectilinear) mesh.
! Vector<Dim> origin(0.0), spacings(0.2);
! Mesh_t mesh(layout, origin, spacings);
! Mesh_t meshNG(layoutNG, origin, spacings);
! // Create the centering.
!
! Centering<Dim> cell = canonicalCentering<Dim>(CellType, Continuous);
// Create the Fields:
! // The flow Field u(x,t):
!
! Field_t u(cell, layout, mesh);
! Field<Mesh_t, Vector<Dim>, MP_t> dtvu(cell, layout, mesh);
!
! // The same, stored at the previous timestep for staggered leapfrog
! // plus a useful temporary:
!
! Field_t uPrev(cell, layoutNG, meshNG), uTemp(cell, layoutNG, meshNG);
// Initialize Fields to zero everywhere, even global guard layers:
! u.all() = 0.0;
! // Set up periodic boundary conditions on all mesh faces:
!
! Pooma::addAllPeriodicFaceBC(u);
// Load initial condition u(x,0), a symmetric pulse centered around nCells/4
// and decaying to zero away from nCells/4 all directions, with a height of
*************** int main(int argc, char *argv[])
*** 256,263 ****
for (d = 0; d < Dim; d++) { pulseCenter[d] = Loc<1>(opts.nCells[0]/4); }
Pooma::blockAndEvaluate(); // Needed pre-scalar-indexing read
! Vector<Dim> u0 = geom.x()(pulseCenter);
! u = 1.0 * exp(-dot(geom.x() - u0, geom.x() - u0) / (2.0 * pulseHalfWidth));
const Vector<Dim> v(0.2); // Propagation velocity
const double dt = 0.1; // Timestep
--- 212,220 ----
for (d = 0; d < Dim; d++) { pulseCenter[d] = Loc<1>(opts.nCells[0]/4); }
Pooma::blockAndEvaluate(); // Needed pre-scalar-indexing read
! PositionsTraits<Mesh_t>::Type_t ux = positions(u);
! Vector<Dim> u0 = ux.read(pulseCenter);
! u = 1.0 * exp(-dot(ux - u0, ux - u0) / (2.0 * pulseHalfWidth));
const Vector<Dim> v(0.2); // Propagation velocity
const double dt = 0.1; // Timestep
*************** int main(int argc, char *argv[])
*** 268,284 ****
ensightGeometryOut("ScalarAdvection.geo", mesh);
}
! // Print out information at t = 0:
if (opts.purge) {
! u = where((fabs(u) < opts.epsilon), 0.0); // Purge initial conditions
}
Pooma::blockAndEvaluate(); // Needed for compressedFraction() validity
pout << "t = " << double(0.0) << " ; compressedFraction(u) = "
<< compressedFraction(u) << std::endl;
! // pout << u(physical) << std::endl;
! pbc.apply(u);
! if (opts.doSumOut) pout << "sum(u) = " << sum(u(physical)) << std::endl;
char timeStepFileName[6];
if (opts.doEnsightOut) {
sprintf(timeStepFileName, "u.%04d", 0);
--- 225,242 ----
ensightGeometryOut("ScalarAdvection.geo", mesh);
}
! #if 0
if (opts.purge) {
! u = where(u, (fabs(u) < opts.epsilon), 0.0); // Purge initial conditions
}
+ #endif
+ // Print out information at t = 0:
Pooma::blockAndEvaluate(); // Needed for compressedFraction() validity
pout << "t = " << double(0.0) << " ; compressedFraction(u) = "
<< compressedFraction(u) << std::endl;
! // pout << u << std::endl;
! if (opts.doSumOut) pout << "sum(u) = " << sum(u) << std::endl;
char timeStepFileName[6];
if (opts.doEnsightOut) {
sprintf(timeStepFileName, "u.%04d", 0);
*************** int main(int argc, char *argv[])
*** 288,317 ****
// Prime the leapfrog by setting the field at the previous timestep using the
// initial conditions:
! uPrev = u(physical);
// Do a preliminary timestep using forward Euler, using the canned POOMA
! // div() function:
! // BROKEN u -= div<Cell>(v * dt * u);
! // WORKAROUND:
! // Use the Field<Vector> temporay for most straightforward r1 comparison:
! uv = u * v * dt;
!
! Interval<1> I = geom.mesh().physicalCellDomain()[0];
! Interval<1> J = geom.mesh().physicalCellDomain()[1];
!
! Geometry_t::Mesh_t::PointType_t dx2i = geom.mesh().meshSpacing();
!
! dx2i = 0.5/dx2i;
!
! uTemp2(I,J) =
! (uv.comp(0)(I + 1, J) - uv.comp(0)(I - 1, J))*dx2i(0) +
! (uv.comp(1)(I, J + 1) - uv.comp(1)(I, J - 1))*dx2i(1);
!
! // divv(uv, uTemp2);
! u(physical) -= uTemp2;
! pbc.apply(u);
! // WORKAROUND.
// Start timer to time main loop; do blockAndEvaluate first so results are
// meaningful:
--- 246,258 ----
// Prime the leapfrog by setting the field at the previous timestep using the
// initial conditions:
! uPrev = u;
// Do a preliminary timestep using forward Euler, using the canned POOMA
! // stencil-based divergence operator div() for the spatial difference:
!
! dtvu.all() = dt * v * u.all();
! u -= divCellToCell(dtvu);
// Start timer to time main loop; do blockAndEvaluate first so results are
// meaningful:
*************** int main(int argc, char *argv[])
*** 323,356 ****
// The spatial derivative is just the second-order finite difference in the
// canned POOMA stencil-based divergence operator div():
for (int timestep = 2; timestep <= opts.lastTimeStep; timestep++) {
! uTemp = u(physical);
!
! // BROKEN u = uPrev - 2.0 * div<Cell>(v * dt * u);
! // WORKAROUND:
! // Use the Field<Vector> temporay for most straightforward r1 comparison:
! uv = u * v * dt;
! uTemp2(I,J) =
! (uv.comp(0)(I + 1, J) - uv.comp(0)(I - 1, J))*dx2i(0) +
! (uv.comp(1)(I, J + 1) - uv.comp(1)(I, J - 1))*dx2i(1);
!
! // divv(uv, uTemp2);
! u(physical) = uPrev - 2.0 * uTemp2;
!
! // WORKAROUND.
! //tjw workaround.
! if (opts.purge) {
! if ((timestep % opts.purgeIncrement) == 0) {
! u(physical) = where((fabs(u(physical)) < opts.epsilon), 0.0);
! // WORKAROUND for WCY
! }
! }
if ((timestep % opts.outputIncrement) == 0) {
Pooma::blockAndEvaluate(); // Needed for compressedFraction() validity
pout << "t = " << timestep*dt << " ; compressedFraction(u) = "
<< compressedFraction(u) << std::endl;
! // pout << u(physical) << std::endl;
! if (opts.doSumOut) pout << "sum(u) = " << sum(u(physical)) << std::endl;
if (opts.doEnsightOut) {
// u.applyBoundaryConditions(); // Update prior to output.
sprintf(timeStepFileName, "u.%04d", timestep);
--- 264,279 ----
// The spatial derivative is just the second-order finite difference in the
// canned POOMA stencil-based divergence operator div():
for (int timestep = 2; timestep <= opts.lastTimeStep; timestep++) {
! uTemp = u;
! dtvu.all() = dt * v * u.all();
! u = uPrev - 2.0 * divCellToCell(dtvu);
if ((timestep % opts.outputIncrement) == 0) {
Pooma::blockAndEvaluate(); // Needed for compressedFraction() validity
pout << "t = " << timestep*dt << " ; compressedFraction(u) = "
<< compressedFraction(u) << std::endl;
! // pout << u << std::endl;
! if (opts.doSumOut) pout << "sum(u) = " << sum(u) << std::endl;
if (opts.doEnsightOut) {
// u.applyBoundaryConditions(); // Update prior to output.
sprintf(timeStepFileName, "u.%04d", timestep);
*************** int main(int argc, char *argv[])
*** 359,366 ****
if (opts.doTextOut) { pa.print(pout, u); }
}
- pbc.apply(u);
-
uPrev = uTemp;
}
--- 282,287 ----
*************** SAOptions()
*** 391,397 ****
for (int d = 0; d < D; ++d)
{
nPatches[d] = 10;
! nCells[d] = 100;
nVerts[d] = nCells[d] + 1;
}
pulseHalfWidthCells = nCells[0]/8.0;
--- 312,318 ----
for (int d = 0; d < D; ++d)
{
nPatches[d] = 10;
! nCells[d] = 99;
nVerts[d] = nCells[d] + 1;
}
pulseHalfWidthCells = nCells[0]/8.0;
*************** void ensightGeometryOut(char *fn, Unifor
*** 797,803 ****
int id[3];
int d;
for (d = 0; d < Dim; d++) {
! id[d] = mesh.physicalDomain()[d].size();
}
for (d = Dim; d < 3; d++) {
id[d] = 1;
--- 718,724 ----
int id[3];
int d;
for (d = 0; d < Dim; d++) {
! id[d] = mesh.physicalVertexDomain()[d].size();
}
for (d = Dim; d < 3; d++) {
id[d] = 1;
*************** void ensightGeometryOut(char *fn, Unifor
*** 817,823 ****
// Mesh spacings:
float dxd[3];
for (d = 0; d < Dim; d++) {
! dxd[d] = mesh.meshSpacing()(d);
}
for (d = Dim; d < 3; d++) {
dxd[d] = 0.0;
--- 738,744 ----
// Mesh spacings:
float dxd[3];
for (d = 0; d < Dim; d++) {
! dxd[d] = mesh.spacings()(d);
}
for (d = Dim; d < 3; d++) {
dxd[d] = 0.0;
*************** void ensightGeometryOut(char *fn, Unifor
*** 827,867 ****
}
// Variable file:
! // Partial specializations for 1D, 2D, 3D Arrays:
! // 1D:
! template<class T, class EngineTag>
! void ensightVariableOut(char *fn, const Array<1, T, EngineTag> &a)
{
- char descript[80];
- FILE *fp;
- int ii;
! fp = fopen(fn, "w");
! sprintf(descript,"Scalar Variable u at %s",fn);
! fwrite(descript,sizeof(char),80,fp);
! strcpy(descript,"part");
! fwrite(descript,sizeof(char),80,fp);
! ii = 1;
! fwrite(&ii,sizeof(int),1,fp);
! strcpy(descript,"block uniform");
! fwrite(descript,sizeof(char),80,fp);
!
! float *var;
! int nnodes = a.domain().size();
! var = new float[nnodes];
! for (int i = a.domain()[0].first(); i <= a.domain()[0].last(); i++) {
! var[i] = a(i);
! }
!
! fwrite (var, sizeof(float), nnodes, fp);
! delete [] var;
! fclose(fp);
! }
- // 2D:
- template<class T, class EngineTag>
- void ensightVariableOut(char *fn, const Array<2, T, EngineTag> &a)
- {
char descript[80];
FILE *fp;
int ii;
--- 748,759 ----
}
// Variable file:
! void ensightVariableOut(char *fn, Field_t &f)
{
! typedef Field_t::Domain_t Domain_t;
! Domain_t domain(f.layout().domain());
char descript[80];
FILE *fp;
int ii;
*************** void ensightVariableOut(char *fn, const
*** 870,876 ****
int nelems = 1;
int d;
for (d = 0; d < 2; d++) {
! id[d] = a.domain()[d].size();
nelems*= id[d];
}
for (d = 2; d < 3; d++) {
--- 762,768 ----
int nelems = 1;
int d;
for (d = 0; d < 2; d++) {
! id[d] = domain[d].size();
nelems*= id[d];
}
for (d = 2; d < 3; d++) {
*************** void ensightVariableOut(char *fn, const
*** 889,939 ****
float *var;
var = new float[nelems];
- int count = 0;
- for (int j = a.domain()[1].first(); j <= a.domain()[1].last(); j++) {
- for (int i = a.domain()[0].first(); i <= a.domain()[0].last(); i++) {
- var[count++] = a(i,j);
- }
- }
-
- fwrite (var, sizeof(float), nelems, fp);
- delete [] var;
- fclose(fp);
- }
-
- // 3D:
- template<class T, class EngineTag>
- void ensightVariableOut(char *fn, const Array<3, T, EngineTag> &a)
- {
- char descript[80];
- FILE *fp;
- int ii;
-
- int id[3];
- int nelems = 1;
- for (int d = 0; d < 3; d++) {
- id[d] = a.domain()[d].size();
- nelems*= id[d];
- }
-
- fp = fopen(fn, "w");
- sprintf(descript,"Scalar Variable u at %s",fn);
- fwrite(descript,sizeof(char),80,fp);
- strcpy(descript,"part");
- fwrite(descript,sizeof(char),80,fp);
- ii = 1;
- fwrite(&ii,sizeof(int),1,fp);
- strcpy(descript,"block uniform");
- fwrite(descript,sizeof(char),80,fp);
-
- float *var;
- var = new float[nelems];
int count = 0;
! for (int k = a.domain()[2].first(); k <= a.domain()[2].last(); k++) {
! for (int j = a.domain()[1].first(); j <= a.domain()[1].last(); j++) {
! for (int i = a.domain()[0].first(); i <= a.domain()[0].last(); i++) {
! var[count++] = a(i,j,k);
! }
}
}
--- 781,792 ----
float *var;
var = new float[nelems];
int count = 0;
! // This should be rewritten in a domain-independent way.
! PInsist(Dim == 2, "Only code for dimension == 2 is currently available");
! for (int j = domain[1].first(); j <= domain[1].last(); j++) {
! for (int i = domain[0].first(); i <= domain[0].last(); i++) {
! var[count++] = f(i,j);
}
}
Index: src/Connect/Lux/LuxConnector.Field.h
===================================================================
RCS file: /home/pooma/Repository/r2/src/Connect/Lux/LuxConnector.Field.h,v
retrieving revision 1.2
diff -c -p -r1.2 LuxConnector.Field.h
*** src/Connect/Lux/LuxConnector.Field.h 2000/03/07 13:16:19 1.2
--- src/Connect/Lux/LuxConnector.Field.h 2001/10/10 02:48:28
***************
*** 81,90 ****
//
//-----------------------------------------------------------------------------
! template<class Geom, class T, class EngineTag>
! class Connector<Field<Geom, T, EngineTag>, Lux>
! : public Connector<typename ArrayView<Field<Geom,T,EngineTag>,
! typename Field<Geom,T,EngineTag>::Domain_t>::Type_t,
Lux>
{
public:
--- 81,90 ----
//
//-----------------------------------------------------------------------------
! template<class Mesh, class T, class EngineTag>
! class Connector<Field<Mesh, T, EngineTag>, Lux>
! : public Connector<Array<FieldEngine<Mesh, T, EngineTag>::dimensions,
! T, EngineTag>,
Lux>
{
public:
*************** public:
*** 92,100 ****
// Public typedefs and enums
//============================================================
! typedef Field<Geom, T, EngineTag> Field_t;
typedef typename Field_t::Domain_t Domain_t;
! typedef typename ArrayView<Field_t, Domain_t>::Type_t Array_t;
typedef Connector<Array_t, Lux> Base_t;
typedef Connection<Lux> Connection_t;
typedef Connector<Field_t, Lux> Connector_t;
--- 92,101 ----
// Public typedefs and enums
//============================================================
! typedef Field<Mesh, T, EngineTag> Field_t;
typedef typename Field_t::Domain_t Domain_t;
! typedef Array<FieldEngine<Mesh, T, EngineTag>::dimensions,
! T, EngineTag> Array_t;
typedef Connector<Array_t, Lux> Base_t;
typedef Connection<Lux> Connection_t;
typedef Connector<Field_t, Lux> Connector_t;
*************** private:
*** 154,160 ****
//============================================================
// Reset the mesh data in the base class to the data for the given
! // Field's geometry.
void setupMeshInfo(const Field_t &f)
{
--- 155,161 ----
//============================================================
// Reset the mesh data in the base class to the data for the given
! // Field's mesh.
void setupMeshInfo(const Field_t &f)
{
Index: src/Field/Mesh/PositionFunctions.h
===================================================================
RCS file: /home/pooma/Repository/r2/src/Field/Mesh/PositionFunctions.h,v
retrieving revision 1.1
diff -c -p -r1.1 PositionFunctions.h
*** src/Field/Mesh/PositionFunctions.h 2001/08/30 01:15:12 1.1
--- src/Field/Mesh/PositionFunctions.h 2001/10/10 02:48:29
*************** struct XField
*** 157,166 ****
template<int Dim, class TM>
struct XField<UniformRectilinearMesh<Dim, TM> >
{
! typedef UniformRectilinearMesh<Dim, TM> GeometryTag_t;
typedef Vector<Dim, TM> PointType_t;
typedef IndexFunction<PositionFunctorUR<Dim, TM> > PositionEngine_t;
! typedef Field<GeometryTag_t, PointType_t, PositionEngine_t> Type_t;
};
template<class F>
--- 157,166 ----
template<int Dim, class TM>
struct XField<UniformRectilinearMesh<Dim, TM> >
{
! typedef UniformRectilinearMesh<Dim, TM> Mesh_t;
typedef Vector<Dim, TM> PointType_t;
typedef IndexFunction<PositionFunctorUR<Dim, TM> > PositionEngine_t;
! typedef Field<Mesh_t, PointType_t, PositionEngine_t> Type_t;
};
template<class F>
*************** void setXField(F &f)
*** 170,179 ****
}
template<class F, class Init>
! typename XField<typename F::GeometryTag_t>::Type_t
xField(const F &f, const Init ¢ering)
{
! typename XField<typename F::GeometryTag_t>::Type_t ret(centering, f);
setXField(ret);
return ret;
}
--- 170,180 ----
}
template<class F, class Init>
! typename XField<typename F::Mesh_t>::Type_t
xField(const F &f, const Init ¢ering)
{
! typedef typename XField<typename F::Mesh_t>::Type_t Field_t;
! Field_t ret(centering, f.layout(), f.mesh());
setXField(ret);
return ret;
}
Index: src/Field/tests/CrossBox.cpp
===================================================================
RCS file: /home/pooma/Repository/r2/src/Field/tests/CrossBox.cpp,v
retrieving revision 1.1
diff -c -p -r1.1 CrossBox.cpp
*** src/Field/tests/CrossBox.cpp 2001/08/30 01:15:18 1.1
--- src/Field/tests/CrossBox.cpp 2001/10/10 02:48:30
*************** int main(int argc, char *argv[])
*** 82,93 ****
Centering<2> allFace = canonicalCentering<2>(FaceType, Continuous);
! typedef UniformRectilinear<2> Geometry_t;
typedef MultiPatch<UniformTag, Remote<Brick> > EngineTag_t;
! typedef Field<Geometry_t, double, EngineTag_t > Field_t;
! typedef Field<Geometry_t, Vector<2>, EngineTag_t > VField_t;
Vector<2> origin(0.0, 0.0);
Vector<2> spacings(1.0, 1.0);
--- 82,93 ----
Centering<2> allFace = canonicalCentering<2>(FaceType, Continuous);
! typedef UniformRectilinearMesh<2> Mesh_t;
typedef MultiPatch<UniformTag, Remote<Brick> > EngineTag_t;
! typedef Field<Mesh_t, double, EngineTag_t > Field_t;
! typedef Field<Mesh_t, Vector<2>, EngineTag_t > VField_t;
Vector<2> origin(0.0, 0.0);
Vector<2> spacings(1.0, 1.0);
*************** int main(int argc, char *argv[])
*** 99,105 ****
// Should really figure out how to repackage these three lines:
DomainLayout<2> layoutDom(physicalVertexDomain, GuardLayers<2>(1));
! XField<Geometry_t>::Type_t x(allFace, layoutDom, origin, spacings);
setXField(x);
b = 0.0;
--- 99,105 ----
// Should really figure out how to repackage these three lines:
DomainLayout<2> layoutDom(physicalVertexDomain, GuardLayers<2>(1));
! XField<Mesh_t>::Type_t x(allFace, layoutDom, origin, spacings);
setXField(x);
b = 0.0;
Index: src/Field/tests/Positions.cpp
===================================================================
RCS file: /home/pooma/Repository/r2/src/Field/tests/Positions.cpp,v
retrieving revision 1.1
diff -c -p -r1.1 Positions.cpp
*** src/Field/tests/Positions.cpp 2001/08/30 01:15:18 1.1
--- src/Field/tests/Positions.cpp 2001/10/10 02:48:30
*************** int main(int argc, char *argv[])
*** 69,78 ****
Centering<2> vert = canonicalCentering<2>(VertexType, Continuous);
Centering<2> allFace = canonicalCentering<2>(FaceType, Continuous);
! typedef UniformRectilinear<2> Geometry_t;
! typedef Field<Geometry_t, double, Brick> Field_t;
! typedef XField<Geometry_t>::Type_t XField_t;
Field_t f(cell, layout1, origin, spacings);
XField_t x(cell, layout1, origin, spacings);
--- 69,78 ----
Centering<2> vert = canonicalCentering<2>(VertexType, Continuous);
Centering<2> allFace = canonicalCentering<2>(FaceType, Continuous);
! typedef UniformRectilinearMesh<2> Mesh_t;
! typedef Field<Mesh_t, double, Brick> Field_t;
! typedef XField<Mesh_t>::Type_t XField_t;
Field_t f(cell, layout1, origin, spacings);
XField_t x(cell, layout1, origin, spacings);
Index: src/Pooma/Fields.h
===================================================================
RCS file: /home/pooma/Repository/r2/src/Pooma/Fields.h,v
retrieving revision 1.13
diff -c -p -r1.13 Fields.h
*** src/Pooma/Fields.h 2001/10/06 00:39:19 1.13
--- src/Pooma/Fields.h 2001/10/10 02:48:31
***************
*** 54,59 ****
--- 54,60 ----
#include "Field/Mesh/NoMesh.h"
#include "Field/Mesh/UniformRectilinearMesh.h"
#include "Field/Mesh/MeshFunctions.h"
+ #include "Field/Mesh/PositionFunctions.h"
// Relations:
Index: src/Pooma/tests/pooma.cpp
===================================================================
RCS file: /home/pooma/Repository/r2/src/Pooma/tests/pooma.cpp,v
retrieving revision 1.4
diff -c -p -r1.4 pooma.cpp
*** src/Pooma/tests/pooma.cpp 2001/05/24 17:17:36 1.4
--- src/Pooma/tests/pooma.cpp 2001/10/10 02:48:31
***************
*** 46,51 ****
--- 46,54 ----
// Pooma general interface test program.
//-----------------------------------------------------------------------------
+ #include <signal.h>
+ #include <stdlib.h>
+
#include "Pooma/Pooma.h"
void newAbortHandler()
*************** void newAbortHandler()
*** 53,58 ****
--- 56,70 ----
std::cerr << "Running newly installed abort handler." << std::endl;
}
+ // This function is registered as the signal handler for SIGABRT.
+
+ void abortSignalHandler(int)
+ {
+ // Exit with a `0' exit status to indicate that all went well.
+ // This test is *expected* to abort.
+ exit(0);
+ }
+
int main(int argc, char *argv[])
{
*************** int main(int argc, char *argv[])
*** 107,116 ****
Pooma::pinfo << "Shutting down POOMA with abort()..." << std::endl;
Pooma::abortHandler(newAbortHandler);
Pooma::pAbort("This is the abort message.", 2);
! return 0;
}
--- 119,134 ----
Pooma::pinfo << "Shutting down POOMA with abort()..." << std::endl;
+ // Register a signal handler so that when Pooma::pAbort calls the
+ // abort standard library function, this program does not exit with
+ // a nonzero exit code.
+ signal(SIGABRT, abortSignalHandler);
+
Pooma::abortHandler(newAbortHandler);
Pooma::pAbort("This is the abort message.", 2);
! // If we get here, the call to Pooma::pAbort did not work.
! return 1;
}
More information about the pooma-dev
mailing list