20 #ifndef __mast_optimization_topology_simp_libmesh_volume_h__ 21 #define __mast_optimization_topology_simp_libmesh_volume_h__ 30 #include <libmesh/nonlinear_implicit_system.h> 31 #include <libmesh/dof_map.h> 32 #include <libmesh/elem.h> 36 namespace Optimization {
39 namespace libMeshWrapper {
41 template <
typename ScalarType>
49 template <
typename VecType,
typename ContextType>
51 const VecType &density)
const {
58 sys_num = c.rho_sys->number(),
62 density_accessor (*c.rho_sys, density);
64 libMesh::MeshBase::element_iterator
65 it = c.mesh->active_local_elements_begin(),
66 end = c.mesh->active_local_elements_end();
68 for ( ; it != end; it++) {
70 const libMesh::Elem& e = **it;
77 for (
uint_t i=0; i<n_nodes; i++) {
79 const libMesh::Node& n = *e.node_ptr(i);
83 n.dof_number(sys_num, 0, 0));
86 rho /= (1. * n_nodes);
89 volume += e.volume() * rho;
98 template <
typename VecType,
typename ContextType,
typename DensityFilterType>
100 const VecType &density,
101 const DensityFilterType &filter)
const {
108 sys_num = c.rho_sys->number(),
112 density_accessor (*c.rho_sys, density);
114 libMesh::MeshBase::element_iterator
115 it = c.mesh->active_local_elements_begin(),
116 end = c.mesh->active_local_elements_end();
118 for ( ; it != end; it++) {
120 const libMesh::Elem& e = **it;
127 for (
uint_t i=0; i<n_nodes; i++) {
129 const libMesh::Node& n = *e.node_ptr(i);
132 (density, n.dof_number(sys_num, 0, 0)));
135 rho /= (1. * n_nodes);
138 volume += e.volume() * rho;
149 template <
typename VecType,
150 typename ContextType,
151 typename GeometricFilterType>
153 const VecType &density,
154 const GeometricFilterType &filter,
156 std::vector<ScalarType> &sens) {
159 dvs.
size(), sens.size(),
160 "DV and sensitivity vectors must have same size");
163 n_density_dofs = c.rho_sys->n_dofs(),
167 std::unique_ptr<VecType>
168 v (MAST::Numerics::Utility::build<VecType>(*c.rho_sys).release()),
169 v_filtered (MAST::Numerics::Utility::build<VecType>(*c.rho_sys).release());
174 density_accessor (*c.rho_sys, density);
176 libMesh::MeshBase::const_element_iterator
177 el = c.mesh->active_local_elements_begin(),
178 end_el = c.mesh->active_local_elements_end();
185 for ( ; el != end_el; ++el) {
190 e_vol = c.elem->volume();
192 density_accessor.init(*c.elem);
194 const std::vector<libMesh::dof_id_type>
195 &density_dof_ids = density_accessor.dof_indices();
199 for (
uint_t i=0; i<n_nodes; i++) {
207 e_vol/(1. * n_nodes));
214 filter.compute_reverse_filtered_values(*v, *v_filtered);
231 template <
typename VecType,
232 typename ContextType,
233 typename DensityFilterType,
234 typename GeometricFilterType>
236 const VecType &density,
237 const DensityFilterType &density_filter,
238 const GeometricFilterType &geom_filter,
240 std::vector<ScalarType> &sens) {
243 dvs.
size(), sens.size(),
244 "DV and sensitivity vectors must have same size");
247 sys_num = c.rho_sys->number(),
248 n_density_dofs = c.rho_sys->n_dofs(),
253 std::unique_ptr<VecType>
254 v (MAST::Numerics::Utility::build<VecType>(*c.rho_sys).release()),
255 v_filtered (MAST::Numerics::Utility::build<VecType>(*c.rho_sys).release());
260 density_accessor (*c.rho_sys, density);
262 libMesh::MeshBase::const_element_iterator
263 el = c.mesh->active_local_elements_begin(),
264 end_el = c.mesh->active_local_elements_end();
271 for ( ; el != end_el; ++el) {
276 e_vol = c.elem->volume();
278 density_accessor.init(*c.elem);
280 const std::vector<libMesh::dof_id_type>
281 &density_dof_ids = density_accessor.dof_indices();
285 for (
uint_t i=0; i<n_nodes; i++) {
287 const libMesh::Node& n = *c.elem->node_ptr(i);
296 e_vol/(1. * n_nodes) *
298 (density, n.dof_number(sys_num, 0, 0)),
306 geom_filter.compute_reverse_filtered_values(*v, *v_filtered);
332 #endif // __mast_optimization_topology_simp_libmesh_volume_h__ ScalarType get(const std::vector< ScalarType > &v, uint_t i)
ScalarType compute(ContextType &c, const VecType &density, const DensityFilterType &filter) const
void derivative(ContextType &c, const VecType &density, const GeometricFilterType &filter, const MAST::Optimization::DesignParameterVector< ScalarType > &dvs, std::vector< ScalarType > &sens)
ScalarType compute(ContextType &c, const VecType &density) const
uint_t local_begin() const
void finalize(ValType &m)
const MAST::Base::ParameterData & get_data_for_parameter(const MAST::Optimization::DesignParameter< ScalarType > &p) const
void derivative(ContextType &c, const VecType &density, const DensityFilterType &density_filter, const GeometricFilterType &geom_filter, const MAST::Optimization::DesignParameterVector< ScalarType > &dvs, std::vector< ScalarType > &sens)
uint_t n_linear_basis_nodes_on_elem(const libMesh::Elem &e)
identifies number of ndoes on element
void add(std::vector< ScalarType > &v, uint_t i, ScalarType s)
#define Assert2(cond, v1, v2, msg)
void comm_sum(const libMesh::Parallel::Communicator &comm, real_t &v)