⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gams.m

📁 电力系统分析计算程序
💻 M
字号:
function varargout = gams(varargin)% GAMS general Matlab-GAMS interface function%% (...) = GAMS(...)%%Author:    Federico Milano%Date:      01-Mar-2003%Version:   1.0.0%%E-mail:    fmilano@thunderbox.uwaterloo.ca%Web-site:  http://thunderbox.uwaterloo.ca/~fmilanogams_output = 'struct';gams_show = 'minimized';gams_write_data = 'yes';%-----------------------------------------------------------------%-----------------------------------------------------------------% General settings%-----------------------------------------------------------------%-----------------------------------------------------------------warning offtry,   gams_output = evalin('caller','gams_output');   gams_output = lower(gams_output);endtry,   gams_show = evalin('caller','gams_show');   gams_show = lower(gams_show);endtry,   gams_write_data = evalin('caller','gams_write_data');   gams_write_data = lower(gams_write_data);endwarning on%-----------------------------------------------------------------%-----------------------------------------------------------------% Reading input data files:   matglobs.gms%                             matdata.gms%-----------------------------------------------------------------%-----------------------------------------------------------------if ~strcmp(gams_write_data,'no')    fid1 = 0;  fid2 = 0;    if ~nargin    disp('Specify an input file')    return  end    if nargin > 1    fid1 = fopen('matglobs.gms','wt+');    fid2 = fopen('matdata.gms','wt+');    end    if fid2,     fprintf(fid2,'%s\n','$onempty');  end    for i = 2:nargin        if isstr(varargin{i})            fprintf(fid1,'$setglobal %s ''%s''\n',inputname(i), ...              varargin{i});    elseif isnumeric(varargin{i})            fprintf(fid2,'$kill %s\n',inputname(i));            if islogical(varargin{i})        fprintf(fid2,'set %s /',inputname(i));      elseif length(varargin{i}) == 1        fprintf(fid2,'scalar %s /',inputname(i));      else        fprintf(fid2,'parameter %s /',inputname(i));      end            if length(varargin{i}) == 1        fprintf(fid2,'%f/;\n',varargin{i});            else            fprintf(fid2,'\n');          h = find(varargin{i});        siz = size(varargin{i});        if ~isempty(find(siz == 1))          n = 1;        else          n = length(siz);        end        k = [1 cumprod(siz(1:end-1))];                for j = 1:length(h)                    string = ['     ',sprintf('%f',varargin{i}(h(j)))];                    % ------------------------------------          % ind2sub          ndx = h(j) - 1;          for ii = n:-1:1,            idx = floor(ndx/k(ii))+1;            string = ['.',num2str(idx),string];            ndx = rem(ndx,k(ii));          end          % ------------------------------------          fprintf(fid2,'%s\n',string(2:end));                  end                fprintf(fid2,'/;\n');      end    elseif isstruct(varargin{i})            if isstr(varargin{i}.val)        fprintf(fid1,'$setglobal %s ''%s''\n',varargin{i}.name, ...                varargin{i}.val);                continue      end                  if ~isfield(varargin{i},'labels')        siz = size(varargin{i}.val);        if length(siz) == 2 & min(siz) == 1          labels = cellstr(num2str([1:max(siz)]'));        else          labels = cell(1,length(siz));          for ii = 1:length(siz)            labels{ii} = cellstr(num2str([1:siz(ii)]'));          end        end      else        labels = varargin{i}.labels;      end            fprintf(fid2,'$kill %s\n',varargin{i}.name);      if islogical(varargin{i}.val)        fprintf(fid2,'set %s /\n',varargin{i}.name);              else        fprintf(fid2,'parameter %s /\n',varargin{i}.name);      end            if ~iscell(labels{1})                h = find(varargin{i}.val);        if islogical(varargin{i}.val)          for j = 1:length(h)            fprintf(fid2,'%s \n',labels{h(j)});          end        else          for j = 1:length(h)            fprintf(fid2,'%s %f\n',labels{h(j)}, ...                    varargin{i}.val(h(j)));          end                  end              else                h = find(varargin{i}.val);        siz = size(varargin{i}.val);        n = length(siz);        k = [1 cumprod(siz(1:end-1))];        for j = 1:length(h)                    string = ['     ',sprintf('%f',varargin{i}.val(h(j)))];                    % ------------------------------------          % ind2sub          ndx = h(j) - 1;          for ii = n:-1:1,            idx = floor(ndx/k(ii))+1;            string = ['.',labels{ii}{idx},string];            ndx = rem(ndx,k(ii));          end          % ------------------------------------                    fprintf(fid2,'%s\n',string(2:end));                  end              end          fprintf(fid2,'/;\n');         end    end    if fid2,     fprintf(fid2,'%s\n','$offempty');  end    if nargin > 1    fclose(fid1);    fclose(fid2);  endend%-----------------------------------------------------------------%-----------------------------------------------------------------% Calling GAMS%-----------------------------------------------------------------%-----------------------------------------------------------------if ispc & strcmp(gams_show,'normal')  eval(['!gams ',varargin{1},' &']);else  eval(['!gams ',varargin{1}]);end%-----------------------------------------------------------------%-----------------------------------------------------------------% Writing output file:    matsol.gms%-----------------------------------------------------------------%-----------------------------------------------------------------if nargout,   fid = fopen('matsol.gms','rt+');   n_out = 0;  d_out = 0;  s_out = [];  t_out = '';  while 1    if n_out > nargout, break, end    tline = fgetl(fid);      if ~ischar(tline), break, end        tline = deblank(tline);            % ----------------------------------------------------------------    if isempty(tline)    % ----------------------------------------------------------------            % no actions        % ----------------------------------------------------------------    elseif strmatch('::',tline), % new output variable    % ----------------------------------------------------------------          n_out = n_out+1;       if ~strcmp(gams_output,'std')        varargout{n_out}.name = strrep(tline,'::','');      end              % ----------------------------------------------------------------    elseif strmatch('d',tline), % numeric data output    % ----------------------------------------------------------------            s_out = str2num(strrep(tline,'d',''));           d_out = s_out(1);      s_out = s_out(2:end);      t_out = 'nums';      if strcmp(gams_output,'std')              if d_out == 1          varargout{n_out} = zeros(s_out,1);                  else          varargout{n_out} = zeros(s_out);                end              else        if d_out == 1          varargout{n_out}.val = zeros(s_out,1);                  else          varargout{n_out}.val = zeros(s_out);                end      end          % ----------------------------------------------------------------    elseif strmatch('c',tline), % cell array data output    % ----------------------------------------------------------------          s_out = str2num(strrep(tline,'c',''));           d_out = s_out(1);      s_out = s_out(2:end);      t_out = 'cell';      if strcmp(gams_output,'std')          if d_out == 1                  varargout{n_out} = cell(s_out,1);        else          varargout{n_out} = cell(s_out);                end              else        if d_out == 1                  varargout{n_out}.val = cell(s_out,1);        else          varargout{n_out}.val = cell(s_out);                end      end        % ----------------------------------------------------------------    else % fill up elements    % ----------------------------------------------------------------            tline = lower(strrep(tline,'EPS',num2str(eps)));            switch t_out       case 'cell'                      data = sscanf(tline,['%d',repmat('.%d',1,d_out-1),' %s']);                if max(s_out) == 1 & d_out == 1           if strcmp(gams_output,'std')              varargout{n_out} = char(data(2:end))';                           else                        varargout{n_out}.val = char(data(2:end))';          end                              else                    % sub2ind          % --------------------------------          k = [1 cumprod(s_out(1:end-1))];          ndx = 1;          for i = 1:d_out,            ndx = ndx + (data(i)-1)*k(i);          end          % --------------------------------                    if strcmp(gams_output,'std')              varargout{n_out}{ndx} = char(data(d_out+1:end))';                           else                        varargout{n_out}.val{ndx} = char(data(d_out+1:end))';          end                  end                 case 'nums'                data = sscanf(tline,['%d',repmat('.%d',1,d_out-1),' %f']);        % sub2ind        % --------------------------------        k = [1 cumprod(s_out(1:end-1))];        ndx = 1;        for i = 1:d_out,          ndx = ndx + (data(i)-1)*k(i);        end                % --------------------------------                if strcmp(gams_output,'std')            varargout{n_out}(ndx) = data(d_out+1);                    else          varargout{n_out}.val(ndx) = data(d_out+1);        end              end          % ----------------------------------------------------------------          end  end    fclose(fid);  if n_out < nargout    for i = n_out+1:nargout      varargout{i}.val = [];    end  end  end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -