NimbleSM
NimbleSM is a solid mechanics simulation code for dynamic systems
Loading...
Searching...
No Matches
nimble_kokkos_model_data.h
Go to the documentation of this file.
1/*
2//@HEADER
3// ************************************************************************
4//
5// NimbleSM
6// Copyright 2018
7// National Technology & Engineering Solutions of Sandia, LLC (NTESS)
8//
9// Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government
10// retains certain rights in this software.
11//
12// Redistribution and use in source and binary forms, with or without
13// modification, are permitted provided that the following conditions are
14// met:
15//
16// 1. Redistributions of source code must retain the above copyright
17// notice, this list of conditions and the following disclaimer.
18//
19// 2. Redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution.
22//
23// 3. Neither the name of the Corporation nor the names of the
24// contributors may be used to endorse or promote products derived from
25// this software without specific prior written permission.
26//
27// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY EXPRESS OR IMPLIED
28// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
29// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
30// NO EVENT SHALL NTESS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
32// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact David Littlewood (djlittl@sandia.gov)
39//
40// ************************************************************************
41//@HEADER
42*/
43
44#ifndef NIMBLE_KOKKOS_MODEL_DATA_H
45#define NIMBLE_KOKKOS_MODEL_DATA_H
46
47#include <Kokkos_Core.hpp>
48#include <iostream>
49#include <memory>
50#include <string>
51#include <vector>
52
54#include "nimble_data_utils.h"
55#include "nimble_defs.h"
56#include "nimble_kokkos_block.h"
58
59namespace nimble {
60
61class GenesisMesh;
62class DataManager;
64
65} // namespace nimble
66
67namespace nimble_kokkos {
68
70
72{
73 public:
74 ModelData();
75
76 ~ModelData() override;
77
78 //--- Common interface from nimble::ModelDataBase
79
80 /// \brief Allocate data storage for a node-based quantity
81 ///
82 /// \param length
83 /// \param label
84 /// \param num_objects
85 /// \return Field ID for the data allocated
86 int
87 AllocateNodeData(nimble::Length length, std::string label, int num_objects) override;
88
89 /// \brief Returns the field ID for a specific label
90 ///
91 /// \param field_label Label for a stored quantity
92 /// \return Field ID to identify the data storage
93 int
94 GetFieldId(const std::string& field_label) const override
95 {
96 return field_label_to_field_id_map_.at(field_label);
97 }
98
99 /// \brief Initialize the different blocks in the mesh
100 ///
101 /// \param data_manager Reference to the data manager
102 /// \param material_factory_base Shared pointer to the material factory
103 void
105 nimble::DataManager& data_manager,
106 const std::shared_ptr<nimble::MaterialFactoryBase>& material_factory_base) override;
107
108 /// \brief Copy time state (n+1) into time state (n)
109 ///
110 /// \param data_manager Reference to the data manager
111 void
112 UpdateStates(const nimble::DataManager& data_manager) override;
113
114 using ModelDataBase::GetScalarNodeData;
115 using ModelDataBase::GetVectorNodeData;
116
117 /// \brief Get view of scalar quantity defined on nodes
118 ///
119 /// \param field_id the field id (see DataManager::GetFieldIDs())
120 /// \return Viewify<1> object for scalar quantity
122 GetScalarNodeData(int field_id) override;
123
124 /// \brief Get view of vector quantity defined on nodes
125 ///
126 /// \param field_id the field id (see DataManager::GetFieldIDs())
127 /// \return Viewify<2> object for vector quantity
129 GetVectorNodeData(int field_id) override;
130
131 void
132 ComputeLumpedMass(nimble::DataManager& data_manager) override;
133
134 void
135 InitializeExodusOutput(nimble::DataManager& data_manager) override;
136
137 void
138 WriteExodusOutput(nimble::DataManager& data_manager, double time_current) override;
139
140 /// \brief Compute the internal force
141 ///
142 /// \param[in] data_manager
143 /// \param[in] time_previous
144 /// \param[in] time_current
145 /// \param[in] is_output_step
146 /// \param[in] displacement
147 /// \param[out] internal_force Output for internal force
148 void
150 nimble::DataManager& data_manager,
151 double time_previous,
152 double time_current,
153 bool is_output_step,
154 const nimble::Viewify<2>& displacement,
155 nimble::Viewify<2>& force) override;
156
157 /// \brief Update model with new velocity
158 ///
159 /// \param[in] data_manager Reference to the data manager
160 /// \param[in] dt Current time step
161 ///
162 /// \note This routine wll synchronize the host and device velocities.
163 ///
164 void
165 UpdateWithNewVelocity(nimble::DataManager& data_manager, double dt) override;
166
167 /// \brief Update model with new displacement
168 ///
169 /// \param[in] data_manager Reference to the data manager
170 /// \param[in] dt Current time step
171 ///
172 /// \note This routine wll synchronize the host and device displacements.
173 ///
174 void
175 UpdateWithNewDisplacement(nimble::DataManager& data_manager, double dt) override;
176
177 //--- Specific routines
178
179 int
180 AllocateElementData(int block_id, nimble::Length length, std::string label, int num_objects);
181
182 int
184 int block_id,
185 nimble::Length length,
186 std::string label,
187 int num_objects,
188 std::vector<double> initial_value = std::vector<double>());
189
190 std::vector<int>
191 GetBlockIds() const;
192
193 std::vector<std::string>
195
196 std::vector<std::string>
198
199 std::vector<std::string>
201
202 std::vector<std::string>
203 GetFullTensorIntegrationPointDataLabels(int block_id) const;
204
206 GetHostScalarNodeData(int field_id);
207
209 GetHostVectorNodeData(int field_id);
210
212 GetHostSymTensorIntegrationPointData(int block_id, int field_id, nimble::Step step);
213
215 GetHostFullTensorIntegrationPointData(int block_id, int field_id, nimble::Step step);
216
218 GetHostScalarElementData(int block_id, int field_id);
219
221 GetHostSymTensorElementData(int block_id, int field_id);
222
224 GetHostFullTensorElementData(int block_id, int field_id);
225
227 GetDeviceScalarNodeData(int field_id);
228
230 GetDeviceVectorNodeData(int field_id);
231
233 GetDeviceSymTensorIntegrationPointData(int block_id, int field_id, nimble::Step step);
234
236 GetDeviceFullTensorIntegrationPointData(int block_id, int field_id, nimble::Step step);
237
239 GetDeviceScalarIntegrationPointData(int block_id, int field_id, nimble::Step step);
240
242 GetDeviceVectorIntegrationPointData(int block_id, int field_id, nimble::Step step);
243
245 GetDeviceScalarElementData(int block_id, int field_id);
246
248 GetDeviceSymTensorElementData(int block_id, int field_id);
249
251 GetDeviceFullTensorElementData(int block_id, int field_id);
252
255 int field_id,
256 int num_elements,
257 int num_nodes_per_element,
258 const DeviceElementConnectivityView& elem_conn_d,
259 DeviceScalarNodeGatheredView gathered_view_d);
260
263 int field_id,
264 int num_elements,
265 int num_nodes_per_element,
266 const DeviceElementConnectivityView& elem_conn_d,
267 DeviceVectorNodeGatheredView gathered_view_d);
268
269 void
271 int field_id,
272 int num_elements,
273 int num_nodes_per_element,
274 const DeviceElementConnectivityView& elem_conn_d,
275 const DeviceScalarNodeGatheredView& gathered_view_d);
276
277 void
279 int field_id,
280 int num_elements,
281 int num_nodes_per_element,
282 const DeviceElementConnectivityView& elem_conn_d,
283 const DeviceVectorNodeGatheredView& gathered_view_d);
284
285#ifndef KOKKOS_ENABLE_QTHREADS
286 void
288 int field_id,
289 int num_elements,
290 int num_nodes_per_element,
291 const DeviceElementConnectivityView& elem_conn_d,
292 const DeviceScalarNodeGatheredView& gathered_view_d);
293#endif
294
295 protected:
296 void
298
299 /// \brief Initialize block data for material information
300 ///
301 /// \param data_manager
302 void
304
305 template <FieldType ft>
306 typename Field<ft>::View
307 GetDeviceElementData(int block_id, int field_id);
308
309 template <FieldType ft>
310 typename Field<ft>::View
311 GetDeviceIntPointData(int block_id, int field_id, nimble::Step step);
312
313 protected:
314 using Data = std::unique_ptr<FieldBase>;
315
316 std::map<std::string, int> field_label_to_field_id_map_;
317
318 //! Blocks
319 std::map<int, nimble_kokkos::Block> blocks_;
320
321 std::vector<Data> host_node_data_;
322 std::vector<Data> device_node_data_;
325
327 std::vector<std::vector<Data>> host_element_data_;
328 std::vector<std::vector<Data>> device_element_data_;
329 std::vector<std::map<int, int>> field_id_to_host_element_data_index_;
330 std::vector<std::map<int, int>> field_id_to_device_element_data_index_;
331
333 std::vector<std::vector<Data>> host_integration_point_data_step_n_;
334 std::vector<std::vector<Data>> host_integration_point_data_step_np1_;
335 std::vector<std::vector<Data>> device_integration_point_data_step_n_;
336 std::vector<std::vector<Data>> device_integration_point_data_step_np1_;
337 std::vector<std::map<int, int>> field_id_to_host_integration_point_data_index_;
339
340 std::unique_ptr<nimble_kokkos::ExodusOutputManager> exodus_output_manager_;
341
342 //--- Work arrays
343 std::vector<nimble_kokkos::DeviceVectorNodeGatheredView> gathered_reference_coordinate_d;
344 std::vector<nimble_kokkos::DeviceVectorNodeGatheredView> gathered_displacement_d;
345 std::vector<nimble_kokkos::DeviceVectorNodeGatheredView> gathered_internal_force_d;
346 std::vector<nimble_kokkos::DeviceVectorNodeGatheredView> gathered_contact_force_d;
347
348 //--- Data for Exodus output
351
354
355 //--- Block data for materials
356 std::vector<nimble::BlockData> block_data_;
357};
358
359} // namespace nimble_kokkos
360
361#endif
Definition nimble_data_manager.h:70
Definition nimble_genesis_mesh.h:59
Definition nimble_material_factory_base.h:61
Definition nimble_model_data_base.h:88
Definition nimble_view.h:72
Definition nimble_kokkos_model_data.cc:60
Definition nimble_kokkos_defs.h:170
void UpdateWithNewVelocity(nimble::DataManager &data_manager, double dt) override
Update model with new velocity.
Definition nimble_kokkos_model_data.cc:1731
void UpdateStates(const nimble::DataManager &data_manager) override
Copy time state (n+1) into time state (n)
Definition nimble_kokkos_model_data.cc:964
void InitializeBlockData(nimble::DataManager &data_manager)
Initialize block data for material information.
Definition nimble_kokkos_model_data.cc:1289
DeviceFullTensorIntPtView GetDeviceFullTensorIntegrationPointData(int block_id, int field_id, nimble::Step step)
Definition nimble_kokkos_model_data.cc:1580
std::vector< std::vector< Data > > host_element_data_
Definition nimble_kokkos_model_data.h:327
int AllocateElementData(int block_id, nimble::Length length, std::string label, int num_objects)
Definition nimble_kokkos_model_data.cc:645
int AllocateIntegrationPointData(int block_id, nimble::Length length, std::string label, int num_objects, std::vector< double > initial_value=std::vector< double >())
Definition nimble_kokkos_model_data.cc:708
DeviceFullTensorElemView GetDeviceFullTensorElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1610
std::vector< std::map< int, int > > field_id_to_host_element_data_index_
Definition nimble_kokkos_model_data.h:329
HostFullTensorIntPtView GetHostFullTensorIntegrationPointData(int block_id, int field_id, nimble::Step step)
Definition nimble_kokkos_model_data.cc:1492
std::map< int, int > block_id_to_integration_point_data_index_
Definition nimble_kokkos_model_data.h:332
std::vector< std::map< int, int > > field_id_to_host_integration_point_data_index_
Definition nimble_kokkos_model_data.h:337
void ScatterScalarNodeDataUsingKokkosScatterView(int field_id, int num_elements, int num_nodes_per_element, const DeviceElementConnectivityView &elem_conn_d, const DeviceScalarNodeGatheredView &gathered_view_d)
Definition nimble_kokkos_model_data.cc:1705
nimble_kokkos::DeviceVectorNodeView displacement_d_
Definition nimble_kokkos_model_data.h:350
std::map< int, int > field_id_to_host_node_data_index_
Definition nimble_kokkos_model_data.h:323
std::vector< std::string > GetVectorNodeDataLabels() const
Definition nimble_kokkos_model_data.cc:1380
void ComputeLumpedMass(nimble::DataManager &data_manager) override
Compute the lumped mass.
Definition nimble_kokkos_model_data.cc:1068
DeviceVectorNodeView GetDeviceVectorNodeData(int field_id)
Definition nimble_kokkos_model_data.cc:1565
nimble_kokkos::DeviceVectorNodeView velocity_d_
Definition nimble_kokkos_model_data.h:353
std::map< int, int > field_id_to_device_node_data_index_
Definition nimble_kokkos_model_data.h:324
HostVectorNodeView GetHostVectorNodeData(int field_id)
Definition nimble_kokkos_model_data.cc:1457
void ComputeInternalForce(nimble::DataManager &data_manager, double time_previous, double time_current, bool is_output_step, const nimble::Viewify< 2 > &displacement, nimble::Viewify< 2 > &force) override
Compute the internal force.
Definition nimble_kokkos_model_data.cc:1155
HostScalarElemView GetHostScalarElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1466
DeviceScalarNodeView GetDeviceScalarNodeData(int field_id)
Definition nimble_kokkos_model_data.cc:1556
std::vector< Data > host_node_data_
Definition nimble_kokkos_model_data.h:321
std::vector< Data > device_node_data_
Definition nimble_kokkos_model_data.h:322
nimble::Viewify< 1 > GetScalarNodeData(int field_id) override
Get view of scalar quantity defined on nodes.
Definition nimble_kokkos_model_data.cc:1024
std::unique_ptr< nimble_kokkos::ExodusOutputManager > exodus_output_manager_
Definition nimble_kokkos_model_data.h:340
std::vector< std::vector< Data > > host_integration_point_data_step_n_
Definition nimble_kokkos_model_data.h:333
nimble_kokkos::HostVectorNodeView velocity_h_
Definition nimble_kokkos_model_data.h:352
DeviceScalarIntPtView GetDeviceScalarIntegrationPointData(int block_id, int field_id, nimble::Step step)
Definition nimble_kokkos_model_data.cc:1586
int AllocateNodeData(nimble::Length length, std::string label, int num_objects) override
Allocate data storage for a node-based quantity.
Definition nimble_kokkos_model_data.cc:597
Field< ft >::View GetDeviceIntPointData(int block_id, int field_id, nimble::Step step)
Definition nimble_kokkos_model_data.cc:1541
DeviceScalarElemView GetDeviceScalarElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1598
int GetFieldId(const std::string &field_label) const override
Returns the field ID for a specific label.
Definition nimble_kokkos_model_data.h:94
HostScalarNodeView GetHostScalarNodeData(int field_id)
Definition nimble_kokkos_model_data.cc:1448
void ScatterScalarNodeData(int field_id, int num_elements, int num_nodes_per_element, const DeviceElementConnectivityView &elem_conn_d, const DeviceScalarNodeGatheredView &gathered_view_d)
Definition nimble_kokkos_model_data.cc:1661
std::vector< std::vector< Data > > host_integration_point_data_step_np1_
Definition nimble_kokkos_model_data.h:334
std::vector< nimble_kokkos::DeviceVectorNodeGatheredView > gathered_contact_force_d
Definition nimble_kokkos_model_data.h:346
void InitializeGatheredVectors(const nimble::GenesisMesh &mesh_)
Definition nimble_kokkos_model_data.cc:1044
std::vector< nimble_kokkos::DeviceVectorNodeGatheredView > gathered_reference_coordinate_d
Definition nimble_kokkos_model_data.h:343
std::vector< nimble_kokkos::DeviceVectorNodeGatheredView > gathered_internal_force_d
Definition nimble_kokkos_model_data.h:345
DeviceSymTensorElemView GetDeviceSymTensorElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1604
std::vector< std::vector< Data > > device_element_data_
Definition nimble_kokkos_model_data.h:328
HostFullTensorElemView GetHostFullTensorElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1518
std::vector< std::map< int, int > > field_id_to_device_integration_point_data_index_
Definition nimble_kokkos_model_data.h:338
nimble::Viewify< 2 > GetVectorNodeData(int field_id) override
Get view of vector quantity defined on nodes.
Definition nimble_kokkos_model_data.cc:1033
std::vector< std::string > GetFullTensorIntegrationPointDataLabels(int block_id) const
Definition nimble_kokkos_model_data.cc:1424
nimble_kokkos::HostVectorNodeView displacement_h_
Definition nimble_kokkos_model_data.h:349
std::map< int, int > block_id_to_element_data_index_
Definition nimble_kokkos_model_data.h:326
HostSymTensorElemView GetHostSymTensorElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1507
std::vector< std::vector< Data > > device_integration_point_data_step_np1_
Definition nimble_kokkos_model_data.h:336
HostSymTensorIntPtView GetHostSymTensorIntegrationPointData(int block_id, int field_id, nimble::Step step)
Definition nimble_kokkos_model_data.cc:1477
DeviceScalarNodeGatheredView GatherScalarNodeData(int field_id, int num_elements, int num_nodes_per_element, const DeviceElementConnectivityView &elem_conn_d, DeviceScalarNodeGatheredView gathered_view_d)
Definition nimble_kokkos_model_data.cc:1616
std::vector< std::string > GetScalarNodeDataLabels() const
Definition nimble_kokkos_model_data.cc:1361
std::vector< int > GetBlockIds() const
Definition nimble_kokkos_model_data.cc:886
ModelData()
Definition nimble_kokkos_model_data.cc:592
std::vector< std::map< int, int > > field_id_to_device_element_data_index_
Definition nimble_kokkos_model_data.h:330
DeviceSymTensorIntPtView GetDeviceSymTensorIntegrationPointData(int block_id, int field_id, nimble::Step step)
Definition nimble_kokkos_model_data.cc:1574
std::vector< nimble_kokkos::DeviceVectorNodeGatheredView > gathered_displacement_d
Definition nimble_kokkos_model_data.h:344
void ScatterVectorNodeData(int field_id, int num_elements, int num_nodes_per_element, const DeviceElementConnectivityView &elem_conn_d, const DeviceVectorNodeGatheredView &gathered_view_d)
Definition nimble_kokkos_model_data.cc:1681
Field< ft >::View GetDeviceElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1530
std::map< int, nimble_kokkos::Block > blocks_
Blocks.
Definition nimble_kokkos_model_data.h:319
void WriteExodusOutput(nimble::DataManager &data_manager, double time_current) override
Write output of simulation in Exodus format.
Definition nimble_kokkos_model_data.cc:1332
std::vector< nimble::BlockData > block_data_
Definition nimble_kokkos_model_data.h:356
std::vector< std::string > GetSymmetricTensorIntegrationPointDataLabels(int block_id) const
Definition nimble_kokkos_model_data.cc:1399
std::map< std::string, int > field_label_to_field_id_map_
Definition nimble_kokkos_model_data.h:316
void InitializeBlocks(nimble::DataManager &data_manager, const std::shared_ptr< nimble::MaterialFactoryBase > &material_factory_base) override
Initialize the different blocks in the mesh.
Definition nimble_kokkos_model_data.cc:894
std::vector< std::vector< Data > > device_integration_point_data_step_n_
Definition nimble_kokkos_model_data.h:335
void UpdateWithNewDisplacement(nimble::DataManager &data_manager, double dt) override
Update model with new displacement.
Definition nimble_kokkos_model_data.cc:1737
void InitializeExodusOutput(nimble::DataManager &data_manager) override
Definition nimble_kokkos_model_data.cc:1306
DeviceVectorNodeGatheredView GatherVectorNodeData(int field_id, int num_elements, int num_nodes_per_element, const DeviceElementConnectivityView &elem_conn_d, DeviceVectorNodeGatheredView gathered_view_d)
Definition nimble_kokkos_model_data.cc:1637
std::unique_ptr< FieldBase > Data
Definition nimble_kokkos_model_data.h:314
DeviceVectorIntPtView GetDeviceVectorIntegrationPointData(int block_id, int field_id, nimble::Step step)
Definition nimble_kokkos_model_data.cc:1592
~ModelData() override
Definition nimble_kokkos_model_data.cc:594
Definition nimble_contact_manager.h:68
Field< FieldType::HostScalarElem >::View HostScalarElemView
Definition nimble_kokkos_defs.h:574
Field< FieldType::HostFullTensorElem >::View HostFullTensorElemView
Definition nimble_kokkos_defs.h:575
Field< FieldType::DeviceScalarElem >::View DeviceScalarElemView
Definition nimble_kokkos_defs.h:600
Field< FieldType::HostScalarNode >::View HostScalarNodeView
Definition nimble_kokkos_defs.h:570
Field< FieldType::HostVectorNode >::View HostVectorNodeView
Definition nimble_kokkos_defs.h:571
Field< FieldType::DeviceVectorIntPt >::View DeviceVectorIntPtView
Definition nimble_kokkos_defs.h:597
Field< FieldType::DeviceScalarIntPt >::View DeviceScalarIntPtView
Definition nimble_kokkos_defs.h:594
Field< FieldType::DeviceVectorNode >::View DeviceVectorNodeView
Definition nimble_kokkos_defs.h:585
Field< FieldType::HostSymTensorElem >::View HostSymTensorElemView
Definition nimble_kokkos_defs.h:576
Field< FieldType::DeviceSymTensorIntPt >::View DeviceSymTensorIntPtView
Definition nimble_kokkos_defs.h:591
Field< FieldType::DeviceScalarNode >::GatheredView DeviceScalarNodeGatheredView
Definition nimble_kokkos_defs.h:583
Field< FieldType::HostFullTensorIntPt >::View HostFullTensorIntPtView
Definition nimble_kokkos_defs.h:572
Kokkos::View< int *, kokkos_device > DeviceElementConnectivityView
Definition nimble_kokkos_defs.h:607
Field< FieldType::DeviceFullTensorElem >::View DeviceFullTensorElemView
Definition nimble_kokkos_defs.h:602
Field< FieldType::DeviceScalarNode >::View DeviceScalarNodeView
Definition nimble_kokkos_defs.h:582
Field< FieldType::DeviceSymTensorElem >::View DeviceSymTensorElemView
Definition nimble_kokkos_defs.h:604
Field< FieldType::DeviceVectorNode >::GatheredView DeviceVectorNodeGatheredView
Definition nimble_kokkos_defs.h:586
Field< FieldType::DeviceFullTensorIntPt >::View DeviceFullTensorIntPtView
Definition nimble_kokkos_defs.h:588
Field< FieldType::HostSymTensorIntPt >::View HostSymTensorIntPtView
Definition nimble_kokkos_defs.h:573
Definition kokkos_contact_manager.h:49
Length
Definition nimble_data_utils.h:66
Step
Definition nimble_data_utils.h:96