31#include "../../../Common/include/CConfig.hpp"
32#include "../../../Common/include/containers/CPyWrapperMatrixView.hpp"
33#include "../numerics/CNumerics.hpp"
34#include "../output/COutput.hpp"
35#include "../solvers/CSolver.hpp"
134 const std::string& marker_monitoring)
const {
148 const std::string& marker_analyze)
const {
245 "MarkerInitialCoordinates",
true);
263 "MarkerCoordinates",
false);
344 unsigned long GetMarkerNode(
unsigned short iMarker,
unsigned long iVertex)
const;
354 bool normalize =
false)
const;
443 return CPyWrapperMatrixView(solver->GetNodes()->GetSolution(),
"Solution of " + solver->GetSolverName(),
false);
451 return CPyWrapper3DMatrixView(solver->GetNodes()->GetGradient(),
"Gradient of " + solver->GetSolverName(),
false);
460 solver->GetNodes()->GetUserDefinedSource(),
"User Defined Source of " + solver->GetSolverName(),
false);
470 "MarkerSolution of " + solver->GetSolverName(),
false);
479 solver->GetNodes()->GetSolution_time_n(),
"SolutionTimeN of " + solver->GetSolverName(),
false);
489 "MarkerSolutionTimeN of " + solver->GetSolverName(),
false);
498 solver->GetNodes()->GetSolution_time_n1(),
"SolutionTimeN1 of " + solver->GetSolverName(),
false);
508 "MarkerSolutionTimeN1 of " + solver->GetSolverName(),
false);
542 auto& sensitivity =
const_cast<su2activematrix&
>(solver->GetNodes()->GetSensitivity());
575 inline void SetMarkerCustomScalar(
unsigned short iMarker,
unsigned long iVertex, vector<passivedouble> WallScalar) {
620 std::array<su2double, 3> load{};
623 solver->GetNodes()->Set_FlowTraction(iPoint, load.data());
633 inline vector<passivedouble>
GetMarkerFlowLoad(
unsigned short iMarker,
unsigned long iVertex)
const {
639 FlowLoad[iDim] =
SU2_TYPE::GetValue(solver->GetVertexTractions(iMarker, iVertex, iDim));
653 vector<passivedouble> adjointLoad) {
656 solver->StoreVertexTractionsAdjoint(iMarker, iVertex, iDim, adjointLoad[iDim]);
672 vector<passivedouble> sens(
nDim, 0.0);
673 for (
auto iDim = 0u; iDim <
nDim; ++iDim) {
691 vector<passivedouble> sens(
nDim, 0.0);
692 for (
auto iDim = 0u; iDim <
nDim; ++iDim) {
706 vector<passivedouble> adjointDisplacement) {
723 vector<passivedouble> adjointVelocity) {
761 solver->SetInletFlowDir(iMarker, iVertex, iDim, values[iDim]);
772 unsigned short iMarker = std::numeric_limits<unsigned short>::max())
const {
773 if (iMarker < std::numeric_limits<unsigned short>::max() && iMarker >
GetNumberMarkers()) {
A templated matrix/vector-like object.
Definition C2DContainer.hpp:374
static void Error(const std::string &ErrorMsg, const std::string &FunctionName)
Definition mpi_structure.cpp:131
Main class for defining the problem; basically this class reads the configuration file,...
Definition CConfig.hpp:64
bool GetSolid_Wall(unsigned short iMarker) const
Determines whether a marker with index iMarker is a solid boundary.
Definition CConfig.cpp:8630
unsigned short GetnMarker_Analyze(void) const
Get the total number of moving markers.
Definition CConfig.hpp:3303
string GetMarker_Monitoring_TagBound(unsigned short val_marker) const
Get the name of the surface defined in the geometry file.
Definition CConfig.hpp:3521
string GetMarker_Analyze_TagBound(unsigned short val_marker) const
Get the name of the surface defined in the geometry file.
Definition CConfig.hpp:7288
unsigned short GetnMarker_Monitoring(void) const
Get the total number of monitoring markers.
Definition CConfig.hpp:3267
bool GetDeform_Mesh(void) const
Get information about whether the mesh will be deformed using pseudo linear elasticity.
Definition CConfig.hpp:4599
Base class for all drivers.
Definition CDriverBase.hpp:43
CSolver ***** solver_container
Container vector with all the solutions.
Definition CDriverBase.hpp:71
void InputPreprocessing(CConfig **&config, CConfig *&driver_config)
Read in the config and mesh files.
virtual ~CDriverBase(void)
Destructor of the class.
CNumerics ****** numerics_container
Description of the numerical method (the way in which the equations are solved).
Definition CDriverBase.hpp:72
CConfig ** config_container
Definition of the particular problem.
Definition CDriverBase.hpp:68
char * config_file_name
Configuration file name of the problem.
Definition CDriverBase.hpp:47
su2double UsedTime
Elapsed time between Start and Stop point of the timer.
Definition CDriverBase.hpp:54
virtual void Run()
A virtual member.
Definition CDriverBase.hpp:97
COutput * driver_output
Definition of the driver output.
Definition CDriverBase.hpp:66
CConfig * driver_config
Definition of the driver configuration.
Definition CDriverBase.hpp:65
su2double UsedTimeCompute
Elapsed time between Start and Stop point of the timer for tracking compute phase.
Definition CDriverBase.hpp:53
CVolumetricMovement *** grid_movement
Volume grid movement classes of the problem.
Definition CDriverBase.hpp:75
CSurfaceMovement ** surface_movement
Surface movement classes of the problem.
Definition CDriverBase.hpp:74
virtual void Finalize()
A virtual member.
Definition CDriverBase.hpp:102
void InitializeContainers()
Initialize containers.
Definition CDriverBase.cpp:67
unsigned short iMesh
Iterator on mesh levels.
Definition CDriverBase.hpp:58
unsigned short nZone
Total number of zones in the problem.
Definition CDriverBase.hpp:60
CGeometry * main_geometry
Reference to base (i.e. ZONE, INST, MESH 0) geometry (used in driver API).
Definition CDriverBase.hpp:78
unsigned short nDim
Number of dimensions.
Definition CDriverBase.hpp:61
su2double UsedTimePreproc
Elapsed time between Start and Stop point of the timer for tracking preprocessing phase.
Definition CDriverBase.hpp:52
unsigned long TimeIter
Definition CDriverBase.hpp:56
unsigned short selected_zone
Selected zone for the driver. Defaults to ZONE_0.
Definition CDriverBase.hpp:57
int size
MPI Size.
Definition CDriverBase.hpp:46
int rank
MPI Rank.
Definition CDriverBase.hpp:45
CSolver * GetSolverAndCheckMarker(unsigned short iSolver, unsigned short iMarker=std::numeric_limits< unsigned short >::max()) const
Automates some boilerplate of accessing solution fields for the python wrapper.
Definition CDriverBase.hpp:771
void InitializeSolver(CConfig *config, CGeometry **geometry, CSolver ***&solver)
Definition and allocation of all solution classes.
void OutputPreprocessing(CConfig **config, CConfig *driver_config, COutput **&output_container, COutput *&driver_output)
Preprocess the output container.
su2double StopTime
Stop point of the timer for performance benchmarking.
Definition CDriverBase.hpp:50
void InitializeNumerics(CConfig *config, CGeometry **geometry, CSolver ***solver, CNumerics ****&numerics) const
Definition and allocation of all solver classes.
unsigned short * nInst
Total number of instances in the problem (per zone).
Definition CDriverBase.hpp:63
su2double StartTime
Start point of the timer for performance benchmarking.
Definition CDriverBase.hpp:49
void CommonFinalize()
Delete containers.
Definition CDriverBase.cpp:87
unsigned short iInst
Iterator on instance levels.
Definition CDriverBase.hpp:62
CConfig * main_config
Reference to base (i.e. ZONE 0) configuration (used in driver API).
Definition CDriverBase.hpp:77
void InitializeGeometry(CConfig *config, CGeometry **&geometry, bool dummy)
Construction of the edge-based data structure and the multi-grid structure.
CGeometry **** geometry_container
Geometrical definition of the problem.
Definition CDriverBase.hpp:70
unsigned short iZone
Iterator on zones.
Definition CDriverBase.hpp:59
COutput ** output_container
Pointer to the COutput class.
Definition CDriverBase.hpp:69
Parent class for defining the geometry of the problem (complete geometry, multigrid agglomerated geom...
Definition CGeometry.hpp:75
unsigned long GetnVertex(unsigned short val_marker) const
Get number of vertices.
Definition CGeometry.hpp:637
void SetCustomBoundaryTemperature(unsigned short val_marker, unsigned long val_vertex, su2double val_customBoundaryTemperature)
Set the value of the customized temperature at a specified vertex on a specified marker.
Definition CGeometry.hpp:1749
void SetCustomBoundaryHeatFlux(unsigned short val_marker, unsigned long val_vertex, su2double val_customBoundaryHeatFlux)
Set the value of the customized normal heat flux at a specified vertex on a specified marker.
Definition CGeometry.hpp:1769
CPoint * nodes
Node vector (dual grid information).
Definition CGeometry.hpp:253
CVertex *** vertex
Boundary Vertex vector (dual grid information).
Definition CGeometry.hpp:255
Class for defining the numerical methods.
Definition CNumerics.hpp:48
Class for writing the convergence history and to write solution data to file.
Definition COutput.hpp:68
const vector< string > & GetHistoryOutputList() const
Get the list of all output fields.
Definition COutput.hpp:554
const vector< string > & GetHistoryOutputPerSurfaceList() const
Get the list of all per-surface fields.
Definition COutput.hpp:562
su2double GetCoord(unsigned long iPoint, unsigned long iDim) const
Get the coordinates dor the control volume.
Definition CPoint.hpp:158
This class wraps C3DDoubleMatrix for the python wrapper matrix interface. It is generaly used to wrap...
Definition CPyWrapperMatrixView.hpp:176
This class wraps su2activematrix for the python wrapper matrix interface restricting it to the vertic...
Definition CPyWrapperMatrixView.hpp:125
This class wraps su2activematrix for the python wrapper matrix interface. It is generaly used to wrap...
Definition CPyWrapperMatrixView.hpp:85
Definition CSolver.hpp:71
virtual void SetCustomBoundaryScalar(unsigned short val_marker, unsigned long val_vertex, vector< passivedouble > val_customBoundaryScalar)
Set the value of the customized normal scalar values/flux at a specified vertex on a specified marker...
Definition CSolver.hpp:2942
virtual void SetInletPtotal(unsigned short val_marker, unsigned long val_vertex, su2double val_ptotal)
A virtual member.
Definition CSolver.hpp:2962
CVariable * GetNodes()
Allow outside access to the nodes of the solver, containing conservatives, primitives,...
Definition CSolver.hpp:229
virtual void SetInletTtotal(unsigned short val_marker, unsigned long val_vertex, su2double val_ttotal)
A virtual member.
Definition CSolver.hpp:2952
Class for moving the surface numerical grid.
Definition CSurfaceMovement.hpp:38
virtual void SetSourceTerm_VelAdjoint(unsigned long iPoint, unsigned long iDim, su2double val)
Definition CVariable.hpp:2361
virtual void SetBound_Disp(unsigned long iPoint, const su2double *val_BoundDisp)
A virtual member. Set the boundary displacement.
Definition CVariable.hpp:2149
virtual void SetSourceTerm_DispAdjoint(unsigned long iPoint, unsigned long iDim, su2double val)
Set the source term applied into the displacement adjoint coming from external solvers.
Definition CVariable.hpp:2360
virtual void SetBound_Vel(unsigned long iPoint, const su2double *val_BoundVel)
A virtual member. Set the boundary velocity.
Definition CVariable.hpp:2155
virtual su2double GetMesh_Coord(unsigned long iPoint, unsigned long iDim) const
A virtual member. Get the value of the undeformed coordinates.
Definition CVariable.hpp:2090
Class for moving the volumetric numerical grid.
Definition CVolumetricMovement.hpp:37
double passivedouble
Definition code_config.hpp:129
passivedouble su2double
Definition code_config.hpp:181
void SetMarkerCustomScalar(unsigned short iMarker, unsigned long iVertex, vector< passivedouble > WallScalar)
Set the wall normal scalar values at a vertex on a specified marker (MARKER_PYTHON_CUSTOM).
Definition CDriverBase.hpp:575
CPyWrapperMatrixView Sensitivity(unsigned short iSolver)
Get a read-only view of the geometry sensitivity of a discrete adjoint solver.
Definition CDriverBase.hpp:540
vector< passivedouble > GetMarkerDisplacement(unsigned short iMarker, unsigned long iVertex) const
Get the displacements currently imposed of a marker vertex.
Definition CDriverBase.hpp:362
vector< string > GetOutputNames() const
Get the list of available outputs.
Definition CDriverBase.hpp:111
unsigned long GetNumberMarkerElements(unsigned short iMarker) const
Get the number of elements in the marker.
Definition CDriverBase.cpp:337
void SetMarkerCustomFEALoad(unsigned short iMarker, unsigned long iVertex, std::vector< passivedouble > force)
Sets the nodal force for the structural solver at a vertex of a marker.
Definition CDriverBase.hpp:618
void SetMarkerCustomInletFlowDirection(unsigned short iMarker, unsigned long iVertex, std::vector< passivedouble > values)
Set the flow direction vector (does not need to be a unit vector).
Definition CDriverBase.hpp:758
vector< unsigned long > GetMarkerElementNodes(unsigned short iMarker, unsigned long iElem) const
Get the node indices of a marker element.
Definition CDriverBase.cpp:351
vector< string > GetInletMarkerTags() const
Get all the inlet boundary marker tags.
Definition CDriverBase.cpp:322
void CommunicateMeshDisplacements(void)
Communicate the boundary mesh displacements.
Definition CDriverBase.cpp:394
unsigned long GetElementGlobalIndex(unsigned long iElem) const
Get the global index of a mesh element.
Definition CDriverBase.cpp:169
void SetMarkerCustomTemperature(unsigned short iMarker, unsigned long iVertex, passivedouble WallTemp)
Set the temperature of a vertex on a specified marker (MARKER_PYTHON_CUSTOM).
Definition CDriverBase.hpp:553
unsigned long GetMarkerNode(unsigned short iMarker, unsigned long iVertex) const
Get the node index of a marker.
Definition CDriverBase.cpp:371
vector< passivedouble > GetMarkerDisplacementSensitivity(unsigned short iMarker, unsigned long iVertex) const
Get the sensitivities of the displacements of the mesh boundary vertices.
Definition CDriverBase.hpp:667
unsigned short GetNumberMarkers() const
Get the number of markers in the mesh.
Definition CDriverBase.cpp:209
CPyWrapperMarkerMatrixView MarkerCoordinates(unsigned short iMarker)
Get a read/write view of the current coordinates of the mesh nodes of a marker.
Definition CDriverBase.hpp:259
map< string, unsigned short > GetMarkerIndices() const
Get all the boundary markers tags with their associated indices.
Definition CDriverBase.cpp:211
CPyWrapperMarkerMatrixView MarkerSolutionTimeN(unsigned short iSolver, unsigned short iMarker)
Get a read/write view of the solution at time N on the mesh nodes of a marker.
Definition CDriverBase.hpp:485
map< string, unsigned short > GetFEASolutionIndices() const
Get the structural solver solution variable names with their associated indices. These correspond to ...
Definition CDriverBase.cpp:411
vector< passivedouble > GetMarkerFlowLoad(unsigned short iMarker, unsigned long iVertex) const
Get the fluid force at a vertex of a solid wall marker of the flow solver.
Definition CDriverBase.hpp:633
passivedouble GetMarkerAnalyzeOutputValue(const std::string &output_name, const std::string &marker_analyze) const
Get the value of one of the available surface outputs at a given MARKER_ANALYZE.
Definition CDriverBase.hpp:147
unsigned short SelectedZone() const
Returns the index of the zone selected for python driver operations.
Definition CDriverBase.hpp:594
void SetMarkerCustomNormalHeatFlux(unsigned short iMarker, unsigned long iVertex, passivedouble WallHeatFlux)
Set the wall normal heat flux at a vertex on a specified marker (MARKER_PYTHON_CUSTOM).
Definition CDriverBase.hpp:564
CPyWrapperMatrixView Solution(unsigned short iSolver)
Get a read/write view of the current solution on all mesh nodes of a solver.
Definition CDriverBase.hpp:441
unsigned long GetNumberNodes() const
Get the number of nodes in the mesh (including halos).
Definition CDriverBase.cpp:189
void SetMarkerCustomFlowLoadAdjoint(unsigned short iMarker, unsigned long iVertex, vector< passivedouble > adjointLoad)
Set the adjoint of the flow tractions of the flow solver.
Definition CDriverBase.hpp:652
map< string, unsigned short > GetPrimitiveIndices() const
Get the flow solver primitive variable names with their associated indices. These correspond to the c...
Definition CDriverBase.cpp:432
CPyWrapperMatrixView Coordinates()
Get a read/write view of the current coordinates of all mesh nodes.
Definition CDriverBase.hpp:251
CPyWrapperMatrixView SolutionTimeN1(unsigned short iSolver)
Get a read/write view of the solution at time N-1 on all mesh nodes of a solver.
Definition CDriverBase.hpp:495
unsigned long GetNumberElements() const
Get the number of elements in the mesh.
Definition CDriverBase.cpp:167
void SelectZone(unsigned short iZone)
Selects zone to be used for python driver operations.
Definition CDriverBase.hpp:584
void SetMarkerCustomFEAVelocityAdjoint(unsigned short iMarker, unsigned long iVertex, vector< passivedouble > adjointVelocity)
Set the adjoint of the structural velocities.
Definition CDriverBase.hpp:722
vector< passivedouble > GetMarkerMeshVelocity(unsigned short iMarker, unsigned long iVertex) const
Get the mesh velocities currently imposed on a marker vertex.
Definition CDriverBase.hpp:395
CPyWrapper3DMatrixView Gradient(unsigned short iSolver)
Get read/write view of the gradients of a solver variable in a point.
Definition CDriverBase.hpp:449
vector< string > GetCHTMarkerTags() const
Get all the CHT boundary marker tags.
Definition CDriverBase.cpp:307
passivedouble GetMarkerNormalHeatFlux(unsigned short iSolver, unsigned short iMarker, unsigned long iVertex) const
Get the wall normal heat flux at a vertex on a specified marker of the flow or heat solver.
Definition CDriverBase.hpp:604
CPyWrapperMarkerMatrixView MarkerSolutionTimeN1(unsigned short iSolver, unsigned short iMarker)
Get a read/write view of the solution at time N-1 on the mesh nodes of a marker.
Definition CDriverBase.hpp:504
void SetMarkerCustomFEADisplacementAdjoint(unsigned short iMarker, unsigned long iVertex, vector< passivedouble > adjointDisplacement)
Set the adjoint of the structural displacements.
Definition CDriverBase.hpp:705
unsigned long GetNumberMarkerNodes(unsigned short iMarker) const
Get the number of nodes in the marker.
Definition CDriverBase.cpp:364
void SetMarkerCustomInletFlowVar1(unsigned short iMarker, unsigned long iVertex, passivedouble value)
Set the second variable in MARKER_INLET (usually total pressure).
Definition CDriverBase.hpp:748
unsigned long GetNumberDimensions() const
Get the number of dimensions of the mesh.
Definition CDriverBase.cpp:165
bool GetNodeDomain(unsigned long iPoint) const
Get the halo flag of a mesh node.
Definition CDriverBase.cpp:202
CPyWrapperMatrixView SolutionTimeN(unsigned short iSolver)
Get a read/write view of the solution at time N on all mesh nodes of a solver.
Definition CDriverBase.hpp:476
CPyWrapperMarkerMatrixView MarkerSolution(unsigned short iSolver, unsigned short iMarker)
Get a read/write view of the current solution on the mesh nodes of a marker.
Definition CDriverBase.hpp:466
vector< string > GetMarkerTags() const
Get all the boundary marker tags.
Definition CDriverBase.cpp:287
map< string, string > GetMarkerTypes() const
Get all the boundary markers tags with their associated types.
Definition CDriverBase.cpp:221
unsigned long GetNodeGlobalIndex(unsigned long iPoint) const
Get the global node index.
Definition CDriverBase.cpp:195
void SetMarkerCustomInletFlowVar0(unsigned short iMarker, unsigned long iVertex, passivedouble value)
Set the first variable in MARKER_INLET (usually temperature).
Definition CDriverBase.hpp:738
vector< string > GetMarkerOutputNames() const
Get the list of available surface outputs on both MARKER_MONITORING and MARKER_ANALYZE.
Definition CDriverBase.hpp:125
vector< string > GetDeformableMarkerTags() const
Get all the deformable boundary marker tags.
Definition CDriverBase.cpp:297
vector< unsigned long > GetElementNodes(unsigned long iElem) const
Get the node indices of a mesh element.
Definition CDriverBase.cpp:176
void SetMarkerCustomDisplacement(unsigned short iMarker, unsigned long iVertex, vector< passivedouble > values)
Set the mesh displacements of a marker vertex.
Definition CDriverBase.hpp:380
CPyWrapperMarkerMatrixView MarkerInitialCoordinates(unsigned short iMarker) const
Get a read-only view of the initial (undeformed) coordinates of the mesh nodes of a marker.
Definition CDriverBase.hpp:236
CPyWrapperMarkerMatrixView MarkerPrimitives(unsigned short iMarker)
Get a read/write view of the current primitive variables on the mesh nodes of a marker.
Definition CDriverBase.hpp:530
unsigned short GetNumberDesignVariables() const
Get the number of design variables.
Definition CDriverBase.cpp:161
CPyWrapperMatrixView Primitives()
Get a read/write view of the current primitive variables on all mesh nodes of the flow solver.
Definition CDriverBase.hpp:521
map< string, unsigned short > GetSolverIndices() const
Get all the active solver names with their associated indices (which can be used to access their data...
Definition CDriverBase.cpp:399
CPyWrapperMatrixView UserDefinedSource(unsigned short iSolver)
Get a read/write view of the user defined source on all mesh nodes of a solver.
Definition CDriverBase.hpp:457
vector< passivedouble > GetMarkerFEALoadSensitivity(unsigned short iMarker, unsigned long iVertex) const
Get the sensitivity of the FEA loads of the structural solver (via the adjoint structural solver).
Definition CDriverBase.hpp:686
passivedouble GetOutputValue(const std::string &output_name) const
Get the value of one of the available history outputs.
Definition CDriverBase.hpp:117
CPyWrapperMatrixView InitialCoordinates() const
Get a read-only view of the initial (undeformed) coordinates of all mesh nodes.
Definition CDriverBase.hpp:224
passivedouble GetMarkerMonitoringOutputValue(const std::string &output_name, const std::string &marker_monitoring) const
Get the value of one of the available surface outputs at a given MARKER_MONITORING.
Definition CDriverBase.hpp:133
unsigned long GetNumberHaloNodes() const
Get the number of halo nodes in the mesh.
Definition CDriverBase.cpp:191
vector< passivedouble > GetMarkerVertexNormals(unsigned short iMarker, unsigned long iVertex, bool normalize=false) const
Get the normal vector of a marker vertex.
Definition CDriverBase.cpp:378
void SetMarkerCustomMeshVelocity(unsigned short iMarker, unsigned long iVertex, vector< passivedouble > values)
Set the velocities of a marker vertex.
Definition CDriverBase.hpp:413
unsigned long GetMarkerElementGlobalIndex(unsigned short iMarker, unsigned long iElem) const
Get the global index of a marker element.
Definition CDriverBase.cpp:344
unsigned short GetNumberFFDBoxes() const
Get the number of FFD boxes.
Definition CDriverBase.cpp:163
int SU2_Comm
Definition mpi_structure.hpp:619
#define CURRENT_FUNCTION
Definition mpi_structure.hpp:59
passivedouble GetValue(const su2double &data)
Get the (primitive) value of the datatype (needs to be specialized for active types).
Definition datatype_structure.hpp:113
const unsigned int INST_0
Definition of the first instance per grid level.
Definition option_structure.hpp:92
const unsigned int MESH_0
Definition of the finest grid level.
Definition option_structure.hpp:88
@ SPECIES_SOL
Position of the species solver.
Definition option_structure.hpp:588
@ MESH_SOL
Position of the mesh solver.
Definition option_structure.hpp:586
@ ADJFEA_SOL
Position of the continuous adjoint Finite Element flow solution in the solver container array.
Definition option_structure.hpp:591
@ HEAT_SOL
Position of the heat equation in the solution solver array.
Definition option_structure.hpp:582
@ FLOW_SOL
Position of the mean flow solution in the solver container array.
Definition option_structure.hpp:577
@ FEA_SOL
Position of the Finite Element flow solution in the solver container array.
Definition option_structure.hpp:590
@ ADJMESH_SOL
Position of the adjoint of the mesh solver.
Definition option_structure.hpp:587
const unsigned int ZONE_0
Definition of the first grid domain.
Definition option_structure.hpp:90