#ifndef _Recipes_h
#define _Recipes_h

/*
MELTS Source Code: RCS $Log: recipes.h,v $
MELTS Source Code: RCS Revision 4.0  1999/06/18 17:29:14  ghiorso
MELTS Source Code: RCS Java MELTS v 1.1.0 Initial Check in
MELTS Source Code: RCS
 * Revision 3.6  1997/06/21  22:49:29  ghiorso
 * June 1997 MELTS 3.0.x release
 * (prior to new entropy and regression model being introduced)
 *
 * Revision 3.5  1997/05/03  20:23:08  ghiorso
 * *** empty log message ***
 *
 * Revision 3.4  1997/03/27  17:03:12  ghiorso
 * *** empty log message ***
 *
 * Revision 3.3  1996/09/24  20:33:22  ghiorso
 * Version modified for OSF/1 4.0
 *
 * Revision 3.2  1995/12/09  19:26:38  ghiorso
 * Interface revisions for status box and graphics display
 *
 * Revision 3.1  1995/08/18  19:12:14  ghiorso
 * MELTS Version 3 - Initial Entry
 *
 * Revision 3.1  1995/08/18  19:12:14  ghiorso
 * MELTS Version 3 - Initial Entry
 *
*/

/*
**++
**  FACILITY:  Thread Safe Silicate Melts Crystallization Package
**
**  MODULE DESCRIPTION:
**
**      Include module for all function and structure declarations 
**      for implementation of the math library described in:
**
**      Press, W.H., Flannery, B.P., Teukolsky, S.A. and Vetterling, W.T.
**      (1988) Numerical Recipes in C
**      Cambridge University Press, New York, 735 pages 
**--
*/

/*
 *=============================================================================
 * Structure type definitions:
 */

typedef struct FCOMPLEX {double r,i;} fcomplex;
typedef struct IMMENSE {unsigned long l,r;} immense;
typedef struct GREAT {unsigned short l,c,r;} great;

/*
 *=============================================================================
 * Function declarations: (main body of routines)
 */

void   gaussj(double **a, int n, double **b, int m);
void   svbksb(double **u, double *w, double **v, int m, int n, double *b,
              int *e, double *x);
void   svdcmp(double **a, int m, int n, double *w, double **v);

void   nrerror(char error_text[]);
double *vector(int nl, int nh);
int    *ivector(int nl, int nh);
double *dvector(int nl, int nh);
double **matrix(int nrl, int nrh, int ncl, int nch);
double **dmatrix(int nrl, int nrh, int ncl, int nch);
int    **imatrix(int nrl, int nrh, int ncl, int nch);
double **submatrix(double **a, int oldrl, int oldrh, int oldcl, int oldch,
                   int newrl,int newcl);
void   free_vector(double *v, int nl, int nh);
void   free_ivector(int *v, int nl, int nh);
void   free_dvector(double *v, int nl, int nh);
void   free_matrix(double **m, int nrl, int nrh,int ncl, int nch);
void   free_dmatrix(double **m, int nrl, int nrh, int ncl, int nch);
void   free_imatrix(int **m, int nrl, int nrh, int ncl, int nch);
void   free_submatrix(double **b, int nrl, int nrh, int ncl, int nch);
double **convert_matrix(double *a, int nrl, int nrh, int ncl, int nch);
void   free_convert_matrix(double **b, int nrl, int nrh, int ncl, int nch);
double zbrent(double (*func)(double),double xx1,double xx2,double tol);

#endif /* _Recipes_h */
