From 4b2df284f45da04ce87fd54d2188b02902b5752f Mon Sep 17 00:00:00 2001 From: Daniel Sollien <62246179+daniel-sol@users.noreply.github.com> Date: Tue, 20 Feb 2024 14:35:50 +0100 Subject: [PATCH] Readthedocs (#37) * Update primary info * Build docs only from main --- .github/workflows/build_docs.yaml | 32 +++ .gitignore | 2 + .readthedocs.yml | 16 ++ docs/_static/equinor-logo.png | Bin 0 -> 8688 bytes docs/_static/equinor-logo2.jpg | Bin 0 -> 19937 bytes docs/_static/equinor_logo.jpg | Bin 0 -> 25380 bytes docs/_static/equinor_logo_only.jpg | Bin 0 -> 8060 bytes docs/_templates/layout.html | 17 ++ docs/api.rst | 8 + docs/conf.py | 57 ++++++ docs/index.rst | 17 ++ docs/sim2sumo.rst | 301 +++++++++++++++++++++++------ pyproject.toml | 8 + src/fmu/sumo/sim2sumo/__init__.py | 4 +- src/fmu/sumo/sim2sumo/sim2sumo.py | 41 ++-- 15 files changed, 424 insertions(+), 79 deletions(-) create mode 100644 .github/workflows/build_docs.yaml create mode 100644 .readthedocs.yml create mode 100644 docs/_static/equinor-logo.png create mode 100644 docs/_static/equinor-logo2.jpg create mode 100644 docs/_static/equinor_logo.jpg create mode 100644 docs/_static/equinor_logo_only.jpg create mode 100644 docs/_templates/layout.html create mode 100644 docs/api.rst create mode 100644 docs/conf.py create mode 100644 docs/index.rst diff --git a/.github/workflows/build_docs.yaml b/.github/workflows/build_docs.yaml new file mode 100644 index 00000000..fbc34220 --- /dev/null +++ b/.github/workflows/build_docs.yaml @@ -0,0 +1,32 @@ +# build and test some end points +name: Build and deploy docs for fmu-sumo + +on: + pull_request: + branches: [main] + push: + branches: [main] + +jobs: + build_pywheels: + name: Build docs with Python ${{ matrix.python-version }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: ["3.10"] + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v1 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install and build docs + run: | + pip install pip -U && pip install wheel -U + pip install .[docs] + pip list + sphinx-build docs build/sphinx/html diff --git a/.gitignore b/.gitignore index 28384cb6..fbe3bdfa 100644 --- a/.gitignore +++ b/.gitignore @@ -71,6 +71,8 @@ instance/ # Sphinx documentation docs/_build/ +docs/Make* +docs/make* # PyBuilder .pybuilder/ diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 00000000..83aaa81c --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,16 @@ +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3.10" + +python: + install: + - method: pip + path: . + extra_requirements: + - docs + +sphinx: + configuration: docs/conf.py diff --git a/docs/_static/equinor-logo.png b/docs/_static/equinor-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..993f7d724d3b1eb38167b91fad6d26854a47850c GIT binary patch literal 8688 zcmbVy2{@E(+y69VUsIHIP}Z2mK3PU&NtRHNrKT}yvW#X%b~OnVp{ym05RzoczElb! z24!E8WboJrS^MtM@;>kX|GwY%e%~C2d+z%@f9HN)*ERQfxNT)&%*`Rp0Rn-zO-&4~ zL7-i9;J$&41-Kp*AS3}_>|Q4JL=Z?>n(?>GH%sp-2*k>Sv$Z4HnV&#n@E*!&7yJdR zvag31fChoI^?be17&j~laslg#^VE@=tE!WN;9PX1&ZwEg%)Jb-mvAQj1gwp}g)PS4 z4Ws2ErKbzg_C*2;Jg_7*#Mi^!lZf=yk=oIV1nwDRs1#%eLUPlQ(q|Zi*qK{F4DbXj zL`_*;2?JM!K{T|K;p#9|HTYo&0tVNB!qlKJbtM=a3DZO(;E-P*DZm=RtC|pZR3kpL(5eOv!p+xlaB%ytkJc-i3H5g)v7y{0V zgu{D67#h(R@ZKaHDZta8A$WNGQR_+kl_nrzP+znc6s`O$~LVfLN7rI2WXvrn;6EOckbt)x3aFQq@vbRnk;dQ&WPgV%4zf=!;l& z#2JjR>RUBBgB0C|MEDq7P8p{9hzqBWIN(eR5(npiAMNy`PUcJYE5S`G0lU4VT{ z0uET+X!rlS9!57X)BsMP8B0h<3UF?RXvb(QckiD>71+)P3TJ%%0@(jgfPe5$dE$Wl zBcvdVj{2E$8(@C|QVUqyp;_U4vF>(;I3OFu9XAkg*l+v}&;D;bI7~~0vHW*d6w(Ao z1iI4i*M?$)z4GhM9S7N2L`XE|XAl@h|6*OFevxtiqImyV@_(xJxr7DM_20DgPZ$w@ zk>rCWVD(*r9RFwQ2Kw(JAfm7S_x}H9&G-NN|1a0s|H6OGe_r=LB{7%Ko~~Hn%z;WV zB7!n@=bz<){=b#m;r(qV{|yI@2gdE6a|w9(bFyJQ0o4TH+&bDN9svRg$C?`I+xqs; z4Eb%I!3;MpNZiYOSS43-{td)U>b+ne;&w7DLD;eTYDggzD`Br- zmTsMJ@}`u%wPY6YT+i6Xn(q2g-Nwd7Pyw;c`#CXXDQIgUuvLfn13BT?Q&Bq+l;D=j z@z6UT3<5o%+8ub(dL}_`POfq4heSLR2&GOxC8(g!K9mCifi|zkAYLXwpbrg>?E-zy zR*J7`VfO2Yw%rc`1?LuUojffZR#6&xhY9pbLROw=0PyxG@Pe+>y{(;Z@qJ}Rfmifbo`Ga!&M9xLa(7=~`h#B*C2IU&~2Q*RWq2Bj4a zGm_C%Xnfi6uZi8EpWZAw&nhaYGV<1x{>|Hw{v-ddlr93^`86XT6wk}krxPl^N5|H+ z*i^L3QgNH07};b6JrU+t(andN`?cg(mzj}wB|r*rYJ{#;)O-DkZ~>ZXFev9M3fh@> z*SpE9BAlN=fKYp=dC?vw6re2E-B~M3HRYZe8SOlAvHEw=DKC%*$cz*rL}|x(6$b=p zj5r3!&Y9t1YLZmIKU67`(}wk=*)I+L9kyADI}$}=v}3CZ9_%C_Q86>9p5T*Va?^Wu z`x3(|)@%T5y31M$&# zCb4IIezHmdmJwDOoC4I>TW(p5LMiw>qEOic!Dsx(*oLS}pCYd5-+0 zW5cbG5M}y@NB7Bkfcx{b7*|B>Wgt-7V{?t=8pnB#30<_`e%)hWp)m`(uAZbYX0)E=?gX~9fZ?&>J0F}$^9K>J& z+GMBLKIoY#S?}k#zd$k9?#AV@(?1SoZK_W$oiJd%-kd%Gx^@fYbFrxN-KVuIG81ZC zOIxm$+kzsCArmU6myXx7TyM^rVEYkxzc%w+L_`sNi}s+q6~2sLob z?*@w3BP{TZ$(Cs6tzDo`lNE1W1!&lyyhqbr6&VX)(D4pp1oRNqOgPt_HlUT!0R~;p znAl$zkBTnaS$p%LsUq8196WTbrc88j-c@W5S@_F@ihd`xsH$AetTZ5Yi6jMUhN6#+x-&nzNZuG+ENjtfTk@cTl z>d>Dti|+4jl!*VNR+@iq3xAH?`-C(TsJtX%(dFfoOyaeiKy=%?GN6TsM(z8 zeC7ToJ}tf_?q#k9Sj?o^j73NqEM_+*hrP<@5xm43kI69r=x?T(k>_1x#}{6;Sw9wt zTlom=kMlQq%9ljOS3N$|n3Tam>dQAdGR|-% z-}j2?p@$Kyc7MzVN-HTpcOER}B|=NHvCQFfkn_>vS$w#i>z-0y>G9a{TnkhENgx&( zYFbum4AK8+RvojOjLq?Z0)2E}=Q7c{&L8(F6x+Ocvq*)^W2lkU%9rd$D+zgYM1L(> z7Vu}2@}ko|LC>jLu&7nT#MlrlcIyC5C2l${C|Bg`U}|$jDvMvP_lMOstD&g}3$wRQ z4j04~vymW=4C1rn^Wukcd2K<`!M(n}bAA1x>Cvft>mj7+b+Fzs%0Z1Z7kYLUro zvo1S_0PhJ~&(rH?D{ThMCoiIp{K%qPJq)l;3%Ao=t&1=ER8~^66=xy2y>g!dd*7J6 z=rL=CTUyF8r|niYQmjExhcy!C$|{#e^|FfFjhn&pT}RjEy5d=}w5V;1^&^(Zdt%BO zeWj(jE#75|dh+o&r*Xn~VkGn0*_>Uj2#*v>lWu&BUzs{K zm{5CuvuqJ%l{6?7qrP{!xAdNKLD$nyetBoNuO4A9$`Ny;`}U}4SJFHVVbh*HyVKD< zazCP?#Z-f|p>-lmTq$;}yxST|Q_Op*ly7-wA}60zzNpnYxB9g~xw*dW7Tfq1WZwOD zpC)G2GbY<6nfoZOgVOIfJCIOx#%Ii{;WgWGq3m>NA#61XMrcy z_BQxUVW2NJCl&nE#4ZLn#l!U{`yMrf51uCaO(O~umOd3WjA+EmsyWP{^_!M1I~Z5I zHv95r+xJbq?~1jNd|G$WT)9rG+1AxSJH^isKesP7F_y)2!H)2<7nZ_ttFq(P5_-AE z{I*nDUr(pS!_!J1Pl+a(!-adk3+tE0RyRDG9!b&``}CHH!ol$BSan?<-C8ix%%kGFh)i(>}{ zS_T>_OKZ%cocA?mjjX4{*4J_xw|sEOMT|(MWmRjhz^(;e*QfQWoA!M?iFKSQcTYQA zr5UO5eM2{FLT>&bRb;=YSrTf_wO9Tf{ridjMfJt9EwPgDcye;6L>sL9p6QpWskMZt zy2Met&#-}KP+kQY?18b4-PO3aXWpp~9!z6d8kApneEx$YsGxh{sv40TjK1STHsxia zYH-O}xgR3{H!)6>?1mbwIm9Xw#OxOd#I(6jd6YSI_^*Lz$lJId8wU}Cd z|GpM|co?d|saI;MC`M&`wa=;fRNdR&xeu8&+^2@4;3Z18Q3ZW1H8p`7cl}fAVovhg zS2s<&eTv}kUk+w=(FF(Pv2i=MZwh*I4`QSp`H-5mO?PiyaSe{lvhZQ9)FTJ`@C7f% ziNyyv|chi!w1k zTB=r4l$h^VwtV;Ps$@%f;W({wcS?WP zi_^^;J7p=XS00VzmHxS z>Jg=|Z~z^0oSW1YpWzsIrvJmdU7Pygumo3`Mm>65!kFSJMIEtt5%sWpQAcHJ@aqSI zlI$SSmmxYwMQx_{f`f8cEuY34wpV{YZRJ1u^x%`Z=Q&ZqXePRIIIC;tQqYajQkeq@ z1u0_!^9tnIAc{nSm(CF0i)&8Ab6UF|F*H`5lH8{5ms^jzcG|gPPtk1cK+mUc4`zR- zrG>h)>;?;Wel#wJ>D>_I;cau-{*HHX4{#d5q3ue;Z8Ud@v5^Xxw%k~kT^5ysve2v_ z%eYEko*m{Ycb~Y+r3e4u#Yc+>A@!&gs7{+v69NR{Nfe=>2dHcN=fFXw;pCo>;am(km}AF|$dgfN;#ZOsA9ut?*6dvrt>B_d>A2$ys&}vRhlTdUKGRkjNxi=k`B(cv zYWraulh|~XGugg-`hiyimi6?gsVR0&eV_c->VlbpuOGO2MP?jkS?5?I88=m?XETXQ zEXJo)0|n> zd7`G8U9j~8o8pJnr4qE)y<>#N@8nR_wMW;zky@=J&Yp!5@YWI#)XhlNbt;m>_XXN= zZ5fa++ryA=0|JqNGdWq(T@d+K`eU<`HpT0dx@1m(gGBYGPY9XyTmcVRQ!L+Kp-6bl z&*?3GHsq3~veWmIYYRuG+j!*5h_MdV+xn_gYuVy@h(ePZ-XeW#oK+ryQjD`)#1Rl zkxvtfl9=4ZcxN38yzn82lI+;KEx0!UJJ>C~9^hD!d#Oq!&Lf>wmPF!VszF-?YdM35 zEGQc69C_LC14fB)18b=)jo)po>|DYC9T_wwOpBsARaSWK`ol;;>R0fhTg2hTyAx&lHvEK)$0XpThW)bDxyWgL8nZta_t${+spDMq0d9`1vqqfd56~DSWPEIs zYEAL+*{shs;|xjdVXjO;72F@mX;+cDd`4JwOhm9DU4Rx3%nSTO%UBhZs6Q@z7k-9j z;k1Lol0!Yb?lhL)9!<$KrT8quq1mTzmC6-6zn9qf024+y&^ zCT@{Wr{qN)RO)+Xo{)!My(lY=cz0=5lA6L&>FoL4Edq*Yug9X=Eh%+k znHpk+scH+Aknoo5%NoL|*Bw;sn!LFTW{uem6C2eP49Dg$I6sO<4Q9-|e3iTV%k(=^u{nb5w@*A-_hyQl-wR_IC5K z`!K_uzT8KZiO@ELyEmj7>+0IMqw_?_sT-&s-e{4N`1dUS@uUQVmgJH(vNskJ_+wi1 z@oTZk9PO?>9Q0zYG9S|$SO-H&_8wZlW4otw<9_jWaD+w#bLBPiHYsNN3u@m!+Lpo1 z78@R3>yZyzdHuB;#|GP;@r@508b#c_JO8j*l{z5oX}RhLi7&VJ}EvbTE8l(yNjRJ$3_|ozX)57b*8vwhgL%@EoqN^ zUPN*ic+|BY8=O5N+2RxR4l#*7AaH@s#w|c|4ey<8(MLb*E+4OwJNkf)?gFj}Xj+2x z6a1cYR{Rh+yxI<-4#|JQW1eNC7s?6H`m6YrTYK#G8|SdDN=PJ`GiQhip(O^4j!TpVjF(w>xQ`>kM}LXWMXW$LZ*F3xdn@xl|#{s^-3zR_=25<<77hg{^WleWTA zDq>KpX3N{A{xYw0as}$ZK@qovCM2+S$=fG2)U-ic+^cMUN0TH7*IJ~94ITFt211YL zc%prYk44sD<6V&Lx14Aurz-6?x~T~f{$q%N=MsCr)k%mH1J(%SVLKxgW`6K#A6*Yj zd72=>9ctX$^OP;EosCpSORqh{GHGsi6G48y9OakZEwo2RW6r7BY8-s!ik01+Q`fFt zGqdL>>IoSg{{As(<5OdB9rM*f_r&+1YY!lUi$SKlE4O9VJl+NcNspJCI%l1O{8;nx zTih752GaNyT%!PU@Obh3MT(Th*sEt-34AnEBnrwCvL-Xm`I>Mb3R|_Oo0r3E zHS6S)QAy;B<=ggcRid>z^2!|*ai~=p>dO@Hk`{-1m&(amOga}cl23&iQDZ-6GI;@} zZdfpo({?YJMQHqiV$DXxM(sO&it)^vcti51hBWp2uawIwPmjGCb{m6@<&MC5odb;Z z-X?QLjoX@SoK+09#9@vOmiLtxR;5K8VI!$HeSPWEDYR=S;BvFD(hbo- z@qr^`kvYOf(0xEP-3w{T7j$7w3T7Yn&i(#{cka^l)9!aA)0BlC_oo^;vG^~i-|jjb zXI|F~Ra>obPTR;u{8%CLHC83R=F6QGJi<9O_d`VUGQN>zJln{8s^N6n5goCGKr@dm zMZdAQkI1f>8;h~3DNXOhnEh3k0c1{5wN&Ddic0&aPWmc7h(lXq}k8;qxK_vCkX%Z6W?9%;Foo?86b#8^XL#H=Rn zGV8z$CPGSE#hyc6%vW zAN@E|EQ{xjyT%7p!Sf1|W2esJjTY|r=e5GaTaFQff;IQ07gq1nI?=xl!A*x`Dy=lp z@cSXudvfQ1fhdX+0!*;^fC)J;0os{X1B0=@(IG#l(L5kfJPMd6v5|nu83-%}4CEOD z<6Zws1mJ;y9oSQyjb8gv0Klydc(9O%fgv7XCwMxi)wb4FH-A)dd|%eSWoA&$hacb< YtDB@Ije~C(|C3>Q%);>b(epR{3+otDegFUf literal 0 HcmV?d00001 diff --git a/docs/_static/equinor-logo2.jpg b/docs/_static/equinor-logo2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe9e5faf82fa9b77ab7e103b7071ded46af9e43a GIT binary patch literal 19937 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 literal 0 HcmV?d00001 diff --git a/docs/_static/equinor_logo.jpg b/docs/_static/equinor_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ccc08c5f5800abb4a67130f6448fb2e4d10c417 GIT binary patch literal 25380 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 S`}gnvmWlr=G5|gp{l5T%(8~(| literal 0 HcmV?d00001 diff --git a/docs/_static/equinor_logo_only.jpg b/docs/_static/equinor_logo_only.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d066045c1d60bcd369cbba1636533cbe6a4a266 GIT binary patch literal 8060 zcmcI}2UrwKv-WHx!;-TsL2_7-43dLn76b$lNs@CAFd!L4G6G7@A|gssq685n2uKD| zK|rD)Q8ITH&pDp+|KE3?=RWtly+e0(RlU_yHPt=c!^zmm6oArH(@+B-5CDLHKj7pm zG)F^O`KrEwo|=ZX>Zt%4?_%TX4aWe0tDBFPfw~g} zkS+jeelPF_LAoEuxBf-X;%NI{^e&F}x@e#b08nC(M%(|Q`Ej)MFB<0y+Qz}l71VJ7 zX%1HxU+^AI3(gbbYi>q{V9Rv+=M5MD>VOh}2CM;Jz!7i(d;kHkbpvDeuW=%$I9wfe3rR0mSlyTwlN&xCXX%ApaWpa{)ELf{Q(_1%Tf%^|m{Qvj@6NtO)>! znUj-EUI4&L2Y{oI1Hzj@Y$ z0PqToG2LemD=(|labRE#wX*|&jmH2$VhRA1V5|u*|8M2L;tkry*$47R0pQ|I0MLF9 z0FTlDfD;^#%>3jdpbQ{ja5x->04oFnfy5)m#{&x)5fK3~IT-~7IT<-QB@GiTB^3iT zIXN9G9Ro8n3kwS+EgJ{h84jj1EN5^=ARrVEiARc$PkM%moa)T~xSX^C~BHFgoG-T3%{d+@pKf!I~ym&^B&W-)(Caytc=4LP}+p@~Jf{U4{FsCB{fT!2G zcnGO{X%N7a`i^OZ7P_HOLCJ6Zdefc`~)fLWk2TXD)p?I0uVIb`>SND?0 zVYUvjA2`Wgj>^{ZNyrbLXX01~;kW`>Tt#OXcQ#4%pR>_(`ByL*&P=yB*T-p3hp!h@ z>-Sim!f=&c(ax6(N5vFz@*(rh!k;>C1%Kfzh7U{0UB#x(?mKM8t}*S`F=Zj;Jy+8* z7`^_&0l>8Vqve%1v-@Kc*J7Hs)=l&MI^Q#5!m7vB%sSTc@Q)@blj5@WiGzM_ z?N7KA`+twq>wR;F9}pQdYZxKQ)|&4SHNNf2MOL@4_wz+k`(J2SS;p|hjjP$idsVc$ zk3Xub_gw12lfGf;+6n-&0rVCJE6xLq|9mk>m%2~PtxJu$W;Pb#-RfZ#GqV}7|@?^jFl>%x0wK8?J$m?c3yJh|@pRfwRd{Re|5w zD<@p5cD(BhoPz97(iZdG6iA!DTm6sFFmUE`p#TUBiubpr0S*P11tfq%W6p``E0D8N zPzF(fs{lT@L_iSG6TpnOO4HUp-JMXhS{`L^AMbraDxEe9TBD?EY^k9#hDr2YPrPor zP07Yp-?Ip#oj{;%$f zQ9(a-$6tmolX#s9ns9o*1TQgb6e}J>C_T_tM6Gw7jLw6Bl8Zh>v6k2AnVWKbjxYFD zSABbVD!IE5qSZ`31J5p;=jTQ+HYY^Vl`;{qK2V5ov;X5AGhqFH!m{iIdTk&#bGS z@t)r7-Gw~uwp$J@hHrdFCN!N@4OPNC+CQYF*OADOpWDd? zgkT)EZS5i%$ucx-=RIF<8hjYsDq}QbQcpnpPjjl7CvKd^q?t3G@!s<}x%0#0v!`)L zG7mgIilgoDr5qB%(6`cN)>mKm0U;VuF_BC(>v2A@T$dv%sW#1Mb7LV%Jan3#Jh%G%SzafI=uM(uS9B4~+5=TEW= zt(x@>R~>yL4BF@;fTk;5Ad?hrfmw>7E3Af@$=6`d6}Tpaht_jGU?ZURg??aO!fCL2 z6K0C2j$b#zzk@a<*02^jsO6s>+#&fxNYXKIeNE`y#GAbvrEwKE3Nz9ITN*W_v=0awSgr%u#Nh(`K2dj2v-NQtGHlsP z=N8@cVQxklZ+TSo9_YmOcO7xxT>R*zl#k+uxEcQZN{og$w9T$WKORIJ`OK83)!2Kg z^$*a!|JYC?C?0?8A8LNK%^^Ve%G6;?y>5C}qsJ2=NeY$*yJ zu5&c|gtG>(lG6iJUq>6`y27Tf?!pJS;;Q4L*(%);ache447{p&m2TbiqEw{m>Kpm+ zOYItk3ex;jhQgv{s(hjGmbcgD_TNg)Y=&hS>)r|6QE-fpy2u$4oO+j8Eon~Gx=oBP zz?WkQK_f@}nHdCYI3?0CY$K1wa8Pf)L#Nf{y%h2!N4OpoJCTC`xvWKGwj~ ziPm)R=D7C!dW-5eLam|hDIsz7fKO_+qxkuhNDDRISnpf3*ZJEwTuC?U zcrb=%^Ssx0;(AQ7G35s?cmb1h8Uxz1mvSdcU#r&J%Jel81+%jDR*-1)J^N6^$OF#Aw81fHM!hLvh|O|`9@m)K#V=VjQ7G-Jz$$`(7Ms(OiLBTY_1If+W$kq zJ`QT}lFV`(p|2r{PbpHFZ=rb0VYVB;NzXu?oJ8O)aZ!jk5zZ2-N7SG;{Y*lMp17d< zcG~QwW$QX(^fKSw)(LP-L>mzprORwnzxim-JwJ=$;*~IL~P~- zf*la3-6iKUiarQc!n`R7a%252cO=oQUGA)eTC5k9dzmk&NxVfgC1<2vF!z(C?P3By z`e4h_yWDssheoYrvAhpu^tLYk`H>rGz9>B9P+HY&yj_>%Xf-{$U( z>{8Ej-eqv4O$W-km%Z_ypR*Vu5|BXN(;Z$%dkP-o?lleL-P|o)WdZGEk|Q{|>b?@Tru%sn%K~@)ICh!H5dtv0ZI{R+f<*G3Q)(Bt!!(NwLAnBXVYG+haB17O-oIQOjl~ zs8^~Q6s>Wur}>dl?jncnZOOjrz`%VpL}+ z4|x(x^u#<0zz4JVQj-Q2$%vDKEt-AH`iM<^HjGrS}lC2hm)YoFh zcc!v>^Rvc}N&%T^Yu!=Z88HbD5%wVC}qm%Xz(VE79R zDWPk?^S23)7uj>J!A70upK$;L+yG_Q1wjIafEW*FNt1`~KFEu9uvv}YbqiIrhkM-6B0htXACQU{RW^1CSirAv<|DtjkM9E8SWtq& zMDWQuJ{XQm5lNfGzr$*WF6k|+(py)ZM2 zcPYxo;jKSHOd*7bjzMTma~jo*4PVb@Ey}zb|09AGzwaT?X1l+lXeE_!@JT-O1ORRj zFhQs8g&hwtgv!SM#QPMoUXwtG;!7Cbxl2Yz!(R3+x$xl!5`Q+N{m(IEC%$8*Dt0@Z z(Wvq4Ob*|>*k(KDJYwJ>6u3E(&&o!xs&?0U`Wwp?I6pBgF&tAl#1{YU(hdnxU0T=b+~%7pMxG9WV*LKzS}BK zc>L^nR>Zi=LtAP(7P<|>#l_0?ut4e~vWhpVrS}!FZd}bvwhZQR0^nyWcm&G(MGXTd>GlD&*(dvda@{BVf6Q+5$>#ratgSxTjkrHY&wd5! z-vJf6{^Wq&^Rk<3V3+%ErWi;28o=&9P04|r-=U?+Z4#z{CAQQu&xK|aeh(NOzt(Y_;K3B?a)ENfkJvYd0E33okv zdCJd6047bhI_x*C+%-R;$c~L|KOf_I`O@&(p{Nvhfcbt1wEe54j&)D&kf zNjh={hmX}YN)?0B%%4QNUY_E&&It$&7Eg9~PgSV)u?VD!k@004zMg$(m$cQfb{Q7K z*p?S4l_C4md`PzJw(db{<#d2c?JvBLee1@!*V|rYTI;4q6BJ(YZ@uqCb}tc%Tzb1u zb%mw;>A*yfm0gR=f)rPH zV5`AAkfz8Kw#O=J7Zrwy9hhhz6qS&5CB@;AoS6?jGk8)+Z(YmRM%k4O;pzOLIf zxe>WOT<;7}bI}9|>#&KiM}n~_tlrGIh?X?Fw4v$+rzq{(c}|=0Bm;eZ4*tc!FK@oJ zK7=cThHTAR32IdycRCUtM8tgX@?Cyh^>|vBIh&A?PAH#VYN0*pyAcZnThFIOQxQ{s zlX1LjTb>XZNo}IU-!^xQJ7J)4xdZOS|I8flgaLpjTw$~VM$yv}dzv!1^9Aatn5f)b z*=G2%qA-5hc7{-G^+G|7BE>von@>vY^g}!*iLKPgmLNgHI~x8=gTE?T7lrOGsl2w+ zPj$8tF5qWG8reNV;>khd^u>5jf({Kl5A&913vaoG7p8B&FWo(--04h~k-s}-u^aS5 zb$qCbWAo*?sh+1H&H?x}K0`#6g9L6>stz{Kmih^~n)E*#^#JAiBz?b57Cb1>5g7Dz z68v%oLe7e{0))|^BR^0I`oRgg(?R9Gw-?|fc*cT)1D}k8i){zOSx7!R_zmT>@IZYK zNH#I{wgdzPX;OpzOs)YIsaLgfwmn5aic4I&l56yx`EFN3Pi74kO7m@`wE96L!$TbRbnI457Lh*jZq_-a zRLr$!l;+rT zXWxA)n0WW8(T$D6@IH_C@wvrabw(GBN*aCne?X&;dV5l0lws`Ky7?TB=FSGtJM#Xd zV^NoQXa4gH>6)p>h2@%L(Px+-mM(hM){)W1WRfJ$H)QPXrr-96vSwO7wMsb6B~<8J ziSbUryX>5Ik~qUuQ{%6zOnzNY33#nEU-QGyb9FQ+WqsH-x;IZJ4{;~bmC0kbTlNd9 z_oTl}Ej)G~fzM!TsnaraEhbHQd4_-UR(PN1)avZ+fu!uUEO*c|S?0-X7JIzt%J)BL z&v%5@C(W!(f!1R~JHr{%iR+U0TCGZ=b;sgzQiw!cR6! zvuQtPb_y{Co~p*)%Q>o8p_sXNM&)^v^p(^nED-z+)a>E$J9p_60_FAINMgz9^&JoY zZdn=a3Pai(NHd0eypRr?=T=BV{Zwq9CHE~VRDtI>gY>5#h4K?Cw(mx^Pk@-S9k!iZ z&*LgX+fBFKmLR!I@df}<4{o=lXRu+#&Ew0yt(@cZ7s$D{Qp+yRP)qRfMj^Vi2(kj zpbbpHD^;%?&IZ5Gw-i)cBd$97ZghesL#KZ~{?y55;kZ<@yPLl+E`XdT3%sLmT+zvEgfBY{HC?CLLPv z0rS>Jj%>u|=M8jzv(k}IokXzP8H|CyhN97Rn0qGUQ72TE~ygg-jEwjt`n87DM^XfTL8ifSr zwxO`{-A?+QA~8;BwzIKMjJ~*KLtU{Lt0OL7rp2k%w%GMg)^wR}YK-2?7ArKF`0!lD zh6RjbEH(ZE&J%!UG)fDbHhNH#(%+tnmA`_oTxROs!jG90HxB0;Igk#Kh88A#Y?{vF z_2R~4Qw;Tp^0l|5ko^33K|nHzYkMU(PVaQyED-4PCcbQY%kkvHsCopYFvsDQH5Pkl zCp~A^g9DbUl=g39D^GxLQxbSG?c0QzFRk+ntuza{NPCV+*tqYer;OgK{2Hl6fw!Eg zOW>LF(4Xy->%Hq{29miYB6h;ZuX^vjz=!3olNe}FCH1y)Bs+5EdNgB?3PXrv6hqXR MgTTjxJJXH-7pHMU@Bjb+ literal 0 HcmV?d00001 diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html new file mode 100644 index 00000000..60117de5 --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,17 @@ +{% extends "!layout.html" %} + {% block footer %} {{ super() }} + + +{% endblock %} diff --git a/docs/api.rst b/docs/api.rst new file mode 100644 index 00000000..0e5f5426 --- /dev/null +++ b/docs/api.rst @@ -0,0 +1,8 @@ +API +=== +If you are a developer and want to understand the details going on under the proverbial hood, this section is for you. + +.. automodule:: fmu.sumo.sim2sumo.sim2sumo + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..c1be42b8 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,57 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys + +sys.path.insert(0, os.path.abspath("../src/")) + + +# -- Project information ----------------------------------------------------- + +project = "fmu-sumo-sim2sumo" +copyright = "2023, Sudo Team @ Equinor" +author = "Sudo Team @ Equinor" + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.napoleon", + "sphinx.ext.autodoc", +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_rtd_theme" +html_logo = "_static/equinor-logo2.jpg" + + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..4a683993 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,17 @@ +.. fmu-sumo-sim2sumo documentation master file, created by + sphinx-quickstart on Wed Jan 31 10:50:22 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to fmu-sumo-sim2sumo's documentation! +============================================= +``fmu.sumo.sim2sumo`` is a python package for uploading results to Sumo. +The package facilitates upload of results from reservoir simulators such as **eclipse**, **IX**, and **OPM flow** as arrow files. + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + self + sim2sumo + api \ No newline at end of file diff --git a/docs/sim2sumo.rst b/docs/sim2sumo.rst index 850b8831..8f8cefbf 100644 --- a/docs/sim2sumo.rst +++ b/docs/sim2sumo.rst @@ -1,105 +1,282 @@ -Sumo Utilities -############# +fmu.sumo.sim2sumo +################# -The ``fmu.sumo.utilities`` is a python package for integrating other tools into the FMU-SUMO ecosystem. -So far the only utility available is the utility sim2sumo which facilitates upload of results from -reservoir simulators such as eclipse and opm flow as csv or arrow format files. - -sim2sumo --------- +Short introduction +******************* .. note:: **sim2sumo** couples together three packages often used in the FMU sphere. - * **fmu-dataio** the FMU plugin for exporting data out of FMU workflows with rich metadata. - * **ecl2df**, a plugin not strictly tied down to FMU, but often used in this domain - * **fmu.sumo.uploader**, a plugin that uploads files exported to disc with metadata to sumo -- User has necessary accesses + + * **fmu-dataio** (`docs `__) the FMU package for exporting data, with rich metadata, out of FMU workflows. + * **res2df** (`docs `__), package used for extracting results from flow simulator runs, not strictly tied down to FMU, but often used in this domain + * **fmu.sumo.uploader** (`repo `__), package that uploads files exported to disc with metadata to sumo + + +The package makes available export of all datatypes that you can export with ``res2df``, and uploads these results to Sumo. It is part of ``komodo`` and can be accessed from the command line with ``sim2sumo``, or from +``ert`` with the forward model **SIM2SUMO**. In it't simplest form it needs no extra configuration settings, but comes pre-configured to extract datatypes: + + +* summary +* rft +* wellcompletions + + +| To run sim2sumo with ert it needs to be inserted in your *ert config file* after the reservoir simulator run, this is typically an **eclipse** run. +| See :ref:`examples`. .. note:: -Api Reference -------------- -- `API reference `_ + Sim2sumo as fmu-sumo-uploader uses the fmu-config file (aka global variables) to pick up required metadata. For more on this topic see :ref:`config file` + +.. _preconditions: + +Preconditions +*************** + +.. important:: **First time uploading to sumo?** + + There are some requirements that need to be in place for sim2sumo to run, these are the same preparations that are required for any upload to sumo. + Read the `fmu-dataio preparations section `_ thoroughly. + +These are the conditions that need to be in place when extracting results with sim2sumo. + +* Sim2sumo needs to be run from a location where it can find a case metadata object stored on disk. + This means that it needs to be run from within an fmu workflow with RUNPATH = *realization-/iter-*, and a case metadata object stored at + *share/metadata/fmu_case.yml* + + Example:: + + RUNPATH = /scratch/fmu/myuser/drogon-ahm-2024-02-05/realization-2/iter-1/ + Case metadata: /scratch/fmu/myuser/drogon-ahm-2024-02-05/share/metadata/fmu_case.yml + +* The case metadata object must have been uploaded to Sumo, and to the same environment that you are intending to upload to. + Default sumo environment is **prod**, and you should have a good reason for uploading elsewhere. + +* a :ref:`config file ` with the required metadata to identify the asset that the data is coming from. + +.. _config file: + +The config file +***************** + +In it's simplest form sim2sumo seems to not need any configuration. This is not correct, under the hood it is using the fmu-config file. +For the simplest implementation this file needs to be stored at *fmuconfig/output/global_variables.yml*, relative to where you run sim2sumo. +There are two 'parts' in the global variables file that are relevant for sim2sumo: + +1. The master data needed for the upload to sumo, that is the three sections model, masterdata, and access. + These are absolutely neccessary, as with all uploads to sumo. More on this topic can be found in the documentation + for ``fmu-dataio``, see :ref:`preconditions` + +2. A section named sim2sumo. This section is not strictly needed, but needs to exist for custom configuration of sim2sumo, see :ref:`custom config` +.. important:: + + If you need to configure sim2sumo for your needs it is strongly encouraged to to add the sim2sumo section to a *_sim2sumo.yml* file and link this into the file *global_master.yml* config file before + you generate the *global_variables.yml* and *global_variables.yml.tmpl* files. + + Example: + .. code-block:: yaml + + [...] + + (rest of global_variables master file) + + #=================================================================================== + # Sim2sumo config settings + #=================================================================================== + + sim2sumo: !include _sim2sumo.yml + + +.. _examples: Usage and examples ------------------- +******************** +As a FORWARD_MODEL in ERT +========================================= + +| All examples below extracts results to *share/results/tables*, and uploads those results to Sumo. +| You don't need to have more than one instance of this job, it automatically extracts the default results. +| If you want to include more datatypes add that to the configuration file, see :ref:`config settings`, +| See also :ref:`preconditions`. + +Simplest case +----------------- + +.. code-block:: + + + FORWARD_MODEL ECLIPSE(...) + -- Note: SIM2SUMO needs to be run after the reservoir simulation + FORWARD_MODEL SIM2SUMO + + + +Config file with non-standard name/location +--------------------------------------------- +If you for some reason don't have the fmu config file in the standard location or with the standard name, use this in you *ert config file* + +.. code-block:: + + + FORWARD_MODEL ECLIPSE(...) + -- Note: SIM2SUMO needs to be run after the reservoir simulation + FORWARD_MODEL SIM2SUMO(=path/to/config/file) + +.. _config settings: Config settings ------------------------------- +******************** -sim2sumo is set up such that you provide a config file with the section sim2sumo defined. -The config file needs to be in yaml format. You can add this to the global_variables for the case, -or make your own file. The file needs to contain two parts: -1. The metadata needed for the upload to sumo, that is the three sections model, masterdata, and access -2. A section named sim2sumo. There are several ways to define this section sim2sumo. -Simplest case -^^^^^^^^^^^^^^ -This is a snippet of the ``global_variables.yml`` containing enough data to upload to sumo with sum2sumo. - In real cases this file will be much longer. When the entire section for sum2sumo is equal to ''sim2sumo: true'' - sim2sumo will extract from all simulation runs in a folder called eclipse/model/ relative to where you are running from, - and at the same time export all datatypes available. See the example file below. +Example of config settings for sim2sumo +============================================ -.. toggle:: - .. literalinclude:: ../tests/data/reek/realization-0/iter-0/fmuconfig/output/global_variables.yml - :language: yaml +.. literalinclude:: ../tests/data/reek/realization-0/iter-0/fmuconfig/output/global_variables_w_eclpath_and_extras.yml + :language: yaml | -Case where eclipse datafile is explicitly defined -^^^^^^^^^^^^^^ -This is a snippet of the ``global_variables.yml`` file which holds the static metadata described in the -`previous section <./preparations.html>`__. In real cases this file will be much longer. -.. toggle:: +.. _custom config: - .. literalinclude:: ../tests/data/reek/realization-0/iter-0/fmuconfig/output/global_variables_w_eclpath.yml - :language: yaml +Custom configuration +===================== -| -Case where eclipse datafile, what types to export, and options to use are explicitly defind -^^^^^^^^^^^^^^ -This is a snippet of the ``global_variables.yml`` file which holds the static metadata described in the -`previous section <./preparations.html>`__. In real cases this file will be much longer. +The sim2sumo section in the config file gives you full flexibility for extracting anything that ``res2df`` can extract. +You can also change where you extract results from, and even use all the extra custumization options that ``res2df`` has available. +The three relevant sections are: -.. toggle:: +*datafile*: +-------------------- +This section is for configuring where you extract results from, meaning where to look for simulation results. This section can be configured in several ways: - .. literalinclude:: ../tests/data/reek/realization-0/iter-0/fmuconfig/output/global_variables_w_eclpath_and_extras.yml - :language: yaml +1. As a path to a file, or file stub (without an extension): -| + .. code-block:: yaml + + datafile ../../eclipse/model/DROGON + + +2. As a path to a folder: + + .. code-block:: + + datafile: ../../eclipse/model/ + + +3. As a list: + + .. code-block:: + + datafile: + - ../../eclipse/model + - ../../ix/model + .. + + +datatypes: +---------------- +This section is for configuration of what data to extract. The section can be configured in several ways. + +1. As list: + + .. code-block:: + + datatypes: + - summary + - wcon + - faults + - .. + +2. as string: + + Here there are two options, you can use both the name of one single datatype + or the 'all' argument for all datatypes: + + .. code-block:: + :caption: extracting all available datatypes from simulation run + + datatypes: all + + For datatypes available see documentation for ``res2df`` + +options: +------------- + | This section is for adding extra optional configuration for extracting the different datatypes. + | This section needs to be in a list format. + + +Using sim2sumo in scripts +********************************* Exporting data from eclipse with metadata -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This code exports summary data results from simulation +=========================================== +| This code exports summary data results from an eclipse simulation run. +| Will export to the "prod" environment of Sumo. + .. code-block:: - from fmu.sumo.utilities.sim2sumo as s2s + from fmu.sumo.utilities.sim2sumo as s2s - DATAFILE = "eclipse/model/2_REEK-0.DATA" - CONFIG_PATH = "fmuconfig/output/global_variables.yml" - SUBMODULE = "summary" - s2s.export_csv(DATAFILE, SUBMODULE, CONFIG_PATH) -As a FORWARD_MODEL in ERT -^^^^^^^^^^^^^^^^^^^^^^^^^ + DATAFILE = "eclipse/model/2_REEK-0.DATA" + CONFIG_PATH = "fmuconfig/output/global_variables.yml" + SUBMODULE = "summary" + s2s.upload_with_config(CONFIG_PATH, DATAFILE, SUBMODULE, "prod") + +See also :ref:`preconditions`. + +Using sim2sumo from the command line +*************************************** + +sim2sumo can be run from any terminal window where komodo is activated. +This can be useful for checking that everything works as it is supposed to, but the intension of sim2sumo +is to be run as an ert FORWARD_MODEL. + +Execution of sim2sumo from command line +======================================== + +Extracting the default datatypes with sim2sumo +------------------------------------------------- .. code-block:: + :caption: Accessing the help information - FORWARD_MODEL SIM2SUMO + sum2sumo execute --config_path fmuconfig/output/global_variables.yml --env dev +See also :ref:`preconditions`. -Example above uploads all surfaces dumped to ``share/results/maps``. You don't need to have more -than one instance of this job, it will generate and upload the data specified in the corresponding -config file. +Extracting rft data from specified datafile with sim2sumo +---------------------------------------------------------------- -.. note:: +.. code-block:: + :caption: Extracting rft + sum2sumo execute --config_path fmuconfig/output/global_variables.yml --datatype rft --datafile eclipse/model/DROGON-0.DATA -.. note:: +Getting help on sim2sumo from the command line +================================================= + +You can get help on sim2sumo from the command line. Here are some examples: + + +.. code-block:: + :caption: Accessing the general help information + + sim2sumo -h + +Accessing help from ``res2df`` via sim2sumo +============================================== +| There is extensive information on extraction of individual datatypes with ``res2df``. +| This information can be accessed from sim2sumo. + +.. code-block:: + :caption: Getting help on summary data from ``res2df`` with sim2sumo from the command line + + sim2sumo help summary diff --git a/pyproject.toml b/pyproject.toml index b4e0973e..bbf95500 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,14 @@ test = ["pytest"] dev = ["pytest", "black", "flake8"] nokomodo = ["ert"] +docs = [ + "sphinx==6.2.1", + "sphinx-rtd-theme", + "autoapi", + "sphinx-autodoc-typehints", + "sphinxcontrib-apidoc", +] + [tool.setuptools.packages.find] where = ["src"] diff --git a/src/fmu/sumo/sim2sumo/__init__.py b/src/fmu/sumo/sim2sumo/__init__.py index abcc9afd..fde48d2f 100644 --- a/src/fmu/sumo/sim2sumo/__init__.py +++ b/src/fmu/sumo/sim2sumo/__init__.py @@ -1,6 +1,6 @@ try: - from ._version import version + from .version import version __version__ = version except ImportError: - __version__ = "0.0.0" \ No newline at end of file + __version__ = "0.0.0" diff --git a/src/fmu/sumo/sim2sumo/sim2sumo.py b/src/fmu/sumo/sim2sumo/sim2sumo.py index 07ddc5f7..001d5f8c 100644 --- a/src/fmu/sumo/sim2sumo/sim2sumo.py +++ b/src/fmu/sumo/sim2sumo/sim2sumo.py @@ -1,8 +1,14 @@ -"""Export with metadata""" +"""Module for uploading tabular data from reservoir simulators to sumo + Does three things: + 1. Extracts data from simulator to arrow files + 2. Adds the required metadata while exporting to disc + 3. Uploads to Sumo +""" + import sys import re from typing import Union -from pathlib import Path +from pathlib import Path, PosixPath import logging import argparse import pandas as pd @@ -16,7 +22,7 @@ logging.getLogger(__name__).setLevel(logging.DEBUG) -def yaml_load(file_name): +def yaml_load(file_name: str) -> dict: """Load yaml config file into dict Args: @@ -155,7 +161,7 @@ def export_results( return exp_path -def read_config(config, datafile=None, datatype=None): +def read_config(config, datafile=None, datatype=None) -> tuple: """Read config settings Args: @@ -163,7 +169,7 @@ def read_config(config, datafile=None, datatype=None): kwargs (dict): overiding settings Returns: - tuple: datafiles as list, submodules to use as list, and options as kwargs + tuple: datafiles as list, submodules to use as list, and options as dict """ # datafile can be read as list, or string which can be either folder or filepath logger = logging.getLogger(__file__ + ".read_config") @@ -203,8 +209,11 @@ def read_config(config, datafile=None, datatype=None): if datatype is None: try: submods = simconfig["datatypes"] - if submods == "all": - submods = SUBMODULES + if isinstance(submods, str): + if submods == "all": + submods = SUBMODULES + else: + submods = [submods] except KeyError: submods = defaults["datatypes"] else: @@ -226,7 +235,7 @@ def read_config(config, datafile=None, datatype=None): return datafiles, submods, options -def export_with_config(config_path, datafile=None, datatype=None): +def export_with_config(config_path, datafile=None, datatype=None) -> tuple: """Export several datatypes with yaml config file Args: @@ -268,10 +277,10 @@ def export_with_config(config_path, datafile=None, datatype=None): def upload( - upload_folder, - suffixes, - env="prod", - threads=5, + upload_folder: str, + suffixes: list, + env: str = "prod", + threads: int = 5, start_del="real", config_path="fmuconfig/output/global_variables.yml", ): @@ -306,7 +315,7 @@ def upload( logger.warning("Nothing to export..") -def parse_args(): +def parse_args() -> argparse.Namespace: """Parse arguments for command line tool Returns: @@ -364,7 +373,7 @@ def parse_args(): return args -def give_help(submod, only_general=False): +def give_help(submod: Union[None, str], only_general: bool = False) -> str: """Give descriptions of variables available for submodule Args: @@ -399,7 +408,9 @@ def give_help(submod, only_general=False): return text_to_return -def upload_with_config(config_path, datafile, datatype, env): +def upload_with_config( + config_path: str, datafile: Union[str, PosixPath], datatype: str, env: str +): """Upload simulator results to sumo Args: