File globalfield.hxx#

class GlobalField#
#include <globalfield.hxx>

This provides a method for gathering and scattering a field which takes into account the local and global indices

This is a base class which is inherited by GlobalField2D and GlobalField3D

Subclassed by GlobalField2D, GlobalField3D

Public Functions

GlobalField() = delete#
virtual ~GlobalField() = default#
virtual bool valid() const = 0#

Is the data valid on any processor?

inline bool dataIsLocal() const#

Data is on this processor.

inline BoutReal &operator()(int jx, int jy, int jz)#

Data access by index. This doesn’t perform any checks, so the user should first test if the data is available on this processor by calling dataIsLocal()

inline const BoutReal &operator()(int jx, int jy, int jz) const#

Const data access by index.

inline int xSize() const#

Size of the field in X.

inline int ySize() const#

Size of the field in Y.

inline int zSize() const#

Size of the field in Z.

inline Array<BoutReal> &getData()#

Protected Functions

GlobalField(Mesh *m, int proc, int xsize, int ysize, int zsize)#
void proc_local_origin(int proc, int *x, int *y, int *z = nullptr) const#
void proc_origin(int proc, int *x, int *y, int *z = nullptr) const#

Return the global origin of processor proc.

void proc_size(int proc, int *lx, int *ly, int *lz = nullptr) const#

Return the array size of processor proc.

Protected Attributes

Mesh *mesh#

The mesh we’re gathering/scattering over.

int data_on_proc#

Which processor is this data on?

int nx#
int ny#
int nz#

Global field sizes.

Array<BoutReal> data#

The global data, if on this processor.

MPI_Comm comm#

Communicator for all mesh.

int npes#
int mype#

Number of MPI processes, this processor index.

class GlobalField2D : public GlobalField#
#include <globalfield.hxx>

Gather and scatter a Field2D

Example

To create a GlobalField2D, pass a mesh pointer

GlobalField2D g2d(mesh);

By default data is gathered and scattered to/from processor 0. To change this, pass the processor number as a second argument:

GlobalField3D g2d(mesh, 1); // Gather onto processor 1

Gather and scatter methods operate on Field2D objects:

Field2D localdata;

g2d.gather(localdata); // Gather onto one processsor

To scatter data back, use the scatter method:

localdata = g2d.scatter();

Note that both gather and scatter are collective operations, which must be performed by all processors.

To test if the data is available on a processor, use:

if(g2d.dataIsLocal()) {
  // g2d data on this processor
}

The data in a GlobalField2D can be accessed using (x,y,z) indexing, with the index ranges given by xSize, ySize, zSize methods.

for ( int x=0; x<g2d.xSize(); x++)
  for ( int y=0; y<g2d.ySize(); y++)
    output.write(" Value at ({:d} ,{:d}) is {:e}\n" ,
                   x, y,
                   g2d(x, y));

Public Functions

GlobalField2D() = delete#

Can’t be constructed without args.

GlobalField2D(Mesh *mesh, int proc = 0)#

Construct, giving a mesh and an optional processor

Parameters:
  • mesh[in] The mesh to gather over

  • proc[in] The processor index where everything will be gathered/scattered to/from

~GlobalField2D() override#

Destructor.

inline virtual bool valid() const override#

Is the data valid and on this processor?

void gather(const Field2D &f)#

Gather all data onto one processor.

const Field2D scatter() const#

Scatter data back from one to many processors.

inline GlobalField2D &operator=(const Field2D &rhs)#

Assignment from a 2D field. Shorthand for a gather, and must be called on all processors The scatter assignment operator needs to be a member of Field2D.

inline BoutReal &operator()(int jx, int jy)#

Data access by global index.

inline const BoutReal &operator()(int jx, int jy) const#

Private Functions

int msg_len(int proc) const#

The length of message (in BoutReals) to be sent to or from processor proc

Parameters:

proc[in] MPI processor index

Private Members

BoutReal **buffer#

Buffer for sending and receiving. First index is the processor index, and second is the data

bool data_valid#

Is the data valid and on this processor?

class GlobalField3D : public GlobalField#
#include <globalfield.hxx>

Gather and scatter a Field3D to/from one processor

Example

To create a GlobalField3D, pass a mesh pointer

GlobalField3D g3d(mesh);

By default data is gathered and scattered to/from processor 0. To change this, pass the processor number as a second argument:

GlobalField3D g3d(mesh, 1); // Gather onto processor 1

Gather and scatter methods operate on Field3D objects:

Field3D localdata;

g3d.gather(localdata); // Gather onto one processsor

To scatter data back, use the scatter method:

localdata = g3d.scatter();

Note that both gather and scatter are collective operations, which must be performed by all processors.

To test if the data is available on a processor, use:

if(g3d.dataIsLocal()) {
  // g3d data on this processor
}

The data in a GlobalField3D can be accessed using (x,y,z) indexing, with the index ranges given by xSize, ySize, zSize methods.

for ( int x=0; x<g3d.xSize(); x++)
  for ( int y=0; y<g3d.ySize(); y++)
    for ( int z=0; z<g3d.zSize(); z++)
      output.write(" Value at ({:d} ,{:d} ,{:d}) is {:e}\n" ,
                   x, y, z,
                   g3d(x, y, z));

Public Functions

GlobalField3D() = delete#

Can’t be constructed without args.

GlobalField3D(Mesh *mesh, int proc = 0)#

Construct, giving a mesh and an optional processor

Parameters:
  • mesh[in] The mesh to gather over

  • proc[in] The processor index where everything will be gathered/scattered to/from

~GlobalField3D() override#

Destructor.

inline virtual bool valid() const override#

Test if the data is valid i.e. has been allocated.

void gather(const Field3D &f)#

Gather all data onto one processor.

const Field3D scatter() const#

Scatter data back from one to many processors.

inline GlobalField3D &operator=(const Field3D &rhs)#

Assignment from a 2D field. Shorthand for a gather, and must be called on all processors The scatter assignment operator needs to be a member of Field2D.

Private Functions

int msg_len(int proc) const#

The length of message (in BoutReals) to be sent to or from processor proc

Parameters:

proc[in] MPI processor index

Private Members

BoutReal **buffer#

Buffer for sending and receiving. First index is the processor index, and second is the data

bool data_valid#

Is the data valid and on this processor?