This manual presents the Iterative Finite Element Matrix (IFEM) library, a library for easily solving matrix problems derived from finite-element formulations. The library is designed to be matrix-free, in that the only matrix operation required is matrix-vector product, and hence the entire matrix need never be assembled
IFEM is built on the mesh and communication capabilities of the Charm++ FEM Framework, so for details on the basic runtime, problem setup, and partitioning see the FEM Framework manual.
A FEM program manipulates elements and nodes. An element is a portion of the problem domain, also known as a cell, and is typically some simple shape like a triangle, square, or hexagon in 2D; or tetrahedron or rectangular solid in 3D. A node is a point in the domain, and is often the vertex of several elements. Together, the elements and nodes form a mesh, which is the central data structure in the FEM framework. See the FEM manual for details.
Solvers often take extra parameters, which are listed in a type called in C ILSI_Param, which in Fortran is an array of ILSI_PARAM doubles. You initialize these solver parameters using the subroutine ILSI_Param_new, which takes the parameters as its only argument. The input and output parameters in an ILSI_Param are listed in Table 1 and Table 2.
|
The only solver currently written using IFEM is the conjugate gradient solver. This linear solver requires the matrix to be real, symmetric and positive definite.
Each iteration of the conjugate gradient solver requires one matrix-vector product and two global dot products. For well-conditioned problems, the solver typically converges in some small multiple of the diameter of the mesh-the number of elements along the largest side of the mesh.
You access the conjugate gradient solver via the subroutine name ILSI_CG_Solver.
Many problems encountered in FEM analysis place the entries of the known and unknown vectors at the nodes-the vertices of the domain. Elements provide linear relationships between the known and unknown node values, and the entire matrix expresses the combination of all these element relations.
For example, in a structural statics problem, we know the net force at each node, , and seek the displacements of each node, . Elements provide the relationship, often called a stiffness matrix , between a nodes' displacments and its net forces:
We normally label the known vector (in the example, the forces), the unknown vector (in the example, the displacments), and the matrix :
IFEM provides two routines for solving problems of this type. The first routine, IFEM_Solve_shared, solves for the entire vector based on the known values of the vector. The second, IFEM_Solve_shared_bc, allows certain entries in the vector to be given specific values before the problem is solved, creating values for the vector.
void IFEM_Solve_shared(ILSI_Solver s,ILSI_Param *p,
int fem_mesh, int fem_entity,int length,int width,
IFEM_Matrix_product_c A, void *ptr, const double *b, double *x);
subroutine IFEM_Solve_shared(s,p,
fem_mesh,fem_entity,length,width,
A,ptr,b,x)
external solver subroutine :: s
double precision, intent(inout) :: p(ILSI_PARAM)
integer, intent(in) :: fem_mesh, fem_entity, length,width
external matrix-vector product subroutine :: A
TYPE(varies), pointer :: ptr
double precision, intent(in) :: b(width,length)
double precision, intent(inout) :: x(width,length)
This routine solves the linear system for the unknown vector . s and p give the particular linear solver to use, and are described in more detail in Section 2. fem_mesh and fem_entity give the FEM framework mesh (often FEM_Mesh_default_read()) and entity (often FEM_NODE) with which the known and unknown vectors are listed.
width gives the number of degrees of freedom (entries in the vector) per node. For example, if there is one degree of freedom per node, width is one. length should always equal the number of FEM nodes.
A is a local matrix-vector product routine you must write. Its interface is described in Section 3.1.1. ptr is a pointer passed down to A-it is not otherwise used by the framework.
b is the known vector. x, on input, is the initial guess for the unknown vector. On output, x is the final value for the unknown vector. b and x should both have length * width entries. In C, DOF of node should be indexed as width. In Fortran, these arrays should be allocated like x(width,length).
When this routine returns, x is the final value for the unknown vector, and the output values of the solver parameters p will have been written.
IFEM requires you to write a matrix-vector product routine that will evaluate for various vectors . You may use any subroutine name, but it must take these arguments:
void IFEM_Matrix_product(void *ptr,int length,int width,
const double *src, double *dest);
subroutine IFEM_Matrix_product(ptr,length,width,src,dest)
TYPE(varies), pointer :: ptr
integer, intent(in) :: length,width
double precision, intent(in) :: src(width,length)
double precision, intent(out) :: dest(width,length)
The framework calls this user-written routine when it requires a matrix-vector product. This routine should compute , interpreting and as vectors. length gives the number of nodes and width gives the number of degrees of freedom per node, as above.
In writing this routine, you are responsible for choosing a representation for the matrix . For many problems, there is no need to represent explicitly-instead, you simply evaluate by looping over local elements, taking into account the values of . This example shows how to write the matrix-vector product routine for simple 1D linear elastic springs, while solving for displacement given net forces.
After calling this routine, the framework will handle combining the overlapping portions of these vectors across processors to arrive at a consistent global matrix-vector product.
void IFEM_Solve_shared_bc(ILSI_Solver s,ILSI_Param *p,
int fem_mesh, int fem_entity,int length,int width,
int bcCount, const int *bcDOF, const double *bcValue,
IFEM_Matrix_product_c A, void *ptr, const double *b, double *x);
subroutine IFEM_Solve_shared_bc(s,p,
fem_mesh,fem_entity,length,width,
bcCount,bcDOF,bcValue,
A,ptr,b,x)
external solver subroutine :: s
double precision, intent(inout) :: p(ILSI_PARAM)
integer, intent(in) :: fem_mesh, fem_entity, length,width
integer, intent(in) :: bcCount
integer, intent(in) :: bcDOF(bcCount)
double precision, intent(in) :: bcValue(bcCount)
external matrix-vector product subroutine :: A
TYPE(varies), pointer :: ptr
double precision, intent(in) :: b(width,length)
double precision, intent(inout) :: x(width,length)
Like IFEM_Solve_shared, this routine solves the linear system for the unknown vector . This routine, however, adds support for boundary conditions associated with . These so-called "essential" boundary conditions restrict the values of some unknowns. For example, in structural dynamics, a fixed displacment is such an essential boundary condition.
The only form of boundary condition currently supported is to impose a fixed value on certain unknowns, listed by their degree of freedom-that is, their entry in the unknown vector. In general, the 'th DOF of node has DOF number in C and in Fortran. The framework guarantees that, on output, for all boundary conditions, .
For example, if is 3 in a 3d problem, we would set node 's y coordinate to 4.6 and node 's z coordinate to 7.3 like this:
Mathematically, what is happening is we are splitting the partially unknown vector into a completely unknown portion and a known part :
We can then define a new right hand side vector and solve the new linear system normally. Rather than renumbering, we do this by zeroing out the known portion of to make . The creation of the new linear system, and the substitution back to solve the original system are all done inside this subroutine.
One important missing feature is the ability to specify general linear constraints on the unknowns, rather than imposing specific values.
This document was generated using the LaTeX2HTML translator Version 2002-2-1 (1.71)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -white -antialias -local_icons -long_titles 1 -show_section_numbers -top_navigation -address '
November 23, 2009
FEM Homepage
Charm Homepage' -split 0 manual.tex
The translation was initiated by root on 2009-11-23
November 23, 2009
FEM Homepage
Charm Homepage