/*
    This file is part of the FElt finite element analysis package.
    Copyright (C) 1993-2000 Jason I. Gobat and Darren C. Atkinson

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

/************************************************************************
 * File:	fe.h							*
 *									*
 * Description:	This file contains the primary type and function	*
 *		declarations for the finite element package.		*
 ************************************************************************/

# ifndef _FE_H
# define _FE_H
# include "code.h"
# include "matrix.h"


# define TINY 1.0e-60
# define UnspecifiedValue (-99999999)

# ifndef M_PI
# define M_PI 3.14159265358979323846
# endif

# ifndef M_PI_2
#define M_PI_2          1.57079632679489661923  /* pi/2 */
# endif

# ifndef M_PI_4
#define M_PI_4          0.78539816339744830962  /* pi/4 */
# endif

/* Analysis types */

typedef enum {
    Static = 1,
    Transient = 2,
    Modal = 3,
    StaticThermal = 4,
    TransientThermal = 5,
    Spectral = 6,
    StaticSubstitution = 7,
    StaticIncremental = 8,
    StaticLoadCases = 9,
    StaticLoadRange = 10,
    StaticSubstitutionLoadRange = 11,
    StaticIncrementalLoadRange = 12,
} AnalysisType;


/* Element shapes */

typedef enum {
    Linear = 1,
    Planar = 2,
    Solid  = 3
} Shape;


/* Load directions */

typedef enum {
    LocalX        = 1,
    LocalY        = 2,
    LocalZ        = 3,
    GlobalX	  = 4,
    GlobalY	  = 5,
    GlobalZ 	  = 6,
    Parallel      = 7,
    Perpendicular = 8,
    Radial	  = 9,
    Axial	  = 10
} Direction;


/* Degrees of freedom */

typedef enum {
    Tx = 1, Fx = 1,			/* translation/force along x axis */
    Ty = 2, Fy = 2,			/* translation/force along y axis */
    Tz = 3, Fz = 3,			/* translation/force along z axis */
    Rx = 4, Mx = 4,			/* rotation/moment about x axis   */
    Ry = 5, My = 5,			/* rotation/moment about y axis   */
    Rz = 6, Mz = 6			/* rotation/moment about z axis   */
} DOF;


/* A node-magnitude pair */

typedef struct pair {
    unsigned node;			/* node number */
    double   magnitude;			/* magnitude   */
} Pair;


/* A reaction force */

typedef struct reaction {
    double   force;			/* reaction force             */
    unsigned node;			/* node number                */
    unsigned dof;			/* affected degree of freedom */
} *Reaction;


/* Element stress */

typedef struct stress {
    char   *aux;			/* auxiliary data pointer */
    double  x;				/* x coordinate		  */
    double  y;				/* y coordinate		  */
    double  z;				/* z coordinate		  */
    double *values;			/* computed stress values */
} *Stress;


/* Variable expression */

typedef struct {
    double value;		/* value at time zero */
    Code   expr;		/* expression code    */
    char  *text;		/* text of expression */
} VarExpr;


/* An element definition */

typedef struct definition {
    char    *name;		/* element name			      */
    int    (*setup) ( );	/* initialization function	      */
    int    (*stress) ( );	/* stress resultant function	      */
    Shape    shape;		/* element dimensional shape          */
    unsigned numnodes;		/* number of nodes in element         */
    unsigned shapenodes;	/* number of nodes which define shape */
    unsigned numstresses;	/* number of computed stress values   */
    unsigned numdofs;		/* number of degrees of freedom       */
    unsigned dofs [7];		/* degrees of freedom                 */
    unsigned retainK;		/* retain element K after assemblage  */
} *Definition;


/* A distributed load */

typedef struct distributed {
    char     *aux;			/* auxillary data pointer   	  */
    char     *name;			/* name of distributed load 	  */
    char     *color;			/* name of color to use in velvet */
    Direction direction;		/* direction of load        	  */
    unsigned  nvalues;			/* number of values         	  */
    Pair     *value;			/* nodes and magnitudes     	  */
} *Distributed;


