Skip to content
Jason Glazer edited this page Apr 13, 2017 · 5 revisions

Catching a NaN

The Microsoft Visual Studio C++ compiler has a way to stop on a NAN (usually shown as a -1.#IND) no matter where or when it is generated. I would expect other compilers do also. To cause it to stop on NAN the /fp:strict should be used as shown at:

http://stackoverflow.com/questions/4454582/visual-studio-c-2008-2010-break-on-float-nan

Right click on energyplus in Solution Explorer, click properties, under C/C++ -> Code Generation -> Floating Point Model set to "Strict (/fp:strict)". Repeat this for energypluslib in the Solution explorer.

I could not get it to work by just putting it into the Visual Studio GUI and instead put it on the

CMAKE_CXX_FLAGS CMAKE_C_FLAGS

variables in CMake.

In addition, I had add the fp_control_state to main.cc:

int
main( int argc, const char * argv[] )
{
	unsigned int fp_control_state = _controlfp( _EM_INEXACT, _MCW_EM );
	ProcessArgs( argc, argv );
	EnergyPlusPgm();
}

The line that sets fp_control_state is commented out in the code base -- remove the comments to build with fp:strict to catch NANs.

Debugging Arrays

The library used as as part of converting EnergyPlus from Fortran to C++ is called Objexx and uses arrays that are difficult to understand during debugging in Microsoft Visual Studio. To overcome this issue copy the file from the repository at:

  • third_party/ObjexxFCL/visualizer/Array.natvis

Into the local directory on your computer:

  • My documents\Visual Studio 2013\Visualizers
  • My documents\Visual Studio 2015\Visualizers

This should show the values of these Objexx array the next time you debug EnergyPlus in Microsoft Visual Studio.

Clone this wiki locally