20 #ifndef __mast_optimization_design_parameter_vector_h__ 21 #define __mast_optimization_design_parameter_vector_h__ 30 #include <libmesh/parallel.h> 31 #include <libmesh/dof_map.h> 34 namespace Optimization {
37 template <
typename ScalarType>
42 using dv_id_param_map_t = std::map<uint_t, MAST::Optimization::DesignParameter<ScalarType>*>;
53 typename std::map<const MAST::Optimization::DesignParameter<ScalarType>*,
58 for (; it != end; it++)
63 typename std::map<uint_t, MAST::Optimization::DesignParameter<ScalarType>*>::iterator
67 for (; it != end; it++)
76 "Data must be synchronized before call to size()");
85 "Data must be synchronized before call to size()");
94 "Data must be synchronized before call to size()");
103 typename std::map<uint_t, MAST::Optimization::DesignParameter<ScalarType>*>::iterator
116 typename std::map<uint_t, MAST::Optimization::DesignParameter<ScalarType>*>::const_iterator
133 std::map<uint_t, uint_t>::const_iterator
137 id,
"dof ID not in this vector");
158 template <
typename T>
169 typename std::map<const MAST::Optimization::DesignParameter<ScalarType>*,
193 typename std::map<const MAST::Optimization::DesignParameter<ScalarType>*,
204 d->
add<
int>(
"dof_id") =
id;
216 typename std::map<const MAST::Optimization::DesignParameter<ScalarType>*,
227 d->
add<
int>(
"dof_id") =
id;
239 typename std::map<const MAST::Optimization::DesignParameter<ScalarType>*,
243 Assert0(it !=
_data.end(),
"Parameter does not exists in vector");
253 typename std::map<const MAST::Optimization::DesignParameter<ScalarType>*,
257 Assert0(it !=
_data.end(),
"Parameter does not exists in vector");
268 rank_dvs(
_comm.size(), 0);
294 std::map<uint_t, MAST::Optimization::DesignParameter<ScalarType>*>
295 dof_to_ghost_param_map;
306 std::vector<std::vector<uint_t>>
307 ghosted_indices_on_rank_send(
_comm.size()),
308 ghosted_indices_on_rank_recv(
_comm.size()),
309 ghosted_dv_id_on_rank_recv(
_comm.size());
315 owner = dof_map.dof_owner(dof_id);
318 ghosted_indices_on_rank_send[owner].push_back(dof_id);
330 if (i ==
_comm.rank())
331 _comm.send(j, ghosted_indices_on_rank_send[j]);
332 else if (j ==
_comm.rank())
333 _comm.receive(i, ghosted_indices_on_rank_recv[i]);
345 for (
uint_t k=0; k<ghosted_indices_on_rank_recv[i].size(); k++) {
348 Assert2(ghosted_indices_on_rank_recv[i][k]
349 >= dof_map.first_dof(
_comm.rank()),
350 ghosted_indices_on_rank_recv[i][k],
351 dof_map.first_dof(
_comm.rank()),
352 "Requested dof does not belong to this processor");
353 Assert2(ghosted_indices_on_rank_recv[i][k]
354 < dof_map.end_dof(
_comm.rank()),
355 ghosted_indices_on_rank_recv[i][k],
356 dof_map.end_dof(
_comm.rank()),
357 "Requested dof does not belong to this processor");
360 std::map<uint_t, uint_t>::const_iterator
364 "No DV Id found for this dof id");
366 ghosted_indices_on_rank_recv[i][k] = it->second;
375 if (( i ==
_comm.rank() && ghosted_indices_on_rank_recv[j].size()) ||
376 ( j ==
_comm.rank() && ghosted_indices_on_rank_send[i].size())) {
380 if (i ==
_comm.rank())
381 _comm.send(j, ghosted_indices_on_rank_recv[j]);
382 else if (j ==
_comm.rank()) {
384 _comm.receive(i, ghosted_dv_id_on_rank_recv[i]);
387 ghosted_dv_id_on_rank_recv[i].
size(),
388 ghosted_indices_on_rank_send[i].
size(),
389 ghosted_dv_id_on_rank_recv[i].
size(),
390 "Dof and DV ID map sizes must be same");
396 for (
uint_t k=0; k<ghosted_dv_id_on_rank_recv[i].size(); k++) {
398 dof_id = ghosted_indices_on_rank_send[i][k];
399 dv_id = ghosted_dv_id_on_rank_recv[i][k];
400 dof_to_ghost_param_map[dof_id]->set_id(dv_id);
425 const libMesh::Parallel::Communicator&
_comm;
426 std::map<uint_t, MAST::Optimization::DesignParameter<ScalarType>*>
_parameters;
429 std::map<const MAST::Optimization::DesignParameter<ScalarType>*,
441 #endif // __mast_optimization_design_parameter_vector_h__ std::map< uint_t, MAST::Optimization::DesignParameter< ScalarType > * > _parameters
T get_parameter_for_dv(uint_t i, const std::string &nm) const
std::vector< MAST::Optimization::DesignParameter< ScalarType > * > _local_parameters
std::set< uint_t > _dv_index
std::vector< MAST::Optimization::DesignParameter< ScalarType > * > _ghosted_parameters
std::map< uint_t, MAST::Optimization::DesignParameter< ScalarType > * > dv_id_param_map_t
MAST::Base::ParameterData & add_ghosted_topology_parameter(MAST::Optimization::DesignParameter< ScalarType > &p, const uint_t id)
std::map< const MAST::Optimization::DesignParameter< ScalarType > *, MAST::Base::ParameterData * > _data
bool is_design_parameter_index(const uint_t i) const
#define Assert1(cond, v1, msg)
T & add(const std::string &nm)
const dv_id_param_map_t & get_dv_map() const
uint_t local_begin() const
virtual ~DesignParameterVector()
MAST::Base::ParameterData & add_topology_parameter(MAST::Optimization::DesignParameter< ScalarType > &p, const uint_t id)
const libMesh::Parallel::Communicator & _comm
bool is_design_parameter_dof_id(const uint_t i) const
MAST::Base::ParameterData & get_data_for_parameter(const MAST::Optimization::DesignParameter< ScalarType > &p)
const MAST::Base::ParameterData & get_data_for_parameter(const MAST::Optimization::DesignParameter< ScalarType > &p) const
const MAST::Optimization::DesignParameter< ScalarType > & operator[](uint_t i) const
#define Assert0(cond, msg)
std::vector< uint_t > _rank_begin_index
#define Assert2(cond, v1, v2, msg)
std::vector< uint_t > _rank_end_index
DesignParameterVector(const libMesh::Parallel::Communicator &comm)
MAST::Base::ParameterData & add_parameter(MAST::Optimization::DesignParameter< ScalarType > &p)
std::map< uint_t, uint_t > _dof_id_to_dv_id_map
MAST::Optimization::DesignParameter< ScalarType > & operator[](uint_t i)
uint_t get_dv_id_for_topology_dof(const uint_t id) const
void synchronize(const libMesh::DofMap &dof_map)