/* A force */

typedef struct force {
    char   *aux;			/* auxillary data pointer 	  */
    char   *name;			/* name of force          	  */
    char   *color;			/* name of color to use in velvet */
    VarExpr force [7];			/* force vector			  */
    VarExpr spectrum [7];		/* input spectra		  */
} *Force;


/* A constraint (boundary and initial conditions) */

typedef struct constraint {
    char   *aux;			/* auxillary data pointer 	  */
    char   *name;			/* name of constraint     	  */
    char   *color;			/* name of color to use in velvet */
    char    constraint [7];		/* constraint vector     	  */
    double  ix [7];			/* initial displacement vector    */
    double  vx [4];			/* initial velocity vector	  */
    double  ax [4];			/* initial acceleration vector    */
    VarExpr dx [7];			/* boundary displacement vector	  */
} *Constraint;


/* A material */

typedef struct material {
    char  *aux;				/* auxillary data pointer           */
    char  *name;			/* name of material                 */
    char  *color;			/* name of color to use in velvet   */
    double E;				/* Young's modulus                  */
    double Ix;				/* moment of inertia about x-x axis */
    double Iy;				/* moment of inertia about y-y axis */
    double Iz;				/* moment of inertia about z-z axis */
    double A;				/* cross-sectional area             */
    double J;				/* polar moment of inertia          */
    double G;				/* bulk (shear) modulus             */
    double t;				/* thickness                        */
    double rho;				/* density                          */
    double nu;				/* Poisson's ratio                  */
    double kappa;			/* shear force correction           */
    double Rk;				/* Rayleigh damping coefficient (K) */
    double Rm;				/* Rayleigh damping coefficient (M) */
    double Kx;				/* conductivity in x direction      */
    double Ky;				/* conductivity in y direction      */
    double Kz;				/* conductivity in z direction      */
    double c;				/* heat capacity		    */
} *Material;


/* A node */

typedef struct node {
    char      *aux;			/* auxillary data pointer         */
    unsigned   number;			/* node number                    */
    Constraint constraint;		/* constrained degrees of freedom */
    Force      force;			/* force acting on node           */
    double     m;			/* lumped mass			  */
    double    *eq_force;		/* equivalent force               */
    double     dx [7];			/* displacement                   */
    double     x;			/* x coordinate                   */
    double     y;			/* y coordinate                   */
    double     z;			/* z coordinate                   */
    double    *stress;                  /* nodally averaged stress vector */
    int        numelts;			/* num of elts that use this node */
} *Node;


/* An element */

typedef struct element {
    char       *aux;			/* auxillary data pointer 	*/
    unsigned    number;			/* element number         	*/
    Node       *node;			/* array of nodes         	*/
    Matrix      K;			/* stiffness matrix       	*/
    Matrix	M;			/* mass matrix			*/
    Matrix	f;			/* element residual force	*/
    Material    material;		/* material               	*/
    Definition  definition;		/* definition of element        */
    Distributed distributed [4];	/* distributed loads      	*/
    unsigned    numdistributed;		/* number of loads        	*/
    Stress     *stress;			/* element stresses             */
    unsigned    ninteg;			/* number of integration points */
} *Element;


/* A nodal DOF */

typedef struct nodeDOF {
    DOF		dof;
    Node	node;
} *NodeDOF;


typedef struct casepair {
   unsigned	 noe;		/* node or element number */
   char		*fol;		/* force or load name     */
} CasePair;


/* A Load Case */

typedef struct loadcase {
    char	*name;
    unsigned	 numforces;
    unsigned	 numloads;
    Node	*nodes;
    Element	*elements;
    Force	*forces;
    Distributed *loads;
} *LoadCase;


/* The different analyses definitions */

