#pragma once

#include"../Eigen/Dense"

#include<complex>
#include<string>

class Phy_WaveOpticsModel
{
public:
	Phy_WaveOpticsModel();

	void GetPhy();

	int GetNbrPEC();
	int GetPECDomain(int num);

	int GetNbrPBC();
	int GetSrcDomain(int num);
	int GetDstDomain(int num);
	std::complex<double> GetPBCPhi(int num);

	int GetNbrPML();
	int GetPMLEdge(int num);
	void GetPMLDomain(Eigen::VectorXi& PMLDomain);
	bool GetPML(int domain, int& PMLType, Eigen::VectorXd& PMLData);
	bool GetPML(int domain, int& PMLType, Eigen::VectorXd& PMLData, double& lambda);

	int GetNbrSBC();
	int GetSBCDomain(int num);
	int GetSBCType(int num);
	void GetSBDir(int num, Eigen::Vector3d& dir);
	void GetEinc(int num, std::string& Eincx, std::string& Eincy, std::string& Eincz);

	int GetNbrBELE();
	void GetBELE(Eigen::VectorXi& BELE);
	int GetBELEDomain(int num);
	void GetEb(std::string& Ebx, std::string& Eby, std::string& Ebz);
	void GetCurlEb(std::string& curlEbx, std::string& curlEby, std::string& curlEbz);

	int GetNbrElE();
	int GetELEDomain(int num);
	void GetE0(std::string& E0x, std::string& E0y, std::string& E0z,int num);

	int GetNbrMAG();
	int GetMAGDomain(int num);
	void GetH0(std::string& H0x, std::string& H0y, std::string& H0z,int num);

	int GetNbrSCD();
	int GetSCDDomain(int num);
	void GetJ0(std::string& J0x, std::string& J0y, std::string& J0z,int num);

	int GetNbrMPD();
	void GetMPD(Eigen::VectorXi& MPD);
	void GetMPDData(Eigen::MatrixXd& m);

	int GetNbrEPD();
	void GetEPD(Eigen::VectorXi& EPD);
	void GetEPDData(Eigen::MatrixXd& p);

	int GetNbrPortinc();
	int GetNbrPortout();
	int GetPortincDomain(int num);
	int GetPortoutDomain(int num);
	void GetPortEinc(std::string& Eincx, std::string& Eincy, std::string& Eincz);
	void GetPortEout(std::string& Eoutx, std::string& Eouty, std::string& Eoutz);
	void GetPortEincCurl(std::string& EincCurlx, std::string& EincCurly, std::string& EincCurlz);
	void GetPortEoutCurl(std::string& EoutCurlx, std::string& EoutCurly, std::string& EoutCurlz);

	int GetBeamState();
	void GetBeamDir(double& kx,double& ky);

	void Test_ReadData(std::string str);

private:
	Eigen::VectorXi _mPMC;//n*1 完美磁导体

	Eigen::VectorXi _mPEC;//n*1 完美电导体

	Eigen::MatrixXi _mPBC;//n*2 周期边界条件
	Eigen::VectorXcd _mPBCData;//n*1

	Eigen::VectorXi _mPML;//n*1 完美匹配层
	Eigen::VectorXi _mPMLType;
	Eigen::VectorXi _mPMLEdge;
	double _mPMLLda;//典型波长
	Eigen::MatrixXd _mPMLData;//n*6  x0 1/dx y0 1/dy  z0 1/dz 无d则1/d=0

	Eigen::MatrixXi _mSBC;//n*2 散射边界条件 0为无入射 1为有入射  
	Eigen::MatrixXd _mSBCDir; //n*3
	std::string* _mEincx, * _mEincy, * _mEincz;

	Eigen::VectorXi _mELE;//n*1  强加电场
	std::string* _mE0x, *_mE0y, *_mE0z;

	Eigen::VectorXi _mMAG;//n*1  强加磁场
	std::string* _mH0x, *_mH0y, *_mH0z;

	Eigen::VectorXi _mSCD;//n*1  表面电流密度
	std::string* _mJ0x, *_mJ0y, *_mJ0z;

	Eigen::VectorXi _mMPD; //n*3 磁偶极子
	Eigen::MatrixXd _mMPDData; //n*3

	Eigen::VectorXi _mEPD; //n*3 电偶极子
	Eigen::MatrixXd _mEPDData; //n*3

	Eigen::VectorXi _mBELE; //n*1 背景场
	std::string _mEbx, _mEby, _mEbz;
	std::string _mcurlEbx, _mcurlEby, _mcurlEbz;

	Eigen::VectorXi _mPortinc;//n*1 端口边界条件
	Eigen::VectorXi _mPortout;//n*1 端口边界条件
	std::string* _mPortEinc, * _mPortEout, * _mPortEincCurl, * _mPortEoutCurl; //入射场及出射场定义

	int _mBeam = 0;//0为不启用波束 1为启用波束
	double _mkx = 0.;//波束方向kx
	double _mky = 0;//波束方向ky
};
