/* SO31.h: Header file for the SO31 library.
Copyright (C) 2007 Will M. Farr <farr@mit.edu>

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.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#ifndef __SO31_H__
#define __SO31_H__ 1

#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<escheme.h>

#define LMREF(m,i,j) (*((double *)(m) + (i) + 4*(j)))
#define LMSET(m,i,j,x) LMREF(m,i,j) = (x)

void lorentz_Rx(double x, double *m);
void lorentz_Ry(double x, double *m);
void lorentz_Rz(double x, double *m);
void lorentz_Bx(double x, double *m);
void lorentz_By(double x, double *m);
void lorentz_Bz(double x, double *m);

void lorentz_params_from_matrix(double *m, double *p);
void lorentz_matrix_from_params(double *p, double *m);

void params_to_inverse_params(double *p, double *pinv);

void params_compose(double *p1, double *p2, double *pc);

void lorentz_deriv_matrix_at_params(double *p, double **dM);
void lorentz_deriv_matrix_at_matrix(double *m, double **dM);

#endif /* __SO31_H__ */ 