typedef struct analysis {
    double	start;			/* time/freq start point	*/
    double	step;			/* time/freq step delta		*/
    double	stop;			/* time/freq stop point		*/
    double	gamma;			/* parameter in Newmark integr.	*/
    double	beta;			/* parameter in Newmark integr.	*/
    double	alpha;			/* parameter in H-H-T-alpha 	*/
    double	Rk;			/* global Rayleigh K damping    */
    double	Rm;			/* global Rayleigh M damping    */
    double      gravity [4];		/* gravitational accel vector	*/
    double      tolerance;		/* convergence control factor   */
    double	relaxation;		/* iterative relaxation factor  */
    unsigned	iterations;		/* iteration count control      */
    unsigned	load_steps;		/* number of incremental steps  */
    char	mass_mode;		/* 'c'onsistent or 'l'umped	*/
    Node       *nodes;			/* list of nodes of interest    */
    unsigned	numnodes;		/* number of nodes of interest  */
    char	dofs [7];		/* dofs of interest		*/
    unsigned	numdofs;		/* number of dofs of interest	*/
    unsigned	input_dof;		/* input DOF # for range loads  */
    Node  	input_node;		/* input node # for range loads */
} Analysis;


	/*
	 * prototypes of routines in fe.c
	 */

extern int      FindDOFS		  PROTO (( ));
extern Matrix   ConstructStiffness	  PROTO ((int *));
extern void     ZeroConstrainedDOF	  PROTO ((Matrix, Vector, 
                                                  Matrix *, Vector *));
extern void	RemoveConstrainedDOF	  PROTO	((Matrix, Matrix, Matrix, 
                                                  Matrix *, Matrix *, Matrix *));
extern Vector   ZeroCompactRowCol	  PROTO ((Vector, unsigned));
extern void     AdjustForceVector	  PROTO ((Vector, Matrix, unsigned, double));
extern unsigned SolveForReactions	  PROTO ((Matrix, Vector, 
						  unsigned *, Reaction **));
extern Vector   ConstructForceVector	  PROTO (( ));
extern Matrix   SolveStaticLoadCases	  PROTO ((Matrix, Matrix));
extern Matrix   SolveStaticLoadRange 	  PROTO ((Matrix, Matrix));
extern void	AssembleLoadCaseForce	  PROTO ((Matrix, LoadCase));
extern Vector   SolveForDisplacements	  PROTO ((Matrix, Vector));
extern int      FactorStiffnessMatrix	  PROTO ((Matrix));
extern void     ApplyNodalDisplacements   PROTO ((Matrix));
extern int      ElementSetup		  PROTO ((Element, char));
extern void     ClearNodes		  PROTO (( ));
extern int      ElementStresses		  PROTO (( ));
extern int      GlobalDOF                 PROTO ((unsigned, unsigned));
extern void     LocalDOF                  PROTO ((unsigned, unsigned *,
                                                  unsigned *));
extern int      ZeroConstrainedMatrixDOF  PROTO ((Matrix, Matrix));
extern Matrix   RemoveConstrainedMatrixDOF PROTO ((Matrix));
extern void	FindForcedDOF		  PROTO ((NodeDOF **, unsigned *));
extern int	CheckAnalysisParameters   PROTO ((AnalysisType));

	/*
	 * routines for automatic node renumbering in renumber.c
	 */

extern unsigned *RenumberNodes		  PROTO ((Node *, Element *, unsigned,
						  unsigned));
extern void     RestoreNodeNumbers	  PROTO ((Node *, unsigned *,
						  unsigned));

	/*
	 * prototypes for routines in results.c
	 */

extern int      WriteGraphicsFile	  PROTO ((char *, double));
extern int      WriteMaterialStatistics   PROTO ((FILE *));
extern void     WriteStructuralResults	  PROTO ((FILE *, char *, Reaction *, unsigned));
extern void     WriteLoadCaseTable	  PROTO ((Matrix, FILE *));
extern void	PlotLoadCaseTable	  PROTO ((Matrix, FILE *));
extern void     WriteLoadRangeTable	  PROTO ((Matrix, FILE *));
extern void	PlotLoadRangeTable	  PROTO ((Matrix, FILE *));
extern void     WriteTemperatureResults   PROTO ((FILE *, char *));
extern void	WriteEigenResults	  PROTO ((Matrix, Matrix, 
						  char *, FILE *));
