Skip to content

Commit

Permalink
prepare initial condition before and refactorizaton for TELEMAC
Browse files Browse the repository at this point in the history
  • Loading branch information
vcloarec committed Sep 1, 2023
1 parent d88a1bc commit 3667875
Show file tree
Hide file tree
Showing 11 changed files with 258 additions and 239 deletions.
5 changes: 3 additions & 2 deletions Tests/core/reos_hydraulic_network_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -235,9 +235,9 @@ void ReoHydraulicNetworkTest::calculationPropagation()
std::unique_ptr<ModuleProcessControler> controller = std::make_unique<ModuleProcessControler>( meshProcess.get() );
controller->waitForFinished();

QString error;
ReosModule::Message message;
std::unique_ptr<ReosSimulationPreparationProcess> preparationProcess(
structure2D->getPreparationProcessSimulation( mNetwork->currentScheme()->calculationContext(), error ) );
structure2D->getPreparationProcessSimulation( mNetwork->currentScheme()->calculationContext(), message ) );
QVERIFY( preparationProcess );
controller = std::make_unique<ModuleProcessControler>( preparationProcess.get() );
controller->waitForFinished();
Expand Down Expand Up @@ -285,6 +285,7 @@ void ReoHydraulicNetworkTest::calculationPropagation()
// we have to wait that upstream calculation is finished
simulateEventLoop( WAITING_TIME_FOR_LOOP );

QString error;
ReosSimulationProcess *simulationProcess =
structure2D->createSimulationProcess( mNetwork->currentScheme()->calculationContext(), error );

Expand Down
3 changes: 2 additions & 1 deletion Tests/simulationEngines/hecras/test_hecras.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -889,7 +889,8 @@ void ReosHecrasTesting::importAndLaunchStructure()
hecSim->setDetailledInterval( ReosDuration( 1, ReosDuration::minute ) );
hecSim->setMappingInterval( ReosDuration( 1, ReosDuration::minute ) );

ReosSimulationData simulationData = structure->simulationData( QString() );
ReosModule::Message message;
ReosSimulationData simulationData = structure->simulationData( QString(), message );
simulation->prepareInput( simulationData, scheme->calculationContext() );

ReosHecRasProject projectAfterPreparation( path );
Expand Down
63 changes: 62 additions & 1 deletion Tests/simulationEngines/telemac/test_telemac.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ void ReosTelemacTesting::buildStructure()
hydraulicStructure->mesh()->applyConstantZValue( 0, coreModule->gisEngine()->crsFromEPSG( 32620 ) );
QCOMPARE( hydraulicStructure->mesh()->vertexElevation( 0 ), 0 );

ReosHydraulicScheme *scheme = coreModule->hydraulicNetwork()->currentScheme();

// Telemac simulation
QVERIFY( hydraulicStructure->addSimulation( QStringLiteral( "telemac2D" ) ) );
ReosTelemac2DSimulation *telemacSim = dynamic_cast<ReosTelemac2DSimulation *>( hydraulicStructure->currentSimulation() );
Expand All @@ -153,11 +155,70 @@ void ReosTelemacTesting::buildStructure()
telemacSim->timeStep()->setValue( ReosDuration( 1.0, ReosDuration::minute ) );
telemacSim->outputPeriodResult2D()->setValue( 5 );
telemacSim->outputPeriodResultHydrograph()->setValue( 1 );

telemacSim->setInitialCondition( ReosTelemac2DInitialCondition::Type::ConstantLevelNoVelocity );
qobject_cast<ReosTelemac2DInitialConstantWaterLevel>( telemacSim->initialCondition() ).initialWaterLevel()->setValue( 2.0 );

coreModule->saveProject( projectDir.filePath( "telemac_model" ) );
ReosModule::Message message;
ReosSimulationData simData = hydraulicStructure->simulationData( scheme->id(), message );

QVERIFY( message.type == ReosModule::Simple );
QCOMPARE( simData.boundaryVertices.count(), 6 );
QCOMPARE( simData.waterDepthIniLocation, ReosSimulationData::None );
QCOMPARE( simData.waterLevelIniLocation, ReosSimulationData::None );
QCOMPARE( simData.velocityIniLocation, ReosSimulationData::None );

