소스 검색

Exclude far-field for root octant when BC_LEVELS=0

Dhairya Malhotra 8 년 전
부모
커밋
9b7632cd05
1개의 변경된 파일26개의 추가작업 그리고 9개의 파일을 삭제
  1. 26 9
      include/fmm_pts.txx

+ 26 - 9
include/fmm_pts.txx

@@ -787,6 +787,11 @@ Matrix<typename FMMNode::Real_t>& FMM_Pts<FMMNode>::Precomp(int level, Mat_Type
       size_t n_surf=(6*(MultipoleOrder()-1)*(MultipoleOrder()-1)+2);  //Total number of points.
 
       if((M.Dim(0)!=n_surf*ker_dim[0] || M.Dim(1)!=n_surf*ker_dim[1]) && level==0){
+        if(BC_LEVELS==0){ // Set M=0 and break;
+          M.ReInit(n_surf*ker_dim[0],n_surf*ker_dim[1]);
+          M.SetZero();
+          break;
+        }
         Matrix<Real_t> M_m2m[BC_LEVELS+1];
         Matrix<Real_t> M_m2l[BC_LEVELS+1];
         Matrix<Real_t> M_l2l[BC_LEVELS+1];
@@ -1169,10 +1174,16 @@ void FMM_Pts<FMMNode>::CollectNodeData(FMMTree_t* tree, std::vector<FMMNode*>& n
       }
       for(int i=0;i<=MAX_DEPTH;i++){
         for(size_t j=0;j<node_lst_[i].size();j++){
-          if(node_lst_[i][j]->pt_cnt[0])
-          for(size_t k=0;k<chld_cnt;k++){
-            FMMNode_t* node=(FMMNode_t*)node_lst_[i][j]->Child(k);
-            node_lst.push_back(node);
+          if(node_lst_[i][j]->pt_cnt[0]){
+            for(size_t k=0;k<chld_cnt;k++){
+              FMMNode_t* node=(FMMNode_t*)node_lst_[i][j]->Child(k);
+              node_lst.push_back(node);
+            }
+          }else{
+            for(size_t k=0;k<chld_cnt;k++){
+              FMMNode_t* node=(FMMNode_t*)node_lst_[i][j]->Child(k);
+              node->FMMData()->upward_equiv.ReInit(0);
+            }
           }
         }
       }
@@ -1221,10 +1232,16 @@ void FMM_Pts<FMMNode>::CollectNodeData(FMMTree_t* tree, std::vector<FMMNode*>& n
       }
       for(int i=0;i<=MAX_DEPTH;i++){
         for(size_t j=0;j<node_lst_[i].size();j++){
-          if(node_lst_[i][j]->pt_cnt[1])
-          for(size_t k=0;k<chld_cnt;k++){
-            FMMNode_t* node=(FMMNode_t*)node_lst_[i][j]->Child(k);
-            node_lst.push_back(node);
+          if(node_lst_[i][j]->pt_cnt[1]){
+            for(size_t k=0;k<chld_cnt;k++){
+              FMMNode_t* node=(FMMNode_t*)node_lst_[i][j]->Child(k);
+              node_lst.push_back(node);
+            }
+          }else{
+            for(size_t k=0;k<chld_cnt;k++){
+              FMMNode_t* node=(FMMNode_t*)node_lst_[i][j]->Child(k);
+              node->FMMData()->dnward_equiv.ReInit(0);
+            }
           }
         }
       }
@@ -5525,7 +5542,7 @@ void FMM_Pts<FMMNode>::Down2Target(SetupData<Real_t>&  setup_data, bool device){
 
 template <class FMMNode>
 void FMM_Pts<FMMNode>::PostProcessing(FMMTree_t* tree, std::vector<FMMNode_t*>& nodes, BoundaryType bndry){
-  if(kernel->k_m2l->vol_poten && bndry==Periodic){ // Add analytical near-field to target potential
+  if(kernel->k_m2l->vol_poten && bndry==Periodic && BC_LEVELS>0){ // Add analytical near-field to target potential
     const Kernel<Real_t>& k_m2t=*kernel->k_m2t;
     int ker_dim[2]={k_m2t.ker_dim[0],k_m2t.ker_dim[1]};