solar / FTV / bin / vyp.js
vyp.js
Raw
var calc = {
	'solarConstant': function() {

		// Stefan Boltzmanova konstanta
		let sigma_B = 5.670374419 * Math.pow(10, -8); // W/(2mK4)

		// Povrchová teplota Slunce
		let T_s = 5777; // K

		// Poloměr Slunce
		let R_s$km = 695508; // km
		let R_s$m = R_s$km * 1000; // m

		// Poloměr Země
		let R_e$km = 6371; // km
		let R_e$m = R_e$km * 1000; // m

		// Vzdálenost Slunce Země
		let r_se = 149597871000;

		// Intenzita vyzařování na povrchu Slunce
		let M_s = sigma_B * Math.pow(T_s, 4);

		// Povrch Slunce
		let A_s = 4 * Math.PI * Math.pow(R_s$m, 2);

		// Povrch Země
		//let A_e = 4 * Math.PI * R_e$m^2;

		// Zářivý tok z povrchu Slunce
		let phi_s = M_s * A_s;

		// Povrch koule mezi Sluncem a Zemí
		let S_se = 4 * Math.PI * Math.pow(r_se, 2);
		// Solární konstanta
		let I_0 = phi_s / S_se;

		return I_0;

	}

};

function mainCalc() {

	// *** KONSTANTY *** //
	// 
	var Nd     = 360 / 365; // deg
	// Solární konstanta - G_SC
	var I_0    = calc.solarConstant(); // W/m2
	//console.log(I_0);
	
	// *** POLOHA ***
	// Odrazivost okolního terénu (albedo)
	var ro_albedo = null;
	// Nadmořská výška
	var H_nm  = null; // m.n.m.
	// Zěměpisná šířka
	var zf    = null; // deg
	// Zěměpisná délka
	var zg    = null; // deg
	// Zněčištění atmosféry
	var Z_in  = null; // -
	// Umístění
	var mesto = null; // ~
	// Umístění
	var mesto_sip = null; // ~
	// Skutečná měsíční doba slunečního svitu
	var tau_skut_month = [];
	// Skutečná měsíční doba slunečního svitu
	var albedo_month = [];
	// Průměrný měsíční atmosférický tlak
	var pressure_month = [];
	// Venkovní teplota v době slunečního svitu
	var tes_month = [];
	// Zněčištění atmosféry
	var Z_month = []; // -

	// *** PANEL ***
	// Referenční účinnost
	var ny_ref 		= parseFloat(document.querySelector('input[name="eta_ref"]').value); // %
	// Teplotní součinitel výkonu
	var gamma_P 	= parseFloat(document.querySelector('input[name="gamma"]').value); // %/K
	// Teplota článku v otevřeném stavu při NOCT
	var t_FVNOCT 	= parseFloat(document.querySelector('input[name="t_FV"]').value); // C
	// Odrazivost modulu
	var ro 			= parseFloat(document.querySelector('input[name="ro"]').value); // %
	// Plocha jednoho panelu
	var A_FV_s 		= parseFloat(document.querySelector('input[name="A_FV_s"]').value); // m2
	// Počet panelů
	var A_FV_count 	= parseFloat(document.querySelector('input[name="A_FV_count"]').value); // ks

	// Činná plocha FTV panelu
	var A_FV 	= null; // m2
	// Pohltivost modulu
	var alfa 	= null; // -
	// Součinitel tepelné ztráty z FV článku do okolí
	var U 		= null; // W/m2K
	// Azimut plochy od jihu
	var a_s 	= null;
	// Naklonění plochy od vodorovné plochy
	var beta = null;

	mesto 		= parseFloat(document.querySelector('input[name="mesto_nazev"]').value); // -
	mesto_sip	= document.querySelector('input[name="mesto_name"]').value; // -
	zf 			= parseFloat(document.querySelector('input[name="mesto_zsirka"]').value.replace(",", ".")); // -49.96527778;
	zg          = parseFloat(document.querySelector('input[name="mesto_zdelka"]').value.replace(",", ".")); // 16.97056;
	H_nm 		= parseFloat(document.querySelector('input[name="mesto_nvyska"]').value); // 300;
	Z_in 		= document.querySelector('select[name="Z"]').value; // - 
	ro_alb_in	= document.querySelector('select[name="albedo"]').value; // 0.2;

	for(let m = 0; m < 12; ++m) {

		let cur_tau_skut = parseFloat(document.querySelector('input[name="mesto_tau_skut-' + (m + 1) + '"]').value);
		let albedo 		= parseFloat(document.querySelector('input[name="albedo-' + (m + 1) + '"]').value);
		let pressure 	= parseFloat(document.querySelector('input[name="pressure-' + (m + 1) + '"]').value);
		let tes 		= parseFloat(document.querySelector('input[name="tes-' + (m + 1) + '"]').value);
		let Z 			= parseFloat(document.querySelector('input[name="Z-' + (m + 1) + '"]').value);

		tau_skut_month[m] 	= cur_tau_skut;
		albedo_month[m] 	= albedo;
		pressure_month[m] 	= pressure;
		tes_month[m] 		= tes;
		Z_month[m] 			= Z;

	}

	a_s 	= parseFloat(document.querySelector('input[name="a_s"]').value);
	beta 	= parseFloat(document.querySelector('input[name="alpha_sklon"]').value);

	// Referenční podmínky
	var t_eref = parseFloat(document.querySelector('input[name="t_eref"]').value); // C
	var G_ref  = parseFloat(document.querySelector('input[name="G_ref"]').value); // W/m2

	// Podmínky NOCT
	// Teplota při NOCT
	var t_eNOCT = parseFloat(document.querySelector('input[name="t_eNOCT"]').value); // C
	// Sluneční ozáření při NOCT
	var G_NOCT  = parseFloat(document.querySelector('input[name="G_NOCT"]').value); // W/m2
	
	// Srážky vlivem elektrických ztrát
	var p_1 = null;
	var p_2 = null;
	var p_3 = null;
	// Celkové srážky vlivem elektrických ztrát
	var p   = null;
	// Srážka vlivem nekolmého dopadu paprsku
	var p_4 = null;

	// Spotřeba na m2
	var consumptionPerSMeter = parseFloat(document.querySelector('input[name="consumption_per_square_meter"]').value);
	// Užitná plocha
	var houseArea = parseFloat(document.querySelector('input[name="house_area"]').value);

	p_1 = parseFloat(document.querySelector('input[name="p_1"]').value);
	p_2 = parseFloat(document.querySelector('input[name="p_2"]').value);
	p_3 = parseFloat(document.querySelector('input[name="p_3"]').value);
	p   = (100 - (p_1 + p_2 + p_3)) / 100; // -
	p_4 = (100 - parseFloat(document.querySelector('input[name="p_4"]').value)) / 100;

	A_FV = A_FV_s * A_FV_count;
	alfa = (100 - ro) / 100;
	U    = (alfa * G_NOCT) / (t_FVNOCT - t_eNOCT);

	var H_sdenteor = []; // kWh/m2
	var H_smesteor = []; // kWh/m2
	var H_dmesteor = []; // kWh/m2
	var H_sden  = []; // kWh/m2
	var H_smes  = []; // kWh/m2
	var H_smes2 = []; // kWh/m2
	var H_mes   = []; // kWh/month
	var G_mes   = []; // W/m2
	var G_den   = []; // W/m2
	var S_a_arr = []; // -
	var pointsH  = [];
	var pointsHm = [];
	var pointsG  = [];
	var pointsHd = [];
	var pointsH2 = [];
	var pointsH_aver = [];
	var pointsCd = [];
	var pointsCm = [];
	var pointsCm2 = [];

	var slunovrat = 23.45;

	// Normální atmosférický tlak
	let p_0 = 101.325; // kPa

	let lastTau_skut_dayAprox = 0;
	let averageHouseholdConsumption = consumptionPerSMeter * 1000 * houseArea;
	let householdConsumption_month = [];
	let householdConsumption_day = [];

	for(let n = 1; n <= 365; ++n) {

		let date  = getDateFromDayNum(n, 2021);
		let day   = date.getDate();
		let month = date.getMonth() + 1;
		let nextDay = n + 1;

		// Měsíční průměrná deklinace (dle Mädlowa)
		let d_om = 0.383 - 22.926 * Math.cos(degToRad(Nd * n)) - 0.381 * Math.cos(degToRad(2 * Nd * n)) - 0.152 * Math.cos(degToRad(3 * Nd * n)) - 0.008 * Math.cos(degToRad(4 * Nd * n)) - 0.003 * Math.cos(degToRad(5 * Nd * n)) + 3.939 * Math.sin(degToRad(Nd * n)) + 0.042 * Math.sin(degToRad(2 * Nd * n)) + 0.08 * Math.sin(degToRad(3 * Nd * n)) + 0.003 * Math.sin(degToRad(4 * Nd * n)) + 0.002 * Math.sin(degToRad(5 * Nd * n));
		// Denní průměrná deklinace
		//let d_od = 23.45 * Math.sin(degToRad(Nd * (284 + n)));
		//let d_od   = radToDeg(Math.asin(Math.sin(degToRad(-23.45)) * Math.cos(degToRad(360/365.24 * (n + 10) + 360 / Math.PI * 0.0167 * Math.sin(degToRad(360 / 365.24 * (n - 2)))))));
		// Day angle
		//let T = (2 * Math.PI * (n - 1)) / 365; // rad
		//let d_odpokus = radToDeg(0.006918 - 0.399912 * Math.cos(T) + 0.070257 * Math.sin(T) - 0.006758 * Math.cos(2 * T) + 0.000907 * Math.sin(2 * T) - 0.002697 * Math.cos(3 * T) + 0.00148 * Math.sin(3 * T));
		let pn = n;
		let pL = 280.460 + 0.9856474 * pn;
		let pg = 357.528 + 0.9856003 * pn;
		let plambda = radToDeg(degToRad(pL) + 1.915 * Math.sin(degToRad(pg)) + 0.020 * Math.sin(2 * degToRad(pg)));
		//let pbeta = 0;
		let pR    = 1.00014 - 0.01671 * Math.cos(degToRad(pg)) - 0.00014 * Math.cos(2 * degToRad(pg));
		//console.log(pR * 149597870700);
		let peta  = 23.439 - 0.0000004 * pn;
		let palfa = Math.atan(Math.cos(peta * Math.tan(degToRad(plambda))));
		//let palfa = Math.atan2(Math.cos(peta * Math.sin(plambda)), Math.cos(plambda));
		let d_od = radToDeg(Math.asin(Math.sin(degToRad(peta)) * Math.sin(degToRad(plambda))));
		// Hodina východu slunce
		let h_vs = 12 / Math.PI * Math.acos(Math.tan(degToRad(zf)) * Math.tan(degToRad(d_od)));
		// Hodina východu slunce se zahrnutím ohybu slunečních paprsků (dřívější východ) - nevhodné pro výpočet
		//let h_vs2 = 1 / 15 * radToDeg(Math.acos((Math.sin(degToRad(f)) + Math.sin(degToRad(d_od)) + 0.010153) / (Math.cos(degToRad(f)) * Math.cos(degToRad(d_od)))));
		// Hodina západu slunce
		let h_zs = 24 - h_vs;
		// Teoretická doba slunečního svitu
		let S_a  = h_zs - h_vs;
		// Solární konstanta korigovaná o proměnnou vzdálenost Země od Slunce - G_En
		let I_0A = G_En = I_0 * (1 + 1 / 30 * Math.cos(degToRad((360 * n) / 365))); // W/m2
		// Časová rovnice (dle Aydinli)
		let W_d = (2 * Math.PI) / 365 * n;
		let ny = 0.0066 + 7.3525 * Math.cos(W_d + 1.4989) + 9.9359 * Math.cos(2 * W_d + 1.9006) + 0.3387 * (Math.cos(3 * W_d) + 1.836);

		// Korekce zohledňující proměnlivost rotace Země během oběhu okolo Slunce
		let B = (n - 1) * 360 / 365;
		let E = 222.9 * (0.000075 + 0.001868 * Math.cos(degToRad(B)) - 0.032077 * Math.sin(degToRad(B)) - 0.014615 * Math.cos(degToRad(2 * B)) - 0.04089 * Math.sin(degToRad(2 * B)));
		// Rozdíl mezi pravým slunečním časem a středním slunečním časem
		let ET = 10.2 * Math.sin(4 * Math.PI * (n - 80) / 373) - 7.74 * Math.sin(2 * Math.PI * (n - 8) / 355);

		let H_PUd_cur_teor   = 0;
		let H_S_cur_day_teor = 0;
		let H_D_cur_day_teor = 0;

		if(!householdConsumption_month[month - 1]) {
			householdConsumption_month[month - 1] = 0;
		}

		if(!H_smes[month - 1]) {
			H_smes[month - 1] = 0;
		}

		if(!H_smesteor[month - 1]) {
			H_smesteor[month - 1] = 0;
		}

		if(!H_dmesteor[month - 1]) {
			H_dmesteor[month - 1] = 0;
		}

		if(!S_a_arr[month - 1]) {
			S_a_arr[month - 1] = 0;
		}

		if(!H_smes2[month - 1]) {
			H_smes2[month - 1] = 0;
		}

		pointsCd.push([n, pd.elConsumption["TTD5-SM-d"][n - 1] * 1000]);

		householdConsumption_month[month - 1] += averageHouseholdConsumption / 365;
		householdConsumption_day[n - 1] = pd.elConsumption["TTD5-SM-d"][n - 1] * 1000;

		for(let h = -12; h < 12; ++h) {

			// Pravý sluneční čas
			let psc = h + 12;

			/*if(psc <= h_vs || psc >= h_zs) {

				continue;

			}*/

			// Časový úhel
			let tau = h * 15;

			//let d_oh = d_od - d_odp * h;
			let nh   = n + (h / 24);
			let d_oh = radToDeg(Math.asin(Math.sin(degToRad(-23.44)) * Math.cos(degToRad(360/365.24 * (nh + 10) + 360 / Math.PI * 0.0167 * Math.sin(degToRad(360 / 365.24 * (nh - 2)))))));

			// Hodinová průměrná elevační výška Slunce
			//let h_0 = radToDeg(Math.asin(Math.sin(degToRad(f)) * Math.sin(degToRad(d_od)) + 12 / Math.PI * (Math.sin(((Math.PI * psc) / 12)) - Math.sin(((Math.PI * (psc + 1)) / 12))) * Math.cos(degToRad(f)) * Math.cos(degToRad(d_od))));

			let k = Math.sin(degToRad(d_oh)) * Math.sin(degToRad(zf)) + Math.cos(degToRad(d_oh)) * Math.cos(degToRad(zf)) * Math.cos(degToRad(tau));
			// Elevační výška Slunce
			let h_0 = radToDeg(Math.asin(k));
			// Korekce úhlové výšky z důvodu ohybu paprsku
			let h_ref = 0.061359 * ((0.1594 + 1.123 * h_0 + 0.065656 * Math.pow(h_0, 2)) / (1 + 28.9344 * h_0 + 277.3971 * Math.pow(h_0, 2)));
			h_0 = h_0 + h_ref;

			if(h_0 < 0) {

				continue;

			}

			// Zenitový úhel
			let zen = radToDeg(Math.acos(k));
			//zen = zen - h_ref;

			let kp  = (pressure_month[month - 1]) / (p_0 * 10);
			// Poměrná optická tloušťka atmosféry 
			// (dle Kasten a Young)
			let m = kp / (Math.cos(degToRad(zen)) + 0.50572 * Math.pow(96.07995 - zen, -1.6364));
			// (dle Machotkina s korekcí na nadmořskou výšku)
			let m_alt = (2.0016 * (1 - H_nm * Math.pow(10, -4))) / (Math.sqrt(Math.pow(Math.sin(degToRad(h_0)), 2) + 0.003147) + Math.sin(degToRad(h_0)));
			// (dle Muneer 2004)
			let AM = 1 / (Math.sin(degToRad(h_0)) + 0.50572 * Math.pow(degToRad(h_0) + 6.07995, -1.6364));
			let AMd = AM * Math.exp(-0.0001184 * H_nm);
			// Extinkční koeficient Rayleighyho atmosféry
			let a_r = 1 / (0.9 * m + 9.4);
/*
			let SEC = psc - ny - (4 * (zg - 15)) / 60;
			let T_m = ET + psc;
			let polednik = 15;
			let ST = psc + 4 * (zg - polednik) + E;

			console.log(psc, T_m, ST, SEC, d_oh);
*/
			// Azimut slunce
			let a_prep = Math.cos(degToRad(d_oh)) / Math.cos(degToRad(h_0)) * Math.sin(degToRad(tau));
			// Make this check because asin cant be bigger then 1 or smaller then -1, due tu inaccuracy a_prep can slightly off
			if(a_prep > 1) {
				a_prep = 1;
			}
			if(a_prep < -1) {
				a_prep = -1;
			}
			let a = radToDeg(Math.asin(a_prep));

			// Horizon height
			let hh = findClosest(horizonData, a);

			// Sun is behind the mountains
			if(hh.H_hor > h_0) {

				//console.log(a, hh, date, psc);
				continue;

			}

			// (Maxwellův model)
			let k_t = 0.6;
			let A = null;
			let B = null;
			let C = null;

			let K_nc = 0.866 - 0.122 * AMd + 0.012 * Math.pow(AMd, 2) - 0.000653 * Math.pow(AMd, 3) + 0.000014 * Math.pow(AMd, 4);

			if(k_t <= 0.6) {

				A = 0.512 - 1.56 * k_t + 2.286 * Math.pow(k_t, 2) - 2.222 * Math.pow(k_t, 3);
				B = 0.37 + 0.962 * k_t;
				C = -0.28 + 0.932 * k_t - 2.048 * Math.pow(k_t, 2);

			}else{

				A = -5.743 + 21.77 * k_t - 27.49 * Math.pow(k_t, 2) + 11.56 * Math.pow(k_t, 3);
				B = 41.4 - 118.5 * k_t + 66.05 * Math.pow(k_t, 2) + 31.9 * Math.pow(k_t, 3);
				C = -47.01 + 184.2 * k_t - 222 * Math.pow(k_t, 2) + 73.81 * Math.pow(k_t, 3);

			}
			// Přímé normálové ozáření
			let G_Bn = G_En * (K_nc - (A + B * Math.exp(AMd * C)));

			// Úhel dopadu paprsků
			let gamma = radToDeg(Math.acos(Math.sin(degToRad(h_0)) * Math.cos(degToRad(beta)) + Math.cos(degToRad(h_0)) * Math.sin(degToRad(beta)) * Math.cos(degToRad(a - a_s))));
			// Přímé sluneční záření
			let I_PN = I_0A * Math.exp(-a_r * m * Z_month[month - 1]);
			//console.log(I_PN, G_Bn);
			// Přímé sluneční záření na libovolně orientovanou plochu
			let I_PU = I_PN * Math.cos(degToRad(gamma));
			// Difuzní sluneční záření jasné oblohy
			let I_DBH = (0.22 + 0.025 * Z_month[month - 1]) * (I_0A - I_PN) * Math.sin(degToRad(h_0));
			// Difúzní sluneční záření jasné oblohy na libovolně orintovanou plochu
			let I_DBU = 0.5 * I_DBH * (Math.sin(degToRad(beta)) * 0.94 * Math.exp(Math.cos(degToRad(gamma)) + 1.84 / Z_month[month - 1] - 1.44) + 1 + Math.cos(degToRad(beta)));
			// Difúzní sluneční záření zamračené oblohy
			let I_DZH = (0.18 + 0.025 * Z_month[month - 1]) * I_0A * Math.sin(degToRad(h_0));
			// Difúzní sluneční záření zamračené oblohy, na libovolně orintovanou plochu
			let I_DZU = I_DZH * (0.6 * Math.cos(degToRad(beta)) + 0.4);
			// Odražené sluneční záření jasné oblohy
			let I_RB = 0.5 * albedo_month[month - 1] * (1 - Math.cos(degToRad(beta))) * (I_DBH + I_PN * Math.sin(degToRad(h_0)));
			// Odražené sluneční záření zamračené oblohy
			let I_RZ = 0.5 * albedo_month[month - 1] * I_DZH * (1 - Math.cos(degToRad(beta)));
			// Celkové sluneční záření jasné oblohy
			let I_CB = I_PU + I_DBU + I_RB;
			// Celkové sluneční záření zamračené oblohy
			let I_CZ = I_DZU + I_RZ;

			if(I_CB > 0) {

				H_S_cur_day_teor += (I_CB / 1);
				H_D_cur_day_teor += (I_CZ / 1); 

			}

		}

		/*if(n == 5) {
			break;
		}*/

		let S_m = null;

		if(pd.places[mesto_sip]['tau_skut_day']) {

			S_m = pd.places[mesto_sip]['tau_skut_day'][n - 1] / S_a;

		}else{

			S_m = pd.places[mesto_sip]['tau_skut_month'][month - 1] / (S_a * daysInMonth(month - 1, 2021));

		}

		//let S_m = tau_skut_day / S_a;

		S_a_arr[month - 1] += S_a;

		let H_S_day = S_m * H_S_cur_day_teor + (1 - S_m) * H_D_cur_day_teor;

		H_sdenteor[n - 1]		= H_S_cur_day_teor;
		H_smesteor[month - 1]	+= H_S_cur_day_teor;
		H_dmesteor[month - 1]	+= H_D_cur_day_teor;
		H_sden[n - 1]			= H_S_day;
		G_den[n - 1]			= H_S_cur_day_teor / S_a;
		H_smes2[month - 1]		+= H_S_day;

		pointsHd.push([n, H_S_day]);

	}

	var G_den_aver = [];
	var H_den_aver = [];
	var smoothAverage = 3;

	for(let i = 0; i < 365; ++i) {

		let G_den_sum = 0;
		let H_den_sum = 0;
		let G_den_count = 0;

		for(let a = -smoothAverage; a < smoothAverage; ++a) {

			if(G_den[i + a]) {
				G_den_sum += G_den[i + a];
				H_den_sum += H_sden[i + a];
				G_den_count++;
			}

		}

		G_den_aver[i] = G_den_sum / G_den_count;
		H_den_aver[i] = H_den_sum / G_den_count;

		pointsH_aver.push([i + 1, H_den_aver[i]]);

	}

	var H_year = 0;

	for(let month = 0; month < 12; ++month) {

		let S_m = tau_skut_month[month] / S_a_arr[month];
		let H_month = S_m * H_smesteor[month] + (1 - S_m) * H_dmesteor[month];
		let G_month = H_smesteor[month] / (S_a_arr[month]);

		H_smes[month] = H_month;
		H_mes[month]  = H_month * A_FV;
		G_mes[month]  = G_month;

		H_year += H_month;

		pointsH.push([month, H_month]);
		pointsHm.push([month, H_month * A_FV]);
		pointsH2.push([month, H_smes2[month]]);
		pointsG.push([month, G_month]);
		pointsCm.push([month, householdConsumption_month[month]]);
		//pointsCm2.push([month, pd.elConsumption['TTD5-SM-m'][month] * 1000]);

	};

	var G_dec = 200;

	function FVprodMonth(G_mes, H_smes) {

		var n_FVstart = 1;
		var tFV = [];
		var k   = [];
		var nFV = [];
		var E_FVsys = [];
		var E_FVsysm = [];
		var E_FVsys_year = 0;

		for(let m = 0; m < 300; ++m) {

			for(let i = 0; i < 12; ++i) {

				if(m == 0) {

					n_FVprev = n_FVstart;

				}else{

					n_FVprev = nFV[i];

				}

				if(G_mes[i] < 250) {
					G_mes[i] = 250;
				}

				tFV[i] = tes_month[i] + (alfa * G_mes[i] - n_FVprev / 100 * G_mes[i]) / U;
				//tFV[i] = tes_month[i] + G_mes[i] * ((t_FVNOCT - t_eNOCT) / G_NOCT) * (1 - ny_ref / (alfa * 100));
				k[i] = (n_FVprev - ny_ref) / ny_ref * 1 / Math.log(G_dec / G_ref);

				nFV[i] 		= ny_ref * (1 + gamma_P / 100 * (tes_month[i] + (1 - (ny_ref / 100) / alfa) * G_mes[i] / G_NOCT * (t_FVNOCT - t_eNOCT) - t_eref)) * (1 + k[i] * Math.log(G_mes[i] / G_ref));

				let E_FVsys_cur = nFV[i] / 100 * H_smes[i] / 1000 * p * p_4 * 1000;
				E_FVsysm[i] = E_FVsys_cur;
				E_FVsys[i] 	= E_FVsys_cur * A_FV;

			}

			let E_FVsys_year_new = E_FVsys.reduce((a, b) => a + b, 0);

			if(Math.abs(E_FVsys_year - E_FVsys_year_new) < 0.0001) {

				E_FVsys_year = E_FVsys_year_new;
				break;

			}else{

				E_FVsys_year = E_FVsys_year_new;

			}

		}

		return {
			"E_FVsysm": E_FVsysm,
			"E_FVsys_year": E_FVsys_year,
			"E_FVsys": E_FVsys,
			"n": nFV,
			"t": tFV
		};

	}

	function FVprodDay(G_mes, H_smes) {

		var n_FVstart = 1;
		var tFVd = [];
		var kd   = [];
		var nFVd = [];
		var E_FVsysd = [];
		var E_FVsysdm = [];
		var E_FVsysd_year = 0;
		var n_FVprevd = null;

		for(let m = 0; m < 300; ++m) {

			for(let i = 0; i < 365; ++i) {


				let date  = getDateFromDayNum(i, 2021);
				let day   = date.getDate();
				let month = date.getMonth();

				if(m == 0) {

					n_FVprevd = n_FVstart;

				}else{

					n_FVprevd = nFVd[i];

				}

				let cur = tes_month[month];
				let prev = null;
				let next = null;

				if(month == 0) {

					prev = tes_month[11];

				}else{

					prev = tes_month[month - 1]

				}

				if(month == 11) {

					next = tes_month[0];

				}else{

					next = tes_month[month + 1]

				}

				let predictedDayTemp = (cur - (next - prev) / 4) + ((next - prev)) / 60 * day;

				//let G_den_aver = G_den_sum / G_den_count;
				let cur_G_den_aver = G_den_aver[i];
				//let H_den_aver = H_den_sum / G_den_count;
				let cur_H_den_aver = H_den_aver[i];


				if(cur_G_den_aver < 250) {
					cur_G_den_aver = 250;
				}
				//let predictedDayTemp = tes_month[month];

				/*if(i == 5) {
					break;
				}*/

				// Výpočet dle TZB info
				//tFVd[i] = tes_month[month] + (alfa * G_den[i] - n_FVprevd / 100 * G_den[i]) / U;
				// Výpočet dle Homerovi metodologie - výpočet složitější protože U zakomponováno ve vzorci (shodné výsledky s TZBinfo)
				//tFVd[i] = tes_month[month] + G_den[i] * ((t_FVNOCT - t_eNOCT) / G_NOCT) * (1 - ny_ref / (alfa * 100));

				// Efficiency of the PV array at max power point at test conditions
				let ny_mpstc = 0.36 / 1.824 * G_ref / 1000;
				// Temperature coefficient of power (%/C)
				let alfa_odhad = -0.304 / 33.9;
				// Efficiency of the PV array at max power point
				let ny_mp = ny_mpstc * (1 + alfa_odhad * (tFVd[i] - t_eref));

				tFVd[i] = predictedDayTemp + (t_FVNOCT - t_eNOCT) * ((cur_G_den_aver*30) / G_NOCT) * (1 - ny_mp / alfa);

				// Součinitel panelu
				kd[i] = (n_FVprevd - ny_ref) / ny_ref * 1 / Math.log(G_dec / G_ref);

				// Účinnost FV modulu
				//let curnFVt  = ny_ref * (1 + gamma_P / 100 * (tFVd[i] - t_eref));
				//let curnFVG  = ny_ref * (1 + kd[i] * Math.log(G_den[i] / G_ref));
				//nFVd[i]   = (curnFVt * curnFVG) / ny_ref;

				nFVd[i] = ny_ref * (1 + gamma_P / 100 * (predictedDayTemp + (1 - (ny_ref / 100) / alfa) * cur_G_den_aver / G_NOCT * (t_FVNOCT - t_eNOCT) - t_eref)) * (1 + kd[i] * Math.log(cur_G_den_aver / G_ref));

				let E_FVsys_cur = nFVd[i] / 100 * cur_H_den_aver / 1000 * p * p_4 * 1000;

				//let E_FVsys_cur = P_pk / G_ref * nFVd[i] / ny_ref * H_sden[i] / 1000 * p * p_4 * 1000;

				E_FVsysdm[i] = E_FVsys_cur;
				E_FVsysd[i]  = E_FVsys_cur * A_FV;

			}

			let E_FVsysd_year_new = E_FVsysd.reduce((a, b) => a + b, 0);

			if(Math.abs(E_FVsysd_year - E_FVsysd_year_new) < 0.0001) {

				E_FVsysd_year = E_FVsysd_year_new;
				break;

			}else{

				E_FVsysd_year = E_FVsysd_year_new;

			}

		}

		return {
			"E_FVsysdm": E_FVsysdm,
			"E_FVsysd_year": E_FVsysd_year,
			"E_FVsysd": E_FVsysd,
			"n": nFVd
		};

	}

	let dataD = FVprodDay(G_mes, H_smes);
	let dataM = FVprodMonth(G_mes, H_smes);
	let E_FVsysdm = dataD.E_FVsysdm;
	let E_FVsysd = dataD.E_FVsysd;
	let E_FVsysd_year = dataD.E_FVsysd_year;
	let nFVd = dataD.n;
	let E_FVsysm = dataM.E_FVsysm;
	let E_FVsys = dataM.E_FVsys;
	let tFV = dataM.t;
	let nFV = dataM.n;

	let nFVd_sum = 0;

	var pointsEdm = [];
	var pointsEd = [];
	var pointsE = [];
	var pointsEy = [];
	let pokus = [];

	for(let n = 0; n < 365; ++n) {

		let date  = getDateFromDayNum(n, 2021);
		let day   = date.getDate();
		let month = date.getMonth();

		let cur = tes_month[month];
		let prev = null;
		let next = null;

		if(month == 0) {

			prev = tes_month[11];

		}else{

			prev = tes_month[month - 1]

		}

		if(month == 11) {

			next = tes_month[0];

		}else{

			next = tes_month[month + 1]

		}

		let val = (cur - (next - prev) / 4) + ((next - prev)) / 60 * day;

		pokus.push([n, val * 1000]);

		pointsEdm.push([n + 1, E_FVsysdm[n], day + "." + (month + 1) + "." + date.getFullYear()]);
		pointsEd.push([n + 1, E_FVsysd[n]]);
		nFVd_sum += nFVd[n];
		//pointsCd.push([n, householdConsumption_day[n]]);

	}

	let nFV_year_average = nFVd_sum / 365;

	for(let month = 0; month < 12; ++month) {

		pointsE.push([month, E_FVsysm[month]]);
		pointsEy.push([month, E_FVsys[month]]);

	};

	for(let i = 0; i < 12; ++i) {

		var elemE = document.querySelector('input[name="EFV-' + (i + 1) + '"]');
		var elemEm = document.querySelector('input[name="EFVm-' + (i + 1) + '"]');
		var elemH = document.querySelector('input[name="H-' + (i + 1) + '"]');
		var elemG = document.querySelector('input[name="G-' + (i + 1) + '"]');
		var elemt = document.querySelector('input[name="tFV-' + (i + 1) + '"]');
		var elemn = document.querySelector('input[name="nFV-' + (i + 1) + '"]');

		elemH.value = (H_smes[i] / 1000).toFixed(2);
		elemG.value = (G_mes[i]).toFixed(2);
		elemt.value = tFV[i].toFixed(2);
		elemn.value = nFV[i].toFixed(2);
		elemE.value = (E_FVsys[i] / 1000).toFixed(2);
		elemEm.value = (E_FVsysm[i] / 1000).toFixed(2);

	};

	document.querySelector('input[name="U"]').value = U.toFixed(2);
	document.querySelector('input[name="E_FVsys_year"]').value = (E_FVsysd_year / 1000000).toFixed(2);
	document.querySelector('input[name="n_year"]').value = (nFV_year_average).toFixed(2);
	document.querySelector('input[name="alfa"]').value = alfa.toFixed(2);
	document.querySelector('input[name="p"]').value = p.toFixed(2);
	document.querySelector('input[name="A_FV"]').value = A_FV.toFixed(2);

	var minHmonthy = Math.min( ...E_FVsysd ),
	    maxHmonthy = Math.max( ...E_FVsysd, ...householdConsumption_day );

	var minHmonth = Math.min( ...E_FVsysm ),
	    maxHmonth = Math.max( ...H_smes );

	var minHday = Math.min( ...E_FVsysdm ),
	    maxHday = Math.max( ...H_sden );

	var smoothing = 0.2;

	var optionsHmonthy = {
	  yMin: minHmonthy - (minHmonthy * 0.5),
	  yMax: maxHmonthy + (maxHmonthy * 0.1),
	  xMin: 0,
	  xMax: 365
	}

	var optionsHmonth = {
	  yMin: minHmonth - (minHmonth * 0.5),
	  yMax: maxHmonth + (maxHmonth * 0.1),
	  xMin: 0,
	  xMax: 11
	}

	var optionsHday = {
	  yMin: minHday - (minHday * 0.5),
	  yMax: maxHday + (maxHday * 0.1),
	  xMin: 0,
	  xMax: 365
	}

	const containerDay = document.getElementById('graph-day');
	$('#graph-day').innerHTML = "";

	const containerMonth = document.getElementById('graph-month');
	$('#graph-month').innerHTML = "";

	const containerMonthY = document.getElementById('graph-month-y');
	$('#graph-month-y').innerHTML = "";

	drawGraph(
		containerMonth, 
		[
			{
				name: "H2", 
				unit: "kWh/měs&#183;m&sup2", 
				style: {
					color: "#f7d56e", 
					dashed: true,
					label: "all",
					labelVisibility: "always"
				},
				points: pointsH2
			},
			/*{
				name: "H", 
				unit: "kWh/m&sup2", 
				style: {
					color: "#f7d56e", 
					dashed: true,
					label: "none"
				},
				points: pointsH
			},*/
			{
				name: "E", 
				unit: "kWh/měs&#183;m&sup2", 
				style: {
					color: "#ff0a0a", 
					label: "all",
					labelVisibility: "always"
				},
				points: pointsE
			}
		], 
		smoothing, optionsHmonth, 1000
	);

	drawGraph(
		containerDay, 
		[
			{
				name: "Hd", 
				unit: "kWh/den&#183;m&sup2", 
				style: {
					color: "#f5823d", 
					dashed: true,
					label: "all",
					labelVisibility: "pop"
				},
				points: pointsH_aver
			},
			{
				name: "Ed", 
				unit: "kWh/den&#183;m&sup2", 
				precision: 2,
				style: {
					color: "#ff0a0a", 
					label: "all",
					labelVisibility: "pop"
				},
				points: pointsEdm
			}/*,
			{
				name: "pokus", 
				unit: "C", 
				style: {
					color: "#fff", 
					label: 30
				},
				points: pokus
			}*/
		], 
		smoothing, optionsHday, 1000
	);

	drawGraph(
		containerMonthY, 
		[
			{
				name: "C", 
				unit: "kWh/den", 
				style: {
					color: "#668eff", 
					label: "all",
					labelVisibility: "pop"
				},
				points: pointsCd
			},
			{
				name: "Ey", 
				unit: "kWh/den", 
				style: {
					color: "#ff0a0a", 
					label: "all",
					labelVisibility: "pop"
				},
				points: pointsEd
			}
		], 
		smoothing, optionsHmonthy, 1000
	);

};