// Проверка сварных швов для элементов переменного сечения, табл. 2.2.9 ТП
double TCheckExecute::CheckWeld_CV(DATA_CHECK_U *data_check, double Ry, int j1_RSU, int j2_RSU, double *fi_, bool *Checked,
								   int *n_elem_ret) {
// n_elem - номер элемента
// j1_RSU, j2_RSU - границы РСУ
   double krit[30];
   GEOM_PARAM_SECT param_sect;
   double Qfic, tw, Rs;
   double S_ext, T_ext, S_int, T_int, R_int;
   int i, rc;
   double Ry_st, Ry_pol;
   double Ey;
   double N_, M_, Q_;
   double kr, kf_min;
   int n_elem;
   int n_elem_rep;
   int    nnel_krit[30];
   SECT_DVUTAVR sect_dvutavr;
   double krit_i;
   double q_down_max;

	// Расчетное сопротивление растяжению, сжатию и изгибу по пределу текучески для поясов
   Ry_pol = Ry;   // Допускаемое напряжение на растяжение-сжатие
   Ey = MaterPropU_prof.E;
   Ry_st = Ry;   // Допускаемое напряжение на растяжение-сжатие
   Rs = 0.58*Ry_st;                                             // Допускаемое напряжение на сдвиг

   for (i=0; i<30; i++)
	 krit[i] = -1;

  Check_Weld_U.KUFFW = 0;
  Check_Weld_U.KUFF1 = 0;
  Check_Weld_U.KUFF2 = 0;
  Check_Weld_U.KUFFP = 0;

  int icount = 0;
  int i_elem_err = -1;
  for (i=j1_RSU; i<=j2_RSU; i++) {
	if (Sect_Elem_Group[ListElem_RSU[i]].type_sect <= 0) {  // Жесткая вставка
	   continue;
	}                                                                                 //Sect_Elem_Group[17].
	n_elem = ListElem_RSU[i];
	n_elem_rep = n_elem;

	// Установки высоты стенки
	memcpy(&sect_dvutavr, &(Sect_Elem_Group[n_elem].com_sect.dvutavr), sizeof(SECT_DVUTAVR));
	// постоянная высота стенки
	//sect_dvutavr.h = H_sten[n_elem][ListNSect_RSU[i]];

	//Get_param_sect(&sect_dvutavr, &param_sect);
    // Вычислить геометрические характеристики сечения группы (исходного)
	if (data_check->flag_composed)  // Составное сечение
	  Get_param_sect_composed(Sect_Elem_Group[n_elem].type_sect, &(Sect_Elem_Group[n_elem].com_sect),
							 data_check->plate_width, data_check->plate_thick, &param_sect, data_check->index_composed);
	else
	  Get_param_sect_comm(Sect_Elem_Group[n_elem].type_sect, &(Sect_Elem_Group[n_elem].com_sect), &param_sect);

	if (Sect_Elem_Group[n_elem].type_sect > CORNER_TWO || param_sect.Izz <= 1.0) {
	  if (i_elem_err != n_elem) {
	  #ifdef EMBRAC
		rc = Application->MessageBox((L"Неверный тип сечения элемента "+IntToStr(n_elem)+": "+IntToStr(Sect_Elem_Group[n_elem].type_sect)).c_str(),
									  L"Программная ошибка в CheckWeld_CV", MB_OK | MB_ICONERROR);
	  #else
		rc = Application->MessageBox(("Неверный тип сечения элемента "+IntToStr(n_elem)+": "+IntToStr(Sect_Elem_Group[n_elem].type_sect)).c_str(),
									  "Программная ошибка в CheckWeld_CV", MB_OK | MB_ICONERROR);
	  #endif
		i_elem_err = n_elem;
		icount++;
		if (icount <5)
		  continue;
		else
		  return -1.0;
	  }
	  else
		continue;
	}
	N_ = Elem_RSU[i][0]*1000;
	Q_ = Elem_RSU[i][3]*1000;
	M_ = Elem_RSU[i][2]*1e6;
	Qfic = GetQfic(Ey, Ry_st, N_, fi_[i]);
	tw = sect_dvutavr.b;
   // Статический момент
	S_ext = sect_dvutavr.h1*sect_dvutavr.b1*(param_sect.Zct - sect_dvutavr.h1*0.5);
	T_ext = Q_*S_ext/param_sect.Izz;
	if (data_check->flag_composed) {
	   if (Sect_Elem_Group[n_elem].type_sect==TAVR) {    // Тавр с пластиной
		 S_int = data_check->plate_width*data_check->plate_thick*(param_sect.Hsect - param_sect.Zct - data_check->plate_thick*0.5);
		 q_down_max = data_check->q_down_max;
	   }
	   else {
		 //S_int = (data_check->plate_width*data_check->plate_thick + sect_dvutavr.b2*sect_dvutavr.h2)*(param_sect.Hsect - param_sect.Zct - sect_dvutavr.h2*0.5);
		 S_int = 0;       // т.к. двутавр сварной
		 q_down_max = 0.5*data_check->q_down_max;  // т.к. считаем, что шов односторонний
	   }
	}
	else {
	  S_int = sect_dvutavr.b2*sect_dvutavr.h2*(param_sect.Hsect - param_sect.Zct - sect_dvutavr.h2*0.5);
	  q_down_max = data_check->q_down_max;
	}
	if (data_check->fi_b_index_poyas == 1) {  // считаем, что швы стенки с внутренней полкой воспринимают всю поперечную нагрузку
		T_int = Q_*S_int/param_sect.Izz;
	}
	else {
	  T_int = Q_*S_int/param_sect.Izz;
	}


	R_int = sqrt(T_int*T_int + q_down_max*q_down_max);

	Check_Weld_U.WSEXT = S_ext;
	Check_Weld_U.WSINT = S_int;
	Check_Weld_U.WI = param_sect.Izz;
	Check_Weld_U.WN = data_check->index_nf + 1;
	Check_Weld_U.BETAF = data_check->Weld_param_stenka.beta_f;
	Check_Weld_U.BETAZ = data_check->Weld_param_stenka.beta_z;
	Check_Weld_U.RWF = data_check->Weld_param_stenka.Rwf;
	Check_Weld_U.RWZ = data_check->Weld_param_stenka.Rwz;
	Check_Weld_U.T_W = sect_dvutavr.b;
	Check_Weld_U.T_F1 = sect_dvutavr.h1;
	Check_Weld_U.T_F2 = sect_dvutavr.h2;
	Check_Weld_U.T_P = data_check->plate_thick;
	Check_Weld_U.KF = data_check->kf;

	if (data_check->index_nf == 2) { // полный провар
	  krit[0] = krit[1] = krit[2] = krit[3] = krit[4] = krit[5] = krit[6] = krit[7] =
	  (ABS(Q_))/(param_sect.Izz*tw*Rs*data_check->gamma_c);
	}
	else {
   // 1. Внешний пояс по металлу шва стенки
	 if (Checked[0]) {
		krit_i = T_ext/((data_check->index_nf+1)*data_check->Weld_param_stenka.beta_f*data_check->kf*
				  data_check->Weld_param_stenka.Rwf*data_check->gamma_c);
		if (krit[0] < krit_i) {
		  Check_Weld_U.WQ = Q_;
		  Check_Weld_U.WTEXT = T_ext;
		}
		MAXNNEL(krit[0], krit_i, 1);
	  }
   // 2. Внешний пояс по металлу границы сплавления шва стенки
	 if (Checked[1]) {
		krit_i = T_ext/((data_check->index_nf+1)*data_check->Weld_param_stenka.beta_z*data_check->kf*
				  data_check->Weld_param_stenka.Rwz*data_check->gamma_c);
		if (krit[1] < krit_i) {
		  Check_Weld_U.WQ = Q_;
		  Check_Weld_U.WTEXT = T_ext;
		}
		MAXNNEL(krit[1], krit_i, 1);
	  }
   // 3. Внешний пояс по металлу шва полки
	 if (Checked[2]) {
		krit_i = T_ext/((data_check->index_nf+1)*data_check->Weld_param_polka.beta_f*data_check->kf*
				  data_check->Weld_param_polka.Rwf*data_check->gamma_c);
		if (krit[2] < krit_i) {
		  Check_Weld_U.WQ = Q_;
		  Check_Weld_U.WTEXT = T_ext;
		}
		MAXNNEL(krit[2], krit_i, 2);
	  }
   // 4. Внешний пояс по металлу границы сплавления шва полки
	 if (Checked[3]) {
		krit_i = T_ext/((data_check->index_nf+1)*data_check->Weld_param_polka.beta_z*data_check->kf*
				  data_check->Weld_param_polka.Rwz*data_check->gamma_c);
		if (krit[3] < krit_i) {
		  Check_Weld_U.WQ = Q_;
		  Check_Weld_U.WTEXT = T_ext;
		}
		MAXNNEL(krit[3], krit_i, 3);
	  }
   // 5. Внутренний пояс по металлу шва стенки
	 if (Checked[4]) {                                                //T_int/((data_check->index_nf+1)*data_check->Weld_param_stenka.beta_f*data_check->kf)
		krit_i = R_int/((data_check->index_nf+1)*data_check->Weld_param_stenka.beta_f*data_check->kf*
				  data_check->Weld_param_stenka.Rwf*data_check->gamma_c);
		if (krit[4] < krit_i) {
		  Check_Weld_U.WQ = Q_;
		  Check_Weld_U.WTINT = T_int;
		  Check_Weld_U.VDOWN = q_down_max;
		  Check_Weld_U.WRTV = R_int;
		}
		MAXNNEL(krit[4], krit_i, 4);
	  }
   // 6. Внутренний пояс по металлу границы сплавления шва стенки
	 if (Checked[5]) {
		krit_i = R_int/((data_check->index_nf+1)*data_check->Weld_param_stenka.beta_z*data_check->kf*
				  data_check->Weld_param_stenka.Rwz*data_check->gamma_c);
		if (krit[5] < krit_i) {
		  Check_Weld_U.WQ = Q_;
		  Check_Weld_U.WTINT = T_int;
		  Check_Weld_U.VDOWN = q_down_max;
		  Check_Weld_U.WRTV = R_int;
		}
		MAXNNEL(krit[5], krit_i, 5);
	  }
   // 7. Внутренний пояс по металлу шва полки
	 if (Checked[6]) {
		krit_i = R_int/((data_check->index_nf+1)*data_check->Weld_param_polka.beta_f*data_check->kf*
				  data_check->Weld_param_polka.Rwf*data_check->gamma_c);
		if (krit[6] < krit_i) {
		  Check_Weld_U.WQ = Q_;
		  Check_Weld_U.WTINT = T_int;
		  Check_Weld_U.VDOWN = q_down_max;
		  Check_Weld_U.WRTV = R_int;
		}
		MAXNNEL(krit[6], krit_i, 6);
	  }
   // 8. Внутренний пояс по металлу границы сплавления шва полки
	 if (Checked[7]) {
		krit_i = R_int/((data_check->index_nf+1)*data_check->Weld_param_polka.beta_z*data_check->kf*
				 data_check->Weld_param_polka.Rwz*data_check->gamma_c);
		if (krit[7] < krit_i) {
		  Check_Weld_U.WQ = Q_;
		  Check_Weld_U.WTINT = T_int;
		  Check_Weld_U.VDOWN = q_down_max;
		  Check_Weld_U.WRTV = R_int;
		}
		MAXNNEL(krit[7], krit_i, 7);
	  }
	}
	// 9. По металлу шва стенки в соединении стенки с внешней полкой от сил по направлению к центру или от центра сечения п. 14.4.1, табл. 43, ф.(196), (197).",
	if (Checked[8]) {
	  if (data_check->index_nf == 0 || data_check->index_nf == 1) {
		;
	  }
	  else {
        ;
	  }
	}
	if (Checked[16]) {
	  MAXNNEL(krit[16], data_check->kf/(1.2*sect_dvutavr.b),16);
	}
	if (Checked[17]) {
	  MAXNNEL(krit[17], data_check->kf/(1.2*sect_dvutavr.h1),17);
	}
	if (Checked[18]) {
	  if (!data_check->flag_composed) {
		 MAXNNEL(krit[18], data_check->kf/(1.2*sect_dvutavr.b),18);
	  }
	  else {
		if (Sect_Elem_Group[n_elem].type_sect==TAVR) {
		  MAXNNEL(krit[18], data_check->kf/(1.2*sect_dvutavr.b),18);
		}
		else {
		  MAXNNEL(krit[18], data_check->kf/(1.2*sect_dvutavr.h2),18);
		}
	  }
	}
	if (Checked[19]) {
	  if (!data_check->flag_composed) {
		MAXNNEL(krit[19], data_check->kf/(1.2*sect_dvutavr.h2),19);
	  }
	  else {
		  MAXNNEL(krit[19], data_check->kf/(1.2*data_check->plate_thick),19);
	  }
	}
	if (Checked[20]) {
	  kf_min = Get_min_kf_new(data_check->index_nf+1, data_check->index_vid_soedineniya, data_check->index_vid_svarki, sect_dvutavr.b, sect_dvutavr.h1, &rc);
	  Check_Weld_U.KUFFW = kf_min;
	  MAXNNEL(krit[20], kf_min/data_check->kf, 20);
	}
	if (Checked[21]) {
	  kf_min = Get_min_kf_new(data_check->index_nf+1, data_check->index_vid_soedineniya, data_check->index_vid_svarki, sect_dvutavr.h1, sect_dvutavr.b, &rc);
	  Check_Weld_U.KUFF1 = kf_min;
	  MAXNNEL(krit[21], kf_min/data_check->kf, 21);
	}
	if (Checked[22]) {
	  if (!data_check->flag_composed) {    // Сварной двутавр
		kf_min = Get_min_kf_new(data_check->index_nf+1, data_check->index_vid_soedineniya, data_check->index_vid_svarki, sect_dvutavr.h2, sect_dvutavr.b, &rc);
		Check_Weld_U.KUFF2 = kf_min;
	  }
	  else {
		if (Sect_Elem_Group[n_elem].type_sect==TAVR) {    // Тавр с пластиной
		  kf_min = Get_min_kf_new(data_check->index_nf+1, data_check->index_vid_soedineniya, data_check->index_vid_svarki, sect_dvutavr.b,
								  data_check->plate_thick, &rc);
		  Check_Weld_U.KUFFW = kf_min;
		}
		else {
		  kf_min = Get_min_kf_new(data_check->index_nf+1, data_check->index_vid_soedineniya, data_check->index_vid_svarki, sect_dvutavr.h2,
								  data_check->plate_thick, &rc);
		  Check_Weld_U.KUFF2 = kf_min;
		}
	  }
	  MAXNNEL(krit[22], kf_min/data_check->kf, 22);
	}
	if (Checked[23]) {
	  if (!data_check->flag_composed) {    // Сварной двутавр
		kf_min = Get_min_kf_new(data_check->index_nf+1, data_check->index_vid_soedineniya, data_check->index_vid_svarki, sect_dvutavr.h2, sect_dvutavr.b, &rc);
		Check_Weld_U.KUFF2 = kf_min;
	  }
	  else {
		if (Sect_Elem_Group[n_elem].type_sect==TAVR) {    // Тавр с пластиной
		  kf_min = Get_min_kf_new(data_check->index_nf+1, data_check->index_vid_soedineniya, data_check->index_vid_svarki, sect_dvutavr.b,
								  data_check->plate_thick, &rc);
		  Check_Weld_U.KUFFP = kf_min;
		}
		else {
		  kf_min = Get_min_kf_new(data_check->index_nf+1, data_check->index_vid_soedineniya, data_check->index_vid_svarki, sect_dvutavr.h2,
								  data_check->plate_thick, &rc);
		  Check_Weld_U.KUFFP = kf_min;
		}
	  }
	  MAXNNEL(krit[23], kf_min/data_check->kf, 23);
	}
  }
  double krit_max = -1;
  for (i=0; i<24; i++) {
	Check_Weld_U.WCHECK[i] = krit[i];

	if (krit_max < krit[i]) {
	  krit_max = MAX(krit_max, krit[i]);
	  *n_elem_ret = nnel_krit[i];
	}
  }

  RichEdit_Weld->Clear();
  for (i=0; i<Count_Weld; i++) {
	if (Checked[i]) {
	  if (Round(krit[i], 2) > 1.0)
		RichEdit_Weld->SelAttributes->Color=clRed;
	  else
		RichEdit_Weld->SelAttributes->Color=clBlack;
	  if (krit[i]>0)
		RichEdit_Weld->Lines->Add(" "+FloatToStr(Round(krit[i], 2)));
	  else
		RichEdit_Weld->Lines->Add(" "+FloatToStr(Round(krit[i], 2)));
	}
  }

  return krit_max;
}