telemacSim->setInitialCondition( ReosTelemac2DInitialCondition::Type::FromOtherSimulation );

telemacSim->setInitialCondition( ReosTelemac2DInitialCondition::Type::FromOtherSimulation );
simData = hydraulicStructure->simulationData( scheme->id(), message );
QVERIFY( message.type == ReosModule::Error );
QCOMPARE( simData.waterDepthIniLocation, ReosSimulationData::None );
QCOMPARE( simData.waterLevelIniLocation, ReosSimulationData::None );
QCOMPARE( simData.velocityIniLocation, ReosSimulationData::None );

telemacSim->setInitialCondition( ReosTelemac2DInitialCondition::Type::Interpolation );
simData = hydraulicStructure->simulationData( scheme->id(), message );
QVERIFY( message.type == ReosModule::Error );
QCOMPARE( simData.waterDepthIniLocation, ReosSimulationData::None );
QCOMPARE( simData.waterLevelIniLocation, ReosSimulationData::None );
QCOMPARE( simData.velocityIniLocation, ReosSimulationData::None );

ReosTelemac2DInitialConditionFromInterpolation *interCi =
dynamic_cast<ReosTelemac2DInitialConditionFromInterpolation *>( telemacSim->initialCondition() );
interCi->firstValue()->setValue( 4 );
interCi->secondValue()->setValue( 3 );
QPolygonF interLine;
interLine << QPointF( 495593.83, 1996741.39 );
interCi->setLine( interLine, coreModule->gisEngine()->crsFromEPSG( 32620 ) );
simData = hydraulicStructure->simulationData( scheme->id(), message );
QVERIFY( message.type == ReosModule::Error );
QCOMPARE( simData.waterDepthIniLocation, ReosSimulationData::None );
QCOMPARE( simData.waterLevelIniLocation, ReosSimulationData::None );
QCOMPARE( simData.velocityIniLocation, ReosSimulationData::None );

interLine << QPointF( 495888.53, 1996727.71 );
interCi->setLine( interLine, coreModule->gisEngine()->crsFromEPSG( 32620 ) );
simData = hydraulicStructure->simulationData( scheme->id(), message );
QVERIFY( message.type == ReosModule::Simple );
QCOMPARE( simData.waterDepthIniLocation, ReosSimulationData::Vertex );
QCOMPARE( simData.waterLevelIniLocation, ReosSimulationData::Vertex );
QCOMPARE( simData.velocityIniLocation, ReosSimulationData::Vertex );
int vertexCount = 86;
QCOMPARE( simData.waterLevelIni.count(), vertexCount );
QCOMPARE( simData.waterDepthIni.count(), vertexCount );
QCOMPARE( simData.velocityIni.count(), vertexCount );

for ( int vi = 0; vi < vertexCount; ++vi )
{
QVERIFY( simData.waterLevelIni.at( vi ) <= 4 && simData.waterLevelIni.at( vi ) >= 3 );
QVERIFY( simData.waterDepthIni.at( vi ) <= 4 && simData.waterDepthIni.at( vi ) >= 3 );
QVERIFY( simData.velocityIni.at( vi ) == 0 );
}

telemacSim->setInitialCondition( ReosTelemac2DInitialCondition::Type::ConstantLevelNoVelocity );

coreModule->saveProject( projectDir.filePath( "telemac_model" ) );
QVERIFY( hydraulicStructure->runSimulation( coreModule->hydraulicNetwork()->currentScheme()->calculationContext() ) );

QVERIFY( hydraulicStructure->hasResults() );
Expand Down
40 changes: 24 additions & 16 deletions src/core/hydraulicNetwork/reoshydraulicstructure2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,9 @@ ReosHydraulicSimulation *ReosHydraulicStructure2D::simulation( ReosHydraulicSche
const ReosEncodedElement elem = scheme->restoreElementConfig( id() );

QString simulationId;
elem.getData( QStringLiteral( "current-simulation-id" ), simulationId );

if ( !elem.getData( QStringLiteral( "current-simulation-id" ), simulationId ) )
return currentSimulation();

int simIndex = simulationIndexFromId( simulationId );
if ( simIndex != -1 )
Expand Down Expand Up @@ -725,30 +727,33 @@ QString ReosHydraulicStructure2D::meshDatasetName( const QString &id ) const
return QString();
}

