コード例 #1
0
ファイル: cmod_iec61853par.cpp プロジェクト: gtqite/ssc
	void exec() throw( general_error )
	{
		double I = as_double("I");
		double T = as_double("T");
		util::matrix_t<double> data = as_matrix("input");
		util::matrix_t<double> par = as_matrix("param");

		if ( data.ncols() != DATACOLS )
			throw general_error( util::format("input matrix must have 6 columns (Irr, Tc, Pmp, Vmp, Voc, Isc), but is %d x %d", 
				(int)data.nrows(), (int)data.ncols() ) );

		if ( par.ncols() != PARCOLS )
			throw general_error( util::format("parameter matrix must have 5 columns (Il, Io, Rs, Rsh, a), but is %d x %d",
				(int)par.nrows(), (int)par.ncols() ) );

		if ( par.nrows() != data.nrows() || data.nrows() < 3 )
			throw general_error( "input and parameter matrices must have same number of rows, and at least 3" );

		bool quiet = false;
		if ( is_assigned( "quiet" ) )
			quiet = true;

		assign( "a", var_data((ssc_number_t) interpolate( data, par, I, T, A, quiet ) ) );
		assign("Il", var_data((ssc_number_t)interpolate(data, par, I, T, IL, quiet)));
		assign("Io", var_data((ssc_number_t)interpolate(data, par, I, T, IO, quiet)));
		assign("Rs", var_data((ssc_number_t)interpolate(data, par, I, T, RS, quiet)));
		assign("Rsh", var_data((ssc_number_t)interpolate(data, par, I, T, RSH, quiet)));

	}
コード例 #2
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double markupMultiplierAndCost(double cost, double contingency, double warranty, double useTax, double overhead, double profitMargin)
	{
		double markup;
		markup = cost * (contingency + warranty + useTax + overhead + profitMargin) / 100.0; //convert from percentages to decimal
		assign("markup_cost", var_data(markup));
		return markup;
	}
コード例 #3
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double transmissionCost(double voltage, double distInter, int newSwitchyardRequired)
	{
		double cost = (1176 * voltage + 218257)*pow(distInter, 0.8937);
		if (newSwitchyardRequired){
			cost += 18115 * voltage + 165944;
		}
		assign("transmission_cost", var_data(cost));
		return cost;
	}
コード例 #4
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double erectionCost(double rating, double hubHt, int nTurb, int weatherDelayDays, int craneBreakdowns, int deliveryAssistRequired)
	{
		double cost = (37 * rating + 27000 * pow(nTurb, -0.42145) + (hubHt - 80) * 500)*nTurb;
		if (deliveryAssistRequired){
			cost += 60000 * nTurb;
		}
		cost += 20000 * weatherDelayDays + 35000 * craneBreakdowns + 181 * nTurb + 1834;
		assign("erection_cost", var_data(cost));
		return cost;
	}
コード例 #5
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double electricalMaterialsCost(SiteTerrain terrain, TurbineLayout layout, double farmSize, double diameter, int nTurb, int padMountTransformer,	double thermalBackfill)
	{
		double factor1 = 0.0;
		double factor2 = 0.0;
		double factor3 = 0.0;

		if (layout == SIMPLE){
			if (terrain == FLAT_TO_ROLLING){
				factor1 = 66733.4;
				factor2 = 27088.4;
				factor3 = 545.4;
			}
			else if (terrain == RIDGE_TOP){
				factor1 = 67519.4;
				factor2 = 27874.4;
				factor3 = 590.8;
			}
			else if (terrain == MOUNTAINOUS){
				factor1 = 68305.4;
				factor2 = 28660.4;
				factor3 = 590.8;
			}

		}
		else if (layout == COMPLEX){
			if (terrain == FLAT_TO_ROLLING){
				factor1 = 67519.4;
				factor2 = 27874.4;
				factor3 = 681.7;
			}
			else if (terrain == RIDGE_TOP){
				factor1 = 68305.4;
				factor2 = 28660.4;
				factor3 = 727.2;
			}
			else if (terrain == MOUNTAINOUS){
				factor1 = 69484.4;
				factor2 = 29839.4;
				factor3 = 727.2;
			}
		}

		double cost;
		if (padMountTransformer){
			cost = nTurb*factor1;
		}
		else{
			cost = nTurb*factor2;
		}
		cost += floor(farmSize / 25.0) * 35375 + floor(farmSize / 100.0) * 50000
			+ diameter*nTurb*factor3 + thermalBackfill * 5 + 41945;

		assign("electrical_materials_cost", var_data(cost));
		return cost;
	}
