#pragma once
#include"../material/Material_Base.h"
#include"../mesh/Mesh_Base.h"
#include"../solver/Solver_Base.h"
#include"../Eigen/Sparse"
#include"../Eigen/Dense"
#include <string>
#include "../phy/Phy_Base.h"

class Post_2D_EigenMode
{
public:
	void GetMesh(Mesh_2D* mesh);
	void GetSolver(Solver_EigenMode* solver);
	void GetResult(Eigen::MatrixXcd* x, Eigen::VectorXcd* lambda);

	void GetElectric();
	double GetPower();

	void OutputData(std::string str);

private:
	Mesh_2D* _mMesh;
	Solver_EigenMode* _mSolver;

	Eigen::MatrixXcd* _mX;

	Eigen::MatrixXcd _mEx, _mEy, _mEz;
	Eigen::MatrixXd _mNormE;
	Eigen::VectorXcd _mGamma;
	Eigen::VectorXcd _mNeff;
	
};

class Post_2D_EigenFreq
{
public:
	void GetMesh(Mesh_2D* mesh);
	void GetSolver(Solver_EigenFreq* solver);
	void GetResult(Eigen::MatrixXcd* x, Eigen::VectorXcd* lambda);

	void GetElectric();

	void OutputData(std::string str);
private:
	Mesh_2D* _mMesh;
	Solver_EigenFreq* _mSolver;

	Eigen::MatrixXcd* _mX;

	Eigen::MatrixXcd _mEx, _mEy, _mEz;
	Eigen::MatrixXd _mNormE;
	Eigen::VectorXcd _mFreq; 
};

class Post_2D_Scatter
{
public:
	void GetMesh(Mesh_2D* mesh);
	void GetSolver(Solver_LdaDom* solver);
	void GetResult(Eigen::VectorXcd* x);
	void GetPhy(Phy_WaveOpticsModel* phy);

	void GetElectric();
	void GetEb();
	void OutputData(std::string str);

private:
	Mesh_2D* _mMesh;
	Solver_LdaDom* _mSolver;
	Phy_WaveOpticsModel* _mPhy;

	Eigen::VectorXcd* _mX;

	Eigen::VectorXcd _mEx, _mEy, _mEz;
	Eigen::VectorXd _mNormE;
	Eigen::VectorXcd _mRelEx, _mRelEy, _mRelEz;
	Eigen::VectorXcd _mEbx, _mEby, _mEbz;
};

class Post_3D_EigenFreq
{
public:
	void GetMesh(Mesh_3D* mesh);
	void GetSolver(Solver_EigenFreq* solver);
	void GetResult(Eigen::MatrixXcd* x, Eigen::VectorXcd* lambda);

	void GetElectric();
	void OutputData(std::string str);

private:
	Mesh_3D* _mMesh;
	Solver_EigenFreq* _mSolver;

	Eigen::MatrixXcd* _mX;

	Eigen::MatrixXcd _mEx, _mEy, _mEz;
	Eigen::MatrixXd _mNormE;
	Eigen::VectorXcd _mFreq;
};

class Post_3D_Scatter
{
public:
	void GetMesh(Mesh_3D* mesh);
	void GetPhy(Phy_WaveOpticsModel* phy);
	void GetResult(Eigen::VectorXcd* x);

	void GetElectric();
	void GetEb();
	void OutputData(std::string str);

private:
	Mesh_3D* _mMesh;
	Phy_WaveOpticsModel* _mPhy;
	Eigen::VectorXcd* _mX;

	Eigen::VectorXcd _mEx, _mEy, _mEz;
	Eigen::VectorXd _mNormE;
	Eigen::VectorXcd _mEbx, _mEby, _mEbz;
};