ReosSimulationPreparationProcess *ReosHydraulicStructure2D::getPreparationProcessSimulation( const ReosCalculationContext &context, QString &error )
ReosSimulationPreparationProcess *ReosHydraulicStructure2D::getPreparationProcessSimulation( const ReosCalculationContext &context, ReosModule::Message &message )
{
if ( mMeshNeedToBeGenerated )
{
error = tr( "The mesh need to be regenerated" );
message.type = ReosModule::Error;
message.addText( tr( "The mesh need to be regenerated" ) );
return nullptr;
}
if ( !currentSimulation() )
{
error = tr( "Current simulation not defined" );
message.type = ReosModule::Error;
message.addText( tr( "Current simulation not defined" ) );
return nullptr;
}
if ( mNetwork->projectFileName().isEmpty() )
{
error = tr( "Project must be saved at least one time." );
message.type = ReosModule::Error;
message.addText( tr( "Project must be saved at least one time." ) );
return nullptr;
}

return new ReosSimulationPreparationProcess( this, currentSimulation(), context );
return new ReosSimulationPreparationProcess( this, currentSimulation(), context, message );
}

ReosSimulationPreparationProcess *ReosHydraulicStructure2D::getPreparationProcessSimulation( const ReosCalculationContext &context, QString &error, const QDir &directory )
ReosSimulationPreparationProcess *ReosHydraulicStructure2D::getPreparationProcessSimulation( const ReosCalculationContext &context, ReosModule::Message &message, const QDir &directory )
{
std::unique_ptr<ReosSimulationPreparationProcess> ret( getPreparationProcessSimulation( context, error ) );
std::unique_ptr<ReosSimulationPreparationProcess> ret( getPreparationProcessSimulation( context, message ) );
ret->setDestination( directory );
return ret.release();
}
Expand Down Expand Up @@ -825,7 +830,7 @@ bool ReosHydraulicStructure2D::runSimulation( const ReosCalculationContext &cont
txtStream << tr( "Start running simulation for hydraulic structure \"%1\"" ).arg( elementName() ) << Qt::endl;
txtStream << QStringLiteral( "*********************************************************************************" ) << Qt::endl;

QString error;
ReosModule::Message message;

removeResults( context );
updateResults( context.schemeId() );
Expand All @@ -842,10 +847,10 @@ bool ReosHydraulicStructure2D::runSimulation( const ReosCalculationContext &cont
}

txtStream << tr( "Start preparation of simulation" ) << Qt::endl;
std::unique_ptr<ReosSimulationPreparationProcess> preparationProcess( getPreparationProcessSimulation( context, error ) );
std::unique_ptr<ReosSimulationPreparationProcess> preparationProcess( getPreparationProcessSimulation( context, message ) );
if ( !preparationProcess )
{
txtStream << tr( "Simulation did not start for following reason:\n\n%1" ).arg( error ) << Qt::endl;
txtStream << tr( "Simulation did not start for following reason:\n\n%1" ).arg( message.text ) << Qt::endl;
return false;
}
std::unique_ptr<QEventLoop> loop( new QEventLoop );
Expand All @@ -868,6 +873,7 @@ bool ReosHydraulicStructure2D::runSimulation( const ReosCalculationContext &cont

txtStream << QStringLiteral( "*********************************************************************************" ) << Qt::endl;
txtStream << tr( "Start simulation" ) << Qt::endl;
QString error;
ReosSimulationProcess *process( createSimulationProcess( effCalcContext, error ) );
if ( !process )
{
Expand Down Expand Up @@ -1211,7 +1217,7 @@ ReosMeshGeneratorProcess *ReosHydraulicStructure2D::getGenerateMeshProcess()
return process.release();
}

ReosSimulationData ReosHydraulicStructure2D::simulationData( const QString &schemeId ) const
ReosSimulationData ReosHydraulicStructure2D::simulationData( const QString &schemeId, ReosModule::Message &message ) const
{
ReosSimulationData ret;

Expand Down Expand Up @@ -1253,11 +1259,13 @@ ReosSimulationData ReosHydraulicStructure2D::simulationData( const QString &sche
{
ReosHydraulicSimulation *sim = simulation( scheme );
if ( sim )
{

}
message = sim->prepareSimulationData( ret );
}
else
{
message.type = ReosModule::Error;
message.addText( "No hydraulic scheme" );
}


return ret;
}
Expand Down
6 changes: 3 additions & 3 deletions src/core/hydraulicNetwork/reoshydraulicstructure2d.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ class REOSCORE_EXPORT ReosHydraulicStructure2D : public ReosHydraulicNetworkElem
ReosMeshGeneratorProcess *getGenerateMeshProcess();

//! Returns the data of the structure necessary for simulation
ReosSimulationData simulationData( const QString &schemeId ) const;
ReosSimulationData simulationData( const QString &schemeId, ReosModule::Message &message ) const;

//! Returns the topography collection
ReosTopographyCollection *topographyCollecion() const;
Expand Down Expand Up @@ -193,10 +193,10 @@ class REOSCORE_EXPORT ReosHydraulicStructure2D : public ReosHydraulicNetworkElem
//**************************** Calculation process related methods

//! Returns a process that prepare the current simulation, caller take ownership
ReosSimulationPreparationProcess *getPreparationProcessSimulation( const ReosCalculationContext &context, QString &error );
ReosSimulationPreparationProcess *getPreparationProcessSimulation( const ReosCalculationContext &context, ReosModule::Message &message );

//! Returns a process that prepare the current simulation files in a specific \a diectory, caller take ownership
ReosSimulationPreparationProcess *getPreparationProcessSimulation( const ReosCalculationContext &context, QString &error, const QDir &directory );
ReosSimulationPreparationProcess *getPreparationProcessSimulation( const ReosCalculationContext &context, ReosModule::Message &message, const QDir &directory );

/**
* Creates a new simulation process and returns a pointer to the process, the process is not started.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,13 +218,12 @@ void ReosSimulationEngineRegistery::loadDynamicLibrary()
}
}

ReosSimulationPreparationProcess::ReosSimulationPreparationProcess(
ReosHydraulicStructure2D *hydraulicStructure,
ReosHydraulicSimulation *simulation,
const ReosCalculationContext &context )
ReosSimulationPreparationProcess::ReosSimulationPreparationProcess( ReosHydraulicStructure2D *hydraulicStructure,
ReosHydraulicSimulation *simulation,
const ReosCalculationContext &context, ReosModule::Message &message )
: mStructure( hydraulicStructure )
, mSimulation( simulation )
, mSimulationData( hydraulicStructure->simulationData( context.schemeId() ) )
, mSimulationData( hydraulicStructure->simulationData( context.schemeId(), message ) )
, mContext( context )
, mHasMesh( mStructure->mesh()->faceCount() != 0 )
{}
Expand Down
15 changes: 12 additions & 3 deletions src/core/hydraulicNetwork/simulation/reoshydraulicsimulation.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@ struct ReosSimulationData
double defaultRoughness = 0.03;

ReosCoordinateSystemTransformer coordinateTransformer;

enum IniLocation {None, Vertex, Face};
QVector<double> waterLevelIni;
IniLocation waterLevelIniLocation = None;
QVector<double> waterDepthIni;
IniLocation waterDepthIniLocation = None;
QVector<double> velocityIni;
IniLocation velocityIniLocation = None;
};

class REOSCORE_EXPORT ReosSimulationPreparationProcess: public ReosProcess
Expand All @@ -69,7 +77,8 @@ class REOSCORE_EXPORT ReosSimulationPreparationProcess: public ReosProcess

ReosSimulationPreparationProcess( ReosHydraulicStructure2D *hydraulicStructure,
ReosHydraulicSimulation *simulation,
const ReosCalculationContext &context );
const ReosCalculationContext &context,
ReosModule::Message &message );

void setDestination( const QDir &destination );
void start() override;
Expand Down Expand Up @@ -139,7 +148,7 @@ class REOSCORE_EXPORT ReosHydraulicSimulation : public ReosDataObject SIP_ABSTRA
virtual QString key() const = 0;
virtual ReosEncodedElement encode() const = 0 SIP_SKIP;

virtual void prepareSimulationdata( ReosSimulationData &simData ) = 0 SIP_SKIP;
virtual ReosModule::Message prepareSimulationData( ReosSimulationData &simData ) = 0 SIP_SKIP;

virtual void prepareInput( const ReosSimulationData &simulationData, const ReosCalculationContext &calculationContext ) = 0 SIP_SKIP;

Expand Down Expand Up @@ -300,7 +309,7 @@ class REOSCORE_EXPORT ReosHydraulicSimulationDummy : public ReosHydraulicSimulat
virtual QString key() const override {return QStringLiteral( "dummy-simulation" );}
virtual ReosEncodedElement encode() const override {return ReosEncodedElement();};

void prepareSimulationdata( ReosSimulationData & ) override {}
ReosModule::Message prepareSimulationData( ReosSimulationData & ) override {return ReosModule::Message();}

virtual void prepareInput( const ReosSimulationData &, const ReosCalculationContext & ) override {};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -422,18 +422,18 @@ void ReosHydraulicStructure2DProperties::onLaunchCalculation()
return;
}

QString error;

mStructure2D->removeResults( mCalculationContext );
mStructure2D->updateResults( mCalculationContext.schemeId() );

ReosHydraulicScheme *scheme = mStructure2D->network()->scheme( mCalculationContext.schemeId() );
mStructure2D->currentSimulation()->saveConfiguration( scheme );

std::unique_ptr<ReosSimulationPreparationProcess> preparationProcess( mStructure2D->getPreparationProcessSimulation( mCalculationContext, error ) );
ReosModule::Message message;
std::unique_ptr<ReosSimulationPreparationProcess> preparationProcess( mStructure2D->getPreparationProcessSimulation( mCalculationContext, message ) );
if ( !preparationProcess )
{
QMessageBox::warning( this, tr( "Run Simulation" ), tr( "Simulation did not start for following reason:\n\n%1" ).arg( error ) );
QMessageBox::warning( this, tr( "Run Simulation" ), tr( "Simulation did not start for following reason:\n\n%1" ).arg( message.text ) );
return;
}

Expand All @@ -447,7 +447,7 @@ void ReosHydraulicStructure2DProperties::onLaunchCalculation()
}

mCalculationContext = preparationProcess->calculationContext();

QString error;
process = mStructure2D->createSimulationProcess( mCalculationContext, error );
if ( process )
setCurrentSimulationProcess( process, mCalculationContext );
Expand All @@ -474,11 +474,11 @@ void ReosHydraulicStructure2DProperties::onExportSimulation()

const QDir dir( dirPath );

QString error;
std::unique_ptr<ReosProcess> preparationProcess( mStructure2D->getPreparationProcessSimulation( mCalculationContext, error, dir ) );
ReosModule::Message message;
std::unique_ptr<ReosProcess> preparationProcess( mStructure2D->getPreparationProcessSimulation( mCalculationContext, message, dir ) );
if ( !preparationProcess )
{
QMessageBox::warning( this, tr( "Export Simulation" ), tr( "Simulation can't be exported for following reason:\n\n%1" ).arg( error ) );
QMessageBox::warning( this, tr( "Export Simulation" ), tr( "Simulation can't be exported for following reason:\n\n%1" ).arg( message.text ) );
return;
}
ReosProcessControler *controler = new ReosProcessControler( preparationProcess.get(), this );
Expand Down
2 changes: 1 addition & 1 deletion src/simulationEngines/hecras/reoshecrassimulation.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class ReosHecRasSimulation : public ReosHydraulicSimulation

QString key() const override;

void prepareSimulationdata( ReosSimulationData &simData ) override {}
ReosModule::Message prepareSimulationData( ReosSimulationData &simData ) override {return ReosModule::Message();}

void prepareInput( const ReosSimulationData &data, const ReosCalculationContext &calculationContext ) override;
void prepareInput( const ReosSimulationData &, const ReosCalculationContext &, const QDir & ) override {}
Expand Down
Loading

0 comments on commit 3667875

Please sign in to comment.