diff --git a/Plugin/NearToFarField.cpp b/Plugin/NearToFarField.cpp index d16a6560295c90b9c3afd3c114230466ed690eaf..69e7b62ecb16893fd66021a1daaa7bdbfc79460d 100644 --- a/Plugin/NearToFarField.cpp +++ b/Plugin/NearToFarField.cpp @@ -78,6 +78,7 @@ StringXString *GMSH_NearToFarFieldPlugin::getOptionStr(int iopt) // Element Analysis of Antennas and Arrays", p. 176. This is not the usual `far // field', as it still contains the e^{ikr}/r factor. double GMSH_NearToFarFieldPlugin::getFarFieldJin(std::vector<element*> &allElems, + std::vector<std::vector<double> > &farfieldvector, std::vector<std::vector<double> > &js, std::vector<std::vector<double> > &ms, double k0, double rFar, double theta, @@ -178,6 +179,7 @@ double GMSH_NearToFarFieldPlugin::getFarFieldJin(std::vector<element*> &allElems // Compute far field using e^{-i\omega t} time dependency, following Monk in // "Finite Element Methods for Maxwell's equations", p. 233 double GMSH_NearToFarFieldPlugin::getFarFieldMonk(std::vector<element*> &allElems, + std::vector<std::vector<double> > &farfieldvector, std::vector<std::vector<double> > &js, std::vector<std::vector<double> > &ms, double k0, double theta, double phi) @@ -226,9 +228,16 @@ double GMSH_NearToFarFieldPlugin::getFarFieldMonk(std::vector<element*> &allElem prodve(xHat, integral_r, xHat_x_integral_r); prodve(xHat, integral_i, xHat_x_integral_i); std::complex<double> coef = I * k0 / 4. / M_PI; + double coef1 = k0 / 4. / M_PI; std::complex<double> einf[3] = {coef * (xHat_x_integral_r[0] + I * xHat_x_integral_i[0]), coef * (xHat_x_integral_r[1] + I * xHat_x_integral_i[1]), coef * (xHat_x_integral_r[2] + I * xHat_x_integral_i[2])}; + + for(int comp = 0; comp < 3; comp++){ + farfieldvector[comp][0] = -coef1 * xHat_x_integral_i[comp]; + farfieldvector[comp][1] = coef1 * xHat_x_integral_r[comp]; + } + return (norm(einf[0]) + norm(einf[1]) + norm(einf[2])); } @@ -356,6 +365,18 @@ PView *GMSH_NearToFarFieldPlugin::execute(PView * v) std::vector<std::vector<double> > phi(_NbPhi + 1), theta(_NbPhi + 1); std::vector<std::vector<double> > x(_NbPhi + 1), y(_NbPhi + 1), z(_NbPhi + 1); std::vector<std::vector<double> > farField(_NbPhi + 1); + std::vector<std::vector<double> > farField1r(_NbPhi + 1); + std::vector<std::vector<double> > farField2r(_NbPhi + 1); + std::vector<std::vector<double> > farField3r(_NbPhi + 1); + std::vector<std::vector<double> > farField1i(_NbPhi + 1); + std::vector<std::vector<double> > farField2i(_NbPhi + 1); + std::vector<std::vector<double> > farField3i(_NbPhi + 1); + std::vector<std::vector<double> > farfieldvector(3); + + for(int comp = 0; comp < 3; comp++){ + farfieldvector[comp].resize(2); + } + for (int i = 0; i <= _NbPhi; i++){ phi[i].resize(_NbThe + 1); theta[i].resize(_NbThe + 1); @@ -363,6 +384,13 @@ PView *GMSH_NearToFarFieldPlugin::execute(PView * v) y[i].resize(_NbThe + 1); z[i].resize(_NbThe + 1); farField[i].resize(_NbThe + 1); + + farField1r[i].resize(_NbThe + 1); + farField2r[i].resize(_NbThe + 1); + farField3r[i].resize(_NbThe + 1); + farField1i[i].resize(_NbThe + 1); + farField2i[i].resize(_NbThe + 1); + farField3i[i].resize(_NbThe + 1); } double dPhi = (_phiEnd - _phiStart) / _NbPhi; @@ -373,15 +401,29 @@ PView *GMSH_NearToFarFieldPlugin::execute(PView * v) for (int j = 0; j <= _NbThe; j++){ phi[i][j] = _phiStart + i * dPhi ; theta[i][j] = _thetaStart + j * dTheta ; - if(_negativeTime) - farField[i][j] = getFarFieldMonk(allElems, js, ms, _k0, + if(_negativeTime){ + farField[i][j] = getFarFieldMonk(allElems, farfieldvector, js, ms, _k0, theta[i][j], phi[i][j]); - else - farField[i][j] = getFarFieldJin(allElems, js, ms, _k0, 10 * lc, + farField1r[i][j] = farfieldvector[1][0]; + farField2r[i][j] = farfieldvector[2][0]; + farField3r[i][j] = farfieldvector[3][0]; + farField1i[i][j] = farfieldvector[1][1]; + farField2i[i][j] = farfieldvector[2][1]; + farField3i[i][j] = farfieldvector[3][1];} + else { + farField[i][j] = getFarFieldJin(allElems, farfieldvector, js, ms, _k0, 10 * lc, theta[i][j], phi[i][j]); - ffmin = std::min(ffmin, farField[i][j]); - ffmax = std::max(ffmax, farField[i][j]); - } + farField1r[i][j] = farfieldvector[1][0]; + farField2r[i][j] = farfieldvector[2][0]; + farField3r[i][j] = farfieldvector[3][0]; + farField1i[i][j] = farfieldvector[1][1]; + farField2i[i][j] = farfieldvector[2][1]; + farField3i[i][j] = farfieldvector[3][1];} + + ffmin = std::min(ffmin, farField[i][j]); + ffmax = std::max(ffmax, farField[i][j]); + } + Msg::ProgressMeter(i, _NbPhi, true, "Computing far field"); } for(unsigned int i = 0; i < allElems.size(); i++) @@ -428,6 +470,14 @@ PView *GMSH_NearToFarFieldPlugin::execute(PView * v) printVector(fp, "phi", phi); printVector(fp, "theta", theta); printVector(fp, "farField", farField); + + printVector(fp, "farField1r", farField1r); + printVector(fp, "farField2r", farField2r); + printVector(fp, "farField3r", farField3r); + printVector(fp, "farField1i", farField1i); + printVector(fp, "farField2i", farField2i); + printVector(fp, "farField3i", farField3i); + printVector(fp, "x", x); printVector(fp, "y", y); printVector(fp, "z", z); diff --git a/Plugin/NearToFarField.h b/Plugin/NearToFarField.h index d76056b92198cf22ef01ad466b45372d987a5faa..b4269266a9742a85beae67be821ce8ea324d5c3b 100644 --- a/Plugin/NearToFarField.h +++ b/Plugin/NearToFarField.h @@ -36,11 +36,13 @@ class GMSH_NearToFarFieldPlugin : public GMSH_PostPlugin PView *execute(PView *); double getFarFieldJin(std::vector<element*> &allElems, + std::vector<std::vector<double> > &farfieldvector, std::vector<std::vector<double> > &js, std::vector<std::vector<double> > &ms, double k0, double r_far, double theta, double phi); double getFarFieldMonk(std::vector<element*> &allElems, + std::vector<std::vector<double> > &farfieldvector, std::vector<std::vector<double> > &js, std::vector<std::vector<double> > &ms, double k0, double theta, double phi);