Home > matpower7.0 > most > lib > addstorage.m

addstorage

PURPOSE ^

ADDWIND Adds storage units and corresponding xGen/StorageData to existing data.

SYNOPSIS ^

function [idx, new_mpc, new_xgd, new_sd] = addstorage(storage, mpc, xgd, sd)

DESCRIPTION ^

ADDWIND   Adds storage units and corresponding xGen/StorageData to existing data.

   [IDX, NEW_MPC] = ADDSTORAGE(STORAGE, MPC)
   [IDX, NEW_MPC, NEW_XGD, NEW_SD] = ADDSTORAGE(STORAGE, MPC)
   [IDX, NEW_MPC, NEW_XGD, NEW_SD] = ADDSTORAGE(STORAGE, MPC, XGD)
   [IDX, NEW_MPC, NEW_XGD, NEW_SD] = ADDSTORAGE(STORAGE, MPC, XGD, SD)

   Given a StorageUnitData structure, or the name of a file containing such
   a structure, this function adds the specified storage generators to an
   existing MATPOWER case, xGenData struct and StorageData struct.

   Inputs:
       STORAGE : a StorageUnitData struct or the name of an M-file
                   or MAT-file that returns one, with the following fields
           .gen     : rows to be appended to the GEN matrix from MPC
           .gencost : (optional) rows to be added to the GENCOST matrix
                      from MPC, default is zero cost
           .xgd_table : xGenData table struct or filename providing data for
                        the storage units being added. See LOADSTORAGEDATA
                        for more information on the xGenData table format.
           .sd_table : StorageData table struct or filename providing data
                       for the storage units being added. See LOADSTORAGEDATA
                       for more information on the StorageData table format.
       MPC : MATPOWER case struct to which storage generators will be added
       XGD : (optional) xGenData struct corresponding to the generators
             already in MPC, to which the new xGenData for the storage
             units will be added.
       SD : (optional) StorageData struct corresponding to the generators
            already in MPC, to which the new StorageData for the storage
            units will be added.

   Output:
       IDX : Generator indices of newly added storage units.
       NEW_MPC : MPC with storage units appended to MPC.GEN and MPC.GENCOST
                 MPC.GENFUEL (= 'ess').
       NEW_XGD : XGD with xGenData for new storage units appended.
       NEW_SD  : SD with StorageData for new storage units appended.

   See also LOADSTORAGEDATA, LOADXGENDATA.

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [idx, new_mpc, new_xgd, new_sd] = addstorage(storage, mpc, xgd, sd)
0002 %ADDWIND   Adds storage units and corresponding xGen/StorageData to existing data.
0003 %
0004 %   [IDX, NEW_MPC] = ADDSTORAGE(STORAGE, MPC)
0005 %   [IDX, NEW_MPC, NEW_XGD, NEW_SD] = ADDSTORAGE(STORAGE, MPC)
0006 %   [IDX, NEW_MPC, NEW_XGD, NEW_SD] = ADDSTORAGE(STORAGE, MPC, XGD)
0007 %   [IDX, NEW_MPC, NEW_XGD, NEW_SD] = ADDSTORAGE(STORAGE, MPC, XGD, SD)
0008 %
0009 %   Given a StorageUnitData structure, or the name of a file containing such
0010 %   a structure, this function adds the specified storage generators to an
0011 %   existing MATPOWER case, xGenData struct and StorageData struct.
0012 %
0013 %   Inputs:
0014 %       STORAGE : a StorageUnitData struct or the name of an M-file
0015 %                   or MAT-file that returns one, with the following fields
0016 %           .gen     : rows to be appended to the GEN matrix from MPC
0017 %           .gencost : (optional) rows to be added to the GENCOST matrix
0018 %                      from MPC, default is zero cost
0019 %           .xgd_table : xGenData table struct or filename providing data for
0020 %                        the storage units being added. See LOADSTORAGEDATA
0021 %                        for more information on the xGenData table format.
0022 %           .sd_table : StorageData table struct or filename providing data
0023 %                       for the storage units being added. See LOADSTORAGEDATA
0024 %                       for more information on the StorageData table format.
0025 %       MPC : MATPOWER case struct to which storage generators will be added
0026 %       XGD : (optional) xGenData struct corresponding to the generators
0027 %             already in MPC, to which the new xGenData for the storage
0028 %             units will be added.
0029 %       SD : (optional) StorageData struct corresponding to the generators
0030 %            already in MPC, to which the new StorageData for the storage
0031 %            units will be added.
0032 %
0033 %   Output:
0034 %       IDX : Generator indices of newly added storage units.
0035 %       NEW_MPC : MPC with storage units appended to MPC.GEN and MPC.GENCOST
0036 %                 MPC.GENFUEL (= 'ess').
0037 %       NEW_XGD : XGD with xGenData for new storage units appended.
0038 %       NEW_SD  : SD with StorageData for new storage units appended.
0039 %
0040 %   See also LOADSTORAGEDATA, LOADXGENDATA.
0041 
0042 %   MOST
0043 %   Copyright (c) 2013-2016, Power Systems Engineering Research Center (PSERC)
0044 %   by Ray Zimmerman, PSERC Cornell
0045 %
0046 %   This file is part of MOST.
0047 %   Covered by the 3-clause BSD License (see LICENSE file for details).
0048 %   See https://github.com/MATPOWER/most for more info.
0049 
0050 %% define named indices into data matrices
0051 [PW_LINEAR, POLYNOMIAL, MODEL, STARTUP, SHUTDOWN, NCOST, COST] = idx_cost;
0052 
0053 %% define fuel type for storage
0054 STORAGE_FUEL = 'ess';
0055 
0056 %% input arg handling
0057 if nargin < 4
0058     sd = [];
0059     if nargin < 3
0060         xgd = [];
0061     end
0062 end
0063 if ischar(storage)
0064     infile = sprintf(' in file: ''%s''', storage);
0065     storage = loadgenericdata(storage, 'struct', 'gen', 'storage');
0066 else
0067     infile = '';
0068 end
0069 
0070 %% add to MPC
0071 ns = size(storage.gen, 1);          %% number of storage units being added
0072 if isfield(storage, 'gencost')
0073     storage_gencost = storage.gencost;
0074 else        %% use zero cost by default
0075     storage_gencost = repmat([POLYNOMIAL 0 0 2 0 0], ns, 1);
0076 end
0077 [new_mpc, idx] = addgen2mpc(mpc, storage.gen, storage_gencost, STORAGE_FUEL);
0078 
0079 %% handle xGenData and StorageData
0080 if nargout > 2      %% output NEW_XGD, NEW_SD requested
0081     %% xGenData
0082     if isfield(storage, 'xgd_table')
0083         storage_xgd = loadxgendata(storage.xgd_table, storage.gen);
0084     else
0085         error('addstorage: missing XGD_TABLE field in STORAGE');
0086     end
0087 
0088     if isempty(xgd)     %% no input XGD provided
0089         new_xgd = storage_xgd;
0090     else                %% input XGD provided
0091         %% append rows of every field in xgd
0092         new_xgd = xgd;
0093         fields = fieldnames(xgd);
0094         for f = 1:length(fields)
0095             ff = fields{f};
0096             %% dims of wind_xgd fields already checked by loadxgendata
0097             if size(xgd.(ff), 1) ~= size(mpc.gen, 1)
0098                 error('addstorage: # of rows in XGD.%s (%d) does not match MPC.GEN (%d)', ...
0099                     ff, size(xgd.(ff), 1), size(mpc.gen, 1));
0100             end
0101             new_xgd.(ff) = [xgd.(ff); storage_xgd.(ff)];
0102         end
0103     end
0104 
0105     %% StorageData
0106     if isfield(storage, 'sd_table')
0107         storage_sd = loadstoragedata(storage.sd_table, storage.gen);
0108     else
0109         error('addstorage: missing SD_TABLE field in STORAGE');
0110     end
0111 
0112     storage_sd.UnitIdx = idx;       %% add UnitIdx field
0113 
0114     if isempty(sd)     %% no input SD provided
0115         new_sd = storage_sd;
0116     else                %% input SD provided
0117         %% find number of storage units in original mpc
0118         ns0 = length(find(strcmp(mpc.genfuel, STORAGE_FUEL)));
0119         new_sd = sd;
0120         fields = fieldnames(sd);
0121         for f = 1:length(fields)    %% append rows of every field in sd
0122             ff = fields{f};
0123             add_ns  = size(storage_sd.(ff), 1);
0124             orig_ns = size(        sd.(ff), 1);
0125             if orig_ns ~= 1 || add_ns ~= 1 || sd.(ff) ~= storage_sd.(ff)
0126                 %% at least one of them is not 1-d or else they don't match
0127                 if orig_ns == 1     %% original is 1-d
0128                     %% expand it
0129                     sd.(ff) = ones(ns0, 1) * sd.(ff);
0130                 end
0131                 if add_ns == 1      %% new is 1-d
0132                     %% expand it
0133                     storage_sd.(ff) = ones(ns, 1) * storage_sd.(ff);
0134                 end
0135                 %% concatenate them
0136                 new_sd.(ff) = [sd.(ff); storage_sd.(ff)];
0137             % else (both are 1-d and they match)
0138             %   do nothing, just use old sd.(ff)
0139             end
0140         end
0141     end
0142 end

Generated on Mon 24-Jun-2019 15:58:45 by m2html © 2005