hp adaptive implementation using template based elements

14
hp ADAPTIVE IMPLEMENTATION USING TEMPLATE BASED ELEMENTS Philippe R. B. Devloo Edimar C. Rylo Cedric M. A. A. Bravo [email protected] [email protected] [email protected] Faculdade de Engenharia Civil, UNICAMP Av. Albert Einstein, 951, CP 6021, CEP 13083-852, Campinas - SP - Brazil Resumo. hp refinement applied to the finite element method should lead to faster convergence than h or p refinement [10] and [11]. On the other hand, h and p refinements are easier and faster to implement. The complexity of an hp refinement is increased when the process is implemented for any type of mesh [3] In the PZ environment [4], the hp adaptive method was designed to work with heterogenous mesh including 1D, 2D and 3D elements. For industrial purposes, the adaptive method has a performance problem, because the re- finement process, the error estimation and the choice of the refinement pattern (i.e. given a certain number of degree of freedom choose how to increase h, p or hp) have a high computa- tional cost. In this work, an implementation of the mesh refinement using elements based on templates will be discussed. Template based implementation presents faster codes than derivate classes / virtual calls. The performance problem has several points to focus on, the main point being the solution of the linear system of equations. Nevertheless, in order to attain an acceptable 3D code, several points must be optimized, including the data structure assembly and the adaptive process which is discussed in this contribution. Keywords: First keyword, Second keyword, Third keywordAdaptive, Finite Element Method, Object Orientation Programm, Templates

Upload: independent

Post on 19-Nov-2023

0 views

Category:

Documents


0 download

TRANSCRIPT

hp ADAPTIVE IMPLEMENTATION USING TEMPLATE BASED ELEMENTS

Philippe R. B. DevlooEdimar C. RyloCedric M. A. A. [email protected]@[email protected] de Engenharia Civil, UNICAMPAv. Albert Einstein, 951, CP 6021, CEP 13083-852, Campinas - SP - Brazil

Resumo. hp refinement applied to the finite element method should lead to faster convergencethan h or p refinement [10] and [11]. On the other hand, h and p refinements are easierand faster to implement. The complexity of an hp refinement is increased when the process isimplemented for any type of mesh [3] In the PZ environment [4], the hp adaptive method wasdesigned to work with heterogenous mesh including 1D, 2D and 3D elements.

For industrial purposes, the adaptive method has a performance problem, because the re-finement process, the error estimation and the choice of the refinement pattern (i.e. given acertain number of degree of freedom choose how to increase h, p or hp) have a high computa-tional cost.

In this work, an implementation of the mesh refinement using elements based on templateswill be discussed. Template based implementation presents faster codes than derivate classes/ virtual calls. The performance problem has several points to focus on, the main point beingthe solution of the linear system of equations. Nevertheless, in order to attain an acceptable 3Dcode, several points must be optimized, including the data structure assembly and the adaptiveprocess which is discussed in this contribution.

Keywords: First keyword, Second keyword, Third keywordAdaptive, Finite Element Method,Object Orientation Programm, Templates

1. INTRODUCTION

Finite element method (FEM) is a powerfull tool to simulate physical phenomena but thecoding of a programs are considered complex, especially when compared to their rival numeri-cal approximation technique, the finite difference method. Essential elements of complexity ofthe finite element method are:

• Meshes are generally unstructured, leading to the necessity of node renumbering schemesand complex sparcity structures of the tangent matrices;

• A separate data structure is required for specifying the boundary conditions;

• Different element topologies are combined into a single code;

• Increasingly complex constitutive equations;

• Numerical methods to evaluate the stiffness matrix and the inverse must be optimized inthe way to provide results for large matrixes resulting for high porder or 3D analysis.

Other recent FEM technique was developed to be incorporated in order to be on the cutting edgeof finite element technology :

• h, p and/or hp-adaptive finite elements, in order to obtain an effective reduction of theapproximation error;

• multigrid is known to be the most efficient technique to invert the system of equations;

• parallel computing is the most cost effective way to solve large scale problems (obtainedform higher porder analysis and for 3D analysis).

The effort to combine all these features into a single finite element code and maintain thesecode requires a great team of engineers, programmers and researchers.

