Beispiel #1
0
int main() {
  int max = 1000;

// initialise a string to 2 - we store ASCII because it is easier to print
// we could store the raw numbers for a little better performance

  std::string in_string = "1";

  for (int i = 0; i < max; ++i)
    in_string = double_string(in_string);

  int sum = 0;
  for (std::string::iterator it = in_string.begin();
       it < in_string.end();
       it++)
    sum += *it - ASCII;

  printf("%d\n", sum);
  return(0);
}
Beispiel #2
0
//int solver_matpower(double *rbus, unsigned int nbus, double *rgen, unsigned int ngen, 
//	double *rbranch, unsigned int nbranch, double *rgencost, unsigned int ngencost,
//	double *rareas,	unsigned int nareas)
int solver_matpower(vector<unsigned int> bus_BUS_I, vector<unsigned int> branch_F_BUS, vector<unsigned int> branch_T_BUS, vector<unsigned int> gen_GEN_BUS, vector<unsigned int> gen_NCOST,unsigned int BASEMVA)
{	
	unsigned int nbus = 0;
	unsigned int ngen = 0;
	unsigned int nbranch = 0;
	//unsigned int ngencost = 0;
	//unsigned int nareas = 0;
	//unsigned int nbaseMVA = 0;

	vector<bus> vec_bus;
	vector<gen> vec_gen;
	vector<branch> vec_branch;
	//vector<areas> vec_areas;
	//vector<gen_cost> vec_gencost;
	//vector<baseMVA> vec_baseMVA;
	

	
	//printf("========Getting Data=============\n");

	// Get Bus objects
	OBJECT *temp_obj = NULL;
	bus *list_bus;
	FINDLIST *bus_list = gl_find_objects(FL_NEW,FT_CLASS,SAME,"bus",FT_END);
	while (gl_find_next(bus_list,temp_obj)!=NULL)
	{
		
		temp_obj = gl_find_next(bus_list,temp_obj);
		list_bus = OBJECTDATA(temp_obj,bus);
		vec_bus.push_back(*list_bus);
		
        };

	// Get Generator objects
	gen *list_gen;
	FINDLIST *gen_list = gl_find_objects(FL_NEW,FT_CLASS,SAME,"gen",FT_END);
	temp_obj = NULL;
	
	while (gl_find_next(gen_list,temp_obj)!=NULL)
	{
		temp_obj = gl_find_next(gen_list,temp_obj);
		list_gen = OBJECTDATA(temp_obj,gen);
		vec_gen.push_back(*list_gen);
        };

	// Get Line/Branch Objects
	branch *list_branch;
	FINDLIST *branch_list = gl_find_objects(FL_NEW,FT_CLASS,SAME,"branch",FT_END);
	temp_obj = NULL;

	while (gl_find_next(branch_list,temp_obj)!=NULL)	
	{
		temp_obj = gl_find_next(branch_list,temp_obj);
		list_branch = OBJECTDATA(temp_obj,branch);
		vec_branch.push_back(*list_branch);
	}

	// Get Area Objects
/*
	areas *list_areas;
	FINDLIST *areas_list = gl_find_objects(FL_NEW,FT_CLASS,SAME,"areas",FT_END);
	temp_obj = NULL;
	
	while (gl_find_next(areas_list,temp_obj) != NULL)
	{
		temp_obj = gl_find_next(areas_list,temp_obj);
		list_areas = OBJECTDATA(temp_obj,areas);
		vec_areas.push_back(*list_areas);
	}
*/
	
	// Get Generator Cost objects
	/*
	gen_cost *list_gen_cost;
	FINDLIST *gen_cost_list = gl_find_objects(FL_NEW,FT_CLASS,SAME,"gen_cost",FT_END);
	temp_obj = NULL;

	while (gl_find_next(gen_cost_list,temp_obj)!=NULL)
	{
		temp_obj = gl_find_next(gen_cost_list,temp_obj);
		list_gen_cost = OBJECTDATA(temp_obj,gen_cost);
		vec_gencost.push_back(*list_gen_cost);

	}
	*/
	// Get Base Information object
	//baseMVA *list_baseMVA;
	//FINDLIST *baseMVA_list = gl_find_objects(FL_NEW,FT_CLASS,SAME,"baseMVA",FT_END);
	//temp_obj = NULL;
	//temp_obj = gl_find_next(baseMVA_list,temp_obj);
	//list_baseMVA = OBJECTDATA(temp_obj,baseMVA);
	//vec_baseMVA.push_back(*list_baseMVA);

	// Get the size of each class
	nbus = vec_bus.size();
	ngen = vec_gen.size();
	nbranch = vec_branch.size();
	//ngencost = vec_gencost.size();
	//nareas = vec_areas.size();
	//nbaseMVA = vec_baseMVA.size();


	// create arrays for input and allocate memory
	double *rbus;
	rbus = (double *) calloc(nbus*BUS_ATTR,sizeof(double));

	double *rgen;
	rgen = (double *) calloc(ngen*GEN_ATTR,sizeof(double));	

	double *rbranch;
	rbranch = (double *) calloc(nbranch*BRANCH_ATTR,sizeof(double));

	double *rareas;
	rareas = (double *) calloc(AREA_ATTR,sizeof(double));

	double rbaseMVA;

	double *rgencost; // allocation of memory is in the following part
	
	

	
	// insert bus data for rbus
	vector<bus>::iterator iter_bus = vec_bus.begin();
	if (nbus > 1)
	{
		for (unsigned int i=0; i < nbus; i++)
		{
			//rbus[i+0*nbus] = (double)iter_bus->BUS_I;
			rbus[i+0*nbus] = bus_BUS_I[i];
			rbus[i+1*nbus] = (double)iter_bus->BUS_TYPE;
			rbus[i+2*nbus] = iter_bus->PD;
			rbus[i+3*nbus] = iter_bus->QD;
			rbus[i+4*nbus] = iter_bus->GS;
			rbus[i+5*nbus] = iter_bus->BS;
			//rbus[i+6*nbus] = (double)iter_bus->BUS_AREA;
			rbus[i+6*nbus] = 1;
			rbus[i+7*nbus] = iter_bus->VM;
			rbus[i+8*nbus] = iter_bus->VA;
			rbus[i+9*nbus] = iter_bus->BASE_KV;
			rbus[i+10*nbus] = (double)iter_bus->ZONE;
			rbus[i+11*nbus] = iter_bus->VMAX;
			rbus[i+12*nbus] = iter_bus->VMIN;
			iter_bus++;
		}
	}

	
	// insert data for rgen
	vector<gen>::iterator iter_gen = vec_gen.begin();
	unsigned int max_order = 0;
	for (unsigned int i =0; i< ngen; i++)
	{
		if (gen_NCOST[i] > max_order)
			max_order = gen_NCOST[i];
		iter_gen++;
	}
	rgencost = (double *) calloc(ngen*(GENCOST_ATTR+max_order),sizeof(double));

	iter_gen = vec_gen.begin();

	for (unsigned int i = 0; i < ngen; i++)
	{
		//rgen[i+0*ngen] = (double) iter_gen->GEN_BUS;
		rgen[i+0*ngen] = gen_GEN_BUS[i];
		rgen[i+1*ngen] = iter_gen->PG;
		rgen[i+2*ngen] = iter_gen->QG;
		rgen[i+3*ngen] = iter_gen->QMAX;
		rgen[i+4*ngen] = iter_gen->QMIN;
		rgen[i+5*ngen] = iter_gen->VG;
		rgen[i+6*ngen] = iter_gen->MBASE;
		rgen[i+7*ngen] = iter_gen->GEN_STATUS;
		rgen[i+8*ngen] = iter_gen->PMAX;
		rgen[i+9*ngen] = iter_gen->PMIN;
		rgen[i+10*ngen] = iter_gen->PC1;
		rgen[i+11*ngen] = iter_gen->PC2;
		rgen[i+12*ngen] = iter_gen->QC1MIN;
		rgen[i+13*ngen] = iter_gen->QC1MAX;
		rgen[i+14*ngen] = iter_gen->QC2MIN;
		rgen[i+15*ngen] = iter_gen->QC2MAX;
		rgen[i+16*ngen] = iter_gen->RAMP_AGC;
		rgen[i+17*ngen] = iter_gen->RAMP_10;
		rgen[i+18*ngen] = iter_gen->RAMP_30;
		rgen[i+19*ngen] = iter_gen->RAMP_Q;
		rgen[i+20*ngen] = iter_gen->APF;

		// Cost info
		rgencost[i+0*ngen] = iter_gen->MODEL;
		rgencost[i+1*ngen] = iter_gen->STARTUP;
		rgencost[i+2*ngen] = iter_gen->SHUTDOWN;
		//rgencost[i+3*ngen] = (double)iter_gen->NCOST;
		rgencost[i+3*ngen] = gen_NCOST[i];
		string double_string(iter_gen->COST);
		vector<string> v;
		v = split(double_string,',');
		for (unsigned int j=0; j<v.size();j++)
		{
			rgencost[i+(4+j)*ngen] = atof(v[j].c_str());
		}
		if (gen_NCOST[i] != max_order)
		{
			for (unsigned int j = gen_NCOST[i]; j< max_order; j++)
			{
				rgencost[i+(4+j)*ngen] = 0.0;
			}
		}

		iter_gen++;
	}	



	// insert data for rbranch
	vector<branch>::iterator iter_branch = vec_branch.begin();
	for (unsigned int i = 0; i < nbranch; i++)
	{
		//rbranch[i+0*nbranch] = (double)iter_branch->F_BUS;
		rbranch[i+0*nbranch] = branch_F_BUS[i];
		//rbranch[i+1*nbranch] = (double)iter_branch->T_BUS;
		rbranch[i+1*nbranch] = branch_T_BUS[i];
		rbranch[i+2*nbranch] = iter_branch->BR_R;
		rbranch[i+3*nbranch] = iter_branch->BR_X;
		rbranch[i+4*nbranch] = iter_branch->BR_B;
		rbranch[i+5*nbranch] = iter_branch->RATE_A;
		rbranch[i+6*nbranch] = iter_branch->RATE_B;		
		rbranch[i+7*nbranch] = iter_branch->RATE_C;
		rbranch[i+8*nbranch] = iter_branch->TAP;
		rbranch[i+9*nbranch] = iter_branch->SHIFT;
		rbranch[i+10*nbranch] = (double)iter_branch->BR_STATUS;
		rbranch[i+11*nbranch] = iter_branch->ANGMIN;
		rbranch[i+12*nbranch] = iter_branch->ANGMAX;
		iter_branch++;
	}

	
	// insert data for rareas
	//vector<areas>::const_iterator iter_areas = vec_areas.begin();
	//for (unsigned int i = 0; i < nareas; i++)
	//{
		rareas[0] = 1;
		rareas[1] = 1;
	//	iter_areas++;
	//} 

	// insert data for rbaseMVA
	//vector<baseMVA>::const_iterator iter_baseMVA = vec_baseMVA.begin();
	//rbaseMVA = iter_baseMVA->BASEMVA;
	rbaseMVA = BASEMVA;

	// insert data for rgencost
	/*
	vector<gen_cost>::const_iterator iter_gencost = vec_gencost.begin();

	unsigned int max_order = 0;
	for (unsigned int i = 0; i<ngencost; i++)
	{
		if (iter_gencost->NCOST > max_order)
			max_order = iter_gencost->NCOST;
		iter_gencost++;
		
	}
	
	rgencost = (double *) calloc(ngencost*(GENCOST_ATTR+max_order),sizeof(double));
	
	iter_gencost = vec_gencost.begin();
	for (unsigned int i = 0; i<ngencost; i++)
	{
		// Only support model 2: ticket 4
		if (iter_gencost -> MODEL != 2)
			GL_THROW("Unsupported model for generation cost\n");

		rgencost[i+0*ngencost] = iter_gencost->MODEL;
		rgencost[i+1*ngencost] = iter_gencost->STARTUP;
		rgencost[i+2*ngencost] = iter_gencost->SHUTDOWN;
		rgencost[i+3*ngencost] = (double)iter_gencost->NCOST;
		string double_string(iter_gencost->COST);
		vector<string> v;
		v = split(double_string,',');
		for (unsigned int j = 0; j<v.size();j++)
		{
			rgencost[i+(4+j)*ngencost] = atof(v[j].c_str());
		}
		if (iter_gencost->NCOST != max_order)
		{
			for (unsigned int j = iter_gencost->NCOST; j < max_order; j++)
				rgencost[i+(4+j)*ngencost] = 0.0;
		}
		iter_gencost++;
	}
	*/



	// Run the Solver function
	//printf("Running Test\n");
        libopfInitialize();
	//mxArray* basemva = initArray(rbaseMVA,nbaseMVA,BASEMVA_ATTR);
	mxArray* basemva_array = mxCreateDoubleMatrix(1,1,mxREAL);
	*mxGetPr(basemva_array) = rbaseMVA;

	// change to MATLAB MAT format
	mxArray* bus_array = initArray(rbus, nbus, BUS_ATTR);	
	mxArray* gen_array = initArray(rgen, ngen, GEN_ATTR);
	mxArray* branch_array = initArray(rbranch, nbranch, BRANCH_ATTR);
	mxArray* gencost_array = initArray(rgencost, ngen, GENCOST_ATTR+max_order);
	//mxArray* areas_array = initArray(rareas, nareas, AREA_ATTR);
	mxArray* areas_array = initArray(rareas, 1, AREA_ATTR);

	mxArray* busout;
	mxArray* genout;
	mxArray* branchout;
	mxArray* f;
	mxArray* success;



	mxArray* plhs[5];
	mxArray* prhs[6];
	plhs[0] = busout;
	plhs[1] = genout;
	plhs[2] = branchout;
	plhs[3] = f;
	plhs[4] = success;

	prhs[0] = basemva_array;
	prhs[1] = bus_array;
	prhs[2] = gen_array;
	prhs[3] = branch_array;
	prhs[4] = areas_array;
	prhs[5] = gencost_array;

	mlxOpf(5, plhs, 6, prhs); // cout if first parameter is 0;
	//mlxOpf(0,plhs,6,prhs);


	// Get data from array
	double *obus = getArray(plhs[0]);
	double *ogen = getArray(plhs[1]);
	double *obranch = getArray(plhs[2]);

	// Update class bus

	temp_obj = NULL;
	for (unsigned int i=0; i < nbus; i++)
	{
		/*		
		iter_bus->PD = obus[i+2*nbus];
		iter_bus->QD = obus[i+3*nbus];
		iter_bus->GS = obus[i+4*nbus];
		iter_bus->BS = obus[i+5*nbus];
		iter_bus->VM = obus[i+7*nbus];		
		iter_bus->VA = obus[i+8*nbus];
		iter_bus->VMAX = obus[i+11*nbus];
		iter_bus->VMIN = obus[i+12*nbus];
		iter_bus->LAM_P = obus[i+13*nbus];
		iter_bus->LAM_Q = obus[i+14*nbus];
		iter_bus->MU_VMAX = obus[i+15*nbus];
		iter_bus->MU_VMIN = obus[i+16*nbus];
		//iter_bus++;
		*/
		//printf("====Before Test part VM %f; %f\n",iter_bus->VM,obus[i+7*nbus]);
		
		temp_obj = gl_find_next(bus_list,temp_obj);

		
		//Matpower does not overwrite the generator power in bus class
		setObjectValue_Double(temp_obj,"PD",obus[i+2*nbus]);
		setObjectValue_Double(temp_obj,"QD",obus[i+3*nbus]);
		setObjectValue_Double(temp_obj,"GS",obus[i+4*nbus]);
		setObjectValue_Double(temp_obj,"BS",obus[i+5*nbus]);
		setObjectValue_Double(temp_obj,"VM",obus[i+7*nbus]);
		setObjectValue_Double(temp_obj,"VA",obus[i+8*nbus]);
		setObjectValue_Double(temp_obj,"VMAX",obus[i+11*nbus]);
		setObjectValue_Double(temp_obj,"VMIN",obus[i+12*nbus]);
		setObjectValue_Double(temp_obj,"LAM_P",obus[i+13*nbus]);
		setObjectValue_Double(temp_obj,"LAM_Q",obus[i+14*nbus]);
		setObjectValue_Double(temp_obj,"MU_VMAX",obus[i+15*nbus]);
		setObjectValue_Double(temp_obj,"MU_VMIN",obus[i+16*nbus]);

		// obus[i+9*nbus] is BASE_KV. The unit is KV.
		setObjectValue_Double2Complex_inDegree(temp_obj,"CVoltageA",obus[i+7*nbus]*obus[i+9*nbus]*1000,obus[i+8*nbus]);
		setObjectValue_Double2Complex_inDegree(temp_obj,"CVoltageB",obus[i+7*nbus]*obus[i+9*nbus]*1000,obus[i+8*nbus]+2/3*PI);
		setObjectValue_Double2Complex_inDegree(temp_obj,"CVoltageC",obus[i+7*nbus]*obus[i+9*nbus]*1000,obus[i+8*nbus]-2/3*PI);
		setObjectValue_Double(temp_obj,"V_nom",obus[i+7*nbus]*obus[i+9*nbus]*1000);
		
		//printf("BUS: %f LAM_P %f\n",obus[i+0*nbus],obus[i+13*nbus]);
		//cout<<"BUS "<<obus[i+0*nbus]<<"LAM_P "<<obus[i+13*nbus]<<endl;
	}
/*
	unsigned int NumOfElement = mxGetNumberOfElements(plhs[0]);
	for (unsigned int i =0; i<NumOfElement; i++)
	{
		printf("%f ",obus[i]);
		if ((i+1)%nbus == 0)
			printf("\n");
	}
	

	printf("========================\n");

	iter_bus = vec_bus.begin();
	for (unsigned int i=0;i< nbus; i++)
	{
		printf("Bus %d; PD %f; QD %f; VM %f; VA %f;\n",iter_bus->BUS_I,iter_bus->PD,iter_bus->QD,iter_bus->VM,iter_bus->VA);
		iter_bus++;
	}
*/	
	// Update class gen
	
	iter_gen = vec_gen.begin();
	temp_obj = NULL;
	for (unsigned int i = 0; i < ngen; i++)
	{
/*		
		iter_gen->PG = ogen[i+1*ngen];
		iter_gen->QG = ogen[i+2*ngen];
		iter_gen->QMAX = ogen[i+3*ngen];
		iter_gen->QMIN = ogen[i+4*ngen];
		iter_gen->VG = ogen[i+5*ngen];
		iter_gen->PC1 = ogen[i+10*ngen];
		iter_gen->PC2 = ogen[i+11*ngen];
		iter_gen->RAMP_AGC = ogen[i+16*ngen];
		iter_gen->RAMP_10 = ogen[i+17*ngen];
		iter_gen->RAMP_30 = ogen[i+18*ngen];
		iter_gen->RAMP_Q = ogen[i+19*ngen];
		iter_gen->APF = ogen[i+20*ngen];
		iter_gen->MU_PMAX = ogen[i+21*ngen];
		iter_gen->MU_PMIN = ogen[i+22*ngen];
		iter_gen->MU_QMAX = ogen[i+23*ngen];
		iter_gen->MU_QMIN = ogen[i+24*ngen];
		iter_gen++;
*/
		temp_obj = gl_find_next(gen_list,temp_obj);
		setObjectValue_Double(temp_obj,"PG",ogen[i+1*ngen]);
		setObjectValue_Double(temp_obj,"QG",ogen[i+2*ngen]);
		setObjectValue_Double(temp_obj,"QMAX",ogen[i+3*ngen]);
		setObjectValue_Double(temp_obj,"QMIN",ogen[i+4*ngen]);
		setObjectValue_Double(temp_obj,"VG",ogen[i+5*ngen]);
		setObjectValue_Double(temp_obj,"PC1",ogen[i+10*ngen]);
		setObjectValue_Double(temp_obj,"PC2",ogen[i+11*ngen]);
		setObjectValue_Double(temp_obj,"RAMP_AGC",ogen[i+16*ngen]);
		setObjectValue_Double(temp_obj,"RAMP_10",ogen[i+17*ngen]);
		setObjectValue_Double(temp_obj,"RAMP_30",ogen[i+18*ngen]);
		setObjectValue_Double(temp_obj,"RAMP_Q",ogen[i+19*ngen]);
		setObjectValue_Double(temp_obj,"APF",ogen[i+20*ngen]);
		setObjectValue_Double(temp_obj,"MU_PMAX",ogen[i+21*ngen]);
		setObjectValue_Double(temp_obj,"MU_PMIN",ogen[i+22*ngen]);
		setObjectValue_Double(temp_obj,"MU_QMAX",ogen[i+23*ngen]);
		setObjectValue_Double(temp_obj,"MU_QMIN",ogen[i+24*ngen]);



		// Calculate Price
		double price = 0;
		unsigned int NCOST = (unsigned int)rgencost[i+3*ngen];
		//printf("Bus %d, order %d ",i,NCOST);
		for (unsigned int j = 0; j < NCOST; j++)
		{
			price += pow(ogen[i+1*ngen],NCOST-1-j)*rgencost[i+(4+j)*ngen];
			//printf("Coeff %d: %f and price %f",j,rgencost[i+(4+j)*ngencost],price);
		}

		setObjectValue_Double(temp_obj,"Price",price);
		//printf("\nBus %d, Price %f\n",i,price);
		
		iter_gen++;
	}

	// Update class branch	
	
	
	//iter_branch = vec_branch.begin();
	temp_obj = NULL;
	for (unsigned int i = 0; i<nbranch; i++)
	{
/*
		iter_branch->PF = obranch[i+13*nbranch];
		iter_branch->QF = obranch[i+14*nbranch];
		iter_branch->PT = obranch[i+15*nbranch];
		iter_branch->QT = obranch[i+16*nbranch];
		iter_branch->MU_SF = obranch[i+17*nbranch];
		iter_branch->MU_ST = obranch[i+18*nbranch];
		iter_branch->MU_ANGMIN = obranch[i+19*nbranch];
		iter_branch->MU_ANGMAX = obranch[i+20*nbranch];
		iter_branch++;
*/

		temp_obj = gl_find_next(branch_list,temp_obj);
		setObjectValue_Double(temp_obj,"PF",obranch[i+13*nbranch]);
		setObjectValue_Double(temp_obj,"QF",obranch[i+14*nbranch]);
		setObjectValue_Double(temp_obj,"PT",obranch[i+15*nbranch]);
		setObjectValue_Double(temp_obj,"QT",obranch[i+16*nbranch]);
		setObjectValue_Double(temp_obj,"MU_SF",obranch[i+17*nbranch]);
		setObjectValue_Double(temp_obj,"MU_ST",obranch[i+18*nbranch]);
		setObjectValue_Double(temp_obj,"MU_ANGMIN",obranch[i+19*nbranch]);
		setObjectValue_Double(temp_obj,"MU_ANGMAX",obranch[i+20*nbranch]);
	}
	
	// free space
	//printf("Free r..\n");
	free(rbus);
	free(rgen);
	free(rbranch);
	free(rareas);
	//free(rbaseMVA);
	free(rgencost);
	
	//printf("Free o..\n");	
	free(obus);
	free(ogen);
	free(obranch);

	vec_bus.clear();
	vec_gen.clear();
	vec_branch.clear();
	//vec_gencost.clear();
	//vec_baseMVA.clear();


	short ifsuccess = (short)*getArray(plhs[3]);
	//printf("suceess %f\n",*getArray(plhs[4]));
	return ifsuccess;

}