Skip to content
Snippets Groups Projects
Commit 3f96e465 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Create VariationalSchemeModule

parent ab5b3659
No related branches found
No related tags found
No related merge requests found
...@@ -14,6 +14,7 @@ add_library( ...@@ -14,6 +14,7 @@ add_library(
SchemeModule.cpp SchemeModule.cpp
SocketModule.cpp SocketModule.cpp
UnaryOperatorRegisterForVh.cpp UnaryOperatorRegisterForVh.cpp
VariationalSchemeModule.cpp
WriterModule.cpp WriterModule.cpp
) )
......
...@@ -49,13 +49,8 @@ ...@@ -49,13 +49,8 @@
#include <scheme/InflowListBoundaryConditionDescriptor.hpp> #include <scheme/InflowListBoundaryConditionDescriptor.hpp>
#include <scheme/NeumannBoundaryConditionDescriptor.hpp> #include <scheme/NeumannBoundaryConditionDescriptor.hpp>
#include <scheme/OutflowBoundaryConditionDescriptor.hpp> #include <scheme/OutflowBoundaryConditionDescriptor.hpp>
#include <scheme/P1P0AnalyticVariationalSolver.hpp>
#include <scheme/P1P0VariationalSolver.hpp>
#include <scheme/SymmetryBoundaryConditionDescriptor.hpp> #include <scheme/SymmetryBoundaryConditionDescriptor.hpp>
#include <scheme/VariableBCDescriptor.hpp> #include <scheme/VariableBCDescriptor.hpp>
#include <scheme/VariationalSolver.hpp>
#include <scheme/VariationalSolverDevelopedReconstruction.hpp>
#include <scheme/VariationalSolverO1.hpp>
#include <scheme/WallBoundaryConditionDescriptor.hpp> #include <scheme/WallBoundaryConditionDescriptor.hpp>
#include <utils/Socket.hpp> #include <utils/Socket.hpp>
...@@ -529,215 +524,6 @@ SchemeModule::SchemeModule() ...@@ -529,215 +524,6 @@ SchemeModule::SchemeModule()
)); ));
this->_addBuiltinFunction("variational_solver",
std::function(
[](const size_t& degree, const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverHandler{getCommonMesh({rho, u, E, c, a})}
.solver()
.apply(degree, dt, VariationalSolverHandler::VelocityBCTreatment::elimination, rho, u,
E, c, a, bc_descriptor_list, {});
}
));
this->_addBuiltinFunction("variational_solver_with_source",
std::function(
[](const size_t& degree, const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt, const FunctionSymbolId& function_id)
-> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverHandler{getCommonMesh({rho, u, E, c, a})}
.solver()
.apply(degree, dt, VariationalSolverHandler::VelocityBCTreatment::elimination, rho, u,
E, c, a, bc_descriptor_list, function_id);
}
));
this->_addBuiltinFunction("variational_solver_dr",
std::function(
[](const size_t& degree, const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverDevelopedReconstructionHandler{getCommonMesh({rho, u, E, c, a})}
.solver()
.apply(degree, dt,
VariationalSolverDevelopedReconstructionHandler::VelocityBCTreatment::
elimination,
rho, u, E, c, a, bc_descriptor_list, {});
}
));
this->_addBuiltinFunction("variational_solver_dr_with_source",
std::function(
[](const size_t& degree, const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt, const FunctionSymbolId& function_id)
-> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverDevelopedReconstructionHandler{getCommonMesh({rho, u, E, c, a})}
.solver()
.apply(degree, dt,
VariationalSolverDevelopedReconstructionHandler::VelocityBCTreatment::
elimination,
rho, u, E, c, a, bc_descriptor_list, function_id);
}
));
this->_addBuiltinFunction("variational_solver_o1",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::shared_ptr<const DiscreteFunctionVariant>& p,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverO1Handler{getCommonMesh({rho, u, E, c, a, p})}
.solver()
.apply(dt, VariationalSolverO1Handler::VelocityBCTreatment::elimination, rho, u, E, c,
a, p, bc_descriptor_list);
}
));
this->_addBuiltinFunction("penalized_variational_solver",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::shared_ptr<const DiscreteFunctionVariant>& p,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverO1Handler{getCommonMesh({rho, u, E, c, a, p})}
.solver()
.apply(dt, VariationalSolverO1Handler::VelocityBCTreatment::penalty, rho, u, E, c, a,
p, bc_descriptor_list);
}
));
this->_addBuiltinFunction("p1_p0_analytic_variational_solver",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::shared_ptr<const DiscreteFunctionVariant>& p,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return P1P0AnalyticVariationalSolverHandler{getCommonMesh({rho, u, E, c, a, p})}
.solver()
.apply(dt, P1P0AnalyticVariationalSolverHandler::VelocityBCTreatment::elimination,
rho, u, E, c, a, p, bc_descriptor_list);
}
));
this->_addBuiltinFunction("p1_p0_variational_solver",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::shared_ptr<const DiscreteFunctionVariant>& p,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return P1P0VariationalSolverHandler{getCommonMesh({rho, u, E, c, a, p})}
.solver()
.apply(dt, P1P0VariationalSolverHandler::VelocityBCTreatment::elimination, rho, u, E,
c, a, p, bc_descriptor_list);
}
));
this->_addBuiltinFunction("p1_p0_analytic_penalized_variational_solver",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::shared_ptr<const DiscreteFunctionVariant>& p,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return P1P0AnalyticVariationalSolverHandler{getCommonMesh({rho, u, E, c, a, p})}
.solver()
.apply(dt, P1P0AnalyticVariationalSolverHandler::VelocityBCTreatment::penalty, rho, u,
E, c, a, p, bc_descriptor_list);
}
));
this->_addBuiltinFunction("apply_acoustic_fluxes", this->_addBuiltinFunction("apply_acoustic_fluxes",
std::function( std::function(
...@@ -885,15 +671,6 @@ SchemeModule::SchemeModule() ...@@ -885,15 +671,6 @@ SchemeModule::SchemeModule()
)); ));
this->_addBuiltinFunction("variational_acoustic_dt",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& c) -> double {
return variational_acoustic_dt(c);
}
));
this->_addBuiltinFunction("cell_volume", this->_addBuiltinFunction("cell_volume",
std::function( std::function(
......
#include <language/modules/VariationalSchemeModule.hpp>
#include <language/modules/MeshModuleTypes.hpp>
#include <language/modules/ModuleRepository.hpp>
#include <language/modules/SchemeModuleTypes.hpp>
#include <language/utils/BuiltinFunctionEmbedder.hpp>
#include <language/utils/TypeDescriptor.hpp>
#include <scheme/DiscreteFunctionUtils.hpp>
#include <scheme/P1P0AnalyticVariationalSolver.hpp>
#include <scheme/P1P0VariationalSolver.hpp>
#include <scheme/VariationalSolver.hpp>
#include <scheme/VariationalSolverDevelopedReconstruction.hpp>
#include <scheme/VariationalSolverO1.hpp>
#include <scheme/WallBoundaryConditionDescriptor.hpp>
#include <memory>
VariationalSchemeModule::VariationalSchemeModule()
{
this->_addBuiltinFunction("variational_solver",
std::function(
[](const size_t& degree, const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverHandler{getCommonMesh({rho, u, E, c, a})}
.solver()
.apply(degree, dt, VariationalSolverHandler::VelocityBCTreatment::elimination, rho, u,
E, c, a, bc_descriptor_list, {});
}
));
this->_addBuiltinFunction("variational_solver_with_source",
std::function(
[](const size_t& degree, const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt, const FunctionSymbolId& function_id)
-> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverHandler{getCommonMesh({rho, u, E, c, a})}
.solver()
.apply(degree, dt, VariationalSolverHandler::VelocityBCTreatment::elimination, rho, u,
E, c, a, bc_descriptor_list, function_id);
}
));
this->_addBuiltinFunction("variational_solver_dr",
std::function(
[](const size_t& degree, const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverDevelopedReconstructionHandler{getCommonMesh({rho, u, E, c, a})}
.solver()
.apply(degree, dt,
VariationalSolverDevelopedReconstructionHandler::VelocityBCTreatment::
elimination,
rho, u, E, c, a, bc_descriptor_list, {});
}
));
this->_addBuiltinFunction("variational_solver_dr_with_source",
std::function(
[](const size_t& degree, const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt, const FunctionSymbolId& function_id)
-> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverDevelopedReconstructionHandler{getCommonMesh({rho, u, E, c, a})}
.solver()
.apply(degree, dt,
VariationalSolverDevelopedReconstructionHandler::VelocityBCTreatment::
elimination,
rho, u, E, c, a, bc_descriptor_list, function_id);
}
));
this->_addBuiltinFunction("variational_solver_o1",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::shared_ptr<const DiscreteFunctionVariant>& p,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverO1Handler{getCommonMesh({rho, u, E, c, a, p})}
.solver()
.apply(dt, VariationalSolverO1Handler::VelocityBCTreatment::elimination, rho, u, E, c,
a, p, bc_descriptor_list);
}
));
this->_addBuiltinFunction("penalized_variational_solver",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::shared_ptr<const DiscreteFunctionVariant>& p,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return VariationalSolverO1Handler{getCommonMesh({rho, u, E, c, a, p})}
.solver()
.apply(dt, VariationalSolverO1Handler::VelocityBCTreatment::penalty, rho, u, E, c, a,
p, bc_descriptor_list);
}
));
this->_addBuiltinFunction("p1_p0_analytic_variational_solver",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::shared_ptr<const DiscreteFunctionVariant>& p,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return P1P0AnalyticVariationalSolverHandler{getCommonMesh({rho, u, E, c, a, p})}
.solver()
.apply(dt, P1P0AnalyticVariationalSolverHandler::VelocityBCTreatment::elimination,
rho, u, E, c, a, p, bc_descriptor_list);
}
));
this->_addBuiltinFunction("p1_p0_variational_solver",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::shared_ptr<const DiscreteFunctionVariant>& p,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return P1P0VariationalSolverHandler{getCommonMesh({rho, u, E, c, a, p})}
.solver()
.apply(dt, P1P0VariationalSolverHandler::VelocityBCTreatment::elimination, rho, u, E,
c, a, p, bc_descriptor_list);
}
));
this->_addBuiltinFunction("p1_p0_analytic_penalized_variational_solver",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& rho,
const std::shared_ptr<const DiscreteFunctionVariant>& u,
const std::shared_ptr<const DiscreteFunctionVariant>& E,
const std::shared_ptr<const DiscreteFunctionVariant>& c,
const std::shared_ptr<const DiscreteFunctionVariant>& a,
const std::shared_ptr<const DiscreteFunctionVariant>& p,
const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
bc_descriptor_list,
const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>,
std::shared_ptr<const DiscreteFunctionVariant>> {
return P1P0AnalyticVariationalSolverHandler{getCommonMesh({rho, u, E, c, a, p})}
.solver()
.apply(dt, P1P0AnalyticVariationalSolverHandler::VelocityBCTreatment::penalty, rho, u,
E, c, a, p, bc_descriptor_list);
}
));
this->_addBuiltinFunction("variational_acoustic_dt",
std::function(
[](const std::shared_ptr<const DiscreteFunctionVariant>& c) -> double {
return variational_acoustic_dt(c);
}
));
}
void
VariationalSchemeModule::registerOperators() const
{}
void
VariationalSchemeModule::registerCheckpointResume() const
{}
ModuleRepository::Subscribe<VariationalSchemeModule> variational_scheme_module;
#ifndef VARIATIONAL_SCHEME_MODULE_HPP
#define VARIATIONAL_SCHEME_MODULE_HPP
#include <language/modules/BuiltinModule.hpp>
class VariationalSchemeModule : public BuiltinModule
{
public:
std::string_view
name() const final
{
return "variational_scheme";
}
void registerOperators() const final;
void registerCheckpointResume() const final;
VariationalSchemeModule();
~VariationalSchemeModule() = default;
};
#endif // VARIATIONAL_SCHEME_MODULE_HPP
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment