From 274f9efe4b8438ab5238967e39adc200c624b56e Mon Sep 17 00:00:00 2001 From: Anne Philipp <anne.philipp@univie.ac.at> Date: Mon, 22 Oct 2018 13:44:47 +0200 Subject: [PATCH] Converted docstrings to numpy style and build first structure for sphinxdocumentation (incl API) --- .../Sphinx/build/doctrees/api.doctree | Bin 31955 -> 332947 bytes .../Sphinx/build/doctrees/downloads.doctree | Bin 2949 -> 3407 bytes .../build/doctrees/downloads/git_repo.doctree | Bin 0 -> 2778 bytes .../downloads/history_changes.doctree | Bin 0 -> 2801 bytes .../doctrees/downloads/tar_balls.doctree | Bin 0 -> 2795 bytes .../Sphinx/build/doctrees/environment.pickle | Bin 47165 -> 225566 bytes .../Sphinx/build/doctrees/index.doctree | Bin 10790 -> 12705 bytes .../build/doctrees/installation.doctree | Bin 2966 -> 3238 bytes .../doctrees/installation/oper_modes.doctree | Bin 0 -> 2789 bytes .../installation/requirements.doctree | Bin 0 -> 2779 bytes .../installation/test_install.doctree | Bin 0 -> 2799 bytes .../Sphinx/build/doctrees/oper_modes.doctree | Bin 0 -> 2776 bytes .../build/doctrees/program_structure.doctree | Bin 2975 -> 3470 bytes .../program_structure/prog_components.doctree | Bin 0 -> 2809 bytes .../program_structure/prog_flow.doctree | Bin 0 -> 2781 bytes .../program_structure/prog_overview.doctree | Bin 0 -> 2799 bytes .../build/doctrees/requirements.doctree | Bin 2972 -> 2766 bytes .../Sphinx/build/doctrees/support.doctree | Bin 2905 -> 3225 bytes .../Sphinx/build/doctrees/support/faq.doctree | Bin 0 -> 2841 bytes .../support/known_bugs_issues.doctree | Bin 0 -> 2813 bytes .../doctrees/support/mailing_list.doctree | Bin 0 -> 2776 bytes .../doctrees/support/ticket_system.doctree | Bin 0 -> 2777 bytes .../build/doctrees/test_install.doctree | Bin 0 -> 2784 bytes .../Sphinx/build/doctrees/user_guide.doctree | Bin 2926 -> 3185 bytes .../user_guide/control_templates.doctree | Bin 0 -> 2822 bytes .../build/doctrees/user_guide/how_to.doctree | Bin 0 -> 2815 bytes .../build/html/_modules/ControlFile.html | 790 +++++++++ .../build/html/_modules/EcFlexpart.html | 1510 +++++++++++++++++ .../Sphinx/build/html/_modules/GribTools.html | 535 ++++++ .../build/html/_modules/MarsRetrieval.html | 716 ++++++++ .../Sphinx/build/html/_modules/UioFiles.html | 362 ++++ .../build/html/_modules/get_mars_data.html | 478 ++++++ .../Sphinx/build/html/_modules/index.html | 11 +- .../Sphinx/build/html/_modules/install.html | 746 ++++++++ .../build/html/_modules/prepare_flexpart.html | 401 +++++ .../Sphinx/build/html/_modules/submit.html | 395 +++++ .../Sphinx/build/html/_modules/tools.html | 450 ++--- .../Sphinx/build/html/_sources/api.rst.txt | 77 + .../build/html/_sources/downloads.rst.txt | 11 +- .../html/_sources/downloads/git_repo.rst.txt | 4 + .../downloads/history_changes.rst.txt | 4 + .../html/_sources/downloads/tar_balls.rst.txt | 4 + .../Sphinx/build/html/_sources/index.rst.txt | 17 +- .../build/html/_sources/installation.rst.txt | 15 +- .../_sources/installation/oper_modes.rst.txt | 6 + .../installation/requirements.rst.txt | 6 + .../installation/test_install.rst.txt | 5 + .../build/html/_sources/oper_modes.rst.txt | 6 + .../html/_sources/program_structure.rst.txt | 10 +- .../program_structure/prog_components.rst.txt | 5 + .../program_structure/prog_flow.rst.txt | 5 + .../program_structure/prog_overview.rst.txt | 5 + .../build/html/_sources/requirements.rst.txt | 4 +- .../build/html/_sources/support.rst.txt | 14 +- .../build/html/_sources/support/faq.rst.txt | 4 + .../support/known_bugs_issues.rst.txt | 4 + .../_sources/support/mailing_list.rst.txt | 4 + .../_sources/support/ticket_system.rst.txt | 4 + .../build/html/_sources/test_install.rst.txt | 5 + .../build/html/_sources/user_guide.rst.txt | 12 +- .../user_guide/control_templates.rst.txt | 4 + .../html/_sources/user_guide/how_to.rst.txt | 4 + documentation/Sphinx/build/html/api.html | 1247 +++++++++++++- .../Sphinx/build/html/downloads.html | 17 +- .../Sphinx/build/html/downloads/git_repo.html | 236 +++ .../build/html/downloads/history_changes.html | 236 +++ .../build/html/downloads/tar_balls.html | 236 +++ documentation/Sphinx/build/html/genindex.html | 256 ++- documentation/Sphinx/build/html/index.html | 34 +- .../Sphinx/build/html/installation.html | 28 +- .../build/html/installation/oper_modes.html | 236 +++ .../build/html/installation/requirements.html | 236 +++ .../build/html/installation/test_install.html | 236 +++ documentation/Sphinx/build/html/objects.inv | Bin 565 -> 1798 bytes .../Sphinx/build/html/oper_modes.html | 236 +++ .../Sphinx/build/html/program_structure.html | 17 +- .../program_structure/prog_components.html | 236 +++ .../html/program_structure/prog_flow.html | 236 +++ .../html/program_structure/prog_overview.html | 236 +++ .../Sphinx/build/html/py-modindex.html | 88 +- .../Sphinx/build/html/requirements.html | 28 +- .../Sphinx/build/html/searchindex.js | 2 +- documentation/Sphinx/build/html/support.html | 14 +- .../Sphinx/build/html/support/faq.html | 234 +++ .../build/html/support/known_bugs_issues.html | 237 +++ .../build/html/support/mailing_list.html | 237 +++ .../build/html/support/ticket_system.html | 237 +++ .../Sphinx/build/html/test_install.html | 236 +++ .../Sphinx/build/html/user_guide.html | 17 +- .../html/user_guide/control_templates.html | 235 +++ .../Sphinx/build/html/user_guide/how_to.html | 235 +++ documentation/Sphinx/source/api.rst | 77 + documentation/Sphinx/source/downloads.rst | 11 +- .../Sphinx/source/downloads/git_repo.rst | 4 + .../source/downloads/history_changes.rst | 4 + .../Sphinx/source/downloads/tar_balls.rst | 4 + documentation/Sphinx/source/index.rst | 16 +- documentation/Sphinx/source/installation.rst | 15 +- .../Sphinx/source/installation/oper_modes.rst | 6 + .../source/installation/requirements.rst | 6 + .../source/installation/test_install.rst | 5 + .../Sphinx/source/program_structure.rst | 10 +- .../program_structure/prog_components.rst | 5 + .../source/program_structure/prog_flow.rst | 5 + .../program_structure/prog_overview.rst | 5 + documentation/Sphinx/source/requirements.rst | 6 - documentation/Sphinx/source/support.rst | 14 +- documentation/Sphinx/source/support/faq.rst | 4 + .../source/support/known_bugs_issues.rst | 4 + .../Sphinx/source/support/mailing_list.rst | 4 + .../Sphinx/source/support/ticket_system.rst | 4 + documentation/Sphinx/source/user_guide.rst | 12 +- .../source/user_guide/control_templates.rst | 4 + .../Sphinx/source/user_guide/how_to.rst | 4 + source/python/classes/ControlFile.py | 192 +-- source/python/classes/EcFlexpart.py | 417 +++-- source/python/classes/GribTools.py | 167 +- source/python/classes/MarsRetrieval.py | 509 +++--- source/python/classes/UioFiles.py | 75 +- source/python/install.py | 267 ++- source/python/mods/get_mars_data.py | 96 +- source/python/mods/prepare_flexpart.py | 59 +- source/python/mods/tools.py | 438 ++--- source/python/submit.py | 63 +- 124 files changed, 13366 insertions(+), 1538 deletions(-) create mode 100644 documentation/Sphinx/build/doctrees/downloads/git_repo.doctree create mode 100644 documentation/Sphinx/build/doctrees/downloads/history_changes.doctree create mode 100644 documentation/Sphinx/build/doctrees/downloads/tar_balls.doctree create mode 100644 documentation/Sphinx/build/doctrees/installation/oper_modes.doctree create mode 100644 documentation/Sphinx/build/doctrees/installation/requirements.doctree create mode 100644 documentation/Sphinx/build/doctrees/installation/test_install.doctree create mode 100644 documentation/Sphinx/build/doctrees/oper_modes.doctree create mode 100644 documentation/Sphinx/build/doctrees/program_structure/prog_components.doctree create mode 100644 documentation/Sphinx/build/doctrees/program_structure/prog_flow.doctree create mode 100644 documentation/Sphinx/build/doctrees/program_structure/prog_overview.doctree create mode 100644 documentation/Sphinx/build/doctrees/support/faq.doctree create mode 100644 documentation/Sphinx/build/doctrees/support/known_bugs_issues.doctree create mode 100644 documentation/Sphinx/build/doctrees/support/mailing_list.doctree create mode 100644 documentation/Sphinx/build/doctrees/support/ticket_system.doctree create mode 100644 documentation/Sphinx/build/doctrees/test_install.doctree create mode 100644 documentation/Sphinx/build/doctrees/user_guide/control_templates.doctree create mode 100644 documentation/Sphinx/build/doctrees/user_guide/how_to.doctree create mode 100644 documentation/Sphinx/build/html/_modules/ControlFile.html create mode 100644 documentation/Sphinx/build/html/_modules/EcFlexpart.html create mode 100644 documentation/Sphinx/build/html/_modules/GribTools.html create mode 100644 documentation/Sphinx/build/html/_modules/MarsRetrieval.html create mode 100644 documentation/Sphinx/build/html/_modules/UioFiles.html create mode 100644 documentation/Sphinx/build/html/_modules/get_mars_data.html create mode 100644 documentation/Sphinx/build/html/_modules/install.html create mode 100644 documentation/Sphinx/build/html/_modules/prepare_flexpart.html create mode 100644 documentation/Sphinx/build/html/_modules/submit.html create mode 100644 documentation/Sphinx/build/html/_sources/downloads/git_repo.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/downloads/history_changes.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/downloads/tar_balls.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/installation/oper_modes.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/installation/requirements.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/installation/test_install.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/oper_modes.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/program_structure/prog_components.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/program_structure/prog_flow.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/program_structure/prog_overview.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/support/faq.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/support/known_bugs_issues.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/support/mailing_list.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/support/ticket_system.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/test_install.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/user_guide/control_templates.rst.txt create mode 100644 documentation/Sphinx/build/html/_sources/user_guide/how_to.rst.txt create mode 100644 documentation/Sphinx/build/html/downloads/git_repo.html create mode 100644 documentation/Sphinx/build/html/downloads/history_changes.html create mode 100644 documentation/Sphinx/build/html/downloads/tar_balls.html create mode 100644 documentation/Sphinx/build/html/installation/oper_modes.html create mode 100644 documentation/Sphinx/build/html/installation/requirements.html create mode 100644 documentation/Sphinx/build/html/installation/test_install.html create mode 100644 documentation/Sphinx/build/html/oper_modes.html create mode 100644 documentation/Sphinx/build/html/program_structure/prog_components.html create mode 100644 documentation/Sphinx/build/html/program_structure/prog_flow.html create mode 100644 documentation/Sphinx/build/html/program_structure/prog_overview.html create mode 100644 documentation/Sphinx/build/html/support/faq.html create mode 100644 documentation/Sphinx/build/html/support/known_bugs_issues.html create mode 100644 documentation/Sphinx/build/html/support/mailing_list.html create mode 100644 documentation/Sphinx/build/html/support/ticket_system.html create mode 100644 documentation/Sphinx/build/html/test_install.html create mode 100644 documentation/Sphinx/build/html/user_guide/control_templates.html create mode 100644 documentation/Sphinx/build/html/user_guide/how_to.html create mode 100644 documentation/Sphinx/source/downloads/git_repo.rst create mode 100644 documentation/Sphinx/source/downloads/history_changes.rst create mode 100644 documentation/Sphinx/source/downloads/tar_balls.rst create mode 100644 documentation/Sphinx/source/installation/oper_modes.rst create mode 100644 documentation/Sphinx/source/installation/requirements.rst create mode 100644 documentation/Sphinx/source/installation/test_install.rst create mode 100644 documentation/Sphinx/source/program_structure/prog_components.rst create mode 100644 documentation/Sphinx/source/program_structure/prog_flow.rst create mode 100644 documentation/Sphinx/source/program_structure/prog_overview.rst delete mode 100644 documentation/Sphinx/source/requirements.rst create mode 100644 documentation/Sphinx/source/support/faq.rst create mode 100644 documentation/Sphinx/source/support/known_bugs_issues.rst create mode 100644 documentation/Sphinx/source/support/mailing_list.rst create mode 100644 documentation/Sphinx/source/support/ticket_system.rst create mode 100644 documentation/Sphinx/source/user_guide/control_templates.rst create mode 100644 documentation/Sphinx/source/user_guide/how_to.rst diff --git a/documentation/Sphinx/build/doctrees/api.doctree b/documentation/Sphinx/build/doctrees/api.doctree index dc7c3e7f30bb669af1e0261723b92a4d88ab6bd3..a6ab819e8a5c26d631bec3d23eefc1fdeaa46291 100644 GIT binary patch literal 332947 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 FJpjC8I{yFw literal 31955 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 diff --git a/documentation/Sphinx/build/doctrees/downloads.doctree b/documentation/Sphinx/build/doctrees/downloads.doctree index bfa2114a0d76a0e76d2c56a0699ea49823a53ca3..c2534819559b924ae3ec4efcaf885e5a4e219c3f 100644 GIT binary patch delta 1904 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 N3oq9eUMWq|0{}12+t2_2 delta 1372 zcmX>v)hfPW2Fv6WHn9+Izfj(^{QQ!<{F2o8qSUnFLZ8|~-%yUC)U>?B+|=SizuH3o zP=Vsg+@$=Rc$muK!hqPqz)-=&(vp0b7({naY+>-^b8O=EA+d#_p`6K?C5a`O`FX{K zVX=kb8EP3!p*+c@MMbH3CGk0#d8vgFexX7oMTvREY57ID@wutR#fj;u#f6cvg;5|! z6yz6`q!txM`-O63ro<PQBo>tv#&|P^@*>+@To@Z$7#GS5vkc@C&EmrN+QNiTfy}&= z%%arflK7IuqV&{~;=;t(!lY1+;?$Co%)IpC!sN-l>@w^r`Gu*qg=v#Fu#45FdozX# z7o{fW7p26fq!y&+rKIL1XQmbxX848j<|O8&mnNpC#wX{eq!wm|GNtAfW`%N=6eT97 zCM70k7iM>a@)e{OfZUK;l$w{ET3ndp7s^*$Qj}Q`pPZkYo0?ZrT$t+@%3G4391qfx zlbM%YT$mTinwnQqR9PsPAIejd29hdHjV~?ADJ+;A#vxx{7|NNFSdv;?l9*diSmYPV zQ<Mq{ocNs7vecZyVsEBU;o@9S@Ra74q!!2L<R>TQq!t&J#1@u@^2Dd47MEn^fuo|Z z%rBHHBQd80s<qskHIx_Xyqv`1;?&~83cm~;zfhUfqN4nw_|&}Q{FKbe9-M;4m7xM4 z2N&lg7H1Tt7UU!*rxsR)vZkaam8KU~`-KXm<|d_rqNy?`wKyX+wWP3SvIVDNcx@;f z$b#gO!n#o2;?(4lywcqG3Q&v})_XIC@~4#M7R19-L2+S&Unp-%esX4BT0T@+qc>wH zUwL9tUS?i;d~r!pYGQ6-)8q}DlF`kf90jQbx~c{yDTOVef~ggmC7^UtQd$i4U#mB3 zC|h!VURq{)VH-3il1t*tGK(`y@{0=F{X#{PbMh0j<5P1JGjrk-Q&Ngj!J*JGS%ph6 zr?WGZIW@1Wu*(nX&Vu69(v<x8irk#SZjhHN3i69n<1_P0Qj78ubBYUl{6d95ek?9c zD#<L#Nrn2Lw=<NxIKQ+gITe)fvkUwDLis?^T$GvyODFx4H*yI_P6%Z!ElJb0D4ZC| z1=Rpb1(W<j`7-kgN=u*-l9ygMIg}HuQnxrWy>Ln>e|$=2abi*qC~bm$JJm0gGczT= zpeQvhv!Za?WLa*d`stmaoF$1#@#UE*B^iY?yg5SokfS*-y>MnIYiNj@u0`RjQ1*C; z0}5wnNQUyKr<RnYR+NAeaY15oN#UH1P|oz!ywsvZP&m%@3*`gHBO)Z``GxX;(`0-h zI8heP?+^&(0cDP)L}=PxF!>y}vg|@o0h3pfSP`F*nVyl8nVwNnxG0n*CqFN}aPee5 z9(mm*8Fit2pgbRs@X*pwrp%PWWubg2`N_y3y?k;MkG$9lzfj(INVLbNWrDK8%GknH zlY4n2RaSR|au+3*$EW6jLMx?k4X8i?yB%ICtet#{N19`uH$#SEZQ=UKZ+WD6H`Eqx m%#g}Z%aExp+%#E)S6yUtY~hwrHc;rM6c=u-E!<X`qz3>}{|@c| diff --git a/documentation/Sphinx/build/doctrees/downloads/git_repo.doctree b/documentation/Sphinx/build/doctrees/downloads/git_repo.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8e00af1dd48b3b23f56750f121c979834be3e3ad GIT binary patch literal 2778 zcmZo*N>0g7E-lH-Db~x&Pf0E20&#Ow^Gdi188sUVnQ9A}H9|S_5_3~aDhpDJ3t4Il zStIxu7#PwsOB9My3-XIIOY(~<3)%dNLj{XVlZs0+OG-;J^Yh|UQqzhH*=q|qLiq|3 zi;7d@b5o0p6Vp?R3pry8xkCApON)w9^Gf22^Gl18QwzEMLb*~>lk<xbLAnch{6d8i zOH1<8^7Bjb@=H?Vi%SxVN(y<s8AI7YuE|U(F665%<j-IW<x9^j(M58KKyfHXaz<uO zN>OTFp<ryG5V{wOQ<Fh<a1{z`HWrH17K&<wauy|)LmeU($`Hy{kO*>Hp?C&UC>vB< zA|j80fk8hnvDnZ|za%$V-!U&QRo^qOB(<m@KL_k;{j{9aiqwjdqQvA9FgqT~i7zwP zGt`F#Ektc_K}Kd?g+9b|{gnLjyqx^Rlw$q#%#wJJZ}f_aO9~}J*-H}BK^`uY3T1~n zyihunE3u@cC^M<FB(=CurnXR4Ba|bhv;d^8xKJ)Ols!2ovA8(3xKKVelp`rIIlBlH z849tX%%E^nj4f2k5J(JVg{W7KEmX;1ODqj#$;r%1EmZYp3gv(~wNNdCDMK)}P+bE( z5KA&ka#FbpH8dLwHERpCG&01%$-+IeL?H-~EVMJkGej~ZG9)vkLRrCD3UxAMY72EW zGUQ@2<YO}wVlxzDGn8XXGgQ5qGN88Up<5P`T2aDPsE^GCgVx4E!`eb4jSR62?F<RO z3{^j{G2$7TrAdjUN$5r;<>V)4#}}67m!xtP8f!Kdn$#AWYGjCoG9WpX8%b568OXur zSR4$oNHDh00^O2=#G=IXqQrs>u0l)A#zL#wLTgX}2{AA*g!;L-1}QlE`vr#tg*u0L z`ui2yWQb>&Km&;ruC>q>WUn0-d%ameQDUE=AA!R_ht|eI$J#<CP?&%Ww*rSmVrf!p zX;LD{tD)Q_MTvREY57IDsYQj(exbbZd<IS_F13ZOp&Ui2X^<4+R$J&EDo|XRo0Oju z4^vrO=n-4!87hd9OToImVhg=PMbMPTgQa|83w=X5lQT=ed7!w^FSgJh6kVY_u;Kum z1_S&;h2Snk6dZxEg+U-^733F{q!twh`-O63ra()E5O2m%USziv7ly_bhK2INEQ2^8 zytXhRR3I}iC9^0sxg@?Mu_!&Yq_{9LwlFG`qd2vsBr`9)xG)+ixu+H7=ar=9rErBM z=9H!ua}~zq7sl2W#%Y8K!Ga<ll*Mu~^RkNz<GmR}g^NJtSW0|KYC&pVN@`wmW@>R^ zf?p_aPGVkqX<~Y6d~$wDYGGn1Q)*seQYa^=yhsHZQJCBj%2$wD0CH+-QEFatYH?wT zUnpO3Nl|7&d~$v+s9-KGO!W)pEy+(tvNbJ~H8roKsIo9Ul&2^SBvYIkUs{w?m=P+I zQBqP+Y^ASXlAoVbte2TulBSnml&+sqlAEJnm>J5Ml30>jT#}euP?+Tx$^$BSib~>h zQp-|v3bVbLLWPTSK?N@;zZA#k<R>TQq!t(E#1`g;^2Dd47MEn^fupi8&o7iKBQXc2 zHQ$>xlo#r5XjxR?m!abqDwA4NlwTB|nwOlPl9`tt58-Ac=B4DM78MqT3V;HlI47|< zqbRi?Cows-uqc!@B{iuuy|CCXR3J4sDHRmul{u-!8L6oyg(aP#viYSY1*Ijp%q$IM z134tQq_8ZM7gU7imFC7*fYN?pxi@1de@ba?K|DOQ6&F_ch4QB4CuioR<wKQKdNYRd zl_wVEfgD_1Qk0sQTUg~6Dhi6Kw9FiEP{)^~<`(26mZTO|hjJ987U-%Pn4}cegbJos zWR`%^Xh~@?G+1lBSwq>9^YhX&(+lgM(VJWnUzQ23OAG7$LPe8v@)NV;Q*#qDbK(<I zQi@W+rFla~sBB45W-dGrA`(h`aRDf-8aqRoQ}fCSoBW{uDkx4ZP05e1$jvEi1_fV5 zL4I*+d?u*Y%1g{CE^P4&6#|7xacL5`c!v78wKJ3(QZvPa(sf~*Unn0aVHKsO!4hV> zUnoCXz!!FevX+*l=~@(ahH^o*gHmCaUnpN@9&!{Fc879;Rq7UJrWf{v^2euS7AGd< zfU*WSTzdUNIWtq@3yM<HGAj!ELK#A3lQR-Q6>Dk{BpBl}^FU=qd~RY<c4<Lje`hFX zNn%obd1gvUM&Sf+j!-^G(t@S5!ik}*p&@R%7KM{S*<r1Y$r+NN{OPGBC8-r9pbS=! zm|Rjgr6ZIxJvA@2D6u5JsBo%ZC?7b9AOdZgUnmbaTR`fO;=<`2p**0(kdz3`cQZm2 zVEL}Ryj-uKvLquv51j8(Qp@xUQVWXp3ul6g)Vz|!iujDo^o*R$^o)|iS)nXB`FZJu zvqNQ20}L&n%*iMV<pY&=@rXd08_JZKQaCS^FC{-2IWFgShDw7nKtX(JPAa$ri7(GA z$%u!w5f=D`^2S4wV>~D|7Z)y!4HW~i;xqG#Q;R@trTEl5Q0$}>F6s#7E=nwi^B04P zU2yQg3(qBfrAeWp=*2&z{kGJbAw#jYa9M^xhDdR!5K4m)Qr9f6EnJZym7xZz{8oZ1 tKSfY00oDx5kOZ|Flw(UnIbo%5ap9`i!quT{prn#gT)3vTaBXRl9sr&R0lNSI literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/downloads/history_changes.doctree b/documentation/Sphinx/build/doctrees/downloads/history_changes.doctree new file mode 100644 index 0000000000000000000000000000000000000000..77728270b650974255ba2fab15d7cf018a20c703 GIT binary patch literal 2801 zcmZo*N>0g7E-lH-Db~x&Pf0E20&#Ow^Gdi188sUVnQ9A}H9|S_5_3~aDhpDJ3t4Il zStEoP7#K1#i%as0Di!k66p}L%^U_m`3)%dNLj{XVlZs0+OG-;J^Yh|UQqzhH*=q|q zLiq|3i;7d@b5o0p6G3V@V+*-L`I1YEic<4R;*0Z3i;`0dx&1=9Qc{!iixNS)3wiuP zg%V3k^3(G3OY-tdQsawD5{pU-dA%7!*+DMKOerqpt1aZuU<(z3I!8A@O&8`If#Oh( z<c!Rml%mwULc!QVA#|@6rzV5!;VKl?Y%CP1Efm!V<t$1phdM?qlp&O@AQ9xgLh%fy zP&TNzL_{eA1A~5EVzHr_eo1b!zGGfqs=jAlNor9+eh%2>`e`|-6{!^^MTyBJV0Ju| z6JKVoXQ&SgVu;${f{e_(3Vn#_`YHM4c{%xsDaHCwAH_qxqgPa1QYab9UXqv&@_V6F zC_B{sh0>v1i6tdPnMtK3sl|mdwS}@8p&Tit1t4|Bg>tc>?8!Na#l@+`h4QhX97&1E z*+rmuQHTv?1_hyFY@t$yKw>B>M7?rsp-Ki@VreK#PG(+ep{h4iC<n~Ng=!g08G^Be z>Kf=_S&~_jlgd@7q1jldSzD;3ks$_7B_4=W;tWkC+8N>*A{i1Hk{ME=tYB@0IvFyx zg}NFUa<Limu^9@n8H%wP%CV&xs@_Z)P#g8oEeuJmDB&v9$7PE_Yh$5dZK07yhFFGn zhJ;^+svp=W@eIw<q{PxBbmNk8@{_aU3rq7$Qn?C^H5&^}Y70#@GQ>g|kethnq^i&i z<Y;p&j)qty7+Yw8Zb?C6QDS;gVnGI1p`~VHp;c|6H7uY){ajpw6rBD2f<uBrokKkR z{R(X|#4}8w0mTW|T4)Qh*A9!l-YlS~vCn{n2^Iq#S{n-;YYUw~VFEJT3LFxNrAeu! zNr@n@hH{q_CFT{U<rn3q78N@Ch4R9)9yrCg)E2siaulVeK~joaZJ~RpKyhVmQhrW6 zOl5JQM{J>Is31zl1?%>TE%Xi*K~o+Nmhy=$^bO@q&MX0EiQ+=P*g}6$bcOQ3N(gXT z4DbsTg1Zn=mITHY27#PakY7}iT2vV97s`>D0xc{;yct7zk=;^U7#dp`7Rn2=4B~+B z+QNuXfy}&=%%arflK7IuqV&{~;=;(-!l+P=;?$Co%)IpC!f2#qpH`HgSCX2S!WEX7 zQ<_@LRTz_B7+YHyrx7Xy3yOG9R?ErE%PuaA_ht+gE&>&8De)<(1*v%{sd>qnsl|l} zexbZMiFxUziRr2F$@wX%g^8g|sd<G-p`4)NBNb#sVRA<(UqNaC$f>DCsd>q%#f2$; zp?t+9MVSTh$@#gU^18S%)i0E{BtIF+*0fO8)Vz|S%EI(eo}x66OmS*_X;DsLMyO0i zNl8JmmA-ySetu4|US?`ZnqGcUx_(AUZjOFoW+-P$Vo7RoNn&n6VU}MgPf;o;aN~1Q z%TjX+v%Q%@g^P1RWicqf6vyY}Cnx5l78mBk7UqWX#HXYdmt^LFqp~p1FO(}IF{cEo zHQ$>xlo#r5Xqi;tm!abqDwA4NlwTB|nwOlPl9`tt58-Ac=B4DM78MqT3V;HlI47|< zqbRi?Cows-uqc!@B{iuuy|CCXR3J4sDHRmul{u-!8L6oyg(aP#viYSY1*Ijp%q$IM z134tQq_8ZM7gUtymFC7*fYN?pxi@1de@ba?K|DOQ6&F_ch4QB4CuioR<wKQKdNYRd zl_wVEfgD_1Qk0sQTUg~6Dhi6Kw9FiEP{)^~<`(26mZTO|hjJ987U-%Pn4}cegbJos zWR`%^Xh~@?G;C_USwq>9^YhX&(+lgM(VJWnUzS;%S(0B=Snn4qnw*oLm>r**o0yps zpO}(TlnO4@8#+Q|ONugc;du~|P~wXVKw;I`8OofRS60~M2lZD$acXHwetbo4PGK`B z_$mtWi&Nt>L6uluVoq^ki(jY^C`^h=lfXqZ)W@xzq1=#)Djt-s3)}oc`9KM)C^Ze1 zFx&k?`OyNtup^YUv?NW}qOdcR3#uKI3cLJ5`7-m6qo}YuloPB{w>UGsuqTv1J|(j_ zF)0U>HNfH0>lezInG#=6l$w@VQP>yC5GtFTkqD}1Q;Q(M7@wI3Dl6i16N|D-3kv%? zLpe(llj6%WQ%W)lCwOy&@<EaoETt7r3}p=sanrRZoD|9qYluwFkPPKdPc11)ttbIy zu!6+olENt+p`7Wdd8tK-py-(D7s>}tB8Whn<`>EX&K8h*q_}W;M<@>{F(f5I^WBV4 z1z5f-FE7_Cs4U6I&jaVXl+-f)g4BXy{lb}`A~mlhu_8VrGd&|GGd-iEa8@WwPJUi` z;p|Wu)Br=vCv!5&Lis?YT|6R?=7ut5rWDQ#<x9y=Mvlw*ouSg83{ViCnv)7HLE_6Z zOEThNZG{DXp}g^s<QNZ1&BcWaV?)J2toY2l;?yEg(<weR4-`8og^M~uxr-9Z;rzv* zViz1d@WOM6UujaPD0=Y^Y0@qAX2?*iEnJo%kRehWDumL8gw!?5YYSIoNM)#jD!-NB u%1;s0Qh>F}G9*DQ2j$q(P)=CsTU@v*ws3VQ8z`xy6c?_kEnHigqz3>bXbHdo literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/downloads/tar_balls.doctree b/documentation/Sphinx/build/doctrees/downloads/tar_balls.doctree new file mode 100644 index 0000000000000000000000000000000000000000..75305e3b557580e9b68f29d63fcab7dce0c3758a GIT binary patch literal 2795 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 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/environment.pickle b/documentation/Sphinx/build/doctrees/environment.pickle index 6f806214e8beeb0312bb43c9cf28e9321c973870..f456d33c4d67382e3942142c60e15c9e1b82e56c 100644 GIT binary patch literal 225566 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 bG4?A#DU>rFbQ>(_0?VRRYzz#3rAc}K{)@@V delta 11655 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 diff --git a/documentation/Sphinx/build/doctrees/index.doctree b/documentation/Sphinx/build/doctrees/index.doctree index 18ce44089df298e870f5ecac34e29da21a542746..faccda361bf97b7aea3b5a409fa6963d97d87212 100644 GIT binary patch literal 12705 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 AvH$=8 delta 3543 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 VW&_1dN^wyDSZN?514C(&9sm_9z5xIL diff --git a/documentation/Sphinx/build/doctrees/installation.doctree b/documentation/Sphinx/build/doctrees/installation.doctree index e8ba3f0e7cb621b83ade536750c8557804149ee9..d9af92cca10d1efd2ddf5237c26877518f9699a4 100644 GIT binary patch delta 2156 zcmbOxzD#n%6DEtKoc!eM_`=fsl2oojW6j1wliEU4jSR6+h79oxkqn6p$qcDbZX{KO zW*IWIh31nvS!7f!l2h`NOG`3yiuLmHQ&Nk$3KEMF(~A-dGPnvYH5&`9Y74C=>$6Cw z+GL1lm_QBVgexkv1sP?hks%kGAs?He5SyVGo1q+AnxX2=k|7vdXrG}UA;iGI5bEdR z8l>Rt?-v{r6zUw}>F-zQ(Arq&SX=0%ks+1=GTf>(DRJ_7CQ<+7{M>^4(!3O|LTAm! zLYLY?S9H&Cz?2lafvk6jT3_f9%3qS7TvC*ps#{)^SWu8!ROp#FS%5{f-YdDdAR{xc zLN75T1>#SrLast@&Bj8X+CpELB`#1;vO`rA`ho25*9hgvE6q(xElN!(4De<M<;~1X z&M8ev&B#niNzE$^?9334;9+23$jmD)NzBPfEXmBzD+~%{Pfjc-$*j-MD-8AvWl7J; zPbv)Q1O<{pY$#VrW=T$JaeiJ-WnpM1GzgVrL)laFN{TX5iwnbI3&S=1A|%m_)h|jd zEX^!R%}vcKDK3m?D~$Au5Jy*&Uyxc9p9_l8!l<_T!e}hUl%y7y#6#U%7}Hi5n;Oan z^-f$zC=b+wX_+~x#f9;)g$WuN5gAb#F{z;(xrr4isRbn&g^Auwptxqs5R5HNN-RxE zElo-UrMyt?lA^@C;<Wst+|;7Nq<X(l-n9JulDzzq)cB&*wBo|#+QO7jj-u4Gyu{qp z;=<J0!n9C<;>z5l{G520%HqQG*usoZ!Nk&%e3%$ScV=v1R;UP?a)?xRY++6)XL4o< zI0lLfb7KqhGV0Ybm_m7yON)w9^Gf1#GV@Xk^Zi1F;BJi1O)V}?OiwK?EQl>E1i7mq zzo;a&sIbT{lp`}GzPKc@sHCvin=zCZ*)he1C9#F2p}a8LATB7YEi4Ze$jnR0EJ{r- zi7!bkO7}}GDK4ytEvyXXC{8UY$;?YHF09f(WWBVa{JfIXycDjm#GKO9Vy?pK{KA^r z!di_`A-Knr5|guYGV`*F3+pEHuu0T|!Zar_FTFG|JvBZ#KP9!WA(SaKudp$cv!p07 zITfV7u&E=IuOPJm<gnDD)V$=>;=*RXP`=`lqRfK$<osMn5^C`a<t@oijt6OhSkW5F z3QB~Pg>9icMQI?J;?(%kqMX9^P??O9l7eEZ$&1;<>pMa@QxZYRC^5I7u+uM;rzjN^ zaPc{*WvMxZUEWNg!o|6upaT_7#ql}$$%&xE)E!&c6Uq~xl3HAnnFo%i!d|~nu8hQ- z5~$WbZ`M#=s4H_4i;Gi>3;X>tbo@ePQj3c6i{exBlJiqCCtI=$8czrn0J*z3C$TuA zD77FbF*&txVkm1$YEo%>;UvFMfz;fjR8SOF=A;&9q^6b>PM%!LuIM}^lnrD-a!KLT zP~PIy<dVG7-1rJmiY=Vx%^1p`Qkq*34^JV*h12~)c~kO}GxO5&p~_}Ve#kByJ<~5# z6cogud;$uh_>$Dzf}F&X)WTVz90jQbx~c{yDTT8`1yd_BOF${9q_i07%Q@bxp=`<d zd1;yHg>#|Nl3WsBmRX!xl3!FfZ?Zp!B;)+anH-As3pzuYQ}fCS7y3b6R#2Q;nvx%1 zk(*Pv2;|9%g8bst_{_YL)S|q^oZ`a8exX7jUlo@ofr}Zao0oKkau?^97A2>GvO#v? zQom3>Py`pHroj@(GQUv%{L+$w(h_Je=cN}$E)QibElJb0C|nWB1=SBq4lDga`7-lR zl&%Wp1gq37&P*>{9m*e{l3ARXlmkkmV2`fx3+2pAi7zNhP0Oq(Tst|5Q>lJkXDDY$ zVp4p0W=cs$;d*b5P(I{%&Py-c5Xu@F;-+g+xG|JH9^!z)O&OA*{OPGBC8-r9pu}8| zm|Rl0xg(S_JvA@2C=nEdTl_-#z!8ZEn5}-HJm5qLsWOWTw{-}F@_=G6DG{2;w@()4 zQqJ4~Dv<I@5-Z{}GSf41GSf3k3U`LG<mBh27w!s`LG^Y##Jw4bc_}%mMTNUFriSu? zii&uISNDW6Wu_GF4dqM8PezWCeUs;N$p`ND3+0W6q=k4;QYtPy5F086Vu6b2)FM!Q z5}%p}3dxkhgB_vVMTzBb{vlAw1okJqcsV>-kXu^+h&MxqVr}8k41o-h;!vUD(xl>& w%#u>DVUUvdSZ(3)45<t?P$hR_ax}NP$jR8kQ=x32=t(IqJY8FOrZh<p08n);KmY&$ delta 1794 zcmZ1`IZb@S6Q;?Y%-r?HnvI1fwS}e{8DbIo3=9k|sl~}fnMtV%nR&$}i8(omC7Jno z3I#>^$*IM~3TZj174fMRB}IwJB?@|adU}Os8R8it84?+i8B(E~1&Kw8=|zbJ8HMH< zGPQ*k8X0o28S=3i3b7fAu^Gy-r5UQ;EE#GUOc{c)g_arm5&C|lS^218nO>n)Yh$5x zZJ~`uhFFGKhJ;^+svp=)@eGs6=b4l^Y&9DT?P?3{C;w!UWpe;I#Bs6=vkb3O2FSC{ zwS_Jk8Df(+FiYsTW{79lK^&g}cCi~a7qfv}>ppoMvsArDYh$5jZJ`&)YLI5<(xgN% zN-a%F%n%D@2<0v*O3W)x%P-1JEh_Z(3*}AA&o9Z#FG-CrN=+*+^r<cM4dp0GP0LHn zO)W0;t1a{o6)3LEP0G)Shp8+s42UfZ3>8c)Ey;(8L3Gy##TEvKilC{7$c4lfhK6z` zXO@6tthg{NwlEwNETKHfrA0-lc_r~VnR%&&5q_aUa3{v+rWO|`rl%GcM#dIKf!tM) zUsRG>R2c0S%8{88UtE${R8kn@%^1oHc8ns_FU5tiv4wG=yfE7!E{Lx!OqhI-P1q|j zwlFD_qd2vsBr`9)xG-5GIVC^2v?Md9STC(8Kd&S;FNG^CF{d=On5!@)zc977Fij&= z2=3LS#N_Op%)IR4!t}{<>=N}EexbZMiFxUziRr2F$@wX%g_)sDsd<H2p`4(Em<m!~ znB5V|SCCo&a!G1YYF=_`abb>MC|_|&QD#AWa(-@ZYF<fkVXj{&Z%KY~JV*<~io8(P z)Vz|S%EJ6mo}x66OmS*_X;DsLL8wedNl8Jm)#R=0;`N20oGFPVsl_FUxdnwqexW=? zsi2^W&q*yy%_%JQW(pN9&IJWlX?{s+aePjGa$-(uabZbpVQDB&d`fC@NoF26VhYRr zLb);$b4s9E%e`4cd7-Y%Nh~f-EiSC^%h2%)l}Rls$}fsf%}dTt$(-!XA!u9~DgbhK zaZX}!Mp0@(PGWLuVO1z=N@`MRdSSI+s6c9NQYt9YDsxhcGg4Da3Tr0!b12r=hO&Vy zNG>U?3*{|NO)kkR&5f@BCDFoqZ^lsml+xUSczBv9E^P1%<xR;?&df{8hbn9IW(?&k zPb|vI%uA0iE-6Y)%q?v43l#+gcv@x-IKbjdQgaJ(5=&AGn?pGYQVVod4NOuBTS5hm zQY$h`KuM{jv>58?R&Ul&w&eW0w9NFvHfSs*m&BK47H5{^7ZtWoPUMti?3i55sc6*M z8OofRS60~N2X$ycacXHwetbo4PGL95&lLsv#i{X`c_pbud5Jm2g*}tcaf;RVc7}2n z=a&{Gr-G7wc441iC?6<#i&E2I$)n#dls~_;q@c6}8pwI+g%d(qOH0ypEea=wazV9& z(!wOaP`=DO6qS=hIl(G*i!;*;r-bsyr(_l<Cgp$<XkJ>TV0z(HzfjK1l=y<8)U?cs z!fBIBxRmOrcZPD7Bqqg|XQq^76wdJG2<1bL<-GL5nW3zqA#S=Bg|kB0;~_36oSh*V z%AcNEQj%Ix0!qpSiOD5}b2>sf(^K<OixNR0HrFqd4;+n%aG2*8$^%Z4@rB?tSvbE# zAe09bV@Zk7B)(v>Dz~!iLQnyeSCUu}pOKlKk&~I8QBt@llqDxWFTHT_<Wz2X-6a`y zp?shMARghNrJ+ojDTT{I`BL(eOEODxQlUv@`Q(k<^1&<oLV4pM5gZRnAjO3%V+&V> zih<binR&&jMWAXWJ~a;%WGRKKJ3_gO63gNIHJ}m)>>qd`vUai}kF@?eZ-xxT+QRi2 z0vRI3p+d!_NyR0ZC8c1)ASLRC+QN+)QW<KXVt>=*Y#w!y&9Q}BLfJskkWyT@wYG3u HX_6iQEQg-~ diff --git a/documentation/Sphinx/build/doctrees/installation/oper_modes.doctree b/documentation/Sphinx/build/doctrees/installation/oper_modes.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1b60bb5105375b4fd4f14858370319dac8b82b8c GIT binary patch literal 2789 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 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/installation/requirements.doctree b/documentation/Sphinx/build/doctrees/installation/requirements.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ea7c8222f7136d787cb06d37a52e9072a40cb346 GIT binary patch literal 2779 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 b{4FkA9b332lns<vQi==L))uZSP0|AZRel4X literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/installation/test_install.doctree b/documentation/Sphinx/build/doctrees/installation/test_install.doctree new file mode 100644 index 0000000000000000000000000000000000000000..658f4ccf63cdb189e6f48494f7770880b70451ac GIT binary patch literal 2799 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 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/oper_modes.doctree b/documentation/Sphinx/build/doctrees/oper_modes.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1f2c6d8345d631b9a6e05cce2a2bda700b6475a9 GIT binary patch literal 2776 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 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/program_structure.doctree b/documentation/Sphinx/build/doctrees/program_structure.doctree index c6018d583075bef2701a0d001185209e6fde9c4f..9206c2d1b97a05cb7d134f5f2c1242cbe8867eee 100644 GIT binary patch delta 1930 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 WTX-py4HUL1#f6t^3$K(W=>Y(gMdi5w delta 1346 zcmeB^o-e*(6U*eqY+@naexbZ+`S~Sz`6a3GMX71Ug+8@~zM&jNscCtMxv9m4ezk@E zp#sH~xk>ps@i3Leg#odJfuVwlr6u_=F^KM<*uvn+yzJujA+d#_p`6K?C5a`O`FX{K zVX=kb8EP3!p*+c@MMbH3CGk0#d8vgFexX7oMTvREY57ID@wutR#fj;u#f6cvg;5|! z6yz6`q!txM`-O63ro<PQBo>tv#&|P^@*>+@To@Z$7#GS5vkc@C&EmrN+QNiTfy}&= z%%arflK7IuqV&{~;=;t(!lY1+;?$Co%)IpC!sN+k*k#yL@(WXI3)3dQXBVqa_ht+g zE=o<#FG`6|Ni9gtOG(X3&P**X%<v24%}LBlFHKBOjZe-`NiEC_WlGH}%nIc!DN0OE zO-fA8F3j!-<ts=n0J$NxC^auRwYV_HFO;viq$sl>J~=-(H#M)MxG>i*l(!^5IUb}X zCo?a*xG*o2H8roKsIpKnKa{5^4J1{Z8edwJQ&=#0Du;Y-VJK%xVo7RoNn&n6VUb@b zPf;o;aN=`P%TjX+i@ljbg^P1R!Bd)Fl3E;}lb@WJlUiI@5?fdr$`hZGT3nKu2abxu zGQUu+jKrK0sMd0C)=*xk^Kuf4i&KjWD<&&)DqB{D3V@tfoRe6bQIuMclbD=ZSQW~e zlA2VSURdoHDv+9+lnRQJ%AC~VjMUVU!kW%d+5FOy$$>o5;kBV`AVZT&3hP37i&K+J z@=9~#D?qVaSntgk%AZo2TM!SA`QpL`zfj(k{N&8Mw0x+tMsLPYzVgJPyv)4x_~MeH z)WqDvrpfO)C8L`|ISNt>bX5&ZQVLr_1yd_BOF(I(q_i07r&e#)P`2d!ytK^p!Zv8= zCzr&RWfo_a<QEmT`-O@o=j115$EW5dX6D2vrlb_5f_>gGIhjjQwzD&oIW@1Wu*(nX z&Vu69(v<x8irk#S?#T<eMCyC|LWMw{DlSbb$t=l9g*v&nGnBhHzqBYh6_mQO3;X;+ z`9N`5l$r)h4E=tg{Q0FN1*IkNsd>ryDVcfcg%d(qOH0ypEea=wazV9&B7TxzC|_nC zipt5MoFJ7N7P`fm>4j55`QuYEixZP_K<N?e+o^t`oS7-{1x2Z8nH7c8CdY6q)lcsX z<t#}|iZ9PhDak0D;mr}sms(VmUxaYL%uv?Q5I0?m!dap0@emgj&d!hw<xfv7DM_s; z0VUjm#N?8~IUS*#>8W|CMTwwroa-0L2ad<gypq(Syu_U1!g+q7Jm7Q~UkFZ!h4VWE zLU}+LA}JA?o)=8!<xyr_IN6X#m~&AmOHO`Xdg0>9zC7}}OET(0`9L{49^r+hp-h=6 zh08+uQu33LgL?VonLP4hEBr!v;~^0ppOy(q@GD~rS4}>{BdM~wBb2)+u{=IC4-`Hr zg=;{?2H3UmyuWrbC$BWeI&X#y#oEI4lXZBdcsJA*Zp@I%P|J|1E!;FYm{(n7b8O+3 TP&QC_rW6-$tu5SEnxqE+rr84m diff --git a/documentation/Sphinx/build/doctrees/program_structure/prog_components.doctree b/documentation/Sphinx/build/doctrees/program_structure/prog_components.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d28766d2a5877e43018c0a079526bf81ea2ccc8d GIT binary patch literal 2809 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 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/program_structure/prog_flow.doctree b/documentation/Sphinx/build/doctrees/program_structure/prog_flow.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3b2f49c3efa2ccb34e50fcc51d5a41b250e1ea02 GIT binary patch literal 2781 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 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/program_structure/prog_overview.doctree b/documentation/Sphinx/build/doctrees/program_structure/prog_overview.doctree new file mode 100644 index 0000000000000000000000000000000000000000..dd8eba5101bd28bac02e23431d101ba955f890ac GIT binary patch literal 2799 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 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/requirements.doctree b/documentation/Sphinx/build/doctrees/requirements.doctree index 59873b35a583985ab7b5b58c9e51482f608103ab..437a3955fd4309ad22ec2721d29b924604ab5918 100644 GIT binary patch delta 1517 zcmbOueol156Q;@6nRz*kH5&^}Y70##zhRbTGs}>vEi|9Z&myC4k(`pBTw0QuQ>>Sl zpORY4RghSem|m1vkik`Gso7X)Ra<DSks&s@jzz-UCPO^KBts%YGD9kq6Rxh%7G#>8 zMuuE$hJ0*>LTrX&Y=&}dX@;sdYldKKq5b3<7AZl8*2Y4|+CnFd46zK5IaZUGv&h*v z`-SqR<>!~=<(H(!7p0~Z7rN9Ix`uKTrKaU2=B5@Gy44oChYA!|<|gIm#KTk;7kb1N zdQN6!6{+`%E%Xi*L6e7=<P%%y8_JoSS&~?inV(l&=oee)pP`n)6v~raT2z#pR}!C- znU`7^;1?=XQk0lioR(jd8=sq6T%4GmT3i?yTNng#M?rp3NorAHuwN)gW=ec<Nn%k+ zVTd<lC~snENq(9O)a}KEp|OQwp}a8LAT9{6EsO{i$jnR0EJ{r-i7!bkN>42*E{u#V zj0)u_PAw_P%u6pWjGlahRi-{Bzc9A8Fis;>2<FT9q{QUxoXouJ;=*`u#!%s+)a3l4 zl=zg?g4Dc})V$=()Z)Sfzfj(s#Ju#<#Prno<ouM>!o*Of)V#u^P|lK~#N<?v5rxSe zp?n3Y1t2%27NzDTrxq8c_=WNnmlS0d#3$$H=BDPA=oJ^H`i1hA<R>Fpn-<ENnpaX( zS(qNmQ<MghDNc<qEy^j(n7oipUOqFFGbOPkwYVfPx1cb~FO;V!6%<<WIjLo-IfdDi z@3Tpm<-``|hVsOxq!yQC=7A%kFwZZPD<d(d1gb9In>Cad>Xw|u;^Nfe!h*@V?8=OV zlLOg>Rf|GdQ&N*k(+i9JLIqNDlTtyEP??ijoROMZQdrU%Dw|(gGC7t@TBbCV4P;Dm zNnu$iZ*gjJNnUAgd<7_03(F@TU>8xZ@C)Tl$xqJAOUs9fS9&vs@|7nR<z?oj#}}6r zr6%SUR!#oRF3DRR%2AM7psQ+Nl2TYRS&>7;s@9t|lr1?wFD)~@unro0$tCe+nZ=nU z`9+2GexahtIr)j%@u|6qnK|)^DJey%VBa)M&gW39Z|n?ZPR%PTZ1M}`PbtkUh%YEk zEltUfugJ|QYzBF)q9DIGH9j-1B(*3nF{ik&#V=F{<cs3cq>{{%oK&cjTRTI!i}Op1 zl2bv+H@mRSFO&}yH$|ywu*hxq3+2x*Eh#81iBHW-&QHnAOD~M<2xToTNz=6`><s0C z>IcPSmtQDfW*&;t?odv!O5Nhj^unG{{`i#4;>4sJQ2GLUzSl35GczT=peQvhv!bwX zat5c8d4FdpXGvmGe0gR{Nk-uWZ;nvD)S{yNB7_4bhO&l+xanFHP6}m@hd7{c^5lb@ zA}&)pLOIh@^HPfvLE$*nFO&})K8TQ*<`>FSoSRrw5?@%FUy@o}IK3m32b7?b5~1mF z#$-t@W!agaf+DXZu_8VrGd&|GGd-iEa8@WwPJUi`;q1wgT=KeeGRi{vKp8h4;eolK zOqnT#^FsMj@{^GRdj904T=Mk`{6cx-A+a8xmYI`UT(~f{a8aljh#jAqSDab|DqP}I z^FSe#Qn<Jyl)EUg9L`??Dk;F;foJ!nex*sFqUa?Sq+nU*&5)s3Tev(!AVZ`$RH(Rg tvNN|J?~2;Ol^IeQYM^3v)#OBOb&=Jvg=<3DKoO8qT)4Kja9wGV9snYvIUN81 delta 1733 zcmX>nI!AoN6Q;?Y%-r?HnvI1fwS}e{8DbGe3=9k|sl~}fnMtV%B^jv-MX80QnMJ9& zsd**E3MKgprNyZVX*sDC@u?LhMTyBJ3VM2adWB{g;u#_t5*d;iQlXp$iA9O&MTrF& zh2|MDwS^WM8FH~1^065Tu^Ec78OpJx8LHka8EP3!8G^BemKh=XWZ3$sVVPc`Rcm9R zb#0-IMuu31S%!pPhN>UfSn&*#$>*7rIBYc=3+-wP?I-_al4WxMxy5m^46_WcQwGS( z&b5Uu8X01fH!w@+xMqlF*g@Q%0d}+-Hb=989PB=M9kZ06M{8rDXKkSu$ZC*g=gBvj z<?6ltLV45j^GovbOH$*DQqzhHeQFDRLph34)AAB?Q;Q4zY76~C1&S+klk#)oVJeFY z17ZsULj@B{OY&i25Zytsg~6dBXv!f{A+d#_p`6K?C5a`O`FX{KVX=kb^&sDe@+6lQ z6{Y5t#OGw@r4~l`g$k7vCFT{U<rn3~=cX1HC#I(s7e>YwMuFT_kY7}iT2vVA7s`>D z5?@@BSX5FN<INb#i|m-<!r0itxKLi0Z4ej4*A^y(3S{P`WEQ0+m&BJO7Kx^(mJ}Bz z#ug@paulbQlw{_m7Z)Z^=3<qpPsuM#tu0K`2o-|+Fex!PJ0~+QySOmjn=w?lC^b31 zC?!56wIDSwB{eTOGqt!d!!MLKCowO*G%-CjJ~=-nwJ<Z3DK)P!E0hzI_)<Ye6lQmX z@)e{OfE<-tl$w{ET3ndp7s^*$Qj}Q`pPZiyO1e44g}HvAye0X`@gO}AYx6=`Q}arS zDhu;Nd5Y3NGR3L!rA0Y~1)(w-B_##LR{HuS`T04;dYP#uX?poZ>G~NZxjFiUg`u1& zi6yDUC5gEOg++d$JVmLXaE#AMElbTQES@aLCSg_*TUZ*(6Q7b=T#}gwj-$ddzfi7> z#GDeSx^i#UP+q7ja}tY-Q;Q2LCdacW%T<O7fE-zzlUSTllv<FJn4DTz70Q~DnpB!z zSUq_Gn+SVNXQ*s`Y02b%PU-O4P&SY$$t8t#p}fVZ$t8KEx$zaC=q{}HW(?&|Da|d2 zhbMvJ!Un%k-jw|0%)GRGsIo?H#!$ZU#G<^+y!80ulA_ea+`^{Gy6lqC&7m9xsRg>K z1|}(mEun&`6`3WVL{d^(4E02-H)|+ca(-S~W_n>8G}Mzz;>$9NGfVP|3fuicMU!*# z6SLz}a}zUj;uBL+ic-N|?U=lfU9rBiGn6?sudJ}k59-c>;?&ZV{P>F8oWgFuP=VBn zg8bst_{_YL)S|q^oZ`YBzfd8NAB#(qN-|4wQlUQR?F{8E&Mz%WP6eg<?7}|3P(DzU z7Nw@a(nP;sD1UxwNkM5zd}>~DeoAIudST>*P}b6tG+m3riJ@Fj{h$Oe$uE>IGY>`S z<WNqqO5Nhj^uj5j{P8K7#feEdpkxX5{8YbC&dikff}+&4%!<NklV@=#)lcsX<t#}| ziZ9PhDak0D;mr}sms(VmUxaYL%uv?Q5I0?m!dap0@el_T&d!hw<xfv7DM_s;0j1x9 z#N?8~IUS*#>8W|CMTwwbo$D9M2aZ-mz|8Xt<tffhEGmgFEX^-TEiRnjArQ&~$`?tA z&}6+}vNxx)>_SlalUI^h5ucHno{^K8o>5Y`D3m29KQFy-@#Jn!dEF%$b)kHq{2!0- z(9%$*%#^}qp?oR%$;bh}eDZZpd9f9Kp}g^sR1lw*nUh*vxH7hI)npznNtM+dq1;7@ z<?*R`pwLPwTmvdxz;1_^5NjuUa!GTn^Jd6UtSwwWIfqM%cSCLA#tf+pHBgzoY4T() Zb&<`ng<C?|K%tvbT)4Hia9e4T9soHYg(v_3 diff --git a/documentation/Sphinx/build/doctrees/support.doctree b/documentation/Sphinx/build/doctrees/support.doctree index 900f38b72936b51047cc68a75f79ab28e62fb7a0..ac592db9a73ffca813ae6fb12a9c8b28e493111a 100644 GIT binary patch delta 2139 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 delta 1806 zcmbO!c~fk|X{N~r%-r?HnvI1fwS}e{8DbH#3=9k|sl~}fnMtV%#ia!W`9&oP`2{7J z`FX_(dU|?#g=QJz86p`H8Il=Np_~PYMTzM}i3J&j<{2`zg%%naa<Limu^9@n8H%wP z%CV&xs@^OaY8gx!g0Y2`8T#1F*FsqEs9~92p;c>Rp>=JcjYfu8hFOM$Uxun5*aYzm zlgZndlsIfP8w>4f3+*RAV3MtO09osZ#af6S!Pr8l43PhvYYSaK{u5$gU<mbdaSc*% z_V)`82?})%@$~mAbj=XYu!DFi1MCwwEJk{>fqdbfp&tP^MG4gykJiRQ&)PySkkdg% zI+rFTPF~3>ZR711%A1y-Uy_$!k{Vx>npRxsQ(Nd8%2AY>mY0~DT3qN?Tj(DuP+Xat zl%Eq1Q(0UX5L*~HiA|(FD7G*-R0K^LVo*qIVQ464a%M>)IFbs(Vhh7T;T6i0Tv}9= znpYB^lbM%V7~vNxR8o|fSDcn#lpCL$T3no%o?2WO8Cw_yat0`#Q;Q0t{X#i1Q{szD z5{pU-W4swdc@s-Z^3&>}PA@KujV+7|<%QV>aY1}-VM3@tW?o8WQEGBYd`V(adTL2= zVPb4yQYc4pYDr0EUV3q1vPN=BesXC^W=^qQT2X#pNormSS6E_BX=*W7VM=~sYHeYf zMyL?X@9{~A$=NxXdD+E<>E4rt*v0EJ{6cwi67$ka6Vp@Ulk-zj3o}ERQu7M4LODx{ z5|dLw8Va*JLiq|(3qTG_ElSNxPAx9X@eAcEE-A_^h)>SX%}vcKDK5<Q3*{}zPe!sM zFO)SkucWB5Fh7*1C=Dc2oEl$Rlv7v`Dw9!CQc!F)c?G+;d|@bON@7WBaY<rsL1B?! zC{Ix;DCFXEQp-|v3X3P-W0x>1i7hM*<%v&8EiTE-14l|>nO`VZMq*A0R9(3@YbY<& zNjZtd#i_-G6_a&1lr1Ym1wg(i&PgoJC`v8JNlZ>HtO{jKNlhwEFRb<p6-doZN(Dtv zWlm~wMrvwFVNGYKY<_9U<QQ)0`r1%7kfF&Xg>|94#i_|9d8N7W6`=SotoLRN<xeTi zEr^Gwf#Sjjzfj(k{N&8Mw0x+tMsLPYzVgJPyv)4x_~MeH)WqDvCcjWoP>7~w=72*a zz9cobASbaTwXivqqad|FSJl8IrLZMbaIzAokX5TUYbaZCeqLH;dSM$h;FC+@%QA~I zOY(~f+x<dClXLPDv*S~96Ekz-6H`)(Qo#YxF*%P@(WtXClsPr8tgy=u>fD0j)Y6pv z_=?<|!fufND+=<9Q{yx9N>YpR5_5_RdnO;`6szy;4COA)FD*(=1ts?E!al!HK2R(c zrKZ7BLBC%pe|~96L1{^RYF=`FN@iYq;e=4u(vmb?i^7SaTu|+xD4*mP%9ojkqH=O5 zCs?I!ab|kqlu-Wol+5D9q#RH>%uCA@OfQ`37s{EL5?@f1nwD8nIBjw|my-GP&QQ*h z#H9H0%#@Oh!WrHip?s-DMfpVt2h0p*4GnSAwJ4kw${r7KLE-Gl2e?FB=5&N|rl;nm z7A1m$ZLVJ^A2{|99-rqI%2S-1SX2^USejpwT3k54Ba{aePf3Z;l)GTE1h=y6LQtua zSCUu}pOKlKk&~I8QBt@llqDxWFTHT_<Opv0`Xw24p?sih9*^+A(om+%l)`19d@1?K zC7C5Tsn7(nyfai9l*S6;Q*%<mc`3d;vm_%v8Jdh&_=WPuL!v((lwgVrSH>2u3Kavf z<1_P$Q;R@_RD5b4DDYAWS9gSRXB8!u!v)rWiX5;{;pN6!ztW^oQS_n@QbMisX2?*i zEnJ@=kRehWDpXvWR9uo-QVO;MQm$^OE!>zPm7xZzCN@ou<53sc99y_0lnoS5DaD0b LYYVrPCg}kHxtW~s diff --git a/documentation/Sphinx/build/doctrees/support/faq.doctree b/documentation/Sphinx/build/doctrees/support/faq.doctree new file mode 100644 index 0000000000000000000000000000000000000000..20aab8e428ec2eba9759338d7fbfeaee359ca462 GIT binary patch literal 2841 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 Ln%cs(rAc}KOO+S| literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/support/known_bugs_issues.doctree b/documentation/Sphinx/build/doctrees/support/known_bugs_issues.doctree new file mode 100644 index 0000000000000000000000000000000000000000..aa1c40730eb0ec829ebe48c7aedd0c866f18bde4 GIT binary patch literal 2813 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 KTe!9~Ne=*DLJkc8 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/support/mailing_list.doctree b/documentation/Sphinx/build/doctrees/support/mailing_list.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8ebbb3dc87f42a0131c0fc401a07ca2f5f2a1501 GIT binary patch literal 2776 zcmZo*N>0g7E-lH-Db~x&Pf0E20&#Ow^Gdi188sUVnQ9A}H9|S_5_3~aDhpDJ3t4Il zStEEE7#MOBGjlTY(iL(ti%W_N+5Cz_1&d3Qic2y}N=q{H^Wsxd(~1k(YYRC-`3e$? zic{lrQ;Ule(^HEJIb#dCLiv(Qi;7b7O5%(2ON)|I3%UJ5xl&S-^NSKex(j*yLWL4b zOY+n5^GovbOH$*DOA?Dp3VFR5L)k%&$xJCO<f|>@&tMDXg}Ou+;u3-4P>$q`%$$^> z)VxB$*g_$64;H5;gRI~x6xM7k6sau~)d=M*N-T%ELoAdbl&v5U<g`NZ45m;vsJKK# z0RsbreqLg+p_zV3ZnC~(US6ucXI@EaQ9*tV*wOlFIjI$?6(vQ9$t7TRJd_h(X0B(b z4+~g`+TenW%)APHi0S&pr3D4~MJ4)Buf&7AqE}R0QYab9UXqv&@^PV5C_B{Yh0>v1 zi6tdPnMtK3sl|mdwS}@8p&Tit1t4|Bg>tc>?8!Na#l@+`h4QhX97&1E*+rn(P>2m> z1_hjAY@t$yKw>B>M7?rsp-Ki@VreK#PG(+ep{h4iC<n~3g=!g08G^Be>Kf?5Sdv+i zlgd@7q1jldSzD;3ks$_77QWDA;R8+<+8N>*A{i1Hk{ME=tY965IvFyxg}NFUa<Lim zu^9@n8H%wP%CV&xs@_Z)P|Nht?Fvb)DB&v9$6|p&Yh$5dZK07yhFFGnhJ;^+svp=C z@eIw<q{PxBbd!>D@{_aU3rq7$Qn?C^H5&^}Y70#@GQ>g|kX*`*q^i&i<X&?u?uA$+ z7+Yw8Zb?C6QDS;gVnGI1p`~VHp;c|6H7Iz57#J8r{ajpw6rBD2f<uBrokKkR{R(X| z#4}8wVZ;g7T4)Qh*A9!l-YlR9vCq(tz+s?6Yh$5fZJ`q=OhATPfkPs(G%2+-DG}t= zQ0|hV#Ju9P{G!~{qC#iCP+oX81E&+0+CtY*j-u2wNcwQAEp!hRD6Y&+%Fl_1sVpw^ zh%NLC6-3FTVBKD^h2EheXv*WkQa-VTzM-7SnI+&nP+aI2Tj&ppu23FWX#h@v0e+!E za2F!VjlkH#Ads^_IVH8IFxW4YBQphBFobwBhVml2rMNIOwlFM|7iJm60pYcU5upN^ zc`2DismUerC5c7psU^jQk+FqQp&Z4jB_)}8>BWW7NQphIC_k?xH7|uLEHS4vwV10g zCciMYwlGd3R0tLn@t_QrlbM%YTo~`o7%E%@D#lXcQ&J03^HNgtk~33_3lsc8d2<r; z(n}N5Q{$8KQ&I~PLzz<Z3X?)PLFGj%$cVz^j!?dW)B=!GQ;Smbl2eNdQ~W~tic5+z z3*wXWb3w&&abc=oC~rxAGLo%np{%KSB}J8m>7hJDX&{;6)cDe(oWhJynT(Q>f?_Lu z{gV9roMOGq)RHv4{GxRIjFQ|O{ld&p&XmNG)Z&uF+=9X^zfhi{R8Zi?=cJaU<`iao zGldEl=Yq;zP<|<n&&f|t%t<XS%!w_`4dsbXNi8nP%mYVdVV++oS4Lt^2~=yoH)|*_ z)ZNgMsK75n$1hYSwWuh+C_XhWIX@*cFFhW@%}C5k$w@6LEDRL@1w?U9VsS=MYC%q7 za%y2wC~Hb;QfYc&v0tb_YHm_0D9S5yQj0TEQ%ed<IzwgiOG^q$OK_Q48p;N8NODPG zStu{40L?4SjjsTu{lao@#!&v0(%gc0cxo#ytndrvP03Hr%uCCMDy#Hn4CO0NEXo5p zxVWS!H8Hoa$}dzD6jf=NIpCm<FG<ZU$Vn_oEvydZC`c{PRW&e4DXa+<Os&W)0j1HB z(qd@X)OxdqvL)x|rDdiU)<L5;xg@?UvpBOPzo@X@FH|%+CqFSeJ~cNnGbcVVC8a18 zT$VR<gvyo_W#+>3AR?i}7Z-rSs<AVaIW@1Wu*nbVuY%&#(v<x8irk#SW>D}|6yz7D z#%F?Rt-QpX;=&fcP$5v56qhD}OJ}H$TRTI!AvIGxC|wt}`GxX<5>`=a8Z2S9`-SqO z1$<#gC~Ij+nyy7*XDAm`J17-)`GxXj<{?K>VRtAeSfy@pW_n>yD1UrPW^rOt4k&AY z!==|Rlru9WzMv>IEwiGqFO(rvHaQ~^RI#QOL4q+pGY?c&#OEd!WtSEd_IHMImLw*{ zmuIGwWE4*D<_P73BrRA<E1Ve08XDrJYf(5UlpWUSn4BRQ%AcNEQj%Ix0?J?oiOD5} zQ#wL9(^K<OixNT6G1V`W51d30fi}%Aln0zGAoWOb;q;DB9#CRPN`&US8KDZWd{<sx zu2)c5l98VW&UY!PW%>oF1;zS>GeJdaUP)p_d`4z^MowmWMoHnUP?nthy!67^p)#le zhL%s}WR!*Sfl9l0L?F!#Wy(w`oEOTMlAnwmm-9PAr9l~>AU-uG6<mVEmuHq_#KT$$ z3;aTP;~~j09+aAk3m3+Qih)@1nR&&jMWD7)d}<yjc2Wu#b%b&kC6>eai$TRMIC$WN z=Multq)<`x;vdp{Tk6e_p;%kEEJGkeq&QRvrM(ELYnIm*uE>zePy<zdE5VhYBB+r7 oYldY=f*K9Vv8AD$u+q1<a8+#K>QFXNQb{Q;TvJ=Pwlql(0OZvGUH||9 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/support/ticket_system.doctree b/documentation/Sphinx/build/doctrees/support/ticket_system.doctree new file mode 100644 index 0000000000000000000000000000000000000000..01cb562d058181904b0511115955ce85481d89e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/test_install.doctree b/documentation/Sphinx/build/doctrees/test_install.doctree new file mode 100644 index 0000000000000000000000000000000000000000..53cfc2f1d0c9eb7c0ec3bd7654d7fbeb94422486 GIT binary patch literal 2784 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 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/user_guide.doctree b/documentation/Sphinx/build/doctrees/user_guide.doctree index c54f5fbe4a7508429aa13ab327024d415e858863..a065e8ff0ef271aece7527c3edb6aed35e745547 100644 GIT binary patch delta 1952 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 delta 1734 zcmew;@lI^REvCu#%-r?HnvI1fwS}e{8DbF%3=9k|sl~}fnMtV%rNx<f=?ZB%sTJ|5 z6(vQ9$t4PUdU|?=W*OocA{i1Hk{ME=oCS$RiRnd&1sR3r88Wqn78)6Hu^IBQ849r( zim@5Wv85TR-Ygkv8B7_1v4xfy`WRLipxg1NVVPc`Rcm9Rb#0-IMuu31S%!pPhN>Uf z5b+F?$w!%#IBYc=3+-wP?I*uylC5_D+3bkLW{4ia*g~fakT0EU3td3I6k=dt2=#Mu z4N`FS_X`dQ3Uv<g^!F=t%@EJ9gZL{0>=`#KMtZY>JmQ|A9|1Q-3Dp>n*2Y55+Cndo z(?Lc$mnJ1nZe*2K_4W(pP0P<O$;&TEjW0?~D=ze@E%XiLC`wJsOUz9zF7&G{^q+i? zRahn<wlFYMFtM~GA60!&Y+>-^53J%EA+d#_p`6K?C5a`O`FX{KVX=kbpzsOhNiHoa zO3f>Y&&kY7EsU6~&nA`?8Cw_yvZWxus3f(hFxoGaBQqtwxFoTtq%g*tF_ahCqT<5X z*uuC_UYOYshsM_yCWH!P=A~p7r6!lemn0UYr<N2KCdL*fg>n?9mXu`Xr56__PhQU^ zQ=gJwm|9zyrV%OxcYIP}a&}H;UUqR|x;JB}a8YV<eo;z%N@_uBUP@|Sa%O6AVTNBQ zZ%$%fdTC;MYJ75jN@`(dC{t=)VOA(7DCwnwj3~_R2<0nCEdaSGwJ0?&IkmVj$1jwx zxTGkvAU-)iH#aq}M6b9o*DsW}BtJPGqz7VcUMOp7UP)19VSXr2Q5s05I5obsD5tPs zas|75ePJkPN@7WBaY<rsL1B?!C{Ix;D6rylQp-|v3X8p&LWPTSLBUm;Uy@oJpOc@Q zn3GyuSQ1-U8p;!&l3HAnnFo%E!ZN>5u8hQ-5~$X4Z`M#=sPl3Xi;Gi>3oHCGbo@eP zQj3c6i{exBlJiqCCyQ|i8dru2fZSW0lUSTllv<FJn4DTz70Q~DnpB!zSnU@okeZv6 z3W~PMoYdls)YOu~n#oZdiuJXjY#<AgOA6~kd5cq%OY%x{<15ngi*gI=y%|IKQ%Z9S z;!BDW^NK-Y#f1%ip}Z;i$(ea+`A}tz-i)Dq<%vaknR)5)#U(|liMfSMexahEkWS0Y z0S8okNosCEPGU)FVRI-)L27}ns)0#LVN0l>QEEkI2`Dj@lomrh-RjL6%9fm;mzJ4c z*anTB<dXQZ%;L<F{G!74$vT{pj2)BRI2G$VJ42aM^U4al{GbjkC{8U+$&atd%_-~# z`MIJXzc@8MGp{7IC@(RmxUk1BR0!nB;?ks&%#xf`s26%WL%ECdON)|IK?y&*u+J}) z4;0TuscEo;((f0_pI=&1P+9^F^}O`L$O)mWr6p;)7KIZ-xuE(%sbZ2}C|_nCiqgrU zoM4r@#hK}aQ$qRUQ!<MalX5_573|TeexaP1De(nGscD%Nh0`Y6b1BtN?+oQENlc0_ z&rB)FD4gNV5z2=g?Rn{iGecQJL)>&N3TK6~$3q-YI6Ff!ls`SSq$IVX1eB-?5|c{` z=X8W}rl;nm7A1m$aIRk{A2?nS0W;4pln0zf;|sxwv~YfhKqwC=3X>9{X??-u4_wN! z3qu8pEAvVcE8;UU(=&21(=$p67lpFq<maUqE}m?_Ew8&Iqb`&WR3^kDJhU{FDKn*T zStwshell{vFP~h)EibmhFO)YP665ip6jNNdGPZEl<n`Q=Dyus}xr-9Z<5TlMp_Nj& z22|jH-3~7{)=qxIEzPmcn;}E7ws8GqejX{_4Yh?EGo&)qKn44z$!0w2BAa6iw}i5R QLN}$jaBFShw$da$0Guv;l>h($ diff --git a/documentation/Sphinx/build/doctrees/user_guide/control_templates.doctree b/documentation/Sphinx/build/doctrees/user_guide/control_templates.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6ea301c6c9ce484f5f85f2d08f5ec83e2b0fcf6c GIT binary patch literal 2822 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 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/doctrees/user_guide/how_to.doctree b/documentation/Sphinx/build/doctrees/user_guide/how_to.doctree new file mode 100644 index 0000000000000000000000000000000000000000..259f520d0734b31e191834616b02e461e0c044d1 GIT binary patch literal 2815 zcmZo*N>0g7E-lH-Db~x&Pf0E20&#Ow^Gdi188sUVnQ9A}H9|S_5_3~aDhpDJ3t4Il zStG<57#K40%N0uU6-tX!71DB2E8<ftN{SMbOA6WiibDm9OOuLAGD}KJGV}A|Q&Q84 z3)yQ6IYRjg5{rsc<8xDsixbmRiwikp3%Nr1l1qz<Qu9jUi}Op1l2Z%0{X)4?Qj_zG z5<$8PdHh0!5=%?+)AI96^72bk<BLlYi%JT4y%|H<LC(rdDK6xzE#%K&3l-1EFV`)} z*DWnh)djgp7v?5`;!uv{jLe*rqSU-X!Pr6}bWazjCW9>FDiqdiEEK6N6x9gjEJ`eg zx=1XPA(X8k5#-21@eHO=HmJBnL@omZgMMCOv7woMNp7;fV_sgWzGq%ZYEeOc4%qqn zAa_8W0cOL(DZb2H&rly0*bueB1sR!n75Wg<^-GIWi{jHuGgDIaGxE#hOY-%Kic1P5 zL)l9b(?K3DlnP~sy1P(1lq<2Mq$o3~v?R5-P^Pv}RwI-nrL+K~uDDPxHk3U%C$YFV zwYX3|Hk2bNF*&;k6e$X^q0FH0Q;aQC$`D8lWre6$jxAKlU`s3wWy#6ROD$COW(wti zxwKF%gDFEWwoqLIJq$}SOL9`V3N<tv3pHyCwKOus!0E&TM>^5Y5YG_FkjRkCkP2l5 z>n+sDkf|-y)yR;G&5)1HP>9V?jLlGvEzMB%X3BtCtA}oDNNPn1SD`*$s|;Ej3k_=v zjWjaEGPE-!{4!Miz~+f(XqF}=mL{Q_nUs^CoE=|SnqQL2RcNf)SZGpPXsVGR7RrF+ zW^N=^g=Qd^n`3b~#3I4iLJM?D3KEMF(~A-dGPnvYH5&`9Y74DFK_<k&z!2)^;u@sj z?C%#G5)|qj;_2^KXp<qHVFC>;PPo=WTadkWSnTy?0Y#F1hJFMN107l$3mt0<oj_p% zGTaIr5{acrsijGYAg_jUmlP%D6{qDF<)#)DI{St4!gC-v?YPtyx`uKTrKUmBj9YD? zd#FHhWo}Y_PCQIyaiK?Sp=YQdO8y1w_KGd^4i!OD9uJoCi7oUE<xI{j0cVQhLciET ze^7LV^1uoTaH<UO3l)O95K*KA#uf&FoK=utRFYa$80;6yk(mN5GeW!>LwS+iQd}4s zTNoC~3$qO3fbiPFh){vdyp+tM)Z~)*lEk9))RN-D$k@WDP>$l%l9J54^y0#3qzsT& zl%H3UnwP>AmY7qTTFg}#lV2EHTNtMiDg+CPcu=Ox$;`_xE{ykP3>7W{m2fHXDX9gi zc`2!R$(gCeg$aJ4yg7+^>7|M3sqxAADXE2tp-icHg-M~Dpt3a;WJF<dM<`!GY5~Zp zsYR)I$*IMKDSn}R#U(|V1@X!GxuCMUxG>c(l(!^58OhePP}bDElA_AO^iZCnG>}Yj zYJ6!?PGLr<Oh!pbL9vy-eo20QPO)BQYDt=2eo?x9MoDgteqm-PXG&s8YH>+oZb4y| zUnoyeDkyN{b5hGva|*M)nL>q&b3sKiD8CfP=j10R=A;%E=EN4}hVsOxq!yQC=7FQK zFwZZPD<d(d1gbUPn>Cad>TYQ1RN$AP;}<HET2z!@6rY-xoS%}JmmUw{W+djN<fIlA z7KRFd0-`u4u{fhBwIC-kIkm7Tlr<$asWiQ?*e_HdH8&|06y=pUsl^$osU?LaouRV% zr6mQWCAiEi4P^s4B)O!pER+{isOFXC##eySeqp&cV<>-0X>LJ0Jhc@UR``YTrsOAQ z=B4FBl~sB(hVqps7Uh8)TwGF=nwVQy<rgXnimJ5C9B@#_m!#$v<Rq4)7FLIH6r>jD zsv4N26xM_ardDK@fYNA5X)!cxYQ0%Q*^=|~(lXNv>!8t_ToPZFS)5stUsPD{7b=>Z zlb@I!pPHMPnG>Iwl2VikF5eqELS;*eGIQa15Rp*giwi(u)z}%zoSIiw*yIQGS3z-V zX-a;4MQ%=EGbs2f3i69n<1<0kSYBdIabb&Js1PVjic6Eg<uugCt(~FVkg6&kl&%Zg z{6hIa39BeI4VEz5{X+TC0=}>#l(n=ZP1mBZGn5Oe9h3^Y{6hIM^N^#cusf6!tWvi) zGrh1Uls`Ttvp6v+2b49y;nM3D%9)uGUr>~qmRV8Q7s?PSo1BpdYJ{W~L4q+pGY?c& z#OEd!WtSEd_IHMImLw*{muIGwWE4*D<_P73BrRA<E1Ve08XDrJYf(5UlpWR{nVcaR z%AcNEQj%Ix0?J?opjOV5j!@3@)V$Q9L{M~0^$X<#ClN%TP4f%o0cQ(HJyKjay(5$d zlo*l{q4{n`r~)kCm6w<66;zgF<mZ9&T}o=1enDzMv3}u9P?4Hfl2{R+k(r*6lbN1T zQaCG=B_}^Gy>ND@3~GR(<&!xXWubha(k>nmNOMD(GE)lYh4Q83CnLw@{LWBmPzET7 zPt8dMmmu-wnI#$VuvWtYzfj(INOFt^rRL(og|UT;Ld8Jr_{_ZG)FM#xDLyq16hA42 zi#tNOixSJ>{3W1*7aTzF;&Z8AX;P>tdIbP!+b#2E$WW{;T%IA2AyOPFgwmLV)HW+> z3s+`HWvGFwzg6JsPZ88$fVIprBtZ=b<=E0tPFVR{T(~;6a7`#1D6ymz7p|=>TvwW; F2LS!R4@m$3 literal 0 HcmV?d00001 diff --git a/documentation/Sphinx/build/html/_modules/ControlFile.html b/documentation/Sphinx/build/html/_modules/ControlFile.html new file mode 100644 index 0000000..e5d5029 --- /dev/null +++ b/documentation/Sphinx/build/html/_modules/ControlFile.html @@ -0,0 +1,790 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>ControlFile — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="index.html">Module code</a> »</li> + + <li>ControlFile</li> + + + <li class="wy-breadcrumbs-aside"> + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <h1>Source code for ControlFile</h1><div class="highlight"><pre> +<span></span><span class="ch">#!/usr/bin/env python</span> +<span class="c1"># -*- coding: utf-8 -*-</span> +<span class="c1">#*******************************************************************************</span> +<span class="c1"># @Author: Leopold Haimberger (University of Vienna)</span> +<span class="c1">#</span> +<span class="c1"># @Date: November 2015</span> +<span class="c1">#</span> +<span class="c1"># @Change History:</span> +<span class="c1">#</span> +<span class="c1"># February 2018 - Anne Philipp (University of Vienna):</span> +<span class="c1"># - applied PEP8 style guide</span> +<span class="c1"># - added documentation</span> +<span class="c1"># - applied some minor modifications in programming style/structure</span> +<span class="c1"># - changed name of class Control to ControlFile for more</span> +<span class="c1"># self-explanation naming</span> +<span class="c1"># - outsource of class ControlFile</span> +<span class="c1"># - initialisation of class attributes ( to avoid high number of</span> +<span class="c1"># conditional statements and set default values )</span> +<span class="c1"># - divided assignment of attributes and the check of conditions</span> +<span class="c1"># - outsourced the commandline argument assignments to control attributes</span> +<span class="c1">#</span> +<span class="c1"># @License:</span> +<span class="c1"># (C) Copyright 2015-2018.</span> +<span class="c1">#</span> +<span class="c1"># This software is licensed under the terms of the Apache Licence Version 2.0</span> +<span class="c1"># which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.</span> +<span class="c1">#</span> +<span class="c1"># @Class Description:</span> +<span class="c1"># The CONTROL file is the steering part of the FLEXPART extraction</span> +<span class="c1"># software. All necessary parameters needed to retrieve the data fields</span> +<span class="c1"># from the MARS archive for driving FLEXPART are set in a CONTROL file.</span> +<span class="c1"># Some specific parameters like the start and end dates can be overwritten</span> +<span class="c1"># by the command line parameters, but in generel all parameters needed</span> +<span class="c1"># for a complete set of fields for FLEXPART can be set in the CONTROL file.</span> +<span class="c1">#</span> +<span class="c1"># @Class Content:</span> +<span class="c1"># - __init__</span> +<span class="c1"># - __read_controlfile__</span> +<span class="c1"># - __str__</span> +<span class="c1"># - assign_args_to_control</span> +<span class="c1"># - assign_envs_to_control</span> +<span class="c1"># - check_conditions</span> +<span class="c1"># - check_install_conditions</span> +<span class="c1"># - to_list</span> +<span class="c1">#</span> +<span class="c1"># @Class Attributes:</span> +<span class="c1">#</span> +<span class="c1">#</span> +<span class="c1">#*******************************************************************************</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># MODULES</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">re</span> +<span class="kn">import</span> <span class="nn">sys</span> +<span class="kn">import</span> <span class="nn">inspect</span> + +<span class="c1"># software specific classes and modules from flex_extract</span> +<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'../'</span><span class="p">)</span> +<span class="kn">import</span> <span class="nn">_config</span> +<span class="kn">from</span> <span class="nn">mods.tools</span> <span class="k">import</span> <span class="n">my_error</span><span class="p">,</span> <span class="n">silent_remove</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># CLASS</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<div class="viewcode-block" id="ControlFile"><a class="viewcode-back" href="../api.html#ControlFile.ControlFile">[docs]</a><span class="k">class</span> <span class="nc">ControlFile</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> + <span class="sd">'''</span> +<span class="sd"> Contains the information which are stored in the CONTROL files.</span> +<span class="sd"> '''</span> + + <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span> + <span class="sd">'''Initialises the instance of ControlFile class and defines</span> +<span class="sd"> all class attributes with default values. Afterwards calls</span> +<span class="sd"> function __read_controlfile__ to read parameter from Control file.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> filename : :obj:`string`</span> +<span class="sd"> Name of CONTROL file.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="c1"># list of all possible class attributes and their default values</span> + <span class="bp">self</span><span class="o">.</span><span class="n">controlfile</span> <span class="o">=</span> <span class="n">filename</span> + <span class="bp">self</span><span class="o">.</span><span class="n">start_date</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">end_date</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">date_chunk</span> <span class="o">=</span> <span class="mi">3</span> + <span class="bp">self</span><span class="o">.</span><span class="n">dtime</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">basetime</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">time</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">step</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">acctype</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">acctime</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">accmaxstep</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">marsclass</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">dataset</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">number</span> <span class="o">=</span> <span class="s1">'OFF'</span> + <span class="bp">self</span><span class="o">.</span><span class="n">expver</span> <span class="o">=</span> <span class="s1">'1'</span> + <span class="bp">self</span><span class="o">.</span><span class="n">gaussian</span> <span class="o">=</span> <span class="s1">''</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">area</span> <span class="o">=</span> <span class="s1">''</span> + <span class="bp">self</span><span class="o">.</span><span class="n">left</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">lower</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">upper</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">right</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">level</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">levelist</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">resol</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">gauss</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">accuracy</span> <span class="o">=</span> <span class="mi">24</span> + <span class="bp">self</span><span class="o">.</span><span class="n">omega</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">omegadiff</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">eta</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">etadiff</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">etapar</span> <span class="o">=</span> <span class="mi">77</span> + <span class="bp">self</span><span class="o">.</span><span class="n">dpdeta</span> <span class="o">=</span> <span class="mi">1</span> + <span class="bp">self</span><span class="o">.</span><span class="n">smooth</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">format</span> <span class="o">=</span> <span class="s1">'GRIB1'</span> + <span class="bp">self</span><span class="o">.</span><span class="n">addpar</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span> <span class="o">=</span> <span class="s1">'EN'</span> + <span class="bp">self</span><span class="o">.</span><span class="n">cwc</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">wrf</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">ecfsdir</span> <span class="o">=</span> <span class="s1">'ectmp:/$</span><span class="si">{USER}</span><span class="s1">/econdemand/'</span> + <span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'$</span><span class="si">{USER}</span><span class="s1">'</span><span class="p">]</span> + <span class="bp">self</span><span class="o">.</span><span class="n">mailops</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'$</span><span class="si">{USER}</span><span class="s1">'</span><span class="p">]</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grib2flexpart</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">ecstorage</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">ectrans</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">inputdir</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">PATH_INPUT_DIR</span> + <span class="bp">self</span><span class="o">.</span><span class="n">outputdir</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">ecmwfdatadir</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">PATH_FLEXEXTRACT_DIR</span> + <span class="bp">self</span><span class="o">.</span><span class="n">exedir</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">PATH_FORTRAN_SRC</span> + <span class="bp">self</span><span class="o">.</span><span class="n">flexpart_root_scripts</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">makefile</span> <span class="o">=</span> <span class="s1">'Makefile.gfortran'</span> + <span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">gateway</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">ecuid</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">ecgid</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">install_target</span> <span class="o">=</span> <span class="kc">None</span> + <span class="bp">self</span><span class="o">.</span><span class="n">debug</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">request</span> <span class="o">=</span> <span class="mi">0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">public</span> <span class="o">=</span> <span class="mi">0</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">logicals</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'gauss'</span><span class="p">,</span> <span class="s1">'omega'</span><span class="p">,</span> <span class="s1">'omegadiff'</span><span class="p">,</span> <span class="s1">'eta'</span><span class="p">,</span> <span class="s1">'etadiff'</span><span class="p">,</span> + <span class="s1">'dpdeta'</span><span class="p">,</span> <span class="s1">'cwc'</span><span class="p">,</span> <span class="s1">'wrf'</span><span class="p">,</span> <span class="s1">'grib2flexpart'</span><span class="p">,</span> <span class="s1">'ecstorage'</span><span class="p">,</span> + <span class="s1">'ectrans'</span><span class="p">,</span> <span class="s1">'debug'</span><span class="p">,</span> <span class="s1">'request'</span><span class="p">,</span> <span class="s1">'public'</span><span class="p">]</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">__read_controlfile__</span><span class="p">()</span> + + <span class="k">return</span> + + <span class="k">def</span> <span class="nf">__read_controlfile__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="sd">'''Read CONTROL file and assign all CONTROL file variables.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="k">try</span><span class="p">:</span> + <span class="n">cfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_CONTROLFILES</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">controlfile</span><span class="p">)</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">cfile</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">fdata</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Could not read CONTROL file "'</span> <span class="o">+</span> <span class="n">cfile</span> <span class="o">+</span> <span class="s1">'"'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Either it does not exist or its syntax is wrong.'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Try "'</span> <span class="o">+</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> \ + <span class="s1">' -h" to print usage information'</span><span class="p">)</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + + <span class="c1"># go through every line and store parameter</span> + <span class="k">for</span> <span class="n">ldata</span> <span class="ow">in</span> <span class="n">fdata</span><span class="p">:</span> + <span class="n">data</span> <span class="o">=</span> <span class="n">ldata</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> + <span class="k">if</span> <span class="s1">'m_'</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span> + <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">2</span><span class="p">:]</span> + <span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'class'</span><span class="p">:</span> + <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'marsclass'</span> + <span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'day1'</span><span class="p">:</span> + <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'start_date'</span> + <span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'day2'</span><span class="p">:</span> + <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'end_date'</span> + <span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'addpar'</span><span class="p">:</span> + <span class="k">if</span> <span class="s1">'/'</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span> + <span class="c1"># remove leading '/' sign from addpar content</span> + <span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'/'</span><span class="p">:</span> + <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">:]</span> + <span class="n">dd</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span> + <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> + <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">dd</span><span class="p">:</span> + <span class="n">data</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> + <span class="k">if</span> <span class="s1">'$'</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span> + <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> + <span class="k">while</span> <span class="s1">'$'</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span> + <span class="n">i</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s1">'$'</span><span class="p">)</span> + <span class="n">j</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">'{'</span><span class="p">)</span> + <span class="n">k</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">'}'</span><span class="p">)</span> + <span class="n">var</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">:</span><span class="n">k</span><span class="p">])</span> + <span class="k">if</span> <span class="n">var</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> + <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">][:</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">var</span> <span class="o">+</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">my_error</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span><span class="p">,</span> + <span class="s1">'Could not find variable '</span> + <span class="o">+</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">:</span><span class="n">k</span><span class="p">]</span> <span class="o">+</span> <span class="s1">' while reading '</span> <span class="o">+</span> + <span class="bp">self</span><span class="o">.</span><span class="n">controlfile</span><span class="p">)</span> + <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">+</span> <span class="s1">'_expanded'</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">'none'</span><span class="p">:</span> + <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> + <span class="k">else</span><span class="p">:</span> + <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="kc">None</span><span class="p">)</span> + <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">></span> <span class="mi">2</span><span class="p">:</span> + <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">:]))</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">pass</span> + + <span class="k">return</span> + + <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="sd">'''Prepares a string which have all the ControlFile class attributes</span> +<span class="sd"> with its associated values. Each attribute is printed in one line and</span> +<span class="sd"> in alphabetical order.</span> + +<span class="sd"> Example</span> +<span class="sd"> -------</span> +<span class="sd"> 'age': 10</span> +<span class="sd"> 'color': 'Spotted'</span> +<span class="sd"> 'kids': 0</span> +<span class="sd"> 'legs': 2</span> +<span class="sd"> 'name': 'Dog'</span> +<span class="sd"> 'smell': 'Alot'</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> string</span> +<span class="sd"> Single string of concatenated ControlFile class attributes</span> +<span class="sd"> with their values</span> +<span class="sd"> '''</span> + <span class="kn">import</span> <span class="nn">collections</span> + + <span class="n">attrs</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> + <span class="n">attrs</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">attrs</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span> + + <span class="k">return</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">item</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">attrs</span><span class="o">.</span><span class="n">items</span><span class="p">())</span> + +<div class="viewcode-block" id="ControlFile.assign_args_to_control"><a class="viewcode-back" href="../api.html#ControlFile.ControlFile.assign_args_to_control">[docs]</a> <span class="k">def</span> <span class="nf">assign_args_to_control</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span> + <span class="sd">'''Overwrites the existing ControlFile instance attributes with</span> +<span class="sd"> the command line arguments.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> args : :obj:`Namespace`</span> +<span class="sd"> Contains the commandline arguments from script/program call.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="c1"># get dictionary of command line parameters and eliminate all</span> + <span class="c1"># parameters which are None (were not specified)</span> + <span class="n">args_dict</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> + <span class="n">arguments</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span> <span class="p">:</span> <span class="n">args_dict</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">args_dict</span> + <span class="k">if</span> <span class="n">args_dict</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">!=</span> <span class="kc">None</span><span class="p">}</span> + + <span class="c1"># assign all passed command line arguments to ControlFile instance</span> + <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">arguments</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span> + <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">k</span><span class="p">),</span> <span class="n">v</span><span class="p">)</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="ControlFile.assign_envs_to_control"><a class="viewcode-back" href="../api.html#ControlFile.ControlFile.assign_envs_to_control">[docs]</a> <span class="k">def</span> <span class="nf">assign_envs_to_control</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">envs</span><span class="p">):</span> + <span class="sd">'''Assigns the ECMWF environment parameter.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> envs : :obj:`dictionary` of :obj:`strings`</span> +<span class="sd"> Contains the ECMWF environment parameternames "ECUID", "ECGID",</span> +<span class="sd"> "DESTINATION" and "GATEWAY" with its corresponding values.</span> +<span class="sd"> They were read from the file "ECMWF_ENV".</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">envs</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span> + <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">k</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">))</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="ControlFile.check_conditions"><a class="viewcode-back" href="../api.html#ControlFile.ControlFile.check_conditions">[docs]</a> <span class="k">def</span> <span class="nf">check_conditions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">queue</span><span class="p">):</span> + <span class="sd">'''Checks a couple of necessary attributes and conditions,</span> +<span class="sd"> such as if they exist and contain values.</span> +<span class="sd"> Otherwise set default values.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> queue : :obj:`string`</span> +<span class="sd"> Name of the queue if submitted to the ECMWF servers.</span> +<span class="sd"> Used to check if ecuid, ecgid, gateway and destination</span> +<span class="sd"> are set correctly and are not empty.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="kn">from</span> <span class="nn">mods.tools</span> <span class="k">import</span> <span class="n">my_error</span> + <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> + + <span class="c1"># check for having at least a starting date</span> + <span class="c1"># otherwise program is not allowed to run</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">start_date</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'start_date specified neither in command line nor </span><span class="se">\</span> +<span class="s1"> in CONTROL file '</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">controlfile</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Try "'</span> <span class="o">+</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> + <span class="s1">' -h" to print usage information'</span><span class="p">)</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + + <span class="c1"># retrieve just one day if end_date isn't set</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">end_date</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">end_date</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">start_date</span> + + <span class="c1"># basetime has only two possible values</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">basetime</span><span class="p">:</span> + <span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">basetime</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">basetime</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">12</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Basetime has an invalid value!'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Basetime = '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">basetime</span><span class="p">))</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + + <span class="c1"># assure consistency of levelist and level</span> + <span class="c1"># up-to-date available maximum level numbers at ECMWF, 05.10.2018</span> + <span class="n">max_level_list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">16</span><span class="p">,</span> <span class="mi">19</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">62</span><span class="p">,</span> <span class="mi">91</span><span class="p">,</span> <span class="mi">137</span><span class="p">]</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">levelist</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">level</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Warning: neither levelist nor level </span><span class="se">\</span> +<span class="s1"> specified in CONTROL file'</span><span class="p">)</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + <span class="k">elif</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">levelist</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">level</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">levelist</span> <span class="o">=</span> <span class="s1">'1/to/'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">level</span> + <span class="k">elif</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">levelist</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">level</span><span class="p">)</span> <span class="ow">or</span> \ + <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">levelist</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">level</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]):</span> + <span class="bp">self</span><span class="o">.</span><span class="n">level</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">levelist</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">pass</span> + + <span class="c1"># check if max level is a valid level</span> + <span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">level</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">max_level_list</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'ERROR: '</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'LEVEL must be the maximum level of a specified '</span> + <span class="s1">'level list from ECMWF, e.g.'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'[16, 19, 31, 40, 50, 60, 62, 91 or 137]'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Check parameter "LEVEL" or the max level of "LEVELIST"!'</span><span class="p">)</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + + <span class="c1"># if area was provided (only from commandline)</span> + <span class="c1"># decompose area into its 4 components</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">area</span><span class="p">:</span> + <span class="n">components</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">area</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span> + <span class="c1"># convert float to integer coordinates</span> + <span class="k">if</span> <span class="s1">'.'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">area</span><span class="p">:</span> + <span class="n">components</span> <span class="o">=</span> <span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">))</span> + <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">item</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">components</span><span class="p">)]</span> + <span class="bp">self</span><span class="o">.</span><span class="n">upper</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">left</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lower</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">right</span> <span class="o">=</span> <span class="n">components</span> + + <span class="c1"># prepare step list if "/" signs are found</span> + <span class="k">if</span> <span class="s1">'/'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">:</span> + <span class="n">steps</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span> + <span class="k">if</span> <span class="s1">'to'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">and</span> <span class="s1">'by'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span> + <span class="n">ilist</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">steps</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> + <span class="nb">int</span><span class="p">(</span><span class="n">steps</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> + <span class="nb">int</span><span class="p">(</span><span class="n">steps</span><span class="p">[</span><span class="mi">4</span><span class="p">]))</span> + <span class="bp">self</span><span class="o">.</span><span class="n">step</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'</span><span class="si">{:0>3}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">ilist</span><span class="p">]</span> + <span class="k">elif</span> <span class="s1">'to'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">and</span> <span class="s1">'by'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span> + <span class="n">my_error</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span> <span class="o">+</span> <span class="s1">':</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span> + <span class="s1">'if "to" is used in steps parameter, </span><span class="se">\</span> +<span class="s1"> please use "by" as well'</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">step</span> <span class="o">=</span> <span class="n">steps</span> + + <span class="c1"># if maxstep wasn't provided</span> + <span class="c1"># search for it in the "step" parameter</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">maxstep</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">:</span> + <span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">maxstep</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">maxstep</span><span class="p">)</span> + + <span class="c1"># set root scripts since it is needed later on</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">flexpart_root_scripts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ecmwfdatadir</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">outputdir</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">outputdir</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">inputdir</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span> + <span class="k">if</span> <span class="s1">','</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">','</span><span class="p">)</span> + <span class="k">elif</span> <span class="s1">' '</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> + <span class="k">else</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">mailfail</span><span class="p">]</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mailops</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span> + <span class="k">if</span> <span class="s1">','</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">mailops</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">mailops</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mailops</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">','</span><span class="p">)</span> + <span class="k">elif</span> <span class="s1">' '</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">mailops</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">mailops</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mailops</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> + <span class="k">else</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">mailops</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">mailops</span><span class="p">]</span> + + <span class="k">if</span> <span class="n">queue</span> <span class="ow">in</span> <span class="n">_config</span><span class="o">.</span><span class="n">QUEUES_LIST</span> <span class="ow">and</span> \ + <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">gateway</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="ow">or</span> \ + <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">ecuid</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">ecgid</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">Environment variables GATEWAY, DESTINATION, ECUID and </span><span class="se">\</span> +<span class="s1"> ECGID were not set properly!'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Please check for existence of file "ECMWF_ENV" in the </span><span class="se">\</span> +<span class="s1"> python directory!'</span><span class="p">)</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> + <span class="n">marsfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> + <span class="n">_config</span><span class="o">.</span><span class="n">FILE_MARS_REQUESTS</span><span class="p">)</span> + <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">marsfile</span><span class="p">):</span> + <span class="n">silent_remove</span><span class="p">(</span><span class="n">marsfile</span><span class="p">)</span> + + <span class="c1"># check all logical variables for data type</span> + <span class="c1"># if its a string change to integer</span> + <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">logicals</span><span class="p">:</span> + <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var</span><span class="p">),</span> <span class="nb">int</span><span class="p">):</span> + <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var</span><span class="p">)))</span> + + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">public</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">dataset</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'ERROR: '</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'If public mars data wants to be retrieved, '</span> + <span class="s1">'the "dataset"-parameter has to be set in the control file!'</span><span class="p">)</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span> + <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">]</span> + + <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">):</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'AN'</span> <span class="ow">and</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Analysis retrievals must have STEP = 0 (is set to 0)'</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span> + <span class="bp">self</span><span class="o">.</span><span class="n">time</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="p">]</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span> + <span class="bp">self</span><span class="o">.</span><span class="n">step</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">step</span><span class="p">]</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">acctype</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'... Control paramter ACCTYPE was not defined.'</span><span class="p">)</span> + <span class="k">try</span><span class="p">:</span> + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'AN'</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Use old setting by using TYPE[1] for flux forecast!'</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">acctype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> + <span class="k">except</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Use default value "FC" for flux forecast!'</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">acctype</span><span class="o">=</span><span class="s1">'FC'</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">acctime</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'... Control paramter ACCTIME was not defined.'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Use default value "00/12" for flux forecast!'</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">acctime</span><span class="o">=</span><span class="s1">'00/12'</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">accmaxstep</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'... Control paramter ACCMAXSTEP was not defined.'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Use default value "12" for flux forecast!'</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">accmaxstep</span><span class="o">=</span><span class="s1">'12'</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="ControlFile.check_install_conditions"><a class="viewcode-back" href="../api.html#ControlFile.ControlFile.check_install_conditions">[docs]</a> <span class="k">def</span> <span class="nf">check_install_conditions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="sd">'''Checks a couple of necessary attributes and conditions</span> +<span class="sd"> for the installation such as if they exist and contain values.</span> +<span class="sd"> Otherwise set default values.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">install_target</span> <span class="ow">and</span> \ + <span class="bp">self</span><span class="o">.</span><span class="n">install_target</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">'local'</span><span class="p">,</span> <span class="s1">'ecgate'</span><span class="p">,</span> <span class="s1">'cca'</span><span class="p">]:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'ERROR: unknown or missing installation target '</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'target: '</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">install_target</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'please specify correct installation target '</span> <span class="o">+</span> + <span class="s1">'(local | ecgate | cca)'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'use -h or --help for help'</span><span class="p">)</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">install_target</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">install_target</span> <span class="o">!=</span> <span class="s1">'local'</span><span class="p">:</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">ecgid</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">ecuid</span> <span class="ow">or</span> \ + <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">gateway</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Please enter your ECMWF user id and group id as well '</span> <span class="o">+</span> + <span class="s1">'as the </span><span class="se">\n</span><span class="s1">name of the local gateway and the ectrans '</span> <span class="o">+</span> + <span class="s1">'destination '</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'with command line options --ecuid --ecgid </span><span class="se">\</span> +<span class="s1"> --gateway --destination'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Try "'</span> <span class="o">+</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> \ + <span class="s1">' -h" to print usage information'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Please consult ecaccess documentation or ECMWF user </span><span class="se">\</span> +<span class="s1"> support for further details'</span><span class="p">)</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">flexpart_root_scripts</span> <span class="o">=</span> <span class="s1">'$</span><span class="si">{HOME}</span><span class="s1">'</span> + <span class="k">else</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">flexpart_root_scripts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">flexpart_root_scripts</span> + <span class="k">else</span><span class="p">:</span> <span class="c1"># local</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">flexpart_root_scripts</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">PATH_FLEXEXTRACT_DIR</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="ControlFile.to_list"><a class="viewcode-back" href="../api.html#ControlFile.ControlFile.to_list">[docs]</a> <span class="k">def</span> <span class="nf">to_list</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="sd">'''Just generates a list of strings containing the attributes and</span> +<span class="sd"> assigned values except the attributes "_expanded", "exedir",</span> +<span class="sd"> "ecmwfdatadir" and "flexpart_root_scripts".</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> l : :obj:`list`</span> +<span class="sd"> A sorted list of the all ControlFile class attributes with</span> +<span class="sd"> their values except the attributes "_expanded", "exedir",</span> +<span class="sd"> "ecmwfdatadir" and "flexpart_root_scripts".</span> +<span class="sd"> '''</span> + + <span class="kn">import</span> <span class="nn">collections</span> + + <span class="n">attrs</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">OrderedDict</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="nb">vars</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span> + + <span class="n">l</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span> + + <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">attrs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> + <span class="k">if</span> <span class="s1">'_expanded'</span> <span class="ow">in</span> <span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span> + <span class="k">pass</span> + <span class="k">elif</span> <span class="s1">'exedir'</span> <span class="ow">in</span> <span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span> + <span class="k">pass</span> + <span class="k">elif</span> <span class="s1">'flexpart_root_scripts'</span> <span class="ow">in</span> <span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span> + <span class="k">pass</span> + <span class="k">elif</span> <span class="s1">'ecmwfdatadir'</span> <span class="ow">in</span> <span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span> + <span class="k">pass</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="nb">list</span><span class="p">):</span> + <span class="n">stot</span> <span class="o">=</span> <span class="s1">''</span> + <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">item</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span> + <span class="n">stot</span> <span class="o">+=</span> <span class="n">s</span> <span class="o">+</span> <span class="s1">' '</span> + + <span class="n">l</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">stot</span><span class="p">))</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">l</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span> + + <span class="k">return</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">l</span><span class="p">)</span></div></div> + +</pre></div> + + </div> + + </div> + <footer> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_modules/EcFlexpart.html b/documentation/Sphinx/build/html/_modules/EcFlexpart.html new file mode 100644 index 0000000..3468886 --- /dev/null +++ b/documentation/Sphinx/build/html/_modules/EcFlexpart.html @@ -0,0 +1,1510 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>EcFlexpart — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="index.html">Module code</a> »</li> + + <li>EcFlexpart</li> + + + <li class="wy-breadcrumbs-aside"> + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <h1>Source code for EcFlexpart</h1><div class="highlight"><pre> +<span></span><span class="ch">#!/usr/bin/env python</span> +<span class="c1"># -*- coding: utf-8 -*-</span> +<span class="c1">#*******************************************************************************</span> +<span class="c1"># @Author: Anne Fouilloux (University of Oslo)</span> +<span class="c1">#</span> +<span class="c1"># @Date: October 2014</span> +<span class="c1">#</span> +<span class="c1"># @Change History:</span> +<span class="c1">#</span> +<span class="c1"># November 2015 - Leopold Haimberger (University of Vienna):</span> +<span class="c1"># - extended with class Control</span> +<span class="c1"># - removed functions mkdir_p, daterange, years_between, months_between</span> +<span class="c1"># - added functions darain, dapoly, to_param_id, init128, normal_exit,</span> +<span class="c1"># my_error, clean_up, install_args_and_control,</span> +<span class="c1"># interpret_args_and_control,</span> +<span class="c1"># - removed function __del__ in class EIFLexpart</span> +<span class="c1"># - added the following functions in EIFlexpart:</span> +<span class="c1"># - create_namelist</span> +<span class="c1"># - process_output</span> +<span class="c1"># - deacc_fluxes</span> +<span class="c1"># - modified existing EIFlexpart - functions for the use in</span> +<span class="c1"># flex_extract</span> +<span class="c1"># - retrieve also longer term forecasts, not only analyses and</span> +<span class="c1"># short term forecast data</span> +<span class="c1"># - added conversion into GRIB2</span> +<span class="c1"># - added conversion into .fp format for faster execution of FLEXPART</span> +<span class="c1"># (see https://www.flexpart.eu/wiki/FpCtbtoWo4FpFormat)</span> +<span class="c1">#</span> +<span class="c1"># February 2018 - Anne Philipp (University of Vienna):</span> +<span class="c1"># - applied PEP8 style guide</span> +<span class="c1"># - added documentation</span> +<span class="c1"># - removed function getFlexpartTime in class EcFlexpart</span> +<span class="c1"># - outsourced class ControlFile</span> +<span class="c1"># - outsourced class MarsRetrieval</span> +<span class="c1"># - changed class name from EIFlexpart to EcFlexpart</span> +<span class="c1"># - applied minor code changes (style)</span> +<span class="c1"># - removed "dead code" , e.g. retrieval of Q since it is not needed</span> +<span class="c1"># - removed "times" parameter from retrieve-method since it is not used</span> +<span class="c1"># - seperated function "retrieve" into smaller functions (less code</span> +<span class="c1"># duplication, easier testing)</span> +<span class="c1">#</span> +<span class="c1"># @License:</span> +<span class="c1"># (C) Copyright 2014-2018.</span> +<span class="c1">#</span> +<span class="c1"># This software is licensed under the terms of the Apache Licence Version 2.0</span> +<span class="c1"># which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.</span> +<span class="c1">#</span> +<span class="c1"># @Class Description:</span> +<span class="c1"># FLEXPART needs grib files in a specifc format. All necessary data fields</span> +<span class="c1"># for one time step are stored in a single file. The class represents an</span> +<span class="c1"># instance with all the parameter and settings necessary for retrieving</span> +<span class="c1"># MARS data and modifing them so they are fitting FLEXPART need. The class</span> +<span class="c1"># is able to disaggregate the fluxes and convert grid types to the one needed</span> +<span class="c1"># by FLEXPART, therefore using the FORTRAN program.</span> +<span class="c1">#</span> +<span class="c1"># @Class Content:</span> +<span class="c1"># - __init__</span> +<span class="c1"># - write_namelist</span> +<span class="c1"># - retrieve</span> +<span class="c1"># - process_output</span> +<span class="c1"># - create</span> +<span class="c1"># - deacc_fluxes</span> +<span class="c1">#</span> +<span class="c1"># @Class Attributes:</span> +<span class="c1">#</span> +<span class="c1"># TODO</span> +<span class="c1">#</span> +<span class="c1">#*******************************************************************************</span> +<span class="c1">#pylint: disable=unsupported-assignment-operation</span> +<span class="c1"># this is disabled because for this specific case its an error in pylint</span> +<span class="c1">#pylint: disable=consider-using-enumerate</span> +<span class="c1"># this is not useful in this case</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># MODULES</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">sys</span> +<span class="kn">import</span> <span class="nn">glob</span> +<span class="kn">import</span> <span class="nn">shutil</span> +<span class="kn">import</span> <span class="nn">subprocess</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span> +<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> + +<span class="kn">from</span> <span class="nn">gribapi</span> <span class="k">import</span> <span class="p">(</span><span class="n">grib_set</span><span class="p">,</span> <span class="n">grib_index_select</span><span class="p">,</span> <span class="n">grib_new_from_index</span><span class="p">,</span> <span class="n">grib_get</span><span class="p">,</span> + <span class="n">grib_write</span><span class="p">,</span> <span class="n">grib_get_values</span><span class="p">,</span> <span class="n">grib_set_values</span><span class="p">,</span> <span class="n">grib_release</span><span class="p">,</span> + <span class="n">grib_index_release</span><span class="p">,</span> <span class="n">grib_index_get</span><span class="p">)</span> + +<span class="c1"># from eccodes import (codes_index_select, codes_new_from_index, codes_get,</span> + <span class="c1"># codes_get_values, codes_set_values, codes_set,</span> + <span class="c1"># codes_write, codes_release, codes_new_from_index,</span> + <span class="c1"># codes_index_release, codes_index_get)</span> + +<span class="c1"># software specific classes and modules from flex_extract</span> +<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'../'</span><span class="p">)</span> +<span class="kn">import</span> <span class="nn">_config</span> +<span class="kn">from</span> <span class="nn">GribTools</span> <span class="k">import</span> <span class="n">GribTools</span> +<span class="kn">from</span> <span class="nn">mods.tools</span> <span class="k">import</span> <span class="p">(</span><span class="n">init128</span><span class="p">,</span> <span class="n">to_param_id</span><span class="p">,</span> <span class="n">silent_remove</span><span class="p">,</span> <span class="n">product</span><span class="p">,</span> + <span class="n">my_error</span><span class="p">,</span> <span class="n">make_dir</span><span class="p">)</span> +<span class="kn">from</span> <span class="nn">MarsRetrieval</span> <span class="k">import</span> <span class="n">MarsRetrieval</span> +<span class="kn">import</span> <span class="nn">mods.disaggregation</span> <span class="k">as</span> <span class="nn">disaggregation</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># CLASS</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<div class="viewcode-block" id="EcFlexpart"><a class="viewcode-back" href="../api.html#EcFlexpart.EcFlexpart">[docs]</a><span class="k">class</span> <span class="nc">EcFlexpart</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> + <span class="sd">'''</span> +<span class="sd"> Class to retrieve FLEXPART specific ECMWF data.</span> +<span class="sd"> '''</span> + <span class="c1"># --------------------------------------------------------------------------</span> + <span class="c1"># CLASS FUNCTIONS</span> + <span class="c1"># --------------------------------------------------------------------------</span> + <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">fluxes</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> + <span class="sd">'''Creates an object/instance of EcFlexpart with the associated</span> +<span class="sd"> settings of its attributes for the retrieval.</span> + +<span class="sd"> Parameters:</span> +<span class="sd"> -----------</span> +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> fluxes : :obj:`boolean`, optional</span> +<span class="sd"> Decides if the flux parameter settings are stored or</span> +<span class="sd"> the rest of the parameter list.</span> +<span class="sd"> Default value is False.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="c1"># set a counter for the number of mars requests generated</span> + <span class="bp">self</span><span class="o">.</span><span class="n">mreq_count</span> <span class="o">=</span> <span class="mi">0</span> + + <span class="c1"># different mars types for retrieving data for flexpart</span> + <span class="bp">self</span><span class="o">.</span><span class="n">types</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span> + + <span class="c1"># Pure forecast mode</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">></span> <span class="nb">len</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">type</span><span class="p">)</span> <span class="ow">and</span> <span class="s1">'AN'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">c</span><span class="o">.</span><span class="n">type</span><span class="p">:</span> + <span class="n">c</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="p">[</span><span class="n">c</span><span class="o">.</span><span class="n">type</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> + <span class="n">c</span><span class="o">.</span><span class="n">step</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'</span><span class="si">{:0>3}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">step</span><span class="p">[</span><span class="mi">0</span><span class="p">]))]</span> + <span class="n">c</span><span class="o">.</span><span class="n">time</span> <span class="o">=</span> <span class="p">[</span><span class="n">c</span><span class="o">.</span><span class="n">time</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span> + <span class="n">c</span><span class="o">.</span><span class="n">type</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">type</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> + <span class="n">c</span><span class="o">.</span><span class="n">step</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'</span><span class="si">{:0>3}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> + <span class="n">c</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">time</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">inputdir</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">inputdir</span> + <span class="bp">self</span><span class="o">.</span><span class="n">dataset</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">dataset</span> + <span class="bp">self</span><span class="o">.</span><span class="n">basetime</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span> + <span class="bp">self</span><span class="o">.</span><span class="n">dtime</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">dtime</span> + <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">if</span> <span class="n">fluxes</span> <span class="ow">and</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o"><=</span> <span class="mi">24</span><span class="p">:</span> + <span class="c1"># no forecast beyond one day is needed!</span> + <span class="c1"># Thus, prepare flux data manually as usual</span> + <span class="c1"># with only forecast fields with start times at 00/12</span> + <span class="c1"># (but without 00/12 fields since these are</span> + <span class="c1"># the initialisation times of the flux fields</span> + <span class="c1"># and therefore are zero all the time)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">acctype</span><span class="p">)]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'times'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">acctime</span><span class="p">),</span> + <span class="s1">'steps'</span><span class="p">:</span> <span class="s1">'</span><span class="si">{}</span><span class="s1">/to/</span><span class="si">{}</span><span class="s1">/by/</span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> + <span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">accmaxstep</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">)}</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">for</span> <span class="n">ty</span><span class="p">,</span> <span class="n">st</span><span class="p">,</span> <span class="n">ti</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">step</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">time</span><span class="p">):</span> + <span class="n">btlist</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">24</span><span class="p">)</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span> <span class="o">==</span> <span class="s1">'12'</span><span class="p">:</span> + <span class="n">btlist</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">12</span><span class="p">]</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span> <span class="o">==</span> <span class="s1">'00'</span><span class="p">:</span> + <span class="n">btlist</span> <span class="o">=</span> <span class="p">[</span><span class="mi">13</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">17</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">19</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> + + <span class="k">if</span> <span class="p">((</span><span class="n">ty</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'AN'</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">time</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">%</span> <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">))</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> + <span class="p">(</span><span class="n">ty</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">'AN'</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">step</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">%</span> <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">))</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> + <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">step</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">%</span> <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">))</span> <span class="p">)</span> <span class="ow">and</span> \ + <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">time</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="ow">in</span> <span class="n">btlist</span> <span class="ow">or</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">></span> <span class="mi">24</span><span class="p">):</span> + + <span class="k">if</span> <span class="n">ty</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span> + <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="n">ty</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'times'</span><span class="p">:</span> <span class="s1">''</span><span class="p">,</span> <span class="s1">'steps'</span><span class="p">:</span> <span class="s1">''</span><span class="p">}</span> + + <span class="k">if</span> <span class="n">ti</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="n">ty</span><span class="p">][</span><span class="s1">'times'</span><span class="p">]:</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="n">ty</span><span class="p">][</span><span class="s1">'times'</span><span class="p">]:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="n">ty</span><span class="p">][</span><span class="s1">'times'</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'/'</span> + <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="n">ty</span><span class="p">][</span><span class="s1">'times'</span><span class="p">]</span> <span class="o">+=</span> <span class="n">ti</span> + + <span class="k">if</span> <span class="n">st</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="n">ty</span><span class="p">][</span><span class="s1">'steps'</span><span class="p">]:</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="n">ty</span><span class="p">][</span><span class="s1">'steps'</span><span class="p">]:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="n">ty</span><span class="p">][</span><span class="s1">'steps'</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'/'</span> + <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="n">ty</span><span class="p">][</span><span class="s1">'steps'</span><span class="p">]</span> <span class="o">+=</span> <span class="n">st</span> + <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">marsclass</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">marsclass</span> + <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">stream</span> + <span class="bp">self</span><span class="o">.</span><span class="n">number</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">number</span> + <span class="bp">self</span><span class="o">.</span><span class="n">resol</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">resol</span> + <span class="bp">self</span><span class="o">.</span><span class="n">accuracy</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">accuracy</span> + <span class="bp">self</span><span class="o">.</span><span class="n">level</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">level</span> + <span class="bp">self</span><span class="o">.</span><span class="n">expver</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">expver</span> + <span class="bp">self</span><span class="o">.</span><span class="n">levelist</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">levelist</span> + <span class="c1"># for gaussian grid retrieval</span> + <span class="bp">self</span><span class="o">.</span><span class="n">glevelist</span> <span class="o">=</span> <span class="s1">'1/to/'</span> <span class="o">+</span> <span class="n">c</span><span class="o">.</span><span class="n">level</span> + <span class="bp">self</span><span class="o">.</span><span class="n">gaussian</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">gaussian</span> + + <span class="k">if</span> <span class="s1">'N'</span> <span class="ow">in</span> <span class="n">c</span><span class="o">.</span><span class="n">grid</span><span class="p">:</span> <span class="c1"># Gaussian output grid</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">grid</span> + <span class="bp">self</span><span class="o">.</span><span class="n">area</span> <span class="o">=</span> <span class="s1">'G'</span> + <span class="k">else</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid</span> <span class="o">=</span> <span class="s1">'</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">grid</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">grid</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">area</span> <span class="o">=</span> <span class="s1">'</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">upper</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">,</span> + <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">left</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">,</span> + <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">lower</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">,</span> + <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">right</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1000.</span><span class="p">)</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">outputfilelist</span> <span class="o">=</span> <span class="p">[]</span> + + + <span class="c1"># Now comes the nasty part that deals with the different</span> + <span class="c1"># scenarios we have:</span> + <span class="c1"># 1) Calculation of etadot on</span> + <span class="c1"># a) Gaussian grid</span> + <span class="c1"># b) Output grid</span> + <span class="c1"># c) Output grid using parameter 77 retrieved from MARS</span> + <span class="c1"># 3) Calculation/Retrieval of omega</span> + <span class="c1"># 4) Download also data for WRF</span> + + <span class="c1"># Different grids need different retrievals</span> + <span class="c1"># SH = Spherical Harmonics, GG = Gaussian Grid,</span> + <span class="c1"># OG = Output Grid, ML = MultiLevel, SL = SingleLevel</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'SH__ML'</span><span class="p">:</span> <span class="s1">''</span><span class="p">,</span> <span class="s1">'SH__SL'</span><span class="p">:</span> <span class="s1">''</span><span class="p">,</span> + <span class="s1">'GG__ML'</span><span class="p">:</span> <span class="s1">''</span><span class="p">,</span> <span class="s1">'GG__SL'</span><span class="p">:</span> <span class="s1">''</span><span class="p">,</span> + <span class="s1">'OG__ML'</span><span class="p">:</span> <span class="s1">''</span><span class="p">,</span> <span class="s1">'OG__SL'</span><span class="p">:</span> <span class="s1">''</span><span class="p">,</span> + <span class="s1">'OG_OROLSM_SL'</span><span class="p">:</span> <span class="s1">''</span><span class="p">,</span> <span class="s1">'OG_acc_SL'</span><span class="p">:</span> <span class="s1">''</span><span class="p">}</span> + <span class="c1"># the self.params dictionary stores a list of</span> + <span class="c1"># [param, levtype, levelist, grid] per key</span> + + <span class="k">if</span> <span class="n">fluxes</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'SH__SL'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'LNSP'</span><span class="p">,</span> <span class="s1">'ML'</span><span class="p">,</span> <span class="s1">'1'</span><span class="p">,</span> <span class="s1">'OFF'</span><span class="p">]</span> + <span class="c1"># "SD/MSL/TCC/10U/10V/2T/2D/129/172"</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__SL'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"141/151/164/165/166/167/168/129/172"</span><span class="p">,</span> \ + <span class="s1">'SFC'</span><span class="p">,</span> <span class="s1">'1'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid</span><span class="p">]</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">addpar</span><span class="p">:</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">addpar</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'/'</span><span class="p">:</span> + <span class="n">c</span><span class="o">.</span><span class="n">addpar</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">addpar</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__SL'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'/'</span> <span class="o">+</span> <span class="s1">'/'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">addpar</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">marsclass</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'EA'</span> <span class="ow">or</span> <span class="n">c</span><span class="o">.</span><span class="n">marsclass</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'EP'</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG_OROLSM__SL'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"160/27/28/244"</span><span class="p">,</span> + <span class="s1">'SFC'</span><span class="p">,</span> <span class="s1">'1'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid</span><span class="p">]</span> + <span class="k">else</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG_OROLSM__SL'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"160/27/28/173"</span><span class="p">,</span> \ + <span class="s1">'SFC'</span><span class="p">,</span> <span class="s1">'1'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid</span><span class="p">]</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__ML'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'T/Q'</span><span class="p">,</span> <span class="s1">'ML'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">levelist</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid</span><span class="p">]</span> + + <span class="c1">#if c.gauss == '0' and c.eta == '1':</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">gauss</span> <span class="ow">and</span> <span class="n">c</span><span class="o">.</span><span class="n">eta</span><span class="p">:</span> + <span class="c1"># the simplest case</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__ML'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'/U/V/77'</span> + <span class="c1">#elif c.gauss == '0' and c.eta == '0':</span> + <span class="k">elif</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">gauss</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">eta</span><span class="p">:</span> + <span class="c1"># this is not recommended (inaccurate)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__ML'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'/U/V'</span> + <span class="c1">#elif c.gauss == '1' and c.eta == '0':</span> + <span class="k">elif</span> <span class="n">c</span><span class="o">.</span><span class="n">gauss</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">eta</span><span class="p">:</span> + <span class="c1"># this is needed for data before 2008, or for reanalysis data</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'GG__SL'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Q'</span><span class="p">,</span> <span class="s1">'ML'</span><span class="p">,</span> <span class="s1">'1'</span><span class="p">,</span> \ + <span class="s1">'</span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">((</span><span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">resol</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)]</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'SH__ML'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'U/V/D'</span><span class="p">,</span> <span class="s1">'ML'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">glevelist</span><span class="p">,</span> <span class="s1">'OFF'</span><span class="p">]</span> + <span class="k">else</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Warning: This is a very costly parameter combination, </span><span class="se">\</span> +<span class="s1"> use only for debugging!'</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'GG__SL'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Q'</span><span class="p">,</span> <span class="s1">'ML'</span><span class="p">,</span> <span class="s1">'1'</span><span class="p">,</span> \ + <span class="s1">'</span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">((</span><span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">resol</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)]</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'GG__ML'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'U/V/D/77'</span><span class="p">,</span> <span class="s1">'ML'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">glevelist</span><span class="p">,</span> \ + <span class="s1">'</span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">((</span><span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">resol</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)]</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">omega</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__ML'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'/W'</span> + + <span class="c1"># add cloud water content if necessary</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">cwc</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__ML'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'/CLWC/CIWC'</span> + + <span class="c1"># add vorticity and geopotential height for WRF if necessary</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">wrf</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__ML'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'/Z/VO'</span> + <span class="k">if</span> <span class="s1">'/D'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__ML'</span><span class="p">][</span><span class="mi">0</span><span class="p">]:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__ML'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'/D'</span> + <span class="c1">#wrf_sfc = 'sp/msl/skt/2t/10u/10v/2d/z/lsm/sst/ci/sd/stl1/ /</span> + <span class="c1"># stl2/stl3/stl4/swvl1/swvl2/swvl3/swvl4'.upper()</span> + <span class="n">wrf_sfc</span> <span class="o">=</span> <span class="s1">'134/235/167/165/166/168/129/172/34/31/141/ </span><span class="se">\</span> +<span class="s1"> 139/170/183/236/39/40/41/42'</span> + <span class="n">lwrt_sfc</span> <span class="o">=</span> <span class="n">wrf_sfc</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span> + <span class="k">for</span> <span class="n">par</span> <span class="ow">in</span> <span class="n">lwrt_sfc</span><span class="p">:</span> + <span class="k">if</span> <span class="n">par</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__SL'</span><span class="p">][</span><span class="mi">0</span><span class="p">]:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG__SL'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'/'</span> <span class="o">+</span> <span class="n">par</span> + + <span class="k">else</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG_acc_SL'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"LSP/CP/SSHF/EWSS/NSSS/SSR"</span><span class="p">,</span> \ + <span class="s1">'SFC'</span><span class="p">,</span> <span class="s1">'1'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid</span><span class="p">]</span> + + <span class="k">return</span> + + + <span class="k">def</span> <span class="nf">_mk_targetname</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ftype</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="n">date</span><span class="p">):</span> + <span class="sd">'''Creates the filename for the requested grib data to be stored in.</span> +<span class="sd"> This name is passed as the "target" parameter in the request.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> ftype : :obj:`string`</span> +<span class="sd"> Shortcut name of the type of the field. E.g. AN, FC, PF, ...</span> + +<span class="sd"> param : :obj:`string`</span> +<span class="sd"> Shortcut of the grid type. E.g. SH__ML, SH__SL, GG__ML,</span> +<span class="sd"> GG__SL, OG__ML, OG__SL, OG_OROLSM_SL, OG_acc_SL</span> + +<span class="sd"> date : :obj:`string`</span> +<span class="sd"> The date period of the grib data to be stored in this file.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> targetname : :obj:`string`</span> +<span class="sd"> The target filename for the grib data.</span> +<span class="sd"> '''</span> + <span class="n">targetname</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">inputdir</span> <span class="o">+</span> <span class="s1">'/'</span> <span class="o">+</span> <span class="n">ftype</span> <span class="o">+</span> <span class="n">param</span> <span class="o">+</span> <span class="s1">'.'</span> <span class="o">+</span> <span class="n">date</span> <span class="o">+</span> <span class="s1">'.'</span> <span class="o">+</span> + <span class="nb">str</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getppid</span><span class="p">())</span> <span class="o">+</span> <span class="s1">'.'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getpid</span><span class="p">())</span> <span class="o">+</span> <span class="s1">'.grb'</span><span class="p">)</span> + + <span class="k">return</span> <span class="n">targetname</span> + + + <span class="k">def</span> <span class="nf">_start_retrievement</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">par_dict</span><span class="p">):</span> + <span class="sd">'''Creates the Mars Retrieval and prints or submits the request</span> +<span class="sd"> depending on the status of the request variable.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> request : :obj:`integer`</span> +<span class="sd"> Selects the mode of retrieval.</span> +<span class="sd"> 0: Retrieves the data from ECMWF.</span> +<span class="sd"> 1: Prints the mars requests to an output file.</span> +<span class="sd"> 2: Retrieves the data and prints the mars request.</span> + +<span class="sd"> par_dict : :obj:`dictionary`</span> +<span class="sd"> Contains all parameter which have to be set for creating the</span> +<span class="sd"> Mars Retrievals. The parameter are:</span> +<span class="sd"> marsclass, dataset, stream, type, levtype, levelist, resol,</span> +<span class="sd"> gaussian, accuracy, grid, target, area, date, time, number,</span> +<span class="sd"> step, expver, param</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="c1"># increase number of mars requests</span> + <span class="bp">self</span><span class="o">.</span><span class="n">mreq_count</span> <span class="o">+=</span> <span class="mi">1</span> + + <span class="n">MR</span> <span class="o">=</span> <span class="n">MarsRetrieval</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="p">,</span> + <span class="bp">self</span><span class="o">.</span><span class="n">public</span><span class="p">,</span> + <span class="n">marsclass</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'marsclass'</span><span class="p">],</span> + <span class="n">dataset</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'dataset'</span><span class="p">],</span> + <span class="n">stream</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'stream'</span><span class="p">],</span> + <span class="nb">type</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'type'</span><span class="p">],</span> + <span class="n">levtype</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'levtype'</span><span class="p">],</span> + <span class="n">levelist</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'levelist'</span><span class="p">],</span> + <span class="n">resol</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'resol'</span><span class="p">],</span> + <span class="n">gaussian</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'gaussian'</span><span class="p">],</span> + <span class="n">accuracy</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'accuracy'</span><span class="p">],</span> + <span class="n">grid</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'grid'</span><span class="p">],</span> + <span class="n">target</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'target'</span><span class="p">],</span> + <span class="n">area</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'area'</span><span class="p">],</span> + <span class="n">date</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">],</span> + <span class="n">time</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'time'</span><span class="p">],</span> + <span class="n">number</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'number'</span><span class="p">],</span> + <span class="n">step</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'step'</span><span class="p">],</span> + <span class="n">expver</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'expver'</span><span class="p">],</span> + <span class="n">param</span><span class="o">=</span><span class="n">par_dict</span><span class="p">[</span><span class="s1">'param'</span><span class="p">])</span> + + <span class="k">if</span> <span class="n">request</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> + <span class="n">MR</span><span class="o">.</span><span class="n">display_info</span><span class="p">()</span> + <span class="n">MR</span><span class="o">.</span><span class="n">data_retrieve</span><span class="p">()</span> + <span class="k">elif</span> <span class="n">request</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> + <span class="n">MR</span><span class="o">.</span><span class="n">print_infodata_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">mreq_count</span><span class="p">)</span> + <span class="k">elif</span> <span class="n">request</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> + <span class="n">MR</span><span class="o">.</span><span class="n">print_infodata_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">mreq_count</span><span class="p">)</span> + <span class="n">MR</span><span class="o">.</span><span class="n">display_info</span><span class="p">()</span> + <span class="n">MR</span><span class="o">.</span><span class="n">data_retrieve</span><span class="p">()</span> + <span class="k">else</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Failure'</span><span class="p">)</span> + + <span class="k">return</span> + + + <span class="k">def</span> <span class="nf">_mk_index_values</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inputdir</span><span class="p">,</span> <span class="n">inputfiles</span><span class="p">,</span> <span class="n">keys</span><span class="p">):</span> + <span class="sd">'''Creates an index file for a set of grib parameter keys.</span> +<span class="sd"> The values from the index keys are returned in a list.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> keys : :obj:`dictionary`</span> +<span class="sd"> List of parameter names which serves as index.</span> + +<span class="sd"> inputfiles : :obj:`UioFiles`</span> +<span class="sd"> Contains a list of files.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> iid : :obj:`grib_index`</span> +<span class="sd"> This is a grib specific index structure to access</span> +<span class="sd"> messages in a file.</span> + +<span class="sd"> index_vals : :obj:`list`</span> +<span class="sd"> Contains the values from the keys used for a distinct selection</span> +<span class="sd"> of grib messages in processing the grib files.</span> +<span class="sd"> Content looks like e.g.:</span> +<span class="sd"> index_vals[0]: ('20171106', '20171107', '20171108') ; date</span> +<span class="sd"> index_vals[1]: ('0', '1200', '1800', '600') ; time</span> +<span class="sd"> index_vals[2]: ('0', '12', '3', '6', '9') ; stepRange</span> +<span class="sd"> '''</span> + <span class="n">iid</span> <span class="o">=</span> <span class="kc">None</span> + <span class="n">index_keys</span> <span class="o">=</span> <span class="n">keys</span> + + <span class="n">indexfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">inputdir</span><span class="p">,</span> <span class="n">_config</span><span class="o">.</span><span class="n">FILE_GRIB_INDEX</span><span class="p">)</span> + <span class="n">silent_remove</span><span class="p">(</span><span class="n">indexfile</span><span class="p">)</span> + <span class="n">grib</span> <span class="o">=</span> <span class="n">GribTools</span><span class="p">(</span><span class="n">inputfiles</span><span class="o">.</span><span class="n">files</span><span class="p">)</span> + <span class="c1"># creates new index file</span> + <span class="n">iid</span> <span class="o">=</span> <span class="n">grib</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">index_keys</span><span class="o">=</span><span class="n">index_keys</span><span class="p">,</span> <span class="n">index_file</span><span class="o">=</span><span class="n">indexfile</span><span class="p">)</span> + + <span class="c1"># read the values of index keys</span> + <span class="n">index_vals</span> <span class="o">=</span> <span class="p">[]</span> + <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">index_keys</span><span class="p">:</span> + <span class="c1">#index_vals.append(grib_index_get(iid, key))</span> + <span class="c1">#print(index_vals[-1])</span> + <span class="n">key_vals</span> <span class="o">=</span> <span class="n">grib_index_get</span><span class="p">(</span><span class="n">iid</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="n">key_vals</span><span class="p">)</span> + <span class="c1"># have to sort the steps for disaggregation,</span> + <span class="c1"># therefore convert to int first</span> + <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s1">'step'</span><span class="p">:</span> + <span class="n">key_vals</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">k</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">key_vals</span><span class="p">]</span> + <span class="n">key_vals</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> + <span class="n">key_vals</span> <span class="o">=</span> <span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">k</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">key_vals</span><span class="p">]</span> + <span class="n">index_vals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key_vals</span><span class="p">)</span> + <span class="c1"># index_vals looks for example like:</span> + <span class="c1"># index_vals[0]: ('20171106', '20171107', '20171108') ; date</span> + <span class="c1"># index_vals[1]: ('0', '1200') ; time</span> + <span class="c1"># index_vals[2]: (3', '6', '9', '12') ; stepRange</span> + + <span class="k">return</span> <span class="n">iid</span><span class="p">,</span> <span class="n">index_vals</span> + + +<div class="viewcode-block" id="EcFlexpart.retrieve"><a class="viewcode-back" href="../api.html#EcFlexpart.EcFlexpart.retrieve">[docs]</a> <span class="k">def</span> <span class="nf">retrieve</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server</span><span class="p">,</span> <span class="n">dates</span><span class="p">,</span> <span class="n">public</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">inputdir</span><span class="o">=</span><span class="s1">'.'</span><span class="p">):</span> + <span class="sd">'''Finalizing the retrieval information by setting final details</span> +<span class="sd"> depending on grid type.</span> +<span class="sd"> Prepares MARS retrievals per grid type and submits them.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> server : :obj:`ECMWFService` or :obj:`ECMWFDataServer`</span> +<span class="sd"> The connection to the ECMWF server. This is different</span> +<span class="sd"> for member state users which have full access and non</span> +<span class="sd"> member state users which have only access to the public</span> +<span class="sd"> data sets. The decision is made from command line argument</span> +<span class="sd"> "public"; for public access its True (ECMWFDataServer)</span> +<span class="sd"> for member state users its False (ECMWFService)</span> + +<span class="sd"> dates : :obj:`string`</span> +<span class="sd"> Contains start and end date of the retrieval in the format</span> +<span class="sd"> "YYYYMMDD/to/YYYYMMDD"</span> + +<span class="sd"> request : :obj:`integer`</span> +<span class="sd"> Selects the mode of retrieval.</span> +<span class="sd"> 0: Retrieves the data from ECMWF.</span> +<span class="sd"> 1: Prints the mars requests to an output file.</span> +<span class="sd"> 2: Retrieves the data and prints the mars request.</span> + +<span class="sd"> inputdir : :obj:`string`, optional</span> +<span class="sd"> Path to the directory where the retrieved data is about</span> +<span class="sd"> to be stored. The default is the current directory ('.').</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="bp">self</span><span class="o">.</span><span class="n">dates</span> <span class="o">=</span> <span class="n">dates</span> + <span class="bp">self</span><span class="o">.</span><span class="n">server</span> <span class="o">=</span> <span class="n">server</span> + <span class="bp">self</span><span class="o">.</span><span class="n">public</span> <span class="o">=</span> <span class="n">public</span> + <span class="bp">self</span><span class="o">.</span><span class="n">inputdir</span> <span class="o">=</span> <span class="n">inputdir</span> + <span class="n">oro</span> <span class="o">=</span> <span class="kc">False</span> + + <span class="c1"># define times with datetime module</span> + <span class="n">t12h</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span> + <span class="n">t24h</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="mi">24</span><span class="p">)</span> + + <span class="c1"># dictionary which contains all parameter for the mars request,</span> + <span class="c1"># entries with a "None" will change in different requests and will</span> + <span class="c1"># therefore be set in each request seperately</span> + <span class="n">retr_param_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'marsclass'</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">marsclass</span><span class="p">,</span> + <span class="s1">'dataset'</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">dataset</span><span class="p">,</span> + <span class="s1">'stream'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'type'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'levtype'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'levelist'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'resol'</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">resol</span><span class="p">,</span> + <span class="s1">'gaussian'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'accuracy'</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">accuracy</span><span class="p">,</span> + <span class="s1">'grid'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'target'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'area'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'date'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'time'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'number'</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">number</span><span class="p">,</span> + <span class="s1">'step'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'expver'</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">expver</span><span class="p">,</span> + <span class="s1">'param'</span><span class="p">:</span><span class="kc">None</span><span class="p">}</span> + + <span class="k">for</span> <span class="n">ftype</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">:</span> + <span class="c1"># fk contains field types such as</span> + <span class="c1"># [AN, FC, PF, CV]</span> + <span class="c1"># fv contains all of the items of the belonging key</span> + <span class="c1"># [times, steps]</span> + <span class="k">for</span> <span class="n">pk</span><span class="p">,</span> <span class="n">pv</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span> + <span class="c1"># pk contains one of these keys of params</span> + <span class="c1"># [SH__ML, SH__SL, GG__ML, GG__SL, OG__ML, OG__SL,</span> + <span class="c1"># OG_OROLSM_SL, OG_acc_SL]</span> + <span class="c1"># pv contains all of the items of the belonging key</span> + <span class="c1"># [param, levtype, levelist, grid]</span> + <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pv</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span> + <span class="k">continue</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="o">=</span> <span class="n">ftype</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'time'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="n">ftype</span><span class="p">][</span><span class="s1">'times'</span><span class="p">]</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'step'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">[</span><span class="n">ftype</span><span class="p">][</span><span class="s1">'steps'</span><span class="p">]</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dates</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'stream'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'target'</span><span class="p">]</span> <span class="o">=</span> \ + <span class="bp">self</span><span class="o">.</span><span class="n">_mk_targetname</span><span class="p">(</span><span class="n">ftype</span><span class="p">,</span> + <span class="n">pk</span><span class="p">,</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'param'</span><span class="p">]</span> <span class="o">=</span> <span class="n">pv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'levtype'</span><span class="p">]</span> <span class="o">=</span> <span class="n">pv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'levelist'</span><span class="p">]</span> <span class="o">=</span> <span class="n">pv</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'grid'</span><span class="p">]</span> <span class="o">=</span> <span class="n">pv</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'area'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">area</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'gaussian'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">gaussian</span> + + <span class="k">if</span> <span class="n">pk</span> <span class="o">==</span> <span class="s1">'OG__SL'</span><span class="p">:</span> + <span class="k">pass</span> + <span class="k">if</span> <span class="n">pk</span> <span class="o">==</span> <span class="s1">'OG_OROLSM__SL'</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">oro</span><span class="p">:</span> + <span class="n">oro</span> <span class="o">=</span> <span class="kc">True</span> + <span class="c1"># in CERA20C (class EP) there is no stream "OPER"!</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">marsclass</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">'EP'</span><span class="p">:</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'stream'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'OPER'</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'AN'</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'time'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'00'</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'step'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'000'</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dates</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'target'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mk_targetname</span><span class="p">(</span><span class="s1">''</span><span class="p">,</span> + <span class="n">pk</span><span class="p">,</span> <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">])</span> + <span class="k">elif</span> <span class="n">pk</span> <span class="o">==</span> <span class="s1">'OG_OROLSM__SL'</span> <span class="ow">and</span> <span class="n">oro</span><span class="p">:</span> + <span class="k">continue</span> + <span class="k">if</span> <span class="n">pk</span> <span class="o">==</span> <span class="s1">'GG__SL'</span> <span class="ow">and</span> <span class="n">pv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'Q'</span><span class="p">:</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'area'</span><span class="p">]</span> <span class="o">=</span> <span class="s2">""</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'gaussian'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'reduced'</span> + + <span class="c1"># ------ on demand path --------------------------------------------------</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">basetime</span><span class="p">:</span> + <span class="c1"># ******* start retrievement</span> + <span class="bp">self</span><span class="o">.</span><span class="n">_start_retrievement</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">retr_param_dict</span><span class="p">)</span> + <span class="c1"># ------ operational path ------------------------------------------------</span> + <span class="k">else</span><span class="p">:</span> + <span class="c1"># check if mars job requests fields beyond basetime.</span> + <span class="c1"># if yes eliminate those fields since they may not</span> + <span class="c1"># be accessible with user's credentials</span> + + <span class="n">enddate</span> <span class="o">=</span> <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> + <span class="n">elimit</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">enddate</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">basetime</span><span class="p">,</span> + <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">%H'</span><span class="p">)</span> + + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">basetime</span> <span class="o">==</span> <span class="s1">'12'</span><span class="p">:</span> + <span class="c1"># -------------- flux data ----------------------------</span> + <span class="k">if</span> <span class="s1">'acc'</span> <span class="ow">in</span> <span class="n">pk</span><span class="p">:</span> + + <span class="c1"># Strategy:</span> + <span class="c1"># if maxtime-elimit >= 24h reduce date by 1,</span> + <span class="c1"># if 12h <= maxtime-elimit<12h reduce time for last date</span> + <span class="c1"># if maxtime-elimit<12h reduce step for last time</span> + <span class="c1"># A split of the MARS job into 2 is likely necessary.</span> + + + <span class="n">startdate</span> <span class="o">=</span> <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> + <span class="n">enddate</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">elimit</span> <span class="o">-</span> <span class="n">t24h</span><span class="p">,</span><span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'/'</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">startdate</span><span class="p">,</span> + <span class="s1">'to'</span><span class="p">,</span> + <span class="n">enddate</span><span class="p">])</span> + + <span class="c1"># ******* start retrievement</span> + <span class="bp">self</span><span class="o">.</span><span class="n">_start_retrievement</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">retr_param_dict</span><span class="p">)</span> + + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">]</span> <span class="o">=</span> \ + <span class="n">datetime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">elimit</span> <span class="o">-</span> <span class="n">t12h</span><span class="p">,</span> <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'time'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'00'</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'target'</span><span class="p">]</span> <span class="o">=</span> \ + <span class="bp">self</span><span class="o">.</span><span class="n">_mk_targetname</span><span class="p">(</span><span class="n">ftype</span><span class="p">,</span> <span class="n">pk</span><span class="p">,</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">])</span> + + <span class="c1"># ******* start retrievement</span> + <span class="bp">self</span><span class="o">.</span><span class="n">_start_retrievement</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">retr_param_dict</span><span class="p">)</span> + + <span class="c1"># -------------- non flux data ------------------------</span> + <span class="k">else</span><span class="p">:</span> + <span class="c1"># ******* start retrievement</span> + <span class="bp">self</span><span class="o">.</span><span class="n">_start_retrievement</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">retr_param_dict</span><span class="p">)</span> + + <span class="k">else</span><span class="p">:</span> <span class="c1"># basetime = 0</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">]</span> <span class="o">=</span> \ + <span class="n">datetime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">elimit</span> <span class="o">-</span> <span class="n">t24h</span><span class="p">,</span> <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span> + + <span class="n">timesave</span> <span class="o">=</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'time'</span><span class="p">])</span> + + <span class="k">if</span> <span class="s1">'/'</span> <span class="ow">in</span> <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'time'</span><span class="p">]:</span> + <span class="n">times</span> <span class="o">=</span> <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'time'</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span> + <span class="n">steps</span> <span class="o">=</span> <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'step'</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span> + <span class="k">while</span> <span class="p">(</span><span class="n">pk</span> <span class="o">!=</span> <span class="s1">'OG_OROLSM__SL'</span> <span class="ow">and</span> + <span class="s1">'acc'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">pk</span> <span class="ow">and</span> + <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">times</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="n">steps</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> <span class="o"><=</span> <span class="mi">12</span><span class="p">):</span> + <span class="n">times</span> <span class="o">=</span> <span class="n">times</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> + + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">times</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'time'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'/'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">times</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'time'</span><span class="p">]</span> <span class="o">=</span> <span class="n">times</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> + + <span class="c1"># ******* start retrievement</span> + <span class="bp">self</span><span class="o">.</span><span class="n">_start_retrievement</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">retr_param_dict</span><span class="p">)</span> + + <span class="k">if</span> <span class="p">(</span><span class="n">pk</span> <span class="o">!=</span> <span class="s1">'OG_OROLSM__SL'</span> <span class="ow">and</span> + <span class="nb">int</span><span class="p">(</span><span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'step'</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> + <span class="nb">int</span><span class="p">(</span><span class="n">timesave</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span><span class="p">):</span> + + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">]</span> <span class="o">=</span> \ + <span class="n">datetime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">elimit</span><span class="p">,</span> <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'time'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'00'</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'step'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'000'</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'target'</span><span class="p">]</span> <span class="o">=</span> \ + <span class="bp">self</span><span class="o">.</span><span class="n">_mk_targetname</span><span class="p">(</span><span class="n">ftype</span><span class="p">,</span> <span class="n">pk</span><span class="p">,</span> + <span class="n">retr_param_dict</span><span class="p">[</span><span class="s1">'date'</span><span class="p">])</span> + + <span class="c1"># ******* start retrievement</span> + <span class="bp">self</span><span class="o">.</span><span class="n">_start_retrievement</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">retr_param_dict</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">request</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">request</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'MARS retrieve done ... '</span><span class="p">)</span> + <span class="k">elif</span> <span class="n">request</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'MARS request printed ...'</span><span class="p">)</span> + + <span class="k">return</span></div> + + +<div class="viewcode-block" id="EcFlexpart.write_namelist"><a class="viewcode-back" href="../api.html#EcFlexpart.EcFlexpart.write_namelist">[docs]</a> <span class="k">def</span> <span class="nf">write_namelist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span> + <span class="sd">'''Creates a namelist file in the temporary directory and writes</span> +<span class="sd"> the following values to it: maxl, maxb, mlevel,</span> +<span class="sd"> mlevelist, mnauf, metapar, rlo0, rlo1, rla0, rla1,</span> +<span class="sd"> momega, momegadiff, mgauss, msmooth, meta, metadiff, mdpdeta</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> filename : :obj:`string`</span> +<span class="sd"> Name of the namelist file.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="kn">from</span> <span class="nn">genshi.template.text</span> <span class="k">import</span> <span class="n">NewTextTemplate</span> + <span class="kn">from</span> <span class="nn">genshi.template</span> <span class="k">import</span> <span class="n">TemplateLoader</span> + + <span class="n">loader</span> <span class="o">=</span> <span class="n">TemplateLoader</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_TEMPLATES</span><span class="p">,</span> <span class="n">auto_reload</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> + <span class="n">namelist_template</span> <span class="o">=</span> <span class="n">loader</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">TEMPFILE_NAMELIST</span><span class="p">,</span> + <span class="bp">cls</span><span class="o">=</span><span class="n">NewTextTemplate</span><span class="p">)</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">inputdir</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">inputdir</span> + <span class="n">area</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">area</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span> + <span class="n">grid</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">grid</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">))</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">area</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">></span> <span class="n">area</span><span class="p">[</span><span class="mi">3</span><span class="p">]:</span> + <span class="n">area</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">360</span> + <span class="n">maxl</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">area</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">-</span> <span class="n">area</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">/</span> <span class="n">grid</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span> <span class="mi">1</span> + <span class="n">maxb</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">area</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">area</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="o">/</span> <span class="n">grid</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="mi">1</span> + + <span class="n">stream</span> <span class="o">=</span> <span class="n">namelist_template</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span> + <span class="n">maxl</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">maxl</span><span class="p">),</span> + <span class="n">maxb</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">maxb</span><span class="p">),</span> + <span class="n">mlevel</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">level</span><span class="p">),</span> + <span class="n">mlevelist</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">levelist</span><span class="p">),</span> + <span class="n">mnauf</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">resol</span><span class="p">),</span> + <span class="n">metapar</span> <span class="o">=</span> <span class="s1">'77'</span><span class="p">,</span> + <span class="n">rlo0</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">area</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> + <span class="n">rlo1</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">area</span><span class="p">[</span><span class="mi">3</span><span class="p">]),</span> + <span class="n">rla0</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">area</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> + <span class="n">rla1</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">area</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> + <span class="n">momega</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">omega</span><span class="p">),</span> + <span class="n">momegadiff</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">omegadiff</span><span class="p">),</span> + <span class="n">mgauss</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">gauss</span><span class="p">),</span> + <span class="n">msmooth</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">smooth</span><span class="p">),</span> + <span class="n">meta</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">eta</span><span class="p">),</span> + <span class="n">metadiff</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">etadiff</span><span class="p">),</span> + <span class="n">mdpdeta</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dpdeta</span><span class="p">)</span> + <span class="p">)</span> + + <span class="n">namelistfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="n">_config</span><span class="o">.</span><span class="n">FILE_NAMELIST</span><span class="p">)</span> + + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">namelistfile</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">stream</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s1">'text'</span><span class="p">))</span> + + <span class="k">return</span></div> + + +<div class="viewcode-block" id="EcFlexpart.deacc_fluxes"><a class="viewcode-back" href="../api.html#EcFlexpart.EcFlexpart.deacc_fluxes">[docs]</a> <span class="k">def</span> <span class="nf">deacc_fluxes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inputfiles</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span> + <span class="sd">'''Goes through all flux fields in ordered time and de-accumulate</span> +<span class="sd"> the fields. Afterwards the fields are disaggregated in time.</span> +<span class="sd"> Different versions of disaggregation is provided for rainfall</span> +<span class="sd"> data (darain, modified linear) and the surface fluxes and</span> +<span class="sd"> stress data (dapoly, cubic polynomial).</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> inputfiles : :obj:`UioFiles`</span> +<span class="sd"> Contains a list of files.</span> + +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="n">table128</span> <span class="o">=</span> <span class="n">init128</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_GRIBTABLE</span><span class="p">)</span> + <span class="n">pars</span> <span class="o">=</span> <span class="n">to_param_id</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">[</span><span class="s1">'OG_acc_SL'</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="n">table128</span><span class="p">)</span> + + <span class="n">iid</span> <span class="o">=</span> <span class="kc">None</span> + <span class="n">index_vals</span> <span class="o">=</span> <span class="kc">None</span> + + <span class="c1"># get the values of the keys which are used for distinct access</span> + <span class="c1"># of grib messages via product</span> + <span class="n">index_keys</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"date"</span><span class="p">,</span> <span class="s2">"time"</span><span class="p">,</span> <span class="s2">"step"</span><span class="p">]</span> + <span class="n">iid</span><span class="p">,</span> <span class="n">index_vals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mk_index_values</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> + <span class="n">inputfiles</span><span class="p">,</span> + <span class="n">index_keys</span><span class="p">)</span> + <span class="c1"># index_vals looks like e.g.:</span> + <span class="c1"># index_vals[0]: ('20171106', '20171107', '20171108') ; date</span> + <span class="c1"># index_vals[1]: ('0', '1200', '1800', '600') ; time</span> + <span class="c1"># index_vals[2]: ('0', '12', '3', '6', '9') ; stepRange</span> + + <span class="n">valsdict</span> <span class="o">=</span> <span class="p">{}</span> + <span class="n">svalsdict</span> <span class="o">=</span> <span class="p">{}</span> +<span class="c1"># stepsdict = {}</span> + <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">pars</span><span class="p">:</span> + <span class="n">valsdict</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="p">)]</span> <span class="o">=</span> <span class="p">[]</span> + <span class="n">svalsdict</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="p">)]</span> <span class="o">=</span> <span class="p">[]</span> +<span class="c1"># stepsdict[str(p)] = []</span> + + <span class="nb">print</span><span class="p">(</span><span class="s1">'maxstep: '</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span><span class="p">)</span> + + <span class="c1"># "product" genereates each possible combination between the</span> + <span class="c1"># values of the index keys</span> + <span class="k">for</span> <span class="n">prod</span> <span class="ow">in</span> <span class="n">product</span><span class="p">(</span><span class="o">*</span><span class="n">index_vals</span><span class="p">):</span> + <span class="c1"># e.g. prod = ('20170505', '0', '12')</span> + <span class="c1"># ( date ,time, step)</span> + + <span class="nb">print</span><span class="p">(</span><span class="s1">'current product: '</span><span class="p">,</span> <span class="n">prod</span><span class="p">)</span> + + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">index_keys</span><span class="p">)):</span> + <span class="n">grib_index_select</span><span class="p">(</span><span class="n">iid</span><span class="p">,</span> <span class="n">index_keys</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">prod</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> + + <span class="c1"># get first id from current product</span> + <span class="n">gid</span> <span class="o">=</span> <span class="n">grib_new_from_index</span><span class="p">(</span><span class="n">iid</span><span class="p">)</span> + + <span class="c1"># if there is no data for this specific time combination / product</span> + <span class="c1"># skip the rest of the for loop and start with next timestep/product</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">gid</span><span class="p">:</span> + <span class="k">continue</span> + + <span class="c1"># create correct timestamp from the three time informations</span> + <span class="n">cdate</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'date'</span><span class="p">))</span> + <span class="n">ctime</span> <span class="o">=</span> <span class="s1">'</span><span class="si">{:0>2}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'time'</span><span class="p">)</span><span class="o">/</span><span class="mi">100</span><span class="p">)</span> + <span class="n">cstep</span> <span class="o">=</span> <span class="s1">'</span><span class="si">{:0>3}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'step'</span><span class="p">))</span> + <span class="n">t_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">cdate</span> <span class="o">+</span> <span class="n">ctime</span><span class="p">,</span> <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">%H'</span><span class="p">)</span> + <span class="n">t_dt</span> <span class="o">=</span> <span class="n">t_date</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">cstep</span><span class="p">))</span> + <span class="n">t_m1dt</span> <span class="o">=</span> <span class="n">t_date</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">cstep</span><span class="p">)</span><span class="o">-</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">))</span> + <span class="n">t_m2dt</span> <span class="o">=</span> <span class="n">t_date</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">cstep</span><span class="p">)</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">))</span> + <span class="n">t_enddate</span> <span class="o">=</span> <span class="kc">None</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">></span> <span class="mi">12</span><span class="p">:</span> + <span class="n">fnout</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="s1">'flux'</span> <span class="o">+</span> + <span class="n">t_date</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">.%H'</span><span class="p">)</span> <span class="o">+</span> + <span class="s1">'.</span><span class="si">{:0>3}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">step</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">)))</span> + <span class="n">gnout</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="s1">'flux'</span> <span class="o">+</span> + <span class="n">t_date</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">.%H'</span><span class="p">)</span> <span class="o">+</span> + <span class="s1">'.</span><span class="si">{:0>3}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">step</span><span class="o">-</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">)))</span> + <span class="n">hnout</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="s1">'flux'</span> <span class="o">+</span> + <span class="n">t_date</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">.%H'</span><span class="p">)</span> <span class="o">+</span> + <span class="s1">'.</span><span class="si">{:0>3}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">step</span><span class="p">))</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">fnout</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="s1">'flux'</span> <span class="o">+</span> + <span class="n">t_m2dt</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">%H'</span><span class="p">))</span> + <span class="n">gnout</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="s1">'flux'</span> <span class="o">+</span> + <span class="n">t_m1dt</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">%H'</span><span class="p">))</span> + <span class="n">hnout</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="s1">'flux'</span> <span class="o">+</span> + <span class="n">t_dt</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">%H'</span><span class="p">))</span> + + <span class="nb">print</span><span class="p">(</span><span class="s2">"outputfile = "</span> <span class="o">+</span> <span class="n">fnout</span><span class="p">)</span> + + <span class="c1"># read message for message and store relevant data fields</span> + <span class="c1"># data keywords are stored in pars</span> + <span class="k">while</span> <span class="mi">1</span><span class="p">:</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">gid</span><span class="p">:</span> + <span class="k">break</span> + <span class="n">cparamId</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'paramId'</span><span class="p">))</span> + <span class="n">step</span> <span class="o">=</span> <span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'step'</span><span class="p">)</span> + <span class="n">time</span> <span class="o">=</span> <span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'time'</span><span class="p">)</span> + <span class="n">ni</span> <span class="o">=</span> <span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'Ni'</span><span class="p">)</span> + <span class="n">nj</span> <span class="o">=</span> <span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'Nj'</span><span class="p">)</span> + <span class="k">if</span> <span class="n">cparamId</span> <span class="ow">in</span> <span class="n">valsdict</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span> + <span class="n">values</span> <span class="o">=</span> <span class="n">grib_get_values</span><span class="p">(</span><span class="n">gid</span><span class="p">)</span> + <span class="n">vdp</span> <span class="o">=</span> <span class="n">valsdict</span><span class="p">[</span><span class="n">cparamId</span><span class="p">]</span> + <span class="n">svdp</span> <span class="o">=</span> <span class="n">svalsdict</span><span class="p">[</span><span class="n">cparamId</span><span class="p">]</span> + <span class="c1"># sd = stepsdict[cparamId]</span> + + <span class="k">if</span> <span class="n">cparamId</span> <span class="o">==</span> <span class="s1">'142'</span> <span class="ow">or</span> <span class="n">cparamId</span> <span class="o">==</span> <span class="s1">'143'</span><span class="p">:</span> + <span class="n">fak</span> <span class="o">=</span> <span class="mf">1.</span> <span class="o">/</span> <span class="mf">1000.</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">fak</span> <span class="o">=</span> <span class="mf">3600.</span> + + <span class="n">values</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="p">(</span><span class="n">nj</span><span class="p">,</span> <span class="n">ni</span><span class="p">)))</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span> <span class="o">/</span> <span class="n">fak</span> + <span class="n">vdp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">values</span><span class="p">[:])</span> <span class="c1"># save the accumulated values</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">marsclass</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'EA'</span> <span class="ow">or</span> \ + <span class="n">step</span> <span class="o"><=</span> <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">):</span> + <span class="n">svdp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">values</span><span class="p">[:]</span> <span class="o">/</span> <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">))</span> + <span class="k">else</span><span class="p">:</span> <span class="c1"># deaccumulate values</span> + <span class="n">svdp</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">vdp</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">vdp</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">])</span> <span class="o">/</span> <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">))</span> + + <span class="nb">print</span><span class="p">(</span><span class="n">cparamId</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="n">step</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">values</span><span class="p">),</span> + <span class="n">values</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">np</span><span class="o">.</span><span class="n">std</span><span class="p">(</span><span class="n">values</span><span class="p">))</span> + + <span class="c1"># len(svdp) correspond to the time</span> + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">svdp</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">3</span><span class="p">:</span> + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">svdp</span><span class="p">)</span> <span class="o">></span> <span class="mi">3</span><span class="p">:</span> + <span class="k">if</span> <span class="n">cparamId</span> <span class="o">==</span> <span class="s1">'142'</span> <span class="ow">or</span> <span class="n">cparamId</span> <span class="o">==</span> <span class="s1">'143'</span><span class="p">:</span> + <span class="n">values</span> <span class="o">=</span> <span class="n">disaggregation</span><span class="o">.</span><span class="n">darain</span><span class="p">(</span><span class="n">svdp</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">values</span> <span class="o">=</span> <span class="n">disaggregation</span><span class="o">.</span><span class="n">dapoly</span><span class="p">(</span><span class="n">svdp</span><span class="p">)</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">step</span> <span class="o">==</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="ow">and</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">></span> <span class="mi">12</span> \ + <span class="ow">or</span> <span class="n">t_dt</span> <span class="o">==</span> <span class="n">t_enddate</span><span class="p">):</span> + <span class="n">vdp</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> + <span class="n">svdp</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">></span> <span class="mi">12</span><span class="p">:</span> + <span class="n">values</span> <span class="o">=</span> <span class="n">svdp</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">values</span> <span class="o">=</span> <span class="n">svdp</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> + + <span class="n">grib_set_values</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">values</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">></span> <span class="mi">12</span><span class="p">:</span> + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'step'</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">step</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">)))</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'step'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'time'</span><span class="p">,</span> <span class="n">t_m2dt</span><span class="o">.</span><span class="n">hour</span><span class="o">*</span><span class="mi">100</span><span class="p">)</span> + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'date'</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">t_m2dt</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">'</span><span class="p">)))</span> + + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">fnout</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f_handle</span><span class="p">:</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">f_handle</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span><span class="p">:</span> + <span class="n">t_enddate</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">end_date</span> <span class="o">+</span> + <span class="n">c</span><span class="o">.</span><span class="n">basetime</span><span class="p">,</span> + <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">%H'</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">t_enddate</span> <span class="o">=</span> <span class="n">t_date</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">))</span> + + <span class="c1"># squeeze out information of last two steps contained</span> + <span class="c1"># in svdp</span> + <span class="c1"># if step+int(c.dtime) == c.maxstep and c.maxstep>12</span> + <span class="c1"># or t_dt+timedelta(hours = int(c.dtime))</span> + <span class="c1"># >= t_enddate:</span> + <span class="c1"># Note that svdp[0] has not been popped in this case</span> + + <span class="k">if</span> <span class="n">step</span> <span class="o">==</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="ow">and</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">></span> <span class="mi">12</span> <span class="ow">or</span> \ + <span class="n">t_dt</span> <span class="o">==</span> <span class="n">t_enddate</span><span class="p">:</span> + + <span class="n">values</span> <span class="o">=</span> <span class="n">svdp</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> + <span class="n">grib_set_values</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">values</span><span class="p">)</span> + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'step'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> + <span class="n">truedatetime</span> <span class="o">=</span> <span class="n">t_m2dt</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span> + <span class="mi">2</span><span class="o">*</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">))</span> + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'time'</span><span class="p">,</span> <span class="n">truedatetime</span><span class="o">.</span><span class="n">hour</span> <span class="o">*</span> <span class="mi">100</span><span class="p">)</span> + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'date'</span><span class="p">,</span> <span class="n">truedatetime</span><span class="o">.</span><span class="n">year</span> <span class="o">*</span> <span class="mi">10000</span> <span class="o">+</span> + <span class="n">truedatetime</span><span class="o">.</span><span class="n">month</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">+</span> + <span class="n">truedatetime</span><span class="o">.</span><span class="n">day</span><span class="p">)</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">hnout</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">h_handle</span><span class="p">:</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">h_handle</span><span class="p">)</span> + + <span class="c1">#values = (svdp[1]+svdp[2])/2.</span> + <span class="k">if</span> <span class="n">cparamId</span> <span class="o">==</span> <span class="s1">'142'</span> <span class="ow">or</span> <span class="n">cparamId</span> <span class="o">==</span> <span class="s1">'143'</span><span class="p">:</span> + <span class="n">values</span> <span class="o">=</span> <span class="n">disaggregation</span><span class="o">.</span><span class="n">darain</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">reversed</span><span class="p">(</span><span class="n">svdp</span><span class="p">)))</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">values</span> <span class="o">=</span> <span class="n">disaggregation</span><span class="o">.</span><span class="n">dapoly</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">reversed</span><span class="p">(</span><span class="n">svdp</span><span class="p">)))</span> + + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'step'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> + <span class="n">truedatetime</span> <span class="o">=</span> <span class="n">t_m2dt</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">dtime</span><span class="p">))</span> + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'time'</span><span class="p">,</span> <span class="n">truedatetime</span><span class="o">.</span><span class="n">hour</span> <span class="o">*</span> <span class="mi">100</span><span class="p">)</span> + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'date'</span><span class="p">,</span> <span class="n">truedatetime</span><span class="o">.</span><span class="n">year</span> <span class="o">*</span> <span class="mi">10000</span> <span class="o">+</span> + <span class="n">truedatetime</span><span class="o">.</span><span class="n">month</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">+</span> + <span class="n">truedatetime</span><span class="o">.</span><span class="n">day</span><span class="p">)</span> + <span class="n">grib_set_values</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">values</span><span class="p">)</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">gnout</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">g_handle</span><span class="p">:</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">g_handle</span><span class="p">)</span> + + <span class="n">grib_release</span><span class="p">(</span><span class="n">gid</span><span class="p">)</span> + + <span class="n">gid</span> <span class="o">=</span> <span class="n">grib_new_from_index</span><span class="p">(</span><span class="n">iid</span><span class="p">)</span> + + <span class="n">grib_index_release</span><span class="p">(</span><span class="n">iid</span><span class="p">)</span> + + <span class="k">return</span></div> + + +<div class="viewcode-block" id="EcFlexpart.create"><a class="viewcode-back" href="../api.html#EcFlexpart.EcFlexpart.create">[docs]</a> <span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inputfiles</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span> + <span class="sd">'''An index file will be created which depends on the combination</span> +<span class="sd"> of "date", "time" and "stepRange" values. This is used to iterate</span> +<span class="sd"> over all messages in each grib file which were passed through the</span> +<span class="sd"> parameter "inputfiles" to seperate specific parameters into fort.*</span> +<span class="sd"> files. Afterwards the FORTRAN program is called to convert</span> +<span class="sd"> the data fields all to the same grid and put them in one file</span> +<span class="sd"> per unique time step (combination of "date", "time" and</span> +<span class="sd"> "stepRange").</span> + +<span class="sd"> Note</span> +<span class="sd"> ----</span> +<span class="sd"> This method is based on the ECMWF example index.py</span> +<span class="sd"> https://software.ecmwf.int/wiki/display/GRIB/index.py</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> inputfiles : :obj:`UioFiles`</span> +<span class="sd"> Contains a list of files.</span> + +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">wrf</span><span class="p">:</span> + <span class="n">table128</span> <span class="o">=</span> <span class="n">init128</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_GRIBTABLE</span><span class="p">)</span> + <span class="n">wrfpars</span> <span class="o">=</span> <span class="n">to_param_id</span><span class="p">(</span><span class="s1">'sp/mslp/skt/2t/10u/10v/2d/z/lsm/sst/ci/sd/</span><span class="se">\</span> +<span class="s1"> stl1/stl2/stl3/stl4/swvl1/swvl2/swvl3/swvl4'</span><span class="p">,</span> + <span class="n">table128</span><span class="p">)</span> + + <span class="c1"># these numbers are indices for the temporary files "fort.xx"</span> + <span class="c1"># which are used to seperate the grib fields to,</span> + <span class="c1"># for the Fortran program input</span> + <span class="c1"># 10: U,V | 11: T | 12: lnsp | 13: D | 16: sfc fields</span> + <span class="c1"># 17: Q | 18: Q , gaussian| 19: w | 21: etadot | 22: clwc+ciwc</span> + <span class="n">fdict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'10'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> <span class="s1">'11'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> <span class="s1">'12'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> <span class="s1">'13'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> <span class="s1">'16'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> + <span class="s1">'17'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> <span class="s1">'18'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> <span class="s1">'19'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> <span class="s1">'21'</span><span class="p">:</span><span class="kc">None</span><span class="p">,</span> <span class="s1">'22'</span><span class="p">:</span><span class="kc">None</span><span class="p">}</span> + + <span class="n">iid</span> <span class="o">=</span> <span class="kc">None</span> + <span class="n">index_vals</span> <span class="o">=</span> <span class="kc">None</span> + + <span class="c1"># get the values of the keys which are used for distinct access</span> + <span class="c1"># of grib messages via product</span> + <span class="n">index_keys</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"date"</span><span class="p">,</span> <span class="s2">"time"</span><span class="p">,</span> <span class="s2">"step"</span><span class="p">]</span> + <span class="n">iid</span><span class="p">,</span> <span class="n">index_vals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mk_index_values</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> + <span class="n">inputfiles</span><span class="p">,</span> + <span class="n">index_keys</span><span class="p">)</span> + <span class="c1"># index_vals looks like e.g.:</span> + <span class="c1"># index_vals[0]: ('20171106', '20171107', '20171108') ; date</span> + <span class="c1"># index_vals[1]: ('0', '1200', '1800', '600') ; time</span> + <span class="c1"># index_vals[2]: ('0', '12', '3', '6', '9') ; stepRange</span> + + <span class="c1"># "product" genereates each possible combination between the</span> + <span class="c1"># values of the index keys</span> + <span class="k">for</span> <span class="n">prod</span> <span class="ow">in</span> <span class="n">product</span><span class="p">(</span><span class="o">*</span><span class="n">index_vals</span><span class="p">):</span> + <span class="c1"># e.g. prod = ('20170505', '0', '12')</span> + <span class="c1"># ( date ,time, step)</span> + + <span class="nb">print</span><span class="p">(</span><span class="s1">'current product: '</span><span class="p">,</span> <span class="n">prod</span><span class="p">)</span> + + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">index_keys</span><span class="p">)):</span> + <span class="n">grib_index_select</span><span class="p">(</span><span class="n">iid</span><span class="p">,</span> <span class="n">index_keys</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">prod</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> + + <span class="c1"># get first id from current product</span> + <span class="n">gid</span> <span class="o">=</span> <span class="n">grib_new_from_index</span><span class="p">(</span><span class="n">iid</span><span class="p">)</span> + + <span class="c1"># if there is no data for this specific time combination / product</span> + <span class="c1"># skip the rest of the for loop and start with next timestep/product</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">gid</span><span class="p">:</span> + <span class="k">continue</span> + + <span class="c1"># remove old fort.* files and open new ones</span> + <span class="c1"># they are just valid for a single product</span> + <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fdict</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span> + <span class="n">fortfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="s1">'fort.'</span> <span class="o">+</span> <span class="n">k</span><span class="p">)</span> + <span class="n">silent_remove</span><span class="p">(</span><span class="n">fortfile</span><span class="p">)</span> + <span class="n">fdict</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">fortfile</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> + + <span class="c1"># create correct timestamp from the three time informations</span> + <span class="n">cdate</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'date'</span><span class="p">))</span> + <span class="n">ctime</span> <span class="o">=</span> <span class="s1">'</span><span class="si">{:0>2}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'time'</span><span class="p">)</span><span class="o">/</span><span class="mi">100</span><span class="p">)</span> + <span class="n">cstep</span> <span class="o">=</span> <span class="s1">'</span><span class="si">{:0>3}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'step'</span><span class="p">))</span> + <span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">cdate</span> <span class="o">+</span> <span class="n">ctime</span><span class="p">,</span> <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">%H'</span><span class="p">)</span> + <span class="n">timestamp</span> <span class="o">+=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">cstep</span><span class="p">))</span> + <span class="n">cdate_hour</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">timestamp</span><span class="p">,</span> <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">%H'</span><span class="p">)</span> + + <span class="c1"># if the timestamp is out of basetime start/end date period,</span> + <span class="c1"># skip this specific product</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span><span class="p">:</span> + <span class="n">start_time</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">end_date</span> <span class="o">+</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span><span class="p">,</span> + <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">%H'</span><span class="p">)</span> <span class="o">-</span> <span class="n">time_delta</span> + <span class="n">end_time</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">end_date</span> <span class="o">+</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span><span class="p">,</span> + <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">%H'</span><span class="p">)</span> + <span class="k">if</span> <span class="n">timestamp</span> <span class="o"><</span> <span class="n">start_time</span> <span class="ow">or</span> <span class="n">timestamp</span> <span class="o">></span> <span class="n">end_time</span><span class="p">:</span> + <span class="k">continue</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">wrf</span><span class="p">:</span> + <span class="k">if</span> <span class="s1">'olddate'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">locals</span><span class="p">()</span> <span class="ow">or</span> <span class="n">cdate</span> <span class="o">!=</span> <span class="n">olddate</span><span class="p">:</span> + <span class="n">fwrf</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">outputdir</span><span class="p">,</span> + <span class="s1">'WRF'</span> <span class="o">+</span> <span class="n">cdate</span> <span class="o">+</span> <span class="s1">'.'</span> <span class="o">+</span> <span class="n">ctime</span> <span class="o">+</span> <span class="s1">'.000.grb2'</span><span class="p">),</span> <span class="s1">'w'</span><span class="p">)</span> + <span class="n">olddate</span> <span class="o">=</span> <span class="n">cdate</span><span class="p">[:]</span> + + <span class="c1"># savedfields remembers which fields were already used.</span> + <span class="n">savedfields</span> <span class="o">=</span> <span class="p">[]</span> + <span class="c1"># sum of cloud liquid and ice water content</span> + <span class="n">scwc</span> <span class="o">=</span> <span class="kc">None</span> + <span class="k">while</span> <span class="mi">1</span><span class="p">:</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">gid</span><span class="p">:</span> + <span class="k">break</span> + <span class="n">paramId</span> <span class="o">=</span> <span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'paramId'</span><span class="p">)</span> + <span class="n">gridtype</span> <span class="o">=</span> <span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'gridType'</span><span class="p">)</span> + <span class="n">levtype</span> <span class="o">=</span> <span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'typeOfLevel'</span><span class="p">)</span> + <span class="k">if</span> <span class="n">paramId</span> <span class="o">==</span> <span class="mi">77</span><span class="p">:</span> <span class="c1"># ETADOT</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fdict</span><span class="p">[</span><span class="s1">'21'</span><span class="p">])</span> + <span class="k">elif</span> <span class="n">paramId</span> <span class="o">==</span> <span class="mi">130</span><span class="p">:</span> <span class="c1"># T</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fdict</span><span class="p">[</span><span class="s1">'11'</span><span class="p">])</span> + <span class="k">elif</span> <span class="n">paramId</span> <span class="o">==</span> <span class="mi">131</span> <span class="ow">or</span> <span class="n">paramId</span> <span class="o">==</span> <span class="mi">132</span><span class="p">:</span> <span class="c1"># U, V wind component</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fdict</span><span class="p">[</span><span class="s1">'10'</span><span class="p">])</span> + <span class="k">elif</span> <span class="n">paramId</span> <span class="o">==</span> <span class="mi">133</span> <span class="ow">and</span> <span class="n">gridtype</span> <span class="o">!=</span> <span class="s1">'reduced_gg'</span><span class="p">:</span> <span class="c1"># Q</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fdict</span><span class="p">[</span><span class="s1">'17'</span><span class="p">])</span> + <span class="k">elif</span> <span class="n">paramId</span> <span class="o">==</span> <span class="mi">133</span> <span class="ow">and</span> <span class="n">gridtype</span> <span class="o">==</span> <span class="s1">'reduced_gg'</span><span class="p">:</span> <span class="c1"># Q, gaussian</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fdict</span><span class="p">[</span><span class="s1">'18'</span><span class="p">])</span> + <span class="k">elif</span> <span class="n">paramId</span> <span class="o">==</span> <span class="mi">135</span><span class="p">:</span> <span class="c1"># W</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fdict</span><span class="p">[</span><span class="s1">'19'</span><span class="p">])</span> + <span class="k">elif</span> <span class="n">paramId</span> <span class="o">==</span> <span class="mi">152</span><span class="p">:</span> <span class="c1"># LNSP</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fdict</span><span class="p">[</span><span class="s1">'12'</span><span class="p">])</span> + <span class="k">elif</span> <span class="n">paramId</span> <span class="o">==</span> <span class="mi">155</span> <span class="ow">and</span> <span class="n">gridtype</span> <span class="o">==</span> <span class="s1">'sh'</span><span class="p">:</span> <span class="c1"># D</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fdict</span><span class="p">[</span><span class="s1">'13'</span><span class="p">])</span> + <span class="k">elif</span> <span class="n">paramId</span> <span class="o">==</span> <span class="mi">246</span> <span class="ow">or</span> <span class="n">paramId</span> <span class="o">==</span> <span class="mi">247</span><span class="p">:</span> <span class="c1"># CLWC, CIWC</span> + <span class="c1"># sum cloud liquid water and ice</span> + <span class="k">if</span> <span class="n">scwc</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> + <span class="n">scwc</span> <span class="o">=</span> <span class="n">grib_get_values</span><span class="p">(</span><span class="n">gid</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">scwc</span> <span class="o">+=</span> <span class="n">grib_get_values</span><span class="p">(</span><span class="n">gid</span><span class="p">)</span> + <span class="n">grib_set_values</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">scwc</span><span class="p">)</span> + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="s1">'paramId'</span><span class="p">,</span> <span class="mi">201031</span><span class="p">)</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fdict</span><span class="p">[</span><span class="s1">'22'</span><span class="p">])</span> + <span class="k">elif</span> <span class="n">c</span><span class="o">.</span><span class="n">wrf</span> <span class="ow">and</span> <span class="n">paramId</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">129</span><span class="p">,</span> <span class="mi">138</span><span class="p">,</span> <span class="mi">155</span><span class="p">]</span> <span class="ow">and</span> \ + <span class="n">levtype</span> <span class="o">==</span> <span class="s1">'hybrid'</span><span class="p">:</span> <span class="c1"># Z, VO, D</span> + <span class="c1"># do not do anything right now</span> + <span class="c1"># these are specific parameter for WRF</span> + <span class="k">pass</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">if</span> <span class="n">paramId</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">savedfields</span><span class="p">:</span> + <span class="c1"># SD/MSL/TCC/10U/10V/2T/2D/Z/LSM/SDOR/CVL/CVH/SR</span> + <span class="c1"># and all ADDPAR parameter</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fdict</span><span class="p">[</span><span class="s1">'16'</span><span class="p">])</span> + <span class="n">savedfields</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">paramId</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'duplicate '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">paramId</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' not written'</span><span class="p">)</span> + + <span class="k">try</span><span class="p">:</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">wrf</span><span class="p">:</span> + <span class="c1"># model layer</span> + <span class="k">if</span> <span class="n">levtype</span> <span class="o">==</span> <span class="s1">'hybrid'</span> <span class="ow">and</span> \ + <span class="n">paramId</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">129</span><span class="p">,</span> <span class="mi">130</span><span class="p">,</span> <span class="mi">131</span><span class="p">,</span> <span class="mi">132</span><span class="p">,</span> <span class="mi">133</span><span class="p">,</span> <span class="mi">138</span><span class="p">,</span> <span class="mi">155</span><span class="p">]:</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fwrf</span><span class="p">)</span> + <span class="c1"># sfc layer</span> + <span class="k">elif</span> <span class="n">paramId</span> <span class="ow">in</span> <span class="n">wrfpars</span><span class="p">:</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fwrf</span><span class="p">)</span> + <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> + <span class="k">pass</span> + + <span class="n">grib_release</span><span class="p">(</span><span class="n">gid</span><span class="p">)</span> + <span class="n">gid</span> <span class="o">=</span> <span class="n">grib_new_from_index</span><span class="p">(</span><span class="n">iid</span><span class="p">)</span> + + <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fdict</span><span class="o">.</span><span class="n">values</span><span class="p">():</span> + <span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + + <span class="c1"># call for Fortran program to convert e.g. reduced_gg grids to</span> + <span class="c1"># regular_ll and calculate detadot/dp</span> + <span class="n">pwd</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span> + <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">)</span> + <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">stat</span><span class="p">(</span><span class="s1">'fort.21'</span><span class="p">)</span><span class="o">.</span><span class="n">st_size</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">c</span><span class="o">.</span><span class="n">eta</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Parameter 77 (etadot) is missing, most likely it is </span><span class="se">\</span> +<span class="s1"> not available for this type or date/time</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Check parameters CLASS, TYPE, STREAM, START_DATE</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="n">my_error</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">mailfail</span><span class="p">,</span> <span class="s1">'fort.21 is empty while parameter eta </span><span class="se">\</span> +<span class="s1"> is set to 1 in CONTROL file'</span><span class="p">)</span> + + <span class="c1"># Fortran program creates file fort.15 (with u,v,etadot,t,sp,q)</span> + <span class="n">p</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">check_call</span><span class="p">([</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> + <span class="n">c</span><span class="o">.</span><span class="n">exedir</span><span class="p">,</span> <span class="n">_config</span><span class="o">.</span><span class="n">FORTRAN_EXECUTABLE</span><span class="p">)],</span> <span class="n">shell</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> + <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">pwd</span><span class="p">)</span> + + <span class="c1"># create name of final output file, e.g. EN13040500 (ENYYMMDDHH)</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">></span> <span class="mi">12</span><span class="p">:</span> + <span class="n">suffix</span> <span class="o">=</span> <span class="n">cdate</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">8</span><span class="p">]</span> <span class="o">+</span> <span class="s1">'.'</span> <span class="o">+</span> <span class="n">ctime</span> <span class="o">+</span> <span class="s1">'.'</span> <span class="o">+</span> <span class="n">cstep</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">suffix</span> <span class="o">=</span> <span class="n">cdate_hour</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">10</span><span class="p">]</span> + <span class="n">fnout</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">prefix</span> <span class="o">+</span> <span class="n">suffix</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"outputfile = "</span> <span class="o">+</span> <span class="n">fnout</span><span class="p">)</span> + <span class="c1"># collect for final processing</span> + <span class="bp">self</span><span class="o">.</span><span class="n">outputfilelist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">fnout</span><span class="p">))</span> + + <span class="c1"># create outputfile and copy all data from intermediate files</span> + <span class="c1"># to the outputfile (final GRIB input files for FLEXPART)</span> + <span class="n">orolsm</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span> <span class="o">+</span> + <span class="s1">'/OG_OROLSM__SL.*.'</span> <span class="o">+</span> <span class="n">c</span><span class="o">.</span><span class="n">ppid</span> <span class="o">+</span> <span class="s1">'*'</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span> + <span class="n">fluxfile</span> <span class="o">=</span> <span class="s1">'flux'</span> <span class="o">+</span> <span class="n">cdate</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">suffix</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">cwc</span><span class="p">:</span> + <span class="n">flist</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'fort.15'</span><span class="p">,</span> <span class="n">fluxfile</span><span class="p">,</span> <span class="s1">'fort.16'</span><span class="p">,</span> <span class="n">orolsm</span><span class="p">]</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">flist</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'fort.15'</span><span class="p">,</span> <span class="s1">'fort.22'</span><span class="p">,</span> <span class="n">fluxfile</span><span class="p">,</span> <span class="s1">'fort.16'</span><span class="p">,</span> <span class="n">orolsm</span><span class="p">]</span> + + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">fnout</span><span class="p">,</span> <span class="s1">'wb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fout</span><span class="p">:</span> + <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">flist</span><span class="p">:</span> + <span class="n">shutil</span><span class="o">.</span><span class="n">copyfileobj</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="n">f</span><span class="p">),</span> <span class="s1">'rb'</span><span class="p">),</span> + <span class="n">fout</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">omega</span><span class="p">:</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">outputdir</span><span class="p">,</span> <span class="s1">'OMEGA'</span><span class="p">),</span> <span class="s1">'wb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fout</span><span class="p">:</span> + <span class="n">shutil</span><span class="o">.</span><span class="n">copyfileobj</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="s1">'fort.25'</span><span class="p">),</span> + <span class="s1">'rb'</span><span class="p">),</span> <span class="n">fout</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">wrf</span><span class="p">:</span> + <span class="n">fwrf</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + + <span class="n">grib_index_release</span><span class="p">(</span><span class="n">iid</span><span class="p">)</span> + + <span class="k">return</span></div> + + +<div class="viewcode-block" id="EcFlexpart.process_output"><a class="viewcode-back" href="../api.html#EcFlexpart.EcFlexpart.process_output">[docs]</a> <span class="k">def</span> <span class="nf">process_output</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span> + <span class="sd">'''The grib files are postprocessed depending on the selection in</span> +<span class="sd"> CONTROL file. The resulting files are moved to the output</span> +<span class="sd"> directory if its not equal to the input directory.</span> +<span class="sd"> The following modifications might be done if</span> +<span class="sd"> properly switched in CONTROL file:</span> +<span class="sd"> GRIB2 - Conversion to GRIB2</span> +<span class="sd"> ECTRANS - Transfer of files to gateway server</span> +<span class="sd"> ECSTORAGE - Storage at ECMWF server</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="se">\n\n</span><span class="s1">Postprocessing:</span><span class="se">\n</span><span class="s1"> Format: </span><span class="si">{}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">format</span><span class="p">))</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">ecapi</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'ecstorage: </span><span class="si">{}</span><span class="se">\n</span><span class="s1"> ecfsdir: </span><span class="si">{}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span> + <span class="nb">format</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">ecstorage</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">ecfsdir</span><span class="p">))</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'ectrans: </span><span class="si">{}</span><span class="se">\n</span><span class="s1"> gateway: </span><span class="si">{}</span><span class="se">\n</span><span class="s1"> destination: </span><span class="si">{}</span><span class="se">\n</span><span class="s1"> '</span> + <span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">ectrans</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">gateway</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">destination</span><span class="p">))</span> + + <span class="nb">print</span><span class="p">(</span><span class="s1">'Output filelist: '</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">outputfilelist</span><span class="p">)</span> + + <span class="k">for</span> <span class="n">ofile</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">outputfilelist</span><span class="p">:</span> + <span class="n">ofile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="n">ofile</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">format</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'grib2'</span><span class="p">:</span> + <span class="n">p</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">check_call</span><span class="p">([</span><span class="s1">'grib_set'</span><span class="p">,</span> <span class="s1">'-s'</span><span class="p">,</span> <span class="s1">'edition=2, </span><span class="se">\</span> +<span class="s1"> productDefinitionTemplateNumber=8'</span><span class="p">,</span> + <span class="n">ofile</span><span class="p">,</span> <span class="n">ofile</span> <span class="o">+</span> <span class="s1">'_2'</span><span class="p">])</span> + <span class="n">p</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">check_call</span><span class="p">([</span><span class="s1">'mv'</span><span class="p">,</span> <span class="n">ofile</span> <span class="o">+</span> <span class="s1">'_2'</span><span class="p">,</span> <span class="n">ofile</span><span class="p">])</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">ectrans</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">ecapi</span><span class="p">:</span> + <span class="n">p</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">check_call</span><span class="p">([</span><span class="s1">'ectrans'</span><span class="p">,</span> <span class="s1">'-overwrite'</span><span class="p">,</span> <span class="s1">'-gateway'</span><span class="p">,</span> + <span class="n">c</span><span class="o">.</span><span class="n">gateway</span><span class="p">,</span> <span class="s1">'-remote'</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">destination</span><span class="p">,</span> + <span class="s1">'-source'</span><span class="p">,</span> <span class="n">ofile</span><span class="p">])</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">ecstorage</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">ecapi</span><span class="p">:</span> + <span class="n">p</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">check_call</span><span class="p">([</span><span class="s1">'ecp'</span><span class="p">,</span> <span class="s1">'-o'</span><span class="p">,</span> <span class="n">ofile</span><span class="p">,</span> + <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expandvars</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">ecfsdir</span><span class="p">)])</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">outputdir</span> <span class="o">!=</span> <span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">:</span> + <span class="n">p</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">check_call</span><span class="p">([</span><span class="s1">'mv'</span><span class="p">,</span> + <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="n">ofile</span><span class="p">),</span> + <span class="n">c</span><span class="o">.</span><span class="n">outputdir</span><span class="p">])</span> + + <span class="k">return</span></div> + + +<div class="viewcode-block" id="EcFlexpart.prepare_fp_files"><a class="viewcode-back" href="../api.html#EcFlexpart.EcFlexpart.prepare_fp_files">[docs]</a> <span class="k">def</span> <span class="nf">prepare_fp_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span> + <span class="sd">'''Conversion of GRIB files to FLEXPART binary format.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="c1"># generate AVAILABLE file</span> + <span class="c1"># Example of AVAILABLE file data:</span> + <span class="c1"># 20131107 000000 EN13110700 ON DISC</span> + <span class="n">clist</span> <span class="o">=</span> <span class="p">[]</span> + <span class="k">for</span> <span class="n">ofile</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">outputfilelist</span><span class="p">:</span> + <span class="n">fname</span> <span class="o">=</span> <span class="n">ofile</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span> + <span class="k">if</span> <span class="s1">'.'</span> <span class="ow">in</span> <span class="n">fname</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span> + <span class="n">l</span> <span class="o">=</span> <span class="n">fname</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)</span> + <span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">l</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="o">-</span><span class="mi">6</span><span class="p">:]</span> <span class="o">+</span> <span class="n">l</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> + <span class="s1">'%y%m</span><span class="si">%d</span><span class="s1">%H'</span><span class="p">)</span> + <span class="n">timestamp</span> <span class="o">+=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">l</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span> + <span class="n">cdate</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">timestamp</span><span class="p">,</span> <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span> + <span class="n">chms</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">timestamp</span><span class="p">,</span> <span class="s1">'%H%M%S'</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">cdate</span> <span class="o">=</span> <span class="s1">'20'</span> <span class="o">+</span> <span class="n">fname</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="o">-</span><span class="mi">8</span><span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> + <span class="n">chms</span> <span class="o">=</span> <span class="n">fname</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="o">-</span><span class="mi">2</span><span class="p">:]</span> <span class="o">+</span> <span class="s1">'0000'</span> + <span class="n">clist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cdate</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="n">chms</span> <span class="o">+</span> <span class="s1">' '</span><span class="o">*</span><span class="mi">6</span> <span class="o">+</span> + <span class="n">fname</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="s1">' '</span><span class="o">*</span><span class="mi">14</span> <span class="o">+</span> <span class="s1">'ON DISC'</span><span class="p">)</span> + <span class="n">clist</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">outputdir</span> <span class="o">+</span> <span class="s1">'/'</span> <span class="o">+</span> <span class="s1">'AVAILABLE'</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">clist</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + + <span class="c1"># generate pathnames file</span> + <span class="n">pwd</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">outputdir</span><span class="p">)</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">pwd</span> <span class="o">+</span> <span class="s1">'/pathnames'</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">pwd</span> <span class="o">+</span> <span class="s1">'/Options/</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">pwd</span> <span class="o">+</span> <span class="s1">'/</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">pwd</span> <span class="o">+</span> <span class="s1">'/</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">pwd</span> <span class="o">+</span> <span class="s1">'/AVAILABLE</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">' = == = == = == = == = == == = </span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + + <span class="c1"># create Options dir if necessary</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">pwd</span> <span class="o">+</span> <span class="s1">'/Options'</span><span class="p">):</span> + <span class="n">make_dir</span><span class="p">(</span><span class="n">pwd</span><span class="o">+</span><span class="s1">'/Options'</span><span class="p">)</span> + + <span class="c1"># read template COMMAND file</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expandvars</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span> + <span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">))</span> <span class="o">+</span> <span class="s1">'/../Options/COMMAND'</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">lflist</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + + <span class="c1"># find index of list where to put in the</span> + <span class="c1"># date and time information</span> + <span class="c1"># usually after the LDIRECT parameter</span> + <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">lflist</span><span class="p">:</span> + <span class="k">if</span> <span class="s1">'LDIRECT'</span> <span class="ow">in</span> <span class="n">l</span><span class="o">.</span><span class="n">upper</span><span class="p">():</span> + <span class="k">break</span> + <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> + + <span class="c1"># insert the date and time information of run start and end</span> + <span class="c1"># into the list of lines of COMMAND file</span> + <span class="n">lflist</span> <span class="o">=</span> <span class="n">lflist</span><span class="p">[:</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> \ + <span class="p">[</span><span class="n">clist</span><span class="p">[</span><span class="mi">0</span><span class="p">][:</span><span class="mi">16</span><span class="p">],</span> <span class="n">clist</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][:</span><span class="mi">16</span><span class="p">]]</span> <span class="o">+</span> \ + <span class="n">lflist</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">3</span><span class="p">:]</span> + + <span class="c1"># write the new COMMAND file</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">pwd</span> <span class="o">+</span> <span class="s1">'/Options/COMMAND'</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">g</span><span class="p">:</span> + <span class="n">g</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lflist</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + + <span class="c1"># change to outputdir and start the grib2flexpart run</span> + <span class="c1"># afterwards switch back to the working dir</span> + <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">outputdir</span><span class="p">)</span> + <span class="n">p</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">check_call</span><span class="p">([</span> + <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expandvars</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">))</span> + <span class="o">+</span> <span class="s1">'/../FLEXPART_PROGRAM/grib2flexpart'</span><span class="p">,</span> <span class="s1">'useAvailable'</span><span class="p">,</span> <span class="s1">'.'</span><span class="p">])</span> + <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">pwd</span><span class="p">)</span> + + <span class="k">return</span></div></div> +</pre></div> + + </div> + + </div> + <footer> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_modules/GribTools.html b/documentation/Sphinx/build/html/_modules/GribTools.html new file mode 100644 index 0000000..bd21ed5 --- /dev/null +++ b/documentation/Sphinx/build/html/_modules/GribTools.html @@ -0,0 +1,535 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>GribTools — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="index.html">Module code</a> »</li> + + <li>GribTools</li> + + + <li class="wy-breadcrumbs-aside"> + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <h1>Source code for GribTools</h1><div class="highlight"><pre> +<span></span><span class="ch">#!/usr/bin/env python</span> +<span class="c1"># -*- coding: utf-8 -*-</span> +<span class="c1">#*******************************************************************************</span> +<span class="c1"># @Author: Anne Fouilloux (University of Oslo)</span> +<span class="c1">#</span> +<span class="c1"># @Date: July 2014</span> +<span class="c1">#</span> +<span class="c1"># @Change History:</span> +<span class="c1"># February 2018 - Anne Philipp (University of Vienna):</span> +<span class="c1"># - applied PEP8 style guide</span> +<span class="c1"># - added documentation</span> +<span class="c1"># - changed some naming</span> +<span class="c1">#</span> +<span class="c1"># @License:</span> +<span class="c1"># (C) Copyright 2014-2018.</span> +<span class="c1">#</span> +<span class="c1"># This software is licensed under the terms of the Apache Licence Version 2.0</span> +<span class="c1"># which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.</span> +<span class="c1">#</span> +<span class="c1"># @Class Description:</span> +<span class="c1"># The GRIB API provides all necessary tools to work directly with the</span> +<span class="c1"># grib files. Nevertheless, the GRIB API tools are very basic and are in</span> +<span class="c1"># direct connection with the grib files. This class provides some higher</span> +<span class="c1"># functions which apply a set of GRIB API tools together in the respective</span> +<span class="c1"># context. So, the class initially contains a list of grib files (their</span> +<span class="c1"># names) and the using program then applies the methods directly on the</span> +<span class="c1"># class objects without having to think about how the actual GRIB API</span> +<span class="c1"># tools have to be arranged.</span> +<span class="c1">#</span> +<span class="c1"># @Class Content:</span> +<span class="c1"># - __init__</span> +<span class="c1"># - get_keys</span> +<span class="c1"># - set_keys</span> +<span class="c1"># - copy</span> +<span class="c1"># - index</span> +<span class="c1">#</span> +<span class="c1"># @Class Attributes:</span> +<span class="c1"># - filenames</span> +<span class="c1">#</span> +<span class="c1">#*******************************************************************************</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># MODULES</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">from</span> <span class="nn">gribapi</span> <span class="k">import</span> <span class="n">grib_new_from_file</span><span class="p">,</span> <span class="n">grib_is_defined</span><span class="p">,</span> <span class="n">grib_get</span><span class="p">,</span> \ + <span class="n">grib_release</span><span class="p">,</span> <span class="n">grib_set</span><span class="p">,</span> <span class="n">grib_write</span><span class="p">,</span> <span class="n">grib_index_read</span><span class="p">,</span> \ + <span class="n">grib_index_new_from_file</span><span class="p">,</span> <span class="n">grib_index_add_file</span><span class="p">,</span> \ + <span class="n">grib_index_write</span> + + +<span class="c1"># from eccodes import (codes_grib_new_from_file, codes_is_defined, codes_get,</span> + <span class="c1"># codes_release, codes_set, codes_write, codes_index_read,</span> + <span class="c1"># codes_index_new_from_file, codes_index_add_file,</span> + <span class="c1"># codes_index_write)</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># CLASS</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<div class="viewcode-block" id="GribTools"><a class="viewcode-back" href="../api.html#GribTools.GribTools">[docs]</a><span class="k">class</span> <span class="nc">GribTools</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> + <span class="sd">'''</span> +<span class="sd"> Class for GRIB utilities (new methods) based on GRIB API</span> +<span class="sd"> '''</span> + <span class="c1"># --------------------------------------------------------------------------</span> + <span class="c1"># CLASS FUNCTIONS</span> + <span class="c1"># --------------------------------------------------------------------------</span> + <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filenames</span><span class="p">):</span> + <span class="sd">'''Initialise an object of GribTools and assign a list of filenames.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> filenames : :obj:`list` of :obj:`strings`</span> +<span class="sd"> A list of filenames.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">filenames</span> <span class="o">=</span> <span class="n">filenames</span> + + <span class="k">return</span> + + +<div class="viewcode-block" id="GribTools.get_keys"><a class="viewcode-back" href="../api.html#GribTools.GribTools.get_keys">[docs]</a> <span class="k">def</span> <span class="nf">get_keys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keynames</span><span class="p">,</span> <span class="n">wherekeynames</span><span class="o">=</span><span class="p">[],</span> <span class="n">wherekeyvalues</span><span class="o">=</span><span class="p">[]):</span> + <span class="sd">'''Get keyvalues for a given list of keynames a where statement</span> +<span class="sd"> can be given (list of key and list of values)</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> keynames : :obj:`list` of :obj:`string`</span> +<span class="sd"> List of keynames.</span> + +<span class="sd"> wherekeynames : :obj:`list` of :obj:`string`, optional</span> +<span class="sd"> Default value is an empty list.</span> + +<span class="sd"> wherekeyvalues : :obj:`list` of :obj:`string`, optional</span> +<span class="sd"> Default value is an empty list.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> return_list : :obj:`list` of :obj:`string`</span> +<span class="sd"> List of keyvalues for given keynames.</span> +<span class="sd"> '''</span> + + <span class="n">fileid</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filenames</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> + + <span class="n">return_list</span> <span class="o">=</span> <span class="p">[]</span> + + <span class="k">while</span> <span class="mi">1</span><span class="p">:</span> + <span class="n">gid</span> <span class="o">=</span> <span class="n">grib_new_from_file</span><span class="p">(</span><span class="n">fileid</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">gid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> + <span class="k">break</span> + + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">wherekeynames</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">wherekeyvalues</span><span class="p">):</span> + <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Number of key values and key names must be </span><span class="se">\</span> +<span class="s2"> the same. Give a value for each keyname!"</span><span class="p">)</span> + + <span class="n">select</span> <span class="o">=</span> <span class="kc">True</span> + <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">for</span> <span class="n">wherekey</span> <span class="ow">in</span> <span class="n">wherekeynames</span><span class="p">:</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">grib_is_defined</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">wherekey</span><span class="p">):</span> + <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"where key was not defined"</span><span class="p">)</span> + + <span class="n">select</span> <span class="o">=</span> <span class="p">(</span><span class="n">select</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">wherekeyvalues</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">==</span> + <span class="nb">str</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">wherekey</span><span class="p">))))</span> + <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> + + <span class="k">if</span> <span class="n">select</span><span class="p">:</span> + <span class="n">llist</span> <span class="o">=</span> <span class="p">[]</span> + <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">keynames</span><span class="p">:</span> + <span class="n">llist</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">key</span><span class="p">))])</span> + <span class="n">return_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">llist</span><span class="p">)</span> + + <span class="n">grib_release</span><span class="p">(</span><span class="n">gid</span><span class="p">)</span> + + <span class="n">fileid</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + + <span class="k">return</span> <span class="n">return_list</span></div> + + +<div class="viewcode-block" id="GribTools.set_keys"><a class="viewcode-back" href="../api.html#GribTools.GribTools.set_keys">[docs]</a> <span class="k">def</span> <span class="nf">set_keys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fromfile</span><span class="p">,</span> <span class="n">keynames</span><span class="p">,</span> <span class="n">keyvalues</span><span class="p">,</span> <span class="n">wherekeynames</span><span class="o">=</span><span class="p">[],</span> + <span class="n">wherekeyvalues</span><span class="o">=</span><span class="p">[],</span> <span class="n">strict</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">filemode</span><span class="o">=</span><span class="s1">'w'</span><span class="p">):</span> + <span class="sd">'''Opens the file to read the grib messages and then write</span> +<span class="sd"> them to a new output file. By default all messages are</span> +<span class="sd"> written out. Also, the keyvalues of the passed list of</span> +<span class="sd"> keynames are set or only those meeting the where statement.</span> +<span class="sd"> (list of key and list of values).</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> fromfile : :obj:`string`</span> +<span class="sd"> Filename of the input file to read the grib messages from.</span> + +<span class="sd"> keynames : :obj:`list` of :obj:`string`</span> +<span class="sd"> List of keynames. Default is an empty list.</span> + +<span class="sd"> keyvalues : :obj:`list` of :obj:`string`</span> +<span class="sd"> List of keynames. Default is an empty list.</span> + +<span class="sd"> wherekeynames : :obj:`list` of :obj:`string`, optional</span> +<span class="sd"> Default value is an empty list.</span> + +<span class="sd"> wherekeyvalues : :obj:`list` of :obj:`string`, optional</span> +<span class="sd"> Default value is an empty list.</span> + +<span class="sd"> strict : :obj:`boolean`, optional</span> +<span class="sd"> Decides if everything from keynames and keyvalues</span> +<span class="sd"> is written out the grib file (False) or only those</span> +<span class="sd"> meeting the where statement (True). Default is False.</span> + +<span class="sd"> filemode : :obj:`string`, optional</span> +<span class="sd"> Sets the mode for the output file. Default is "w".</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="n">fout</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filenames</span><span class="p">,</span> <span class="n">filemode</span><span class="p">)</span> + <span class="n">fin</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">fromfile</span><span class="p">)</span> + + <span class="k">while</span> <span class="mi">1</span><span class="p">:</span> + <span class="n">gid</span> <span class="o">=</span> <span class="n">grib_new_from_file</span><span class="p">(</span><span class="n">fin</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">gid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> + <span class="k">break</span> + + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">wherekeynames</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">wherekeyvalues</span><span class="p">):</span> + <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Give a value for each keyname!"</span><span class="p">)</span> + + <span class="n">select</span> <span class="o">=</span> <span class="kc">True</span> + <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">for</span> <span class="n">wherekey</span> <span class="ow">in</span> <span class="n">wherekeynames</span><span class="p">:</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">grib_is_defined</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">wherekey</span><span class="p">):</span> + <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"where Key was not defined"</span><span class="p">)</span> + + <span class="n">select</span> <span class="o">=</span> <span class="p">(</span><span class="n">select</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">wherekeyvalues</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">==</span> + <span class="nb">str</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">wherekey</span><span class="p">))))</span> + <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> + + <span class="k">if</span> <span class="n">select</span><span class="p">:</span> + <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">keynames</span><span class="p">:</span> + <span class="n">grib_set</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">keyvalues</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> + <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> + + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fout</span><span class="p">)</span> + + <span class="n">grib_release</span><span class="p">(</span><span class="n">gid</span><span class="p">)</span> + + <span class="n">fin</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + <span class="n">fout</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="GribTools.copy"><a class="viewcode-back" href="../api.html#GribTools.GribTools.copy">[docs]</a> <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename_in</span><span class="p">,</span> <span class="n">selectWhere</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> + <span class="n">keynames</span><span class="o">=</span><span class="p">[],</span> <span class="n">keyvalues</span><span class="o">=</span><span class="p">[],</span> <span class="n">filemode</span><span class="o">=</span><span class="s1">'w'</span><span class="p">):</span> + <span class="sd">'''Add the content of another input grib file to the objects file but</span> +<span class="sd"> only messages corresponding to keys/values passed to the function.</span> +<span class="sd"> The selectWhere switch decides if to copy the keys equal to (True) or</span> +<span class="sd"> different to (False) the keynames/keyvalues list passed to the function.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> filename_in : :obj:`string`</span> +<span class="sd"> Filename of the input file to read the grib messages from.</span> + +<span class="sd"> selectWhere : :obj:`boolean`, optional</span> +<span class="sd"> Decides if to copy the keynames and values equal to (True) or</span> +<span class="sd"> different to (False) the keynames/keyvalues list passed to the</span> +<span class="sd"> function. Default is True.</span> + +<span class="sd"> keynames : :obj:`list` of :obj:`string`, optional</span> +<span class="sd"> List of keynames. Default is an empty list.</span> + +<span class="sd"> keyvalues : :obj:`list` of :obj:`string`, optional</span> +<span class="sd"> List of keynames. Default is an empty list.</span> + +<span class="sd"> filemode : :obj:`string`, optional</span> +<span class="sd"> Sets the mode for the output file. Default is "w".</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="n">fin</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename_in</span><span class="p">)</span> + <span class="n">fout</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filenames</span><span class="p">,</span> <span class="n">filemode</span><span class="p">)</span> + + <span class="k">while</span> <span class="mi">1</span><span class="p">:</span> + <span class="n">gid</span> <span class="o">=</span> <span class="n">grib_new_from_file</span><span class="p">(</span><span class="n">fin</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">gid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> + <span class="k">break</span> + + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">keynames</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">keyvalues</span><span class="p">):</span> + <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Give a value for each keyname!"</span><span class="p">)</span> + + <span class="n">select</span> <span class="o">=</span> <span class="kc">True</span> + <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">keynames</span><span class="p">:</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">grib_is_defined</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> + <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Key was not defined"</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">selectWhere</span><span class="p">:</span> + <span class="n">select</span> <span class="o">=</span> <span class="p">(</span><span class="n">select</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">keyvalues</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">==</span> + <span class="nb">str</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">key</span><span class="p">))))</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">select</span> <span class="o">=</span> <span class="p">(</span><span class="n">select</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">keyvalues</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">!=</span> + <span class="nb">str</span><span class="p">(</span><span class="n">grib_get</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">key</span><span class="p">))))</span> + <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> + + <span class="k">if</span> <span class="n">select</span><span class="p">:</span> + <span class="n">grib_write</span><span class="p">(</span><span class="n">gid</span><span class="p">,</span> <span class="n">fout</span><span class="p">)</span> + + <span class="n">grib_release</span><span class="p">(</span><span class="n">gid</span><span class="p">)</span> + + <span class="n">fin</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + <span class="n">fout</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="GribTools.index"><a class="viewcode-back" href="../api.html#GribTools.GribTools.index">[docs]</a> <span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index_keys</span><span class="o">=</span><span class="p">[</span><span class="s2">"mars"</span><span class="p">],</span> <span class="n">index_file</span><span class="o">=</span><span class="s2">"my.idx"</span><span class="p">):</span> + <span class="sd">'''Create index file from a list of files if it does not exist or</span> +<span class="sd"> read an index file.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> index_keys: :obj:`list` of :obj:`string`, optional</span> +<span class="sd"> Contains the list of key parameter names from</span> +<span class="sd"> which the index is to be created.</span> +<span class="sd"> Default is a list with a single entry string "mars".</span> + +<span class="sd"> index_file: :obj:`string`, optional</span> +<span class="sd"> Filename where the indices are stored.</span> +<span class="sd"> Default is "my.idx".</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> iid: :obj:`integer`</span> +<span class="sd"> Grib index id.</span> +<span class="sd"> '''</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"... index will be done"</span><span class="p">)</span> + <span class="n">iid</span> <span class="o">=</span> <span class="kc">None</span> + + <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">index_file</span><span class="p">):</span> + <span class="n">iid</span> <span class="o">=</span> <span class="n">grib_index_read</span><span class="p">(</span><span class="n">index_file</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"Use existing index file: </span><span class="si">%s</span><span class="s2"> "</span> <span class="o">%</span> <span class="p">(</span><span class="n">index_file</span><span class="p">))</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">for</span> <span class="n">filename</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">filenames</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"Inputfile: </span><span class="si">%s</span><span class="s2"> "</span> <span class="o">%</span> <span class="p">(</span><span class="n">filename</span><span class="p">))</span> + <span class="k">if</span> <span class="n">iid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> + <span class="n">iid</span> <span class="o">=</span> <span class="n">grib_index_new_from_file</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">index_keys</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">grib_index_add_file</span><span class="p">(</span><span class="n">iid</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">iid</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> + <span class="n">grib_index_write</span><span class="p">(</span><span class="n">iid</span><span class="p">,</span> <span class="n">index_file</span><span class="p">)</span> + + <span class="nb">print</span><span class="p">(</span><span class="s1">'... index done'</span><span class="p">)</span> + + <span class="k">return</span> <span class="n">iid</span></div></div> +</pre></div> + + </div> + + </div> + <footer> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_modules/MarsRetrieval.html b/documentation/Sphinx/build/html/_modules/MarsRetrieval.html new file mode 100644 index 0000000..028e163 --- /dev/null +++ b/documentation/Sphinx/build/html/_modules/MarsRetrieval.html @@ -0,0 +1,716 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>MarsRetrieval — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="index.html">Module code</a> »</li> + + <li>MarsRetrieval</li> + + + <li class="wy-breadcrumbs-aside"> + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <h1>Source code for MarsRetrieval</h1><div class="highlight"><pre> +<span></span><span class="ch">#!/usr/bin/env python</span> +<span class="c1"># -*- coding: utf-8 -*-</span> +<span class="c1">#*******************************************************************************</span> +<span class="c1"># @Author: Anne Fouilloux (University of Oslo)</span> +<span class="c1">#</span> +<span class="c1"># @Date: October 2014</span> +<span class="c1">#</span> +<span class="c1"># @Change History:</span> +<span class="c1">#</span> +<span class="c1"># November 2015 - Leopold Haimberger (University of Vienna):</span> +<span class="c1"># - optimized display_info</span> +<span class="c1"># - optimized data_retrieve and seperate between python and shell</span> +<span class="c1"># script call</span> +<span class="c1">#</span> +<span class="c1"># February 2018 - Anne Philipp (University of Vienna):</span> +<span class="c1"># - applied PEP8 style guide</span> +<span class="c1"># - added documentation</span> +<span class="c1"># - applied some minor modifications in programming style/structure</span> +<span class="c1">#</span> +<span class="c1"># @License:</span> +<span class="c1"># (C) Copyright 2015-2018.</span> +<span class="c1">#</span> +<span class="c1"># This software is licensed under the terms of the Apache Licence Version 2.0</span> +<span class="c1"># which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.</span> +<span class="c1">#</span> +<span class="c1"># @Class Description:</span> +<span class="c1"># A MARS revtrieval has a specific syntax with a selection of keywords and</span> +<span class="c1"># their corresponding values. This class provides the necessary functions</span> +<span class="c1"># by displaying the selected parameters and their values and the actual</span> +<span class="c1"># retrievement of the data through a mars request or a Python web api</span> +<span class="c1"># interface. The initialization already expects all the keyword values.</span> +<span class="c1">#</span> +<span class="c1"># @Class Content:</span> +<span class="c1"># - __init__</span> +<span class="c1"># - display_info</span> +<span class="c1"># - data_retrieve</span> +<span class="c1">#</span> +<span class="c1"># @Class Attributes:</span> +<span class="c1"># - server</span> +<span class="c1"># - marsclass</span> +<span class="c1"># - dtype</span> +<span class="c1"># - levtype</span> +<span class="c1"># - levelist</span> +<span class="c1"># - repres</span> +<span class="c1"># - date</span> +<span class="c1"># - resol</span> +<span class="c1"># - stream</span> +<span class="c1"># - area</span> +<span class="c1"># - time</span> +<span class="c1"># - step</span> +<span class="c1"># - expver</span> +<span class="c1"># - number</span> +<span class="c1"># - accuracy</span> +<span class="c1"># - grid</span> +<span class="c1"># - gaussian</span> +<span class="c1"># - target</span> +<span class="c1"># - param</span> +<span class="c1">#</span> +<span class="c1">#*******************************************************************************</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># MODULES</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">sys</span> +<span class="kn">import</span> <span class="nn">subprocess</span> + +<span class="c1"># software specific classes and modules from flex_extract</span> +<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'../'</span><span class="p">)</span> +<span class="kn">import</span> <span class="nn">_config</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># CLASS</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<div class="viewcode-block" id="MarsRetrieval"><a class="viewcode-back" href="../api.html#MarsRetrieval.MarsRetrieval">[docs]</a><span class="k">class</span> <span class="nc">MarsRetrieval</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> + <span class="sd">'''Class for submitting MARS retrievals.</span> + +<span class="sd"> A description of MARS keywords/arguments and examples of their</span> +<span class="sd"> values can be found here:</span> +<span class="sd"> https://software.ecmwf.int/wiki/display/UDOC/\</span> +<span class="sd"> Identification+keywords#Identificationkeywords-class</span> +<span class="sd"> '''</span> + + <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server</span><span class="p">,</span> <span class="n">public</span><span class="p">,</span> <span class="n">marsclass</span><span class="o">=</span><span class="s2">"ei"</span><span class="p">,</span> <span class="n">dataset</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> + <span class="n">levtype</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">levelist</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">repres</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">date</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">resol</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> + <span class="n">stream</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">area</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">time</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">expver</span><span class="o">=</span><span class="s2">"1"</span><span class="p">,</span> + <span class="n">number</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">accuracy</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">grid</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">gaussian</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> + <span class="n">param</span><span class="o">=</span><span class="s2">""</span><span class="p">):</span> + <span class="sd">'''Initialises the instance of the MarsRetrieval class and</span> +<span class="sd"> defines and assigns a set of the necessary retrieval parameters</span> +<span class="sd"> for the FLEXPART input data.</span> +<span class="sd"> A description of MARS keywords/arguments, their dependencies</span> +<span class="sd"> on each other and examples of their values can be found here:</span> + +<span class="sd"> https://software.ecmwf.int/wiki/display/UDOC/MARS+keywords</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> server : :obj:`ECMWFService`</span> +<span class="sd"> This is the connection to the ECMWF data servers.</span> +<span class="sd"> It is needed for the pythonic access of ECMWF data.</span> + +<span class="sd"> public : :obj:`integer`</span> +<span class="sd"> Decides which Web API version is used:</span> +<span class="sd"> 0: member-state users and full archive access</span> +<span class="sd"> 1: public access and limited access to the public server and</span> +<span class="sd"> datasets. Needs the parameter dataset.</span> +<span class="sd"> Default is "0" and for member-state users.</span> + +<span class="sd"> marsclass : :obj:`string`, optional</span> +<span class="sd"> Characterisation of dataset. E.g. EI (ERA-Interim),</span> +<span class="sd"> E4 (ERA40), OD (Operational archive), ea (ERA5).</span> +<span class="sd"> Default is the ERA-Interim dataset "ei".</span> + +<span class="sd"> dataset : :obj:`string`, optional</span> +<span class="sd"> For public datasets there is the specific naming and parameter</span> +<span class="sd"> dataset which has to be used to characterize the type of</span> +<span class="sd"> data. Usually there is less data available, either in times,</span> +<span class="sd"> domain or parameter.</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> type : :obj:`string`, optional</span> +<span class="sd"> Determines the type of fields to be retrieved.</span> +<span class="sd"> Selects between observations, images or fields.</span> +<span class="sd"> Examples for fields: Analysis (an), Forecast (fc),</span> +<span class="sd"> Perturbed Forecast (pf), Control Forecast (cf) and so on.</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> levtype : :obj:`string`, optional</span> +<span class="sd"> Denotes type of level. Has a direct implication on valid</span> +<span class="sd"> levelist values!</span> +<span class="sd"> E.g. model level (ml), pressure level (pl), surface (sfc),</span> +<span class="sd"> potential vorticity (pv), potential temperature (pt)</span> +<span class="sd"> and depth (dp).</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> levelist : :obj:`string`, optional</span> +<span class="sd"> Specifies the required levels. It has to have a valid</span> +<span class="sd"> correspondence to the selected levtype.</span> +<span class="sd"> Examples: model level: 1/to/137, pressure levels: 500/to/1000</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> repres : :obj:`string`, optional</span> +<span class="sd"> Selects the representation of the archived data.</span> +<span class="sd"> E.g. sh - spherical harmonics, gg - Gaussian grid,</span> +<span class="sd"> ll - latitude/longitude, ...</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> date : :obj:`string`, optional</span> +<span class="sd"> Specifies the Analysis date, the Forecast base date or</span> +<span class="sd"> Observations date. Valid formats are:</span> +<span class="sd"> Absolute as YYYY-MM-DD or YYYYMMDD.</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> resol : :obj:`string`, optional</span> +<span class="sd"> Specifies the desired triangular truncation of retrieved data,</span> +<span class="sd"> before carrying out any other selected post-processing.</span> +<span class="sd"> The default is automatic truncation (auto), by which the lowest</span> +<span class="sd"> resolution compatible with the value specified in grid is</span> +<span class="sd"> automatically selected for the retrieval.</span> +<span class="sd"> Users wanting to perform post-processing from full spectral</span> +<span class="sd"> resolution should specify Archived Value (av).</span> +<span class="sd"> The following are examples of existing resolutions found in</span> +<span class="sd"> the archive: 63, 106, 159, 213, 255, 319, 399, 511, 799 or 1279.</span> +<span class="sd"> This keyword has no meaning/effect if the archived data is</span> +<span class="sd"> not in spherical harmonics representation.</span> +<span class="sd"> The best selection can be found here:</span> +<span class="sd"> https://software.ecmwf.int/wiki/display/UDOC/\</span> +<span class="sd"> Retrieve#Retrieve-Truncationbeforeinterpolation</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> stream : :obj:`string`, optional</span> +<span class="sd"> Identifies the forecasting system used to generate the data.</span> +<span class="sd"> E.g. oper (Atmospheric model), enfo (Ensemble forecats), ...</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> area : :obj:`string`, optional</span> +<span class="sd"> Specifies the desired sub-area of data to be extracted.</span> +<span class="sd"> Areas can be defined to wrap around the globe.</span> + +<span class="sd"> Latitude values must be given as signed numbers, with:</span> +<span class="sd"> north latitudes (i.e. north of the equator)</span> +<span class="sd"> being positive (e.g: 40.5)</span> +<span class="sd"> south latitutes (i.e. south of the equator)</span> +<span class="sd"> being negative (e.g: -50.5)</span> +<span class="sd"> Longtitude values must be given as signed numbers, with:</span> +<span class="sd"> east longitudes (i.e. east of the 0 degree meridian)</span> +<span class="sd"> being positive (e.g: 35.0)</span> +<span class="sd"> west longitudes (i.e. west of the 0 degree meridian)</span> +<span class="sd"> being negative (e.g: -20.5)</span> + +<span class="sd"> E.g.: North/West/South/East</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> time : :obj:`string`, optional</span> +<span class="sd"> Specifies the time of the data in hours and minutes.</span> +<span class="sd"> Valid values depend on the type of data: Analysis time,</span> +<span class="sd"> Forecast base time or First guess verification time</span> +<span class="sd"> (all usually at synoptic hours: 00, 06, 12 and 18 ).</span> +<span class="sd"> Observation time (any combination in hours and minutes is valid,</span> +<span class="sd"> subject to data availability in the archive).</span> +<span class="sd"> The syntax is HHMM or HH:MM. If MM is omitted it defaults to 00.</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> step : :obj:`string`, optional</span> +<span class="sd"> Specifies the forecast time step from forecast base time.</span> +<span class="sd"> Valid values are hours (HH) from forecast base time. It also</span> +<span class="sd"> specifies the length of the forecast which verifies at</span> +<span class="sd"> First Guess time.</span> +<span class="sd"> E.g. 1/3/6-hourly</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> expver : :obj:`string`, optional</span> +<span class="sd"> The version of the dataset. Each experiment is assigned a</span> +<span class="sd"> unique code (version). Production data is assigned 1 or 2,</span> +<span class="sd"> and experimental data in Operations 11, 12 ,...</span> +<span class="sd"> Research or Member State's experiments have a four letter</span> +<span class="sd"> experiment identifier.</span> +<span class="sd"> Default is "1".</span> + +<span class="sd"> number : :obj:`string`, optional</span> +<span class="sd"> Selects the member in ensemble forecast run. (Only then it</span> +<span class="sd"> is necessary.) It has a different meaning depending on</span> +<span class="sd"> the type of data.</span> +<span class="sd"> E.g. Perturbed Forecasts: specifies the Ensemble forecast member</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> accuracy : :obj:`string`, optional</span> +<span class="sd"> Specifies the number of bits per value to be used in the</span> +<span class="sd"> generated GRIB coded fields.</span> +<span class="sd"> A positive integer may be given to specify the preferred number</span> +<span class="sd"> of bits per packed value. This must not be greater than the</span> +<span class="sd"> number of bits normally used for a Fortran integer on the</span> +<span class="sd"> processor handling the request (typically 32 or 64 bit).</span> +<span class="sd"> Within a compute request the accuracy of the original fields</span> +<span class="sd"> can be passed to the result field by specifying accuracy=av.</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> grid : :obj:`string`, optional</span> +<span class="sd"> Specifies the output grid which can be either a Gaussian grid</span> +<span class="sd"> or a Latitude/Longitude grid. MARS requests specifying</span> +<span class="sd"> grid=av will return the archived model grid.</span> + +<span class="sd"> Lat/Lon grid: The grid spacing needs to be an integer</span> +<span class="sd"> fraction of 90 degrees e.g. grid = 0.5/0.5</span> + +<span class="sd"> Gaussian grid: specified by a letter denoting the type of</span> +<span class="sd"> Gaussian grid followed by an integer (the grid number)</span> +<span class="sd"> representing the number of lines between the Pole and Equator,</span> +<span class="sd"> e.g.</span> +<span class="sd"> grid = F160 - full (or regular) Gaussian grid with</span> +<span class="sd"> 160 latitude lines between the pole and equator</span> +<span class="sd"> grid = N320 - ECMWF original reduced Gaussian grid with</span> +<span class="sd"> 320 latitude lines between the pole and equator,</span> +<span class="sd"> see Reduced Gaussian Grids for grid numbers used at ECMWF</span> +<span class="sd"> grid = O640 - ECMWF octahedral (reduced) Gaussian grid with</span> +<span class="sd"> 640 latitude lines between the pole and equator</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> gaussian : :obj:`string`, optional</span> +<span class="sd"> This parameter is deprecated and should no longer be used.</span> +<span class="sd"> Specifies the desired type of Gaussian grid for the output.</span> +<span class="sd"> Valid Gaussian grids are quasi-regular (reduced) or regular.</span> +<span class="sd"> Keyword gaussian can only be specified together with</span> +<span class="sd"> keyword grid. Gaussian without grid has no effect.</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> target : :obj:`string`, optional</span> +<span class="sd"> Specifies a file into which data is to be written after</span> +<span class="sd"> retrieval or manipulation. Path names should always be</span> +<span class="sd"> enclosed in double quotes. The MARS client supports automatic</span> +<span class="sd"> generation of multiple target files using MARS keywords</span> +<span class="sd"> enclosed in square brackets [ ]. If the environment variable</span> +<span class="sd"> MARS_MULTITARGET_STRICT_FORMAT is set to 1 before calling mars,</span> +<span class="sd"> the keyword values will be used in the filename as shown by</span> +<span class="sd"> the ecCodes GRIB tool grib_ls -m, e.g. with</span> +<span class="sd"> MARS_MULTITARGET_STRICT_FORMAT set to 1 the keywords time,</span> +<span class="sd"> expver and param will be formatted as 0600, 0001 and 129.128</span> +<span class="sd"> rather than 600, 1 and 129.</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> param : :obj:`string`, optional</span> +<span class="sd"> Specifies the meteorological parameter.</span> +<span class="sd"> The list of meteorological parameters in MARS is extensive.</span> +<span class="sd"> Their availability is directly related to their meteorological</span> +<span class="sd"> meaning and, therefore, the rest of directives specified</span> +<span class="sd"> in the MARS request.</span> +<span class="sd"> Meteorological parameters can be specified by their</span> +<span class="sd"> GRIB code (param=130), their mnemonic (param=t) or</span> +<span class="sd"> full name (param=temperature).</span> +<span class="sd"> The list of parameter should be seperated by a "/"-sign.</span> +<span class="sd"> E.g. 130/131/133</span> +<span class="sd"> Default is an empty string.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">server</span> <span class="o">=</span> <span class="n">server</span> + <span class="bp">self</span><span class="o">.</span><span class="n">public</span> <span class="o">=</span> <span class="n">public</span> + <span class="bp">self</span><span class="o">.</span><span class="n">marsclass</span> <span class="o">=</span> <span class="n">marsclass</span> + <span class="bp">self</span><span class="o">.</span><span class="n">dataset</span> <span class="o">=</span> <span class="n">dataset</span> + <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="nb">type</span> + <span class="bp">self</span><span class="o">.</span><span class="n">levtype</span> <span class="o">=</span> <span class="n">levtype</span> + <span class="bp">self</span><span class="o">.</span><span class="n">levelist</span> <span class="o">=</span> <span class="n">levelist</span> + <span class="bp">self</span><span class="o">.</span><span class="n">repres</span> <span class="o">=</span> <span class="n">repres</span> + <span class="bp">self</span><span class="o">.</span><span class="n">date</span> <span class="o">=</span> <span class="n">date</span> + <span class="bp">self</span><span class="o">.</span><span class="n">resol</span> <span class="o">=</span> <span class="n">resol</span> + <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span> + <span class="bp">self</span><span class="o">.</span><span class="n">area</span> <span class="o">=</span> <span class="n">area</span> + <span class="bp">self</span><span class="o">.</span><span class="n">time</span> <span class="o">=</span> <span class="n">time</span> + <span class="bp">self</span><span class="o">.</span><span class="n">step</span> <span class="o">=</span> <span class="n">step</span> + <span class="bp">self</span><span class="o">.</span><span class="n">expver</span> <span class="o">=</span> <span class="n">expver</span> + <span class="bp">self</span><span class="o">.</span><span class="n">number</span> <span class="o">=</span> <span class="n">number</span> + <span class="bp">self</span><span class="o">.</span><span class="n">accuracy</span> <span class="o">=</span> <span class="n">accuracy</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid</span> <span class="o">=</span> <span class="n">grid</span> + <span class="bp">self</span><span class="o">.</span><span class="n">gaussian</span> <span class="o">=</span> <span class="n">gaussian</span> + <span class="bp">self</span><span class="o">.</span><span class="n">target</span> <span class="o">=</span> <span class="n">target</span> + <span class="bp">self</span><span class="o">.</span><span class="n">param</span> <span class="o">=</span> <span class="n">param</span> + + <span class="k">return</span> + + +<div class="viewcode-block" id="MarsRetrieval.display_info"><a class="viewcode-back" href="../api.html#MarsRetrieval.MarsRetrieval.display_info">[docs]</a> <span class="k">def</span> <span class="nf">display_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="sd">'''Prints all class attributes and their values to the</span> +<span class="sd"> standard output.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="c1"># Get all class attributes and their values as a dictionary</span> + <span class="n">attrs</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> + + <span class="c1"># iterate through all attributes and print them</span> + <span class="c1"># with their corresponding values</span> + <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">attrs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> + <span class="k">if</span> <span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">'server'</span><span class="p">,</span> <span class="s1">'public'</span><span class="p">]:</span> + <span class="k">pass</span> + <span class="k">else</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s1">': '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span> + + <span class="k">return</span></div> + + +<div class="viewcode-block" id="MarsRetrieval.print_info"><a class="viewcode-back" href="../api.html#MarsRetrieval.MarsRetrieval.print_info">[docs]</a> <span class="k">def</span> <span class="nf">print_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inputdir</span><span class="p">,</span> <span class="n">request_number</span><span class="p">):</span> + <span class="sd">'''Prints all mars requests to an extra file for debugging and</span> +<span class="sd"> information.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> inputdir : :obj:`string`</span> +<span class="sd"> The path where all data from the retrievals are stored.</span> + +<span class="sd"> request_number : :obj:`integer`</span> +<span class="sd"> Number of mars requests for flux and non-flux data.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="c1"># Get all class attributes and their values as a dictionary</span> + <span class="n">attrs</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> + + <span class="c1"># open a file to store all requests to</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">inputdir</span><span class="p">,</span> + <span class="n">_config</span><span class="o">.</span><span class="n">FILE_MARS_REQUESTS</span><span class="p">),</span> <span class="s1">'a'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'mars_request #'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">request_number</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="c1"># iterate through all attributes and print them</span> + <span class="c1"># with their corresponding values</span> + <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">attrs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> + <span class="k">if</span> <span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">'server'</span><span class="p">,</span> <span class="s1">'public'</span><span class="p">]:</span> + <span class="k">pass</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s1">': '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n\n</span><span class="s1">'</span><span class="p">)</span> + + <span class="k">return</span></div> + + +<div class="viewcode-block" id="MarsRetrieval.print_infodata_csv"><a class="viewcode-back" href="../api.html#MarsRetrieval.MarsRetrieval.print_infodata_csv">[docs]</a> <span class="k">def</span> <span class="nf">print_infodata_csv</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inputdir</span><span class="p">,</span> <span class="n">request_number</span><span class="p">):</span> + <span class="sd">'''Write all request parameter in alpabetical order into a "csv" file.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> inputdir : :obj:`string`</span> +<span class="sd"> The path where all data from the retrievals are stored.</span> + +<span class="sd"> request_number : :obj:`integer`</span> +<span class="sd"> Number of mars requests for flux and non-flux data.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="c1"># Get all class attributes and their values as a dictionary</span> + <span class="n">attrs</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> + <span class="k">del</span> <span class="n">attrs</span><span class="p">[</span><span class="s1">'server'</span><span class="p">]</span> + <span class="k">del</span> <span class="n">attrs</span><span class="p">[</span><span class="s1">'public'</span><span class="p">]</span> + + <span class="c1"># open a file to store all requests to</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">inputdir</span><span class="p">,</span> + <span class="n">_config</span><span class="o">.</span><span class="n">FILE_MARS_REQUESTS</span><span class="p">),</span> <span class="s1">'a'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">request_number</span><span class="p">)</span> <span class="o">+</span> <span class="s1">', '</span><span class="p">)</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">attrs</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> + <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">attrs</span><span class="o">.</span><span class="n">iterkeys</span><span class="p">())))</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="MarsRetrieval.data_retrieve"><a class="viewcode-back" href="../api.html#MarsRetrieval.MarsRetrieval.data_retrieve">[docs]</a> <span class="k">def</span> <span class="nf">data_retrieve</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="sd">'''Submits a MARS retrieval. Depending on the existence of</span> +<span class="sd"> ECMWF Web-API it is submitted via Python or a</span> +<span class="sd"> subprocess in the Shell. The parameter for the mars retrieval</span> +<span class="sd"> are taken from the defined class attributes.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="c1"># Get all class attributes and their values as a dictionary</span> + <span class="n">attrs</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> + + <span class="c1"># eliminate unnecessary attributes from the dictionary attrs</span> + <span class="k">del</span> <span class="n">attrs</span><span class="p">[</span><span class="s1">'server'</span><span class="p">]</span> + <span class="k">del</span> <span class="n">attrs</span><span class="p">[</span><span class="s1">'public'</span><span class="p">]</span> + + <span class="c1"># exchange parameter name for marsclass</span> + <span class="n">mclass</span> <span class="o">=</span> <span class="n">attrs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'marsclass'</span><span class="p">)</span> + <span class="k">del</span> <span class="n">attrs</span><span class="p">[</span><span class="s1">'marsclass'</span><span class="p">]</span> + <span class="n">attrs</span><span class="p">[</span><span class="s1">'class'</span><span class="p">]</span> <span class="o">=</span> <span class="n">mclass</span> + + <span class="c1"># prepare target variable as needed for the Web API mode</span> + <span class="c1"># within the dictionary for full access</span> + <span class="c1"># as a single variable for public access</span> + <span class="n">target</span> <span class="o">=</span> <span class="n">attrs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'target'</span><span class="p">)</span> + <span class="k">if</span> <span class="ow">not</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">public</span><span class="p">):</span> + <span class="k">del</span> <span class="n">attrs</span><span class="p">[</span><span class="s1">'target'</span><span class="p">]</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'target: '</span> <span class="o">+</span> <span class="n">target</span><span class="p">)</span> + + <span class="c1"># find all keys without a value and convert all other values to strings</span> + <span class="n">empty_keys</span> <span class="o">=</span> <span class="p">[]</span> + <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">attrs</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span> + <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="s1">''</span><span class="p">:</span> + <span class="n">empty_keys</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">key</span><span class="p">))</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">attrs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> + + <span class="c1"># delete all empty parameter from the dictionary</span> + <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">empty_keys</span><span class="p">:</span> + <span class="k">del</span> <span class="n">attrs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> + + <span class="c1"># MARS request via Python script</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="p">:</span> + <span class="k">try</span><span class="p">:</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">public</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'RETRIEVE PUBLIC DATA!'</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">retrieve</span><span class="p">(</span><span class="n">attrs</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'EXECUTE NON-PUBLIC RETRIEVAL!'</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">attrs</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span> + <span class="k">except</span><span class="p">:</span> + <span class="n">e</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: "</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'MARS Request failed!'</span><span class="p">)</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">public</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">stat</span><span class="p">(</span><span class="n">target</span><span class="p">)</span><span class="o">.</span><span class="n">st_size</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'MARS Request returned no data - '</span> + <span class="s1">'please check request'</span><span class="p">)</span> + <span class="k">raise</span> <span class="ne">IOError</span> + <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">public</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">stat</span><span class="p">(</span><span class="n">target</span><span class="p">)</span><span class="o">.</span><span class="n">st_size</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Public MARS Request returned no data - '</span> + <span class="s1">'please check request'</span><span class="p">)</span> + <span class="k">raise</span> <span class="ne">IOError</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">raise</span> <span class="ne">IOError</span> + <span class="c1"># MARS request via extra process in shell</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">request_str</span> <span class="o">=</span> <span class="s1">'ret'</span> + <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">attrs</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span> + <span class="n">request_str</span> <span class="o">=</span> <span class="n">request_str</span> <span class="o">+</span> <span class="s1">','</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s1">'='</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> + <span class="n">request_str</span> <span class="o">+=</span> <span class="s1">',target="'</span> <span class="o">+</span> <span class="n">target</span> <span class="o">+</span> <span class="s1">'"'</span> + <span class="n">p</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">([</span><span class="s1">'mars'</span><span class="p">],</span> + <span class="n">stdin</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> + <span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> + <span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> + <span class="n">bufsize</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + <span class="n">pout</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">communicate</span><span class="p">(</span><span class="nb">input</span><span class="o">=</span><span class="n">request_str</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> + <span class="nb">print</span><span class="p">(</span><span class="n">pout</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span> + + <span class="k">if</span> <span class="s1">'Some errors reported'</span> <span class="ow">in</span> <span class="n">pout</span><span class="o">.</span><span class="n">decode</span><span class="p">():</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'MARS Request failed - please check request'</span><span class="p">)</span> + <span class="k">raise</span> <span class="ne">IOError</span> + <span class="k">elif</span> <span class="n">os</span><span class="o">.</span><span class="n">stat</span><span class="p">(</span><span class="n">target</span><span class="p">)</span><span class="o">.</span><span class="n">st_size</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'MARS Request returned no data - please check request'</span><span class="p">)</span> + <span class="k">raise</span> <span class="ne">IOError</span> + + <span class="k">return</span></div></div> +</pre></div> + + </div> + + </div> + <footer> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_modules/UioFiles.html b/documentation/Sphinx/build/html/_modules/UioFiles.html new file mode 100644 index 0000000..7ec9366 --- /dev/null +++ b/documentation/Sphinx/build/html/_modules/UioFiles.html @@ -0,0 +1,362 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>UioFiles — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="index.html">Module code</a> »</li> + + <li>UioFiles</li> + + + <li class="wy-breadcrumbs-aside"> + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <h1>Source code for UioFiles</h1><div class="highlight"><pre> +<span></span><span class="ch">#!/usr/bin/env python</span> +<span class="c1"># -*- coding: utf-8 -*-</span> +<span class="c1">#*******************************************************************************</span> +<span class="c1"># @Author: Anne Fouilloux (University of Oslo)</span> +<span class="c1">#</span> +<span class="c1"># @Date: October 2014</span> +<span class="c1">#</span> +<span class="c1"># @Change History:</span> +<span class="c1">#</span> +<span class="c1"># November 2015 - Leopold Haimberger (University of Vienna):</span> +<span class="c1"># - modified method list_files to work with glob instead of listdir</span> +<span class="c1"># - added pattern search in method list_files</span> +<span class="c1">#</span> +<span class="c1"># February 2018 - Anne Philipp (University of Vienna):</span> +<span class="c1"># - applied PEP8 style guide</span> +<span class="c1"># - added documentation</span> +<span class="c1"># - optimisation of method list_files since it didn't work correctly</span> +<span class="c1"># for sub directories</span> +<span class="c1"># - additional speed up of method list_files</span> +<span class="c1"># - modified the class so that it is initiated with a pattern instead</span> +<span class="c1"># of suffixes. Gives more precision in selection of files.</span> +<span class="c1">#</span> +<span class="c1"># @License:</span> +<span class="c1"># (C) Copyright 2014-2018.</span> +<span class="c1">#</span> +<span class="c1"># This software is licensed under the terms of the Apache Licence Version 2.0</span> +<span class="c1"># which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.</span> +<span class="c1">#</span> +<span class="c1"># @Class Decription:</span> +<span class="c1"># The class is for file manipulation. It is initiated with a regular</span> +<span class="c1"># expression pattern for this instance and can produce a list of Files</span> +<span class="c1"># from the given file pattern. These files can be deleted.</span> +<span class="c1">#</span> +<span class="c1"># @Class Content:</span> +<span class="c1"># - __init__</span> +<span class="c1"># - __str__</span> +<span class="c1"># - __list_files__</span> +<span class="c1"># - delete_files</span> +<span class="c1">#</span> +<span class="c1"># @Class Attributes:</span> +<span class="c1"># - pattern</span> +<span class="c1"># - files</span> +<span class="c1">#</span> +<span class="c1">#*******************************************************************************</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># MODULES</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">sys</span> +<span class="kn">import</span> <span class="nn">fnmatch</span> + +<span class="c1"># software specific module from flex_extract</span> +<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'../'</span><span class="p">)</span> +<span class="c1">#import profiling</span> +<span class="kn">from</span> <span class="nn">mods.tools</span> <span class="k">import</span> <span class="n">silent_remove</span><span class="p">,</span> <span class="n">get_list_as_string</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># CLASS</span> +<span class="c1"># ------------------------------------------------------------------------------</span> + +<div class="viewcode-block" id="UioFiles"><a class="viewcode-back" href="../api.html#UioFiles.UioFiles">[docs]</a><span class="k">class</span> <span class="nc">UioFiles</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> + <span class="sd">'''Class to manipulate files. At initialisation it has the pattern</span> +<span class="sd"> which stores a regular expression pattern for the files, the path</span> +<span class="sd"> to the files and the files already.</span> +<span class="sd"> '''</span> + <span class="c1"># --------------------------------------------------------------------------</span> + <span class="c1"># CLASS FUNCTIONS</span> + <span class="c1"># --------------------------------------------------------------------------</span> + <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">pattern</span><span class="p">):</span> + <span class="sd">'''Assignes a specific pattern for these files.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> path : :obj:`string`</span> +<span class="sd"> Directory where to list the files.</span> + +<span class="sd"> pattern : :obj:`string`</span> +<span class="sd"> Regular expression pattern. For example: '\*.grb'</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">path</span> + <span class="bp">self</span><span class="o">.</span><span class="n">pattern</span> <span class="o">=</span> <span class="n">pattern</span> + <span class="bp">self</span><span class="o">.</span><span class="n">files</span> <span class="o">=</span> <span class="p">[]</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">__list_files__</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">)</span> + + <span class="k">return</span> + + <span class="c1">#@profiling.timefn</span> + <span class="k">def</span> <span class="nf">__list_files__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span> + <span class="sd">'''Lists all files in the directory with the matching</span> +<span class="sd"> regular expression pattern.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> path : :obj:`string`</span> +<span class="sd"> Path to the files.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="c1"># Get the absolute path</span> + <span class="n">path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> + + <span class="c1"># get all files in the dir and subdir as absolut path</span> + <span class="k">for</span> <span class="n">root</span><span class="p">,</span> <span class="n">dirnames</span><span class="p">,</span> <span class="n">filenames</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="n">path</span><span class="p">):</span> + <span class="k">for</span> <span class="n">filename</span> <span class="ow">in</span> <span class="n">fnmatch</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">filenames</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pattern</span><span class="p">):</span> + <span class="bp">self</span><span class="o">.</span><span class="n">files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="n">filename</span><span class="p">))</span> + + <span class="k">return</span> + + <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="sd">'''Converts the list of files into a single string.</span> +<span class="sd"> The entries are sepereated by "," sign.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> files_string : :obj:`string`</span> +<span class="sd"> The content of the list as a single string.</span> +<span class="sd"> '''</span> + + <span class="n">filenames</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">files</span><span class="p">]</span> + <span class="n">files_string</span> <span class="o">=</span> <span class="n">get_list_as_string</span><span class="p">(</span><span class="n">filenames</span><span class="p">,</span> <span class="n">concatenate_sign</span><span class="o">=</span><span class="s1">', '</span><span class="p">)</span> + + <span class="k">return</span> <span class="n">files_string</span> + +<div class="viewcode-block" id="UioFiles.delete_files"><a class="viewcode-back" href="../api.html#UioFiles.UioFiles.delete_files">[docs]</a> <span class="k">def</span> <span class="nf">delete_files</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="sd">'''Deletes the files.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="k">for</span> <span class="n">old_file</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">files</span><span class="p">:</span> + <span class="n">silent_remove</span><span class="p">(</span><span class="n">old_file</span><span class="p">)</span> + + <span class="k">return</span></div></div> +</pre></div> + + </div> + + </div> + <footer> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_modules/get_mars_data.html b/documentation/Sphinx/build/html/_modules/get_mars_data.html new file mode 100644 index 0000000..1256f0b --- /dev/null +++ b/documentation/Sphinx/build/html/_modules/get_mars_data.html @@ -0,0 +1,478 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>get_mars_data — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="index.html">Module code</a> »</li> + + <li>get_mars_data</li> + + + <li class="wy-breadcrumbs-aside"> + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <h1>Source code for get_mars_data</h1><div class="highlight"><pre> +<span></span><span class="ch">#!/usr/bin/env python</span> +<span class="c1"># -*- coding: utf-8 -*-</span> +<span class="c1">#*******************************************************************************</span> +<span class="c1"># @Author: Anne Fouilloux (University of Oslo)</span> +<span class="c1">#</span> +<span class="c1"># @Date: October 2014</span> +<span class="c1">#</span> +<span class="c1"># @Change History:</span> +<span class="c1">#</span> +<span class="c1"># November 2015 - Leopold Haimberger (University of Vienna):</span> +<span class="c1"># - moved the getEIdata program into a function "get_mars_data"</span> +<span class="c1"># - moved the AgurmentParser into a seperate function</span> +<span class="c1"># - adatpted the function for the use in flex_extract</span> +<span class="c1"># - renamed file to get_mars_data</span> +<span class="c1">#</span> +<span class="c1"># February 2018 - Anne Philipp (University of Vienna):</span> +<span class="c1"># - applied PEP8 style guide</span> +<span class="c1"># - added structured documentation</span> +<span class="c1"># - minor changes in programming style for consistence</span> +<span class="c1"># - added function main and moved function calls vom __main__ there</span> +<span class="c1"># (necessary for better documentation with docstrings for later</span> +<span class="c1"># online documentation)</span> +<span class="c1"># - use of UIFiles class for file selection and deletion</span> +<span class="c1">#</span> +<span class="c1">#</span> +<span class="c1"># @License:</span> +<span class="c1"># (C) Copyright 2014-2018.</span> +<span class="c1">#</span> +<span class="c1"># This software is licensed under the terms of the Apache Licence Version 2.0</span> +<span class="c1"># which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.</span> +<span class="c1">#</span> +<span class="c1"># @Program Functionality:</span> +<span class="c1"># This program can be used as a module in the whole flex_extract process</span> +<span class="c1"># or can be run by itself to just extract MARS data from ECMWF. To do so,</span> +<span class="c1"># a couple of necessary parameters has to be passed with the program call.</span> +<span class="c1"># See documentation for more details.</span> +<span class="c1">#</span> +<span class="c1"># @Program Content:</span> +<span class="c1"># - main</span> +<span class="c1"># - get_mars_data</span> +<span class="c1"># - do_retrievement</span> +<span class="c1">#</span> +<span class="c1">#*******************************************************************************</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># MODULES</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">sys</span> +<span class="kn">import</span> <span class="nn">inspect</span> +<span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span> + +<span class="c1"># software specific classes and modules from flex_extract</span> +<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span> + <span class="n">inspect</span><span class="o">.</span><span class="n">getfile</span><span class="p">(</span><span class="n">inspect</span><span class="o">.</span><span class="n">currentframe</span><span class="p">())))</span> <span class="o">+</span> <span class="s1">'/../'</span><span class="p">)</span> +<span class="kn">import</span> <span class="nn">_config</span> +<span class="kn">from</span> <span class="nn">tools</span> <span class="k">import</span> <span class="p">(</span><span class="n">my_error</span><span class="p">,</span> <span class="n">normal_exit</span><span class="p">,</span> <span class="n">get_cmdline_arguments</span><span class="p">,</span> + <span class="n">read_ecenv</span><span class="p">,</span> <span class="n">make_dir</span><span class="p">)</span> +<span class="kn">from</span> <span class="nn">classes.EcFlexpart</span> <span class="k">import</span> <span class="n">EcFlexpart</span> +<span class="kn">from</span> <span class="nn">classes.UioFiles</span> <span class="k">import</span> <span class="n">UioFiles</span> + +<span class="k">try</span><span class="p">:</span> + <span class="n">ecapi</span> <span class="o">=</span> <span class="kc">True</span> + <span class="kn">import</span> <span class="nn">ecmwfapi</span> +<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> + <span class="n">ecapi</span> <span class="o">=</span> <span class="kc">False</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># FUNCTION</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<div class="viewcode-block" id="main"><a class="viewcode-back" href="../api.html#get_mars_data.main">[docs]</a><span class="k">def</span> <span class="nf">main</span><span class="p">():</span> + <span class="sd">'''Controls the program to get data out of mars.</span> + +<span class="sd"> This is done if it is called directly from command line.</span> +<span class="sd"> Then it also takes program call arguments and control file input.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="n">args</span> <span class="o">=</span> <span class="n">get_cmdline_arguments</span><span class="p">()</span> + <span class="n">c</span> <span class="o">=</span> <span class="n">ControlFile</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">controlfile</span><span class="p">)</span> + + <span class="n">env_parameter</span> <span class="o">=</span> <span class="n">read_ecenv</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_ECMWF_ENV</span><span class="p">)</span> + <span class="n">c</span><span class="o">.</span><span class="n">assign_args_to_control</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> + <span class="n">c</span><span class="o">.</span><span class="n">assign_envs_to_control</span><span class="p">(</span><span class="n">env_parameter</span><span class="p">)</span> + <span class="n">c</span><span class="o">.</span><span class="n">check_conditions</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">queue</span><span class="p">)</span> + + <span class="n">get_mars_data</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> + <span class="n">normal_exit</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">mailfail</span><span class="p">,</span> <span class="s1">'Done!'</span><span class="p">)</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="get_mars_data"><a class="viewcode-back" href="../api.html#get_mars_data.get_mars_data">[docs]</a><span class="k">def</span> <span class="nf">get_mars_data</span><span class="p">(</span><span class="n">c</span><span class="p">):</span> + <span class="sd">'''Retrieves the EC data needed for a FLEXPART simulation.</span> + +<span class="sd"> Start and end dates for retrieval period is set. Retrievals</span> +<span class="sd"> are divided into smaller periods if necessary and datechunk parameter</span> +<span class="sd"> is set.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">):</span> + <span class="n">make_dir</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">request</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">c</span><span class="o">.</span><span class="n">request</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"Retrieving EC data!"</span><span class="p">)</span> + <span class="k">elif</span> <span class="n">c</span><span class="o">.</span><span class="n">request</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"Printing mars requests!"</span><span class="p">)</span> + + <span class="nb">print</span><span class="p">(</span><span class="s2">"start date </span><span class="si">%s</span><span class="s2"> "</span> <span class="o">%</span> <span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">start_date</span><span class="p">))</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"end date </span><span class="si">%s</span><span class="s2"> "</span> <span class="o">%</span> <span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">end_date</span><span class="p">))</span> + + <span class="k">if</span> <span class="n">ecapi</span><span class="p">:</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">public</span><span class="p">:</span> + <span class="n">server</span> <span class="o">=</span> <span class="n">ecmwfapi</span><span class="o">.</span><span class="n">ECMWFDataServer</span><span class="p">()</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">server</span> <span class="o">=</span> <span class="n">ecmwfapi</span><span class="o">.</span><span class="n">ECMWFService</span><span class="p">(</span><span class="s2">"mars"</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">server</span> <span class="o">=</span> <span class="kc">False</span> + + <span class="n">c</span><span class="o">.</span><span class="n">ecapi</span> <span class="o">=</span> <span class="n">ecapi</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Using ECMWF WebAPI: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">ecapi</span><span class="p">))</span> + + <span class="c1"># basetime geht rückwärts</span> + + <span class="c1"># if basetime 00</span> + <span class="c1"># dann wird von 12 am vortag bis 00 am start tag geholt</span> + <span class="c1"># aber ohne 12 selbst sondern 12 + step</span> + + <span class="c1"># if basetime 12</span> + <span class="c1"># dann wird von 00 + step bis 12 am start tag geholt</span> + + <span class="c1"># purer forecast wird vorwärts bestimmt.</span> + <span class="c1"># purer forecast mode ist dann wenn größer 24 stunden</span> + <span class="c1"># wie kann das noch festgestellt werden ????</span> + <span class="c1"># nur FC und steps mehr als 24 ?</span> + <span class="c1"># die einzige problematik beim reinen forecast ist die benennung der files!</span> + <span class="c1"># also sobald es Tagesüberschneidungen gibt</span> + <span class="c1"># allerdings ist das relevant und ersichtlich an den NICHT FLUSS DATEN</span> + + <span class="n">start</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">start_date</span><span class="p">,</span> <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span> + <span class="n">end</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">end_date</span><span class="p">,</span> <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span> + <span class="c1"># time period for one single retrieval</span> + <span class="n">datechunk</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">date_chunk</span><span class="p">))</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span> <span class="o">==</span> <span class="s1">'00'</span><span class="p">:</span> + <span class="n">start</span> <span class="o">=</span> <span class="n">start</span> <span class="o">-</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o"><=</span> <span class="mi">24</span><span class="p">:</span> + <span class="n">startm1</span> <span class="o">=</span> <span class="n">start</span> <span class="o">-</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span> <span class="o">==</span> <span class="s1">'00'</span> <span class="ow">or</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span> <span class="o">==</span> <span class="s1">'12'</span><span class="p">:</span> + <span class="c1"># endp1 = end + timedelta(days=1)</span> + <span class="n">endp1</span> <span class="o">=</span> <span class="n">end</span> + <span class="k">else</span><span class="p">:</span> + <span class="c1"># endp1 = end + timedelta(days=2)</span> + <span class="n">endp1</span> <span class="o">=</span> <span class="n">end</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + + <span class="c1"># -------------- flux data ------------------------------------------------</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">request</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">c</span><span class="o">.</span><span class="n">request</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'... removing old flux content of '</span> <span class="o">+</span> <span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">)</span> + <span class="n">tobecleaned</span> <span class="o">=</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> + <span class="s1">'*_acc_*.'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getppid</span><span class="p">())</span> <span class="o">+</span> <span class="s1">'.*.grb'</span><span class="p">)</span> + <span class="n">tobecleaned</span><span class="o">.</span><span class="n">delete_files</span><span class="p">()</span> + + <span class="c1"># if forecast for maximum one day (upto 24h) are to be retrieved,</span> + <span class="c1"># collect accumulation data (flux data)</span> + <span class="c1"># with additional days in the beginning and at the end</span> + <span class="c1"># (used for complete disaggregation of original period)</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o"><=</span> <span class="mi">24</span><span class="p">:</span> + <span class="n">do_retrievement</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">server</span><span class="p">,</span> <span class="n">startm1</span><span class="p">,</span> <span class="n">endp1</span><span class="p">,</span> <span class="n">datechunk</span><span class="p">,</span> <span class="n">fluxes</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> + + <span class="c1"># if forecast data longer than 24h are to be retrieved,</span> + <span class="c1"># collect accumulation data (flux data)</span> + <span class="c1"># with the exact start and end date</span> + <span class="c1"># (disaggregation will be done for the</span> + <span class="c1"># exact time period with boundary conditions)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">do_retrievement</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">server</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">datechunk</span><span class="p">,</span> <span class="n">fluxes</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> + + <span class="c1"># -------------- non flux data --------------------------------------------</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">request</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">c</span><span class="o">.</span><span class="n">request</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'... removing old non flux content of '</span> <span class="o">+</span> <span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">)</span> + <span class="n">tobecleaned</span> <span class="o">=</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> + <span class="s1">'*__*.'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getppid</span><span class="p">())</span> <span class="o">+</span> <span class="s1">'.*.grb'</span><span class="p">)</span> + <span class="n">tobecleaned</span><span class="o">.</span><span class="n">delete_files</span><span class="p">()</span> + + <span class="n">do_retrievement</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">server</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">datechunk</span><span class="p">,</span> <span class="n">fluxes</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="do_retrievement"><a class="viewcode-back" href="../api.html#get_mars_data.do_retrievement">[docs]</a><span class="k">def</span> <span class="nf">do_retrievement</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">server</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">delta_t</span><span class="p">,</span> <span class="n">fluxes</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> + <span class="sd">'''Divides the complete retrieval period in smaller chunks and</span> +<span class="sd"> retrieves the data from MARS.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> server : :obj:`ECMWFService`</span> +<span class="sd"> The server connection to ECMWF.</span> + +<span class="sd"> start : :obj:`datetime`</span> +<span class="sd"> The start date of the retrieval.</span> + +<span class="sd"> end : :obj:`datetime`</span> +<span class="sd"> The end date of the retrieval.</span> + +<span class="sd"> delta_t : :obj:`datetime`</span> +<span class="sd"> Delta_t + 1 is the maximal time period of a single</span> +<span class="sd"> retrieval.</span> + +<span class="sd"> fluxes : :obj:`boolean`, optional</span> +<span class="sd"> Decides if the flux parameters are to be retrieved or</span> +<span class="sd"> the rest of the parameter list.</span> +<span class="sd"> Default value is False.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="c1"># since actual day also counts as one day,</span> + <span class="c1"># we only need to add datechunk - 1 days to retrieval</span> + <span class="c1"># for a period</span> + <span class="n">delta_t_m1</span> <span class="o">=</span> <span class="n">delta_t</span> <span class="o">-</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + + <span class="n">day</span> <span class="o">=</span> <span class="n">start</span> + <span class="k">while</span> <span class="n">day</span> <span class="o"><=</span> <span class="n">end</span><span class="p">:</span> + <span class="n">flexpart</span> <span class="o">=</span> <span class="n">EcFlexpart</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">fluxes</span><span class="p">)</span> + <span class="n">tmpday</span> <span class="o">=</span> <span class="n">day</span> <span class="o">+</span> <span class="n">delta_t_m1</span> + <span class="k">if</span> <span class="n">tmpday</span> <span class="o"><</span> <span class="n">end</span><span class="p">:</span> + <span class="n">dates</span> <span class="o">=</span> <span class="n">day</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%Y%m</span><span class="si">%d</span><span class="s2">"</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"/to/"</span> <span class="o">+</span> \ + <span class="n">tmpday</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%Y%m</span><span class="si">%d</span><span class="s2">"</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">dates</span> <span class="o">=</span> <span class="n">day</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%Y%m</span><span class="si">%d</span><span class="s2">"</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"/to/"</span> <span class="o">+</span> \ + <span class="n">end</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%Y%m</span><span class="si">%d</span><span class="s2">"</span><span class="p">)</span> + + <span class="nb">print</span><span class="p">(</span><span class="s2">"... retrieve "</span> <span class="o">+</span> <span class="n">dates</span> <span class="o">+</span> <span class="s2">" in dir "</span> <span class="o">+</span> <span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">)</span> + + <span class="k">try</span><span class="p">:</span> + <span class="n">flexpart</span><span class="o">.</span><span class="n">retrieve</span><span class="p">(</span><span class="n">server</span><span class="p">,</span> <span class="n">dates</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">public</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">request</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">)</span> + <span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span> + <span class="n">my_error</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">mailfail</span><span class="p">,</span> <span class="s1">'MARS request failed'</span><span class="p">)</span> + + <span class="n">day</span> <span class="o">+=</span> <span class="n">delta_t</span> + + <span class="k">return</span></div> + +<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> + <span class="n">main</span><span class="p">()</span> +</pre></div> + + </div> + + </div> + <footer> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_modules/index.html b/documentation/Sphinx/build/html/_modules/index.html index 48292b2..5dc4643 100644 --- a/documentation/Sphinx/build/html/_modules/index.html +++ b/documentation/Sphinx/build/html/_modules/index.html @@ -149,7 +149,16 @@ <div itemprop="articleBody"> <h1>All modules for which code is available</h1> -<ul><li><a href="disaggregation.html">disaggregation</a></li> +<ul><li><a href="ControlFile.html">ControlFile</a></li> +<li><a href="EcFlexpart.html">EcFlexpart</a></li> +<li><a href="GribTools.html">GribTools</a></li> +<li><a href="MarsRetrieval.html">MarsRetrieval</a></li> +<li><a href="UioFiles.html">UioFiles</a></li> +<li><a href="disaggregation.html">disaggregation</a></li> +<li><a href="get_mars_data.html">get_mars_data</a></li> +<li><a href="install.html">install</a></li> +<li><a href="prepare_flexpart.html">prepare_flexpart</a></li> +<li><a href="submit.html">submit</a></li> <li><a href="tools.html">tools</a></li> </ul> diff --git a/documentation/Sphinx/build/html/_modules/install.html b/documentation/Sphinx/build/html/_modules/install.html new file mode 100644 index 0000000..bbb3df0 --- /dev/null +++ b/documentation/Sphinx/build/html/_modules/install.html @@ -0,0 +1,746 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>install — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="index.html">Module code</a> »</li> + + <li>install</li> + + + <li class="wy-breadcrumbs-aside"> + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <h1>Source code for install</h1><div class="highlight"><pre> +<span></span><span class="ch">#!/usr/bin/env python</span> +<span class="c1"># -*- coding: utf-8 -*-</span> +<span class="c1">#*******************************************************************************</span> +<span class="c1"># @Author: Leopold Haimberger (University of Vienna)</span> +<span class="c1">#</span> +<span class="c1"># @Date: November 2015</span> +<span class="c1">#</span> +<span class="c1"># @Change History:</span> +<span class="c1">#</span> +<span class="c1"># February 2018 - Anne Philipp (University of Vienna):</span> +<span class="c1"># - applied PEP8 style guide</span> +<span class="c1"># - added documentation</span> +<span class="c1"># - moved install_args_and_control in here</span> +<span class="c1"># - splitted code in smaller functions</span> +<span class="c1"># - delete convert build files in here instead of compile job script</span> +<span class="c1"># - changed static path names to Variables from config file</span> +<span class="c1">#</span> +<span class="c1"># @License:</span> +<span class="c1"># (C) Copyright 2015-2018.</span> +<span class="c1">#</span> +<span class="c1"># This software is licensed under the terms of the Apache Licence Version 2.0</span> +<span class="c1"># which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.</span> +<span class="c1">#</span> +<span class="c1"># @Program Functionality:</span> +<span class="c1"># Depending on the selected installation environment (locally or on the</span> +<span class="c1"># ECMWF server ecgate or cca) the program extracts the commandline</span> +<span class="c1"># arguments and the CONTROL file parameter and prepares the corresponding</span> +<span class="c1"># environment. The necessary files are collected in a tar-ball and placed</span> +<span class="c1"># at the target location. There its untared, the environment variables will</span> +<span class="c1"># be set and the Fortran code will be compiled. If the ECMWF environment is</span> +<span class="c1"># selected a job script is prepared and submitted for the remaining</span> +<span class="c1"># configurations after putting the tar-ball to the target ECMWF server.</span> +<span class="c1">#</span> +<span class="c1"># @Program Content:</span> +<span class="c1"># - main</span> +<span class="c1"># - get_install_cmdline_arguments</span> +<span class="c1"># - install_via_gateway</span> +<span class="c1"># - mk_tarball</span> +<span class="c1"># - un_tarball</span> +<span class="c1"># - mk_env_vars</span> +<span class="c1"># - mk_compilejob</span> +<span class="c1"># - mk_job_template</span> +<span class="c1"># - delete_convert_build</span> +<span class="c1"># - make_convert_build</span> +<span class="c1">#</span> +<span class="c1">#*******************************************************************************</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># MODULES</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">sys</span> +<span class="kn">import</span> <span class="nn">glob</span> +<span class="kn">import</span> <span class="nn">subprocess</span> +<span class="kn">import</span> <span class="nn">inspect</span> +<span class="kn">from</span> <span class="nn">argparse</span> <span class="k">import</span> <span class="n">ArgumentParser</span><span class="p">,</span> <span class="n">ArgumentDefaultsHelpFormatter</span> + +<span class="c1"># software specific classes and modules from flex_extract</span> +<span class="kn">import</span> <span class="nn">_config</span> +<span class="kn">from</span> <span class="nn">classes.ControlFile</span> <span class="k">import</span> <span class="n">ControlFile</span> +<span class="kn">from</span> <span class="nn">classes.UioFiles</span> <span class="k">import</span> <span class="n">UioFiles</span> +<span class="kn">from</span> <span class="nn">mods.tools</span> <span class="k">import</span> <span class="n">make_dir</span><span class="p">,</span> <span class="n">put_file_to_ecserver</span><span class="p">,</span> <span class="n">submit_job_to_ecserver</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># FUNCTIONS</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<div class="viewcode-block" id="main"><a class="viewcode-back" href="../api.html#install.main">[docs]</a><span class="k">def</span> <span class="nf">main</span><span class="p">():</span> + <span class="sd">'''Controls the installation process. Calls the installation function</span> +<span class="sd"> if target is specified.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> '''</span> + + <span class="n">args</span> <span class="o">=</span> <span class="n">get_install_cmdline_arguments</span><span class="p">()</span> + <span class="n">c</span> <span class="o">=</span> <span class="n">ControlFile</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">controlfile</span><span class="p">)</span> + <span class="n">c</span><span class="o">.</span><span class="n">assign_args_to_control</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> + <span class="n">c</span><span class="o">.</span><span class="n">check_install_conditions</span><span class="p">()</span> + + <span class="n">install_via_gateway</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="get_install_cmdline_arguments"><a class="viewcode-back" href="../api.html#install.get_install_cmdline_arguments">[docs]</a><span class="k">def</span> <span class="nf">get_install_cmdline_arguments</span><span class="p">():</span> + <span class="sd">'''Decomposes the command line arguments and assigns them to variables.</span> +<span class="sd"> Apply default values for non mentioned arguments.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> args : :obj:`Namespace`</span> +<span class="sd"> Contains the commandline arguments from script/program call.</span> +<span class="sd"> '''</span> + <span class="n">parser</span> <span class="o">=</span> <span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s1">'Install flex_extract software locally or </span><span class="se">\</span> +<span class="s1"> on ECMWF machines'</span><span class="p">,</span> + <span class="n">formatter_class</span><span class="o">=</span><span class="n">ArgumentDefaultsHelpFormatter</span><span class="p">)</span> + + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--target'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s1">'install_target'</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> + <span class="n">help</span><span class="o">=</span><span class="s2">"Valid targets: local | ecgate | cca , </span><span class="se">\</span> +<span class="s2"> the latter two are at ECMWF"</span><span class="p">)</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--makefile"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"makefile"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> + <span class="n">help</span><span class="o">=</span><span class="s1">'Name of Makefile to use for compiling CONVERT2'</span><span class="p">)</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--ecuid"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"ecuid"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> + <span class="n">help</span><span class="o">=</span><span class="s1">'user id at ECMWF'</span><span class="p">)</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--ecgid"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"ecgid"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> + <span class="n">help</span><span class="o">=</span><span class="s1">'group id at ECMWF'</span><span class="p">)</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--gateway"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"gateway"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> + <span class="n">help</span><span class="o">=</span><span class="s1">'name of local gateway server'</span><span class="p">)</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--destination"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"destination"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> + <span class="n">help</span><span class="o">=</span><span class="s1">'ecaccess destination, e.g. leo@genericSftp'</span><span class="p">)</span> + + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--flexpart_root_scripts"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"flexpart_root_scripts"</span><span class="p">,</span> + <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"FLEXPART root directory on ECMWF </span><span class="se">\</span> +<span class="s2"> servers (to find grib2flexpart and COMMAND file)</span><span class="se">\n\</span> +<span class="s2"> Normally flex_extract resides in the scripts directory </span><span class="se">\</span> +<span class="s2"> of the FLEXPART distribution."</span><span class="p">)</span> + + <span class="c1"># arguments for job submission to ECMWF, only needed by submit.py</span> + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--job_template"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s1">'job_template'</span><span class="p">,</span> + <span class="n">default</span><span class="o">=</span><span class="s2">"job.temp.o"</span><span class="p">,</span> + <span class="n">help</span><span class="o">=</span><span class="s2">"job template file for submission to ECMWF"</span><span class="p">)</span> + + <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--controlfile"</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s2">"controlfile"</span><span class="p">,</span> + <span class="n">default</span><span class="o">=</span><span class="s1">'CONTROL.temp'</span><span class="p">,</span> + <span class="n">help</span><span class="o">=</span><span class="s2">"file with CONTROL parameters"</span><span class="p">)</span> + + <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> + + <span class="k">return</span> <span class="n">args</span></div> + + +<div class="viewcode-block" id="install_via_gateway"><a class="viewcode-back" href="../api.html#install.install_via_gateway">[docs]</a><span class="k">def</span> <span class="nf">install_via_gateway</span><span class="p">(</span><span class="n">c</span><span class="p">):</span> + <span class="sd">'''Perform the actual installation on local machine or prepare data</span> +<span class="sd"> transfer to remote gate and submit a job script which will</span> +<span class="sd"> install everything on the remote gate.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="kn">import</span> <span class="nn">tarfile</span> + + <span class="n">ecd</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">PATH_FLEXEXTRACT_DIR</span> + <span class="n">tarball_name</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">FLEXEXTRACT_DIRNAME</span> <span class="o">+</span> <span class="s1">'.tar'</span> + <span class="n">tar_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">ecd</span><span class="p">,</span> <span class="n">tarball_name</span><span class="p">)</span> + + <span class="n">target_dirname</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">FLEXEXTRACT_DIRNAME</span> + <span class="n">fortran_executable</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">FORTRAN_EXECUTABLE</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">install_target</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">'local'</span><span class="p">:</span> <span class="c1"># ecgate or cca</span> + + <span class="n">mk_compilejob</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">makefile</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">install_target</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">ecuid</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">ecgid</span><span class="p">,</span> + <span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">)</span> + + <span class="n">mk_job_template</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">ecuid</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">ecgid</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">gateway</span><span class="p">,</span> + <span class="n">c</span><span class="o">.</span><span class="n">destination</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">)</span> + + <span class="n">mk_env_vars</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">ecuid</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">ecgid</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">gateway</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">destination</span><span class="p">)</span> + + <span class="n">mk_tarball</span><span class="p">(</span><span class="n">tar_file</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">install_target</span><span class="p">)</span> + + <span class="n">put_file_to_ecserver</span><span class="p">(</span><span class="n">ecd</span><span class="p">,</span> <span class="n">tarball_name</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">install_target</span><span class="p">,</span> + <span class="n">c</span><span class="o">.</span><span class="n">ecuid</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">ecgid</span><span class="p">)</span> + + <span class="n">submit_job_to_ecserver</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">install_target</span><span class="p">,</span> + <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_REL_JOBSCRIPTS</span><span class="p">,</span> + <span class="n">_config</span><span class="o">.</span><span class="n">FILE_INSTALL_COMPILEJOB</span><span class="p">))</span> + + <span class="nb">print</span><span class="p">(</span><span class="s1">'job compilation script has been submitted to ecgate for '</span> <span class="o">+</span> + <span class="s1">'installation in '</span> <span class="o">+</span> <span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span> <span class="o">+</span> + <span class="s1">'/'</span> <span class="o">+</span> <span class="n">target_dirname</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'You should get an email with subject "flexcompile" within '</span> <span class="o">+</span> + <span class="s1">'the next few minutes!'</span><span class="p">)</span> + + <span class="k">else</span><span class="p">:</span> <span class="c1">#local</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span> <span class="o">==</span> <span class="n">_config</span><span class="o">.</span><span class="n">PATH_FLEXEXTRACT_DIR</span> <span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'WARNING: FLEXPART_ROOT_SCRIPTS has not been specified'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'flex_extract will be installed in here by compiling the '</span> <span class="o">+</span> + <span class="s1">'Fortran source in '</span> <span class="o">+</span> <span class="n">_config</span><span class="o">.</span><span class="n">PATH_FORTRAN_SRC</span><span class="p">)</span> + <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_FORTRAN_SRC</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> <span class="c1"># creates the target working directory for flex_extract</span> + <span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expandvars</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span> + <span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">))</span> + <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">ecd</span><span class="p">)</span> <span class="o">!=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">):</span> + <span class="n">mk_tarball</span><span class="p">(</span><span class="n">tar_file</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">install_target</span><span class="p">)</span> + <span class="n">make_dir</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">,</span> + <span class="n">target_dirname</span><span class="p">))</span> + <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">,</span> + <span class="n">target_dirname</span><span class="p">))</span> + <span class="n">un_tarball</span><span class="p">(</span><span class="n">tar_file</span><span class="p">)</span> + <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">,</span> + <span class="n">target_dirname</span><span class="p">,</span> + <span class="n">_config</span><span class="o">.</span><span class="n">PATH_REL_FORTRAN_SRC</span><span class="p">))</span> + + <span class="c1"># Create Fortran executable - CONVERT2</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Install '</span> <span class="o">+</span> <span class="n">target_dirname</span> <span class="o">+</span> <span class="s1">' software at '</span> <span class="o">+</span> + <span class="n">c</span><span class="o">.</span><span class="n">install_target</span> <span class="o">+</span> <span class="s1">' in directory '</span> <span class="o">+</span> + <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">flexpart_root_scripts</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + + <span class="n">delete_convert_build</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)</span> + <span class="n">make_convert_build</span><span class="p">(</span><span class="s1">'.'</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">makefile</span><span class="p">)</span> + + <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">ecd</span><span class="p">)</span> + <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">tar_file</span><span class="p">):</span> + <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">tar_file</span><span class="p">)</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="mk_tarball"><a class="viewcode-back" href="../api.html#install.mk_tarball">[docs]</a><span class="k">def</span> <span class="nf">mk_tarball</span><span class="p">(</span><span class="n">tarball_path</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span> + <span class="sd">'''Creates a tarball with all necessary files which need to be sent to the</span> +<span class="sd"> installation directory.</span> +<span class="sd"> It does not matter if this is local or remote.</span> +<span class="sd"> Collects all python files, the Fortran source and makefiles,</span> +<span class="sd"> the ECMWF_ENV file, the CONTROL files as well as the</span> +<span class="sd"> template files.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> tarball_path : :obj:`string`</span> +<span class="sd"> The complete path to the tar file which will contain all</span> +<span class="sd"> relevant data for flex_extract.</span> + +<span class="sd"> target : :obj:`string`</span> +<span class="sd"> The queue where the job is submitted to.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="kn">import</span> <span class="nn">tarfile</span> + <span class="kn">from</span> <span class="nn">glob</span> <span class="k">import</span> <span class="n">glob</span> + + <span class="nb">print</span><span class="p">(</span><span class="s1">'Create tarball ...'</span><span class="p">)</span> + + <span class="c1"># change to FLEXEXTRACT directory so that the tar can contain</span> + <span class="c1"># relative pathes to the files and directories</span> + <span class="n">ecd</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">PATH_FLEXEXTRACT_DIR</span> <span class="o">+</span> <span class="s1">'/'</span> + <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">ecd</span><span class="p">)</span> + + <span class="c1"># get lists of the files to be added to the tar file</span> + <span class="k">if</span> <span class="n">target</span> <span class="o">==</span> <span class="s1">'local'</span><span class="p">:</span> + <span class="n">ECMWF_ENV_FILE</span> <span class="o">=</span> <span class="p">[]</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">ECMWF_ENV_FILE</span> <span class="o">=</span> <span class="p">[</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_REL_ECMWF_ENV</span><span class="p">]</span> + + <span class="n">pyfiles</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">ecd</span><span class="p">)</span> + <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_LOCAL_PYTHON</span><span class="p">,</span> <span class="s1">'*py'</span><span class="p">)</span><span class="o">.</span><span class="n">files</span><span class="p">]</span> + <span class="n">controlfiles</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">ecd</span><span class="p">)</span> + <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_CONTROLFILES</span><span class="p">,</span> + <span class="s1">'CONTROL*'</span><span class="p">)</span><span class="o">.</span><span class="n">files</span><span class="p">]</span> + <span class="n">tempfiles</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">ecd</span><span class="p">)</span> + <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_TEMPLATES</span> <span class="p">,</span> <span class="s1">'*'</span><span class="p">)</span><span class="o">.</span><span class="n">files</span><span class="p">]</span> + <span class="n">ffiles</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">ecd</span><span class="p">)</span> + <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_FORTRAN_SRC</span><span class="p">,</span> <span class="s1">'*.f*'</span><span class="p">)</span><span class="o">.</span><span class="n">files</span><span class="p">]</span> + <span class="n">hfiles</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">ecd</span><span class="p">)</span> + <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_FORTRAN_SRC</span><span class="p">,</span> <span class="s1">'*.h'</span><span class="p">)</span><span class="o">.</span><span class="n">files</span><span class="p">]</span> + <span class="n">makefiles</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">ecd</span><span class="p">)</span> + <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_FORTRAN_SRC</span><span class="p">,</span> <span class="s1">'Makefile*'</span><span class="p">)</span><span class="o">.</span><span class="n">files</span><span class="p">]</span> + + <span class="c1"># concatenate single lists to one for a better looping</span> + <span class="n">filelist</span> <span class="o">=</span> <span class="n">pyfiles</span> <span class="o">+</span> <span class="n">controlfiles</span> <span class="o">+</span> <span class="n">tempfiles</span> <span class="o">+</span> <span class="n">ffiles</span> <span class="o">+</span> <span class="n">hfiles</span> <span class="o">+</span> \ + <span class="n">makefiles</span> <span class="o">+</span> <span class="n">ECMWF_ENV_FILE</span> + + <span class="c1"># create installation tar-file</span> + <span class="k">try</span><span class="p">:</span> + <span class="k">with</span> <span class="n">tarfile</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">tarball_path</span><span class="p">,</span> <span class="s2">"w:gz"</span><span class="p">)</span> <span class="k">as</span> <span class="n">tar_handle</span><span class="p">:</span> + <span class="k">for</span> <span class="n">file</span> <span class="ow">in</span> <span class="n">filelist</span><span class="p">:</span> + <span class="n">tar_handle</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">file</span><span class="p">)</span> + + <span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'... ERROR CODE:</span><span class="se">\n</span><span class="s1"> ... '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">returncode</span><span class="p">))</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'... ERROR MESSAGE:</span><span class="se">\n</span><span class="s1"> ... '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span> + + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">'... could not make installation tar ball!'</span><span class="p">)</span> + + <span class="k">return</span></div> + + +<div class="viewcode-block" id="un_tarball"><a class="viewcode-back" href="../api.html#install.un_tarball">[docs]</a><span class="k">def</span> <span class="nf">un_tarball</span><span class="p">(</span><span class="n">tarball_path</span><span class="p">):</span> + <span class="sd">'''Extracts the given tarball into current directory.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> tarball_path : :obj:`string`</span> +<span class="sd"> The complete path to the tar file which will contain all</span> +<span class="sd"> relevant data for flex_extract.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="kn">import</span> <span class="nn">tarfile</span> + + <span class="nb">print</span><span class="p">(</span><span class="s1">'Untar ...'</span><span class="p">)</span> + + <span class="k">with</span> <span class="n">tarfile</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">tarball_path</span><span class="p">)</span> <span class="k">as</span> <span class="n">tar_handle</span><span class="p">:</span> + <span class="n">tar_handle</span><span class="o">.</span><span class="n">extractall</span><span class="p">()</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="mk_env_vars"><a class="viewcode-back" href="../api.html#install.mk_env_vars">[docs]</a><span class="k">def</span> <span class="nf">mk_env_vars</span><span class="p">(</span><span class="n">ecuid</span><span class="p">,</span> <span class="n">ecgid</span><span class="p">,</span> <span class="n">gateway</span><span class="p">,</span> <span class="n">destination</span><span class="p">):</span> + <span class="sd">'''Creates a file named ECMWF_ENV which contains the</span> +<span class="sd"> necessary environmental variables at ECMWF servers.</span> +<span class="sd"> It is based on the template ECMWF_ENV.template.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> ecuid : :obj:`string`</span> +<span class="sd"> The user id on ECMWF server.</span> + +<span class="sd"> ecgid : :obj:`string`</span> +<span class="sd"> The group id on ECMWF server.</span> + +<span class="sd"> gateway : :obj:`string`</span> +<span class="sd"> The gateway server the user is using.</span> + +<span class="sd"> destination : :obj:`string`</span> +<span class="sd"> The remote destination which is used to transfer files</span> +<span class="sd"> from ECMWF server to local gateway server.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="kn">from</span> <span class="nn">genshi.template.text</span> <span class="k">import</span> <span class="n">NewTextTemplate</span> + <span class="kn">from</span> <span class="nn">genshi.template</span> <span class="k">import</span> <span class="n">TemplateLoader</span> + + <span class="n">loader</span> <span class="o">=</span> <span class="n">TemplateLoader</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_TEMPLATES</span><span class="p">,</span> <span class="n">auto_reload</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> + <span class="n">ecmwfvars_template</span> <span class="o">=</span> <span class="n">loader</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">TEMPFILE_USER_ENVVARS</span><span class="p">,</span> + <span class="bp">cls</span><span class="o">=</span><span class="n">NewTextTemplate</span><span class="p">)</span> + + <span class="n">stream</span> <span class="o">=</span> <span class="n">ecmwfvars_template</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="n">user_name</span> <span class="o">=</span> <span class="n">ecuid</span><span class="p">,</span> + <span class="n">user_group</span> <span class="o">=</span> <span class="n">ecgid</span><span class="p">,</span> + <span class="n">gateway_name</span> <span class="o">=</span> <span class="n">gateway</span><span class="p">,</span> + <span class="n">destination_name</span> <span class="o">=</span> <span class="n">destination</span> + <span class="p">)</span> + + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_ECMWF_ENV</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">stream</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s1">'text'</span><span class="p">))</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="mk_compilejob"><a class="viewcode-back" href="../api.html#install.mk_compilejob">[docs]</a><span class="k">def</span> <span class="nf">mk_compilejob</span><span class="p">(</span><span class="n">makefile</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">ecuid</span><span class="p">,</span> <span class="n">ecgid</span><span class="p">,</span> <span class="n">fp_root</span><span class="p">):</span> + <span class="sd">'''Modifies the original job template file so that it is specified</span> +<span class="sd"> for the user and the environment were it will be applied. Result</span> +<span class="sd"> is stored in a new file "job.temp" in the python directory.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> makefile : :obj:`string`</span> +<span class="sd"> Name of the makefile which should be used to compile FORTRAN</span> +<span class="sd"> CONVERT2 program.</span> + +<span class="sd"> target : :obj:`string`</span> +<span class="sd"> The target where the installation should be done, e.g. the queue.</span> + +<span class="sd"> ecuid : :obj:`string`</span> +<span class="sd"> The user id on ECMWF server.</span> + +<span class="sd"> ecgid : :obj:`string`</span> +<span class="sd"> The group id on ECMWF server.</span> + +<span class="sd"> fp_root : :obj:`string`</span> +<span class="sd"> Path to the root directory of FLEXPART environment or flex_extract</span> +<span class="sd"> environment.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="kn">from</span> <span class="nn">genshi.template.text</span> <span class="k">import</span> <span class="n">NewTextTemplate</span> + <span class="kn">from</span> <span class="nn">genshi.template</span> <span class="k">import</span> <span class="n">TemplateLoader</span> + + <span class="n">loader</span> <span class="o">=</span> <span class="n">TemplateLoader</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_TEMPLATES</span><span class="p">,</span> <span class="n">auto_reload</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> + <span class="n">compile_template</span> <span class="o">=</span> <span class="n">loader</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">TEMPFILE_INSTALL_COMPILEJOB</span><span class="p">,</span> + <span class="bp">cls</span><span class="o">=</span><span class="n">NewTextTemplate</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">fp_root</span> <span class="o">==</span> <span class="s1">'../'</span><span class="p">:</span> + <span class="n">fp_root</span> <span class="o">=</span> <span class="s1">'$HOME'</span> + + <span class="n">stream</span> <span class="o">=</span> <span class="n">compile_template</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span> + <span class="n">usergroup</span> <span class="o">=</span> <span class="n">ecgid</span><span class="p">,</span> + <span class="n">username</span> <span class="o">=</span> <span class="n">ecuid</span><span class="p">,</span> + <span class="n">version_number</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">_VERSION_STR</span><span class="p">,</span> + <span class="n">fp_root_scripts</span> <span class="o">=</span> <span class="n">fp_root</span><span class="p">,</span> + <span class="n">makefile</span> <span class="o">=</span> <span class="n">makefile</span><span class="p">,</span> + <span class="n">fortran_program</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">FORTRAN_EXECUTABLE</span> + <span class="p">)</span> + + <span class="n">compilejob</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_JOBSCRIPTS</span><span class="p">,</span> + <span class="n">_config</span><span class="o">.</span><span class="n">FILE_INSTALL_COMPILEJOB</span><span class="p">)</span> + + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">compilejob</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">stream</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s1">'text'</span><span class="p">))</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="mk_job_template"><a class="viewcode-back" href="../api.html#install.mk_job_template">[docs]</a><span class="k">def</span> <span class="nf">mk_job_template</span><span class="p">(</span><span class="n">ecuid</span><span class="p">,</span> <span class="n">ecgid</span><span class="p">,</span> <span class="n">gateway</span><span class="p">,</span> <span class="n">destination</span><span class="p">,</span> <span class="n">fp_root</span><span class="p">):</span> + <span class="sd">'''Modifies the original job template file so that it is specified</span> +<span class="sd"> for the user and the environment were it will be applied. Result</span> +<span class="sd"> is stored in a new file.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> ecuid : :obj:`string`</span> +<span class="sd"> The user id on ECMWF server.</span> + +<span class="sd"> ecgid : :obj:`string`</span> +<span class="sd"> The group id on ECMWF server.</span> + +<span class="sd"> gateway : :obj:`string`</span> +<span class="sd"> The gateway server the user is using.</span> + +<span class="sd"> destination : :obj:`string`</span> +<span class="sd"> The remote destination which is used to transfer files</span> +<span class="sd"> from ECMWF server to local gateway server.</span> + +<span class="sd"> fp_root : :obj:`string`</span> +<span class="sd"> Path to the root directory of FLEXPART environment or flex_extract</span> +<span class="sd"> environment.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + <span class="kn">from</span> <span class="nn">genshi.template.text</span> <span class="k">import</span> <span class="n">NewTextTemplate</span> + <span class="kn">from</span> <span class="nn">genshi.template</span> <span class="k">import</span> <span class="n">TemplateLoader</span> + + <span class="n">loader</span> <span class="o">=</span> <span class="n">TemplateLoader</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_TEMPLATES</span><span class="p">,</span> <span class="n">auto_reload</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> + <span class="n">compile_template</span> <span class="o">=</span> <span class="n">loader</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">TEMPFILE_INSTALL_JOB</span><span class="p">,</span> + <span class="bp">cls</span><span class="o">=</span><span class="n">NewTextTemplate</span><span class="p">)</span> + + <span class="n">fp_root_path_to_python</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">fp_root</span><span class="p">,</span> + <span class="n">_config</span><span class="o">.</span><span class="n">FLEXEXTRACT_DIRNAME</span><span class="p">,</span> + <span class="n">_config</span><span class="o">.</span><span class="n">PATH_REL_PYTHON</span><span class="p">)</span> + + <span class="n">stream</span> <span class="o">=</span> <span class="n">compile_template</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span> + <span class="n">usergroup</span> <span class="o">=</span> <span class="n">ecgid</span><span class="p">,</span> + <span class="n">username</span> <span class="o">=</span> <span class="n">ecuid</span><span class="p">,</span> + <span class="n">version_number</span> <span class="o">=</span> <span class="n">_config</span><span class="o">.</span><span class="n">_VERSION_STR</span><span class="p">,</span> + <span class="n">fp_root_path</span> <span class="o">=</span> <span class="n">fp_root_path_to_python</span><span class="p">,</span> + <span class="p">)</span> + + <span class="n">tempjobfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_TEMPLATES</span><span class="p">,</span> + <span class="n">_config</span><span class="o">.</span><span class="n">TEMPFILE_JOB</span><span class="p">)</span> + + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">tempjobfile</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">stream</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s1">'text'</span><span class="p">))</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="delete_convert_build"><a class="viewcode-back" href="../api.html#install.delete_convert_build">[docs]</a><span class="k">def</span> <span class="nf">delete_convert_build</span><span class="p">(</span><span class="n">src_path</span><span class="p">):</span> + <span class="sd">'''Clean up the Fortran source directory and remove all</span> +<span class="sd"> build files (e.g. \*.o, \*.mod and CONVERT2)</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> src_path : :obj:`string`</span> +<span class="sd"> Path to the fortran source directory.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="n">modfiles</span> <span class="o">=</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">src_path</span><span class="p">,</span> <span class="s1">'*.mod'</span><span class="p">)</span> + <span class="n">objfiles</span> <span class="o">=</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">src_path</span><span class="p">,</span> <span class="s1">'*.o'</span><span class="p">)</span> + <span class="n">exefile</span> <span class="o">=</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">src_path</span><span class="p">,</span> <span class="n">_config</span><span class="o">.</span><span class="n">FORTRAN_EXECUTABLE</span><span class="p">)</span> + + <span class="n">modfiles</span><span class="o">.</span><span class="n">delete_files</span><span class="p">()</span> + <span class="n">objfiles</span><span class="o">.</span><span class="n">delete_files</span><span class="p">()</span> + <span class="n">exefile</span><span class="o">.</span><span class="n">delete_files</span><span class="p">()</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="make_convert_build"><a class="viewcode-back" href="../api.html#install.make_convert_build">[docs]</a><span class="k">def</span> <span class="nf">make_convert_build</span><span class="p">(</span><span class="n">src_path</span><span class="p">,</span> <span class="n">makefile</span><span class="p">):</span> + <span class="sd">'''Compiles the Fortran code and generates the executable.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> src_path : :obj:`string`</span> +<span class="sd"> Path to the fortran source directory.</span> + +<span class="sd"> makefile : :obj:`string`</span> +<span class="sd"> The name of the makefile which should be used.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="k">try</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Using makefile: '</span> <span class="o">+</span> <span class="n">makefile</span><span class="p">)</span> + <span class="n">p</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">([</span><span class="s1">'make'</span><span class="p">,</span> <span class="s1">'-f'</span><span class="p">,</span> + <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">src_path</span><span class="p">,</span> <span class="n">makefile</span><span class="p">)],</span> + <span class="n">stdin</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> + <span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> + <span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> + <span class="n">bufsize</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + <span class="n">pout</span><span class="p">,</span> <span class="n">perr</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">communicate</span><span class="p">()</span> + <span class="nb">print</span><span class="p">(</span><span class="n">pout</span><span class="p">)</span> + <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">returncode</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="n">perr</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Please edit '</span> <span class="o">+</span> <span class="n">makefile</span> <span class="o">+</span> + <span class="s1">' or try another Makefile in the src directory.'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Most likely GRIB_API_INCLUDE_DIR, GRIB_API_LIB '</span> + <span class="s1">'and EMOSLIB must be adapted.'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'Available Makefiles:'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="n">UioFiles</span><span class="p">(</span><span class="n">src_path</span><span class="p">,</span> <span class="s1">'Makefile*'</span><span class="p">))</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="s1">'Compilation failed!'</span><span class="p">)</span> + <span class="k">except</span> <span class="ne">ValueError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'ERROR: Makefile call failed:'</span><span class="p">)</span> + <span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">subprocess</span><span class="o">.</span><span class="n">check_call</span><span class="p">([</span><span class="s1">'ls'</span><span class="p">,</span> <span class="s1">'-l'</span><span class="p">,</span> + <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">src_path</span><span class="p">,</span> + <span class="n">_config</span><span class="o">.</span><span class="n">FORTRAN_EXECUTABLE</span><span class="p">)])</span> + + <span class="k">return</span></div> + + +<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> + <span class="n">main</span><span class="p">()</span> +</pre></div> + + </div> + + </div> + <footer> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_modules/prepare_flexpart.html b/documentation/Sphinx/build/html/_modules/prepare_flexpart.html new file mode 100644 index 0000000..8367caf --- /dev/null +++ b/documentation/Sphinx/build/html/_modules/prepare_flexpart.html @@ -0,0 +1,401 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>prepare_flexpart — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="index.html">Module code</a> »</li> + + <li>prepare_flexpart</li> + + + <li class="wy-breadcrumbs-aside"> + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <h1>Source code for prepare_flexpart</h1><div class="highlight"><pre> +<span></span><span class="ch">#!/usr/bin/env python</span> +<span class="c1"># -*- coding: utf-8 -*-</span> +<span class="c1">#*******************************************************************************</span> +<span class="c1"># @Author: Anne Fouilloux (University of Oslo)</span> +<span class="c1">#</span> +<span class="c1"># @Date: October 2014</span> +<span class="c1">#</span> +<span class="c1"># @Change History:</span> +<span class="c1">#</span> +<span class="c1"># November 2015 - Leopold Haimberger (University of Vienna):</span> +<span class="c1"># - using the WebAPI also for general MARS retrievals</span> +<span class="c1"># - job submission on ecgate and cca</span> +<span class="c1"># - job templates suitable for twice daily operational dissemination</span> +<span class="c1"># - dividing retrievals of longer periods into digestable chunks</span> +<span class="c1"># - retrieve also longer term forecasts, not only analyses and</span> +<span class="c1"># short term forecast data</span> +<span class="c1"># - conversion into GRIB2</span> +<span class="c1"># - conversion into .fp format for faster execution of FLEXPART</span> +<span class="c1">#</span> +<span class="c1"># February 2018 - Anne Philipp (University of Vienna):</span> +<span class="c1"># - applied PEP8 style guide</span> +<span class="c1"># - added documentation</span> +<span class="c1"># - minor changes in programming style for consistence</span> +<span class="c1"># - BUG: removed call of clean_up-Function after call of</span> +<span class="c1"># prepareFlexpart in main since it is already called in</span> +<span class="c1"># prepareFlexpart at the end!</span> +<span class="c1"># - created function main and moved the two function calls for</span> +<span class="c1"># arguments and prepare_flexpart into it</span> +<span class="c1">#</span> +<span class="c1"># @License:</span> +<span class="c1"># (C) Copyright 2014-2018.</span> +<span class="c1">#</span> +<span class="c1"># This software is licensed under the terms of the Apache Licence Version 2.0</span> +<span class="c1"># which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.</span> +<span class="c1">#</span> +<span class="c1"># @Program Functionality:</span> +<span class="c1"># This program prepares the final version of the grib files which are</span> +<span class="c1"># then used by FLEXPART. It converts the bunch of grib files extracted</span> +<span class="c1"># via get_mars_data by doing for example the necessary conversion to get</span> +<span class="c1"># consistent grids or the disaggregation of flux data. Finally, the</span> +<span class="c1"># program combines the data fields in files per available hour with the</span> +<span class="c1"># naming convention xxYYMMDDHH, where xx should be 2 arbitrary letters</span> +<span class="c1"># (mostly xx is chosen to be "EN").</span> +<span class="c1">#</span> +<span class="c1"># @Program Content:</span> +<span class="c1"># - main</span> +<span class="c1"># - prepare_flexpart</span> +<span class="c1">#</span> +<span class="c1">#*******************************************************************************</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># MODULES</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="kn">import</span> <span class="nn">datetime</span> +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">inspect</span> +<span class="kn">import</span> <span class="nn">sys</span> +<span class="kn">import</span> <span class="nn">socket</span> + +<span class="c1"># software specific classes and modules from flex_extract</span> + +<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span> + <span class="n">inspect</span><span class="o">.</span><span class="n">getfile</span><span class="p">(</span><span class="n">inspect</span><span class="o">.</span><span class="n">currentframe</span><span class="p">())))</span> <span class="o">+</span> <span class="s1">'/../'</span><span class="p">)</span> +<span class="kn">import</span> <span class="nn">_config</span> +<span class="kn">from</span> <span class="nn">classes.UioFiles</span> <span class="k">import</span> <span class="n">UioFiles</span> +<span class="kn">from</span> <span class="nn">classes.ControlFile</span> <span class="k">import</span> <span class="n">ControlFile</span> +<span class="kn">from</span> <span class="nn">tools</span> <span class="k">import</span> <span class="n">clean_up</span><span class="p">,</span> <span class="n">get_cmdline_arguments</span><span class="p">,</span> <span class="n">read_ecenv</span><span class="p">,</span> <span class="n">make_dir</span> +<span class="kn">from</span> <span class="nn">classes.EcFlexpart</span> <span class="k">import</span> <span class="n">EcFlexpart</span> + +<span class="n">ecapi</span> <span class="o">=</span> <span class="s1">'ecmwf'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">()</span> +<span class="k">try</span><span class="p">:</span> + <span class="k">if</span> <span class="n">ecapi</span><span class="p">:</span> + <span class="kn">import</span> <span class="nn">ecmwfapi</span> +<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> + <span class="n">ecapi</span> <span class="o">=</span> <span class="kc">False</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># FUNCTION</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<div class="viewcode-block" id="main"><a class="viewcode-back" href="../api.html#prepare_flexpart.main">[docs]</a><span class="k">def</span> <span class="nf">main</span><span class="p">():</span> + <span class="sd">'''Controls the program to prepare flexpart input files from mars data.</span> + +<span class="sd"> This is done if it is called directly from command line.</span> +<span class="sd"> Then it also takes program call arguments and control file input.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="n">args</span> <span class="o">=</span> <span class="n">get_cmdline_arguments</span><span class="p">()</span> + <span class="n">c</span> <span class="o">=</span> <span class="n">ControlFile</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">controlfile</span><span class="p">)</span> + + <span class="n">env_parameter</span> <span class="o">=</span> <span class="n">read_ecenv</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_ECMWF_ENV</span><span class="p">)</span> + <span class="n">c</span><span class="o">.</span><span class="n">assign_args_to_control</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> + <span class="n">c</span><span class="o">.</span><span class="n">assign_envs_to_control</span><span class="p">(</span><span class="n">env_parameter</span><span class="p">)</span> + <span class="n">c</span><span class="o">.</span><span class="n">check_conditions</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">queue</span><span class="p">)</span> + + <span class="n">prepare_flexpart</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">ppid</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="prepare_flexpart"><a class="viewcode-back" href="../api.html#prepare_flexpart.prepare_flexpart">[docs]</a><span class="k">def</span> <span class="nf">prepare_flexpart</span><span class="p">(</span><span class="n">ppid</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span> + <span class="sd">'''Converts the mars data into flexpart ready input files.</span> + +<span class="sd"> Specific data fields are converted to a different grid and the flux</span> +<span class="sd"> data are going to be disaggregated. The data fields are collected by</span> +<span class="sd"> hour and stored in a file with a specific FLEXPART relevant naming</span> +<span class="sd"> convention.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> ppid : :obj:`int`</span> +<span class="sd"> Contains the ppid number of the current ECMWF job. It will be None if</span> +<span class="sd"> the method was called within this module.</span> + +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="n">ppid</span><span class="p">:</span> + <span class="n">c</span><span class="o">.</span><span class="n">ppid</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getppid</span><span class="p">())</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">c</span><span class="o">.</span><span class="n">ppid</span> <span class="o">=</span> <span class="n">ppid</span> + + <span class="n">c</span><span class="o">.</span><span class="n">ecapi</span> <span class="o">=</span> <span class="n">ecapi</span> + + <span class="c1"># create the start and end date</span> + <span class="n">start</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">(</span><span class="n">year</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">start_date</span><span class="p">[:</span><span class="mi">4</span><span class="p">]),</span> + <span class="n">month</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">start_date</span><span class="p">[</span><span class="mi">4</span><span class="p">:</span><span class="mi">6</span><span class="p">]),</span> + <span class="n">day</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">start_date</span><span class="p">[</span><span class="mi">6</span><span class="p">:]))</span> + + <span class="n">end</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">(</span><span class="n">year</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">end_date</span><span class="p">[:</span><span class="mi">4</span><span class="p">]),</span> + <span class="n">month</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">end_date</span><span class="p">[</span><span class="mi">4</span><span class="p">:</span><span class="mi">6</span><span class="p">]),</span> + <span class="n">day</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">end_date</span><span class="p">[</span><span class="mi">6</span><span class="p">:]))</span> + + <span class="c1"># assign starting date minus 1 day</span> + <span class="c1"># since for basetime 00 we need the 12 hours upfront</span> + <span class="c1"># (the day before from 12 UTC to current day 00 UTC)</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span> <span class="o">==</span> <span class="s1">'00'</span><span class="p">:</span> + <span class="n">start</span> <span class="o">=</span> <span class="n">start</span> <span class="o">-</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + + <span class="nb">print</span><span class="p">(</span><span class="s1">'Prepare '</span> <span class="o">+</span> <span class="n">start</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%Y%m</span><span class="si">%d</span><span class="s2">"</span><span class="p">)</span> <span class="o">+</span> + <span class="s2">"/to/"</span> <span class="o">+</span> <span class="n">end</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%Y%m</span><span class="si">%d</span><span class="s2">"</span><span class="p">))</span> + + <span class="c1"># create output dir if necessary</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">outputdir</span><span class="p">):</span> + <span class="n">make_dir</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">outputdir</span><span class="p">)</span> + + <span class="c1"># get all files with flux data to be deaccumulated</span> + <span class="n">inputfiles</span> <span class="o">=</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="s1">'*OG_acc_SL*.'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">ppid</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'.*'</span><span class="p">)</span> + + <span class="c1"># deaccumulate the flux data</span> + <span class="n">flexpart</span> <span class="o">=</span> <span class="n">EcFlexpart</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">fluxes</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> + <span class="n">flexpart</span><span class="o">.</span><span class="n">write_namelist</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> + <span class="n">flexpart</span><span class="o">.</span><span class="n">deacc_fluxes</span><span class="p">(</span><span class="n">inputfiles</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> + + <span class="c1"># get a list of all files from the root inputdir</span> + <span class="n">inputfiles</span> <span class="o">=</span> <span class="n">UioFiles</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">,</span> <span class="s1">'????__??.*'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">ppid</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'.*'</span><span class="p">)</span> + + <span class="c1"># produce FLEXPART-ready GRIB files and process them -</span> + <span class="c1"># copy/transfer/interpolate them or make them GRIB2</span> + <span class="n">flexpart</span> <span class="o">=</span> <span class="n">EcFlexpart</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">fluxes</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> + <span class="n">flexpart</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">inputfiles</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> + <span class="n">flexpart</span><span class="o">.</span><span class="n">process_output</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">grib2flexpart</span><span class="p">:</span> + <span class="c1"># prepare environment for a FLEXPART run</span> + <span class="c1"># to convert grib to flexpart binary format</span> + <span class="n">flexpart</span><span class="o">.</span><span class="n">prepare_fp_files</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> + + <span class="c1"># check if in debugging mode, then store all files</span> + <span class="c1"># otherwise delete temporary files</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">Temporary files left intact'</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">clean_up</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> + + <span class="k">return</span></div> + +<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> + <span class="n">main</span><span class="p">()</span> +</pre></div> + + </div> + + </div> + <footer> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_modules/submit.html b/documentation/Sphinx/build/html/_modules/submit.html new file mode 100644 index 0000000..1c09c65 --- /dev/null +++ b/documentation/Sphinx/build/html/_modules/submit.html @@ -0,0 +1,395 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>submit — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="index.html">Module code</a> »</li> + + <li>submit</li> + + + <li class="wy-breadcrumbs-aside"> + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <h1>Source code for submit</h1><div class="highlight"><pre> +<span></span><span class="ch">#!/usr/bin/env python</span> +<span class="c1"># -*- coding: utf-8 -*-</span> +<span class="c1">#*******************************************************************************</span> +<span class="c1"># @Author: Anne Fouilloux (University of Oslo)</span> +<span class="c1">#</span> +<span class="c1"># @Date: October 2014</span> +<span class="c1">#</span> +<span class="c1"># @Change History:</span> +<span class="c1">#</span> +<span class="c1"># November 2015 - Leopold Haimberger (University of Vienna):</span> +<span class="c1"># - job submission on ecgate and cca</span> +<span class="c1"># - job templates suitable for twice daily operational dissemination</span> +<span class="c1">#</span> +<span class="c1"># February 2018 - Anne Philipp (University of Vienna):</span> +<span class="c1"># - applied PEP8 style guide</span> +<span class="c1"># - added documentation</span> +<span class="c1"># - minor changes in programming style (for consistence)</span> +<span class="c1"># - changed path names to variables from config file</span> +<span class="c1"># - added option for writing mars requests to extra file</span> +<span class="c1"># additionally,as option without submitting the mars jobs</span> +<span class="c1">#</span> +<span class="c1"># @License:</span> +<span class="c1"># (C) Copyright 2014-2018.</span> +<span class="c1">#</span> +<span class="c1"># This software is licensed under the terms of the Apache Licence Version 2.0</span> +<span class="c1"># which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.</span> +<span class="c1">#</span> +<span class="c1"># @Program Functionality:</span> +<span class="c1"># This program is the main program of flex_extract and controls the</span> +<span class="c1"># program flow.</span> +<span class="c1"># If it is supposed to work locally then it works through the necessary</span> +<span class="c1"># functions get_mars_data and prepareFlexpart. Otherwise it prepares</span> +<span class="c1"># a shell job script which will do the necessary work on the</span> +<span class="c1"># ECMWF server and is submitted via ecaccess-job-submit.</span> +<span class="c1">#</span> +<span class="c1"># @Program Content:</span> +<span class="c1"># - main</span> +<span class="c1"># - submit</span> +<span class="c1">#</span> +<span class="c1">#*******************************************************************************</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># MODULES</span> +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">sys</span> +<span class="kn">import</span> <span class="nn">subprocess</span> +<span class="kn">import</span> <span class="nn">inspect</span> +<span class="kn">import</span> <span class="nn">collections</span> + +<span class="c1"># software specific classes and modules from flex_extract</span> +<span class="kn">import</span> <span class="nn">_config</span> +<span class="kn">from</span> <span class="nn">mods.tools</span> <span class="k">import</span> <span class="p">(</span><span class="n">normal_exit</span><span class="p">,</span> <span class="n">get_cmdline_arguments</span><span class="p">,</span> + <span class="n">submit_job_to_ecserver</span><span class="p">,</span> <span class="n">read_ecenv</span><span class="p">)</span> +<span class="kn">from</span> <span class="nn">mods.get_mars_data</span> <span class="k">import</span> <span class="n">get_mars_data</span> +<span class="kn">from</span> <span class="nn">mods.prepare_flexpart</span> <span class="k">import</span> <span class="n">prepare_flexpart</span> +<span class="kn">from</span> <span class="nn">classes.ControlFile</span> <span class="k">import</span> <span class="n">ControlFile</span> + +<span class="c1"># ------------------------------------------------------------------------------</span> +<span class="c1"># FUNCTIONS</span> +<span class="c1"># ------------------------------------------------------------------------------</span> + +<div class="viewcode-block" id="main"><a class="viewcode-back" href="../api.html#submit.main">[docs]</a><span class="k">def</span> <span class="nf">main</span><span class="p">():</span> + <span class="sd">'''Get the arguments from script call and from CONTROL file.</span> +<span class="sd"> Decides from the argument "queue" if the local version</span> +<span class="sd"> is done "queue=None" or the gateway version with "queue=ecgate"</span> +<span class="sd"> or "queue=cca".</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="n">args</span> <span class="o">=</span> <span class="n">get_cmdline_arguments</span><span class="p">()</span> + <span class="n">c</span> <span class="o">=</span> <span class="n">ControlFile</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">controlfile</span><span class="p">)</span> + + <span class="n">env_parameter</span> <span class="o">=</span> <span class="n">read_ecenv</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_ECMWF_ENV</span><span class="p">)</span> + <span class="n">c</span><span class="o">.</span><span class="n">assign_args_to_control</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> + <span class="n">c</span><span class="o">.</span><span class="n">assign_envs_to_control</span><span class="p">(</span><span class="n">env_parameter</span><span class="p">)</span> + <span class="n">c</span><span class="o">.</span><span class="n">check_conditions</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">queue</span><span class="p">)</span> + + <span class="c1"># on local side</span> + <span class="c1"># on ECMWF server this would also be the local side</span> + <span class="n">called_from_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span> + <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">queue</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'/'</span><span class="p">:</span> + <span class="n">c</span><span class="o">.</span><span class="n">inputdir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">called_from_dir</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">inputdir</span><span class="p">)</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">outputdir</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'/'</span><span class="p">:</span> + <span class="n">c</span><span class="o">.</span><span class="n">outputdir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">called_from_dir</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">outputdir</span><span class="p">)</span> + <span class="n">get_mars_data</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">request</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">c</span><span class="o">.</span><span class="n">request</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> + <span class="n">prepare_flexpart</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">ppid</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> + <span class="n">normal_exit</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">mailfail</span><span class="p">,</span> <span class="s1">'FLEX_EXTRACT IS DONE!'</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">normal_exit</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">mailfail</span><span class="p">,</span> <span class="s1">'PRINTING MARS_REQUESTS DONE!'</span><span class="p">)</span> + <span class="c1"># send files to ECMWF server and install there</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">submit</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">job_template</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">queue</span><span class="p">)</span> + + <span class="k">return</span></div> + +<div class="viewcode-block" id="submit"><a class="viewcode-back" href="../api.html#submit.submit">[docs]</a><span class="k">def</span> <span class="nf">submit</span><span class="p">(</span><span class="n">jtemplate</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">queue</span><span class="p">):</span> + <span class="sd">'''Prepares the job script and submit it to the specified queue.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> jtemplate : :obj:`string`</span> +<span class="sd"> Job template file from sub-directory "_templates" for</span> +<span class="sd"> submission to ECMWF. It contains all necessary</span> +<span class="sd"> module and variable settings for the ECMWF environment as well as</span> +<span class="sd"> the job call and mail report instructions.</span> +<span class="sd"> Default is "job.temp".</span> + +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> queue : :obj:`string`</span> +<span class="sd"> Name of queue for submission to ECMWF (e.g. ecgate or cca )</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + +<span class="sd"> '''</span> + + <span class="c1"># read template file and get index for CONTROL input</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_TEMPLATES</span><span class="p">,</span> <span class="n">jtemplate</span><span class="p">))</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">lftext</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="n">insert_point</span> <span class="o">=</span> <span class="n">lftext</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s1">'EOF'</span><span class="p">)</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">basetime</span><span class="p">:</span> + <span class="c1"># --------- create on demand job script ------------------------------------</span> + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span> <span class="o">></span> <span class="mi">24</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'---- Pure forecast mode! ----'</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'---- On-demand mode! ----'</span><span class="p">)</span> + <span class="n">job_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_JOBSCRIPTS</span><span class="p">,</span> + <span class="n">jtemplate</span><span class="p">[:</span><span class="o">-</span><span class="mi">4</span><span class="p">]</span> <span class="o">+</span> <span class="s1">'ksh'</span><span class="p">)</span> + <span class="n">clist</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">to_list</span><span class="p">()</span> + + <span class="n">lftextondemand</span> <span class="o">=</span> <span class="n">lftext</span><span class="p">[:</span><span class="n">insert_point</span><span class="p">]</span> <span class="o">+</span> <span class="n">clist</span> <span class="o">+</span> <span class="n">lftext</span><span class="p">[</span><span class="n">insert_point</span><span class="p">:]</span> + + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">job_file</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lftextondemand</span><span class="p">))</span> + + <span class="n">submit_job_to_ecserver</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="n">job_file</span><span class="p">)</span> + + <span class="k">else</span><span class="p">:</span> + <span class="c1"># --------- create operational job script ----------------------------------</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'---- Operational mode! ----'</span><span class="p">)</span> + <span class="n">job_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_config</span><span class="o">.</span><span class="n">PATH_JOBSCRIPTS</span><span class="p">,</span> + <span class="n">jtemplate</span><span class="p">[:</span><span class="o">-</span><span class="mi">5</span><span class="p">]</span> <span class="o">+</span> <span class="s1">'oper.ksh'</span><span class="p">)</span> + + <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">maxstep</span><span class="p">:</span> + <span class="n">mt</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">maxstep</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">mt</span> <span class="o">=</span> <span class="mi">0</span> + + <span class="n">c</span><span class="o">.</span><span class="n">start_date</span> <span class="o">=</span> <span class="s1">'$</span><span class="si">{MSJ_YEAR}</span><span class="s1">$</span><span class="si">{MSJ_MONTH}</span><span class="s1">$</span><span class="si">{MSJ_DAY}</span><span class="s1">'</span> + <span class="n">c</span><span class="o">.</span><span class="n">end_date</span> <span class="o">=</span> <span class="s1">'$</span><span class="si">{MSJ_YEAR}</span><span class="s1">$</span><span class="si">{MSJ_MONTH}</span><span class="s1">$</span><span class="si">{MSJ_DAY}</span><span class="s1">'</span> + <span class="n">c</span><span class="o">.</span><span class="n">base_time</span> <span class="o">=</span> <span class="s1">'$</span><span class="si">{MSJ_BASETIME}</span><span class="s1">'</span> + <span class="k">if</span> <span class="n">mt</span> <span class="o">></span> <span class="mi">24</span><span class="p">:</span> + <span class="n">c</span><span class="o">.</span><span class="n">time</span> <span class="o">=</span> <span class="s1">'$</span><span class="si">{MSJ_BASETIME}</span><span class="s1"> </span><span class="si">{MSJ_BASETIME}</span><span class="s1">'</span> + + <span class="n">colist</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">to_list</span><span class="p">()</span> + + <span class="n">lftextoper</span> <span class="o">=</span> <span class="n">lftext</span><span class="p">[:</span><span class="n">insert_point</span><span class="p">]</span> <span class="o">+</span> <span class="n">colist</span> <span class="o">+</span> <span class="n">lftext</span><span class="p">[</span><span class="n">insert_point</span> <span class="o">+</span> <span class="mi">2</span><span class="p">:]</span> + + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">job_file</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lftextoper</span><span class="p">))</span> + + <span class="n">submit_job_to_ecserver</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="n">job_file</span><span class="p">)</span> + + <span class="c1"># --------------------------------------------------------------------------</span> + <span class="nb">print</span><span class="p">(</span><span class="s1">'You should get an email with subject flex.hostname.pid'</span><span class="p">)</span> + + <span class="k">return</span></div> + +<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> + <span class="n">main</span><span class="p">()</span> +</pre></div> + + </div> + + </div> + <footer> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_modules/tools.html b/documentation/Sphinx/build/html/_modules/tools.html index aab9945..cc69bc1 100644 --- a/documentation/Sphinx/build/html/_modules/tools.html +++ b/documentation/Sphinx/build/html/_modules/tools.html @@ -212,57 +212,56 @@ <span class="c1"># FUNCTIONS</span> <span class="c1"># ------------------------------------------------------------------------------</span> -<div class="viewcode-block" id="none_or_str"><a class="viewcode-back" href="../code.html#tools.none_or_str">[docs]</a><span class="k">def</span> <span class="nf">none_or_str</span><span class="p">(</span><span class="n">value</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Converts the input string into pythons None-type if the string</span> -<span class="sd"> contains "None".</span> - -<span class="sd"> @Input:</span> -<span class="sd"> value: string</span> -<span class="sd"> String to be checked for the "None" word.</span> - -<span class="sd"> @Return:</span> -<span class="sd"> None or value:</span> -<span class="sd"> Return depends on the content of the input value. If it was "None",</span> -<span class="sd"> then the python type None is returned. Otherwise the string itself.</span> +<div class="viewcode-block" id="none_or_str"><a class="viewcode-back" href="../api.html#tools.none_or_str">[docs]</a><span class="k">def</span> <span class="nf">none_or_str</span><span class="p">(</span><span class="n">value</span><span class="p">):</span> + <span class="sd">'''Converts the input string into pythons None-type if the string</span> +<span class="sd"> contains string "None".</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> value : :obj:`string`</span> +<span class="sd"> String to be checked for the "None" word.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> None or value:</span> +<span class="sd"> Return depends on the content of the input value. If it was "None",</span> +<span class="sd"> then the python type None is returned. Otherwise the string itself.</span> <span class="sd"> '''</span> <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="s1">'None'</span><span class="p">:</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">return</span> <span class="n">value</span></div> -<div class="viewcode-block" id="none_or_int"><a class="viewcode-back" href="../code.html#tools.none_or_int">[docs]</a><span class="k">def</span> <span class="nf">none_or_int</span><span class="p">(</span><span class="n">value</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Converts the input string into pythons None-type if the string</span> -<span class="sd"> contains "None". Otherwise it is converted to an integer value.</span> - -<span class="sd"> @Input:</span> -<span class="sd"> value: string</span> -<span class="sd"> String to be checked for the "None" word.</span> - -<span class="sd"> @Return:</span> -<span class="sd"> None or int(value):</span> -<span class="sd"> Return depends on the content of the input value. If it was "None",</span> -<span class="sd"> then the python type None is returned. Otherwise the string is</span> -<span class="sd"> converted into an integer value.</span> +<div class="viewcode-block" id="none_or_int"><a class="viewcode-back" href="../api.html#tools.none_or_int">[docs]</a><span class="k">def</span> <span class="nf">none_or_int</span><span class="p">(</span><span class="n">value</span><span class="p">):</span> + <span class="sd">'''Converts the input string into pythons None-type if the string</span> +<span class="sd"> contains string "None". Otherwise it is converted to an integer value.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> value : :obj:`string`</span> +<span class="sd"> String to be checked for the "None" word.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> None or int(value):</span> +<span class="sd"> Return depends on the content of the input value. If it was "None",</span> +<span class="sd"> then the python type None is returned. Otherwise the string is</span> +<span class="sd"> converted into an integer value.</span> <span class="sd"> '''</span> <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="s1">'None'</span><span class="p">:</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">)</span></div> -<div class="viewcode-block" id="get_cmdline_arguments"><a class="viewcode-back" href="../code.html#tools.get_cmdline_arguments">[docs]</a><span class="k">def</span> <span class="nf">get_cmdline_arguments</span><span class="p">():</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Decomposes the command line arguments and assigns them to variables.</span> -<span class="sd"> Apply default values for non mentioned arguments.</span> +<div class="viewcode-block" id="get_cmdline_arguments"><a class="viewcode-back" href="../api.html#tools.get_cmdline_arguments">[docs]</a><span class="k">def</span> <span class="nf">get_cmdline_arguments</span><span class="p">():</span> + <span class="sd">'''Decomposes the command line arguments and assigns them to variables.</span> +<span class="sd"> Apply default values for non mentioned arguments.</span> -<span class="sd"> @Input:</span> -<span class="sd"> <nothing></span> +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> -<span class="sd"> @Return:</span> -<span class="sd"> args: instance of ArgumentParser</span> -<span class="sd"> Contains the commandline arguments from script/program call.</span> +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> args : :obj:`Namespace`</span> +<span class="sd"> Contains the commandline arguments from script/program call.</span> <span class="sd"> '''</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s1">'Retrieve FLEXPART input from </span><span class="se">\</span> @@ -341,20 +340,20 @@ <span class="k">return</span> <span class="n">args</span></div> -<div class="viewcode-block" id="read_ecenv"><a class="viewcode-back" href="../code.html#tools.read_ecenv">[docs]</a><span class="k">def</span> <span class="nf">read_ecenv</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Reads the file into a dictionary where the key values are the parameter</span> -<span class="sd"> names.</span> +<div class="viewcode-block" id="read_ecenv"><a class="viewcode-back" href="../api.html#tools.read_ecenv">[docs]</a><span class="k">def</span> <span class="nf">read_ecenv</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span> + <span class="sd">'''Reads the file into a dictionary where the key values are the parameter</span> +<span class="sd"> names.</span> -<span class="sd"> @Input:</span> -<span class="sd"> filename: string</span> -<span class="sd"> Path to file where the ECMWV environment parameters are stored.</span> +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> filename : :obj:`string`</span> +<span class="sd"> Path to file where the ECMWF environment parameters are stored.</span> -<span class="sd"> @Return:</span> -<span class="sd"> envs: dict</span> -<span class="sd"> Contains the environment parameter ecuid, ecgid, gateway</span> -<span class="sd"> and destination for ECMWF server environments.</span> +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> envs : :obj:`dictionary`</span> +<span class="sd"> Contains the environment parameter ecuid, ecgid, gateway</span> +<span class="sd"> and destination for ECMWF server environments.</span> <span class="sd"> '''</span> <span class="n">envs</span><span class="o">=</span> <span class="p">{}</span> @@ -365,21 +364,18 @@ <span class="k">return</span> <span class="n">envs</span></div> -<div class="viewcode-block" id="clean_up"><a class="viewcode-back" href="../code.html#tools.clean_up">[docs]</a><span class="k">def</span> <span class="nf">clean_up</span><span class="p">(</span><span class="n">c</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Remove all files from intermediate directory</span> -<span class="sd"> (inputdir from CONTROL file).</span> - -<span class="sd"> @Input:</span> -<span class="sd"> c: instance of class ControlFile</span> -<span class="sd"> Contains all the parameters of CONTROL file and</span> -<span class="sd"> command line.</span> -<span class="sd"> For more information about format and content of the parameter</span> -<span class="sd"> see documentation.</span> - -<span class="sd"> @Return:</span> -<span class="sd"> <nothing></span> +<div class="viewcode-block" id="clean_up"><a class="viewcode-back" href="../api.html#tools.clean_up">[docs]</a><span class="k">def</span> <span class="nf">clean_up</span><span class="p">(</span><span class="n">c</span><span class="p">):</span> + <span class="sd">'''Remove all files from intermediate directory (inputdir).</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> c : :obj:`ControlFile`</span> +<span class="sd"> Contains all the parameters of CONTROL file and</span> +<span class="sd"> command line.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> + <span class="sd"> '''</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"clean_up"</span><span class="p">)</span> @@ -396,23 +392,23 @@ <span class="k">return</span></div> -<div class="viewcode-block" id="my_error"><a class="viewcode-back" href="../code.html#tools.my_error">[docs]</a><span class="k">def</span> <span class="nf">my_error</span><span class="p">(</span><span class="n">users</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s1">'ERROR'</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Prints a specified error message which can be passed to the function</span> -<span class="sd"> before exiting the program.</span> +<div class="viewcode-block" id="my_error"><a class="viewcode-back" href="../api.html#tools.my_error">[docs]</a><span class="k">def</span> <span class="nf">my_error</span><span class="p">(</span><span class="n">users</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s1">'ERROR'</span><span class="p">):</span> + <span class="sd">'''Prints a specified error message which can be passed to the function</span> +<span class="sd"> before exiting the program.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> user : :obj:`list` of :obj:`string`</span> +<span class="sd"> Contains all email addresses which should be notified.</span> +<span class="sd"> It might also contain just the ecmwf user name which wil trigger</span> +<span class="sd"> mailing to the associated email address for this user.</span> -<span class="sd"> @Input:</span> -<span class="sd"> user: list of strings</span> -<span class="sd"> Contains all email addresses which should be notified.</span> -<span class="sd"> It might also contain just the ecmwf user name which wil trigger</span> -<span class="sd"> mailing to the associated email address for this user.</span> +<span class="sd"> message : :obj:`string`, optional</span> +<span class="sd"> Error message. Default value is "ERROR".</span> -<span class="sd"> message: string, optional</span> -<span class="sd"> Error message. Default value is "ERROR".</span> +<span class="sd"> Return</span> +<span class="sd"> ------</span> -<span class="sd"> @Return:</span> -<span class="sd"> <nothing></span> <span class="sd"> '''</span> <span class="nb">print</span><span class="p">(</span><span class="n">message</span><span class="p">)</span> @@ -442,22 +438,21 @@ <span class="k">return</span></div> -<div class="viewcode-block" id="normal_exit"><a class="viewcode-back" href="../code.html#tools.normal_exit">[docs]</a><span class="k">def</span> <span class="nf">normal_exit</span><span class="p">(</span><span class="n">users</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s1">'Done!'</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Prints a specific exit message which can be passed to the function.</span> +<div class="viewcode-block" id="normal_exit"><a class="viewcode-back" href="../api.html#tools.normal_exit">[docs]</a><span class="k">def</span> <span class="nf">normal_exit</span><span class="p">(</span><span class="n">users</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s1">'Done!'</span><span class="p">):</span> + <span class="sd">'''Prints a specific exit message which can be passed to the function.</span> -<span class="sd"> @Input:</span> -<span class="sd"> user: list of strings</span> -<span class="sd"> Contains all email addresses which should be notified.</span> -<span class="sd"> It might also contain just the ecmwf user name which wil trigger</span> -<span class="sd"> mailing to the associated email address for this user.</span> +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> user : :obj:`list` of :obj:`string`</span> +<span class="sd"> Contains all email addresses which should be notified.</span> +<span class="sd"> It might also contain just the ecmwf user name which wil trigger</span> +<span class="sd"> mailing to the associated email address for this user.</span> -<span class="sd"> message: string, optional</span> -<span class="sd"> Message for exiting program. Default value is "Done!".</span> +<span class="sd"> message : :obj:`string`, optional</span> +<span class="sd"> Message for exiting program. Default value is "Done!".</span> -<span class="sd"> @Return:</span> -<span class="sd"> <nothing></span> +<span class="sd"> Return</span> +<span class="sd"> ------</span> <span class="sd"> '''</span> <span class="nb">print</span><span class="p">(</span><span class="n">message</span><span class="p">)</span> @@ -484,31 +479,35 @@ <span class="k">return</span></div> -<div class="viewcode-block" id="product"><a class="viewcode-back" href="../code.html#tools.product">[docs]</a><span class="k">def</span> <span class="nf">product</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> This method is taken from an example at the ECMWF wiki website.</span> -<span class="sd"> https://software.ecmwf.int/wiki/display/GRIB/index.py; 2018-03-16</span> +<div class="viewcode-block" id="product"><a class="viewcode-back" href="../api.html#tools.product">[docs]</a><span class="k">def</span> <span class="nf">product</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">):</span> + <span class="sd">'''This method combines the single characters of the passed arguments</span> +<span class="sd"> with each other. So that each character of each argument value</span> +<span class="sd"> will be combined with each character of the other arguments as a tuple.</span> -<span class="sd"> This method combines the single characters of the passed arguments</span> -<span class="sd"> with each other. So that each character of each argument value</span> -<span class="sd"> will be combined with each character of the other arguments as a tuple.</span> +<span class="sd"> Note</span> +<span class="sd"> ----</span> +<span class="sd"> This method is taken from an example at the ECMWF wiki website.</span> +<span class="sd"> https://software.ecmwf.int/wiki/display/GRIB/index.py; 2018-03-16</span> -<span class="sd"> Example:</span> -<span class="sd"> product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy</span> -<span class="sd"> product(range(2), repeat = 3) --> 000 001 010 011 100 101 110 111</span> +<span class="sd"> Example</span> +<span class="sd"> -------</span> +<span class="sd"> product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy</span> -<span class="sd"> @Input:</span> -<span class="sd"> *args: tuple</span> -<span class="sd"> Positional arguments (arbitrary number).</span> +<span class="sd"> product(range(2), repeat = 3) --> 000 001 010 011 100 101 110 111</span> -<span class="sd"> **kwds: dictionary</span> -<span class="sd"> Contains all the keyword arguments from *args.</span> +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> \*args : :obj:`tuple`</span> +<span class="sd"> Positional arguments (arbitrary number).</span> -<span class="sd"> @Return:</span> -<span class="sd"> prod: tuple</span> -<span class="sd"> Return will be done with "yield". A tuple of combined arguments.</span> -<span class="sd"> See example in description above.</span> +<span class="sd"> \*\*kwds : :obj:`dictionary`</span> +<span class="sd"> Contains all the keyword arguments from \*args.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> prod : :obj:`tuple`</span> +<span class="sd"> Return will be done with "yield". A tuple of combined arguments.</span> +<span class="sd"> See example in description above.</span> <span class="sd"> '''</span> <span class="n">pools</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="o">*</span> <span class="n">kwds</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'repeat'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="n">result</span> <span class="o">=</span> <span class="p">[[]]</span> @@ -520,18 +519,18 @@ <span class="k">return</span></div> -<div class="viewcode-block" id="silent_remove"><a class="viewcode-back" href="../code.html#tools.silent_remove">[docs]</a><span class="k">def</span> <span class="nf">silent_remove</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Remove file if it exists.</span> -<span class="sd"> The function does not fail if the file does not exist.</span> +<div class="viewcode-block" id="silent_remove"><a class="viewcode-back" href="../api.html#tools.silent_remove">[docs]</a><span class="k">def</span> <span class="nf">silent_remove</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span> + <span class="sd">'''Remove file if it exists.</span> +<span class="sd"> The function does not fail if the file does not exist.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> filename : :obj:`string`</span> +<span class="sd"> The name of the file to be removed without notification.</span> -<span class="sd"> @Input:</span> -<span class="sd"> filename: string</span> -<span class="sd"> The name of the file to be removed without notification.</span> +<span class="sd"> Return</span> +<span class="sd"> ------</span> -<span class="sd"> @Return:</span> -<span class="sd"> <nothing></span> <span class="sd"> '''</span> <span class="k">try</span><span class="p">:</span> <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span> @@ -543,20 +542,20 @@ <span class="k">return</span></div> -<div class="viewcode-block" id="init128"><a class="viewcode-back" href="../code.html#tools.init128">[docs]</a><span class="k">def</span> <span class="nf">init128</span><span class="p">(</span><span class="n">filepath</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Opens and reads the grib file with table 128 information.</span> +<div class="viewcode-block" id="init128"><a class="viewcode-back" href="../api.html#tools.init128">[docs]</a><span class="k">def</span> <span class="nf">init128</span><span class="p">(</span><span class="n">filepath</span><span class="p">):</span> + <span class="sd">'''Opens and reads the grib file with table 128 information.</span> -<span class="sd"> @Input:</span> -<span class="sd"> filepath: string</span> -<span class="sd"> Path to file of ECMWF grib table number 128.</span> +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> filepath : :obj:`string`</span> +<span class="sd"> Path to file of ECMWF grib table number 128.</span> -<span class="sd"> @Return:</span> -<span class="sd"> table128: dictionary</span> -<span class="sd"> Contains the ECMWF grib table 128 information.</span> -<span class="sd"> The key is the parameter number and the value is the</span> -<span class="sd"> short name of the parameter.</span> +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> table128 : :obj:`dictionary`</span> +<span class="sd"> Contains the ECMWF grib table 128 information.</span> +<span class="sd"> The key is the parameter number and the value is the</span> +<span class="sd"> short name of the parameter.</span> <span class="sd"> '''</span> <span class="n">table128</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filepath</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> @@ -568,28 +567,27 @@ <span class="k">return</span> <span class="n">table128</span></div> -<div class="viewcode-block" id="to_param_id"><a class="viewcode-back" href="../code.html#tools.to_param_id">[docs]</a><span class="k">def</span> <span class="nf">to_param_id</span><span class="p">(</span><span class="n">pars</span><span class="p">,</span> <span class="n">table</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Transform parameter names to parameter ids</span> -<span class="sd"> with ECMWF grib table 128.</span> - -<span class="sd"> @Input:</span> -<span class="sd"> pars: string</span> -<span class="sd"> Addpar argument from CONTROL file in the format of</span> -<span class="sd"> parameter names instead of ids. The parameter short</span> -<span class="sd"> names are sepearted with "/" and they are passed as</span> -<span class="sd"> one single string.</span> - -<span class="sd"> table: dictionary</span> -<span class="sd"> Contains the ECMWF grib table 128 information.</span> -<span class="sd"> The key is the parameter number and the value is the</span> -<span class="sd"> short name of the parameter.</span> - -<span class="sd"> @Return:</span> -<span class="sd"> ipar: list of integer</span> -<span class="sd"> List of addpar parameters from CONTROL file transformed to</span> -<span class="sd"> parameter ids in the format of integer.</span> +<div class="viewcode-block" id="to_param_id"><a class="viewcode-back" href="../api.html#tools.to_param_id">[docs]</a><span class="k">def</span> <span class="nf">to_param_id</span><span class="p">(</span><span class="n">pars</span><span class="p">,</span> <span class="n">table</span><span class="p">):</span> + <span class="sd">'''Transform parameter names to parameter ids with ECMWF grib table 128.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> pars : :obj:`string`</span> +<span class="sd"> Addpar argument from CONTROL file in the format of</span> +<span class="sd"> parameter names instead of ids. The parameter short</span> +<span class="sd"> names are sepearted with "/" and they are passed as</span> +<span class="sd"> one single string.</span> + +<span class="sd"> table : :obj:`dictionary`</span> +<span class="sd"> Contains the ECMWF grib table 128 information.</span> +<span class="sd"> The key is the parameter number and the value is the</span> +<span class="sd"> short name of the parameter.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> ipar : :obj:`list` of :obj:`integer`</span> +<span class="sd"> List of addpar parameters from CONTROL file transformed to</span> +<span class="sd"> parameter ids in the format of integer.</span> <span class="sd"> '''</span> <span class="n">cpar</span> <span class="o">=</span> <span class="n">pars</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span> <span class="n">ipar</span> <span class="o">=</span> <span class="p">[]</span> @@ -603,40 +601,40 @@ <span class="k">return</span> <span class="n">ipar</span></div> -<div class="viewcode-block" id="get_list_as_string"><a class="viewcode-back" href="../code.html#tools.get_list_as_string">[docs]</a><span class="k">def</span> <span class="nf">get_list_as_string</span><span class="p">(</span><span class="n">list_obj</span><span class="p">,</span> <span class="n">concatenate_sign</span><span class="o">=</span><span class="s1">', '</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Converts a list of arbitrary content into a single string.</span> +<div class="viewcode-block" id="get_list_as_string"><a class="viewcode-back" href="../api.html#tools.get_list_as_string">[docs]</a><span class="k">def</span> <span class="nf">get_list_as_string</span><span class="p">(</span><span class="n">list_obj</span><span class="p">,</span> <span class="n">concatenate_sign</span><span class="o">=</span><span class="s1">', '</span><span class="p">):</span> + <span class="sd">'''Converts a list of arbitrary content into a single string.</span> -<span class="sd"> @Input:</span> -<span class="sd"> list_obj: list</span> -<span class="sd"> A list with arbitrary content.</span> +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> list_obj : :obj:`list`</span> +<span class="sd"> A list with arbitrary content.</span> -<span class="sd"> concatenate_sign: string, optional</span> -<span class="sd"> A string which is used to concatenate the single</span> -<span class="sd"> list elements. Default value is ", ".</span> +<span class="sd"> concatenate_sign : :obj:`string`, optional</span> +<span class="sd"> A string which is used to concatenate the single</span> +<span class="sd"> list elements. Default value is ", ".</span> -<span class="sd"> @Return:</span> -<span class="sd"> str_of_list: string</span> -<span class="sd"> The content of the list as a single string.</span> +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> str_of_list : :obj:`string`</span> +<span class="sd"> The content of the list as a single string.</span> <span class="sd"> '''</span> <span class="n">str_of_list</span> <span class="o">=</span> <span class="n">concatenate_sign</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">l</span><span class="p">)</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">list_obj</span><span class="p">)</span> <span class="k">return</span> <span class="n">str_of_list</span></div> -<div class="viewcode-block" id="make_dir"><a class="viewcode-back" href="../code.html#tools.make_dir">[docs]</a><span class="k">def</span> <span class="nf">make_dir</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Creates a directory and gives a warning if the directory</span> -<span class="sd"> already exists. The program stops only if there is another problem.</span> +<div class="viewcode-block" id="make_dir"><a class="viewcode-back" href="../api.html#tools.make_dir">[docs]</a><span class="k">def</span> <span class="nf">make_dir</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span> + <span class="sd">'''Creates a directory and gives a warning if the directory</span> +<span class="sd"> already exists. The program stops only if there is another problem.</span> -<span class="sd"> @Input:</span> -<span class="sd"> directory: string</span> -<span class="sd"> The directory name including the path which should be created.</span> +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> directory : :obj:`string`</span> +<span class="sd"> The directory name including the path which should be created.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> -<span class="sd"> @Return:</span> -<span class="sd"> <nothing></span> <span class="sd"> '''</span> <span class="k">try</span><span class="p">:</span> <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span> @@ -649,36 +647,37 @@ <span class="k">return</span></div> -<div class="viewcode-block" id="put_file_to_ecserver"><a class="viewcode-back" href="../code.html#tools.put_file_to_ecserver">[docs]</a><span class="k">def</span> <span class="nf">put_file_to_ecserver</span><span class="p">(</span><span class="n">ecd</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">ecuid</span><span class="p">,</span> <span class="n">ecgid</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Uses the ecaccess-file-put command to send a file to the ECMWF servers.</span> +<div class="viewcode-block" id="put_file_to_ecserver"><a class="viewcode-back" href="../api.html#tools.put_file_to_ecserver">[docs]</a><span class="k">def</span> <span class="nf">put_file_to_ecserver</span><span class="p">(</span><span class="n">ecd</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">ecuid</span><span class="p">,</span> <span class="n">ecgid</span><span class="p">):</span> + <span class="sd">'''Uses the ecaccess-file-put command to send a file to the ECMWF servers.</span> -<span class="sd"> NOTE:</span> -<span class="sd"> The return value is just for testing reasons. It does not have</span> -<span class="sd"> to be used from the calling function since the whole error handling</span> -<span class="sd"> is done in here.</span> +<span class="sd"> Note</span> +<span class="sd"> ----</span> +<span class="sd"> The return value is just for testing reasons. It does not have</span> +<span class="sd"> to be used from the calling function since the whole error handling</span> +<span class="sd"> is done in here.</span> -<span class="sd"> @Input:</span> -<span class="sd"> ecd: string</span> -<span class="sd"> The path were the file is stored.</span> +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> ecd : :obj:`string`</span> +<span class="sd"> The path were the file is stored.</span> -<span class="sd"> filename: string</span> -<span class="sd"> The name of the file to send to the ECMWF server.</span> +<span class="sd"> filename : :obj:`string`</span> +<span class="sd"> The name of the file to send to the ECMWF server.</span> -<span class="sd"> target: string</span> -<span class="sd"> The target queue where the file should be sent to.</span> +<span class="sd"> target : :obj:`string`</span> +<span class="sd"> The target queue where the file should be sent to.</span> -<span class="sd"> ecuid: string</span> -<span class="sd"> The user id on ECMWF server.</span> +<span class="sd"> ecuid : :obj:`string`</span> +<span class="sd"> The user id on ECMWF server.</span> -<span class="sd"> ecgid: string</span> -<span class="sd"> The group id on ECMWF server.</span> +<span class="sd"> ecgid : :obj:`string`</span> +<span class="sd"> The group id on ECMWF server.</span> -<span class="sd"> @Return:</span> -<span class="sd"> rcode: string</span> -<span class="sd"> Resulting code of command execution. If successful the string</span> -<span class="sd"> will be empty.</span> +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> rcode : :obj:`string`</span> +<span class="sd"> Resulting code of command execution. If successful the string</span> +<span class="sd"> will be empty.</span> <span class="sd"> '''</span> <span class="k">try</span><span class="p">:</span> @@ -697,28 +696,29 @@ <span class="k">return</span> <span class="n">rcode</span></div> -<div class="viewcode-block" id="submit_job_to_ecserver"><a class="viewcode-back" href="../code.html#tools.submit_job_to_ecserver">[docs]</a><span class="k">def</span> <span class="nf">submit_job_to_ecserver</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">jobname</span><span class="p">):</span> - <span class="sd">'''</span> -<span class="sd"> @Description:</span> -<span class="sd"> Uses ecaccess-job-submit command to submit a job to the ECMWF server.</span> - -<span class="sd"> NOTE:</span> -<span class="sd"> The return value is just for testing reasons. It does not have</span> -<span class="sd"> to be used from the calling function since the whole error handling</span> -<span class="sd"> is done in here.</span> - -<span class="sd"> @Input:</span> -<span class="sd"> target: string</span> -<span class="sd"> The target where the file should be sent to, e.g. the queue.</span> - -<span class="sd"> jobname: string</span> -<span class="sd"> The name of the jobfile to be submitted to the ECMWF server.</span> - -<span class="sd"> @Return:</span> -<span class="sd"> rcode: string</span> -<span class="sd"> Resulting code of command execution. If successful the string</span> -<span class="sd"> will contain an integer number, representing the id of the job</span> -<span class="sd"> at the ecmwf server.</span> +<div class="viewcode-block" id="submit_job_to_ecserver"><a class="viewcode-back" href="../api.html#tools.submit_job_to_ecserver">[docs]</a><span class="k">def</span> <span class="nf">submit_job_to_ecserver</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">jobname</span><span class="p">):</span> + <span class="sd">'''Uses ecaccess-job-submit command to submit a job to the ECMWF server.</span> + +<span class="sd"> Note</span> +<span class="sd"> ----</span> +<span class="sd"> The return value is just for testing reasons. It does not have</span> +<span class="sd"> to be used from the calling function since the whole error handling</span> +<span class="sd"> is done in here.</span> + +<span class="sd"> Parameters</span> +<span class="sd"> ----------</span> +<span class="sd"> target : :obj:`string`</span> +<span class="sd"> The target where the file should be sent to, e.g. the queue.</span> + +<span class="sd"> jobname : :obj:`string`</span> +<span class="sd"> The name of the jobfile to be submitted to the ECMWF server.</span> + +<span class="sd"> Return</span> +<span class="sd"> ------</span> +<span class="sd"> rcode : :obj:`string`</span> +<span class="sd"> Resulting code of command execution. If successful the string</span> +<span class="sd"> will contain an integer number, representing the id of the job</span> +<span class="sd"> at the ecmwf server.</span> <span class="sd"> '''</span> <span class="k">try</span><span class="p">:</span> diff --git a/documentation/Sphinx/build/html/_sources/api.rst.txt b/documentation/Sphinx/build/html/_sources/api.rst.txt index 6c03ff4..5b4acb2 100644 --- a/documentation/Sphinx/build/html/_sources/api.rst.txt +++ b/documentation/Sphinx/build/html/_sources/api.rst.txt @@ -1,5 +1,82 @@ Auto Generated Documentation ============================ +.. contents:: + :local: + +Porgrams +-------- + +install +******* + +.. automodule:: install + :members: + +submit +****** + +.. automodule:: submit + :members: + +Classes +------- + +ControlFile +*********** + +.. automodule:: ControlFile + :members: + +EcFlexpart +********** + +.. automodule:: EcFlexpart + :members: + +GribTools +********* + +.. automodule:: GribTools + :members: + +MarsRetrieval +************* + +.. automodule:: MarsRetrieval + :members: + +UioFiles +******** + +.. automodule:: UioFiles + :members: + + + +Modules +------- + +get_mars_data +************* + +.. automodule:: get_mars_data + :members: + +prepare_flexpart +**************** + +.. automodule:: prepare_flexpart + :members: + +tools +***** + +.. automodule:: tools + :members: + +disaggregation +************** + .. automodule:: disaggregation :members: diff --git a/documentation/Sphinx/build/html/_sources/downloads.rst.txt b/documentation/Sphinx/build/html/_sources/downloads.rst.txt index 42e62df..676a1fe 100644 --- a/documentation/Sphinx/build/html/_sources/downloads.rst.txt +++ b/documentation/Sphinx/build/html/_sources/downloads.rst.txt @@ -3,4 +3,13 @@ Downloads Describe download options of flex_extract .... - UNDER CONSTRUCTION \ No newline at end of file + UNDER CONSTRUCTION + +.. toctree:: + :hidden: + :maxdepth: 2 + + downloads/tar_balls + downloads/git_repo + downloads/history_changes + \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/downloads/git_repo.rst.txt b/documentation/Sphinx/build/html/_sources/downloads/git_repo.rst.txt new file mode 100644 index 0000000..a1f7acf --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/downloads/git_repo.rst.txt @@ -0,0 +1,4 @@ +Git Repository +============== + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/downloads/history_changes.rst.txt b/documentation/Sphinx/build/html/_sources/downloads/history_changes.rst.txt new file mode 100644 index 0000000..763420b --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/downloads/history_changes.rst.txt @@ -0,0 +1,4 @@ +History of Changes +================== + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/downloads/tar_balls.rst.txt b/documentation/Sphinx/build/html/_sources/downloads/tar_balls.rst.txt new file mode 100644 index 0000000..a06dc11 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/downloads/tar_balls.rst.txt @@ -0,0 +1,4 @@ +Download tar-balls +================== + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/index.rst.txt b/documentation/Sphinx/build/html/_sources/index.rst.txt index 3ca3be9..1f8cded 100644 --- a/documentation/Sphinx/build/html/_sources/index.rst.txt +++ b/documentation/Sphinx/build/html/_sources/index.rst.txt @@ -3,8 +3,19 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to flex_extract's documentation! -======================================== +Welcome to flex_extract's user documentation! +============================================= + +flex_extract is a software to retrieve meteorological fields from the European Centre for Medium-Range Weather Forecasts (ECMWF) Mars archive to server as input files for the FLEXTRA/FLEXPART Atmospheric Transport Modelling system. + + +.. The scripts can be 1) executed locally using the ECMWF WebMARS interface, or 2) on the ECMWF member +.. state gateway server or HPC facility using the ecaccess software package. As another option the scripts can 3) +.. also be triggered using ecflow scheduling software used by ECMWF for data dissemination. + +All required second party software and libraries used within flex_extract is open source and free of charge. + + .. raw:: html <table style="width:100%;"> @@ -86,7 +97,7 @@ Welcome to flex_extract's documentation! License text put in here! Which one? .. toctree:: - :maxdepth: 2 + :maxdepth: 3 :caption: Table of Contents: downloads diff --git a/documentation/Sphinx/build/html/_sources/installation.rst.txt b/documentation/Sphinx/build/html/_sources/installation.rst.txt index 7e37572..f759bc9 100644 --- a/documentation/Sphinx/build/html/_sources/installation.rst.txt +++ b/documentation/Sphinx/build/html/_sources/installation.rst.txt @@ -1,6 +1,15 @@ Installation ============ - -Describe installation process flex_extract .... - UNDER CONSTRUCTION \ No newline at end of file + UNDER CONSTRUCTION + +.. toctree:: + :hidden: + :maxdepth: 2 + + installation/requirements + installation/oper_modes + installation/test_install + + + \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/installation/oper_modes.rst.txt b/documentation/Sphinx/build/html/_sources/installation/oper_modes.rst.txt new file mode 100644 index 0000000..72e86f5 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/installation/oper_modes.rst.txt @@ -0,0 +1,6 @@ +Operating modes +=============== + + + UNDER CONSTRUCTION + \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/installation/requirements.rst.txt b/documentation/Sphinx/build/html/_sources/installation/requirements.rst.txt new file mode 100644 index 0000000..c1bae21 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/installation/requirements.rst.txt @@ -0,0 +1,6 @@ +Requirements +============ + + + UNDER CONSTRUCTION + diff --git a/documentation/Sphinx/build/html/_sources/installation/test_install.rst.txt b/documentation/Sphinx/build/html/_sources/installation/test_install.rst.txt new file mode 100644 index 0000000..2543088 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/installation/test_install.rst.txt @@ -0,0 +1,5 @@ +Installation test +================= + + UNDER CONSTRUCTION + \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/oper_modes.rst.txt b/documentation/Sphinx/build/html/_sources/oper_modes.rst.txt new file mode 100644 index 0000000..72e86f5 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/oper_modes.rst.txt @@ -0,0 +1,6 @@ +Operating modes +=============== + + + UNDER CONSTRUCTION + \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/program_structure.rst.txt b/documentation/Sphinx/build/html/_sources/program_structure.rst.txt index 3bfab6c..991b373 100644 --- a/documentation/Sphinx/build/html/_sources/program_structure.rst.txt +++ b/documentation/Sphinx/build/html/_sources/program_structure.rst.txt @@ -3,4 +3,12 @@ Program Structure Describe structure of flex_extract .... - UNDER CONSTRUCTION \ No newline at end of file + UNDER CONSTRUCTION + +.. toctree:: + :hidden: + :maxdepth: 2 + + program_structure/prog_overview + program_structure/prog_components + program_structure/prog_flow diff --git a/documentation/Sphinx/build/html/_sources/program_structure/prog_components.rst.txt b/documentation/Sphinx/build/html/_sources/program_structure/prog_components.rst.txt new file mode 100644 index 0000000..0c7d560 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/program_structure/prog_components.rst.txt @@ -0,0 +1,5 @@ +Program Components +================== + + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/program_structure/prog_flow.rst.txt b/documentation/Sphinx/build/html/_sources/program_structure/prog_flow.rst.txt new file mode 100644 index 0000000..07c4d84 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/program_structure/prog_flow.rst.txt @@ -0,0 +1,5 @@ +Program Flow +================ + + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/program_structure/prog_overview.rst.txt b/documentation/Sphinx/build/html/_sources/program_structure/prog_overview.rst.txt new file mode 100644 index 0000000..15cb629 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/program_structure/prog_overview.rst.txt @@ -0,0 +1,5 @@ +Program Overview +================ + + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/requirements.rst.txt b/documentation/Sphinx/build/html/_sources/requirements.rst.txt index b1f562d..c1bae21 100644 --- a/documentation/Sphinx/build/html/_sources/requirements.rst.txt +++ b/documentation/Sphinx/build/html/_sources/requirements.rst.txt @@ -1,6 +1,6 @@ Requirements ============ -Describe the requirements to use flex_extract .... - UNDER CONSTRUCTION \ No newline at end of file + UNDER CONSTRUCTION + diff --git a/documentation/Sphinx/build/html/_sources/support.rst.txt b/documentation/Sphinx/build/html/_sources/support.rst.txt index cd5fe0e..bccf1bf 100644 --- a/documentation/Sphinx/build/html/_sources/support.rst.txt +++ b/documentation/Sphinx/build/html/_sources/support.rst.txt @@ -1,6 +1,16 @@ Support ======= -Describe support options .... - UNDER CONSTRUCTION \ No newline at end of file + UNDER CONSTRUCTION + + +.. toctree:: + :hidden: + :maxdepth: 2 + + support/ticket_system + support/mailing_list + support/known_bugs_issues + support/faq + \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/support/faq.rst.txt b/documentation/Sphinx/build/html/_sources/support/faq.rst.txt new file mode 100644 index 0000000..ccfe36a --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/support/faq.rst.txt @@ -0,0 +1,4 @@ +FAQ - Frequently asked questions +================================ + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/support/known_bugs_issues.rst.txt b/documentation/Sphinx/build/html/_sources/support/known_bugs_issues.rst.txt new file mode 100644 index 0000000..8748ad8 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/support/known_bugs_issues.rst.txt @@ -0,0 +1,4 @@ +Known Bugs and Issues +===================== + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/support/mailing_list.rst.txt b/documentation/Sphinx/build/html/_sources/support/mailing_list.rst.txt new file mode 100644 index 0000000..e0f5012 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/support/mailing_list.rst.txt @@ -0,0 +1,4 @@ +Mailing Lists +============= + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/support/ticket_system.rst.txt b/documentation/Sphinx/build/html/_sources/support/ticket_system.rst.txt new file mode 100644 index 0000000..58b73a6 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/support/ticket_system.rst.txt @@ -0,0 +1,4 @@ +Ticket System +============= + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/test_install.rst.txt b/documentation/Sphinx/build/html/_sources/test_install.rst.txt new file mode 100644 index 0000000..2543088 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/test_install.rst.txt @@ -0,0 +1,5 @@ +Installation test +================= + + UNDER CONSTRUCTION + \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/user_guide.rst.txt b/documentation/Sphinx/build/html/_sources/user_guide.rst.txt index 030a019..4fe6dc0 100644 --- a/documentation/Sphinx/build/html/_sources/user_guide.rst.txt +++ b/documentation/Sphinx/build/html/_sources/user_guide.rst.txt @@ -1,6 +1,12 @@ User Guide ========== - -Describe using flex_extract .... - UNDER CONSTRUCTION \ No newline at end of file + UNDER CONSTRUCTION + +.. toctree:: + :hidden: + :maxdepth: 2 + + user_guide/how_to + user_guide/control_templates + \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/user_guide/control_templates.rst.txt b/documentation/Sphinx/build/html/_sources/user_guide/control_templates.rst.txt new file mode 100644 index 0000000..ccd58c5 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/user_guide/control_templates.rst.txt @@ -0,0 +1,4 @@ +CONTROL-file templates +====================== + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/_sources/user_guide/how_to.rst.txt b/documentation/Sphinx/build/html/_sources/user_guide/how_to.rst.txt new file mode 100644 index 0000000..7e041b4 --- /dev/null +++ b/documentation/Sphinx/build/html/_sources/user_guide/how_to.rst.txt @@ -0,0 +1,4 @@ +How to use flex_extract +======================= + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/build/html/api.html b/documentation/Sphinx/build/html/api.html index d9cfd4f..e52216b 100644 --- a/documentation/Sphinx/build/html/api.html +++ b/documentation/Sphinx/build/html/api.html @@ -29,7 +29,7 @@ <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Support" href="support.html" /> - <link rel="prev" title="User Guide" href="user_guide.html" /> + <link rel="prev" title="CONTROL-file templates" href="user_guide/control_templates.html" /> <script src="_static/js/modernizr.min.js"></script> @@ -88,74 +88,1229 @@ <li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="program_structure.html">Program Structure</a></li> <li class="toctree-l1"><a class="reference internal" href="user_guide.html">User Guide</a></li> -<li class="toctree-l1 current"><a class="current reference internal" href="#">Auto Generated Documentation</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Auto Generated Documentation</a><ul> +<li class="toctree-l2"><a class="reference internal" href="#porgrams">Porgrams</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#module-install">install</a></li> +<li class="toctree-l3"><a class="reference internal" href="#module-submit">submit</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="#classes">Classes</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#module-ControlFile">ControlFile</a></li> +<li class="toctree-l3"><a class="reference internal" href="#module-EcFlexpart">EcFlexpart</a></li> +<li class="toctree-l3"><a class="reference internal" href="#module-GribTools">GribTools</a></li> +<li class="toctree-l3"><a class="reference internal" href="#module-MarsRetrieval">MarsRetrieval</a></li> +<li class="toctree-l3"><a class="reference internal" href="#module-UioFiles">UioFiles</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="#modules">Modules</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#module-get_mars_data">get_mars_data</a></li> +<li class="toctree-l3"><a class="reference internal" href="#module-prepare_flexpart">prepare_flexpart</a></li> +<li class="toctree-l3"><a class="reference internal" href="#module-tools">tools</a></li> +<li class="toctree-l3"><a class="reference internal" href="#module-disaggregation">disaggregation</a></li> +</ul> +</li> +</ul> +</li> <li class="toctree-l1"><a class="reference internal" href="support.html">Support</a></li> </ul> - - - </div> - </div> - </nav> + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="index.html">Docs</a> »</li> + + <li>Auto Generated Documentation</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="_sources/api.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="auto-generated-documentation"> +<h1>Auto Generated Documentation<a class="headerlink" href="#auto-generated-documentation" title="Permalink to this headline">¶</a></h1> +<div class="contents local topic" id="contents"> +<ul class="simple"> +<li><a class="reference internal" href="#porgrams" id="id1">Porgrams</a><ul> +<li><a class="reference internal" href="#module-install" id="id2">install</a></li> +<li><a class="reference internal" href="#module-submit" id="id3">submit</a></li> +</ul> +</li> +<li><a class="reference internal" href="#classes" id="id4">Classes</a><ul> +<li><a class="reference internal" href="#module-ControlFile" id="id5">ControlFile</a></li> +<li><a class="reference internal" href="#module-EcFlexpart" id="id6">EcFlexpart</a></li> +<li><a class="reference internal" href="#module-GribTools" id="id7">GribTools</a></li> +<li><a class="reference internal" href="#module-MarsRetrieval" id="id8">MarsRetrieval</a></li> +<li><a class="reference internal" href="#module-UioFiles" id="id9">UioFiles</a></li> +</ul> +</li> +<li><a class="reference internal" href="#modules" id="id10">Modules</a><ul> +<li><a class="reference internal" href="#module-get_mars_data" id="id11">get_mars_data</a></li> +<li><a class="reference internal" href="#module-prepare_flexpart" id="id12">prepare_flexpart</a></li> +<li><a class="reference internal" href="#module-tools" id="id13">tools</a></li> +<li><a class="reference internal" href="#module-disaggregation" id="id14">disaggregation</a></li> +</ul> +</li> +</ul> +</div> +<div class="section" id="porgrams"> +<h2><a class="toc-backref" href="#id1">Porgrams</a><a class="headerlink" href="#porgrams" title="Permalink to this headline">¶</a></h2> +<div class="section" id="module-install"> +<span id="install"></span><h3><a class="toc-backref" href="#id2">install</a><a class="headerlink" href="#module-install" title="Permalink to this headline">¶</a></h3> +<dl class="function"> +<dt id="install.delete_convert_build"> +<code class="descclassname">install.</code><code class="descname">delete_convert_build</code><span class="sig-paren">(</span><em>src_path</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/install.html#delete_convert_build"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#install.delete_convert_build" title="Permalink to this definition">¶</a></dt> +<dd><p>Clean up the Fortran source directory and remove all +build files (e.g. *.o, *.mod and CONVERT2)</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>src_path</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Path to the fortran source directory.</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="function"> +<dt id="install.get_install_cmdline_arguments"> +<code class="descclassname">install.</code><code class="descname">get_install_cmdline_arguments</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/install.html#get_install_cmdline_arguments"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#install.get_install_cmdline_arguments" title="Permalink to this definition">¶</a></dt> +<dd><p>Decomposes the command line arguments and assigns them to variables. +Apply default values for non mentioned arguments.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body"><strong>args</strong> – Contains the commandline arguments from script/program call.</td> +</tr> +<tr class="field-even field"><th class="field-name">Return type:</th><td class="field-body"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Namespace</span></code></td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="function"> +<dt id="install.install_via_gateway"> +<code class="descclassname">install.</code><code class="descname">install_via_gateway</code><span class="sig-paren">(</span><em>c</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/install.html#install_via_gateway"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#install.install_via_gateway" title="Permalink to this definition">¶</a></dt> +<dd><p>Perform the actual installation on local machine or prepare data +transfer to remote gate and submit a job script which will +install everything on the remote gate.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>c</strong> (<a class="reference internal" href="#module-ControlFile" title="ControlFile"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ControlFile</span></code></a>) – Contains all the parameters of CONTROL file and +command line.</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="function"> +<dt id="install.main"> +<code class="descclassname">install.</code><code class="descname">main</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/install.html#main"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#install.main" title="Permalink to this definition">¶</a></dt> +<dd><p>Controls the installation process. Calls the installation function +if target is specified.</p> +</dd></dl> + +<dl class="function"> +<dt id="install.make_convert_build"> +<code class="descclassname">install.</code><code class="descname">make_convert_build</code><span class="sig-paren">(</span><em>src_path</em>, <em>makefile</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/install.html#make_convert_build"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#install.make_convert_build" title="Permalink to this definition">¶</a></dt> +<dd><p>Compiles the Fortran code and generates the executable.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>src_path</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Path to the fortran source directory.</li> +<li><strong>makefile</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The name of the makefile which should be used.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="function"> +<dt id="install.mk_compilejob"> +<code class="descclassname">install.</code><code class="descname">mk_compilejob</code><span class="sig-paren">(</span><em>makefile</em>, <em>target</em>, <em>ecuid</em>, <em>ecgid</em>, <em>fp_root</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/install.html#mk_compilejob"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#install.mk_compilejob" title="Permalink to this definition">¶</a></dt> +<dd><p>Modifies the original job template file so that it is specified +for the user and the environment were it will be applied. Result +is stored in a new file “job.temp” in the python directory.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>makefile</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Name of the makefile which should be used to compile FORTRAN +CONVERT2 program.</li> +<li><strong>target</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The target where the installation should be done, e.g. the queue.</li> +<li><strong>ecuid</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The user id on ECMWF server.</li> +<li><strong>ecgid</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The group id on ECMWF server.</li> +<li><strong>fp_root</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Path to the root directory of FLEXPART environment or flex_extract +environment.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="function"> +<dt id="install.mk_env_vars"> +<code class="descclassname">install.</code><code class="descname">mk_env_vars</code><span class="sig-paren">(</span><em>ecuid</em>, <em>ecgid</em>, <em>gateway</em>, <em>destination</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/install.html#mk_env_vars"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#install.mk_env_vars" title="Permalink to this definition">¶</a></dt> +<dd><p>Creates a file named ECMWF_ENV which contains the +necessary environmental variables at ECMWF servers. +It is based on the template ECMWF_ENV.template.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>ecuid</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The user id on ECMWF server.</li> +<li><strong>ecgid</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The group id on ECMWF server.</li> +<li><strong>gateway</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The gateway server the user is using.</li> +<li><strong>destination</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The remote destination which is used to transfer files +from ECMWF server to local gateway server.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="function"> +<dt id="install.mk_job_template"> +<code class="descclassname">install.</code><code class="descname">mk_job_template</code><span class="sig-paren">(</span><em>ecuid</em>, <em>ecgid</em>, <em>gateway</em>, <em>destination</em>, <em>fp_root</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/install.html#mk_job_template"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#install.mk_job_template" title="Permalink to this definition">¶</a></dt> +<dd><p>Modifies the original job template file so that it is specified +for the user and the environment were it will be applied. Result +is stored in a new file.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>ecuid</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The user id on ECMWF server.</li> +<li><strong>ecgid</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The group id on ECMWF server.</li> +<li><strong>gateway</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The gateway server the user is using.</li> +<li><strong>destination</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The remote destination which is used to transfer files +from ECMWF server to local gateway server.</li> +<li><strong>fp_root</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Path to the root directory of FLEXPART environment or flex_extract +environment.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="function"> +<dt id="install.mk_tarball"> +<code class="descclassname">install.</code><code class="descname">mk_tarball</code><span class="sig-paren">(</span><em>tarball_path</em>, <em>target</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/install.html#mk_tarball"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#install.mk_tarball" title="Permalink to this definition">¶</a></dt> +<dd><p>Creates a tarball with all necessary files which need to be sent to the +installation directory. +It does not matter if this is local or remote. +Collects all python files, the Fortran source and makefiles, +the ECMWF_ENV file, the CONTROL files as well as the +template files.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>tarball_path</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The complete path to the tar file which will contain all +relevant data for flex_extract.</li> +<li><strong>target</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The queue where the job is submitted to.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="function"> +<dt id="install.un_tarball"> +<code class="descclassname">install.</code><code class="descname">un_tarball</code><span class="sig-paren">(</span><em>tarball_path</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/install.html#un_tarball"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#install.un_tarball" title="Permalink to this definition">¶</a></dt> +<dd><p>Extracts the given tarball into current directory.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>tarball_path</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The complete path to the tar file which will contain all +relevant data for flex_extract.</td> +</tr> +</tbody> +</table> +</dd></dl> + +</div> +<div class="section" id="module-submit"> +<span id="submit"></span><h3><a class="toc-backref" href="#id3">submit</a><a class="headerlink" href="#module-submit" title="Permalink to this headline">¶</a></h3> +<dl class="function"> +<dt id="submit.main"> +<code class="descclassname">submit.</code><code class="descname">main</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/submit.html#main"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#submit.main" title="Permalink to this definition">¶</a></dt> +<dd><p>Get the arguments from script call and from CONTROL file. +Decides from the argument “queue” if the local version +is done “queue=None” or the gateway version with “queue=ecgate” +or “queue=cca”.</p> +</dd></dl> + +<dl class="function"> +<dt id="submit.submit"> +<code class="descclassname">submit.</code><code class="descname">submit</code><span class="sig-paren">(</span><em>jtemplate</em>, <em>c</em>, <em>queue</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/submit.html#submit"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#submit.submit" title="Permalink to this definition">¶</a></dt> +<dd><p>Prepares the job script and submit it to the specified queue.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>jtemplate</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Job template file from sub-directory “_templates” for +submission to ECMWF. It contains all necessary +module and variable settings for the ECMWF environment as well as +the job call and mail report instructions. +Default is “job.temp”.</li> +<li><strong>c</strong> (<a class="reference internal" href="#module-ControlFile" title="ControlFile"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ControlFile</span></code></a>) – Contains all the parameters of CONTROL file and +command line.</li> +<li><strong>queue</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Name of queue for submission to ECMWF (e.g. ecgate or cca )</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +</div> +</div> +<div class="section" id="classes"> +<h2><a class="toc-backref" href="#id4">Classes</a><a class="headerlink" href="#classes" title="Permalink to this headline">¶</a></h2> +<div class="section" id="module-ControlFile"> +<span id="controlfile"></span><h3><a class="toc-backref" href="#id5">ControlFile</a><a class="headerlink" href="#module-ControlFile" title="Permalink to this headline">¶</a></h3> +<dl class="class"> +<dt id="ControlFile.ControlFile"> +<em class="property">class </em><code class="descclassname">ControlFile.</code><code class="descname">ControlFile</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/ControlFile.html#ControlFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#ControlFile.ControlFile" title="Permalink to this definition">¶</a></dt> +<dd><p>Contains the information which are stored in the CONTROL files.</p> +<dl class="method"> +<dt id="ControlFile.ControlFile.assign_args_to_control"> +<code class="descname">assign_args_to_control</code><span class="sig-paren">(</span><em>args</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/ControlFile.html#ControlFile.assign_args_to_control"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#ControlFile.ControlFile.assign_args_to_control" title="Permalink to this definition">¶</a></dt> +<dd><p>Overwrites the existing ControlFile instance attributes with +the command line arguments.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>args</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">Namespace</span></code>) – Contains the commandline arguments from script/program call.</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="ControlFile.ControlFile.assign_envs_to_control"> +<code class="descname">assign_envs_to_control</code><span class="sig-paren">(</span><em>envs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/ControlFile.html#ControlFile.assign_envs_to_control"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#ControlFile.ControlFile.assign_envs_to_control" title="Permalink to this definition">¶</a></dt> +<dd><p>Assigns the ECMWF environment parameter.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>envs</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">dictionary</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">strings</span></code>) – Contains the ECMWF environment parameternames “ECUID”, “ECGID”, +“DESTINATION” and “GATEWAY” with its corresponding values. +They were read from the file “ECMWF_ENV”.</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="ControlFile.ControlFile.check_conditions"> +<code class="descname">check_conditions</code><span class="sig-paren">(</span><em>queue</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/ControlFile.html#ControlFile.check_conditions"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#ControlFile.ControlFile.check_conditions" title="Permalink to this definition">¶</a></dt> +<dd><p>Checks a couple of necessary attributes and conditions, +such as if they exist and contain values. +Otherwise set default values.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>queue</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Name of the queue if submitted to the ECMWF servers. +Used to check if ecuid, ecgid, gateway and destination +are set correctly and are not empty.</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="ControlFile.ControlFile.check_install_conditions"> +<code class="descname">check_install_conditions</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/ControlFile.html#ControlFile.check_install_conditions"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#ControlFile.ControlFile.check_install_conditions" title="Permalink to this definition">¶</a></dt> +<dd><p>Checks a couple of necessary attributes and conditions +for the installation such as if they exist and contain values. +Otherwise set default values.</p> +</dd></dl> + +<dl class="method"> +<dt id="ControlFile.ControlFile.to_list"> +<code class="descname">to_list</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/ControlFile.html#ControlFile.to_list"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#ControlFile.ControlFile.to_list" title="Permalink to this definition">¶</a></dt> +<dd><p>Just generates a list of strings containing the attributes and +assigned values except the attributes “_expanded”, “exedir”, +“ecmwfdatadir” and “flexpart_root_scripts”.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body"><strong>l</strong> – A sorted list of the all ControlFile class attributes with +their values except the attributes “_expanded”, “exedir”, +“ecmwfdatadir” and “flexpart_root_scripts”.</td> +</tr> +<tr class="field-even field"><th class="field-name">Return type:</th><td class="field-body"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code></td> +</tr> +</tbody> +</table> +</dd></dl> + +</dd></dl> + +</div> +<div class="section" id="module-EcFlexpart"> +<span id="ecflexpart"></span><h3><a class="toc-backref" href="#id6">EcFlexpart</a><a class="headerlink" href="#module-EcFlexpart" title="Permalink to this headline">¶</a></h3> +<dl class="class"> +<dt id="EcFlexpart.EcFlexpart"> +<em class="property">class </em><code class="descclassname">EcFlexpart.</code><code class="descname">EcFlexpart</code><span class="sig-paren">(</span><em>c</em>, <em>fluxes=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/EcFlexpart.html#EcFlexpart"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#EcFlexpart.EcFlexpart" title="Permalink to this definition">¶</a></dt> +<dd><p>Class to retrieve FLEXPART specific ECMWF data.</p> +<dl class="method"> +<dt id="EcFlexpart.EcFlexpart.create"> +<code class="descname">create</code><span class="sig-paren">(</span><em>inputfiles</em>, <em>c</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/EcFlexpart.html#EcFlexpart.create"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#EcFlexpart.EcFlexpart.create" title="Permalink to this definition">¶</a></dt> +<dd><p>An index file will be created which depends on the combination +of “date”, “time” and “stepRange” values. This is used to iterate +over all messages in each grib file which were passed through the +parameter “inputfiles” to seperate specific parameters into fort.* +files. Afterwards the FORTRAN program is called to convert +the data fields all to the same grid and put them in one file +per unique time step (combination of “date”, “time” and +“stepRange”).</p> +<div class="admonition note"> +<p class="first admonition-title">Note</p> +<p class="last">This method is based on the ECMWF example index.py +<a class="reference external" href="https://software.ecmwf.int/wiki/display/GRIB/index.py">https://software.ecmwf.int/wiki/display/GRIB/index.py</a></p> +</div> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>inputfiles</strong> (<a class="reference internal" href="#module-UioFiles" title="UioFiles"><code class="xref py py-obj docutils literal notranslate"><span class="pre">UioFiles</span></code></a>) – Contains a list of files.</li> +<li><strong>c</strong> (<a class="reference internal" href="#module-ControlFile" title="ControlFile"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ControlFile</span></code></a>) – Contains all the parameters of CONTROL file and +command line.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="EcFlexpart.EcFlexpart.deacc_fluxes"> +<code class="descname">deacc_fluxes</code><span class="sig-paren">(</span><em>inputfiles</em>, <em>c</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/EcFlexpart.html#EcFlexpart.deacc_fluxes"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#EcFlexpart.EcFlexpart.deacc_fluxes" title="Permalink to this definition">¶</a></dt> +<dd><p>Goes through all flux fields in ordered time and de-accumulate +the fields. Afterwards the fields are disaggregated in time. +Different versions of disaggregation is provided for rainfall +data (darain, modified linear) and the surface fluxes and +stress data (dapoly, cubic polynomial).</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>inputfiles</strong> (<a class="reference internal" href="#module-UioFiles" title="UioFiles"><code class="xref py py-obj docutils literal notranslate"><span class="pre">UioFiles</span></code></a>) – Contains a list of files.</li> +<li><strong>c</strong> (<a class="reference internal" href="#module-ControlFile" title="ControlFile"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ControlFile</span></code></a>) – Contains all the parameters of CONTROL file and +command line.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="EcFlexpart.EcFlexpart.prepare_fp_files"> +<code class="descname">prepare_fp_files</code><span class="sig-paren">(</span><em>c</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/EcFlexpart.html#EcFlexpart.prepare_fp_files"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#EcFlexpart.EcFlexpart.prepare_fp_files" title="Permalink to this definition">¶</a></dt> +<dd><p>Conversion of GRIB files to FLEXPART binary format.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>c</strong> (<a class="reference internal" href="#module-ControlFile" title="ControlFile"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ControlFile</span></code></a>) – Contains all the parameters of CONTROL file and +command line.</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="EcFlexpart.EcFlexpart.process_output"> +<code class="descname">process_output</code><span class="sig-paren">(</span><em>c</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/EcFlexpart.html#EcFlexpart.process_output"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#EcFlexpart.EcFlexpart.process_output" title="Permalink to this definition">¶</a></dt> +<dd><p>The grib files are postprocessed depending on the selection in +CONTROL file. The resulting files are moved to the output +directory if its not equal to the input directory. +The following modifications might be done if +properly switched in CONTROL file: +GRIB2 - Conversion to GRIB2 +ECTRANS - Transfer of files to gateway server +ECSTORAGE - Storage at ECMWF server</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>c</strong> (<a class="reference internal" href="#module-ControlFile" title="ControlFile"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ControlFile</span></code></a>) – Contains all the parameters of CONTROL file and +command line.</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="EcFlexpart.EcFlexpart.retrieve"> +<code class="descname">retrieve</code><span class="sig-paren">(</span><em>server</em>, <em>dates</em>, <em>public</em>, <em>request</em>, <em>inputdir='.'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/EcFlexpart.html#EcFlexpart.retrieve"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#EcFlexpart.EcFlexpart.retrieve" title="Permalink to this definition">¶</a></dt> +<dd><p>Finalizing the retrieval information by setting final details +depending on grid type. +Prepares MARS retrievals per grid type and submits them.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>server</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">ECMWFService</span></code> or <code class="xref py py-obj docutils literal notranslate"><span class="pre">ECMWFDataServer</span></code>) – The connection to the ECMWF server. This is different +for member state users which have full access and non +member state users which have only access to the public +data sets. The decision is made from command line argument +“public”; for public access its True (ECMWFDataServer) +for member state users its False (ECMWFService)</li> +<li><strong>dates</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Contains start and end date of the retrieval in the format +“YYYYMMDD/to/YYYYMMDD”</li> +<li><strong>request</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">integer</span></code>) – Selects the mode of retrieval. +0: Retrieves the data from ECMWF. +1: Prints the mars requests to an output file. +2: Retrieves the data and prints the mars request.</li> +<li><strong>inputdir</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – Path to the directory where the retrieved data is about +to be stored. The default is the current directory (‘.’).</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="EcFlexpart.EcFlexpart.write_namelist"> +<code class="descname">write_namelist</code><span class="sig-paren">(</span><em>c</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/EcFlexpart.html#EcFlexpart.write_namelist"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#EcFlexpart.EcFlexpart.write_namelist" title="Permalink to this definition">¶</a></dt> +<dd><p>Creates a namelist file in the temporary directory and writes +the following values to it: maxl, maxb, mlevel, +mlevelist, mnauf, metapar, rlo0, rlo1, rla0, rla1, +momega, momegadiff, mgauss, msmooth, meta, metadiff, mdpdeta</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>c</strong> (<a class="reference internal" href="#module-ControlFile" title="ControlFile"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ControlFile</span></code></a>) – Contains all the parameters of CONTROL file and +command line.</li> +<li><strong>filename</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Name of the namelist file.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +</dd></dl> + +</div> +<div class="section" id="module-GribTools"> +<span id="gribtools"></span><h3><a class="toc-backref" href="#id7">GribTools</a><a class="headerlink" href="#module-GribTools" title="Permalink to this headline">¶</a></h3> +<dl class="class"> +<dt id="GribTools.GribTools"> +<em class="property">class </em><code class="descclassname">GribTools.</code><code class="descname">GribTools</code><span class="sig-paren">(</span><em>filenames</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/GribTools.html#GribTools"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#GribTools.GribTools" title="Permalink to this definition">¶</a></dt> +<dd><p>Class for GRIB utilities (new methods) based on GRIB API</p> +<dl class="method"> +<dt id="GribTools.GribTools.copy"> +<code class="descname">copy</code><span class="sig-paren">(</span><em>filename_in</em>, <em>selectWhere=True</em>, <em>keynames=[]</em>, <em>keyvalues=[]</em>, <em>filemode='w'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/GribTools.html#GribTools.copy"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#GribTools.GribTools.copy" title="Permalink to this definition">¶</a></dt> +<dd><p>Add the content of another input grib file to the objects file but +only messages corresponding to keys/values passed to the function. +The selectWhere switch decides if to copy the keys equal to (True) or +different to (False) the keynames/keyvalues list passed to the function.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>filename_in</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Filename of the input file to read the grib messages from.</li> +<li><strong>selectWhere</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">boolean</span></code>, optional) – Decides if to copy the keynames and values equal to (True) or +different to (False) the keynames/keyvalues list passed to the +function. Default is True.</li> +<li><strong>keynames</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – List of keynames. Default is an empty list.</li> +<li><strong>keyvalues</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – List of keynames. Default is an empty list.</li> +<li><strong>filemode</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – Sets the mode for the output file. Default is “w”.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="GribTools.GribTools.get_keys"> +<code class="descname">get_keys</code><span class="sig-paren">(</span><em>keynames</em>, <em>wherekeynames=[]</em>, <em>wherekeyvalues=[]</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/GribTools.html#GribTools.get_keys"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#GribTools.GribTools.get_keys" title="Permalink to this definition">¶</a></dt> +<dd><p>Get keyvalues for a given list of keynames a where statement +can be given (list of key and list of values)</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>keynames</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – List of keynames.</li> +<li><strong>wherekeynames</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – Default value is an empty list.</li> +<li><strong>wherekeyvalues</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – Default value is an empty list.</li> +</ul> +</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first"><strong>return_list</strong> – List of keyvalues for given keynames.</p> +</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code></p> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="GribTools.GribTools.index"> +<code class="descname">index</code><span class="sig-paren">(</span><em>index_keys=['mars'], index_file='my.idx'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/GribTools.html#GribTools.index"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#GribTools.GribTools.index" title="Permalink to this definition">¶</a></dt> +<dd><p>Create index file from a list of files if it does not exist or +read an index file.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>index_keys</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – Contains the list of key parameter names from +which the index is to be created. +Default is a list with a single entry string “mars”.</li> +<li><strong>index_file</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – Filename where the indices are stored. +Default is “my.idx”.</li> +</ul> +</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first"><strong>iid</strong> – Grib index id.</p> +</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last"><code class="xref py py-obj docutils literal notranslate"><span class="pre">integer</span></code></p> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="GribTools.GribTools.set_keys"> +<code class="descname">set_keys</code><span class="sig-paren">(</span><em>fromfile</em>, <em>keynames</em>, <em>keyvalues</em>, <em>wherekeynames=[]</em>, <em>wherekeyvalues=[]</em>, <em>strict=False</em>, <em>filemode='w'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/GribTools.html#GribTools.set_keys"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#GribTools.GribTools.set_keys" title="Permalink to this definition">¶</a></dt> +<dd><p>Opens the file to read the grib messages and then write +them to a new output file. By default all messages are +written out. Also, the keyvalues of the passed list of +keynames are set or only those meeting the where statement. +(list of key and list of values).</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>fromfile</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Filename of the input file to read the grib messages from.</li> +<li><strong>keynames</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – List of keynames. Default is an empty list.</li> +<li><strong>keyvalues</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – List of keynames. Default is an empty list.</li> +<li><strong>wherekeynames</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – Default value is an empty list.</li> +<li><strong>wherekeyvalues</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – Default value is an empty list.</li> +<li><strong>strict</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">boolean</span></code>, optional) – Decides if everything from keynames and keyvalues +is written out the grib file (False) or only those +meeting the where statement (True). Default is False.</li> +<li><strong>filemode</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – Sets the mode for the output file. Default is “w”.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +</dd></dl> + +</div> +<div class="section" id="module-MarsRetrieval"> +<span id="marsretrieval"></span><h3><a class="toc-backref" href="#id8">MarsRetrieval</a><a class="headerlink" href="#module-MarsRetrieval" title="Permalink to this headline">¶</a></h3> +<dl class="class"> +<dt id="MarsRetrieval.MarsRetrieval"> +<em class="property">class </em><code class="descclassname">MarsRetrieval.</code><code class="descname">MarsRetrieval</code><span class="sig-paren">(</span><em>server</em>, <em>public</em>, <em>marsclass='ei'</em>, <em>dataset=''</em>, <em>type=''</em>, <em>levtype=''</em>, <em>levelist=''</em>, <em>repres=''</em>, <em>date=''</em>, <em>resol=''</em>, <em>stream=''</em>, <em>area=''</em>, <em>time=''</em>, <em>step=''</em>, <em>expver='1'</em>, <em>number=''</em>, <em>accuracy=''</em>, <em>grid=''</em>, <em>gaussian=''</em>, <em>target=''</em>, <em>param=''</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/MarsRetrieval.html#MarsRetrieval"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#MarsRetrieval.MarsRetrieval" title="Permalink to this definition">¶</a></dt> +<dd><p>Class for submitting MARS retrievals.</p> +<p>A description of MARS keywords/arguments and examples of their +values can be found here: +<a class="reference external" href="https://software.ecmwf.int/wiki/display/UDOC/">https://software.ecmwf.int/wiki/display/UDOC/</a> Identification+keywords#Identificationkeywords-class</p> +<dl class="method"> +<dt id="MarsRetrieval.MarsRetrieval.data_retrieve"> +<code class="descname">data_retrieve</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/MarsRetrieval.html#MarsRetrieval.data_retrieve"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#MarsRetrieval.MarsRetrieval.data_retrieve" title="Permalink to this definition">¶</a></dt> +<dd><p>Submits a MARS retrieval. Depending on the existence of +ECMWF Web-API it is submitted via Python or a +subprocess in the Shell. The parameter for the mars retrieval +are taken from the defined class attributes.</p> +</dd></dl> + +<dl class="method"> +<dt id="MarsRetrieval.MarsRetrieval.display_info"> +<code class="descname">display_info</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/MarsRetrieval.html#MarsRetrieval.display_info"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#MarsRetrieval.MarsRetrieval.display_info" title="Permalink to this definition">¶</a></dt> +<dd><p>Prints all class attributes and their values to the +standard output.</p> +</dd></dl> + +<dl class="method"> +<dt id="MarsRetrieval.MarsRetrieval.print_info"> +<code class="descname">print_info</code><span class="sig-paren">(</span><em>inputdir</em>, <em>request_number</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/MarsRetrieval.html#MarsRetrieval.print_info"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#MarsRetrieval.MarsRetrieval.print_info" title="Permalink to this definition">¶</a></dt> +<dd><p>Prints all mars requests to an extra file for debugging and +information.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>inputdir</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The path where all data from the retrievals are stored.</li> +<li><strong>request_number</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">integer</span></code>) – Number of mars requests for flux and non-flux data.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="MarsRetrieval.MarsRetrieval.print_infodata_csv"> +<code class="descname">print_infodata_csv</code><span class="sig-paren">(</span><em>inputdir</em>, <em>request_number</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/MarsRetrieval.html#MarsRetrieval.print_infodata_csv"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#MarsRetrieval.MarsRetrieval.print_infodata_csv" title="Permalink to this definition">¶</a></dt> +<dd><p>Write all request parameter in alpabetical order into a “csv” file.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>inputdir</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The path where all data from the retrievals are stored.</li> +<li><strong>request_number</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">integer</span></code>) – Number of mars requests for flux and non-flux data.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +</dd></dl> - <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> +</div> +<div class="section" id="module-UioFiles"> +<span id="uiofiles"></span><h3><a class="toc-backref" href="#id9">UioFiles</a><a class="headerlink" href="#module-UioFiles" title="Permalink to this headline">¶</a></h3> +<dl class="class"> +<dt id="UioFiles.UioFiles"> +<em class="property">class </em><code class="descclassname">UioFiles.</code><code class="descname">UioFiles</code><span class="sig-paren">(</span><em>path</em>, <em>pattern</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/UioFiles.html#UioFiles"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#UioFiles.UioFiles" title="Permalink to this definition">¶</a></dt> +<dd><p>Class to manipulate files. At initialisation it has the pattern +which stores a regular expression pattern for the files, the path +to the files and the files already.</p> +<dl class="method"> +<dt id="UioFiles.UioFiles.delete_files"> +<code class="descname">delete_files</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/UioFiles.html#UioFiles.delete_files"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#UioFiles.UioFiles.delete_files" title="Permalink to this definition">¶</a></dt> +<dd><p>Deletes the files.</p> +</dd></dl> - - <nav class="wy-nav-top" aria-label="top navigation"> - - <i data-toggle="wy-nav-top" class="fa fa-bars"></i> - <a href="index.html">flex_extract</a> - - </nav> +</dd></dl> +</div> +</div> +<div class="section" id="modules"> +<h2><a class="toc-backref" href="#id10">Modules</a><a class="headerlink" href="#modules" title="Permalink to this headline">¶</a></h2> +<div class="section" id="module-get_mars_data"> +<span id="get-mars-data"></span><h3><a class="toc-backref" href="#id11">get_mars_data</a><a class="headerlink" href="#module-get_mars_data" title="Permalink to this headline">¶</a></h3> +<dl class="function"> +<dt id="get_mars_data.do_retrievement"> +<code class="descclassname">get_mars_data.</code><code class="descname">do_retrievement</code><span class="sig-paren">(</span><em>c</em>, <em>server</em>, <em>start</em>, <em>end</em>, <em>delta_t</em>, <em>fluxes=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/get_mars_data.html#do_retrievement"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#get_mars_data.do_retrievement" title="Permalink to this definition">¶</a></dt> +<dd><p>Divides the complete retrieval period in smaller chunks and +retrieves the data from MARS.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>c</strong> (<a class="reference internal" href="#module-ControlFile" title="ControlFile"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ControlFile</span></code></a>) – Contains all the parameters of CONTROL file and +command line.</li> +<li><strong>server</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">ECMWFService</span></code>) – The server connection to ECMWF.</li> +<li><strong>start</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">datetime</span></code>) – The start date of the retrieval.</li> +<li><strong>end</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">datetime</span></code>) – The end date of the retrieval.</li> +<li><strong>delta_t</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">datetime</span></code>) – Delta_t + 1 is the maximal time period of a single +retrieval.</li> +<li><strong>fluxes</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">boolean</span></code>, optional) – Decides if the flux parameters are to be retrieved or +the rest of the parameter list. +Default value is False.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> - <div class="wy-nav-content"> - - <div class="rst-content"> - - +<dl class="function"> +<dt id="get_mars_data.get_mars_data"> +<code class="descclassname">get_mars_data.</code><code class="descname">get_mars_data</code><span class="sig-paren">(</span><em>c</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/get_mars_data.html#get_mars_data"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#get_mars_data.get_mars_data" title="Permalink to this definition">¶</a></dt> +<dd><p>Retrieves the EC data needed for a FLEXPART simulation.</p> +<p>Start and end dates for retrieval period is set. Retrievals +are divided into smaller periods if necessary and datechunk parameter +is set.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>c</strong> (<a class="reference internal" href="#module-ControlFile" title="ControlFile"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ControlFile</span></code></a>) – Contains all the parameters of CONTROL file and +command line.</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="function"> +<dt id="get_mars_data.main"> +<code class="descclassname">get_mars_data.</code><code class="descname">main</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/get_mars_data.html#main"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#get_mars_data.main" title="Permalink to this definition">¶</a></dt> +<dd><p>Controls the program to get data out of mars.</p> +<p>This is done if it is called directly from command line. +Then it also takes program call arguments and control file input.</p> +</dd></dl> + +</div> +<div class="section" id="module-prepare_flexpart"> +<span id="prepare-flexpart"></span><h3><a class="toc-backref" href="#id12">prepare_flexpart</a><a class="headerlink" href="#module-prepare_flexpart" title="Permalink to this headline">¶</a></h3> +<dl class="function"> +<dt id="prepare_flexpart.main"> +<code class="descclassname">prepare_flexpart.</code><code class="descname">main</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/prepare_flexpart.html#main"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#prepare_flexpart.main" title="Permalink to this definition">¶</a></dt> +<dd><p>Controls the program to prepare flexpart input files from mars data.</p> +<p>This is done if it is called directly from command line. +Then it also takes program call arguments and control file input.</p> +</dd></dl> +<dl class="function"> +<dt id="prepare_flexpart.prepare_flexpart"> +<code class="descclassname">prepare_flexpart.</code><code class="descname">prepare_flexpart</code><span class="sig-paren">(</span><em>ppid</em>, <em>c</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/prepare_flexpart.html#prepare_flexpart"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#prepare_flexpart.prepare_flexpart" title="Permalink to this definition">¶</a></dt> +<dd><p>Converts the mars data into flexpart ready input files.</p> +<p>Specific data fields are converted to a different grid and the flux +data are going to be disaggregated. The data fields are collected by +hour and stored in a file with a specific FLEXPART relevant naming +convention.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>ppid</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">int</span></code>) – Contains the ppid number of the current ECMWF job. It will be None if +the method was called within this module.</li> +<li><strong>c</strong> (<a class="reference internal" href="#module-ControlFile" title="ControlFile"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ControlFile</span></code></a>) – Contains all the parameters of CONTROL file and +command line.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> +</div> +<div class="section" id="module-tools"> +<span id="tools"></span><h3><a class="toc-backref" href="#id13">tools</a><a class="headerlink" href="#module-tools" title="Permalink to this headline">¶</a></h3> +<dl class="function"> +<dt id="tools.clean_up"> +<code class="descclassname">tools.</code><code class="descname">clean_up</code><span class="sig-paren">(</span><em>c</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#clean_up"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.clean_up" title="Permalink to this definition">¶</a></dt> +<dd><p>Remove all files from intermediate directory (inputdir).</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>c</strong> (<a class="reference internal" href="#module-ControlFile" title="ControlFile"><code class="xref py py-obj docutils literal notranslate"><span class="pre">ControlFile</span></code></a>) – Contains all the parameters of CONTROL file and +command line.</td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.get_cmdline_arguments"> +<code class="descclassname">tools.</code><code class="descname">get_cmdline_arguments</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#get_cmdline_arguments"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.get_cmdline_arguments" title="Permalink to this definition">¶</a></dt> +<dd><p>Decomposes the command line arguments and assigns them to variables. +Apply default values for non mentioned arguments.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body"><strong>args</strong> – Contains the commandline arguments from script/program call.</td> +</tr> +<tr class="field-even field"><th class="field-name">Return type:</th><td class="field-body"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Namespace</span></code></td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.get_list_as_string"> +<code class="descclassname">tools.</code><code class="descname">get_list_as_string</code><span class="sig-paren">(</span><em>list_obj</em>, <em>concatenate_sign='</em>, <em>'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#get_list_as_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.get_list_as_string" title="Permalink to this definition">¶</a></dt> +<dd><p>Converts a list of arbitrary content into a single string.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>list_obj</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code>) – A list with arbitrary content.</li> +<li><strong>concatenate_sign</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – A string which is used to concatenate the single +list elements. Default value is “, “.</li> +</ul> +</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first"><strong>str_of_list</strong> – The content of the list as a single string.</p> +</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last"><code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code></p> +</td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.init128"> +<code class="descclassname">tools.</code><code class="descname">init128</code><span class="sig-paren">(</span><em>filepath</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#init128"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.init128" title="Permalink to this definition">¶</a></dt> +<dd><p>Opens and reads the grib file with table 128 information.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filepath</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Path to file of ECMWF grib table number 128.</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><strong>table128</strong> – Contains the ECMWF grib table 128 information. +The key is the parameter number and the value is the +short name of the parameter.</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><code class="xref py py-obj docutils literal notranslate"><span class="pre">dictionary</span></code></td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.make_dir"> +<code class="descclassname">tools.</code><code class="descname">make_dir</code><span class="sig-paren">(</span><em>directory</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#make_dir"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.make_dir" title="Permalink to this definition">¶</a></dt> +<dd><p>Creates a directory and gives a warning if the directory +already exists. The program stops only if there is another problem.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>directory</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The directory name including the path which should be created.</td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.my_error"> +<code class="descclassname">tools.</code><code class="descname">my_error</code><span class="sig-paren">(</span><em>users</em>, <em>message='ERROR'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#my_error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.my_error" title="Permalink to this definition">¶</a></dt> +<dd><p>Prints a specified error message which can be passed to the function +before exiting the program.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>user</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Contains all email addresses which should be notified. +It might also contain just the ecmwf user name which wil trigger +mailing to the associated email address for this user.</li> +<li><strong>message</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – Error message. Default value is “ERROR”.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.none_or_int"> +<code class="descclassname">tools.</code><code class="descname">none_or_int</code><span class="sig-paren">(</span><em>value</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#none_or_int"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.none_or_int" title="Permalink to this definition">¶</a></dt> +<dd><p>Converts the input string into pythons None-type if the string +contains string “None”. Otherwise it is converted to an integer value.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>value</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – String to be checked for the “None” word.</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Return depends on the content of the input value. If it was “None”, +then the python type None is returned. Otherwise the string is +converted into an integer value.</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">None or int(value)</td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.none_or_str"> +<code class="descclassname">tools.</code><code class="descname">none_or_str</code><span class="sig-paren">(</span><em>value</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#none_or_str"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.none_or_str" title="Permalink to this definition">¶</a></dt> +<dd><p>Converts the input string into pythons None-type if the string +contains string “None”.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>value</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – String to be checked for the “None” word.</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Return depends on the content of the input value. If it was “None”, +then the python type None is returned. Otherwise the string itself.</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">None or value</td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.normal_exit"> +<code class="descclassname">tools.</code><code class="descname">normal_exit</code><span class="sig-paren">(</span><em>users</em>, <em>message='Done!'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#normal_exit"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.normal_exit" title="Permalink to this definition">¶</a></dt> +<dd><p>Prints a specific exit message which can be passed to the function.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> +<li><strong>user</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Contains all email addresses which should be notified. +It might also contain just the ecmwf user name which wil trigger +mailing to the associated email address for this user.</li> +<li><strong>message</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>, optional) – Message for exiting program. Default value is “Done!”.</li> +</ul> +</td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.product"> +<code class="descclassname">tools.</code><code class="descname">product</code><span class="sig-paren">(</span><em>*args</em>, <em>**kwds</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#product"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.product" title="Permalink to this definition">¶</a></dt> +<dd><p>This method combines the single characters of the passed arguments +with each other. So that each character of each argument value +will be combined with each character of the other arguments as a tuple.</p> +<div class="admonition note"> +<p class="first admonition-title">Note</p> +<p class="last">This method is taken from an example at the ECMWF wiki website. +<a class="reference external" href="https://software.ecmwf.int/wiki/display/GRIB/index.py">https://software.ecmwf.int/wiki/display/GRIB/index.py</a>; 2018-03-16</p> +</div> +<p class="rubric">Example</p> +<p>product(‘ABCD’, ‘xy’) –> Ax Ay Bx By Cx Cy Dx Dy</p> +<p>product(range(2), repeat = 3) –> 000 001 010 011 100 101 110 111</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>*args</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">tuple</span></code>) – Positional arguments (arbitrary number).</li> +<li><strong>**kwds</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">dictionary</span></code>) – Contains all the keyword arguments from *args.</li> +</ul> +</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first"><strong>prod</strong> – Return will be done with “yield”. A tuple of combined arguments. +See example in description above.</p> +</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last"><code class="xref py py-obj docutils literal notranslate"><span class="pre">tuple</span></code></p> +</td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.put_file_to_ecserver"> +<code class="descclassname">tools.</code><code class="descname">put_file_to_ecserver</code><span class="sig-paren">(</span><em>ecd</em>, <em>filename</em>, <em>target</em>, <em>ecuid</em>, <em>ecgid</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#put_file_to_ecserver"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.put_file_to_ecserver" title="Permalink to this definition">¶</a></dt> +<dd><p>Uses the ecaccess-file-put command to send a file to the ECMWF servers.</p> +<div class="admonition note"> +<p class="first admonition-title">Note</p> +<p class="last">The return value is just for testing reasons. It does not have +to be used from the calling function since the whole error handling +is done in here.</p> +</div> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>ecd</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The path were the file is stored.</li> +<li><strong>filename</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The name of the file to send to the ECMWF server.</li> +<li><strong>target</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The target queue where the file should be sent to.</li> +<li><strong>ecuid</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The user id on ECMWF server.</li> +<li><strong>ecgid</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The group id on ECMWF server.</li> +</ul> +</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first"><strong>rcode</strong> – Resulting code of command execution. If successful the string +will be empty.</p> +</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last"><code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code></p> +</td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.read_ecenv"> +<code class="descclassname">tools.</code><code class="descname">read_ecenv</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#read_ecenv"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.read_ecenv" title="Permalink to this definition">¶</a></dt> +<dd><p>Reads the file into a dictionary where the key values are the parameter +names.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Path to file where the ECMWF environment parameters are stored.</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><strong>envs</strong> – Contains the environment parameter ecuid, ecgid, gateway +and destination for ECMWF server environments.</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><code class="xref py py-obj docutils literal notranslate"><span class="pre">dictionary</span></code></td> +</tr> +</tbody> +</table> +</dd></dl> +<dl class="function"> +<dt id="tools.silent_remove"> +<code class="descclassname">tools.</code><code class="descname">silent_remove</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#silent_remove"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.silent_remove" title="Permalink to this definition">¶</a></dt> +<dd><p>Remove file if it exists. +The function does not fail if the file does not exist.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The name of the file to be removed without notification.</td> +</tr> +</tbody> +</table> +</dd></dl> -<div role="navigation" aria-label="breadcrumbs navigation"> +<dl class="function"> +<dt id="tools.submit_job_to_ecserver"> +<code class="descclassname">tools.</code><code class="descname">submit_job_to_ecserver</code><span class="sig-paren">(</span><em>target</em>, <em>jobname</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#submit_job_to_ecserver"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.submit_job_to_ecserver" title="Permalink to this definition">¶</a></dt> +<dd><p>Uses ecaccess-job-submit command to submit a job to the ECMWF server.</p> +<div class="admonition note"> +<p class="first admonition-title">Note</p> +<p class="last">The return value is just for testing reasons. It does not have +to be used from the calling function since the whole error handling +is done in here.</p> +</div> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>target</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The target where the file should be sent to, e.g. the queue.</li> +<li><strong>jobname</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – The name of the jobfile to be submitted to the ECMWF server.</li> +</ul> +</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first"><strong>rcode</strong> – Resulting code of command execution. If successful the string +will contain an integer number, representing the id of the job +at the ecmwf server.</p> +</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last"><code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code></p> +</td> +</tr> +</tbody> +</table> +</dd></dl> - <ul class="wy-breadcrumbs"> - - <li><a href="index.html">Docs</a> »</li> - - <li>Auto Generated Documentation</li> - - - <li class="wy-breadcrumbs-aside"> - - - <a href="_sources/api.rst.txt" rel="nofollow"> View page source</a> - - - </li> - - </ul> +<dl class="function"> +<dt id="tools.to_param_id"> +<code class="descclassname">tools.</code><code class="descname">to_param_id</code><span class="sig-paren">(</span><em>pars</em>, <em>table</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/tools.html#to_param_id"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#tools.to_param_id" title="Permalink to this definition">¶</a></dt> +<dd><p>Transform parameter names to parameter ids with ECMWF grib table 128.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>pars</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">string</span></code>) – Addpar argument from CONTROL file in the format of +parameter names instead of ids. The parameter short +names are sepearted with “/” and they are passed as +one single string.</li> +<li><strong>table</strong> (<code class="xref py py-obj docutils literal notranslate"><span class="pre">dictionary</span></code>) – Contains the ECMWF grib table 128 information. +The key is the parameter number and the value is the +short name of the parameter.</li> +</ul> +</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first"><strong>ipar</strong> – List of addpar parameters from CONTROL file transformed to +parameter ids in the format of integer.</p> +</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last"><code class="xref py py-obj docutils literal notranslate"><span class="pre">list</span></code> of <code class="xref py py-obj docutils literal notranslate"><span class="pre">integer</span></code></p> +</td> +</tr> +</tbody> +</table> +</dd></dl> - - <hr/> </div> - <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> - <div itemprop="articleBody"> - - <div class="section" id="module-disaggregation"> -<span id="auto-generated-documentation"></span><h1>Auto Generated Documentation<a class="headerlink" href="#module-disaggregation" title="Permalink to this headline">¶</a></h1> +<div class="section" id="module-disaggregation"> +<span id="disaggregation"></span><h3><a class="toc-backref" href="#id14">disaggregation</a><a class="headerlink" href="#module-disaggregation" title="Permalink to this headline">¶</a></h3> <dl class="function"> <dt id="disaggregation.IA3"> <code class="descclassname">disaggregation.</code><code class="descname">IA3</code><span class="sig-paren">(</span><em>g</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/disaggregation.html#IA3"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#disaggregation.IA3" title="Permalink to this definition">¶</a></dt> @@ -272,6 +1427,8 @@ E.g. [[array_t1], [array_t2], [array_t3], [array_t4]]</td> </div> </dd></dl> +</div> +</div> </div> @@ -285,7 +1442,7 @@ E.g. [[array_t1], [array_t2], [array_t3], [array_t4]]</td> <a href="support.html" class="btn btn-neutral float-right" title="Support" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> - <a href="user_guide.html" class="btn btn-neutral" title="User Guide" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + <a href="user_guide/control_templates.html" class="btn btn-neutral" title="CONTROL-file templates" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> </div> diff --git a/documentation/Sphinx/build/html/downloads.html b/documentation/Sphinx/build/html/downloads.html index 6fac483..2cbcfda 100644 --- a/documentation/Sphinx/build/html/downloads.html +++ b/documentation/Sphinx/build/html/downloads.html @@ -28,8 +28,8 @@ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> - <link rel="next" title="Installation" href="installation.html" /> - <link rel="prev" title="Welcome to flex_extract’s documentation!" href="index.html" /> + <link rel="next" title="Download tar-balls" href="downloads/tar_balls.html" /> + <link rel="prev" title="Welcome to flex_extract’s user documentation!" href="index.html" /> <script src="_static/js/modernizr.min.js"></script> @@ -84,7 +84,12 @@ <p class="caption"><span class="caption-text">Table of Contents:</span></p> <ul class="current"> -<li class="toctree-l1 current"><a class="current reference internal" href="#">Downloads</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Downloads</a><ul> +<li class="toctree-l2"><a class="reference internal" href="downloads/tar_balls.html">Download tar-balls</a></li> +<li class="toctree-l2"><a class="reference internal" href="downloads/git_repo.html">Git Repository</a></li> +<li class="toctree-l2"><a class="reference internal" href="downloads/history_changes.html">History of Changes</a></li> +</ul> +</li> <li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="program_structure.html">Program Structure</a></li> <li class="toctree-l1"><a class="reference internal" href="user_guide.html">User Guide</a></li> @@ -159,6 +164,8 @@ <p>Describe download options of flex_extract ….</p> <blockquote> <div>UNDER CONSTRUCTION</div></blockquote> +<div class="toctree-wrapper compound"> +</div> </div> @@ -169,10 +176,10 @@ <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> - <a href="installation.html" class="btn btn-neutral float-right" title="Installation" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + <a href="downloads/tar_balls.html" class="btn btn-neutral float-right" title="Download tar-balls" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> - <a href="index.html" class="btn btn-neutral" title="Welcome to flex_extract’s documentation!" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + <a href="index.html" class="btn btn-neutral" title="Welcome to flex_extract’s user documentation!" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> </div> diff --git a/documentation/Sphinx/build/html/downloads/git_repo.html b/documentation/Sphinx/build/html/downloads/git_repo.html new file mode 100644 index 0000000..c46a986 --- /dev/null +++ b/documentation/Sphinx/build/html/downloads/git_repo.html @@ -0,0 +1,236 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Git Repository — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="History of Changes" href="history_changes.html" /> + <link rel="prev" title="Download tar-balls" href="tar_balls.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1 current"><a class="reference internal" href="../downloads.html">Downloads</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="tar_balls.html">Download tar-balls</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Git Repository</a></li> +<li class="toctree-l2"><a class="reference internal" href="history_changes.html">History of Changes</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../downloads.html">Downloads</a> »</li> + + <li>Git Repository</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/downloads/git_repo.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="git-repository"> +<h1>Git Repository<a class="headerlink" href="#git-repository" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="history_changes.html" class="btn btn-neutral float-right" title="History of Changes" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="tar_balls.html" class="btn btn-neutral" title="Download tar-balls" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/downloads/history_changes.html b/documentation/Sphinx/build/html/downloads/history_changes.html new file mode 100644 index 0000000..d63eb3b --- /dev/null +++ b/documentation/Sphinx/build/html/downloads/history_changes.html @@ -0,0 +1,236 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>History of Changes — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Installation" href="../installation.html" /> + <link rel="prev" title="Git Repository" href="git_repo.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1 current"><a class="reference internal" href="../downloads.html">Downloads</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="tar_balls.html">Download tar-balls</a></li> +<li class="toctree-l2"><a class="reference internal" href="git_repo.html">Git Repository</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">History of Changes</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../downloads.html">Downloads</a> »</li> + + <li>History of Changes</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/downloads/history_changes.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="history-of-changes"> +<h1>History of Changes<a class="headerlink" href="#history-of-changes" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="../installation.html" class="btn btn-neutral float-right" title="Installation" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="git_repo.html" class="btn btn-neutral" title="Git Repository" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/downloads/tar_balls.html b/documentation/Sphinx/build/html/downloads/tar_balls.html new file mode 100644 index 0000000..fb3cb36 --- /dev/null +++ b/documentation/Sphinx/build/html/downloads/tar_balls.html @@ -0,0 +1,236 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Download tar-balls — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Git Repository" href="git_repo.html" /> + <link rel="prev" title="Downloads" href="../downloads.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1 current"><a class="reference internal" href="../downloads.html">Downloads</a><ul class="current"> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Download tar-balls</a></li> +<li class="toctree-l2"><a class="reference internal" href="git_repo.html">Git Repository</a></li> +<li class="toctree-l2"><a class="reference internal" href="history_changes.html">History of Changes</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../downloads.html">Downloads</a> »</li> + + <li>Download tar-balls</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/downloads/tar_balls.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="download-tar-balls"> +<h1>Download tar-balls<a class="headerlink" href="#download-tar-balls" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="git_repo.html" class="btn btn-neutral float-right" title="Git Repository" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="../downloads.html" class="btn btn-neutral" title="Downloads" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/genindex.html b/documentation/Sphinx/build/html/genindex.html index 08462f1..562e1d4 100644 --- a/documentation/Sphinx/build/html/genindex.html +++ b/documentation/Sphinx/build/html/genindex.html @@ -155,21 +155,119 @@ <h1 id="index">Index</h1> <div class="genindex-jumpbox"> - <a href="#D"><strong>D</strong></a> + <a href="#A"><strong>A</strong></a> + | <a href="#C"><strong>C</strong></a> + | <a href="#D"><strong>D</strong></a> + | <a href="#E"><strong>E</strong></a> + | <a href="#G"><strong>G</strong></a> | <a href="#I"><strong>I</strong></a> + | <a href="#M"><strong>M</strong></a> + | <a href="#N"><strong>N</strong></a> + | <a href="#P"><strong>P</strong></a> + | <a href="#R"><strong>R</strong></a> + | <a href="#S"><strong>S</strong></a> + | <a href="#T"><strong>T</strong></a> + | <a href="#U"><strong>U</strong></a> + | <a href="#W"><strong>W</strong></a> </div> +<h2 id="A">A</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#ControlFile.ControlFile.assign_args_to_control">assign_args_to_control() (ControlFile.ControlFile method)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#ControlFile.ControlFile.assign_envs_to_control">assign_envs_to_control() (ControlFile.ControlFile method)</a> +</li> + </ul></td> +</tr></table> + +<h2 id="C">C</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#ControlFile.ControlFile.check_conditions">check_conditions() (ControlFile.ControlFile method)</a> +</li> + <li><a href="api.html#ControlFile.ControlFile.check_install_conditions">check_install_conditions() (ControlFile.ControlFile method)</a> +</li> + <li><a href="api.html#tools.clean_up">clean_up() (in module tools)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#ControlFile.ControlFile">ControlFile (class in ControlFile)</a> + + <ul> + <li><a href="api.html#module-ControlFile">(module)</a> +</li> + </ul></li> + <li><a href="api.html#GribTools.GribTools.copy">copy() (GribTools.GribTools method)</a> +</li> + <li><a href="api.html#EcFlexpart.EcFlexpart.create">create() (EcFlexpart.EcFlexpart method)</a> +</li> + </ul></td> +</tr></table> + <h2 id="D">D</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="api.html#disaggregation.dapoly">dapoly() (in module disaggregation)</a> +</li> + <li><a href="api.html#disaggregation.darain">darain() (in module disaggregation)</a> +</li> + <li><a href="api.html#MarsRetrieval.MarsRetrieval.data_retrieve">data_retrieve() (MarsRetrieval.MarsRetrieval method)</a> +</li> + <li><a href="api.html#EcFlexpart.EcFlexpart.deacc_fluxes">deacc_fluxes() (EcFlexpart.EcFlexpart method)</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="api.html#disaggregation.darain">darain() (in module disaggregation)</a> + <li><a href="api.html#install.delete_convert_build">delete_convert_build() (in module install)</a> +</li> + <li><a href="api.html#UioFiles.UioFiles.delete_files">delete_files() (UioFiles.UioFiles method)</a> </li> <li><a href="api.html#module-disaggregation">disaggregation (module)</a> </li> + <li><a href="api.html#MarsRetrieval.MarsRetrieval.display_info">display_info() (MarsRetrieval.MarsRetrieval method)</a> +</li> + <li><a href="api.html#get_mars_data.do_retrievement">do_retrievement() (in module get_mars_data)</a> +</li> + </ul></td> +</tr></table> + +<h2 id="E">E</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#EcFlexpart.EcFlexpart">EcFlexpart (class in EcFlexpart)</a> + + <ul> + <li><a href="api.html#module-EcFlexpart">(module)</a> +</li> + </ul></li> + </ul></td> +</tr></table> + +<h2 id="G">G</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#tools.get_cmdline_arguments">get_cmdline_arguments() (in module tools)</a> +</li> + <li><a href="api.html#install.get_install_cmdline_arguments">get_install_cmdline_arguments() (in module install)</a> +</li> + <li><a href="api.html#GribTools.GribTools.get_keys">get_keys() (GribTools.GribTools method)</a> +</li> + <li><a href="api.html#tools.get_list_as_string">get_list_as_string() (in module tools)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#module-get_mars_data">get_mars_data (module)</a> +</li> + <li><a href="api.html#get_mars_data.get_mars_data">get_mars_data() (in module get_mars_data)</a> +</li> + <li><a href="api.html#GribTools.GribTools">GribTools (class in GribTools)</a> + + <ul> + <li><a href="api.html#module-GribTools">(module)</a> +</li> + </ul></li> </ul></td> </tr></table> @@ -177,6 +275,160 @@ <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="api.html#disaggregation.IA3">IA3() (in module disaggregation)</a> +</li> + <li><a href="api.html#GribTools.GribTools.index">index() (GribTools.GribTools method)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#tools.init128">init128() (in module tools)</a> +</li> + <li><a href="api.html#module-install">install (module)</a> +</li> + <li><a href="api.html#install.install_via_gateway">install_via_gateway() (in module install)</a> +</li> + </ul></td> +</tr></table> + +<h2 id="M">M</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#get_mars_data.main">main() (in module get_mars_data)</a> + + <ul> + <li><a href="api.html#install.main">(in module install)</a> +</li> + <li><a href="api.html#prepare_flexpart.main">(in module prepare_flexpart)</a> +</li> + <li><a href="api.html#submit.main">(in module submit)</a> +</li> + </ul></li> + <li><a href="api.html#install.make_convert_build">make_convert_build() (in module install)</a> +</li> + <li><a href="api.html#tools.make_dir">make_dir() (in module tools)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#MarsRetrieval.MarsRetrieval">MarsRetrieval (class in MarsRetrieval)</a> + + <ul> + <li><a href="api.html#module-MarsRetrieval">(module)</a> +</li> + </ul></li> + <li><a href="api.html#install.mk_compilejob">mk_compilejob() (in module install)</a> +</li> + <li><a href="api.html#install.mk_env_vars">mk_env_vars() (in module install)</a> +</li> + <li><a href="api.html#install.mk_job_template">mk_job_template() (in module install)</a> +</li> + <li><a href="api.html#install.mk_tarball">mk_tarball() (in module install)</a> +</li> + <li><a href="api.html#tools.my_error">my_error() (in module tools)</a> +</li> + </ul></td> +</tr></table> + +<h2 id="N">N</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#tools.none_or_int">none_or_int() (in module tools)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#tools.none_or_str">none_or_str() (in module tools)</a> +</li> + <li><a href="api.html#tools.normal_exit">normal_exit() (in module tools)</a> +</li> + </ul></td> +</tr></table> + +<h2 id="P">P</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#module-prepare_flexpart">prepare_flexpart (module)</a> +</li> + <li><a href="api.html#prepare_flexpart.prepare_flexpart">prepare_flexpart() (in module prepare_flexpart)</a> +</li> + <li><a href="api.html#EcFlexpart.EcFlexpart.prepare_fp_files">prepare_fp_files() (EcFlexpart.EcFlexpart method)</a> +</li> + <li><a href="api.html#MarsRetrieval.MarsRetrieval.print_info">print_info() (MarsRetrieval.MarsRetrieval method)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#MarsRetrieval.MarsRetrieval.print_infodata_csv">print_infodata_csv() (MarsRetrieval.MarsRetrieval method)</a> +</li> + <li><a href="api.html#EcFlexpart.EcFlexpart.process_output">process_output() (EcFlexpart.EcFlexpart method)</a> +</li> + <li><a href="api.html#tools.product">product() (in module tools)</a> +</li> + <li><a href="api.html#tools.put_file_to_ecserver">put_file_to_ecserver() (in module tools)</a> +</li> + </ul></td> +</tr></table> + +<h2 id="R">R</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#tools.read_ecenv">read_ecenv() (in module tools)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#EcFlexpart.EcFlexpart.retrieve">retrieve() (EcFlexpart.EcFlexpart method)</a> +</li> + </ul></td> +</tr></table> + +<h2 id="S">S</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#GribTools.GribTools.set_keys">set_keys() (GribTools.GribTools method)</a> +</li> + <li><a href="api.html#tools.silent_remove">silent_remove() (in module tools)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#module-submit">submit (module)</a> +</li> + <li><a href="api.html#submit.submit">submit() (in module submit)</a> +</li> + <li><a href="api.html#tools.submit_job_to_ecserver">submit_job_to_ecserver() (in module tools)</a> +</li> + </ul></td> +</tr></table> + +<h2 id="T">T</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#ControlFile.ControlFile.to_list">to_list() (ControlFile.ControlFile method)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#tools.to_param_id">to_param_id() (in module tools)</a> +</li> + <li><a href="api.html#module-tools">tools (module)</a> +</li> + </ul></td> +</tr></table> + +<h2 id="U">U</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#UioFiles.UioFiles">UioFiles (class in UioFiles)</a> + + <ul> + <li><a href="api.html#module-UioFiles">(module)</a> +</li> + </ul></li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#install.un_tarball">un_tarball() (in module install)</a> +</li> + </ul></td> +</tr></table> + +<h2 id="W">W</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="api.html#EcFlexpart.EcFlexpart.write_namelist">write_namelist() (EcFlexpart.EcFlexpart method)</a> </li> </ul></td> </tr></table> diff --git a/documentation/Sphinx/build/html/index.html b/documentation/Sphinx/build/html/index.html index dcef903..16bd866 100644 --- a/documentation/Sphinx/build/html/index.html +++ b/documentation/Sphinx/build/html/index.html @@ -8,7 +8,7 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Welcome to flex_extract’s documentation! — flex_extract 7.1 alpha documentation</title> + <title>Welcome to flex_extract’s user documentation! — flex_extract 7.1 alpha documentation</title> @@ -134,7 +134,7 @@ <li><a href="#">Docs</a> »</li> - <li>Welcome to flex_extract’s documentation!</li> + <li>Welcome to flex_extract’s user documentation!</li> <li class="wy-breadcrumbs-aside"> @@ -153,8 +153,10 @@ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> - <div class="section" id="welcome-to-flex-extract-s-documentation"> -<h1>Welcome to flex_extract’s documentation!<a class="headerlink" href="#welcome-to-flex-extract-s-documentation" title="Permalink to this headline">¶</a></h1> + <div class="section" id="welcome-to-flex-extract-s-user-documentation"> +<h1>Welcome to flex_extract’s user documentation!<a class="headerlink" href="#welcome-to-flex-extract-s-user-documentation" title="Permalink to this headline">¶</a></h1> +<p>flex_extract is a software to retrieve meteorological fields from the European Centre for Medium-Range Weather Forecasts (ECMWF) Mars archive to server as input files for the FLEXTRA/FLEXPART Atmospheric Transport Modelling system.</p> +<p>All required second party software and libraries used within flex_extract is open source and free of charge.</p> <table style="width:100%;"> <tr> <td style="width:200px;height:150px;"> @@ -238,7 +240,29 @@ <li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="program_structure.html">Program Structure</a></li> <li class="toctree-l1"><a class="reference internal" href="user_guide.html">User Guide</a></li> -<li class="toctree-l1"><a class="reference internal" href="api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="api.html">Auto Generated Documentation</a><ul> +<li class="toctree-l2"><a class="reference internal" href="api.html#porgrams">Porgrams</a><ul> +<li class="toctree-l3"><a class="reference internal" href="api.html#module-install">install</a></li> +<li class="toctree-l3"><a class="reference internal" href="api.html#module-submit">submit</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="api.html#classes">Classes</a><ul> +<li class="toctree-l3"><a class="reference internal" href="api.html#module-ControlFile">ControlFile</a></li> +<li class="toctree-l3"><a class="reference internal" href="api.html#module-EcFlexpart">EcFlexpart</a></li> +<li class="toctree-l3"><a class="reference internal" href="api.html#module-GribTools">GribTools</a></li> +<li class="toctree-l3"><a class="reference internal" href="api.html#module-MarsRetrieval">MarsRetrieval</a></li> +<li class="toctree-l3"><a class="reference internal" href="api.html#module-UioFiles">UioFiles</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="api.html#modules">Modules</a><ul> +<li class="toctree-l3"><a class="reference internal" href="api.html#module-get_mars_data">get_mars_data</a></li> +<li class="toctree-l3"><a class="reference internal" href="api.html#module-prepare_flexpart">prepare_flexpart</a></li> +<li class="toctree-l3"><a class="reference internal" href="api.html#module-tools">tools</a></li> +<li class="toctree-l3"><a class="reference internal" href="api.html#module-disaggregation">disaggregation</a></li> +</ul> +</li> +</ul> +</li> <li class="toctree-l1"><a class="reference internal" href="support.html">Support</a></li> </ul> </div> diff --git a/documentation/Sphinx/build/html/installation.html b/documentation/Sphinx/build/html/installation.html index f8878fd..f2c7f32 100644 --- a/documentation/Sphinx/build/html/installation.html +++ b/documentation/Sphinx/build/html/installation.html @@ -28,8 +28,8 @@ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> - <link rel="next" title="Usage" href="usage.html" /> - <link rel="prev" title="Requirements" href="requirements.html" /> + <link rel="next" title="Requirements" href="installation/requirements.html" /> + <link rel="prev" title="Downloads" href="downloads.html" /> <script src="_static/js/modernizr.min.js"></script> @@ -82,12 +82,19 @@ - <p class="caption"><span class="caption-text">Contents:</span></p> + <p class="caption"><span class="caption-text">Table of Contents:</span></p> <ul class="current"> -<li class="toctree-l1"><a class="reference internal" href="requirements.html">Requirements</a></li> -<li class="toctree-l1 current"><a class="current reference internal" href="#">Installation</a></li> -<li class="toctree-l1"><a class="reference internal" href="usage.html">Usage</a></li> -<li class="toctree-l1"><a class="reference internal" href="API.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="downloads.html">Downloads</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Installation</a><ul> +<li class="toctree-l2"><a class="reference internal" href="installation/requirements.html">Requirements</a></li> +<li class="toctree-l2"><a class="reference internal" href="installation/oper_modes.html">Operating modes</a></li> +<li class="toctree-l2"><a class="reference internal" href="installation/test_install.html">Installation test</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="support.html">Support</a></li> </ul> @@ -154,9 +161,10 @@ <div class="section" id="installation"> <h1>Installation<a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h1> -<p>Describe installation process flex_extract ….</p> <blockquote> <div>UNDER CONSTRUCTION</div></blockquote> +<div class="toctree-wrapper compound"> +</div> </div> @@ -167,10 +175,10 @@ <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> - <a href="usage.html" class="btn btn-neutral float-right" title="Usage" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + <a href="installation/requirements.html" class="btn btn-neutral float-right" title="Requirements" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> - <a href="requirements.html" class="btn btn-neutral" title="Requirements" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + <a href="downloads.html" class="btn btn-neutral" title="Downloads" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> </div> diff --git a/documentation/Sphinx/build/html/installation/oper_modes.html b/documentation/Sphinx/build/html/installation/oper_modes.html new file mode 100644 index 0000000..b111f0d --- /dev/null +++ b/documentation/Sphinx/build/html/installation/oper_modes.html @@ -0,0 +1,236 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Operating modes — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Installation test" href="test_install.html" /> + <link rel="prev" title="Requirements" href="requirements.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../installation.html">Installation</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="requirements.html">Requirements</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Operating modes</a></li> +<li class="toctree-l2"><a class="reference internal" href="test_install.html">Installation test</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../installation.html">Installation</a> »</li> + + <li>Operating modes</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/installation/oper_modes.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="operating-modes"> +<h1>Operating modes<a class="headerlink" href="#operating-modes" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="test_install.html" class="btn btn-neutral float-right" title="Installation test" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="requirements.html" class="btn btn-neutral" title="Requirements" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/installation/requirements.html b/documentation/Sphinx/build/html/installation/requirements.html new file mode 100644 index 0000000..7bb2491 --- /dev/null +++ b/documentation/Sphinx/build/html/installation/requirements.html @@ -0,0 +1,236 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Requirements — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Operating modes" href="oper_modes.html" /> + <link rel="prev" title="Installation" href="../installation.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../installation.html">Installation</a><ul class="current"> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Requirements</a></li> +<li class="toctree-l2"><a class="reference internal" href="oper_modes.html">Operating modes</a></li> +<li class="toctree-l2"><a class="reference internal" href="test_install.html">Installation test</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../installation.html">Installation</a> »</li> + + <li>Requirements</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/installation/requirements.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="requirements"> +<h1>Requirements<a class="headerlink" href="#requirements" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="oper_modes.html" class="btn btn-neutral float-right" title="Operating modes" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="../installation.html" class="btn btn-neutral" title="Installation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/installation/test_install.html b/documentation/Sphinx/build/html/installation/test_install.html new file mode 100644 index 0000000..c399553 --- /dev/null +++ b/documentation/Sphinx/build/html/installation/test_install.html @@ -0,0 +1,236 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Installation test — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Program Structure" href="../program_structure.html" /> + <link rel="prev" title="Operating modes" href="oper_modes.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../installation.html">Installation</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="requirements.html">Requirements</a></li> +<li class="toctree-l2"><a class="reference internal" href="oper_modes.html">Operating modes</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Installation test</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../installation.html">Installation</a> »</li> + + <li>Installation test</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/installation/test_install.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="installation-test"> +<h1>Installation test<a class="headerlink" href="#installation-test" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="../program_structure.html" class="btn btn-neutral float-right" title="Program Structure" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="oper_modes.html" class="btn btn-neutral" title="Operating modes" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/objects.inv b/documentation/Sphinx/build/html/objects.inv index 2c7d0b71a717a8402c7048c9f20ab47308600d29..7f7fb49daf2cebaeb599ad3e7ed2ad1bee74e74a 100644 GIT binary patch delta 1693 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 Ye)|h|p_#UC|7R6thW?jNNLYFc0E^m51poj5 delta 450 zcmZqU+sZPbwtngq->kz10<GWeTD`bpHMf*Zk5v%Zq|wrLDK%hCXYvHyaC?=TU#0fO z`3Iexq<gZA`DSGPz3(Pct_zo{xGFACSoOp-Yh8C&@L2|1<x5jOPhNH7jOGu)hdpZF zey07*nz(q~XR&(D3oWxJwQYVK+n|tI%Wc4|A{rYoPgy1_W2I=ld-e)P0alT<73;KD zgi6mAjMn+3)Z3jarOcjC7-!zJW&iEn0d?yn)kBW)ep{4Xd{vkI-M+>v`F%1R#SNR5 z6?iuKmHw3eJ(G3zd!?cprqh+ICuE+Sc(AFxTSz5*|9yKS*)z?(n#B`3u83$BB^bOg zU2<-ZsI>OCYiB#m8iNFn)gQX^`&-k!xyl;JI<FEKW;Lp=*m<mTrfK*c(K}`N?>Kk7 zG;I=Z3Skqp3XeL#Q1-MozD&AWl0EBnaoOBSy%#DtF7Fi9WZGAvc_1$2Q*d|b@qO;6 zBwqWQFr5_<4q+1fso6T`*|(cJe@zpa;Ca_1X2lLe{mS*xD*FVaEPaLNhI?BJthk^m z8`FCA``ULLyN{jwo;Y#q-!o0xd07XJ9jN@(X~QdjV*mPs><LFV@*c2b@SgMU>z$8c L{~1D0iZ25Ii4@Yg diff --git a/documentation/Sphinx/build/html/oper_modes.html b/documentation/Sphinx/build/html/oper_modes.html new file mode 100644 index 0000000..9235935 --- /dev/null +++ b/documentation/Sphinx/build/html/oper_modes.html @@ -0,0 +1,236 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Operating modes — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="genindex.html" /> + <link rel="search" title="Search" href="search.html" /> + <link rel="next" title="Installation test" href="test_install.html" /> + <link rel="prev" title="Requirements" href="requirements.html" /> + + + <script src="_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="downloads.html">Downloads</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="installation.html">Installation</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="requirements.html">Requirements</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Operating modes</a></li> +<li class="toctree-l2"><a class="reference internal" href="test_install.html">Installation test</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="index.html">Docs</a> »</li> + + <li><a href="installation.html">Installation</a> »</li> + + <li>Operating modes</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="_sources/oper_modes.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="operating-modes"> +<h1>Operating modes<a class="headerlink" href="#operating-modes" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="test_install.html" class="btn btn-neutral float-right" title="Installation test" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="requirements.html" class="btn btn-neutral" title="Requirements" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'./', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/underscore.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/program_structure.html b/documentation/Sphinx/build/html/program_structure.html index a0c7014..dc40043 100644 --- a/documentation/Sphinx/build/html/program_structure.html +++ b/documentation/Sphinx/build/html/program_structure.html @@ -28,8 +28,8 @@ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> - <link rel="next" title="User Guide" href="user_guide.html" /> - <link rel="prev" title="Installation" href="installation.html" /> + <link rel="next" title="Program Overview" href="program_structure/prog_overview.html" /> + <link rel="prev" title="Installation test" href="installation/test_install.html" /> <script src="_static/js/modernizr.min.js"></script> @@ -86,7 +86,12 @@ <ul class="current"> <li class="toctree-l1"><a class="reference internal" href="downloads.html">Downloads</a></li> <li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li> -<li class="toctree-l1 current"><a class="current reference internal" href="#">Program Structure</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Program Structure</a><ul> +<li class="toctree-l2"><a class="reference internal" href="program_structure/prog_overview.html">Program Overview</a></li> +<li class="toctree-l2"><a class="reference internal" href="program_structure/prog_components.html">Program Components</a></li> +<li class="toctree-l2"><a class="reference internal" href="program_structure/prog_flow.html">Program Flow</a></li> +</ul> +</li> <li class="toctree-l1"><a class="reference internal" href="user_guide.html">User Guide</a></li> <li class="toctree-l1"><a class="reference internal" href="api.html">Auto Generated Documentation</a></li> <li class="toctree-l1"><a class="reference internal" href="support.html">Support</a></li> @@ -159,6 +164,8 @@ <p>Describe structure of flex_extract ….</p> <blockquote> <div>UNDER CONSTRUCTION</div></blockquote> +<div class="toctree-wrapper compound"> +</div> </div> @@ -169,10 +176,10 @@ <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> - <a href="user_guide.html" class="btn btn-neutral float-right" title="User Guide" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + <a href="program_structure/prog_overview.html" class="btn btn-neutral float-right" title="Program Overview" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> - <a href="installation.html" class="btn btn-neutral" title="Installation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + <a href="installation/test_install.html" class="btn btn-neutral" title="Installation test" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> </div> diff --git a/documentation/Sphinx/build/html/program_structure/prog_components.html b/documentation/Sphinx/build/html/program_structure/prog_components.html new file mode 100644 index 0000000..52ecea2 --- /dev/null +++ b/documentation/Sphinx/build/html/program_structure/prog_components.html @@ -0,0 +1,236 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Program Components — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Program Flow" href="prog_flow.html" /> + <link rel="prev" title="Program Overview" href="prog_overview.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../program_structure.html">Program Structure</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="prog_overview.html">Program Overview</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Program Components</a></li> +<li class="toctree-l2"><a class="reference internal" href="prog_flow.html">Program Flow</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../program_structure.html">Program Structure</a> »</li> + + <li>Program Components</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/program_structure/prog_components.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="program-components"> +<h1>Program Components<a class="headerlink" href="#program-components" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="prog_flow.html" class="btn btn-neutral float-right" title="Program Flow" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="prog_overview.html" class="btn btn-neutral" title="Program Overview" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/program_structure/prog_flow.html b/documentation/Sphinx/build/html/program_structure/prog_flow.html new file mode 100644 index 0000000..04ccdef --- /dev/null +++ b/documentation/Sphinx/build/html/program_structure/prog_flow.html @@ -0,0 +1,236 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Program Flow — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="User Guide" href="../user_guide.html" /> + <link rel="prev" title="Program Components" href="prog_components.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../program_structure.html">Program Structure</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="prog_overview.html">Program Overview</a></li> +<li class="toctree-l2"><a class="reference internal" href="prog_components.html">Program Components</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Program Flow</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../program_structure.html">Program Structure</a> »</li> + + <li>Program Flow</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/program_structure/prog_flow.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="program-flow"> +<h1>Program Flow<a class="headerlink" href="#program-flow" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="../user_guide.html" class="btn btn-neutral float-right" title="User Guide" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="prog_components.html" class="btn btn-neutral" title="Program Components" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/program_structure/prog_overview.html b/documentation/Sphinx/build/html/program_structure/prog_overview.html new file mode 100644 index 0000000..8631b1c --- /dev/null +++ b/documentation/Sphinx/build/html/program_structure/prog_overview.html @@ -0,0 +1,236 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Program Overview — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Program Components" href="prog_components.html" /> + <link rel="prev" title="Program Structure" href="../program_structure.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../program_structure.html">Program Structure</a><ul class="current"> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Program Overview</a></li> +<li class="toctree-l2"><a class="reference internal" href="prog_components.html">Program Components</a></li> +<li class="toctree-l2"><a class="reference internal" href="prog_flow.html">Program Flow</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../program_structure.html">Program Structure</a> »</li> + + <li>Program Overview</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/program_structure/prog_overview.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="program-overview"> +<h1>Program Overview<a class="headerlink" href="#program-overview" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="prog_components.html" class="btn btn-neutral float-right" title="Program Components" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="../program_structure.html" class="btn btn-neutral" title="Program Structure" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/py-modindex.html b/documentation/Sphinx/build/html/py-modindex.html index 33eec2d..cad8060 100644 --- a/documentation/Sphinx/build/html/py-modindex.html +++ b/documentation/Sphinx/build/html/py-modindex.html @@ -159,11 +159,28 @@ <h1>Python Module Index</h1> <div class="modindex-jumpbox"> - <a href="#cap-d"><strong>d</strong></a> + <a href="#cap-c"><strong>c</strong></a> | + <a href="#cap-d"><strong>d</strong></a> | + <a href="#cap-e"><strong>e</strong></a> | + <a href="#cap-g"><strong>g</strong></a> | + <a href="#cap-i"><strong>i</strong></a> | + <a href="#cap-m"><strong>m</strong></a> | + <a href="#cap-p"><strong>p</strong></a> | + <a href="#cap-s"><strong>s</strong></a> | + <a href="#cap-t"><strong>t</strong></a> | + <a href="#cap-u"><strong>u</strong></a> </div> <table class="indextable modindextable"> <tr class="pcap"><td></td><td> </td><td></td></tr> + <tr class="cap" id="cap-c"><td></td><td> + <strong>c</strong></td><td></td></tr> + <tr> + <td></td> + <td> + <a href="api.html#module-ControlFile"><code class="xref">ControlFile</code></a></td><td> + <em></em></td></tr> + <tr class="pcap"><td></td><td> </td><td></td></tr> <tr class="cap" id="cap-d"><td></td><td> <strong>d</strong></td><td></td></tr> <tr> @@ -171,6 +188,75 @@ <td> <a href="api.html#module-disaggregation"><code class="xref">disaggregation</code></a></td><td> <em></em></td></tr> + <tr class="pcap"><td></td><td> </td><td></td></tr> + <tr class="cap" id="cap-e"><td></td><td> + <strong>e</strong></td><td></td></tr> + <tr> + <td></td> + <td> + <a href="api.html#module-EcFlexpart"><code class="xref">EcFlexpart</code></a></td><td> + <em></em></td></tr> + <tr class="pcap"><td></td><td> </td><td></td></tr> + <tr class="cap" id="cap-g"><td></td><td> + <strong>g</strong></td><td></td></tr> + <tr> + <td></td> + <td> + <a href="api.html#module-get_mars_data"><code class="xref">get_mars_data</code></a></td><td> + <em></em></td></tr> + <tr> + <td></td> + <td> + <a href="api.html#module-GribTools"><code class="xref">GribTools</code></a></td><td> + <em></em></td></tr> + <tr class="pcap"><td></td><td> </td><td></td></tr> + <tr class="cap" id="cap-i"><td></td><td> + <strong>i</strong></td><td></td></tr> + <tr> + <td></td> + <td> + <a href="api.html#module-install"><code class="xref">install</code></a></td><td> + <em></em></td></tr> + <tr class="pcap"><td></td><td> </td><td></td></tr> + <tr class="cap" id="cap-m"><td></td><td> + <strong>m</strong></td><td></td></tr> + <tr> + <td></td> + <td> + <a href="api.html#module-MarsRetrieval"><code class="xref">MarsRetrieval</code></a></td><td> + <em></em></td></tr> + <tr class="pcap"><td></td><td> </td><td></td></tr> + <tr class="cap" id="cap-p"><td></td><td> + <strong>p</strong></td><td></td></tr> + <tr> + <td></td> + <td> + <a href="api.html#module-prepare_flexpart"><code class="xref">prepare_flexpart</code></a></td><td> + <em></em></td></tr> + <tr class="pcap"><td></td><td> </td><td></td></tr> + <tr class="cap" id="cap-s"><td></td><td> + <strong>s</strong></td><td></td></tr> + <tr> + <td></td> + <td> + <a href="api.html#module-submit"><code class="xref">submit</code></a></td><td> + <em></em></td></tr> + <tr class="pcap"><td></td><td> </td><td></td></tr> + <tr class="cap" id="cap-t"><td></td><td> + <strong>t</strong></td><td></td></tr> + <tr> + <td></td> + <td> + <a href="api.html#module-tools"><code class="xref">tools</code></a></td><td> + <em></em></td></tr> + <tr class="pcap"><td></td><td> </td><td></td></tr> + <tr class="cap" id="cap-u"><td></td><td> + <strong>u</strong></td><td></td></tr> + <tr> + <td></td> + <td> + <a href="api.html#module-UioFiles"><code class="xref">UioFiles</code></a></td><td> + <em></em></td></tr> </table> diff --git a/documentation/Sphinx/build/html/requirements.html b/documentation/Sphinx/build/html/requirements.html index e4d7dc8..ad34a46 100644 --- a/documentation/Sphinx/build/html/requirements.html +++ b/documentation/Sphinx/build/html/requirements.html @@ -28,8 +28,8 @@ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> - <link rel="next" title="Installation" href="installation.html" /> - <link rel="prev" title="Welcome to flex_extract’s documentation!" href="index.html" /> + <link rel="next" title="Operating modes" href="oper_modes.html" /> + <link rel="prev" title="Installation" href="installation.html" /> <script src="_static/js/modernizr.min.js"></script> @@ -82,12 +82,19 @@ - <p class="caption"><span class="caption-text">Contents:</span></p> + <p class="caption"><span class="caption-text">Table of Contents:</span></p> <ul class="current"> -<li class="toctree-l1 current"><a class="current reference internal" href="#">Requirements</a></li> -<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li> -<li class="toctree-l1"><a class="reference internal" href="usage.html">Usage</a></li> -<li class="toctree-l1"><a class="reference internal" href="API.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="downloads.html">Downloads</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="installation.html">Installation</a><ul class="current"> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Requirements</a></li> +<li class="toctree-l2"><a class="reference internal" href="oper_modes.html">Operating modes</a></li> +<li class="toctree-l2"><a class="reference internal" href="test_install.html">Installation test</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="support.html">Support</a></li> </ul> @@ -133,6 +140,8 @@ <li><a href="index.html">Docs</a> »</li> + <li><a href="installation.html">Installation</a> »</li> + <li>Requirements</li> @@ -154,7 +163,6 @@ <div class="section" id="requirements"> <h1>Requirements<a class="headerlink" href="#requirements" title="Permalink to this headline">¶</a></h1> -<p>Describe the requirements to use flex_extract ….</p> <blockquote> <div>UNDER CONSTRUCTION</div></blockquote> </div> @@ -167,10 +175,10 @@ <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> - <a href="installation.html" class="btn btn-neutral float-right" title="Installation" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + <a href="oper_modes.html" class="btn btn-neutral float-right" title="Operating modes" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> - <a href="index.html" class="btn btn-neutral" title="Welcome to flex_extract’s documentation!" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + <a href="installation.html" class="btn btn-neutral" title="Installation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> </div> diff --git a/documentation/Sphinx/build/html/searchindex.js b/documentation/Sphinx/build/html/searchindex.js index 058d757..20080a1 100644 --- a/documentation/Sphinx/build/html/searchindex.js +++ b/documentation/Sphinx/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["api","downloads","index","installation","program_structure","requirements","support","user_guide"],envversion:54,filenames:["api.rst","downloads.rst","index.rst","installation.rst","program_structure.rst","requirements.rst","support.rst","user_guide.rst"],objects:{"":{disaggregation:[0,0,0,"-"]},disaggregation:{IA3:[0,1,1,""],dapoly:[0,1,1,""],darain:[0,1,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:function"},terms:{"class":[],"default":[],"float":0,"function":[],"int":[],"new":0,"return":0,"short":[],For:0,Its:0,The:0,Uses:[],abcd:[],about:[],abov:[],accumlu:0,accumul:0,adapt:0,adaptaion:[],adding:0,addit:0,addition:0,addpar:[],address:[],advanc:0,afterward:0,algorithm:0,alist:0,all:0,alreadi:[],also:[],ann:0,anoth:[],api:2,appli:0,applic:0,arbitrari:[],arcad:[],arg:[],argument:[],argumentpars:[],arrai:0,array_t1:0,array_t2:0,array_t3:0,array_t4:0,articl:0,assign:[],associ:0,asteroid:[],attribut:0,author:0,auto:2,ball:2,base:0,beck:0,befor:[],book:[],box:0,bug:2,call:[],can:[],central:0,chang:2,changehistori:[],charact:[],check:[],clean_up:[],code:[],coin:[],collect:[],combin:[],command:[],commandlin:[],common:0,complet:0,compon:2,concaten:[],concatenate_sign:[],conserv:0,construct:[1,2,3,4,5,6,7],contain:[],content:2,control:2,controlfil:[],convert:[],copi:0,copyright:0,creat:[],creativ:0,creativecommon:0,cubic:0,dapoli:0,darain:0,data:0,date:[],deaccumul:0,decompos:[],depend:[],describ:[1,3,4,5,6,7],descript:[],destin:[],develop:0,dict:[],dictionari:[],differ:2,dimens:0,dimension:0,directori:[],disaggreg:0,disaggregationreg:[],dispers:0,displai:[],doc:[],doe:[],done:0,download:2,draw:[],dure:0,each:0,ecaccess:[],ecd:[],ecflexpart:[],ecgid:[],ecmwf:0,ecmwv:[],ecuid:[],element:[],email:[],empti:[],env:[],environ:[],equal:0,error:[],exampl:[],execut:[],exist:[],exit:[],extens:0,fail:[],faq:2,field:0,file:[],filenam:[],filepath:[],filter:0,flex_extract:[1,3,4,5,7],flexpart:0,flow:2,flux:0,format:[],fortran:0,from:0,full:[],gatewai:[],gener:2,geometr:0,geoscientif:0,get:[],get_cmdline_argu:[],get_list_as_str:[],git:2,github:[],give:[],given:[],grib:[],grid:0,group:[],guid:2,haimberg:0,handl:[],have:0,help:[],here:2,histori:2,hittmeir:0,horizont:0,how:2,http:0,ia3:0,ids:[],improv:0,includ:[],index:2,inform:0,init128:[],input:0,inputdir:[],instal:2,instanc:[],instead:[],integ:[],integr:0,intermedi:[],intern:0,interpol:0,interv:0,ipar:[],issu:2,itself:[],jame:0,job:[],jobfil:[],jobnam:[],june:0,just:[],keep:0,kei:[],keyword:[],known:2,kwd:[],lagrangian:0,learn:[],length:0,leopold:0,letter:0,licens:[0,2],line:[],linear:0,linux:[],list:[0,2],list_obj:[],mac:[],mail:2,make_dir:[],march:0,mean:0,mention:[],messag:[],method:[],might:[],migrat:0,mode:2,model:0,modifi:0,modul:2,monoton:0,more:0,mountain:0,my_error:[],name:[],neg:0,nfield:0,non:0,none:[],none_or_int:[],none_or_str:[],normal_exit:[],note:[],noth:[],notif:[],notifi:[],novemb:0,number:[],obj:[],one:2,onli:[],open:[],oper:2,option:[1,6],org:0,origin:0,originla:[],other:[],otherwis:[],output:0,overview:2,page:2,par:[],paramet:0,particl:0,pass:[],path:[],petra:0,philipp:0,point:0,polynomi:0,posit:[],primit:[],print:[],problem:[],process:3,prod:[],product:[],program:2,properti:0,pure:[],put:2,put_file_to_ecserv:[],python:0,quantiti:0,queue:[],quick:[],rainfal:0,rang:[],raw:0,rcode:[],read:[],read_ecenv:[],reason:[],reconstruct:0,refer:0,releas:[],remov:[],repeat:[],replac:[],repositori:2,repres:[],requir:2,rest:[],result:[],sabin:0,sampl:0,scheme:0,script:[],search:2,second:[],see:0,seibert:0,send:0,sent:[],sepeart:[],seri:0,server:[],should:[],silent_remov:[],sinc:[],singl:[],size:[],smasher:[],softwar:[],solut:0,sourc:0,specif:[],specifi:[],sprite:[],stop:[],store:[],str_of_list:[],string:[],structur:2,subgrid:0,submit:[],submit_job_to_ecserv:[],success:[],support:2,system:2,tabl:[],table128:[],taken:[],tar:2,target:[],templat:2,test:2,text:2,thei:[],them:[],thi:0,three:0,ticket:2,time:0,timeseri:0,timespan:0,to_param_id:[],tool:[],transform:[],trigger:[],tupl:[],two:0,type:0,under:[0,1,3,4,5,6,7],univers:0,usa:0,usag:[],use:[2,5],used:0,user:2,using:[0,7],valu:0,variabl:[],vienna:0,view:0,visit:0,warn:[],websit:[],were:[],where:[],which:[0,2],whole:[],wiki:[],wil:[],window:[],within:0,without:[],word:[],work:0,yield:[]},titles:["Auto Generated Documentation","Downloads","Welcome to flex_extract\u2019s documentation!","Installation","Program Structure","Requirements","Support","User Guide"],titleterms:{auto:0,document:[0,2],download:1,flex_extract:2,gener:0,guid:7,indic:2,instal:3,program:4,pure:[],requir:5,rest:[],structur:4,support:6,tabl:2,usag:[],user:7,welcom:2}}) \ No newline at end of file +Search.setIndex({docnames:["api","downloads","downloads/git_repo","downloads/history_changes","downloads/tar_balls","index","installation","installation/oper_modes","installation/requirements","installation/test_install","program_structure","program_structure/prog_components","program_structure/prog_flow","program_structure/prog_overview","support","support/faq","support/known_bugs_issues","support/mailing_list","support/ticket_system","user_guide","user_guide/control_templates","user_guide/how_to"],envversion:54,filenames:["api.rst","downloads.rst","downloads/git_repo.rst","downloads/history_changes.rst","downloads/tar_balls.rst","index.rst","installation.rst","installation/oper_modes.rst","installation/requirements.rst","installation/test_install.rst","program_structure.rst","program_structure/prog_components.rst","program_structure/prog_flow.rst","program_structure/prog_overview.rst","support.rst","support/faq.rst","support/known_bugs_issues.rst","support/mailing_list.rst","support/ticket_system.rst","user_guide.rst","user_guide/control_templates.rst","user_guide/how_to.rst"],objects:{"":{ControlFile:[0,0,0,"-"],EcFlexpart:[0,0,0,"-"],GribTools:[0,0,0,"-"],MarsRetrieval:[0,0,0,"-"],UioFiles:[0,0,0,"-"],disaggregation:[0,0,0,"-"],get_mars_data:[0,0,0,"-"],install:[0,0,0,"-"],prepare_flexpart:[0,0,0,"-"],submit:[0,0,0,"-"],tools:[0,0,0,"-"]},"ControlFile.ControlFile":{assign_args_to_control:[0,2,1,""],assign_envs_to_control:[0,2,1,""],check_conditions:[0,2,1,""],check_install_conditions:[0,2,1,""],to_list:[0,2,1,""]},"EcFlexpart.EcFlexpart":{create:[0,2,1,""],deacc_fluxes:[0,2,1,""],prepare_fp_files:[0,2,1,""],process_output:[0,2,1,""],retrieve:[0,2,1,""],write_namelist:[0,2,1,""]},"GribTools.GribTools":{copy:[0,2,1,""],get_keys:[0,2,1,""],index:[0,2,1,""],set_keys:[0,2,1,""]},"MarsRetrieval.MarsRetrieval":{data_retrieve:[0,2,1,""],display_info:[0,2,1,""],print_info:[0,2,1,""],print_infodata_csv:[0,2,1,""]},"UioFiles.UioFiles":{delete_files:[0,2,1,""]},ControlFile:{ControlFile:[0,1,1,""]},EcFlexpart:{EcFlexpart:[0,1,1,""]},GribTools:{GribTools:[0,1,1,""]},MarsRetrieval:{MarsRetrieval:[0,1,1,""]},UioFiles:{UioFiles:[0,1,1,""]},disaggregation:{IA3:[0,3,1,""],dapoly:[0,3,1,""],darain:[0,3,1,""]},get_mars_data:{do_retrievement:[0,3,1,""],get_mars_data:[0,3,1,""],main:[0,3,1,""]},install:{delete_convert_build:[0,3,1,""],get_install_cmdline_arguments:[0,3,1,""],install_via_gateway:[0,3,1,""],main:[0,3,1,""],make_convert_build:[0,3,1,""],mk_compilejob:[0,3,1,""],mk_env_vars:[0,3,1,""],mk_job_template:[0,3,1,""],mk_tarball:[0,3,1,""],un_tarball:[0,3,1,""]},prepare_flexpart:{main:[0,3,1,""],prepare_flexpart:[0,3,1,""]},submit:{main:[0,3,1,""],submit:[0,3,1,""]},tools:{clean_up:[0,3,1,""],get_cmdline_arguments:[0,3,1,""],get_list_as_string:[0,3,1,""],init128:[0,3,1,""],make_dir:[0,3,1,""],my_error:[0,3,1,""],none_or_int:[0,3,1,""],none_or_str:[0,3,1,""],normal_exit:[0,3,1,""],product:[0,3,1,""],put_file_to_ecserver:[0,3,1,""],read_ecenv:[0,3,1,""],silent_remove:[0,3,1,""],submit_job_to_ecserver:[0,3,1,""],to_param_id:[0,3,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},terms:{"boolean":0,"class":5,"default":0,"final":0,"float":0,"function":0,"int":0,"new":0,"public":0,"return":0,"short":0,"switch":0,"true":0,For:0,Its:0,The:0,Then:0,Used:0,Uses:0,_expand:0,_templat:0,abcd:0,about:0,abov:0,access:0,accumlu:0,accumul:0,accuraci:0,actual:0,adapt:0,adaptaion:[],add:0,adding:0,addit:0,addition:0,addpar:0,address:0,advanc:0,afterward:0,algorithm:0,alist:0,all:[0,5],alpabet:0,alreadi:0,also:0,ann:0,anoth:0,api:[0,5],appli:0,applic:0,arbitrari:0,arcad:[],archiv:5,area:0,arg:0,argument:0,argumentpars:[],arrai:0,array_t1:0,array_t2:0,array_t3:0,array_t4:0,articl:0,assign:0,assign_args_to_control:0,assign_envs_to_control:0,associ:0,asteroid:[],atmospher:5,attribut:0,author:0,auto:5,ball:5,base:0,beck:0,befor:0,binari:0,book:[],box:0,bug:5,build:0,call:0,can:0,cca:0,centr:5,central:0,chang:5,changehistori:[],charact:0,charg:5,check:0,check_condit:0,check_install_condit:0,chunk:0,clean:0,clean_up:0,code:0,coin:[],collect:0,combin:0,command:0,commandlin:0,common:0,compil:0,complet:0,compon:5,concaten:0,concatenate_sign:0,condit:0,connect:0,conserv:0,construct:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],contain:0,content:[0,5],control:[0,5],controlfil:5,convent:0,convers:0,convert2:0,convert:0,copi:0,copyright:0,correctli:0,correspond:0,coupl:0,creat:0,creativ:0,creativecommon:0,csv:0,cubic:0,current:0,dapoli:0,darain:0,data:0,data_retriev:0,dataset:0,date:0,datechunk:0,datetim:0,deacc_flux:0,deaccumul:0,debug:0,decid:0,decis:0,decompos:0,defin:0,delet:0,delete_convert_build:0,delete_fil:0,delta_t:0,depend:0,describ:[1,10],descript:0,destin:0,detail:0,develop:0,dict:[],dictionari:0,differ:[0,5],dimens:0,dimension:0,directli:0,directori:0,disaggreg:5,disaggregationreg:[],dispers:0,displai:0,display_info:0,divid:0,do_retriev:0,doc:[],doe:0,done:0,download:5,draw:[],dure:0,each:0,ecaccess:0,ecd:0,ecflexpart:5,ecgat:0,ecgid:0,ecmwf:[0,5],ecmwf_env:0,ecmwfdatadir:0,ecmwfdataserv:0,ecmwfservic:0,ecmwv:[],ecstorag:0,ectran:0,ecuid:0,element:0,email:0,empti:0,end:0,entri:0,env:0,environ:0,environment:0,equal:0,error:0,european:5,everyth:0,exampl:0,except:0,execut:0,exedir:0,exist:0,exit:0,express:0,expver:0,extens:0,extra:0,extract:0,fail:0,fals:0,faq:5,field:[0,5],file:[0,5],filemod:0,filenam:0,filename_in:0,filepath:0,filter:0,flex_extract:[0,1,10],flexpart:[0,5],flexpart_root_script:0,flextra:5,flow:5,flux:0,follow:0,forecast:5,format:0,fort:0,fortran:0,found:0,fp_root:0,free:5,from:[0,5],fromfil:0,full:0,gate:0,gatewai:0,gaussian:0,gener:5,geometr:0,geoscientif:0,get:0,get_cmdline_argu:0,get_install_cmdline_argu:0,get_kei:0,get_list_as_str:0,get_mars_data:5,git:5,github:[],give:0,given:0,goe:0,going:0,grib2:0,grib:0,gribtool:5,grid:0,group:0,guid:5,haimberg:0,handl:0,has:0,have:0,help:[],here:[0,5],histori:5,hittmeir:0,horizont:0,hour:0,how:5,http:0,ia3:0,identif:0,identificationkeyword:0,ids:0,idx:0,iid:0,improv:0,includ:0,index:[0,5],index_fil:0,index_kei:0,indic:0,inform:0,init128:0,initialis:0,input:[0,5],inputdir:0,inputfil:0,instal:5,install_via_gatewai:0,instanc:0,instead:0,instruct:0,integ:0,integr:0,intermedi:0,intern:0,interpol:0,interv:0,ipar:0,issu:5,iter:0,its:0,itself:0,jame:0,job:0,jobfil:0,jobnam:0,jtemplat:0,june:0,just:0,keep:0,kei:0,keynam:0,keyvalu:0,keyword:0,known:5,kwd:0,lagrangian:0,learn:[],length:0,leopold:0,letter:0,levelist:0,levtyp:0,librari:5,licens:[0,5],line:0,linear:0,linux:[],list:[0,5],list_obj:0,local:0,mac:[],machin:0,made:0,mail:[0,5],main:0,make_convert_build:0,make_dir:0,makefil:0,manipul:0,mar:[0,5],march:0,marsclass:0,marsretriev:5,matter:0,maxb:0,maxim:0,maxl:0,mdpdeta:0,mean:0,medium:5,meet:0,member:0,mention:0,messag:0,meta:0,metadiff:0,metapar:0,meteorolog:5,method:0,mgauss:0,might:0,migrat:0,mk_compilejob:0,mk_env_var:0,mk_job_templ:0,mk_tarbal:0,mlevel:0,mlevelist:0,mnauf:0,mod:0,mode:[0,5],model:[0,5],modif:0,modifi:0,modul:5,momega:0,momegadiff:0,monoton:0,more:0,mountain:0,move:0,msmooth:0,my_error:0,name:0,namelist:0,namespac:0,necessari:0,need:0,neg:0,nfield:0,non:0,none:0,none_or_int:0,none_or_str:0,normal_exit:0,note:[],noth:[],notif:0,notifi:0,novemb:0,number:0,obj:[],object:0,one:[0,5],onli:0,open:[0,5],oper:5,option:[0,1],order:0,org:0,origin:0,originla:[],other:0,otherwis:0,out:0,output:0,over:0,overview:5,overwrit:0,page:5,par:0,param:0,paramet:0,parameternam:0,parti:5,particl:0,pass:0,path:0,pattern:0,per:0,perform:0,period:0,petra:0,philipp:0,point:0,polynomi:0,porgram:5,posit:0,postprocess:0,ppid:0,prepar:0,prepare_flexpart:5,prepare_fp_fil:0,primit:[],print:0,print_info:0,print_infodata_csv:0,problem:0,process:0,process_output:0,prod:0,product:0,program:[0,5],properli:0,properti:0,provid:0,pure:[],put:[0,5],put_file_to_ecserv:0,python:0,quantiti:0,queue:0,quick:[],rainfal:0,rang:[0,5],raw:0,rcode:0,read:0,read_ecenv:0,readi:0,reason:0,reconstruct:0,refer:0,regular:0,releas:[],relev:0,remot:0,remov:0,repeat:0,replac:[],report:0,repositori:5,repr:0,repres:0,request:0,request_numb:0,requir:5,resol:0,rest:0,result:0,retriev:[0,5],return_list:0,rla0:0,rla1:0,rlo0:0,rlo1:0,root:0,sabin:0,same:0,sampl:0,scheme:0,script:0,search:5,second:5,see:0,seibert:0,select:0,selectwher:0,send:0,sent:0,sepeart:0,seper:0,seri:0,server:[0,5],set:0,set_kei:0,shell:0,should:0,silent_remov:0,simul:0,sinc:0,singl:0,size:[],smaller:0,smasher:[],softwar:[0,5],solut:0,some:[],sort:0,sourc:[0,5],specif:0,specifi:0,sprite:[],src_path:0,standard:0,start:0,state:0,statement:0,step:0,steprang:0,stop:0,storag:0,store:0,str_of_list:0,stream:0,stress:0,strict:0,string:0,structur:5,sub:0,subgrid:0,submiss:0,submit:5,submit_job_to_ecserv:0,subprocess:0,success:0,support:5,surfac:0,system:5,tabl:0,table128:0,take:0,taken:0,tar:[0,5],tarbal:0,tarball_path:0,target:0,temp:0,templat:[0,5],temporari:0,test:[0,5],text:5,thei:0,them:0,thi:0,those:0,three:0,through:0,ticket:5,time:0,timeseri:0,timespan:0,to_list:0,to_param_id:0,tool:5,transfer:0,transform:0,transport:5,trigger:0,tupl:0,two:0,type:0,udoc:0,uiofil:5,un_tarbal:0,under:[0,1,2,3,4,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],uniqu:0,univers:0,usa:0,usag:[],use:5,used:[0,5],user:0,using:0,util:0,valu:0,variabl:0,version:0,via:0,vienna:0,view:0,visit:0,warn:0,weather:5,web:0,websit:0,well:0,were:0,what:[],where:0,wherekeynam:0,wherekeyvalu:0,which:[0,5],whole:0,wiki:0,wil:0,window:[],within:[0,5],without:0,word:0,work:0,write:0,write_namelist:0,written:0,yield:0,yyyymmdd:0},titles:["Auto Generated Documentation","Downloads","Git Repository","History of Changes","Download tar-balls","Welcome to flex_extract\u2019s user documentation!","Installation","Operating modes","Requirements","Installation test","Program Structure","Program Components","Program Flow","Program Overview","Support","FAQ - Frequently asked questions","Known Bugs and Issues","Mailing Lists","Ticket System","User Guide","CONTROL-file templates","How to use flex_extract"],titleterms:{"class":0,ask:15,auto:0,ball:4,bug:16,chang:3,compon:11,content:[],control:20,controlfil:0,disaggreg:0,document:[0,5],download:[1,4],ecflexpart:0,faq:15,file:20,flex_extract:[5,21],flow:12,frequent:15,gener:0,get_mars_data:0,git:2,gribtool:0,guid:19,histori:3,how:21,indic:5,instal:[0,6,9],issu:16,known:16,list:17,mail:17,marsretriev:0,mode:7,modul:0,oper:7,overview:13,porgram:0,prepare_flexpart:0,program:[10,11,12,13],pure:[],question:15,repositori:2,requir:8,rest:[],structur:10,submit:0,support:14,system:18,tabl:5,tar:4,templat:20,test:9,ticket:18,tool:0,uiofil:0,usag:[],use:21,user:[5,19],welcom:5}}) \ No newline at end of file diff --git a/documentation/Sphinx/build/html/support.html b/documentation/Sphinx/build/html/support.html index ef8c635..b08af70 100644 --- a/documentation/Sphinx/build/html/support.html +++ b/documentation/Sphinx/build/html/support.html @@ -28,6 +28,7 @@ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> + <link rel="next" title="Ticket System" href="support/ticket_system.html" /> <link rel="prev" title="Auto Generated Documentation" href="api.html" /> @@ -88,7 +89,13 @@ <li class="toctree-l1"><a class="reference internal" href="program_structure.html">Program Structure</a></li> <li class="toctree-l1"><a class="reference internal" href="user_guide.html">User Guide</a></li> <li class="toctree-l1"><a class="reference internal" href="api.html">Auto Generated Documentation</a></li> -<li class="toctree-l1 current"><a class="current reference internal" href="#">Support</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Support</a><ul> +<li class="toctree-l2"><a class="reference internal" href="support/ticket_system.html">Ticket System</a></li> +<li class="toctree-l2"><a class="reference internal" href="support/mailing_list.html">Mailing Lists</a></li> +<li class="toctree-l2"><a class="reference internal" href="support/known_bugs_issues.html">Known Bugs and Issues</a></li> +<li class="toctree-l2"><a class="reference internal" href="support/faq.html">FAQ - Frequently asked questions</a></li> +</ul> +</li> </ul> @@ -155,9 +162,10 @@ <div class="section" id="support"> <h1>Support<a class="headerlink" href="#support" title="Permalink to this headline">¶</a></h1> -<p>Describe support options ….</p> <blockquote> <div>UNDER CONSTRUCTION</div></blockquote> +<div class="toctree-wrapper compound"> +</div> </div> @@ -168,6 +176,8 @@ <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + <a href="support/ticket_system.html" class="btn btn-neutral float-right" title="Ticket System" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + <a href="api.html" class="btn btn-neutral" title="Auto Generated Documentation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> diff --git a/documentation/Sphinx/build/html/support/faq.html b/documentation/Sphinx/build/html/support/faq.html new file mode 100644 index 0000000..a6b7efb --- /dev/null +++ b/documentation/Sphinx/build/html/support/faq.html @@ -0,0 +1,234 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>FAQ - Frequently asked questions — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="prev" title="Known Bugs and Issues" href="known_bugs_issues.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../support.html">Support</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="ticket_system.html">Ticket System</a></li> +<li class="toctree-l2"><a class="reference internal" href="mailing_list.html">Mailing Lists</a></li> +<li class="toctree-l2"><a class="reference internal" href="known_bugs_issues.html">Known Bugs and Issues</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">FAQ - Frequently asked questions</a></li> +</ul> +</li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../support.html">Support</a> »</li> + + <li>FAQ - Frequently asked questions</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/support/faq.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="faq-frequently-asked-questions"> +<h1>FAQ - Frequently asked questions<a class="headerlink" href="#faq-frequently-asked-questions" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + + <a href="known_bugs_issues.html" class="btn btn-neutral" title="Known Bugs and Issues" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/support/known_bugs_issues.html b/documentation/Sphinx/build/html/support/known_bugs_issues.html new file mode 100644 index 0000000..204adcc --- /dev/null +++ b/documentation/Sphinx/build/html/support/known_bugs_issues.html @@ -0,0 +1,237 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Known Bugs and Issues — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="FAQ - Frequently asked questions" href="faq.html" /> + <link rel="prev" title="Mailing Lists" href="mailing_list.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../support.html">Support</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="ticket_system.html">Ticket System</a></li> +<li class="toctree-l2"><a class="reference internal" href="mailing_list.html">Mailing Lists</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Known Bugs and Issues</a></li> +<li class="toctree-l2"><a class="reference internal" href="faq.html">FAQ - Frequently asked questions</a></li> +</ul> +</li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../support.html">Support</a> »</li> + + <li>Known Bugs and Issues</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/support/known_bugs_issues.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="known-bugs-and-issues"> +<h1>Known Bugs and Issues<a class="headerlink" href="#known-bugs-and-issues" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="faq.html" class="btn btn-neutral float-right" title="FAQ - Frequently asked questions" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="mailing_list.html" class="btn btn-neutral" title="Mailing Lists" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/support/mailing_list.html b/documentation/Sphinx/build/html/support/mailing_list.html new file mode 100644 index 0000000..b3b2790 --- /dev/null +++ b/documentation/Sphinx/build/html/support/mailing_list.html @@ -0,0 +1,237 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Mailing Lists — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Known Bugs and Issues" href="known_bugs_issues.html" /> + <link rel="prev" title="Ticket System" href="ticket_system.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../support.html">Support</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="ticket_system.html">Ticket System</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Mailing Lists</a></li> +<li class="toctree-l2"><a class="reference internal" href="known_bugs_issues.html">Known Bugs and Issues</a></li> +<li class="toctree-l2"><a class="reference internal" href="faq.html">FAQ - Frequently asked questions</a></li> +</ul> +</li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../support.html">Support</a> »</li> + + <li>Mailing Lists</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/support/mailing_list.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="mailing-lists"> +<h1>Mailing Lists<a class="headerlink" href="#mailing-lists" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="known_bugs_issues.html" class="btn btn-neutral float-right" title="Known Bugs and Issues" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="ticket_system.html" class="btn btn-neutral" title="Ticket System" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/support/ticket_system.html b/documentation/Sphinx/build/html/support/ticket_system.html new file mode 100644 index 0000000..e0cdb95 --- /dev/null +++ b/documentation/Sphinx/build/html/support/ticket_system.html @@ -0,0 +1,237 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Ticket System — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Mailing Lists" href="mailing_list.html" /> + <link rel="prev" title="Support" href="../support.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../support.html">Support</a><ul class="current"> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Ticket System</a></li> +<li class="toctree-l2"><a class="reference internal" href="mailing_list.html">Mailing Lists</a></li> +<li class="toctree-l2"><a class="reference internal" href="known_bugs_issues.html">Known Bugs and Issues</a></li> +<li class="toctree-l2"><a class="reference internal" href="faq.html">FAQ - Frequently asked questions</a></li> +</ul> +</li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../support.html">Support</a> »</li> + + <li>Ticket System</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/support/ticket_system.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="ticket-system"> +<h1>Ticket System<a class="headerlink" href="#ticket-system" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="mailing_list.html" class="btn btn-neutral float-right" title="Mailing Lists" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="../support.html" class="btn btn-neutral" title="Support" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/test_install.html b/documentation/Sphinx/build/html/test_install.html new file mode 100644 index 0000000..a5f872f --- /dev/null +++ b/documentation/Sphinx/build/html/test_install.html @@ -0,0 +1,236 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Installation test — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="genindex.html" /> + <link rel="search" title="Search" href="search.html" /> + <link rel="next" title="Program Structure" href="program_structure.html" /> + <link rel="prev" title="Operating modes" href="oper_modes.html" /> + + + <script src="_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="downloads.html">Downloads</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="installation.html">Installation</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="requirements.html">Requirements</a></li> +<li class="toctree-l2"><a class="reference internal" href="oper_modes.html">Operating modes</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Installation test</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="program_structure.html">Program Structure</a></li> +<li class="toctree-l1"><a class="reference internal" href="user_guide.html">User Guide</a></li> +<li class="toctree-l1"><a class="reference internal" href="api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="index.html">Docs</a> »</li> + + <li><a href="installation.html">Installation</a> »</li> + + <li>Installation test</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="_sources/test_install.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="installation-test"> +<h1>Installation test<a class="headerlink" href="#installation-test" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="program_structure.html" class="btn btn-neutral float-right" title="Program Structure" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="oper_modes.html" class="btn btn-neutral" title="Operating modes" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'./', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/underscore.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/user_guide.html b/documentation/Sphinx/build/html/user_guide.html index d09ea88..36e084e 100644 --- a/documentation/Sphinx/build/html/user_guide.html +++ b/documentation/Sphinx/build/html/user_guide.html @@ -28,8 +28,8 @@ <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> - <link rel="next" title="Auto Generated Documentation" href="api.html" /> - <link rel="prev" title="Program Structure" href="program_structure.html" /> + <link rel="next" title="How to use flex_extract" href="user_guide/how_to.html" /> + <link rel="prev" title="Program Flow" href="program_structure/prog_flow.html" /> <script src="_static/js/modernizr.min.js"></script> @@ -87,7 +87,11 @@ <li class="toctree-l1"><a class="reference internal" href="downloads.html">Downloads</a></li> <li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="program_structure.html">Program Structure</a></li> -<li class="toctree-l1 current"><a class="current reference internal" href="#">User Guide</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">User Guide</a><ul> +<li class="toctree-l2"><a class="reference internal" href="user_guide/how_to.html">How to use flex_extract</a></li> +<li class="toctree-l2"><a class="reference internal" href="user_guide/control_templates.html">CONTROL-file templates</a></li> +</ul> +</li> <li class="toctree-l1"><a class="reference internal" href="api.html">Auto Generated Documentation</a></li> <li class="toctree-l1"><a class="reference internal" href="support.html">Support</a></li> </ul> @@ -156,9 +160,10 @@ <div class="section" id="user-guide"> <h1>User Guide<a class="headerlink" href="#user-guide" title="Permalink to this headline">¶</a></h1> -<p>Describe using flex_extract ….</p> <blockquote> <div>UNDER CONSTRUCTION</div></blockquote> +<div class="toctree-wrapper compound"> +</div> </div> @@ -169,10 +174,10 @@ <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> - <a href="api.html" class="btn btn-neutral float-right" title="Auto Generated Documentation" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + <a href="user_guide/how_to.html" class="btn btn-neutral float-right" title="How to use flex_extract" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> - <a href="program_structure.html" class="btn btn-neutral" title="Program Structure" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + <a href="program_structure/prog_flow.html" class="btn btn-neutral" title="Program Flow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> </div> diff --git a/documentation/Sphinx/build/html/user_guide/control_templates.html b/documentation/Sphinx/build/html/user_guide/control_templates.html new file mode 100644 index 0000000..59849f6 --- /dev/null +++ b/documentation/Sphinx/build/html/user_guide/control_templates.html @@ -0,0 +1,235 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>CONTROL-file templates — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="Auto Generated Documentation" href="../api.html" /> + <link rel="prev" title="How to use flex_extract" href="how_to.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../user_guide.html">User Guide</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="how_to.html">How to use flex_extract</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">CONTROL-file templates</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../user_guide.html">User Guide</a> »</li> + + <li>CONTROL-file templates</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/user_guide/control_templates.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="control-file-templates"> +<h1>CONTROL-file templates<a class="headerlink" href="#control-file-templates" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="../api.html" class="btn btn-neutral float-right" title="Auto Generated Documentation" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="how_to.html" class="btn btn-neutral" title="How to use flex_extract" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/build/html/user_guide/how_to.html b/documentation/Sphinx/build/html/user_guide/how_to.html new file mode 100644 index 0000000..fa977d4 --- /dev/null +++ b/documentation/Sphinx/build/html/user_guide/how_to.html @@ -0,0 +1,235 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>How to use flex_extract — flex_extract 7.1 alpha documentation</title> + + + + + + + + + + + + + + + + <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> + <link rel="index" title="Index" href="../genindex.html" /> + <link rel="search" title="Search" href="../search.html" /> + <link rel="next" title="CONTROL-file templates" href="control_templates.html" /> + <link rel="prev" title="User Guide" href="../user_guide.html" /> + + + <script src="../_static/js/modernizr.min.js"></script> + +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search"> + + + + <a href="../index.html" class="icon icon-home"> flex_extract + + + + </a> + + + + + <div class="version"> + 7.1 + </div> + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Table of Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="../downloads.html">Downloads</a></li> +<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../program_structure.html">Program Structure</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="../user_guide.html">User Guide</a><ul class="current"> +<li class="toctree-l2 current"><a class="current reference internal" href="#">How to use flex_extract</a></li> +<li class="toctree-l2"><a class="reference internal" href="control_templates.html">CONTROL-file templates</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="../api.html">Auto Generated Documentation</a></li> +<li class="toctree-l1"><a class="reference internal" href="../support.html">Support</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="../index.html">flex_extract</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="../index.html">Docs</a> »</li> + + <li><a href="../user_guide.html">User Guide</a> »</li> + + <li>How to use flex_extract</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="../_sources/user_guide/how_to.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="how-to-use-flex-extract"> +<h1>How to use flex_extract<a class="headerlink" href="#how-to-use-flex-extract" title="Permalink to this headline">¶</a></h1> +<blockquote> +<div>UNDER CONSTRUCTION</div></blockquote> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="control_templates.html" class="btn btn-neutral float-right" title="CONTROL-file templates" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="../user_guide.html" class="btn btn-neutral" title="User Guide" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2018, Anne Philipp and Leopold Haimberger. + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT:'../', + VERSION:'7.1 alpha', + LANGUAGE:'None', + COLLAPSE_INDEX:false, + FILE_SUFFIX:'.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' + }; + </script> + <script type="text/javascript" src="../_static/jquery.js"></script> + <script type="text/javascript" src="../_static/underscore.js"></script> + <script type="text/javascript" src="../_static/doctools.js"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> + + + + <script type="text/javascript" src="../_static/js/theme.js"></script> + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + +</body> +</html> \ No newline at end of file diff --git a/documentation/Sphinx/source/api.rst b/documentation/Sphinx/source/api.rst index 6c03ff4..5b4acb2 100644 --- a/documentation/Sphinx/source/api.rst +++ b/documentation/Sphinx/source/api.rst @@ -1,5 +1,82 @@ Auto Generated Documentation ============================ +.. contents:: + :local: + +Porgrams +-------- + +install +******* + +.. automodule:: install + :members: + +submit +****** + +.. automodule:: submit + :members: + +Classes +------- + +ControlFile +*********** + +.. automodule:: ControlFile + :members: + +EcFlexpart +********** + +.. automodule:: EcFlexpart + :members: + +GribTools +********* + +.. automodule:: GribTools + :members: + +MarsRetrieval +************* + +.. automodule:: MarsRetrieval + :members: + +UioFiles +******** + +.. automodule:: UioFiles + :members: + + + +Modules +------- + +get_mars_data +************* + +.. automodule:: get_mars_data + :members: + +prepare_flexpart +**************** + +.. automodule:: prepare_flexpart + :members: + +tools +***** + +.. automodule:: tools + :members: + +disaggregation +************** + .. automodule:: disaggregation :members: diff --git a/documentation/Sphinx/source/downloads.rst b/documentation/Sphinx/source/downloads.rst index 42e62df..676a1fe 100644 --- a/documentation/Sphinx/source/downloads.rst +++ b/documentation/Sphinx/source/downloads.rst @@ -3,4 +3,13 @@ Downloads Describe download options of flex_extract .... - UNDER CONSTRUCTION \ No newline at end of file + UNDER CONSTRUCTION + +.. toctree:: + :hidden: + :maxdepth: 2 + + downloads/tar_balls + downloads/git_repo + downloads/history_changes + \ No newline at end of file diff --git a/documentation/Sphinx/source/downloads/git_repo.rst b/documentation/Sphinx/source/downloads/git_repo.rst new file mode 100644 index 0000000..a1f7acf --- /dev/null +++ b/documentation/Sphinx/source/downloads/git_repo.rst @@ -0,0 +1,4 @@ +Git Repository +============== + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/downloads/history_changes.rst b/documentation/Sphinx/source/downloads/history_changes.rst new file mode 100644 index 0000000..763420b --- /dev/null +++ b/documentation/Sphinx/source/downloads/history_changes.rst @@ -0,0 +1,4 @@ +History of Changes +================== + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/downloads/tar_balls.rst b/documentation/Sphinx/source/downloads/tar_balls.rst new file mode 100644 index 0000000..a06dc11 --- /dev/null +++ b/documentation/Sphinx/source/downloads/tar_balls.rst @@ -0,0 +1,4 @@ +Download tar-balls +================== + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/index.rst b/documentation/Sphinx/source/index.rst index 3ca3be9..2ca1ab1 100644 --- a/documentation/Sphinx/source/index.rst +++ b/documentation/Sphinx/source/index.rst @@ -3,8 +3,18 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to flex_extract's documentation! -======================================== +Welcome to flex_extract's user documentation! +============================================= + +flex_extract is a software to retrieve meteorological fields from the European Centre for Medium-Range Weather Forecasts (ECMWF) Mars archive to server as input files for the FLEXTRA/FLEXPART Atmospheric Transport Modelling system. + + +.. The scripts can be 1) executed locally using the ECMWF WebMARS interface, or 2) on the ECMWF member +.. state gateway server or HPC facility using the ecaccess software package. As another option the scripts can 3) +.. also be triggered using ecflow scheduling software used by ECMWF for data dissemination. + +All required second party software and libraries used within flex_extract is open source and free of charge. + .. raw:: html <table style="width:100%;"> @@ -86,7 +96,7 @@ Welcome to flex_extract's documentation! License text put in here! Which one? .. toctree:: - :maxdepth: 2 + :maxdepth: 3 :caption: Table of Contents: downloads diff --git a/documentation/Sphinx/source/installation.rst b/documentation/Sphinx/source/installation.rst index 7e37572..f759bc9 100644 --- a/documentation/Sphinx/source/installation.rst +++ b/documentation/Sphinx/source/installation.rst @@ -1,6 +1,15 @@ Installation ============ - -Describe installation process flex_extract .... - UNDER CONSTRUCTION \ No newline at end of file + UNDER CONSTRUCTION + +.. toctree:: + :hidden: + :maxdepth: 2 + + installation/requirements + installation/oper_modes + installation/test_install + + + \ No newline at end of file diff --git a/documentation/Sphinx/source/installation/oper_modes.rst b/documentation/Sphinx/source/installation/oper_modes.rst new file mode 100644 index 0000000..72e86f5 --- /dev/null +++ b/documentation/Sphinx/source/installation/oper_modes.rst @@ -0,0 +1,6 @@ +Operating modes +=============== + + + UNDER CONSTRUCTION + \ No newline at end of file diff --git a/documentation/Sphinx/source/installation/requirements.rst b/documentation/Sphinx/source/installation/requirements.rst new file mode 100644 index 0000000..c1bae21 --- /dev/null +++ b/documentation/Sphinx/source/installation/requirements.rst @@ -0,0 +1,6 @@ +Requirements +============ + + + UNDER CONSTRUCTION + diff --git a/documentation/Sphinx/source/installation/test_install.rst b/documentation/Sphinx/source/installation/test_install.rst new file mode 100644 index 0000000..2543088 --- /dev/null +++ b/documentation/Sphinx/source/installation/test_install.rst @@ -0,0 +1,5 @@ +Installation test +================= + + UNDER CONSTRUCTION + \ No newline at end of file diff --git a/documentation/Sphinx/source/program_structure.rst b/documentation/Sphinx/source/program_structure.rst index 3bfab6c..991b373 100644 --- a/documentation/Sphinx/source/program_structure.rst +++ b/documentation/Sphinx/source/program_structure.rst @@ -3,4 +3,12 @@ Program Structure Describe structure of flex_extract .... - UNDER CONSTRUCTION \ No newline at end of file + UNDER CONSTRUCTION + +.. toctree:: + :hidden: + :maxdepth: 2 + + program_structure/prog_overview + program_structure/prog_components + program_structure/prog_flow diff --git a/documentation/Sphinx/source/program_structure/prog_components.rst b/documentation/Sphinx/source/program_structure/prog_components.rst new file mode 100644 index 0000000..0c7d560 --- /dev/null +++ b/documentation/Sphinx/source/program_structure/prog_components.rst @@ -0,0 +1,5 @@ +Program Components +================== + + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/program_structure/prog_flow.rst b/documentation/Sphinx/source/program_structure/prog_flow.rst new file mode 100644 index 0000000..07c4d84 --- /dev/null +++ b/documentation/Sphinx/source/program_structure/prog_flow.rst @@ -0,0 +1,5 @@ +Program Flow +================ + + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/program_structure/prog_overview.rst b/documentation/Sphinx/source/program_structure/prog_overview.rst new file mode 100644 index 0000000..15cb629 --- /dev/null +++ b/documentation/Sphinx/source/program_structure/prog_overview.rst @@ -0,0 +1,5 @@ +Program Overview +================ + + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/requirements.rst b/documentation/Sphinx/source/requirements.rst deleted file mode 100644 index b1f562d..0000000 --- a/documentation/Sphinx/source/requirements.rst +++ /dev/null @@ -1,6 +0,0 @@ -Requirements -============ - -Describe the requirements to use flex_extract .... - - UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/support.rst b/documentation/Sphinx/source/support.rst index cd5fe0e..bccf1bf 100644 --- a/documentation/Sphinx/source/support.rst +++ b/documentation/Sphinx/source/support.rst @@ -1,6 +1,16 @@ Support ======= -Describe support options .... - UNDER CONSTRUCTION \ No newline at end of file + UNDER CONSTRUCTION + + +.. toctree:: + :hidden: + :maxdepth: 2 + + support/ticket_system + support/mailing_list + support/known_bugs_issues + support/faq + \ No newline at end of file diff --git a/documentation/Sphinx/source/support/faq.rst b/documentation/Sphinx/source/support/faq.rst new file mode 100644 index 0000000..ccfe36a --- /dev/null +++ b/documentation/Sphinx/source/support/faq.rst @@ -0,0 +1,4 @@ +FAQ - Frequently asked questions +================================ + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/support/known_bugs_issues.rst b/documentation/Sphinx/source/support/known_bugs_issues.rst new file mode 100644 index 0000000..8748ad8 --- /dev/null +++ b/documentation/Sphinx/source/support/known_bugs_issues.rst @@ -0,0 +1,4 @@ +Known Bugs and Issues +===================== + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/support/mailing_list.rst b/documentation/Sphinx/source/support/mailing_list.rst new file mode 100644 index 0000000..e0f5012 --- /dev/null +++ b/documentation/Sphinx/source/support/mailing_list.rst @@ -0,0 +1,4 @@ +Mailing Lists +============= + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/support/ticket_system.rst b/documentation/Sphinx/source/support/ticket_system.rst new file mode 100644 index 0000000..58b73a6 --- /dev/null +++ b/documentation/Sphinx/source/support/ticket_system.rst @@ -0,0 +1,4 @@ +Ticket System +============= + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/user_guide.rst b/documentation/Sphinx/source/user_guide.rst index 030a019..4fe6dc0 100644 --- a/documentation/Sphinx/source/user_guide.rst +++ b/documentation/Sphinx/source/user_guide.rst @@ -1,6 +1,12 @@ User Guide ========== - -Describe using flex_extract .... - UNDER CONSTRUCTION \ No newline at end of file + UNDER CONSTRUCTION + +.. toctree:: + :hidden: + :maxdepth: 2 + + user_guide/how_to + user_guide/control_templates + \ No newline at end of file diff --git a/documentation/Sphinx/source/user_guide/control_templates.rst b/documentation/Sphinx/source/user_guide/control_templates.rst new file mode 100644 index 0000000..ccd58c5 --- /dev/null +++ b/documentation/Sphinx/source/user_guide/control_templates.rst @@ -0,0 +1,4 @@ +CONTROL-file templates +====================== + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/documentation/Sphinx/source/user_guide/how_to.rst b/documentation/Sphinx/source/user_guide/how_to.rst new file mode 100644 index 0000000..7e041b4 --- /dev/null +++ b/documentation/Sphinx/source/user_guide/how_to.rst @@ -0,0 +1,4 @@ +How to use flex_extract +======================= + + UNDER CONSTRUCTION \ No newline at end of file diff --git a/source/python/classes/ControlFile.py b/source/python/classes/ControlFile.py index 0641622..a0f9591 100644 --- a/source/python/classes/ControlFile.py +++ b/source/python/classes/ControlFile.py @@ -70,22 +70,18 @@ class ControlFile(object): ''' def __init__(self, filename): - ''' - @Description: - Initialises the instance of ControlFile class and defines - all class attributes with default values. Afterwards calls - function __read_controlfile__ to read parameter from - Control file. + '''Initialises the instance of ControlFile class and defines + all class attributes with default values. Afterwards calls + function __read_controlfile__ to read parameter from Control file. - @Input: - self: instance of ControlFile class - Description see class documentation. + Parameters + ---------- + filename : :obj:`string` + Name of CONTROL file. - filename: string - Name of CONTROL file. + Return + ------ - @Return: - <nothing> ''' # list of all possible class attributes and their default values @@ -161,16 +157,14 @@ class ControlFile(object): return def __read_controlfile__(self): - ''' - @Description: - Read CONTROL file and assign all CONTROL file variables. + '''Read CONTROL file and assign all CONTROL file variables. - @Input: - self: instance of ControlFile class - Description see class documentation. + Parameters + ---------- + + Return + ------ - @Return: - <nothing> ''' try: @@ -234,27 +228,27 @@ class ControlFile(object): return def __str__(self): - ''' - @Description: - Prepares a string which have all the ControlFile - class attributes with its associated values. - Each attribute is printed in one line and in - alphabetical order. - - Example: - 'age': 10 - 'color': 'Spotted' - 'kids': 0 - 'legs': 2 - 'name': 'Dog' - 'smell': 'Alot' - - @Input: - self: instance of ControlFile class - Description see class documentation. - - @Return: - string of ControlFile class attributes with their values + '''Prepares a string which have all the ControlFile class attributes + with its associated values. Each attribute is printed in one line and + in alphabetical order. + + Example + ------- + 'age': 10 + 'color': 'Spotted' + 'kids': 0 + 'legs': 2 + 'name': 'Dog' + 'smell': 'Alot' + + Parameters + ---------- + + Return + ------ + string + Single string of concatenated ControlFile class attributes + with their values ''' import collections @@ -264,20 +258,17 @@ class ControlFile(object): return '\n'.join("%s: %s" % item for item in attrs.items()) def assign_args_to_control(self, args): - ''' - @Description: - Overwrites the existing ControlFile instance attributes with - the command line arguments. + '''Overwrites the existing ControlFile instance attributes with + the command line arguments. - @Input: - self: instance of ControlFile class - Description see class documentation. + Parameters + ---------- + args : :obj:`Namespace` + Contains the commandline arguments from script/program call. - args: instance of ArgumentParser - Contains the commandline arguments from script/program call. + Return + ------ - @Return: - <nothing> ''' # get dictionary of command line parameters and eliminate all @@ -293,18 +284,18 @@ class ControlFile(object): return def assign_envs_to_control(self, envs): - ''' - @Description: - Assigns the ECMWF environment parameter. + '''Assigns the ECMWF environment parameter. - @Input: - envs: dict of strings - Contains the ECMWF environment parameternames "ECUID", "ECGID", - "DESTINATION" and "GATEWAY" with its corresponding values. - They were read from the file "ECMWF_ENV". + Parameters + ---------- + envs : :obj:`dictionary` of :obj:`strings` + Contains the ECMWF environment parameternames "ECUID", "ECGID", + "DESTINATION" and "GATEWAY" with its corresponding values. + They were read from the file "ECMWF_ENV". + + Return + ------ - @Return: - <nothing> ''' for k, v in envs.iteritems(): @@ -313,23 +304,20 @@ class ControlFile(object): return def check_conditions(self, queue): - ''' - @Description: - Checks a couple of necessary attributes and conditions, - such as if they exist and contain values. - Otherwise set default values. - - @Input: - self: instance of ControlFile class - Description see class documentation. - - queue: string - Name of the queue if submitted to the ECMWF servers. - Used to check if ecuid, ecgid, gateway and destination - are set correctly and are not empty. - - @Return: - <nothing> + '''Checks a couple of necessary attributes and conditions, + such as if they exist and contain values. + Otherwise set default values. + + Parameters + ---------- + queue : :obj:`string` + Name of the queue if submitted to the ECMWF servers. + Used to check if ecuid, ecgid, gateway and destination + are set correctly and are not empty. + + Return + ------ + ''' from mods.tools import my_error import numpy as np @@ -500,18 +488,16 @@ class ControlFile(object): return def check_install_conditions(self): - ''' - @Description: - Checks a couple of necessary attributes and conditions - for the installation such as if they exist and contain values. - Otherwise set default values. + '''Checks a couple of necessary attributes and conditions + for the installation such as if they exist and contain values. + Otherwise set default values. - @Input: - self: instance of ControlFile class - Description see class documentation. + Parameters + ---------- + + Return + ------ - @Return: - <nothing> ''' if self.install_target and \ @@ -548,21 +534,19 @@ class ControlFile(object): return def to_list(self): - ''' - @Description: - Just generates a list of strings containing the attributes and - assigned values except the attributes "_expanded", "exedir", + '''Just generates a list of strings containing the attributes and + assigned values except the attributes "_expanded", "exedir", + "ecmwfdatadir" and "flexpart_root_scripts". + + Parameters + ---------- + + Return + ------ + l : :obj:`list` + A sorted list of the all ControlFile class attributes with + their values except the attributes "_expanded", "exedir", "ecmwfdatadir" and "flexpart_root_scripts". - - @Input: - self: instance of ControlFile class - Description see class documentation. - - @Return: - l: list - A sorted list of the all ControlFile class attributes with - their values except the attributes "_expanded", "exedir", - "ecmwfdatadir" and "flexpart_root_scripts". ''' import collections diff --git a/source/python/classes/EcFlexpart.py b/source/python/classes/EcFlexpart.py index 85d4bce..cb9a74b 100644 --- a/source/python/classes/EcFlexpart.py +++ b/source/python/classes/EcFlexpart.py @@ -110,28 +110,23 @@ class EcFlexpart(object): # CLASS FUNCTIONS # -------------------------------------------------------------------------- def __init__(self, c, fluxes=False): - ''' - @Description: - Creates an object/instance of EcFlexpart with the - associated settings of its attributes for the retrieval. - - @Input: - self: instance of EcFlexpart - The current object of the class. - - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. - - fluxes: boolean, optional - Decides if the flux parameter settings are stored or - the rest of the parameter list. - Default value is False. - - @Return: - <nothing> + '''Creates an object/instance of EcFlexpart with the associated + settings of its attributes for the retrieval. + + Parameters: + ----------- + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. + + fluxes : :obj:`boolean`, optional + Decides if the flux parameter settings are stored or + the rest of the parameter list. + Default value is False. + + Return + ------ + ''' # set a counter for the number of mars requests generated self.mreq_count = 0 @@ -305,25 +300,25 @@ class EcFlexpart(object): def _mk_targetname(self, ftype, param, date): - ''' - @Description: - Creates the filename for the requested grib data to be stored in. - This name is passed as the "target" parameter in the request. + '''Creates the filename for the requested grib data to be stored in. + This name is passed as the "target" parameter in the request. - @Input: - ftype: string - Shortcut name of the type of the field. E.g. AN, FC, PF, ... + Parameters + ---------- + ftype : :obj:`string` + Shortcut name of the type of the field. E.g. AN, FC, PF, ... - param: string - Shortcut of the grid type. E.g. SH__ML, SH__SL, GG__ML, - GG__SL, OG__ML, OG__SL, OG_OROLSM_SL, OG_acc_SL + param : :obj:`string` + Shortcut of the grid type. E.g. SH__ML, SH__SL, GG__ML, + GG__SL, OG__ML, OG__SL, OG_OROLSM_SL, OG_acc_SL - date: string - The date period of the grib data to be stored in this file. + date : :obj:`string` + The date period of the grib data to be stored in this file. - @Return: - targetname: string - The target filename for the grib data. + Return + ------ + targetname : :obj:`string` + The target filename for the grib data. ''' targetname = (self.inputdir + '/' + ftype + param + '.' + date + '.' + str(os.getppid()) + '.' + str(os.getpid()) + '.grb') @@ -332,30 +327,27 @@ class EcFlexpart(object): def _start_retrievement(self, request, par_dict): - ''' - @Description: - Creates the Mars Retrieval and prints or submits the request - depending on the status of the request variable. - - @Input: - self: instance of EcFlexpart - The current object of the class. - - request: integer - Selects the mode of retrieval. - 0: Retrieves the data from ECMWF. - 1: Prints the mars requests to an output file. - 2: Retrieves the data and prints the mars request. - - par_dict: dictionary - Contains all parameter which have to be set for creating the - Mars Retrievals. The parameter are: - marsclass, dataset, stream, type, levtype, levelist, resol, - gaussian, accuracy, grid, target, area, date, time, number, - step, expver, param - - @Return: - <nothing> + '''Creates the Mars Retrieval and prints or submits the request + depending on the status of the request variable. + + Parameters + ---------- + request : :obj:`integer` + Selects the mode of retrieval. + 0: Retrieves the data from ECMWF. + 1: Prints the mars requests to an output file. + 2: Retrieves the data and prints the mars request. + + par_dict : :obj:`dictionary` + Contains all parameter which have to be set for creating the + Mars Retrievals. The parameter are: + marsclass, dataset, stream, type, levtype, levelist, resol, + gaussian, accuracy, grid, target, area, date, time, number, + step, expver, param + + Return + ------ + ''' # increase number of mars requests self.mreq_count += 1 @@ -397,30 +389,30 @@ class EcFlexpart(object): def _mk_index_values(self, inputdir, inputfiles, keys): - ''' - @Description: - Creates an index file for a set of grib parameter keys. - The values from the index keys are returned in a list. - - @Input: - keys: dictionary - List of parameter names which serves as index. - - inputfiles: instance of UioFiles - Contains a list of files. - - @Return: - iid: grib_index - This is a grib specific index structure to access - messages in a file. - - index_vals: list - Contains the values from the keys used for a distinct selection - of grib messages in processing the grib files. - Content looks like e.g.: - index_vals[0]: ('20171106', '20171107', '20171108') ; date - index_vals[1]: ('0', '1200', '1800', '600') ; time - index_vals[2]: ('0', '12', '3', '6', '9') ; stepRange + '''Creates an index file for a set of grib parameter keys. + The values from the index keys are returned in a list. + + Parameters + ---------- + keys : :obj:`dictionary` + List of parameter names which serves as index. + + inputfiles : :obj:`UioFiles` + Contains a list of files. + + Return + ------ + iid : :obj:`grib_index` + This is a grib specific index structure to access + messages in a file. + + index_vals : :obj:`list` + Contains the values from the keys used for a distinct selection + of grib messages in processing the grib files. + Content looks like e.g.: + index_vals[0]: ('20171106', '20171107', '20171108') ; date + index_vals[1]: ('0', '1200', '1800', '600') ; time + index_vals[2]: ('0', '12', '3', '6', '9') ; stepRange ''' iid = None index_keys = keys @@ -454,40 +446,37 @@ class EcFlexpart(object): def retrieve(self, server, dates, public, request, inputdir='.'): - ''' - @Description: - Finalizing the retrieval information by setting final details - depending on grid type. - Prepares MARS retrievals per grid type and submits them. - - @Input: - self: instance of EcFlexpart - The current object of the class. - - server: instance of ECMWFService or ECMWFDataServer - The connection to the ECMWF server. This is different - for member state users which have full access and non - member state users which have only access to the public - data sets. The decision is made from command line argument - "public"; for public access its True (ECMWFDataServer) - for member state users its False (ECMWFService) - - dates: string - Contains start and end date of the retrieval in the format - "YYYYMMDD/to/YYYYMMDD" - - request: integer - Selects the mode of retrieval. - 0: Retrieves the data from ECMWF. - 1: Prints the mars requests to an output file. - 2: Retrieves the data and prints the mars request. - - inputdir: string, optional - Path to the directory where the retrieved data is about - to be stored. The default is the current directory ('.'). - - @Return: - <nothing> + '''Finalizing the retrieval information by setting final details + depending on grid type. + Prepares MARS retrievals per grid type and submits them. + + Parameters + ---------- + server : :obj:`ECMWFService` or :obj:`ECMWFDataServer` + The connection to the ECMWF server. This is different + for member state users which have full access and non + member state users which have only access to the public + data sets. The decision is made from command line argument + "public"; for public access its True (ECMWFDataServer) + for member state users its False (ECMWFService) + + dates : :obj:`string` + Contains start and end date of the retrieval in the format + "YYYYMMDD/to/YYYYMMDD" + + request : :obj:`integer` + Selects the mode of retrieval. + 0: Retrieves the data from ECMWF. + 1: Prints the mars requests to an output file. + 2: Retrieves the data and prints the mars request. + + inputdir : :obj:`string`, optional + Path to the directory where the retrieved data is about + to be stored. The default is the current directory ('.'). + + Return + ------ + ''' self.dates = dates self.server = server @@ -664,28 +653,23 @@ class EcFlexpart(object): def write_namelist(self, c): - ''' - @Description: - Creates a namelist file in the temporary directory and writes - the following values to it: maxl, maxb, mlevel, - mlevelist, mnauf, metapar, rlo0, rlo1, rla0, rla1, - momega, momegadiff, mgauss, msmooth, meta, metadiff, mdpdeta - - @Input: - self: instance of EcFlexpart - The current object of the class. - - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. - - filename: string + '''Creates a namelist file in the temporary directory and writes + the following values to it: maxl, maxb, mlevel, + mlevelist, mnauf, metapar, rlo0, rlo1, rla0, rla1, + momega, momegadiff, mgauss, msmooth, meta, metadiff, mdpdeta + + Parameters + ---------- + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. + + filename : :obj:`string` Name of the namelist file. - @Return: - <nothing> + Return + ------ + ''' from genshi.template.text import NewTextTemplate @@ -733,29 +717,24 @@ class EcFlexpart(object): def deacc_fluxes(self, inputfiles, c): - ''' - @Description: - Goes through all flux fields in ordered time and de-accumulate - the fields. Afterwards the fields are disaggregated in time. - Different versions of disaggregation is provided for rainfall - data (darain, modified linear) and the surface fluxes and - stress data (dapoly, cubic polynomial). - - @Input: - self: instance of EcFlexpart - The current object of the class. - - inputfiles: instance of UioFiles - Contains a list of files. - - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. - - @Return: - <nothing> + '''Goes through all flux fields in ordered time and de-accumulate + the fields. Afterwards the fields are disaggregated in time. + Different versions of disaggregation is provided for rainfall + data (darain, modified linear) and the surface fluxes and + stress data (dapoly, cubic polynomial). + + Parameters + ---------- + inputfiles : :obj:`UioFiles` + Contains a list of files. + + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. + + Return + ------ + ''' table128 = init128(_config.PATH_GRIBTABLE) @@ -951,35 +930,32 @@ class EcFlexpart(object): def create(self, inputfiles, c): - ''' - @Description: - This method is based on the ECMWF example index.py - https://software.ecmwf.int/wiki/display/GRIB/index.py - - An index file will be created which depends on the combination - of "date", "time" and "stepRange" values. This is used to iterate - over all messages in each grib file which were passed through the - parameter "inputfiles" to seperate specific parameters into fort.* - files. Afterwards the FORTRAN program is called to convert - the data fields all to the same grid and put them in one file - per unique time step (combination of "date", "time" and - "stepRange"). - - @Input: - self: instance of EcFlexpart - The current object of the class. - - inputfiles: instance of UioFiles - Contains a list of files. - - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. - - @Return: - <nothing> + '''An index file will be created which depends on the combination + of "date", "time" and "stepRange" values. This is used to iterate + over all messages in each grib file which were passed through the + parameter "inputfiles" to seperate specific parameters into fort.* + files. Afterwards the FORTRAN program is called to convert + the data fields all to the same grid and put them in one file + per unique time step (combination of "date", "time" and + "stepRange"). + + Note + ---- + This method is based on the ECMWF example index.py + https://software.ecmwf.int/wiki/display/GRIB/index.py + + Parameters + ---------- + inputfiles : :obj:`UioFiles` + Contains a list of files. + + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. + + Return + ------ + ''' if c.wrf: @@ -1182,29 +1158,23 @@ class EcFlexpart(object): def process_output(self, c): - ''' - @Description: - The grib files are postprocessed depending on the selection in - CONTROL file. The resulting files are moved to the output - directory if its not equal to the input directory. - The following modifications might be done if - properly switched in CONTROL file: - GRIB2 - Conversion to GRIB2 - ECTRANS - Transfer of files to gateway server - ECSTORAGE - Storage at ECMWF server - - @Input: - self: instance of EcFlexpart - The current object of the class. - - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. - - @Return: - <nothing> + '''The grib files are postprocessed depending on the selection in + CONTROL file. The resulting files are moved to the output + directory if its not equal to the input directory. + The following modifications might be done if + properly switched in CONTROL file: + GRIB2 - Conversion to GRIB2 + ECTRANS - Transfer of files to gateway server + ECSTORAGE - Storage at ECMWF server + + Parameters + ---------- + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. + + Return + ------ ''' @@ -1246,20 +1216,17 @@ class EcFlexpart(object): def prepare_fp_files(self, c): - ''' - @Description: - Conversion of GRIB files to FLEXPART binary format. + '''Conversion of GRIB files to FLEXPART binary format. - @Input: - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. + Parameters + ---------- + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. + Return + ------ - @Return: - <nothing> ''' # generate AVAILABLE file # Example of AVAILABLE file data: diff --git a/source/python/classes/GribTools.py b/source/python/classes/GribTools.py index 247d178..b215703 100644 --- a/source/python/classes/GribTools.py +++ b/source/python/classes/GribTools.py @@ -65,17 +65,16 @@ class GribTools(object): # CLASS FUNCTIONS # -------------------------------------------------------------------------- def __init__(self, filenames): - ''' - @Description: - Initialise an object of GribTools and assign a list - of filenames. + '''Initialise an object of GribTools and assign a list of filenames. + + Parameters + ---------- + filenames : :obj:`list` of :obj:`strings` + A list of filenames. - @Input: - filenames: list of strings - A list of filenames. + Return + ------ - @Return: - <nothing> ''' self.filenames = filenames @@ -84,24 +83,24 @@ class GribTools(object): def get_keys(self, keynames, wherekeynames=[], wherekeyvalues=[]): - ''' - @Description: - get keyvalues for a given list of keynames - a where statement can be given (list of key and list of values) + '''Get keyvalues for a given list of keynames a where statement + can be given (list of key and list of values) - @Input: - keynames: list of strings - List of keynames. + Parameters + ---------- + keynames : :obj:`list` of :obj:`string` + List of keynames. - wherekeynames: list of strings, optional - Default value is an empty list. + wherekeynames : :obj:`list` of :obj:`string`, optional + Default value is an empty list. - wherekeyvalues: list of strings, optional - Default value is an empty list. + wherekeyvalues : :obj:`list` of :obj:`string`, optional + Default value is an empty list. - @Return: - return_list: list of strings - List of keyvalues for given keynames. + Return + ------ + return_list : :obj:`list` of :obj:`string` + List of keyvalues for given keynames. ''' fileid = open(self.filenames, 'r') @@ -143,40 +142,39 @@ class GribTools(object): def set_keys(self, fromfile, keynames, keyvalues, wherekeynames=[], wherekeyvalues=[], strict=False, filemode='w'): - ''' - @Description: - Opens the file to read the grib messages and then write - them to a new output file. By default all messages are - written out. Also, the keyvalues of the passed list of - keynames are set or only those meeting the where statement. - (list of key and list of values). + '''Opens the file to read the grib messages and then write + them to a new output file. By default all messages are + written out. Also, the keyvalues of the passed list of + keynames are set or only those meeting the where statement. + (list of key and list of values). - @Input: - fromfile: string - Filename of the input file to read the grib messages from. + Parameters + ---------- + fromfile : :obj:`string` + Filename of the input file to read the grib messages from. - keynames: list of strings - List of keynames. Default is an empty list. + keynames : :obj:`list` of :obj:`string` + List of keynames. Default is an empty list. - keyvalues: list of strings - List of keynames. Default is an empty list. + keyvalues : :obj:`list` of :obj:`string` + List of keynames. Default is an empty list. - wherekeynames: list of strings, optional - Default value is an empty list. + wherekeynames : :obj:`list` of :obj:`string`, optional + Default value is an empty list. - wherekeyvalues: list of strings, optional - Default value is an empty list. + wherekeyvalues : :obj:`list` of :obj:`string`, optional + Default value is an empty list. - strict: boolean, optional - Decides if everything from keynames and keyvalues - is written out the grib file (False) or only those - meeting the where statement (True). Default is False. + strict : :obj:`boolean`, optional + Decides if everything from keynames and keyvalues + is written out the grib file (False) or only those + meeting the where statement (True). Default is False. - filemode: string, optional - Sets the mode for the output file. Default is "w". + filemode : :obj:`string`, optional + Sets the mode for the output file. Default is "w". - @Return: - <nothing> + Return + ------ ''' fout = open(self.filenames, filemode) @@ -218,32 +216,33 @@ class GribTools(object): def copy(self, filename_in, selectWhere=True, keynames=[], keyvalues=[], filemode='w'): - ''' - Add the content of another input grib file to the objects file but + '''Add the content of another input grib file to the objects file but only messages corresponding to keys/values passed to the function. The selectWhere switch decides if to copy the keys equal to (True) or different to (False) the keynames/keyvalues list passed to the function. - @Input: - filename_in: string - Filename of the input file to read the grib messages from. + Parameters + ---------- + filename_in : :obj:`string` + Filename of the input file to read the grib messages from. + + selectWhere : :obj:`boolean`, optional + Decides if to copy the keynames and values equal to (True) or + different to (False) the keynames/keyvalues list passed to the + function. Default is True. - selectWhere: boolean, optional - Decides if to copy the keynames and values equal to (True) or - different to (False) the keynames/keyvalues list passed to the - function. Default is True. + keynames : :obj:`list` of :obj:`string`, optional + List of keynames. Default is an empty list. - keynames: list of strings, optional - List of keynames. Default is an empty list. + keyvalues : :obj:`list` of :obj:`string`, optional + List of keynames. Default is an empty list. - keyvalues: list of strings, optional - List of keynames. Default is an empty list. + filemode : :obj:`string`, optional + Sets the mode for the output file. Default is "w". - filemode: string, optional - Sets the mode for the output file. Default is "w". + Return + ------ - @Return: - <nothing> ''' fin = open(filename_in) @@ -283,24 +282,24 @@ class GribTools(object): return def index(self, index_keys=["mars"], index_file="my.idx"): - ''' - @Description: - Create index file from a list of files if it does not exist or - read an index file. - - @Input: - index_keys: list of strings, optional - Contains the list of key parameter names from - which the index is to be created. - Default is a list with a single entry string "mars". - - index_file: string, optional - Filename where the indices are stored. - Default is "my.idx". - - @Return: - iid: integer - Grib index id. + '''Create index file from a list of files if it does not exist or + read an index file. + + Parameters + ---------- + index_keys: :obj:`list` of :obj:`string`, optional + Contains the list of key parameter names from + which the index is to be created. + Default is a list with a single entry string "mars". + + index_file: :obj:`string`, optional + Filename where the indices are stored. + Default is "my.idx". + + Return + ------ + iid: :obj:`integer` + Grib index id. ''' print("... index will be done") iid = None diff --git a/source/python/classes/MarsRetrieval.py b/source/python/classes/MarsRetrieval.py index daf8260..29b82ab 100644 --- a/source/python/classes/MarsRetrieval.py +++ b/source/python/classes/MarsRetrieval.py @@ -72,14 +72,12 @@ import _config # CLASS # ------------------------------------------------------------------------------ class MarsRetrieval(object): - ''' - Class for submitting MARS retrievals. + '''Class for submitting MARS retrievals. A description of MARS keywords/arguments and examples of their values can be found here: https://software.ecmwf.int/wiki/display/UDOC/\ Identification+keywords#Identificationkeywords-class - ''' def __init__(self, server, public, marsclass="ei", dataset="", type="", @@ -87,218 +85,215 @@ class MarsRetrieval(object): stream="", area="", time="", step="", expver="1", number="", accuracy="", grid="", gaussian="", target="", param=""): - ''' - @Description: - Initialises the instance of the MarsRetrieval class and - defines and assigns a set of the necessary retrieval parameters - for the FLEXPART input data. - A description of MARS keywords/arguments, their dependencies - on each other and examples of their values can be found here: - - https://software.ecmwf.int/wiki/display/UDOC/MARS+keywords - - @Input: - self: instance of MarsRetrieval - For description see class documentation. - - server: instance of ECMWFService (from ECMWF Web-API) - This is the connection to the ECMWF data servers. - It is needed for the pythonic access of ECMWF data. - - public: integer - Decides which Web API version is used: - 0: member-state users and full archive access - 1: public access and limited access to the public server and - datasets. Needs the parameter dataset. - Default is "0" and for member-state users. - - marsclass: string, optional - Characterisation of dataset. E.g. EI (ERA-Interim), - E4 (ERA40), OD (Operational archive), ea (ERA5). - Default is the ERA-Interim dataset "ei". - - dataset: string, optional - For public datasets there is the specific naming and parameter - dataset which has to be used to characterize the type of - data. Usually there is less data available, either in times, - domain or parameter. - Default is an empty string. - - type: string, optional - Determines the type of fields to be retrieved. - Selects between observations, images or fields. - Examples for fields: Analysis (an), Forecast (fc), - Perturbed Forecast (pf), Control Forecast (cf) and so on. - Default is an empty string. - - levtype: string, optional - Denotes type of level. Has a direct implication on valid - levelist values! - E.g. model level (ml), pressure level (pl), surface (sfc), - potential vorticity (pv), potential temperature (pt) - and depth (dp). - Default is an empty string. - - levelist: string, optional - Specifies the required levels. It has to have a valid - correspondence to the selected levtype. - Examples: model level: 1/to/137, pressure levels: 500/to/1000 - Default is an empty string. - - repres: string, optional - Selects the representation of the archived data. - E.g. sh - spherical harmonics, gg - Gaussian grid, - ll - latitude/longitude, ... - Default is an empty string. - - date: string, optional - Specifies the Analysis date, the Forecast base date or - Observations date. Valid formats are: - Absolute as YYYY-MM-DD or YYYYMMDD. - Default is an empty string. - - resol: string, optional - Specifies the desired triangular truncation of retrieved data, - before carrying out any other selected post-processing. - The default is automatic truncation (auto), by which the lowest - resolution compatible with the value specified in grid is - automatically selected for the retrieval. - Users wanting to perform post-processing from full spectral - resolution should specify Archived Value (av). - The following are examples of existing resolutions found in - the archive: 63, 106, 159, 213, 255, 319, 399, 511, 799 or 1279. - This keyword has no meaning/effect if the archived data is - not in spherical harmonics representation. - The best selection can be found here: - https://software.ecmwf.int/wiki/display/UDOC/\ - Retrieve#Retrieve-Truncationbeforeinterpolation - Default is an empty string. - - stream: string, optional - Identifies the forecasting system used to generate the data. - E.g. oper (Atmospheric model), enfo (Ensemble forecats), ... - Default is an empty string. - - area: string, optional - Specifies the desired sub-area of data to be extracted. - Areas can be defined to wrap around the globe. - - Latitude values must be given as signed numbers, with: - north latitudes (i.e. north of the equator) - being positive (e.g: 40.5) - south latitutes (i.e. south of the equator) - being negative (e.g: -50.5) - Longtitude values must be given as signed numbers, with: - east longitudes (i.e. east of the 0 degree meridian) - being positive (e.g: 35.0) - west longitudes (i.e. west of the 0 degree meridian) - being negative (e.g: -20.5) - - E.g.: North/West/South/East - Default is an empty string. - - time: string, optional - Specifies the time of the data in hours and minutes. - Valid values depend on the type of data: Analysis time, - Forecast base time or First guess verification time - (all usually at synoptic hours: 00, 06, 12 and 18 ). - Observation time (any combination in hours and minutes is valid, - subject to data availability in the archive). - The syntax is HHMM or HH:MM. If MM is omitted it defaults to 00. - Default is an empty string. - - step: string, optional - Specifies the forecast time step from forecast base time. - Valid values are hours (HH) from forecast base time. It also - specifies the length of the forecast which verifies at - First Guess time. - E.g. 1/3/6-hourly - Default is an empty string. - - expver: string, optional - The version of the dataset. Each experiment is assigned a - unique code (version). Production data is assigned 1 or 2, - and experimental data in Operations 11, 12 ,... - Research or Member State's experiments have a four letter - experiment identifier. - Default is "1". - - number: string, optional - Selects the member in ensemble forecast run. (Only then it - is necessary.) It has a different meaning depending on - the type of data. - E.g. Perturbed Forecasts: specifies the Ensemble forecast member - Default is an empty string. - - accuracy: string, optional - Specifies the number of bits per value to be used in the - generated GRIB coded fields. - A positive integer may be given to specify the preferred number - of bits per packed value. This must not be greater than the - number of bits normally used for a Fortran integer on the - processor handling the request (typically 32 or 64 bit). - Within a compute request the accuracy of the original fields - can be passed to the result field by specifying accuracy=av. - Default is an empty string. - - grid: string, optional - Specifies the output grid which can be either a Gaussian grid - or a Latitude/Longitude grid. MARS requests specifying - grid=av will return the archived model grid. - - Lat/Lon grid: The grid spacing needs to be an integer - fraction of 90 degrees e.g. grid = 0.5/0.5 - - Gaussian grid: specified by a letter denoting the type of - Gaussian grid followed by an integer (the grid number) - representing the number of lines between the Pole and Equator, - e.g. - grid = F160 - full (or regular) Gaussian grid with - 160 latitude lines between the pole and equator - grid = N320 - ECMWF original reduced Gaussian grid with - 320 latitude lines between the pole and equator, - see Reduced Gaussian Grids for grid numbers used at ECMWF - grid = O640 - ECMWF octahedral (reduced) Gaussian grid with - 640 latitude lines between the pole and equator - Default is an empty string. - - gaussian: string, optional - This parameter is deprecated and should no longer be used. - Specifies the desired type of Gaussian grid for the output. - Valid Gaussian grids are quasi-regular (reduced) or regular. - Keyword gaussian can only be specified together with - keyword grid. Gaussian without grid has no effect. - Default is an empty string. - - target: string, optional - Specifies a file into which data is to be written after - retrieval or manipulation. Path names should always be - enclosed in double quotes. The MARS client supports automatic - generation of multiple target files using MARS keywords - enclosed in square brackets [ ]. If the environment variable - MARS_MULTITARGET_STRICT_FORMAT is set to 1 before calling mars, - the keyword values will be used in the filename as shown by - the ecCodes GRIB tool grib_ls -m, e.g. with - MARS_MULTITARGET_STRICT_FORMAT set to 1 the keywords time, - expver and param will be formatted as 0600, 0001 and 129.128 - rather than 600, 1 and 129. - Default is an empty string. - - param: string, optional - Specifies the meteorological parameter. - The list of meteorological parameters in MARS is extensive. - Their availability is directly related to their meteorological - meaning and, therefore, the rest of directives specified - in the MARS request. - Meteorological parameters can be specified by their - GRIB code (param=130), their mnemonic (param=t) or - full name (param=temperature). - The list of parameter should be seperated by a "/"-sign. - E.g. 130/131/133 - Default is an empty string. - - @Return: - <nothing> + '''Initialises the instance of the MarsRetrieval class and + defines and assigns a set of the necessary retrieval parameters + for the FLEXPART input data. + A description of MARS keywords/arguments, their dependencies + on each other and examples of their values can be found here: + + https://software.ecmwf.int/wiki/display/UDOC/MARS+keywords + + Parameters + ---------- + server : :obj:`ECMWFService` + This is the connection to the ECMWF data servers. + It is needed for the pythonic access of ECMWF data. + + public : :obj:`integer` + Decides which Web API version is used: + 0: member-state users and full archive access + 1: public access and limited access to the public server and + datasets. Needs the parameter dataset. + Default is "0" and for member-state users. + + marsclass : :obj:`string`, optional + Characterisation of dataset. E.g. EI (ERA-Interim), + E4 (ERA40), OD (Operational archive), ea (ERA5). + Default is the ERA-Interim dataset "ei". + + dataset : :obj:`string`, optional + For public datasets there is the specific naming and parameter + dataset which has to be used to characterize the type of + data. Usually there is less data available, either in times, + domain or parameter. + Default is an empty string. + + type : :obj:`string`, optional + Determines the type of fields to be retrieved. + Selects between observations, images or fields. + Examples for fields: Analysis (an), Forecast (fc), + Perturbed Forecast (pf), Control Forecast (cf) and so on. + Default is an empty string. + + levtype : :obj:`string`, optional + Denotes type of level. Has a direct implication on valid + levelist values! + E.g. model level (ml), pressure level (pl), surface (sfc), + potential vorticity (pv), potential temperature (pt) + and depth (dp). + Default is an empty string. + + levelist : :obj:`string`, optional + Specifies the required levels. It has to have a valid + correspondence to the selected levtype. + Examples: model level: 1/to/137, pressure levels: 500/to/1000 + Default is an empty string. + + repres : :obj:`string`, optional + Selects the representation of the archived data. + E.g. sh - spherical harmonics, gg - Gaussian grid, + ll - latitude/longitude, ... + Default is an empty string. + + date : :obj:`string`, optional + Specifies the Analysis date, the Forecast base date or + Observations date. Valid formats are: + Absolute as YYYY-MM-DD or YYYYMMDD. + Default is an empty string. + + resol : :obj:`string`, optional + Specifies the desired triangular truncation of retrieved data, + before carrying out any other selected post-processing. + The default is automatic truncation (auto), by which the lowest + resolution compatible with the value specified in grid is + automatically selected for the retrieval. + Users wanting to perform post-processing from full spectral + resolution should specify Archived Value (av). + The following are examples of existing resolutions found in + the archive: 63, 106, 159, 213, 255, 319, 399, 511, 799 or 1279. + This keyword has no meaning/effect if the archived data is + not in spherical harmonics representation. + The best selection can be found here: + https://software.ecmwf.int/wiki/display/UDOC/\ + Retrieve#Retrieve-Truncationbeforeinterpolation + Default is an empty string. + + stream : :obj:`string`, optional + Identifies the forecasting system used to generate the data. + E.g. oper (Atmospheric model), enfo (Ensemble forecats), ... + Default is an empty string. + + area : :obj:`string`, optional + Specifies the desired sub-area of data to be extracted. + Areas can be defined to wrap around the globe. + + Latitude values must be given as signed numbers, with: + north latitudes (i.e. north of the equator) + being positive (e.g: 40.5) + south latitutes (i.e. south of the equator) + being negative (e.g: -50.5) + Longtitude values must be given as signed numbers, with: + east longitudes (i.e. east of the 0 degree meridian) + being positive (e.g: 35.0) + west longitudes (i.e. west of the 0 degree meridian) + being negative (e.g: -20.5) + + E.g.: North/West/South/East + Default is an empty string. + + time : :obj:`string`, optional + Specifies the time of the data in hours and minutes. + Valid values depend on the type of data: Analysis time, + Forecast base time or First guess verification time + (all usually at synoptic hours: 00, 06, 12 and 18 ). + Observation time (any combination in hours and minutes is valid, + subject to data availability in the archive). + The syntax is HHMM or HH:MM. If MM is omitted it defaults to 00. + Default is an empty string. + + step : :obj:`string`, optional + Specifies the forecast time step from forecast base time. + Valid values are hours (HH) from forecast base time. It also + specifies the length of the forecast which verifies at + First Guess time. + E.g. 1/3/6-hourly + Default is an empty string. + + expver : :obj:`string`, optional + The version of the dataset. Each experiment is assigned a + unique code (version). Production data is assigned 1 or 2, + and experimental data in Operations 11, 12 ,... + Research or Member State's experiments have a four letter + experiment identifier. + Default is "1". + + number : :obj:`string`, optional + Selects the member in ensemble forecast run. (Only then it + is necessary.) It has a different meaning depending on + the type of data. + E.g. Perturbed Forecasts: specifies the Ensemble forecast member + Default is an empty string. + + accuracy : :obj:`string`, optional + Specifies the number of bits per value to be used in the + generated GRIB coded fields. + A positive integer may be given to specify the preferred number + of bits per packed value. This must not be greater than the + number of bits normally used for a Fortran integer on the + processor handling the request (typically 32 or 64 bit). + Within a compute request the accuracy of the original fields + can be passed to the result field by specifying accuracy=av. + Default is an empty string. + + grid : :obj:`string`, optional + Specifies the output grid which can be either a Gaussian grid + or a Latitude/Longitude grid. MARS requests specifying + grid=av will return the archived model grid. + + Lat/Lon grid: The grid spacing needs to be an integer + fraction of 90 degrees e.g. grid = 0.5/0.5 + + Gaussian grid: specified by a letter denoting the type of + Gaussian grid followed by an integer (the grid number) + representing the number of lines between the Pole and Equator, + e.g. + grid = F160 - full (or regular) Gaussian grid with + 160 latitude lines between the pole and equator + grid = N320 - ECMWF original reduced Gaussian grid with + 320 latitude lines between the pole and equator, + see Reduced Gaussian Grids for grid numbers used at ECMWF + grid = O640 - ECMWF octahedral (reduced) Gaussian grid with + 640 latitude lines between the pole and equator + Default is an empty string. + + gaussian : :obj:`string`, optional + This parameter is deprecated and should no longer be used. + Specifies the desired type of Gaussian grid for the output. + Valid Gaussian grids are quasi-regular (reduced) or regular. + Keyword gaussian can only be specified together with + keyword grid. Gaussian without grid has no effect. + Default is an empty string. + + target : :obj:`string`, optional + Specifies a file into which data is to be written after + retrieval or manipulation. Path names should always be + enclosed in double quotes. The MARS client supports automatic + generation of multiple target files using MARS keywords + enclosed in square brackets [ ]. If the environment variable + MARS_MULTITARGET_STRICT_FORMAT is set to 1 before calling mars, + the keyword values will be used in the filename as shown by + the ecCodes GRIB tool grib_ls -m, e.g. with + MARS_MULTITARGET_STRICT_FORMAT set to 1 the keywords time, + expver and param will be formatted as 0600, 0001 and 129.128 + rather than 600, 1 and 129. + Default is an empty string. + + param : :obj:`string`, optional + Specifies the meteorological parameter. + The list of meteorological parameters in MARS is extensive. + Their availability is directly related to their meteorological + meaning and, therefore, the rest of directives specified + in the MARS request. + Meteorological parameters can be specified by their + GRIB code (param=130), their mnemonic (param=t) or + full name (param=temperature). + The list of parameter should be seperated by a "/"-sign. + E.g. 130/131/133 + Default is an empty string. + + Return + ------ + ''' self.server = server @@ -327,17 +322,15 @@ class MarsRetrieval(object): def display_info(self): - ''' - @Description: - Prints all class attributes and their values to the - standard output. + '''Prints all class attributes and their values to the + standard output. + + Parameters + ---------- - @Input: - self: instance of MarsRetrieval - For description see class documentation. + Return + ------ - @Return: - <nothing> ''' # Get all class attributes and their values as a dictionary attrs = vars(self).copy() @@ -354,23 +347,20 @@ class MarsRetrieval(object): def print_info(self, inputdir, request_number): - ''' - @Description: - Prints all mars requests to an extra file for debugging and - information. + '''Prints all mars requests to an extra file for debugging and + information. - @Input: - self: instance of MarsRetrieval - For description see class documentation. + Parameters + ---------- + inputdir : :obj:`string` + The path where all data from the retrievals are stored. - inputdir: string - The path where all data from the retrievals are stored. + request_number : :obj:`integer` + Number of mars requests for flux and non-flux data. - request_number: integer - Number of mars requests for flux and non-flux data. + Return + ------ - @Return: - <nothing> ''' # Get all class attributes and their values as a dictionary attrs = vars(self).copy() @@ -392,22 +382,19 @@ class MarsRetrieval(object): def print_infodata_csv(self, inputdir, request_number): - ''' - @Description: - Write all request parameter in alpabetical order into a "csv" file. + '''Write all request parameter in alpabetical order into a "csv" file. - @Input: - self: instance of MarsRetrieval - For description see class documentation. + Parameters + ---------- + inputdir : :obj:`string` + The path where all data from the retrievals are stored. - inputdir: string - The path where all data from the retrievals are stored. + request_number : :obj:`integer` + Number of mars requests for flux and non-flux data. - request_number: integer - Number of mars requests for flux and non-flux data. + Return + ------ - @Return: - <nothing> ''' # Get all class attributes and their values as a dictionary @@ -426,19 +413,17 @@ class MarsRetrieval(object): return def data_retrieve(self): - ''' - @Description: - Submits a MARS retrieval. Depending on the existence of - ECMWF Web-API it is submitted via Python or a - subprocess in the Shell. The parameter for the mars retrieval - are taken from the defined class attributes. - - @Input: - self: instance of MarsRetrieval - For description see class documentation. - - @Return: - <nothing> + '''Submits a MARS retrieval. Depending on the existence of + ECMWF Web-API it is submitted via Python or a + subprocess in the Shell. The parameter for the mars retrieval + are taken from the defined class attributes. + + Parameters + ---------- + + Return + ------ + ''' # Get all class attributes and their values as a dictionary attrs = vars(self).copy() diff --git a/source/python/classes/UioFiles.py b/source/python/classes/UioFiles.py index e891608..28d3986 100644 --- a/source/python/classes/UioFiles.py +++ b/source/python/classes/UioFiles.py @@ -60,8 +60,7 @@ from mods.tools import silent_remove, get_list_as_string # ------------------------------------------------------------------------------ class UioFiles(object): - ''' - Class to manipulate files. At initialisation it has the pattern + '''Class to manipulate files. At initialisation it has the pattern which stores a regular expression pattern for the files, the path to the files and the files already. ''' @@ -69,22 +68,19 @@ class UioFiles(object): # CLASS FUNCTIONS # -------------------------------------------------------------------------- def __init__(self, path, pattern): - ''' - @Description: - Assignes a specific pattern for these files. + '''Assignes a specific pattern for these files. - @Input: - self: instance of UioFiles - Description see class documentation. + Parameters + ---------- + path : :obj:`string` + Directory where to list the files. - path: string - Directory where to list the files. + pattern : :obj:`string` + Regular expression pattern. For example: '\*.grb' - pattern: string - Regular expression pattern. For example: '*.grb' + Return + ------ - @Return: - <nothing> ''' self.path = path @@ -97,20 +93,17 @@ class UioFiles(object): #@profiling.timefn def __list_files__(self, path): - ''' - @Description: - Lists all files in the directory with the matching - regular expression pattern. + '''Lists all files in the directory with the matching + regular expression pattern. - @Input: - self: instance of UioFiles - Description see class documentation. + Parameters + ---------- + path : :obj:`string` + Path to the files. - path: string - Path to the files. + Return + ------ - @Return: - <nothing> ''' # Get the absolute path path = os.path.abspath(path) @@ -123,18 +116,16 @@ class UioFiles(object): return def __str__(self): - ''' - @Description: - Converts the list of files into a single string. - The entries are sepereated by "," sign. + '''Converts the list of files into a single string. + The entries are sepereated by "," sign. - @Input: - self: instance of UioFiles - Description see class documentation. + Parameters + ---------- - @Return: - files_string: string - The content of the list as a single string. + Return + ------ + files_string : :obj:`string` + The content of the list as a single string. ''' filenames = [os.path.basename(f) for f in self.files] @@ -143,16 +134,14 @@ class UioFiles(object): return files_string def delete_files(self): - ''' - @Description: - Deletes the files. + '''Deletes the files. + + Parameters + ---------- - @Input: - self: instance of UioFiles - Description see class documentation. + Return + ------ - @Return: - <nothing> ''' for old_file in self.files: diff --git a/source/python/install.py b/source/python/install.py index cbef571..3ab8218 100755 --- a/source/python/install.py +++ b/source/python/install.py @@ -65,16 +65,14 @@ from mods.tools import make_dir, put_file_to_ecserver, submit_job_to_ecserver # FUNCTIONS # ------------------------------------------------------------------------------ def main(): - ''' - @Description: - Controls the installation process. Calls the installation function - if target is specified. + '''Controls the installation process. Calls the installation function + if target is specified. - @Intput: - <nothing> + Parameters + ---------- - @Return: - <nothing> + Return + ------ ''' args = get_install_cmdline_arguments() @@ -87,17 +85,16 @@ def main(): return def get_install_cmdline_arguments(): - ''' - @Description: - Decomposes the command line arguments and assigns them to variables. - Apply default values for non mentioned arguments. + '''Decomposes the command line arguments and assigns them to variables. + Apply default values for non mentioned arguments. - @Input: - <nothing> + Parameters + ---------- - @Return: - args: instance of ArgumentParser - Contains the commandline arguments from script/program call. + Return + ------ + args : :obj:`Namespace` + Contains the commandline arguments from script/program call. ''' parser = ArgumentParser(description='Install flex_extract software locally or \ on ECMWF machines', @@ -138,21 +135,19 @@ def get_install_cmdline_arguments(): def install_via_gateway(c): - ''' - @Description: - Perform the actual installation on local machine or prepare data - transfer to remote gate and submit a job script which will - install everything on the remote gate. - - @Input: - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. - - @Return: - <nothing> + '''Perform the actual installation on local machine or prepare data + transfer to remote gate and submit a job script which will + install everything on the remote gate. + + Parameters + ---------- + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. + + Return + ------ + ''' import tarfile @@ -223,25 +218,25 @@ def install_via_gateway(c): return def mk_tarball(tarball_path, target): - ''' - @Description: - Creates a tarball with all necessary files which need to be sent to the - installation directory. - It does not matter if this is local or remote. - Collects all python files, the Fortran source and makefiles, - the ECMWF_ENV file, the CONTROL files as well as the - template files. - - @Input: - tarball_path: string - The complete path to the tar file which will contain all - relevant data for flex_extract. - - target: string - The queue where the job is submitted to. - - @Return: - <nothing> + '''Creates a tarball with all necessary files which need to be sent to the + installation directory. + It does not matter if this is local or remote. + Collects all python files, the Fortran source and makefiles, + the ECMWF_ENV file, the CONTROL files as well as the + template files. + + Parameters + ---------- + tarball_path : :obj:`string` + The complete path to the tar file which will contain all + relevant data for flex_extract. + + target : :obj:`string` + The queue where the job is submitted to. + + Return + ------ + ''' import tarfile from glob import glob @@ -293,17 +288,17 @@ def mk_tarball(tarball_path, target): def un_tarball(tarball_path): - ''' - @Description: - Extracts the given tarball into current directory. + '''Extracts the given tarball into current directory. - @Input: - tarball_path: string - The complete path to the tar file which will contain all - relevant data for flex_extract. + Parameters + ---------- + tarball_path : :obj:`string` + The complete path to the tar file which will contain all + relevant data for flex_extract. + + Return + ------ - @Return: - <nothing> ''' import tarfile @@ -315,28 +310,28 @@ def un_tarball(tarball_path): return def mk_env_vars(ecuid, ecgid, gateway, destination): - ''' - @Description: - Creates a file named ECMWF_ENV which contains the - necessary environmental variables at ECMWF servers. - It is based on the template ECMWF_ENV.template. + '''Creates a file named ECMWF_ENV which contains the + necessary environmental variables at ECMWF servers. + It is based on the template ECMWF_ENV.template. + + Parameters + ---------- + ecuid : :obj:`string` + The user id on ECMWF server. - @Input: - ecuid: string - The user id on ECMWF server. + ecgid : :obj:`string` + The group id on ECMWF server. - ecgid: string - The group id on ECMWF server. + gateway : :obj:`string` + The gateway server the user is using. - gateway: string - The gateway server the user is using. + destination : :obj:`string` + The remote destination which is used to transfer files + from ECMWF server to local gateway server. - destination: string - The remote destination which is used to transfer files - from ECMWF server to local gateway server. + Return + ------ - @Return: - <nothing> ''' from genshi.template.text import NewTextTemplate from genshi.template import TemplateLoader @@ -357,32 +352,32 @@ def mk_env_vars(ecuid, ecgid, gateway, destination): return def mk_compilejob(makefile, target, ecuid, ecgid, fp_root): - ''' - @Description: - Modifies the original job template file so that it is specified - for the user and the environment were it will be applied. Result - is stored in a new file "job.temp" in the python directory. + '''Modifies the original job template file so that it is specified + for the user and the environment were it will be applied. Result + is stored in a new file "job.temp" in the python directory. + + Parameters + ---------- + makefile : :obj:`string` + Name of the makefile which should be used to compile FORTRAN + CONVERT2 program. - @Input: - makefile: string - Name of the makefile which should be used to compile FORTRAN - CONVERT2 program. + target : :obj:`string` + The target where the installation should be done, e.g. the queue. - target: string - The target where the installation should be done, e.g. the queue. + ecuid : :obj:`string` + The user id on ECMWF server. - ecuid: string - The user id on ECMWF server. + ecgid : :obj:`string` + The group id on ECMWF server. - ecgid: string - The group id on ECMWF server. + fp_root : :obj:`string` + Path to the root directory of FLEXPART environment or flex_extract + environment. - fp_root: string - Path to the root directory of FLEXPART environment or flex_extract - environment. + Return + ------ - @Return: - <nothing> ''' from genshi.template.text import NewTextTemplate from genshi.template import TemplateLoader @@ -412,32 +407,32 @@ def mk_compilejob(makefile, target, ecuid, ecgid, fp_root): return def mk_job_template(ecuid, ecgid, gateway, destination, fp_root): - ''' - @Description: - Modifies the original job template file so that it is specified - for the user and the environment were it will be applied. Result - is stored in a new file. + '''Modifies the original job template file so that it is specified + for the user and the environment were it will be applied. Result + is stored in a new file. - @Input: - ecuid: string - The user id on ECMWF server. + Parameters + ---------- + ecuid : :obj:`string` + The user id on ECMWF server. - ecgid: string - The group id on ECMWF server. + ecgid : :obj:`string` + The group id on ECMWF server. - gateway: string - The gateway server the user is using. + gateway : :obj:`string` + The gateway server the user is using. - destination: string - The remote destination which is used to transfer files - from ECMWF server to local gateway server. + destination : :obj:`string` + The remote destination which is used to transfer files + from ECMWF server to local gateway server. - fp_root: string - Path to the root directory of FLEXPART environment or flex_extract - environment. + fp_root : :obj:`string` + Path to the root directory of FLEXPART environment or flex_extract + environment. + + Return + ------ - @Return: - <nothing> ''' from genshi.template.text import NewTextTemplate from genshi.template import TemplateLoader @@ -466,17 +461,17 @@ def mk_job_template(ecuid, ecgid, gateway, destination, fp_root): return def delete_convert_build(src_path): - ''' - @Description: - Clean up the Fortran source directory and remove all - build files (e.g. *.o, *.mod and CONVERT2) + '''Clean up the Fortran source directory and remove all + build files (e.g. \*.o, \*.mod and CONVERT2) + + Parameters + ---------- + src_path : :obj:`string` + Path to the fortran source directory. - @Input: - src_path: string - Path to the fortran source directory. + Return + ------ - @Return: - <nothing> ''' modfiles = UioFiles(src_path, '*.mod') @@ -490,19 +485,19 @@ def delete_convert_build(src_path): return def make_convert_build(src_path, makefile): - ''' - @Description: - Compiles the Fortran code and generates the executable. + '''Compiles the Fortran code and generates the executable. + + Parameters + ---------- + src_path : :obj:`string` + Path to the fortran source directory. - @Input: - src_path: string - Path to the fortran source directory. + makefile : :obj:`string` + The name of the makefile which should be used. - makefile: string - The name of the makefile which should be used. + Return + ------ - @Return: - <nothing> ''' try: diff --git a/source/python/mods/get_mars_data.py b/source/python/mods/get_mars_data.py index cf13d65..197c1c5 100755 --- a/source/python/mods/get_mars_data.py +++ b/source/python/mods/get_mars_data.py @@ -68,18 +68,17 @@ except ImportError: # FUNCTION # ------------------------------------------------------------------------------ def main(): - ''' - @Description: - If get_mars_data is called directly from command line, + '''Controls the program to get data out of mars. + + This is done if it is called directly from command line. + Then it also takes program call arguments and control file input. - the program flow and calls the argumentparser function and - the get_mars_data function for retrieving EC data. + Parameters + ---------- - @Input: - <nothing> + Return + ------ - @Return: - <nothing> ''' args = get_cmdline_arguments() @@ -96,22 +95,21 @@ def main(): return def get_mars_data(c): - ''' - @Description: - Retrieves the EC data needed for a FLEXPART simulation. - Start and end dates for retrieval period is set. Retrievals - are divided into smaller periods if necessary and datechunk parameter - is set. - - @Input: - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. - - @Return: - <nothing> + '''Retrieves the EC data needed for a FLEXPART simulation. + + Start and end dates for retrieval period is set. Retrievals + are divided into smaller periods if necessary and datechunk parameter + is set. + + Parameters + ---------- + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. + + Return + ------ + ''' if not os.path.exists(c.inputdir): @@ -205,38 +203,36 @@ def get_mars_data(c): return def do_retrievement(c, server, start, end, delta_t, fluxes=False): - ''' - @Description: - Divides the complete retrieval period in smaller chunks and - retrieves the data from MARS. + '''Divides the complete retrieval period in smaller chunks and + retrieves the data from MARS. + + Parameters + ---------- + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. - @Input: - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. + server : :obj:`ECMWFService` + The server connection to ECMWF. - server: instance of ECMWFService - The server connection to ECMWF + start : :obj:`datetime` + The start date of the retrieval. - start: instance of datetime - The start date of the retrieval. + end : :obj:`datetime` + The end date of the retrieval. - end: instance of datetime - The end date of the retrieval. + delta_t : :obj:`datetime` + Delta_t + 1 is the maximal time period of a single + retrieval. - delta_t: instance of datetime - Delta_t +1 is the maximal time period of a single - retrieval. + fluxes : :obj:`boolean`, optional + Decides if the flux parameters are to be retrieved or + the rest of the parameter list. + Default value is False. - fluxes: boolean, optional - Decides if the flux parameters are to be retrieved or - the rest of the parameter list. - Default value is False. + Return + ------ - @Return: - <nothing> ''' # since actual day also counts as one day, diff --git a/source/python/mods/prepare_flexpart.py b/source/python/mods/prepare_flexpart.py index 2e2d84e..f60f05e 100755 --- a/source/python/mods/prepare_flexpart.py +++ b/source/python/mods/prepare_flexpart.py @@ -78,17 +78,17 @@ except ImportError: # FUNCTION # ------------------------------------------------------------------------------ def main(): - ''' - @Description: - If prepare_flexpart is called from command line, this function controls - the program flow and calls the argumentparser function and - the prepare_flexpart function for preparation of GRIB data for FLEXPART. + '''Controls the program to prepare flexpart input files from mars data. + + This is done if it is called directly from command line. + Then it also takes program call arguments and control file input. + + Parameters + ---------- - @Input: - <nothing> + Return + ------ - @Return: - <nothing> ''' args = get_cmdline_arguments() @@ -104,27 +104,26 @@ def main(): return def prepare_flexpart(ppid, c): - ''' - @Description: - Lists all grib files retrieved from MARS with get_mars_data and - uses prepares data for the use in FLEXPART. Specific data fields - are converted to a different grid and the flux data are going to be - disaggregated. The data fields are collected by hour and stored in - a file with a specific FLEXPART relevant naming convention. - - @Input: - ppid: int - Contains the ppid number of the current ECMWF job. If it is called - from this script, it is "None". - - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. - - @Return: - <nothing> + '''Converts the mars data into flexpart ready input files. + + Specific data fields are converted to a different grid and the flux + data are going to be disaggregated. The data fields are collected by + hour and stored in a file with a specific FLEXPART relevant naming + convention. + + Parameters + ---------- + ppid : :obj:`int` + Contains the ppid number of the current ECMWF job. It will be None if + the method was called within this module. + + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. + + Return + ------ + ''' if not ppid: diff --git a/source/python/mods/tools.py b/source/python/mods/tools.py index d8b6c02..2ab2ad4 100644 --- a/source/python/mods/tools.py +++ b/source/python/mods/tools.py @@ -60,56 +60,55 @@ from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter # ------------------------------------------------------------------------------ def none_or_str(value): - ''' - @Description: - Converts the input string into pythons None-type if the string - contains "None". - - @Input: - value: string - String to be checked for the "None" word. - - @Return: - None or value: - Return depends on the content of the input value. If it was "None", - then the python type None is returned. Otherwise the string itself. + '''Converts the input string into pythons None-type if the string + contains string "None". + + Parameters + ---------- + value : :obj:`string` + String to be checked for the "None" word. + + Return + ------ + None or value: + Return depends on the content of the input value. If it was "None", + then the python type None is returned. Otherwise the string itself. ''' if value == 'None': return None return value def none_or_int(value): - ''' - @Description: - Converts the input string into pythons None-type if the string - contains "None". Otherwise it is converted to an integer value. - - @Input: - value: string - String to be checked for the "None" word. - - @Return: - None or int(value): - Return depends on the content of the input value. If it was "None", - then the python type None is returned. Otherwise the string is - converted into an integer value. + '''Converts the input string into pythons None-type if the string + contains string "None". Otherwise it is converted to an integer value. + + Parameters + ---------- + value : :obj:`string` + String to be checked for the "None" word. + + Return + ------ + None or int(value): + Return depends on the content of the input value. If it was "None", + then the python type None is returned. Otherwise the string is + converted into an integer value. ''' if value == 'None': return None return int(value) def get_cmdline_arguments(): - ''' - @Description: - Decomposes the command line arguments and assigns them to variables. - Apply default values for non mentioned arguments. + '''Decomposes the command line arguments and assigns them to variables. + Apply default values for non mentioned arguments. - @Input: - <nothing> + Parameters + ---------- - @Return: - args: instance of ArgumentParser - Contains the commandline arguments from script/program call. + Return + ------ + args : :obj:`Namespace` + Contains the commandline arguments from script/program call. ''' parser = ArgumentParser(description='Retrieve FLEXPART input from \ @@ -189,19 +188,19 @@ def get_cmdline_arguments(): return args def read_ecenv(filename): - ''' - @Description: - Reads the file into a dictionary where the key values are the parameter - names. - - @Input: - filename: string - Path to file where the ECMWV environment parameters are stored. - - @Return: - envs: dict - Contains the environment parameter ecuid, ecgid, gateway - and destination for ECMWF server environments. + '''Reads the file into a dictionary where the key values are the parameter + names. + + Parameters + ---------- + filename : :obj:`string` + Path to file where the ECMWF environment parameters are stored. + + Return + ------ + envs : :obj:`dictionary` + Contains the environment parameter ecuid, ecgid, gateway + and destination for ECMWF server environments. ''' envs= {} @@ -213,20 +212,17 @@ def read_ecenv(filename): return envs def clean_up(c): - ''' - @Description: - Remove all files from intermediate directory - (inputdir from CONTROL file). - - @Input: - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. - - @Return: - <nothing> + '''Remove all files from intermediate directory (inputdir). + + Parameters + ---------- + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. + + Return + ------ + ''' print("clean_up") @@ -244,22 +240,22 @@ def clean_up(c): def my_error(users, message='ERROR'): - ''' - @Description: - Prints a specified error message which can be passed to the function - before exiting the program. + '''Prints a specified error message which can be passed to the function + before exiting the program. + + Parameters + ---------- + user : :obj:`list` of :obj:`string` + Contains all email addresses which should be notified. + It might also contain just the ecmwf user name which wil trigger + mailing to the associated email address for this user. - @Input: - user: list of strings - Contains all email addresses which should be notified. - It might also contain just the ecmwf user name which wil trigger - mailing to the associated email address for this user. + message : :obj:`string`, optional + Error message. Default value is "ERROR". - message: string, optional - Error message. Default value is "ERROR". + Return + ------ - @Return: - <nothing> ''' print(message) @@ -290,21 +286,20 @@ def my_error(users, message='ERROR'): def normal_exit(users, message='Done!'): - ''' - @Description: - Prints a specific exit message which can be passed to the function. + '''Prints a specific exit message which can be passed to the function. - @Input: - user: list of strings - Contains all email addresses which should be notified. - It might also contain just the ecmwf user name which wil trigger - mailing to the associated email address for this user. + Parameters + ---------- + user : :obj:`list` of :obj:`string` + Contains all email addresses which should be notified. + It might also contain just the ecmwf user name which wil trigger + mailing to the associated email address for this user. - message: string, optional - Message for exiting program. Default value is "Done!". + message : :obj:`string`, optional + Message for exiting program. Default value is "Done!". - @Return: - <nothing> + Return + ------ ''' print(message) @@ -332,30 +327,34 @@ def normal_exit(users, message='Done!'): def product(*args, **kwds): - ''' - @Description: - This method is taken from an example at the ECMWF wiki website. - https://software.ecmwf.int/wiki/display/GRIB/index.py; 2018-03-16 - - This method combines the single characters of the passed arguments - with each other. So that each character of each argument value - will be combined with each character of the other arguments as a tuple. - - Example: - product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy - product(range(2), repeat = 3) --> 000 001 010 011 100 101 110 111 - - @Input: - *args: tuple - Positional arguments (arbitrary number). - - **kwds: dictionary - Contains all the keyword arguments from *args. - - @Return: - prod: tuple - Return will be done with "yield". A tuple of combined arguments. - See example in description above. + '''This method combines the single characters of the passed arguments + with each other. So that each character of each argument value + will be combined with each character of the other arguments as a tuple. + + Note + ---- + This method is taken from an example at the ECMWF wiki website. + https://software.ecmwf.int/wiki/display/GRIB/index.py; 2018-03-16 + + Example + ------- + product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy + + product(range(2), repeat = 3) --> 000 001 010 011 100 101 110 111 + + Parameters + ---------- + \*args : :obj:`tuple` + Positional arguments (arbitrary number). + + \*\*kwds : :obj:`dictionary` + Contains all the keyword arguments from \*args. + + Return + ------ + prod : :obj:`tuple` + Return will be done with "yield". A tuple of combined arguments. + See example in description above. ''' pools = map(tuple, args) * kwds.get('repeat', 1) result = [[]] @@ -368,17 +367,17 @@ def product(*args, **kwds): def silent_remove(filename): - ''' - @Description: - Remove file if it exists. - The function does not fail if the file does not exist. + '''Remove file if it exists. + The function does not fail if the file does not exist. + + Parameters + ---------- + filename : :obj:`string` + The name of the file to be removed without notification. - @Input: - filename: string - The name of the file to be removed without notification. + Return + ------ - @Return: - <nothing> ''' try: os.remove(filename) @@ -391,19 +390,19 @@ def silent_remove(filename): def init128(filepath): - ''' - @Description: - Opens and reads the grib file with table 128 information. - - @Input: - filepath: string - Path to file of ECMWF grib table number 128. - - @Return: - table128: dictionary - Contains the ECMWF grib table 128 information. - The key is the parameter number and the value is the - short name of the parameter. + '''Opens and reads the grib file with table 128 information. + + Parameters + ---------- + filepath : :obj:`string` + Path to file of ECMWF grib table number 128. + + Return + ------ + table128 : :obj:`dictionary` + Contains the ECMWF grib table 128 information. + The key is the parameter number and the value is the + short name of the parameter. ''' table128 = dict() with open(filepath) as f: @@ -416,27 +415,26 @@ def init128(filepath): def to_param_id(pars, table): - ''' - @Description: - Transform parameter names to parameter ids - with ECMWF grib table 128. - - @Input: - pars: string - Addpar argument from CONTROL file in the format of - parameter names instead of ids. The parameter short - names are sepearted with "/" and they are passed as - one single string. - - table: dictionary - Contains the ECMWF grib table 128 information. - The key is the parameter number and the value is the - short name of the parameter. - - @Return: - ipar: list of integer - List of addpar parameters from CONTROL file transformed to - parameter ids in the format of integer. + '''Transform parameter names to parameter ids with ECMWF grib table 128. + + Parameters + ---------- + pars : :obj:`string` + Addpar argument from CONTROL file in the format of + parameter names instead of ids. The parameter short + names are sepearted with "/" and they are passed as + one single string. + + table : :obj:`dictionary` + Contains the ECMWF grib table 128 information. + The key is the parameter number and the value is the + short name of the parameter. + + Return + ------ + ipar : :obj:`list` of :obj:`integer` + List of addpar parameters from CONTROL file transformed to + parameter ids in the format of integer. ''' cpar = pars.upper().split('/') ipar = [] @@ -451,21 +449,21 @@ def to_param_id(pars, table): return ipar def get_list_as_string(list_obj, concatenate_sign=', '): - ''' - @Description: - Converts a list of arbitrary content into a single string. + '''Converts a list of arbitrary content into a single string. - @Input: - list_obj: list - A list with arbitrary content. + Parameters + ---------- + list_obj : :obj:`list` + A list with arbitrary content. - concatenate_sign: string, optional - A string which is used to concatenate the single - list elements. Default value is ", ". + concatenate_sign : :obj:`string`, optional + A string which is used to concatenate the single + list elements. Default value is ", ". - @Return: - str_of_list: string - The content of the list as a single string. + Return + ------ + str_of_list : :obj:`string` + The content of the list as a single string. ''' str_of_list = concatenate_sign.join(str(l) for l in list_obj) @@ -473,17 +471,17 @@ def get_list_as_string(list_obj, concatenate_sign=', '): return str_of_list def make_dir(directory): - ''' - @Description: - Creates a directory and gives a warning if the directory - already exists. The program stops only if there is another problem. + '''Creates a directory and gives a warning if the directory + already exists. The program stops only if there is another problem. - @Input: - directory: string - The directory name including the path which should be created. + Parameters + ---------- + directory : :obj:`string` + The directory name including the path which should be created. + + Return + ------ - @Return: - <nothing> ''' try: os.makedirs(directory) @@ -497,35 +495,36 @@ def make_dir(directory): return def put_file_to_ecserver(ecd, filename, target, ecuid, ecgid): - ''' - @Description: - Uses the ecaccess-file-put command to send a file to the ECMWF servers. + '''Uses the ecaccess-file-put command to send a file to the ECMWF servers. - NOTE: - The return value is just for testing reasons. It does not have - to be used from the calling function since the whole error handling - is done in here. + Note + ---- + The return value is just for testing reasons. It does not have + to be used from the calling function since the whole error handling + is done in here. - @Input: - ecd: string - The path were the file is stored. + Parameters + ---------- + ecd : :obj:`string` + The path were the file is stored. - filename: string - The name of the file to send to the ECMWF server. + filename : :obj:`string` + The name of the file to send to the ECMWF server. - target: string - The target queue where the file should be sent to. + target : :obj:`string` + The target queue where the file should be sent to. - ecuid: string - The user id on ECMWF server. + ecuid : :obj:`string` + The user id on ECMWF server. - ecgid: string - The group id on ECMWF server. + ecgid : :obj:`string` + The group id on ECMWF server. - @Return: - rcode: string - Resulting code of command execution. If successful the string - will be empty. + Return + ------ + rcode : :obj:`string` + Resulting code of command execution. If successful the string + will be empty. ''' try: @@ -545,27 +544,28 @@ def put_file_to_ecserver(ecd, filename, target, ecuid, ecgid): return rcode def submit_job_to_ecserver(target, jobname): - ''' - @Description: - Uses ecaccess-job-submit command to submit a job to the ECMWF server. - - NOTE: - The return value is just for testing reasons. It does not have - to be used from the calling function since the whole error handling - is done in here. - - @Input: - target: string - The target where the file should be sent to, e.g. the queue. - - jobname: string - The name of the jobfile to be submitted to the ECMWF server. - - @Return: - rcode: string - Resulting code of command execution. If successful the string - will contain an integer number, representing the id of the job - at the ecmwf server. + '''Uses ecaccess-job-submit command to submit a job to the ECMWF server. + + Note + ---- + The return value is just for testing reasons. It does not have + to be used from the calling function since the whole error handling + is done in here. + + Parameters + ---------- + target : :obj:`string` + The target where the file should be sent to, e.g. the queue. + + jobname : :obj:`string` + The name of the jobfile to be submitted to the ECMWF server. + + Return + ------ + rcode : :obj:`string` + Resulting code of command execution. If successful the string + will contain an integer number, representing the id of the job + at the ecmwf server. ''' try: diff --git a/source/python/submit.py b/source/python/submit.py index 37342d3..1e13a9c 100755 --- a/source/python/submit.py +++ b/source/python/submit.py @@ -61,18 +61,17 @@ from classes.ControlFile import ControlFile # ------------------------------------------------------------------------------ def main(): - ''' - @Description: - Get the arguments from script call and from CONTROL file. - Decides from the argument "queue" if the local version - is done "queue=None" or the gateway version with "queue=ecgate" - or "queue=cca". + '''Get the arguments from script call and from CONTROL file. + Decides from the argument "queue" if the local version + is done "queue=None" or the gateway version with "queue=ecgate" + or "queue=cca". + + Parameters + ---------- - @Input: - <nothing> + Return + ------ - @Return: - <nothing> ''' args = get_cmdline_arguments() @@ -104,29 +103,27 @@ def main(): return def submit(jtemplate, c, queue): - ''' - @Description: - Prepares the job script and submit it to the specified queue. - - @Input: - jtemplate: string - Job template file from sub-directory "_templates" for - submission to ECMWF. It contains all necessary - module and variable settings for the ECMWF environment as well as - the job call and mail report instructions. - Default is "job.temp". - - c: instance of class ControlFile - Contains all the parameters of CONTROL file and - command line. - For more information about format and content of the parameter - see documentation. - - queue: string - Name of queue for submission to ECMWF (e.g. ecgate or cca ) - - @Return: - <nothing> + '''Prepares the job script and submit it to the specified queue. + + Parameters + ---------- + jtemplate : :obj:`string` + Job template file from sub-directory "_templates" for + submission to ECMWF. It contains all necessary + module and variable settings for the ECMWF environment as well as + the job call and mail report instructions. + Default is "job.temp". + + c : :obj:`ControlFile` + Contains all the parameters of CONTROL file and + command line. + + queue : :obj:`string` + Name of queue for submission to ECMWF (e.g. ecgate or cca ) + + Return + ------ + ''' # read template file and get index for CONTROL input -- GitLab