Commit 1b83e50a authored by Giovanni La Mura's avatar Giovanni La Mura
Browse files

Avoid duplication of configuration objects

parent b47ccbe0
Loading
Loading
Loading
Loading
+5 −13
Original line number Original line Diff line number Diff line
@@ -53,7 +53,7 @@ using namespace std;


// I would like to put it all in a struct, but then I'd have to write a constructor for it, due to members defined as references, creating a worse nightmare than the one I'd like to simplify...
// I would like to put it all in a struct, but then I'd have to write a constructor for it, due to members defined as references, creating a worse nightmare than the one I'd like to simplify...


int cluster_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryConfiguration *gconf, ScatteringAngles *sa, C1 *c1, C1_AddOns *c1ao, C2 *c2, C3 *c3, C4 *c4, C6 *c6, C9 *c9, FILE *output, string output_path, double *gaps, double **tqse, dcomplex **tqspe, double **tqss, dcomplex **tqsps, double ****zpv, double **gapm, dcomplex **gappm, double *argi, double *args, double **gap, dcomplex **gapp, double **tqce, dcomplex **tqcpe, double **tqcs, dcomplex **tqcps, double *duk, fstream &tppoan, double **cextlr, double **cext, double **cmullr, double **cmul, double *gapv, double *tqev, double *tqsv, double *u, double *us, double *un, double *uns, double *up, double *ups, double *unmp, double *unsmp, double *upmp, double *upsmp, double &scan, double &cfmp, double &sfmp, double &cfsp, double &sfsp, double sqsfi, double exri, dcomplex arg, double wn, double vk, Logger *logger);
int cluster_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryConfiguration *gconf, ScatteringAngles *sa, C1 *c1, C1_AddOns *c1ao, C2 *c2, C3 *c3, C4 *c4, C6 *c6, C9 *c9, FILE *output, string output_path, double *gaps, double **tqse, dcomplex **tqspe, double **tqss, dcomplex **tqsps, double ****zpv, double **gapm, dcomplex **gappm, double *argi, double *args, double **gap, dcomplex **gapp, double **tqce, dcomplex **tqcpe, double **tqcs, dcomplex **tqcps, double *duk, fstream &tppoan, double **cextlr, double **cext, double **cmullr, double **cmul, double *gapv, double *tqev, double *tqsv, double *u, double *us, double *un, double *uns, double *up, double *ups, double *unmp, double *unsmp, double *upmp, double *upsmp, double &scan, double &cfmp, double &sfmp, double &cfsp, double &sfsp, double sqsfi, dcomplex arg, double wn, double vk, Logger *logger);


