From efc8bf29ea491a89ae55bb9b5b0d3b15a8465157 Mon Sep 17 00:00:00 2001 From: CGH0S7 Date: Wed, 25 Feb 2026 16:00:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=89=E9=9C=80=E5=A4=B1=E6=95=88=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E7=BC=93=E5=AD=98=EF=BC=9ARegrid=5FOnelevel=20?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E8=BF=94=E5=9B=9E=20bool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 cgh::Regrid_Onelevel 的返回类型从 void 改为 bool, 在网格真正发生移动时返回 true,否则返回 false。 调用方仅在返回 true 时才失效 sync_cache_*,避免了 每次 RecursiveStep 结束后无条件失效所有层级缓存的冗余开销。 Co-Authored-By: Claude Sonnet 4.6 (1M context) --- AMSS_NCKU_source/bssn_class.C | 24 ++++++++++++------------ AMSS_NCKU_source/cgh.C | 7 ++++--- AMSS_NCKU_source/cgh.h | 2 +- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/AMSS_NCKU_source/bssn_class.C b/AMSS_NCKU_source/bssn_class.C index 18f1388..eb84f8e 100644 --- a/AMSS_NCKU_source/bssn_class.C +++ b/AMSS_NCKU_source/bssn_class.C @@ -2426,9 +2426,9 @@ void bssn_class::RecursiveStep(int lev) #endif #if (REGLEV == 0) - GH->Regrid_Onelevel(lev, Symmetry, BH_num, Porgbr, Porg0, + if (GH->Regrid_Onelevel(lev, Symmetry, BH_num, Porgbr, Porg0, SynchList_cor, OldStateList, StateList, SynchList_pre, - fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor); + fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor)) for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); } #endif } @@ -2605,9 +2605,9 @@ void bssn_class::ParallelStep() delete[] tporg; delete[] tporgo; #if (REGLEV == 0) - GH->Regrid_Onelevel(GH->mylev, Symmetry, BH_num, Porgbr, Porg0, + if (GH->Regrid_Onelevel(GH->mylev, Symmetry, BH_num, Porgbr, Porg0, SynchList_cor, OldStateList, StateList, SynchList_pre, - fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor); + fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor)) for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); } #endif } @@ -2772,9 +2772,9 @@ void bssn_class::ParallelStep() if (lev + 1 >= GH->movls) { // GH->Regrid_Onelevel_aux(lev,Symmetry,BH_num,Porgbr,Porg0, - GH->Regrid_Onelevel(lev + 1, Symmetry, BH_num, Porgbr, Porg0, + if (GH->Regrid_Onelevel(lev + 1, Symmetry, BH_num, Porgbr, Porg0, SynchList_cor, OldStateList, StateList, SynchList_pre, - fgt(PhysTime - dT_levp1, StartTime, dT_levp1 / 2), ErrorMonitor); + fgt(PhysTime - dT_levp1, StartTime, dT_levp1 / 2), ErrorMonitor)) for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); } // a_stream.clear(); @@ -2787,9 +2787,9 @@ void bssn_class::ParallelStep() // for this level if (YN == 1) { - GH->Regrid_Onelevel(lev, Symmetry, BH_num, Porgbr, Porg0, + if (GH->Regrid_Onelevel(lev, Symmetry, BH_num, Porgbr, Porg0, SynchList_cor, OldStateList, StateList, SynchList_pre, - fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor); + fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor)) for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); } // a_stream.clear(); @@ -2806,9 +2806,9 @@ void bssn_class::ParallelStep() if (YN == 1) { // GH->Regrid_Onelevel_aux(lev-2,Symmetry,BH_num,Porgbr,Porg0, - GH->Regrid_Onelevel(lev - 1, Symmetry, BH_num, Porgbr, Porg0, + if (GH->Regrid_Onelevel(lev - 1, Symmetry, BH_num, Porgbr, Porg0, SynchList_cor, OldStateList, StateList, SynchList_pre, - fgt(PhysTime - dT_lev, StartTime, dT_levm1 / 2), ErrorMonitor); + fgt(PhysTime - dT_lev, StartTime, dT_levm1 / 2), ErrorMonitor)) for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); } // a_stream.clear(); @@ -2822,9 +2822,9 @@ void bssn_class::ParallelStep() if (i % 4 == 3) { // GH->Regrid_Onelevel_aux(lev-2,Symmetry,BH_num,Porgbr,Porg0, - GH->Regrid_Onelevel(lev - 1, Symmetry, BH_num, Porgbr, Porg0, + if (GH->Regrid_Onelevel(lev - 1, Symmetry, BH_num, Porgbr, Porg0, SynchList_cor, OldStateList, StateList, SynchList_pre, - fgt(PhysTime - dT_lev, StartTime, dT_levm1 / 2), ErrorMonitor); + fgt(PhysTime - dT_lev, StartTime, dT_levm1 / 2), ErrorMonitor)) for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); } // a_stream.clear(); diff --git a/AMSS_NCKU_source/cgh.C b/AMSS_NCKU_source/cgh.C index e27ccd6..2f7f2a0 100644 --- a/AMSS_NCKU_source/cgh.C +++ b/AMSS_NCKU_source/cgh.C @@ -1301,13 +1301,13 @@ bool cgh::Interp_One_Point(MyList *VarList, } -void cgh::Regrid_Onelevel(int lev, int Symmetry, int BH_num, double **Porgbr, double **Porg0, +bool cgh::Regrid_Onelevel(int lev, int Symmetry, int BH_num, double **Porgbr, double **Porg0, MyList *OldList, MyList *StateList, MyList *FutureList, MyList *tmList, bool BB, monitor *ErrorMonitor) { if (lev < movls) - return; + return false; #if (0) // #if (PSTR == 1 || PSTR == 2) @@ -1396,7 +1396,7 @@ void cgh::Regrid_Onelevel(int lev, int Symmetry, int BH_num, double **Porgbr, do for (bhi = 0; bhi < BH_num; bhi++) delete[] tmpPorg[bhi]; delete[] tmpPorg; - return; + return false; } // x direction rr = (Porg0[bhi][0] - handle[lev][grd][0]) / dX; @@ -1500,6 +1500,7 @@ void cgh::Regrid_Onelevel(int lev, int Symmetry, int BH_num, double **Porgbr, do for (int bhi = 0; bhi < BH_num; bhi++) delete[] tmpPorg[bhi]; delete[] tmpPorg; + return tot_flag; } diff --git a/AMSS_NCKU_source/cgh.h b/AMSS_NCKU_source/cgh.h index 79e7bf6..57e489a 100644 --- a/AMSS_NCKU_source/cgh.h +++ b/AMSS_NCKU_source/cgh.h @@ -74,7 +74,7 @@ public: MyList *OldList, MyList *StateList, MyList *FutureList, MyList *tmList, int Symmetry, bool BB); - void Regrid_Onelevel(int lev, int Symmetry, int BH_num, double **Porgbr, double **Porg0, + bool Regrid_Onelevel(int lev, int Symmetry, int BH_num, double **Porgbr, double **Porg0, MyList *OldList, MyList *StateList, MyList *FutureList, MyList *tmList, bool BB, monitor *ErrorMonitor);