SDK needs more input variables than Desktop application

2 posts / 0 new
Last post
SDK needs more input variables than Desktop application

Hi Paul,

This question is about the number of input variables in SDK.

Let me take Photovaltaic, LCOE Calculator for example. Using the desktop application, under system design, system sizing. We can choose to specify either [desired system size] or [# of strings and inverters].
But in the python code it generated, I have to specify all three sizing variables as inputs:

ssc.data_set_number( data, b'system_capacity', xxx )
ssc.data_set_number( data, b'strings_in_parallel', xxx )
ssc.data_set_number( data, b'inverter_count', xxx )

What should I do if I hope to only provide the system size and let SAM calculate the other two for me as is done in the desktop?


Paul Gilman

Dear Xinyue,

SAM consists of the user interface whose code resides in, and SSC (

The SDK provides access to SSC, but not to the SAM user interface.

As you note, the SSC inputs are for the number of modules per string, number of strings in parallel, and number of inverters. The code to estimate values for those inputs from a desired system size is in the SAM user interface, which you cannot access from the SDK.

So, you will have to write your own code to estimate the values for modules per string, strings in parallel, and number of inverters.

Here is the algorithm SAM uses for the calculations. This is a fairly rudimentary approach, so you may want to use this as a starting point:

equations{ '$MIMO$ pv_size_array' } = define()
if (${size_auto_or_manual}==1)
${modules_per_string} = ${user_modules_per_string};
${strings_in_parallel} = ${user_strings_in_parallel};
${inverter_count} = ${user_inverter_count};
//positive number of inverters warning
if (${size_auto_or_manual}==0)
/* Sizing rules
1. Voc < Vdcmax
2. Vmp > Vmin
3. Vmp < Vmax
4. num series * num_parallel is about desired array size (num_parallel = desired / (num series * mod_power)
5. num inverters is about desired array size (num_inv = num_series * num_parallel * mod_power) / inv_power

// module parameters
mod_vmp= ?${module_model} [ ${spe_vmp},${cec_v_mp_ref},${6par_vmp},${snl_ref_vmp},${sd11par_Vmp0}];
mod_voc= ?${module_model} [ ${spe_voc},${cec_v_oc_ref},${6par_voc},${snl_ref_voc},${sd11par_Voc0}];
mod_power= ?${module_model} [${spe_power}, ${cec_p_mp_ref}, ${6par_pmp}, ${snl_ref_pmp},${sd11par_Pmp0}];
//default logstatus mimo_pv_size_array: Invalid module selection
//if mod_power<=0 logstatus mimo_pv_size_array: The module power is less than zero.Please check the module selected
//if mod_vmp<=0 logstatus mimo_pv_size_array: The module Vmp = %lg Wdc. The sizing wizard only works with modules with positive Vmp

// inverter parameters
inv_vmin= ?${inverter_model} [${inv_snl_mppt_low}, ${inv_ds_mppt_low}, ${inv_pd_mppt_low},${inv_cec_cg_mppt_low}];
inv_vdcmax= ?${inverter_model} [${inv_snl_vdcmax}, ${inv_ds_vdcmax}, ${inv_pd_vdcmax},${inv_cec_cg_vdcmax}];
inv_vmax= ?${inverter_model} [${inv_snl_mppt_hi}, ${inv_ds_mppt_hi}, ${inv_pd_mppt_hi},${inv_cec_cg_mppt_hi}];
inv_power= ?${inverter_model} [${inv_snl_paco}, ${inv_ds_paco}, ${inv_pd_paco},${inv_cec_cg_paco}];
//default logstatus mimo_pv_size_array: Invalid inverter selection

// DC-connected battery parameters (assumed to use common inverter)
batt_max_power_dc = 0;

f = financing();
if (f != "LCOE Calculator" && f != "None")
if (${en_batt}){
if (${batt_ac_or_dc} == 0)
batt_max_power_dc = ${batt_max_power};

// calculations
{num_series= 0.5 * (inv_vmin + inv_vmax)/mod_vmp;}
if(inv_vdcmax > 0){
while ((num_series > 0) && ((num_series*mod_voc) > inv_vdcmax)){
num_series= num_series -1;
if (num_series < 1)
{ num_series= 1;}
num_series= to_int(num_series);
num_parallel= ${desired_size} * 1000 /(num_series * mod_power);
if (num_parallel < 1)
{ num_parallel= 1;}
num_parallel= to_int(num_parallel);
//if (desired_size * 1000 < inv_power) logstatus mimo_pv_size_array: The desired array power is less than a single inverter capacity
if (${dcac_ratio} > 0)
{ inverters = ((num_series * num_parallel * mod_power) /* + batt_max_power_dc */) / (${dcac_ratio} * inv_power);
//round inverters for best DC-AC ratio
if((inverters - floor(inverters)) < 0.5)
{ num_inverters = floor(inverters); }
{ num_inverters = ceil(inverters); }

{ num_inverters = ceil(((num_series * num_parallel * mod_power) /* + batt_max_power_dc */) / inv_power);}
if (num_inverters < 1)
{ num_inverters = 1;}

${modules_per_string} = num_series;
${strings_in_parallel} = num_parallel;
${inverter_count} = num_inverters;

Best regards,

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer