Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve invalid zenith angle handling in Sandia PV model #5529

Merged
merged 7 commits into from Mar 24, 2016
16 changes: 15 additions & 1 deletion src/EnergyPlus/ElectricPowerServiceManager.cc
Expand Up @@ -1924,7 +1924,9 @@ namespace EnergyPlus {
electricityProd( 0.0 ),
electProdRate( 0.0 ),
thermalProd( 0.0 ),
thermProdRate( 0.0 )
thermProdRate( 0.0 ),
errCountNegElectProd_( 0 ),
errCountNegThermProd_( 0 )
{

std::string const routineName = "GeneratorController constructor ";
Expand Down Expand Up @@ -2068,6 +2070,18 @@ namespace EnergyPlus {
break;
}
} // end switch

//check if generator production has gone wrong and is negative, reset to zero and warn
if ( electricPowerOutput < 0.0 ) {
if ( errCountNegElectProd_ == 0 ) {
ShowWarningMessage( typeOfName + " named " + name + " is producing negative electric power, check generator inputs." );
ShowContinueError( "Electric power production rate =" + General::RoundSigDigits( electricPowerOutput, 4 ) );
ShowContinueError( "The power will be set to zero, and the simulation continues... " );
}
ShowRecurringWarningErrorAtEnd( typeOfName + " named " + name + " is producing negative electric power ", errCountNegElectProd_,electricPowerOutput, electricPowerOutput );
electricPowerOutput = 0.0;
}

}

DCtoACInverter::DCtoACInverter(
Expand Down
7 changes: 7 additions & 0 deletions src/EnergyPlus/ElectricPowerServiceManager.hh
Expand Up @@ -595,6 +595,13 @@ public: // data // might make this class a friend of ElectPowerLoadCenter?
Real64 electProdRate; // Current AC Electric Production Rate from Equipment (W)
Real64 thermalProd; // Current Thermal energy Produced from Equipment (J)
Real64 thermProdRate; // Current Thermal energy Production Rate from Equipment (W)

private:

int errCountNegElectProd_; // error count for reccuring error when generators produce negative electric power
int errCountNegThermProd_; // error count for reccuring error when generators produce negative thermal power


}; //class GeneratorController

class ElectPowerLoadCenter
Expand Down
4 changes: 2 additions & 2 deletions src/EnergyPlus/Photovoltaics.cc
Expand Up @@ -2145,8 +2145,8 @@ namespace Photovoltaics {
Real64 const AM( 1.0 / ( std::cos( SolZen * DegToRadians ) + 0.5057 * std::pow( 96.08 - SolZen, -1.634 ) ) );
AbsoluteAirMass = std::exp( -0.0001184 * Altitude ) * AM;
} else {
AbsoluteAirMass = 999.0;
// should maybe add a show warning msg.
Real64 const AM( 36.32 ); // evaluated above at SolZen = 89.9 issue #5528
AbsoluteAirMass = std::exp( -0.0001184 * Altitude ) * AM;
}

return AbsoluteAirMass;
Expand Down
1 change: 1 addition & 0 deletions tst/EnergyPlus/unit/CMakeLists.txt
Expand Up @@ -73,6 +73,7 @@ set( test_src
OutputReportData.unit.cc
OutputReportTabular.unit.cc
OutputReportTabularAnnual.unit.cc
Photovoltaics.unit.cc
PierceSurface.unit.cc
ReportSizingManager.unit.cc
RoomAirflowNetwork.unit.cc
Expand Down
87 changes: 87 additions & 0 deletions tst/EnergyPlus/unit/Photovoltaics.unit.cc
@@ -0,0 +1,87 @@
// EnergyPlus, Copyright (c) 1996-2016, The Board of Trustees of the University of Illinois and
// The Regents of the University of California, through Lawrence Berkeley National Laboratory
// (subject to receipt of any required approvals from the U.S. Dept. of Energy). All rights
// reserved.
//
// If you have questions about your rights to use or distribute this software, please contact
// Berkeley Lab's Innovation & Partnerships Office at IPO@lbl.gov.
//
// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the
// U.S. Government consequently retains certain rights. As such, the U.S. Government has been
// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable,
// worldwide license in the Software to reproduce, distribute copies to the public, prepare
// derivative works, and perform publicly and display publicly, and to permit others to do so.
//
// Redistribution and use in source and binary forms, with or without modification, are permitted
// provided that the following conditions are met:
//
// (1) Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// (2) Redistributions in binary form must reproduce the above copyright notice, this list of
// conditions and the following disclaimer in the documentation and/or other materials
// provided with the distribution.
//
// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory,
// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific prior
// written permission.
//
// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form
// without changes from the version obtained under this License, or (ii) Licensee makes a
// reference solely to the software portion of its product, Licensee must refer to the
// software as "EnergyPlus version X" software, where "X" is the version number Licensee
// obtained under this License and may not use a different name for the software. Except as
// specifically required in this Section (4), Licensee shall not use in a company name, a
// product name, in advertising, publicity, or other promotional activities any name, trade
// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly
// similar designation, without Lawrence Berkeley National Laboratory's prior written consent.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// You are under no obligation whatsoever to provide any bug fixes, patches, or upgrades to the
// features, functionality or performance of the source code ("Enhancements") to anyone; however,
// if you choose to make your Enhancements available either publicly, or directly to Lawrence
// Berkeley National Laboratory, without imposing a separate written license agreement for such
// Enhancements, then you hereby grant the following license: a non-exclusive, royalty-free
// perpetual license to install, use, modify, prepare derivative works, incorporate into other
// computer software, distribute, and sublicense such enhancements or derivative works thereof,
// in binary and source code form.

// EnergyPlus::ElectricPowerServiceManager Unit Tests

// Google Test Headers
#include <gtest/gtest.h>

// EnergyPlus Headers
#include <Photovoltaics.hh>

#include "Fixtures/EnergyPlusFixture.hh"

using namespace EnergyPlus;

TEST_F( EnergyPlusFixture, PV_Sandia_AirMassAtHighZenith )
{
// unit test for issue #5528, test behavior of function AbsoluteAirMass at zenith angle above 89.9 degrees.

// first check above the degree threshold, compare to side calc
Real64 zenithAngleDeg = 90.0;
Real64 altitude = 1;
Real64 airMass = Photovoltaics::AbsoluteAirMass( zenithAngleDeg, altitude );
EXPECT_NE( airMass, 999 ); // would have been true before fix
EXPECT_NEAR( airMass, 36.31531 , 0.1 );

// now check below the threshold, compare to side calc spreadhsheet result
zenithAngleDeg = 89.0;
airMass = Photovoltaics::AbsoluteAirMass( zenithAngleDeg, altitude );
EXPECT_NEAR( airMass, 26.24135, 0.1 );

}