fem_advanced

Download Report

Transcript fem_advanced

Ghost Elements
Ghost Elements: Overview
Most FEM programs communicates via shared
nodes, using FEM_Update_field
 Some computations require read-only copies
of remote elements—“ghosts”

Stencil-type finite volume computations
 The push form of matrix-vector product
 Many kinds of mesh modification


Ghosts are a recent addition to the FEM
framework
Ghosts: 2D Example
Serial Mesh
1
2
3
4
Right Chunk
Left Chunk
1
2
Ghost
of
3
Ghost
of
2
3
4
Building Ghosts:
Add ghost elements layer-by-layer from init
 A chunk will include ghosts of all the elements
it is connected to by “tuples”—sets of nodes
 For 2D, a tuple might be a 2-node edge
 For 3D, a tuple might be a 4-node face
 You specify a ghost layer with
FEM_Add_ghost_layer(tupleSize,ghostNodes)
 ghostNodes indicates whether to add ghost
nodes as well as ghost elements.

Building Ghosts:
FEM_Add_ghost_elem(e,t,elem2tuple)
 e is the element type
 t is the number of tuples per element
 elem2tuple maps an element to its tuples:

A tupleSize by t array of integers
 Contains element-local node numbers


Repeat this call for each ghost element type
Ghosts: Node adjacency
/* Node-adjacency: triangles have 3 nodes */
FEM_Add_ghost_layer(1,0); /* 1 node per tuple */
const static int tri2node[]={0,1,2};
FEM_Add_ghost_elem(0,3,tri2node);
1
0
2
Ghosts: Edge adjacency
/* Edge-adjacency: triangles have 3 edges */
FEM_Add_ghost_layer(2,0); /* 2 nodes per tuple */
const static int tri2edge[]={0,1,
1,2,
FEM_Add_ghost_elem(0,3,tri2edge);
1
0
2,0};
2
Extracting and Using Ghosts
Ghosts are always given larger numbers than
non-ghosts—that is, ghosts are at the end
 FEM_Get_node_ghost() and
FEM_Get_elem_ghost(e)


0

Return the index of the first ghost node or element
g
e
FEM_Update_ghost_field(fid,e,data)

Obtain other processor’s data (formatted like fid)
for each ghost element of type e
Ghost Elements: Sub-Mesh
Ghost Elements
Ghosts and Symmetries
Ghosts and Symmetries

In addition to cross-processor ghosts, can
build ghosts to model problem symmetries
Translational and rotational periodicities
 Mirror symmetry


FEM_Add_linear_periodicity(nFaces,nPer,
facesA,facesB, nNodes,nodeLocs)

Identify these two lists of faces under linear
periodicity, and build ghosts to match
Symmetry Ghosts: 2D Example
Serial Mesh
1
2
3
4
Horizontal Periodicity
Left Chunk
Sym.
Ghost
4
1
2
Right Chunk
Ghost
of
3
Ghost
of
2
3
4
Sym.
Ghost
1
Symmetry Ghost Elements
Symmetry-Ghost Elements
Ghosts and Symmetries: Update
NetFEM Client
NetFEM Client: Pretty pictures of
wave dispersion around a crack
NetFEM: Zoom in
NetFEM: Outline Elements
NetFEM: Point Nodes
NetFEM Server
NetFEM Server Side: Overview

To allow the NetFEM client to connect, you add
NetFEM registration calls to your server
Register nodes and element types
 Register data items: scalars or spatial vectors
associated with each node or element
 You provide the display name and units for each
data item

Link your program with “-module netfem”
 Run with “++server”, and connect!

NetFEM Server Side: Setup

n=NetFEM_Begin(FEM_My_partition(),timestep,
dim,NetFEM_POINTAT)
Call this each time through your timeloop; or skip
 timestep identifies this data update
 dim is the spatial dimension—must be 2 or 3
 Returns a NetFEM handle n used by everything else


NetFEM_End(n)

Finishes update n
NetFEM Server Side: Nodes

NetFEM_Nodes(n,nnodes,coord,”Position (m)”)
Registers node locations with NetFEM—future
vectors and scalars will be associated with nodes
 n is the handle returned by NetFEM_Begin
 nnodes is the number of nodes
 coord is a dim by nnodes array of doubles
 The string describes the coordinate system and
