Cardinal
Loading...
Searching...
No Matches
NekInterface.h
Go to the documentation of this file.
1/********************************************************************/
2/* SOFTWARE COPYRIGHT NOTIFICATION */
3/* Cardinal */
4/* */
5/* (c) 2021 UChicago Argonne, LLC */
6/* ALL RIGHTS RESERVED */
7/* */
8/* Prepared by UChicago Argonne, LLC */
9/* Under Contract No. DE-AC02-06CH11357 */
10/* With the U. S. Department of Energy */
11/* */
12/* Prepared by Battelle Energy Alliance, LLC */
13/* Under Contract No. DE-AC07-05ID14517 */
14/* With the U. S. Department of Energy */
15/* */
16/* See LICENSE for full restrictions */
17/********************************************************************/
18
19#pragma once
20
21#include "CardinalEnums.h"
22#include "MooseTypes.h"
23#include "NekBoundaryCoupling.h"
24#include "NekVolumeCoupling.h"
25#include "Function.h"
26
27#include "inipp.hpp"
28#include "nekrs.hpp"
29#include "nrs.hpp"
30#include "udf.hpp"
31#include "inipp.hpp"
32#include "mesh.h"
33
34#include "libmesh/point.h"
35
36#include <string>
37#include <vector>
38
46namespace nekrs
47{
48
49static int build_only;
50
55int Nscalar();
56
59
62
63dfloat * host_x();
64dfloat * host_y();
65dfloat * host_z();
66
67nrs_t * nrsPtr();
68
69dfloat * getSgeo();
70dfloat * getVgeo();
71
79
81
86void computeWallDistance(const std::vector<int> & boundary_id);
87
93std::vector<dfloat> yPlus(const std::vector<int> & boundary_id);
94
100std::vector<dfloat> viscousDrag(const std::vector<int> & boundary);
101
106void setAbsoluteTol(double tol);
107
114Real scratchUnits(const int slot);
115
120void nondimensional(const bool n);
121
126void setRelativeTol(double tol);
127
135void setNekSetupTime(const double & time);
136
142
147void setStartTime(const double & start);
148
154
164void write_usrwrk_field_file(const int & size,
165 const int & index,
166 const int & slot,
167 const std::string & prefix,
168 const dfloat & time,
169 const int & step,
170 const bool & write_coords);
171
178void write_field_file(const std::string & prefix, const dfloat time, const int & step);
179
187
193
197void interpolateVolumeHex3D(const double * I, double * x, int N, double * Ix, int M);
198
203bool hasCHT();
204
210
216
222
228
234
240
246
254
260
266
273mesh_t * entireMesh();
274
279mesh_t * flowMesh();
280
286
292mesh_t * getMesh(const nek_mesh::NekMeshEnum pp_mesh);
293
299
305
311
317
323bool hasScalarVariable(int scalarId);
324
330
336
341void initializeScratch(const unsigned int & n_slots);
342
345
351double viscosity();
352
358double Pr();
359
362
363template <typename T>
364void allgatherv(const std::vector<int> & base_counts,
365 const T * input,
366 T * output,
367 const int multiplier = 1);
368
376void displacementAndCounts(const std::vector<int> & base_counts,
377 int * counts,
378 int * displacement,
379 const int multiplier);
380
388void interpolationMatrix(double * I, int starting_points, int ending_points);
389
400 double * scratch, const double * I, double * x, int N, double * Ix, int M);
401
409Point centroidFace(int local_elem_id, int local_face_id);
410
416Point centroid(int local_elem_id);
417
424Point gllPoint(int local_elem_id, int local_node_id);
425
434Point gllPointFace(int local_elem_id, int local_face_id, int local_node_id);
435
443std::vector<double> usrwrkSideIntegral(const unsigned int & slot,
444 const std::vector<int> & boundary,
445 const nek_mesh::NekMeshEnum pp_mesh);
446
453double usrwrkVolumeIntegral(const unsigned int & slot, const nek_mesh::NekMeshEnum pp_mesh);
454
460void scaleUsrwrk(const unsigned int & slot, const dfloat & value);
461
468double area(const std::vector<int> & boundary_id, const nek_mesh::NekMeshEnum pp_mesh);
469
477double sideIntegral(const std::vector<int> & boundary_id, const field::NekFieldEnum & integrand,
478 const nek_mesh::NekMeshEnum pp_mesh);
479
485double volume(const nek_mesh::NekMeshEnum pp_mesh);
486
491void dimensionalizeVolume(double & integral);
492
497void dimensionalizeArea(double & integral);
498
506 const Real & volume,
507 double & integral);
508
516 const Real & area,
517 double & integral);
518
527 const std::vector<int> & boundary_id,
528 double & integral,
529 const nek_mesh::NekMeshEnum pp_mesh);
530
541 const double & volume,
542 const nek_mesh::NekMeshEnum pp_mesh,
543 const Function * function,
544 const Real & time);
545
555double volumeIntegral(const field::NekFieldEnum & integrand,
556 const double & volume,
557 const nek_mesh::NekMeshEnum pp_mesh,
558 const Function * function,
559 const Real & time);
560
569double evaluateFunctionOnMesh(const Function * f, const Real time, const int id);
570
580double volumeNorm(const field::NekFieldEnum & integrand,
581 const nek_mesh::NekMeshEnum pp_mesh,
582 const Function * function,
583 const Real & time,
584 const Real & N);
585
592double massFlowrate(const std::vector<int> & boundary_id,
593 const nek_mesh::NekMeshEnum pp_mesh);
594
602double sideMassFluxWeightedIntegral(const std::vector<int> & boundary_id,
603 const field::NekFieldEnum & integrand,
604 const nek_mesh::NekMeshEnum pp_mesh);
605
615double pressureSurfaceForce(const std::vector<int> & boundary_id, const Point & direction, const nek_mesh::NekMeshEnum pp_mesh);
616
623double heatFluxIntegral(const std::vector<int> & boundary_id,
624 const nek_mesh::NekMeshEnum pp_mesh);
625
631void limitTemperature(const double * min_T, const double * max_T);
632
641void gradient(const int offset,
642 const int e,
643 const double * f,
644 double * grad_f,
645 const nek_mesh::NekMeshEnum pp_mesh);
646
657 const nek_mesh::NekMeshEnum pp_mesh,
658 const Function * function,
659 const Real & time,
660 const bool max);
661
670double sideExtremeValue(const std::vector<int> & boundary_id, const field::NekFieldEnum & field,
671 const nek_mesh::NekMeshEnum pp_mesh, const bool max);
672
677int Nfaces();
678
684bool isHeatFluxBoundary(const int boundary);
685
691bool isMovingMeshBoundary(const int boundary);
692
698bool isTemperatureBoundary(const int boundary);
699
705const std::string temperatureBoundaryType(const int boundary);
706
712
718
723int dim();
724
733
739
745
753bool
754validBoundaryIDs(const std::vector<int> & boundary_id, int & first_invalid_id, int & n_boundaries);
755
761void storeBoundaryCoupling(const std::vector<int> & boundary_id, int & N);
762
768{
769 double U_ref = 1;
770 double T_ref = 0;
771 double dT_ref = 1;
772 double P_ref = 1;
773 double L_ref = 1;
774 double A_ref = 1;
775 double V_ref = 1;
776 double rho_ref = 1;
777 double Cp_ref = 1;
778 double flux_ref = 1;
779 double source_ref = 1;
780 double t_ref = 1;
781 double s01_ref = 0;
782 double ds01_ref = 1;
783 double s02_ref = 0;
784 double ds02_ref = 1;
785 double s03_ref = 0;
786 double ds03_ref = 1;
787};
788
794double (*solutionPointer(const field::NekFieldEnum & field))(int, int);
795double (*solutionPointer(const field::NekWriteEnum & field))(int, int);
796
802int scalarSlot(const int id);
803
809double get_scalar01(const int id, const int surf_offset);
810
816double get_scalar02(const int id, const int surf_offset);
817
823double get_scalar03(const int id, const int surf_offset);
824
830double get_usrwrk00(const int id, const int surf_offset);
831
837double get_usrwrk01(const int id, const int surf_offset);
838
844double get_usrwrk02(const int id, const int surf_offset);
845
851double get_temperature(const int id, const int surf_offset);
852
858double get_pressure(const int id, const int surf_offset);
859
865double get_zero(const int id, const int surf_offset);
866
872double get_unity(const int id, const int surf_offset);
873
879double get_velocity_x(const int id, const int surf_offset);
880
886double get_velocity_y(const int id, const int surf_offset);
887
893double get_velocity_z(const int id, const int surf_offset);
894
900double get_velocity(const int id, const int surf_offset);
901
907double get_velocity_x_squared(const int id, const int surf_offset);
908
914double get_velocity_y_squared(const int id, const int surf_offset);
915
921double get_velocity_z_squared(const int id, const int surf_offset);
922
938void initializeDimensionalScales(const double U,
939 const double T,
940 const double dT,
941 const double L,
942 const double rho,
943 const double Cp,
944 const double s01,
945 const double ds01,
946 const double s02,
947 const double ds02,
948 const double s03,
949 const double ds03);
950
965
979
985
991
997
1003
1004// useful concept from Stack Overflow for templating MPI calls
1005template <typename T>
1006MPI_Datatype resolveType();
1007
1015template <typename T>
1016void
1017allgatherv(const std::vector<int> & base_counts, const T * input, T * output, const int multiplier)
1018{
1019 int * recvCounts = (int *)calloc(commSize(), sizeof(int));
1020 int * displacement = (int *)calloc(commSize(), sizeof(int));
1021 displacementAndCounts(base_counts, recvCounts, displacement, multiplier);
1022
1023 MPI_Allgatherv(input,
1024 recvCounts[commRank()],
1026 output,
1027 (const int *)recvCounts,
1028 (const int *)displacement,
1030 platform->comm.mpiComm());
1031
1034}
1035
1037
1038// Accessors for NekRS host arrays
1039std::tuple<dfloat *, dfloat *, dfloat *> host_xyz();
1040std::vector<dfloat> & host_U();
1041std::vector<dfloat> & host_P();
1042std::vector<dfloat> & host_S();
1044
1045mesh_t * createMesh2(mesh_t * _mesh, int Nc);
1046
1047} // end namespace nekrs
Definition CardinalEnums.h:93
NekFieldEnum
Enumeration of possible fields to read from nekRS.
Definition CardinalEnums.h:96
NekWriteEnum
Enumeration of possible fields to write in nekRS.
Definition CardinalEnums.h:119
NekMeshEnum
Definition CardinalEnums.h:52
Cardinal-specific nekRS API.
Definition NekUility.C:22
double get_velocity_x(const int id, const int surf_offset)
int NboundaryID()
void computeWallDistance(const std::vector< int > &boundary_id)
void write_field_file(const std::string &prefix, const dfloat time, const int &step)
void limitTemperature(const double *min_T, const double *max_T)
void interpolateVolumeHex3D(const double *I, double *x, int N, double *Ix, int M)
double get_velocity_z(const int id, const int surf_offset)
double referenceTime()
Real scratchUnits(const int slot)
bool hasTemperatureVariable()
void allgatherv(const std::vector< int > &base_counts, const T *input, T *output, const int multiplier=1)
Definition NekInterface.h:1017
Point gllPoint(int local_elem_id, int local_node_id)
void dimensionalizeSideIntegral(const field::NekFieldEnum &integrand, const Real &area, double &integral)
dfloat * getVgeo()
Real nondimensionalAdditive(const field::NekFieldEnum &field)
int polynomialOrder()
int buildOnly()
void setAbsoluteTol(double tol)
void storeBoundaryCoupling(const std::vector< int > &boundary_id, int &N)
dfloat * host_z()
void setStartTime(const double &start)
double get_temperature(const int id, const int surf_offset)
Point gllPointFace(int local_elem_id, int local_face_id, int local_node_id)
double get_zero(const int id, const int surf_offset)
double get_usrwrk00(const int id, const int surf_offset)
double get_velocity_x_squared(const int id, const int surf_offset)
void interpolateSurfaceFaceHex3D(double *scratch, const double *I, double *x, int N, double *Ix, int M)
double get_velocity(const int id, const int surf_offset)
void gradient(const int offset, const int e, const double *f, double *grad_f, const nek_mesh::NekMeshEnum pp_mesh)
bool hasTemperatureSolve()
double get_unity(const int id, const int surf_offset)
bool endControlNumSteps()
int velocityFieldOffset()
mesh_t * flowMesh()
mesh_t * getMesh(const nek_mesh::NekMeshEnum pp_mesh)
void initializeDimensionalScales(const double U, const double T, const double dT, const double L, const double rho, const double Cp, const double s01, const double ds01, const double s02, const double ds02, const double s03, const double ds03)
std::vector< dfloat > & host_U()
void setNekSetupTime(const double &time)
double volumeIntegral(const field::NekFieldEnum &integrand, const double &volume, const nek_mesh::NekMeshEnum pp_mesh, const Function *function, const Real &time)
double referenceArea()
void initializeNekHostArrays()
double volumeNorm(const field::NekFieldEnum &integrand, const nek_mesh::NekMeshEnum pp_mesh, const Function *function, const Real &time, const Real &N)
int Nelements()
double referenceLength()
double sideMassFluxWeightedIntegral(const std::vector< int > &boundary_id, const field::NekFieldEnum &integrand, const nek_mesh::NekMeshEnum pp_mesh)
bool endControlElapsedTime()
double referenceVolume()
int commRank()
double Pr()
double sideIntegral(const std::vector< int > &boundary_id, const field::NekFieldEnum &integrand, const nek_mesh::NekMeshEnum pp_mesh)
int fieldOffset()
int Nfaces()
std::tuple< dfloat *, dfloat *, dfloat * > host_xyz()
void copyDeviceToHost()
dfloat * host_wrk()
void dimensionalizeVolumeIntegral(const field::NekFieldEnum &integrand, const Real &volume, double &integral)
double viscosity()
nrs_t * nrsPtr()
void dimensionalizeArea(double &integral)
std::vector< dfloat > yPlus(const std::vector< int > &boundary_id)
const std::string temperatureBoundaryType(const int boundary)
void scaleUsrwrk(const unsigned int &slot, const dfloat &value)
int NfaceVertices()
Number of vertices required to define an element face Vertices refer to the points required to place ...
bool hasUserMeshSolver()
double get_velocity_y_squared(const int id, const int surf_offset)
double(*)(int, int) solutionPointer(const field::NekFieldEnum &field)
Definition NekInterface.h:794
void interpolationMatrix(double *I, int starting_points, int ending_points)
bool isHeatFluxBoundary(const int boundary)
std::vector< dfloat > viscousDrag(const std::vector< int > &boundary)
int scalarSlot(const int id)
int commSize()
double get_usrwrk02(const int id, const int surf_offset)
int Nscalar()
double get_scalar02(const int id, const int surf_offset)
MPI_Datatype resolveType()
std::vector< double > usrwrkSideIntegral(const unsigned int &slot, const std::vector< int > &boundary, const nek_mesh::NekMeshEnum pp_mesh)
void initializeScratch(const unsigned int &n_slots)
dfloat * host_x()
void updateHostMeshParameters()
Update the mesh parameters on host.
double heatFluxIntegral(const std::vector< int > &boundary_id, const nek_mesh::NekMeshEnum pp_mesh)
std::vector< dfloat > & host_P()
double volumeExtremeValue(const field::NekFieldEnum &field, const nek_mesh::NekMeshEnum pp_mesh, const Function *function, const Real &time, const bool max)
double area(const std::vector< int > &boundary_id, const nek_mesh::NekMeshEnum pp_mesh)
double get_scalar03(const int id, const int surf_offset)
Point centroidFace(int local_elem_id, int local_face_id)
dfloat * host_y()
double get_scalar01(const int id, const int surf_offset)
Point centroid(int local_elem_id)
bool hasBlendingSolver()
double evaluateFunctionOnMesh(const Function *f, const Real time, const int id)
int NboundaryFaces()
bool hasCHT()
mesh_t * entireMesh()
void dimensionalizeVolume(double &integral)
bool endControlTime()
dfloat * getSgeo()
bool isInitialized()
bool hasVariableDt()
bool isTemperatureBoundary(const int boundary)
double getNekSetupTime()
mesh_t * createMesh2(mesh_t *_mesh, int Nc)
double get_velocity_z_squared(const int id, const int surf_offset)
bool validBoundaryIDs(const std::vector< int > &boundary_id, int &first_invalid_id, int &n_boundaries)
bool hasScalarVariable(int scalarId)
void copyDeformationToDevice()
Copy the deformation from host to device.
double massFlowrate(const std::vector< int > &boundary_id, const nek_mesh::NekMeshEnum pp_mesh)
void checkFieldValidity(const field::NekFieldEnum &field)
double usrwrkVolumeIntegral(const unsigned int &slot, const nek_mesh::NekMeshEnum pp_mesh)
bool hasHeatSourceKernel()
double volume(const nek_mesh::NekMeshEnum pp_mesh)
void nondimensional(const bool n)
int scalarFieldOffset()
bool isMovingMeshBoundary(const int boundary)
double get_pressure(const int id, const int surf_offset)
double get_usrwrk01(const int id, const int surf_offset)
Real nondimensionalDivisor(const field::NekFieldEnum &field)
Return the reference divisor scale that defines the non-dimensional field.
std::vector< dfloat > & host_S()
void setRelativeTol(double tol)
void freeScratch()
Free the scratch space.
double pressureSurfaceForce(const std::vector< int > &boundary_id, const Point &direction, const nek_mesh::NekMeshEnum pp_mesh)
double get_velocity_y(const int id, const int surf_offset)
double sideExtremeValue(const std::vector< int > &boundary_id, const field::NekFieldEnum &field, const nek_mesh::NekMeshEnum pp_mesh, const bool max)
double functionVolumeIntegral(const field::NekFieldEnum &integrand, const double &volume, const nek_mesh::NekMeshEnum pp_mesh, const Function *function, const Real &time)
int dim()
void initializeHostMeshParameters()
Allocate memory for the host mesh parameters.
bool hasMovingMesh()
bool scratchAvailable()
mesh_t * temperatureMesh()
void write_usrwrk_field_file(const int &size, const int &index, const int &slot, const std::string &prefix, const dfloat &time, const int &step, const bool &write_coords)
void displacementAndCounts(const std::vector< int > &base_counts, int *counts, int *displacement, const int multiplier)
Definition CardinalEnums.h:132
Definition NekInterface.h:768
double A_ref
Definition NekInterface.h:774
double flux_ref
Definition NekInterface.h:778
double s02_ref
Definition NekInterface.h:783
double source_ref
Definition NekInterface.h:779
double Cp_ref
Definition NekInterface.h:777
double dT_ref
Definition NekInterface.h:771
double ds03_ref
Definition NekInterface.h:786
double T_ref
Definition NekInterface.h:770
double P_ref
Definition NekInterface.h:772
double V_ref
Definition NekInterface.h:775
double L_ref
Definition NekInterface.h:773
double t_ref
Definition NekInterface.h:780
double s01_ref
Definition NekInterface.h:781
double ds02_ref
Definition NekInterface.h:784
double ds01_ref
Definition NekInterface.h:782
double rho_ref
Definition NekInterface.h:776
double s03_ref
Definition NekInterface.h:785
double U_ref
Definition NekInterface.h:769