The know-how required to program a FEM code is another problem since that the FEMcourses dedicate roughly 90% of the time on teaching applied mathematics and linear algebraand about 10% on programming techniques. On the other hand, students will spend about 10%of their time developing a new idea in FEM and 90% behind the computer screen writing anddebugging their computer code.

To change this approach, the author of this contribution, after to be evolved with earlydevelopment of adaptive finite element technique as [2], [5] and [8], both in two and threedimensions and after some years teaching the FEM classes at graduate course at the FEC /Unicamp has developed the PZ environment. The original idea of the PZ project was to writea general purpose finite element program under which most adaptive finite element simulationscould be written [9]. This code could be used by the students during the course of FEM to seean implementation way and to implement their problems in a existing framework.

The program/environment includes hp-adaptive finite elements which can be applied to avariety of simulations, where zero-, one-, two- and tri-dimensional elements of any p order ofinterpolation can be mixed and matched [1]. Different sparse matrix storage formats can beused to store the tangent matrix, and a wide variety of direct or iterative solvers can be usedto invert the system of equations. Multigrid acceleration techniques can be applied to nestedsequences of meshes. A multi-threaded (multi-)frontal solver allows to solve very large sets ofequations with decomposition algorithms[7]. The PZ Project details are shown at labmec.fec.unicamp.br.

This contribution focus on a new approach to implement the geometric elements abstrac-tion. The implementation is based on templates technologies and the result is an code with thesame functionalities of the derivation class implementation. In order to justify these approachwe can note:

• Template technologies should produce faster codes than derivate classes considering theyavoid calls to the code virtual table;

• The maintainability of the code is better, since that the algorithm is implemented at thetemplate class level. So, there is one point in the code that will implement the desiredfunctionalities;

• The abstraction proposed is a intuitive way to define an element where an element is acombination of an spatial geometry definition joined with a topological definition.

The text is not intended to describe the classes and methods in detail. Rather, the authors hopethe text will help to comprehend the proposed structure.

2. IMPACT OF OBJECT ORIENTED PROGRAMMING

Object oriented software development has been fundamental in the organization of theproject. The strong separation of the boundaries of the classes permitted to coordinate theefforts of several researchers on a single project. Most of the maintenance of the program is tosimplify its structure.

The environment was started as a non-adaptive code which allowed the integration of dif-ferent simulations. Then, p-enrichment was added. h-refinement was written initially usingthe concepts developed in earlier work on h-adaptivity. The refinement procedure needed to betotally rewritten in order to implement tri-dimensional hp refinements. At each extension thecore classes needed to be adapted. The adaptions, however, were mainly in the line of turningthe interface of the classes increasingly consistent.

The implementation here proposed was added to the environment but the older implemen-tation should be still in use since that the public interfaces are the same. To validate the newimplementation it was fundamental since that the results produced by a simulation using onetype of element, with the new implementation, should be compared with the result produced bythe same element with the older implementation approach.

3. GEOMETRIC APPROXIMATION

The PZ environment mesh abstraction consists in two separate mesh definitions: the defini-tion of the geometry and the definition of the interpolation space. The geometric mesh providesthe information of the topology of the mesh and contains the tree of the refinement structure.The interpolation space corresponds to a partition of the computational domain. Restraints onadaptivity shape function coefficients are computed during element creation and destruction.Within this framework h and hp-adaptivity is virtually built in :

• h refinement consists in the destruction of a computational element followed by the con-struction of a set of refined elements;

• h Coarsening consists in the destruction of a group of elements, followed by the construc-tion of a larger element;

• p refinement is implemented in the computational mesh as an increase in the number ofshape functions associated with each connects of the element.

a x0

ax1

ax2

Figure 1: Axes associated with a line element

ax0

ax1

ax2

Figure 2: Axes associated with a surface element

By the element division (h refinement) the new elements created must have their shape functionsrestrained to maintain a conforming space. The method which computes the ”son” elementsrestraints is implemented in a method of the base class TPZGeoEl, independent of the dimensionof the side associated with the restraint.

In a first implementation, the derived element classes implement the methods which arenecessary to compute the values of the shape functions along the sides.

The domain of the differential equation is approximated by a set of geometric nodes andelements. The geometric element is obtained as the injective map between a master elementand the tri-dimensional Euclidean space. A one-dimensional element is a curve in space, atwo-dimensional element is a hyperplane in space. A point element is a point in space.

