Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Adding API function to convert between units


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@18156 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Nov 15, 2013
1 parent cd3a7bc commit 1f9c140
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 5 deletions.
15 changes: 15 additions & 0 deletions Compiler/FrontEnd/ModelicaBuiltin.mo
Original file line number Diff line number Diff line change
Expand Up @@ -1826,6 +1826,21 @@ external "builtin";
annotation(preferredView="text");
end dumpXMLDAE;

function convertUnits
input String s1;
input String s2;
output Boolean unitsCompatible;
output Real scaleFactor1;
output Real offset1;
output Real scaleFactor2;
output Real offset2;
external "builtin";
annotation(preferredView="text",Documentation(info="<html>
<p>Returns the scale factor and offsets used when converting two units.</p>
<p>Returns false if the types are not compatible and should not be converted.</p>
</html>"));
end convertUnits;

function listVariables "Lists the names of the active variables in the scripting environment."
output TypeName variables[:];
external "builtin";
Expand Down
18 changes: 16 additions & 2 deletions Compiler/FrontEnd/UnitAbsynBuilder.mo
Original file line number Diff line number Diff line change
Expand Up @@ -1574,15 +1574,29 @@ public function str2unit "Translate a unit string to a unit"
protected
list<Integer> nums,denoms,tpnoms,tpdenoms;
list<String> tpstrs;
Real scaleFactor,offset;
list<tuple<MMath.Rational,UnitAbsyn.TypeParameter>> typeParams;
list<MMath.Rational> units;
algorithm
(unit,_,_) := str2unitWithScaleFactor(res,funcInstIdOpt);
end str2unit;

public function str2unitWithScaleFactor "Translate a unit string to a unit"
input String res;
input Option<Integer> funcInstIdOpt;
output UnitAbsyn.Unit unit;
output Real scaleFactor;
output Real offset;
protected
list<Integer> nums,denoms,tpnoms,tpdenoms;
list<String> tpstrs;
list<tuple<MMath.Rational,UnitAbsyn.TypeParameter>> typeParams;
list<MMath.Rational> units;
algorithm
(nums,denoms,tpnoms,tpdenoms,tpstrs,scaleFactor,offset) := UnitParserExt.str2unit(res);
units := joinRationals(nums,denoms);
typeParams := joinTypeParams(tpnoms,tpdenoms,tpstrs,funcInstIdOpt);
unit := UnitAbsyn.SPECIFIED(UnitAbsyn.SPECUNIT(typeParams,units));
end str2unit;
end str2unitWithScaleFactor;

/* Tests */

Expand Down
23 changes: 22 additions & 1 deletion Compiler/Script/CevalScript.mo
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ public import Interactive;
public import Dependency;
public import Values;
public import SimCode;
public import UnitAbsyn;

// protected imports
protected import AbsynDep;
Expand Down Expand Up @@ -132,6 +133,8 @@ protected import FMIExt;
protected import ErrorExt;
protected import FGraphEnv;
protected import FGraph;
protected import UnitAbsynBuilder;
protected import UnitParserExt;

protected constant DAE.Type simulationResultType_rtest = DAE.T_COMPLEX(ClassInf.RECORD(Absyn.IDENT("SimulationResult")),{
DAE.TYPES_VAR("resultFile",DAE.dummyAttrVar,DAE.T_STRING_DEFAULT,DAE.UNBOUND(),NONE()),
Expand Down Expand Up @@ -860,7 +863,7 @@ algorithm
FMI.ExperimentAnnotation fmiExperimentAnnotation;
FMI.Info fmiInfo;
list<String> vars_1,args,strings,strs,strs1,strs2,visvars,postOptModStrings,postOptModStringsOrg,mps,files,dirs;
Real timeTotal,timeSimulation,timeStamp,val,x1,x2,y1,y2,r, linearizeTime, curveWidth;
Real timeTotal,timeSimulation,timeStamp,val,x1,x2,y1,y2,r,linearizeTime,curveWidth,offset,offset1,offset2,scaleFactor,scaleFactor1,scaleFactor2;
GlobalScript.Statements istmts;
list<GlobalScript.Statements> istmtss;
Boolean have_corba, bval, anyCode, b, b1, b2, externalWindow, grid, logX, logY, gcc_res, omcfound, rm_res, touch_res, uname_res, ifcpp, ifmsvc,sort, builtin, showProtected, inputConnectors, outputConnectors;
Expand Down Expand Up @@ -889,6 +892,7 @@ algorithm
HashSetString.HashSet hashSetString;
list<Boolean> blst;
list<Error.TotalMessage> messages;
UnitAbsyn.Unit u1,u2;

Real stoptime,starttime,tol,stepsize;
Integer interval;
Expand Down Expand Up @@ -1087,6 +1091,23 @@ algorithm
then
(cache,Values.BOOL(true),newst);

case (cache,env,"convertUnits",{Values.STRING(str1),Values.STRING(str2)},st,_)
equation
UnitParserExt.initSIUnits();
(u1,scaleFactor1,offset1) = UnitAbsynBuilder.str2unitWithScaleFactor(str1,NONE());
(u2,scaleFactor2,offset2) = UnitAbsynBuilder.str2unitWithScaleFactor(str2,NONE());
b = valueEq(u1,u2);
/* How to calculate the final scale factor and offset?
ºF = (ºK - 273.15)* 1.8000 + 32.00 = (ºK - 255.37)* 1.8000
ºC = (ºK - 273.15)
ºF = (ºC - (255.37 - 273.15))*(1.8/1.0)
*/
scaleFactor = scaleFactor2 / scaleFactor1;
offset = offset2 - offset1;
then
(cache,Values.TUPLE({Values.BOOL(b),Values.REAL(scaleFactor),Values.REAL(offset)}),st);

case (cache,env,"list",{Values.CODE(Absyn.C_TYPENAME(Absyn.IDENT("AllLoadedClasses"))),Values.BOOL(false),Values.BOOL(false),Values.ENUM_LITERAL(name=path)},(st as GlobalScript.SYMBOLTABLE(ast = p)),_)
equation
name = Absyn.pathLastIdent(path);
Expand Down
5 changes: 4 additions & 1 deletion Compiler/runtime/UnitParserExt_omc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ const char* UnitParserExt_unit2str(void *nums, void *denoms, void *tpnoms, void
return strcpy(ModelicaAllocateString(res.size()), res.c_str());
}

void UnitParserExt_str2unit(const char *inStr, void **nums, void **denoms, void **tpnoms, void **tpdenoms, void **tpstrs)
void UnitParserExt_str2unit(const char *inStr, void **nums, void **denoms, void **tpnoms, void **tpdenoms, void **tpstrs, double *scaleFactor, double *offset)
{
string str = string(inStr);
Unit unit;
Expand All @@ -55,6 +55,9 @@ void UnitParserExt_str2unit(const char *inStr, void **nums, void **denoms, void
*tpdenoms = mmc_mk_nil();
*tpstrs = mmc_mk_nil();
/* baseunits */
*scaleFactor = unit.scaleFactor.toReal() * pow(10,unit.prefixExpo.toReal());
*offset = unit.offset.toReal();

vector<Rational>::reverse_iterator rii;
for(rii=unit.unitVec.rbegin(); rii!=unit.unitVec.rend(); ++rii) {
*nums = mmc_mk_cons(mmc_mk_icon(rii->num),*nums);
Expand Down
4 changes: 3 additions & 1 deletion Compiler/runtime/UnitParserExt_rml.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
/* External interface for UnitParserExt module */
#include "unitparser.h"
#include "unitparserext.cpp"
#include <math.h>

extern "C"
{
#include "rml.h"


void UnitParserExt_5finit(void)
{
}
Expand Down Expand Up @@ -151,6 +151,8 @@ RML_BEGIN_LABEL(UnitParserExt__str2unit)
rmlA2 = (void*)tpnoms;
rmlA3 = (void*)tpdenoms;
rmlA4 = (void*)tpstrs;
rmlA5 = mk_rcon(unit.scaleFactor.toReal() * pow(10,unit.prefixExpo.toReal()));
rmlA6 = mk_rcon(unit.offset.toReal());
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL
Expand Down
1 change: 1 addition & 0 deletions Compiler/runtime/unitparserext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ extern "C"

void UnitParserExtImpl__initSIUnits(void)
{
unitParser->initSIUnits();
}

void UnitParserExtImpl__checkpoint(void)
Expand Down

0 comments on commit 1f9c140

Please sign in to comment.