From 161420349b90c6a891342cef77301c3c353821ab Mon Sep 17 00:00:00 2001 From: Mingtao Li Date: Sat, 7 Oct 2023 13:40:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=92=8C=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E5=99=A8=E7=9A=84metadata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/README.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/README.md b/src/README.md index 93a8fda..aa759af 100644 --- a/src/README.md +++ b/src/README.md @@ -183,4 +183,55 @@ Symbolics.option_to_metadata_type(::Val{:misc}) = VariableMisc (具体需要写代码实现。) +## 组件类型 + + +在Modelingtoolkit中,各个组件都是ODESystem,包括连接器(connector)。所以没有办法直接通过成员变量读取其信息。而从sicp我们知道,如果想有字段记录额外的信息的话,可以有两种做法。一种是加个wrapper。一种是增加一个字段。先前我们由于没有考虑让上游修改,拟采用的是加个wrapper的做法。而现在,上游Modelingtoolkit修改了其代码,我们可以以metada的形式记录相关信息。 + +以下代码片段来自Modelingtoolkit的/src/systems/diffeqs/odesystem.jl + +```julia +struct ODESystem <: AbstractODESystem + ...... + """ + metadata: metadata for the system, to be used by downstream packages. + """ + metadata::Any + """ + gui_metadata: metadata for MTK GUI. + """ + gui_metadata::Union{Nothing, GUIMetadata} + ...... + end +end +``` + +这说明上游给我们了metadata这个字段可以记录我们的信息。并且,他们还设置了gui_metadata用以记录他们的GUI信息(我们暂时用不到)。 + +我们可以生成一个ODESystem,在metadata中使用一个类型的实例常量记录其相关信息。 + +例如有个Boiler函数,它会生成一个ODESystem。假如boiler表示这个ODESystem实例。 +```julia +@named boiler=Boiler() +``` +我们完全可以生成一个BoilerType类型,把boilertype定义为BoilerType类型实例,再把boiler的metadata赋值为boilertype。 +这样boiler就含有我们所需的一切信息。 +而对于把boiler存储到数据库的函数,我们可以读取其boilertype的信息,根据boilertype进行多重分发。完美解决 +```julia +savetodatabase(boiler) +``` + +## 连接器 + +在Modelingtoolkit中,连接器(connector)是使用@connector宏来实现的。定义一个函数生成某ODESystem,而同时在前面加上@connector就会定义成连接器。 + +连接器实际上是通过ODESystem的connector_type提供的。 + +```julia + """ + connector_type: type of the system + """ + connector_type::Any +``` +