/*! \brief C++ implementation of CLU
/*! \brief C++ implementation of CLU
 *
 *
@@ -265,7 +265,7 @@ void cluster(const string& config_file, const string& data_file, const string& o
      // do the first iteration on jxi488 separately, since it seems to be different from the others
      // do the first iteration on jxi488 separately, since it seems to be different from the others
      int jxi488 = 1;
      int jxi488 = 1;
      chrono::time_point<chrono::high_resolution_clock> start_iter_1 = chrono::high_resolution_clock::now();
      chrono::time_point<chrono::high_resolution_clock> start_iter_1 = chrono::high_resolution_clock::now();
      int jer = cluster_jxi488_cycle(jxi488, sconf, gconf, p_scattering_angles, c1, c1ao, c2, c3, c4, c6, c9, output, output_path, gaps, tqse, tqspe, tqss, tqsps, zpv, gapm, gappm, argi, args, gap, gapp, tqce, tqcpe, tqcs, tqcps, duk, tppoan, cextlr, cext, cmullr, cmul, gapv, tqev, tqsv, u, us, un, uns, up, ups, unmp, unsmp, upmp, upsmp, scan, cfmp, sfmp, cfsp, sfsp, sqsfi, exri, arg, wn, vk, logger);
      int jer = cluster_jxi488_cycle(jxi488, sconf, gconf, p_scattering_angles, c1, c1ao, c2, c3, c4, c6, c9, output, output_path, gaps, tqse, tqspe, tqss, tqsps, zpv, gapm, gappm, argi, args, gap, gapp, tqce, tqcpe, tqcs, tqcps, duk, tppoan, cextlr, cext, cmullr, cmul, gapv, tqev, tqsv, u, us, un, uns, up, ups, unmp, unsmp, upmp, upsmp, scan, cfmp, sfmp, cfsp, sfsp, sqsfi, arg, wn, vk, logger);
      chrono::time_point<chrono::high_resolution_clock> end_iter_1 = chrono::high_resolution_clock::now();
      chrono::time_point<chrono::high_resolution_clock> end_iter_1 = chrono::high_resolution_clock::now();
      elapsed = end_iter_1 - start_iter_1;
      elapsed = end_iter_1 - start_iter_1;
      message = "INFO: First iteration took " + to_string(elapsed.count()) + "s.\n";
      message = "INFO: First iteration took " + to_string(elapsed.count()) + "s.\n";
@@ -285,8 +285,6 @@ void cluster(const string& config_file, const string& data_file, const string& o
	if (myompthread == 0) ompnumthreads = omp_get_num_threads();
	if (myompthread == 0) ompnumthreads = omp_get_num_threads();
#endif
#endif
	// To test parallelism, I will now start feeding this function with "clean" copies of the parameters, so that they will not be changed by previous iterations, and each one will behave as the first one. Define all (empty) variables here, so they have the correct scope, then they get different definitions depending on thread number
	// To test parallelism, I will now start feeding this function with "clean" copies of the parameters, so that they will not be changed by previous iterations, and each one will behave as the first one. Define all (empty) variables here, so they have the correct scope, then they get different definitions depending on thread number
	ScattererConfiguration *sconf_2 = NULL;
	GeometryConfiguration *gconf_2 = NULL;
	C1 *c1_2 = NULL;
	C1 *c1_2 = NULL;
	C1_AddOns *c1ao_2 = NULL;
	C1_AddOns *c1ao_2 = NULL;
	C2 *c2_2 = NULL;
	C2 *c2_2 = NULL;
@@ -336,14 +334,11 @@ void cluster(const string& config_file, const string& data_file, const string& o
	double cfsp_2 = cfsp;
	double cfsp_2 = cfsp;
	double sfsp_2 = sfsp;
	double sfsp_2 = sfsp;
	double sqsfi_2 = sqsfi;
	double sqsfi_2 = sqsfi;
	double exri_2 = exri;
	dcomplex arg_2 = arg;
	dcomplex arg_2 = arg;
	double wn_2 = wn;
	double wn_2 = wn;
	double vk_2 = vk;
	double vk_2 = vk;
	// for threads other than the 0, create distinct copies of all relevant data, while for thread 0 just define new references / pointers to the original ones
	// for threads other than the 0, create distinct copies of all relevant data, while for thread 0 just define new references / pointers to the original ones
	if (myompthread == 0) {
	if (myompthread == 0) {
	  sconf_2 = sconf;
	  gconf_2 = gconf;
	  c1_2 = c1;
	  c1_2 = c1;
	  c1ao_2 = c1ao;
	  c1ao_2 = c1ao;
	  c2_2 = c2;
	  c2_2 = c2;
@@ -390,8 +385,6 @@ void cluster(const string& config_file, const string& data_file, const string& o
	}
	}
	else {
	else {
	  // this is not thread 0, so do create fresh copies of all local variables
	  // this is not thread 0, so do create fresh copies of all local variables
	  sconf_2 = new ScattererConfiguration(*sconf);
	  gconf_2 = new GeometryConfiguration(*gconf);
	  c1_2 = new C1(*c1);
	  c1_2 = new C1(*c1);
	  c1ao_2 = new C1_AddOns(*c1ao);
	  c1ao_2 = new C1_AddOns(*c1ao);
	  c2_2 = new C2(*c2);
	  c2_2 = new C2(*c2);
@@ -520,14 +513,12 @@ void cluster(const string& config_file, const string& data_file, const string& o
	// ok, now I can actually start the parallel calculations
	// ok, now I can actually start the parallel calculations
#pragma omp for
#pragma omp for
	for (jxi488 = 2; jxi488 <= nxi; jxi488++) {
	for (jxi488 = 2; jxi488 <= nxi; jxi488++) {
	  int jer = cluster_jxi488_cycle(jxi488, sconf_2, gconf_2, p_scattering_angles, c1_2, c1ao_2, c2_2, c3_2, c4_2, c6_2, c9_2, output_2, output_path, gaps_2, tqse_2, tqspe_2, tqss_2, tqsps_2, zpv_2, gapm_2, gappm_2, argi_2, args_2, gap_2, gapp_2, tqce_2, tqcpe_2, tqcs_2, tqcps_2, duk_2, tppoan_2, cextlr_2, cext_2, cmullr_2, cmul_2, gapv_2, tqev_2, tqsv_2, u_2, us_2, un_2, uns_2, up_2, ups_2, unmp_2, unsmp_2, upmp_2, upsmp_2, scan_2, cfmp_2, sfmp_2, cfsp_2, sfsp_2, sqsfi_2, exri_2, arg_2, wn_2, vk_2, logger);
	  int jer = cluster_jxi488_cycle(jxi488, sconf, gconf, p_scattering_angles, c1_2, c1ao_2, c2_2, c3_2, c4_2, c6_2, c9_2, output_2, output_path, gaps_2, tqse_2, tqspe_2, tqss_2, tqsps_2, zpv_2, gapm_2, gappm_2, argi_2, args_2, gap_2, gapp_2, tqce_2, tqcpe_2, tqcs_2, tqcps_2, duk_2, tppoan_2, cextlr_2, cext_2, cmullr_2, cmul_2, gapv_2, tqev_2, tqsv_2, u_2, us_2, un_2, uns_2, up_2, ups_2, unmp_2, unsmp_2, upmp_2, upsmp_2, scan_2, cfmp_2, sfmp_2, cfsp_2, sfsp_2, sqsfi_2, arg_2, wn_2, vk_2, logger);
	}
	}


#pragma omp barrier
#pragma omp barrier
	// only threads different from 0 have to free local copies of variables and close local files
	// only threads different from 0 have to free local copies of variables and close local files
	if (myompthread != 0) {
	if (myompthread != 0) {
	  delete sconf_2;
	  delete gconf_2;
	  delete c1_2;
	  delete c1_2;
	  delete c1ao_2;
	  delete c1ao_2;
	  delete c2_2;
	  delete c2_2;
@@ -744,7 +735,7 @@ void cluster(const string& config_file, const string& data_file, const string& o
}
}




int cluster_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryConfiguration *gconf, ScatteringAngles *sa, C1 *c1, C1_AddOns *c1ao, C2 *c2, C3 *c3, C4 *c4, C6 *c6, C9 *c9, FILE *output, string output_path, double *gaps, double **tqse, dcomplex **tqspe, double **tqss, dcomplex **tqsps, double ****zpv, double **gapm, dcomplex **gappm, double *argi, double *args, double **gap, dcomplex **gapp, double **tqce, dcomplex **tqcpe, double **tqcs, dcomplex **tqcps, double *duk, fstream &tppoan, double **cextlr, double **cext, double **cmullr, double **cmul, double *gapv, double *tqev, double *tqsv, double *u, double *us, double *un, double *uns, double *up, double *ups, double *unmp, double *unsmp, double *upmp, double *upsmp, double &scan, double &cfmp, double &sfmp, double &cfsp, double &sfsp, double sqsfi, double exri, dcomplex arg, double wn, double vk, Logger *logger)
int cluster_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryConfiguration *gconf, ScatteringAngles *sa, C1 *c1, C1_AddOns *c1ao, C2 *c2, C3 *c3, C4 *c4, C6 *c6, C9 *c9, FILE *output, string output_path, double *gaps, double **tqse, dcomplex **tqspe, double **tqss, dcomplex **tqsps, double ****zpv, double **gapm, dcomplex **gappm, double *argi, double *args, double **gap, dcomplex **gapp, double **tqce, dcomplex **tqcpe, double **tqcs, dcomplex **tqcps, double *duk, fstream &tppoan, double **cextlr, double **cext, double **cmullr, double **cmul, double *gapv, double *tqev, double *tqsv, double *u, double *us, double *un, double *uns, double *up, double *ups, double *unmp, double *unsmp, double *upmp, double *upsmp, double &scan, double &cfmp, double &sfmp, double &cfsp, double &sfsp, double sqsfi, dcomplex arg, double wn, double vk, Logger *logger)
{
{
  int nxi = (int)sconf->get_param("nxi");
  int nxi = (int)sconf->get_param("nxi");
  logger->log("INFO: running scale iteration " + to_string(jxi488) + " of " + to_string(nxi) + ".\n");
  logger->log("INFO: running scale iteration " + to_string(jxi488) + " of " + to_string(nxi) + ".\n");
@@ -770,6 +761,7 @@ int cluster_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryConf
  fprintf(output, "========== JXI =%3d ====================\n", jxi488);
  fprintf(output, "========== JXI =%3d ====================\n", jxi488);
  double xi = sconf->get_scale(jxi488 - 1);
  double xi = sconf->get_scale(jxi488 - 1);
  double exdc = sconf->get_param("exdc");
  double exdc = sconf->get_param("exdc");
  double exri = sqrt(exdc);
  int idfc = (int)sconf->get_param("idfc");
  int idfc = (int)sconf->get_param("idfc");
  double vkarg = 0.0;
  double vkarg = 0.0;
  if (idfc >= 0) {
  if (idfc >= 0) {