Nalu
Nalu: a generalized unstructured massively parallel low Mach flow code designed to support a variety of energy applications of interest (most notably Wind ECP) built on the Sierra Toolkit and Trilinos solver Tpetra/Epetra stack. The open source BSD, clause 3 license model has been chosen for the code base. See LICENSE for more information. http://NaluCFD.org
UnitTestUtils.h
Go to the documentation of this file.
1 #ifndef _UnitTestUtils_h_
2 #define _UnitTestUtils_h_
3 
4 #include <string>
5 #include <ostream>
6 
7 #include <SimdInterface.h>
8 #include <stk_mesh/base/BulkData.hpp>
9 #include <stk_topology/topology.hpp>
10 #include <stk_mesh/base/FieldBLAS.hpp>
11 #include <stk_mesh/base/Field.hpp>
12 #include <stk_mesh/base/CoordinateSystems.hpp>
13 
14 #include <Kokkos_Core.hpp>
15 
17 
18 typedef stk::mesh::Field<double> ScalarFieldType;
19 typedef stk::mesh::Field<double,stk::mesh::Cartesian> VectorFieldType;
20 typedef stk::mesh::Field<double,stk::mesh::Cartesian,stk::mesh::Cartesian> TensorFieldType;
21 typedef stk::mesh::Field<double, stk::mesh::SimpleArrayTag> GenericFieldType;
23 
24 namespace stk { namespace mesh { class FieldBase; } }
25 
26 namespace unit_test_utils {
27 
28 void fill_mesh_1_elem_per_proc_hex8(stk::mesh::BulkData& bulk);
29 void fill_hex8_mesh(const std::string& meshSpec, stk::mesh::BulkData& bulk);
30 void perturb_coord_hex_8(stk::mesh::BulkData& bulk, double perturbationSize = 0.125);
31 
32 
33 void fill_and_promote_hex_mesh(const std::string& meshSpec, stk::mesh::BulkData& bulk, int polyOrder);
34 
35 void dump_mesh(stk::mesh::BulkData& bulk, std::vector<stk::mesh::FieldBase*> fields);
36 
37 void dump_promoted_mesh_file(stk::mesh::BulkData& bulk, int polyOrder);
38 
39 std::ostream& nalu_out();
40 
41 stk::mesh::Entity create_one_reference_element(stk::mesh::BulkData& bulk, stk::topology topo);
42 stk::mesh::Entity create_one_perturbed_element(stk::mesh::BulkData& bulk, stk::topology topo);
43 
44 double quadratic(double a, const double* b, const double* H, const double* x);
45 
46 double vector_norm(const std::vector<double> & vec, const stk::ParallelMachine& comm = MPI_COMM_WORLD);
47 
48 double global_norm(const double & norm, const size_t & N, const stk::ParallelMachine& comm = MPI_COMM_WORLD);
49 
50 double initialize_quadratic_scalar_field(const stk::mesh::BulkData& bulk,
51  const VectorFieldType& coordField,
52  const ScalarFieldType& qField);
53 
54 }
55 
56 const double tol = 1.e-10;
57 
58 #ifndef KOKKOS_HAVE_CUDA
59 class Hex8Mesh : public ::testing::Test
60 {
61 protected:
63  : comm(MPI_COMM_WORLD), spatialDimension(3),
64  meta(spatialDimension), bulk(meta, comm),
65  topo(stk::topology::HEX_8),
66  elemCentroidField(&meta.declare_field<VectorFieldType>(stk::topology::ELEM_RANK, "elemCentroid")),
67  nodalPressureField(&meta.declare_field<ScalarFieldType>(stk::topology::NODE_RANK, "nodalPressure")),
68  discreteLaplacianOfPressure(&meta.declare_field<ScalarFieldType>(stk::topology::NODE_RANK, "discreteLaplacian")),
69  scalarQ(&meta.declare_field<ScalarFieldType>(stk::topology::NODE_RANK, "scalarQ")),
70  diffFluxCoeff(&meta.declare_field<ScalarFieldType>(stk::topology::NODE_RANK, "diffFluxCoeff")),
71  partVec(),
72  coordField(nullptr),
73  exactLaplacian(0.0)
74  {
75  stk::mesh::put_field(*elemCentroidField, meta.universal_part(), spatialDimension, (double*)nullptr);
76  double one = 1.0;
77  double zero = 0.0;
78  stk::mesh::put_field(*nodalPressureField, meta.universal_part(), 1, &one);
79  stk::mesh::put_field(*discreteLaplacianOfPressure, meta.universal_part(), 1, 0.0);
80  stk::mesh::put_field(*discreteLaplacianOfPressure, meta.universal_part(), 1, &zero);
81  stk::mesh::put_field(*scalarQ, meta.universal_part(), 1, &zero);
82  stk::mesh::put_field(*diffFluxCoeff, meta.universal_part(), 1, &zero);
83  }
84 
85  ~Hex8Mesh() {}
86 
87  void fill_mesh(const std::string& meshSpec = "generated:20x20x20")
88  {
89  unit_test_utils::fill_hex8_mesh(meshSpec, bulk);
90  }
91 
92  void fill_mesh_and_initialize_test_fields(const std::string& meshSpec = "generated:20x20x20")
93  {
94  fill_mesh(meshSpec);
95 
96  partVec = {meta.get_part("block_1")};
97 
98  coordField = static_cast<const VectorFieldType*>(meta.coordinate_field());
99  EXPECT_TRUE(coordField != nullptr);
100 
101  exactLaplacian = unit_test_utils::initialize_quadratic_scalar_field(bulk, *coordField, *nodalPressureField);
102  stk::mesh::field_fill(0.0, *discreteLaplacianOfPressure);
103  stk::mesh::field_fill(0.1, *scalarQ);
104  stk::mesh::field_fill(0.2, *diffFluxCoeff);
105  }
106 
107  void check_discrete_laplacian(double exactLaplacian);
108 
109  stk::ParallelMachine comm;
111  stk::mesh::MetaData meta;
112  stk::mesh::BulkData bulk;
113  stk::topology topo;
121  double exactLaplacian;
122 };
123 
125 {
126 protected:
128  : Hex8Mesh(),
129  massFlowRate(&meta.declare_field<GenericFieldType>(stk::topology::ELEM_RANK, "mass_flow_rate_scs")),
130  Gju(&meta.declare_field<GenericFieldType>(stk::topology::NODE_RANK, "Gju", 1/*num-states*/)),
131  velocity(&meta.declare_field<VectorFieldType>(stk::topology::NODE_RANK, "velocity", 3/*num-states*/)),
132  dpdx(&meta.declare_field<VectorFieldType>(stk::topology::NODE_RANK, "dpdx", 3/*num-states*/)),
133  density(&meta.declare_field<ScalarFieldType>(stk::topology::NODE_RANK, "density", 3/*num-states*/)),
134  viscosity(&meta.declare_field<ScalarFieldType>(stk::topology::NODE_RANK, "viscosity")),
135  pressure(&meta.declare_field<ScalarFieldType>(stk::topology::NODE_RANK, "pressure"))
136  {
137  double one = 1.0;
138  sierra::nalu::HexSCS hex8SCS;
139  stk::mesh::put_field(*massFlowRate, meta.universal_part(), hex8SCS.numIntPoints_, &one);
140  stk::mesh::put_field(*Gju, meta.universal_part(), 3, &one);
141  stk::mesh::put_field(*velocity, meta.universal_part(), 3, &one);
142  stk::mesh::put_field(*dpdx, meta.universal_part(), 3, &one);
143  stk::mesh::put_field(*density, meta.universal_part(), 1, &one);
144  stk::mesh::put_field(*viscosity, meta.universal_part(), 1, &one);
145  stk::mesh::put_field(*pressure, meta.universal_part(), 1, &one);
146  }
147 
155 };
156 
157 #endif
158 
159 #endif
160 
double quadratic(double a, const double *b, const double *H, const double *x)
Definition: UnitTestUtils.C:456
std::vector< Part * > PartVector
Definition: Algorithm.h:16
Definition: Hex8CVFEM.h:53
void fill_and_promote_hex_mesh(const std::string &meshSpec, stk::mesh::BulkData &bulk, int polyOrder)
Definition: UnitTestUtils.C:90
int numIntPoints_
Definition: MasterElement.h:247
ScalarFieldType * pressure
Definition: UnitTestUtils.h:154
stk::mesh::Field< double > ScalarFieldType
Definition: PromotedElementIO.h:38
std::ostream & nalu_out()
Definition: UnitTestUtils.C:159
Definition: Algorithm.h:14
ScalarFieldType * nodalPressureField
Definition: UnitTestUtils.h:115
stk::mesh::BulkData bulk
Definition: UnitTestUtils.h:112
STK SIMD Interface.
void fill_mesh_1_elem_per_proc_hex8(stk::mesh::BulkData &bulk)
Definition: UnitTestUtils.C:32
Hex8MeshWithNSOFields()
Definition: UnitTestUtils.h:127
sierra::nalu::DoubleType DoubleType
Definition: UnitTestUtils.h:22
void perturb_coord_hex_8(stk::mesh::BulkData &bulk, double perturbSize)
Definition: UnitTestUtils.C:39
Definition: UnitTestFieldUtils.C:10
const VectorFieldType * coordField
Definition: UnitTestUtils.h:120
double initialize_quadratic_scalar_field(const stk::mesh::BulkData &bulk, const VectorFieldType &coordField, const ScalarFieldType &qField)
Definition: UnitTestUtils.C:528
void fill_hex8_mesh(const std::string &meshSpec, stk::mesh::BulkData &bulk)
Definition: UnitTestUtils.C:75
VectorFieldType * dpdx
Definition: UnitTestUtils.h:151
double global_norm(const double &norm, const size_t &N, const stk::ParallelMachine &comm)
Definition: UnitTestUtils.C:482
Definition: UnitTestUtils.h:124
stk::mesh::Field< double, stk::mesh::Cartesian > VectorFieldType
Definition: PromotedElementIO.h:40
VectorFieldType * elemCentroidField
Definition: UnitTestUtils.h:114
ScalarFieldType * density
Definition: UnitTestUtils.h:152
unsigned spatialDimension
Definition: UnitTestUtils.h:110
GenericFieldType * Gju
Definition: UnitTestUtils.h:149
double exactLaplacian
Definition: UnitTestUtils.h:121
void dump_promoted_mesh_file(stk::mesh::BulkData &bulk, int polyOrder)
Definition: UnitTestUtils.C:139
ScalarFieldType * diffFluxCoeff
Definition: UnitTestUtils.h:118
stk::mesh::Field< double, stk::mesh::Cartesian > VectorFieldType
Definition: UnitTestUtils.h:19
stk::mesh::Field< double, stk::mesh::Cartesian, stk::mesh::Cartesian > TensorFieldType
Definition: UnitTestUtils.h:20
void field_fill(const stk::mesh::MetaData &metaData, const stk::mesh::BulkData &bulkData, const double alpha, const stk::mesh::FieldBase &xField, const bool auraIsActive, const stk::topology::rank_t entityRankValue)
Definition: FieldFunctions.C:59
stk::topology topo
Definition: UnitTestUtils.h:113
void dump_mesh(stk::mesh::BulkData &bulk, std::vector< stk::mesh::FieldBase * > fields)
Definition: UnitTestUtils.C:126
void fill_mesh_and_initialize_test_fields(const std::string &meshSpec="generated:20x20x20")
Definition: UnitTestUtils.h:92
void fill_mesh(const std::string &meshSpec="generated:20x20x20")
Definition: UnitTestUtils.h:87
SimdDouble DoubleType
Definition: SimdInterface.h:27
stk::mesh::Entity create_one_reference_element(stk::mesh::BulkData &bulk, stk::topology topo)
Definition: UnitTestUtils.C:295
Hex8Mesh()
Definition: UnitTestUtils.h:62
stk::mesh::Entity create_one_perturbed_element(stk::mesh::BulkData &bulk, stk::topology topo)
Definition: UnitTestUtils.C:330
stk::mesh::MetaData meta
Definition: UnitTestUtils.h:111
stk::mesh::Field< double, stk::mesh::SimpleArrayTag > GenericFieldType
Definition: PromotedElementIO.h:39
VectorFieldType * velocity
Definition: UnitTestUtils.h:150
ScalarFieldType * discreteLaplacianOfPressure
Definition: UnitTestUtils.h:116
ScalarFieldType * viscosity
Definition: UnitTestUtils.h:153
const double tol
Definition: UnitTestUtils.h:56
Definition: UnitTestUtils.h:59
ScalarFieldType * scalarQ
Definition: UnitTestUtils.h:117
~Hex8Mesh()
Definition: UnitTestUtils.h:85
stk::mesh::PartVector partVec
Definition: UnitTestUtils.h:119
stk::mesh::Field< double > ScalarFieldType
Definition: UnitTestUtils.h:18
stk::ParallelMachine comm
Definition: UnitTestUtils.h:109
double vector_norm(const std::vector< double > &vec, const stk::ParallelMachine &comm)
Definition: UnitTestUtils.C:465
stk::mesh::Field< double, stk::mesh::SimpleArrayTag > GenericFieldType
Definition: UnitTestUtils.h:21
GenericFieldType * massFlowRate
Definition: UnitTestUtils.h:148