#include "HeatComp.h"

struct ControlPoints
{
	arma::mat CPMat;
	int nPoints;

	ControlPoints();
	ControlPoints(arma::vec &, arma::vec &, arma::vec &, arma::vec &);
	ControlPoints(char *fname);
	~ControlPoints();
	ControlPoints& operator =(ControlPoints &);
};

struct Optimise
{
	bool opt,parallel;

	double dr0,dz0,dphi,T_inf,dtau;
	double rho;
	double epsilon;
	double delta;
	arma::vec p_s;
	int nXs,ndr,ndphi,ndz;
	int n_offset, nElem,pmax,Heatpmax;

	arma::field<arma::cube> Elem;
	arma::field<arma::cube> ElemL;
	arma::field<arma::cube> ElemR;

	arma::field<arma::vec> X_s;
	arma::field<arma::vec> X_L;
	arma::field<arma::vec> X_s_opt;

	arma::vec Param;
	arma::vec X_s_av;
	arma::vec Vecv_z;
	arma::vec nX;
	arma::vec ElemOfCP;

	arma::cube T;
	arma::cube setT;
	arma::mat ProfileMat;

	double overlap;

	ControlPoints CP;
	arma::vec OptimalHtcs;
	double htcmax,htcmin;
	double htc_step;

	double RealTertiaryLength;

	char *ConstM_fname;
	std::string Settings_fname;
	arma::vec Settings;

	Optimise(double v_z, arma::cube &T_0, double poverlap, char *pfilename, double pdr0,double pdz0, double pdphi, double pT_inf, double pdtau, ControlPoints &);
	~Optimise(void);

	arma::vec ToVect(arma::cube &);
	arma::mat DeVectM(arma::vec &,int,int,int);
	arma::cube DeVect(arma::vec &,int,int,int);


	void SetElements();
	arma::vec CompScen(int ind,arma::cube &pElemi,arma::vec Param, arma::vec &Wi,arma::vec &X_av_oldi, arma::cube &Tf, double htcl);
	arma::vec OptimiseScen (int ind,arma::vec &pElemi, double v_z, double htc0, arma::vec &Wi,arma::vec &X_av_oldi, arma::cube &Tf, double htcl);

	void ComputePHA();
};

