Skip to content

Commit e4d4ec3

Browse files
authored
Merge pull request #743 from firelab/GUI-Redesign-domain-average-api
Separate Domain Average API functions
2 parents 0be19c5 + 0c6fb23 commit e4d4ec3

File tree

5 files changed

+124
-7
lines changed

5 files changed

+124
-7
lines changed

src/gui/mainWindow.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,14 @@ void MainWindow::solveButtonClicked()
484484
QString cloudCoverUnits = "percent";
485485
if(ninjaErr == NINJA_SUCCESS)
486486
{
487-
ninjaErr = NinjaMakeDomainAverageArmy(ninjaArmy, numNinjas, momentumFlag, speeds.data(), speedUnits.toUtf8().constData(), directions.data(), years.data(), months.data(), days.data(), hours.data(), minutes.data(), DEMTimeZone.toUtf8().data(), airTemps.data(), airTempUnits.toUtf8().constData(), cloudCovers.data(), cloudCoverUnits.toUtf8().constData(), papszOptions);
487+
if(ui->diurnalCheckBox->isChecked() || ui->stabilityCheckBox->isChecked())
488+
{
489+
ninjaErr = NinjaMakeDomainAverageArmyThermalParameterization(ninjaArmy, numNinjas, momentumFlag, speeds.data(), speedUnits.toUtf8().constData(), directions.data(), years.data(), months.data(), days.data(), hours.data(), minutes.data(), DEMTimeZone.toUtf8().data(), airTemps.data(), airTempUnits.toUtf8().constData(), cloudCovers.data(), cloudCoverUnits.toUtf8().constData(), papszOptions);
490+
}
491+
else
492+
{
493+
ninjaErr = NinjaMakeDomainAverageArmy(ninjaArmy, numNinjas, momentumFlag, speeds.data(), speedUnits.toUtf8().constData(), directions.data(), papszOptions);
494+
}
488495
//ninjaErr = NinjaMakeDomainAverageArmy(ninjaArmy, -1, momentumFlag, speeds.data(), speedUnits.toUtf8().constData(), directions.data(), years.data(), months.data(), days.data(), hours.data(), minutes.data(), DEMTimeZone.toUtf8().data(), airTemps.data(), airTempUnits.toUtf8().constData(), cloudCovers.data(), cloudCoverUnits.toUtf8().constData(), papszOptions); // catches error as expected, now it triggers the NinjaMakeDomainAverageArmy() single messaging error, instead of the double messaging makeDomainAverageArmy() error.
489496
//ninjaErr = NinjaMakeDomainAverageArmy(ninjaArmy, 0, momentumFlag, speeds.data(), speedUnits.toUtf8().constData(), directions.data(), years.data(), months.data(), days.data(), hours.data(), minutes.data(), DEMTimeZone.toUtf8().data(), airTemps.data(), airTempUnits.toUtf8().constData(), cloudCovers.data(), cloudCoverUnits.toUtf8().constData(), papszOptions); // catches error as expected, now it triggers the NinjaMakeDomainAverageArmy() single messaging error, instead of the double messaging makeDomainAverageArmy() error.
490497
//ninjaErr = NinjaMakeDomainAverageArmy(ninjaArmy, numNinjas, momentumFlag, speeds.data(), speedUnits.toUtf8().constData(), directions.data(), years.data(), months.data(), days.data(), hours.data(), minutes.data(), "fudge", airTemps.data(), airTempUnits.toUtf8().constData(), cloudCovers.data(), cloudCoverUnits.toUtf8().constData(), papszOptions); // requires the try/catch form of IF_VALID_INDEX_TRY in ninjaArmy.h, but then catches error as expected, well it technically throws two separate error messages, but both are caught properly

src/ninja/ninjaArmy.cpp

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1258,7 +1258,7 @@ void ninjaArmy::setAtmFlags()
12581258
* C-API makeArmy function calls
12591259
*-----------------------------------------------------------------------------*/
12601260

1261-
int ninjaArmy::NinjaMakeDomainAverageArmy( int numNinjas, bool momentumFlag, const double * speedList, const char * speedUnits, const double * directionList, const int * yearList, const int * monthList, const int * dayList, const int * hourList, const int * minuteList, const char * timeZone, const double * airTempList, const char * airTempUnits, const double * cloudCoverList, const char * cloudCoverUnits, char ** papszOptions )
1261+
int ninjaArmy::NinjaMakeDomainAverageArmyThermalParameterization( int numNinjas, bool momentumFlag, const double * speedList, const char * speedUnits, const double * directionList, const int * yearList, const int * monthList, const int * dayList, const int * hourList, const int * minuteList, const char * timeZone, const double * airTempList, const char * airTempUnits, const double * cloudCoverList, const char * cloudCoverUnits, char ** papszOptions )
12621262
{
12631263
try
12641264
{
@@ -1351,6 +1351,79 @@ int ninjaArmy::NinjaMakeDomainAverageArmy( int numNinjas, bool momentumFlag, con
13511351
return NINJA_SUCCESS;
13521352
}
13531353

1354+
1355+
int ninjaArmy::NinjaMakeDomainAverageArmy( int numNinjas, bool momentumFlag, const double * speedList, const char * speedUnits, const double * directionList, char ** papszOptions )
1356+
{
1357+
try
1358+
{
1359+
1360+
#ifndef NINJAFOAM
1361+
if(momentumFlag == true)
1362+
{
1363+
throw std::runtime_error("momentumFlag cannot be set to true. WindNinja was not compiled with mass and momentum support.");
1364+
}
1365+
#endif
1366+
1367+
if( numNinjas < 1 )
1368+
{
1369+
throw std::runtime_error(CPLSPrintf("Invalid input numNinjas '%d' in ninjaArmy::NinjaMakeDomainAverageArmy()", numNinjas));
1370+
}
1371+
1372+
//Get the number of elements in the arrays
1373+
/* size_t length1 = sizeof(speedList) / sizeof(speedList[0]);
1374+
size_t length2 = sizeof(directionList) / sizeof(directionList[0]); */
1375+
// size_t length1 = sizeof(yearList) / sizeof(yearList[0]);
1376+
// size_t length2 = sizeof(monthList) / sizeof(monthList[0]);
1377+
// size_t length3 = sizeof(dayList) / sizeof(dayList[0]);
1378+
// size_t length4 = sizeof(hourList) / sizeof(hourList[0]);
1379+
// size_t length5 = sizeof(minuteList) / sizeof(minuteList[0]);
1380+
// size_t length6 = sizeof(airTempList) / sizeof(airTempList[0]);
1381+
// size_t length7 = sizeof(cloudCoverList) / sizeof(cloudCoverList[0]);
1382+
//
1383+
// if(!(length1 == length2 == length3 == length4 == length5 == length6 == length7))
1384+
// {
1385+
// throw std::runtime_error("yearList, monthList, dayList, hourList, minuteList, airTempList, and cloudCoverList must be the same length!");
1386+
//
1387+
1388+
makeDomainAverageArmy( numNinjas, momentumFlag );
1389+
1390+
int retval = NINJA_E_INVALID;
1391+
for(int i=0; i<getSize(); i++)
1392+
{
1393+
retval = setInputSpeed( i, speedList[i], std::string( speedUnits ) );
1394+
if( retval != NINJA_SUCCESS )
1395+
{
1396+
Com->ninjaCom(ninjaComClass::ninjaFailure, "ninjaArmy::setInputSpeed() called in ninjaArmy::NinjaMakeDomainAverageArmy() for ninja '%d' failed.", i);
1397+
return retval;
1398+
}
1399+
1400+
retval = setInputDirection( i, directionList[i] );
1401+
if( retval != NINJA_SUCCESS )
1402+
{
1403+
Com->ninjaCom(ninjaComClass::ninjaFailure, "ninjaArmy::setInputDirection() called in ninjaArmy::NinjaMakeDomainAverageArmy() for ninja '%d' failed.", i);
1404+
return retval;
1405+
}
1406+
}
1407+
}
1408+
catch( armyException & e )
1409+
{
1410+
Com->ninjaCom(ninjaComClass::ninjaFailure, "Exception caught: %s", e.what());
1411+
return NINJA_E_INVALID;
1412+
}
1413+
catch( exception & e )
1414+
{
1415+
Com->ninjaCom(ninjaComClass::ninjaFailure, "Exception caught: %s", e.what());
1416+
return NINJA_E_INVALID;
1417+
}
1418+
catch( ... )
1419+
{
1420+
Com->ninjaCom(ninjaComClass::ninjaFailure, "Exception caught: Cannot determine exception type.");
1421+
return NINJA_E_INVALID;
1422+
}
1423+
1424+
return NINJA_SUCCESS;
1425+
}
1426+
13541427
int ninjaArmy::NinjaMakePointArmy( int * yearList, int * monthList, int * dayList, int * hourList, int * minuteList, int timeListSize, char * timeZone, const char ** stationFileNames, int numStationFiles, char * elevationFile, bool matchPointsFlag, bool momentumFlag, char ** papzOptions )
13551428
{
13561429
try

src/ninja/ninjaArmy.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ class ninjaArmy
170170
/*-----------------------------------------------------------------------------
171171
* C-API makeArmy function calls
172172
*-----------------------------------------------------------------------------*/
173-
int NinjaMakeDomainAverageArmy( int numNinjas, bool momentumFlag, const double * speedList, const char * speedUnits, const double * directionList, const int * yearList, const int * monthList, const int * dayList, const int * hourList, const int * minuteList, const char * timeZone, const double * airTempList, const char * airTempUnits, const double * cloudCoverList, const char * cloudCoverUnits, char ** papszOptions=NULL );
173+
int NinjaMakeDomainAverageArmyThermalParameterization( int numNinjas, bool momentumFlag, const double * speedList, const char * speedUnits, const double * directionList, const int * yearList, const int * monthList, const int * dayList, const int * hourList, const int * minuteList, const char * timeZone, const double * airTempList, const char * airTempUnits, const double * cloudCoverList, const char * cloudCoverUnits, char ** papszOptions=NULL );
174+
int NinjaMakeDomainAverageArmy( int numNinjas, bool momentumFlag, const double * speedList, const char * speedUnits, const double * directionList, char ** papszOptions=NULL );
174175
int NinjaMakePointArmy( int * yearList, int * monthList, int * dayList, int * hourList, int * minuteList, int timeListSize, char * timeZone, const char ** stationFileNames, int numStationFiles, char * elevationFile, bool matchPointsFlag, bool momentumFlag, char ** papzOptions=NULL );
175176
int NinjaMakeWeatherModelArmy( const char * forecastFilename, const char * timeZone, const char** inputTimeList, int size, bool momentumFlag, char ** papzOptions=NULL );
176177

src/ninja/windninja.cpp

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ WINDNINJADLL_EXPORT NinjaArmyH* NinjaInitializeArmy()
8282
}
8383

8484
/**
85-
* \brief Generate a new suite of domain average windninja runs.
85+
* \brief Generate a new suite of domain average windninja runs using thermal parameterization.
8686
*
8787
* Use this method to create a finite, known number of runs for windninja.
8888
* There are other creation methods that automatically allocate the correct
@@ -114,7 +114,7 @@ WINDNINJADLL_EXPORT NinjaArmyH* NinjaInitializeArmy()
114114
*
115115
* \return NINJA_SUCCESS on success, non-zero otherwise.
116116
*/
117-
WINDNINJADLL_EXPORT NinjaErr NinjaMakeDomainAverageArmy
117+
WINDNINJADLL_EXPORT NinjaErr NinjaMakeDomainAverageArmyThermalParameterization
118118
( NinjaArmyH * army, int numNinjas, bool momentumFlag, const double * speedList, const char * speedUnits, const double * directionList,
119119
const int * yearList, const int * monthList, const int * dayList, const int * hourList, const int * minuteList, const char * timeZone, const double * airTempList, const char * airTempUnits, const double * cloudCoverList, const char * cloudCoverUnits, char ** options )
120120
{
@@ -123,7 +123,40 @@ WINDNINJADLL_EXPORT NinjaErr NinjaMakeDomainAverageArmy
123123
return NINJA_E_NULL_PTR;
124124
}
125125

126-
return reinterpret_cast<ninjaArmy*>( army )->NinjaMakeDomainAverageArmy(numNinjas, momentumFlag, speedList, speedUnits, directionList, yearList, monthList, dayList, hourList, minuteList, timeZone, airTempList, airTempUnits, cloudCoverList, cloudCoverUnits, options);
126+
return reinterpret_cast<ninjaArmy*>( army )->NinjaMakeDomainAverageArmyThermalParameterization(numNinjas, momentumFlag, speedList, speedUnits, directionList, yearList, monthList, dayList, hourList, minuteList, timeZone, airTempList, airTempUnits, cloudCoverList, cloudCoverUnits, options);
127+
}
128+
129+
/**
130+
* \brief Generate a new suite of domain average windninja runs.
131+
*
132+
* Use this method to create a finite, known number of runs for windninja.
133+
* There are other creation methods that automatically allocate the correct
134+
* number of runs for the input type.
135+
*
136+
* \see NinjaMakeWeatherModelArmy
137+
* \see NinjaMakePointArmy
138+
*
139+
* Avaliable Creation Options:
140+
* None
141+
*
142+
* \param army An opaque handle to a valid ninjaArmy.
143+
* \param numNinjas The number of runs to create.
144+
* \param momentumFlag Flag specifying if the mass and momentum solver should be used.
145+
* \param speedList List of wind speeds to simulate.
146+
* \param speedUnits String indicating wind speed units ("mph", "mps", "kph", "knots").
147+
* \param directionList List of wind directions to simulate in degrees.
148+
*
149+
* \return NINJA_SUCCESS on success, non-zero otherwise.
150+
*/
151+
WINDNINJADLL_EXPORT NinjaErr NinjaMakeDomainAverageArmy
152+
( NinjaArmyH * army, int numNinjas, bool momentumFlag, const double * speedList, const char * speedUnits, const double * directionList, char ** options )
153+
{
154+
if(!army)
155+
{
156+
return NINJA_E_NULL_PTR;
157+
}
158+
159+
return reinterpret_cast<ninjaArmy*>( army )->NinjaMakeDomainAverageArmy(numNinjas, momentumFlag, speedList, speedUnits, directionList, options);
127160
}
128161

129162
/**

src/ninja/windninja.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,13 @@ typedef int NinjaErr;
7373
*-----------------------------------------------------------------------------*/
7474
WINDNINJADLL_EXPORT NinjaArmyH* NinjaInitializeArmy();
7575

76-
WINDNINJADLL_EXPORT NinjaErr NinjaMakeDomainAverageArmy
76+
WINDNINJADLL_EXPORT NinjaErr NinjaMakeDomainAverageArmyThermalParameterization
7777
( NinjaArmyH * ninjaArmy, int numNinjas, bool momentumFlag, const double * speedList, const char * speedUnits, const double * directionList,
7878
const int * yearList, const int * monthList, const int * dayList, const int * hourList, const int * minuteList, const char * timeZone, const double * airTempList, const char* airTempUnits, const double * cloudCoverList, const char * cloudCoverUnits, char ** options);
7979

80+
WINDNINJADLL_EXPORT NinjaErr NinjaMakeDomainAverageArmy
81+
( NinjaArmyH * ninjaArmy, int numNinjas, bool momentumFlag, const double * speedList, const char * speedUnits, const double * directionList, char ** options);
82+
8083
//TODO: add helper function to generate arrays of years, months, days, hours, and minutes from a station file
8184
WINDNINJADLL_EXPORT NinjaErr NinjaMakePointArmy
8285
( NinjaArmyH * ninjaArmy, int * yearList, int * monthList, int * dayList, int * hourList, int * minuteList, int timeListSize, char * timeZone, const char ** stationFileNames, int numStationFiles, char * elevationFile, bool matchPointsFlag, bool momentumFlag, char ** options);

0 commit comments

Comments
 (0)