From b1e69f0f3a50748c8ce6fbc3adc6f0fd54bb7a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Manuel=20Dom=C3=ADnguez?= Date: Thu, 22 Dec 2022 10:17:32 +0100 Subject: [PATCH 01/11] Add Sphinx-based documentation, update README.md, update LICENSE, update setup.py and packageinfo.py * Add Sphinx-based documentation. * Updated README.md so that it is consistent with the documentation. * Update year in copyright statement on LICENSE. * Set OSP_CORE_MAX to v4.0.0. --- LICENSE | 2 +- README.md | 107 ++++++++++++++++++++++++---------------- docs/conf.py | 54 ++++++++++++++++++++ docs/index.md | 15 ++++++ docs/installation.md | 26 ++++++++++ docs/requirements.txt | 10 ++++ docs/static/custom.css | 25 ++++++++++ docs/static/favicon.png | Bin 0 -> 11519 bytes docs/static/logo.png | Bin 0 -> 16407 bytes docs/usage.md | 95 +++++++++++++++++++++++++++++++++++ packageinfo.py | 2 +- setup.py | 8 ++- 12 files changed, 294 insertions(+), 50 deletions(-) create mode 100644 docs/conf.py create mode 100644 docs/index.md create mode 100644 docs/installation.md create mode 100644 docs/requirements.txt create mode 100644 docs/static/custom.css create mode 100644 docs/static/favicon.png create mode 100644 docs/static/logo.png create mode 100644 docs/usage.md diff --git a/LICENSE b/LICENSE index 5f716e7..f553220 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2021, Politecnico di Torino, MuSyChEn group developers +Copyright (c) 2023, Politecnico di Torino, MuSyChEn group developers All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index 6227708..66fb69c 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,88 @@ # Wet Synthesis -A collection of wrappers around solvers to simulate the wet-synthesis of Ni-Mn-Co Hydroxides -*Contact*: [Mohsen Shiea](mailto:mohsen.shiea@polito.it), + + +A collection of [SimPhoNy](https://github.com/simphony/simphony-osp) +[wrappers](https://simphony.readthedocs.io/en/v3.9.0/overview.html#fetch-data-from-a-database-run-a-simulation-and-immediately-store-the-results) +around a CFD-PBE solver to simulate the wet-synthesis of Ni-Mn-Co Hydroxides. + +- CFD-PBE Wrapper: This wrapper prepares a simulation case folder based on the + user inputs and executes a solver for Computational Fluid Dynamics-Population + Balance Equation (CFD-PBE) simulation of NMC hydroxide precipitation. + +- Compartment Wrapper: This wrapper is aimed at simulating the NMC hydroxide + precipitation in a pilot CSTR reactor, by using the compartment model. + Currently, it can be used only to divide the reactor into the compartments. + +*Contact*: [Andrea Querio](mailto:andrea.querio@polito.it), [Daniele Marchisio](mailto:daniele.marchisio@polito.it), [Antonio Buffo](mailto:antonio.buffo@polito.it) and [Gianluca Boccardo](mailto:gianluca.boccardo@polito.it) from the -Multiphase Systems and Chemical Engineering research group, Politecnico di Torino. +[Multiphase Systems and Chemical Engineering research group](https://www.disat.polito.it/research/research_groups/musychen), +[Politecnico di Torino](https://www.polito.it/). -**Index** -- [Wet Synthesis](#Wet-Synthesis) - - [CFD-PBE Wrapper](#CFD-PBE-Wrapper) - - [Compartment Wrapper](#Compartment-Wrapper) - - [Compatibility](#Compatibility) - - [Requirements](#Requirements) - - [Installation](#Installation) - - [Docker Container](#Docker-Container) - - [Usage](#Usage) + -## CFD-PBE Wrapper -This wrapper prepares a simulation case folder based on the user inputs and executes a solver for Computational Fluid Dynamics-Population Balance Equation (CFD-PBE) simulation of NMC hydroxide precipitation. -## Compartment Wrapper -This wrapper is aimed at simulating the NMC hydroxide precipitation in a pilot CSTR reactor, by using the compartment model. Currently, it can be used only to divide the reactor into the compartments. +## Installation -## Requirements -- [OSP core](https://github.com/simphony/osp-core) -- [OpenFOAM](https://openfoam.org/) -- [Ansys Fluent](https://www.ansys.com/products/fluids/ansys-fluent) -- [7-zip](https://www.7-zip.org/) + -## Compatibility +The wet synthesis wrappers require a working installation of +[OpenFOAM 8](https://openfoam.org/version/8/), +[SUNDIALS](https://github.com/LLNL/sundials) +([v6.1.1](https://github.com/LLNL/sundials/releases/tag/v6.1.1) is known to +work) and [7-zip](https://www.7-zip.org/). Follow the links to find +installation instructions for each tool. -The following table describes the version compatibility between the [OSP core](https://github.com/simphony/osp-core) package and documentation presented in this project. +Once the requirements have been installed, clone the Wet Synthesis Wrappers +repository and install them. -| __Wrapper development__ | __OSP core__ | -|:-----------------------:|:------------:| -| 1.0.0 | 3.4.x | +```shell +git clone https://github.com/simphony/simdome_wet_synthesis.git +pip install ./simdome_wet_synthesis +``` -The releases of OSP core are available [here](https://github.com/simphony/osp-core). +Then install the required ontology. -## Installation -### ontology: -```sh -pico install ontology.wet_synthesis.yml +```shell +pico install simdome_wet_synthesis/ontology.wet_synthesis.yml # If you have issues using pico directly, you can use -python -m osp.core.pico install ontology.wet_synthesis.yml +# python -m osp.core.pico install simdome_wet_synthesis/ontology.wet_synthesis.yml ``` -### wrappers: -```sh -python3 setup.py install -apt-get install graphviz + + + + + +### Docker + +Alternatively, it is possible to execute the wrapper in a Docker container. +Clone the repository and enter the newly created directory + +```shell +git clone https://github.com/simphony/simdome_wet_synthesis.git +cd simdome_wet_synthesis ``` -More information can be found in the documentation for [installation of OSP core](https://simphony.readthedocs.io/en/latest/installation.html) -## Docker Container -### Image creation: +and then run + ```sh -./docker_install.sh +docker build -t simdome/wet_synthesis . ``` -### Launch container: + +to create the docker image. After that, run + ```sh ./run_container.sh ``` -## Usage -Two scripts are provided in the folder "examples" for the usage of the wrappers. It should be noted that the user is responsible for providing the OpenFOAM solver or Ansys Fluent executables. Moreover, the user should place the template case folders and mesh files in the corresponding folders found in the address "osp/wrappers/wet_synthesis_wrappers/cases/precNMC". +to get access to a shell inside a container based on the image that has just +been built. + + + +## Documentation + +Visit [the documentation](https://simdomewetsynthesis.readthedocs.io) +to learn how to use the wrappers. \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..d2db4d3 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,54 @@ +"""Configuration file for the Sphinx documentation builder.""" + +# --- Project information --- # + +project = "Wet Synthesis" +copyright = ( + "2023, Multiphase Systems and Chemical Engineering research group," + "Politecnico di Torino" +) +author = ( + "Multiphase Systems and Chemical Engineering research group," + "Politecnico di Torino" +) + +# --- General configuration --- # + +extensions = [ + "myst_parser", # Markdown support + "sphinx.ext.autodoc", # API reference + "sphinx.ext.napoleon", # Google and NumPy style docstrings support + "sphinx.ext.viewcode", # Link to source in API reference + "sphinx_copybutton", # Copy button for code blocks + "nbsphinx", # Jupyter notebook support + "IPython.sphinxext.ipython_console_highlighting", # Syntax highlighting + "sphinx.ext.autosectionlabel", # Auto-generate section labels. + "sphinx_panels", # Show panels in a grid layout or as drop-downs +] + +master_doc = "index" + +myst_heading_anchors = 5 + +suppress_warnings = ["autosectionlabel.*"] +exclude_patterns = ["**.ipynb_checkpoints"] +nbsphinx_allow_errors = False + + +# --- HTML output options --- # +html_theme = "sphinx_book_theme" +html_favicon = "static/favicon.png" # Noto Sans open book emoji +html_logo = "static/logo.png" +html_theme_options = { + "github_url": "https://github.com/simphony/simdome_wet_synthesis", + "repository_url": "https://github.com/simphony/simdome_wet_synthesis", + "use_repository_button": True, + "repository_branch": "main", + "path_to_docs": "docs", + "logo_only": True, + "show_navbar_depth": 1, +} + + +html_static_path = ["static"] +html_css_files = ["custom.css"] diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..18b51c1 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,15 @@ +# Wet Synthesis + +```{include} ../README.md + :start-after: + :end-before: +``` + +```{toctree} +:hidden: true +:maxdepth: 2 + +installation +usage +Licence +``` diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..adc3dfa --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,26 @@ +# Installation + +```{include} ../README.md + :start-after: + :end-before: +``` + +```{note} +OpenFOAM uses a collection of files packed together in a so-called +"case folder" as input. The Wet Synthesis Wrappers include templates for those +case folders, that are modified before running each simulation according to the +parameters passed from SimPhoNy in the form of +[CUDS objects](https://simphony.readthedocs.io/en/v3.9.0/jupyter/cuds_api.html) +(see the [usage section](./usage.md)). + +Such templates are included in the Python package, in the folder +`osp/wrappers/wet_synthesis_wrappers/cases`. If you wish OpenFOAM to behave +in a way that is not covered by the parameters that are passed from SimPhoNy, +then you will have to modify the case folder templates before installing the +package. +``` + +```{include} ../README.md + :start-after: + :end-before: +``` diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..20fbd1b --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,10 @@ +jinja2 >= 3.0.3, < 4 +jupyter >= 1.0.0, < 2 +markupsafe >= 2.1.1, < 3 +myst-parser >= 0.18.0, < 0.19 +nbsphinx >= 0.8.9, < 0.9 +sphinx >= 4.4.0, < 5 +sphinx-autobuild==2021.3.14 +sphinx_book_theme >= 0.3.2, < 0.4 +sphinx-copybutton >= 0.5.0, < 0.6 +sphinx-panels >= 0.6.0, < 0.7 diff --git a/docs/static/custom.css b/docs/static/custom.css new file mode 100644 index 0000000..23853a6 --- /dev/null +++ b/docs/static/custom.css @@ -0,0 +1,25 @@ +.caption-text, +h1, +h2, +h3, +h4 { + color: #6580a1 !important; +} + +.btn-outline-primary { + border-color: #6580a1 !important; +} + +.btn-outline-primary:hover { + background-color: #6580a1 !important; + color: azure !important; +} + +@media (min-width: 1200px) { + .container-xl { + max-width: 1550px; + } + #site-navigation { + max-width: 20%; + } +} diff --git a/docs/static/favicon.png b/docs/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..902ba57aa47f6b0eb49b37f7748050693dff296a GIT binary patch literal 11519 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=W3k|jBIW#?E0m!Rl@<)9U*9dP+P7tn9^JtB(2 ztm1$JhG(Q%{6-ac&21jk&HDHMv(3NpPY%|Z5OYa2rH6k)4b?S%DbMde>-|}uXY2RC zzxI92{(Q=sKi>HKX8H3^uRDHve){|3&;7hEB(AQ~6V#_6%dg zGoSHv{tR2Kv;NsO*lC;HcAcNY4we|)a+#mb4d>5m#b;OD@Q=4X7$1DF+ht$<^u;?r z-144R-OpO=xo&*MCSX7YTeyVJ>X2J^fyyNBdh_-kd~xJ{b8K?w9j?FF=U6cVscv zlYu8$A8oQvb}m~>91HnrtlW7MTqgxKMmJfd3*IM^Q=IP2cd|X7bQoc%i%Qd+4#Jo_p!Fw?X-gFycrfk230LX1eKTm~p0= zXPI@jWf!Hi!ip=cyvnMpZAxwX9d_Jl=UsN)?I&v|tLBfK{XKL4dDiTkH4gbB-SY=dlrd7tsU|810ZGUq2 zo4LQ`&CvJ%uX%IdnKMe=e@EtwQuhy;`+MI0A!}3kKGcT~z@|1-P#;hG@qtyED}2KJ zYd_7u`i1|!(0}n~pRtE$7dOH6x)X#19hJJtSGA;jp5L;cvyPSdkX<#p6)JeP+L+0Q zlwIS0t>)fsk9*|?VYFmQ+kN%1bcvLAY^7uyRqq3|<7E}aGX|X+ea?IF|9Y)cbDh2o zk6lmk+oUvx-WX%vl?A@MW{0C@6@2g-sJV3oE_S{@tuHOvn(ge|T6ZeO?(QSoSSg*2 zjh4?H(`;K|NO3>Q?`0$RqhUahnRgGKIIPHj_P%TEo)w+Nr`mnxtvOxq4>z5?>^WEF z8Z)|Kb6q(tz2xoU7B)p1c;}WvcWDkoK%S^?%-U04YxD83^N8`ulX$Qi;9{_dNOPr@ zXllCDL+IX*=WP8U>}GfPa5>_9W0aol6;hCb0OX|&5e!hXE92eApb)so#vd#Nx>ZEyL`;>X(!CKKDd_6ZBH zXm!Ij^9lSOPy)FM%EPHtt-42wB;9qSGUx7%Es}o1!&NFUA8Q_cWJ|32WIZM1_gaeF zUn+mryc3m$b~syufQXBJjnDlE4fb?`wToJ>K7^?}2)RyqSH8VkTDJ$%{`3GBqGx9k zJOBz!9SlM&DlRpMjIFXHw#xDbi;A?ml19UvOF0jQL`7{FsKAeX!|YaPDQl{ZS*Gf5 zwH5=M!oNL-wEgfgwj7#`Ezn4HF2$iv!^Xq7pw&=T?fm)(k@8A(=>`TKwn#dm-w z4YeiRrzHAHksheSn);2&@}t9;U5nN#i$lMu2V6>Z5CkoP&3I~t%E=XoYcNiu#pcapwje?7F;z)TtKlcQ3q7-IAOh6VN%9nQ-#R1!VA{_H4(= z(L=Y|l>|58e5bZtz_YAZ2;pMEd*((fuwfyNnF6&3?EpGuaz!p`;44X(?WhYobl(|S zcn_c;NK+5i+%_?N9oH|x55pf~eJcaKl&Vx7Zr)hvN?UOasZVSm6ut=D5 z8c+mval(2owc~1PTh=M0S$;+epDyjUOSSw{=@;W{N_Kjw5%mfQy`aVdNGgyCfVb7e zSS+mras9WITA*@^TQlXjRuz&XRSfG<*3=LlG6S`GNUZ>4Y%;0A=*dl?a-EZ_2W1?c zFFRbR)7POuQ%)!;+;N-F3A*fT1En=~tv6Plc-*?8UqW$P?disaokfPIY)UK-zQeaD zcC?{B09vtzT-7mI?NZw)w$+!5lRq~o7A&E!DPaim1*UXq^7-7AEG4Sou2MW%)rgZ#$a3L^W`>qj z)46lGOdng%+;`M^n6S>Yd4)ScPxb`7yz3@|phxpIZGycVCEQfg+s#w7l=@LlvLZ3b-kQ6>_zQPgbnU2oz8+Vcz9Pu1}YO>a20AK4{2k=sC!52u|3L6;@d;9yn>|ul+Gy}(HxjG9ciR+PaP2;K`10;K<@*4Nv!SXd zd7xz|IirtadgQ+*hKYNifw;wq|3i@KV@r$D6MVcszoBPIGZHplqkIj01kb4`;naeS z$^r#TDLAzVLNPv6GlfpdyV!GcyM{j$)2YU3ggnXGY`zYJxllswLqk~dG zp74vMJZp;-_p}Wmz=e=4wF&8oc9NxI3obhy%q3)7*{ks~(? zXAA(iBQ*m-T(~E^IPYwK9CIiOe1REqINJhfvg(FhQ5kT72^0=hEIr)H5h#DxCooBM zRI|uHdJ1G3S1zjWM?-vggNE)8@eNALZkOdlID#bz4iF`GEAErhD*~`qT_qM;#)eIx zHeS77H3jb0l&Ayt`@pPstY&-$=I-fBn*%-A!hFlc|EE^PeQR z=N&Q@oeP$yr?Z|{MjI3VhynLWDRv(gHqJF>X2dq~h;~v*KxdulnplI3aJI(ar zt<_kImz>M;Z{5GD^3w=gByd#8KB}Z2IwKf@iO`Axm^umQxm)n-^iDe#umpwXKU`<_pBABu7%c@Mm3#m#Y@Y zM3to#K}l!q zx=5P(`04p9=NU&$`50fA%(D)xQ%u)KB>9MZCM6VAOp2NuWFH4GXZO*%RI3`|mGkwb zMlKvQmym47k8U-X%3{W+qE^%>BFOzg#DoCrN$@5O0aceHYX^);{RlvR36bTX*Q3mv zbe(2wSFmWIt0s`9YGC1^a4DNW#c<8OP@ozLX>@P|az8iQ$kc*Uu!luFY3&KkKow{T zm+52dkxE!JaqJ8w4YDTw!&Bg-_L#K-xzo`RY%u#cKTZ9-P$0;M2u!XRzGx$Kz%g5m zpy`mx#vajT?{IoF^HcO|C2PQ5{^Xwd*j3S-(25gKkg* z;^|nM)6N=6P&#xO+&$*0x`+M@h^HA2@E~RSQ}DFM%|z*q)9)|w1q}4mSkJ1CrgWtc z$SU<%dI|p?k-}mfKYd5mObv=`J!riP?L%oacIf0#$7v|68iJ5Z7n%WM4>VebJU&yk zt4z$7G|`9?=BD>Rt(Dwq=OjIla$B|uZlD&4t@h`8c|?;>Prm){@0asBcc$f}G)^ME zdYibb2=lKq2N%4t^03I%d_4-g4dFVHJEfJF2^#GTzD}2D>_aWCgL0$V>7ug$zCp~~ zJ|7=?TYsgu`DAJp0Bveokcvp6c4y2<3f3QUVQv@GHoA+4w+z(03X_dKG^SE@FTbkg}g>x@iMq-PdP{}9@V3> zuiP*81R75IfGAl-iJqxx0XDo$j1Ff~fZ$@afzZf&hfy{Az{zX;eDz}gaVV{Z67UDG zGP2EUEaaw|c4}U0TM$dtI}$w80=AdXZI~m1CTYCd<6AvL)MMCj)F)L`-UR%uZdtd+ zw1ngcuPot%6dg91lh2W!MmaHq-(vQuOGPHMKs!izQZv(&4L5Ts}f|Yo5 z$qBRaxvZ_ozd)1>x5b5Px`)T47~}aeAbGi+OOj|^TL4kc25YxiXV_z<7tgviJrF}SW6Oh*ik`Isj=o8O7rr?{d9>G-omu`G?T zj^rQ^$LG|3NWI-i(ej$9Z;do07Yh5kV~93%(HAnj{~KfoPBd1yCniGruAVkhh)^&v zyo-|yX$Z&4Z+(BO3Ca4}KU#vVcnm>DbVw~}vSEfmRpRl-4{=Xit2FC+1T9sT=e>!P z1PZbY>|H!45+Y4jJF2$p%!PQL(cf~~aBCAEq4Nw(-yO0d8*pXt|2Trs{yEf7Z5YD0 zkF%hjyoKO(d>ra{gl{ZIfIQ#g1}SY6X3e;%aOot?9=nDKIa5OgH`Ftm z)*m10_+hGpon$~G%RK%E3(VF0Y1%V=y)VD8hS;W|#&Jw%8aCe9 zXtVZjheYNARO>+e>8X(Z&_&=qF#OORX@eq2Edal1BKqPxUZ@G%%vwicrq^uY$jUh% zaGxW>qS$Pm)5P+1dPO8-B$gKfLo$ESWhJCU`2pnfOyglPz7#dWM)YBK?tQ<|v)LG_ zS94OJ!>b~6Y(jJrx^*0Nr4aq#o16;{rwY&$vhOp5*7TLM_n3{-p~W*^s9L~MSIoxu zOh%_hukf)C!bc~r62m>*gEE~=0V8p^dEd-`S4AkFgM;xukv;*WkDvNN8S_kF zvNs^|0MyEeu2A;l97yd?{~l|;N~#Zv9%!-=9G9y(hdAE@PBV&z#@EQ6?n!4l8j}mK zMm@p`hm4URy=J_KrWQbo{wmr{t59NyMx7)0sJ3DNY7h*O~d_( z9C=uIu|2u z>uK&rC=fOKzz=>pNl}5$`BIz_!Ok>M zCfU~))Aeiu{O<3x#-{7ygFCJ0WJu10k$`mq=6(XUo)P7n8{QPi5Ze3WkPR*v4Zbz8 zB~|f#V&kNhOZ9DYL37>bCfaji7A}zRHbQGugmu#ZVS<5ZZ<2im$n(_V)zVHU&D)*B z?lV!$=lKZWE>ncCzj7Ax;a>BeY!(-e>wJetSdWkjth7cry#|@wGg90*xv!KDT6kBT zSGZ>-ECgB>cGZc7sv8Xj-vBy|rqM$o^l{Sz87&uyv4cPZE{}+RTnczfv#ckYBcVWd z%_DoIkcoo0Bh#NwgHBD-(7RlzLMEtTZM($NO1dhoDv4!|Qd8j-T8&MXeug$0qf)VQ zb~^E|P6Hc^Y?w41Md3>p$vw>$IMlaf+NcOOJz1v1C*R(o&mV)GlHQ>Y>^Htp5m3aK zu(2*)qjlFA!^}H|85)p3`+L|Ez+x2Jc}gK(?(JT3Sm(ewOIthhafUO1%L_pB$4R3{ zSJximRv|{J*&$J*++P|Hg%cO0E4qXVMq}KMrZ^A39gFmNl;{ikKxwS5LyWsoLYBZ*z%t>^nF2;UIL)M(1JGrFZVi-~&3D8JTNB_#i*2bzlm)goppDET$@qSClL zq61rYjE1LDb)3ZhU0+d*Y zaStAnhdGYKy5OH40sKfo=Q@>$L&d%aXk^XyXGMJu#Vf*3(~PR&{(D@0v|CPKwT>QmctiYdWu*_vJqDo>)qn!X2!3FhRGzJn#{K z=h50UsvdHosOo(lD%_lE#$Ju}?@&h%nCYGK`Y$?;fI@i%gJLNU4k+B?g{(RtHvp^A zsany4DPr?yzXx@DuweA=9W&t@*|KlH18ZvGFGqXkzCpUDU+;rr$)ccB6U(6*$>gy3 zP)Jo14*$6aP14Q@@O@s$d_6FPve1zgnyUQiP)5^G5JB3d>@@<@k)GgYtm9C&%<&Ou zgN;^KHUE?Q8PMmlSi+Ku*ZDAICqx9musrODwga!$JD6&1F)`EQxKU8O0(*ukHSSVr*r1}9F6rJ zkYzoe<;y$0G^PH5b~Wr{?=*?gBYWdMCd19qv0Mk;sfpXR&k{yatu3~UQZaP9NPV2S zh~`r|13Owqk5=mN84+L4X{o))uSYy}u299AxKpslx^48KamG`;9|DZ5=?WwZN&o^%NQsMwjNgRS(2 zfeBdp?w$5{MT8!K`I>U*m?7)wETq^*c*{A7Y|o=DM~0{jfW z@7Y@Nv4C>=YD2g|9+KNr=v&8%l=$ca9H&%;2hx4Zqq7rIG~_d8KF>M4+GOhtqJ-h-thPRXDCzN3t=PRU$g1L;wv$UC%bfawD%8V|y)veM_&hQNXD@dxk!cy_7@^VmEr z()`=hXC{HsNkFiatWL_*c1q-wckli1{v#XeAw3}*Ep)NlIEVwy`z)6piX-_PbgZ+= z)0cDi$q}c{sz1ne2(g5!<78#r3Al~=9)Pg$t4@T1Sn7a@{yiG^0G6{W)B+LejiRZ5 z8lTQ|;dZ9*X#9-pKku}AjQOF&WlNlzKxqhv$=OFBxbLBPHU}pKla;v2zRH+>?g{wn z`C~a+`(4{Lft|Px$dH4irwpX!`gOe+Nr&nv@F4C?vtI7LD<(vL6RLm<`s-q- zi*R`K9wt8;FhoHYx_aCOc(>Q?DGu0j<;8;;!X4pHD5Te$qDEY&JaY?rP(#lb)8~2D zchtfM`??3&8pTLoP@@2p5#M4(<&cYlEmNlzHK}&jhD5anf#{1u0R{r~^E|KnJT%8o z^ZDgIMF%9s2^w_g??H>6xX5GP%GM);8kxi{Q$8upEfo|?*XRGRCCSFwRe{T@Jf*d%B&^k4ex75!@i=IX`&%MOPAmQIo?)Zg~$ z1R7O|L=Bo4P6)?>QAb=4qo(@+8U+cOpL6%!o^(Bae?2}*oMMJIW#Z&JfY2F}z# zwM|ZoEUas7!I-tU<6(?vJ3(*yzwSMR#|zMtb^>bOW@{YBfh7laTpuBt&d4DSme(plFJ27|6)80$g^Qz?}K z+d&ZQ2qCKfcLC5^8-P4GIB06q+%SZ=sFm6fTA!0rp4VER20DNQM5#4>Z?LRk(CvtGzl6_f<^D5Br*6UQ+{QJ|E%d#*{a~_xn@ujD|!B=;`@%0a*;oz@> z|9JmLFU^4d*WUiN3L1a)&)@npbMcMO^QE;m08tci>((u*sv-X-XW&#BofTrghmY zFE6vUwnkPd{^8appZk};*Khvo5B3r*-dOy}ds{Ee04e0fC#POB`-`ibF`t#CZQHD` zuj9HdmSrJ?!1sN8-=Df)DMg;=RS#KU0E~hqj=*CO1ib$G>oY;AEKAZXBZ=d>B#NS- zEX&%VsHiY(n;;12E-vF7O4Uh8ZEtVW>-EU846QX6E?giCLvG!=MOl{Ej)U)cbh}+V z&!a5MI{ll?<`gEpsvQY{5cruN9;us2&F6Ve6h(A89URBu_U+pYheM>4c%Fynd9>SY zY{$VGV}R0{onbFvRmb z?%lgb6h*kMi|_jcL4fCZHCWd8;)ei2Y2m#}2F#C~7r3TTe;LOyH*VfU3W4joHTax8 zdv*kNmW4cqwN*+J2n#RNbh`5>rDm4S=PzHL*+P%o-7{y-)OZlbF}+@ovZ`2GT;%lW z(*U@p!N9Ud@FryEl}ey)O@|ia`#x9RcmvZkYhp6_egafkmQ9hQot+(&Qj|(FEESIH z;`;&qA<%r5d4ep^KhXb{osGYJ6~A7uR*`?xeM*D2k~d8ZV~OFAl&| zcNl|^2GT4eO%mcHAs%;yG)+-TGe6(u{Q2{gWr@-n(=^daLy^+o+vD-0hpeofVqtk2 zkmES!+O=!gwq2+3#Hk74ny|}j*RD~NCBc}7c)pMCdAP3oQX=)j0PK9_VnahP>%t^S zxO?|5!{Lyss_N+bLBR6zGQRKQI8NQdTCG-%)>&B*W+OnXs*3W^?jGLdD_5>y+jdQ4 zjuS^48yj`n$8pT=?(T?VXpQH2tgf!Iw6t{83B~dY12AuS#t@9-GGJk0f%WxueBYny z@y{=Gq6;SEB`qtmVnlxp!hvP4xCQc6tItON6zOW?q;4XG;mOc#i$e&6f$7!HRu zNL{{s87U>bUJoGz&1SQ%L)*47O%o|4gS;fl3-UDO;NW0tcMm_`^E{SURtSS&3TVr+ zto22jW%auHy&m`P-^VbFx@`tQK&#!x_q-!Mps`*U09DYG#xo4?En})rZ*FeZRMYdk zn(}UJY#bY5r4(gVA%w*7d>qf8d7bBZoH=vmNGVN9#x%_%!fSqhp1HX>vMeLZGNLG= z*XyB_!asHDh!4QZXD)#t2)J_P%8|OCw4Mnt7Dd6MM~`aKq?95mN)!^ub7?f1wAvla z=g?XyMZe#t*Xt2Q(Wr|kMZ4YR{Q2`lQN-@zgLsZWr6OF-(*FtRT*E@+6_RyNgna#g)|~ zUFN}q2Q(TDR#sN(dOwW*S(Y&v45mOb3_~tlxPWPzfOpKqmXALA z2xAO3zUR?uwOCzU#dY1f-d)$_?Af!=c2;W&tHAa(v|(X+1vO)bJkR3`U--gQ?H@MZ z_u1IknCdcFmXW4uot1a)+#$;{R##V9Utgcmp_qSR0Lm)2En{{M34(yDSFhGYV^%3l z7FL!euIm!VG22ge7~~~}X=1yh(bX&`CmkhSJDD#AyGyc~{MN~7ykd%^h=g!e;wPrHG!{8PK0qu5s zlwsT3q*(^zX_4bNEG{nAfapl5%96OzBJ4kXNgI@+i6YQSjmXGzLxBnVn#fNnWv#lN zNA$^%GtCR)yd04g!^8__GHqrYftEB7IpK)Jil28a+nR!-OJ^WA5L- zUr%H^oesY5*FxnmvQNkfK#`YNS^yTd;}V38nMB3&JT6?g@WP|8!-%hxs;^yGSfJnU zk4~2M_i49Ub+)RisPr8Q-x$g7H8oU+*;@@ap-(}RfZLB#gpfVim0iW1W>SeXmCu+-(ZHr8qT?vWsr zmEz9M9zVHpkJ~%@Z0!#aLJ&F*p=Ge#YOv4gM^2@1NMdyoBKm{qlBVTIHrYdTR5)ETxXu;m9--$ zKuMDDk00IRe0Pp7uCHL)CR)ShAmZO|KHzbj({0XkrL)YH=X8FW=lmkhxVyJWe!Czq zE9N|#h0tfI8M4?6S!;!K0~gmav5gT=ah~IKNnXn1K~Tu4G0Mk}cj>1&PveY1S}@3R zv=9g>kcct-lK9u7TwtzWTNw1&F9d4+-kS- zipNj(`Po(S*e>AVV4rCJ zVCpu!=Js!o&Wg>@qQmEC38W@AD&)CoITIp%31ci%T(4cH}JGwm$E3y;^fsZK#ax0 z+_10DMZ2Q1pvtY;BlDubi3iwOig&QDy}_Pn>^-5g`GBDR6e~+H^Nf$R!vPZkWAOCe zP2T<9CSU#bpW=q2f#A}|KNS~le1Mj6bWAoYL$pRH z1xlgHN>pVqZU}KbvV1cI)%_t9CQDt|HbQH|2@h)=fV5`%|f?Z4@CjY zs^ZD*>o{?QX~dX@ApCTTmLafBi7*TyEdzu^3yD64K1iiNYmBlG0xVq=tz!f5U?+L9 zJm+9r8p?{Q(p2MvjiOYP)ui<)%1T#drK(ct3Md6sz!MES2(hJ=+A^ek+&+jl7hCD4 zr4W1F;c)Z*!ooKL-~Y=`-u+Lp_lpOl2LsGJ#teeJwc+lUH?1&jD0MDO(-y;Yt)CXF z0v5CoOG2qLT8IUp0Z0L+X-LC1g=t7BEJI=%g2Vr6DKMl!0sC=Le7YC+j{SwmyPx~q zWhwYOL&`IGSs@_RkOO;K>m4EGry90VYD);Qh1R>$G3~bBlYpwryeSQ6JzWd$pzVz2#H!fam?B;n#n&z^os;(Ad5g}Gl zsw;$8LF+Xo#FB(SgDr)y3@KDmsek&?-Mil!Z`SOe$lSg9+T8BGJXMU2lAkOJvA=QW zPWFHK+q`iQzUjbkRxqf9_~F^JXWx4j=YJV{|FzfVfVoVFW?)(Qn>TLUJ?#96o!E(; l*omFkiJjPqo!GCj{V%afv@|G^|Aqhn002ovPDHLkV1j!ae%Js2 literal 0 HcmV?d00001 diff --git a/docs/static/logo.png b/docs/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd71f184a9471f39f04728654dbb0aabe2da1df GIT binary patch literal 16407 zcmeIZbx>SS6E?cAxI00!KyY_h+}+)Efra2MfdxW>ySqDq-~^Wdf#3uJA-KB+f?o1_ zz3x|a>#e%qfA3bEbLLEUKhyn8PuEWEY=pY193~nm8UO&mRFId}e13L3UrH!Q&-an# zqh|rNn4h-3ho*%$$i>as2KpKT^6+(mfFM3l8vwv(u_OzcO5WlY_GCq93U32S4Lu`2 z=^4HDPGB`Cyj=eHTH{sLPo0d27soi_Z5L)wzCVLb%^EaK*lP5uzFn9#zji&9xn2p{ zcpwP~4C;E?zWr@*b8&5wD<&2mzz>*cb2aT7Qw4#WJ7tl9j&DI8G>Ad%?T{|0-W>)fOJAP!E z9sjIx-=XkL^$|At1zklNIxe`d_d^j-KJSDBbE2?^>oefbvRO^aFg zV_63smp%ccDIE9vZxhSZQ!)8?(?Wc9mivb$CA+&F__yIk#FTWexWwlqnF^3rEMHUM z46BA9#ZhX-CSknQT;Ha$QmshLqV#lFp6>I9vLrYQbz!F`L?qhVZ@x37F%Tr)FWXYZ zj7d~vE18{EWY?8d;hooXaMZ~cFtlH2nznbS;ddx1%k|%DYFTc-vY5ilH>fsjaI&#- zndnVHKB4R|k0!Cr^d;gyc-^3uWu+m?TwA|yU&U@@HI&15^YOr`-TBAHTPenzfRT!_ zoWR3qrHY@MPF-7bKb*R~hE5Fb6b{S+A403c@~S_lF?QBH^; z18t}<=I0l=ZTk-kGP#drw8-lv4@(hky+(#aV{GGFwym`+wcS9pGwy=6#+vTSIzB%+ zY-ej;V{>26cRZNPHQU*BM!zvB&%c$vKFh=vdg|8+diW7DvpC|FXwvOG(f(7aHu~cZ z+S_#G3;$ereTtx((*FKin<}@k0j>?)%JCjV8NV;qZG~5hIrPv*Qj^ZJ{b6k3N(yr0F``RWYf^ZHz%r46 z4HLv6dw1hG2AK4hw<?{~syo$;Y5X-Py_v-D*V&|{6VKA?X{=JLu+TQXh! z6!N73FLb-rfJt~YCrgJ?9G_v=wq{yrB8?$k!pw;y3k|b~5UnENwvxyo$ygtHYKTm? z55HGao$8e{d3IECelIn_A=&2JwR1TT7NWS)knnS_TMs8<`?4f%ZW-HgGKcDH^~i6( zEF)7*BuBPJsix3}U58X~?iOxHiqW&hx66mk?L__dQb5l-Mr1}iv|b@WK2_57Fo&_t z!^uD_VbdYC9?^e(FQJWHMCPF}`3_Mn_N0Bg$#SXqcCy>5f)SaugTJQvS{Jh2pg}x4 z^VP}8@IAfY4}B=55dM&mFdPQA(NEWEtbM;Az_skyl@$AgPT5G};>dfV?;jc|V0^{O z5Rq?5zZ<6u2ANxJ{IyJ^so#7ojPc1+96{8gG4MYi<{AzZIom*K6@56X_ao4V4Ix7M#v2C;%0 z+-}Oct5j$a6khheN7SroS_{ml;scBU&E~5-O?YO22NFucZ!j=??8a_`q>;_-1|2Sx8V37~e9Dp2qA_H=`ZOUQg( zjd;~rlA5p_mRWD{vB*r!G0I)t4?7Qd^-3P6A~=s%=R8BC8$?dZegLwIJ3=pQ*QAIpKrEJ9WX5SG&j$o=&tMH*fjo(EDFXQ-7=9 zmcHPz3z;6erl~=pP`|=?EEHX}`JRJCE$yFCMu}|cH<&BJArX0FGnndGA56Ix;q7i! zSach5IBJys!7BurL)$EkxBZGmvB(Sfb!mw!5 zO`NrPuHUc4y9#B_PPDPf7yVgOJv7$sv?mfj7EMi4y|CAfmY^W- z+De?%A?|-`9QN*RY*M+Pr9@NxM2N0FJo#$YjudNkW_Z73(C3i6j=Y*z3&cN((!)5G zh&#|T=6LF6x|A~)Vrg)f5G_c-3!kG^_9k-CML=2>KGb{KuU>{&T#q#E1qn1+dYb^5 z@GJL=37HCFIWbRi_RUtK(c*wKj$z!*z}+*(KxQ7Z@3J~`gx@wLP6J?`Uwl(xJ?_GA z=Ul~+(R-RWE@GRe`>o}6S(LBN2sNfU)~|W!l5Kq9{p_^DU`o2S*ul&Rt(DX`{yF{3 zcJut2uMx66X3@r=Bx*86zrtUQNnI2{9X-r9>o)-{s|5HXZ_{O|bLF2{8G=%&4KT>? zzJ}423y(?zo3-uyr5Q=decuzRRA&m4C?VIb0y5~U%|YMlP)On0^m}Qf?W&0-g8Q3e z!+M#qBC(=b$`@6*H+&6HYQGcDoEIb10e=;6`Rgb{C4B)SQ4LmQM zUj!X82v8#-iH+kms3B0)*iZ&Xcq`}Ng~%nr43o^O;lZ)G01RMfs$Dk54}@@?*HOyl zBXuUT)6yA86+JGfkGN;<26(ZiGR#^hdyKS&N0WQ4I3C9qj5iPH`sTJ|rdxjJJbRok zLYMO~kPW>G=guZChS>|=YMn{H9QoCOQzFw1a*`2apveSWuZXWA`1h-=vTen>t$lJd zJ6GMR)E4QhME^jch~%wu$6g~of(`2aryi93QT9SGy_8+Q)~(3nDFFdVrmOW+ zEdHlVJB6)$)ZHC)6a;nRfKTB^8O(G5&NzAuVrS!Ifnq@)X$I(f;GCsBM(GhMr+ieB z|6JrL0w0Xe50MkI-aeiYX`p8M;>r_9q()S3QW>E0UMjztHyTH)NI7yb99e5Ye1_Q^ zGv7$1w}iOzEl<2VuS1%4R7(+lToM~7zuZkd?z6c3Hs@ZBI&dx%9O7%}8bk-#2LrSr===2xnF z;`8)!=p^4>)#l#g9J9Hc_&Ds6oP{BM1_&=JfCJXp=pci9w%GMUi*0w|RIG7&r5O4V z*$o>4B+Z|akJn~x49yu#^~S_J&%CtV@GV@;Yff0mBklZI9&LY!zDM(8AKQ3a6;+TV zO_fo#55e2FEnKm<*?EMUH)@|f%=qe!S`e+!?q`OBw+;hRYe_go+L0#=7KMc)a0rV^ zMRwHI<%%XS=UxGAJ9rC)$R1kXw^krmZ2SBJp3xnu;9nyqL5BR@83=+!q*;o2Xf#S5 zw6Rd_x>&S9#i&Icx$6vFSidHOswJJ%rW&5GOQyjwIJzRed;-hR<8pZnfou16#}po$1Kxa z14&hgW?ZzeXqY@WX+6eey>hx$d44_xY-mI7l*^ecXn>Nf;tld8hN~A9Qibo?nPE*ql&@ ztZJdJCj=4Js161)+#b6lEuroa^8`y?c#b5T=XJ_D7|gvZZbej|Azy?dd>K8@e5Jjb z6(2uu^?hF<0V^Cyf`BI{X0ecb!?Dy6xYh=pNs)GyZus@>FKk(0J+=6+ zS22Vo8!&pv#Ejayg;UMvqfeUBY)iGaF%op_V)Ha+V&GiW zqYJQOQ1BhZtG!=IYZ_2REJu8!x(yIydwVYR#XCP1{bj3XZ#u;DLx4}I>in@#o_dvW z_@LUfp1fv{{h?kZ4gyXT&N~q9?M{AVzW#v4ta`(GEDFfFr@x187egAsEwyMX$!^bBz%;L z{dYCCF{{fp-B>@BuJOgo783-*5bgj_go>RM$n?FWxH)EvEY)IgyaaRQeRy-4)orgjrDUwb2vYYk62wb<_(hkqSaL}qZe1=>1duwsYjnNH0SL_uLg(`$fUd7||_ zro-OMbXS8xLCW5hjFt~a>r{({7+VsNhG{)&!RuG1cK^#{THZSwdlP)Wo|Q?L8@SoT zA>Q#W_mz1rJSJ>EIR1?1C{3AniS*^Hhu9GpHv5QS|!EZ2~ zhQ)`Ot+pdDYnV?BtjJrj{ok4I=GVSEj>@HtN@v|I1)vx88UtvGBdVvYhu}ZFtnto6 zZqM9s`1Mt1MV(MAq;O`|4=T^rT&@qDldW50PrnmDIqAYAg1L!@U-ArG3{Hffl#uuY zj`kgs#(XU*$P|BZ#v&SSJ_?rABfb<5PQbV@NJr%Z;^wXv>^VFUJ%lGR=u}>1G{de>7B9m^3rWwm zx#jvM8_B4sM-X?#(QCdiMR1yE>=DES@_L8fojKl1-7#z#JBHxqC6YP?|<8Hy$mQ77?Z&TUS}S1dG1f&_jilaif1(s(#S?Exr` z?i8{0HKsQ)=LUMX{rNUH|5v)dgh&PhO3F@MsX4+Y4I1aGc(Kefyqo1#f;Xt5Lp#kJ z^JIPF`Ce1U_?yb}M;{a@OOb%ETQsodN7&^?FJ|#ZEaEg+2X|Yg@x`1Wy|ub)a%L_O z;a$3d5NUCqLl5D;HD)LOs803mmqmFgBj~N?H%n4kV|6Sn3Dx{Seam$d89D6IQGu)5 z@h+eBoRz6qZ~K~Znkg;<*j6nua_&2J7o|*>tZ`?af%%ZvAw?ObE?DRY>A2eEGDWEj z^zL~3TG%MG)E(~$?xspj3YyBsGg&|(uz}r4VoHL(JTk8r+&EM_i{`ipC=Ue9S>y%>dAu}#Ti-hE>e{J_>ff$S1V1Qdf$wcBe;Z4q7N=cq~i1gl$ zE0vOufke;UbC$91z~!9XD{5o$;YH!(h}k=2il%XMt&uS~2H6U1mDOe@g^n9u0;v z8z6f(nm8)8(IlIXzG`WT{8m*);CyWict46$n#ZRD;ZlaxPGgO%`R*YzE<^>uj)vISR6h4#S(E*UIc1CqXGeyCpbG_McuV z6=%n;K`IY4ro0krbmdj8cc$J9`X%xb4tj@072NvK_AnS-P_XMWetmwFtkJ>|e{c{` zk=mVCTY?s^(iL{lHjiEa9)PWTi^UDO_t>~X`kkhhqF$?W{NbE=sBEk3z7l344(4fYS zItM3T>Nsg@mK|IfR3&&E}i$ZN_x?>bF zL}m7r_Sih}nBAJtrO-?n+QoMm9Pq)R(aqv+o$(qpEfh;ZWYWtfIT>)i`K)$kCV@uM z!TiGD2`(W~pic@pqF6$c(YAciU|Ds~5xo4#N{9*_Rg`m;%vz}yZzB8RJw(HROy%C# zimKXYW)`OEJbW0YR9%DZ9o)3aC?IARDqsg4gPHGMQj`|bMj%nY)HeA}9wC=nl7tS0 z4d*m%{38E2#Vyq&R1(; z3H(;dh{ja4$_bpBF_i~^qh>(zWAq z4_Ec{nP~L19}btMdcc>|ae0YsC9xFz{9s-Y^%V2m3!kzIbM9{<`tn7eVw2lREv~#Z z@g0?K_%A|gyfIKeIy3I-5 zWgisl-&YxwZ65h%`S)c<(}^S2W2uncBkL0n^}d+T5y(7eLwV6dDsrEkL8gZ=y6YXO zr%Q9HKx%9oaQ#c?%saVu>mJw1OJ@c?>d2gBkT#9WR{}&ZzGfgiJTtCh&T_nA`pIQU z7Pet>G61Q7RvQQ;)orm4fzr@9JZJ7hgR;B*kK||1OQdM1+?3 z9h_gZVR>VL+cX}!RC$D6C!5+XDJPPbAb}}Q^qW;lu6AoHu8fyw5s;iUV5AdgZzSYz z=w_l!h0PG(Q)e^Z*pd&_E;XU1D4U(b9n+cotTFC~?SyCkQ*>r2tW@;q4g;Yh>}H0l zpKs}X_pgpl1kV6*8}Rn6ID?-GIgxecg0q@kW<&;NCK!Nm6(hy@{#cwdrWvuoGrLle zS~(&p*MPhDgk=+UBL0ib;WUu+7x0lGBw(;-Y6j;4FY8NOZk%U=b>xxXd+@~dY+m1V z=Ae*(yI71&ukQj2#eEW9Dld}op<`_Z-+XK=bT^bV^P9?8XY=8>mNRyFD_ zB&AkaRe2@~|*Pq@#;~sJivTT%p z5p%$1tPP7U0U}aOBMZ0y`1B5cy+Qy!pok|lA`Xmy=rvpd5A&gHR=(NLOnnbsktHit z@&7DoEltUmp$yuBHjz8~-|f}BrHzsb2$ zYRiT@bEQq8oAP_wz@i@~*Z+QmBC3kTI&NK*b(8gT0RAH_aN$AYum^1@ROR$_;3{vhm{?!M#i=V9q{hB-N%1jdyoRi={-Y< zjE)}6H^<4Qi(O^*!%#wa+?S$2RV&o8PW?EX5A2emw};uye3fLERj=#2APDJDagS%8 zJBRa-?bt59I0x?qhXpr#+KYHDw8cn%vsn<%_+F%15S*VRyFa9540PcI=oxxMZ++L_ zQo%v2xs66X%{V(3#|#j9j}^J@@BvG|v*f(a#cucsEvwTZp1o?>Op^w}nRda}%Rxx%EWb?9j;!|PBefWtv}mX* zamhPf-S3j$dXzUP?pNC;LJejZ$uH?tI^Rr@2TSHdXzI&47E{@P>W_sZ4 zd-uqcojq=4*bNbb3rRf7h4%a@H>fVJk}o8O7f^0@frVruX^pt${T1MyYBh^hQ@40b zuPscSs|b-E{NzZT_PP?{9G>Yz295RP;x(x}ec&f2-z<W$7Z|c~Q{9IdEccZy11|5_#E{6_C%C z$1^EV&x?;B;=70BND_kttyP^ckb7zJV)D1CQV^h-(CoPVWl=2MSV z7~Z1LjYZ=0$vVe-LY%+pT7t3>ZX)sk7Sw*qJyo}f%3I2Pw8#u%Nx{>20P|pOll&e& zXr&NG#9L0=TJ*44Ie1GYvK$z-8UI56_7Lt<4sioK>G$8E@{NuzvJxC{+N9L$f`y{N znkb&L3j^Y{pQoOGz}I`Ik^yn=)lmjEY=A1zUMIyAB)LIq=) zskb;W&_pu5nXlVMGjsU>BFU7xubCc!{y0Uw*wHfPG4h1yNq&26&>p~xb!x*QjhE3G zSak4SXSPo#QKFI+HM5g$Nuic1#4EQBY1Ij7! zc*30P+qq2T*{KHr;NC)|q|_Cpr2cV~g z0~%H8Z_x^L?Y{MHPP5xh#}~H>pnX6@79*;{VjKSiZbb`OMGh}YN-B&>zUeNWq#g|2 z2<<ZuLjLAtNl!G}(Yv8pwh(aO&H1sBR)rZgKk<`tZ1~1T~a<-2;C156!m=Oq`2e z@9b)v(*XnE&sb(KqkKYr{AQ*FPw?do6g0ypB8D(NfzD{=A!#cD#1y|SzLqB_OyJ8! zgjphwQhZf>rzk8#uB9Dw{$P+sIBt~vO);kF_>0+#FAmJ3#$|$UUlDyoz=gM-RhLC1 zT5q&3PM4nv?CTfXy^(SIvdI*hU*8C=Pc#KPxxG1f6i@+thyn;@R_ESaw`U?1Qh@}@}~H= zU|mL_j_qG_i$iM**OIT1=%^c*txh^pEX$BeVsfkd{~{_Y5qX`4MQ5@Zsi7b@qjuzf&O4x zSUP)ph)`2M%R&F}&(TFi<)83Q?tf?DnGbd!3m0}yHV$@2NA`cWaQBe$dItHsL;pt$ zckSmBQtX-#cV|yGD~OC2#L0u^-yy86{%P;x>Gt}saICG^A+I5h&#LavqjLVoka7wt z>i@L(LxC;S(d93zXR`l8(*tVrFS7o_w?C4`ybl>i2X0+XDt;Ku(Y$4 z=O6bJq(!Lzj1RVUwt`xN|7vn`aaiyPSXr=gS#j~Q^6>L&E68bM#cFLWz|YEK!_C1e_-xDy;pKx^L-;r? zIIST62BGE#ea=dY*Z=O-A1Lc*C=M%bYkq5fE>=DpE-O|ZOMYusL2GVaRvTUjCl8M` zw}1_|z+X_-R$y6YH%E)->4Z93*h1J{oNWIR{2?4Hp{^i8&Bey?uO9W+79KXw1|rnT zP$y5He+jgqju0&mi$82~^6_)>2@3G?@^bTYbMW#0OGy{v=Kh?Ce=s>Y*tog=lKhz# z@N+QF#9I8x(`SIc`k!L~OSwTTJe=LMot9+2?grd%HC{ye_#UtND&QCbk! zzrFqK^)>Xbr33=~wJ5+AR(}h@-NFlE{gM)WAOfrcJT`pR`~udTf);&17`nIGyV~=F#G?D6XCxU{;kM7 z+x@NYxp+O-LiT?a!@qO(?C<~0&)?_b|K<=N(EkSculW5RUH_x&zhdCOQvP3d{g1By zih=)1`G48<{~KLs|JqJLoSwf0c|UKKL|I_0&l@cyOC>pJz|(W$OAzJjP;-4}057#Jd@%>!nUqqs1* z29ZY0do@DLT?3|WtsAjOw2`JhS|GhpkMA+h`Iuh;Z-`(3@nNcG#fr4D_D!Eo=2J-G z<7^xhJ3blD&0Zc7R$Q%7ShqtE zRq*sAv_+XV(zcW0Zp#2Q<6}8s9qHWIG+)i?X@CzAU8P#R=sBpIjJ1Fm@yEcP(CUb9 zDjIlur*q-Izsaa|>8EdeI@UO^yxcMA`N;@lk`H8o>H$@HEGtevFv&2~1AOR-#z(b# zjz@D6w}X1fww9BF5DpNhQLn8 z;i_KLr@zAlWlwY8fg=mn1G20(^ia7491sOl6Y22<#bG|y@Io&UcP{=i)`phI_MHGIO33x2l zf4G1dr8rOkJG9ENdcKSVF>fvrZ(XOKx*927IMm#4^jP(|>zs;FKRuZWUhB!=&NCLJ z=1tU&_7lP4Mw~UDbk6;SIMk+j>;e<8e3FDSQrZ|z%J2nPCAxT##K{l?(W?=bk;xh7 zuDA+#^K=8=6NPnGMb6@{22ir=PRWX51pr$C0;=G9k#lI0n+kv*el!>xI0~b6tNpon z^$sxrQ2WKZLB_Z6JZrX_p=c9tRj}je?ihI)&+7Z@3u{>{#fTQO4A6=vQS35%%J~Ok zWH0Pfz%reJ=&D{gp)6d8S`=yH#2f;Il5k7Z6x?CbwgT-zb?d8;W|uY zYd{K#Wln&Vh==7Esqbne-&yC3kpHCO{olj6|sl{iae9&zuTNX+PS;oE>T3>v2xnom- z$oWLsr#p)FsS{51D4gd;^QimtblV#)$xF0{%%X1_oCWgjh?5smBd5BnckqWMeOYFJ zKzMT8_02B2e0tFAj!^MIqx(}N!;dDS-y8egilZ$`T1=hQR!F|a+V8$ZA=)HW<1KC! z50=DFej>J!_|XV#iPG|a>Czmkln-)h$qf2l+4 zIiM_cc|gpXqJwFh%5smL)!}G|=F_TrU);i4nzFZ$Ema=yXhBh

