Commit 843acd0a authored by Bernardo Quaresma Dias's avatar Bernardo Quaresma Dias
Browse files

Migração de arquivo de scripts para bibliotecas

MPA-1086
parent e6c38985
script{
name = "BR-SiOP: Importa Poos a Partir de Pasta Model de Algoritmo de Otimizao",
author = "Bernardo Quaresma Dias (bernardo@tecgraf.puc-rio.br)",
description = [[
Avalia pasta model de Algoritmo de Otimizao de BR-SiOP,
Cria Instncias de Poos e Interfaces de Algoritos.
As as classes da lib-brsiop-4_0.mpam j devem estar carregadas no projeto
antes da execuo do script.
]],
configurarAtributosOtmGLBRSiOP = function(self, classid, instid)
for attrid, attrname in MPA.AttributesIterator(classid) do
local otmglattr = attrid:match("^brsiop_otmgl_(.+)")
if otmglattr then
MPA.SetAttribute(instid, attrid, ("_sim+ihm-rw+%s-%s"):format(otmglattr, instid) )
end
end
end,
INTERFACEPATH_FMT = "./model/interfaces/%s.inc",
criarArquivoValsSeps = function(self, dataid, headerlin, idcol, leftalin, size)
local instid = "arq-"..dataid
local classid = 'arquivo_valores_separadores'
MPA.AddConfig(classid, instid)
-- configura campos
MPA.SetAttribute(instid, 'nome_arquivo', self.INTERFACEPATH_FMT:format(dataid) )
MPA.SetAttribute(instid, 'separador', "%s" )
MPA.SetAttribute(instid, 'linha_cabecalho', headerlin )
MPA.SetAttribute(instid, 'coluna_id', idcol )
MPA.SetAttribute(instid, 'alinhar_esquerda', leftalin )
MPA.SetAttribute(instid, 'tamanho_valor', size )
return instid
end,
criarFonteDados = function(self, dataid, headerlin, idcol, leftalin, size)
local instid = "fonte-"..dataid
local classid = 'aux_otmgl_brsiop_src_file'
MPA.AddConfig(classid, instid)
-- criar arquivo com valores entre separadores
local arqinstid = self:criarArquivoValsSeps(dataid, headerlin, idcol, leftalin, size)
MPA.SetAttribute(instid, 'instancia_fonte', arqinstid)
return instid
end,
criarControlador = function(self, name) -- [[DEBUG]] MPA.PrintOut( ("Criando FICGL para '%s'"):format(name) )
local instid = "FICGL-"..name
local classid = "controlador"
MPA.AddConfig(classid, instid)
MPA.SetAttribute(instid, 'pv', "_sim+plc-r+pv-"..instid)
return instid
end,
criarValvulaOnOff = function(self, name) -- [[DEBUG]] MPA.PrintOut( ("Criando SDV para '%s'"):format(name) )
local instid = "SDV-"..name
local classid = "valvula_on_off"
MPA.AddConfig(classid, instid)
MPA.SetAttribute(instid, 'indicacao_aberto', "_sim+plc-r+ind_ab-"..instid)
return instid
end,
criarPoco = function(self, wellname) -- [[DEBUG]] MPA.PrintOut( ("Criando Poo para '%s'"):format(name) )
local instid = wellname
local classid = 'poco'
MPA.AddConfig(classid, instid)
local sdvid = self:criarValvulaOnOff(instid)
MPA.SetAttribute(instid, 'sdv', sdvid)
local ficid = self:criarControlador(instid)
MPA.SetAttribute(instid, 'fic_gaslift', ficid)
MPA.SetAttribute(instid, 'pressao_montante_choke', "_sim+plc-r+pmon-"..instid)
return instid
end,
criarProdutor = function(self, index, wellname) -- [[DEBUG]] MPA.PrintOut( ("Criando Produtor %s para '%s'"):format(index, name) )
local instid = 'Prod-'..wellname..'-BRSiOP'
local classid = 'aux_otmgl_brsiop_prod'
MPA.AddConfig(classid, instid)
local prodinid = self:criarEntradaProdutor(index, instid, wellname)
MPA.SetAttribute(instid, 'entrada', prodinid)
local prodoutid = self:criarSaidaProdutor(index, instid)
MPA.SetAttribute(instid, 'saida', prodoutid)
return instid
end,
criarEntradaProdutor = function(self, index, prodid, wellname) -- [[DEBUG]] MPA.PrintOut( ("Criando Entrada %s para Produtor para '%s'"):format(index, name) )
local instid = 'input-'..prodid
local classid = 'aux_otmgl_brsiop_prod_in'
MPA.AddConfig(classid, instid)
local pocoid = self:criarPoco(wellname)
MPA.SetAttribute(instid, 'poco', pocoid)
self:configurarAtributosOtmGLBRSiOP(classid, instid)
MPA.SetAttribute(instid, 'id_instancia', index)
local srcinstid = self:criarFonteDados('producers_input', 1, 1, 'true', 20)
MPA.SetAttribute(instid, 'fonte', srcinstid)
return instid
end,
criarSaidaProdutor = function(self, index, prodid) -- [[DEBUG]] MPA.PrintOut( ("Criando Sada %s para Produtor para '%s'"):format(index, name) )
local instid = 'output-'..prodid
local classid = 'aux_otmgl_brsiop_prod_out'
MPA.AddConfig(classid, instid)
self:configurarAtributosOtmGLBRSiOP(classid, instid)
MPA.SetAttribute(instid, 'id_instancia', index)
local srcinstid = self:criarFonteDados('producers_output', 1, 1)
MPA.SetAttribute(instid, 'fonte', srcinstid)
return instid
end,
criarComandoAlgBRSiOP = function(self, algid)
local instid = 'cmd-'..algid
local classid = 'os_comando'
local cmdpath = "c:/gams/gams.exe"
local execpath = "model"
local codefile = "br-siop.gms"
MPA.AddConfig(classid, instid)
-- configura campos
MPA.SetAttribute(instid, 'comando', cmdpath )
MPA.SetAttribute(instid, 'caminho_execucao', execpath )
MPA.SetAttribute(instid, 'parametros', codefile, 1 )
return instid
end,
criarEntradaPlataforma = function(self, platid)
local instid = 'input-'..platid
local classid = 'aux_otmgl_brsiop_plat_in'
MPA.AddConfig(classid, instid)
self:configurarAtributosOtmGLBRSiOP(classid, instid)
local srcinstid = self:criarFonteDados('platform_input')
MPA.SetAttribute(instid, 'fonte', srcinstid)
return instid
end,
criarSaidaPlataforma = function(self, platid)
local instid = 'output-'..platid
local classid = 'aux_otmgl_brsiop_plat_out'
MPA.AddConfig(classid, instid)
self:configurarAtributosOtmGLBRSiOP(classid, instid)
MPA.SetAttribute(instid, 'id_instancia', 1)
local srcinstid = self:criarFonteDados('platform_output', 1, nil, 'true', 20)
MPA.SetAttribute(instid, 'fonte', srcinstid)
return instid
end,
criarPlataforma = function(self, algid)
local instid = 'Plat-'..algid
local classid = 'aux_otmgl_brsiop_plat'
MPA.AddConfig(classid, instid)
local inputinstid = self:criarEntradaPlataforma(instid)
MPA.SetAttribute(instid, 'entrada', inputinstid )
local outputinstid = self:criarSaidaPlataforma(instid)
MPA.SetAttribute(instid, 'saida', outputinstid )
return instid
end,
criarModuloAlgBRSiOP = function(self, modelpath)
local instid = "BRSiOP"
local classid = 'mod_otmgl_brsiop'
MPA.AddConfig(classid, instid)
local cmdinstid = self:criarComandoAlgBRSiOP(instid)
MPA.SetAttribute(instid, 'comando_algoritmo', cmdinstid )
local platinstid = self:criarPlataforma(instid)
MPA.SetAttribute(instid, 'plataforma', platinstid )
MPA.SetAttribute(instid, 'produtores', nil)
for line in io.lines(modelpath.."/tables/wells_name.inc") do
local index, wellname = line:match("^(%S+)%s+(%S+)%s*$") -- [[DEBUG]] MPA.PrintOut( ("Criando instncias para poo #%s '%s':"):format(index, name) )
if wellname then
local prodid = self:criarProdutor(index, wellname)
MPA.SetAttribute(instid, 'produtores', prodid, index)
end
end
-- configura campos
MPA.SetAttribute(instid, 'tempo_execucao', 30 )
MPA.SetAttribute(instid, 'cfg_intervalo', 600 )
end,
callback = function(self)
--[[devel
local confirmed, modelpath = true, "C:/Users/bernardo/_work/tecgraf/mpa/libs-dev/mod-brsiop/model"
--[==[commit]]
local confirmed, modelpath = MPA.OpenDirDialog("Abrir pasta Model...")
--]==]
if not confirmed then
MPA.PrintOut( "Caminho para pasta Model no foi informado." )
return false
end
-- criao de instncia de mdulo
self:criarModuloAlgBRSiOP(modelpath)
return true
end
}
script{
name = "Converso: Converte Configurao de Planta",
author = "Bernardo Quaresma Dias (bernardo@tecgraf.puc-rio.br)",
description = [[
Converte configurao de planta de acordo com arquivo de Compatibilizao.
]],
getTokens = function( self, str, sep)
if str:sub(#str) ~= sep then
str = str .. sep
end
local toks = {}
for tok in str:gmatch( ("([^%s]*)%s"):format(sep, sep) ) do
toks[#toks+1] = tok
end
return toks
end,
getCompatInfo = function(self, fpath)
local compatinfo = {}
-- abre arquivo
-- para cada linha
for line in io.lines(fpath) do
-- se no for comentrio
if line:sub(1,1) ~= '#' then
local tokens = self:getTokens(line, ';')
-- importa duas primeiras colunas como fromclassid e fromattrid
local fromclassid = tokens[1]
local fromattrid = tokens[2]
-- importa duas ltimas colunas como toclassid e toattrid
local toclassid = tokens[3]
local toattrid = tokens[4]
local toattrinfos = compatinfo[fromclassid] or {} --[[ASSERT]] assert(toattrinfos[fromattrid] == nil, ("Atributo '%s' de classe '%s' j carregado para Compatibilizao"):format(tostring(fromattrid), tostring(fromclassid) ) )
local toattrinfo = {
classid = toclassid,
attrid = toattrid ,
} --[[DEBUG]] MPA.PrintOut( ("Obteve Informaes de '%s.%s' -> '%s.%s'"):format(tostring(fromclassid), tostring(fromattrid), tostring(toclassid), tostring(toattrid)) )
toattrinfos[fromattrid] = toattrinfo
compatinfo[fromclassid] = toattrinfos
end
end
return compatinfo
end,
getAttrValue = function (self, instid, attrid)
local val = {}
local attrval
repeat
local validx = #val+1
attrval = MPA.GetAttribute(instid, attrid, validx) --[[DEBUG]] MPA.PrintOut(("Obtendo valor de atributos '%s#%d' de '%s'"):format(attrid, validx, instid) )
val[validx] = attrval
until (attrval == nil)
if #val == 1 then
val = val[1]
end
return val
end,
setAttrValue = function (self, instid, attrid, val)
if type(val) == 'table' then
for i, v in ipairs(val) do --[[DEBUG]] MPA.PrintOut(("Ajustando atributo '%s#%d' de '%s' para %s..."):format(attrid, i, instid, v) )
MPA.SetAttribute(instid, attrid, v, i)
end
else
MPA.SetAttribute(instid, attrid, val)
end
end,
callback = function(self)
-- obtm arquivo de compatibilizao
local selected, compatfpath = MPA.LoadFileDialog("Seleo de Arquivo de Compatibilizao", '*.csv', "Arquivo de Compatibilizao")
if not selected then return false end
local COMPATINFO = self:getCompatInfo(compatfpath)
-- importa "atalhos"
--COMPATINFO[fromclassid][fromattrid] = {classid = toclassid, attrid = tosttrid}
for fromclassid, toattrinfos in pairs(COMPATINFO) do --[[DEBUG]] MPA.PrintOut(("Movendo atributos de classe '%s'..."):format(fromclassid) )
for frominstid in MPA.ConfigsIterator(fromclassid) do --[[DEBUG]] MPA.PrintOut(("Movendo atributos de instncia '%s'"):format(frominstid) )
local toclassids = {count = 0}
for fromattrid , toattrinfo in pairs(toattrinfos) do
local toclassid = toattrinfo.classid
local toclassid_count = toclassids[toclassid]
if not toclassid_count then
toclassid_count = toclassids.count + 1
toclassids[toclassid] = toclassid_count
toclassids.count = toclassid_count
end
local toattrid = toattrinfo.attrid --[[DEBUG]] MPA.PrintOut(("Movendo de '%s.%s' para '%s.%s'"):format(tostring(fromclassid), tostring(fromattrid), tostring(toclassid), tostring(toattrid)) )
local toinstid
if fromclassid ~= toclassid then
toinstid = frominstid.."-convert"..toclassid_count
else
toinstid = frominstid
end
if toclassid ~= '' then
MPA.AddConfig(toclassid, toinstid)
-- obtm valor atual de atributo
local attrval = self:getAttrValue(frominstid, fromattrid)
-- apaga valor atual de atributo
MPA.SetAttribute(frominstid, fromattrid, nil)
-- ajusta valor em atributo destino
self:setAttrValue(toinstid, toattrid, attrval)
end
end
end
end
return true
end
}
script{
name = "Converso: Cria Colunas de Converso",
author = "Bernardo Quaresma Dias (bernardo@tecgraf.puc-rio.br)",
description = [[
Cria pares de coulunas com identificador de classe e identificador de atributo
para criao de arquivo compatibilizao.
]],
LINE_FMT = "%s;%s\n";
writeClassAttrs = function(self, f, classid)
for attrid in MPA.AttributesIterator(classid) do
f:write(self.LINE_FMT:format(classid, attrid) )
end
end,
callback = function(self)
-- obtm arquivo de compatibilizao
local selected, compatfpath = MPA.SaveFileDialog("Seleo de Arquivo de Compatibilizao", '*.csv', "Arquivo de Compatibilizao")
if not selected then return false end
local compatf = assert(io.open(compatfpath, "w"))
for classid in MPA.PointsIterator() do
self:writeClassAttrs(compatf, classid)
end
for classid in MPA.EquipmentsIterator() do
self:writeClassAttrs(compatf, classid)
end
compatf:close()
return true
end
}
script{
name = "Simulao Reativa: Importa Instncias",
author = "Daniel Lima Freixo (danlimfreixo@tecgraf.puc-rio.br); Bernardo Quaresma Dias (bernardo@tecgraf.puc-rio.br)",
description = [[
Importa configuraes de instncias a partir de arquivo CSV.
Cada linha corresponde configurao de uma instncia onde ss parmetros so separados por vrgula e o primeiro catectere
indica o tipo de Simulao Reativa da Linha.
Os tipos de simulao reativa esperados so:
'c' - Simulao Reativa Constante
'l' - Simulao Reativa Linear
'b' - Simulao Reativa por Bloco de Clculo
Parmetros de Simulaes Reativas Constantes:
c,<tag varivel simulada>,<valor constante>,<rudo>,<valor mnimo>,<valor mximo>,[Modo Inativo],[Condio Ativao]
Parmetros de Simulaes Reativas Lineares:
l,<tag varivel simulada>,<tag variavel entrada>,<coeficiente angular>,<coeficiente linear>,<rudo>,<valor mnimo>,<valor mximo>,[Modo Inativo],[Condio]
Parmetros de Simulao Reativa por Bloco de Clculo:
b,<tag varivel simulada>,<tag varivel entrada>,<rudo>,<valor mnimo>,<valor mximo>,[Modo Inativo],<bloco clculo>,[Condio]
- Tempo Morto:
tm,<intervalo>,<atraso>,<referncia>
- Filtro:
bf,<intervalo>,<k>,<t>,<valor inicial>
- Mdia:
mm,<intervalo>,<periodo>
[Modo Inativo] Cada Simulao Reativa pode ter uma condio de ativao que, quando atendida, ir efetivar a simulao.
Quando essa condio for configurada, mas no for atendida, o valor da simulao ser ajustado de acordo com o
modo inativo:
min: O <Valor Mnimo> ser usado para simulao
max: O <Valor Mximo> ser usado para simulao
off: O valor da varivei simulada no ser atualizado (padro)
[Condio Ativao] A configurao de condies feita incluindo um sufixo, tambm separado por vrgula, iniciado com o tipo de condio
e seguido pelos seus attributos.
A saber:
- Cond. Lgica: cl,<variavel>,<tipo condio:{true|false|reset|set}>
- Cond. Numrica: cn,<variavel>,<tipo condio:{min|max|equal}>,<valor referncia>
O formato sperado para as linhas de configurao :
Exemplos:
#linha comentada
#var_a=20.2 + 20.2*([+/-]15/100)
c,var_a,20.2,15
#var_j = var_c * 0.96 + 51 + var_c*([+/-]11/100)
l,var_j,var_c,0.96,51,11
#_______________
#outros:
c,var_b,20.2,100,1.1,38.8,min,cl,var_cl,true
c,var_c,20.2,100,1.1,38.8,off,cn,var_cn,max,10,1
l,var_d,var_a,20.1,100,10,30.6
l,var_d,var_a,20.1,100,10,30.6,cn,var_cn,min,10,1
b,var_bc_bm_3,var_bc_bm_3_out,10,5,95,,mm,10,1
b,var_bc_bf_1,var_bc_bf_1_out,10,5,95,,tm,30,15,10
b,var_bc_bf_2,var_bc_bf_2_out,10,5,95,,bf,10,1,10,12,cl,var_cond_l_true,true
]],
CommentString = "#",
FieldStringSep = ",",
PrefixVars = "reactsim",
trim = function(self, s)
return s:match'^%s*(.*%S)' or ''
end,
functionsfields = {
amostras = {
{ attrid = "intervalo_min";
func = function(actual, old) if not tonumber(old) then return actual end return math.min(actual, old) end,
},
{ attrid = "validade";
func = function(actual, old) if not tonumber(old) then return actual end return math.max(actual, old) end,
},
},
},
adjustfieldvalue = function(self, classid, attrid, value, oldvalue) -- [[DEBUG]]MPA.PrintOut("adjustfieldvalue", classid, attrid, value, oldvalue)
if (self.functionsfields[classid]) then
for attridx, attrtbl in pairs(self.functionsfields[classid]) do
-- [[DEBUG]]MPA.PrintOut("adjustfield", classid, attrtbl.attrid, attrid, value, oldvalue, attrtbl.func(value, oldvalue))
if (attrtbl.attrid == attrid) then
local val = attrtbl.func(value, oldvalue)
-- [[DEBUG]]MPA.PrintOut("adjustfield", classid, attrid, value, oldvalue, val)
return val
end
end
end
return value
end,
--maper o preenchimento automtico de uma classe antes da sua criao lida pelo arquivo ou no
extrafields = {
cl = { attrid = "condicao", classid = "condicao_logica", configurator = function(self, conf)
conf.id = self:createReactSimId(conf.valor_processo, conf.tipo)
end;
"valor_processo", "tipo"
},
cn = { attrid = "condicao", classid = "condicao_numerica", configurator = function(self, conf)
conf.id = self:createReactSimId(conf.valor_processo, conf.tipo, conf.valor_referencia, conf.tolerancia)
end;
"valor_processo", "tipo", "valor_referencia", "tolerancia"
},
tm = { attrid = "bloco_calculo", classid = "bloco_tempo_morto";
"intervalo", "atraso", "referencia"
},
bf = { attrid = "bloco_calculo", classid = "bloco_filtro";
"intervalo", "k", "t", "v_init"
},
mm = { attrid = "bloco_calculo", classid = "bloco_media", configurator = function(self, obj)
obj["amostras"] = {
id = self:createReactSimId(obj.id, "am"),
classid = "amostras",
intervalo_min = obj.intervalo,
validade = obj.periodo,
}
end;
"intervalo", "periodo"
},
},
reactfields = {
c = { classid = "reactsim_constante";
"saida", "entrada", "ruido", "val_min", "val_max", "modo_inativa"
},
l = { classid = "reactsim_linear";
"saida", "entrada", "a", "b", "ruido", "val_min", "val_max", "modo_inativa"
},
b = { classid = "reactsim_bloco_calculo";
"saida", "entrada", "ruido", "val_min", "val_max", "modo_inativa"
},
},
--[[
conf = {
classid = "reactsim_constante",
saida = "var_xx",
entrada = 4,
ruido = 10,
val_min = 0,
val_max = 100,
condicao = {
id = <<$valor_processo>>,
classid = "condicao_numerica",
attrid = "condicao",
valor_processo = "var_yy",
tolerancia = 5,
tipo = "max",
referencia = 50,
},
}
conf = {
id = <<$self:createReactSimId($conf.saida)>>,
classid = "reactsim_bloco_calculo";
val_min = 5,
saida = "var_bc_saida",
entrada = "var_bc_entrada",
ruido = 10,
val_max = 99,
bloco_calculo = {
classid = "bloco_media",
attrid = "bloco_calculo",
intervalo = 1,
periodo = 10,
amostras = {
id = "<<$conf.entrada..amostra>>",
classid = "amostras";
attrid = "amostras",
intervalo_min = 10,
validade = 300,
}
}
}
conf
--]]
createReactSimId = function(self, ...)
local ids = { }
for i = 1, select("#",...) do
ids[#ids+1] = (select(i,...))
end
return table.concat(ids,"-")
end,
createReactSim = function(self, config)
local ok = true
-- [[DEBUG]] self:pt(config, "configrsb:")
local classid = config.classid
local configid = config.id -- [[DEBUG]] MPA.PrintOut("reactsimAddConfig",classid, configid)
--Criar nova Configurao de Simulao Reativa
MPA.AddConfig(classid, configid)
-- [[DEBUG]]for k, v in pairs(config) do MPA.PrintOut(classid, configid, k,v) if (type(v) == "table") then for x,y in pairs(v) do MPA.PrintOut(classid, configid, k,v, x, y) end end end
for fieldid, fieldval in pairs(config) do -- [[DEBUG]] MPA.PrintOut("fieldid,fieldval", fieldid, fieldval)
if fieldid ~= "classid" and fieldid ~= "reactid" and fieldid ~= "id" then
-- [[DEBUG]] MPA.PrintOut(">", fieldid, fieldval)
if type(fieldval) ~= "table" then
MPA.SetAttribute(configid, fieldid, fieldval)
else
local attrinstid = fieldval.id
self:createReactSim(fieldval)
MPA.SetAttribute(configid, fieldid, attrinstid)
end
end
end
return ok
end,
importReactSimLine = function(self, ln) --[[DEBUG]]MPA.PrintOut("importReactSimLine:", ln)
local ok = true
local idtoks = {}
local conf = {}
local fields
local ifield = 0
local extraconf
local extrafields
local iextrafields = 0
for tok in ln:gmatch("([^,;]*)[,;]?") do --TODO: evitar que o ultimo caracter vazio da linha entre aqui (rever o match)
tok = self:trim(tok)
if (tok) then -- [[DEBUG]] MPA.PrintOut(tok)
if conf.classid == nil then
fields = self.reactfields[tok]
if (fields == nil) then -- reportar erro de tipo no identificado
MPA.PrintOut("\n[ERRO]: classe '"..tok.."' desconhecida! Verifique a configurao da linha!\n", ln)
ok = false
break
end
conf.classid = fields.classid
idtoks.reacttype = tok
elseif ifield < #fields then
ifield = ifield + 1
local attrid = fields[ifield]
conf[attrid] = tok
if (ifield == 1) then
conf.id = self:createReactSimId(self.PrefixVars, idtoks.reacttype, tok)