From fff2c051b3d6c4bf441f694e7a3f0c5ed5ae2c23 Mon Sep 17 00:00:00 2001 From: Florencia Caro <154555752+florenciacaromartinez@users.noreply.github.com> Date: Fri, 16 Feb 2024 20:17:13 -0300 Subject: [PATCH] Add files via upload Bio2Py test notebook and BioWin file for test --- Bio2Py Test/Bio2Py Test.ipynb | 474 +++++++++++++++++++++++++ Bio2Py Test/Bio2Py test BioWin 6.2.bwc | Bin 0 -> 59903 bytes 2 files changed, 474 insertions(+) create mode 100644 Bio2Py Test/Bio2Py Test.ipynb create mode 100644 Bio2Py Test/Bio2Py test BioWin 6.2.bwc diff --git a/Bio2Py Test/Bio2Py Test.ipynb b/Bio2Py Test/Bio2Py Test.ipynb new file mode 100644 index 0000000..b835265 --- /dev/null +++ b/Bio2Py Test/Bio2Py Test.ipynb @@ -0,0 +1,474 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bio2Py test" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import Bio2Py\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**1. Loading influent data**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1.1 Constant influent" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "#Multiple scenarios\n", + "column_names_c = ['Flow','COD (mg-COD/L)','TKN (mg-N/L)','TP (mg-P/L)','TS (mg-S/L)','Nitrate (mg-N/L)','pH','Alkalinity (mmol/L)','ISS total (mg-ISS/L)','Metal soluble - Ca (mg/L)','Metal soluble - Mg (mg/L)', 'Gas - Dissolved O2 (mg/L)']\n", + "inf_c = [[600,500,30,6.5,10,0,7.3,6,45,80,15,0],[700,400,30,5.3,10.2,0,7.2,6,45,80,15,0]]\n", + "inf_c= pd.DataFrame(inf_c, columns=column_names_c)\n", + "inf_c.head()\n", + "\n", + "#Single scenario\n", + "inf_c1 = [[500,500,30,6.5,10,0,7.3,6,45,80,15,0]]\n", + "inf_c1=pd.DataFrame(inf_c1, columns=column_names_c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1.2 Variable influent" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "column_names_v = ['Time','Flow','COD (mg-COD/L)','TKN (mg-N/L)','TP (mg-P/L)','TS (mg-S/L)','Nitrate (mg-N/L)','pH','Alkalinity (mmol/L)','ISS total (mg-ISS/L)','Metal soluble - Ca (mg/L)','Metal soluble - Mg (mg/L)', 'Gas - Dissolved O2 (mg/L)']\n", + "\n", + "inf_v0 = [[0,900,500,30,7.2,10,0,7,6,45,80,15,0],[4,1000,400,30,7,10,0,7,6,45,80,15,0],[6,1040,600,30,7,10,0,7,6,45,80,15,0],[10,1200,800,40,7,10,0,7,6,45,80,15,0]]\n", + "inf_v1 = [[0,800,500,30,7.6,10,0,7,6,45,80,15,0],[1,1020,500,30,7,10,0,7,6,45,80,15,0],[3,1100,500,30,7,11,0,7,6,45,80,15,0],[9,1088,500,40,7,10,0,7,6,45,80,15,0]]\n", + "inf_v0= pd.DataFrame(inf_v0, columns=column_names_v)\n", + "inf_v1= pd.DataFrame(inf_v1, columns=column_names_v)\n", + "inf_v= {'inf_v0': inf_v0, 'inf_v1': inf_v1} #each dicctionary key corresponds to a variable influent scenario" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**2. Getting ready**\n", + "\n", + "Bio2Py automatices the process of loading influent data, changing parameters and running simulations in BioWin. It is necessary to set the system configuration layout, project options, unit system, report options, etc before using Bio2Py. \n", + "\n", + "In order to use Bio2Py, **BioWin simulation window must be fully visible**, placing BioWin window on the left side of the screen is recomended. \n", + "\n", + "**Before using Bio2Py**:\n", + "- Open BioWin simulation file.\n", + "- Set the zoom to 100% on BioWin window.\n", + "- Manually run a single flow balance and steady state/dynamic simulation. Check for any warning messages that could interrupt Bio2Py process. If necessary, the user may consider disabling BioWin alarms to prevent Bio2Py interruption. \n", + "- Choose locations (if applicable): \n", + " - For saving BioWin generated reports with simulation results (File -> Report to Excel (TM) -> Choose directory).\n", + " - From where variable influent data will be loaded (Influent icon -> Open file -> Choose directory)(***). Only necessary if running simulations with variable influent. Choose the same filepath arg .\n", + "- Place BioWin simulation window on the left side of the screen. \n", + "- Make sure influent icon is visible. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "filepath=r\"C:\\Users\\Usuario\\OneDrive - Facultad de Ingeniería\\Maestría\\Biowin - python\\bio2py test\\Bio2Py Test\" #replace with chosen filepath (***)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "simulation_window,influent_window=Bio2Py.setting_the_environment() \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**3. Steady state simulations**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3.1 Steady state simulation with constant influent" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "17:49:12.402: Flow balance\n", + "17:49:25.351: Steady State\n", + "17:50:01.048: Flow balance\n", + "17:50:13.688: Steady State\n" + ] + } + ], + "source": [ + "Bio2Py.steady_state_simulations('constant',inf_c,'seed','current',600,'table',filepath)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ElementsBOD - Total Carbonaceous [mg/L]COD - Total [mg/L]N - Total Kjeldahl Nitrogen [mgN/L]N - Total N [mgN/L]P - Soluble PO4-P [mgP/L]P - Total P [mgP/L]pH []Total suspended solids [mg/L]
0Influent245.21500.0030.0030.003.256.507.30242.71
1Effluent2.6835.661.8816.383.763.916.948.82
2Sludge359.592264.44125.05139.553.7642.696.942261.12
\n", + "
" + ], + "text/plain": [ + " Elements BOD - Total Carbonaceous [mg/L] COD - Total [mg/L] \\\n", + "0 Influent 245.21 500.00 \n", + "1 Effluent 2.68 35.66 \n", + "2 Sludge 359.59 2264.44 \n", + "\n", + " N - Total Kjeldahl Nitrogen [mgN/L] N - Total N [mgN/L] \\\n", + "0 30.00 30.00 \n", + "1 1.88 16.38 \n", + "2 125.05 139.55 \n", + "\n", + " P - Soluble PO4-P [mgP/L] P - Total P [mgP/L] pH [] \\\n", + "0 3.25 6.50 7.30 \n", + "1 3.76 3.91 6.94 \n", + "2 3.76 42.69 6.94 \n", + "\n", + " Total suspended solids [mg/L] \n", + "0 242.71 \n", + "1 8.82 \n", + "2 2261.12 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Load results for steady state simulation, constant influent, scenario 0 (corresponds to influent=[600,500,30,6.5,10,0,7.3,6,45,80,15,0])\n", + "steady_state_c_0=pd.read_csv('steady_state_c_0.csv')\n", + "steady_state_c_0.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ElementsBOD - Total Carbonaceous [mg/L]COD - Total [mg/L]N - Total Kjeldahl Nitrogen [mgN/L]N - Total N [mgN/L]P - Soluble PO4-P [mgP/L]P - Total P [mgP/L]pH []Total suspended solids [mg/L]
0Influent196.16400.0030.0030.002.655.307.20203.17
1Effluent2.4628.971.8218.963.073.196.927.57
2Sludge356.712144.61119.25136.393.0740.156.922286.49
\n", + "
" + ], + "text/plain": [ + " Elements BOD - Total Carbonaceous [mg/L] COD - Total [mg/L] \\\n", + "0 Influent 196.16 400.00 \n", + "1 Effluent 2.46 28.97 \n", + "2 Sludge 356.71 2144.61 \n", + "\n", + " N - Total Kjeldahl Nitrogen [mgN/L] N - Total N [mgN/L] \\\n", + "0 30.00 30.00 \n", + "1 1.82 18.96 \n", + "2 119.25 136.39 \n", + "\n", + " P - Soluble PO4-P [mgP/L] P - Total P [mgP/L] pH [] \\\n", + "0 2.65 5.30 7.20 \n", + "1 3.07 3.19 6.92 \n", + "2 3.07 40.15 6.92 \n", + "\n", + " Total suspended solids [mg/L] \n", + "0 203.17 \n", + "1 7.57 \n", + "2 2286.49 " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Load results for steady state simulation, constant influent, scenario 1 (corresponds to influent=[700,400,30,5.3,10.2,0,7.2,6,45,80,15,0])\n", + "steady_state_c_1=pd.read_csv('steady_state_c_1.csv')\n", + "steady_state_c_1.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3.2 Steady state simulation with variable influent" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "18:06:29.340: Flow balance\n", + "18:06:42.248: Steady State\n", + "18:07:12.071: Flow balance\n", + "18:07:25.169: Steady State\n" + ] + } + ], + "source": [ + "Bio2Py.steady_state_simulations('variable',inf_v,'seed','last',200,'none',filepath)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**4. Dynamic simualtions**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "4.1 Dynamic simulation with constant influent" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "18:08:16.335: Dynamic simulation\n", + "18:08:59.196: Dynamic simulation\n" + ] + } + ], + "source": [ + "Bio2Py.dynamic_simulations('constant',inf_c,'last',10,120)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "4.2 Dynamic simulation with constant influent" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "18:09:57.250: Dynamic simulation\n", + "18:10:46.904: Dynamic simulation\n" + ] + } + ], + "source": [ + "Bio2Py.dynamic_simulations('variable',inf_v,'last',5,120,filepath)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "data2", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Bio2Py Test/Bio2Py test BioWin 6.2.bwc b/Bio2Py Test/Bio2Py test BioWin 6.2.bwc new file mode 100644 index 0000000000000000000000000000000000000000..4fa8abbe41386fa539a607790fc0eb981359429a GIT binary patch literal 59903 zcmeHw34Bw<_Wy0tq)B%Wfv4|jRZx5iltsmrrY&s{+Qz0p;Z;l8-nNl6$xBiwDq29W zC<=-Su2gYB-0F_vQg>8PaINBk-~ujeifjV^@0q!4mZtLe`F_9upZJl^J#+4vGiSE5 z%*-uw6l9w%eVy)xd{@Y2PU-6i_%1H=_^MnUgTYX2H7AV>xxHdwsyU@hZ19T#SEw-{ zT1|rTlatK{hZ_>Q6WCy|7!s1YmyIoRxZDBh{gENDAwk9klALTc<|t`BSS|X83g(-!Q9hXT9!4UDI|Jp#F{LZ7!X|{x6g|# z1O1;YB&cGgW;ke3gq)D0NgDoUG16$FoaNx?vZ++szqaI7ov5X0dfnryKXf_q( z*-A?+G^Y7;Udb4z&Fb*Dyde!BjSx!3TJ$JywP;SIN3lAT6%cC&B-6a$3}M&@4GAfE zE-$8vMi02KT1y+f#f=SBV!$9IkMM{MqBj(@m0D5@Fk$4oYiskx+Mv}6e1{lt`)Xu~ zwkAkyPw@E~WFVR}gNn`bHF`sVsd>H{(QKG7K@jwU>0T!BHo`kukxfmgve53W@i^U= zhz4UCJ=y{R-xT(ok*+-3ymcN3FZ;GhFJGTL`@rySl;d#wMTh7ekmvLG0!ij-Pp+p? z)a8tG*M#Z~1}m`L&d^kkXh@_ooTA4O;%}L%J*8qz27oqCNDO!(odRd6g#cx)x&og! zt%O0(z$%5ngVs#`3Ox|%#z2y_+A}17w7af8q(P2&dyLl| z3R;fD+XcQrwFsJl5QuU-B3j__O$pYEVyFm`O-dGP8!C%^fd-eShc=V&8A3O))(Z?g zI($J}m2a|0tQR<`F1*f3Bq>+*Bo)qNlVYw7=K4G}0*Q#@6BV<`7I3>fDv-5JYBEFO z1TEE`ac*yoZwd!8sT=*hQW%O|BncSTBvEFO+pBgROiufTGpMUcg$e=&xCOXQughO< zNS2f14aw=HXr2-O9^ecG++K`WvoU)>w$Kgzs+x&Q&9D+o3<@p*K zeBM!*U_ znzU}c|BX>+%t1}ewo$=i`%o-QOc5hJOx9?Sn_(--t<0V35BO>tt3%Fla^A{Bv@-vp zM02JNjTI)5gRZ2(OC!8|5zED>V19{7SQD<=5iwS#gk&!+8Eg_-3Xd*)==J-5*3mNB zav}QOj}(4=NsmYLqEAAWt;yz%A#*FZnB?Z9B{g!FmNfLF;*wlNeil4P64c13jg@;9 z_@#WvkQj|x9~1IpvT9|SoiIz(C%KF5LzHf&D#EO>Q*Br(R!^lU{0QbWJIzd*o^IFITR#<-S}TiH+34|%_S|}tu>6==KVGo>PRdf{VnUXUMj|tHw&;5;%S4}TUwqWS zFZ#^ZXIgpHAQHJLSJBW?Nn3gC7y=hjSOu-Df(2qg)q3?aW0HN8G$?W|`Szn5U;6la zy|gp9v>kcs$ly#lFxT=aa1O~-<;et|C{t-NP11}^x0<<4KcQIdBWN0T5rWi-^;2{b zFM6y@v0X2XM3k)LZ8Pdx8hLIxuX#nXF3%#Bi~Oj?T6nP~$d6fL%8XfKH8Vzy38Ay1 z?Rg4yefK6|Q>JDyQn)b7@+1Vsa#jeT`={FZdS=gKE1JXs^+AOQ)|DdB=TTapJ+T4D zx-?t;@1tf=7Z?5ljXFY+DCtK_W>MEhm6^(>fhDm|-9hbX$vl_OH85wVd_<8Ls&{#Pbx?6sRxL%0 z(@L8%IQ6{B`Izf8T9aC)xky(P=KfOUpH8{MUt;*Qi~_S)%JQ?fR0ErEF)TM`?T#lG+f7&XQ3~#oL|z1OU0%a98k%xd4y@onwmq6Qp9q)f?Rpl?grIOJ zwCmSt_PUP2d-M!)1kNAt9;@{;3!_i$*~vyI{5q07zMSj&kIFxZh$BEmnu%P+paQV$ zDyF7>Oc8&iQz;T|o)f0w^4FPwqgH?f4Ejn7g_&Kfc&eYqu2z^s_xIaJdh6X)Zt~(L zn5}q(3O8!BPj2w$gd7EGcgxULLykEaxHOlAAuC`#Hc^JjsX=a&C=*o0T_jParB;JX zY!GDzRssiU(qu3I0DFaXq{T94oAwsS&>Jm^-n}D_k4JH(3_Bwzn=6s2!JsKu} zI!wWAwK*NmDeh2peS$f|IS#xBd^UHW#9LBZt4#mD4>zYd$2n{zYL2qlVA2{#{)KAC6z4e1Imj99n<6*9M2*8Gu2tT^ zHSy-I*5~XSZtli&ic5yTFw*DlW&GK^O)%x8932m^Z7WB+8{E)nB={~aA5zG|a(2T| zLrK*#n2UfK4q|hR@rUFLMGIybg#n+Op#+7f`gtXTWwVcX(*-;5cEJP@cB16og767I3QJK{X8D;?3AgXjJJ@-M(CsGfWY+;)8KcnXy>1JV=(AF|GVpdVHta(Kc3um0m>bgV>azK?@w!BsL^3s~y6La8hp?)n3%L4Drc(>?5#71qz zWB?1u6)-}p;F!suRG_%0lqUEMs~_cDQl%4<1k*{%On4+bsr4XD2CAN{kqm}4hL^%1 z(h`FXZsp^pBmg7I<1l@B1Pd#VKw;%^2Z~%G_mxOx+MoVq|A$SRQDzz&*$j+vXA(A% zM*8FR0w#5q6V8tU)p2CuxO$!>U>H}a+yfx9WwuK!ZCZ2ux;>XK!*pY^kFU3(bEu<< zAdWy7#8z!rIuNF>WczsgU^`+gcEzWHPGionk9P#fVPOklhSKL{s(JE@igV7KWFL=_ zO?-sIh!f=pZo@^yAUg3R+QXVFi2#_*;Fk2Th%mK2hhdB}NnHFqW_Y})6CZ4F$cD|H zCLxCfb+3lRPV;BFgvQ>=XfDiE`e-h zx%$m`MYj1X3mV8h%zxwyOSRV)yF=J)A!069nhx{0l;PHA?1RfWop%jKp4>Ssyj0c0 zLnWrzAvjiFjbn$^$>vqSk`Pc_ik(cFBA-W8$*ec$Q2UYyR6h$yCo7~?2MQ=#0hW=a zP6@)v3SouDHqe!LR(&*jo;9u+Ezbmw#TG|?ajZPjanWdm@ zrmm);fEgfN_2-1QZi?J8l`4m5dwNA_oUknE6*z}ty%L^Ed4Ob&%?{RWFok^4$2|R}C1@=R z2azjFvPJ<+auoQXcMOtEq%A58lbJOCph-=R@s9djncPNTnH=HuHaiN$V4ZHwVn{kU z03!Oal1sytk*3#_{)4#(g#4u<2K#�h@u+5*=aFQKDnKAB0=k&Y5itqo~fIOeu^m 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 literal 0 HcmV?d00001