AFEPack
|
#include <MPI_FaceData.h>
公有类型 | |
enum | { dim = FOREST::dim, dow = FOREST::dow } |
typedef FOREST | forest_t |
typedef PACKER | packer_t |
typedef packer_t::data_t | data_t |
typedef HGeometry< dim-1, dow > | geometry_t |
是一个指针类型 | |
公有成员 | |
SyncerPtr () | |
SyncerPtr (const forest_t &forest) | |
SyncerPtr (const forest_t &forest, const packer_t &packer) | |
SyncerPtr (const this_t &syncer) | |
void | set_forest (const forest_t &forest) |
const forest_t & | forest () const |
void | set_packer (const packer_t &packer) |
const packer_t::packer_t * | packer () const |
template<class OBJ > | |
void | attach_send_buffer (const OBJ &obj, const data_t data) const |
template<class OBJ > | |
void | attach_recv_buffer (const OBJ &obj, const data_t data) const |
void | free_data_buffer () |
void | update_transmit_map () |
void | sync (bool is_update_transmit_map=true) |
bool | is_pack_data (geometry_t *geo) const |
void | pack_data (geometry_t *geo, int remote_rank, AFEPack::ostream<> &os) |
void | unpack_data (geometry_t *geo, int remote_rank, AFEPack::istream<> &is) |
私有类型 | |
typedef SyncerPtr< forest_t, packer_t > | this_t |
私有成员 | |
void | new_property () |
void | free_property () |
私有属性 | |
packer_t | _packer |
const forest_t * | _forest |
property_id_t< data_t > | _pid_out |
property_id_t< data_t > | _pid_in |
Transmit_map< geometry_t > | _transmit_map |
SyncerPtr 和 Syncer 的不同之处是实际交换数据的空间是用户自己分配 的,SyncerPtr 自己仅仅记录了用户的数据空间的指针。在部分情况下, 这将会减少一次数据拷贝,使得执行效率得以提升。
请注意下面的例子代码和 Syncer 的不同:
/// 需要交换的数据类型为 std::vector<double>,此处需要在类型中加上指针 typedef MPI::FaceData::FESpace<std::vector<double> *,fe_space_t> data_packer_t; typedef MPI::FaceData::SyncerPtr<forest_t,typename data_packer_t::packer_t> syncer_t;
syncer_t syncer(htree, data_packer_t::get_packer(fem_space)); for (the_dgele 是单元之间的边界) { if (the_dgele 是一个需要交换数据的分区之间的边) { /// 用户需要自行准备发送数据的缓冲区 std::vector<double> * p_send_buf = new std::vector<double)(); ... ... /// 对需要发送的数据进行填充 syncer.attach_send_buffer(*the_dgele, p_send_buf);
/// 与此同时,用户需要自行准备接收数据缓冲区 std::vector<double> * p_recv_buf = new std::vector<double)(); syncer.attach_send_buffer(*the_dgele, p_recv_buf); } } syncer.sync(); /// 交换数据
typedef packer_t::data_t MPI::FaceData::SyncerPtr< FOREST, PACKER >::data_t |
typedef FOREST MPI::FaceData::SyncerPtr< FOREST, PACKER >::forest_t |
typedef HGeometry<dim-1,dow> MPI::FaceData::SyncerPtr< FOREST, PACKER >::geometry_t |
是一个指针类型
typedef PACKER MPI::FaceData::SyncerPtr< FOREST, PACKER >::packer_t |
typedef SyncerPtr<forest_t,packer_t> MPI::FaceData::SyncerPtr< FOREST, PACKER >::this_t [private] |
MPI::FaceData::SyncerPtr< FOREST, PACKER >::SyncerPtr | ( | ) | [inline] |
MPI::FaceData::SyncerPtr< FOREST, PACKER >::SyncerPtr | ( | const forest_t & | forest | ) | [inline] |
MPI::FaceData::SyncerPtr< FOREST, PACKER >::SyncerPtr | ( | const forest_t & | forest, |
const packer_t & | packer | ||
) | [inline] |
MPI::FaceData::SyncerPtr< FOREST, PACKER >::SyncerPtr | ( | const this_t & | syncer | ) | [inline] |
void MPI::FaceData::SyncerPtr< FOREST, PACKER >::attach_recv_buffer | ( | const OBJ & | obj, |
const data_t | data | ||
) | const [inline] |
获取依附于对象上的数据接收缓冲区。OBJ 可以是面几何体或者 DGElement。如果缓冲区没有分配,则会进行分配。
void MPI::FaceData::SyncerPtr< FOREST, PACKER >::attach_send_buffer | ( | const OBJ & | obj, |
const data_t | data | ||
) | const [inline] |
获取依附于对象上的数据发送缓冲区。OBJ 可以是面几何体或者 DGElement。如果缓冲区没有分配,则会进行分配。
const forest_t& MPI::FaceData::SyncerPtr< FOREST, PACKER >::forest | ( | ) | const [inline] |
void MPI::FaceData::SyncerPtr< FOREST, PACKER >::free_data_buffer | ( | ) | [inline] |
显式释放数据缓冲区。
void MPI::FaceData::SyncerPtr< FOREST, PACKER >::free_property | ( | ) | [inline, private] |
bool MPI::FaceData::SyncerPtr< FOREST, PACKER >::is_pack_data | ( | geometry_t * | geo | ) | const [inline] |
此处数据应该是由使用方填入,但并不是所有的面几何体均有此数据。 此处判断仅仅对有数据发送的几何体进行操作。
void MPI::FaceData::SyncerPtr< FOREST, PACKER >::new_property | ( | ) | [inline, private] |
void MPI::FaceData::SyncerPtr< FOREST, PACKER >::pack_data | ( | geometry_t * | geo, |
int | remote_rank, | ||
AFEPack::ostream<> & | os | ||
) | [inline] |
const packer_t::packer_t* MPI::FaceData::SyncerPtr< FOREST, PACKER >::packer | ( | ) | const [inline] |
void MPI::FaceData::SyncerPtr< FOREST, PACKER >::set_forest | ( | const forest_t & | forest | ) | [inline] |
void MPI::FaceData::SyncerPtr< FOREST, PACKER >::set_packer | ( | const packer_t & | packer | ) | [inline] |
void MPI::FaceData::SyncerPtr< FOREST, PACKER >::sync | ( | bool | is_update_transmit_map = true | ) | [inline] |
完成数据的交换。在数据交换前,应将发送数据填入数据发送缓冲区, 在交换后可从数据接收缓冲区中获取解收到的数据。在本类的对象自 身析构后,数据缓冲区将自行释放。数据缓冲区是可以重用的,但是 也可以显式调用 free_data_buffer 将所有数据缓冲区释放。
void MPI::FaceData::SyncerPtr< FOREST, PACKER >::unpack_data | ( | geometry_t * | geo, |
int | remote_rank, | ||
AFEPack::istream<> & | is | ||
) | [inline] |
void MPI::FaceData::SyncerPtr< FOREST, PACKER >::update_transmit_map | ( | ) | [inline] |
const forest_t* MPI::FaceData::SyncerPtr< FOREST, PACKER >::_forest [private] |
packer_t MPI::FaceData::SyncerPtr< FOREST, PACKER >::_packer [private] |
property_id_t<data_t> MPI::FaceData::SyncerPtr< FOREST, PACKER >::_pid_in [private] |
property_id_t<data_t> MPI::FaceData::SyncerPtr< FOREST, PACKER >::_pid_out [private] |
Transmit_map<geometry_t> MPI::FaceData::SyncerPtr< FOREST, PACKER >::_transmit_map [private] |