diff --git a/Plugin/NearToFarField.cpp b/Plugin/NearToFarField.cpp index 25b11068ee84ab338102272a1e8ef5fa6e548622..d16a6560295c90b9c3afd3c114230466ed690eaf 100644 --- a/Plugin/NearToFarField.cpp +++ b/Plugin/NearToFarField.cpp @@ -365,9 +365,9 @@ PView *GMSH_NearToFarFieldPlugin::execute(PView * v) farField[i].resize(_NbThe + 1); } - double dPhi = (_phiEnd - _phiStart) / _NbPhi ; - double dTheta = (_thetaEnd - _thetaStart) / _NbThe ; - double ffmax = 0.0 ; + double dPhi = (_phiEnd - _phiStart) / _NbPhi; + double dTheta = (_thetaEnd - _thetaStart) / _NbThe; + double ffmin = 1e200, ffmax = -1e200; Msg::ResetProgressMeter(); for (int i = 0; i <= _NbPhi; i++){ for (int j = 0; j <= _NbThe; j++){ @@ -379,7 +379,8 @@ PView *GMSH_NearToFarFieldPlugin::execute(PView * v) else farField[i][j] = getFarFieldJin(allElems, js, ms, _k0, 10 * lc, theta[i][j], phi[i][j]); - ffmax = (ffmax < farField[i][j]) ? farField[i][j] : ffmax ; + ffmin = std::min(ffmin, farField[i][j]); + ffmax = std::max(ffmax, farField[i][j]); } Msg::ProgressMeter(i, _NbPhi, true, "Computing far field"); } @@ -387,26 +388,38 @@ PView *GMSH_NearToFarFieldPlugin::execute(PView * v) delete allElems[i]; if(_normalize){ - for (int i = 0; i <= _NbPhi; i++) - for (int j = 0; j <= _NbThe; j++) - if(ffmax != 0.0) + if(!ffmax) + Msg::Warning("Cannot normalize far field (max = 0)"); + else + for (int i = 0; i <= _NbPhi; i++) + for (int j = 0; j <= _NbThe; j++) farField[i][j] /= ffmax ; - else - Msg::Warning("Far field pattern not normalized, max value = %g", ffmax); } - for (int i = 0; i <= _NbPhi; i++){ - for (int j = 0; j <= _NbThe; j++){ - x[i][j] = x0 + r_sph * farField[i][j] * sin(theta[i][j]) * cos(phi[i][j]); - y[i][j] = y0 + r_sph * farField[i][j] * sin(theta[i][j]) * sin(phi[i][j]); - z[i][j] = z0 + r_sph * farField[i][j] * cos(theta[i][j]); + if(_dB){ + ffmin = 1e200; + ffmax = -1e200; + for (int i = 0; i <= _NbPhi; i++){ + for (int j = 0; j <= _NbThe; j++){ + farField[i][j] = 10 * log10(farField[i][j]); + ffmin = std::min(ffmin, farField[i][j]); + ffmax = std::max(ffmax, farField[i][j]); + } } } - if(_dB){ - for (int i = 0; i <= _NbPhi; i++) - for (int j = 0; j <= _NbThe; j++) - farField[i][j] = 10 * log10(farField[i][j]); + for (int i = 0; i <= _NbPhi; i++){ + for (int j = 0; j <= _NbThe; j++){ + double df = (ffmax - ffmin); + if(!df){ + Msg::Warning("zero far field range"); + df = 1.; + } + double f = (farField[i][j] - ffmin) / df; // in [0,1] + x[i][j] = x0 + r_sph * f * sin(theta[i][j]) * cos(phi[i][j]); + y[i][j] = y0 + r_sph * f * sin(theta[i][j]) * sin(phi[i][j]); + z[i][j] = z0 + r_sph * f * cos(theta[i][j]); + } } if(_outFile.size()){