Ry;N#{n&-cOV=vC-JivAk z&|okF!cI^4L{&yLrVt^PUB++qCDy_6pX$V)ZZAY1Am-4X5_@FbG=D zq^FUg`;q)6B-y)QdP;=TxP|aU5QhCrWLkDU>Z5)Qz^1FX^Gn|obRY{rJhZ`%BGA%P z$U287^4WUObSA@kzjloJkUWJX{_$-ICKXgjQWnJfRAp^@HA}%Ms-kK)ls;%C#KJI4 zG&a4%6J$aCZt)WFazzRCrk%Cq%O*p%hlO14Ib}NwnUFlL-x(br1e%cnr9S{2N9Ct6 zIa6Y39AmAW+JEA>ogteHdc*0#Se9(%JqH&QPx~Til7#I2l}Aj&14}`-3(GP>Ev3Dh z?&{c#L;PQ+IjF*!F|JekDrhOUnK>aisgr--qSEe5>*Oq2ID%JR$ zvh^Kknm`d0Q-{RT-`?5pojO3PV4!bg!p!6%DCWD@1|os6AR1$6CZ8n}8q1tJCFY$f;qf8%M$}nfd6rf*N(#`&+Z0%*_~i9MdVUs>>LNTS z{}Sf)B#FZIi`mhzniy*ZtOA?glR|g#Oetc$gT)O1RvA_`;BE`!d6e+L3l?0JQ=uJ5 zjk2uuR_>j_@uDWBS2Ep&v$lxEVoGaA?mUJ%4X_FN%@ZlqQIA}Y@DW<){vUt}(t72d zE-mplSf{Kc(>k`t9BZ>Q=TCyh!r@k$j5s ziDJFyi5j@o6(X+$27cuVviiy(s<&uoEa9$tu|dO3heD zNarT@?UE=yc_3Xeh>%iuoE1J6DObU_b%}(_es_Fz5XPhC&>bgVp{zm#RgvvDA}V@! z!r`nb8%Go~)S`)M63h5bysU_KXf4U`hNrpRsXs~q+hHdTfl~P+#UP%c%nXmhrhZf- z-AMN={AvHla6$9K`{WIDjASQ?Ie=J82T_)-|Kg57OInZC2iD#*)3pj^k1$xB9Y*pf+jX zZV{ZWcWwzht`w9=`i5u1t~*YHKrZOVNP$7@bo$_0J4X&MZj?`-;cJgNX)itRAIWi^>l>+v0XnL&gjojE&eoDT&^)X+idq?N6{$ zfXh|)%d(Da8&QRnX;9b-xrOm!xo{SPxCI*PWLiX=F>@9YB={>P$oMRkH + +![Wet Synthesis inputs and outputs](./static/graph_pattern.drawio.svg) + +

