/*
 *_________________________________________________________________________*
 *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
 *      DESCRIPTION: SEE READ-ME                                           *
 *      FILE NAME: workspace.h                                             *
 *      AUTHORS: See Author List                                           *
 *      GRANTS: See Grants List                                            *
 *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
 *      LICENSE: Please see License Agreement                              *
 *      DOWNLOAD: Free at www.rpi.edu/~anderk5                             *
 *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
 *                     Computational Dynamics Lab                          *
 *                     Rensselaer Polytechnic Institute                    *
 *                     110 8th St. Troy NY 12180                           *
 *      CONTACT:        anderk5@rpi.edu                                    *
 *_________________________________________________________________________*/


#ifndef WORKSPACE_H
#define WORKSPACE_H

#include "matrices.h"
#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>
#include <iomanip>
#include <vector>


class System;
class Solver;

struct SysData{
        System * system;
        int solver;
        int integrator;
};

class Workspace {
        SysData * system; // the multibody systems data
        int currentIndex;
        int maxAlloc;

public:
     Workspace();
     ~Workspace();

     double Thalf;
     double Tfull;
     double ConFac;
     double KE_val;
          int FirstTime;

     bool LoadFile(char* filename);

     bool SaveFile(char* filename, int index = -1);

     System* GetSystem(int index = -1);

     void AddSolver(Solver* s, int index = -1);


     void LobattoOne(double **&xcm, double **&vcm,double **&omega,double **&torque, double **&fcm, double **&ex_space, double **&ey_space, double **&ez_space);

     void LobattoTwo(double **&vcm,double **&omega,double **&torque, double **&fcm);


     bool MakeSystem(int& nbody, double *&masstotal, double **&inertia, double **&xcm, double **&vcm, double **&omega, double **&ex_space, double **&ey_space, double **&ez_space, int &njoint, int **&jointbody, double **&xjoint, int& nfree, int*freelist, double dthalf, double dtv, double tempcon, double KE);


          bool SaveSystem(int& nbody, double *&masstotal, double **&inertia, double **&xcm, double **&xjoint, double **&vcm, double **&omega, double **&ex_space, double **&ey_space, double **&ez_space, double **&acm, double **&alpha, double **&torque, double **&fcm, int **&jointbody, int &njoint);

         bool MakeDegenerateSystem(int& nfree, int*freelist, double *&masstotal, double **&inertia, double **&xcm, double **&vcm, double **&omega, double **&ex_space, double **&ey_space, double **&ez_space);
     int getNumberOfSystems();

     void SetLammpsValues(double dtv, double dthalf, double tempcon);
     void SetKE(int temp, double SysKE);

          void RKStep(double **&xcm, double **&vcm,double **&omega,double **&torque, double **&fcm, double **&ex_space, double **&ey_space, double **&ez_space);

          void WriteFile(char* filename);

private:
        void allocateNewSystem(); //helper function to handle vector resizing and such for the array of system pointers
};

#endif