extern void     WriteModalResults         PROTO ((FILE*, Matrix, Matrix, 
                                                  Matrix, Matrix));
extern void	PlotModeShapes		  PROTO ((Matrix, FILE *));
extern void     WriteTransientTable	  PROTO ((Matrix, Matrix, FILE *));
extern void     PlotTransientTable	  PROTO ((Matrix, Matrix, double, FILE *));
extern void     WriteOutputSpectra	  PROTO ((Matrix, FILE *));
extern void     PlotOutputSpectra	  PROTO ((Matrix, FILE *));
extern void 	WriteTransferFunctions	  PROTO ((Matrix *,  NodeDOF *, 
                                                  unsigned, FILE *));
extern void     PlotTransferFunctions	  PROTO ((Matrix *, NodeDOF *,
                                                  unsigned, FILE *));
extern void     PrintGlobalMatrices       PROTO ((FILE *, Matrix, Matrix, Matrix));
extern int      MatlabGlobalMatrices      PROTO ((char *, Matrix, Matrix, Matrix));

	/*
	 * prototypes for routines in draw.c
	 */

extern void 	DrawStructureASCII	  PROTO ((FILE *, unsigned, unsigned));

	/*
	 * prototypes of routines in transient.c
	 */

extern int	ConstructDynamic	  PROTO ((Matrix *, Matrix *, Matrix *));
extern void	AssembleTransientForce	  PROTO ((double, Vector));
extern int     *BuildConstraintMask	  PROTO (( ));
extern int	BuildHyperbolicIC	  PROTO ((Vector, Vector, Vector));
extern void	BuildParabolicIC	  PROTO ((Vector));
extern Matrix	IntegrateHyperbolicDE	  PROTO ((Vector, Vector, Vector));
extern Matrix	RosenbrockHyperbolicDE	  PROTO ((Vector, Vector, Vector, Matrix *));
extern Matrix	IntegrateParabolicDE	  PROTO ((Vector, Vector));
extern void	ResolveBC 		  PROTO ((double, Vector, Vector));

	/*
	 * routines in modal.c
	 */

extern int	ComputeEigenModes	  PROTO ((Matrix, Matrix, 
						  Matrix *, Matrix *));
extern Matrix	ModalNodalDisplacements	  PROTO ((Matrix));
extern int	FormModalMatrices	  PROTO ((Matrix, Matrix, Matrix, Matrix,
                                                  Matrix *, Matrix *, Matrix *,
                                                  int));

	/*
	 * routines in spectral.c
	 */

extern int 	FastFourierTransform 	   PROTO ((double *, double *, 
                                                   int, int, int));
extern int 	Spectrum 		   PROTO ((Vector, Vector *, Vector *, 
                                                   double, int));
extern int	ComputeOutputSpectraFFT	   PROTO ((Matrix, Matrix *, 
                                                   Vector *, int));
extern Matrix	*ComputeTransferFunctions  PROTO ((Matrix, Matrix, Matrix,
                                                   NodeDOF *, unsigned));
extern Matrix	ComputeOutputSpectra	   PROTO ((Matrix *, NodeDOF *,
                                                   unsigned));

	/*
	 * routines in nonlinear.c
	 */

extern Matrix 	CreateNonlinearStiffness     PROTO ((int *));
extern int	AssembleCurrentState         PROTO ((Matrix, Matrix, int));
extern int	AssembleCurrentForce	     PROTO ((Matrix, Matrix));
extern int      RestoreCoordinates           PROTO ((Matrix));
extern int      UpdateCoordinates            PROTO ((Matrix));
extern Matrix   StaticNonlinearDisplacements PROTO ((Matrix, Matrix, int));
extern Matrix   SolveNonlinearLoadRange      PROTO ((Matrix, Matrix, int));

# endif /* _FE_H */


syntax highlighted by Code2HTML, v. 0.9.1