コード例 #6
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double electricalInstallationCost(SiteTerrain terrain, TurbineLayout layout, double farmSize, double diameter, int nTurb, double rockTrenchingLength, double overheadCollector)
	{
		double factor1 = 0.0;
		double factor2 = 0.0;
		double factor3 = 0.0;

		if (layout == SIMPLE){
			if (terrain == FLAT_TO_ROLLING){
				factor1 = 7059.3;
				factor2 = 352.4;
				factor3 = 297.0;
			}
			else if (terrain == RIDGE_TOP){
				factor1 = 7683.5;
				factor2 = 564.3;
				factor3 = 483.0;
			}
			else if (terrain == MOUNTAINOUS){
				factor1 = 8305.0;
				factor2 = 682.6;
				factor3 = 579.0;
			}

		}
		else if (layout == COMPLEX){
			if (terrain == FLAT_TO_ROLLING){
				factor1 = 7683.5;
				factor2 = 564.9;
				factor3 = 446.0;
			}
			else if (terrain == RIDGE_TOP){
				factor1 = 8305.0;
				factor2 = 866.8;
				factor3 = 713.0;
			}
			else if (terrain == MOUNTAINOUS){
				factor1 = 9240.0;
				factor2 = 972.8;
				factor3 = 792.0;
			}
		}
		double cost = (int)(farmSize / 25.0) * 14985;
		if (farmSize > 200){
			cost += 300000;
		}
		else{
			cost += 155000;
		}
		cost += nTurb*(factor1 + diameter*(factor2 + factor3*rockTrenchingLength / 100.0))
			+ overheadCollector * 200000 + 10000;

		assign("electrical_installation_cost", var_data(cost));
		return cost;
	}
コード例 #7
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double powerPerformanceCost(double hubHt, double permanent,	double temporary){
		double multiplier1 = 290000;
		double multiplier2 = 116800;
		if (hubHt < 90) {
			multiplier1 = 232600;
			multiplier2 = 92600;
		}
		double cost = 200000 + permanent*multiplier1 + temporary*multiplier2;
		assign("power_performance_cost", var_data(cost));
		return cost;
	}
コード例 #8
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double engineeringCost(int nTurb, double farmSize)
	{
		double cost = 7188.5 * nTurb;
		cost += round_bos(3.4893*std::log(nTurb) - 7.3049) * 16800;
		double multiplier = 2.0;
		if (farmSize < 200) multiplier = 1.0;
		cost += multiplier * 161675;
		cost += 4000;
		assign("engineering_cost", var_data(cost));
		return cost;
	}
コード例 #9
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double transportationCost(double tcc, double rating, int nTurb,	double hubHt, double transportDist){
		double cost = tcc * rating * nTurb;
		if (rating < 2500 && hubHt < 100) {
			cost += 1349 * pow(transportDist, 0.746) * nTurb;
		}
		else {
			cost += 1867 * pow(transportDist, 0.726) * nTurb;
		}
		assign("transportation_cost", var_data(cost));
		return cost;
	}
コード例 #10
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double foundationCost(double rating, double diameter, double topMass, double hubHt, SoilCondition soil, int nTurb)
	{
		double cost = rating*diameter*topMass / 1000.0
			+ 163421.5*pow(nTurb, -0.1458) + (hubHt - 80) * 500;

		if (soil == BOUYANT){
			cost += 20000;
		}
		cost *= nTurb;
		assign("foundation_cost", var_data(cost));
		return cost;
	}
コード例 #11
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double projectMgmtCost(int constructionTime)
	{
		double cost;
		if (constructionTime < 28){
			cost = (53.333*constructionTime*constructionTime - 3442 * constructionTime
				+ 209542)*(constructionTime + 2);
		}
		else{
			cost = (constructionTime + 2) * 155000;
		}
		assign("project_mgmt_cost", var_data(cost));
		return cost;
	}
コード例 #12
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	void exec( ) throw( general_error )
	{
		// get values
		double rating = (double) as_number("machine_rating");
		double diameter = (double)as_number("rotor_diameter");
		double hubHt = (double)as_number("hub_height");
		int nTurb = as_integer("number_of_turbines");
		double voltage = (double)as_number("interconnect_voltage");
		double distInter = (double)as_number("distance_to_interconnect");
		SiteTerrain terrain = (SiteTerrain) as_integer("site_terrain");
		TurbineLayout layout = (TurbineLayout)as_integer("turbine_layout");
		SoilCondition soil = (SoilCondition)as_integer("soil_condition");

		double farmSize = cm_windbos::farmSize(rating, nTurb);

		int constructionTime = (int)as_number("construction_time");
		double buildingSize = (double)as_number("om_building_size");
		double temporary = (double)as_number("quantity_test_met_towers");
		double permanent = (double)as_number("quantity_permanent_met_towers");
		int weatherDelayDays = (int)as_number("weather_delay_days");
		int craneBreakdowns = (int)as_number("crane_breakdowns");
		int accessRoadEntrances = (int)as_number("access_road_entrances");


		double tcc = (double)as_number("turbine_capital_cost");
		double topMass = (double)as_number("tower_top_mass");
		int deliveryAssistRequired = as_integer("delivery_assist_required");
		int padMountTransformer = as_integer("pad_mount_transformer_required");
		int newSwitchyardRequired = as_integer("new_switchyard_required");
		double rockTrenchingLength = (double)as_number("rock_trenching_required");
		double thermalBackfill = (double)as_number("mv_thermal_backfill");
		double overheadCollector = (double)as_number("mv_overhead_collector");
		double performanceBond = (double)as_number("performance_bond");
		double contingency = (double)as_number("contingency");
		double warranty = (double)as_number("warranty_management");
		double useTax = (double)as_number("sales_and_use_tax");
		double overhead = (double)as_number("overhead");
		double profitMargin = (double)as_number("profit_margin");
		double developmentFee = (double)as_number("development_fee");
		double transportDist = (double)as_number("turbine_transportation");


		// run model (execute functions)
		ssc_number_t output = totalCost(rating, diameter, hubHt, nTurb, voltage, distInter, terrain, layout, soil,
			farmSize, tcc, topMass, constructionTime, buildingSize, temporary, permanent, weatherDelayDays, craneBreakdowns, accessRoadEntrances,
			deliveryAssistRequired, padMountTransformer, newSwitchyardRequired, rockTrenchingLength, thermalBackfill, overheadCollector,
			performanceBond, contingency, warranty,	useTax, overhead, profitMargin,	developmentFee, transportDist);

		// assign outputs
		assign( "project_total_budgeted_cost", var_data(output) );
	}
コード例 #13
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double insuranceMultiplierAndCost(double cost, double tcc, double farmSize, double foundationCost, int performanceBond)
	{
		double ins;
		double pb_rate = 0;
		if (performanceBond)
			pb_rate = 10.0;
			
		ins = cost / 1000 * (3.5 + 0.7 + 0.4 + 1.0 + pb_rate) //rates are per $1000
			+ (tcc * farmSize) * (0.7 + 0.4 + 1.0 + pb_rate) //tcc in $/kW times farmSize in MW is equal to per $1000
			+ 0.02 * foundationCost
			+ 20000;
		assign("insurance_cost", var_data(ins));
		return ins;
	}
コード例 #14
0
ファイル: cmod_lcoefcr.cpp プロジェクト: gtqite/ssc
	void exec( ) throw( general_error )
	{
		double aep = 1; // annual output, get from performance model
		double aoe = 0; // annual operating costs
		double fcr = 0; // fixed charge rate, before tax revenues required
		double icc = 0; // initial investment, or capital cost
		double voc = 0; // variable operating cost
		double foc = 0; // fixed operating cost

		aep = as_double("annual_energy");           // kWh
		foc = as_double("fixed_operating_cost");    // $
		voc = as_double("variable_operating_cost"); // $/kWh
		fcr = as_double("fixed_charge_rate");       // unitless fraction
		icc = as_double("capital_cost");            // $
		
		double lcoe = (fcr*icc + foc) / aep + voc; //$/kWh

		assign("lcoe_fcr", var_data((ssc_number_t)lcoe));
	}
コード例 #15
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double siteCompoundCost(int accessRoadEntrances, int constructionTime, double farmSize)
	{
		double cost = 9825.0*accessRoadEntrances + 29850.0*constructionTime;
		double multiplier;
		if (farmSize > 100){
			multiplier = 10.0;
		}
		else if (farmSize > 30){
			multiplier = 5.0;
		}
		else{
			multiplier = 3.0;
		}
		cost += multiplier * 30000;
		if (farmSize > 30){
			cost += 90000;
		}
		cost += farmSize * 60 + 62400;
		assign("site_compound_security_cost", var_data(cost));
		return cost;
	}
コード例 #16
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double accessRoadsCost(SiteTerrain terrain, TurbineLayout layout, int nTurb, double diameter, int constructionTime,	int accessRoadEntrances){
		double factor1 = 0.0;
		double factor2 = 0.0;

		if (layout == SIMPLE){
			if (terrain == FLAT_TO_ROLLING){
				factor1 = 49962.5;
				factor2 = 24.8;
			}
			else if (terrain == RIDGE_TOP){
				factor1 = 59822.0;
				factor2 = 26.8;
			}
			else if (terrain == MOUNTAINOUS){
				factor1 = 66324.0;
				factor2 = 26.8;
			}

		}
		else if (layout == COMPLEX){
			if (terrain == FLAT_TO_ROLLING){
				factor1 = 62653.6;
				factor2 = 30.9;
			}
			else if (terrain == RIDGE_TOP){
				factor1 = 74213.3;
				factor2 = 33.0;
			}
			else if (terrain == MOUNTAINOUS){
				factor1 = 82901.1;
				factor2 = 33.0;
			}
		}
		double cost = (nTurb*factor1 + nTurb*diameter*factor2
			+ constructionTime * 55500
			+ accessRoadEntrances * 3800)*1.05;

		assign("access_roads_cost", var_data(cost));
		return cost;
	}
