Loading [MathJax]/extensions/tex2jax.js
Cardinal
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
NekRSProblemBase.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 "CardinalProblem.h"
22#include "NekInterface.h"
23#include "NekTimeStepper.h"
24#include "NekScalarValue.h"
25#include "NekRSMesh.h"
26#include "Transient.h"
27#include "TimeStepper.h"
28
29#include <memory>
30#include "inipp.hpp"
31#include "nekrs.hpp"
32
41{
42public:
43 NekRSProblemBase(const InputParameters & params);
44
45 static InputParameters validParams();
46
48
54 bool isDataTransferHappening(ExternalProblem::Direction direction);
55
60 std::pair<unsigned int, unsigned int> scratchSpaceReservedForCoupling() const;
61
67 bool isUsrWrkSlotReservedForCoupling(const unsigned int & slot) const;
68
73 void copyIndividualScratchSlot(const unsigned int & slot) const;
74
77
80
88 void mapFaceDataToNekFace(const unsigned int & e, const unsigned int & var_num,
89 const Real & multiplier, double ** outgoing_data);
90
98 void mapVolumeDataToNekVolume(const unsigned int & e, const unsigned int & var_num,
99 const Real & multiplier, double ** outgoing_data);
100
117 void mapFaceDataToNekVolume(const unsigned int & e, const unsigned int & var_num,
118 const Real & multiplier, double ** outgoing_data);
119
125 void writeFieldFile(const Real & time, const int & step) const;
126
133 virtual void adjustNekSolution() {}
134
142 virtual bool isOutputStep() const;
143
144 virtual void initialSetup() override;
145
146 virtual void externalSolve() override;
147
148 virtual bool converged(unsigned int) override { return true; }
149
150 virtual void addExternalVariables() override;
151
152 virtual void syncSolutions(ExternalProblem::Direction direction) override;
153
158 virtual bool nondimensional() const { return _nondimensional; }
159
164 virtual const bool hasMovingNekMesh() const { return false; }
165
170 virtual bool synchronizeIn();
171
176 virtual bool synchronizeOut();
177
182 unsigned int nUsrWrkSlots() const { return _n_usrwrk_slots; }
183
184protected:
189
195 void interpolateBoundarySolutionToNek(double * incoming_moose_value,
196 double * outgoing_nek_value);
197
204 void interpolateVolumeSolutionToNek(const int elem_id, double * incoming_moose_value,
205 double * outgoing_nek_value);
206
217 void writeVolumeSolution(const int elem_id,
219 double * T,
220 const std::vector<double> * add = nullptr);
221
229 void writeBoundarySolution(const int elem_id, const field::NekWriteEnum & field, double * T);
230
236 void volumeSolution(const field::NekFieldEnum & f, double * T);
237
243 void boundarySolution(const field::NekFieldEnum & f, double * T);
244
247
253 virtual void fillAuxVariable(const unsigned int var_number, const double * value);
254
258 virtual void extractOutputs();
259
264 virtual InputParameters getExternalVariableParameters();
265
272
273 std::unique_ptr<NumericVector<Number>> _serialized_solution;
274
280 std::string fieldFilePrefix(const int & number) const;
281
283 const std::string & _casename;
284
299 const bool & _write_fld_files;
300
303
306
315 unsigned int _n_usrwrk_slots;
316
318 const unsigned int & _constant_interval;
319
322
324 const unsigned int & _first_reserved_usrwrk_slot;
325
328
331
334
337
340
342 const std::vector<int> * _boundary = nullptr;
343
346
349
352
358
361
363 Transient * _transient_executioner = nullptr;
364
370
372 const MultiMooseEnum * _outputs = nullptr;
373
375 std::vector<std::string> _var_names;
376
378 std::vector<unsigned int> _external_vars;
379
381 std::string _var_string;
382
384 double * _external_data = nullptr;
385
388
390 const PostprocessorValue * _transfer_in = nullptr;
391
393 double * _interpolation_outgoing = nullptr;
394
396 double * _interpolation_incoming = nullptr;
397
400
403
405 const std::vector<unsigned int> * _usrwrk_output = nullptr;
406
408 const std::vector<std::string> * _usrwrk_output_prefix = nullptr;
409
412
415
418
421
462
464 std::vector<std::string> _usrwrk_indices;
465
467 std::vector<NekScalarValue *> _nek_uos;
468
470 static bool _first;
471
473 unsigned int _scratch_counter;
474
476 unsigned int _n_uo_slots;
477};
Definition CardinalProblem.h:27
Definition NekRSMesh.h:51
Definition NekRSProblemBase.h:41
virtual void adjustNekSolution()
Definition NekRSProblemBase.h:133
void mapFaceDataToNekVolume(const unsigned int &e, const unsigned int &var_num, const Real &multiplier, double **outgoing_data)
Map nodal points on a MOOSE face element to the GLL points on a Nek volume element.
unsigned int _minimum_scratch_size_for_coupling
Minimum allowable scratch space size, strictly what is needed by Cardinal for coupling.
Definition NekRSProblemBase.h:399
int _n_vertices_per_elem
Number of vertices per element in the data transfer mesh, which depends on whether boundary/volume co...
Definition NekRSProblemBase.h:339
void sendScalarValuesToNek()
Send values from NekScalarValue userobjects to NekRS.
double _start_time
Start time of the simulation based on NekRS's .par file.
Definition NekRSProblemBase.h:348
std::string _var_string
Descriptive string for the variables extracted from NekRS.
Definition NekRSProblemBase.h:381
unsigned int nUsrWrkSlots() const
Definition NekRSProblemBase.h:182
void writeVolumeSolution(const int elem_id, const field::NekWriteEnum &field, double *T, const std::vector< double > *add=nullptr)
virtual void syncSolutions(ExternalProblem::Direction direction) override
double _tSolveStepMin
Minimum step solve time.
Definition NekRSProblemBase.h:417
std::unique_ptr< NumericVector< Number > > _serialized_solution
Definition NekRSProblemBase.h:273
const std::string & _casename
NekRS casename.
Definition NekRSProblemBase.h:283
void writeFieldFile(const Real &time, const int &step) const
static bool _first
flag to indicate whether this is the first pass to serialize the solution
Definition NekRSProblemBase.h:470
virtual InputParameters getExternalVariableParameters()
NekTimeStepper * _timestepper
The time stepper used for selection of time step size.
Definition NekRSProblemBase.h:360
bool isUsrWrkSlotReservedForCoupling(const unsigned int &slot) const
bool _volume
Whether the mesh contains volume-based coupling.
Definition NekRSProblemBase.h:345
virtual bool isOutputStep() const
Whether nekRS should write an output file for the current time step.
const bool & _write_fld_files
Definition NekRSProblemBase.h:299
int _n_vertices_per_surface
Number of vertices per surface element of the transfer mesh.
Definition NekRSProblemBase.h:330
void getNekScalarValueUserObjects()
Setup to fetch NekScalarValue user objects for sending scalar values into NekRS scratch space.
void volumeSolution(const field::NekFieldEnum &f, double *T)
int _n_points
Number of points for interpolated fields on the MOOSE mesh.
Definition NekRSProblemBase.h:387
bool _is_output_step
Whether the most recent time step was an output file writing step.
Definition NekRSProblemBase.h:351
std::vector< NekScalarValue * > _nek_uos
Userobjects containing stochastic input data.
Definition NekRSProblemBase.h:467
void copyScratchToDevice()
void mapVolumeDataToNekVolume(const unsigned int &e, const unsigned int &var_num, const Real &multiplier, double **outgoing_data)
static InputParameters validParams()
double _elapsedTime
Sum of the total elapsed time in NekRS solves.
Definition NekRSProblemBase.h:414
synchronization::SynchronizationEnum _synchronization_interval
When to synchronize the NekRS solution with the mesh mirror.
Definition NekRSProblemBase.h:461
virtual bool converged(unsigned int) override
Definition NekRSProblemBase.h:148
double * _interpolation_outgoing
Vandermonde interpolation matrix (for outgoing transfers)
Definition NekRSProblemBase.h:393
const std::vector< int > * _boundary
Boundary IDs through which to couple nekRS and MOOSE.
Definition NekRSProblemBase.h:342
std::vector< unsigned int > _external_vars
Numeric identifiers for the external variables.
Definition NekRSProblemBase.h:378
virtual bool nondimensional() const
Definition NekRSProblemBase.h:158
const std::vector< std::string > * _usrwrk_output_prefix
Filename prefix to use for naming the field files containing the nrs->o_usrwrk array slots.
Definition NekRSProblemBase.h:408
const PostprocessorValue * _transfer_in
Postprocessor containing the signal of when a synchronization has occurred.
Definition NekRSProblemBase.h:390
virtual const bool hasMovingNekMesh() const
Definition NekRSProblemBase.h:164
bool _nondimensional
Whether a dimensionalization action has been added.
Definition NekRSProblemBase.h:305
double * _external_data
Scratch space to place external NekRS fields before writing into auxiliary variables.
Definition NekRSProblemBase.h:384
virtual bool synchronizeOut()
int _n_vertices_per_volume
Number of vertices per volume element of the transfer mesh.
Definition NekRSProblemBase.h:336
double _tSolveStepMax
Maximum step solve time.
Definition NekRSProblemBase.h:420
int _moose_Nq
For the MOOSE mesh, the number of quadrature points in each coordinate direction.
Definition NekRSProblemBase.h:402
unsigned int _n_uo_slots
Number of scratch space slots used for NekScalarValue usage.
Definition NekRSProblemBase.h:476
virtual void addTemperatureVariable()
const MultiMooseEnum * _outputs
NekRS solution fields to output to the mesh mirror.
Definition NekRSProblemBase.h:372
virtual void fillAuxVariable(const unsigned int var_number, const double *value)
bool isDataTransferHappening(ExternalProblem::Direction direction)
NekRSProblemBase(const InputParameters &params)
int _n_volume_elems
Number of volume elements in the data transfer mesh, across all processes.
Definition NekRSProblemBase.h:333
std::string fieldFilePrefix(const int &number) const
std::vector< std::string > _usrwrk_indices
quantities to write to nrs->usrwrk (and the order to write them)
Definition NekRSProblemBase.h:464
void interpolateVolumeSolutionToNek(const int elem_id, double *incoming_moose_value, double *outgoing_nek_value)
const unsigned int & _constant_interval
For constant synchronization intervals, the desired frequency (in units of Nek time steps)
Definition NekRSProblemBase.h:318
double _elapsedStepSum
Sum of the elapsed time in NekRS solves.
Definition NekRSProblemBase.h:411
unsigned int _scratch_counter
Counter for any potential NekScalarValue objects in the input file.
Definition NekRSProblemBase.h:473
virtual void addExternalVariables() override
const std::vector< unsigned int > * _usrwrk_output
Slots in the nrs->o_usrwrk array to write to a field file.
Definition NekRSProblemBase.h:405
const bool & _disable_fld_file_output
Whether to turn off all field file writing.
Definition NekRSProblemBase.h:302
virtual void externalSolve() override
void boundarySolution(const field::NekFieldEnum &f, double *T)
void writeBoundarySolution(const int elem_id, const field::NekWriteEnum &field, double *T)
void copyIndividualScratchSlot(const unsigned int &slot) const
Transient * _transient_executioner
Underlying executioner.
Definition NekRSProblemBase.h:363
const unsigned int & _first_reserved_usrwrk_slot
First slice in usrwrk for Cardinal to read/write data from.
Definition NekRSProblemBase.h:324
bool _needs_interpolation
Definition NekRSProblemBase.h:369
void interpolateBoundarySolutionToNek(double *incoming_moose_value, double *outgoing_nek_value)
void mapFaceDataToNekFace(const unsigned int &e, const unsigned int &var_num, const Real &multiplier, double **outgoing_data)
NekRSMesh * _nek_mesh
Definition NekRSProblemBase.h:357
virtual bool synchronizeIn()
virtual void initialSetup() override
const bool & _skip_final_field_file
Whether to skip writing a field file on NekRS's last time steo.
Definition NekRSProblemBase.h:321
std::pair< unsigned int, unsigned int > scratchSpaceReservedForCoupling() const
int _n_surface_elems
Number of surface elements in the data transfer mesh, across all processes.
Definition NekRSProblemBase.h:327
std::vector< std::string > _var_names
Names of external variables when extracting the NekRS solution.
Definition NekRSProblemBase.h:375
unsigned int _n_usrwrk_slots
Definition NekRSProblemBase.h:315
virtual void extractOutputs()
void initializeInterpolationMatrices()
Initialize interpolation matrices for transfers in/out of nekRS.
double * _interpolation_incoming
Vandermonde interpolation matrix (for incoming transfers)
Definition NekRSProblemBase.h:396
Time stepper that reads time step information directly from nekRS.
Definition NekTimeStepper.h:38
Definition CardinalEnums.h:89
NekFieldEnum
Enumeration of possible fields to read from nekRS.
Definition CardinalEnums.h:92
NekWriteEnum
Enumeration of possible fields to write in nekRS.
Definition CardinalEnums.h:114
SynchronizationEnum
Definition CardinalEnums.h:62