The Jacobian of the mapping between the master element and deformed element corre-sponds to the partial derivatives of the (ax0, ax1, ax2) coordinates with respect to the parameterspace [4]. (ax0, ax1, ax2) correspond to a local orthogonal system associated with the deformedelement and can be different at each integration point (see Figures 1 and 2).

The directions of (ax0, ax1, ax2) are provided by the call of the Jacobian method.1. Thecomplete set of geometric elements are implemented : point element, line element, quadri-lateral, triangular, tetrahedra, prism, pyramid and hexahedre (the Figure 3 provides the oldimplementation class tree). The mapping from the master element to the deformed element isperformed by Lagrangian interpolation functions.

4. TEMPLATE IMPLEMENTATION OF GEOMETRIC ELEMENTS

4.1 Geometric elements

An attribute of the geometric elements is to keep track of the topology of the mesh. Undertopology, it is understood the element node/connectivities and element/neighbor information.The element/node connectivity corresponds to the traditional finite element datastructure. Theneighboring information extends the traditional notion of neighbors and is described as follows[6]:

Each geometric element is a closed set of points and is formed by the union of its sides.

1For a point element, the three axes are arbitrary, for a one dimensional element, the second axes needs to bespecified externally.

Figure 3: Implemented element topologies

Each side is an open set of points. As such :

• a linear element has three side : two sides of dimension zero and one side correspondingto the interior of the element

• a triangular element has seven sides : three sides of dimension zero (the corner nodes),three sides of dimension one (the border of the element) and one side of dimension two(the interior nodes of the triangle)

• a quadrilateral element has nine sides

• a hexahedre element has twenty seven sides

• etc

Each side of an element can be formed by a bijective map of a master element of the corre-sponding topology. Two elements are neighbors along a side if the sides correspond to identicalsets of points. This implies that two elements can be neighbors along more than one side. TheFigure 4.1 shows the side concepts. For example, in the mesh (A), the element 0 is neighbor ofthe element 1 by the following sides: (the nomenclature is element / side): 0/1 is neighbor of1/1, 0/2 is neighbor of 0/0 and 0/4 is neighbor of 1/4. Note that when an element / side has notneighbor it points to itself, i.e. 0/5 is neighbor of 0/5 and 1/3 is neighbor of 1/3.

When the mesh is adapted, as seen in (C), additional concepts could be seen as the inclusionand the cyclical neighborhood. As example, take the element / side = 2/4. All points of 2/4 ∈to1/4 but the intersection between they are equal to 2/4 and different of 1/4, so they are notneighbors but 2/4 is included in 1/4.

When considering uniform refinement patterns son/sides are neighbors of a father/side onlyby the nodes of the father. Therefore, the neighborhood of these nodes must be updated when adivision occurs. To explain the cyclical refinement after one division lets take the node 4. Previ-ous to division the neighborhood was: 0/1 is neighbor of 1/1 and 1/1 is neighbor of 0/1 closingthe cycle. After division, the subelement must be included in cycle and now the neighborhoodis: 0/1 is neighbor of 1/1 (no changes occurs in the element 0 since that it was not divided).Now 1/1 is neighbor of 3/1 (the father points to son) and the 3/1 is neighbor of 0/1 (the son takethe previous neighbor of the father) closing the cycle.

The datastructure required to keep track of the element/node connectivity and neighboringinformation is : geometric elements contain a vector of geometric nodes and geometric elements

Figure 4: Side Concepts: (A) Mesh composed by two elements ( 0 and 1 ) and the global node enumera-tion. (B) The local side enumeration for each element. (C) Adapted (A) mesh with the element 1 refined.(D) The local side enumeration for the adapted mesh.

contain a vector of pointers to neighboring elements/sides2.The relationship between sub-elements and their father is also based on side information.

A father element/side is the father of a subelement/side if the father element/side contains allpoints of the subelement/side. To each subelement/side corresponds exactly one father ele-ment/side. This implies that there exists a transformation from the parametric space of thesubelement/side to the parametric space of the father element/side in which it is contained (SeeFigure 4.1).

The refinement of a geometric element consists in the creation of subelements contained inthe father element and updating the topology information of its neighbors.

4.2 Previous implementation

