mirror of
https://github.com/CoolProp/CoolProp.git
synced 2026-04-23 03:00:17 -04:00
* Full update to latest SS 0.98 APIs - SS: switched to LowLevelEvaluationFast interface; - SS: fixed compiler warnings for deprecated methods/properties; - refactoring; * refactoring - removed not useful try/catch from unit manager; - refactoring of not used methods; * Fix for SMath bug SS-2414 * minor changes * Added folder for Test files * Added test file IF97 test file from CoolProp/CoolProp issue #1249 * changed filename * added script for batch testing * Review of dynamic assistant tootltip * New layout for README.md * Updated README.md * Updated README.md * Fixed combined emphasis in README.md
173 lines
6.0 KiB
C#
173 lines
6.0 KiB
C#
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
using SMath.Manager;
|
|
|
|
namespace coolprop_wrapper
|
|
{
|
|
public class coolpropPlugin : SMath.Math.IPluginLowLevelEvaluationFast
|
|
{
|
|
AssemblyInfo[] asseblyInfos = new []
|
|
{
|
|
new AssemblyInfo("SMath Studio", new System.Version(0, 98), new System.Guid("a37cba83-b69c-4c71-9992-55ff666763bd"))
|
|
};
|
|
TermInfo[] termInfos = new TermInfo[] {};
|
|
List<IFunction> functions = new List<IFunction>();
|
|
|
|
static string AssemblyDirectory
|
|
{
|
|
get
|
|
{
|
|
var filepath = new System.Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath;
|
|
return System.IO.Path.GetDirectoryName(filepath);
|
|
}
|
|
}
|
|
|
|
static string LogFile
|
|
{
|
|
get { return System.IO.Path.Combine(AssemblyDirectory, "log.txt"); }
|
|
}
|
|
|
|
public static void LogInfo(string Category, string Text, params object[] args)
|
|
{
|
|
#if DEBUG
|
|
var method = new System.Diagnostics.StackFrame(1).GetMethod();
|
|
System.IO.File.AppendAllText(
|
|
LogFile,
|
|
string.Format(
|
|
"{0} {1} {2} [{3}.{4}] {5}{6}",
|
|
System.DateTime.Now.ToShortDateString(),
|
|
System.DateTime.Now.ToLongTimeString(),
|
|
Category,
|
|
method.DeclaringType.Name,
|
|
method.Name.Substring(method.Name.LastIndexOf('.')+1),
|
|
string.Format(Text, args),
|
|
System.Environment.NewLine),
|
|
System.Text.Encoding.UTF8);
|
|
#endif
|
|
}
|
|
|
|
public static SMath.Math.Numeric.TNumber GetNumberParam(Entry arg, SMath.Math.Store context)
|
|
{
|
|
// var arg1 = SMath.Math.Decision.Preprocessing(arg, ref context);
|
|
// return SMath.Math.Numeric.Expression.Calculate(arg1, context).obj as SMath.Math.Numeric.TDouble;
|
|
return SMath.Math.Decision.NumericCalculation(arg, context);
|
|
}
|
|
|
|
public static void CoolPropError(string message = "")
|
|
{
|
|
string errStr;
|
|
if (!Functions.CoolProp_get_global_param_string.CoolPropDLLfunc("errstring", out errStr))
|
|
{
|
|
// Call it second time - most probably will get something like "buffer too small"
|
|
Functions.CoolProp_get_global_param_string.CoolPropDLLfunc("errstring", out errStr);
|
|
errStr = "Error message couldn't be retrieved from CoolProp library (buffer size issue?); the second try returned: " + errStr;
|
|
}
|
|
throw new System.Exception(message + errStr);
|
|
}
|
|
|
|
public static string GetStringParam(Entry arg, SMath.Math.Store context)
|
|
{
|
|
var dbl = GetNumberParam(arg, context).obj as SMath.Math.Numeric.TDouble;
|
|
if (!dbl.isText)
|
|
throw new SMath.Manager.MathException(Errors.ArgumentMustBeString);
|
|
return dbl.ToString().Trim(Symbols.StringChar[0]);
|
|
}
|
|
|
|
public static Entry MakeDoubleResult(double result, SMath.Math.Symbolic.MItem unit)
|
|
{
|
|
if (double.IsInfinity(result))
|
|
{
|
|
CoolPropError();
|
|
}
|
|
|
|
var d = new SMath.Math.Numeric.TDouble(result);
|
|
d.Units = unit;
|
|
return Entry.Create(d.ToTerms());
|
|
}
|
|
|
|
public static Entry MakeStringResult(string result)
|
|
{
|
|
return new Entry(Symbols.StringChar + result + Symbols.StringChar, TermType.Operand, new Entry[0]);
|
|
}
|
|
|
|
TermInfo[] IPluginHandleEvaluation.TermsHandled { get { return termInfos; } }
|
|
|
|
void System.IDisposable.Dispose()
|
|
{
|
|
try
|
|
{
|
|
if (System.IO.File.Exists(LogFile))
|
|
System.IO.File.Delete(LogFile);
|
|
}
|
|
catch (System.Exception) {}
|
|
}
|
|
|
|
AssemblyInfo[] IPlugin.Dependences { get { return asseblyInfos; } }
|
|
|
|
void IPlugin.Initialize()
|
|
{
|
|
var info = new List<TermInfo>();
|
|
|
|
try
|
|
{
|
|
foreach (var type in Assembly.GetExecutingAssembly().GetTypes()) {
|
|
|
|
if (!(type.IsClass && typeof(IFunction).IsAssignableFrom(type)))
|
|
continue;
|
|
|
|
var arguments = type.GetField("Arguments", BindingFlags.GetField | BindingFlags.Static | BindingFlags.Public);
|
|
|
|
if (arguments == null)
|
|
continue;
|
|
|
|
var args = arguments.GetValue(null) as int[];
|
|
|
|
foreach (var arg in args)
|
|
functions.Add((IFunction)System.Activator.CreateInstance(type, new object[] {arg}));
|
|
}
|
|
|
|
foreach (var func in functions)
|
|
{
|
|
var item = func.GetTermInfo(GlobalParams.CurLang3Letter);
|
|
info.Add(item);
|
|
LogInfo("[INFO]", "{0}({1}) - {2}", item.Text, item.ArgsCount, item.Description);
|
|
}
|
|
}
|
|
catch (System.Exception ex)
|
|
{
|
|
LogInfo("[ERROR]", "{0}", ex.Message);
|
|
}
|
|
|
|
termInfos = info.ToArray();
|
|
LogInfo("[INFO]", "Successfully. {0} functions loaded.", termInfos.Length);
|
|
}
|
|
|
|
public bool TryEvaluateExpression(Entry value, SMath.Math.Store context, out Entry result)
|
|
{
|
|
result = null;
|
|
|
|
if (value.Type != TermType.Function)
|
|
return false;
|
|
|
|
foreach (var func in functions)
|
|
{
|
|
if (!func.Info.Equals(value.ToTerm()))
|
|
continue;
|
|
|
|
try
|
|
{
|
|
return func.TryEvaluateExpression(value, context, out result);
|
|
}
|
|
catch (System.Exception ex)
|
|
{
|
|
LogInfo("[ERROR]", "{0}({1}) {2}", value.Text, value.ArgsCount, ex.Message);
|
|
throw;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
}
|
|
}
|