meaning of nodes


Currently, there can only be one call to nodes
NetFEM: Node Displacement
NetFEM Server Side: Elements

NetFEM_Elements(n,nelem,nodeper, conn,”Triangles”)







Registers elements with NetFEM—future vectors and
scalars will be associated with these elements
n is the handle returned by NetFEM_Begin
nelem is the number of elements
nodeper is the number of nodes per element
conn is a nodeper by nelem array of node indices
The string describes the kind of element
Repeat to register several kinds of element

Perhaps: Triangles, squares, pentagons, …
NetFEM: Element Stress
NetFEM Server Side: Vectors

NetFEM_Vector(n,val,”Displacement (m)”)

Registers a spatial vector with each node or element



n is the handle returned by NetFEM_Begin
val is a dim by nitems array of doubles



Whichever kind was registered last
There’s also a more general NetFEM_Vector_field in the manual
The string describes the meaning and units of the vectors
Repeat to register multiple sets of vectors

Perhaps: Displacement, velocity, acceleration, rotation, …
NetFEM: Element Velocity
NetFEM Server Side: Scalars

NetFEM_Scalar(n,val,s,”Displacement (m)”)

Registers s scalars with each node or element



n is the handle returned by NetFEM_Begin
val is an s by nitems array of doubles


Whichever kind was registered last
There’s also a more general NetFEM_Scalar_field in the manual

s is the number of doubles for each node or element

The string describes the meaning and units of the scalars
Repeat to register multiple sets of scalars

Perhaps: Stress, plasticity, node type, damage, …
NetFEM Server Side: 2D Example
integer :: t,n, numnp, numel
real*8, dimension(2,numnp) :: coor,d,v,a
integer, dimension(3,numel) :: conn
n=NetFEM_Begin(FEM_My_partition(),t,2,NetFEM_POINTAT)
CALL NetFEM_Nodes(n,numnp,coor,'Position (m)')
CALL NetFEM_Vector(n,d,'Displacement (m)')
CALL NetFEM_Vector(n,v,'Velocity (m/s)')
CALL NetFEM_Vector(n,a,'Acceleration (m/s^2)')
CALL NetFEM_Elements(n,numel,3,conn,'Triangles')
CALL NetFEM_Scalar(n,stress,1,'Stress (pure)')
CALL NetFEM_End(n)
NetFEM: Conclusion
Easy, general way to get output from an FEM
computation
 Client configures itself based on server
 Client can be run anywhere (from home!)
 Server performance impact minimal (1s!)
 Future work:

Support multiple chunks per processor
 Non-network, file-based version
 Movie mode

Multiple Modules
Multiple Modules

Use of 2 or more CHARM++ frameworks in the
same program





FEM—multiple unstructured mesh chunks
MBLOCK—multiple structured mesh blocks
AMPI—Adaptive MPI-on-Charm++
All based on the Threaded CHARM++ framework
(TCHARM)
For example, we may want to use AMPI in our
FEM program for exchanging information
between FEM chunks
Details

Can compose FEM programs with other modules by
just calling that module’s attach routine from init()

For example:
void init(void)
{
//Start AMPI, to allow drivers to use MPI calls:
MPI_Attach(“myAMPIFEM”);
// .. Use FEM_Set() calls as usual ..
}
Example
#include ‘fem.h’
#include ‘mpi.h’
void driver(void) {
//..use FEM_Get calls as usual..
//Broadcast “data” from chunk 0:
MPI_Bcast(&data,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
//...timeloop: Use FEM_Update_field calls as usual...
if (dataToSend)
MPI_Send(&data,4,MPI_INT,dest,tag,MPI_COMM_WORLD);
else
MPI_Recv(&data,4,MPI_INT,src,tag,MPI_COMM_WORLD,&status);
}
Multiple Modules: Conclusion

Easy to use other modules from FEM framework


Just call MPI_Attach from init, and link with “-module ampi”
We could also have specified how to combine
frameworks by writing a special startup routine named
TCHARM_User_setup()

Not FEM-centric: overrides the normal call to init()

Allows you to call main computation routine something other than
driver()
See TCHARM manual for details