+ +_Diagram showing the pattern of input CUDS objects that the Wet Synthesis +Wrappers expect to find in the session's knowledge graph and the CUDS objects +that are produced as simulation outputs._ + +
+ + + +Once you have imported the namespace and the session class of your choice, you +may instantiate your inputs, run the simulation, and process the results. + +```python +with CfdPbeSession(end_time=None, write_interval=None, + num_moments=4, num_proc=1, + dummy=False) as session: + # Initialize the session with a `WetSynthesisWrapper` object. + wrapper = wet_synthesis.WetSynthesisWrapper(session=session) + + # Create and link your CUDS objects here. + # accuracy_level = ..., pressure = ..., temperature = ... + # ... + # solid_particle.add(density, molecular_weight, shape_factor, + # rel=wet_synthesis.hasProperty) + # ... + # wrapper.add(accuracy_level, pressure, size_distribution, ...) + # ... + + # Run the simulation + session.run() + + # Process and/or export your simulation results + # ... +``` + +Both session classes accept several keyword arguments that control the +simulation in various ways: + +- `delete_simulation_files` _(default: `True`)_: As described in the + [installation section](installation.md), a "case folder" for OpenFOAM is + created from a template before the simulation is run. The folder is + additionally populated with results produced by OpenFOAM during the + simulation. Some results are transformed into CUDS objects, but others are + not. You can peek into this folder to get this extra information, or + alternatively, set this keyword argument to `True` if you do not need it, so + that the folder is automatically deleted when the simulation ends. +- `end_time`: Amount of simulated time to run OpenFOAM for (e.g. `0.03`). If + set to `None`, an automatic guess will be used instead. +- `write_interval`: Controls how often data is written to the OpenFOAM output + file. If set to `None`, a default of `100` time steps is used. +- `num_moments`: A value needs to be set, but it will be ignored and replaced + by `4`, since at the moment, the wrapper is not capable of adapting the case + template to more/fewer moments. +- `num_proc`: Number of processors to be used for the calculation (e.g. `3`). +- `dummy`: When set to `True`, a special dummy set of moments is used so that + the simulation ends after a short time, useful for development and debugging + purposes. It should normally be set to `False`. + +Two complete examples of use (one for each use case) are provided in the +[`examples` folder](https://github.com/simphony/simdome_wet_synthesis/tree/master/examples). diff --git a/packageinfo.py b/packageinfo.py index 9555d24..a7d3a3f 100644 --- a/packageinfo.py +++ b/packageinfo.py @@ -1,4 +1,4 @@ NAME = "simdome_wet_synthesis" VERSION = "1.1.0" OSP_CORE_MIN = "3.7.0" -OSP_CORE_MAX = "3.7.1" +OSP_CORE_MAX = "4.0.0" diff --git a/setup.py b/setup.py index 7169e2b..b2b1508 100644 --- a/setup.py +++ b/setup.py @@ -11,15 +11,13 @@ name=NAME, version=VERSION, author='MuSyChEn research group at Politecnico di Torino', - description='A collection of wrappers for wet-phase synthesis of Ni-Mn-Co hydroxide', + description='A collection of wrappers for wet-phase synthesis of Ni-Mn-Co ' + 'hydroxide', keywords='SimDOME, CUDS, Precipitation, NMC hydroxide', long_description=README_TEXT, install_requires=[ 'osp-core>=' + OSP_CORE_MIN + ', <' + OSP_CORE_MAX, ], - packages=find_packages(exclude=("examples")), + packages=find_packages(exclude="examples"), include_package_data=True, - # entry_points={ - # 'wrappers': - # ''}, ) From 1fb23246042d51da4f07dad70f2bbf22ef35a1ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Manuel=20Dom=C3=ADnguez?= Date: Thu, 22 Dec 2022 10:18:20 +0100 Subject: [PATCH 02/11] Simplify use with Docker --- Dockerfile | 25 ++++++++++++++----------- docker_install.sh | 37 ------------------------------------- 2 files changed, 14 insertions(+), 48 deletions(-) delete mode 100755 docker_install.sh diff --git a/Dockerfile b/Dockerfile index e84581a..8bb2759 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,16 @@ -ARG OSP_CORE_IMAGE=simphony/osp-core:latest -FROM $OSP_CORE_IMAGE +FROM ubuntu:20.04 LABEL maintainer="mohsen.shiea@polito.it" LABEL dockerfile.version="1.1" +ENV DEBIAN_FRONTEND=noninteractive + # Install requirements RUN apt-get update && apt-get -y upgrade && apt-get install -y \ - git graphviz wget build-essential g++ gfortran libgfortran5 openmpi-bin libopenmpi-dev make libssl-dev libblas-dev liblapack-dev \ - apt-transport-https software-properties-common openssh-client bash-completion bash-builtins libnss-wrapper vim nano tree curl unzip + git graphviz wget build-essential g++ gfortran libgfortran5 openmpi-bin \ + libopenmpi-dev make libssl-dev libblas-dev liblapack-dev \ + apt-transport-https software-properties-common openssh-client \ + bash-completion bash-builtins libnss-wrapper vim nano tree curl unzip \ + python3-pip RUN cd / && mkdir cmake && cd cmake && \ CMAKE_VERSION=3.20.1 && \ @@ -29,10 +33,9 @@ RUN cd / && mkdir sundials && cd sundials && \ make install && \ cd .. && rm -r builddir cvode-${CVODE_VERSION} cvode-${CVODE_VERSION}.tar.gz -RUN cd /usr/bin && rm python3 && ln -s python3.6 python3 && \ - wget -O - http://dl.openfoam.org/gpg.key | apt-key add - && add-apt-repository http://dl.openfoam.org/ubuntu && \ +RUN wget -O - http://dl.openfoam.org/gpg.key | apt-key add - && add-apt-repository http://dl.openfoam.org/ubuntu && \ apt-get update && apt-get install -y --no-install-recommends openfoam8 && \ - cd /usr/bin && rm python3 && ln -s python3.7 python3 && rm -rf /var/lib/apt/lists/* + rm -rf /var/lib/apt/lists/* ENV user=simdomeuser HOME=/home/simdomeuser @@ -52,10 +55,10 @@ RUN mkdir -p $HOME/simdome/wrappers/simdome_wet_synthesis && \ COPY --chown=$user . $HOME/simdome/wrappers/simdome_wet_synthesis WORKDIR $HOME/simdome/wrappers/simdome_wet_synthesis -ENV PATH=$PATH:$HOME/.local/bin +ENV PATH=$HOME/.local/bin:$PATH -RUN pip install matplotlib scipy \ - && pico install ontology.wet_synthesis.yml \ - && python setup.py install --user +RUN pip install matplotlib scipy +RUN pip install . +RUN pico install ontology.wet_synthesis.yml CMD ["/bin/bash", "-c", "source /opt/openfoam8/etc/bashrc && /bin/bash" ] diff --git a/docker_install.sh b/docker_install.sh deleted file mode 100755 index 19920a8..0000000 --- a/docker_install.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -# -# Description: This script creates a docker image that includes the osp-core -# and the wet synthesis wrappers -# -# Run Information: This script should be run manually. - - -# Extract osp-version -osp_tag="v" -osp_tag+="$(python3 -c 'import packageinfo; print(packageinfo.OSP_CORE_MIN)')" -# osp_tag+="-beta" - -rm -rf temp_osp-core | true -# Download osp-core to temporary folder -git clone https://github.com/simphony/osp-core.git temp_osp-core - -cd temp_osp-core -git checkout ${osp_tag} -docker build -t simphony/osp-core:${osp_tag} . - -ERROR_CODE=$? -if [ $ERROR_CODE -ne 0 ]; then - echo -e "\nError:" - echo -e "osp-core image creation failed.\n" >&2 - - cd .. - rm -rf temp_osp-core | true - - exit $ERROR_CODE -fi - -cd .. -rm -rf temp_osp-core | true - -# Build docker image -docker build -t simdome/wet_synthesis --build-arg OSP_CORE_IMAGE=simphony/osp-core:${osp_tag} . From f088eb5218a1918ad94b125574fb1a1f25ff16b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Manuel=20Dom=C3=ADnguez?= Date: Thu, 22 Dec 2022 17:23:43 +0100 Subject: [PATCH 03/11] Add graph pattern --- docs/static/graph_pattern.drawio.svg | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 docs/static/graph_pattern.drawio.svg diff --git a/docs/static/graph_pattern.drawio.svg b/docs/static/graph_pattern.drawio.svg new file mode 100644 index 0000000..70d2e15 --- /dev/null +++ b/docs/static/graph_pattern.drawio.svg @@ -0,0 +1,4 @@ + + + +
ns:Compartment
ns:Compartment
ns: <http://www.osp-core.com/wet_synthesis#>
ns: <http://www.osp-core.com/wet_synthesis#>
value
ns:type
value...
ns:Class
ns:Class
Ontology individual belonging to class <ns:Class>. 
Ontology individual belonging to class <ns:Cla...
ns:rel
ns:rel
Ontology relationship <ns:rel>. 
Ontology relationship <ns:rel>. 
ns:attr
ns:attr
Ontology attribute <ns:attr>. 
Ontology attribute <ns:attr>. 
xsd: <https://www.w3.org/2001/XMLSchema#>
xsd: <https://www.w3.org/2001/XMLSchema#>
Attribute value "value" with data type <ns:type>. 
Attribute value "value" with data type <ns:typ...
ns:WetSynthesisWrapper
ns:WetSynthesisWrapper
ns:SliderAccuracyLevel
ns:SliderAccuracyLevel
"0"
xsd:integer
"0"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
ns:Pressure
ns:Pressure
ns:Temperature
ns:Temperature
ns:value
ns:value
"101325"
ns:float
"101325"...
ns:unit
ns:unit
"Pa"
xsd:string
"Pa"...
ns:value
ns:value
"298.15"
xsd:float
"298.15"...
ns:unit
ns:unit
"K"
xsd:string
"K"...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:RotationalSpeed
ns:RotationalSpeed
ns:value
ns:value
"200"
xsd:float
"200"...
ns:unit
ns:unit
"rpm"
xsd:string
"rpm"...
ns:hasPart
ns:hasPa...
ns:Density
ns:Density
ns:unit
ns:unit
"kg/m^3"
xsd:string
"kg/m^3"...
ns:value
ns:value
"3953"
xsd:float
"3953"...
ns:MolecularWeight
ns:MolecularWeight
ns:value
ns:value
"92.338"
xsd:float
"92.338"...
ns:unit
ns:unit
"g/mol"
xsd:string
"g/mol"...
ns:ShapeFactor
ns:ShapeFactor
ns:value
ns:value
"0.523599"
xsd:float
"0.523599"...
ns:unit
ns:unit
ns:SolidParticle
ns:SolidParticle
ns:hasProperty
ns:hasPr...
ns:hasProperty
ns:hasPr...
ns:hasProperty
ns:hasPr...
ns:Feed
ns:Feed
ns:name
ns:name
"nh3"
xsd:string
"nh3"...
ns:hasPart
ns:hasPa...
ns:Component
ns:Component
ns:name
ns:name
"nh3"
xsd:string
"nh3"...
ns:MolarConcentration
ns:MolarConcentration
ns:hasPart
ns:hasPa...
ns:value
ns:value
"10"
xsd:float
"10"...
ns:unit
ns:unit
"mol/lit"
xsd:string
"mol/lit"...
ns:FlowRate
ns:FlowRate
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:value
ns:value
"0.30666132"
xsd:float
"0.30666132"...
ns:unit
ns:unit
"lit/hr"
xsd:string
"lit/hr"...
ns:SizeDistribution
ns:SizeDistribution
ns:hasPart
ns:hasPa...
""
xsd:string
""...
SliderAccuracyLevel should be
be between 0-10:
- 0-5: Compartment approach
- 6-10: Directly coupled CFD

However, at the moment the
accuracy level is ignored. The
kind of session used determines
the approach used (directly
coupled CFD or Compartment),
and for each approach there is
only one mesh available.
SliderAccuracyLevel should be...
Example value,
can be set
differently
Example value,...
Example value,
can be set
differently
Example value,...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Create an instance of Feed
per each reactor inlet stream.
(e.g.: solid inlet stream,
NH3 inlet stream)
Create an instance of Feed...
Example of a Feed instance
for a NH3 inlet stream
Example of a Feed instance...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Create a component instance
per each species in the feed
Create a component instance...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Simulation results added to 
SizeDistribution object
Simulation results added to...
ns:CompartmentNetwork
ns:CompartmentNetwork
ns:hasPart
ns:hasPa...
Simulation inputs (common to all use cases)
Simulation inputs (common to all use cases)
Simulation inputs (CFD-PBE Wrapper)
Simulation inputs (CFD-PBE Wrapper)
ns:Feed
ns:Feed
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
Simulation inputs (Compartment Wrapper)
Simulation inputs (Compartment Wrapper)
Simulation outputs (CFD-PBE Wrapper)
Simulation outputs (CFD-PBE Wrapper)
ns:Bin
ns:Bin
ns:ParticleDiameter
ns:ParticleDiameter
ns:value
ns:value
"10"
xsd:float
"10"...
ns:unit
ns:unit
"micrometer"
xsd:string
"micrometer"...
Example value,
can be different
Example value,...
ns:ParticleVolumePercentage
ns:ParticleVolumePercentage
ns:value
ns:value
"23"
xsd:float
"23"...
ns:unit
ns:unit
""
xsd:string
""...
Example value,
can be diferent
Example value,...
"0"
xsd:integer
"0"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
ns:Bin
ns:Bin
"n"
xsd:integer
"n"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
Simulation outputs (Compartment Wrapper)
Simulation outputs (Compartment Wrapper)
Simulation results added
to CompartmentNetwork
object
Simulation results added...
ns:Compartment
ns:Compartment
ns:Volume
ns:Volume
ns:value
ns:value
"0.5"
xsd:float
"0.5"...
ns:unit
ns:unit
"m3"
xsd:string
"m3"...
Example value,
can be different
Example value,...
ns:TurbulentDissipationRate
ns:TurbulentDissipationRate
ns:value
ns:value
"0.4"
xsd:float
"0.4"...
ns:unit
ns:unit
"m2/s3"
xsd:string
"m2/s3"...
Example value,
can be diferent
Example value,...
"0"
xsd:integer
"0"...
ns:ID
ns:ID
ns:hasPart
ns:hasPa...
"n"
xsd:integer
"n"...
ns:ID
ns:ID
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:OutletBoundaryFlux
ns:OutletBoundaryFlux
ns:value
ns:value
"0.4"
xsd:float
"0.4"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:name
ns:name
"outlet"
xsd:string
"outlet"...
ns:InletBoundaryFlux
ns:InletBoundaryFlux
ns:value
ns:value
"0.2"
xsd:float
"0.2"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:name
ns:name
"5"
xsd:string
"5"...
ns:OutgoingFlux
ns:OutgoingFlux
ns:value
ns:value
"0.8"
xsd:float
"0.8"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:ID
ns:ID
"5"
xsd:integer
"5"...
Example value,
can be diferent
Example value,...
Example value,
can be diferent
Example value,...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
Text is not SVG - cannot display
\ No newline at end of file From 11a1c36a5c7a4fac5a6d4ce9274a36fdbcaf2f2c Mon Sep 17 00:00:00 2001 From: AndreaQuerio Date: Wed, 25 Jan 2023 09:25:16 +0100 Subject: [PATCH 04/11] Add some indications to compile the solver --- Dockerfile | 10 ++++-- README.md | 31 +++++++++++++++++-- .../precNMC_foamTemplate/system/controlDict | 6 ++-- .../system/updatingFiles/controlDict.0 | 6 ++-- .../system/updatingFiles/controlDict.1 | 6 ++-- .../system/updatingFiles/controlDict.10 | 6 ++-- .../system/updatingFiles/controlDict.11 | 6 ++-- .../system/updatingFiles/controlDict.2 | 6 ++-- .../system/updatingFiles/controlDict.3 | 6 ++-- .../system/updatingFiles/controlDict.4 | 6 ++-- .../system/updatingFiles/controlDict.5 | 6 ++-- .../system/updatingFiles/controlDict.6 | 6 ++-- .../system/updatingFiles/controlDict.7 | 6 ++-- .../system/updatingFiles/controlDict.8 | 6 ++-- .../system/updatingFiles/controlDict.9 | 6 ++-- .../system/updatingFiles/controlDict.cfd | 6 ++-- setup.py | 15 +++++++-- 17 files changed, 92 insertions(+), 48 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8bb2759..c01fa46 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,12 @@ RUN apt-get update && apt-get -y upgrade && apt-get install -y \ bash-completion bash-builtins libnss-wrapper vim nano tree curl unzip \ python3-pip +RUN wget -c https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh && \ + /bin/bash Anaconda3-2020.02-Linux-x86_64.sh -bfp /usr/local && \ + conda update conda && conda create --name wet-synthesis + +RUN conda install mkl-service + RUN cd / && mkdir cmake && cd cmake && \ CMAKE_VERSION=3.20.1 && \ wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}.tar.gz && \ @@ -57,8 +63,8 @@ WORKDIR $HOME/simdome/wrappers/simdome_wet_synthesis ENV PATH=$HOME/.local/bin:$PATH -RUN pip install matplotlib scipy +RUN pip install matplotlib scipy numpy sklearn mpi4py RUN pip install . RUN pico install ontology.wet_synthesis.yml -CMD ["/bin/bash", "-c", "source /opt/openfoam8/etc/bashrc && /bin/bash" ] +CMD ["/bin/bash", "-c", "source /opt/openfoam8/etc/bashrc && /bin/bash && source activate wet-synthesis" ] diff --git a/README.md b/README.md index 66fb69c..cf6c3bd 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,10 @@ The wet synthesis wrappers require a working installation of [OpenFOAM 8](https://openfoam.org/version/8/), [SUNDIALS](https://github.com/LLNL/sundials) ([v6.1.1](https://github.com/LLNL/sundials/releases/tag/v6.1.1) is known to -work) and [7-zip](https://www.7-zip.org/). Follow the links to find +work), +[7-zip](https://www.7-zip.org/), +[Anaconda3](https://www.anaconda.com/) +([v4.8.2](https://repo.anaconda.com/archive/) is known to work). Follow the links to find installation instructions for each tool. Once the requirements have been installed, clone the Wet Synthesis Wrappers @@ -51,6 +54,30 @@ pico install simdome_wet_synthesis/ontology.wet_synthesis.yml # python -m osp.core.pico install simdome_wet_synthesis/ontology.wet_synthesis.yml ``` +To use the CFD-PBE Wrapper, it's necessary download the solver from the GitHub repository of Politecnico di Torino. + +```shell +git clone https://github.com/mulmopro/wet-synthesis-route.git +``` + +After downloading it, enter the right directory and compile it. + +NOTE: before start the compilation, make sure to put the correct path to the sundials libraries +in the *Allwmake* file in the *wet-synthesis-route/cfd_pbe_openfoam_solver/* fdirectory. + +```shell +cd wet-synthesis-route/cfd_pbe_openfoam_solver/ +./Allwmake +cd ../cfd_onlyEnv/ +./Allwmake +``` + +To use the Compartment Wrapper, install the following package. + +```shell +conda install mkl-service +``` + @@ -68,7 +95,7 @@ cd simdome_wet_synthesis and then run ```sh -docker build -t simdome/wet_synthesis . +docker build . ``` to create the docker image. After that, run diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/controlDict b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/controlDict index c73a865..1c9f63b 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/controlDict +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/controlDict @@ -107,11 +107,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.0 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.0 index a22ba18..79e4835 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.0 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.0 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.1 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.1 index 191ab9c..1e83e6e 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.1 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.1 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.10 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.10 index 55d8aac..d8f9b0c 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.10 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.10 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.11 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.11 index e606b66..4c6a395 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.11 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.11 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.2 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.2 index bb5d04d..5b2f2e5 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.2 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.2 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.3 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.3 index d771fe3..81d4a78 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.3 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.3 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.4 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.4 index 8d4734c..f68af2c 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.4 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.4 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.5 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.5 index d724259..0bdff72 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.5 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.5 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.6 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.6 index 6eaf11a..ca46217 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.6 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.6 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.7 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.7 index 72f5472..e6a4691 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.7 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.7 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.8 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.8 index b63b8cf..ceaecfd 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.8 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.8 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.9 b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.9 index 02331d2..146fea2 100755 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.9 +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.9 @@ -101,11 +101,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.cfd b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.cfd index c73a865..1c9f63b 100644 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.cfd +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/updatingFiles/controlDict.cfd @@ -107,11 +107,11 @@ functions { type timeActivatedFileUpdate; libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/constant/odeSolver"; + fileToUpdate "$FOAM_CASE/system/fvSolution"; timeVsFile ( - (-1 "$FOAM_CASE/constant/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/constant/updatingFiles/fvSolution.1") // 5e-6 + (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 + ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 ); } diff --git a/setup.py b/setup.py index b2b1508..4fb53d6 100644 --- a/setup.py +++ b/setup.py @@ -15,9 +15,20 @@ 'hydroxide', keywords='SimDOME, CUDS, Precipitation, NMC hydroxide', long_description=README_TEXT, + packages=find_packages(exclude=("examples", "tests")), install_requires=[ 'osp-core>=' + OSP_CORE_MIN + ', <' + OSP_CORE_MAX, - ], - packages=find_packages(exclude="examples"), + "graphviz", + "numpy", + "PyYaml", + "scipy", + "sklearn", + "mpi4py", + "matplotlib" + ], + python_requires=">=3.7", include_package_data=True, + # entry_points={ + # 'wrappers': + # ''}, ) From 7ae5429557a28433104f194492a0092ed0a80462 Mon Sep 17 00:00:00 2001 From: AndreaQuerio Date: Wed, 25 Jan 2023 10:19:55 +0100 Subject: [PATCH 05/11] Correct Dockerfile --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf6c3bd..afc9120 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ cd simdome_wet_synthesis and then run ```sh -docker build . +docker build -t simdome/wet_synthesis . ``` to create the docker image. After that, run From 68a940a74795a7aa6eb7d1d8635dfe71b558326a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Manuel=20Dom=C3=ADnguez?= <43052541+kysrpex@users.noreply.github.com> Date: Wed, 25 Jan 2023 14:25:13 +0100 Subject: [PATCH 06/11] Update setup.py Replace sklearn by scikit-learn in setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 4fb53d6..d305be6 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ "numpy", "PyYaml", "scipy", - "sklearn", + "scikit-learn", "mpi4py", "matplotlib" ], From da4f12255a60a14df8e00bdeb776a67af0f7e112 Mon Sep 17 00:00:00 2001 From: AndreaQuerio Date: Wed, 25 Jan 2023 15:22:40 +0100 Subject: [PATCH 07/11] Change README.md file --- README.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index afc9120..a061a0a 100644 --- a/README.md +++ b/README.md @@ -37,24 +37,7 @@ work), ([v4.8.2](https://repo.anaconda.com/archive/) is known to work). Follow the links to find installation instructions for each tool. -Once the requirements have been installed, clone the Wet Synthesis Wrappers -repository and install them. - -```shell -git clone https://github.com/simphony/simdome_wet_synthesis.git -pip install ./simdome_wet_synthesis -``` - -Then install the required ontology. - -```shell -pico install simdome_wet_synthesis/ontology.wet_synthesis.yml - -# If you have issues using pico directly, you can use -# python -m osp.core.pico install simdome_wet_synthesis/ontology.wet_synthesis.yml -``` - -To use the CFD-PBE Wrapper, it's necessary download the solver from the GitHub repository of Politecnico di Torino. +In addition, to use the CFD-PBE Wrapper, it's necessary download the solver from the GitHub repository of Politecnico di Torino. ```shell git clone https://github.com/mulmopro/wet-synthesis-route.git @@ -63,7 +46,7 @@ git clone https://github.com/mulmopro/wet-synthesis-route.git After downloading it, enter the right directory and compile it. NOTE: before start the compilation, make sure to put the correct path to the sundials libraries -in the *Allwmake* file in the *wet-synthesis-route/cfd_pbe_openfoam_solver/* fdirectory. +in the *Allwmake* file in the *wet-synthesis-route/cfd_pbe_openfoam_solver/* directory. ```shell cd wet-synthesis-route/cfd_pbe_openfoam_solver/ @@ -72,12 +55,29 @@ cd ../cfd_onlyEnv/ ./Allwmake ``` -To use the Compartment Wrapper, install the following package. +Instead, to use the Compartment Wrapper, install the following package. ```shell conda install mkl-service ``` +Once the requirements have been installed, clone the Wet Synthesis Wrappers +repository and install them. + +```shell +git clone https://github.com/simphony/simdome_wet_synthesis.git +pip install ./simdome_wet_synthesis +``` + +Then install the required ontology. + +```shell +pico install simdome_wet_synthesis/ontology.wet_synthesis.yml + +# If you have issues using pico directly, you can use +# python -m osp.core.pico install simdome_wet_synthesis/ontology.wet_synthesis.yml +``` + From ea4186145d442b8ff6cdff81e043a22eb16822ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Manuel=20Dom=C3=ADnguez?= <43052541+kysrpex@users.noreply.github.com> Date: Wed, 25 Jan 2023 15:47:49 +0100 Subject: [PATCH 08/11] Update README.md Instructions to install solver from Politecnico di Torino will be moved to the repository of the solver and mkl-service will be integrated in setup.py --- README.md | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index a061a0a..3e9ace4 100644 --- a/README.md +++ b/README.md @@ -34,33 +34,9 @@ The wet synthesis wrappers require a working installation of work), [7-zip](https://www.7-zip.org/), [Anaconda3](https://www.anaconda.com/) -([v4.8.2](https://repo.anaconda.com/archive/) is known to work). Follow the links to find +([v4.8.2](https://repo.anaconda.com/archive/) is known to work), and the [CFD-PBE solver from the GitHub repository of Politecnico di Torino](https://github.com/mulmopro/wet-synthesis-route). Follow the links to find installation instructions for each tool. -In addition, to use the CFD-PBE Wrapper, it's necessary download the solver from the GitHub repository of Politecnico di Torino. - -```shell -git clone https://github.com/mulmopro/wet-synthesis-route.git -``` - -After downloading it, enter the right directory and compile it. - -NOTE: before start the compilation, make sure to put the correct path to the sundials libraries -in the *Allwmake* file in the *wet-synthesis-route/cfd_pbe_openfoam_solver/* directory. - -```shell -cd wet-synthesis-route/cfd_pbe_openfoam_solver/ -./Allwmake -cd ../cfd_onlyEnv/ -./Allwmake -``` - -Instead, to use the Compartment Wrapper, install the following package. - -```shell -conda install mkl-service -``` - Once the requirements have been installed, clone the Wet Synthesis Wrappers repository and install them. @@ -112,4 +88,4 @@ been built. ## Documentation Visit [the documentation](https://simdomewetsynthesis.readthedocs.io) -to learn how to use the wrappers. \ No newline at end of file +to learn how to use the wrappers. From 60d17c6d0bb50788415b74a9407bd5d230a8be1e Mon Sep 17 00:00:00 2001 From: AndreaQuerio Date: Wed, 25 Jan 2023 16:27:22 +0100 Subject: [PATCH 09/11] Modify diagram --- docs/static/graph_pattern.drawio.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/static/graph_pattern.drawio.svg b/docs/static/graph_pattern.drawio.svg index 70d2e15..aa6814d 100644 --- a/docs/static/graph_pattern.drawio.svg +++ b/docs/static/graph_pattern.drawio.svg @@ -1,4 +1,4 @@ -
ns:Compartment
ns:Compartment
ns: <http://www.osp-core.com/wet_synthesis#>
ns: <http://www.osp-core.com/wet_synthesis#>
value
ns:type
value...
ns:Class
ns:Class
Ontology individual belonging to class <ns:Class>. 
Ontology individual belonging to class <ns:Cla...
ns:rel
ns:rel
Ontology relationship <ns:rel>. 
Ontology relationship <ns:rel>. 
ns:attr
ns:attr
Ontology attribute <ns:attr>. 
Ontology attribute <ns:attr>. 
xsd: <https://www.w3.org/2001/XMLSchema#>
xsd: <https://www.w3.org/2001/XMLSchema#>
Attribute value "value" with data type <ns:type>. 
Attribute value "value" with data type <ns:typ...
ns:WetSynthesisWrapper
ns:WetSynthesisWrapper
ns:SliderAccuracyLevel
ns:SliderAccuracyLevel
"0"
xsd:integer
"0"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
ns:Pressure
ns:Pressure
ns:Temperature
ns:Temperature
ns:value
ns:value
"101325"
ns:float
"101325"...
ns:unit
ns:unit
"Pa"
xsd:string
"Pa"...
ns:value
ns:value
"298.15"
xsd:float
"298.15"...
ns:unit
ns:unit
"K"
xsd:string
"K"...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:RotationalSpeed
ns:RotationalSpeed
ns:value
ns:value
"200"
xsd:float
"200"...
ns:unit
ns:unit
"rpm"
xsd:string
"rpm"...
ns:hasPart
ns:hasPa...
ns:Density
ns:Density
ns:unit
ns:unit
"kg/m^3"
xsd:string
"kg/m^3"...
ns:value
ns:value
"3953"
xsd:float
"3953"...
ns:MolecularWeight
ns:MolecularWeight
ns:value
ns:value
"92.338"
xsd:float
"92.338"...
ns:unit
ns:unit
"g/mol"
xsd:string
"g/mol"...
ns:ShapeFactor
ns:ShapeFactor
ns:value
ns:value
"0.523599"
xsd:float
"0.523599"...
ns:unit
ns:unit
ns:SolidParticle
ns:SolidParticle
ns:hasProperty
ns:hasPr...
ns:hasProperty
ns:hasPr...
ns:hasProperty
ns:hasPr...
ns:Feed
ns:Feed
ns:name
ns:name
"nh3"
xsd:string
"nh3"...
ns:hasPart
ns:hasPa...
ns:Component
ns:Component
ns:name
ns:name
"nh3"
xsd:string
"nh3"...
ns:MolarConcentration
ns:MolarConcentration
ns:hasPart
ns:hasPa...
ns:value
ns:value
"10"
xsd:float
"10"...
ns:unit
ns:unit
"mol/lit"
xsd:string
"mol/lit"...
ns:FlowRate
ns:FlowRate
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:value
ns:value
"0.30666132"
xsd:float
"0.30666132"...
ns:unit
ns:unit
"lit/hr"
xsd:string
"lit/hr"...
ns:SizeDistribution
ns:SizeDistribution
ns:hasPart
ns:hasPa...
""
xsd:string
""...
SliderAccuracyLevel should be
be between 0-10:
- 0-5: Compartment approach
- 6-10: Directly coupled CFD

However, at the moment the
accuracy level is ignored. The
kind of session used determines
the approach used (directly
coupled CFD or Compartment),
and for each approach there is
only one mesh available.
SliderAccuracyLevel should be...
Example value,
can be set
differently
Example value,...
Example value,
can be set
differently
Example value,...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Create an instance of Feed
per each reactor inlet stream.
(e.g.: solid inlet stream,
NH3 inlet stream)
Create an instance of Feed...
Example of a Feed instance
for a NH3 inlet stream
Example of a Feed instance...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Create a component instance
per each species in the feed
Create a component instance...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Simulation results added to 
SizeDistribution object
Simulation results added to...
ns:CompartmentNetwork
ns:CompartmentNetwork
ns:hasPart
ns:hasPa...
Simulation inputs (common to all use cases)
Simulation inputs (common to all use cases)
Simulation inputs (CFD-PBE Wrapper)
Simulation inputs (CFD-PBE Wrapper)
ns:Feed
ns:Feed
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
Simulation inputs (Compartment Wrapper)
Simulation inputs (Compartment Wrapper)
Simulation outputs (CFD-PBE Wrapper)
Simulation outputs (CFD-PBE Wrapper)
ns:Bin
ns:Bin
ns:ParticleDiameter
ns:ParticleDiameter
ns:value
ns:value
"10"
xsd:float
"10"...
ns:unit
ns:unit
"micrometer"
xsd:string
"micrometer"...
Example value,
can be different
Example value,...
ns:ParticleVolumePercentage
ns:ParticleVolumePercentage
ns:value
ns:value
"23"
xsd:float
"23"...
ns:unit
ns:unit
""
xsd:string
""...
Example value,
can be diferent
Example value,...
"0"
xsd:integer
"0"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
ns:Bin
ns:Bin
"n"
xsd:integer
"n"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
Simulation outputs (Compartment Wrapper)
Simulation outputs (Compartment Wrapper)
Simulation results added
to CompartmentNetwork
object
Simulation results added...
ns:Compartment
ns:Compartment
ns:Volume
ns:Volume
ns:value
ns:value
"0.5"
xsd:float
"0.5"...
ns:unit
ns:unit
"m3"
xsd:string
"m3"...
Example value,
can be different
Example value,...
ns:TurbulentDissipationRate
ns:TurbulentDissipationRate
ns:value
ns:value
"0.4"
xsd:float
"0.4"...
ns:unit
ns:unit
"m2/s3"
xsd:string
"m2/s3"...
Example value,
can be diferent
Example value,...
"0"
xsd:integer
"0"...
ns:ID
ns:ID
ns:hasPart
ns:hasPa...
"n"
xsd:integer
"n"...
ns:ID
ns:ID
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:OutletBoundaryFlux
ns:OutletBoundaryFlux
ns:value
ns:value
"0.4"
xsd:float
"0.4"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:name
ns:name
"outlet"
xsd:string
"outlet"...
ns:InletBoundaryFlux
ns:InletBoundaryFlux
ns:value
ns:value
"0.2"
xsd:float
"0.2"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:name
ns:name
"5"
xsd:string
"5"...
ns:OutgoingFlux
ns:OutgoingFlux
ns:value
ns:value
"0.8"
xsd:float
"0.8"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:ID
ns:ID
"5"
xsd:integer
"5"...
Example value,
can be diferent
Example value,...
Example value,
can be diferent
Example value,...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
Text is not SVG - cannot display
\ No newline at end of file +
ns:Compartment
ns:Compartment
ns: <http://www.osp-core.com/wet_synthesis#>
ns: <http://www.osp-core.com/wet_synthesis#>
value
ns:type
value...
ns:Class
ns:Class
Ontology individual belonging to class <ns:Class>. 
Ontology individual belonging to class <ns:Cla...
ns:rel
ns:rel
Ontology relationship <ns:rel>. 
Ontology relationship <ns:rel>. 
ns:attr
ns:attr
Ontology attribute <ns:attr>. 
Ontology attribute <ns:attr>. 
xsd: <https://www.w3.org/2001/XMLSchema#>
xsd: <https://www.w3.org/2001/XMLSchema#>
Attribute value "value" with data type <ns:type>. 
Attribute value "value" with data type <ns:typ...
ns:WetSynthesisWrapper
ns:WetSynthesisWrapper
ns:SliderAccuracyLevel
ns:SliderAccuracyLevel
"0"
xsd:integer
"0"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
ns:Pressure
ns:Pressure
ns:Temperature
ns:Temperature
ns:value
ns:value
"101325"
ns:float
"101325"...
ns:unit
ns:unit
"Pa"
xsd:string
"Pa"...
ns:value
ns:value
"298.15"
xsd:float
"298.15"...
ns:unit
ns:unit
"K"
xsd:string
"K"...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:RotationalSpeed
ns:RotationalSpeed
ns:value
ns:value
"200"
xsd:float
"200"...
ns:unit
ns:unit
"rpm"
xsd:string
"rpm"...
ns:hasPart
ns:hasPa...
ns:Density
ns:Density
ns:unit
ns:unit
"kg/m^3"
xsd:string
"kg/m^3"...
ns:value
ns:value
"3953"
xsd:float
"3953"...
ns:MolecularWeight
ns:MolecularWeight
ns:value
ns:value
"92.338"
xsd:float
"92.338"...
ns:unit
ns:unit
"g/mol"
xsd:string
"g/mol"...
ns:ShapeFactor
ns:ShapeFactor
ns:value
ns:value
"0.523599"
xsd:float
"0.523599"...
ns:unit
ns:unit
ns:SolidParticle
ns:SolidParticle
ns:hasProperty
ns:hasPr...
ns:hasProperty
ns:hasPr...
ns:hasProperty
ns:hasPr...
ns:Feed
ns:Feed
ns:name
ns:name
"nh3"
xsd:string
"nh3"...
ns:hasPart
ns:hasPa...
ns:Component
ns:Component
ns:name
ns:name
"nh3"
xsd:string
"nh3"...
ns:MolarConcentration
ns:MolarConcentration
ns:hasPart
ns:hasPa...
ns:value
ns:value
"10"
xsd:float
"10"...
ns:unit
ns:unit
"mol/lit"
xsd:string
"mol/lit"...
ns:FlowRate
ns:FlowRate
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:value
ns:value
"0.30666132"
xsd:float
"0.30666132"...
ns:unit
ns:unit
"lit/hr"
xsd:string
"lit/hr"...
ns:SizeDistribution
ns:SizeDistribution
ns:hasPart
ns:hasPa...
""
xsd:string
""...
SliderAccuracyLevel should be
be between 0-10:
- 0-5: Compartment approach
- 6-10: Directly coupled CFD

However, at the moment the
accuracy level is ignored. The
kind of session used determines
the approach used (directly
coupled CFD or Compartment),
and for each approach there is
only one mesh available.
SliderAccuracyLevel should be...
Example value,
can be set
differently
Example value,...
Example value,
can be set
differently
Example value,...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Create an instance of Feed
per each reactor inlet stream.
(e.g.: solid inlet stream,
NH3 inlet stream)
Create an instance of Feed...
Example of a Feed instance
for a NH3 inlet stream
Example of a Feed instance...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Create a component instance
per each species in the feed
Create a component instance...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Simulation results added to 
SizeDistribution object
Simulation results added to...
ns:CompartmentNetwork
ns:CompartmentNetwork
ns:hasPart
ns:hasPa...
Simulation inputs (common to all use cases)
Simulation inputs (common to all use cases)
Simulation inputs (CFD-PBE Wrapper)
Simulation inputs (CFD-PBE Wrapper)
ns:Feed
ns:Feed
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
Simulation inputs (Compartment Wrapper)
Simulation inputs (Compartment Wrapper)
Simulation outputs (CFD-PBE Wrapper)
Simulation outputs (CFD-PBE Wrapper)
ns:Bin
ns:Bin
ns:ParticleDiameter
ns:ParticleDiameter
ns:value
ns:value
"10"
xsd:float
"10"...
ns:unit
ns:unit
"micrometer"
xsd:string
"micrometer"...
Example value,
can be different
Example value,...
ns:ParticleVolumePercentage
ns:ParticleVolumePercentage
ns:value
ns:value
"23"
xsd:float
"23"...
ns:unit
ns:unit
""
xsd:string
""...
Example value,
can be diferent
Example value,...
"0"
xsd:integer
"0"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
ns:Bin
ns:Bin
"n"
xsd:integer
"n"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
Simulation outputs (Compartment Wrapper)
Simulation outputs (Compartment Wrapper)
Simulation results added
to CompartmentNetwork
object
Simulation results added...
ns:Compartment
ns:Compartment
ns:Volume
ns:Volume
ns:value
ns:value
"0.5"
xsd:float
"0.5"...
ns:unit
ns:unit
"m3"
xsd:string
"m3"...
Example value,
can be different
Example value,...
ns:TurbulentDissipationRate
ns:TurbulentDissipationRate
ns:value
ns:value
"0.4"
xsd:float
"0.4"...
ns:unit
ns:unit
"m2/s3"
xsd:string
"m2/s3"...
Example value,
can be diferent
Example value,...
"0"
xsd:integer
"0"...
ns:ID
ns:ID
ns:hasPart
ns:hasPa...
"n"
xsd:integer
"n"...
ns:ID
ns:ID
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:OutletBoundaryFlux
ns:OutletBoundaryFlux
ns:value
ns:value
"0.4"
xsd:float
"0.4"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:name
ns:name
"outlet"
xsd:string
"outlet"...
ns:InletBoundaryFlux
ns:InletBoundaryFlux
ns:value
ns:value
"0.2"
xsd:float
"0.2"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:name
ns:name
"5"
xsd:string
"5"...
ns:OutgoingFlux
ns:OutgoingFlux
ns:value
ns:value
"0.8"
xsd:float
"0.8"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:ID
ns:ID
"5"
xsd:integer
"5"...
Example value,
can be diferent
Example value,...
Example value,
can be diferent
Example value,...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:LiquidDensity
ns:LiquidDensity
ns:hasPart
ns:hasPa...
ns:value
ns:value
"998.2"
xsd:float
"998.2"...
ns:unit
ns:unit
"kg/m^3"
xsd:string
"kg/m^3"...
Example value,
can be set
differently
Example value,...
Text is not SVG - cannot display
\ No newline at end of file From 8e6ec7c5745dccbd77718f3b09bae20522017e19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Manuel=20Dom=C3=ADnguez?= Date: Wed, 25 Jan 2023 17:39:00 +0100 Subject: [PATCH 10/11] Minor change in graph pattern (do not cover arrows with text) --- docs/static/graph_pattern.drawio.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/static/graph_pattern.drawio.svg b/docs/static/graph_pattern.drawio.svg index aa6814d..57885fe 100644 --- a/docs/static/graph_pattern.drawio.svg +++ b/docs/static/graph_pattern.drawio.svg @@ -1,4 +1,4 @@ -
ns:Compartment
ns:Compartment
ns: <http://www.osp-core.com/wet_synthesis#>
ns: <http://www.osp-core.com/wet_synthesis#>
value
ns:type
value...
ns:Class
ns:Class
Ontology individual belonging to class <ns:Class>. 
Ontology individual belonging to class <ns:Cla...
ns:rel
ns:rel
Ontology relationship <ns:rel>. 
Ontology relationship <ns:rel>. 
ns:attr
ns:attr
Ontology attribute <ns:attr>. 
Ontology attribute <ns:attr>. 
xsd: <https://www.w3.org/2001/XMLSchema#>
xsd: <https://www.w3.org/2001/XMLSchema#>
Attribute value "value" with data type <ns:type>. 
Attribute value "value" with data type <ns:typ...
ns:WetSynthesisWrapper
ns:WetSynthesisWrapper
ns:SliderAccuracyLevel
ns:SliderAccuracyLevel
"0"
xsd:integer
"0"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
ns:Pressure
ns:Pressure
ns:Temperature
ns:Temperature
ns:value
ns:value
"101325"
ns:float
"101325"...
ns:unit
ns:unit
"Pa"
xsd:string
"Pa"...
ns:value
ns:value
"298.15"
xsd:float
"298.15"...
ns:unit
ns:unit
"K"
xsd:string
"K"...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:RotationalSpeed
ns:RotationalSpeed
ns:value
ns:value
"200"
xsd:float
"200"...
ns:unit
ns:unit
"rpm"
xsd:string
"rpm"...
ns:hasPart
ns:hasPa...
ns:Density
ns:Density
ns:unit
ns:unit
"kg/m^3"
xsd:string
"kg/m^3"...
ns:value
ns:value
"3953"
xsd:float
"3953"...
ns:MolecularWeight
ns:MolecularWeight
ns:value
ns:value
"92.338"
xsd:float
"92.338"...
ns:unit
ns:unit
"g/mol"
xsd:string
"g/mol"...
ns:ShapeFactor
ns:ShapeFactor
ns:value
ns:value
"0.523599"
xsd:float
"0.523599"...
ns:unit
ns:unit
ns:SolidParticle
ns:SolidParticle
ns:hasProperty
ns:hasPr...
ns:hasProperty
ns:hasPr...
ns:hasProperty
ns:hasPr...
ns:Feed
ns:Feed
ns:name
ns:name
"nh3"
xsd:string
"nh3"...
ns:hasPart
ns:hasPa...
ns:Component
ns:Component
ns:name
ns:name
"nh3"
xsd:string
"nh3"...
ns:MolarConcentration
ns:MolarConcentration
ns:hasPart
ns:hasPa...
ns:value
ns:value
"10"
xsd:float
"10"...
ns:unit
ns:unit
"mol/lit"
xsd:string
"mol/lit"...
ns:FlowRate
ns:FlowRate
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:value
ns:value
"0.30666132"
xsd:float
"0.30666132"...
ns:unit
ns:unit
"lit/hr"
xsd:string
"lit/hr"...
ns:SizeDistribution
ns:SizeDistribution
ns:hasPart
ns:hasPa...
""
xsd:string
""...
SliderAccuracyLevel should be
be between 0-10:
- 0-5: Compartment approach
- 6-10: Directly coupled CFD

However, at the moment the
accuracy level is ignored. The
kind of session used determines
the approach used (directly
coupled CFD or Compartment),
and for each approach there is
only one mesh available.
SliderAccuracyLevel should be...
Example value,
can be set
differently
Example value,...
Example value,
can be set
differently
Example value,...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Create an instance of Feed
per each reactor inlet stream.
(e.g.: solid inlet stream,
NH3 inlet stream)
Create an instance of Feed...
Example of a Feed instance
for a NH3 inlet stream
Example of a Feed instance...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Create a component instance
per each species in the feed
Create a component instance...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Simulation results added to 
SizeDistribution object
Simulation results added to...
ns:CompartmentNetwork
ns:CompartmentNetwork
ns:hasPart
ns:hasPa...
Simulation inputs (common to all use cases)
Simulation inputs (common to all use cases)
Simulation inputs (CFD-PBE Wrapper)
Simulation inputs (CFD-PBE Wrapper)
ns:Feed
ns:Feed
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
Simulation inputs (Compartment Wrapper)
Simulation inputs (Compartment Wrapper)
Simulation outputs (CFD-PBE Wrapper)
Simulation outputs (CFD-PBE Wrapper)
ns:Bin
ns:Bin
ns:ParticleDiameter
ns:ParticleDiameter
ns:value
ns:value
"10"
xsd:float
"10"...
ns:unit
ns:unit
"micrometer"
xsd:string
"micrometer"...
Example value,
can be different
Example value,...
ns:ParticleVolumePercentage
ns:ParticleVolumePercentage
ns:value
ns:value
"23"
xsd:float
"23"...
ns:unit
ns:unit
""
xsd:string
""...
Example value,
can be diferent
Example value,...
"0"
xsd:integer
"0"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
ns:Bin
ns:Bin
"n"
xsd:integer
"n"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
Simulation outputs (Compartment Wrapper)
Simulation outputs (Compartment Wrapper)
Simulation results added
to CompartmentNetwork
object
Simulation results added...
ns:Compartment
ns:Compartment
ns:Volume
ns:Volume
ns:value
ns:value
"0.5"
xsd:float
"0.5"...
ns:unit
ns:unit
"m3"
xsd:string
"m3"...
Example value,
can be different
Example value,...
ns:TurbulentDissipationRate
ns:TurbulentDissipationRate
ns:value
ns:value
"0.4"
xsd:float
"0.4"...
ns:unit
ns:unit
"m2/s3"
xsd:string
"m2/s3"...
Example value,
can be diferent
Example value,...
"0"
xsd:integer
"0"...
ns:ID
ns:ID
ns:hasPart
ns:hasPa...
"n"
xsd:integer
"n"...
ns:ID
ns:ID
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:OutletBoundaryFlux
ns:OutletBoundaryFlux
ns:value
ns:value
"0.4"
xsd:float
"0.4"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:name
ns:name
"outlet"
xsd:string
"outlet"...
ns:InletBoundaryFlux
ns:InletBoundaryFlux
ns:value
ns:value
"0.2"
xsd:float
"0.2"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:name
ns:name
"5"
xsd:string
"5"...
ns:OutgoingFlux
ns:OutgoingFlux
ns:value
ns:value
"0.8"
xsd:float
"0.8"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:ID
ns:ID
"5"
xsd:integer
"5"...
Example value,
can be diferent
Example value,...
Example value,
can be diferent
Example value,...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:LiquidDensity
ns:LiquidDensity
ns:hasPart
ns:hasPa...
ns:value
ns:value
"998.2"
xsd:float
"998.2"...
ns:unit
ns:unit
"kg/m^3"
xsd:string
"kg/m^3"...
Example value,
can be set
differently
Example value,...
Text is not SVG - cannot display
\ No newline at end of file +
ns:Compartment
ns:Compartment
ns: <http://www.osp-core.com/wet_synthesis#>
ns: <http://www.osp-core.com/wet_synthesis#>
value
ns:type
value...
ns:Class
ns:Class
Ontology individual belonging to class <ns:Class>. 
Ontology individual belonging to class <ns:Cla...
ns:rel
ns:rel
Ontology relationship <ns:rel>. 
Ontology relationship <ns:rel>. 
ns:attr
ns:attr
Ontology attribute <ns:attr>. 
Ontology attribute <ns:attr>. 
xsd: <https://www.w3.org/2001/XMLSchema#>
xsd: <https://www.w3.org/2001/XMLSchema#>
Attribute value "value" with data type <ns:type>. 
Attribute value "value" with data type <ns:typ...
ns:WetSynthesisWrapper
ns:WetSynthesisWrapper
ns:SliderAccuracyLevel
ns:SliderAccuracyLevel
"0"
xsd:integer
"0"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
ns:Pressure
ns:Pressure
ns:Temperature
ns:Temperature
ns:value
ns:value
"101325"
ns:float
"101325"...
ns:unit
ns:unit
"Pa"
xsd:string
"Pa"...
ns:value
ns:value
"298.15"
xsd:float
"298.15"...
ns:unit
ns:unit
"K"
xsd:string
"K"...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:RotationalSpeed
ns:RotationalSpeed
ns:value
ns:value
"200"
xsd:float
"200"...
ns:unit
ns:unit
"rpm"
xsd:string
"rpm"...
ns:hasPart
ns:hasPa...
ns:Density
ns:Density
ns:unit
ns:unit
"kg/m^3"
xsd:string
"kg/m^3"...
ns:value
ns:value
"3953"
xsd:float
"3953"...
ns:MolecularWeight
ns:MolecularWeight
ns:value
ns:value
"92.338"
xsd:float
"92.338"...
ns:unit
ns:unit
"g/mol"
xsd:string
"g/mol"...
ns:ShapeFactor
ns:ShapeFactor
ns:value
ns:value
"0.523599"
xsd:float
"0.523599"...
ns:unit
ns:unit
ns:SolidParticle
ns:SolidParticle
ns:hasProperty
ns:hasPr...
ns:hasProperty
ns:hasPr...
ns:hasProperty
ns:hasPr...
ns:Feed
ns:Feed
ns:name
ns:name
"nh3"
xsd:string
"nh3"...
ns:hasPart
ns:hasPa...
ns:Component
ns:Component
ns:name
ns:name
"nh3"
xsd:string
"nh3"...
ns:MolarConcentration
ns:MolarConcentration
ns:hasPart
ns:hasPa...
ns:value
ns:value
"10"
xsd:float
"10"...
ns:unit
ns:unit
"mol/lit"
xsd:string
"mol/lit"...
ns:FlowRate
ns:FlowRate
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:value
ns:value
"0.30666132"
xsd:float
"0.30666132"...
ns:unit
ns:unit
"lit/hr"
xsd:string
"lit/hr"...
ns:SizeDistribution
ns:SizeDistribution
ns:hasPart
ns:hasPa...
""
xsd:string
""...
SliderAccuracyLevel should be
be between 0-10:
- 0-5: Compartment approach
- 6-10: Directly coupled CFD

However, at the moment the
accuracy level is ignored. The
kind of session used determines
the approach used (directly
coupled CFD or Compartment),
and for each approach there is
only one mesh available.
SliderAccuracyLevel should be...
Example value,
can be set
differently
Example value,...
Example value,
can be set
differently
Example value,...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Create an instance of Feed
per each reactor inlet stream.
(e.g.: solid inlet stream,
NH3 inlet stream)
Create an instance of Feed...
Example of a Feed instance
for a NH3 inlet stream
Example of a Feed instance...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Create a component instance
per each species in the feed
Create a component instance...
Example value,
can be set differently
Example value,...
Example value,
can be set differently
Example value,...
Simulation results added to 
SizeDistribution object
Simulation results added to...
ns:CompartmentNetwork
ns:CompartmentNetwork
ns:hasPart
ns:hasPa...
Simulation inputs (common to all use cases)
Simulation inputs (common to all use cases)
Simulation inputs (CFD-PBE Wrapper)
Simulation inputs (CFD-PBE Wrapper)
ns:Feed
ns:Feed
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
Simulation inputs (Compartment Wrapper)
Simulation inputs (Compartment Wrapper)
Simulation outputs (CFD-PBE Wrapper)
Simulation outputs (CFD-PBE Wrapper)
ns:Bin
ns:Bin
ns:ParticleDiameter
ns:ParticleDiameter
ns:value
ns:value
"10"
xsd:float
"10"...
ns:unit
ns:unit
"micrometer"
xsd:string
"micrometer"...
Example value,
can be different
Example value,...
ns:ParticleVolumePercentage
ns:ParticleVolumePercentage
ns:value
ns:value
"23"
xsd:float
"23"...
ns:unit
ns:unit
""
xsd:string
""...
Example value,
can be diferent
Example value,...
"0"
xsd:integer
"0"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
ns:Bin
ns:Bin
"n"
xsd:integer
"n"...
ns:number
ns:number
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
Simulation outputs (Compartment Wrapper)
Simulation outputs (Compartment Wrapper)
Simulation results added
to CompartmentNetwork
object
Simulation results added...
ns:Compartment
ns:Compartment
ns:Volume
ns:Volume
ns:value
ns:value
"0.5"
xsd:float
"0.5"...
ns:unit
ns:unit
"m3"
xsd:string
"m3"...
Example value,
can be different
Example value,...
ns:TurbulentDissipationRate
ns:TurbulentDissipationRate
ns:value
ns:value
"0.4"
xsd:float
"0.4"...
ns:unit
ns:unit
"m2/s3"
xsd:string
"m2/s3"...
Example value,
can be diferent
Example value,...
"0"
xsd:integer
"0"...
ns:ID
ns:ID
ns:hasPart
ns:hasPa...
"n"
xsd:integer
"n"...
ns:ID
ns:ID
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
...
...
ns:hasPart
ns:hasPa...
ns:OutletBoundaryFlux
ns:OutletBoundaryFlux
ns:value
ns:value
"0.4"
xsd:float
"0.4"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:name
ns:name
"outlet"
xsd:string
"outlet"...
ns:InletBoundaryFlux
ns:InletBoundaryFlux
ns:value
ns:value
"0.2"
xsd:float
"0.2"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:name
ns:name
"5"
xsd:string
"5"...
ns:OutgoingFlux
ns:OutgoingFlux
ns:value
ns:value
"0.8"
xsd:float
"0.8"...
ns:unit
ns:unit
"m3/s"
xsd:string
"m3/s"...
Example value,
can be diferent
Example value,...
ns:ID
ns:ID
"5"
xsd:integer
"5"...
Example value,
can be diferent
Example value,...
Example value,
can be diferent
Example value,...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:hasPart
ns:hasPa...
ns:LiquidDensity
ns:LiquidDensity
ns:hasPart
ns:hasPa...
ns:value
ns:value
"998.2"
xsd:float
"998.2"...
ns:unit
ns:unit
"kg/m^3"
xsd:string
"kg/m^3"...
Example value,
can be set
differently
Example value,...
Text is not SVG - cannot display
\ No newline at end of file From 44a4e72e793025ee73262bc5d1bf3e52a0903e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Manuel=20Dom=C3=ADnguez?= Date: Wed, 25 Jan 2023 17:51:25 +0100 Subject: [PATCH 11/11] Undo controlDict and installation changes as they will be merged in PRs #8 and #9 instead --- Dockerfile | 33 ++++++----------- docker_install.sh | 37 +++++++++++++++++++ .../precNMC_foamTemplate/system/controlDict | 11 ------ packageinfo.py | 2 +- setup.py | 7 +--- 5 files changed, 52 insertions(+), 38 deletions(-) create mode 100644 docker_install.sh diff --git a/Dockerfile b/Dockerfile index c01fa46..e84581a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,12 @@ -FROM ubuntu:20.04 +ARG OSP_CORE_IMAGE=simphony/osp-core:latest +FROM $OSP_CORE_IMAGE LABEL maintainer="mohsen.shiea@polito.it" LABEL dockerfile.version="1.1" -ENV DEBIAN_FRONTEND=noninteractive - # Install requirements RUN apt-get update && apt-get -y upgrade && apt-get install -y \ - git graphviz wget build-essential g++ gfortran libgfortran5 openmpi-bin \ - libopenmpi-dev make libssl-dev libblas-dev liblapack-dev \ - apt-transport-https software-properties-common openssh-client \ - bash-completion bash-builtins libnss-wrapper vim nano tree curl unzip \ - python3-pip - -RUN wget -c https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh && \ - /bin/bash Anaconda3-2020.02-Linux-x86_64.sh -bfp /usr/local && \ - conda update conda && conda create --name wet-synthesis - -RUN conda install mkl-service + git graphviz wget build-essential g++ gfortran libgfortran5 openmpi-bin libopenmpi-dev make libssl-dev libblas-dev liblapack-dev \ + apt-transport-https software-properties-common openssh-client bash-completion bash-builtins libnss-wrapper vim nano tree curl unzip RUN cd / && mkdir cmake && cd cmake && \ CMAKE_VERSION=3.20.1 && \ @@ -39,9 +29,10 @@ RUN cd / && mkdir sundials && cd sundials && \ make install && \ cd .. && rm -r builddir cvode-${CVODE_VERSION} cvode-${CVODE_VERSION}.tar.gz -RUN wget -O - http://dl.openfoam.org/gpg.key | apt-key add - && add-apt-repository http://dl.openfoam.org/ubuntu && \ +RUN cd /usr/bin && rm python3 && ln -s python3.6 python3 && \ + wget -O - http://dl.openfoam.org/gpg.key | apt-key add - && add-apt-repository http://dl.openfoam.org/ubuntu && \ apt-get update && apt-get install -y --no-install-recommends openfoam8 && \ - rm -rf /var/lib/apt/lists/* + cd /usr/bin && rm python3 && ln -s python3.7 python3 && rm -rf /var/lib/apt/lists/* ENV user=simdomeuser HOME=/home/simdomeuser @@ -61,10 +52,10 @@ RUN mkdir -p $HOME/simdome/wrappers/simdome_wet_synthesis && \ COPY --chown=$user . $HOME/simdome/wrappers/simdome_wet_synthesis WORKDIR $HOME/simdome/wrappers/simdome_wet_synthesis -ENV PATH=$HOME/.local/bin:$PATH +ENV PATH=$PATH:$HOME/.local/bin -RUN pip install matplotlib scipy numpy sklearn mpi4py -RUN pip install . -RUN pico install ontology.wet_synthesis.yml +RUN pip install matplotlib scipy \ + && pico install ontology.wet_synthesis.yml \ + && python setup.py install --user -CMD ["/bin/bash", "-c", "source /opt/openfoam8/etc/bashrc && /bin/bash && source activate wet-synthesis" ] +CMD ["/bin/bash", "-c", "source /opt/openfoam8/etc/bashrc && /bin/bash" ] diff --git a/docker_install.sh b/docker_install.sh new file mode 100644 index 0000000..19920a8 --- /dev/null +++ b/docker_install.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# +# Description: This script creates a docker image that includes the osp-core +# and the wet synthesis wrappers +# +# Run Information: This script should be run manually. + + +# Extract osp-version +osp_tag="v" +osp_tag+="$(python3 -c 'import packageinfo; print(packageinfo.OSP_CORE_MIN)')" +# osp_tag+="-beta" + +rm -rf temp_osp-core | true +# Download osp-core to temporary folder +git clone https://github.com/simphony/osp-core.git temp_osp-core + +cd temp_osp-core +git checkout ${osp_tag} +docker build -t simphony/osp-core:${osp_tag} . + +ERROR_CODE=$? +if [ $ERROR_CODE -ne 0 ]; then + echo -e "\nError:" + echo -e "osp-core image creation failed.\n" >&2 + + cd .. + rm -rf temp_osp-core | true + + exit $ERROR_CODE +fi + +cd .. +rm -rf temp_osp-core | true + +# Build docker image +docker build -t simdome/wet_synthesis --build-arg OSP_CORE_IMAGE=simphony/osp-core:${osp_tag} . diff --git a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/controlDict b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/controlDict index 1c9f63b..e86573b 100644 --- a/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/controlDict +++ b/osp/wrappers/wet_synthesis_wrappers/cases/precNMC/precNMC_foamTemplate/system/controlDict @@ -103,17 +103,6 @@ functions ); } - fvSolutionUpdate - { - type timeActivatedFileUpdate; - libs ("libutilityFunctionObjects.so"); - fileToUpdate "$FOAM_CASE/system/fvSolution"; - timeVsFile - ( - (-1 "$FOAM_CASE/system/updatingFiles/fvSolution.0") // 1e-6 - ($t2 "$FOAM_CASE/system/updatingFiles/fvSolution.1") // 5e-6 - ); - } schemeChange { diff --git a/packageinfo.py b/packageinfo.py index a7d3a3f..9555d24 100644 --- a/packageinfo.py +++ b/packageinfo.py @@ -1,4 +1,4 @@ NAME = "simdome_wet_synthesis" VERSION = "1.1.0" OSP_CORE_MIN = "3.7.0" -OSP_CORE_MAX = "4.0.0" +OSP_CORE_MAX = "3.7.1" diff --git a/setup.py b/setup.py index 400067e..50b8d53 100644 --- a/setup.py +++ b/setup.py @@ -11,11 +11,9 @@ name=NAME, version=VERSION, author='MuSyChEn research group at Politecnico di Torino', - description='A collection of wrappers for wet-phase synthesis of Ni-Mn-Co ' - 'hydroxide', + description='A collection of wrappers for wet-phase synthesis of Ni-Mn-Co hydroxide', keywords='SimDOME, CUDS, Precipitation, NMC hydroxide', long_description=README_TEXT, - packages=find_packages(exclude=("examples", "tests")), install_requires=[ 'osp-core>=' + OSP_CORE_MIN + ', <' + OSP_CORE_MAX, "graphviz", @@ -26,9 +24,8 @@ "mpi4py", "matplotlib", "mkl-service", - ], + ], packages=find_packages(exclude=("examples")), - python_requires=">=3.7", include_package_data=True, # entry_points={ # 'wrappers':