diff --git a/src/libnptm/Configuration.cpp b/src/libnptm/Configuration.cpp
index 517e7ea9726a80a758d512df4b69d1412bcb225f..7307de8c6e984f063b65c04dd334579fd508b0b8 100644
--- a/src/libnptm/Configuration.cpp
+++ b/src/libnptm/Configuration.cpp
@@ -13,921 +13,907 @@
 using namespace std;
 
 GeometryConfiguration::GeometryConfiguration(
-		int _nsph, int _lm, int _in_pol, int _npnt, int _npntts, int _isam,
-		int _li, int _le, int _mxndm, int _iavm,
-		double *x, double *y, double *z,
-		double in_th_start, double in_th_step, double in_th_end,
-		double sc_th_start, double sc_th_step, double sc_th_end,
-		double in_ph_start, double in_ph_step, double in_ph_end,
-		double sc_ph_start, double sc_ph_step, double sc_ph_end,
-		int _jwtm
-	) {
-	number_of_spheres = _nsph;
-	l_max = _lm;
-	in_pol = _in_pol;
-	npnt = _npnt;
-	npntts = _npntts;
-	meridional_type = _isam;
-	li = _li;
-	le = _le;
-	mxndm = _mxndm;
-	iavm = _iavm;
-	in_theta_start = in_th_start;
-	in_theta_step = in_th_step;
-	in_theta_end = in_th_end;
-	in_phi_start = in_ph_start;
-	in_phi_step = in_ph_step;
-	in_phi_end = in_ph_end;
-	sc_theta_start = sc_th_start;
-	sc_theta_step = sc_th_step;
-	sc_theta_end = sc_th_end;
-	sc_phi_start = sc_ph_start;
-	sc_phi_step = sc_ph_step;
-	sc_phi_end = sc_ph_end;
-	jwtm = _jwtm;
-	sph_x = x;
-	sph_y = y;
-	sph_z = z;
+					     int _nsph, int _lm, int _in_pol, int _npnt, int _npntts, int _isam,
+					     int _li, int _le, int _mxndm, int _iavm,
+					     double *x, double *y, double *z,
+					     double in_th_start, double in_th_step, double in_th_end,
+					     double sc_th_start, double sc_th_step, double sc_th_end,
+					     double in_ph_start, double in_ph_step, double in_ph_end,
+					     double sc_ph_start, double sc_ph_step, double sc_ph_end,
+					     int _jwtm
+					     ) {
+  number_of_spheres = _nsph;
+  l_max = _lm;
+  in_pol = _in_pol;
+  npnt = _npnt;
+  npntts = _npntts;
+  meridional_type = _isam;
+  li = _li;
+  le = _le;
+  mxndm = _mxndm;
+  iavm = _iavm;
+  in_theta_start = in_th_start;
+  in_theta_step = in_th_step;
+  in_theta_end = in_th_end;
+  in_phi_start = in_ph_start;
+  in_phi_step = in_ph_step;
+  in_phi_end = in_ph_end;
+  sc_theta_start = sc_th_start;
+  sc_theta_step = sc_th_step;
+  sc_theta_end = sc_th_end;
+  sc_phi_start = sc_ph_start;
+  sc_phi_step = sc_ph_step;
+  sc_phi_end = sc_ph_end;
+  jwtm = _jwtm;
+  sph_x = x;
+  sph_y = y;
+  sph_z = z;
 }
 
 GeometryConfiguration::~GeometryConfiguration() {
-	delete[] sph_x;
-	delete[] sph_y;
-	delete[] sph_z;
+  delete[] sph_x;
+  delete[] sph_y;
+  delete[] sph_z;
 }
 
 GeometryConfiguration* GeometryConfiguration::from_legacy(string file_name) {
-	int num_lines = 0;
-	int last_read_line = 0;
-	string *file_lines;
-	string str_target, str_num;
-	smatch m;
-	try {
-		file_lines = load_file(file_name, &num_lines);
-	} catch (exception &ex) {
-		throw OpenConfigurationFileException(file_name);
-	}
-	int _nsph = 0, _lm = 0, _in_pol = 0, _npnt = 0, _npntts = 0, _isam = 0;
-	int _li = 0, _le = 0, _mxndm = 0, _iavm = 0;
-	regex re = regex("-?[0-9]+");
-	str_target = file_lines[last_read_line++];
+  int num_lines = 0;
+  int last_read_line = 0;
+  string *file_lines;
+  string str_target, str_num;
+  smatch m;
+  try {
+    file_lines = load_file(file_name, &num_lines);
+  } catch (exception &ex) {
+    throw OpenConfigurationFileException(file_name);
+  }
+  int _nsph = 0, _lm = 0, _in_pol = 0, _npnt = 0, _npntts = 0, _isam = 0;
+  int _li = 0, _le = 0, _mxndm = 0, _iavm = 0;
+  regex re = regex("-?[0-9]+");
+  str_target = file_lines[last_read_line++];
+  regex_search(str_target, m, re);
+  _nsph = stoi(m.str());
+  if (_nsph == 1) {
+    for (int ri = 0; ri < 5; ri++) {
+      str_target = m.suffix().str();
+      regex_search(str_target, m, re);
+      if (ri == 0) _lm = stoi(m.str());
+      if (ri == 1) _in_pol = stoi(m.str());
+      if (ri == 2) _npnt = stoi(m.str());
+      if (ri == 3) _npntts = stoi(m.str());
+      if (ri == 4) _isam = stoi(m.str());
+    }
+  } else {
+    for (int ri = 0; ri < 8; ri++) {
+      str_target = m.suffix().str();
+      regex_search(str_target, m, re);
+      if (ri == 0) _li = stoi(m.str());
+      if (ri == 1) _le = stoi(m.str());
+      if (ri == 2) _mxndm = stoi(m.str());
+      if (ri == 3) _in_pol = stoi(m.str());
+      if (ri == 4) _npnt = stoi(m.str());
+      if (ri == 5) _npntts = stoi(m.str());
+      if (ri == 6) _iavm = stoi(m.str());
+      if (ri == 7) _isam = stoi(m.str());
+    }
+  }
+  double *x, *y, *z;
+  x = new double[_nsph];
+  y = new double[_nsph];
+  z = new double[_nsph];
+  if (_nsph == 1) {
+    x[0] = 0.0;
+    y[0] = 0.0;
+    z[0] = 0.0;
+  } else {
+    for (int i = 0; i < _nsph; i++) {
+      str_target = file_lines[last_read_line++];
+      re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
+      for (int ri = 0; ri < 3; ri++) {
 	regex_search(str_target, m, re);
-	//sscanf(file_lines[last_read_line].c_str(), " %d", &_nsph);
-	_nsph = stoi(m.str());
-	if (_nsph == 1) {
-		//sscanf(
-		//		file_lines[last_read_line++].c_str(),
-		//		" %*d %d %d %d %d %d",
-		//		&_lm, &_in_pol, &_npnt, &_npntts, &_isam
-		//);
-		for (int ri = 0; ri < 5; ri++) {
-			str_target = m.suffix().str();
-			regex_search(str_target, m, re);
-			if (ri == 0) _lm = stoi(m.str());
-			if (ri == 1) _in_pol = stoi(m.str());
-			if (ri == 2) _npnt = stoi(m.str());
-			if (ri == 3) _npntts = stoi(m.str());
-			if (ri == 4) _isam = stoi(m.str());
-		}
-	} else {
-		//sscanf(
-		//		file_lines[last_read_line++].c_str(),
-		//		" %*d %d %d %d %d %d %d %d %d",
-		//		&_li, &_le, &_mxndm, &_in_pol, &_npnt, &_npntts, &_iavm, &_isam
-		//);
-		for (int ri = 0; ri < 8; ri++) {
-			str_target = m.suffix().str();
-			regex_search(str_target, m, re);
-			if (ri == 0) _li = stoi(m.str());
-			if (ri == 1) _le = stoi(m.str());
-			if (ri == 2) _mxndm = stoi(m.str());
-			if (ri == 3) _in_pol = stoi(m.str());
-			if (ri == 4) _npnt = stoi(m.str());
-			if (ri == 5) _npntts = stoi(m.str());
-			if (ri == 6) _iavm = stoi(m.str());
-			if (ri == 7) _isam = stoi(m.str());
-		}
-	}
-	double *x, *y, *z;
-	x = new double[_nsph];
-	y = new double[_nsph];
-	z = new double[_nsph];
-	if (_nsph == 1) {
-		x[0] = 0.0;
-		y[0] = 0.0;
-		z[0] = 0.0;
-	} else {
-		for (int i = 0; i < _nsph; i++) {
-			str_target = file_lines[last_read_line++];
-			re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
-			for (int ri = 0; ri < 3; ri++) {
-				regex_search(str_target, m, re);
-				str_num = regex_replace(m.str(), regex("D"), "e");
-				str_num = regex_replace(str_num, regex("d"), "e");
-				if (ri == 0) x[i] = stod(str_num);
-				if (ri == 1) y[i] = stod(str_num);
-				if (ri == 2) z[i] = stod(str_num);
-				str_target = m.suffix().str();
-			}
-		}
-	}
-	double in_th_start, in_th_end, in_th_step, sc_th_start, sc_th_end, sc_th_step;
-	re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
-	str_target = file_lines[last_read_line++];
-	for (int ri = 0; ri < 6; ri++) {
-		regex_search(str_target, m, re);
-		str_num = regex_replace(m.str(), regex("D"), "e");
-		str_num = regex_replace(str_num, regex("d"), "e");
-		if (ri == 0) in_th_start = stod(str_num);
-		if (ri == 1) in_th_step = stod(str_num);
-		if (ri == 2) in_th_end = stod(str_num);
-		if (ri == 3) sc_th_start = stod(str_num);
-		if (ri == 4) sc_th_step = stod(str_num);
-		if (ri == 5) sc_th_end = stod(str_num);
-		str_target = m.suffix().str();
-	}
+	str_num = regex_replace(m.str(), regex("D"), "e");
+	str_num = regex_replace(str_num, regex("d"), "e");
+	if (ri == 0) x[i] = stod(str_num);
+	if (ri == 1) y[i] = stod(str_num);
+	if (ri == 2) z[i] = stod(str_num);
+	str_target = m.suffix().str();
+      }
+    }
+  }
+  double in_th_start, in_th_end, in_th_step, sc_th_start, sc_th_end, sc_th_step;
+  re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
+  str_target = file_lines[last_read_line++];
+  for (int ri = 0; ri < 6; ri++) {
+    regex_search(str_target, m, re);
+    str_num = regex_replace(m.str(), regex("D"), "e");
+    str_num = regex_replace(str_num, regex("d"), "e");
+    if (ri == 0) in_th_start = stod(str_num);
+    if (ri == 1) in_th_step = stod(str_num);
+    if (ri == 2) in_th_end = stod(str_num);
+    if (ri == 3) sc_th_start = stod(str_num);
+    if (ri == 4) sc_th_step = stod(str_num);
+    if (ri == 5) sc_th_end = stod(str_num);
+    str_target = m.suffix().str();
+  }
 
-	double in_ph_start, in_ph_end, in_ph_step, sc_ph_start, sc_ph_end, sc_ph_step;
-	str_target = file_lines[last_read_line++];
-	for (int ri = 0; ri < 6; ri++) {
-		regex_search(str_target, m, re);
-		str_num = regex_replace(m.str(), regex("D"), "e");
-		str_num = regex_replace(str_num, regex("d"), "e");
-		if (ri == 0) in_ph_start = stod(str_num);
-		if (ri == 1) in_ph_step = stod(str_num);
-		if (ri == 2) in_ph_end = stod(str_num);
-		if (ri == 3) sc_ph_start = stod(str_num);
-		if (ri == 4) sc_ph_step = stod(str_num);
-		if (ri == 5) sc_ph_end = stod(str_num);
-		str_target = m.suffix().str();
-	}
+  double in_ph_start, in_ph_end, in_ph_step, sc_ph_start, sc_ph_end, sc_ph_step;
+  str_target = file_lines[last_read_line++];
+  for (int ri = 0; ri < 6; ri++) {
+    regex_search(str_target, m, re);
+    str_num = regex_replace(m.str(), regex("D"), "e");
+    str_num = regex_replace(str_num, regex("d"), "e");
+    if (ri == 0) in_ph_start = stod(str_num);
+    if (ri == 1) in_ph_step = stod(str_num);
+    if (ri == 2) in_ph_end = stod(str_num);
+    if (ri == 3) sc_ph_start = stod(str_num);
+    if (ri == 4) sc_ph_step = stod(str_num);
+    if (ri == 5) sc_ph_end = stod(str_num);
+    str_target = m.suffix().str();
+  }
 
-	int _jwtm;
-	re = regex("[0-9]+");
-	str_target = file_lines[last_read_line++];
-	regex_search(str_target, m, re);
-	//sscanf(file_lines[last_read_line].c_str(), " %d", &_nsph);
-	_jwtm = stoi(m.str());
-	GeometryConfiguration *conf = new GeometryConfiguration(
-			_nsph, _lm, _in_pol, _npnt, _npntts, _isam,
-			_li, _le, _mxndm, _iavm,
-			x, y, z,
-			in_th_start, in_th_step, in_th_end,
-			sc_th_start, sc_th_step, sc_th_end,
-			in_ph_start, in_ph_step, in_ph_end,
-			sc_ph_start, sc_ph_step, sc_ph_end,
-			_jwtm
-	);
-	return conf;
+  int _jwtm;
+  re = regex("[0-9]+");
+  str_target = file_lines[last_read_line++];
+  regex_search(str_target, m, re);
+  _jwtm = stoi(m.str());
+  GeometryConfiguration *conf = new GeometryConfiguration(
+							  _nsph, _lm, _in_pol, _npnt, _npntts, _isam,
+							  _li, _le, _mxndm, _iavm,
+							  x, y, z,
+							  in_th_start, in_th_step, in_th_end,
+							  sc_th_start, sc_th_step, sc_th_end,
+							  in_ph_start, in_ph_step, in_ph_end,
+							  sc_ph_start, sc_ph_step, sc_ph_end,
+							  _jwtm
+							  );
+  return conf;
 }
 
 ScattererConfiguration::ScattererConfiguration(
-		int nsph,
-		double *scale_vector,
-		int nxi,
-		string variable_name,
-		int *iog_vector,
-		double *ros_vector,
-		int *nshl_vector,
-		double **rcf_vector,
-		int dielectric_func_type,
-		complex<double> ***dc_matrix,
-		bool is_external,
-		double ex,
-		double w,
-		double x
-		) {
-	number_of_spheres = nsph;
-	number_of_scales = nxi;
-	reference_variable_name = variable_name;
-	iog_vec = iog_vector;
-	radii_of_spheres = ros_vector;
-	nshl_vec = nshl_vector;
-	rcf = rcf_vector;
-	idfc = dielectric_func_type,
-	dc0_matrix = dc_matrix;
-	use_external_sphere = is_external;
-	exdc = ex;
-	wp = w;
-	xip = x;
-	if (variable_name == "XIV") scale_vec = scale_vector;
-	else {
-		scale_vec = new double[number_of_scales]();
-		const double pi2 = 2.0 * acos(-1.0);
-		const double evc = 6.5821188e-16;
-		for (int si = 0; si < number_of_scales; si++) {
-			double value = scale_vector[si];
-			if (variable_name.compare("WNS") == 0) value *= (3.0e8 / wp);
-			else if (variable_name.compare("WLS") == 0) value = pi2 / value * 3.0e8 / wp;
-			else if (variable_name.compare("PUS") == 0) value /= wp;
-			else if (variable_name.compare("EVS") == 0) value /= (evc * wp);
-			scale_vec[si] = value;
-		}
-	}
+					       int nsph,
+					       double *scale_vector,
+					       int nxi,
+					       string variable_name,
+					       int *iog_vector,
+					       double *ros_vector,
+					       int *nshl_vector,
+					       double **rcf_vector,
+					       int dielectric_func_type,
+					       complex<double> ***dc_matrix,
+					       bool is_external,
+					       double ex,
+					       double w,
+					       double x
+					       ) {
+  number_of_spheres = nsph;
+  number_of_scales = nxi;
+  reference_variable_name = variable_name;
+  iog_vec = iog_vector;
+  radii_of_spheres = ros_vector;
+  nshl_vec = nshl_vector;
+  rcf = rcf_vector;
+  idfc = dielectric_func_type,
+    dc0_matrix = dc_matrix;
+  use_external_sphere = is_external;
+  exdc = ex;
+  wp = w;
+  xip = x;
+  if (variable_name == "XIV") scale_vec = scale_vector;
+  else {
+    scale_vec = new double[number_of_scales]();
+    const double pi2 = 2.0 * acos(-1.0);
+    const double evc = 6.5821188e-16;
+    for (int si = 0; si < number_of_scales; si++) {
+      double value = scale_vector[si];
+      if (variable_name.compare("WNS") == 0) value *= (3.0e8 / wp);
+      else if (variable_name.compare("WLS") == 0) value = pi2 / value * 3.0e8 / wp;
+      else if (variable_name.compare("PUS") == 0) value /= wp;
+      else if (variable_name.compare("EVS") == 0) value /= (evc * wp);
+      scale_vec[si] = value;
+    }
+  }
 }
 
 ScattererConfiguration::~ScattererConfiguration() {
-	int max_ici = 0;
-	for (int i = 1; i <= number_of_spheres; i++) {
-		if (iog_vec[i - 1] < i) continue;
-		int nsh = nshl_vec[i - 1];
-		if (max_ici < (nsh + 1) / 2) max_ici = (nsh + 1) / 2;
-	}
-	for (int i = 0; i < max_ici; i++) {
-		for (int j = 0; j < number_of_spheres; j++) {
-			delete[] dc0_matrix[i][j];
-		}
-	}
-	delete[] dc0_matrix;
-	for (int i = 0; i < number_of_spheres; i++) {
-		delete[] rcf[i];
-	}
-	delete[] nshl_vec;
-	delete[] radii_of_spheres;
-	delete[] iog_vec;
-	delete[] scale_vec;
+  int max_ici = 0;
+  for (int i = 1; i <= number_of_spheres; i++) {
+    if (iog_vec[i - 1] < i) continue;
+    int nsh = nshl_vec[i - 1];
+    if (max_ici < (nsh + 1) / 2) max_ici = (nsh + 1) / 2;
+  }
+  for (int i = 0; i < max_ici; i++) {
+    for (int j = 0; j < number_of_spheres; j++) {
+      delete[] dc0_matrix[i][j];
+    }
+  }
+  delete[] dc0_matrix;
+  for (int i = 0; i < number_of_spheres; i++) {
+    delete[] rcf[i];
+  }
+  delete[] nshl_vec;
+  delete[] radii_of_spheres;
+  delete[] iog_vec;
+  delete[] scale_vec;
 }
 
 ScattererConfiguration* ScattererConfiguration::from_binary(string file_name, string mode) {
-	int nsph;
-	int *iog;
-	double _exdc, _wp, _xip;
-	int _idfc, nxi;
-	int *nshl_vector;
-	double *xi_vec;
-	double *ros_vector;
-	double **rcf_vector;
-	complex<double> ***dc0m;
-	if (mode.compare("LEGACY") == 0) { // Legacy mode was chosen.
-		int max_ici = 0;
-		fstream input;
-		input.open(file_name.c_str(), ios::in | ios::binary);
-		if (input.is_open()) {
-			input.read(reinterpret_cast<char *>(&nsph), sizeof(int));
-			iog = new int[nsph]();
-			for (int i = 0; i < nsph; i++) {
-				input.read(reinterpret_cast<char *>(&(iog[i])), sizeof(int));
-			}
-			input.read(reinterpret_cast<char *>(&_exdc), sizeof(double));
-			input.read(reinterpret_cast<char *>(&_wp), sizeof(double));
-			input.read(reinterpret_cast<char *>(&_xip), sizeof(double));
-			input.read(reinterpret_cast<char *>(&_idfc), sizeof(int));
-			input.read(reinterpret_cast<char *>(&nxi), sizeof(int));
-			try {
-				xi_vec = new double[nxi]();
-			} catch (bad_alloc &ex) {
-				throw UnrecognizedConfigurationException("Wrong parameter set: invalid number of scales " + nxi);
-			}
-			for (int i = 0; i < nxi; i++) {
-				input.read(reinterpret_cast<char *>(&(xi_vec[i])), sizeof(double));
-			}
-			nshl_vector = new int[nsph]();
-			ros_vector = new double[nsph]();
-			rcf_vector = new double*[nsph];
-			for (int i115 = 1; i115 <= nsph; i115++) {
-				if (iog[i115 - 1] < i115) {
-					rcf_vector[i115 - 1] = new double[1]();
-					continue;
-				}
-				input.read(reinterpret_cast<char *>(&(nshl_vector[i115 - 1])), sizeof(int));
-				input.read(reinterpret_cast<char *>(&(ros_vector[i115 - 1])), sizeof(double));
-				int nsh = nshl_vector[i115 - 1];
-				if (max_ici < (nsh + 1) / 2) max_ici = (nsh + 1) / 2;
-				try {
-					rcf_vector[i115 - 1] = new double[nsh]();
-				} catch (bad_alloc &ex) {
-					throw UnrecognizedConfigurationException("Wrong parameter set: invalid number of layers " + nsh);
-				}
-				for (int nsi = 0; nsi < nsh; nsi++) {
-					input.read(reinterpret_cast<char *>(&(rcf_vector[i115 - 1][nsi])), sizeof(double));
-				}
-			}
-			dc0m = new complex<double>**[max_ici];
-			for (int dim1 = 0; dim1 < max_ici; dim1++) {
-				dc0m[dim1] = new complex<double>*[nsph];
-			    for (int dim2 = 0; dim2 < nsph; dim2++) {
-			    	dc0m[dim1][dim2] = new complex<double>[nxi]();
-			    }
-			}
-			for (int jxi468 = 1; jxi468 <= nxi; jxi468++) {
-				if (_idfc != 0 && jxi468 > 1) continue;
-			    for (int i162 = 1; i162 <= nsph; i162++) {
-			    	if (iog[i162 - 1] < i162) continue;
-			    	int nsh = nshl_vector[i162 - 1];
-			    	int ici = (nsh + 1) / 2; // QUESTION: is integer division really intended here?
-			    	for (int i157 = 0; i157 < ici; i157++) {
-			    		double dc0_real, dc0_img;
-			    		input.read(reinterpret_cast<char *>(&dc0_real), sizeof(double));
-			    		input.read(reinterpret_cast<char *>(&dc0_img), sizeof(double));
-			    		dc0m[i157][i162 - 1][jxi468 - 1] = dc0_real + 1i * dc0_img;
-			    	}
-			    }
-			}
-			input.close();
-		} else { // Opening of the input file did not succeed.
-			throw OpenConfigurationFileException(file_name);
-		}
-	} else { // A different binary format was chosen.
-		//TODO: this part is not yet implemented.
-		//      Functions to write optimized file formats may be invoked here.
+  int nsph;
+  int *iog;
+  double _exdc, _wp, _xip;
+  int _idfc, nxi;
+  int *nshl_vector;
+  double *xi_vec;
+  double *ros_vector;
+  double **rcf_vector;
+  complex<double> ***dc0m;
+  if (mode.compare("LEGACY") == 0) { // Legacy mode was chosen.
+    int max_ici = 0;
+    fstream input;
+    input.open(file_name.c_str(), ios::in | ios::binary);
+    if (input.is_open()) {
+      input.read(reinterpret_cast<char *>(&nsph), sizeof(int));
+      iog = new int[nsph]();
+      for (int i = 0; i < nsph; i++) {
+	input.read(reinterpret_cast<char *>(&(iog[i])), sizeof(int));
+      }
+      input.read(reinterpret_cast<char *>(&_exdc), sizeof(double));
+      input.read(reinterpret_cast<char *>(&_wp), sizeof(double));
+      input.read(reinterpret_cast<char *>(&_xip), sizeof(double));
+      input.read(reinterpret_cast<char *>(&_idfc), sizeof(int));
+      input.read(reinterpret_cast<char *>(&nxi), sizeof(int));
+      try {
+	xi_vec = new double[nxi]();
+      } catch (bad_alloc &ex) {
+	throw UnrecognizedConfigurationException("Wrong parameter set: invalid number of scales " + nxi);
+      }
+      for (int i = 0; i < nxi; i++) {
+	input.read(reinterpret_cast<char *>(&(xi_vec[i])), sizeof(double));
+      }
+      nshl_vector = new int[nsph]();
+      ros_vector = new double[nsph]();
+      rcf_vector = new double*[nsph];
+      for (int i115 = 1; i115 <= nsph; i115++) {
+	if (iog[i115 - 1] < i115) {
+	  rcf_vector[i115 - 1] = new double[1]();
+	  continue;
 	}
-	ScattererConfiguration *conf = new ScattererConfiguration(
-			nsph,
-			xi_vec,
-			nxi,
-			"XIV",
-			iog,
-			ros_vector,
-			nshl_vector,
-			rcf_vector,
-			_idfc,
-			dc0m,
-			false,
-			_exdc,
-			_wp,
-			_xip
-	);
-	return conf;
-}
-
-ScattererConfiguration* ScattererConfiguration::from_dedfb(string dedfb_file_name) {
-	int num_lines = 0;
-	int last_read_line = 0;
-	string *file_lines;
-	regex re;
-	smatch m;
+	input.read(reinterpret_cast<char *>(&(nshl_vector[i115 - 1])), sizeof(int));
+	input.read(reinterpret_cast<char *>(&(ros_vector[i115 - 1])), sizeof(double));
+	int nsh = nshl_vector[i115 - 1];
+	if (max_ici < (nsh + 1) / 2) max_ici = (nsh + 1) / 2;
 	try {
-		file_lines = load_file(dedfb_file_name, &num_lines);
-	} catch (exception &ex) {
-		throw OpenConfigurationFileException(dedfb_file_name);
+	  rcf_vector[i115 - 1] = new double[nsh]();
+	} catch (bad_alloc &ex) {
+	  throw UnrecognizedConfigurationException("Wrong parameter set: invalid number of layers " + nsh);
 	}
-	int nsph, ies;
-	int max_ici = 0;
-	re = regex("[0-9]+");
-	string str_target = file_lines[last_read_line];
-	for (int ri = 0; ri < 2; ri++) {
-		regex_search(str_target, m, re);
-		if (ri == 0) nsph = stoi(m.str());
-		if (ri == 1) ies = stoi(m.str());
-		str_target = m.suffix().str();
+	for (int nsi = 0; nsi < nsh; nsi++) {
+	  input.read(reinterpret_cast<char *>(&(rcf_vector[i115 - 1][nsi])), sizeof(double));
 	}
-	if (ies != 0) ies = 1;
-	double _exdc, _wp, _xip;
-	str_target = file_lines[++last_read_line];
-	re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
-	for (int ri = 0; ri < 3; ri++) {
-		regex_search(str_target, m, re);
-		string str_number = m.str();
-		str_number = regex_replace(str_number, regex("D"), "e");
-		str_number = regex_replace(str_number, regex("d"), "e");
-		if (ri == 0) _exdc = stod(str_number);
-		if (ri == 1) _wp = stod(str_number);
-		if (ri == 2) _xip = stod(str_number);
-		str_target = m.suffix().str();
+      }
+      dc0m = new complex<double>**[max_ici];
+      for (int dim1 = 0; dim1 < max_ici; dim1++) {
+	dc0m[dim1] = new complex<double>*[nsph];
+	for (int dim2 = 0; dim2 < nsph; dim2++) {
+	  dc0m[dim1][dim2] = new complex<double>[nxi]();
 	}
-	int _idfc, nxi, instpc, insn;
-	re = regex("-?[0-9]+");
-	for (int ri = 0; ri < 4; ri++) {
-		regex_search(str_target, m, re);
-		if (ri == 0) _idfc = stoi(m.str());
-		if (ri == 1) nxi = stoi(m.str());
-		if (ri == 2) instpc = stoi(m.str());
-		if (ri == 3) insn = stoi(m.str());
-		str_target = m.suffix().str();
+      }
+      for (int jxi468 = 1; jxi468 <= nxi; jxi468++) {
+	if (_idfc != 0 && jxi468 > 1) continue;
+	for (int i162 = 1; i162 <= nsph; i162++) {
+	  if (iog[i162 - 1] < i162) continue;
+	  int nsh = nshl_vector[i162 - 1];
+	  int ici = (nsh + 1) / 2; // QUESTION: is integer division really intended here?
+	  for (int i157 = 0; i157 < ici; i157++) {
+	    double dc0_real, dc0_img;
+	    input.read(reinterpret_cast<char *>(&dc0_real), sizeof(double));
+	    input.read(reinterpret_cast<char *>(&dc0_img), sizeof(double));
+	    dc0m[i157][i162 - 1][jxi468 - 1] = dc0_real + 1i * dc0_img;
+	  }
 	}
+      }
+      input.close();
+    } else { // Opening of the input file did not succeed.
+      throw OpenConfigurationFileException(file_name);
+    }
+  } else { // A different binary format was chosen.
+    //TODO: this part is not yet implemented.
+    //      Functions to write optimized file formats may be invoked here.
+  }
+  ScattererConfiguration *conf = new ScattererConfiguration(
+							    nsph,
+							    xi_vec,
+							    nxi,
+							    "XIV",
+							    iog,
+							    ros_vector,
+							    nshl_vector,
+							    rcf_vector,
+							    _idfc,
+							    dc0m,
+							    false,
+							    _exdc,
+							    _wp,
+							    _xip
+							    );
+  return conf;
+}
+
+ScattererConfiguration* ScattererConfiguration::from_dedfb(string dedfb_file_name) {
+  int num_lines = 0;
+  int last_read_line = 0;
+  string *file_lines;
+  regex re;
+  smatch m;
+  try {
+    file_lines = load_file(dedfb_file_name, &num_lines);
+  } catch (exception &ex) {
+    throw OpenConfigurationFileException(dedfb_file_name);
+  }
+  int nsph, ies;
+  int max_ici = 0;
+  re = regex("[0-9]+");
+  string str_target = file_lines[last_read_line];
+  for (int ri = 0; ri < 2; ri++) {
+    regex_search(str_target, m, re);
+    if (ri == 0) nsph = stoi(m.str());
+    if (ri == 1) ies = stoi(m.str());
+    str_target = m.suffix().str();
+  }
+  if (ies != 0) ies = 1;
+  double _exdc, _wp, _xip;
+  str_target = file_lines[++last_read_line];
+  re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
+  for (int ri = 0; ri < 3; ri++) {
+    regex_search(str_target, m, re);
+    string str_number = m.str();
+    str_number = regex_replace(str_number, regex("D"), "e");
+    str_number = regex_replace(str_number, regex("d"), "e");
+    if (ri == 0) _exdc = stod(str_number);
+    if (ri == 1) _wp = stod(str_number);
+    if (ri == 2) _xip = stod(str_number);
+    str_target = m.suffix().str();
+  }
+  int _idfc, nxi, instpc, insn;
+  re = regex("-?[0-9]+");
+  for (int ri = 0; ri < 4; ri++) {
+    regex_search(str_target, m, re);
+    if (ri == 0) _idfc = stoi(m.str());
+    if (ri == 1) nxi = stoi(m.str());
+    if (ri == 2) instpc = stoi(m.str());
+    if (ri == 3) insn = stoi(m.str());
+    str_target = m.suffix().str();
+  }
 
-	double *variable_vector;
-	string variable_name;
+  double *variable_vector;
+  string variable_name;
 
-	if (_idfc < 0) { // Diel. functions at XIP value and XI is scale factor
-		variable_name = "XIV";
-		if (instpc < 1) { // The variable vector is explicitly defined.
-			double xi;
-			//int xi_exp;
-			List<double> xi_vector;
-			//sscanf(file_lines[++last_read_line].c_str(), " %9lE D%d", &xi, &xi_exp);
-			str_target = file_lines[++last_read_line];
-			re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
-			regex_search(str_target, m, re);
-			string str_number = m.str();
-			str_number = regex_replace(str_number, regex("D"), "e");
-			str_number = regex_replace(str_number, regex("d"), "e");
-			xi = stod(str_number);
-			xi_vector.set(0, xi);
-			for (int jxi310 = 1; jxi310 < nxi; jxi310++) {
-				str_target = file_lines[++last_read_line];
-				regex_search(str_target, m, re);
-				str_number = m.str();
-				str_number = regex_replace(str_number, regex("D"), "e");
-				str_number = regex_replace(str_number, regex("d"), "e");
-				xi = stod(str_number);
-				xi_vector.append(xi);
-			}
-			variable_vector = xi_vector.to_array();
-		} else { // instpc >= 1: the variable vector is defined in steps
-			double xi, xi_step;
-			str_target = file_lines[++last_read_line];
-			re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
-			regex_search(str_target, m, re);
-			for (int ri = 0; ri < 2; ri++) {
-				regex_search(str_target, m, re);
-				string str_number = m.str();
-				str_number = regex_replace(str_number, regex("D"), "e");
-				str_number = regex_replace(str_number, regex("d"), "e");
-				if (ri == 0) xi = stod(str_number);
-				if (ri == 1) xi_step = stod(str_number);
-				str_target = m.suffix().str();
-			}
-			variable_vector = new double[nxi]();
-			for (int jxi320 = 0; jxi320 < nxi; jxi320++) {
-				variable_vector[jxi320] = xi;
-				xi += xi_step;
-			}
-		}
-	} else { // idfc >= 0
-		variable_vector = new double[nxi]();
-		if (instpc == 0) { // The variable vector is explicitly defined
-			double vs;
-			//int vs_exp;
-			for (int jxi_r = 0; jxi_r < nxi; jxi_r++) {
-				//sscanf(file_lines[++last_read_line].c_str(), " %lf D%d", &vs, &vs_exp);
-				str_target = file_lines[++last_read_line];
-				re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
-				regex_search(str_target, m, re);
-				string str_number = m.str();
-				str_number = regex_replace(str_number, regex("D"), "e");
-				str_number = regex_replace(str_number, regex("d"), "e");
-				vs = stod(str_number);
-				variable_vector[jxi_r] = vs;
-			}
-			switch (insn) {
-			case 1: //xi vector definition
-				variable_name = "XIV";
-				break;
-			case 2: //wave number vector definition
-				variable_name = "WNS";
-		    	break;
-			case 3: //wavelength vector definition
-				variable_name = "WLS";
-				break;
-			case 4: //pu vector definition
-				variable_name = "PUS";
-				break;
-			case 5: //eV vector definition
-				variable_name = "EVS";
-				break;
-		    }
-		} else { // The variable vector needs to be computed in steps
-			double vs, vs_step;
-			//int vs_exp, vs_step_exp;
-			//sscanf(file_lines[++last_read_line].c_str(), " %lf D%d %lf D%d", &vs, &vs_exp, &vs_step, &vs_step_exp);
-			str_target = file_lines[++last_read_line];
-			re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
-			regex_search(str_target, m, re);
-			for (int ri = 0; ri < 2; ri++) {
-				regex_search(str_target, m, re);
-				string str_number = m.str();
-				str_number = regex_replace(str_number, regex("D"), "e");
-				str_number = regex_replace(str_number, regex("d"), "e");
-				if (ri == 0) vs = stod(str_number);
-				if (ri == 1) vs_step = stod(str_number);
-				str_target = m.suffix().str();
-			}
-			for (int jxi110w = 0; jxi110w < nxi; jxi110w++) {
-				variable_vector[jxi110w] = vs;
-				vs += vs_step;
-			}
-			switch (insn) {
-			case 1: //xi vector definition
-				variable_name = "XIV";
-				break;
-			case 2: //wave number vector definition
-				variable_name = "WNS";
-				break;
-			case 3: //wavelength vector definition
-				variable_name = "WLS";
-				break;
-			case 4: //pu vector definition
-				variable_name = "PUS";
-				break;
-			case 5: //eV vector definition
-				variable_name = "EVS";
-				break;
-			}
-		}
-	}
-	last_read_line++;
-	int *iog_vector = new int[nsph]();
-	double *ros_vector = new double[nsph]();
-	double **rcf_vector = new double*[nsph];
-	int *nshl_vector = new int[nsph]();
-	//printf("\nDEBUG: reading IOG from %s", file_lines[last_read_line].c_str());
-	//fflush(stdout);
-	for (int i = 0; i < nsph; i++) {
-		string read_format = "";
-		for (int j = 0; j < (i % 15); j++) read_format += " %*d";
-		read_format += " %d";
-		sscanf(file_lines[last_read_line].c_str(), read_format.c_str(), (iog_vector + i));
-		if (i > 0 && i % 15 == 0) {
-			last_read_line++;
-			//printf("DEBUG: reading IOG from %s", file_lines[last_read_line].c_str());
-			//fflush(stdout);
-		}
-	}
-	for (int i113 = 1; i113 <= nsph; i113++) {
-		int i_val, nsh;
-	    double ros_val;
-	    //int ros_val_exp;
-	    if (iog_vector[i113 - 1] < i113) {
-	    	rcf_vector[i113 - 1] = new double[1]();
-	    	continue;
-	    }
-	    //sscanf(file_lines[++last_read_line].c_str(), " %d %lf D%d", &i_val, &ros_val, &ros_val_exp);
-	    re = regex("[0-9]+");
-	    str_target = file_lines[++last_read_line];
-	    regex_search(str_target, m, re);
-	    i_val = stoi(m.str());
-	    str_target = m.suffix();
-		re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
-	    regex_search(str_target, m, re);
-		string str_number = m.str();
-		str_number = regex_replace(str_number, regex("D"), "e");
-		str_number = regex_replace(str_number, regex("d"), "e");
-		ros_val = stod(str_number);
-	    nshl_vector[i113 - 1] = i_val;
-	    if (max_ici < (i_val + 1) / 2) max_ici = (i_val + 1) / 2;
-	    ros_vector[i113 - 1] = ros_val;
-	    nsh = nshl_vector[i113 - 1];
-	    if (i113 == 1) nsh += ies;
-	    rcf_vector[i113 - 1] = new double[nsh]();
-	    for (int ns = 0; ns < nsh; ns++) {
-	    	double ns_rcf;
-	    	//int ns_rcf_exp;
-	    	//sscanf(file_lines[++last_read_line].c_str(), " %lf D%d", &ns_rcf, &ns_rcf_exp);
-		    str_target = file_lines[++last_read_line];
-		    regex_search(str_target, m, re);
-		    str_number = m.str();
-			str_number = regex_replace(str_number, regex("D"), "e");
-			str_number = regex_replace(str_number, regex("d"), "e");
-			ns_rcf = stod(str_number);
-	    	rcf_vector[i113 - 1][ns] = ns_rcf;
-	    }
-	}
-	complex<double> ***dc0m = new complex<double>**[max_ici];
-	for (int dim1 = 0; dim1 < max_ici; dim1++) {
-		dc0m[dim1] = new complex<double>*[nsph];
-	    for (int dim2 = 0; dim2 < nsph; dim2++) {
-	    	dc0m[dim1][dim2] = new complex<double>[nxi]();
-	    }
-	}
+  if (_idfc < 0) { // Diel. functions at XIP value and XI is scale factor
+    variable_name = "XIV";
+    if (instpc < 1) { // The variable vector is explicitly defined.
+      double xi;
+      List<double> xi_vector;
+      str_target = file_lines[++last_read_line];
+      re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
+      regex_search(str_target, m, re);
+      string str_number = m.str();
+      str_number = regex_replace(str_number, regex("D"), "e");
+      str_number = regex_replace(str_number, regex("d"), "e");
+      xi = stod(str_number);
+      xi_vector.set(0, xi);
+      for (int jxi310 = 1; jxi310 < nxi; jxi310++) {
+	str_target = file_lines[++last_read_line];
+	regex_search(str_target, m, re);
+	str_number = m.str();
+	str_number = regex_replace(str_number, regex("D"), "e");
+	str_number = regex_replace(str_number, regex("d"), "e");
+	xi = stod(str_number);
+	xi_vector.append(xi);
+      }
+      variable_vector = xi_vector.to_array();
+    } else { // instpc >= 1: the variable vector is defined in steps
+      double xi, xi_step;
+      str_target = file_lines[++last_read_line];
+      re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
+      regex_search(str_target, m, re);
+      for (int ri = 0; ri < 2; ri++) {
+	regex_search(str_target, m, re);
+	string str_number = m.str();
+	str_number = regex_replace(str_number, regex("D"), "e");
+	str_number = regex_replace(str_number, regex("d"), "e");
+	if (ri == 0) xi = stod(str_number);
+	if (ri == 1) xi_step = stod(str_number);
+	str_target = m.suffix().str();
+      }
+      variable_vector = new double[nxi]();
+      for (int jxi320 = 0; jxi320 < nxi; jxi320++) {
+	variable_vector[jxi320] = xi;
+	xi += xi_step;
+      }
+    }
+  } else { // idfc >= 0
+    variable_vector = new double[nxi]();
+    if (instpc == 0) { // The variable vector is explicitly defined
+      double vs;
+      for (int jxi_r = 0; jxi_r < nxi; jxi_r++) {
+	str_target = file_lines[++last_read_line];
 	re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
-	for (int jxi468 = 1; jxi468 <= nxi; jxi468++) {
-		if (_idfc != 0 && jxi468 > 1) continue;
-	    for (int i162 = 1; i162 <= nsph; i162++) {
-	    	if (iog_vector[i162 - 1] < i162) continue;
-	    	int nsh = nshl_vector[i162 - 1];
-	    	int ici = (nsh + 1) / 2; // QUESTION: is integer division really intended here?
-	    	if (i162 == 1) ici = ici + ies;
-	    	for (int i157 = 0; i157 < ici; i157++) {
-	    		double dc0_real, dc0_img;
-	    		//int dc0_real_exp, dc0_img_exp;
-	    		//sscanf(file_lines[++last_read_line].c_str(), " (%lf D%d, %lf D%d)", &dc0_real, &dc0_real_exp, &dc0_img, &dc0_img_exp);
-	    		str_target = file_lines[++last_read_line];
-	    		regex_search(str_target, m, re);
-	    		string str_number = m.str();
-	    		str_number = regex_replace(str_number, regex("D"), "e");
-	    		str_number = regex_replace(str_number, regex("d"), "e");
-	    		dc0_real = stod(str_number);
-	    		str_target = m.suffix().str();
-	    		regex_search(str_target, m, re);
-	    		str_number = m.str();
-	    		str_number = regex_replace(str_number, regex("D"), "e");
-	    		str_number = regex_replace(str_number, regex("d"), "e");
-	    		dc0_img = stod(str_number);
-	    		dc0m[i157][i162 - 1][jxi468 - 1] = std::complex<double>(dc0_real, dc0_img);
-	    	}
-	    }
-	}
+	regex_search(str_target, m, re);
+	string str_number = m.str();
+	str_number = regex_replace(str_number, regex("D"), "e");
+	str_number = regex_replace(str_number, regex("d"), "e");
+	vs = stod(str_number);
+	variable_vector[jxi_r] = vs;
+      }
+      switch (insn) {
+      case 1: //xi vector definition
+	variable_name = "XIV";
+	break;
+      case 2: //wave number vector definition
+	variable_name = "WNS";
+	break;
+      case 3: //wavelength vector definition
+	variable_name = "WLS";
+	break;
+      case 4: //pu vector definition
+	variable_name = "PUS";
+	break;
+      case 5: //eV vector definition
+	variable_name = "EVS";
+	break;
+      }
+    } else { // The variable vector needs to be computed in steps
+      double vs, vs_step;
+      str_target = file_lines[++last_read_line];
+      re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
+      regex_search(str_target, m, re);
+      for (int ri = 0; ri < 2; ri++) {
+	regex_search(str_target, m, re);
+	string str_number = m.str();
+	str_number = regex_replace(str_number, regex("D"), "e");
+	str_number = regex_replace(str_number, regex("d"), "e");
+	if (ri == 0) vs = stod(str_number);
+	if (ri == 1) vs_step = stod(str_number);
+	str_target = m.suffix().str();
+      }
+      for (int jxi110w = 0; jxi110w < nxi; jxi110w++) {
+	variable_vector[jxi110w] = vs;
+	vs += vs_step;
+      }
+      switch (insn) {
+      case 1: //xi vector definition
+	variable_name = "XIV";
+	break;
+      case 2: //wave number vector definition
+	variable_name = "WNS";
+	break;
+      case 3: //wavelength vector definition
+	variable_name = "WLS";
+	break;
+      case 4: //pu vector definition
+	variable_name = "PUS";
+	break;
+      case 5: //eV vector definition
+	variable_name = "EVS";
+	break;
+      }
+    }
+  }
+  //last_read_line++;
+  int *iog_vector = new int[nsph]();
+  double *ros_vector = new double[nsph]();
+  double **rcf_vector = new double*[nsph];
+  int *nshl_vector = new int[nsph]();
+  /*for (int i = 0; i < nsph; i++) {
+    string read_format = "";
+    for (int j = 0; j < (i % 15); j++) read_format += " %*d";
+    read_format += " %d";
+    sscanf(file_lines[last_read_line].c_str(), read_format.c_str(), (iog_vector + i));
+    if (i > 0 && i % 15 == 0) {
+      last_read_line++;
+    }
+    }*/
+  int filled_iogs = 0;
+  re = regex("[0-9]+");
+  while (filled_iogs < nsph) {
+    string str_target = file_lines[++last_read_line];
+    while(regex_search(str_target, m, re)) {
+      iog_vector[filled_iogs++] = stoi(m.str());
+      str_target = m.suffix().str();
+      if (filled_iogs == nsph) break;
+    }
+  }
+  for (int i113 = 1; i113 <= nsph; i113++) {
+    int i_val, nsh;
+    double ros_val;
+    if (iog_vector[i113 - 1] < i113) {
+      rcf_vector[i113 - 1] = new double[1]();
+      continue;
+    }
+    re = regex("[0-9]+");
+    str_target = file_lines[++last_read_line];
+    regex_search(str_target, m, re);
+    i_val = stoi(m.str());
+    str_target = m.suffix();
+    re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
+    regex_search(str_target, m, re);
+    string str_number = m.str();
+    str_number = regex_replace(str_number, regex("D"), "e");
+    str_number = regex_replace(str_number, regex("d"), "e");
+    ros_val = stod(str_number);
+    nshl_vector[i113 - 1] = i_val;
+    if (max_ici < (i_val + 1) / 2) max_ici = (i_val + 1) / 2;
+    ros_vector[i113 - 1] = ros_val;
+    nsh = nshl_vector[i113 - 1];
+    if (i113 == 1) nsh += ies;
+    rcf_vector[i113 - 1] = new double[nsh]();
+    for (int ns = 0; ns < nsh; ns++) {
+      double ns_rcf;
+      //int ns_rcf_exp;
+      //sscanf(file_lines[++last_read_line].c_str(), " %lf D%d", &ns_rcf, &ns_rcf_exp);
+      str_target = file_lines[++last_read_line];
+      regex_search(str_target, m, re);
+      str_number = m.str();
+      str_number = regex_replace(str_number, regex("D"), "e");
+      str_number = regex_replace(str_number, regex("d"), "e");
+      ns_rcf = stod(str_number);
+      rcf_vector[i113 - 1][ns] = ns_rcf;
+    }
+  }
+  complex<double> ***dc0m = new complex<double>**[max_ici];
+  for (int dim1 = 0; dim1 < max_ici; dim1++) {
+    dc0m[dim1] = new complex<double>*[nsph];
+    for (int dim2 = 0; dim2 < nsph; dim2++) {
+      dc0m[dim1][dim2] = new complex<double>[nxi]();
+    }
+  }
+  re = regex("-?[0-9]+\\.[0-9]+([eEdD][-+]?)?[0-9]+");
+  for (int jxi468 = 1; jxi468 <= nxi; jxi468++) {
+    if (_idfc != 0 && jxi468 > 1) continue;
+    for (int i162 = 1; i162 <= nsph; i162++) {
+      if (iog_vector[i162 - 1] < i162) continue;
+      int nsh = nshl_vector[i162 - 1];
+      int ici = (nsh + 1) / 2; // QUESTION: is integer division really intended here?
+      if (i162 == 1) ici = ici + ies;
+      for (int i157 = 0; i157 < ici; i157++) {
+	double dc0_real, dc0_img;
+	//int dc0_real_exp, dc0_img_exp;
+	//sscanf(file_lines[++last_read_line].c_str(), " (%lf D%d, %lf D%d)", &dc0_real, &dc0_real_exp, &dc0_img, &dc0_img_exp);
+	str_target = file_lines[++last_read_line];
+	regex_search(str_target, m, re);
+	string str_number = m.str();
+	str_number = regex_replace(str_number, regex("D"), "e");
+	str_number = regex_replace(str_number, regex("d"), "e");
+	dc0_real = stod(str_number);
+	str_target = m.suffix().str();
+	regex_search(str_target, m, re);
+	str_number = m.str();
+	str_number = regex_replace(str_number, regex("D"), "e");
+	str_number = regex_replace(str_number, regex("d"), "e");
+	dc0_img = stod(str_number);
+	dc0m[i157][i162 - 1][jxi468 - 1] = std::complex<double>(dc0_real, dc0_img);
+      }
+    }
+  }
 
-	ScattererConfiguration *config = new ScattererConfiguration(
-			nsph,
-			variable_vector,
-			nxi,
-			variable_name,
-			iog_vector,
-			ros_vector,
-			nshl_vector,
-			rcf_vector,
-			_idfc,
-			dc0m,
-			(ies > 0),
-			_exdc,
-			_wp,
-			_xip
-	);
-	delete[] file_lines;
-	return config;
+  ScattererConfiguration *config = new ScattererConfiguration(
+							      nsph,
+							      variable_vector,
+							      nxi,
+							      variable_name,
+							      iog_vector,
+							      ros_vector,
+							      nshl_vector,
+							      rcf_vector,
+							      _idfc,
+							      dc0m,
+							      (ies > 0),
+							      _exdc,
+							      _wp,
+							      _xip
+							      );
+  delete[] file_lines;
+  return config;
 }
 
 void ScattererConfiguration::print() {
-	int ies = (use_external_sphere)? 1 : 0;
-	int max_ici = 0;
-	printf("### CONFIGURATION DATA ###\n");
-	printf("NSPH  = %d\n", number_of_spheres);
-	printf("ROS   = [");
-	for (int i = 0; i < number_of_spheres; i++) printf("\t%lg", radii_of_spheres[i]);
-	printf("\t]\n");
-	printf("IOG   = [");
-	for (int i = 0; i < number_of_spheres; i++) printf("\t%d", iog_vec[i]);
-	printf("\t]\n");
-	printf("NSHL  = [");
-	for (int i = 0; i < number_of_spheres; i++) printf("\t%d", nshl_vec[i]);
-	printf("\t]\n");
-	printf("RCF   = [\n");
-	for (int i = 1; i <= number_of_spheres; i++) {
-		int nsh = nshl_vec[i - 1];
-	    if (i == 1) nsh += ies;
-	    if (max_ici < (nsh + 1) / 2) max_ici = (nsh + 1) / 2;
-		printf("         [");
-	    for (int ns = 0; ns < nsh; ns++) {
-	    	printf("\t%lg", rcf[i - 1][ns]);
-	    }
-	    printf("\t]\n");
-	}
-	printf("        ]\n");
-	printf("SCALE = %s\n", reference_variable_name.c_str());
-	printf("NXI   = %d\n", number_of_scales);
-	printf("VEC   = [");
-	for (int i = 0; i < number_of_scales; i++) printf("\t%lg", scale_vec[i]);
-	printf("\t]\n");
-	printf("DC0M  = [\n");
-	for (int i = 0; i < max_ici; i++) {
-		printf("         [\n");
-	    for (int j = 0; j < number_of_spheres; j++) {
-			printf("          [");
-			for (int k = 0; k < number_of_scales; k++) {
-				if (idfc != 0 and k > 0) continue;
-		    	printf("\t%lg + i(%lg)", dc0_matrix[i][j][k].real(), dc0_matrix[i][j][k].imag());
-			}
-			printf("\t]\n");
-	    }
-	    printf("         ]\n");
-	}
-	printf("        ]\n");
+  int ies = (use_external_sphere)? 1 : 0;
+  int max_ici = 0;
+  printf("### CONFIGURATION DATA ###\n");
+  printf("NSPH  = %d\n", number_of_spheres);
+  printf("ROS   = [");
+  for (int i = 0; i < number_of_spheres; i++) printf("\t%lg", radii_of_spheres[i]);
+  printf("\t]\n");
+  printf("IOG   = [");
+  for (int i = 0; i < number_of_spheres; i++) printf("\t%d", iog_vec[i]);
+  printf("\t]\n");
+  printf("NSHL  = [");
+  for (int i = 0; i < number_of_spheres; i++) printf("\t%d", nshl_vec[i]);
+  printf("\t]\n");
+  printf("RCF   = [\n");
+  for (int i = 1; i <= number_of_spheres; i++) {
+    int nsh = nshl_vec[i - 1];
+    if (i == 1) nsh += ies;
+    if (max_ici < (nsh + 1) / 2) max_ici = (nsh + 1) / 2;
+    printf("         [");
+    for (int ns = 0; ns < nsh; ns++) {
+      printf("\t%lg", rcf[i - 1][ns]);
+    }
+    printf("\t]\n");
+  }
+  printf("        ]\n");
+  printf("SCALE = %s\n", reference_variable_name.c_str());
+  printf("NXI   = %d\n", number_of_scales);
+  printf("VEC   = [");
+  for (int i = 0; i < number_of_scales; i++) printf("\t%lg", scale_vec[i]);
+  printf("\t]\n");
+  printf("DC0M  = [\n");
+  for (int i = 0; i < max_ici; i++) {
+    printf("         [\n");
+    for (int j = 0; j < number_of_spheres; j++) {
+      printf("          [");
+      for (int k = 0; k < number_of_scales; k++) {
+	if (idfc != 0 and k > 0) continue;
+	printf("\t%lg + i(%lg)", dc0_matrix[i][j][k].real(), dc0_matrix[i][j][k].imag());
+      }
+      printf("\t]\n");
+    }
+    printf("         ]\n");
+  }
+  printf("        ]\n");
 }
 
 void ScattererConfiguration::write_binary(string file_name, string mode) {
-	const double two_pi = acos(0.0) * 4.0;
-	const double evc = 6.5821188e-16;
-	int max_ici = 0;
-	bool is_new_vector = false;
-	if (mode.compare("LEGACY") == 0) { // Legacy mode was chosen.
-		fstream output;
-		int ies = (use_external_sphere)? 1 : 0;
-		double *xi_vec;
-		if (reference_variable_name.compare("XIV") == 0) xi_vec = scale_vec;
-		else {
-			is_new_vector = true;
-			xi_vec = new double[number_of_scales];
-			if (reference_variable_name.compare("WNS") == 0) {
-				for (int i = 0; i < number_of_scales; i++)
-					xi_vec[i] = 3.0e8 * scale_vec[i] / wp;
-			} else if (reference_variable_name.compare("WLS") == 0) {
-				for (int i = 0; i < number_of_scales; i++) {
-					double wn = two_pi / scale_vec[i];
-					xi_vec[i] = 3.0e8 * wn / wp;
-				}
-			} else if (reference_variable_name.compare("PUS") == 0) {
-				for (int i = 0; i < number_of_scales; i++)
-					xi_vec[i] = scale_vec[i] / wp;
-			} else if (reference_variable_name.compare("EVS") == 0) {
-				for (int i = 0; i < number_of_scales; i++) {
-					double pu = scale_vec[i] / evc;
-					xi_vec[i] = pu / wp;
-				}
-			} else {
-				throw UnrecognizedConfigurationException(
-						"Wrong parameter set: unrecognized scale type "
-						+ reference_variable_name
-				);
-			}
-		}
-		output.open(file_name.c_str(), ios::out | ios::binary);
-		output.write(reinterpret_cast<char *>(&number_of_spheres), sizeof(int));
-		for (int i = 0; i < number_of_spheres; i++)
-			output.write(reinterpret_cast<char *>(&(iog_vec[i])), sizeof(int));
-		output.write(reinterpret_cast<char *>(&exdc), sizeof(double));
-		output.write(reinterpret_cast<char *>(&wp), sizeof(double));
-		output.write(reinterpret_cast<char *>(&xip), sizeof(double));
-		output.write(reinterpret_cast<char *>(&idfc), sizeof(int));
-		output.write(reinterpret_cast<char *>(&number_of_scales), sizeof(int));
-		for (int i = 0; i < number_of_scales; i++)
-			output.write(reinterpret_cast<char *>(&(xi_vec[i])), sizeof(double));
-		for (int i115 = 1; i115 <= number_of_spheres; i115++) {
-			if (iog_vec[i115 - 1] < i115) continue;
-			output.write(reinterpret_cast<char *>(&(nshl_vec[i115 - 1])), sizeof(int));
-			output.write(reinterpret_cast<char *>(&(radii_of_spheres[i115 - 1])), sizeof(double));
-			int nsh = nshl_vec[i115 - 1];
-			if (i115 == 1) nsh += ies;
-			if (max_ici < (nsh + 1) / 2) max_ici = (nsh + 1) / 2;
-			for (int nsi = 0; nsi < nsh; nsi++)
-				output.write(reinterpret_cast<char *>(&(rcf[i115 - 1][nsi])), sizeof(double));
-		}
-		for (int jxi468 = 1; jxi468 <= number_of_scales; jxi468++) {
-			if (idfc != 0 && jxi468 > 1) continue;
-		    for (int i162 = 1; i162 <= number_of_spheres; i162++) {
-		    	if (iog_vec[i162 - 1] < i162) continue;
-		    	int nsh = nshl_vec[i162 - 1];
-		    	int ici = (nsh + 1) / 2; // QUESTION: is integer division really intended here?
-		    	if (i162 == 1) ici = ici + ies;
-		    	for (int i157 = 0; i157 < ici; i157++) {
-		    		double dc0_real, dc0_img;
-		    		dc0_real = dc0_matrix[i157][i162 - 1][jxi468 - 1].real();
-		    		dc0_img = dc0_matrix[i157][i162 - 1][jxi468 - 1].imag();
-		    		// The FORTRAN code writes the complex numbers as a 16-byte long binary stream.
-		    		// Here we assume that the 16 bytes are equally split in 8 bytes to represent the
-		    		// real part and 8 bytes to represent the imaginary one.
-		    		output.write(reinterpret_cast<char *>(&dc0_real), sizeof(double));
-		    		output.write(reinterpret_cast<char *>(&dc0_img), sizeof(double));
-		    	}
-		    }
-		}
-		if (is_new_vector) delete[] xi_vec;
-		output.close();
+  const double two_pi = acos(0.0) * 4.0;
+  const double evc = 6.5821188e-16;
+  int max_ici = 0;
+  bool is_new_vector = false;
+  if (mode.compare("LEGACY") == 0) { // Legacy mode was chosen.
+    fstream output;
+    int ies = (use_external_sphere)? 1 : 0;
+    double *xi_vec;
+    if (reference_variable_name.compare("XIV") == 0) xi_vec = scale_vec;
+    else {
+      is_new_vector = true;
+      xi_vec = new double[number_of_scales];
+      if (reference_variable_name.compare("WNS") == 0) {
+	for (int i = 0; i < number_of_scales; i++)
+	  xi_vec[i] = 3.0e8 * scale_vec[i] / wp;
+      } else if (reference_variable_name.compare("WLS") == 0) {
+	for (int i = 0; i < number_of_scales; i++) {
+	  double wn = two_pi / scale_vec[i];
+	  xi_vec[i] = 3.0e8 * wn / wp;
+	}
+      } else if (reference_variable_name.compare("PUS") == 0) {
+	for (int i = 0; i < number_of_scales; i++)
+	  xi_vec[i] = scale_vec[i] / wp;
+      } else if (reference_variable_name.compare("EVS") == 0) {
+	for (int i = 0; i < number_of_scales; i++) {
+	  double pu = scale_vec[i] / evc;
+	  xi_vec[i] = pu / wp;
 	}
+      } else {
+	throw UnrecognizedConfigurationException(
+						 "Wrong parameter set: unrecognized scale type "
+						 + reference_variable_name
+						 );
+      }
+    }
+    output.open(file_name.c_str(), ios::out | ios::binary);
+    output.write(reinterpret_cast<char *>(&number_of_spheres), sizeof(int));
+    for (int i = 0; i < number_of_spheres; i++)
+      output.write(reinterpret_cast<char *>(&(iog_vec[i])), sizeof(int));
+    output.write(reinterpret_cast<char *>(&exdc), sizeof(double));
+    output.write(reinterpret_cast<char *>(&wp), sizeof(double));
+    output.write(reinterpret_cast<char *>(&xip), sizeof(double));
+    output.write(reinterpret_cast<char *>(&idfc), sizeof(int));
+    output.write(reinterpret_cast<char *>(&number_of_scales), sizeof(int));
+    for (int i = 0; i < number_of_scales; i++)
+      output.write(reinterpret_cast<char *>(&(xi_vec[i])), sizeof(double));
+    for (int i115 = 1; i115 <= number_of_spheres; i115++) {
+      if (iog_vec[i115 - 1] < i115) continue;
+      output.write(reinterpret_cast<char *>(&(nshl_vec[i115 - 1])), sizeof(int));
+      output.write(reinterpret_cast<char *>(&(radii_of_spheres[i115 - 1])), sizeof(double));
+      int nsh = nshl_vec[i115 - 1];
+      if (i115 == 1) nsh += ies;
+      if (max_ici < (nsh + 1) / 2) max_ici = (nsh + 1) / 2;
+      for (int nsi = 0; nsi < nsh; nsi++)
+	output.write(reinterpret_cast<char *>(&(rcf[i115 - 1][nsi])), sizeof(double));
+    }
+    for (int jxi468 = 1; jxi468 <= number_of_scales; jxi468++) {
+      if (idfc != 0 && jxi468 > 1) continue;
+      for (int i162 = 1; i162 <= number_of_spheres; i162++) {
+	if (iog_vec[i162 - 1] < i162) continue;
+	int nsh = nshl_vec[i162 - 1];
+	int ici = (nsh + 1) / 2; // QUESTION: is integer division really intended here?
+	if (i162 == 1) ici = ici + ies;
+	for (int i157 = 0; i157 < ici; i157++) {
+	  double dc0_real, dc0_img;
+	  dc0_real = dc0_matrix[i157][i162 - 1][jxi468 - 1].real();
+	  dc0_img = dc0_matrix[i157][i162 - 1][jxi468 - 1].imag();
+	  // The FORTRAN code writes the complex numbers as a 16-byte long binary stream.
+	  // Here we assume that the 16 bytes are equally split in 8 bytes to represent the
+	  // real part and 8 bytes to represent the imaginary one.
+	  output.write(reinterpret_cast<char *>(&dc0_real), sizeof(double));
+	  output.write(reinterpret_cast<char *>(&dc0_img), sizeof(double));
+	}
+      }
+    }
+    if (is_new_vector) delete[] xi_vec;
+    output.close();
+  }
 }
 
 void ScattererConfiguration::write_formatted(string file_name) {
-	const double evc = 6.5821188e-16;
-	const double two_pi = acos(0.0) * 4.0;
-	double *xi_vec;
-	int ici;
-	int ies = (use_external_sphere)? 1: 0;
-	FILE *output = fopen(file_name.c_str(), "w");
-	int scale_type = -1;
-	if (reference_variable_name.compare("XIV") == 0) scale_type = 0;
-	else if (reference_variable_name.compare("WNS") == 0) scale_type = 1;
-	else if (reference_variable_name.compare("WLS") == 0) scale_type = 2;
-	else if (reference_variable_name.compare("PUS") == 0) scale_type = 3;
-	else if (reference_variable_name.compare("EVS") == 0) scale_type = 4;
-	if (idfc >= 0) { // Dielectric functions are constant or they depend on XI
-		double  *pu_vec, *ev_vec, *wn_vec, *wl_vec;
-	    xi_vec = new double[number_of_scales];
-	    pu_vec = new double[number_of_scales];
-	    ev_vec = new double[number_of_scales];
-	    wn_vec = new double[number_of_scales];
-	    wl_vec = new double[number_of_scales];
-		switch (scale_type) {
-		case 0:
-			fprintf(output, "  JXI     XIV          WNS          WLS          PUS          EVS\n");
-			for (int i = 0; i < number_of_scales; i++) {
-				xi_vec[i] = scale_vec[i];
-				pu_vec[i] = xi_vec[i] * wp;
-				ev_vec[i] = pu_vec[i] * evc;
-				wn_vec[i] = pu_vec[i] / 3.0e8;
-				wl_vec[i] = two_pi / wn_vec[i];
-				fprintf(
-						output,
-						"%5d%13.4lE%13.4lE%13.4lE%13.4lE%13.4lE\n",
-						(i + 1),
-						xi_vec[i],
-						wn_vec[i],
-						wl_vec[i],
-						pu_vec[i],
-						ev_vec[i]
-				);
-			}
-			break;
-		case 1:
-			fprintf(output, "  JXI     WNS          WLS          PUS          EVS          XIV\n");
-			for (int i = 0; i < number_of_scales; i++) {
-				wn_vec[i] = scale_vec[i];
-				wl_vec[i] = two_pi / wn_vec[i];
-				xi_vec[i] = 3.0e8 * wn_vec[i] / wp;
-				pu_vec[i] = xi_vec[i] * wp;
-				ev_vec[i] = pu_vec[i] * evc;
-				fprintf(
-						output,
-						"%5d%13.4lE%13.4lE%13.4lE%13.4lE%13.4lE\n",
-						(i + 1),
-						wn_vec[i],
-						wl_vec[i],
-						pu_vec[i],
-						ev_vec[i],
-						xi_vec[i]
-				);
-			}
-			break;
-		case 2:
-			fprintf(output, "  JXI     WLS          WNS          PUS          EVS          XIV\n");
-			for (int i = 0; i < number_of_scales; i++) {
-				wl_vec[i] = scale_vec[i];
-				wn_vec[i] = two_pi / wl_vec[i];
-				xi_vec[i] = 3.0e8 * wn_vec[i] / wp;
-				pu_vec[i] = xi_vec[i] * wp;
-				ev_vec[i] = pu_vec[i] * evc;
-				fprintf(
-						output,
-						"%5d%13.4lE%13.4lE%13.4lE%13.4lE%13.4lE\n",
-						(i + 1),
-						wl_vec[i],
-						wn_vec[i],
-						pu_vec[i],
-						ev_vec[i],
-						xi_vec[i]
-				);
-			}
-			break;
-		case 3:
-			fprintf(output, "  JXI     PUS          WNS          WLS          EVS          XIV\n");
-			for (int i = 0; i < number_of_scales; i++) {
-				pu_vec[i] = scale_vec[i];
-				xi_vec[i] = pu_vec[i] / wp;
-				wn_vec[i] = pu_vec[i] / 3.0e8;
-				wl_vec[i] = two_pi / wn_vec[i];
-				ev_vec[i] = pu_vec[i] * evc;
-				fprintf(
-						output,
-						"%5d%13.4lE%13.4lE%13.4lE%13.4lE%13.4lE\n",
-						(i + 1),
-						pu_vec[i],
-						wn_vec[i],
-						wl_vec[i],
-						ev_vec[i],
-						xi_vec[i]
-				);
-			}
-			break;
-		case 4:
-			fprintf(output, "  JXI     EVS          WNS          WLS          PUS          XIV\n");
-			for (int i = 0; i < number_of_scales; i++) {
-				ev_vec[i] = scale_vec[i];
-				pu_vec[i] = ev_vec[i] / evc;
-				xi_vec[i] = pu_vec[i] / wp;
-				wn_vec[i] = pu_vec[i] / 3.0e8;
-				wl_vec[i] = two_pi / wn_vec[i];
-				fprintf(
-						output,
-						"%5d%13.4lE%13.4lE%13.4lE%13.4lE%13.4lE\n",
-						(i + 1),
-						ev_vec[i],
-						wn_vec[i],
-						wl_vec[i],
-						pu_vec[i],
-						xi_vec[i]
-				);
-			}
-			break;
-		default:
-			throw UnrecognizedConfigurationException(
-					"Wonrg parameter set: unrecognized scale variable type "
-					+ reference_variable_name
-			);
-			break;
-		}
-	} else { // idfc < 0, Dielectric functions are at XIP and XI is scale for dimensions
-		double pu, wn;
-		xi_vec = scale_vec;
-		pu = xip * wp;
-		wn = pu / 3.0e8;
-		fprintf(output, "          XIP          WN           WL           PU           EV\n");
-		fprintf(output, "     %13.4lE", xip);
-		fprintf(output, "%13.4lE", wn);
-		fprintf(output, "%13.4lE", two_pi / wn);
-		fprintf(output, "%13.4lE", pu);
-		fprintf(output, "%13.4lE\n", pu * evc);
-		fprintf(output, "  SCALE FACTORS XI\n");
-		for (int i = 0; i < number_of_scales; i++)
-			fprintf(output, "%5d%13.4lE\n", (i + 1), xi_vec[i]);
+  const double evc = 6.5821188e-16;
+  const double two_pi = acos(0.0) * 4.0;
+  double *xi_vec;
+  int ici;
+  int ies = (use_external_sphere)? 1: 0;
+  FILE *output = fopen(file_name.c_str(), "w");
+  int scale_type = -1;
+  if (reference_variable_name.compare("XIV") == 0) scale_type = 0;
+  else if (reference_variable_name.compare("WNS") == 0) scale_type = 1;
+  else if (reference_variable_name.compare("WLS") == 0) scale_type = 2;
+  else if (reference_variable_name.compare("PUS") == 0) scale_type = 3;
+  else if (reference_variable_name.compare("EVS") == 0) scale_type = 4;
+  if (idfc >= 0) { // Dielectric functions are constant or they depend on XI
+    double  *pu_vec, *ev_vec, *wn_vec, *wl_vec;
+    xi_vec = new double[number_of_scales];
+    pu_vec = new double[number_of_scales];
+    ev_vec = new double[number_of_scales];
+    wn_vec = new double[number_of_scales];
+    wl_vec = new double[number_of_scales];
+    switch (scale_type) {
+    case 0:
+      fprintf(output, "  JXI     XIV          WNS          WLS          PUS          EVS\n");
+      for (int i = 0; i < number_of_scales; i++) {
+	xi_vec[i] = scale_vec[i];
+	pu_vec[i] = xi_vec[i] * wp;
+	ev_vec[i] = pu_vec[i] * evc;
+	wn_vec[i] = pu_vec[i] / 3.0e8;
+	wl_vec[i] = two_pi / wn_vec[i];
+	fprintf(
+		output,
+		"%5d%13.4lE%13.4lE%13.4lE%13.4lE%13.4lE\n",
+		(i + 1),
+		xi_vec[i],
+		wn_vec[i],
+		wl_vec[i],
+		pu_vec[i],
+		ev_vec[i]
+		);
+      }
+      break;
+    case 1:
+      fprintf(output, "  JXI     WNS          WLS          PUS          EVS          XIV\n");
+      for (int i = 0; i < number_of_scales; i++) {
+	wn_vec[i] = scale_vec[i];
+	wl_vec[i] = two_pi / wn_vec[i];
+	xi_vec[i] = 3.0e8 * wn_vec[i] / wp;
+	pu_vec[i] = xi_vec[i] * wp;
+	ev_vec[i] = pu_vec[i] * evc;
+	fprintf(
+		output,
+		"%5d%13.4lE%13.4lE%13.4lE%13.4lE%13.4lE\n",
+		(i + 1),
+		wn_vec[i],
+		wl_vec[i],
+		pu_vec[i],
+		ev_vec[i],
+		xi_vec[i]
+		);
+      }
+      break;
+    case 2:
+      fprintf(output, "  JXI     WLS          WNS          PUS          EVS          XIV\n");
+      for (int i = 0; i < number_of_scales; i++) {
+	wl_vec[i] = scale_vec[i];
+	wn_vec[i] = two_pi / wl_vec[i];
+	xi_vec[i] = 3.0e8 * wn_vec[i] / wp;
+	pu_vec[i] = xi_vec[i] * wp;
+	ev_vec[i] = pu_vec[i] * evc;
+	fprintf(
+		output,
+		"%5d%13.4lE%13.4lE%13.4lE%13.4lE%13.4lE\n",
+		(i + 1),
+		wl_vec[i],
+		wn_vec[i],
+		pu_vec[i],
+		ev_vec[i],
+		xi_vec[i]
+		);
+      }
+      break;
+    case 3:
+      fprintf(output, "  JXI     PUS          WNS          WLS          EVS          XIV\n");
+      for (int i = 0; i < number_of_scales; i++) {
+	pu_vec[i] = scale_vec[i];
+	xi_vec[i] = pu_vec[i] / wp;
+	wn_vec[i] = pu_vec[i] / 3.0e8;
+	wl_vec[i] = two_pi / wn_vec[i];
+	ev_vec[i] = pu_vec[i] * evc;
+	fprintf(
+		output,
+		"%5d%13.4lE%13.4lE%13.4lE%13.4lE%13.4lE\n",
+		(i + 1),
+		pu_vec[i],
+		wn_vec[i],
+		wl_vec[i],
+		ev_vec[i],
+		xi_vec[i]
+		);
+      }
+      break;
+    case 4:
+      fprintf(output, "  JXI     EVS          WNS          WLS          PUS          XIV\n");
+      for (int i = 0; i < number_of_scales; i++) {
+	ev_vec[i] = scale_vec[i];
+	pu_vec[i] = ev_vec[i] / evc;
+	xi_vec[i] = pu_vec[i] / wp;
+	wn_vec[i] = pu_vec[i] / 3.0e8;
+	wl_vec[i] = two_pi / wn_vec[i];
+	fprintf(
+		output,
+		"%5d%13.4lE%13.4lE%13.4lE%13.4lE%13.4lE\n",
+		(i + 1),
+		ev_vec[i],
+		wn_vec[i],
+		wl_vec[i],
+		pu_vec[i],
+		xi_vec[i]
+		);
+      }
+      break;
+    default:
+      throw UnrecognizedConfigurationException(
+					       "Wonrg parameter set: unrecognized scale variable type "
+					       + reference_variable_name
+					       );
+      break;
+    }
+  } else { // idfc < 0, Dielectric functions are at XIP and XI is scale for dimensions
+    double pu, wn;
+    xi_vec = scale_vec;
+    pu = xip * wp;
+    wn = pu / 3.0e8;
+    fprintf(output, "          XIP          WN           WL           PU           EV\n");
+    fprintf(output, "     %13.4lE", xip);
+    fprintf(output, "%13.4lE", wn);
+    fprintf(output, "%13.4lE", two_pi / wn);
+    fprintf(output, "%13.4lE", pu);
+    fprintf(output, "%13.4lE\n", pu * evc);
+    fprintf(output, "  SCALE FACTORS XI\n");
+    for (int i = 0; i < number_of_scales; i++)
+      fprintf(output, "%5d%13.4lE\n", (i + 1), xi_vec[i]);
+  }
+  if (idfc != 0) {
+    fprintf(output, "  DIELECTRIC CONSTANTS\n");
+    for (int i473 = 1; i473 <= number_of_spheres; i473++) {
+      if (iog_vec[i473 - 1] != i473) continue;
+      ici = (nshl_vec[i473 - 1] + 1) / 2;
+      if (i473 == 1) ici += ies;
+      fprintf(output, " SPHERE N.%4d\n", i473);
+      for (int ic472 = 0; ic472 < ici; ic472++) {
+	double dc0_real = dc0_matrix[ic472][i473 - 1][0].real(), dc0_img = dc0_matrix[ic472][i473 - 1][0].imag();
+	fprintf(output, "%5d %12.4lE%12.4lE\n", (ic472 + 1), dc0_real, dc0_img);
+      }
+    }
+  } else {
+    fprintf(output, "  DIELECTRIC FUNCTIONS\n");
+    for (int i478 = 1; i478 <= number_of_spheres; i478++) {
+      if (iog_vec[i478 - 1] != i478) continue;
+      ici = (nshl_vec[i478 - 1] + 1) / 2;
+      if (i478 == 1) ici += ies;
+      fprintf(output, " SPHERE N.%4d\n", i478);
+      for (int ic477 = 1; ic477 <= ici; ic477++) {
+	fprintf(output, " NONTRANSITION LAYER N.%2d, SCALE = %3s\n", ic477, reference_variable_name.c_str());
+	for (int jxi476 = 0; jxi476 < number_of_scales; jxi476++) {
+	  double dc0_real = dc0_matrix[ic477 - 1][i478 - 1][jxi476].real();
+	  double dc0_img = dc0_matrix[ic477 - 1][i478 - 1][jxi476].imag();
+	  fprintf(output, "%5d%12.4lE%12.4lE\n", (jxi476 + 1), dc0_real, dc0_img);
 	}
-	if (idfc != 0) {
-		fprintf(output, "  DIELECTRIC CONSTANTS\n");
-	    for (int i473 = 1; i473 <= number_of_spheres; i473++) {
-	    	if (iog_vec[i473 - 1] != i473) continue;
-	    	ici = (nshl_vec[i473 - 1] + 1) / 2;
-	    	if (i473 == 1) ici += ies;
-	    	fprintf(output, " SPHERE N.%4d\n", i473);
-	    	for (int ic472 = 0; ic472 < ici; ic472++) {
-	    		double dc0_real = dc0_matrix[ic472][i473 - 1][0].real(), dc0_img = dc0_matrix[ic472][i473 - 1][0].imag();
-	    		fprintf(output, "%5d %12.4lE%12.4lE\n", (ic472 + 1), dc0_real, dc0_img);
-	    	}
-	    }
-	  } else {
-		  fprintf(output, "  DIELECTRIC FUNCTIONS\n");
-		  for (int i478 = 1; i478 <= number_of_spheres; i478++) {
-			  if (iog_vec[i478 - 1] != i478) continue;
-			  ici = (nshl_vec[i478 - 1] + 1) / 2;
-			  if (i478 == 1) ici += ies;
-			  fprintf(output, " SPHERE N.%4d\n", i478);
-			  for (int ic477 = 1; ic477 <= ici; ic477++) {
-				  fprintf(output, " NONTRANSITION LAYER N.%2d, SCALE = %3s\n", ic477, reference_variable_name.c_str());
-				  for (int jxi476 = 0; jxi476 < number_of_scales; jxi476++) {
-					  double dc0_real = dc0_matrix[ic477 - 1][i478 - 1][jxi476].real();
-					  double dc0_img = dc0_matrix[ic477 - 1][i478 - 1][jxi476].imag();
-					  fprintf(output, "%5d%12.4lE%12.4lE\n", (jxi476 + 1), dc0_real, dc0_img);
-				  }
-			  }
-		  }
-	  }
-	fclose(output);
+      }
+    }
+  }
+  fclose(output);
 }