Just for tracking the evolution of the code, the Figure 3 shows the tree of the geometricelement class. It is a intuitive way to implement the set of element topologies.

By the object oriented precepts, TPZGeoEl class implements a set of virtual functions thatis reimplemented at the derivate classes.

The motivation to change this approach was occurred during the debugging of auto-adaptivemethods in 3D elements. The mantainability of the code was inefficient, because when a datastructure problem was found in some element this problem should be fixed in each derivateclass separately.

4.3 Template approach

The use of templates is consequence of a new way to abstract an ”geometric element”. Thegeometric element could be seen as a set of an spatial geometry definition and a topological

2This datastructure is quite large, especially for three dimensional element (e.g. an overhead of 54 words foreach hexahedre element). On the other hand, this information can be reconstructed based on the element/nodeconnectivity information. It is a trade-off between execution speed and storage.

Figure 5: Parametric transformation between son sides and father side:

definition.The adaptive could be an other parameter, since that an element should be divided by

several ways.The initial approach include a refine class as a parameter to define an geometric element.

An evolution in the project was made by the definition of a refinement by a mesh composed bythe father element an the entire set of its sons.

By now the PZ presents two ways to define a geometric element:

• TPZGeoElement template <class TShape, class TGeo, class TRef>;

• TPZGeoElRefLess template <class TShape, class TGeo>

The TPZGeoElRefLess is derived from the TPZGeoEl class and the TPZGeoElement is derivedfrom the TPZGeoElRefLess (see Figure 4.3).

The parameters classes of the templates could define a data structure, being the algorithmsimplemented at the template class.

Note that the TPZGeoElement class will use a template class TRef) for hadaptivity. Onthe other hand, TPZGeoElRefPattern uses an object of the class TPZRefPattern to define thedivision in h adaptivity.

Using just elements of type TPZGeoElement, every mesh created with any combination ofelements can be adapted (h adaption) without restraint problems because all combinations ofrefinements are automatically compatible.

The TPZGeoElRefPattern objects can produce non conforming meshes at some adaptionstep, because refinement patterns are specified by the user and their combination could producenon conform meshes.

The description of the common class parameters of the template based elements (TGeo andTShape) is provided below. Division methods are treated in a separated subsection.

Figure 6: Template class structure for geometric elements:

TShape classes The shape classes are responsible to implement topological information of theelement. Under topology, it is understood the element node/connectivities and element/neighborinformation. The functionalities that are required for these entities are the following:

• Topological definitions

– Number of sides of the element,

– Number of corner nodes of the element,

– Dimension of the element;

• Transformations between sides of the subelement to sides of the father element (Thetransformations in PZ are composed by two matrix one multiplier and one sum. Figure4.1 shows the evaluation of a transformation for adapted elements).

With these parameters it is possible to evaluate the shape functions at each point of the element.Note that the shape functions is a ”computational data” but the definitions of the shape functionsrequires the topological information which are understood here as a geometric information.

TGeo classes These classes define the transformation between the spatial element and the mas-ter element. The Jacobian of the mapping between master coordinates and spatial coordinatesis evaluated.

These objects use the spatial coordinates of the element and implement the evaluation of theshape functions which compute the mapping between the master element and actual element.

Another important feature of this class is the creation of the boundary condition associatedelement. In PZ an boundary condition is associated to a side of an element being applied to this.When some geometrical data of a boundary condition is required, the value of the associatedside element created here is returned.

The functionalities required by this abstraction are the following:

• A type identifier for the element;

• A Jacobian evaluation including the determinant and the inverse of the Jacobian for agiven element coordinate;

• A method to evaluate a spatial coordinate given a master element coordinate;

• A method which creates a geometric boundary condition element corresponding to a sideof the current geometric element;

• A method to create an Gaussian quadrature integration rule for any side of the element.

4.4 Division Methods

A division process updates/modifies the data structure in a way to make the mesh conformafter division. For this reason, some important topological concepts must be observed:

1. Each son side must be included in a father side;

2. Each father side is the union of a set of the sons sides;

3. For each son side there exists a transformation between itself and the corresponding fatherside.

With the previous concepts, the division could be structured as the following process:

1. Create new nodes:For each side, the refinement algorithm must provide the number and the location (interms of master element coordinates) of the internal nodes. Internal nodes are defined asthe new nodes that are necessary to define the connectivities of the subelements.Note that the internal nodes could be already created by a neighbor. In this case the nodesof the neighbor node will be used to avoid duplication.

2. Create new elements (subelements):Using the set of internal nodes and the father nodes are possible to define the connectivi-ties of the new elements.

3. Adjust the neighborhood information:The neighbors of the father and the sons must be updated. Note that prior to the division,the mesh elements must have consistant neighbors.In PZ, two pair of ”element / side” are neighbors if their intersection and the union pro-duces the same result. Another important aspect of the neighbor data structure is that eachpair ”element / side” has just one neighbor, but the neighbors are defined in the way toprovide a cyclical reference, i.e. a pair points to other that points to other and so on untilthat one pair points to the first pair (see the Figure 4.1).The process of adjusting neighbor information consists in insertion of a pair ”son element/ side” in the cyclical neighborhood of the ”father element /side”. This is made by thefollowing process:

• Take the neighbor of the corner node of the father and define this neighbor as theson neighbor by the same corner;

• Points the father neighbor as the subelement corner.

4. Evaluates the restriction of the son element shape functions to the father associated shapefunction. This is a computational element aspect and it is not object of this paper. Forreferences about these restrictions process see [1].

Figure 7: Tetrahedron - uniform refinement patternOriginal nodes: {0, 1, 2, 3}, new nodes {4, 5, 6, 7, 8, 9} (one new node by each side)

These concepts are implemented in PZ in two different ways: the classes TRef that implementsa ”uniform” refinement data structure hard coded, used by TPZGeoElement approach. TheTPZRefPattern class implements the same concepts, but the here the data structure is evaluatedfrom a input file as will be described bellow. The TPZRefPattern is used by the TPZGeoElRef-Pattern template class.

classes TRef The set of classes TRef implements a ”uniform” element division data structure.The ”uniform” term is relative since that the topological implemented division have as maincharacteristic the fact that the distortion factor of the elements is maintained (at least) duringthe division process.

The TRef class data structure include the number of sons, the topological relation betweenfathers and sons, i.e. the neighborhood between father and son and the parametric transfor-mations between sides of sons to sides of the father. The implementation is hard coded: allparameters for the division of an element is provided during the compilation process.

The implemented divisions, as presented in [6] and is shown for the 3D elements the Fig-ures 4.4 (tetrahedra), 4.4 (pyramid), 4.4 (prism), 4.4 (cube).

The important data in terms of the abstraction of this set of classes is the fact that the unionof sides of all sons must be a closed set equal to the union of the sides of the father element.

The main functionality of these class is: given an element, apply the previously describedelement division process to generate the subelements.

Class TPZRefPattern Analyzing the classes which implement the behavior of a TRef type,one verifies that there are two major points defined by theses classes: the topological relationbetween father and sons and the transformations between sons and father.

The class TPZRefPattern has the concept of defining the same parameters of the TRefclasses ”dynamically”, where the refinement pattern of an element is given by a mesh with

Figure 8: Hexahedron - uniform refinement patternOriginal nodes: {0, 1, 2, 3, 4, 5, 6, 7}, new nodes {8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}(one new node by each side, one node by each face and one node at element center)

Figure 9: Prism - uniform refinement pattern

Original nodes: {0, 1, 2, 3, 4, 5}, new nodes {6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17} (one newnode by each side and one node at each quad face)

Figure 10: Pyramid - uniform refinement pattern

Original nodes: {0, 1, 2, 3, 4}, new nodes {5, 6, 7, 8, 9, 10, 11, 12, 13} (one new node by eachside, and one node at center of quad face)

contain only the father element and its sons. For implementation purposes this mesh is given ina text file with a self pattern of data input.

This approach is possible by the side definition used in PZ, where the neighborhood isevaluated in the assembling of the geometric mesh (BuildConnectivities method).

In PZ, an element is neighbor of another if they share a side. As example, in 1D problem,two elements are neighbors if they have (at least) a common node.

Using this definition, father and sons are neighbors by their common nodes. Therefore theneighborhood between father and sons are detected in the same way that is identified for twoelements in a conforming mesh.

Note that creating the refinement pattern mesh we just define the topological relation givenby the classes TRef. The another step is with this topological information evaluate the transfor-mation that is a problem of data structure since that the topological relations are evaluated. Themain methods of this class is described bellow:

1. Given a mesh composed for a father element and its subelements:

(a) Generates a mesh with consistent neighbors, i.e. evaluates the partition of the fatherelement and the topological division that generates its sons

(b) Given a topological consistent mesh, evaluate the transformations from son sidesto father sides.

2. With the topology and transformations evaluated, given an element, using the patterngiven by the refinement pattern mesh to divide the given element. This division followsthe previous described division steps:

(a) Verify if the internal nodes exists. Create the nodes that does not exists.

(b) Creates new elements using the father nodes and internal nodes to define the subele-ments connectivities

(c) Adjust topological data between father and son

(d) Adjust the neighbors of the father element and the subelements

5. CONCLUSIONS

Without object oriented technology, it would not have been possible to develop a finiteelement code incorporating all features present in PZ. The next challenge is how to put thiscomplexity to work in order to obtain significant results turning the environment usefull forindustrial purposes.

The use of templates in the presented work doesn’t turn the code unreadable as is commonin code optimization process. The use of template makes it easier to see how the abstraction isimplemented.

An great benefit in the proposed approach is that the template class concentrates the algo-rithms and the parameter classes are just for organize a data structure. The central managementof the algorithms turns the maintainability of the code simple.

A major benefit of using an object oriented structure is the possibility to generate under-standable documentation automatically. We especially acknowledge the public domain toolDoxygen.

Acknowledgements : this work has been realized in collaboration with colleagues andstudents. All have both benefitted from and contributed to the PZ environment. The financialsupport of FAPESP, CAPES, CNPq and of the companies Petrobras, Commodity and Embraer( through Uniemp) is also gratefully acknowledged.

References

[1] Cedric Marcelo A. A. Bravo, Philippe R. B. Devloo, and Renato Pavanello. Sobre aimplementação do refinamento h-p. In CILAMCE99 Congresso Ibero Latino Americanode Metodos Computacionais para Engenharia, pages 1–21, Sao Paulo, 1999.

[2] L. Demkowicz, P. R. B. Devloo, and J. T. Oden. On an h-type mesh refinement strategybased on minimization of interpolation errors. Computer Methods in Applied Mechanicsand Engineering, 1-2:63–87, 1986.

[3] L. Demkowicz, D. Pardo, and W. Rachowicz. 3d hp-adaptive finite element package(3dhp90) version 2.0. TICAM - Report 02-24, TICAM - Texas Institute for Computa-tional and Applied Mathematics - The University of Texas at Austin, Austin, TX 78712,2002.

[4] P. R. B. Devloo. PZ : An object oriented environment for scientific programming. Com-puter Methods in Applied Mechanics and Engineering, 150:133–153, 1997.

[5] P. R. B. Devloo, J. T. Oden, and P. Pattani. An hp-adaptive finite element method for thenumerical simulation of compressible flow. Computer Methods in Applied Mechanics andEngineering, 70:203–235, 1988.

[6] Philippe R. B. Devloo and Cedric M. A. BRAVO. An object oriented approach to adaptivefinite element techniques. In European Congress on Computational Methods in AppliedSciences and Engineering, ECCOMAS, pages 1–21, 2000.

[7] Philippe R. B. Devloo and Gustavo Camargo Longhin. An object oriented multi-threadedmulti-frontal solver. In XXII Iberian Latin-American Congress on Computational Methodsin Engineering, 2001.

[8] Philippe R.B. Devloo. A three-dimensional adaptive finite element strategy. Computers &Structures, 38(2):121–130, 1991.

[9] P.R.B. Devloo and J.S.R.F. Alves. On the development of a finite element program basedon the object oriented programming filosophy. In Ch. Hirsch, O.C. Zienkiewicz, andE. Oñate, editors, Numerical Methods in Engineering ’92, pages 39–42, Brussels, Bel-gium, september 1992. First European Conference on Numerical Methods in Engineering,Elsevier.

[10] John Tinsley Oden, F. Carey, Graham, and E. B. Becker. Finite Elements - An Introdution,volume Vol. 1. Prentice Hall Inc., New Jersey - USA, 1981.

[11] B. Szabó and I. Babuska. Finite Element Analysis. A Wiley-interscience publication,1991.