NimbleSM
NimbleSM is a solid mechanics simulation code for dynamic systems
Loading...
Searching...
No Matches
nimble_block.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_BLOCK_H
45#define NIMBLE_BLOCK_H
46
47#include "nimble_block_base.h"
48#include "nimble_element.h"
49
50#ifdef NIMBLE_HAVE_DARMA
51#include "darma.h"
52#else
53#include <memory>
54#include <string>
55#include <vector>
56#endif
57
58namespace nimble {
59class MaterialFactory;
60}
61
62namespace nimble {
63
65{
66 public:
68
69 ~Block() override = default;
70
71#ifdef NIMBLE_HAVE_DARMA
72 template <typename ArchiveType>
73 void
74 serialize(ArchiveType& ar)
75 {
78 ar | stress_offset_;
83
84 // The purpose for the serialize call can be determined with:
85 // ar.is_sizing()
86 // ar.is_packing()
87 // ar.is_unpacking()
88
89 if (ar.is_unpacking()) {
92 }
93 }
94#endif
95
96 void
97 Initialize(std::string const& model_material_parameters, MaterialFactory& factory);
98
99 void
101
102 void
103 InstantiateElement() override;
104
105 void
106 GetDataLabelsAndLengths(std::vector<std::pair<std::string, Length>>& data_labels_and_lengths);
107
108 void
110 const double* const reference_coordinates,
111 int num_elem,
112 const int* const elem_conn,
113 double* lumped_mass) const;
114
115 void
117 int num_elem_in_block,
118 std::vector<int> const& elem_global_ids_in_block,
119 std::vector<std::string> const& elem_data_labels,
120 std::vector<std::string> const& derived_elem_data_labels,
121 std::vector<double>& elem_data_n,
122 std::vector<double>& elem_data_np1,
123 MaterialFactory& material_factory,
124 DataManager& data_manager);
125
126 void
128 const double* reference_coordinates,
129 const double* displacement,
130 const double* velocity,
131 double* internal_force,
132 double time_previous,
133 double time_current,
134 int num_elem,
135 const int* elem_conn,
136 const int* elem_global_ids,
137 std::vector<std::string> const& elem_data_labels,
138 std::vector<double> const& elem_data_n,
139 std::vector<double>& elem_data_np1,
140 DataManager& data_manager,
141 bool is_output_step,
142 bool compute_stress_only = false) const;
143
144 void
146 const double* const reference_coordinates,
147 const double* const displacement,
148 int num_elem,
149 const int* const elem_conn,
150 int num_elem_data,
151 std::vector<double> const& elem_data_np1,
152 int num_derived_elem_data,
153 std::vector<std::vector<double>>& derived_elem_data);
154
155 protected:
156 void
158 std::vector<std::string> const& elem_data_labels,
159 std::vector<std::string> const& derived_elem_data_labels);
160
161 std::vector<int> def_grad_offset_;
162 std::vector<int> stress_offset_;
163 std::vector<int> state_data_offset_;
165 std::vector<int> vol_ave_offsets_;
167};
168
169} // namespace nimble
170
171#endif // NIMBLE_BLOCK_H
Definition nimble_block_base.h:58
std::string model_material_parameters_
Definition nimble_block_base.h:116
BlockBase()=default
~Block() override=default
void DetermineDataOffsets(std::vector< std::string > const &elem_data_labels, std::vector< std::string > const &derived_elem_data_labels)
Definition nimble_block.cc:500
void GetDataLabelsAndLengths(std::vector< std::pair< std::string, Length > > &data_labels_and_lengths)
Definition nimble_block.cc:85
void InstantiateMaterialModel(MaterialFactory &factory)
Definition nimble_block.cc:67
std::vector< int > def_grad_offset_
Definition nimble_block.h:161
Block()
Definition nimble_block.h:67
std::vector< int > stress_offset_
Definition nimble_block.h:162
void ComputeLumpedMassMatrix(const double *const reference_coordinates, int num_elem, const int *const elem_conn, double *lumped_mass) const
Definition nimble_block.cc:111
int vol_ave_volume_offset_
Definition nimble_block.h:164
void ComputeInternalForce(const double *reference_coordinates, const double *displacement, const double *velocity, double *internal_force, double time_previous, double time_current, int num_elem, const int *elem_conn, const int *elem_global_ids, std::vector< std::string > const &elem_data_labels, std::vector< double > const &elem_data_n, std::vector< double > &elem_data_np1, DataManager &data_manager, bool is_output_step, bool compute_stress_only=false) const
Definition nimble_block.cc:389
void InstantiateElement() override
Definition nimble_block.cc:79
void InitializeElementData(int num_elem_in_block, std::vector< int > const &elem_global_ids_in_block, std::vector< std::string > const &elem_data_labels, std::vector< std::string > const &derived_elem_data_labels, std::vector< double > &elem_data_n, std::vector< double > &elem_data_np1, MaterialFactory &material_factory, DataManager &data_manager)
Definition nimble_block.cc:149
void Initialize(std::string const &model_material_parameters, MaterialFactory &factory)
Definition nimble_block.cc:59
std::vector< int > state_data_offset_
Definition nimble_block.h:163
std::map< int, int > vol_ave_index_to_derived_data_index_
Definition nimble_block.h:166
std::vector< int > vol_ave_offsets_
Definition nimble_block.h:165
void ComputeDerivedElementData(const double *const reference_coordinates, const double *const displacement, int num_elem, const int *const elem_conn, int num_elem_data, std::vector< double > const &elem_data_np1, int num_derived_elem_data, std::vector< std::vector< double > > &derived_elem_data)
Definition nimble_block.cc:439
Definition nimble_data_manager.h:70
Definition nimble_material_factory.h:52
Definition kokkos_contact_manager.h:49