コード例 #17
0
ファイル: cmod_tcsgeneric_solar.cpp プロジェクト: gtqite/ssc
	void exec( ) throw( general_error )
	{
		//if ( 0 >= load_library("typelib") ) throw exec_error( "tcsgeneric_solar", util::format("could not load the tcs type library.") );

		//bool debug_mode = (__DEBUG__ == 1);  // When compiled in VS debug mode, this will use the trnsys weather file; otherwise, it will attempt to open the file with name that was passed in
		// type260_genericsolar uses 'poa_beam' from the weather reader, which is not available from a "trnsys_weatherreader", so this must be set to false
		bool debug_mode = false;

		//Add weather file reader unit
		int weather = 0;
		if(debug_mode) weather = add_unit("trnsys_weatherreader", "TRNSYS weather reader");
		else weather = add_unit("weatherreader", "TCS weather reader");
		
		// Add time-of-use reader
		int	tou = add_unit("tou_translator", "Time of Use Translator");
		//Add Physical Solar Field Model
		int	type260_genericsolar = add_unit( "sam_mw_gen_type260", "Generic solar model" );

		if(debug_mode)
		{
			set_unit_value( weather, "file_name", "C:/svn_NREL/main/ssc/tcsdata/typelib/TRNSYS_weather_outputs/tucson_trnsys_weather.out" );
			set_unit_value( weather, "i_hour", "TIME" );
			set_unit_value( weather, "i_month", "month" );
			set_unit_value( weather, "i_day", "day" );
			set_unit_value( weather, "i_global", "GlobalHorizontal" );
			set_unit_value( weather, "i_beam", "DNI" );
			set_unit_value( weather, "i_diff", "DiffuseHorizontal" );
			set_unit_value( weather, "i_tdry", "T_dry" );
			set_unit_value( weather, "i_twet", "T_wet" );
			set_unit_value( weather, "i_tdew", "T_dew" );
			set_unit_value( weather, "i_wspd", "WindSpeed" );
			set_unit_value( weather, "i_wdir", "WindDir" );
			set_unit_value( weather, "i_rhum", "RelHum" );
			set_unit_value( weather, "i_pres", "AtmPres" );
			set_unit_value( weather, "i_snow", "SnowCover" );
			set_unit_value( weather, "i_albedo", "GroundAlbedo" );
			set_unit_value( weather, "i_poa", "POA" );
			set_unit_value( weather, "i_solazi", "Azimuth" );
			set_unit_value( weather, "i_solzen", "Zenith" );
			set_unit_value( weather, "i_lat", "Latitude" );
			set_unit_value( weather, "i_lon", "Longitude" );
			set_unit_value( weather, "i_shift", "Shift" );
		}
		else
		{
			//Set weatherreader parameters
			set_unit_value_ssc_string( weather, "file_name" );
			set_unit_value_ssc_double( weather, "track_mode" );    //, 1 );
			set_unit_value_ssc_double( weather, "tilt" );          //, 0 );
			set_unit_value_ssc_double( weather, "azimuth" );       //, 0 );
		}

		set_unit_value_ssc_matrix(tou, "weekday_schedule"); // tou values from control will be between 1 and 9
		set_unit_value_ssc_matrix(tou, "weekend_schedule");

		//Set parameters
        set_unit_value_ssc_double(type260_genericsolar, "latitude" ); //, 35);
        set_unit_value_ssc_double(type260_genericsolar, "longitude" ); //, -117);
        set_unit_value_ssc_double(type260_genericsolar, "istableunsorted");
		set_unit_value_ssc_matrix(type260_genericsolar, "OpticalTable" ); //, opt_data);
        //set_unit_value_ssc_matrix(type260_genericsolar, "OpticalTableUns" );
        set_unit_value_ssc_double(type260_genericsolar, "timezone" ); //, -8);
        set_unit_value_ssc_double(type260_genericsolar, "theta_stow" ); //, 170);
        set_unit_value_ssc_double(type260_genericsolar, "theta_dep" ); //, 10);
        set_unit_value_ssc_double(type260_genericsolar, "interp_arr" ); //, 1);
        set_unit_value_ssc_double(type260_genericsolar, "rad_type" ); //, 1);
        set_unit_value_ssc_double(type260_genericsolar, "solarm" ); //, solarm);
        set_unit_value_ssc_double(type260_genericsolar, "T_sfdes" ); //, T_sfdes);
        set_unit_value_ssc_double(type260_genericsolar, "irr_des" ); //, irr_des);
        set_unit_value_ssc_double(type260_genericsolar, "eta_opt_soil" ); //, eta_opt_soil);
        set_unit_value_ssc_double(type260_genericsolar, "eta_opt_gen" ); //, eta_opt_gen);
        set_unit_value_ssc_double(type260_genericsolar, "f_sfhl_ref" ); //, f_sfhl_ref);
        set_unit_value_ssc_array(type260_genericsolar, "sfhlQ_coefs" ); //, [1,-0.1,0,0]);
        set_unit_value_ssc_array(type260_genericsolar, "sfhlT_coefs" ); //, [1,0.005,0,0]);
        set_unit_value_ssc_array(type260_genericsolar, "sfhlV_coefs" ); //, [1,0.01,0,0]);
        set_unit_value_ssc_double(type260_genericsolar, "qsf_des" ); //, q_sf);
        set_unit_value_ssc_double(type260_genericsolar, "w_des" ); //, w_gr_des);
        set_unit_value_ssc_double(type260_genericsolar, "eta_des" ); //, eta_cycle_des);
        set_unit_value_ssc_double(type260_genericsolar, "f_wmax" ); //, 1.05);
        set_unit_value_ssc_double(type260_genericsolar, "f_wmin" ); //, 0.25);
        set_unit_value_ssc_double(type260_genericsolar, "f_startup" ); //, 0.2);
        set_unit_value_ssc_double(type260_genericsolar, "eta_lhv" ); //, 0.9);
        set_unit_value_ssc_array(type260_genericsolar, "etaQ_coefs" ); //, [0.9,0.1,0,0,0]);
        set_unit_value_ssc_array(type260_genericsolar, "etaT_coefs" ); //, [1,-0.002,0,0,0]);
        set_unit_value_ssc_double(type260_genericsolar, "T_pcdes" ); //, 21);
        set_unit_value_ssc_double(type260_genericsolar, "PC_T_corr" ); //, 1);
        set_unit_value_ssc_double(type260_genericsolar, "f_Wpar_fixed" ); //, f_Wpar_fixed);
        set_unit_value_ssc_double(type260_genericsolar, "f_Wpar_prod" ); //, f_Wpar_prod);
        set_unit_value_ssc_array(type260_genericsolar, "Wpar_prodQ_coefs" ); //, [1,0,0,0]);
        set_unit_value_ssc_array(type260_genericsolar, "Wpar_prodT_coefs" ); //, [1,0,0,0]);
        set_unit_value_ssc_array(type260_genericsolar, "Wpar_prodD_coefs" ); //, [1,0,0,0]);
        set_unit_value_ssc_double(type260_genericsolar, "hrs_tes" ); //, hrs_tes);
        set_unit_value_ssc_double(type260_genericsolar, "f_charge" ); //, 0.98);
        set_unit_value_ssc_double(type260_genericsolar, "f_disch" ); //, 0.98);
        set_unit_value_ssc_double(type260_genericsolar, "f_etes_0" ); //, 0.1);
        set_unit_value_ssc_double(type260_genericsolar, "f_teshl_ref" ); //, 0.35);
        set_unit_value_ssc_array(type260_genericsolar, "teshlX_coefs" ); //, [1,0,0,0]);
        set_unit_value_ssc_array(type260_genericsolar, "teshlT_coefs" ); //, [1,0,0,0]);
        set_unit_value_ssc_double(type260_genericsolar, "ntod" ); //, 9);
        set_unit_value_ssc_array(type260_genericsolar, "disws" ); //, [0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]);
        set_unit_value_ssc_array(type260_genericsolar, "diswos" ); //, [0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]);
        set_unit_value_ssc_array(type260_genericsolar, "qdisp" ); //, [1,1,1,1,1,1,1,1,1]);
        set_unit_value_ssc_array(type260_genericsolar, "fdisp" ); //, [0,0,0,0,0,0,0,0,0]);
        set_unit_value_ssc_matrix(type260_genericsolar, "exergy_table" );
        set_unit_value_ssc_double(type260_genericsolar, "storage_config"); //Direct storage=0,Indirect storage=1


		//Set the initial values
        set_unit_value_ssc_double(type260_genericsolar, "ibn" ); //, 0.);	//Beam-normal (DNI) irradiation
        set_unit_value_ssc_double(type260_genericsolar, "ibh" ); //, 0.);	//	Beam-horizontal irradiation
        set_unit_value_ssc_double(type260_genericsolar, "itoth" ); //, 0.);	//	Total horizontal irradiation
        set_unit_value_ssc_double(type260_genericsolar, "tdb" ); //, 15.);	//	Ambient dry-bulb temperature
        set_unit_value_ssc_double(type260_genericsolar, "twb" ); //, 10.);	//	Ambient wet-bulb temperature
        set_unit_value_ssc_double(type260_genericsolar, "vwind" ); //, 1.);	//	Wind velocity

		// Connect the units
		bool bConnected = connect(weather, "beam", type260_genericsolar, "ibn");
		bConnected &= connect(weather, "global", type260_genericsolar, "itoth");
		bConnected &= connect(weather, "poa_beam", type260_genericsolar, "ibh");
		bConnected &= connect(weather, "tdry", type260_genericsolar, "tdb");
		bConnected &= connect(weather, "twet", type260_genericsolar, "twb");
		bConnected &= connect(weather, "wspd", type260_genericsolar, "vwind");
		//location
		bConnected &= connect(weather, "lat", type260_genericsolar, "latitude");
		bConnected &= connect(weather, "lon", type260_genericsolar, "longitude");
		bConnected &= connect(weather, "tz", type260_genericsolar, "timezone");
		bConnected &= connect(tou, "tou_value", type260_genericsolar, "TOUPeriod");


		// Example for changing an input variable name in the SSC interface
		// set_unit_value( u3, "m_dot_htf", as_double("m_dot_htf_init") );


		// check if all connections worked
		if ( !bConnected )
			throw exec_error( "tcsgeneric_solar", util::format("there was a problem connecting outputs of one unit to inputs of another for the simulation.") );
		
        size_t hours = 8760;

        //Load the solar field adjustment factors
        sf_adjustment_factors sf_haf(this);
        if (!sf_haf.setup())
			throw exec_error("tcsgeneric_solar", "failed to setup sf adjustment factors: " + sf_haf.error());
        //allocate array to pass to tcs
        ssc_number_t *sf_adjust = allocate("sf_adjust", hours);
        for( size_t i=0; i<hours; i++)
            sf_adjust[i] = sf_haf(i);
        set_unit_value_ssc_array(type260_genericsolar, "sf_adjust");

		// Run simulation
		if (0 > simulate(3600.0, hours*3600.0, 3600.0) )
			throw exec_error( "tcsgeneric_solar", util::format("there was a problem simulating in tcsgeneric_solar.") );

		// get the outputs
		if (!set_all_output_arrays() )
			throw exec_error( "tcsgeneric_solar", util::format("there was a problem returning the results from the simulation.") );

		// annual accumulations
		size_t count = 0;
		ssc_number_t *enet = as_array("enet", &count);
		if (!enet || count != 8760)
			throw exec_error("tcsgeneric_solar", "Failed to retrieve hourly net energy");

		adjustment_factors haf(this, "adjust");
		if (!haf.setup())
			throw exec_error("tcsgeneric_solar", "failed to setup adjustment factors: " + haf.error());


		ssc_number_t *hourly = allocate("gen", count);
		for (size_t i = 0; i < count; i++)
		{
			hourly[i] = enet[i] * 1000 * haf(i); // convert from MWh to kWh
		}

		accumulate_annual("gen",        "annual_energy");
		accumulate_annual("w_gr",                 "annual_w_gr",1000); // convert from MWh to kWh
		accumulate_annual("q_sf",                 "annual_q_sf");
		accumulate_annual("q_to_pb",              "annual_q_to_pb");
		accumulate_annual("q_to_tes",             "annual_q_to_tes");
		accumulate_annual("q_from_tes",           "annual_q_from_tes");
		accumulate_annual("q_hl_sf",              "annual_q_hl_sf");
		accumulate_annual("q_hl_tes",             "annual_q_hl_tes");
		accumulate_annual("q_dump_tot",           "annual_q_dump_tot");
		accumulate_annual("q_startup",            "annual_q_startup");
		double fuel_MWht = accumulate_annual("q_fossil",             "annual_q_fossil");


		// monthly accumulations
		accumulate_monthly("gen",       "monthly_energy");
		accumulate_monthly("w_gr",                "monthly_w_gr",1000); // convert from MWh to kWh
		accumulate_monthly("q_sf",                "monthly_q_sf");
		accumulate_monthly("q_to_pb",             "monthly_q_to_pb");
		accumulate_monthly("q_to_tes",            "monthly_q_to_tes");
		accumulate_monthly("q_from_tes",          "monthly_q_from_tes");
		accumulate_monthly("q_hl_sf",             "monthly_q_hl_sf");
		accumulate_monthly("q_hl_tes",            "monthly_q_hl_tes");
		accumulate_monthly("q_dump_tot",          "monthly_q_dump_tot");
		accumulate_monthly("q_startup",           "monthly_q_startup");
		accumulate_monthly("q_fossil",            "monthly_q_fossil");

		ssc_number_t ae = as_number("annual_energy");
		ssc_number_t pg = as_number("annual_w_gr");
		ssc_number_t convfactor = (pg != 0) ? 100 * ae / pg : 0;
		assign("conversion_factor", convfactor);


		// metric outputs moved to technology
		double kWhperkW = 0.0;
		double nameplate = as_double("system_capacity");
		double annual_energy = 0.0;
		for (int i = 0; i < 8760; i++)
			annual_energy += hourly[i];
		if (nameplate > 0) kWhperkW = annual_energy / nameplate;
		assign("capacity_factor", var_data((ssc_number_t)(kWhperkW / 87.6)));
		assign("kwh_per_kw", var_data((ssc_number_t)kWhperkW));

		assign("system_heat_rate", (ssc_number_t)3.413); // samsim tcsgeneric_solar
		assign("annual_fuel_usage", var_data((ssc_number_t)(fuel_MWht * 1000.0)));


	}
