{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "이 노트북을 처음 열어보면 아마도 그림이나 표의 수식 등이 제대로 표시되지 않고 있을 것입니다. 이때는 오른쪽 상단의 \"Not Trusted\"버튼을 눌러서 나오는 안내창의 \"Trust\"를 선택해주세요. 노트북에 저장되어 있던 결과들이 제대로 표시될 것입니다. Jupyter Notebook이 아닌 Jupyter Lab 환경이라면 상단 \"View\" 메뉴의 \"Activate Command Palette\" 항목을 선택한 다음 \"Trust Notebook\"이라는 기능을 검색하여 실행하면 됩니다. 검색을 할 때에는 앞 글자 \"tr\"만 입력하여도 해당 항목이 나옵니다.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "이 노트북은 수강생의 실습을 위해 일부 코드가 누락되어 있습니다. 코드 중간에 주석처리된 부분(`#= .. =#`)이 보인다면 해당 부분에 맞는 코드를 직접 입력해주세요. 질문이 있는 경우, 직접 말씀해주시거나 채팅으로 알려주시면 도와드릴 수 있도록 하겠습니다.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. 광합성" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "지난 시간에는 식물의 성장을 logistic, exponential, Gompertz 등 간단한 성장 곡선 모형으로 모의해보았습니다. 이번 시간에는 실제 식물이 어떻게 그러한 곡선의 형태로 성장을 할 수 있는지 조금 더 고민해보면서 특히 광합성을 표현하는 방법에 대해 살펴보겠습니다. 다른 기작들과 마찬가지로 광합성 역시 그 구현 방식에 따라 상대적으로 단순한 모형에서 부터 꽤나 복잡한 기체교환 모형까지 다양하게 생각해볼 수 있습니다. 하지만 작물모형 관점에서는 결국 성장량 변화($\\frac{dW}{dt}$)를 표현하는 방식의 차이일뿐이며 기본적으로는 시간에 따라 생체량($W$)이 누적되어 수량이 결정된다는 기본 가정을 계속 가지고 간다는 점을 기억해주세요." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "application/vnd.webio.node+json": { "children": [], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": {}, "type": "node" }, "text/html": [ "
\n", "

The WebIO Jupyter extension was not detected. See the\n", "\n", " WebIO Jupyter integration documentation\n", "\n", "for more information.\n", "

\n" ], "text/plain": [ "WebIO._IJuliaInit()" ] }, "metadata": { "application/vnd.webio.node+json": { "kernelId": "493146c5-5720-442f-9dc7-ac09fc92b3ad" } }, "output_type": "display_data" } ], "source": [ "using Cropbox" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "application/vnd.webio.node+json": { "children": [], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": {}, "type": "node" }, "text/html": [ "
\n", "

The WebIO Jupyter extension was not detected. See the\n", "\n", " WebIO Jupyter integration documentation\n", "\n", "for more information.\n", "

\n" ], "text/plain": [ "WebIO._IJuliaInit()" ] }, "metadata": { "application/vnd.webio.node+json": { "kernelId": "493146c5-5720-442f-9dc7-ac09fc92b3ad" } }, "output_type": "display_data" } ], "source": [ "Cropbox.Interact.WebIO.setup(:ijulia)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.1. 복습" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "식물이 지수적 성장을 계속할 수는 없기 때문에 언젠가 성장이 둔화되는 상황을 표현해야 하는데요. Logistic 모형에서는 주어진 최종 생체량(`Wf`)에 따라 S자 형태로 성장이 둔화되도록 처리하여 해결하고자 하였습니다. 이와는 달리 Gompertz 모형에서는 성장률(`r`)이 시간에 따른 성장 효율 저하도(`α`)에 따라 감소하는 접근 방식을 택하고 있었습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align}\n", "\\frac{dW}{dt} &= r_t W_t \\\\\n", "\\frac{dr}{dt} &= -\\alpha r_t \\\\\n", "W_{t = 0} &= W_0 \\\\\n", "r_{t = 0} &= r_0\n", "\\end{align}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| 이름 | 값 | 단위 | 설명 |\n", "| :- | :- | :- | :- |\n", "| $\\alpha$ | 0.005 | $\\mathrm{d^{-1}}$ | 시간에 따른 성장 효율 저하도 |\n", "| $r_0$ | 0.05 | $\\mathrm{g}\\ \\mathrm{g^{-1}}\\ \\mathrm{d^{-1}}$ | 효율 저하 이전의 초기 최적 성장률 |\n", "| $r$ | - | $$\\mathrm{g}\\ \\mathrm{g^{-1}}\\ \\mathrm{d^{-1}}$$ | 상대성장률 |\n", "| $$W_0$$ | 0.25 | $\\mathrm{g}$ | 최초 생체량 |\n", "| $W$ | - | $\\mathrm{g}$ | 시간별 생체량 |\n", "| $t$ | - | $\\mathrm{d}$ | 시간 |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이쯤에서 지난 시간의 기억을 되살려 Gompertz 모형을 Cropbox 기반으로 다시 한번 만들어보겠습니다. 아래 모형 명세의 빈 부분(`#= .. =#`)에 해당하는 코드를 넣어주세요. 혹시 질문이 있다면 조교에게 도움을 요청하시면 됩니다." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Gompertz" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@system Gompertz(Controller) begin\n", " α: decay_rate ~ preserve(parameter, u\"d^-1\")\n", " r0: initial_growth_rate ~ preserve(parameter, u\"g/g/d\")\n", " W0: initial_biomass ~ #= ..=#(#= ..=#, u\"g\")\n", "\n", " r(r, α): growth_rate => (-α * r) ~ accumulate(init = r0, u\"g/g/d\")\n", " W(W, r): biomass => #= ..=# ~ #= ..=#(init = #= ..=#, #= ..=#)\n", "\n", " t(context.clock.time): time ~ track(u\"d\")\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "코드가 올바로 만들어졌다면 이제 모수에 따라 움직이는 그래프를 그려서 Gompertz 모형이 실제 어떤 식으로 작동하는지 살펴보겠습니다." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.webio.node+json": { "children": [ { "children": [ "Gompertz" ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "color": "darkorchid", "font-family": "monospace" } }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "α" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 21, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "14588642661043189906", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0.0\",\"0.001\",\"0.002\",\"0.003\",\"0.004\",\"0.005\",\"0.006\",\"0.007\",\"0.008\",\"0.009\",\"0.01\",\"0.011\",\"0.012\",\"0.013\",\"0.014\",\"0.015\",\"0.016\",\"0.017\",\"0.018\",\"0.019\",\"0.02\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"14588642661043189906\",\"id\":\"6098710840289131351\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"14588642661043189906\",\"id\":\"9579096839272937427\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"14588642661043189906\",\"id\":\"6098710840289131351\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"14588642661043189906\",\"id\":\"9579096839272937427\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "6098710840289131351", "sync": true, "value": 0 }, "index": { "id": "9579096839272937427", "sync": true, "value": 11 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "r0" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 11, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "10700459795276043925", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0.0\",\"0.01\",\"0.02\",\"0.03\",\"0.04\",\"0.05\",\"0.06\",\"0.07\",\"0.08\",\"0.09\",\"0.1\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"10700459795276043925\",\"id\":\"1859472155215303793\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"10700459795276043925\",\"id\":\"10205568862715532884\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"10700459795276043925\",\"id\":\"1859472155215303793\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"10700459795276043925\",\"id\":\"10205568862715532884\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "1859472155215303793", "sync": true, "value": 0 }, "index": { "id": "10205568862715532884", "sync": true, "value": 6 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "W0" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 91, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "7325322427042808174", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0.1\",\"0.11\",\"0.12\",\"0.13\",\"0.14\",\"0.15\",\"0.16\",\"0.17\",\"0.18\",\"0.19\",\"0.2\",\"0.21\",\"0.22\",\"0.23\",\"0.24\",\"0.25\",\"0.26\",\"0.27\",\"0.28\",\"0.29\",\"0.3\",\"0.31\",\"0.32\",\"0.33\",\"0.34\",\"0.35\",\"0.36\",\"0.37\",\"0.38\",\"0.39\",\"0.4\",\"0.41\",\"0.42\",\"0.43\",\"0.44\",\"0.45\",\"0.46\",\"0.47\",\"0.48\",\"0.49\",\"0.5\",\"0.51\",\"0.52\",\"0.53\",\"0.54\",\"0.55\",\"0.56\",\"0.57\",\"0.58\",\"0.59\",\"0.6\",\"0.61\",\"0.62\",\"0.63\",\"0.64\",\"0.65\",\"0.66\",\"0.67\",\"0.68\",\"0.69\",\"0.7\",\"0.71\",\"0.72\",\"0.73\",\"0.74\",\"0.75\",\"0.76\",\"0.77\",\"0.78\",\"0.79\",\"0.8\",\"0.81\",\"0.82\",\"0.83\",\"0.84\",\"0.85\",\"0.86\",\"0.87\",\"0.88\",\"0.89\",\"0.9\",\"0.91\",\"0.92\",\"0.93\",\"0.94\",\"0.95\",\"0.96\",\"0.97\",\"0.98\",\"0.99\",\"1.0\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"7325322427042808174\",\"id\":\"10742612507814512495\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"7325322427042808174\",\"id\":\"3642077574674211491\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"7325322427042808174\",\"id\":\"10742612507814512495\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"7325322427042808174\",\"id\":\"3642077574674211491\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "10742612507814512495", "sync": true, "value": 0 }, "index": { "id": "3642077574674211491", "sync": true, "value": 46 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "webio-observable", "setInnerHtml": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n t (d)\n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n 400\n \n \n \n \n \n \n W (g)\n \n \n \n\n\n \n \n \n\n\n" }, "type": "node" } ], "instanceArgs": { "handlers": { "obs-output": [ "function (value, scope) {\n scope.setInnerHTML(value);\n}\n" ] }, "id": "18168017979291482708", "imports": { "data": [], "type": "async_block" }, "mount_callbacks": [], "observables": { "obs-output": { "id": "8319227120794721804", "sync": false, "value": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n t (d)\n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n 400\n \n \n \n \n \n \n W (g)\n \n \n \n\n\n \n \n \n\n\n" } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "display": "flex", "flex-direction": "column" } }, "type": "node" }, "text/html": [ "\n", " \n", "\n" ], "text/plain": [ "WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[\"Gompertz\"], Dict{Symbol, Any}(:style => Dict{String, Any}(\"color\" => :darkorchid, \"font-family\" => \"monospace\"))), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"α\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 21, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "11, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x0000000170b85ee0, Task (runnable) @0x0000000170b85ee0), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.0\\\",\\\"0.001\\\",\\\"0.002\\\",\\\"0.003\\\",\\\"0.004\\\",\\\"0.005\\\",\\\"0.006\\\",\\\"0.007\\\",\\\"0.008\\\",\\\"0.009\\\",\\\"0.01\\\",\\\"0.011\\\",\\\"0.012\\\",\\\"0.013\\\",\\\"0.014\\\",\\\"0.015\\\",\\\"0.016\\\",\\\"0.017\\\",\\\"0.018\\\",\\\"0.019\\\",\\\"0.02\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"14588642661043189906\\\",\\\"id\\\":\\\"6098710840289131351\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"14588642661043189906\\\",\\\"id\\\":\\\"9579096839272937427\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"14588642661043189906\\\",\\\"id\\\":\\\"6098710840289131351\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"14588642661043189906\\\",\\\"id\\\":\\\"9579096839272937427\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"r0\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 11, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "6, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x0000000174973310, Task (runnable) @0x0000000174973310), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.0\\\",\\\"0.01\\\",\\\"0.02\\\",\\\"0.03\\\",\\\"0.04\\\",\\\"0.05\\\",\\\"0.06\\\",\\\"0.07\\\",\\\"0.08\\\",\\\"0.09\\\",\\\"0.1\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"10700459795276043925\\\",\\\"id\\\":\\\"1859472155215303793\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"10700459795276043925\\\",\\\"id\\\":\\\"10205568862715532884\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"10700459795276043925\\\",\\\"id\\\":\\\"1859472155215303793\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"10700459795276043925\\\",\\\"id\\\":\\\"10205568862715532884\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"W0\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 91, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "46, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x0000000174973530, Task (runnable) @0x0000000174973530), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.1\\\",\\\"0.11\\\",\\\"0.12\\\",\\\"0.13\\\",\\\"0.14\\\",\\\"0.15\\\",\\\"0.16\\\",\\\"0.17\\\",\\\"0.18\\\",\\\"0.19\\\",\\\"0.2\\\",\\\"0.21\\\",\\\"0.22\\\",\\\"0.23\\\",\\\"0.24\\\",\\\"0.25\\\",\\\"0.26\\\",\\\"0.27\\\",\\\"0.28\\\",\\\"0.29\\\",\\\"0.3\\\",\\\"0.31\\\",\\\"0.32\\\",\\\"0.33\\\",\\\"0.34\\\",\\\"0.35\\\",\\\"0.36\\\",\\\"0.37\\\",\\\"0.38\\\",\\\"0.39\\\",\\\"0.4\\\",\\\"0.41\\\",\\\"0.42\\\",\\\"0.43\\\",\\\"0.44\\\",\\\"0.45\\\",\\\"0.46\\\",\\\"0.47\\\",\\\"0.48\\\",\\\"0.49\\\",\\\"0.5\\\",\\\"0.51\\\",\\\"0.52\\\",\\\"0.53\\\",\\\"0.54\\\",\\\"0.55\\\",\\\"0.56\\\",\\\"0.57\\\",\\\"0.58\\\",\\\"0.59\\\",\\\"0.6\\\",\\\"0.61\\\",\\\"0.62\\\",\\\"0.63\\\",\\\"0.64\\\",\\\"0.65\\\",\\\"0.66\\\",\\\"0.67\\\",\\\"0.68\\\",\\\"0.69\\\",\\\"0.7\\\",\\\"0.71\\\",\\\"0.72\\\",\\\"0.73\\\",\\\"0.74\\\",\\\"0.75\\\",\\\"0.76\\\",\\\"0.77\\\",\\\"0.78\\\",\\\"0.79\\\",\\\"0.8\\\",\\\"0.81\\\",\\\"0.82\\\",\\\"0.83\\\",\\\"0.84\\\",\\\"0.85\\\",\\\"0.86\\\",\\\"0.87\\\",\\\"0.88\\\",\\\"0.89\\\",\\\"0.9\\\",\\\"0.91\\\",\\\"0.92\\\",\\\"0.93\\\",\\\"0.94\\\",\\\"0.95\\\",\\\"0.96\\\",\\\"0.97\\\",\\\"0.98\\\",\\\"0.99\\\",\\\"1.0\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"7325322427042808174\\\",\\\"id\\\":\\\"10742612507814512495\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"7325322427042808174\\\",\\\"id\\\":\\\"3642077574674211491\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"7325322427042808174\\\",\\\"id\\\":\\\"10742612507814512495\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"7325322427042808174\\\",\\\"id\\\":\\\"3642077574674211491\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), Observable{Cropbox.Plot{Gadfly.Plot}} with 0 listeners. Value:\n", "Gadfly.Plot(Gadfly.Layer[Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [0.55, 0.5511458333333333, 0.552293575394242, 0.5534432283663927, 0.5545947944341898, 0.5557482757827715, 0.5569036745980084, 0.5580609930665001, 0.5592202333755733, 0.5603813977132784 … 63.424648447324756, 63.43124764017109, 63.43784476969889, 63.44443983626741, 63.45103284023605, 63.457623781964436, 63.46421266181234, 63.470799480139746, 63.477384237306815, 63.483966933673884], :x => [0.0, 0.041666666666666664, 0.08333333333333333, 0.125, 0.16666666666666666, 0.20833333333333331, 0.25, 0.29166666666666663, 0.3333333333333333, 0.375 … 299.625, 299.66666666666663, 299.7083333333333, 299.75, 299.79166666666663, 299.8333333333333, 299.875, 299.91666666666663, 299.9583333333333, 300.0]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0)], nothing, Data(\n", " titles=Dict{Symbol, AbstractString}()\n", ")\n", ", Gadfly.ScaleElement[], Gadfly.StatisticElement[], Gadfly.Coord.Cartesian([:x, :xmin, :xmax, :xintercept], [:y, :ymin, :ymax, :yintercept, :middle, :lower_hinge, :upper_hinge, :lower_fence, :upper_fence, :outliers], 0.0, 300.0, 0, 400, false, false, false, nothing, false), Gadfly.GuideElement[Gadfly.Guide.Title(\"\"), Gadfly.Guide.XLabel(\"t (d)\", :auto), Gadfly.Guide.YLabel(\"W (g)\", :auto)], Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), Dict{Symbol, Any}())], Dict{Symbol, Any}(:style => Dict(\"display\" => \"flex\", \"flex-direction\" => \"column\")))" ] }, "execution_count": 4, "metadata": { "application/vnd.webio.node+json": { "kernelId": "493146c5-5720-442f-9dc7-ac09fc92b3ad" } }, "output_type": "execute_result" } ], "source": [ "manipulate(Gompertz, :t, :W;\n", " parameters = :Gompertz => (;\n", " α = 0:0.001:0.02,\n", " r0 = 0:0.01:0.1,\n", " W0 = 0.1:0.01:1,\n", " ),\n", " stop = 300u\"d\",\n", " kind = :line,\n", " ylim = (0, 400),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "여기서 눈여겨보아야 할 것은 성장률(`r`)입니다. 성장 효율 저하도(`α`)에 따라 감소하도록 되어 있는 이 성장률은 실제 식물 성장에서 어떤 의미가 있는 것일까요?" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.webio.node+json": { "children": [ { "children": [ "Gompertz" ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "color": "darkorchid", "font-family": "monospace" } }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "α" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 21, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "12909969601953528993", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0.0\",\"0.001\",\"0.002\",\"0.003\",\"0.004\",\"0.005\",\"0.006\",\"0.007\",\"0.008\",\"0.009\",\"0.01\",\"0.011\",\"0.012\",\"0.013\",\"0.014\",\"0.015\",\"0.016\",\"0.017\",\"0.018\",\"0.019\",\"0.02\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"12909969601953528993\",\"id\":\"16321921269119418258\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"12909969601953528993\",\"id\":\"4879434073571425683\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"12909969601953528993\",\"id\":\"16321921269119418258\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"12909969601953528993\",\"id\":\"4879434073571425683\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "16321921269119418258", "sync": true, "value": 0 }, "index": { "id": "4879434073571425683", "sync": true, "value": 11 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "r0" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 11, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "11468972983591637113", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0.0\",\"0.01\",\"0.02\",\"0.03\",\"0.04\",\"0.05\",\"0.06\",\"0.07\",\"0.08\",\"0.09\",\"0.1\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"11468972983591637113\",\"id\":\"17983560251037897085\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"11468972983591637113\",\"id\":\"6966581122174699984\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"11468972983591637113\",\"id\":\"17983560251037897085\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"11468972983591637113\",\"id\":\"6966581122174699984\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "17983560251037897085", "sync": true, "value": 0 }, "index": { "id": "6966581122174699984", "sync": true, "value": 6 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "webio-observable", "setInnerHtml": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n t (d)\n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0.00\n \n \n \n \n 0.05\n \n \n \n \n 0.10\n \n \n \n \n \n \n r (d⁻¹)\n \n \n \n\n\n \n \n \n\n\n" }, "type": "node" } ], "instanceArgs": { "handlers": { "obs-output": [ "function (value, scope) {\n scope.setInnerHTML(value);\n}\n" ] }, "id": "14150531704708983466", "imports": { "data": [], "type": "async_block" }, "mount_callbacks": [], "observables": { "obs-output": { "id": "6378299309484452326", "sync": false, "value": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n t (d)\n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0.00\n \n \n \n \n 0.05\n \n \n \n \n 0.10\n \n \n \n \n \n \n r (d⁻¹)\n \n \n \n\n\n \n \n \n\n\n" } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "display": "flex", "flex-direction": "column" } }, "type": "node" }, "text/html": [ "\n", " \n", "\n" ], "text/plain": [ "WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[\"Gompertz\"], Dict{Symbol, Any}(:style => Dict{String, Any}(\"color\" => :darkorchid, \"font-family\" => \"monospace\"))), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"α\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 21, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "11, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x0000000174932dc0, Task (runnable) @0x0000000174932dc0), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.0\\\",\\\"0.001\\\",\\\"0.002\\\",\\\"0.003\\\",\\\"0.004\\\",\\\"0.005\\\",\\\"0.006\\\",\\\"0.007\\\",\\\"0.008\\\",\\\"0.009\\\",\\\"0.01\\\",\\\"0.011\\\",\\\"0.012\\\",\\\"0.013\\\",\\\"0.014\\\",\\\"0.015\\\",\\\"0.016\\\",\\\"0.017\\\",\\\"0.018\\\",\\\"0.019\\\",\\\"0.02\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"12909969601953528993\\\",\\\"id\\\":\\\"16321921269119418258\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"12909969601953528993\\\",\\\"id\\\":\\\"4879434073571425683\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"12909969601953528993\\\",\\\"id\\\":\\\"16321921269119418258\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"12909969601953528993\\\",\\\"id\\\":\\\"4879434073571425683\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"r0\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 11, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "6, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x00000001749330f0, Task (runnable) @0x00000001749330f0), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.0\\\",\\\"0.01\\\",\\\"0.02\\\",\\\"0.03\\\",\\\"0.04\\\",\\\"0.05\\\",\\\"0.06\\\",\\\"0.07\\\",\\\"0.08\\\",\\\"0.09\\\",\\\"0.1\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"11468972983591637113\\\",\\\"id\\\":\\\"17983560251037897085\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"11468972983591637113\\\",\\\"id\\\":\\\"6966581122174699984\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"11468972983591637113\\\",\\\"id\\\":\\\"17983560251037897085\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"11468972983591637113\\\",\\\"id\\\":\\\"6966581122174699984\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), Observable{Cropbox.Plot{Gadfly.Plot}} with 0 listeners. Value:\n", "Gadfly.Plot(Gadfly.Layer[Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [0.05, 0.04997916666666667, 0.04995834201388889, 0.049937526038049775, 0.04991671873553392, 0.04989592010272745, 0.04987513013601798, 0.04985434883179464, 0.049833576186448056, 0.04981281219637037 … 0.002497146333312398, 0.002496105855673518, 0.002495065811566987, 0.0024940262008121676, 0.002492987023228496, 0.002491948278635484, 0.0024909099668527193, 0.002489872087699864, 0.0024888346409966556, 0.002487797626562907], :x => [0.0, 0.041666666666666664, 0.08333333333333333, 0.125, 0.16666666666666666, 0.20833333333333331, 0.25, 0.29166666666666663, 0.3333333333333333, 0.375 … 299.625, 299.66666666666663, 299.7083333333333, 299.75, 299.79166666666663, 299.8333333333333, 299.875, 299.91666666666663, 299.9583333333333, 300.0]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0)], nothing, Data(\n", " titles=Dict{Symbol, AbstractString}()\n", ")\n", ", Gadfly.ScaleElement[], Gadfly.StatisticElement[], Gadfly.Coord.Cartesian([:x, :xmin, :xmax, :xintercept], [:y, :ymin, :ymax, :yintercept, :middle, :lower_hinge, :upper_hinge, :lower_fence, :upper_fence, :outliers], 0.0, 300.0, 0.0, 0.1, false, false, false, nothing, false), Gadfly.GuideElement[Gadfly.Guide.Title(\"\"), Gadfly.Guide.XLabel(\"t (d)\", :auto), Gadfly.Guide.YLabel(\"r (d⁻¹)\", :auto)], Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), Dict{Symbol, Any}())], Dict{Symbol, Any}(:style => Dict(\"display\" => \"flex\", \"flex-direction\" => \"column\")))" ] }, "execution_count": 5, "metadata": { "application/vnd.webio.node+json": { "kernelId": "493146c5-5720-442f-9dc7-ac09fc92b3ad" } }, "output_type": "execute_result" } ], "source": [ "manipulate(Gompertz, :t, :r;\n", " config = :Gompertz => (;\n", " W0 = 0.25,\n", " ),\n", " parameters = :Gompertz => (;\n", " α = 0:0.001:0.02,\n", " r0 = 0:0.01:0.1,\n", " ),\n", " stop = 300u\"d\",\n", " kind = :line,\n", " ylim = (0, 0.1),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.2. 성장률(`r`) 분해" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "식물 성장에 중요한 영향을 미치는 생리적 현상에는 먼저 광합성과 호흡을 생각해볼 수 있습니다. 광합성(photosynthesis)은 대기중의 이산화탄소($\\mathrm{CO_2}$)을 흡수하여 탄수화물(carbohydrate)를 만들어냅니다. 이렇게 만들어진 탄수화물은 호흡(respiration)을 통해 분해되어 식물체를 유지하기 위한 에너지로 쓰이거나, 새로운 생체량을 만들어내는데 사용됩니다. 이때 전자를 유지호흡(maintenance respiration), 후자를 성장호흡(growth respiration)이라고 구분하는데요. 지금까지 여러가지 성장 곡선으로 표현하고자 하였던 것이 바로 이 성장호흡 부분 되겠습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2.1. 광합성(`A`)과 호흡(`R`) 분리" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "식물이 성장하기 위해 필요한 기질(substrate)은 광합성을 통해 생성되고, 이중에서 현상유지를 위해 필요한 만큼 유지호흡으로 먼저 사용된다고 가정하면, 그 나머지가 실제 성장을 위해 사용될 것입니다. 이때 광합성 산물인 탄수화물이 100% 그대로 식물의 구조로 변환될 수는 없기 때문에 변환효율을 고려하도록 하겠습니다. 그 결과, 성장률(`r`)은 아래와 같이 광합성(`A`)과 호흡(`R`)의 차이, 그리고 그 변환효율(`c`)로 표현할 수 있습니다. 여기서는 수식을 많이 단순화하였지만 보다 자세한 내용이 궁금하시다면 [Thornley (1970)](https://doi.org/10.1038/227304b0)를 참고해보세요." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "r = c \\cdot (A - R)\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| 이름      | 값 | 단위 | 설명 |\n", "| :- | :- | :- | :- |\n", "| $c$ | - | | 기질 변환효율 |\n", "| $A$ | 0.4 | $$\\mathrm{g}\\ \\mathrm{g^{-1}}\\ \\mathrm{d^{-1}}$$ | 탄수화물 등 기질 생산률 |\n", "| $R$ | 0.015 | $\\mathrm{g}\\ \\mathrm{g^{-1}}\\ \\mathrm{d^{-1}}$ | 유지호흡률 |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "여기서 변환효율은 조금 더 자세히 표현해보도록 하겠습니다. 성장을 통해 새로 만들어지는 구조물을 만들기 위한 재료는 결국 광합성 산물인 탄수화물($\\mathrm{CH_2O}$)에서 유래하게 되는데요. 이 구조물의 상당 부분이 탄소($\\mathrm{C}$)로 구성되어 있다고 가정할 때 1만큼의 탄수화물이 얼마만큼의 생체량으로 변환되는지 그 비율($c_0$)을 생각해볼 수 있습니다. 또한 위에서 언급했던 것처럼 변환 과정 자체의 효율($Y$)을 고려하여 실제 변환비율($c$)은 아래와 같이 정의하겠습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "c = Y c_0\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| 이름 | 값 | 단위 | 설명 |\n", "| :- | :- | :- | :- |\n", "| $Y$ | 0.75 | - | 생체량 변환 과정의 효율 |\n", "| $c_0$ | 0.889 | - | 생체량의 45%가 탄수화물($\\mathrm{CH_2O}$)의 탄소($\\mathrm{C}$)에서 유래한다고 가정할 때의 변환비율 ($\\frac{\\frac{12\\ \\mathrm{g}\\ \\mathrm{mol^{-1}}}{30\\ \\mathrm{g}\\ \\mathrm{mol^{-1}}}}{0.45}$) |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이제 위의 수식을 모형 명세로 표현해보겠습니다. 우선 생체량(`W`) 관련 변수들은 이전과 동일한 형태로 들어갑니다.\n", "\n", "$$\n", "\\begin{align}\n", "\\frac{dW}{dt} &= r W_t \\\\\n", "W_{t = 0} &= W_0\n", "\\end{align}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| 이름 | 값 | 단위 | 설명 |\n", "| :- | :- | :- | :- |\n", "| $t$ | - | $\\mathrm{d}$ | 시간 |\n", "| $r$ | - | $$\\mathrm{g}\\ \\mathrm{g^{-1}}\\ \\mathrm{d^{-1}}$$ | 상대성장률 |\n", "| $$W_0$$ | 0.25 | $\\mathrm{g}$ | 최초 생체량 |\n", "| $W$ | - | $\\mathrm{g}$ | 시간별 생체량 |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "새로 추가되는 부분은 상대성장률(`r`)을 광합성(`A`)과 호흡(`R`), 그리고 변환효율(`c`) 관련 변수들입니다." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Growth0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@system Growth0(Controller) begin\n", " t(context.clock.time) ~ track(u\"d\")\n", "\n", " W0: initial_biomass => 0.25 ~ preserve(parameter, u\"g\")\n", " W(r, W): biomass => r * W ~ accumulate(init = W0, u\"g\")\n", "\n", " Y: growth_yield => 0.75 ~ preserve(parameter)\n", " c0: potential_conversion_factor => 0.889 ~ preserve(parameter)\n", " c(c0, Y): conversion_factor => #= ..=# ~ track\n", "\n", " A: assimilation_rate => 0.4 ~ preserve(parameter, u\"g/g/d\")\n", " R: respiration_rate => 0.015 ~ preserve(parameter, u\"g/g/d\")\n", "\n", " r(c, A, R): growth_rate => #= ..=# ~ track(u\"g/g/d\")\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "변수들간의 관계도를 `Cropbox.dependency()` 함수를 이용해 그려보겠습니다. 이 관계도를 통해 각 변수들이 서로 어떻게 관련되어 있는지 확인해볼 수 있습니다. 예를 들어 생장률(`r`)은 광합성(`A`), 호흡(`R`), 변환비율(`c`)에 기반하여 계산된다는 것을 화살표의 연결 방향으로 알 수 있습니다." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "%3\n", "\n", "\n", "\n", "1\n", "∘context\n", "\n", "\n", "\n", "2\n", "context\n", "\n", "\n", "\n", "1->2\n", "\n", "\n", "\n", "\n", "\n", "3\n", "⋆context\n", "\n", "\n", "\n", "2->3\n", "\n", "\n", "\n", "\n", "\n", "5\n", "t\n", "\n", "\n", "\n", "2->5\n", "\n", "\n", "\n", "\n", "\n", "7\n", "W\n", "\n", "\n", "\n", "2->7\n", "\n", "\n", "\n", "\n", "\n", "8\n", "⋆W\n", "\n", "\n", "\n", "2->8\n", "\n", "\n", "\n", "\n", "\n", "4\n", "config\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "\n", "\n", "\n", "4->3\n", "\n", "\n", "\n", "\n", "\n", "6\n", "W0\n", "\n", "\n", "\n", "4->6\n", "\n", "\n", "\n", "\n", "\n", "10\n", "Y\n", "\n", "\n", "\n", "4->10\n", "\n", "\n", "\n", "\n", "\n", "11\n", "c0\n", "\n", "\n", "\n", "4->11\n", "\n", "\n", "\n", "\n", "\n", "13\n", "A\n", "\n", "\n", "\n", "4->13\n", "\n", "\n", "\n", "\n", "\n", "14\n", "R\n", "\n", "\n", "\n", "4->14\n", "\n", "\n", "\n", "\n", "\n", "5->3\n", "\n", "\n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "\n", "\n", "\n", "6->8\n", "\n", "\n", "\n", "\n", "\n", "7->3\n", "\n", "\n", "\n", "\n", "\n", "7->8\n", "\n", "\n", "\n", "\n", "\n", "8->3\n", "\n", "\n", "\n", "\n", "\n", "9\n", "r\n", "\n", "\n", "\n", "9->8\n", "\n", "\n", "\n", "\n", "\n", "12\n", "c\n", "\n", "\n", "\n", "10->12\n", "\n", "\n", "\n", "\n", "\n", "11->12\n", "\n", "\n", "\n", "\n", "\n", "12->9\n", "\n", "\n", "\n", "\n", "\n", "13->9\n", "\n", "\n", "\n", "\n", "\n", "14->9\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "\u001b[90m[\u001b[39m\u001b[94mconfig\u001b[39m\u001b[90m → \u001b[39m\u001b[94mR\u001b[39m\u001b[90m → \u001b[39m\u001b[94mA\u001b[39m\u001b[90m → \u001b[39m\u001b[94mc0\u001b[39m\u001b[90m → \u001b[39m\u001b[94mY\u001b[39m\u001b[90m → \u001b[39m\u001b[94mc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mr\u001b[39m\u001b[90m → \u001b[39m\u001b[94mW0\u001b[39m\u001b[90m → \u001b[39m\u001b[94m∘context\u001b[39m\u001b[90m → \u001b[39m\u001b[94mcontext\u001b[39m\u001b[90m → \u001b[39m\u001b[94mW\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆W\u001b[39m\u001b[90m → \u001b[39m\u001b[94mt\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆context\u001b[39m\u001b[90m]\u001b[39m" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Cropbox.dependency(Growth0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "방금 만든 시스템에 정의되어 있는 모수들을 확인하기 위해 `parameters()` 함수를 호출하면 해당 값들이 담긴 설정(configuration)을 만들어낼 수 있습니다." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Config for 1 system:\n", " \u001b[95mGrowth0\u001b[39m\n", " \u001b[94mW0\u001b[39m\u001b[90m = \u001b[39m0.25 g\n", " \u001b[94mY \u001b[39m\u001b[90m = \u001b[39m0.75\n", " \u001b[94mc0\u001b[39m\u001b[90m = \u001b[39m0.889\n", " \u001b[94mA \u001b[39m\u001b[90m = \u001b[39m0.4 d⁻¹\n", " \u001b[94mR \u001b[39m\u001b[90m = \u001b[39m0.015 d⁻¹" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parameters(Growth0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "그럼 이제 모의를 수행해보겠습니다. `simulate()`로 모의를 따로 진행하지 않고, `visualize()` 함수를 이용하여 모의를 수행하여 그대로 그래프를 그려보았습니다. 300일간의 생체량(`W`) 변화입니다." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.00×10³²\n", " \n", " \n", " \n", " \n", " 2.00×10³²\n", " \n", " \n", " \n", " \n", " 3.00×10³²\n", " \n", " \n", " \n", " \n", " 4.00×10³²\n", " \n", " \n", " \n", " \n", " \n", " \n", " W (g)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 1.00×10³²\n", " \n", " \n", " \n", " \n", " 2.00×10³²\n", " \n", " \n", " \n", " \n", " 3.00×10³²\n", " \n", " \n", " \n", " \n", " 4.00×10³²\n", " \n", " \n", " \n", " \n", " \n", " \n", " W (g)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Growth0, :t, :W;\n", " stop = 300u\"d\",\n", " kind = :line,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "지난 시간에 보았던 지수적(exponential) 성장곡선처럼 비현실적인 증가를 보이고 있습니다. 상대성장률(`r`)이 항상 같은 값으로 고정되어 있기 때문에 끝없이 성장을 하기 때문입니다. 그래프로 확인해보겠습니다." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " 0.2\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", " \n", " \n", " 0.4\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " \n", " \n", " r (d⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " 0.2\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", " \n", " \n", " 0.4\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " \n", " \n", " r (d⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Growth0, :t, :r;\n", " stop = 300u\"d\",\n", " kind = :line,\n", " ylim = (0, 0.5),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2.2. 성장 저하 1안 - 변환효율 (`Y`)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "그럼 이제 모형을 조금씩 수정하며 보다 현실적으로 만들어보겠습니다. 시간에 따라 성장률(`r`)이 감소하도록 앞서 복습했던 Gompertz 모형의 효율 저하도(decay rate) 개념을 도입해보겠습니다.\n", "\n", "$$r = c \\cdot (A - R)$$\n", "\n", "성장률(`r`)은 좌측의 변환비율(`c`)과 우측의 광합성(`A`), 호흡(`R`) 차이의 두 부분으로 구성되는데요. 이중에서 먼저 변환비율(`c`)에 효율 저하도(`α`)를 적용해보겠습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align}\n", "\\frac{dY}{dt} &= -\\alpha Y_t \\\\\n", "Y_{t = 0} &= Y_0\n", "\\end{align}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| 이름 | 값 | 단위   | 설명 |\n", "| :- | :- | :- | :- |\n", "| $\\alpha$ | 0.03 | $\\mathrm{d^{-1}}$ | 시간에 따른 성장 효율 저하도 |\n", "| $Y_0$ | 0.75 | - | 효율 저하 이전의 최적 변환효율 |\n", "| $Y$ | - | - | 시간에 따라 저하되는 실제 생체량 변환효율 |" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Growth1" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@system Growth1(Growth0, Controller) begin\n", " α: decary_rate => 0.03 ~ preserve(parameter, u\"d^-1\")\n", " Y0: potential_growth_yield => 0.75 ~ preserve(parameter)\n", " Y(α, Y): growth_yield => #= ..=# ~ accumulate(init = #= ..=#)\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "변환효율(`Y`)가 이제는 더 이상 고정된 모수가 아니라 매번 갱신되는 상태변수로 바뀌었습니다. 대신 효율 저하도(`α`)와 최적 변환효율(`Y0`)이 새로운 모수로 들어갔습니다." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "%3\n", "\n", "\n", "\n", "1\n", "∘context\n", "\n", "\n", "\n", "2\n", "context\n", "\n", "\n", "\n", "1->2\n", "\n", "\n", "\n", "\n", "\n", "3\n", "⋆context\n", "\n", "\n", "\n", "2->3\n", "\n", "\n", "\n", "\n", "\n", "5\n", "t\n", "\n", "\n", "\n", "2->5\n", "\n", "\n", "\n", "\n", "\n", "7\n", "W\n", "\n", "\n", "\n", "2->7\n", "\n", "\n", "\n", "\n", "\n", "8\n", "⋆W\n", "\n", "\n", "\n", "2->8\n", "\n", "\n", "\n", "\n", "\n", "10\n", "Y\n", "\n", "\n", "\n", "2->10\n", "\n", "\n", "\n", "\n", "\n", "11\n", "⋆Y\n", "\n", "\n", "\n", "2->11\n", "\n", "\n", "\n", "\n", "\n", "4\n", "config\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "\n", "\n", "\n", "4->3\n", "\n", "\n", "\n", "\n", "\n", "6\n", "W0\n", "\n", "\n", "\n", "4->6\n", "\n", "\n", "\n", "\n", "\n", "12\n", "Y0\n", "\n", "\n", "\n", "4->12\n", "\n", "\n", "\n", "\n", "\n", "13\n", "α\n", "\n", "\n", "\n", "4->13\n", "\n", "\n", "\n", "\n", "\n", "14\n", "c0\n", "\n", "\n", "\n", "4->14\n", "\n", "\n", "\n", "\n", "\n", "16\n", "A\n", "\n", "\n", "\n", "4->16\n", "\n", "\n", "\n", "\n", "\n", "17\n", "R\n", "\n", "\n", "\n", "4->17\n", "\n", "\n", "\n", "\n", "\n", "5->3\n", "\n", "\n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "\n", "\n", "\n", "6->8\n", "\n", "\n", "\n", "\n", "\n", "7->3\n", "\n", "\n", "\n", "\n", "\n", "7->8\n", "\n", "\n", "\n", "\n", "\n", "8->3\n", "\n", "\n", "\n", "\n", "\n", "9\n", "r\n", "\n", "\n", "\n", "9->8\n", "\n", "\n", "\n", "\n", "\n", "10->3\n", "\n", "\n", "\n", "\n", "\n", "10->11\n", "\n", "\n", "\n", "\n", "\n", "15\n", "c\n", "\n", "\n", "\n", "10->15\n", "\n", "\n", "\n", "\n", "\n", "11->3\n", "\n", "\n", "\n", "\n", "\n", "12->10\n", "\n", "\n", "\n", "\n", "\n", "12->11\n", "\n", "\n", "\n", "\n", "\n", "13->11\n", "\n", "\n", "\n", "\n", "\n", "14->15\n", "\n", "\n", "\n", "\n", "\n", "15->9\n", "\n", "\n", "\n", "\n", "\n", "16->9\n", "\n", "\n", "\n", "\n", "\n", "17->9\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "\u001b[90m[\u001b[39m\u001b[94mconfig\u001b[39m\u001b[90m → \u001b[39m\u001b[94mR\u001b[39m\u001b[90m → \u001b[39m\u001b[94mA\u001b[39m\u001b[90m → \u001b[39m\u001b[94mc0\u001b[39m\u001b[90m → \u001b[39m\u001b[94mα\u001b[39m\u001b[90m → \u001b[39m\u001b[94mY0\u001b[39m\u001b[90m → \u001b[39m\u001b[94mW0\u001b[39m\u001b[90m → \u001b[39m\u001b[94m∘context\u001b[39m\u001b[90m → \u001b[39m\u001b[94mcontext\u001b[39m\u001b[90m → \u001b[39m\u001b[94mY\u001b[39m\u001b[90m → \u001b[39m\u001b[94mc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mr\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆Y\u001b[39m\u001b[90m → \u001b[39m\u001b[94mW\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆W\u001b[39m\u001b[90m → \u001b[39m\u001b[94mt\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆context\u001b[39m\u001b[90m]\u001b[39m" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Cropbox.dependency(Growth1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이제 생체량(`W`) 변화가 앞선 보았던 Gompertz 성장곡선과 유사한 형태가 되었습니다." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 500\n", " \n", " \n", " \n", " \n", " 1000\n", " \n", " \n", " \n", " \n", " \n", " \n", " W (g)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 500\n", " \n", " \n", " \n", " \n", " 1000\n", " \n", " \n", " \n", " \n", " \n", " \n", " W (g)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Growth1, :t, :W;\n", " stop = 300u\"d\",\n", " kind = :line,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "성장률(`r`)이 시간에 따라 아래와 같이 감소하기 때문입니다." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " 0.2\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", " \n", " \n", " 0.4\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " \n", " \n", " r (d⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " 0.2\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", " \n", " \n", " 0.4\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " \n", " \n", " r (d⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Growth1, :t, :r;\n", " stop = 300u\"d\",\n", " kind = :line,\n", " ylim = (0, 0.5),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "직접적으로는 변환효율(`Y`)이 감소하는 영향이 그대로 반영되고 있기 때문입니다." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " Y\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " Y\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Growth1, :t, :Y;\n", " stop = 300u\"d\",\n", " kind = :line,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "대신 광합성(`A`)과 호흡(`R`)에는 아무런 변화가 없습니다. 과연 식물 성장에 따라 단위 생체량 기준 광합성과 호흡량에 아무런 변화가 없는 것은 괜찮을까요?" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " A\n", " \n", " \n", " \n", " \n", " R\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " 0.2\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", " \n", " \n", " 0.4\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " \n", " \n", " (d⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " A\n", " \n", " \n", " \n", " \n", " R\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " 0.2\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", " \n", " \n", " 0.4\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " \n", " \n", " (d⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Growth1, :t, [:A, :R];\n", " stop = 300u\"d\",\n", " kind = :line,\n", " ylim = (0, 0.5),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2.3. 성장 저하 2안 - 광합성(`A`)과 호흡(`R`)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이번에는 변환효율(`Y`) 대신 광합성(`A`)과 호흡(`R`) 자체의 효율이 시간에 따라 감소한다고 가정해보겠습니다. 앞에서와 동일하게 효율 저하도(`α`)를 추가해보세요. 참고로 `α`(a가 아닌 알파)를 입력하려면 `\\alpha`라고 친 다음 탭(tab)키를 누르시면 됩니다." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Growth2" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@system Growth2(Growth0, Controller) begin\n", " α: decary_rate => 0.03 ~ preserve(parameter, u\"d^-1\")\n", "\n", " Amax: maximum_assimilation_rate => 0.4 ~ preserve(parameter, u\"g/g/d\")\n", " Rmax: maximum_respiration_rate => 0.015 ~ preserve(parameter, u\"g/g/d\")\n", "\n", " A(α, A): assimilation_rate => -α * A ~ accumulate(init = Amax, u\"g/g/d\")\n", " R(#= ..=#): respiration_rate => #= ..=# ~ accumulate(init = #= ..=#, u\"g/g/d\")\n", "end" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "%3\n", "\n", "\n", "\n", "1\n", "∘context\n", "\n", "\n", "\n", "2\n", "context\n", "\n", "\n", "\n", "1->2\n", "\n", "\n", "\n", "\n", "\n", "3\n", "⋆context\n", "\n", "\n", "\n", "2->3\n", "\n", "\n", "\n", "\n", "\n", "5\n", "t\n", "\n", "\n", "\n", "2->5\n", "\n", "\n", "\n", "\n", "\n", "7\n", "W\n", "\n", "\n", "\n", "2->7\n", "\n", "\n", "\n", "\n", "\n", "8\n", "⋆W\n", "\n", "\n", "\n", "2->8\n", "\n", "\n", "\n", "\n", "\n", "13\n", "A\n", "\n", "\n", "\n", "2->13\n", "\n", "\n", "\n", "\n", "\n", "14\n", "⋆A\n", "\n", "\n", "\n", "2->14\n", "\n", "\n", "\n", "\n", "\n", "17\n", "R\n", "\n", "\n", "\n", "2->17\n", "\n", "\n", "\n", "\n", "\n", "18\n", "⋆R\n", "\n", "\n", "\n", "2->18\n", "\n", "\n", "\n", "\n", "\n", "4\n", "config\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "\n", "\n", "\n", "4->3\n", "\n", "\n", "\n", "\n", "\n", "6\n", "W0\n", "\n", "\n", "\n", "4->6\n", "\n", "\n", "\n", "\n", "\n", "10\n", "Y\n", "\n", "\n", "\n", "4->10\n", "\n", "\n", "\n", "\n", "\n", "11\n", "c0\n", "\n", "\n", "\n", "4->11\n", "\n", "\n", "\n", "\n", "\n", "15\n", "Amax\n", "\n", "\n", "\n", "4->15\n", "\n", "\n", "\n", "\n", "\n", "16\n", "α\n", "\n", "\n", "\n", "4->16\n", "\n", "\n", "\n", "\n", "\n", "19\n", "Rmax\n", "\n", "\n", "\n", "4->19\n", "\n", "\n", "\n", "\n", "\n", "5->3\n", "\n", "\n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "\n", "\n", "\n", "6->8\n", "\n", "\n", "\n", "\n", "\n", "7->3\n", "\n", "\n", "\n", "\n", "\n", "7->8\n", "\n", "\n", "\n", "\n", "\n", "8->3\n", "\n", "\n", "\n", "\n", "\n", "9\n", "r\n", "\n", "\n", "\n", "9->8\n", "\n", "\n", "\n", "\n", "\n", "12\n", "c\n", "\n", "\n", "\n", "10->12\n", "\n", "\n", "\n", "\n", "\n", "11->12\n", "\n", "\n", "\n", "\n", "\n", "12->9\n", "\n", "\n", "\n", "\n", "\n", "13->3\n", "\n", "\n", "\n", "\n", "\n", "13->9\n", "\n", "\n", "\n", "\n", "\n", "13->14\n", "\n", "\n", "\n", "\n", "\n", "14->3\n", "\n", "\n", "\n", "\n", "\n", "15->13\n", "\n", "\n", "\n", "\n", "\n", "15->14\n", "\n", "\n", "\n", "\n", "\n", "16->14\n", "\n", "\n", "\n", "\n", "\n", "16->18\n", "\n", "\n", "\n", "\n", "\n", "17->3\n", "\n", "\n", "\n", "\n", "\n", "17->9\n", "\n", "\n", "\n", "\n", "\n", "17->18\n", "\n", "\n", "\n", "\n", "\n", "18->3\n", "\n", "\n", "\n", "\n", "\n", "19->17\n", "\n", "\n", "\n", "\n", "\n", "19->18\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "\u001b[90m[\u001b[39m\u001b[94mconfig\u001b[39m\u001b[90m → \u001b[39m\u001b[94mRmax\u001b[39m\u001b[90m → \u001b[39m\u001b[94mα\u001b[39m\u001b[90m → \u001b[39m\u001b[94mAmax\u001b[39m\u001b[90m → \u001b[39m\u001b[94mc0\u001b[39m\u001b[90m → \u001b[39m\u001b[94mY\u001b[39m\u001b[90m → \u001b[39m\u001b[94mc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mW0\u001b[39m\u001b[90m → \u001b[39m\u001b[94m∘context\u001b[39m\u001b[90m → \u001b[39m\u001b[94mcontext\u001b[39m\u001b[90m → \u001b[39m\u001b[94mR\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆R\u001b[39m\u001b[90m → \u001b[39m\u001b[94mA\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆A\u001b[39m\u001b[90m → \u001b[39m\u001b[94mr\u001b[39m\u001b[90m → \u001b[39m\u001b[94mW\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆W\u001b[39m\u001b[90m → \u001b[39m\u001b[94mt\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆context\u001b[39m\u001b[90m]\u001b[39m" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Cropbox.dependency(Growth2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이제 생체량(`W`) 변화를 확인해보겠습니다. 내부적으로는 다른 가정으로 접근하였지만 전반적인 변화의 양상은 동일하게 나오고 있습니다." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 500\n", " \n", " \n", " \n", " \n", " 1000\n", " \n", " \n", " \n", " \n", " \n", " \n", " W (g)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 500\n", " \n", " \n", " \n", " \n", " 1000\n", " \n", " \n", " \n", " \n", " \n", " \n", " W (g)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Growth2, :t, :W;\n", " stop = 300u\"d\",\n", " kind = :line,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "마찬가지로 성장률(`r`)의 감소 역시 확인해보겠습니다." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " 0.2\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", " \n", " \n", " 0.4\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " \n", " \n", " r (d⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " 0.2\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", " \n", " \n", " 0.4\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " \n", " \n", " r (d⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Growth2, :t, :r;\n", " stop = 300u\"d\",\n", " kind = :line,\n", " ylim = (0, 0.5),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이러한 성장률의 감소는 변환효율(`Y`)에 의한 것이 아닙니다." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " Y\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " 1.0\n", " \n", " \n", " \n", " \n", " \n", " \n", " Y\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Growth2, :t, :Y;\n", " stop = 300u\"d\",\n", " kind = :line,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "단위 생체량 기준 광합성(`A`)과 호흡(`R`)량을 그려보면 이전과 달리 시간에 따라 감소하는 것을 확인할 수 있습니다." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " A\n", " \n", " \n", " \n", " \n", " R\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " 0.2\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", " \n", " \n", " 0.4\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " \n", " \n", " (d⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " t (d)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 100\n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 300\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " A\n", " \n", " \n", " \n", " \n", " R\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0.0\n", " \n", " \n", " \n", " \n", " 0.1\n", " \n", " \n", " \n", " \n", " 0.2\n", " \n", " \n", " \n", " \n", " 0.3\n", " \n", " \n", " \n", " \n", " 0.4\n", " \n", " \n", " \n", " \n", " 0.5\n", " \n", " \n", " \n", " \n", " \n", " \n", " (d⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Growth2, :t, [:A, :R];\n", " stop = 300u\"d\",\n", " kind = :line,\n", " ylim = (0, 0.5),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "사실 위의 두가지 접근 방식은 수식에서 값을 어떤 위치에서 곱해주는지의 차이일뿐이며 그 결과 정리된 수식은 동일합니다. 하지만 각 변수가 어떤 의미를 가지고 어떤 기작에 의해 설명되는지 분명한 차이가 있을 수 있다는 점은 기억해주세요. 잘 정의된 모형은 이후 수정하거나 확장하기에도 수월합니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2.4. 분배 (partitioning)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "위의 모형에서는 식물의 성장이 전체 생체량에 비례해서 이루어진다고 가정하였지만, 실제로는 잎에서 생성된 동화산물이 다른 부위에 얼마만큼씩 분배되어 사용되는지에 따라 실제 관측되는 성장의 형태는 크게 달라질 수 있습니다. 특히 동화산물은 잎의 광합성에 의해 생성되므로 잎이 전체 식물에서 차지하는 비중에 따라 그 생산량도 달라질 것입니다. 그리고 성장 단계에 따라 영양성장(vegetative growth) 시기에는 많은 부분이 잎으로 할당되다가 생식성장(reproductive growth) 단계에서는 그 비중이 열매 쪽으로 옮겨가는 등의 변화도 고려해볼 수 있습니다.\n", "\n", "여기에서는 [Monsi (1960)](https://www.cabdirect.org/cabdirect/abstract/19600600113)의 모형을 참고하여 식물의 전체 생체량을 광합성이 가능한 부위와 아닌 부위로 나누어 광합성과 호흡의 비중을 조정해보도록 하겠습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "r = c \\cdot (m A - n R)\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| 이름      | 값 | 단위 | 설명 |\n", "| :- | :- | :- | :- |\n", "| $m$ | 0.5 | - | 광합성을 하는 생체량의 비중 |\n", "| $n$ | $$1 - m$$ | - | 광합성을 하지 않는 생체량의 비중 |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "전체 생체량에서 광합성이 가능한(photosynthetic) 부분의 비중(`m`)과 그렇지 않은(non-photosynthetic) 부분의 비중(`n`)을 모수로 추가하고 각각 광합성(`A`)과 호흡(`R`)에 적용합니다." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Growth3" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@system Growth3(Growth2, Controller) begin\n", " m: leaf_fraction => 0.5 ~ preserve(parameter)\n", " n(m): non_leaf_fraction => #= .. =# ~ track\n", "\n", " mA(m, A): actual_assimilation_rate => m * A ~ track(u\"g/g/d\")\n", " nR(n, R): actual_respiration_rate => n * R ~ track(u\"g/g/d\")\n", "\n", " r(c, mA, nR): growth_rate => #= .. =# ~ track(u\"g/g/d\")\n", "end" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "%3\n", "\n", "\n", "\n", "1\n", "∘context\n", "\n", "\n", "\n", "2\n", "context\n", "\n", "\n", "\n", "1->2\n", "\n", "\n", "\n", "\n", "\n", "3\n", "⋆context\n", "\n", "\n", "\n", "2->3\n", "\n", "\n", "\n", "\n", "\n", "5\n", "t\n", "\n", "\n", "\n", "2->5\n", "\n", "\n", "\n", "\n", "\n", "7\n", "W\n", "\n", "\n", "\n", "2->7\n", "\n", "\n", "\n", "\n", "\n", "8\n", "⋆W\n", "\n", "\n", "\n", "2->8\n", "\n", "\n", "\n", "\n", "\n", "13\n", "A\n", "\n", "\n", "\n", "2->13\n", "\n", "\n", "\n", "\n", "\n", "14\n", "⋆A\n", "\n", "\n", "\n", "2->14\n", "\n", "\n", "\n", "\n", "\n", "17\n", "R\n", "\n", "\n", "\n", "2->17\n", "\n", "\n", "\n", "\n", "\n", "18\n", "⋆R\n", "\n", "\n", "\n", "2->18\n", "\n", "\n", "\n", "\n", "\n", "4\n", "config\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "\n", "\n", "\n", "4->3\n", "\n", "\n", "\n", "\n", "\n", "6\n", "W0\n", "\n", "\n", "\n", "4->6\n", "\n", "\n", "\n", "\n", "\n", "10\n", "Y\n", "\n", "\n", "\n", "4->10\n", "\n", "\n", "\n", "\n", "\n", "11\n", "c0\n", "\n", "\n", "\n", "4->11\n", "\n", "\n", "\n", "\n", "\n", "15\n", "Amax\n", "\n", "\n", "\n", "4->15\n", "\n", "\n", "\n", "\n", "\n", "16\n", "α\n", "\n", "\n", "\n", "4->16\n", "\n", "\n", "\n", "\n", "\n", "19\n", "Rmax\n", "\n", "\n", "\n", "4->19\n", "\n", "\n", "\n", "\n", "\n", "22\n", "m\n", "\n", "\n", "\n", "4->22\n", "\n", "\n", "\n", "\n", "\n", "5->3\n", "\n", "\n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "\n", "\n", "\n", "6->8\n", "\n", "\n", "\n", "\n", "\n", "7->3\n", "\n", "\n", "\n", "\n", "\n", "7->8\n", "\n", "\n", "\n", "\n", "\n", "8->3\n", "\n", "\n", "\n", "\n", "\n", "9\n", "r\n", "\n", "\n", "\n", "9->8\n", "\n", "\n", "\n", "\n", "\n", "12\n", "c\n", "\n", "\n", "\n", "10->12\n", "\n", "\n", "\n", "\n", "\n", "11->12\n", "\n", "\n", "\n", "\n", "\n", "12->9\n", "\n", "\n", "\n", "\n", "\n", "13->3\n", "\n", "\n", "\n", "\n", "\n", "13->14\n", "\n", "\n", "\n", "\n", "\n", "21\n", "mA\n", "\n", "\n", "\n", "13->21\n", "\n", "\n", "\n", "\n", "\n", "14->3\n", "\n", "\n", "\n", "\n", "\n", "15->13\n", "\n", "\n", "\n", "\n", "\n", "15->14\n", "\n", "\n", "\n", "\n", "\n", "16->14\n", "\n", "\n", "\n", "\n", "\n", "16->18\n", "\n", "\n", "\n", "\n", "\n", "17->3\n", "\n", "\n", "\n", "\n", "\n", "17->18\n", "\n", "\n", "\n", "\n", "\n", "20\n", "nR\n", "\n", "\n", "\n", "17->20\n", "\n", "\n", "\n", "\n", "\n", "18->3\n", "\n", "\n", "\n", "\n", "\n", "19->17\n", "\n", "\n", "\n", "\n", "\n", "19->18\n", "\n", "\n", "\n", "\n", "\n", "20->9\n", "\n", "\n", "\n", "\n", "\n", "21->9\n", "\n", "\n", "\n", "\n", "\n", "22->21\n", "\n", "\n", "\n", "\n", "\n", "23\n", "n\n", "\n", "\n", "\n", "22->23\n", "\n", "\n", "\n", "\n", "\n", "23->20\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "\u001b[90m[\u001b[39m\u001b[94mconfig\u001b[39m\u001b[90m → \u001b[39m\u001b[94mm\u001b[39m\u001b[90m → \u001b[39m\u001b[94mn\u001b[39m\u001b[90m → \u001b[39m\u001b[94mRmax\u001b[39m\u001b[90m → \u001b[39m\u001b[94mα\u001b[39m\u001b[90m → \u001b[39m\u001b[94mAmax\u001b[39m\u001b[90m → \u001b[39m\u001b[94mc0\u001b[39m\u001b[90m → \u001b[39m\u001b[94mY\u001b[39m\u001b[90m → \u001b[39m\u001b[94mc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mW0\u001b[39m\u001b[90m → \u001b[39m\u001b[94m∘context\u001b[39m\u001b[90m → \u001b[39m\u001b[94mcontext\u001b[39m\u001b[90m → \u001b[39m\u001b[94mR\u001b[39m\u001b[90m → \u001b[39m\u001b[94mnR\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆R\u001b[39m\u001b[90m → \u001b[39m\u001b[94mA\u001b[39m\u001b[90m → \u001b[39m\u001b[94mmA\u001b[39m\u001b[90m → \u001b[39m\u001b[94mr\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆A\u001b[39m\u001b[90m → \u001b[39m\u001b[94mW\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆W\u001b[39m\u001b[90m → \u001b[39m\u001b[94mt\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆context\u001b[39m\u001b[90m]\u001b[39m" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Cropbox.dependency(Growth3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이제 실제 광합성이 가능한 부분만을 통해 동화산물이 생성되기 때문에 전체 생체량(`W`)도 그에 맞춰 감소하였습니다. 소폭의 비중 변화에 따라 생체량이 크게 변화하는 것을 확인할 수 있습니다." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "application/vnd.webio.node+json": { "children": [ { "children": [ "0" ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "color": "darkorchid", "font-family": "monospace" } }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "m" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 11, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "583810483386651349", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0.0\",\"0.1\",\"0.2\",\"0.3\",\"0.4\",\"0.5\",\"0.6\",\"0.7\",\"0.8\",\"0.9\",\"1.0\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"583810483386651349\",\"id\":\"4141442790493147428\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"583810483386651349\",\"id\":\"8894130012628501021\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"583810483386651349\",\"id\":\"4141442790493147428\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"583810483386651349\",\"id\":\"8894130012628501021\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "4141442790493147428", "sync": true, "value": 0 }, "index": { "id": "8894130012628501021", "sync": true, "value": 6 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "webio-observable", "setInnerHtml": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n t (d)\n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n \n \n W (g)\n \n \n \n\n\n \n \n \n\n\n" }, "type": "node" } ], "instanceArgs": { "handlers": { "obs-output": [ "function (value, scope) {\n scope.setInnerHTML(value);\n}\n" ] }, "id": "1355423201550806816", "imports": { "data": [], "type": "async_block" }, "mount_callbacks": [], "observables": { "obs-output": { "id": "6727253794464799729", "sync": false, "value": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n t (d)\n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n \n \n W (g)\n \n \n \n\n\n \n \n \n\n\n" } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "display": "flex", "flex-direction": "column" } }, "type": "node" }, "text/html": [ "\n", " \n", "\n" ], "text/plain": [ "WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[\"0\"], Dict{Symbol, Any}(:style => Dict{String, Any}(\"color\" => :darkorchid, \"font-family\" => \"monospace\"))), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"m\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 11, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "6, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x0000000174a89aa0, Task (runnable) @0x0000000174a89aa0), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.0\\\",\\\"0.1\\\",\\\"0.2\\\",\\\"0.3\\\",\\\"0.4\\\",\\\"0.5\\\",\\\"0.6\\\",\\\"0.7\\\",\\\"0.8\\\",\\\"0.9\\\",\\\"1.0\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"583810483386651349\\\",\\\"id\\\":\\\"4141442790493147428\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"583810483386651349\\\",\\\"id\\\":\\\"8894130012628501021\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"583810483386651349\\\",\\\"id\\\":\\\"4141442790493147428\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"583810483386651349\\\",\\\"id\\\":\\\"8894130012628501021\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), Observable{Cropbox.Plot{Gadfly.Plot}} with 0 listeners. Value:\n", "Gadfly.Plot(Gadfly.Layer[Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [0.25, 0.25133697265625, 0.2526794151427345, 0.2540273408748276, 0.25538076326081977, 0.256739695701744, 0.2581041515912016, 0.25947414431518817, 0.2608496872519192, 0.2622307937716559 … 17.917487322573837, 17.917499214527552, 17.91751109162421, 17.917522953882358, 17.917534801320528, 17.917546633957222, 17.917558451810926, 17.9175702549001, 17.917582043243176, 17.917593816858567], :x => [0.0, 0.041666666666666664, 0.08333333333333333, 0.125, 0.16666666666666666, 0.20833333333333331, 0.25, 0.29166666666666663, 0.3333333333333333, 0.375 … 299.625, 299.66666666666663, 299.7083333333333, 299.75, 299.79166666666663, 299.8333333333333, 299.875, 299.91666666666663, 299.9583333333333, 300.0]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0)], nothing, Data(\n", " titles=Dict{Symbol, AbstractString}()\n", ")\n", ", Gadfly.ScaleElement[], Gadfly.StatisticElement[], Gadfly.Coord.Cartesian([:x, :xmin, :xmax, :xintercept], [:y, :ymin, :ymax, :yintercept, :middle, :lower_hinge, :upper_hinge, :lower_fence, :upper_fence, :outliers], 0.0, 300.0, 0, 300, false, false, false, nothing, false), Gadfly.GuideElement[Gadfly.Guide.Title(\"\"), Gadfly.Guide.XLabel(\"t (d)\", :auto), Gadfly.Guide.YLabel(\"W (g)\", :auto)], Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), Dict{Symbol, Any}())], Dict{Symbol, Any}(:style => Dict(\"display\" => \"flex\", \"flex-direction\" => \"column\")))" ] }, "execution_count": 25, "metadata": { "application/vnd.webio.node+json": { "kernelId": "493146c5-5720-442f-9dc7-ac09fc92b3ad" } }, "output_type": "execute_result" } ], "source": [ "manipulate(Growth3, :t, :W;\n", " parameters = :0 => (;\n", " :m => 0:0.1:1,\n", " ),\n", " stop = 300u\"d\",\n", " kind = :line,\n", " ylim = (0, 300),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이러한 분배 비율의 변화가 성장률(`r`)에는 어떠한 영향을 미치는지 보도록 하겠습니다." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "application/vnd.webio.node+json": { "children": [ { "children": [ "0" ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "color": "darkorchid", "font-family": "monospace" } }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "m" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 11, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "3994477527269266918", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0.0\",\"0.1\",\"0.2\",\"0.3\",\"0.4\",\"0.5\",\"0.6\",\"0.7\",\"0.8\",\"0.9\",\"1.0\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"3994477527269266918\",\"id\":\"8022791365983347205\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"3994477527269266918\",\"id\":\"12669401584576911836\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"3994477527269266918\",\"id\":\"8022791365983347205\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"3994477527269266918\",\"id\":\"12669401584576911836\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "8022791365983347205", "sync": true, "value": 0 }, "index": { "id": "12669401584576911836", "sync": true, "value": 6 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "webio-observable", "setInnerHtml": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n t (d)\n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n \n \n \n mA\n \n \n \n \n nR\n \n \n \n \n r\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0.0\n \n \n \n \n 0.1\n \n \n \n \n 0.2\n \n \n \n \n 0.3\n \n \n \n \n 0.4\n \n \n \n \n \n \n (d⁻¹)\n \n \n \n\n\n \n \n \n\n\n" }, "type": "node" } ], "instanceArgs": { "handlers": { "obs-output": [ "function (value, scope) {\n scope.setInnerHTML(value);\n}\n" ] }, "id": "12565059243359517727", "imports": { "data": [], "type": "async_block" }, "mount_callbacks": [], "observables": { "obs-output": { "id": "14831711529972363041", "sync": false, "value": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n t (d)\n \n \n \n \n \n \n 0\n \n \n \n \n 100\n \n \n \n \n 200\n \n \n \n \n 300\n \n \n \n \n \n \n \n mA\n \n \n \n \n nR\n \n \n \n \n r\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0.0\n \n \n \n \n 0.1\n \n \n \n \n 0.2\n \n \n \n \n 0.3\n \n \n \n \n 0.4\n \n \n \n \n \n \n (d⁻¹)\n \n \n \n\n\n \n \n \n\n\n" } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "display": "flex", "flex-direction": "column" } }, "type": "node" }, "text/html": [ "\n", " \n", "\n" ], "text/plain": [ "WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[\"0\"], Dict{Symbol, Any}(:style => Dict{String, Any}(\"color\" => :darkorchid, \"font-family\" => \"monospace\"))), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"m\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 11, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "6, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x000000016e203ec0, Task (runnable) @0x000000016e203ec0), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0.0\\\",\\\"0.1\\\",\\\"0.2\\\",\\\"0.3\\\",\\\"0.4\\\",\\\"0.5\\\",\\\"0.6\\\",\\\"0.7\\\",\\\"0.8\\\",\\\"0.9\\\",\\\"1.0\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"3994477527269266918\\\",\\\"id\\\":\\\"8022791365983347205\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"3994477527269266918\\\",\\\"id\\\":\\\"12669401584576911836\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"3994477527269266918\\\",\\\"id\\\":\\\"8022791365983347205\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"3994477527269266918\\\",\\\"id\\\":\\\"12669401584576911836\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), Observable{Cropbox.Plot{Gadfly.Plot}} with 0 listeners. Value:\n", "Gadfly.Plot(Gadfly.Layer[Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [0.2, 0.19975, 0.1995003125, 0.199250937109375, 0.19900187343798828, 0.19875312109619078, 0.19850467969482055, 0.19825654884520202, 0.19800872815914553, 0.1977612172489466 … 2.482124626755481e-5, 2.4790219709720366e-5, 2.4759231935083215e-5, 2.472828289516436e-5, 2.4697372541545404e-5, 2.4666500825868472e-5, 2.4635667699836136e-5, 2.460487311521134e-5, 2.4574117023817325e-5, 2.4543399377537553e-5], :x => [0.0, 0.041666666666666664, 0.08333333333333333, 0.125, 0.16666666666666666, 0.20833333333333331, 0.25, 0.29166666666666663, 0.3333333333333333, 0.375 … 299.625, 299.66666666666663, 299.7083333333333, 299.75, 299.79166666666663, 299.8333333333333, 299.875, 299.91666666666663, 299.9583333333333, 300.0]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0), Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [0.0075, 0.007490625, 0.00748126171875, 0.007471910141601562, 0.00746257025392456, 0.007453242041107155, 0.007443925488555771, 0.007434620581695076, 0.007425327305967957, 0.007416045646835497 … 9.307967350332993e-7, 9.296332391145077e-7, 9.284711975656145e-7, 9.273106085686575e-7, 9.261514703079467e-7, 9.249937809700618e-7, 9.238375387438491e-7, 9.226827418204193e-7, 9.215293883931437e-7, 9.203774766576523e-7], :x => [0.0, 0.041666666666666664, 0.08333333333333333, 0.125, 0.16666666666666666, 0.20833333333333331, 0.25, 0.29166666666666663, 0.3333333333333333, 0.375 … 299.625, 299.66666666666663, 299.7083333333333, 299.75, 299.79166666666663, 299.8333333333333, 299.875, 299.91666666666663, 299.9583333333333, 300.0]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(80.0f0,70.000015f0,100.43479f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0), Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [0.128349375, 0.12818893828125, 0.12802870210839842, 0.12786866623076293, 0.12770883039797448, 0.127549194359977, 0.12738975786702703, 0.12723052066969323, 0.12707148251885614, 0.12691264316570758 … 1.5928957225808716e-5, 1.5909046029276456e-5, 1.588915972173986e-5, 1.5869298272087683e-5, 1.5849461649247574e-5, 1.5829649822186014e-5, 1.5809862759908282e-5, 1.5790100431458397e-5, 1.5770362805919073e-5, 1.5750649852411673e-5], :x => [0.0, 0.041666666666666664, 0.08333333333333333, 0.125, 0.16666666666666666, 0.20833333333333331, 0.25, 0.29166666666666663, 0.3333333333333333, 0.375 … 299.625, 299.66666666666663, 299.7083333333333, 299.75, 299.79166666666663, 299.8333333333333, 299.875, 299.91666666666663, 299.9583333333333, 300.0]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(65.89944f0,62.21457f0,353.99814f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0)], nothing, Data(\n", " titles=Dict{Symbol, AbstractString}()\n", ")\n", ", Gadfly.ScaleElement[], Gadfly.StatisticElement[], Gadfly.Coord.Cartesian([:x, :xmin, :xmax, :xintercept], [:y, :ymin, :ymax, :yintercept, :middle, :lower_hinge, :upper_hinge, :lower_fence, :upper_fence, :outliers], 0.0, 300.0, 0.0, 0.4, false, false, false, nothing, false), Gadfly.GuideElement[Gadfly.Guide.Title(\"\"), Gadfly.Guide.XLabel(\"t (d)\", :auto), Gadfly.Guide.YLabel(\" (d⁻¹)\", :auto), Gadfly.Guide.ManualDiscreteKey(\"\", [\"mA\", \"nR\", \"r\"], Any[], ColorTypes.Colorant[LCHab{Float32}(70.0f0,60.0f0,240.0f0), LCHab{Float32}(80.0f0,70.000015f0,100.43479f0), LCHab{Float32}(65.89944f0,62.21457f0,353.99814f0)], Function[], Measures.Measure[], true)], Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), Dict{Symbol, Any}())], Dict{Symbol, Any}(:style => Dict(\"display\" => \"flex\", \"flex-direction\" => \"column\")))" ] }, "execution_count": 26, "metadata": { "application/vnd.webio.node+json": { "kernelId": "493146c5-5720-442f-9dc7-ac09fc92b3ad" } }, "output_type": "execute_result" } ], "source": [ "manipulate(Growth3, :t, [:mA, :nR, :r];\n", " parameters = :0 => (;\n", " :m => 0:0.1:1,\n", " ),\n", " stop = 300u\"d\",\n", " kind = :line,\n", " ylim = (0, 0.4),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "단순해보이지만 실제 작물 모형에서는 좀 더 상세하게 구조를 나눈 다음, 각 구조별로 특화된 기작을 부여하여 서로 간의 상호작용을 만들어내는 등 다양하게 응용이 가능합니다. 예를 들어 잎은 광합성을, 줄기는 동화산물의 저장을, 뿌리는 토양수분 흡수를 담당하도록 되어 있으면 각 부위가 전체 식물에서 어떤 비중을 갖는지에 따라 전체적인 성장의 형태가 달라질 수 있는 것입니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.3. 광합성 (`A`) 분해" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "여기서는 성장률(`r`)을 분해해내가는 과정을 좀 더 진행해보겠습니다. 지금까지 만든 모형에서 광합성(`A`)은 효율 저하가 반영되기는 하였지만 그 외에는 항상 같은 값을 가지는 고정된 모수로 표현되어 있었습니다. 하지만 실제 광합성은 말그대로 빛이 있어야만 일어날 수 있는 생화학 반응이며, 이외에도 대기중 이산화탄소($\\mathrm{CO_2}$) 농도, 온도, 습도 등 환경 요인에 큰 영향을 받는 기작입니다. 내부적으로는 잎의 영양상태나 수분함량 등에 따라 그 효율이 변화하기도 합니다. 여기서는 우선 광량(irradiance)에 따라 변화하는 광합성율을 표현해보겠습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align}\n", "A_g &= \\frac{\\alpha I A_{\\mathrm{max}}}{\\alpha I + A_{\\mathrm{max}}} \\\\\n", "A_n &= A_g - R_d\n", "\\end{align}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| 이름 | 값 | 단위 | 설명 |\n", "|:-------|:------|:------|:------------|\n", "| $\\alpha$ | 0.05 | $$\\mathrm{\\mu mol_{CO_2}}\\ \\mathrm{\\mu mol_{photon}^{-1}}$$ | 광화학적 효율 (양자 수율; quantum yield) |\n", "| $$A_{\\mathrm{max}}$$ | 25.0 | $\\mathrm{\\mu mol}\\ \\mathrm{m^{-2}}\\ \\mathrm{s^{-1}}$ | 현재 대기 $\\mathrm{[CO_2]}$와 표준 기온(25 $\\mathrm{^{\\circ}C}$) 기준 광포화 총광합성율 ($A_g$) |\n", "| $R_d$ | 1.0 | $\\mathrm{\\mu mol_{CO_2}}\\ \\mathrm{m^{-2}}\\ \\mathrm{s^{-1}}$ | 표준 온도(25 $\\mathrm{^{\\circ}C}$) 기준 엽 세포호흡율 (dark respiration) |\n", "| $I$ | - | $\\mathrm{\\mu mol_{photon}}\\ \\mathrm{m^{-2}}$ | 엽 표면에 도달하는 PAR (photosynthetically active radiation) |\n", "| $A_g$ | - | $\\mathrm{\\mu mol_{CO_2}}\\ \\mathrm{m^{-2}}\\ \\mathrm{s^{-1}}$ | 엽 $\\mathrm{CO_2}$ 총동화율 (총광합성율; gross photosynthesis rate) |\n", "| $A_n$ | - | $\\mathrm{\\mu mol_{CO_2}}\\ \\mathrm{m^{-2}}\\ \\mathrm{s^{-1}}$ | 엽 $\\mathrm{CO_2}$ 순동화율 (순광합성율; net photosynthesis rate) |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "총광합성율($A_g$)은 광량($I$)이 증가함에 따라 함께 증가하는 직각쌍곡선(rectangular hyperbola)의 형태로 정의합니다. 광량이 많아질수록 그 증가량은 줄어들고 광포화 상태가 되어 최대값($A_max$)에 근접하게 됩니다. 순광합성율($A_n$)은 총광합성율($A_g$)에서 세포호흡율($R_d$) 제외한 값입니다. 실제 광합성은 광량 외에도 다른 요인에 영향을 받고, 세포호흡 역시 엽온에 따라 변할 수 있지만 여기서는 편의상 다른 요인들은 고정되어 있다고 가정하겠습니다." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Photosynthesis" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@system Photosynthesis(Controller) begin\n", " α: photochemical_efficiency => 0.05 ~ preserve(parameter)\n", " Amax: maximum_photosynthetic_rate => 25 ~ preserve(parameter, u\"μmol/m^2/s\")\n", " Rd: dark_respiration => 1.0 ~ preserve(parameter, u\"μmol/m^2/s\")\n", "\n", " I: irradiance => 0 ~ preserve(parameter, u\"μmol/m^2/s\")\n", "\n", " Ag(#= .. =#): gross_photosynthesis => #= .. =# ~ track(u\"μmol/m^2/s\")\n", " An(Ag, Rd): net_photosynthesis => Ag - Rd ~ track(u\"μmol/m^2/s\")\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "일단 특정 광량(`I`)에 대한 순광합성율(`An`)이 제대로 계산되는지 확인해보겠습니다." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " I (μmol m⁻² s⁻¹)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 500\n", " \n", " \n", " \n", " \n", " 1000\n", " \n", " \n", " \n", " \n", " 1500\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 10\n", " \n", " \n", " \n", " \n", " 15\n", " \n", " \n", " \n", " \n", " 20\n", " \n", " \n", " \n", " \n", " \n", " \n", " An (μmol m⁻² s⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " I (μmol m⁻² s⁻¹)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 500\n", " \n", " \n", " \n", " \n", " 1000\n", " \n", " \n", " \n", " \n", " 1500\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 10\n", " \n", " \n", " \n", " \n", " 15\n", " \n", " \n", " \n", " \n", " 20\n", " \n", " \n", " \n", " \n", " \n", " \n", " An (μmol m⁻² s⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Photosynthesis, :I, :An;\n", " config = :0 => :I => 1000,\n", " xlim = (0, 1500),\n", " ylim = (0, 20),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "그럼 이제는 한 점이 아니라 일정 범위 내의 광량(`I`)에 대해 다수의 모의를 진행하여 그 결과를 한꺼번에 표출해보도록 하겠습니다. `visualize()` 함수의 `xstep` 옵션을 사용하면 내부적으로 여러 개의 설정(configuration)을 만들어 모의를 진행한 후 결과를 합쳐서 볼 수 있습니다." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " I (μmol m⁻² s⁻¹)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 500\n", " \n", " \n", " \n", " \n", " 1000\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 10\n", " \n", " \n", " \n", " \n", " 15\n", " \n", " \n", " \n", " \n", " 20\n", " \n", " \n", " \n", " \n", " \n", " \n", " An (μmol m⁻² s⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " I (μmol m⁻² s⁻¹)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 500\n", " \n", " \n", " \n", " \n", " 1000\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 5\n", " \n", " \n", " \n", " \n", " 10\n", " \n", " \n", " \n", " \n", " 15\n", " \n", " \n", " \n", " \n", " 20\n", " \n", " \n", " \n", " \n", " \n", " \n", " An (μmol m⁻² s⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(Photosynthesis, :I, :An;\n", " xstep = :0 => :I => 0:1000,\n", " kind = :line,\n", " ylim = (0, 20),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "일단 결과적으로는 실제 광합성 측정 기기로 얻을 수 있는 광반응 곡선과 유사한 형태를 보여주고 있습니다. 하지만 앞에서 언급되었던 것처럼 다른 환경 요인에 대한 고려 없이 대략적인 곡선의 형태를 맞추어 본 것에 그치고 있다는 한계가 있습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.4. 기체교환 모형 (coupled gas-exchange model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "목적에 따라 다르겠지만, 기후 변화와 같이 기존에 알려지지 않은 환경에 대한 실험을 진행해야 한다면 다양한 요인의 상호작용에 대한 응답을 줄 수 있는 모형을 선택하는 것이 타당할 것입니다. 이런 측면에서 광합성의 주요 기작들을 생화학적으로 설명하고, 기공전도도(stomatal conductance)와의 연계를 통한 증산(transpiration), 이러한 과정에서 이루어지는 엽온(leaf temperature)의 에너지 균형(energy balance)까지 표현하는 기체교환 모형(gas-exchange model)은 작물모형을 비롯한 여러 분야에서 응용이 가능합니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cropbox로 구현한 기체교환 모형은 지난 시간에 보았던 [마늘 모형](https://github.com/cropbox/Garlic.jl)에서 내부적으로 활용중이며, [LeafGasExchange.jl](https://github.com/cropbox/LeafGasExchange.jl)이라는 이름의 별도 Julia 패키지로 배포되고 있기도 합니다. 여기서는 후자의 패키지를 통해 모형을 사용해보는 실습을 진행하도록 하겠습니다." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "using LeafGasExchange" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "LeafGasExchange 모듈은 광합성의 종류에 따라 C3, C4, 그리고 기공전도도 모형의 종류에 따라 Ball-Berry, Medlyn, 각 두가지씩 구현이 되어 있으며 이를 합쳐서 `ModelC3BB`, `ModelC3MD`, `ModelC4BB`, `ModelC4MD`와 같이 바로 사용할 수 있는 4개의 시스템을 제공하고 있습니다. 실습에서는 C3 광합성에 Ball-Berry 모형이 결합된 `ModelC3BB`를 사용하겠습니다." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "%3\n", "\n", "\n", "\n", "1\n", "∘context\n", "\n", "\n", "\n", "2\n", "context\n", "\n", "\n", "\n", "1->2\n", "\n", "\n", "\n", "\n", "\n", "3\n", "⋆context\n", "\n", "\n", "\n", "2->3\n", "\n", "\n", "\n", "\n", "\n", "5\n", "vp\n", "\n", "\n", "\n", "2->5\n", "\n", "\n", "\n", "\n", "\n", "51\n", "∘ΔT\n", "\n", "\n", "\n", "2->51\n", "\n", "\n", "\n", "\n", "\n", "64\n", "∘Ci\n", "\n", "\n", "\n", "2->64\n", "\n", "\n", "\n", "\n", "\n", "4\n", "config\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "\n", "\n", "\n", "4->3\n", "\n", "\n", "\n", "\n", "\n", "6\n", "PFD\n", "\n", "\n", "\n", "4->6\n", "\n", "\n", "\n", "\n", "\n", "7\n", "CO2\n", "\n", "\n", "\n", "4->7\n", "\n", "\n", "\n", "\n", "\n", "8\n", "RH\n", "\n", "\n", "\n", "4->8\n", "\n", "\n", "\n", "\n", "\n", "9\n", "T_air\n", "\n", "\n", "\n", "4->9\n", "\n", "\n", "\n", "\n", "\n", "11\n", "wind\n", "\n", "\n", "\n", "4->11\n", "\n", "\n", "\n", "\n", "\n", "12\n", "P_air\n", "\n", "\n", "\n", "4->12\n", "\n", "\n", "\n", "\n", "\n", "16\n", "SPAD\n", "\n", "\n", "\n", "4->16\n", "\n", "\n", "\n", "\n", "\n", "17\n", "__Nitrogen__a\n", "\n", "\n", "\n", "4->17\n", "\n", "\n", "\n", "\n", "\n", "18\n", "__Nitrogen__b\n", "\n", "\n", "\n", "4->18\n", "\n", "\n", "\n", "\n", "\n", "19\n", "__Nitrogen__c\n", "\n", "\n", "\n", "4->19\n", "\n", "\n", "\n", "\n", "\n", "20\n", "N\n", "\n", "\n", "\n", "4->20\n", "\n", "\n", "\n", "\n", "\n", "23\n", "Dw\n", "\n", "\n", "\n", "4->23\n", "\n", "\n", "\n", "\n", "\n", "24\n", "Dc\n", "\n", "\n", "\n", "4->24\n", "\n", "\n", "\n", "\n", "\n", "25\n", "Dh\n", "\n", "\n", "\n", "4->25\n", "\n", "\n", "\n", "\n", "\n", "26\n", "Dm\n", "\n", "\n", "\n", "4->26\n", "\n", "\n", "\n", "\n", "\n", "27\n", "w\n", "\n", "\n", "\n", "4->27\n", "\n", "\n", "\n", "\n", "\n", "28\n", "sr\n", "\n", "\n", "\n", "4->28\n", "\n", "\n", "\n", "\n", "\n", "33\n", "v\n", "\n", "\n", "\n", "4->33\n", "\n", "\n", "\n", "\n", "\n", "34\n", "κ\n", "\n", "\n", "\n", "4->34\n", "\n", "\n", "\n", "\n", "\n", "42\n", "g0\n", "\n", "\n", "\n", "4->42\n", "\n", "\n", "\n", "\n", "\n", "45\n", "g1\n", "\n", "\n", "\n", "4->45\n", "\n", "\n", "\n", "\n", "\n", "52\n", "drb\n", "\n", "\n", "\n", "4->52\n", "\n", "\n", "\n", "\n", "\n", "53\n", "dra\n", "\n", "\n", "\n", "4->53\n", "\n", "\n", "\n", "\n", "\n", "67\n", "δ\n", "\n", "\n", "\n", "4->67\n", "\n", "\n", "\n", "\n", "\n", "68\n", "f\n", "\n", "\n", "\n", "4->68\n", "\n", "\n", "\n", "\n", "\n", "71\n", "ϵ\n", "\n", "\n", "\n", "4->71\n", "\n", "\n", "\n", "\n", "\n", "73\n", "λ\n", "\n", "\n", "\n", "4->73\n", "\n", "\n", "\n", "\n", "\n", "74\n", "Cp\n", "\n", "\n", "\n", "4->74\n", "\n", "\n", "\n", "\n", "\n", "77\n", "α_s\n", "\n", "\n", "\n", "4->77\n", "\n", "\n", "\n", "\n", "\n", "89\n", "WP_leaf\n", "\n", "\n", "\n", "4->89\n", "\n", "\n", "\n", "\n", "\n", "91\n", "Ψf\n", "\n", "\n", "\n", "4->91\n", "\n", "\n", "\n", "\n", "\n", "92\n", "sf\n", "\n", "\n", "\n", "4->92\n", "\n", "\n", "\n", "\n", "\n", "94\n", "Tb\n", "\n", "\n", "\n", "4->94\n", "\n", "\n", "\n", "\n", "\n", "98\n", "Q10\n", "\n", "\n", "\n", "4->98\n", "\n", "\n", "\n", "\n", "\n", "100\n", "s\n", "\n", "\n", "\n", "4->100\n", "\n", "\n", "\n", "\n", "\n", "101\n", "N0\n", "\n", "\n", "\n", "4->101\n", "\n", "\n", "\n", "\n", "\n", "103\n", "Kc25\n", "\n", "\n", "\n", "4->103\n", "\n", "\n", "\n", "\n", "\n", "104\n", "Eac\n", "\n", "\n", "\n", "4->104\n", "\n", "\n", "\n", "\n", "\n", "106\n", "Ko25\n", "\n", "\n", "\n", "4->106\n", "\n", "\n", "\n", "\n", "\n", "107\n", "Eao\n", "\n", "\n", "\n", "4->107\n", "\n", "\n", "\n", "\n", "\n", "109\n", "Om\n", "\n", "\n", "\n", "4->109\n", "\n", "\n", "\n", "\n", "\n", "111\n", "Vcm25\n", "\n", "\n", "\n", "4->111\n", "\n", "\n", "\n", "\n", "\n", "112\n", "EaVc\n", "\n", "\n", "\n", "4->112\n", "\n", "\n", "\n", "\n", "\n", "114\n", "Jm25\n", "\n", "\n", "\n", "4->114\n", "\n", "\n", "\n", "\n", "\n", "115\n", "Haj\n", "\n", "\n", "\n", "4->115\n", "\n", "\n", "\n", "\n", "\n", "116\n", "Hdj\n", "\n", "\n", "\n", "4->116\n", "\n", "\n", "\n", "\n", "\n", "117\n", "Toj\n", "\n", "\n", "\n", "4->117\n", "\n", "\n", "\n", "\n", "\n", "119\n", "θ\n", "\n", "\n", "\n", "4->119\n", "\n", "\n", "\n", "\n", "\n", "121\n", "Tp25\n", "\n", "\n", "\n", "4->121\n", "\n", "\n", "\n", "\n", "\n", "122\n", "EaTp\n", "\n", "\n", "\n", "4->122\n", "\n", "\n", "\n", "\n", "\n", "124\n", "Rd25\n", "\n", "\n", "\n", "4->124\n", "\n", "\n", "\n", "\n", "\n", "125\n", "Ear\n", "\n", "\n", "\n", "4->125\n", "\n", "\n", "\n", "\n", "\n", "127\n", "Γ25\n", "\n", "\n", "\n", "4->127\n", "\n", "\n", "\n", "\n", "\n", "128\n", "Eag\n", "\n", "\n", "\n", "4->128\n", "\n", "\n", "\n", "\n", "\n", "5->3\n", "\n", "\n", "\n", "\n", "\n", "13\n", "VPD\n", "\n", "\n", "\n", "5->13\n", "\n", "\n", "\n", "\n", "\n", "14\n", "VPD_Δ\n", "\n", "\n", "\n", "5->14\n", "\n", "\n", "\n", "\n", "\n", "15\n", "VPD_s\n", "\n", "\n", "\n", "5->15\n", "\n", "\n", "\n", "\n", "\n", "84\n", "Δw\n", "\n", "\n", "\n", "5->84\n", "\n", "\n", "\n", "\n", "\n", "93\n", "Ds\n", "\n", "\n", "\n", "5->93\n", "\n", "\n", "\n", "\n", "\n", "66\n", "PPFD\n", "\n", "\n", "\n", "6->66\n", "\n", "\n", "\n", "\n", "\n", "54\n", "Ca\n", "\n", "\n", "\n", "7->54\n", "\n", "\n", "\n", "\n", "\n", "8->13\n", "\n", "\n", "\n", "\n", "\n", "46\n", "hs\n", "\n", "\n", "\n", "8->46\n", "\n", "\n", "\n", "\n", "\n", "8->84\n", "\n", "\n", "\n", "\n", "\n", "10\n", "Tk_air\n", "\n", "\n", "\n", "9->10\n", "\n", "\n", "\n", "\n", "\n", "9->13\n", "\n", "\n", "\n", "\n", "\n", "9->14\n", "\n", "\n", "\n", "\n", "\n", "9->15\n", "\n", "\n", "\n", "\n", "\n", "50\n", "T\n", "\n", "\n", "\n", "9->50\n", "\n", "\n", "\n", "\n", "\n", "9->84\n", "\n", "\n", "\n", "\n", "\n", "37\n", "gh\n", "\n", "\n", "\n", "10->37\n", "\n", "\n", "\n", "\n", "\n", "79\n", "R_wall\n", "\n", "\n", "\n", "10->79\n", "\n", "\n", "\n", "\n", "\n", "31\n", "u\n", "\n", "\n", "\n", "11->31\n", "\n", "\n", "\n", "\n", "\n", "12->15\n", "\n", "\n", "\n", "\n", "\n", "12->37\n", "\n", "\n", "\n", "\n", "\n", "39\n", "gb\n", "\n", "\n", "\n", "12->39\n", "\n", "\n", "\n", "\n", "\n", "12->54\n", "\n", "\n", "\n", "\n", "\n", "16->20\n", "\n", "\n", "\n", "\n", "\n", "17->20\n", "\n", "\n", "\n", "\n", "\n", "18->20\n", "\n", "\n", "\n", "\n", "\n", "19->20\n", "\n", "\n", "\n", "\n", "\n", "21\n", "Np\n", "\n", "\n", "\n", "20->21\n", "\n", "\n", "\n", "\n", "\n", "102\n", "kN\n", "\n", "\n", "\n", "20->102\n", "\n", "\n", "\n", "\n", "\n", "22\n", "SLA\n", "\n", "\n", "\n", "22->21\n", "\n", "\n", "\n", "\n", "\n", "38\n", "rhw\n", "\n", "\n", "\n", "23->38\n", "\n", "\n", "\n", "\n", "\n", "23->52\n", "\n", "\n", "\n", "\n", "\n", "23->53\n", "\n", "\n", "\n", "\n", "\n", "24->52\n", "\n", "\n", "\n", "\n", "\n", "24->53\n", "\n", "\n", "\n", "\n", "\n", "25->34\n", "\n", "\n", "\n", "\n", "\n", "25->38\n", "\n", "\n", "\n", "\n", "\n", "26->33\n", "\n", "\n", "\n", "\n", "\n", "32\n", "d\n", "\n", "\n", "\n", "27->32\n", "\n", "\n", "\n", "\n", "\n", "29\n", "scr\n", "\n", "\n", "\n", "28->29\n", "\n", "\n", "\n", "\n", "\n", "29->37\n", "\n", "\n", "\n", "\n", "\n", "30\n", "ocr\n", "\n", "\n", "\n", "30->37\n", "\n", "\n", "\n", "\n", "\n", "35\n", "Re\n", "\n", "\n", "\n", "31->35\n", "\n", "\n", "\n", "\n", "\n", "32->35\n", "\n", "\n", "\n", "\n", "\n", "32->37\n", "\n", "\n", "\n", "\n", "\n", "33->35\n", "\n", "\n", "\n", "\n", "\n", "34->37\n", "\n", "\n", "\n", "\n", "\n", "36\n", "Nu\n", "\n", "\n", "\n", "35->36\n", "\n", "\n", "\n", "\n", "\n", "36->37\n", "\n", "\n", "\n", "\n", "\n", "37->39\n", "\n", "\n", "\n", "\n", "\n", "86\n", "H\n", "\n", "\n", "\n", "37->86\n", "\n", "\n", "\n", "\n", "\n", "38->39\n", "\n", "\n", "\n", "\n", "\n", "39->46\n", "\n", "\n", "\n", "\n", "\n", "56\n", "gv\n", "\n", "\n", "\n", "39->56\n", "\n", "\n", "\n", "\n", "\n", "57\n", "rbc\n", "\n", "\n", "\n", "39->57\n", "\n", "\n", "\n", "\n", "\n", "40\n", "gs\n", "\n", "\n", "\n", "40->56\n", "\n", "\n", "\n", "\n", "\n", "58\n", "rsc\n", "\n", "\n", "\n", "40->58\n", "\n", "\n", "\n", "\n", "\n", "41\n", "A_net\n", "\n", "\n", "\n", "41->40\n", "\n", "\n", "\n", "\n", "\n", "43\n", "Cs\n", "\n", "\n", "\n", "41->43\n", "\n", "\n", "\n", "\n", "\n", "41->46\n", "\n", "\n", "\n", "\n", "\n", "65\n", "Ci\n", "\n", "\n", "\n", "41->65\n", "\n", "\n", "\n", "\n", "\n", "130\n", "A_gross\n", "\n", "\n", "\n", "41->130\n", "\n", "\n", "\n", "\n", "\n", "42->40\n", "\n", "\n", "\n", "\n", "\n", "42->46\n", "\n", "\n", "\n", "\n", "\n", "43->40\n", "\n", "\n", "\n", "\n", "\n", "43->46\n", "\n", "\n", "\n", "\n", "\n", "44\n", "fΨv\n", "\n", "\n", "\n", "44->40\n", "\n", "\n", "\n", "\n", "\n", "44->46\n", "\n", "\n", "\n", "\n", "\n", "45->40\n", "\n", "\n", "\n", "\n", "\n", "45->46\n", "\n", "\n", "\n", "\n", "\n", "46->40\n", "\n", "\n", "\n", "\n", "\n", "46->93\n", "\n", "\n", "\n", "\n", "\n", "47\n", "Aj\n", "\n", "\n", "\n", "47->41\n", "\n", "\n", "\n", "\n", "\n", "48\n", "Ac\n", "\n", "\n", "\n", "48->41\n", "\n", "\n", "\n", "\n", "\n", "49\n", "Ap\n", "\n", "\n", "\n", "49->41\n", "\n", "\n", "\n", "\n", "\n", "81\n", "Tk\n", "\n", "\n", "\n", "50->81\n", "\n", "\n", "\n", "\n", "\n", "50->84\n", "\n", "\n", "\n", "\n", "\n", "50->93\n", "\n", "\n", "\n", "\n", "\n", "96\n", "kT\n", "\n", "\n", "\n", "50->96\n", "\n", "\n", "\n", "\n", "\n", "99\n", "kTQ10\n", "\n", "\n", "\n", "50->99\n", "\n", "\n", "\n", "\n", "\n", "51->50\n", "\n", "\n", "\n", "\n", "\n", "51->86\n", "\n", "\n", "\n", "\n", "\n", "88\n", "ΔT\n", "\n", "\n", "\n", "51->88\n", "\n", "\n", "\n", "\n", "\n", "52->57\n", "\n", "\n", "\n", "\n", "\n", "53->58\n", "\n", "\n", "\n", "\n", "\n", "54->43\n", "\n", "\n", "\n", "\n", "\n", "62\n", "Cimax\n", "\n", "\n", "\n", "54->62\n", "\n", "\n", "\n", "\n", "\n", "54->65\n", "\n", "\n", "\n", "\n", "\n", "55\n", "gbc\n", "\n", "\n", "\n", "55->43\n", "\n", "\n", "\n", "\n", "\n", "85\n", "E\n", "\n", "\n", "\n", "56->85\n", "\n", "\n", "\n", "\n", "\n", "57->55\n", "\n", "\n", "\n", "\n", "\n", "59\n", "rvc\n", "\n", "\n", "\n", "57->59\n", "\n", "\n", "\n", "\n", "\n", "58->59\n", "\n", "\n", "\n", "\n", "\n", "60\n", "gsc\n", "\n", "\n", "\n", "58->60\n", "\n", "\n", "\n", "\n", "\n", "61\n", "gvc\n", "\n", "\n", "\n", "59->61\n", "\n", "\n", "\n", "\n", "\n", "61->65\n", "\n", "\n", "\n", "\n", "\n", "62->64\n", "\n", "\n", "\n", "\n", "\n", "62->65\n", "\n", "\n", "\n", "\n", "\n", "63\n", "Cimin\n", "\n", "\n", "\n", "63->64\n", "\n", "\n", "\n", "\n", "\n", "63->65\n", "\n", "\n", "\n", "\n", "\n", "64->47\n", "\n", "\n", "\n", "\n", "\n", "64->48\n", "\n", "\n", "\n", "\n", "\n", "64->65\n", "\n", "\n", "\n", "\n", "\n", "69\n", "Ia\n", "\n", "\n", "\n", "66->69\n", "\n", "\n", "\n", "\n", "\n", "76\n", "PAR\n", "\n", "\n", "\n", "66->76\n", "\n", "\n", "\n", "\n", "\n", "67->69\n", "\n", "\n", "\n", "\n", "\n", "70\n", "I2\n", "\n", "\n", "\n", "68->70\n", "\n", "\n", "\n", "\n", "\n", "69->70\n", "\n", "\n", "\n", "\n", "\n", "120\n", "J\n", "\n", "\n", "\n", "70->120\n", "\n", "\n", "\n", "\n", "\n", "71->79\n", "\n", "\n", "\n", "\n", "\n", "80\n", "R_leaf\n", "\n", "\n", "\n", "71->80\n", "\n", "\n", "\n", "\n", "\n", "72\n", "σ\n", "\n", "\n", "\n", "72->79\n", "\n", "\n", "\n", "\n", "\n", "72->80\n", "\n", "\n", "\n", "\n", "\n", "87\n", "λE\n", "\n", "\n", "\n", "73->87\n", "\n", "\n", "\n", "\n", "\n", "74->86\n", "\n", "\n", "\n", "\n", "\n", "75\n", "k\n", "\n", "\n", "\n", "75->76\n", "\n", "\n", "\n", "\n", "\n", "78\n", "R_sw\n", "\n", "\n", "\n", "76->78\n", "\n", "\n", "\n", "\n", "\n", "77->78\n", "\n", "\n", "\n", "\n", "\n", "83\n", "R_net\n", "\n", "\n", "\n", "78->83\n", "\n", "\n", "\n", "\n", "\n", "82\n", "R_thermal\n", "\n", "\n", "\n", "79->82\n", "\n", "\n", "\n", "\n", "\n", "80->82\n", "\n", "\n", "\n", "\n", "\n", "81->80\n", "\n", "\n", "\n", "\n", "\n", "81->96\n", "\n", "\n", "\n", "\n", "\n", "97\n", "kTpeak\n", "\n", "\n", "\n", "81->97\n", "\n", "\n", "\n", "\n", "\n", "82->83\n", "\n", "\n", "\n", "\n", "\n", "83->88\n", "\n", "\n", "\n", "\n", "\n", "84->85\n", "\n", "\n", "\n", "\n", "\n", "85->87\n", "\n", "\n", "\n", "\n", "\n", "86->88\n", "\n", "\n", "\n", "\n", "\n", "87->88\n", "\n", "\n", "\n", "\n", "\n", "90\n", "Ψv\n", "\n", "\n", "\n", "89->90\n", "\n", "\n", "\n", "\n", "\n", "90->44\n", "\n", "\n", "\n", "\n", "\n", "91->44\n", "\n", "\n", "\n", "\n", "\n", "92->44\n", "\n", "\n", "\n", "\n", "\n", "95\n", "Tbk\n", "\n", "\n", "\n", "94->95\n", "\n", "\n", "\n", "\n", "\n", "94->96\n", "\n", "\n", "\n", "\n", "\n", "94->99\n", "\n", "\n", "\n", "\n", "\n", "95->96\n", "\n", "\n", "\n", "\n", "\n", "95->97\n", "\n", "\n", "\n", "\n", "\n", "96->97\n", "\n", "\n", "\n", "\n", "\n", "105\n", "Kc\n", "\n", "\n", "\n", "96->105\n", "\n", "\n", "\n", "\n", "\n", "108\n", "Ko\n", "\n", "\n", "\n", "96->108\n", "\n", "\n", "\n", "\n", "\n", "113\n", "Vcmax\n", "\n", "\n", "\n", "96->113\n", "\n", "\n", "\n", "\n", "\n", "123\n", "Tp\n", "\n", "\n", "\n", "96->123\n", "\n", "\n", "\n", "\n", "\n", "126\n", "Rd\n", "\n", "\n", "\n", "96->126\n", "\n", "\n", "\n", "\n", "\n", "129\n", "Γ\n", "\n", "\n", "\n", "96->129\n", "\n", "\n", "\n", "\n", "\n", "118\n", "Jmax\n", "\n", "\n", "\n", "97->118\n", "\n", "\n", "\n", "\n", "\n", "98->99\n", "\n", "\n", "\n", "\n", "\n", "100->102\n", "\n", "\n", "\n", "\n", "\n", "101->102\n", "\n", "\n", "\n", "\n", "\n", "102->113\n", "\n", "\n", "\n", "\n", "\n", "102->118\n", "\n", "\n", "\n", "\n", "\n", "102->123\n", "\n", "\n", "\n", "\n", "\n", "103->105\n", "\n", "\n", "\n", "\n", "\n", "104->105\n", "\n", "\n", "\n", "\n", "\n", "110\n", "Km\n", "\n", "\n", "\n", "105->110\n", "\n", "\n", "\n", "\n", "\n", "106->108\n", "\n", "\n", "\n", "\n", "\n", "107->108\n", "\n", "\n", "\n", "\n", "\n", "108->110\n", "\n", "\n", "\n", "\n", "\n", "109->110\n", "\n", "\n", "\n", "\n", "\n", "110->48\n", "\n", "\n", "\n", "\n", "\n", "111->113\n", "\n", "\n", "\n", "\n", "\n", "112->113\n", "\n", "\n", "\n", "\n", "\n", "113->48\n", "\n", "\n", "\n", "\n", "\n", "114->118\n", "\n", "\n", "\n", "\n", "\n", "115->118\n", "\n", "\n", "\n", "\n", "\n", "116->118\n", "\n", "\n", "\n", "\n", "\n", "117->118\n", "\n", "\n", "\n", "\n", "\n", "118->120\n", "\n", "\n", "\n", "\n", "\n", "119->120\n", "\n", "\n", "\n", "\n", "\n", "120->47\n", "\n", "\n", "\n", "\n", "\n", "121->123\n", "\n", "\n", "\n", "\n", "\n", "122->123\n", "\n", "\n", "\n", "\n", "\n", "123->49\n", "\n", "\n", "\n", "\n", "\n", "124->126\n", "\n", "\n", "\n", "\n", "\n", "125->126\n", "\n", "\n", "\n", "\n", "\n", "126->47\n", "\n", "\n", "\n", "\n", "\n", "126->48\n", "\n", "\n", "\n", "\n", "\n", "126->49\n", "\n", "\n", "\n", "\n", "\n", "126->130\n", "\n", "\n", "\n", "\n", "\n", "127->129\n", "\n", "\n", "\n", "\n", "\n", "128->129\n", "\n", "\n", "\n", "\n", "\n", "129->47\n", "\n", "\n", "\n", "\n", "\n", "129->48\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "\u001b[90m[\u001b[39m\u001b[94mk\u001b[39m\u001b[90m → \u001b[39m\u001b[94mσ\u001b[39m\u001b[90m → \u001b[39m\u001b[94mCimin\u001b[39m\u001b[90m → \u001b[39m\u001b[94mocr\u001b[39m\u001b[90m → \u001b[39m\u001b[94mSLA\u001b[39m\u001b[90m → \u001b[39m\u001b[94mconfig\u001b[39m\u001b[90m → \u001b[39m\u001b[94mEag\u001b[39m\u001b[90m → \u001b[39m\u001b[94mΓ25\u001b[39m\u001b[90m → \u001b[39m\u001b[94mEar\u001b[39m\u001b[90m → \u001b[39m\u001b[94mRd25\u001b[39m\u001b[90m → \u001b[39m\u001b[94mEaTp\u001b[39m\u001b[90m → \u001b[39m\u001b[94mTp25\u001b[39m\u001b[90m → \u001b[39m\u001b[94mθ\u001b[39m\u001b[90m → \u001b[39m\u001b[94mToj\u001b[39m\u001b[90m → \u001b[39m\u001b[94mHdj\u001b[39m\u001b[90m → \u001b[39m\u001b[94mHaj\u001b[39m\u001b[90m → \u001b[39m\u001b[94mJm25\u001b[39m\u001b[90m → \u001b[39m\u001b[94mEaVc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mVcm25\u001b[39m\u001b[90m → \u001b[39m\u001b[94mOm\u001b[39m\u001b[90m → \u001b[39m\u001b[94mEao\u001b[39m\u001b[90m → \u001b[39m\u001b[94mKo25\u001b[39m\u001b[90m → \u001b[39m\u001b[94mEac\u001b[39m\u001b[90m → \u001b[39m\u001b[94mKc25\u001b[39m\u001b[90m → \u001b[39m\u001b[94mN0\u001b[39m\u001b[90m → \u001b[39m\u001b[94ms\u001b[39m\u001b[90m → \u001b[39m\u001b[94mQ10\u001b[39m\u001b[90m → \u001b[39m\u001b[94mTb\u001b[39m\u001b[90m → \u001b[39m\u001b[94mTbk\u001b[39m\u001b[90m → \u001b[39m\u001b[94msf\u001b[39m\u001b[90m → \u001b[39m\u001b[94mΨf\u001b[39m\u001b[90m → \u001b[39m\u001b[94mWP_leaf\u001b[39m\u001b[90m → \u001b[39m\u001b[94mΨv\u001b[39m\u001b[90m → \u001b[39m\u001b[94mfΨv\u001b[39m\u001b[90m → \u001b[39m\u001b[94mα_s\u001b[39m\u001b[90m → \u001b[39m\u001b[94mCp\u001b[39m\u001b[90m → \u001b[39m\u001b[94mλ\u001b[39m\u001b[90m → \u001b[39m\u001b[94mϵ\u001b[39m\u001b[90m → \u001b[39m\u001b[94mf\u001b[39m\u001b[90m → \u001b[39m\u001b[94mδ\u001b[39m\u001b[90m → \u001b[39m\u001b[94mg1\u001b[39m\u001b[90m → \u001b[39m\u001b[94mg0\u001b[39m\u001b[90m → \u001b[39m\u001b[94msr\u001b[39m\u001b[90m → \u001b[39m\u001b[94mscr\u001b[39m\u001b[90m → \u001b[39m\u001b[94mw\u001b[39m\u001b[90m → \u001b[39m\u001b[94md\u001b[39m\u001b[90m → \u001b[39m\u001b[94mDm\u001b[39m\u001b[90m → \u001b[39m\u001b[94mv\u001b[39m\u001b[90m → \u001b[39m\u001b[94mDh\u001b[39m\u001b[90m → \u001b[39m\u001b[94mκ\u001b[39m\u001b[90m → \u001b[39m\u001b[94mDc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mDw\u001b[39m\u001b[90m → \u001b[39m\u001b[94mdra\u001b[39m\u001b[90m → \u001b[39m\u001b[94mdrb\u001b[39m\u001b[90m → \u001b[39m\u001b[94mrhw\u001b[39m\u001b[90m → \u001b[39m\u001b[94m__Nitrogen__c\u001b[39m\u001b[90m → \u001b[39m\u001b[94m__Nitrogen__b\u001b[39m\u001b[90m → \u001b[39m\u001b[94m__Nitrogen__a\u001b[39m\u001b[90m → \u001b[39m\u001b[94mSPAD\u001b[39m\u001b[90m → \u001b[39m\u001b[94mN\u001b[39m\u001b[90m → \u001b[39m\u001b[94mkN\u001b[39m\u001b[90m → \u001b[39m\u001b[94mNp\u001b[39m\u001b[90m → \u001b[39m\u001b[94mP_air\u001b[39m\u001b[90m → \u001b[39m\u001b[94mwind\u001b[39m\u001b[90m → \u001b[39m\u001b[94mu\u001b[39m\u001b[90m → \u001b[39m\u001b[94mRe\u001b[39m\u001b[90m → \u001b[39m\u001b[94mNu\u001b[39m\u001b[90m → \u001b[39m\u001b[94mT_air\u001b[39m\u001b[90m → \u001b[39m\u001b[94mTk_air\u001b[39m\u001b[90m → \u001b[39m\u001b[94mR_wall\u001b[39m\u001b[90m → \u001b[39m\u001b[94mgh\u001b[39m\u001b[90m → \u001b[39m\u001b[94mgb\u001b[39m\u001b[90m → \u001b[39m\u001b[94mrbc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mgbc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mRH\u001b[39m\u001b[90m → \u001b[39m\u001b[94mCO2\u001b[39m\u001b[90m → \u001b[39m\u001b[94mCa\u001b[39m\u001b[90m → \u001b[39m\u001b[94mCimax\u001b[39m\u001b[90m → \u001b[39m\u001b[94mPFD\u001b[39m\u001b[90m → \u001b[39m\u001b[94mPPFD\u001b[39m\u001b[90m → \u001b[39m\u001b[94mPAR\u001b[39m\u001b[90m → \u001b[39m\u001b[94mR_sw\u001b[39m\u001b[90m → \u001b[39m\u001b[94mIa\u001b[39m\u001b[90m → \u001b[39m\u001b[94mI2\u001b[39m\u001b[90m → \u001b[39m\u001b[94m∘context\u001b[39m\u001b[90m → \u001b[39m\u001b[94mcontext\u001b[39m\u001b[90m → \u001b[39m\u001b[94m∘Ci\u001b[39m\u001b[90m → \u001b[39m\u001b[94m∘ΔT\u001b[39m\u001b[90m → \u001b[39m\u001b[94mH\u001b[39m\u001b[90m → \u001b[39m\u001b[94mT\u001b[39m\u001b[90m → \u001b[39m\u001b[94mkTQ10\u001b[39m\u001b[90m → \u001b[39m\u001b[94mTk\u001b[39m\u001b[90m → \u001b[39m\u001b[94mkT\u001b[39m\u001b[90m → \u001b[39m\u001b[94mΓ\u001b[39m\u001b[90m → \u001b[39m\u001b[94mRd\u001b[39m\u001b[90m → \u001b[39m\u001b[94mTp\u001b[39m\u001b[90m → \u001b[39m\u001b[94mAp\u001b[39m\u001b[90m → \u001b[39m\u001b[94mVcmax\u001b[39m\u001b[90m → \u001b[39m\u001b[94mKo\u001b[39m\u001b[90m → \u001b[39m\u001b[94mKc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mKm\u001b[39m\u001b[90m → \u001b[39m\u001b[94mAc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mkTpeak\u001b[39m\u001b[90m → \u001b[39m\u001b[94mJmax\u001b[39m\u001b[90m → \u001b[39m\u001b[94mJ\u001b[39m\u001b[90m → \u001b[39m\u001b[94mAj\u001b[39m\u001b[90m → \u001b[39m\u001b[94mA_net\u001b[39m\u001b[90m → \u001b[39m\u001b[94mA_gross\u001b[39m\u001b[90m → \u001b[39m\u001b[94mCs\u001b[39m\u001b[90m → \u001b[39m\u001b[94mhs\u001b[39m\u001b[90m → \u001b[39m\u001b[94mgs\u001b[39m\u001b[90m → \u001b[39m\u001b[94mrsc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mgsc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mrvc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mgvc\u001b[39m\u001b[90m → \u001b[39m\u001b[94mCi\u001b[39m\u001b[90m → \u001b[39m\u001b[94mgv\u001b[39m\u001b[90m → \u001b[39m\u001b[94mR_leaf\u001b[39m\u001b[90m → \u001b[39m\u001b[94mR_thermal\u001b[39m\u001b[90m → \u001b[39m\u001b[94mR_net\u001b[39m\u001b[90m → \u001b[39m\u001b[94mvp\u001b[39m\u001b[90m → \u001b[39m\u001b[94mDs\u001b[39m\u001b[90m → \u001b[39m\u001b[94mΔw\u001b[39m\u001b[90m → \u001b[39m\u001b[94mE\u001b[39m\u001b[90m → \u001b[39m\u001b[94mλE\u001b[39m\u001b[90m → \u001b[39m\u001b[94mΔT\u001b[39m\u001b[90m → \u001b[39m\u001b[94mVPD_s\u001b[39m\u001b[90m → \u001b[39m\u001b[94mVPD_Δ\u001b[39m\u001b[90m → \u001b[39m\u001b[94mVPD\u001b[39m\u001b[90m → \u001b[39m\u001b[94m⋆context\u001b[39m\u001b[90m]\u001b[39m" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Cropbox.dependency(LeafGasExchange.ModelC3BB)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "의존관계도(dependency graph)를 살펴보면 지금까지 다루었던 모형과는 달리 굉장히 많은 변수들이 포함되어 있는 것을 알 수 있습니다. 하지만 결국 확인하고 싶은 것은 앞의 간단한 광합성 모형과 마찬가지로 총광합성율($A_g$) 혹은 순광합성율($A_n$)과 같은 값일 것입니다. 여기서 순광합성율(`A_n`)은 아래와 같이 구현되어 있습니다." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[90m[doc]\u001b[39m\n", "\n", "\u001b[90m[code]\u001b[39m\n", "\u001b[22;23;24m \u001b[38;2;66;102;213;22;23;24mA_net\u001b[39m\u001b[22;23;24m(\u001b[22;23;24mAc\u001b[22;23;24m,\u001b[22;23;24m \u001b[22;23;24mAj\u001b[22;23;24m,\u001b[22;23;24m \u001b[22;23;24mAp\u001b[22;23;24m)\u001b[38;2;102;102;102;1;23;24m:\u001b[39;22m\u001b[22;23;24mnet_photosynthesis\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m=>\u001b[39;22m\u001b[22;23;24m \u001b[38;2;148;91;176;1;23;24mbegin\u001b[39;22m\u001b[22;23;24m\n", " \u001b[38;2;153;153;119;22;3;24m#= /Users/tomyun/.julia/packages/LeafGasExchange/I1nMc/src/c3.jl:92 =#\u001b[39;23m\u001b[22;23;24m\n", " \u001b[38;2;66;102;213;22;23;24mmin\u001b[39m\u001b[22;23;24m(\u001b[22;23;24mAc\u001b[22;23;24m,\u001b[22;23;24m \u001b[22;23;24mAj\u001b[22;23;24m,\u001b[22;23;24m \u001b[22;23;24mAp\u001b[22;23;24m)\u001b[22;23;24m\n", " \u001b[38;2;148;91;176;1;23;24mend\u001b[39;22m\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m~\u001b[39;22m\u001b[22;23;24m \u001b[38;2;66;102;213;22;23;24mtrack\u001b[39m\u001b[22;23;24m(\u001b[38;2;201;61;57;22;23;24mu\"μmol/m^2/s\"\u001b[39m\u001b[22;23;24m)" ] } ], "source": [ "@look LeafGasExchange.ModelC3BB.A_net" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "C3 광합성의 주요한 제한 요인들, 즉 이산화탄소($\\mathrm{CO_2}$ 혹은 RuBisCo 효소와 같은 기질의 부족(carboxylation-limited)인지, 아니면 전자전달계의 부하로 인한 제한(RuBP-renegeration limited)인지, 혹은 최종 산물의 수송이 저하되어 발생하는 제한(triose phosphate utilization-limited)인지에 따라 각각의 잠재 광합성율(`Ac`, `Aj`, `Ap`)이 계산되고 그중에서 가장 제한이 많이 걸리는 쪽, 다시 말해 최소값이 최종 광합성율로 채택됩니다.\n", "\n", "기질 부족으로 인한 광합성율(`Ac`)은 대개 이산화탄소 분압이 낮은 단계에서 발생하는데, 이러한 생화학적 기작은 앞서 보았던 광량에 따른 광합성율 수식과 유사한 쌍곡선의 형태로 구현되고 있습니다." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[90m[doc]\u001b[39m\n", "\n", "\u001b[90m[code]\u001b[39m\n", "\u001b[22;23;24m \u001b[38;2;66;102;213;22;23;24mAc\u001b[39m\u001b[22;23;24m(\u001b[22;23;24mVcmax\u001b[22;23;24m,\u001b[22;23;24m \u001b[22;23;24mCi\u001b[22;23;24m,\u001b[22;23;24m \u001b[22;23;24mΓ\u001b[22;23;24m,\u001b[22;23;24m \u001b[22;23;24mKm\u001b[22;23;24m,\u001b[22;23;24m \u001b[22;23;24mRd\u001b[22;23;24m)\u001b[38;2;102;102;102;1;23;24m:\u001b[39;22m\u001b[22;23;24menzyme_limited_photosynthesis_rate\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m=>\u001b[39;22m\u001b[22;23;24m \u001b[38;2;148;91;176;1;23;24mbegin\u001b[39;22m\u001b[22;23;24m\n", " \u001b[38;2;153;153;119;22;3;24m#= /Users/tomyun/.julia/packages/LeafGasExchange/I1nMc/src/c3.jl:79 =#\u001b[39;23m\u001b[22;23;24m\n", " \u001b[22;23;24m(\u001b[22;23;24mVcmax\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m*\u001b[39;22m\u001b[22;23;24m \u001b[22;23;24m(\u001b[22;23;24mCi\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m-\u001b[39;22m\u001b[22;23;24m \u001b[22;23;24mΓ\u001b[22;23;24m))\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m/\u001b[39;22m\u001b[22;23;24m \u001b[22;23;24m(\u001b[22;23;24mCi\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m+\u001b[39;22m\u001b[22;23;24m \u001b[22;23;24mKm\u001b[22;23;24m)\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m-\u001b[39;22m\u001b[22;23;24m \u001b[22;23;24mRd\u001b[22;23;24m\n", " \u001b[38;2;148;91;176;1;23;24mend\u001b[39;22m\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m~\u001b[39;22m\u001b[22;23;24m \u001b[38;2;66;102;213;22;23;24mtrack\u001b[39m\u001b[22;23;24m(\u001b[38;2;201;61;57;22;23;24mu\"μmol/m^2/s\"\u001b[39m\u001b[22;23;24m)" ] } ], "source": [ "@look LeafGasExchange.ModelC3BB.Ac" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "단, 각각의 모수 혹은 모수처럼 보이지만 사실은 또 다른 수식으로 표현되는 변수들이 워낙 많기 때문에 한눈에 모든 것을 파악하기는 쉽지 않습니다. 예를 들어 위에서 쓰인 `Vcmax`는 이산화탄소를 기질로 하는 RuBisCo 효소의 최대 반응속도이며, 앞의 `Amax`처럼 고정된 상수를 도입할 수도 있는 부분입니다. 하지만 온도에 따른 생화학 반응의 차이를 반영하기 위해 내부적으로는 [아레니우스 방정식(Arrhenius equation)](https://en.wikipedia.org/wiki/Arrhenius_equation)에 대입하여 계산하도록 되어 있습니다." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[90m[doc]\u001b[39m\n", "\n", "\u001b[90m[code]\u001b[39m\n", "\u001b[22;23;24m \u001b[38;2;66;102;213;22;23;24mVcmax\u001b[39m\u001b[22;23;24m(\u001b[22;23;24mVcm25\u001b[22;23;24m,\u001b[22;23;24m \u001b[22;23;24mkT\u001b[22;23;24m,\u001b[22;23;24m \u001b[22;23;24mEaVc\u001b[22;23;24m,\u001b[22;23;24m \u001b[22;23;24mkN\u001b[22;23;24m)\u001b[38;2;102;102;102;1;23;24m:\u001b[39;22m\u001b[22;23;24mmaximum_carboxylation_rate\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m=>\u001b[39;22m\u001b[22;23;24m \u001b[38;2;148;91;176;1;23;24mbegin\u001b[39;22m\u001b[22;23;24m\n", " \u001b[38;2;153;153;119;22;3;24m#= /Users/tomyun/.julia/packages/LeafGasExchange/I1nMc/src/c3.jl:30 =#\u001b[39;23m\u001b[22;23;24m\n", " \u001b[22;23;24mVcm25\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m*\u001b[39;22m\u001b[22;23;24m \u001b[38;2;66;102;213;22;23;24mkT\u001b[39m\u001b[22;23;24m(\u001b[22;23;24mEaVc\u001b[22;23;24m)\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m*\u001b[39;22m\u001b[22;23;24m \u001b[22;23;24mkN\u001b[22;23;24m\n", " \u001b[38;2;148;91;176;1;23;24mend\u001b[39;22m\u001b[22;23;24m \u001b[38;2;102;102;102;1;23;24m~\u001b[39;22m\u001b[22;23;24m \u001b[38;2;66;102;213;22;23;24mtrack\u001b[39m\u001b[22;23;24m(\u001b[38;2;201;61;57;22;23;24mu\"μmol/m^2/s\"\u001b[39m\u001b[22;23;24m)" ] } ], "source": [ "@look LeafGasExchange.ModelC3BB.Vcmax" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이처럼 많은 변수들을 한곳에서 모두 정리하기에는 너무 복잡하기 때문에 실제 모형 명세는 관련된 변수들끼리 묶인 시스템 단위로 잘개 쪼개져 있습니다. 이러한 시스템간의 구조도는 `Cropbox.hierarchy()` 함수를 이용해 확인할 수 있습니다." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "%3\n", "\n", "\n", "\n", "1\n", "ModelC3BB\n", "\n", "\n", "\n", "2\n", "ModelBase\n", "\n", "\n", "\n", "2->1\n", "\n", "\n", "\n", "\n", "\n", "3\n", "Weather\n", "\n", "\n", "\n", "3->2\n", "\n", "\n", "\n", "\n", "\n", "8\n", "BoundaryLayer\n", "\n", "\n", "\n", "3->8\n", "\n", "\n", "\n", "\n", "\n", "10\n", "StomataBase\n", "\n", "\n", "\n", "3->10\n", "\n", "\n", "\n", "\n", "\n", "11\n", "IntercellularSpace\n", "\n", "\n", "\n", "3->11\n", "\n", "\n", "\n", "\n", "\n", "13\n", "EnergyBalance\n", "\n", "\n", "\n", "3->13\n", "\n", "\n", "\n", "\n", "\n", "4\n", "Context\n", "\n", "\n", "\n", "4->1\n", "\n", "\n", "\n", "\n", "\n", "4->2\n", "\n", "\n", "\n", "\n", "\n", "4->3\n", "\n", "\n", "\n", "\n", "\n", "6\n", "VaporPressure\n", "\n", "\n", "\n", "4->6\n", "\n", "\n", "\n", "\n", "\n", "7\n", "Nitrogen\n", "\n", "\n", "\n", "4->7\n", "\n", "\n", "\n", "\n", "\n", "4->8\n", "\n", "\n", "\n", "\n", "\n", "9\n", "Diffusion\n", "\n", "\n", "\n", "4->9\n", "\n", "\n", "\n", "\n", "\n", "4->10\n", "\n", "\n", "\n", "\n", "\n", "4->11\n", "\n", "\n", "\n", "\n", "\n", "12\n", "Irradiance\n", "\n", "\n", "\n", "4->12\n", "\n", "\n", "\n", "\n", "\n", "4->13\n", "\n", "\n", "\n", "\n", "\n", "14\n", "StomataBallBerry\n", "\n", "\n", "\n", "4->14\n", "\n", "\n", "\n", "\n", "\n", "15\n", "StomataTuzet\n", "\n", "\n", "\n", "4->15\n", "\n", "\n", "\n", "\n", "\n", "16\n", "C3\n", "\n", "\n", "\n", "4->16\n", "\n", "\n", "\n", "\n", "\n", "17\n", "C3Rate\n", "\n", "\n", "\n", "4->17\n", "\n", "\n", "\n", "\n", "\n", "18\n", "C3c\n", "\n", "\n", "\n", "4->18\n", "\n", "\n", "\n", "\n", "\n", "19\n", "C3Base\n", "\n", "\n", "\n", "4->19\n", "\n", "\n", "\n", "\n", "\n", "20\n", "CBase\n", "\n", "\n", "\n", "4->20\n", "\n", "\n", "\n", "\n", "\n", "21\n", "TemperatureDependence\n", "\n", "\n", "\n", "4->21\n", "\n", "\n", "\n", "\n", "\n", "22\n", "NitrogenDependence\n", "\n", "\n", "\n", "4->22\n", "\n", "\n", "\n", "\n", "\n", "23\n", "C3j\n", "\n", "\n", "\n", "4->23\n", "\n", "\n", "\n", "\n", "\n", "24\n", "C3p\n", "\n", "\n", "\n", "4->24\n", "\n", "\n", "\n", "\n", "\n", "25\n", "C3r\n", "\n", "\n", "\n", "4->25\n", "\n", "\n", "\n", "\n", "\n", "26\n", "Controller\n", "\n", "\n", "\n", "4->26\n", "\n", "\n", "\n", "\n", "\n", "5\n", "Clock\n", "\n", "\n", "\n", "5->4\n", "\n", "\n", "\n", "\n", "\n", "6->1\n", "\n", "\n", "\n", "\n", "\n", "6->2\n", "\n", "\n", "\n", "\n", "\n", "6->3\n", "\n", "\n", "\n", "\n", "\n", "6->8\n", "\n", "\n", "\n", "\n", "\n", "6->10\n", "\n", "\n", "\n", "\n", "\n", "6->11\n", "\n", "\n", "\n", "\n", "\n", "6->13\n", "\n", "\n", "\n", "\n", "\n", "6->14\n", "\n", "\n", "\n", "\n", "\n", "7->2\n", "\n", "\n", "\n", "\n", "\n", "8->2\n", "\n", "\n", "\n", "\n", "\n", "9->8\n", "\n", "\n", "\n", "\n", "\n", "9->10\n", "\n", "\n", "\n", "\n", "\n", "10->2\n", "\n", "\n", "\n", "\n", "\n", "10->14\n", "\n", "\n", "\n", "\n", "\n", "11->2\n", "\n", "\n", "\n", "\n", "\n", "12->2\n", "\n", "\n", "\n", "\n", "\n", "13->2\n", "\n", "\n", "\n", "\n", "\n", "14->1\n", "\n", "\n", "\n", "\n", "\n", "15->14\n", "\n", "\n", "\n", "\n", "\n", "16->1\n", "\n", "\n", "\n", "\n", "\n", "17->16\n", "\n", "\n", "\n", "\n", "\n", "18->17\n", "\n", "\n", "\n", "\n", "\n", "19->18\n", "\n", "\n", "\n", "\n", "\n", "19->23\n", "\n", "\n", "\n", "\n", "\n", "19->24\n", "\n", "\n", "\n", "\n", "\n", "19->25\n", "\n", "\n", "\n", "\n", "\n", "20->19\n", "\n", "\n", "\n", "\n", "\n", "21->20\n", "\n", "\n", "\n", "\n", "\n", "22->20\n", "\n", "\n", "\n", "\n", "\n", "23->17\n", "\n", "\n", "\n", "\n", "\n", "24->17\n", "\n", "\n", "\n", "\n", "\n", "25->17\n", "\n", "\n", "\n", "\n", "\n", "26->1\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "\u001b[90m{\u001b[39m\u001b[95mModelC3BB\u001b[39m\u001b[90m, \u001b[39m\u001b[95mModelBase\u001b[39m\u001b[90m, \u001b[39m\u001b[95mWeather\u001b[39m\u001b[90m, \u001b[39m\u001b[95mContext\u001b[39m\u001b[90m, \u001b[39m\u001b[95mClock\u001b[39m\u001b[90m, \u001b[39m\u001b[95mVaporPressure\u001b[39m\u001b[90m, \u001b[39m\u001b[95mNitrogen\u001b[39m\u001b[90m, \u001b[39m\u001b[95mBoundaryLayer\u001b[39m\u001b[90m, \u001b[39m\u001b[95mDiffusion\u001b[39m\u001b[90m, \u001b[39m\u001b[95mStomataBase\u001b[39m\u001b[90m, \u001b[39m\u001b[95mIntercellularSpace\u001b[39m\u001b[90m, \u001b[39m\u001b[95mIrradiance\u001b[39m\u001b[90m, \u001b[39m\u001b[95mEnergyBalance\u001b[39m\u001b[90m, \u001b[39m\u001b[95mStomataBallBerry\u001b[39m\u001b[90m, \u001b[39m\u001b[95mStomataTuzet\u001b[39m\u001b[90m, \u001b[39m\u001b[95mC3\u001b[39m\u001b[90m, \u001b[39m\u001b[95mC3Rate\u001b[39m\u001b[90m, \u001b[39m\u001b[95mC3c\u001b[39m\u001b[90m, \u001b[39m\u001b[95mC3Base\u001b[39m\u001b[90m, \u001b[39m\u001b[95mCBase\u001b[39m\u001b[90m, \u001b[39m\u001b[95mTemperatureDependence\u001b[39m\u001b[90m, \u001b[39m\u001b[95mNitrogenDependence\u001b[39m\u001b[90m, \u001b[39m\u001b[95mC3j\u001b[39m\u001b[90m, \u001b[39m\u001b[95mC3p\u001b[39m\u001b[90m, \u001b[39m\u001b[95mC3r\u001b[39m\u001b[90m, \u001b[39m\u001b[95mController\u001b[39m\u001b[90m}\u001b[39m" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Cropbox.hierarchy(LeafGasExchange.ModelC3BB)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "우측에는 방금 살펴보았던 C3 광합성 관련 시스템들이 보입니다. 제한 요인의 종류에 따라 `C3c`, `C3j`, `C3p`와 같이 서로 다른 시스템이 정의되어 있는 것을 알 수 있습니다. 좌측에는 기공전도도(`StomataBallBerry`) 및 에너지 균형(`EnergyBalance`) 관련 시스템들이 보입니다. 이러한 시스템들은 몇몇 공통되는 변수들을 이용해 정의되어 있으며, 최종적으로는 이러한 시스템들이 모두 묶여 해당 변수들이 서로 공유되는 형태로 통합(coupling)이 이루어지게 됩니다. 참고로, 지난 시간 강의자료의 마지막에 나오는 내부구조 안내에서 설명하는 믹스인(mix-in)을 통한 확장의 예라고 보시면 되겠습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "하지만 이렇게 모형이 어떻게 만들어져 있는지에 대한 기술적인 부분은 모형을 불러서 사용하는 입장에서는 크게 중요하지 않은 부분일 수도 있습니다. 위에서 굉장히 복잡한 모형의 일면을 보여드렸지만, 실제 사용하는 방법은 앞서 다루었던 간단한 모형들과 크게 다를 바 없기 때문입니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "먼저 필요한 모수들을 살펴보겠습니다." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Config for 1 system:\n", " \u001b[95mModelC3BB\u001b[39m\n", " \u001b[94mPFD \u001b[39m\u001b[90m = \u001b[39mnothing\n", " \u001b[94mCO2 \u001b[39m\u001b[90m = \u001b[39mnothing\n", " \u001b[94mRH \u001b[39m\u001b[90m = \u001b[39mnothing\n", " \u001b[94mT_air \u001b[39m\u001b[90m = \u001b[39mnothing\n", " \u001b[94mwind \u001b[39m\u001b[90m = \u001b[39mnothing\n", " \u001b[94mP_air \u001b[39m\u001b[90m = \u001b[39m100 kPa\n", " \u001b[94mSPAD \u001b[39m\u001b[90m = \u001b[39m60\n", " \u001b[94m(Nitrogen) _a\u001b[39m\u001b[90m = \u001b[39m0.0004 g m⁻²\n", " \u001b[94m(Nitrogen) _b\u001b[39m\u001b[90m = \u001b[39m0.012 g m⁻²\n", " \u001b[94m(Nitrogen) _c\u001b[39m\u001b[90m = \u001b[39m0 g m⁻²\n", " \u001b[94mN \u001b[39m\u001b[90m = \u001b[39mmissing\n", " \u001b[94mDw \u001b[39m\u001b[90m = \u001b[39m24.2 mm² s⁻¹\n", " \u001b[94mDc \u001b[39m\u001b[90m = \u001b[39m14.7 mm² s⁻¹\n", " \u001b[94mDh \u001b[39m\u001b[90m = \u001b[39m21.5 mm² s⁻¹\n", " \u001b[94mDm \u001b[39m\u001b[90m = \u001b[39m15.1 mm² s⁻¹\n", " \u001b[94mw \u001b[39m\u001b[90m = \u001b[39m10 cm\n", " \u001b[94msr \u001b[39m\u001b[90m = \u001b[39m1.0\n", " \u001b[94mv \u001b[39m\u001b[90m = \u001b[39mmissing\n", " \u001b[94mκ \u001b[39m\u001b[90m = \u001b[39mmissing\n", " \u001b[94mg0 \u001b[39m\u001b[90m = \u001b[39m0.017 mol bar⁻¹ m⁻² s⁻¹\n", " \u001b[94mg1 \u001b[39m\u001b[90m = \u001b[39m4.53\n", " \u001b[94mdrb \u001b[39m\u001b[90m = \u001b[39mmissing\n", " \u001b[94mdra \u001b[39m\u001b[90m = \u001b[39mmissing\n", " \u001b[94mδ \u001b[39m\u001b[90m = \u001b[39m0.15\n", " \u001b[94mf \u001b[39m\u001b[90m = \u001b[39m0.15\n", " \u001b[94mϵ \u001b[39m\u001b[90m = \u001b[39m0.97\n", " \u001b[94mλ \u001b[39m\u001b[90m = \u001b[39m44 kJ mol⁻¹\n", " \u001b[94mCp \u001b[39m\u001b[90m = \u001b[39m29.3 J K⁻¹ mol⁻¹\n", " \u001b[94mα_s \u001b[39m\u001b[90m = \u001b[39m0.5\n", " \u001b[94mWP_leaf \u001b[39m\u001b[90m = \u001b[39m0 MPa\n", " \u001b[94mΨf \u001b[39m\u001b[90m = \u001b[39m-2.0 MPa\n", " \u001b[94msf \u001b[39m\u001b[90m = \u001b[39m2.3 MPa⁻¹\n", " \u001b[94mTb \u001b[39m\u001b[90m = \u001b[39m25 °C\n", " \u001b[94mQ10 \u001b[39m\u001b[90m = \u001b[39m2\n", " \u001b[94ms \u001b[39m\u001b[90m = \u001b[39m2.9 m² g⁻¹\n", " \u001b[94mN0 \u001b[39m\u001b[90m = \u001b[39m0.25 g m⁻²\n", " \u001b[94mKc25 \u001b[39m\u001b[90m = \u001b[39m404.9 μbar\n", " \u001b[94mEac \u001b[39m\u001b[90m = \u001b[39m79.43 kJ mol⁻¹\n", " \u001b[94mKo25 \u001b[39m\u001b[90m = \u001b[39m278.4 mbar\n", " \u001b[94mEao \u001b[39m\u001b[90m = \u001b[39m36.38 kJ mol⁻¹\n", " \u001b[94mOm \u001b[39m\u001b[90m = \u001b[39m210 mbar\n", " \u001b[94mVcm25 \u001b[39m\u001b[90m = \u001b[39m108.4 μmol m⁻² s⁻¹\n", " \u001b[94mEaVc \u001b[39m\u001b[90m = \u001b[39m52.1573 kJ mol⁻¹\n", " \u001b[94mJm25 \u001b[39m\u001b[90m = \u001b[39m169.0 μmol m⁻² s⁻¹\n", " \u001b[94mHaj \u001b[39m\u001b[90m = \u001b[39m23.9976 kJ mol⁻¹\n", " \u001b[94mHdj \u001b[39m\u001b[90m = \u001b[39m200 kJ mol⁻¹\n", " \u001b[94mToj \u001b[39m\u001b[90m = \u001b[39m42.8 °C\n", " \u001b[94mθ \u001b[39m\u001b[90m = \u001b[39m0.7\n", " \u001b[94mTp25 \u001b[39m\u001b[90m = \u001b[39m16.03 μmol m⁻² s⁻¹\n", " \u001b[94mEaTp \u001b[39m\u001b[90m = \u001b[39m47.1 kJ mol⁻¹\n", " \u001b[94mRd25 \u001b[39m\u001b[90m = \u001b[39m1.08 μmol m⁻² s⁻¹\n", " \u001b[94mEar \u001b[39m\u001b[90m = \u001b[39m49.39 kJ mol⁻¹\n", " \u001b[94mΓ25 \u001b[39m\u001b[90m = \u001b[39m42.75 μbar\n", " \u001b[94mEag \u001b[39m\u001b[90m = \u001b[39m37.83 kJ mol⁻¹" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parameters(LeafGasExchange.ModelC3BB)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "광량(`PFD`)이나 기온(`T_air`) 등 환경 조건에 대한 모수들은 기본값이 없으므로 별도의 설정을 만들어서 넣어주도록 하겠습니다." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Config for 1 system:\n", " \u001b[95mWeather\u001b[39m\n", " \u001b[94mPFD \u001b[39m\u001b[90m = \u001b[39m1500\n", " \u001b[94mCO2 \u001b[39m\u001b[90m = \u001b[39m400\n", " \u001b[94mRH \u001b[39m\u001b[90m = \u001b[39m60\n", " \u001b[94mT_air\u001b[39m\u001b[90m = \u001b[39m30\n", " \u001b[94mwind \u001b[39m\u001b[90m = \u001b[39m2.0" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ge_config = @config :Weather => (\n", " PFD = 1500,\n", " CO2 = 400,\n", " RH = 60,\n", " T_air = 30,\n", " wind = 2.0,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이제 다른 모형과 동일한 방식으로 `visualize()` 함수를 이용하여 그래프를 그릴 수 있습니다. 예를 들어 세포내 이산화탄소 분압(intercellular $[\\mathrm{CO_2}]$; $C_i$)에 따른 순광합성율(`A_net`)을 각 제한 요인에 따른 잠재 광합성율(`Ac`, `Aj`, `Ap`)과 함께 확인해보겠습니다. 보통 A-Ci 곡선이라고 부르기도 합니다." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " Ci (μbar)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 400\n", " \n", " \n", " \n", " \n", " 600\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " A_net\n", " \n", " \n", " \n", " \n", " Ac\n", " \n", " \n", " \n", " \n", " Aj\n", " \n", " \n", " \n", " \n", " Ap\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 25\n", " \n", " \n", " \n", " \n", " 50\n", " \n", " \n", " \n", " \n", " \n", " \n", " (μmol m⁻² s⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " Ci (μbar)\n", " \n", " \n", " \n", " \n", " \n", " \n", " 200\n", " \n", " \n", " \n", " \n", " 400\n", " \n", " \n", " \n", " \n", " 600\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " A_net\n", " \n", " \n", " \n", " \n", " Ac\n", " \n", " \n", " \n", " \n", " Aj\n", " \n", " \n", " \n", " \n", " Ap\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " 25\n", " \n", " \n", " \n", " \n", " 50\n", " \n", " \n", " \n", " \n", " \n", " \n", " (μmol m⁻² s⁻¹)\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n" ], "text/plain": [ "\"\"" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "visualize(LeafGasExchange.ModelC3BB, :Ci, [:A_net, :Ac, :Aj, :Ap];\n", " config = ge_config,\n", " xstep = :Weather => :CO2 => 10:10:1500,\n", " kind = :line,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "아래에는 다양한 환경 요인들을 직접 조정하여 광합성 곡선을 그려볼 수 있도록 준비해보았습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A-Ci" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "세포내 이산화탄소 분압(`Ci`)은 대기중 이산화탄소가 엽록체(chloroplast)가 있는 위치까지 확산(diffusion)되어 광합성이 이루어지며 정상상태(steady-state)에 이르렀을 때 결정되는 값입니다. 이에 따라 대기중 이산화탄소 농도(`CO2`)보다는 낮은 값을 갖는 것이 보통입니다." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "application/vnd.webio.node+json": { "children": [ { "children": [ "Weather" ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "color": "darkorchid", "font-family": "monospace" } }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "PFD" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 101, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "10844432812026513749", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0\",\"20\",\"40\",\"60\",\"80\",\"100\",\"120\",\"140\",\"160\",\"180\",\"200\",\"220\",\"240\",\"260\",\"280\",\"300\",\"320\",\"340\",\"360\",\"380\",\"400\",\"420\",\"440\",\"460\",\"480\",\"500\",\"520\",\"540\",\"560\",\"580\",\"600\",\"620\",\"640\",\"660\",\"680\",\"700\",\"720\",\"740\",\"760\",\"780\",\"800\",\"820\",\"840\",\"860\",\"880\",\"900\",\"920\",\"940\",\"960\",\"980\",\"1000\",\"1020\",\"1040\",\"1060\",\"1080\",\"1100\",\"1120\",\"1140\",\"1160\",\"1180\",\"1200\",\"1220\",\"1240\",\"1260\",\"1280\",\"1300\",\"1320\",\"1340\",\"1360\",\"1380\",\"1400\",\"1420\",\"1440\",\"1460\",\"1480\",\"1500\",\"1520\",\"1540\",\"1560\",\"1580\",\"1600\",\"1620\",\"1640\",\"1660\",\"1680\",\"1700\",\"1720\",\"1740\",\"1760\",\"1780\",\"1800\",\"1820\",\"1840\",\"1860\",\"1880\",\"1900\",\"1920\",\"1940\",\"1960\",\"1980\",\"2000\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"10844432812026513749\",\"id\":\"9740165336125406111\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"10844432812026513749\",\"id\":\"5073246285206301195\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"10844432812026513749\",\"id\":\"9740165336125406111\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"10844432812026513749\",\"id\":\"5073246285206301195\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "9740165336125406111", "sync": true, "value": 0 }, "index": { "id": "5073246285206301195", "sync": true, "value": 76 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "T_air" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 61, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "17660942257816334831", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"-10\",\"-9\",\"-8\",\"-7\",\"-6\",\"-5\",\"-4\",\"-3\",\"-2\",\"-1\",\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"17660942257816334831\",\"id\":\"8775503382348419728\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"17660942257816334831\",\"id\":\"17405353776623453546\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"17660942257816334831\",\"id\":\"8775503382348419728\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"17660942257816334831\",\"id\":\"17405353776623453546\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "8775503382348419728", "sync": true, "value": 0 }, "index": { "id": "17405353776623453546", "sync": true, "value": 41 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "webio-observable", "setInnerHtml": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n Ci (μbar)\n \n \n \n \n \n \n 0\n \n \n \n \n 200\n \n \n \n \n 400\n \n \n \n \n 600\n \n \n \n \n 800\n \n \n \n \n \n \n \n A_net\n \n \n \n \n Ac\n \n \n \n \n Aj\n \n \n \n \n Ap\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n 10\n \n \n \n \n 20\n \n \n \n \n 30\n \n \n \n \n 40\n \n \n \n \n 50\n \n \n \n \n 60\n \n \n \n \n \n \n (μmol m⁻² s⁻¹)\n \n \n \n\n\n \n \n \n\n\n" }, "type": "node" } ], "instanceArgs": { "handlers": { "obs-output": [ "function (value, scope) {\n scope.setInnerHTML(value);\n}\n" ] }, "id": "10751857578969606907", "imports": { "data": [], "type": "async_block" }, "mount_callbacks": [], "observables": { "obs-output": { "id": "4284527612441331578", "sync": false, "value": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n Ci (μbar)\n \n \n \n \n \n \n 0\n \n \n \n \n 200\n \n \n \n \n 400\n \n \n \n \n 600\n \n \n \n \n 800\n \n \n \n \n \n \n \n A_net\n \n \n \n \n Ac\n \n \n \n \n Aj\n \n \n \n \n Ap\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n 10\n \n \n \n \n 20\n \n \n \n \n 30\n \n \n \n \n 40\n \n \n \n \n 50\n \n \n \n \n 60\n \n \n \n \n \n \n (μmol m⁻² s⁻¹)\n \n \n \n\n\n \n \n \n\n\n" } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "display": "flex", "flex-direction": "column" } }, "type": "node" }, "text/html": [ "\n", " \n", "\n" ], "text/plain": [ "WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[\"Weather\"], Dict{Symbol, Any}(:style => Dict{String, Any}(\"color\" => :darkorchid, \"font-family\" => \"monospace\"))), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"PFD\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 101, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "76, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x0000000174b54780, Task (runnable) @0x0000000174b54780), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0\\\",\\\"20\\\",\\\"40\\\",\\\"60\\\",\\\"80\\\",\\\"100\\\",\\\"120\\\",\\\"140\\\",\\\"160\\\",\\\"180\\\",\\\"200\\\",\\\"220\\\",\\\"240\\\",\\\"260\\\",\\\"280\\\",\\\"300\\\",\\\"320\\\",\\\"340\\\",\\\"360\\\",\\\"380\\\",\\\"400\\\",\\\"420\\\",\\\"440\\\",\\\"460\\\",\\\"480\\\",\\\"500\\\",\\\"520\\\",\\\"540\\\",\\\"560\\\",\\\"580\\\",\\\"600\\\",\\\"620\\\",\\\"640\\\",\\\"660\\\",\\\"680\\\",\\\"700\\\",\\\"720\\\",\\\"740\\\",\\\"760\\\",\\\"780\\\",\\\"800\\\",\\\"820\\\",\\\"840\\\",\\\"860\\\",\\\"880\\\",\\\"900\\\",\\\"920\\\",\\\"940\\\",\\\"960\\\",\\\"980\\\",\\\"1000\\\",\\\"1020\\\",\\\"1040\\\",\\\"1060\\\",\\\"1080\\\",\\\"1100\\\",\\\"1120\\\",\\\"1140\\\",\\\"1160\\\",\\\"1180\\\",\\\"1200\\\",\\\"1220\\\",\\\"1240\\\",\\\"1260\\\",\\\"1280\\\",\\\"1300\\\",\\\"1320\\\",\\\"1340\\\",\\\"1360\\\",\\\"1380\\\",\\\"1400\\\",\\\"1420\\\",\\\"1440\\\",\\\"1460\\\",\\\"1480\\\",\\\"1500\\\",\\\"1520\\\",\\\"1540\\\",\\\"1560\\\",\\\"1580\\\",\\\"1600\\\",\\\"1620\\\",\\\"1640\\\",\\\"1660\\\",\\\"1680\\\",\\\"1700\\\",\\\"1720\\\",\\\"1740\\\",\\\"1760\\\",\\\"1780\\\",\\\"1800\\\",\\\"1820\\\",\\\"1840\\\",\\\"1860\\\",\\\"1880\\\",\\\"1900\\\",\\\"1920\\\",\\\"1940\\\",\\\"1960\\\",\\\"1980\\\",\\\"2000\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"10844432812026513749\\\",\\\"id\\\":\\\"9740165336125406111\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"10844432812026513749\\\",\\\"id\\\":\\\"5073246285206301195\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"10844432812026513749\\\",\\\"id\\\":\\\"9740165336125406111\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"10844432812026513749\\\",\\\"id\\\":\\\"5073246285206301195\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"T_air\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 61, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "41, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x0000000174b56430, Task (runnable) @0x0000000174b56430), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"-10\\\",\\\"-9\\\",\\\"-8\\\",\\\"-7\\\",\\\"-6\\\",\\\"-5\\\",\\\"-4\\\",\\\"-3\\\",\\\"-2\\\",\\\"-1\\\",\\\"0\\\",\\\"1\\\",\\\"2\\\",\\\"3\\\",\\\"4\\\",\\\"5\\\",\\\"6\\\",\\\"7\\\",\\\"8\\\",\\\"9\\\",\\\"10\\\",\\\"11\\\",\\\"12\\\",\\\"13\\\",\\\"14\\\",\\\"15\\\",\\\"16\\\",\\\"17\\\",\\\"18\\\",\\\"19\\\",\\\"20\\\",\\\"21\\\",\\\"22\\\",\\\"23\\\",\\\"24\\\",\\\"25\\\",\\\"26\\\",\\\"27\\\",\\\"28\\\",\\\"29\\\",\\\"30\\\",\\\"31\\\",\\\"32\\\",\\\"33\\\",\\\"34\\\",\\\"35\\\",\\\"36\\\",\\\"37\\\",\\\"38\\\",\\\"39\\\",\\\"40\\\",\\\"41\\\",\\\"42\\\",\\\"43\\\",\\\"44\\\",\\\"45\\\",\\\"46\\\",\\\"47\\\",\\\"48\\\",\\\"49\\\",\\\"50\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"17660942257816334831\\\",\\\"id\\\":\\\"8775503382348419728\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"17660942257816334831\\\",\\\"id\\\":\\\"17405353776623453546\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"17660942257816334831\\\",\\\"id\\\":\\\"8775503382348419728\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"17660942257816334831\\\",\\\"id\\\":\\\"17405353776623453546\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), Observable{Cropbox.Plot{Gadfly.Plot}} with 0 listeners. Value:\n", "Gadfly.Plot(Gadfly.Layer[Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [-0.6132615598138218, -0.5184022952751097, -0.4235630550542351, -0.3287547412880527, -0.2338935142800127, -0.13905874029952336, -0.04426963819268703, 0.05689287000763987, 0.19466341103676132, 0.375937108313654 … 33.600882034241664, 33.66561854128474, 33.72959189972323, 33.79304255441989, 33.85555362249553, 33.91736726562359, 33.978465853563975, 34.03889046725614, 34.09865269106714, 34.157733313515145], :x => [69.79365348815918, 70.54550170898438, 71.29800796508789, 72.05108642578125, 72.80540466308594, 73.56033325195312, 74.31571960449219, 75.0152587890625, 75.89698791503906, 77.10800170898438 … 733.1522369384766, 739.0452575683594, 744.9480438232422, 750.882568359375, 756.8050384521484, 762.7372741699219, 768.6792755126953, 774.6310424804688, 780.5925750732422, 786.5638732910156]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0), Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [-0.6132615598138218, -0.5184022952751097, -0.4235630550542351, -0.3287547412880527, -0.2338935142800127, -0.13905874029952336, -0.04426963819268703, 0.05689287000763987, 0.19466341103676132, 0.375937108313654 … 55.69316007825337, 56.0224112327008, 56.35031605298904, 56.67808328845098, 57.00334964946464, 57.32732558854059, 57.649979392306484, 57.97135676908209, 58.29146570206903, 58.610271003529405], :x => [69.79365348815918, 70.54550170898438, 71.29800796508789, 72.05108642578125, 72.80540466308594, 73.56033325195312, 74.31571960449219, 75.0152587890625, 75.89698791503906, 77.10800170898438 … 733.1522369384766, 739.0452575683594, 744.9480438232422, 750.882568359375, 756.8050384521484, 762.7372741699219, 768.6792755126953, 774.6310424804688, 780.5925750732422, 786.5638732910156]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(80.0f0,70.000015f0,100.43479f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0), Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [0.33718221547705274, 0.5059448481247737, 0.6735416654588657, 0.8399656215590292, 1.0053746637930272, 1.1696409547575948, 1.3327433166245382, 1.5041252920699841, 1.7348098150463702, 2.036031420962544 … 33.600882034241664, 33.66561854128474, 33.72959189972323, 33.79304255441989, 33.85555362249553, 33.91736726562359, 33.978465853563975, 34.03889046725614, 34.09865269106714, 34.157733313515145], :x => [69.79365348815918, 70.54550170898438, 71.29800796508789, 72.05108642578125, 72.80540466308594, 73.56033325195312, 74.31571960449219, 75.0152587890625, 75.89698791503906, 77.10800170898438 … 733.1522369384766, 739.0452575683594, 744.9480438232422, 750.882568359375, 756.8050384521484, 762.7372741699219, 768.6792755126953, 774.6310424804688, 780.5925750732422, 786.5638732910156]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(65.89944f0,62.21457f0,353.99814f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0), Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [72.67411762896624, 72.67411762896624, 72.67411762896624, 72.67411762896624, 72.67411762896624, 72.67411762896624, 72.67411762896624, 72.55806643191845, 72.32344326264607, 72.06944739776186 … 69.19340609936378, 69.20951768725463, 69.22531029113362, 69.24078371472116, 69.25626022445421, 69.27173982086958, 69.28689991710287, 69.30206297376512, 69.31722899136045, 69.3320751953205], :x => [69.79365348815918, 70.54550170898438, 71.29800796508789, 72.05108642578125, 72.80540466308594, 73.56033325195312, 74.31571960449219, 75.0152587890625, 75.89698791503906, 77.10800170898438 … 733.1522369384766, 739.0452575683594, 744.9480438232422, 750.882568359375, 756.8050384521484, 762.7372741699219, 768.6792755126953, 774.6310424804688, 780.5925750732422, 786.5638732910156]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(66.303474f0,50.090958f0,168.24765f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0)], nothing, Data(\n", " titles=Dict{Symbol, AbstractString}()\n", ")\n", ", Gadfly.ScaleElement[], Gadfly.StatisticElement[], Gadfly.Coord.Cartesian([:x, :xmin, :xmax, :xintercept], [:y, :ymin, :ymax, :yintercept, :middle, :lower_hinge, :upper_hinge, :lower_fence, :upper_fence, :outliers], 0, 800, 0, 60, false, false, false, nothing, false), Gadfly.GuideElement[Gadfly.Guide.Title(\"\"), Gadfly.Guide.XLabel(\"Ci (μbar)\", :auto), Gadfly.Guide.YLabel(\" (μmol m⁻² s⁻¹)\", :auto), Gadfly.Guide.ManualDiscreteKey(\"\", [\"A_net\", \"Ac\", \"Aj\", \"Ap\"], Any[], ColorTypes.Colorant[LCHab{Float32}(70.0f0,60.0f0,240.0f0), LCHab{Float32}(80.0f0,70.000015f0,100.43479f0), LCHab{Float32}(65.89944f0,62.21457f0,353.99814f0), LCHab{Float32}(66.303474f0,50.090958f0,168.24765f0)], Function[], Measures.Measure[], true)], Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), Dict{Symbol, Any}())], Dict{Symbol, Any}(:style => Dict(\"display\" => \"flex\", \"flex-direction\" => \"column\")))" ] }, "execution_count": 39, "metadata": { "application/vnd.webio.node+json": { "kernelId": "493146c5-5720-442f-9dc7-ac09fc92b3ad" } }, "output_type": "execute_result" } ], "source": [ "manipulate(LeafGasExchange.ModelC3BB, :Ci, [:A_net, :Ac, :Aj, :Ap],\n", " config = ge_config,\n", " parameters = :Weather => (;\n", " PFD = 0:20:2000,\n", " T_air = -10:1:50,\n", " ),\n", " xstep = :Weather => :CO2 => 10:10:1500,\n", " xlim = (0, 800),\n", " ylim = (0, 60),\n", " kind = :line,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A-Q" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "광량(`PFD`)은 전자전달계의 제한으로 인한 잠재 광합성율(`Aj`)과 직접적인 연관을 가집니다. 어떤 상황에서 이러한 제한이 두드러지게 되는지 다양한 조건들을 실험해보세요." ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "application/vnd.webio.node+json": { "children": [ { "children": [ "Weather" ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "color": "darkorchid", "font-family": "monospace" } }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "CO2" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 150, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "7304887086717326503", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"10\",\"20\",\"30\",\"40\",\"50\",\"60\",\"70\",\"80\",\"90\",\"100\",\"110\",\"120\",\"130\",\"140\",\"150\",\"160\",\"170\",\"180\",\"190\",\"200\",\"210\",\"220\",\"230\",\"240\",\"250\",\"260\",\"270\",\"280\",\"290\",\"300\",\"310\",\"320\",\"330\",\"340\",\"350\",\"360\",\"370\",\"380\",\"390\",\"400\",\"410\",\"420\",\"430\",\"440\",\"450\",\"460\",\"470\",\"480\",\"490\",\"500\",\"510\",\"520\",\"530\",\"540\",\"550\",\"560\",\"570\",\"580\",\"590\",\"600\",\"610\",\"620\",\"630\",\"640\",\"650\",\"660\",\"670\",\"680\",\"690\",\"700\",\"710\",\"720\",\"730\",\"740\",\"750\",\"760\",\"770\",\"780\",\"790\",\"800\",\"810\",\"820\",\"830\",\"840\",\"850\",\"860\",\"870\",\"880\",\"890\",\"900\",\"910\",\"920\",\"930\",\"940\",\"950\",\"960\",\"970\",\"980\",\"990\",\"1000\",\"1010\",\"1020\",\"1030\",\"1040\",\"1050\",\"1060\",\"1070\",\"1080\",\"1090\",\"1100\",\"1110\",\"1120\",\"1130\",\"1140\",\"1150\",\"1160\",\"1170\",\"1180\",\"1190\",\"1200\",\"1210\",\"1220\",\"1230\",\"1240\",\"1250\",\"1260\",\"1270\",\"1280\",\"1290\",\"1300\",\"1310\",\"1320\",\"1330\",\"1340\",\"1350\",\"1360\",\"1370\",\"1380\",\"1390\",\"1400\",\"1410\",\"1420\",\"1430\",\"1440\",\"1450\",\"1460\",\"1470\",\"1480\",\"1490\",\"1500\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"7304887086717326503\",\"id\":\"15964156719249630286\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"7304887086717326503\",\"id\":\"16938316991051333904\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"7304887086717326503\",\"id\":\"15964156719249630286\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"7304887086717326503\",\"id\":\"16938316991051333904\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "15964156719249630286", "sync": true, "value": 0 }, "index": { "id": "16938316991051333904", "sync": true, "value": 40 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "T_air" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 61, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "11865694984809652927", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"-10\",\"-9\",\"-8\",\"-7\",\"-6\",\"-5\",\"-4\",\"-3\",\"-2\",\"-1\",\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"11865694984809652927\",\"id\":\"6653239361080084537\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"11865694984809652927\",\"id\":\"4929922529197178911\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"11865694984809652927\",\"id\":\"6653239361080084537\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"11865694984809652927\",\"id\":\"4929922529197178911\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "6653239361080084537", "sync": true, "value": 0 }, "index": { "id": "4929922529197178911", "sync": true, "value": 41 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "webio-observable", "setInnerHtml": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n PFD (μmol m⁻² s⁻¹)\n \n \n \n \n \n \n 0\n \n \n \n \n 500\n \n \n \n \n 1000\n \n \n \n \n 1500\n \n \n \n \n 2000\n \n \n \n \n \n \n \n A_net\n \n \n \n \n Ac\n \n \n \n \n Aj\n \n \n \n \n Ap\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n 10\n \n \n \n \n 20\n \n \n \n \n 30\n \n \n \n \n 40\n \n \n \n \n 50\n \n \n \n \n 60\n \n \n \n \n \n \n (μmol m⁻² s⁻¹)\n \n \n \n\n\n \n \n \n\n\n" }, "type": "node" } ], "instanceArgs": { "handlers": { "obs-output": [ "function (value, scope) {\n scope.setInnerHTML(value);\n}\n" ] }, "id": "14075838997821958160", "imports": { "data": [], "type": "async_block" }, "mount_callbacks": [], "observables": { "obs-output": { "id": "8712256924986593650", "sync": false, "value": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n PFD (μmol m⁻² s⁻¹)\n \n \n \n \n \n \n 0\n \n \n \n \n 500\n \n \n \n \n 1000\n \n \n \n \n 1500\n \n \n \n \n 2000\n \n \n \n \n \n \n \n A_net\n \n \n \n \n Ac\n \n \n \n \n Aj\n \n \n \n \n Ap\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n 10\n \n \n \n \n 20\n \n \n \n \n 30\n \n \n \n \n 40\n \n \n \n \n 50\n \n \n \n \n 60\n \n \n \n \n \n \n (μmol m⁻² s⁻¹)\n \n \n \n\n\n \n \n \n\n\n" } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "display": "flex", "flex-direction": "column" } }, "type": "node" }, "text/html": [ "\n", " \n", "\n" ], "text/plain": [ "WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[\"Weather\"], Dict{Symbol, Any}(:style => Dict{String, Any}(\"color\" => :darkorchid, \"font-family\" => \"monospace\"))), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"CO2\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 150, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "40, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x0000000178bbeba0, Task (runnable) @0x0000000178bbeba0), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"10\\\",\\\"20\\\",\\\"30\\\",\\\"40\\\",\\\"50\\\",\\\"60\\\",\\\"70\\\",\\\"80\\\",\\\"90\\\",\\\"100\\\",\\\"110\\\",\\\"120\\\",\\\"130\\\",\\\"140\\\",\\\"150\\\",\\\"160\\\",\\\"170\\\",\\\"180\\\",\\\"190\\\",\\\"200\\\",\\\"210\\\",\\\"220\\\",\\\"230\\\",\\\"240\\\",\\\"250\\\",\\\"260\\\",\\\"270\\\",\\\"280\\\",\\\"290\\\",\\\"300\\\",\\\"310\\\",\\\"320\\\",\\\"330\\\",\\\"340\\\",\\\"350\\\",\\\"360\\\",\\\"370\\\",\\\"380\\\",\\\"390\\\",\\\"400\\\",\\\"410\\\",\\\"420\\\",\\\"430\\\",\\\"440\\\",\\\"450\\\",\\\"460\\\",\\\"470\\\",\\\"480\\\",\\\"490\\\",\\\"500\\\",\\\"510\\\",\\\"520\\\",\\\"530\\\",\\\"540\\\",\\\"550\\\",\\\"560\\\",\\\"570\\\",\\\"580\\\",\\\"590\\\",\\\"600\\\",\\\"610\\\",\\\"620\\\",\\\"630\\\",\\\"640\\\",\\\"650\\\",\\\"660\\\",\\\"670\\\",\\\"680\\\",\\\"690\\\",\\\"700\\\",\\\"710\\\",\\\"720\\\",\\\"730\\\",\\\"740\\\",\\\"750\\\",\\\"760\\\",\\\"770\\\",\\\"780\\\",\\\"790\\\",\\\"800\\\",\\\"810\\\",\\\"820\\\",\\\"830\\\",\\\"840\\\",\\\"850\\\",\\\"860\\\",\\\"870\\\",\\\"880\\\",\\\"890\\\",\\\"900\\\",\\\"910\\\",\\\"920\\\",\\\"930\\\",\\\"940\\\",\\\"950\\\",\\\"960\\\",\\\"970\\\",\\\"980\\\",\\\"990\\\",\\\"1000\\\",\\\"1010\\\",\\\"1020\\\",\\\"1030\\\",\\\"1040\\\",\\\"1050\\\",\\\"1060\\\",\\\"1070\\\",\\\"1080\\\",\\\"1090\\\",\\\"1100\\\",\\\"1110\\\",\\\"1120\\\",\\\"1130\\\",\\\"1140\\\",\\\"1150\\\",\\\"1160\\\",\\\"1170\\\",\\\"1180\\\",\\\"1190\\\",\\\"1200\\\",\\\"1210\\\",\\\"1220\\\",\\\"1230\\\",\\\"1240\\\",\\\"1250\\\",\\\"1260\\\",\\\"1270\\\",\\\"1280\\\",\\\"1290\\\",\\\"1300\\\",\\\"1310\\\",\\\"1320\\\",\\\"1330\\\",\\\"1340\\\",\\\"1350\\\",\\\"1360\\\",\\\"1370\\\",\\\"1380\\\",\\\"1390\\\",\\\"1400\\\",\\\"1410\\\",\\\"1420\\\",\\\"1430\\\",\\\"1440\\\",\\\"1450\\\",\\\"1460\\\",\\\"1470\\\",\\\"1480\\\",\\\"1490\\\",\\\"1500\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"7304887086717326503\\\",\\\"id\\\":\\\"15964156719249630286\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"7304887086717326503\\\",\\\"id\\\":\\\"16938316991051333904\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"7304887086717326503\\\",\\\"id\\\":\\\"15964156719249630286\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"7304887086717326503\\\",\\\"id\\\":\\\"16938316991051333904\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"T_air\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 61, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "41, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x0000000178bbedc0, Task (runnable) @0x0000000178bbedc0), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"-10\\\",\\\"-9\\\",\\\"-8\\\",\\\"-7\\\",\\\"-6\\\",\\\"-5\\\",\\\"-4\\\",\\\"-3\\\",\\\"-2\\\",\\\"-1\\\",\\\"0\\\",\\\"1\\\",\\\"2\\\",\\\"3\\\",\\\"4\\\",\\\"5\\\",\\\"6\\\",\\\"7\\\",\\\"8\\\",\\\"9\\\",\\\"10\\\",\\\"11\\\",\\\"12\\\",\\\"13\\\",\\\"14\\\",\\\"15\\\",\\\"16\\\",\\\"17\\\",\\\"18\\\",\\\"19\\\",\\\"20\\\",\\\"21\\\",\\\"22\\\",\\\"23\\\",\\\"24\\\",\\\"25\\\",\\\"26\\\",\\\"27\\\",\\\"28\\\",\\\"29\\\",\\\"30\\\",\\\"31\\\",\\\"32\\\",\\\"33\\\",\\\"34\\\",\\\"35\\\",\\\"36\\\",\\\"37\\\",\\\"38\\\",\\\"39\\\",\\\"40\\\",\\\"41\\\",\\\"42\\\",\\\"43\\\",\\\"44\\\",\\\"45\\\",\\\"46\\\",\\\"47\\\",\\\"48\\\",\\\"49\\\",\\\"50\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"11865694984809652927\\\",\\\"id\\\":\\\"6653239361080084537\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"11865694984809652927\\\",\\\"id\\\":\\\"4929922529197178911\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"11865694984809652927\\\",\\\"id\\\":\\\"6653239361080084537\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"11865694984809652927\\\",\\\"id\\\":\\\"4929922529197178911\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), Observable{Cropbox.Plot{Gadfly.Plot}} with 0 listeners. Value:\n", "Gadfly.Plot(Gadfly.Layer[Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [-1.4830522779943511, -0.24844861478112445, 0.7677474713328092, 1.6715547768910488, 2.5027902479371384, 3.2797548725249754, 4.012354945463268, 4.706687755026085, 5.3666839516904705, 5.994954849081265 … 14.251997598132641, 14.239321484302632, 14.226618882994671, 14.213889829816264, 14.201134360381907, 14.18835251031278, 14.176191659985466, 14.163357184975986, 14.150496435295725, 14.137609446589956], :x => [0.0, 20.0, 40.0, 60.0, 80.0, 100.0, 120.0, 140.0, 160.0, 180.0 … 1820.0, 1840.0, 1860.0, 1880.0, 1900.0, 1920.0, 1940.0, 1960.0, 1980.0, 2000.0]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0), Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [43.95410860495242, 35.5382889150681, 29.033753108965907, 25.534375855430007, 23.34007981141299, 21.821608412826322, 20.702735845760476, 19.84281197654981, 19.161136298872353, 18.607638283812317 … 14.251997598132641, 14.239321484302632, 14.226618882994671, 14.213889829816264, 14.201134360381907, 14.18835251031278, 14.176191659985466, 14.163357184975986, 14.150496435295725, 14.137609446589956], :x => [0.0, 20.0, 40.0, 60.0, 80.0, 100.0, 120.0, 140.0, 160.0, 180.0 … 1820.0, 1840.0, 1860.0, 1880.0, 1900.0, 1920.0, 1940.0, 1960.0, 1980.0, 2000.0]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(80.0f0,70.000015f0,100.43479f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0), Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [-1.4830522779943511, -0.24844861478112445, 0.7677474713328092, 1.6715547768910488, 2.5027902479371384, 3.2797548725249754, 4.012354945463268, 4.706687755026085, 5.3666839516904705, 5.994954849081265 … 18.227099094060065, 18.245454840289245, 18.263193511302305, 18.28033405361218, 18.29689460381299, 18.312892530286444, 18.328856843316064, 18.34377980983593, 18.35818801804044, 18.372096133449254], :x => [0.0, 20.0, 40.0, 60.0, 80.0, 100.0, 120.0, 140.0, 160.0, 180.0 … 1820.0, 1840.0, 1860.0, 1880.0, 1900.0, 1920.0, 1940.0, 1960.0, 1980.0, 2000.0]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(65.89944f0,62.21457f0,353.99814f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0), Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [63.08050432267327, 63.20105360493773, 63.11522281985191, 62.99481973484926, 62.895330938423605, 62.81134864725966, 62.73986529811147, 62.6790730788219, 62.62747052803282, 62.58444828568328 … 69.52759927969338, 69.64482568030581, 69.76222840729329, 69.87980769187982, 69.99756376554434, 70.1154968600211, 70.23360720729967, 70.35189503962536, 70.47036058949934, 70.58900408967884], :x => [0.0, 20.0, 40.0, 60.0, 80.0, 100.0, 120.0, 140.0, 160.0, 180.0 … 1820.0, 1840.0, 1860.0, 1880.0, 1900.0, 1920.0, 1940.0, 1960.0, 1980.0, 2000.0]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(66.303474f0,50.090958f0,168.24765f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0)], nothing, Data(\n", " titles=Dict{Symbol, AbstractString}()\n", ")\n", ", Gadfly.ScaleElement[], Gadfly.StatisticElement[], Gadfly.Coord.Cartesian([:x, :xmin, :xmax, :xintercept], [:y, :ymin, :ymax, :yintercept, :middle, :lower_hinge, :upper_hinge, :lower_fence, :upper_fence, :outliers], 0.0, 2000.0, 0, 60, false, false, false, nothing, false), Gadfly.GuideElement[Gadfly.Guide.Title(\"\"), Gadfly.Guide.XLabel(\"PFD (μmol m⁻² s⁻¹)\", :auto), Gadfly.Guide.YLabel(\" (μmol m⁻² s⁻¹)\", :auto), Gadfly.Guide.ManualDiscreteKey(\"\", [\"A_net\", \"Ac\", \"Aj\", \"Ap\"], Any[], ColorTypes.Colorant[LCHab{Float32}(70.0f0,60.0f0,240.0f0), LCHab{Float32}(80.0f0,70.000015f0,100.43479f0), LCHab{Float32}(65.89944f0,62.21457f0,353.99814f0), LCHab{Float32}(66.303474f0,50.090958f0,168.24765f0)], Function[], Measures.Measure[], true)], Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), Dict{Symbol, Any}())], Dict{Symbol, Any}(:style => Dict(\"display\" => \"flex\", \"flex-direction\" => \"column\")))" ] }, "execution_count": 40, "metadata": { "application/vnd.webio.node+json": { "kernelId": "493146c5-5720-442f-9dc7-ac09fc92b3ad" } }, "output_type": "execute_result" } ], "source": [ "manipulate(LeafGasExchange.ModelC3BB, :PFD, [:A_net, :Ac, :Aj, :Ap],\n", " config = ge_config,\n", " parameters = :Weather => (;\n", " CO2 = 10:10:1500,\n", " T_air = -10:1:50,\n", " ),\n", " xstep = :Weather => :PFD => 0:20:2000,\n", " ylim = (0, 60),\n", " kind = :line,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A-T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "엽온(`T`)은 기온(`T_air`)을 바탕으로 에너지 균형을 고려하여 계산됩니다. 이에 따라 광량(`PFD`)이 많아지면 복사열에 의한 엽온 상승 효과로 인해 전체적인 곡선이 옆으로 조금씩 이동하는 것을 볼 수 있습니다." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "application/vnd.webio.node+json": { "children": [ { "children": [ "Weather" ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "color": "darkorchid", "font-family": "monospace" } }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "CO2" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 150, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "12554541028167064754", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"10\",\"20\",\"30\",\"40\",\"50\",\"60\",\"70\",\"80\",\"90\",\"100\",\"110\",\"120\",\"130\",\"140\",\"150\",\"160\",\"170\",\"180\",\"190\",\"200\",\"210\",\"220\",\"230\",\"240\",\"250\",\"260\",\"270\",\"280\",\"290\",\"300\",\"310\",\"320\",\"330\",\"340\",\"350\",\"360\",\"370\",\"380\",\"390\",\"400\",\"410\",\"420\",\"430\",\"440\",\"450\",\"460\",\"470\",\"480\",\"490\",\"500\",\"510\",\"520\",\"530\",\"540\",\"550\",\"560\",\"570\",\"580\",\"590\",\"600\",\"610\",\"620\",\"630\",\"640\",\"650\",\"660\",\"670\",\"680\",\"690\",\"700\",\"710\",\"720\",\"730\",\"740\",\"750\",\"760\",\"770\",\"780\",\"790\",\"800\",\"810\",\"820\",\"830\",\"840\",\"850\",\"860\",\"870\",\"880\",\"890\",\"900\",\"910\",\"920\",\"930\",\"940\",\"950\",\"960\",\"970\",\"980\",\"990\",\"1000\",\"1010\",\"1020\",\"1030\",\"1040\",\"1050\",\"1060\",\"1070\",\"1080\",\"1090\",\"1100\",\"1110\",\"1120\",\"1130\",\"1140\",\"1150\",\"1160\",\"1170\",\"1180\",\"1190\",\"1200\",\"1210\",\"1220\",\"1230\",\"1240\",\"1250\",\"1260\",\"1270\",\"1280\",\"1290\",\"1300\",\"1310\",\"1320\",\"1330\",\"1340\",\"1350\",\"1360\",\"1370\",\"1380\",\"1390\",\"1400\",\"1410\",\"1420\",\"1430\",\"1440\",\"1450\",\"1460\",\"1470\",\"1480\",\"1490\",\"1500\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"12554541028167064754\",\"id\":\"4505384294157900490\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"12554541028167064754\",\"id\":\"11152237547380518519\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"12554541028167064754\",\"id\":\"4505384294157900490\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"12554541028167064754\",\"id\":\"11152237547380518519\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "4505384294157900490", "sync": true, "value": 0 }, "index": { "id": "11152237547380518519", "sync": true, "value": 40 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "PFD" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 101, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "5492972842967732620", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0\",\"20\",\"40\",\"60\",\"80\",\"100\",\"120\",\"140\",\"160\",\"180\",\"200\",\"220\",\"240\",\"260\",\"280\",\"300\",\"320\",\"340\",\"360\",\"380\",\"400\",\"420\",\"440\",\"460\",\"480\",\"500\",\"520\",\"540\",\"560\",\"580\",\"600\",\"620\",\"640\",\"660\",\"680\",\"700\",\"720\",\"740\",\"760\",\"780\",\"800\",\"820\",\"840\",\"860\",\"880\",\"900\",\"920\",\"940\",\"960\",\"980\",\"1000\",\"1020\",\"1040\",\"1060\",\"1080\",\"1100\",\"1120\",\"1140\",\"1160\",\"1180\",\"1200\",\"1220\",\"1240\",\"1260\",\"1280\",\"1300\",\"1320\",\"1340\",\"1360\",\"1380\",\"1400\",\"1420\",\"1440\",\"1460\",\"1480\",\"1500\",\"1520\",\"1540\",\"1560\",\"1580\",\"1600\",\"1620\",\"1640\",\"1660\",\"1680\",\"1700\",\"1720\",\"1740\",\"1760\",\"1780\",\"1800\",\"1820\",\"1840\",\"1860\",\"1880\",\"1900\",\"1920\",\"1940\",\"1960\",\"1980\",\"2000\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"5492972842967732620\",\"id\":\"8032317489014422957\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"5492972842967732620\",\"id\":\"16850645515922929984\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"5492972842967732620\",\"id\":\"8032317489014422957\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"5492972842967732620\",\"id\":\"16850645515922929984\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "8032317489014422957", "sync": true, "value": 0 }, "index": { "id": "16850645515922929984", "sync": true, "value": 76 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "webio-observable", "setInnerHtml": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n T (°C)\n \n \n \n \n \n \n -10\n \n \n \n \n 0\n \n \n \n \n 10\n \n \n \n \n 20\n \n \n \n \n 30\n \n \n \n \n 40\n \n \n \n \n 50\n \n \n \n \n \n \n \n A_net\n \n \n \n \n Ac\n \n \n \n \n Aj\n \n \n \n \n Ap\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n 10\n \n \n \n \n 20\n \n \n \n \n 30\n \n \n \n \n 40\n \n \n \n \n 50\n \n \n \n \n 60\n \n \n \n \n \n \n (μmol m⁻² s⁻¹)\n \n \n \n\n\n \n \n \n\n\n" }, "type": "node" } ], "instanceArgs": { "handlers": { "obs-output": [ "function (value, scope) {\n scope.setInnerHTML(value);\n}\n" ] }, "id": "10012445435951192524", "imports": { "data": [], "type": "async_block" }, "mount_callbacks": [], "observables": { "obs-output": { "id": "3311982954837413886", "sync": false, "value": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n T (°C)\n \n \n \n \n \n \n -10\n \n \n \n \n 0\n \n \n \n \n 10\n \n \n \n \n 20\n \n \n \n \n 30\n \n \n \n \n 40\n \n \n \n \n 50\n \n \n \n \n \n \n \n A_net\n \n \n \n \n Ac\n \n \n \n \n Aj\n \n \n \n \n Ap\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n 10\n \n \n \n \n 20\n \n \n \n \n 30\n \n \n \n \n 40\n \n \n \n \n 50\n \n \n \n \n 60\n \n \n \n \n \n \n (μmol m⁻² s⁻¹)\n \n \n \n\n\n \n \n \n\n\n" } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "display": "flex", "flex-direction": "column" } }, "type": "node" }, "text/html": [ "\n", " \n", "\n" ], "text/plain": [ "WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[\"Weather\"], Dict{Symbol, Any}(:style => Dict{String, Any}(\"color\" => :darkorchid, \"font-family\" => \"monospace\"))), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"CO2\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 150, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "40, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x0000000178bbbca0, Task (runnable) @0x0000000178bbbca0), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"10\\\",\\\"20\\\",\\\"30\\\",\\\"40\\\",\\\"50\\\",\\\"60\\\",\\\"70\\\",\\\"80\\\",\\\"90\\\",\\\"100\\\",\\\"110\\\",\\\"120\\\",\\\"130\\\",\\\"140\\\",\\\"150\\\",\\\"160\\\",\\\"170\\\",\\\"180\\\",\\\"190\\\",\\\"200\\\",\\\"210\\\",\\\"220\\\",\\\"230\\\",\\\"240\\\",\\\"250\\\",\\\"260\\\",\\\"270\\\",\\\"280\\\",\\\"290\\\",\\\"300\\\",\\\"310\\\",\\\"320\\\",\\\"330\\\",\\\"340\\\",\\\"350\\\",\\\"360\\\",\\\"370\\\",\\\"380\\\",\\\"390\\\",\\\"400\\\",\\\"410\\\",\\\"420\\\",\\\"430\\\",\\\"440\\\",\\\"450\\\",\\\"460\\\",\\\"470\\\",\\\"480\\\",\\\"490\\\",\\\"500\\\",\\\"510\\\",\\\"520\\\",\\\"530\\\",\\\"540\\\",\\\"550\\\",\\\"560\\\",\\\"570\\\",\\\"580\\\",\\\"590\\\",\\\"600\\\",\\\"610\\\",\\\"620\\\",\\\"630\\\",\\\"640\\\",\\\"650\\\",\\\"660\\\",\\\"670\\\",\\\"680\\\",\\\"690\\\",\\\"700\\\",\\\"710\\\",\\\"720\\\",\\\"730\\\",\\\"740\\\",\\\"750\\\",\\\"760\\\",\\\"770\\\",\\\"780\\\",\\\"790\\\",\\\"800\\\",\\\"810\\\",\\\"820\\\",\\\"830\\\",\\\"840\\\",\\\"850\\\",\\\"860\\\",\\\"870\\\",\\\"880\\\",\\\"890\\\",\\\"900\\\",\\\"910\\\",\\\"920\\\",\\\"930\\\",\\\"940\\\",\\\"950\\\",\\\"960\\\",\\\"970\\\",\\\"980\\\",\\\"990\\\",\\\"1000\\\",\\\"1010\\\",\\\"1020\\\",\\\"1030\\\",\\\"1040\\\",\\\"1050\\\",\\\"1060\\\",\\\"1070\\\",\\\"1080\\\",\\\"1090\\\",\\\"1100\\\",\\\"1110\\\",\\\"1120\\\",\\\"1130\\\",\\\"1140\\\",\\\"1150\\\",\\\"1160\\\",\\\"1170\\\",\\\"1180\\\",\\\"1190\\\",\\\"1200\\\",\\\"1210\\\",\\\"1220\\\",\\\"1230\\\",\\\"1240\\\",\\\"1250\\\",\\\"1260\\\",\\\"1270\\\",\\\"1280\\\",\\\"1290\\\",\\\"1300\\\",\\\"1310\\\",\\\"1320\\\",\\\"1330\\\",\\\"1340\\\",\\\"1350\\\",\\\"1360\\\",\\\"1370\\\",\\\"1380\\\",\\\"1390\\\",\\\"1400\\\",\\\"1410\\\",\\\"1420\\\",\\\"1430\\\",\\\"1440\\\",\\\"1450\\\",\\\"1460\\\",\\\"1470\\\",\\\"1480\\\",\\\"1490\\\",\\\"1500\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"12554541028167064754\\\",\\\"id\\\":\\\"4505384294157900490\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"12554541028167064754\\\",\\\"id\\\":\\\"11152237547380518519\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"12554541028167064754\\\",\\\"id\\\":\\\"4505384294157900490\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"12554541028167064754\\\",\\\"id\\\":\\\"11152237547380518519\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"PFD\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 101, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "76, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x0000000178bbc120, Task (runnable) @0x0000000178bbc120), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0\\\",\\\"20\\\",\\\"40\\\",\\\"60\\\",\\\"80\\\",\\\"100\\\",\\\"120\\\",\\\"140\\\",\\\"160\\\",\\\"180\\\",\\\"200\\\",\\\"220\\\",\\\"240\\\",\\\"260\\\",\\\"280\\\",\\\"300\\\",\\\"320\\\",\\\"340\\\",\\\"360\\\",\\\"380\\\",\\\"400\\\",\\\"420\\\",\\\"440\\\",\\\"460\\\",\\\"480\\\",\\\"500\\\",\\\"520\\\",\\\"540\\\",\\\"560\\\",\\\"580\\\",\\\"600\\\",\\\"620\\\",\\\"640\\\",\\\"660\\\",\\\"680\\\",\\\"700\\\",\\\"720\\\",\\\"740\\\",\\\"760\\\",\\\"780\\\",\\\"800\\\",\\\"820\\\",\\\"840\\\",\\\"860\\\",\\\"880\\\",\\\"900\\\",\\\"920\\\",\\\"940\\\",\\\"960\\\",\\\"980\\\",\\\"1000\\\",\\\"1020\\\",\\\"1040\\\",\\\"1060\\\",\\\"1080\\\",\\\"1100\\\",\\\"1120\\\",\\\"1140\\\",\\\"1160\\\",\\\"1180\\\",\\\"1200\\\",\\\"1220\\\",\\\"1240\\\",\\\"1260\\\",\\\"1280\\\",\\\"1300\\\",\\\"1320\\\",\\\"1340\\\",\\\"1360\\\",\\\"1380\\\",\\\"1400\\\",\\\"1420\\\",\\\"1440\\\",\\\"1460\\\",\\\"1480\\\",\\\"1500\\\",\\\"1520\\\",\\\"1540\\\",\\\"1560\\\",\\\"1580\\\",\\\"1600\\\",\\\"1620\\\",\\\"1640\\\",\\\"1660\\\",\\\"1680\\\",\\\"1700\\\",\\\"1720\\\",\\\"1740\\\",\\\"1760\\\",\\\"1780\\\",\\\"1800\\\",\\\"1820\\\",\\\"1840\\\",\\\"1860\\\",\\\"1880\\\",\\\"1900\\\",\\\"1920\\\",\\\"1940\\\",\\\"1960\\\",\\\"1980\\\",\\\"2000\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"5492972842967732620\\\",\\\"id\\\":\\\"8032317489014422957\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"5492972842967732620\\\",\\\"id\\\":\\\"16850645515922929984\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"5492972842967732620\\\",\\\"id\\\":\\\"8032317489014422957\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"5492972842967732620\\\",\\\"id\\\":\\\"16850645515922929984\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), Observable{Cropbox.Plot{Gadfly.Plot}} with 0 listeners. Value:\n", "Gadfly.Plot(Gadfly.Layer[Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [4.460752050193691, 4.831977650387004, 5.230560567390257, 5.658210375857961, 6.116646481839643, 6.607730201303741, 7.133366139196417, 7.695489302920183, 8.29609738989847, 8.937248715850272 … 8.724459365740445, 8.156089994246726, 7.590667427625233, 7.0291291290036195, 6.474718898170878, 5.929757359107026, 5.397345102985691, 4.879361572059593, 4.239060998917861, 3.3505989293619605], :x => [-7.811317443847656, -6.813072204589844, -5.815818786621094, -4.819633483886719, -3.8247451782226562, -2.8312301635742188, -1.8392410278320312, -0.8490066528320312, 0.13924407958984375, 1.1252822875976562 … 41.73871612548828, 42.739097595214844, 43.743446350097656, 44.75206756591797, 45.76488494873047, 46.78174591064453, 47.80242156982422, 48.82691192626953, 49.88153839111328, 50.99781036376953]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0), Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [6.499606837602962, 6.970275286048292, 7.457758749353746, 7.960218748256799, 8.475376392335338, 9.000882813592455, 9.53375310811104, 10.07084641988168, 10.608818815320486, 11.143838130011257 … 8.724459365740445, 8.156089994246726, 7.590667427625233, 7.0291291290036195, 6.474718898170878, 5.929757359107026, 5.397345102985691, 4.879361572059593, 4.509544199846449, 4.530352920654539], :x => [-7.811317443847656, -6.813072204589844, -5.815818786621094, -4.819633483886719, -3.8247451782226562, -2.8312301635742188, -1.8392410278320312, -0.8490066528320312, 0.13924407958984375, 1.1252822875976562 … 41.73871612548828, 42.739097595214844, 43.743446350097656, 44.75206756591797, 45.76488494873047, 46.78174591064453, 47.80242156982422, 48.82691192626953, 49.88153839111328, 50.99781036376953]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(80.0f0,70.000015f0,100.43479f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0), Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [11.289337422273846, 11.660934077687024, 12.034005794631948, 12.40760958178831, 12.780682088607453, 13.152290051702208, 13.521249567594122, 13.886426004905616, 14.246681755556917, 14.600695071305136 … 12.067704203498616, 11.262114979387503, 10.402836327106657, 9.487490136239057, 8.51704025957875, 7.493170814959281, 6.420447297983685, 5.3048094108564205, 4.239060998917861, 3.3505989293619605], :x => [-7.811317443847656, -6.813072204589844, -5.815818786621094, -4.819633483886719, -3.8247451782226562, -2.8312301635742188, -1.8392410278320312, -0.8490066528320312, 0.13924407958984375, 1.1252822875976562 … 41.73871612548828, 42.739097595214844, 43.743446350097656, 44.75206756591797, 45.76488494873047, 46.78174591064453, 47.80242156982422, 48.82691192626953, 49.88153839111328, 50.99781036376953]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(65.89944f0,62.21457f0,353.99814f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0), Gadfly.Layer(nothing, Dict{Symbol, Any}(:y => [4.460752050193691, 4.831977650387004, 5.230560567390257, 5.658210375857961, 6.116646481839643, 6.607730201303741, 7.133366139196417, 7.695489302920183, 8.29609738989847, 8.937248715850272 … 127.88628512210296, 135.37460769710822, 143.28192687518586, 151.63296775719638, 160.45067072682173, 169.75829522290596, 179.57927322323104, 189.94020072402017, 201.15585274185574, 213.66241260643207], :x => [-7.811317443847656, -6.813072204589844, -5.815818786621094, -4.819633483886719, -3.8247451782226562, -2.8312301635742188, -1.8392410278320312, -0.8490066528320312, 0.13924407958984375, 1.1252822875976562 … 41.73871612548828, 42.739097595214844, 43.743446350097656, 44.75206756591797, 45.76488494873047, 46.78174591064453, 47.80242156982422, 48.82691192626953, 49.88153839111328, 50.99781036376953]), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.Identity(), false, 2, Symbol(\"\")), Gadfly.Theme(LCHab{Float32}(66.303474f0,50.090958f0,168.24765f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), 0)], nothing, Data(\n", " titles=Dict{Symbol, AbstractString}()\n", ")\n", ", Gadfly.ScaleElement[], Gadfly.StatisticElement[], Gadfly.Coord.Cartesian([:x, :xmin, :xmax, :xintercept], [:y, :ymin, :ymax, :yintercept, :middle, :lower_hinge, :upper_hinge, :lower_fence, :upper_fence, :outliers], -10, 50, 0, 60, false, false, false, nothing, false), Gadfly.GuideElement[Gadfly.Guide.Title(\"\"), Gadfly.Guide.XLabel(\"T (°C)\", :auto), Gadfly.Guide.YLabel(\" (μmol m⁻² s⁻¹)\", :auto), Gadfly.Guide.ManualDiscreteKey(\"\", [\"A_net\", \"Ac\", \"Aj\", \"Ap\"], Any[], ColorTypes.Colorant[LCHab{Float32}(70.0f0,60.0f0,240.0f0), LCHab{Float32}(80.0f0,70.000015f0,100.43479f0), LCHab{Float32}(65.89944f0,62.21457f0,353.99814f0), LCHab{Float32}(66.303474f0,50.090958f0,168.24765f0)], Function[], Measures.Measure[], true)], Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.7mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Cropbox.var\"#504#513\"(), Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), Dict{Symbol, Any}())], Dict{Symbol, Any}(:style => Dict(\"display\" => \"flex\", \"flex-direction\" => \"column\")))" ] }, "execution_count": 41, "metadata": { "application/vnd.webio.node+json": { "kernelId": "493146c5-5720-442f-9dc7-ac09fc92b3ad" } }, "output_type": "execute_result" } ], "source": [ "manipulate(LeafGasExchange.ModelC3BB, :T, [:A_net, :Ac, :Aj, :Ap],\n", " config = ge_config,\n", " parameters = :Weather => (;\n", " CO2 = 10:10:1500,\n", " PFD = 0:20:2000,\n", " ),\n", " xstep = :Weather => :T_air => -10:1:50,\n", " xlim = (-10, 50),\n", " ylim = (0, 60),\n", " kind = :line,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### N vs. Ψv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "엽내 질소(`N`) 및 수분(`Ψv`) 함량 간의 상호작용을 고려하며 환경 요인의 변화에 따른 광합성을 살펴볼 수 있는 등고선(contour) 그래프입니다. 환경 조건에 따라 질소 및 수분 함량의 영향력이 상대적으로 바뀔 수 있다는 것을 확인할 수 있습니다." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "application/vnd.webio.node+json": { "children": [ { "children": [ "Weather" ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "color": "darkorchid", "font-family": "monospace" } }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "CO2" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 150, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "14535259350644243274", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"10\",\"20\",\"30\",\"40\",\"50\",\"60\",\"70\",\"80\",\"90\",\"100\",\"110\",\"120\",\"130\",\"140\",\"150\",\"160\",\"170\",\"180\",\"190\",\"200\",\"210\",\"220\",\"230\",\"240\",\"250\",\"260\",\"270\",\"280\",\"290\",\"300\",\"310\",\"320\",\"330\",\"340\",\"350\",\"360\",\"370\",\"380\",\"390\",\"400\",\"410\",\"420\",\"430\",\"440\",\"450\",\"460\",\"470\",\"480\",\"490\",\"500\",\"510\",\"520\",\"530\",\"540\",\"550\",\"560\",\"570\",\"580\",\"590\",\"600\",\"610\",\"620\",\"630\",\"640\",\"650\",\"660\",\"670\",\"680\",\"690\",\"700\",\"710\",\"720\",\"730\",\"740\",\"750\",\"760\",\"770\",\"780\",\"790\",\"800\",\"810\",\"820\",\"830\",\"840\",\"850\",\"860\",\"870\",\"880\",\"890\",\"900\",\"910\",\"920\",\"930\",\"940\",\"950\",\"960\",\"970\",\"980\",\"990\",\"1000\",\"1010\",\"1020\",\"1030\",\"1040\",\"1050\",\"1060\",\"1070\",\"1080\",\"1090\",\"1100\",\"1110\",\"1120\",\"1130\",\"1140\",\"1150\",\"1160\",\"1170\",\"1180\",\"1190\",\"1200\",\"1210\",\"1220\",\"1230\",\"1240\",\"1250\",\"1260\",\"1270\",\"1280\",\"1290\",\"1300\",\"1310\",\"1320\",\"1330\",\"1340\",\"1350\",\"1360\",\"1370\",\"1380\",\"1390\",\"1400\",\"1410\",\"1420\",\"1430\",\"1440\",\"1450\",\"1460\",\"1470\",\"1480\",\"1490\",\"1500\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"14535259350644243274\",\"id\":\"13453796594139293047\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"14535259350644243274\",\"id\":\"7214735030421898025\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"14535259350644243274\",\"id\":\"13453796594139293047\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"14535259350644243274\",\"id\":\"7214735030421898025\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "13453796594139293047", "sync": true, "value": 0 }, "index": { "id": "7214735030421898025", "sync": true, "value": 40 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "PFD" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 101, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "18032054304702792249", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"0\",\"20\",\"40\",\"60\",\"80\",\"100\",\"120\",\"140\",\"160\",\"180\",\"200\",\"220\",\"240\",\"260\",\"280\",\"300\",\"320\",\"340\",\"360\",\"380\",\"400\",\"420\",\"440\",\"460\",\"480\",\"500\",\"520\",\"540\",\"560\",\"580\",\"600\",\"620\",\"640\",\"660\",\"680\",\"700\",\"720\",\"740\",\"760\",\"780\",\"800\",\"820\",\"840\",\"860\",\"880\",\"900\",\"920\",\"940\",\"960\",\"980\",\"1000\",\"1020\",\"1040\",\"1060\",\"1080\",\"1100\",\"1120\",\"1140\",\"1160\",\"1180\",\"1200\",\"1220\",\"1240\",\"1260\",\"1280\",\"1300\",\"1320\",\"1340\",\"1360\",\"1380\",\"1400\",\"1420\",\"1440\",\"1460\",\"1480\",\"1500\",\"1520\",\"1540\",\"1560\",\"1580\",\"1600\",\"1620\",\"1640\",\"1660\",\"1680\",\"1700\",\"1720\",\"1740\",\"1760\",\"1780\",\"1800\",\"1820\",\"1840\",\"1860\",\"1880\",\"1900\",\"1920\",\"1940\",\"1960\",\"1980\",\"2000\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"18032054304702792249\",\"id\":\"3226444048354747977\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"18032054304702792249\",\"id\":\"14600571865782920888\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"18032054304702792249\",\"id\":\"3226444048354747977\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"18032054304702792249\",\"id\":\"14600571865782920888\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "3226444048354747977", "sync": true, "value": 0 }, "index": { "id": "14600571865782920888", "sync": true, "value": 76 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [ { "children": [ { "children": [ { "children": [ "T_air" ], "instanceArgs": { "namespace": "html", "tag": "label" }, "nodeType": "DOM", "props": { "className": "interact ", "style": { "color": "royalblue", "padding": "5px 10px 0px 10px" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-left" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "input" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}", "orient": "horizontal", "type": "range" }, "className": "slider slider is-fullwidth", "max": 61, "min": 1, "step": 1, "style": {} }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-center" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "p" }, "nodeType": "DOM", "props": { "attributes": { "data-bind": "text: formatted_val" } }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row-right" }, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "interact-flex-row interact-widget", "style": { "font-family": "monospace", "width": "25%" } }, "type": "node" } ], "instanceArgs": { "handlers": { "changes": [ "(function (val){return (val!=this.model[\"changes\"]()) ? (this.valueFromJulia[\"changes\"]=true, this.model[\"changes\"](val)) : undefined})" ], "index": [ "(function (val){return (val!=this.model[\"index\"]()) ? (this.valueFromJulia[\"index\"]=true, this.model[\"index\"](val)) : undefined})" ] }, "id": "16983653601157305036", "imports": { "data": [ { "name": "knockout", "type": "js", "url": "/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js" }, { "name": "knockout_punches", "type": "js", "url": "/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js" }, { "name": null, "type": "js", "url": "/assetserver/f2016dce9a0d470782f38e7aa4873f823db566c0-all.js" }, { "name": null, "type": "css", "url": "/assetserver/805f638970bef13ab5dd6d32d993673e39af56c0-style.css" }, { "name": null, "type": "css", "url": "/assetserver/a99a2e54e5d65dd4545013d46edee359c5b0afdb-bulma_confined.min.css" } ], "type": "async_block" }, "mount_callbacks": [ "function () {\n var handler = (function (ko, koPunches) {\n ko.punches.enableAll();\n ko.bindingHandlers.numericValue = {\n init: function(element, valueAccessor, allBindings, data, context) {\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\n stringified.subscribe(function(value) {\n var val = parseFloat(value);\n if (!isNaN(val)) {\n valueAccessor()(val);\n }\n });\n valueAccessor().subscribe(function(value) {\n var str = JSON.stringify(value);\n if ((str == \"0\") && ([\"-0\", \"-0.\"].indexOf(stringified()) >= 0))\n return;\n if ([\"null\", \"\"].indexOf(str) >= 0)\n return;\n stringified(str);\n });\n ko.applyBindingsToNode(\n element,\n {\n value: stringified,\n valueUpdate: allBindings.get('valueUpdate'),\n },\n context,\n );\n }\n };\n var json_data = {\"formatted_vals\":[\"-10\",\"-9\",\"-8\",\"-7\",\"-6\",\"-5\",\"-4\",\"-3\",\"-2\",\"-1\",\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\"],\"changes\":WebIO.getval({\"name\":\"changes\",\"scope\":\"16983653601157305036\",\"id\":\"16779836078062233630\",\"type\":\"observable\"}),\"index\":WebIO.getval({\"name\":\"index\",\"scope\":\"16983653601157305036\",\"id\":\"17116067983828186288\",\"type\":\"observable\"})};\n var self = this;\n function AppViewModel() {\n for (var key in json_data) {\n var el = json_data[key];\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\n }\n \n [this[\"formatted_val\"]=ko.computed( function(){\n return this.formatted_vals()[parseInt(this.index())-(1)];\n }\n,this)]\n [this[\"changes\"].subscribe((function (val){!(this.valueFromJulia[\"changes\"]) ? (WebIO.setval({\"name\":\"changes\",\"scope\":\"16983653601157305036\",\"id\":\"16779836078062233630\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"changes\"]=false}),self),this[\"index\"].subscribe((function (val){!(this.valueFromJulia[\"index\"]) ? (WebIO.setval({\"name\":\"index\",\"scope\":\"16983653601157305036\",\"id\":\"17116067983828186288\",\"type\":\"observable\"},val)) : undefined; return this.valueFromJulia[\"index\"]=false}),self)]\n \n }\n self.model = new AppViewModel();\n self.valueFromJulia = {};\n for (var key in json_data) {\n self.valueFromJulia[key] = false;\n }\n ko.applyBindings(self.model, self.dom);\n}\n);\n (WebIO.importBlock({\"data\":[{\"name\":\"knockout\",\"type\":\"js\",\"url\":\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\"},{\"name\":\"knockout_punches\",\"type\":\"js\",\"url\":\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\"}],\"type\":\"async_block\"})).then((imports) => handler.apply(this, imports));\n}\n" ], "observables": { "changes": { "id": "16779836078062233630", "sync": true, "value": 0 }, "index": { "id": "17116067983828186288", "sync": true, "value": 41 } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "field interact-widget" }, "type": "node" }, { "children": [ { "children": [], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "className": "webio-observable", "setInnerHtml": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n N (g m⁻²)\n \n \n \n \n \n \n 0.4\n \n \n \n \n 0.6\n \n \n \n \n 0.8\n \n \n \n \n 1.0\n \n \n \n \n 1.2\n \n \n \n \n 1.4\n \n \n \n \n 1.6\n \n \n \n \n 1.8\n \n \n \n \n 2.0\n \n \n \n \n \n \n \n 10\n \n \n \n \n 20\n \n \n \n \n 30\n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n A_net (μmol m⁻² s⁻¹)\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -2.0\n \n \n \n \n -1.5\n \n \n \n \n -1.0\n \n \n \n \n -0.5\n \n \n \n \n 0.0\n \n \n \n \n \n \n Ψv (MPa)\n \n \n \n\n\n \n \n \n\n\n" }, "type": "node" } ], "instanceArgs": { "handlers": { "obs-output": [ "function (value, scope) {\n scope.setInnerHTML(value);\n}\n" ] }, "id": "5655946162836756874", "imports": { "data": [], "type": "async_block" }, "mount_callbacks": [], "observables": { "obs-output": { "id": "15480605652678745854", "sync": false, "value": "\n\n\n \n \n \n\n\n \n \n \n\n\n \n \n \n N (g m⁻²)\n \n \n \n \n \n \n 0.4\n \n \n \n \n 0.6\n \n \n \n \n 0.8\n \n \n \n \n 1.0\n \n \n \n \n 1.2\n \n \n \n \n 1.4\n \n \n \n \n 1.6\n \n \n \n \n 1.8\n \n \n \n \n 2.0\n \n \n \n \n \n \n \n 10\n \n \n \n \n 20\n \n \n \n \n 30\n \n \n \n \n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n A_net (μmol m⁻² s⁻¹)\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n -2.0\n \n \n \n \n -1.5\n \n \n \n \n -1.0\n \n \n \n \n -0.5\n \n \n \n \n 0.0\n \n \n \n \n \n \n Ψv (MPa)\n \n \n \n\n\n \n \n \n\n\n" } }, "systemjs_options": null }, "nodeType": "Scope", "props": {}, "type": "node" } ], "instanceArgs": { "namespace": "html", "tag": "div" }, "nodeType": "DOM", "props": { "style": { "display": "flex", "flex-direction": "column" } }, "type": "node" }, "text/html": [ "\n", " \n", "\n" ], "text/plain": [ "WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[\"Weather\"], Dict{Symbol, Any}(:style => Dict{String, Any}(\"color\" => :darkorchid, \"font-family\" => \"monospace\"))), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"CO2\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 150, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "40, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x000000017a063750, Task (runnable) @0x000000017a063750), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"10\\\",\\\"20\\\",\\\"30\\\",\\\"40\\\",\\\"50\\\",\\\"60\\\",\\\"70\\\",\\\"80\\\",\\\"90\\\",\\\"100\\\",\\\"110\\\",\\\"120\\\",\\\"130\\\",\\\"140\\\",\\\"150\\\",\\\"160\\\",\\\"170\\\",\\\"180\\\",\\\"190\\\",\\\"200\\\",\\\"210\\\",\\\"220\\\",\\\"230\\\",\\\"240\\\",\\\"250\\\",\\\"260\\\",\\\"270\\\",\\\"280\\\",\\\"290\\\",\\\"300\\\",\\\"310\\\",\\\"320\\\",\\\"330\\\",\\\"340\\\",\\\"350\\\",\\\"360\\\",\\\"370\\\",\\\"380\\\",\\\"390\\\",\\\"400\\\",\\\"410\\\",\\\"420\\\",\\\"430\\\",\\\"440\\\",\\\"450\\\",\\\"460\\\",\\\"470\\\",\\\"480\\\",\\\"490\\\",\\\"500\\\",\\\"510\\\",\\\"520\\\",\\\"530\\\",\\\"540\\\",\\\"550\\\",\\\"560\\\",\\\"570\\\",\\\"580\\\",\\\"590\\\",\\\"600\\\",\\\"610\\\",\\\"620\\\",\\\"630\\\",\\\"640\\\",\\\"650\\\",\\\"660\\\",\\\"670\\\",\\\"680\\\",\\\"690\\\",\\\"700\\\",\\\"710\\\",\\\"720\\\",\\\"730\\\",\\\"740\\\",\\\"750\\\",\\\"760\\\",\\\"770\\\",\\\"780\\\",\\\"790\\\",\\\"800\\\",\\\"810\\\",\\\"820\\\",\\\"830\\\",\\\"840\\\",\\\"850\\\",\\\"860\\\",\\\"870\\\",\\\"880\\\",\\\"890\\\",\\\"900\\\",\\\"910\\\",\\\"920\\\",\\\"930\\\",\\\"940\\\",\\\"950\\\",\\\"960\\\",\\\"970\\\",\\\"980\\\",\\\"990\\\",\\\"1000\\\",\\\"1010\\\",\\\"1020\\\",\\\"1030\\\",\\\"1040\\\",\\\"1050\\\",\\\"1060\\\",\\\"1070\\\",\\\"1080\\\",\\\"1090\\\",\\\"1100\\\",\\\"1110\\\",\\\"1120\\\",\\\"1130\\\",\\\"1140\\\",\\\"1150\\\",\\\"1160\\\",\\\"1170\\\",\\\"1180\\\",\\\"1190\\\",\\\"1200\\\",\\\"1210\\\",\\\"1220\\\",\\\"1230\\\",\\\"1240\\\",\\\"1250\\\",\\\"1260\\\",\\\"1270\\\",\\\"1280\\\",\\\"1290\\\",\\\"1300\\\",\\\"1310\\\",\\\"1320\\\",\\\"1330\\\",\\\"1340\\\",\\\"1350\\\",\\\"1360\\\",\\\"1370\\\",\\\"1380\\\",\\\"1390\\\",\\\"1400\\\",\\\"1410\\\",\\\"1420\\\",\\\"1430\\\",\\\"1440\\\",\\\"1450\\\",\\\"1460\\\",\\\"1470\\\",\\\"1480\\\",\\\"1490\\\",\\\"1500\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"14535259350644243274\\\",\\\"id\\\":\\\"13453796594139293047\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"14535259350644243274\\\",\\\"id\\\":\\\"7214735030421898025\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"14535259350644243274\\\",\\\"id\\\":\\\"13453796594139293047\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"14535259350644243274\\\",\\\"id\\\":\\\"7214735030421898025\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"PFD\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 101, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "76, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x000000017a063970, Task (runnable) @0x000000017a063970), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"0\\\",\\\"20\\\",\\\"40\\\",\\\"60\\\",\\\"80\\\",\\\"100\\\",\\\"120\\\",\\\"140\\\",\\\"160\\\",\\\"180\\\",\\\"200\\\",\\\"220\\\",\\\"240\\\",\\\"260\\\",\\\"280\\\",\\\"300\\\",\\\"320\\\",\\\"340\\\",\\\"360\\\",\\\"380\\\",\\\"400\\\",\\\"420\\\",\\\"440\\\",\\\"460\\\",\\\"480\\\",\\\"500\\\",\\\"520\\\",\\\"540\\\",\\\"560\\\",\\\"580\\\",\\\"600\\\",\\\"620\\\",\\\"640\\\",\\\"660\\\",\\\"680\\\",\\\"700\\\",\\\"720\\\",\\\"740\\\",\\\"760\\\",\\\"780\\\",\\\"800\\\",\\\"820\\\",\\\"840\\\",\\\"860\\\",\\\"880\\\",\\\"900\\\",\\\"920\\\",\\\"940\\\",\\\"960\\\",\\\"980\\\",\\\"1000\\\",\\\"1020\\\",\\\"1040\\\",\\\"1060\\\",\\\"1080\\\",\\\"1100\\\",\\\"1120\\\",\\\"1140\\\",\\\"1160\\\",\\\"1180\\\",\\\"1200\\\",\\\"1220\\\",\\\"1240\\\",\\\"1260\\\",\\\"1280\\\",\\\"1300\\\",\\\"1320\\\",\\\"1340\\\",\\\"1360\\\",\\\"1380\\\",\\\"1400\\\",\\\"1420\\\",\\\"1440\\\",\\\"1460\\\",\\\"1480\\\",\\\"1500\\\",\\\"1520\\\",\\\"1540\\\",\\\"1560\\\",\\\"1580\\\",\\\"1600\\\",\\\"1620\\\",\\\"1640\\\",\\\"1660\\\",\\\"1680\\\",\\\"1700\\\",\\\"1720\\\",\\\"1740\\\",\\\"1760\\\",\\\"1780\\\",\\\"1800\\\",\\\"1820\\\",\\\"1840\\\",\\\"1860\\\",\\\"1880\\\",\\\"1900\\\",\\\"1920\\\",\\\"1940\\\",\\\"1960\\\",\\\"1980\\\",\\\"2000\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"18032054304702792249\\\",\\\"id\\\":\\\"3226444048354747977\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"18032054304702792249\\\",\\\"id\\\":\\\"14600571865782920888\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"18032054304702792249\\\",\\\"id\\\":\\\"3226444048354747977\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"18032054304702792249\\\",\\\"id\\\":\\\"14600571865782920888\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Scope(WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :label), Any[\"T_air\"], Dict{Symbol, Any}(:className => \"interact \", :style => Dict{Any, Any}(:padding => \"5px 10px 0px 10px\", \"color\" => :royalblue)))], Dict{Symbol, Any}(:className => \"interact-flex-row-left\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :input), Any[], Dict{Symbol, Any}(:max => 61, :min => 1, :attributes => Dict{Any, Any}(:type => \"range\", Symbol(\"data-bind\") => \"numericValue: index, valueUpdate: 'input', event: {change: function (){this.changes(this.changes()+1)}}\", \"orient\" => \"horizontal\"), :step => 1, :className => \"slider slider is-fullwidth\", :style => Dict{Any, Any}()))], Dict{Symbol, Any}(:className => \"interact-flex-row-center\")), WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :div), Any[WebIO.Node{WebIO.DOM}(WebIO.DOM(:html, :p), Any[], Dict{Symbol, Any}(:attributes => Dict(\"data-bind\" => \"text: formatted_val\")))], Dict{Symbol, Any}(:className => \"interact-flex-row-right\"))], Dict{Symbol, Any}(:className => \"interact-flex-row interact-widget\", :style => Dict(\"font-family\" => \"monospace\", \"width\" => \"25%\"))), Dict{String, Tuple{Observables.AbstractObservable, Union{Nothing, Bool}}}(\"changes\" => (Observable{Int64} with 2 listeners. Value:\n", "0, nothing), \"index\" => (Observable{Any} with 2 listeners. Value:\n", "41, nothing)), Set{String}(), nothing, WebIO.Asset[WebIO.Asset(\"js\", \"knockout\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout.js\"), WebIO.Asset(\"js\", \"knockout_punches\", \"/Users/tomyun/.julia/packages/Knockout/3gjS1/src/../assets/knockout_punches.js\"), WebIO.Asset(\"js\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/all.js\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/InteractBase/o1I6G/src/../assets/style.css\"), WebIO.Asset(\"css\", nothing, \"/Users/tomyun/.julia/packages/Interact/pVyN2/src/../assets/bulma_confined.min.css\")], Dict{Any, Any}(\"changes\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"changes\\\"]()) ? (this.valueFromJulia[\\\"changes\\\"]=true, this.model[\\\"changes\\\"](val)) : undefined})\")], \"index\" => Any[WebIO.JSString(\"(function (val){return (val!=this.model[\\\"index\\\"]()) ? (this.valueFromJulia[\\\"index\\\"]=true, this.model[\\\"index\\\"](val)) : undefined})\")]), WebIO.ConnectionPool(Channel{Any}(32), Set{WebIO.AbstractConnection}(), Condition(Base.InvasiveLinkedList{Task}(Task (runnable) @0x000000017a063b90, Task (runnable) @0x000000017a063b90), Base.AlwaysLockedST(1))), WebIO.JSString[WebIO.JSString(\"function () {\\n var handler = (function (ko, koPunches) {\\n ko.punches.enableAll();\\n ko.bindingHandlers.numericValue = {\\n init: function(element, valueAccessor, allBindings, data, context) {\\n var stringified = ko.observable(ko.unwrap(valueAccessor()));\\n stringified.subscribe(function(value) {\\n var val = parseFloat(value);\\n if (!isNaN(val)) {\\n valueAccessor()(val);\\n }\\n });\\n valueAccessor().subscribe(function(value) {\\n var str = JSON.stringify(value);\\n if ((str == \\\"0\\\") && ([\\\"-0\\\", \\\"-0.\\\"].indexOf(stringified()) >= 0))\\n return;\\n if ([\\\"null\\\", \\\"\\\"].indexOf(str) >= 0)\\n return;\\n stringified(str);\\n });\\n ko.applyBindingsToNode(\\n element,\\n {\\n value: stringified,\\n valueUpdate: allBindings.get('valueUpdate'),\\n },\\n context,\\n );\\n }\\n };\\n var json_data = {\\\"formatted_vals\\\":[\\\"-10\\\",\\\"-9\\\",\\\"-8\\\",\\\"-7\\\",\\\"-6\\\",\\\"-5\\\",\\\"-4\\\",\\\"-3\\\",\\\"-2\\\",\\\"-1\\\",\\\"0\\\",\\\"1\\\",\\\"2\\\",\\\"3\\\",\\\"4\\\",\\\"5\\\",\\\"6\\\",\\\"7\\\",\\\"8\\\",\\\"9\\\",\\\"10\\\",\\\"11\\\",\\\"12\\\",\\\"13\\\",\\\"14\\\",\\\"15\\\",\\\"16\\\",\\\"17\\\",\\\"18\\\",\\\"19\\\",\\\"20\\\",\\\"21\\\",\\\"22\\\",\\\"23\\\",\\\"24\\\",\\\"25\\\",\\\"26\\\",\\\"27\\\",\\\"28\\\",\\\"29\\\",\\\"30\\\",\\\"31\\\",\\\"32\\\",\\\"33\\\",\\\"34\\\",\\\"35\\\",\\\"36\\\",\\\"37\\\",\\\"38\\\",\\\"39\\\",\\\"40\\\",\\\"41\\\",\\\"42\\\",\\\"43\\\",\\\"44\\\",\\\"45\\\",\\\"46\\\",\\\"47\\\",\\\"48\\\",\\\"49\\\",\\\"50\\\"],\\\"changes\\\":WebIO.getval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"16983653601157305036\\\",\\\"id\\\":\\\"16779836078062233630\\\",\\\"type\\\":\\\"observable\\\"}),\\\"index\\\":WebIO.getval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"16983653601157305036\\\",\\\"id\\\":\\\"17116067983828186288\\\",\\\"type\\\":\\\"observable\\\"})};\\n var self = this;\\n function AppViewModel() {\\n for (var key in json_data) {\\n var el = json_data[key];\\n this[key] = Array.isArray(el) ? ko.observableArray(el) : ko.observable(el);\\n }\\n \\n [this[\\\"formatted_val\\\"]=ko.computed( function(){\\n return this.formatted_vals()[parseInt(this.index())-(1)];\\n }\\n,this)]\\n [this[\\\"changes\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"changes\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"changes\\\",\\\"scope\\\":\\\"16983653601157305036\\\",\\\"id\\\":\\\"16779836078062233630\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"changes\\\"]=false}),self),this[\\\"index\\\"].subscribe((function (val){!(this.valueFromJulia[\\\"index\\\"]) ? (WebIO.setval({\\\"name\\\":\\\"index\\\",\\\"scope\\\":\\\"16983653601157305036\\\",\\\"id\\\":\\\"17116067983828186288\\\",\\\"type\\\":\\\"observable\\\"},val)) : undefined; return this.valueFromJulia[\\\"index\\\"]=false}),self)]\\n \\n }\\n self.model = new AppViewModel();\\n self.valueFromJulia = {};\\n for (var key in json_data) {\\n self.valueFromJulia[key] = false;\\n }\\n ko.applyBindings(self.model, self.dom);\\n}\\n);\\n (WebIO.importBlock({\\\"data\\\":[{\\\"name\\\":\\\"knockout\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/c853cad7a3e123085fa7960dd53fd3d4c05dc309-knockout.js\\\"},{\\\"name\\\":\\\"knockout_punches\\\",\\\"type\\\":\\\"js\\\",\\\"url\\\":\\\"/assetserver/fab584ebb4dc64eb3ddf5ca7c73b2e76fd533845-knockout_punches.js\\\"}],\\\"type\\\":\\\"async_block\\\"})).then((imports) => handler.apply(this, imports));\\n}\\n\")])], Dict{Symbol, Any}(:className => \"field interact-widget\")), Observable{Cropbox.Plot{Gadfly.Plot}} with 0 listeners. Value:\n", "Gadfly.Plot(Gadfly.Layer[Gadfly.Layer(nothing, Dict{Any, Any}(), Gadfly.StatisticElement[], Gadfly.Geom.LineGeometry(Gadfly.Stat.ContourStatistic([0, 1, 2, 3, 4, 5, 6, 7, 8, 9 … 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], 150), true, 2, Symbol(\"\")), nothing, 0)], nothing, Data(\n", " x=[0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4 … 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0]\n", " y=[-2.0, -1.8, -1.6, -1.4, -1.2, -1.0, -0.8, -0.6, -0.4, -0.2 … -1.8, -1.6, -1.4, -1.2, -1.0, -0.8, -0.6, -0.4, -0.2, 0.0]\n", " z=[2.5683747289553147, 2.7168844549880555, 2.850863731289638, 2.959852914438665, 3.0417927024194515, 3.0997867627868247, 3.1392500358139097, 3.165308340707603, 3.1823441288671024, 3.1932504793922956 … 7.998074940273561, 9.631450071848118, 11.091621093905509, 12.222202423656354, 13.023551529545285, 13.564018279369272, 13.918067495343735, 14.147332020578354, 14.293689816048364, 14.387170982423015]\n", " titles=Dict{Symbol, AbstractString}(:y => \"y\", :z => \"z\", :x => \"x\")\n", ")\n", ", Gadfly.ScaleElement[Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), 0, 30)], Gadfly.StatisticElement[], Gadfly.Coord.Cartesian([:x, :xmin, :xmax, :xintercept], [:y, :ymin, :ymax, :yintercept, :middle, :lower_hinge, :upper_hinge, :lower_fence, :upper_fence, :outliers], 0.4, 2.0, -2.0, 0.0, false, false, false, nothing, false), Gadfly.GuideElement[Gadfly.Guide.Title(\"\"), Gadfly.Guide.XLabel(\"N (g m⁻²)\", :auto), Gadfly.Guide.YLabel(\"Ψv (MPa)\", :auto), Gadfly.Guide.ColorKey(\"A_net (μmol m⁻² s⁻¹)\", nothing, nothing)], Gadfly.Theme(LCHab{Float32}(70.0f0,60.0f0,240.0f0), 0.9mm, 0.45mm, 1.8mm, Gadfly.Scale.default_discrete_sizes, Gadfly.Scale.default_continuous_sizes, Gadfly.Scale.default_discrete_colors, Function[Compose.circle, Gadfly.Shape.square, Gadfly.Shape.diamond, Gadfly.Shape.cross, Gadfly.Shape.xcross, Gadfly.Shape.utriangle, Gadfly.Shape.dtriangle, Gadfly.Shape.star1, Gadfly.Shape.star2, Gadfly.Shape.hexagon, Gadfly.Shape.octagon, Gadfly.Shape.hline, Gadfly.Shape.vline, Gadfly.Shape.ltriangle, Gadfly.Shape.rtriangle], 0.3mm, [:solid, :dash, :dot, :dashdot, :dashdotdot, :ldash, :ldashdash, :ldashdot, :ldashdashdot], [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0], nothing, nothing, 0.3mm, 0.0, RGB{N0f8}(1.0,1.0,1.0), Measures.AbsoluteLength[5.0mm, 5.0mm, 5.0mm, 0.0mm], RGB{N0f8}(0.816,0.816,0.878), Measures.AbsoluteLength[0.5mm, 0.5mm], RGB{N0f8}(0.627,0.627,0.627), 0.2mm, 0, \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.424,0.376,0.42), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.5277777777777777mm, RGB{N0f8}(0.337,0.29,0.333), \"'PT Sans Caption','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 3.175mm, RGB{N0f8}(0.212,0.165,0.208), \"'PT Sans','Helvetica Neue','Helvetica',sans-serif\", 2.822222222222222mm, RGB{N0f8}(0.298,0.251,0.294), 40, -0.05mm, 1.0mm, 3.0mm, Gadfly.default_stroke_color, 0.3mm, Gadfly.default_discrete_highlight_color, Gadfly.default_continuous_highlight_color, Gadfly.default_lowlight_color, Gadfly.default_middle_color, 0.6mm, :left, :square, nothing, nothing, nothing, :right, nothing, 2.0mm, 1000, 10.0, 0.5, 0.2, 1.0mm, 4, Gadfly.Scale.DiscreteColorScale(Gadfly.Scale.default_discrete_colors, nothing, nothing, true), Gadfly.Scale.ContinuousColorScale(Gadfly.Scale.var\"#69#73\"{Int64, Int64, Int64, Int64, Float64, Int64}(100, 40, 260, 10, 1.5, 70), Gadfly.Scale.ContinuousScaleTransform(identity, identity, Gadfly.Scale.identity_formatter), nothing, nothing)), Dict{Symbol, Any}(:y => [-2.0, -1.8, -1.6, -1.4, -1.2, -1.0, -0.8, -0.6, -0.4, -0.2 … -1.8, -1.6, -1.4, -1.2, -1.0, -0.8, -0.6, -0.4, -0.2, 0.0], :z => [2.5683747289553147, 2.7168844549880555, 2.850863731289638, 2.959852914438665, 3.0417927024194515, 3.0997867627868247, 3.1392500358139097, 3.165308340707603, 3.1823441288671024, 3.1932504793922956 … 7.998074940273561, 9.631450071848118, 11.091621093905509, 12.222202423656354, 13.023551529545285, 13.564018279369272, 13.918067495343735, 14.147332020578354, 14.293689816048364, 14.387170982423015], :x => [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4 … 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0]))], Dict{Symbol, Any}(:style => Dict(\"display\" => \"flex\", \"flex-direction\" => \"column\")))" ] }, "execution_count": 42, "metadata": { "application/vnd.webio.node+json": { "kernelId": "493146c5-5720-442f-9dc7-ac09fc92b3ad" } }, "output_type": "execute_result" } ], "source": [ "manipulate(LeafGasExchange.ModelC3BB, :N, :Ψv, :A_net;\n", " config = ge_config,\n", " parameters = :Weather => (;\n", " CO2 = 10:10:1500,\n", " PFD = 0:20:2000,\n", " T_air = -10:1:50,\n", " ),\n", " xstep = :Nitrogen => :N => 0.4:0.2:2,\n", " ystep = :StomataTuzet => :WP_leaf => -2:0.2:0,\n", " xlim = (0.4, 2),\n", " zlim = (0, 30),\n", " zgap = 1,\n", " kind = :contour,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.5. 차회예고" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "지난 주 첫시간부터 간단한 성장곡선에서 시작하여 모형을 조금씩 분해해가며 기작을 추가해본 끝에 기체교환 모형까지 살펴보았습니다. 상대적으로 훨씬 복잡한 모형이지만 결국은 성장률(`r`)을 결정하는 주요 요인인 광합성율(`A`)을 계산하는 여러가지 방법 중의 하나라는 관점에서 보면 모두 같은 선상에 놓여있다고 생각합니다. 모형을 만드는 목적에 따라 필요한 기작을 더 넣어보거나, 바꾸거나 혹은 없애는 과정을 점진적으로 반복하는 것, 그것이 모형개발(modeling)의 핵심이라고 볼 수 있겠습니다. 비록 지금까지 2회에 걸쳐 작물모형의 일부만을 다루었지만 전체적으로는 유사한 과정의 확장이라는 점 기억해주세요. 다음 시간에는 작물모형의 중추라고 볼 수 있는 생물계절(phenology)에 대해 살펴보겠습니다. GDD(growing degree days)와 같은 열시간(thermal time) 개념을 구현하면서 실제 자료를 적용해보는 실습을 진행할 예정입니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "@webio": { "lastCommId": "f1c7bb67011a4e719f885bfffc7efcd7", "lastKernelId": "493146c5-5720-442f-9dc7-ac09fc92b3ad" }, "kernelspec": { "display_name": "Julia 1.6.3", "language": "julia", "name": "julia-1.6" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.6.3" } }, "nbformat": 4, "nbformat_minor": 2 }