浏览代码

Bug fix in MPI_Node<T>::Unpack(...)

Dhairya Malhotra 11 年之前
父节点
当前提交
d9e1d71cf4
共有 2 个文件被更改,包括 18 次插入5 次删除
  1. 3 2
      include/fmm_pts.txx
  2. 15 3
      include/mpi_node.txx

+ 3 - 2
include/fmm_pts.txx

@@ -183,10 +183,11 @@ template <class Real_t>
 void FMM_Data<Real_t>::InitMultipole(PackedData p0, bool own_data){
   Real_t* data=(Real_t*)p0.data;
   size_t n=p0.length/sizeof(Real_t);
+  if(n==0) return;
   if(own_data){
-    if(n>0) upward_equiv=Vector<Real_t>(n, &data[0], false);
+    upward_equiv=Vector<Real_t>(n, &data[0], false);
   }else{
-    if(n>0) upward_equiv.ReInit(n, &data[0], false);
+    upward_equiv.ReInit(n, &data[0], false);
   }
 }
 

+ 15 - 3
include/mpi_node.txx

@@ -354,7 +354,11 @@ void MPI_Node<T>::Unpack(PackedData p0, bool own_data){
     if(pt_coord[j]){
       Vector<Real_t>& vec=*pt_coord[j];
       size_t vec_sz=(((size_t*)data_ptr)[0]); data_ptr+=sizeof(size_t);
-      vec.ReInit(vec_sz,(Real_t*)data_ptr,own_data);
+      if(own_data){
+        vec=Vector<Real_t>(vec_sz,(Real_t*)data_ptr,false);
+      }else{
+        vec.ReInit(vec_sz,(Real_t*)data_ptr,false);
+      }
       data_ptr+=vec_sz*sizeof(Real_t);
     }else{
       assert(!((size_t*)data_ptr)[0]);
@@ -363,7 +367,11 @@ void MPI_Node<T>::Unpack(PackedData p0, bool own_data){
     if(pt_value[j]){
       Vector<Real_t>& vec=*pt_value[j];
       size_t vec_sz=(((size_t*)data_ptr)[0]); data_ptr+=sizeof(size_t);
-      vec.ReInit(vec_sz,(Real_t*)data_ptr,own_data);
+      if(own_data){
+        vec=Vector<Real_t>(vec_sz,(Real_t*)data_ptr,false);
+      }else{
+        vec.ReInit(vec_sz,(Real_t*)data_ptr,false);
+      }
       data_ptr+=vec_sz*sizeof(Real_t);
     }else{
       assert(!((size_t*)data_ptr)[0]);
@@ -372,7 +380,11 @@ void MPI_Node<T>::Unpack(PackedData p0, bool own_data){
     if(pt_scatter[j]){
       Vector<size_t>& vec=*pt_scatter[j];
       size_t vec_sz=(((size_t*)data_ptr)[0]); data_ptr+=sizeof(size_t);
-      vec.ReInit(vec_sz,(size_t*)data_ptr,own_data);
+      if(own_data){
+        vec=Vector<size_t>(vec_sz,(size_t*)data_ptr,false);
+      }else{
+        vec.ReInit(vec_sz,(size_t*)data_ptr,false);
+      }
       data_ptr+=vec_sz*sizeof(size_t);
     }else{
       assert(!((size_t*)data_ptr)[0]);