コード例 #18
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double developmentCost(double developmentFee)
	{
		double cost = developmentFee * 1000000;
		assign("development_cost", var_data(cost));
		return cost;
	}
コード例 #19
0
ファイル: cmod_wfreader.cpp プロジェクト: gtqite/ssc
	void exec( ) throw( general_error )
	{
		bool header_only = as_boolean("header_only");
		const char *file = as_string("file_name");

		weatherfile wfile( file, header_only );
		if (!wfile.ok()) 
		{
			assign( "error", var_data(wfile.message()) );
			throw exec_error("wfreader", "failed to read local weather file: " + std::string(file) + "  " + wfile.message());
		}
		
		if( wfile.has_message() ) log( wfile.message(), SSC_WARNING );

		weather_header hdr;
		wfile.header( &hdr );

		size_t records = wfile.nrecords();
		
		for (int i = 3; i < 100; i++){

		}

		assign( "lat", var_data( (ssc_number_t)hdr.lat ) );
		assign( "lon", var_data( (ssc_number_t)hdr.lon ) );
		assign( "tz", var_data( (ssc_number_t)hdr.tz ) );
		assign( "elev", var_data( (ssc_number_t)hdr.elev ) );
		assign( "location", var_data( std::string( hdr.location ) ) );
		assign( "city", var_data( std::string( hdr.city ) ) );
		assign( "state", var_data( std::string( hdr.state ) ) );
		assign( "country", var_data( std::string( hdr.country ) ) );
		assign( "description", var_data( std::string( hdr.description ) ) );
		assign( "source", var_data( std::string( hdr.source ) ) );
		assign( "url", var_data( std::string( hdr.url ) ) );

		assign( "start", var_data( (ssc_number_t)wfile.start_sec() ) );
		assign( "step", var_data( (ssc_number_t)wfile.step_sec() ) );
		assign( "nrecords", var_data( (ssc_number_t)wfile.nrecords() ) );

		switch( wfile.type() )
		{
		case weatherfile::TMY2: assign("format", var_data("tmy2") ); break;
		case weatherfile::TMY3: assign("format", var_data("tmy3") ); break;
		case weatherfile::EPW: assign("format", var_data("epw") ); break;
		case weatherfile::SMW: assign("format", var_data("smw") ); break;
		case weatherfile::WFCSV: assign("format", var_data("csv") ); break;
		default: assign("format", var_data("invalid")); break;
		}

		if ( header_only )
			return;

		ssc_number_t *p_year = allocate( "year", records );
		ssc_number_t *p_month = allocate( "month", records );
		ssc_number_t *p_day = allocate( "day", records );
		ssc_number_t *p_hour = allocate( "hour", records );
		ssc_number_t *p_minute = allocate( "minute", records );
		
		ssc_number_t *p_global = allocate( "global", records );
		ssc_number_t *p_beam = allocate( "beam", records );
		ssc_number_t *p_diffuse = allocate( "diffuse", records );
		ssc_number_t *p_poa = allocate( "poa", records );
		
		ssc_number_t *p_wspd = allocate( "wspd", records );
		ssc_number_t *p_wdir = allocate( "wdir", records );
		ssc_number_t *p_tdry = allocate( "tdry", records );
		ssc_number_t *p_twet = allocate( "twet", records );
		ssc_number_t *p_tdew = allocate( "tdew", records );
		ssc_number_t *p_rhum = allocate( "rhum", records );
		ssc_number_t *p_pres = allocate( "pres", records );
		ssc_number_t *p_snow = allocate( "snow", records );
		ssc_number_t *p_albedo = allocate( "albedo", records );

		double gh_sum = 0.0, dn_sum = 0.0, df_sum = 0.0;
		double temp_sum = 0.0, wind_sum = 0.0;
		double snow_max = -1;

		double ts_hour = wfile.step_sec() / 3600.0;

		weather_record wf;

		for (int i=0;i<(int)records;i++)
		{
			if (!wfile.read( &wf ))
				throw exec_error("wfreader", "could not read data line " + util::to_string(i+1) + " of 8760");

			p_year[i] = (ssc_number_t)wf.year;
			p_month[i] = (ssc_number_t)wf.month;
			p_day[i] = (ssc_number_t)wf.day;
			p_hour[i] = (ssc_number_t)wf.hour;
			p_minute[i] = (ssc_number_t)wf.minute;

			p_global[i] = (ssc_number_t)wf.gh;
			p_beam[i] = (ssc_number_t)wf.dn;
			p_diffuse[i] = (ssc_number_t)wf.df;
			p_poa[i] = (ssc_number_t)wf.poa;

			p_wspd[i] = (ssc_number_t)wf.wspd;
			p_wdir[i] = (ssc_number_t)wf.wdir;
			p_tdry[i] = (ssc_number_t)wf.tdry;
			p_twet[i] = (ssc_number_t)wf.twet;
			p_tdew[i] = (ssc_number_t)wf.tdew;
			p_rhum[i] = (ssc_number_t)wf.rhum;
			p_pres[i] = (ssc_number_t)wf.pres;
			p_snow[i] = (ssc_number_t)wf.snow;
			p_albedo[i] = (ssc_number_t)wf.alb;	

			gh_sum += wf.gh * ts_hour;
			dn_sum += wf.dn * ts_hour;
			df_sum += wf.df * ts_hour;
			temp_sum += wf.tdry;
			wind_sum += wf.wspd; 
			if (!std::isnan(wf.snow) && (wf.snow > snow_max))
				snow_max = wf.snow;
		}
		
		if (snow_max < 0)
			snow_max = snow_max = std::numeric_limits<double>::quiet_NaN();


		assign("annual_global", var_data((ssc_number_t)(0.001 * gh_sum / 365)));
		assign("annual_beam", var_data((ssc_number_t) (0.001 * dn_sum / 365)));
		assign("annual_diffuse", var_data((ssc_number_t)(0.001 * df_sum / 365)));
		assign("annual_tdry", var_data((ssc_number_t)(temp_sum / records)));
		assign("annual_wspd", var_data((ssc_number_t)(wind_sum / records)));
		assign("annual_snow", var_data((ssc_number_t)snow_max));
	}
