#include"../phy/Phy_Base.h" #include"../material/Material_Base.h" #include"../mesh/Mesh_Base.h" #include"../solver/Solver_Base.h" #include"../test/interfaceClass.h" #include"../common/define.h" #include "../nlohmann/json.hpp" using json = nlohmann::json; #include #include #include #include void Phy_WaveOpticsModel::Test_ReadData(string str) { json js = nlohmann::json::parse(str); std::vector BoundaryFlag = js.at("BoundaryFlag"); int nbrBoundary = js.at("NbrBoundary"); int nbrPEC, nbrPMC, nbrELE, nbrSBC, nbrPBC, nbrMAG, nbrSCD; nbrPEC = 0; nbrPMC = 0; nbrELE = 0; nbrSBC = 0; nbrPBC = 0; nbrMAG = 0; nbrSCD = 0; for (int i = 0; i < nbrBoundary; i++) { if (BoundaryFlag[i] == 0) nbrPMC++; if (BoundaryFlag[i] == 1) nbrPEC++; if (BoundaryFlag[i] == 2) nbrSBC++; if (BoundaryFlag[i] == 3) nbrELE++; if (BoundaryFlag[i] == 4) nbrPBC++; if (BoundaryFlag[i] == 8) nbrMAG++; if (BoundaryFlag[i] == 9) nbrSCD++; } nbrPBC = nbrPBC / 2; _mPMC = Eigen::VectorXi(nbrPMC); _mPEC = Eigen::VectorXi(nbrPEC); _mELE = Eigen::VectorXi(nbrELE); _mSBC = Eigen::MatrixXi(nbrSBC, 2); _mEincx = new std::string[nbrSBC]; _mEincy = new std::string[nbrSBC]; _mEincz = new std::string[nbrSBC]; _mSBCDir = Eigen::MatrixXd(nbrSBC, 3); _mPBC = Eigen::MatrixXi(nbrPBC, 2); _mPBCData = Eigen::VectorXcd(nbrPBC); _mMAG = Eigen::VectorXi(nbrMAG); _mSCD = Eigen::VectorXi(nbrSCD); _mPortEinc = new std::string[3]; _mPortEout = new std::string[3]; _mPortEincCurl = new std::string[3]; _mPortEoutCurl = new std::string[3]; nbrPMC = 0; nbrPEC = 0; nbrPBC = 0; for (int i = 0; i < BoundaryFlag.size(); i++) { if (BoundaryFlag[i] == 0) { _mPMC(nbrPMC) = i; nbrPMC++; } if (BoundaryFlag[i] == 1) { _mPEC(nbrPEC) = i; nbrPEC++; } if (BoundaryFlag[i] == 4) { nbrPBC++; } } //��ȡ�߽����������� if (js.contains("sbc")) { json sbc = js.at("sbc"); std::vector SBCType = sbc.at("SBCType"); std::vector Index = sbc.at("Index"); std::vector E0x = sbc.at("E0x"); std::vector E0y = sbc.at("E0y"); std::vector E0z = sbc.at("E0z"); std::vector kx = sbc.at("kx"); std::vector ky = sbc.at("ky"); std::vector kz = sbc.at("kz"); for (int i = 0; i < nbrSBC; i++) { _mSBC(i, 0) = Index[i]; _mSBC(i, 1) = SBCType[i]; _mEincx[i] = E0x[i]; _mEincy[i] = E0y[i]; _mEincz[i] = E0z[i]; _mSBCDir(i, 0) = kx[i]; _mSBCDir(i, 1) = ky[i]; _mSBCDir(i, 2) = kz[i]; } } if (js.contains("ef")) { json ef = js.at("ef"); std::vector EF = ef.at("index"); std::vector E0x = ef.at("E0x"); std::vector E0y = ef.at("E0y"); std::vector E0z = ef.at("E0z"); _mE0x = new std::string[nbrELE]; _mE0y = new std::string[nbrELE]; _mE0z = new std::string[nbrELE]; for (int i = 0; i < EF.size(); i++) { _mELE(i) = EF[i]; _mE0x[i] = E0x[i]; _mE0y[i] = E0y[i]; _mE0z[i] = E0z[i]; } } if (js.contains("mag")) { json mag = js.at("mag"); std::vector MAG = mag.at("index"); std::vector H0x = mag.at("H0x"); std::vector H0y = mag.at("H0y"); std::vector H0z = mag.at("H0z"); _mH0x = new std::string[nbrMAG]; _mH0y = new std::string[nbrMAG]; _mH0z = new std::string[nbrMAG]; for (int i = 0; i < MAG.size(); i++) { _mMAG(i) = MAG[i]; _mH0x[i] = H0x[i]; _mH0y[i] = H0y[i]; _mH0z[i] = H0z[i]; } } if (js.contains("scd")) { json scd = js.at("scd"); std::vector SCD = scd.at("index"); std::vector J0x = scd.at("J0x"); std::vector J0y = scd.at("J0y"); std::vector J0z = scd.at("J0z"); _mJ0x = new std::string[nbrSCD]; _mJ0y = new std::string[nbrSCD]; _mJ0z = new std::string[nbrSCD]; for (int i = 0; i < SCD.size(); i++) { _mSCD(i) = SCD[i]; _mJ0x[i] = J0x[i]; _mJ0y[i] = J0y[i]; _mJ0z[i] = J0z[i]; } } nbrPBC = nbrPBC / 2; if (nbrPBC != 0) { json pbc = js.at("pbc"); std::vector srcIndex = pbc.at("srcIndex"); std::vector dstIndex = pbc.at("dstIndex"); std::vector phiR = pbc.at("phiR"); std::vector phiI = pbc.at("phiI"); std::vector> PBCData(nbrPBC); for (int i = 0; i < nbrPBC; i++) { _mPBC(i, 0) = srcIndex[i]; _mPBC(i, 1) = dstIndex[i]; PBCData[i] = std::complex(phiR[i], phiI[i]); _mPBCData(i) = PBCData[i]; } } if (js.contains("mpd")) { json mpd = js.at("mpd"); std::vector MPD = mpd.at("index"); std::vector> MPDData; std::vector mx = mpd.at("mx"); std::vector my = mpd.at("my"); std::vector mz = mpd.at("mz"); int nbrMPD = MPD.size(); _mMPD = Eigen::VectorXi(nbrMPD); _mMPDData = Eigen::MatrixXd(nbrMPD, 3); for (int i = 0; i < nbrMPD; i++) { _mMPD[i] = MPD[i]; _mMPDData(i, 0) = mx[i]; _mMPDData(i, 1) = my[i]; _mMPDData(i, 2) = mz[i]; } } if (js.contains("epd")) { json epd = js.at("epd"); std::vector EPD = epd.at("index"); std::vector> EPDData; std::vector px = epd.at("px"); std::vector py = epd.at("py"); std::vector pz = epd.at("pz"); int nbrEPD = EPD.size(); _mEPD = Eigen::VectorXi(nbrEPD); _mEPDData = Eigen::MatrixXd(nbrEPD, 3); for (int i = 0; i < nbrEPD; i++) { _mEPD[i] = EPD[i]; _mEPDData(i, 0) = px[i]; _mEPDData(i, 1) = py[i]; _mEPDData(i, 2) = pz[i]; } } if (js.contains("bele")) { json bele = js.at("bele"); std::vector BELE = bele.at("index"); int nbrBELE = BELE.size(); _mBELE = Eigen::VectorXi(nbrBELE); for (int i = 0; i < nbrBELE; i++) { _mBELE[i] = BELE[i]; } _mEbx = bele.at("Ebx"); _mEby = bele.at("Eby"); _mEbz = bele.at("Ebz"); _mcurlEbx = bele.at("curlEbx"); _mcurlEby = bele.at("curlEby"); _mcurlEbz = bele.at("curlEbz"); } if (js.contains("pml")) { json pml = js.at("pml"); std::vectorPML = pml.at("index"); vector PMLType = pml.at("PMLType"); std::vector> PMLData = pml.at("PMLData"); int nbrPML = PML.size(); _mPMLLda = pml.at("lambda"); _mPML = Eigen::VectorXi(nbrPML); _mPMLData = Eigen::MatrixXd(nbrPML,6); _mPMLType = Eigen::VectorXi(nbrPML); _mPMLEdge = Eigen::VectorXi(nbrPML); for (int i = 0; i < nbrPML; i++) { _mPML[i] = PML[i]; _mPMLType[i] = PMLType[i]; for (int j = 0; j < 6; j++) { _mPMLData(i,j) = PMLData[i][j]; } } if (pml.contains("PMLBoundaryIndex")) { vector PMLEdge = pml.at("PMLBoundaryIndex"); for (int i = 0; i < nbrPML; i++) { _mPMLEdge(i) = PMLEdge[i]; } } } if (js.contains("port")) { json port = js.at("port"); std::vectorPORTinc = port.at("PORTinc"); std::vectorPORTout = port.at("PORTout"); std::vector Einc = port.at("Einc"); std::vector Eout = port.at("Eout"); std::vector EincCurl = port.at("EincCurl"); std::vector EoutCurl = port.at("EoutCurl"); _mPortinc = Eigen::VectorXi(PORTinc.size()); _mPortout = Eigen::VectorXi(PORTout.size()); for (int i = 0; i < PORTinc.size(); i++) { _mPortinc(i) = PORTinc[i]; } for (int i = 0; i < PORTout.size(); i++) { _mPortout(i) = PORTout[i]; } for (int i = 0; i < 3; i++) { _mPortEinc[i] = Einc[i]; } for (int i = 0; i < 3; i++) { _mPortEout[i] = Eout[i]; } for (int i = 0; i < 3; i++) { _mPortEincCurl[i] = EincCurl[i]; } for (int i = 0; i < 3; i++) { _mPortEoutCurl[i] = EoutCurl[i]; } } if (js.contains("beam")) { json beam = js.at("beam"); _mBeam = beam.at("type"); _mkx = beam.at("kx"); _mky = beam.at("ky"); } } void MaterialLib::Test_ReadData(string str) { json js = nlohmann::json::parse(str); std::vector matType = js.at("matType"); std::vector epsilonrR = js.at("epsilonrR"); std::vector epsilonrI = js.at("epsilonrI"); std::vector murR = js.at("murR"); std::vector murI = js.at("murI"); std::vector sigmaX = js.at("sigma"); std::vector chiheR = js.at("chiheR"); std::vector chiheI = js.at("chiheI"); std::vector chiehR = js.at("chiehR"); std::vector chiehI = js.at("chiehI"); std::vector nn = js.at("n"); std::vector kk = js.at("k"); int nbrDomain = js.at("NbrDomain"); SetNumberMat(nbrDomain); int j = 0; for (int i = 0; i < nbrDomain; i++) { int* domain; std::complex* epsr, * mur, * chihe, * chieh; double* sigma; epsr = new std::complex[1]; mur = new std::complex[1]; sigma = new double[1]; chihe = new std::complex[1]; chieh = new std::complex[1]; domain = new int[1]; domain[0] = i + 1; if (matType[i] == 0) { epsr[0] = std::complex(epsilonrR[j], epsilonrI[j]); mur[0] = std::complex(murR[j], murI[j]); sigma[0] = sigmaX[j]; chihe[0] = std::complex(chiheR[j], chiheI[j]); chieh[0] = std::complex(chiehR[j], chiehI[j]); j = j + 1; } if (matType[i] == 1) { epsr[0] = std::complex(nn[i - j], kk[i - j]); epsr[0] = epsr[0] * epsr[0]; mur[0] = 1.0; sigma[0] = 0.0; chihe[0] = 0.0; chieh[0] = 0.0; } std::string name = "mat"; SetMat(i, name, 1, domain, 0, epsr, mur, sigma, chihe, chieh); delete[] domain, epsr, mur, sigma, chihe, chieh; } }