From b09550ea317c7165c4f17816e72fd08bbcf4b085 Mon Sep 17 00:00:00 2001 From: "Kurt A. O'Hearn" <ohearnku@msu.edu> Date: Tue, 7 Dec 2021 14:51:18 -0500 Subject: [PATCH] sPuReMD: add support for setting charge computation frequency (charge_freq). --- sPuReMD/src/control.c | 5 +++ sPuReMD/src/forces.c | 85 +++++++++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 36 deletions(-) diff --git a/sPuReMD/src/control.c b/sPuReMD/src/control.c index da6c1ff..03f9a79 100644 --- a/sPuReMD/src/control.c +++ b/sPuReMD/src/control.c @@ -137,6 +137,10 @@ int Set_Control_Parameter( const char * const keyword, { control->charge_method = sstrtol( values[0], __FILE__, __LINE__ ); } + else if ( strncmp(keyword, "charge_freq", MAX_LINE) == 0 ) + { + control->charge_freq = sstrtol( values[0], __FILE__, __LINE__ ); + } else if ( strncmp(keyword, "cm_q_net", MAX_LINE) == 0 ) { val = sstrtod( values[0], __FILE__, __LINE__ ); @@ -512,6 +516,7 @@ void Set_Control_Defaults( reax_system * const system, control->restrict_type = 0; control->charge_method = QEQ_CM; + control->charge_freq = 1; control->cm_q_net = 0.0; control->cm_solver_type = GMRES_S; control->cm_solver_max_iters = 100; diff --git a/sPuReMD/src/forces.c b/sPuReMD/src/forces.c index cb4d77c..7a1258a 100644 --- a/sPuReMD/src/forces.c +++ b/sPuReMD/src/forces.c @@ -140,8 +140,6 @@ static void Compute_NonBonded_Forces( reax_system *system, control_params *contr simulation_data *data, static_storage *workspace, reax_list** lists, output_controls *out_control, int realloc ) { - real t_start, t_elapsed; - #if defined(TEST_ENERGY) fprintf( out_control->evdw, "step: %d\n%6s%6s%12s%12s%12s\n", data->step, "atom1", "atom2", "r12", "evdw", "total" ); @@ -149,38 +147,6 @@ static void Compute_NonBonded_Forces( reax_system *system, control_params *contr data->step, "atom1", "atom2", "r12", "q1", "q2", "ecou", "total" ); #endif - t_start = Get_Time( ); - Compute_Charges( system, control, data, workspace, out_control, realloc ); - t_elapsed = Get_Timing_Info( t_start ); - data->timing.cm += t_elapsed; - - if ( control->cm_solver_pre_comp_refactor == -1 ) - { - if ( data->step <= 4 || is_refactoring_step( control, data ) ) - { - if ( is_refactoring_step( control, data ) ) - { - data->timing.cm_last_pre_comp = data->timing.cm_solver_pre_comp; - } - - data->timing.cm_optimum = data->timing.cm_solver_pre_app - + data->timing.cm_solver_spmv - + data->timing.cm_solver_vector_ops - + data->timing.cm_solver_orthog - + data->timing.cm_solver_tri_solve; - data->timing.cm_total_loss = 0.0; - } - else - { - data->timing.cm_total_loss += data->timing.cm_solver_pre_app - + data->timing.cm_solver_spmv - + data->timing.cm_solver_vector_ops - + data->timing.cm_solver_orthog - + data->timing.cm_solver_tri_solve - - data->timing.cm_optimum; - } - } - if ( control->tabulate <= 0 ) { vdW_Coulomb_Energy( system, control, data, workspace, lists, out_control ); @@ -1274,7 +1240,9 @@ static int Init_Forces( reax_system * const system, dist_done = TRUE; } - if ( cm_done == FALSE ) + if ( (control->charge_freq > 0 + && (data->step - data->prev_steps) % control->charge_freq == 0) + && cm_done == FALSE ) { if ( control->tabulate <= 0 ) { @@ -1597,9 +1565,19 @@ int Compute_Forces( reax_system * const system, control_params * const control, simulation_data * const data, static_storage * const workspace, reax_list ** const lists, output_controls * const out_control, int realloc ) { - int ret; + int charge_flag, ret; real t_start, t_elapsed; + if ( control->charge_freq > 0 + && (data->step - data->prev_steps) % control->charge_freq == 0 ) + { + charge_flag = TRUE; + } + else + { + charge_flag = FALSE; + } + t_start = Get_Time( ); ret = Init_Forces( system, control, data, workspace, lists, out_control ); t_elapsed = Get_Timing_Info( t_start ); @@ -1618,6 +1596,41 @@ int Compute_Forces( reax_system * const system, control_params * const control, t_elapsed = Get_Timing_Info( t_start ); data->timing.bonded += t_elapsed; + if ( charge_flag == TRUE ) + { + t_start = Get_Time( ); + Compute_Charges( system, control, data, workspace, out_control, realloc ); + t_elapsed = Get_Timing_Info( t_start ); + data->timing.cm += t_elapsed; + } + + if ( control->cm_solver_pre_comp_refactor == -1 ) + { + if ( data->step <= 4 || is_refactoring_step( control, data ) ) + { + if ( is_refactoring_step( control, data ) ) + { + data->timing.cm_last_pre_comp = data->timing.cm_solver_pre_comp; + } + + data->timing.cm_optimum = data->timing.cm_solver_pre_app + + data->timing.cm_solver_spmv + + data->timing.cm_solver_vector_ops + + data->timing.cm_solver_orthog + + data->timing.cm_solver_tri_solve; + data->timing.cm_total_loss = 0.0; + } + else + { + data->timing.cm_total_loss += data->timing.cm_solver_pre_app + + data->timing.cm_solver_spmv + + data->timing.cm_solver_vector_ops + + data->timing.cm_solver_orthog + + data->timing.cm_solver_tri_solve + - data->timing.cm_optimum; + } + } + t_start = Get_Time( ); Compute_NonBonded_Forces( system, control, data, workspace, lists, out_control, realloc ); -- GitLab