コード例 #20
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double substationCost(double voltage, double farmSize)
	{
		double cost = 11652 * (voltage + farmSize) + 11795 * pow(farmSize, 0.3549) + 1526800;
		assign("substation_cost", var_data(cost));
		return cost;
	}
コード例 #21
0
ファイル: cmod_windbos.cpp プロジェクト: WISDEM/Plant_CostsSE
	double buildingCost(double buildingSize){
		double cost = buildingSize * 125 + 176125;
		assign("building_cost", var_data(cost));
		return cost;
	}
コード例 #22
0
ファイル: cmod_iec61853par.cpp プロジェクト: gtqite/ssc
	void exec( ) throw( general_error )
	{
		iec61853_module_t solver;
		msg_handler msgs( *this );
		solver._imsg = &msgs;

		util::matrix_t<double> input = as_matrix("input"), par;
		if ( input.ncols() != iec61853_module_t::COL_MAX )
			throw exec_error( "iec61853", "six data columns required for input matrix: IRR,TC,PMP,VMP,VOC,ISC");

		if (!solver.calculate( input, as_integer("nser"), as_integer("type"), par, as_boolean("verbose") ))
			throw exec_error( "iec61853", "failed to solve for parameters");

		assign("n", var_data((ssc_number_t)solver.n));
		assign("alphaIsc", var_data((ssc_number_t)solver.alphaIsc));
		assign("betaVoc", var_data((ssc_number_t)solver.betaVoc));
		assign( "gammaPmp", var_data((ssc_number_t)solver.gammaPmp) );
		assign( "Il", var_data((ssc_number_t)solver.Il) );
		assign( "Io", var_data((ssc_number_t)solver.Io) );
		assign( "C1", var_data((ssc_number_t)solver.C1) );
		assign( "C2", var_data((ssc_number_t)solver.C2) );
		assign( "C3", var_data((ssc_number_t)solver.C3) );
		assign( "D1", var_data((ssc_number_t)solver.D1) );
		assign( "D2", var_data((ssc_number_t)solver.D2) );
		assign( "D3", var_data((ssc_number_t)solver.D3) );
		assign( "Egref", var_data((ssc_number_t)solver.Egref) );

		ssc_number_t *output = allocate( "output", par.nrows(), par.ncols() );
		size_t c = 0;
		for( size_t i=0;i<par.nrows();i++ )
			for( size_t j=0;j<par.ncols();j++ )
				output[c++] = (ssc_number_t)par(i, j);
	}