From c7362c0984fc33f4fb1c435d83d051e3dcec63a1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 29 Dec 2015 22:36:45 -0600 Subject: [PATCH] Documentation for version 0.7.1. --- _images/cmfd_flow.png | Bin 0 -> 25211 bytes _images/fluxplot.png | Bin 26925 -> 0 bytes ...99677a85278e7bc23d9eaeac79d13163679e20.png | Bin 0 -> 1249 bytes ...d586f6b5c3a0445fa328423430a9390fd2834b.png | Bin 0 -> 240 bytes ...989a72aeaf778381894e0025fe309783e17235.png | Bin 0 -> 314 bytes ...03aee7981b994864deb372377f9e45ab6cf1e0.png | Bin 0 -> 396 bytes ...42fd9fe743f3d9862754ecf1a9647846ca5b61.png | Bin 0 -> 1249 bytes ...d22b7d58794e86808b2ebff1de726e16656617.png | Bin 0 -> 1308 bytes ...4fc0ac8edd6ce5b9093890970e60ae4d760c73.png | Bin 0 -> 657 bytes ...69c1d194d08831dac6d14c6c98a4ff476dca4a.png | Bin 0 -> 691 bytes ...0b3c998a0208c7143deb1d64325bc106e2ac44.png | Bin 0 -> 737 bytes ...4aec50d29458b96c09e92c97104e670710c0f8.png | Bin 0 -> 760 bytes ...a73f999a8f7a592fe5217a2006a9e6a07e78b6.png | Bin 0 -> 342 bytes _images/meshfig.png | Bin 0 -> 46942 bytes _images/mgxs-part-i-content_3_0.png | Bin 0 -> 54562 bytes _images/mgxs-part-ii-content_67_1.png | Bin 0 -> 19235 bytes _images/mgxs-part-ii-content_71_0.png | Bin 0 -> 7358 bytes _images/mgxs-part-iii-content_30_0.png | Bin 0 -> 1460 bytes _images/mgxs-part-iii-content_90_1.png | Bin 0 -> 7010 bytes _images/pandas-dataframes-content_26_0.png | Bin 0 -> 1271 bytes _images/pandas-dataframes-content_46_0.png | Bin 0 -> 8577 bytes _images/pandas-dataframes-content_47_1.png | Bin 0 -> 7945 bytes _images/pandas-dataframes-content_67_2.png | Bin 0 -> 28620 bytes _images/pandas-dataframes-content_68_1.png | Bin 0 -> 10243 bytes _images/post-processing-content_24_0.png | Bin 0 -> 1000 bytes _images/post-processing-content_44_1.png | Bin 0 -> 78130 bytes _images/post-processing-content_46_0.png | Bin 0 -> 5136 bytes _images/post-processing-content_53_2.png | Bin 0 -> 6025 bytes _images/post-processing-content_55_2.png | Bin 0 -> 101347 bytes _images/tally-arithmetic-content_25_0.png | Bin 0 -> 985 bytes _sources/devguide/index.txt | 2 - _sources/devguide/statepoint.txt | 291 - _sources/devguide/voxel.txt | 52 - _sources/methods/eigenvalue.txt | 2 +- _sources/methods/geometry.txt | 19 +- _sources/methods/physics.txt | 48 +- _sources/publications.txt | 63 +- _sources/pythonapi/energy_groups.txt | 8 + .../examples/mgxs-part-i-content.txt | 910 +++ _sources/pythonapi/examples/mgxs-part-i.txt | 13 + .../examples/mgxs-part-ii-content.txt | 1532 +++++ _sources/pythonapi/examples/mgxs-part-ii.txt | 13 + .../examples/mgxs-part-iii-content.txt | 1168 ++++ _sources/pythonapi/examples/mgxs-part-iii.txt | 13 + .../examples/pandas-dataframes-content.txt | 1805 ++++++ .../examples/post-processing-content.txt | 767 +++ .../pythonapi/examples/post-processing.txt | 13 + .../examples/tally-arithmetic-content.txt | 1127 ++++ _sources/pythonapi/index.txt | 13 + _sources/pythonapi/mgxs.txt | 66 + _sources/pythonapi/mgxs_library.txt | 8 + _sources/quickinstall.txt | 4 +- _sources/releasenotes.txt | 84 +- _sources/usersguide/index.txt | 3 +- _sources/usersguide/input.txt | 236 +- _sources/usersguide/install.txt | 94 +- _sources/usersguide/output/index.txt | 16 + .../usersguide/output/particle_restart.txt | 57 + _sources/usersguide/output/source.txt | 19 + _sources/usersguide/output/statepoint.txt | 259 + _sources/usersguide/output/summary.txt | 311 ++ _sources/usersguide/output/track.txt | 30 + _sources/usersguide/output/voxel.txt | 25 + _sources/usersguide/processing.txt | 291 +- _sources/usersguide/troubleshoot.txt | 23 +- _static/searchtools.js | 45 +- developers.html | 4 +- devguide/docbuild.html | 18 +- devguide/index.html | 18 +- devguide/statepoint.html | 328 -- devguide/structures.html | 4 +- devguide/styleguide.html | 4 +- devguide/voxel.html | 132 - devguide/workflow.html | 4 +- devguide/xml-parsing.html | 10 +- genindex.html | 817 ++- index.html | 6 +- license.html | 4 +- methods/cmfd.html | 10 +- methods/cross_sections.html | 4 +- methods/eigenvalue.html | 6 +- methods/geometry.html | 43 +- methods/index.html | 16 +- methods/introduction.html | 4 +- methods/parallelization.html | 10 +- methods/physics.html | 73 +- methods/random_numbers.html | 4 +- methods/tallies.html | 4 +- objects.inv | Bin 5001 -> 6122 bytes publications.html | 61 +- py-modindex.html | 14 +- pythonapi/ace.html | 4 +- pythonapi/cmfd.html | 4 +- pythonapi/element.html | 11 +- pythonapi/energy_groups.html | 211 + pythonapi/examples/mgxs-part-i-content.html | 846 +++ pythonapi/examples/mgxs-part-i.html | 2518 +++++++++ pythonapi/examples/mgxs-part-ii-content.html | 1467 +++++ pythonapi/examples/mgxs-part-ii.html | 2870 ++++++++++ pythonapi/examples/mgxs-part-iii-content.html | 1087 ++++ pythonapi/examples/mgxs-part-iii.html | 2294 ++++++++ .../examples/pandas-dataframes-content.html | 1685 ++++++ pythonapi/examples/pandas-dataframes.html | 2404 ++++---- .../examples/post-processing-content.html | 699 +++ pythonapi/examples/post-processing.html | 4931 +++++++++++++++++ .../examples/tally-arithmetic-content.html | 1020 ++++ pythonapi/examples/tally-arithmetic.html | 564 +- pythonapi/executor.html | 4 +- pythonapi/filter.html | 173 +- pythonapi/geometry.html | 4 +- pythonapi/index.html | 22 +- pythonapi/material.html | 8 +- pythonapi/mesh.html | 4 +- pythonapi/mgxs.html | 1020 ++++ pythonapi/mgxs_library.html | 450 ++ pythonapi/nuclide.html | 11 +- pythonapi/opencg_compatible.html | 4 +- pythonapi/particle_restart.html | 18 +- pythonapi/plots.html | 92 +- pythonapi/settings.html | 11 +- pythonapi/statepoint.html | 284 +- pythonapi/summary.html | 48 +- pythonapi/surface.html | 370 +- pythonapi/tallies.html | 367 +- pythonapi/trigger.html | 6 +- pythonapi/universe.html | 79 +- quickinstall.html | 14 +- releasenotes.html | 78 +- search.html | 4 +- searchindex.js | 2 +- usersguide/beginners.html | 4 +- usersguide/index.html | 60 +- usersguide/input.html | 254 +- usersguide/install.html | 101 +- usersguide/output/index.html | 99 + usersguide/output/particle_restart.html | 128 + usersguide/output/source.html | 100 + usersguide/output/statepoint.html | 287 + usersguide/output/summary.html | 324 ++ usersguide/output/track.html | 109 + usersguide/output/voxel.html | 104 + usersguide/processing.html | 337 +- usersguide/troubleshoot.html | 58 +- 143 files changed, 35050 insertions(+), 3631 deletions(-) create mode 100644 _images/cmfd_flow.png delete mode 100644 _images/fluxplot.png create mode 100644 _images/math/0099677a85278e7bc23d9eaeac79d13163679e20.png create mode 100644 _images/math/11d586f6b5c3a0445fa328423430a9390fd2834b.png create mode 100644 _images/math/1b989a72aeaf778381894e0025fe309783e17235.png create mode 100644 _images/math/1c03aee7981b994864deb372377f9e45ab6cf1e0.png create mode 100644 _images/math/2542fd9fe743f3d9862754ecf1a9647846ca5b61.png create mode 100644 _images/math/38d22b7d58794e86808b2ebff1de726e16656617.png create mode 100644 _images/math/5c4fc0ac8edd6ce5b9093890970e60ae4d760c73.png create mode 100644 _images/math/6069c1d194d08831dac6d14c6c98a4ff476dca4a.png create mode 100644 _images/math/ac0b3c998a0208c7143deb1d64325bc106e2ac44.png create mode 100644 _images/math/d44aec50d29458b96c09e92c97104e670710c0f8.png create mode 100644 _images/math/fba73f999a8f7a592fe5217a2006a9e6a07e78b6.png create mode 100644 _images/meshfig.png create mode 100644 _images/mgxs-part-i-content_3_0.png create mode 100644 _images/mgxs-part-ii-content_67_1.png create mode 100644 _images/mgxs-part-ii-content_71_0.png create mode 100644 _images/mgxs-part-iii-content_30_0.png create mode 100644 _images/mgxs-part-iii-content_90_1.png create mode 100644 _images/pandas-dataframes-content_26_0.png create mode 100644 _images/pandas-dataframes-content_46_0.png create mode 100644 _images/pandas-dataframes-content_47_1.png create mode 100644 _images/pandas-dataframes-content_67_2.png create mode 100644 _images/pandas-dataframes-content_68_1.png create mode 100644 _images/post-processing-content_24_0.png create mode 100644 _images/post-processing-content_44_1.png create mode 100644 _images/post-processing-content_46_0.png create mode 100644 _images/post-processing-content_53_2.png create mode 100644 _images/post-processing-content_55_2.png create mode 100644 _images/tally-arithmetic-content_25_0.png delete mode 100644 _sources/devguide/statepoint.txt delete mode 100644 _sources/devguide/voxel.txt create mode 100644 _sources/pythonapi/energy_groups.txt create mode 100644 _sources/pythonapi/examples/mgxs-part-i-content.txt create mode 100644 _sources/pythonapi/examples/mgxs-part-i.txt create mode 100644 _sources/pythonapi/examples/mgxs-part-ii-content.txt create mode 100644 _sources/pythonapi/examples/mgxs-part-ii.txt create mode 100644 _sources/pythonapi/examples/mgxs-part-iii-content.txt create mode 100644 _sources/pythonapi/examples/mgxs-part-iii.txt create mode 100644 _sources/pythonapi/examples/pandas-dataframes-content.txt create mode 100644 _sources/pythonapi/examples/post-processing-content.txt create mode 100644 _sources/pythonapi/examples/post-processing.txt create mode 100644 _sources/pythonapi/examples/tally-arithmetic-content.txt create mode 100644 _sources/pythonapi/mgxs.txt create mode 100644 _sources/pythonapi/mgxs_library.txt create mode 100644 _sources/usersguide/output/index.txt create mode 100644 _sources/usersguide/output/particle_restart.txt create mode 100644 _sources/usersguide/output/source.txt create mode 100644 _sources/usersguide/output/statepoint.txt create mode 100644 _sources/usersguide/output/summary.txt create mode 100644 _sources/usersguide/output/track.txt create mode 100644 _sources/usersguide/output/voxel.txt delete mode 100644 devguide/statepoint.html delete mode 100644 devguide/voxel.html create mode 100644 pythonapi/energy_groups.html create mode 100644 pythonapi/examples/mgxs-part-i-content.html create mode 100644 pythonapi/examples/mgxs-part-i.html create mode 100644 pythonapi/examples/mgxs-part-ii-content.html create mode 100644 pythonapi/examples/mgxs-part-ii.html create mode 100644 pythonapi/examples/mgxs-part-iii-content.html create mode 100644 pythonapi/examples/mgxs-part-iii.html create mode 100644 pythonapi/examples/pandas-dataframes-content.html create mode 100644 pythonapi/examples/post-processing-content.html create mode 100644 pythonapi/examples/post-processing.html create mode 100644 pythonapi/examples/tally-arithmetic-content.html create mode 100644 pythonapi/mgxs.html create mode 100644 pythonapi/mgxs_library.html create mode 100644 usersguide/output/index.html create mode 100644 usersguide/output/particle_restart.html create mode 100644 usersguide/output/source.html create mode 100644 usersguide/output/statepoint.html create mode 100644 usersguide/output/summary.html create mode 100644 usersguide/output/track.html create mode 100644 usersguide/output/voxel.html diff --git a/_images/cmfd_flow.png b/_images/cmfd_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..078f1a4bf844daa633bbf7ab044eb94c8615d84b GIT binary patch literal 25211 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 LNkvXXu0mjfv*Jt` literal 0 HcmV?d00001 diff --git a/_images/math/11d586f6b5c3a0445fa328423430a9390fd2834b.png b/_images/math/11d586f6b5c3a0445fa328423430a9390fd2834b.png new file mode 100644 index 0000000000000000000000000000000000000000..b11cad228b5e02101572eed7fa1a486815778930 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^dO$41!VDy@>3_Tgq|^g^LR|m<{|{sm1WHr=<^dJ) zlmz(&Gu%C2;xSjkXnl9WOX-KgLO^lO0*}aI1_r((Aj~*bn@<`j81Cuf7$R{wS->da z0LvUN9Fp({cHDsbZPmXYa%Z@t3f}0PSfl^| literal 0 HcmV?d00001 diff --git a/_images/math/1c03aee7981b994864deb372377f9e45ab6cf1e0.png b/_images/math/1c03aee7981b994864deb372377f9e45ab6cf1e0.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7b0be8b36d9ebb6b229193cffea07b465a737d GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^en2eB!VDy(&K{KlQU(D&A+G=b{|7RO2l{sxR0CD> zmjw9*Gn`Mj>tQ7EyX5ow{V%)cvKjcd0;M<$JR*x382FBWFymBhK53xfb59q?5RLQ6 z2?v-W3W@>_9_HR*q0tb&keQubbOWPe8K0viXB0DWJ!kbOWsqK_-QUc@8eqZY z5Hz=udCAOZ0TwZa$iE8ejIu|JSUV3N*f627nz^g;48Md#S+mkM4xmuMw8qVhrdE6g z20jO#)Fhtp_jK4a{p>?7X7^^M5Xm`*zqBS=>UUM1PLlj_No+y!4!`@pds-Hq`)AJl v`9JRqnR#rFf|%+V3SV96^oiWw5zNN0!P-&jz~|#JpaAuB^>bP0l+XkKMAU%v literal 0 HcmV?d00001 diff --git a/_images/math/2542fd9fe743f3d9862754ecf1a9647846ca5b61.png b/_images/math/2542fd9fe743f3d9862754ecf1a9647846ca5b61.png new file mode 100644 index 0000000000000000000000000000000000000000..241b7e47640b5c1fd1e39618b11e70817b75c3ee GIT binary patch literal 1249 zcmV<71Rnc|P)3`SnceCBBpXCUrIArFc6u=?=E^lon?O6ZWE_6?ic3;`@n|sn zyk06bt{;0c6?!ghnar&QjXzSQn=Yksjo`CK)#|xb|CxH+RCw@N*O!|^E(V?p-9@axI0bjX^U>&TN#%4TSI+%j7Xs7ka1DfVx4!Xt%_~Yo9 zs5{GVrkHQ61Le9T4fETsDe7QL4_%~1-cBSgFqCQZtaNEWkFjX>j0SO0TGv>GIcOSN zd`ir0AFr~io|Jly(tg8}BthS@K$j^k#QIuVOX=^>LJqlf$;-(85Y_q(S#g6h|N8n7N;K-|^+&PkMSA}RF7F&4?B1Vd!w9fZM z)lW$4t#lc8v0Mh@wjvsBoW?I>LX+Gu>8MeFMRv$0{Qq=c;7^YSXXxbVzE%30=gv2m z!zEA6=oQhxN%7ulHZL@rG?rzygl+mep@C>?XO|e&AtMa=HXeh+t8>0AwGh4u7{+b8 z(U^Xzqe*TU)kL8~XF>H}!w?@89|mpjURRypGrYe?aDQU=7g&GylBc6WbL_yUct0aX zib2lMr-|+J>SItORu~r9ifEK??y}Gl$T>|E;8v*q6=bLQat_TFJwr+TSDJPjiZ)(M z^fyCfiTZpyqZ81>)TOsbzCsfjks@f8GS6^B!{PH8mmsjnb~x%+u_d$w!ag7pQH*!N zPJ*OAZRzmTzJrX`jhWHd+ghZ~_Qxnaw(Yg#>HZ*aoIJnXd!r7z)4`zGq7RUW6d3I` z9O8!i?-{QqC2*{3I~)z+{uN;vt6p>v`X{1Tee_;Y{i*kKR^pkz7V!G-_uYKr6DOJa z{A$q8zRN~NTFL%e%lDF-X+PvE(AA)yW`4Z(+RHJLW5wT=gYVkB+I{MXEQNCvVqM#A zG^Z{s@=2)m21(wvOD00000 LNkvXXu0mjfv*Jt` literal 0 HcmV?d00001 diff --git a/_images/math/38d22b7d58794e86808b2ebff1de726e16656617.png b/_images/math/38d22b7d58794e86808b2ebff1de726e16656617.png new file mode 100644 index 0000000000000000000000000000000000000000..753fd16cee99c77b9b0eb6267b166aabbc19c7cd GIT binary patch literal 1308 zcmV+%1>^dOP)O-&4Ljpxq2yF2$|Vj3197qYW^ z&;0)9o^#Lr2oP#_%pj^oo3?@WTFd5R<*PPr1MRtH73`I(Hf;m#ofdQX)5|PM{h1S$ znbT%dwtDTzvysqCQH317OjD0QXo zJ;J{X13myqi{C*J__a)OE(TwQM?}xJ{9%iVz$TC@OQu2o*f&8D*UZowt&4^diNKJfbUM+dJ~PI= zC8rHY9@$NUR4@j^%Z?|@Pr?qW*N*q_4yWizu_P#tw>`-u2I zKqA`YnX&8GM~?}C-7qB}v0-@GOR9Cb4l79O7-cv$bl@KEjSC}EEY1q-V@SM?)MC@b z<*Xp@KDyquG$>P`=~~0oxv3ulQX0i9V&H=KDc>iV=8&OJh6S>kH(`_2&{cr$B^ZOM z|CzSHk{iJkQy{Sd`jQ`{$F{c0QY_s+PSGy#Rl3;qNz=sT_KA8teDdR@2GLYmb<2C+ zKg-CnG>S_zXSiV5E*;G)ruPVB7?XwWjoT!oQu(3`-3uForvJ0ErX+ysBq)^>oN4%0 zXpJ>v$ra%|26r53S1zbrbK?(HRSTlEoT;VIj}R$FK}+L6tNR(LM6>I-n~kMEEGxXx zTC4s#B5aZx#$DYDu)ub1MgQ;o%i_#iX06;#z|)oUw4JpNv)<*4zb`KZ%Z4~QnW}iI zgPStqsteQ?JWGq^H!2LuO#`ne35bzY zmXdHAqZQ~;it!yXZ_re?NHK~yg%aa}mdj^6Y=XdAvV*NaGc{pT5O%Xsyjbsp?Ix-| zZ3`Rn62NIVRI0a=@}@OC9J)q`SlAjHrmu};T|HDD22PTb@AhABg6?$DZ`bH%)FK5& zD;7t&;K3uKMb!k3wPgoeIX$={BtzW`E&_eUi_=4=m#$CgI0Nk>ecIM^3^>^0NZrtrCxqHD5k8g+VOU!hZ+`S~<^BcbjHXzU Sm1p$;0000O=u<5X=vX$A(yH=ZtzAr_~5 zr`UVQIEozGUs}HB>^=GO1p+MsPdow~Qw|1oPu+5|FsoQaOq1#5A+hjQ1@B8T9PC_X zNrfGYo|cJu79MqMnwOBcxK$>ThsCE$LG$yov-c`@S8Lndn0eRy{=a*BDvg`l%_ik? zd^g_Q@v&v0_@&a( z@xM4Qv#560(;2;XQ+soa(!bA=>NZ++DCB?iQVaK0L42>~T>reMLi{L)e^F6tm)W<7 zomx93+Cz73yEjGV;ohTRQzjoP4bYS3KlSF*W0|nPN3$m-Fa7tx;MC3Zb2_a#3WvXL zx?|BEy1pU#oVGEazQ*AdCh>kVEVq=2r5>NdRW(Qc=*r$lCE>0o;?JDC73+8YOWE%| ztP3q7`Rwl7-7GuwIZ&%=Z^Ai`n+0+5SMM6U;#}%4BwQg`v8C@vRe|WL=^>Q{e$0MS z-|qK_KhC(a*1^W<)yzjPl+S(Fa5vfb!pQx<=ZQZPgbz*0TerdMZ(MHQwYT$Q_S}De zm(_;1&?7a}?)Qti-COKs?sw~c&}zy){f#yM%JQ2-TxrG$+43o}1(V)ylzEq%_R-#-C*NVcToFGg ORe8GlxvXJvc# literal 0 HcmV?d00001 diff --git a/_images/math/6069c1d194d08831dac6d14c6c98a4ff476dca4a.png b/_images/math/6069c1d194d08831dac6d14c6c98a4ff476dca4a.png new file mode 100644 index 0000000000000000000000000000000000000000..5519f7966dd342a46b7c030583812c2c4650e5b8 GIT binary patch literal 691 zcmeAS@N?(olHy`uVBq!ia0vp^IY6w-!VDyL`b;(lQU(D&A+G=b{|7RO2l{sxR0CD> zmjw9*GnC9V>fSHm@q7LGyPsbs{9SirA5e<3z$3Dlfr0M`2s2LA=96Y%VB+(1aSZV| zem3;Hx3r_kzcTZgy`E?DR5;v4!mVkI!Cn7Uw!^I%STH zYM92C05R7+Cz~d0u6OK|;F4qE-*&x3?VVbX)A!!xbsLQPZ~m;vzgPX4*WqYdipqkf zuO|{pS*P8To>|Fy>x+xA*!P$hd~?f8%zW+Zey=`wVDe^(ZMEM77s@t&`4wh-=hPgw zI-a+)BW`hRdR}D4l+r6brLFsJL=^KZ`AY^@+ng6m%1t_~Fw^3^vh|Xq^L$-q6fJxn zyYp(1@4vLQKAxTpd<9F3BNe0I93oKVf_$UpZcPGs5#(VJ$ERi-I^ zRk7UPf0d~vt7hG$IkEqXKK@sj6mHt{B$RjJ9xWv(Gr2O=|5tnq&lar{`}Hn84c+`B zxI!{6<=a8l*tm_|eB5OpWG$52w4RE(mI!}M{dudRr1Ed4u-KB{o1Pc{Q;m${f0#bI t^ZBCZTfFxhyzIEGl9 z4h{Cs5DpZvHJ+JbG;^bHSL-4@rlv&-oIf1HdlzUs{(0-NLSu)Z)WJ~4S-stl)S|_m zS|2UzR_kuESjM@d<-70^ozwD!z?qjV!w|zFYr*l)Lf7@hN z$bG4F`^T7-dC8LhyLWkBTJ?XjL;m~Ke#{lCq?yD|HtyIw{pi}QPpo(fd}d^H7$>Rc zZuz-$jiSyAQR8{;i!UY5wfBfSHFM{edkTeTIQJRkJk*V>>-qiQ&w}M)NAEoE<4ioZ zMX2NX!2>x{m*~mM9a=T*T;WUQLlXk4oX&}@4Kr?V@AFD;Gy8IJ$~BFjv)8SXcQbZ; zB{p}1bBW4zL*Fws2bGR9MXS7tbgS=wJax{prxPco@ke*Rn6{LSCy${#Q6juf*6{Nr zR--&7^=&;Trkl)pZhcJZmYn>r#qqf|zui{1-e#A6|K$4zGyOAN^0#OAemBtgX(0CD v$P~4}g?eX_w)_kJQ(wGl-6PkQ{rnI4Lw{{D6@8|Y2TG-$u6{1-oD!M<^IJL? literal 0 HcmV?d00001 diff --git a/_images/math/d44aec50d29458b96c09e92c97104e670710c0f8.png b/_images/math/d44aec50d29458b96c09e92c97104e670710c0f8.png new file mode 100644 index 0000000000000000000000000000000000000000..34935dbdfe13270ab51e0d5ce2c5786f86bc412e GIT binary patch literal 760 zcmeAS@N?(olHy`uVBq!ia0vp^`+%5-g&9cdMMzx$QU(D&A+G=b{|7RO2l{sxR0CD> zmjw9*Gwe_3p8MIu=x)jH^%Cb_{#r0~6;O(^z$3Dlfr0M`2s2LA=96Y%U<&qhaSX9I z9UJVJAsi@BJNs_R>^HMSHcr3gNwP5GBPYTOtb~=VTbHo{lgjgiV z&B!(qKe+qI1?2~GHyo8K=-sT}Fn5}*|H*Eprj2o2XE}m+Ro^i#ouMV=@J`zK_Ns+~ z>8h$PXKeC`oxbz5Q`m#|nSXjx9OlkTg z&R^2kRo+azwqJLZsca$GOn1 zyvy8lgw<=0o=o(D{xFjrRwLObcktb z{Jq03@o90J=JEjNZHnJ!tnz)zdN)P$&h)8!7rD$YoEDlj?O>4N$3D-WQ~a)R7X`gt zayD1qblSwu(7H>h57>B0eBwO6&0Bs%cGklc-F}{%U#Bw9Kgz23(s^m?j_

)$hMN zcTQpEyh*NiEshJjq}$J&R<>uo^vUY7ZJV>jT&GS=Ruunp&TjViZzXG9i$C}~^HBVM W>kXmI%ts|biPzKB&t;ucLK6U_#zR#A literal 0 HcmV?d00001 diff --git a/_images/math/fba73f999a8f7a592fe5217a2006a9e6a07e78b6.png b/_images/math/fba73f999a8f7a592fe5217a2006a9e6a07e78b6.png new file mode 100644 index 0000000000000000000000000000000000000000..c76904da1e705f979a676078cfb986f4fc155948 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^ra&yr!VDx2*+yglDT4r?5ZC|z{{xxC1O2-Ts)4Hc zOM?7@8Sb7h@tAA$^7sDr65R=(SLZ!l4V2<6@Q5sCVBk9f!i-b3`J{n@8$DedLp07O zCmdkpW7s%>v25pDhcyk(@}C*+6!EZDJW2X+!cytvQlM-0GagA;4W!wbnb{}ZF$sId zV$f`?c!0;_qwelF{r5}E+?jBI`Y literal 0 HcmV?d00001 diff --git a/_images/meshfig.png b/_images/meshfig.png new file mode 100644 index 0000000000000000000000000000000000000000..c84becf3a0346ddb1c0cf51858cf16338ea47e5a GIT binary patch literal 46942 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

%vLND}1}pwwjk{lj&T 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%0A3-Pt4rTcE=AKUMLd$2cL5vTThF>c9x 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 literal 0 HcmV?d00001 diff --git a/_images/mgxs-part-ii-content_71_0.png b/_images/mgxs-part-ii-content_71_0.png new file mode 100644 index 0000000000000000000000000000000000000000..dc57a514455b0fb5b3ec3d3990c1f3a0b294a1bb GIT binary patch literal 7358 zcmaKR2Ut_f)^-v=L_mxvAWckY5(JdqMS~C!5Tu3{-~iG=2+|>Pjz*ATBE6|ZP`k(tar`q2RBR&xQ_`Q1A#!? zC_|(L2m}se<_C`+VLsE9)b2C?Sc9*iERQl%)X_ii%rZxyp^9^T^qIqTrpfPSaeDH)Fk^b;E7r@g06{gwJkjP|FP-!bUZM;(=@9GR0y zt_R3$0xm>@)%@OvC$5r4tmk0gd?c+pub;pAqN!bXNMmj==zj3>`0n87Zp>t5Mn>)C zsOKWqUwe1dr?Pbbjq&);WNoay+5~Y=z>fkwgd){)iqObaa{XSEhY58SsNM4;HfXYr z@Px5fi3P#~t4JC5?S^?+V$;^bkPq2Z2qEuI^r{^V%OJVkyLn%yCz3S`O>RtIHvl`c zOkAK<>-CJ7k$HB)mu093!jkN>HY`8%KBPe6-B=V*2bdG`X`Z{H)IjPykWTRTj|fnt z%3{t@&8don{GWvn$K&K#5@+@%xTBs{`cW9ig&>tiO`0%1*3h&y-K(;0o>Vu2j%KdL zn)w74Km$eu57qJmE;=uHa_JsZvNKtIujP(t;8T(_pZVm|%*xN23m(vFl|YWbRWXVm zPn4*DJS`f~AhA%tLl^dqfs*ZYR!sNPC^cAwc%Gf*?SL8wWZ9=0e^2U5mAO}1^n;y9 zXR?av(&7U=Z`^p?Vvg$)8?^~<`=THvkF5;CXnkHLVVIN|Em013$m;bUpVa_pfYgc( zOBn0cr=x8>Z9v5K`VNqPbvrP5)i}{;$;3%Yoya=`R3=l?jBPmA2?sJ4)Ca;1BPAT|k+$acIElYPJ>up_nnYKg0hw%rBRteHg zsm%n_6#O)*qb?K~RWLY*7K8Dny^2IGunL=LJkSCy$k9geYR7G%TcAKaq%6w&uZ048 zi41T7Xo6)-+N;5#y%ooclfo^7bP0pQ@7wsdxM@^fo!E_nxLKULppbrNGN5W`b4f97 zz^ExPzi@`#}w?yu{`tu1#e`h0QClyC8^XL zRT~F~x%yBiQL)3;lNlj4$c2wJF;dh}RKrZoj!$M8C!;keP0}kADU3>Rgt@v!e-%{OR}9PQX2ykrhTz?9&WgkOw13zB~{#rOl$s#BqnGtDSrjHgSAsPYga zHDIp1)JOnEa@#wBvSDdwOYaNXH>Wy~Pw%yZcYhF9)qzsL95_OVfV-Zg-zCKe>A{r+ z(e(218+)O~sBB5vYh3;N3W$y{boN^32DG}7bcWzDvuOs|m!-7=PQdo|?KNp?^_bvS zLA8r8YeI;ULei;^QpCGIpXH9(NI6O_W%o9x4_@-wlBPpZ#Y9NmHfudg75901LjvC9 zc8!|ia%?n4^N0@3@w)eWr6|G17u6@AoT-qVV8ReA&(idLz%sFYS%Wa~k6k-EGMXUj zSF+rIlDg}+`rg-EYV)=4^&L%}kKK_rse%##M6;S`JDxBVnA`*WE^LZ{w=GIp^oLj{ z;d^1Ovv>hGO&KLWv)RriE9Qm8*i$2+)et%x28Hq=y815TM=Z&9KsoSD{X+_C(aiTY zwLta2KS|0cj_o%^O}?B_PULUVgR4Y94v574h|3Eu-OxZC59tA}AHavWHeRZWj{Iv~Pf`quc2b+oqtS^7E84Etc z&9UEv-}0H(rLrC|y%paxe(Wr4Z|?(3{(JUbnQ&qXXjav)IhzyFi-btrV}CJlOX)~hQ^96_ z&oa+DG70gbG8Ij$B%0O)zu#LBf|!9kL1y}$0r084Lk;=A`xQT`5G_azIrdVB2PF^M zRFIO)R_^Ye0VZ!J3ZVEwK1w1tH;p5z3YJ%62~Pj8QNBZL(qOT@K~4+LQ4~;{><7gd zcq@PxjOMz$>tm*OFNNhEG!^U#vkL2JEVYTz>cDeKu7yt%Jz8ek-Z$~nvlu&4fSSdn zu?T6^Wbtv+CEbVkb(EukF1rd_y2N^lO179dxS zFw4HRkZ4lr30|FD$@f9)=5^%pEacm(rpzooo!R6`z-yy2mN*|Zm+bs&Zg0ObtGBWD^p#Cov!jjZ@fcIFT z24oAH{B1}rRwAH5G7ya{(@$u&5@?x>IZti95VVh;U|-`^CAn=rFZy9eYN}S{%pG5}Q%5TsMdF|@mfc2qKYl~Rbup_?T zX4~Ev+%9E9-9dIj`(CT>a?vb)Rk!RlqZ}1V!O0)-Kpuc2rAK*PyUO1m$Th^?&K_tTBlz?aPpi;*jw^G#Jc~9+S))0a8h$Vd>mk=0H#WP+ zO^v{0WRZYP$JY^?n7mZ-9>rsDcKVJUQ5~WK|#@`w%*wTtu ziW6@&)tERwyEv}c3s%JKuKe16?J%Ifx|t~t%Qlk^=smX`mcttLDC9Ha1^(x9PuU5q z89jP0zJ3B9WsDStLMsXT(E0?t4g6W9@$lQYNSrRRvz4T{eVdeX0d&AoCJf~v%I${s zM*A7C5aCmD#O3%F6J$&7bhs6DPIw>(6_IsbTv3WJ({tKhHLl3(@NxDn zar(IMY=*+DCg_!zRn_7`aqO-yAT~KmBeD4z{f`Sx~HxCVuHFE6Szz_j&hlO#CxjGT6}tn+hS* zU$p{H3I2%SSdYA^k$M^Fa<&5YZM&=FB2u{cfV7XZN8b05`V#5dL=Q;#_YSSV0rG{y z@+_+~H;T;DKGt?Eua=+piqAwX1l7s}`r1o`tVsIsz;k5=%8b?P%Moc=)MCX=Ss4U* z;+37p_=jr0v>P6G3$6$P?H4_1uZmuy`b+u_E75l|lukEl!(zH~X(N3y1J!<3=5xVx zLb7aaRBiY>W|8V#lb!YDF>gzjor!u!&Ofth5k#z^lU&6M{jld%H7aLfOQgEhdz`lji>WvwFarr_6MQyqAE zn20qZ*>67dx#Sk!mR0R^V@=;)CN|rRQu1Vhk1-D%2PTatQtXPEX3nQ+XMdN)SR)_5 z7OG7S_O(B~C0Y7UH7$!zMw#8;a2xVsj)s1|(P7Zp1*ikI)PB4gh#8b`U)uDsR_U&{ z(i>H^3jj|z&*=2curbTH-G7_2zo)Osv!@NRx4jeeR~nYFRe8#KsO;A&zx7ag`&nmO zJ5bB$bN5jP$=kjz?$LSj%zE?u{Yu1Zw*O}B-xxgC)#rsuvE=-S&Xe}KJ-Vxe$eI4i zH1hmzJ!B~D)%hxI`r@Tc&moRvpVEYy=3D-t(D#+jtb9pFc`CiFW*h5`es(^NR$QI( z#5o(yT?j7la1VB{w+i{5Q3kE%t&*?uliK**n~CM2C<@pBLNU%Z-`MZd=m_$&y0P)l z)EF`eku;2W+83RLO<+oYwjh`7h;xriggvYFH$$alv^dvZQm-gK+0*u3gCo zv+uWmUlf-1(e&+?xQl>&`w(&MhF#jF`BUBXUq+vB=)gXJHo*B_;q%(h2Ve9GNAI0~ zciNhYm&h=ksAzl>$Ghe2;;yaWlk}!1Vky9l6H)r*R?1@GvE2RTbV%_5C6jUtfq4Cl zx>8b@$H%Y+ZWEjk&6hkxW=87KKE*uyG1T=MgsTdVT7CJ@SFa8;7Jocm2xk}WSV?m0 zDNVOC_}ze_4?t{Yhg(TG=A!BYb3nCUoyx7d86ghrb1p+c$$q8HF}zW2zKdp+qzgw7 zS};EF2evK{RqAm@vAI8DD5sWOnHR4+1YeL64u6U_r7VbR-N#wR>Hw5V~3&m=!O z#(-L!H&S3HrB+c+sY|26U1|6cX;_zj=gCDrQK%5IQ-;aj5I#KK{l1+|?Hg{X--E?7 zH^&x?4)PLDTZZuHck+LgjSZ$6zs|h_PDFW&Y`*o)7ts5y&{tagq>!y6IWZNj1z>?q z%GQD%zyqH;f^m5=&Kqwhwa`y@r3Cqt1S!hKuHf1 zU?$b8b?5{rS*D436R5i#{MR+M+nm@r@m5!Q@N(PFv zVm~Fcz3AIy?>~mrnVQrwHK|{?tlg)6ndM#ccC!+wg z;akfH0JDR4xeEQ68~m`DNIj7BD#zOv+uEV{fYcnXG~Kk?J^* zuX;}6zh}E)fcpZU;sttudFZc3lFvOfs+RD-J7QD6(=09rr@GQK(b3hDzDDbs$E)#$ zjj+dI&-^xmV?Pg&#T2Hmiy|l`Oi=2E9{r+9m^35`zih0RNrF6r&Q`Ar^Ty|(e8^hupE5BHD#r}srD;;cUd>&EBgqV zoD;sSj2dR?hS)!LQmkEJcC-|b?ifg2v;4d=01|Hn_sP~-d;GZVOL?JiZsO_AEWe;R`>suBj zNuO3jWm`QCr-kz3W5C^vwLg%)T)y08oGly-2XazgNv_=)VTuZxYfHF=GqhTVJB^0_C;r>9eQYUZziLTuRiwpo;BYM`P?&BY&Uu+*WKCL={Q3c<`0=+ zKkh5|>`Pe*vzp_%WEe_*x>~!;LId$!#hTI>67jOO;{q?rDEHW~7EN>w|$tNy=70MB`X1fh|j`$Ufl z-D~8^o{7IzWphuFe9aZeML&mO#}xk`CbXwhKsKmsjy~4o(&5bTiOOU`Y0ZwxBeH~I z75i)@&JW5G%b&}9nNI7^8eT>eNgbhkyhW%nJtQ#GD(g3p#kcZVi;S}KidAx;(BAYG zv)Y>9Bxg#$8OH(rL=3ooL6Vk5*z{rs2z6FhXheS&ewGGMJLI_BVZg?eSR%cr9)=>u zq1>0d%ZNNugeqou8z)~rtHYaXM!hg@D~r6+}^_p-z;12KIX?}PjtD|v5jjDs0Iqq`U9#hLB6*!SN5 zCA2#XcK&O!A}dxRK33q>L`IJOWILV~LOI%N&y&fOD@p5vreiNvo$;dA^GcYAUOSVR zDw!g{Da$G>Ps@Op4Zi^jaFr;H0M;MA91f3rA&vIrb8zVZ9_A&l2~_~qF6g0Nm&s`Q z$H-EB@JTpBd&g|5DVi` zNF4W<|BKn-8b{*_<2+Fh+(;E^uX+tRAK={$S2HVkWRG8Gy@wSWbXl2)xiuS43pQ!i z`-lvu8PWmP+kvPiRakm5{+)QMR^N(~6x%qIZE*1jb%?Q}kNJfE`ACTb5JOx(Pn7`E z@RydRd_KhEBv{2@Lep2ukwzo(b&O=-WxXHP*x!TCPYE{Z91d=UV&dPRdO?@F3^b;j z`$oJU;-TM(N2K>=XYuQDGH$D}>s>{Tag`x8ZWv721A2fCT$bGe;gyGPH>3>!Z=f@j~>Il zZeo}*3j9THKEO>7EzIQW*(1e`bBu6qxgfb3f)viuFgt2hs`P2doK5lj%4V7R!~~z8 zJtGy-4mJ`UW>R$_g4V40nFiSK9Q?>}wUZ-Gh!{-{!#uTzW?Jn?(_i8< zjl82pM4-I)?D+oW(FlVlg_5OkF9{yAH69PCkt&wqEAtgei?At;jL&J++JaL}GLA|& z4OK5l>UZt{uf~RzE#Us+*E$I#<1P+@lYpLi4pDBkO#r$K;Uli~1s)@;(Ta9NIJLA0 zz3=cNBDOclop=G`2tn7c3W+(8Tp{SBcwN}NJ?-G}5}j@And)(qAZ|xNO5wQ*#3Ls8 zCE+RXsXKtI#Q~*C|L{aXiv6exp8{c8NVE6N$0~qJfWAp|L8Ou3ToS3)Faxg&;$(3a zxaQb%Tb;@2jU1V0)dCxFQeF{A2d*)KP0|{iiEaK^0H%-{O*t+7J1 zfogmLN=ZF(@oSm;9wf=RN5Atm>6_y)WCLV<#1uRs#;t;_BDG)Z#F98pRwU!^u&5fL zC1PVF=}zRI@v}x6t?sc>AZ*cT#P3|J zK&etUcD<3!IT?#<=&?tC_ALNgR8mk!CA*x!A7@)h;N;XbSLD&7)J+pgpLkOBr;__hODO00NOXF?pz!eN zX}&1+eO6zxZE8p|soYR;vFzikaiQ&l@(Wor7dvt$?W^3IXT+Al9z2#QlG8t%*#^-u z!w-%99Xo;?FPhRNQbXW$Uu26i7L9C)54k#*rc)ma4THf{`bz81Ir>9dkl8a_uD7$DJMNSi}tLf$u~NW<+|1IW>1aJ@z!9{)yj$ zpC93q=no#%YIhAbb~U5E!e{C?ozhXLJP-}E7H!^9?Hh+g$id{!ji+i{BOCXhPF-`* zIr;&Qzq#U>&l>8V4SW;F7$L`a#`K%cAMtYiUJIZ4ICjVDNU~4uihgGb+;uYCk*5}> oUXl1iPVhe$zp zwGjl-@%HivR3Y{?)HPIDmfPH*0!@~izZ-%ym8?=mu26Bclt8*W($Kv@q$1|gUV;7y zlDP#za?brL&Y41xG%|vSBM^jIfgnaFZglK*R`ssl;}_%!AxvJgMwIi5Kgt)ool|@@ zjPj*>AO$N-y;Nl739mybD*Re|AwRv0cTsIn?(N|gbo9earBkAitmm3i_%ST*{8{0% zvLb$7$^E)9{h*;@h3$d5S^cn&Na#?`y_!weHxM3y)j8eIbk&_TjdxD4mOOO0oB}TE z=9zHOoHR6tp?h3Q@2PQwk*hxXNIf2n7*2L=Ckgd`EntT{Ic|4fAGFQIM8^vyeZHjN zrMH}l3p!os_lt9avW_+5yb==)`a}uO+=;kU_sD`e`Yrxha$uOH2%%A1TghXCt5QI zonXspYg6~6nMy!>I)fIq)u>_HXDUA#H_@CsYb{4;7qJi#qj=H!Y*rnqHfEf-i;HaV zdIL)2G4rZd9_LR;cup0x8lkP|eN9v`p6=D?;5*B-pnhiqO*^PpQsDKbU*Nx>`X^5*bD|pBG|@b0v<@{^QX_CfsI4$;IOUXfP`*%Ib36V zG(39EvPySeXOT(Iq$`7O3en|JHrB|@#9tWd&cJfZ-*wgJnF$>|0c;9}ro0gY%$?94CD zUkI)d08vI)+$6j`Niuo2OqUYU0=VS{_vLPQC=(7Y=HFdt8v+S_yP&TN@Y@Z;P7+ED zzr@_f<~njM)vMZ^>Ul6VCNeda8l4=g0>qw7aj>OOY?u@xGL`ITOLm}=$)%yZ f_x}+juw&wmoce#k_&28_RRYA@Gr*(4JtFrXj*s@* literal 0 HcmV?d00001 diff --git a/_images/mgxs-part-iii-content_90_1.png b/_images/mgxs-part-iii-content_90_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1e8a32ffd14d62602a4d8a9f417b6631e61f0c33 GIT binary patch literal 7010 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 x%ts^^Y(~=BB|V_ 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 F{|i~NQH%fp literal 0 HcmV?d00001 diff --git a/_images/pandas-dataframes-content_67_2.png b/_images/pandas-dataframes-content_67_2.png new file mode 100644 index 0000000000000000000000000000000000000000..23ee8724af5de02b992780df61eb6509e0f872b5 GIT binary patch literal 28620 zcmb5VbyQSg`!)(gV^9*(jdVy$cXzj>4BcHKt)O&w41;t_jZ)G|h;)N=i8Oo<@B91C zx6b+FtaDtlaBya`_p|Tky05r*jE0*06Kqm!BqXFKiV8AXNJz*D;OjXiI{1l8NqH;y zhUy`usDlaq1Y%l8gV$KD3Wgp?NRRLzzL3Wkf^U$JsF4(9Bz1hV_ZECSpXrhzR+gIf z4vHaI$dH0_7V7bL8al->v4wA6@Ym!QQs=*jzABG?f{ex%8k-;e1ecKESqZj+y#FIz zBL($;w|6Z`HCR~mA8WAYx3bB7><)(KXL|k4y?^kkPW-?BZIH5m!8I_Q@$k-kh9hEE z{0kfd2ybVP$082fXq^+!(I7)^GqqpnO9?htBodV09)5e6%cpM#QoS38_Qj=C+p^z= z&PbRqJ0P%3aOf|2w1sMr?a=~1_#@Qvd1`QfL*8>PJ3uo_357m{5fCe!a@Al7K5;~? z;%>%4ZVGTZv~{k=qDLx+nIAI^d(aoX)nYpe&uDsl#O{iE_T%8tYXJ|TGRb+RjR?2C zi!evlHTv^p4>=w(7C>=`UW(K|awCqh_i8N2KUB%=&<@F}W3dZokMFb&Th|ihkHw;X zou7-t@cvf>lf>g1D&3vB%xif5+X=;&OA}*BoT?KIQcSplk#MaYq-R5Q_fIFot3O?K z^5EKc9z0FvF<**-pI`|rE%mof>E$8Qbu1c(b%ni#CHl!)V7L~whM?|*%})g$LLxn! zkJ3X~xTjF?!*(|B1VYhZQNE}(PtT6VV*1;~LrGy#!7kOeqMCULgudv4m=_t>kto{r z*@v%|rFC#0p`@ZDq+fSRH7;4?7G3(Cl-OtLy_k{^{e6zi4AYWS^jPAw=6I4lMmj3? z=aA`od1YbKjRM}Y?DXQO{L&v4H^=54bMy(NP5VDic{Co4us`V4K{)O!iT%tvxPS9! zMMk#-H3YH(!>|iuV4-OT&dWHbXU}wg#I+#!c-f0u;Pw$CMEN)xPhsKyBwcm~ta1LB zc4Y!A7TH|)J4g&Ct_vrdjcUHPPc|HvA-X%QAEnKz*TRray`J-6#LZ{#lAc~r!me2l z8(pa3SG&a-(-zdcQK!im5B0VWJhWVg7>P7})bTl5w* z-NHZNJ2G6DUR`7(y!`{0!RH0Dl1lkX+=djJdv^1X^aLo%Oh%LlR3FRqgEV(~6@T;y*;+CWN7HZfWd8 z_)p2V7v8aFv$i=2U6Sf1VsRfHVx15LE=mLu*=RaRm&2~lP|T#xbd-HCbw8x$c7-FV z5wA9D^>hN1SUv73HvJ@1tl#a0zc1ZhE+AB@g*8QOz`op-z#=#7Ms8n*O^4dU%yjED zKJ;aUHjn&`(!jZ8Fx$GNID2%93uhvP<;pi|=nB?r;0%pQpiFWe6v4(-uB3&^5~HmB z@{&Hm;BZqI#-#uZ{UY01bQ)cUtoJ2C!a=a)_bZ^?`BkAY=eZWyp3|ma8c>ycoA$- zKeIH$5q9^FP-6W=#$pRDLqw{nC+55mjI>t0#$` zF#nHwpsH+;XjxS!+>#vLR&sDw0QQc;GwUNkiA}M+4M86XonO2*BTo5pe@hc~ZmDKe zRy11OZDwle%4#h$OYM!GdVjn%D3|&gKWKrbBYGG?I-KR+^p$)x{?7+g{-oA>e_`gq zNF1tzT{aW^oRB4!!As6TKVs&qOC}eqIQKvVak9=N63kpfv{XzIEv$3%4hx3(i8ob4 zDZjamYg;JytrRJtfRu#q0c!H|%a|@_Zch1WhOU|11)FrA&VirvQcche2fbin8Jsq3 zp%=dI)J;A$PdgIvQ?VkWq(8=f}P<|T^aW}Fx)6e-&L?PUlOGQT3%`&5tmC+ z`%zIO#1~A8wSQWIWfHld`w>2mX|>GR-OdvQU@MTtu27K|BdJ?V6X4PO_P? z0a&lNKY!j778RYIWuwi^!I`-rQ=7NFl8Ci)*R;se znqifj?7t>(D_IpHI+~|gbfkUJ5IBF3Z_*h?5+qzsy|i`CCSO}rTrPh2^7S906f#`# zP*50XhE6HiBFHyyci7LcYM%dbILJd9mOX2kecFQ@G#um*Rt`g2N7h3jc*IrxP;-=j zB;SJX`WfHMoJt5k7Re{LPpCF)e>On%+TmS0?7IKwmCCEyHuxt|9*>Te*U?v$Ou$T8 zX>bBz2|>x*SPHo>&?(pI9L+7Ymz4-k7Wr$bA&c0aD9hk?A}v$TD>baQb)0R8PfnJF zy|waVORc`#t?p{sZ<-6t(N&$O!WZ^^=3b_jQz#j}NiJp*o}8>e9zO@l2Q?n4B$QVq zHwYCS{YtP5RE;XA$8|>4%$~2|XNpRh=n~K!)pzgyGB7a2wzLFrz3+k<3ncS9&0hSU zcgIt_l5}_Xs%D?6F^b^q3QV#Y(!+i3_XtPqg4(<7j)hOPEzmREkEYpmMM~IvPciVu zM}qzcsW;AL9b8zcObq^iFYMz1Jb>`c!WX{trKKl)-#Zy``?e6DXmOj}N>uv^r!6`Hhu7s=adUJ5Rf z4A;{sACF$?HfLaGXV3G1+s{r(HTyk7j){qBfO@^m63FX=vPbmRW%kB}lsGSZX%*{- z>sEjhp*udNLbl<0k1TRFsd{r5LWj+^1o)WR<nVExc(H=#|#TCiM5xt9u z*x0_143FgTZy?}P7DEUtrFDjvWT_0HN z2=F`XaLX3m)l7G@@eLoBZp|tEgsnxJ8T$l>q$27rcPcUkm&zchH#H!&O z5(88K9JJ`0*~y!?Mp=OZA0aCL_bm;-8ge{q9EDTB$y0HN)G@bHoM@T2?Jr zr1y8N%k_T{edVFdukWr871a)qMKBv^#qK;xRW9eJXU2K=S@J)Tl#q_Qm zof-xMNb&z;=oME(Cm*j-p+~2d+n&|X043=&eoQeNHIn6Xw3Ro+Y~D#uz|<*ywlfv< zpHlsFldh|ekwEKwe|Ot{cQr>Y$`EekT=?R3>a+<^mN)jBKP836ZsPwTPY-Q} z1}K%C@GOm?NvPr8d}|VowApfoU9Qzy--qa8{iW1i34klMd-i|3*U0%qnDKXVkuQaB zQ4#Js_H^V5s8tvTFV9QdotIm7K9HV?*^P?Ce#b;wU8`{Y^TS%~VwszW!z6x)P^wJr z+;wyKc`Pw!uA7OYBU^V=S6}3lIs4fLG0yfQa<#Gvd7lD%BTXGZ_V5s5)#ukEPQ*&u zL@-QpG%*xClq94ggu9VUju=IP0&_KcNlaYaR_C?9$NG28&YKgQgN}1kxK8=d7q49; z1x3XIo1rWc@jL3STW^da`RZcjG)mvJWq#-R@AIu5Gi^SHHl1_;B4XdN`K>pJF+2QJ z)VPF3!^e%V+A$s@n+^IOMdQ)&n90k^;t>+2oM#hpw|Vau2Ap3THajyA4LQodQNl?2 z>i-@DacY;T+59Xl>gjhux(QX^o~ftWoxbk{l`t}zQ>LhN^|&VSqbqA1ahlCiXON7X z+{w);=jq)wfvez7Vq#rpxi*vQ^?vi^zevy)=zsqFDI+g`Elk$>>sdNr057)qGec14 zH_n0|!Dr#mYK9yFlr6mZr$1JxDk;Uv$o;~t@JdFwh4uGXGBer?PJYxk^OF{#Oc1%h z;R;)USl;cY<>$NN;ThIh$DpF~;~u47YxVAPu)p#-NN#kPj(wesCun(K%4z6R9;$-y_ZYcPPc3m+> z)Y|i9f$UMS$qM}>Y(kcrfOF@)e-5Esr_gC6HPApe!(UDDR&ud^hgRt5G){2Ba`p4_ zNr$fgAJ}w_VqORti)Xv8GNPfODK5?i4V)oNMoatL8j9=kvk;9#pUuq;FEp&HE6aW& z6=m5|*zk*|n7a6_NS45T0;B5A=`Z888Uwb;a_y+eNkW*QDcJ>O^PHNm?}bg5IzY6y z>$~H5>W?XeO>S;0Vn+BiZf?njoSM(@6Z+}o6DU)D7Rf6&LcMyN51Cz6EIL{iKG>YB z53~xOZ{>wBbLf90k$d-yRZlLJ-B=IdQ)EB8At$C|yp6XhJK64cYEWt|`z1(`)A<9`2w-{mgr z`*#I%JN1c%A(iu{arX^G7>cjR9Sni2K^9d+Y24&^Y|{j=_8Yi5>|_p8(u6Jgn!fqE zy!G`n9k|Xw8t4|4m=j;uSe6eD$C8<;tVjfK$>&L%uSv~5dwuQ&i>mOb|EMT*4hD@RqCY2n3%Z>E5Yy64}z9aUH@9tE7KqTlwAFy?)z06%H+c&W&XnBDE2!XfHF4hMclXC{M70d%S{AT) zR3n(S)eZ#^RTq5gKkqC6u&c8e<2sYiLC}LSy`g~^NkR1%sree?i`Og3z#A9OgZVrR zs=Xw0!)b7Dhg6SR&@x!CV|?ZUXsH?1PpE@xokEt? zm-`&6X!Psq_fFzb7Nxm-AwmYT|_shQKWe?WcIX}~reJEA9LQk6K~ zxNDjS{v@Pg;{%`j2U%q<@wD=rYeZvZBxk8#yL7k&o&xx7Z!jE1BwqoSA-56K{3F zrz(xJx}(aHGL0}4dbm1^UUyUai6un;XmTR<-v5%*&_E^V#gaKub|`60zLOW7b8&I- z*~IT3YaYLouz84R)@pA!XdL;utjZHrJgwzD@r>8BqY<+r92oVe-d?dWF)LTQuUyv^ zXzlH5=RLKJZAY_XM{I{C{Nl-lq^zw~6BFY<-Kl@Gb%;`UK{@uAny~p=FA~S4clm3$ z@BM8p=!zt(YkB?91zC$_8Gc6t#hE&r(|bnH^n5P46>4CoZX*SU3`|TzS7*C6*Z=lc zk9|jH?neY(GSC)&LB&W*4LA&v0eCj1NI*r!`80~AhO_9lhYPAOkoXDzndgU#YyDKc zO6Sy`9vM75X2ZHf1nJAl=elp1Vp4?BAnYnp&>zugKczR{GnyDUam25Spv)$=_sIIEDy?uG;t2N(* zerg5=zG=V3HXlyatfrOW44P;iyY5JRLI1xbE?u|&xrgQxyi4CzYi%fxo*zLpaHgU> zo_xF|*gfG1ho$DMbju$NvX)1;L!D<-Yc1J@f<+t>>}|fjMf+^hnh22ipk*yyWy&1z zrPUt=(vvXFaLuActKoFNp8hWMy>CnRes^~PSW^}HW4fJ-0f(aKIEymwCo&#Gln@9h z0a?J`RTsU929u!#XvKW8h!hYX(!=M>uv{G@8e($tcX>-o^b92~Gl~)tu6=jg6Lv>y z30<0S9jx2{XC$ZDh62^BVO7K3UzKY!c6m&~{@fh;e#^M^b|KQPuDCC4+m&i9zqVg) zn!xp|NAGU0x2F#co17OUi{#Eo#DjTzgXz^7v3$k-xEWiRb}GkCVYrr;RS11VAyCo>?FYZB(O-r9;s=%OjkRXmw0r9 z?Y{TBR;54WdY|q1^brvzK8#I6EKe0(jV&%f{><}qC%L4L=*pU}=F-(;p@UH;holx3+*w~Ug{UxUYIs^GJnr`+Ky z#wCuy&IBBd)%r29waM}c&pqFl(`EteNRpBaF&|7JIw*+!&N!dNm_i`U+y9Pdk&6ds z>Q>y*i*-VvrRnFP*7>YN%DiQ26l?1PN!cQPiO?x{ZQ!N*7tiP4wOzkHa4nx6sv)E4I<|d67gUX+88?_yAwUdKz5+o0K`Q`@~&~Nxrbnin$ zpY^@>LrGvF;;WiOr(ZdyU-cBOAJH#SO1Zc>jhQ)^;H^9wa+3AH-chWhq!6sa^jTVX z)Z9i~^Xvk(Er_VL)=oj;PsDemW$(#kOS{kvn3gj(S9p_C^;#Tfp`yyXq~o6LQ>x(X z`&*aCjSgvFH@*<0zkBVuxta9}7w?l7?ZzGhJ^j%}n)%5}6jhzmToa^q>+LfFf^J}i z2zu=#SJxNXr$soIv@5BmA5kWV2UASJMZwy>G;DFD?2RQHN@PK<;CtTq+e-H4hGiU{ z633`YNUSb!(s-{Y&Zitqc)oGU5%Urx@ZlRQ$=T3Q52`P*|lgUXKf z>O&^-B~ORMV&+On_;yTL^sA)Xym2(EO!$b{jn;SB?2W=6Xp7g)g`1Z4TFnei7*qmtuS<|C$7w!mA8XNuBMPYGb`T)%eL9%{ufTT^TrMX=oylepHt4 z=Sv}+lnL^{&Z7^xJxd$T`iQV<4V-jL}>*+gaa z&GW(69cZ`Q>v8{8R78Rni`Opr&vdlZn+pk{CXviD9_}M0W(KD@;0?$D8cAry9=KFg zI1)-q*xcL!VaKo~ESw^L;}oQW*JnF?25dyoU!N80ZAW0>Mhy(?hJ|mo{sMeBQL990 zBRvXG!=njxkLZN^=f328pT4Sn{Z-k*C;sg@@;GLXc?xq5J_e|vTIoPY1R zN!1rrG(K9c8Yb}@E;=g~V%0XS?T{7yjB@R+T8tWZc@?211dgId@z8ucZ95ZH6B}Pr2LKwmnR#X z={Q*OSedLenMQLplsfz0vjFk61$xwuIOIrr5b?s)Le=S?A}+ei!pqW=^M>2G zQtYqEqP-Oplac@lnZ7*iDnelEAdh2{%d8vzs#4AO*b2b)BlsjAO3#)`6g@BFUYGLw zx2uO#_wY+n5d0jpp9XJ^TtCXH#HSoH3clP301Q9)t4Ksd#PNcU`TDjPTs+!8m54G z8ro)&9@}vF`pWLO`KOQB*=(wr4R{rNQWkG#SijS0C|bbvIm<209!bR@lp)jDdwA)L z9QxcsuFDdo9%Ep?0uq5upWYwHxiL8Pefp-Xv~=)zt-p8e_bKc(@?!mw@)z$l{2AWIxHa0)AhSc@-@0dQ znp)uI%Nv^(&eYr0+iTNOs$;@KG3>VBEc+=u_;EJ)J4;ho%gQfJXd2BuGd2Vg6F zUS-;*pyrI#GR(d&3{-=oB=$BJdW#p~&rDk9q&yj=;Y^W$1?<56m^Y zl=&P6_w?VZDJijCpX03dk+rROw{8Efr317;j7faP?{vgRF!+WDAHVcd_6-fNZciq) zyWLadRVV7wviK8RLa`(;k1&srj@&rnUm+!*`kO!1trIlQtlMmw(=5q}hvhX$B6M_E zT^Q-)-hcO{AS5hlQ?xD8tVO6ivrU01d9}*-lsk&@~gSMTLdFD-r!9+=Zl1<#7uNz6PEzWIx(u=I2k1d}8c= zWI?8-HG8~Uz4p7op3JJR9Sw%ycAghxOU=yQmp{hskAJe-b$>_4%gZ}`9&&L6dM#Pe zmGxtkf3<$6SXx?Iu7c#mf<_auoxr6Z5;M<6i$--umCFhdSU)j%Rf7UUxJFY+{R~;+A)P>1Yd zgcZTBh~E+qx@y>4XwwI~*5>b@^WvcEx%Ds%%B1x4bjJzxJTX%U#Q6kj9)njgMKe*R zo|YhfCo_Mb!TsKN7!7un?!>#>vw@wwzP?U=x^nEho}@08^pxTt`9aWl@BIcJ8N*Gh zD3rhoJBGydICq&*1|A)^2So#if0;)`-BMDuH@MbWuJXQ?f&}Wk>u^^>=5TP2F(trT z@e5{VG;@6B<0`we6p~NU*9ggrSy)t;lKKY1*u|5Rp=u=)lX<^{{kd~y?)RIJmp#rQ zYTvq92V)4BMitL5xAK%FB(AbGur?>@rx>X7>qE6IQd$q+O9;8O8OP00Fq#K)@3&8f zY@`SPsr4w3MsL>@3yYZ@<0<(^uzRz#>r6P0LJ@Lq!YG{E9^(y#u|o}s%g-#x;URXf zt%9E#1>@t1UA>|0y8H4@HH*L2B~MaHiqoX(aO~JD_#e+Wk27*xmxCCdusk*=a!Zv{}Vh464Av#f}dejaBtwtt5STtE+cy>to6j zv6(jpid+Isg{e_k1sW5^IXoqPW`i{B{`)N=IeWG*H-N6XS`3$@f2kX>N)GLs27i@2Cs zSy|cKTpX`@Mq=)LZ|UqlPJc`(VlaQevl)H)*LhHPy&&ppV|S~>UKTB_yy8Gr!X}^n zNAJz9e>w3l?5^TsdPjaHD6c>$VFh10P`APNw?4VPtIy5+?NR09$&nGx%^v3q9d2zd z@+q`(g~G$4NW8RS!CXMplWBP9ob8^o-QSU^TNaW{l^>eslR>xVR$#rQq^Ez1&b2D^ zDpmYm1>Xqz%)5ybvP{ykz+ZwGcyq=sgh8k^)i2(>#-MN2Ggunv8;!0It&t+MEcOWJ z1!3Z0j52%uu=&4Dv!*{Xeqg5on$B(6lLZ)HVj@E~Fea%625_wEZ)0Eg)L8X%_2i9vO5%Xf)p+b>@+}bceQ%_O3B*1fSDIg=`p9IbpcEI_l^g5@`2o&iD zRn(f;Y?IRfO!KtdxS509n1ADZDQo$765Uckx&8!!qF&?W@JLEZietwE9}nz7NlQyw zAd9C(n}KC@?6rLuTW>c;iG__#TydrwW^YL{RT6x=sZ~DC=f3u#dEj87t;BO14hgZ* zd2)HVzzH&Ru`QDa+Dak^GpI!AUGbHPC1j-o1|A;XCy)!se*Q(XDWrtycn;s$vHcfo z#N_PL^4YYFf5Pv4e-6A*tcJeemj8AS?G&R93uAaW9w0)wJzf$e;T0x7LTPeO5OQC| z~kdbwZp;PEW|12gNzC{MYng;jh^=5TfE2=wbX;!>Na*2_m z6RNwzP)r5=J$>XddwP6FM`=;Y%U61Od-FW1Y)3L{-8ZB_|HND~Cy*ECMgh zq$(;pA>C53f5DUpFS_Vu&0IpF+O6#ezM%duyWQ)L}KTH$Gkh^X!gXC2)f z$?AnZ!6l*N(#&t*g--HLkWwltDvo#EQ^!QZX!sn=n85ZTj9SwS>xP{6a7oz!yQKAt znY(*k;BhZ8{EHXE#s{6(2PR_{ZD9X7PnVeIMpwXB3hloTNYl|0e4MhOIb-N5!jRf zMAHxmVXXqGN|TX;3i}9TF_UhSHYp16VDhX=WN6)5o`!aoljTfZ5fF&G*?)mul*Wq0 zNALuJjE}#`8gz(&MtZynlKva+;1Cjc~{p* zzyv=&o6fVF3$O?2AU!?rmZOKM@>7aIVVl`jqbA3JD5}ng2}2^7_2QD=atOi{f&bVF zSJdBgeSLsHLjCmntROkNVKc|+4@Plu@!;FDfK<-B5vq{DRPHt~

mu&~|9>#dBMT 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 literal 0 HcmV?d00001 diff --git a/_images/pandas-dataframes-content_68_1.png b/_images/pandas-dataframes-content_68_1.png new file mode 100644 index 0000000000000000000000000000000000000000..03f11db4f4b14b264626f5ae02e9f87b3cba4020 GIT binary patch literal 10243 zcmcgycTf}Gw@(5A0i^~IkPZTZ0wPH7NG}Eylnw$)@4bcIdkG>w0TDL+P^5 z7|4USl+;>~=Owp3Zo?9!ahbtvq~y|RZ~Oy3WcI$vVRKmV{9vLt2!6--K2JUE2Y1|f!E5jT)4o5tY<997i;A4<>0Fsz$4I01hd@+HtJ z&>L)@329l?(1TAvFEu&IZy%t;(ViH)T(G00C(~Ama!$*NQWnL}YFyJHO^;Ce-UXI2 zEpdN@ORmDh7%h^QwWH<%6&2m<0hMQ+>6(=oy%rgr&~Cn5r^GO~Z*XGtF~dl5XDcT9 zyNf)UUq8H66dApP;7ZXT9OY;KAc-E9erk1LjwT=IZKAKDa)I+|B3yhybNn1fTYu7w zgD>sg|++fMuZrG^domwyT?xt`aUR_@VoUurQ|bu0xm#M<~j_Ki!-hhQxJ2EY#2y zx8x@TE89bnLZMM_a9aB#h}4|_&?J8+G=%cF&kuL8)w-wphDB6*a*;pC43q-V2O1%h zx23WycKA6aY7D}aaq&Os@?ugR_}X)<)e@h#?tbEAMsOAA-0$DJBFl|DYJ2!CS(*te z+CO#OfLz*IZm@k^NV}O!VWXYvC4$|+?J`lJ2<X3o-9i>S4dNL{`G($% zU9C{N1+afG7x)i&^!!?J;K1H-ytnYr(p=;_D`BYiCg(d6h4v*EgaT41%V3FB0jMiKuM9TEq>L!qj3pO3hWzm&_Tw6%^ z0vYA=At{`fn4VHx+^J$v;kGgIn(s~#e=pMWG_iy|wTG`g`V@&uPev}4lZZz&xs+;A z6^fSfwW(pWF^of~=g8BjyrIMDA^)!_;w>pz;_@jlwtQ!PH*7z@+eSa%of;3Z{xwKE z$iZy)u{ZVTWHXs(-zzC1m&Z4i3;x>tx?``9V$tZ?$WaRI)Wb)sY@P%o)GnbdB-)pp z;!|n5@clI8qhUGZgHJn1ieoWk*w$gn?1Z-(9oi5LS*wSBN6#9rEWEvnJ93d)9b)7A zrFp{NUTSNV)e&}ajh=wbMY@I88Yd=f1~$=| zCR4N-ctL~gt{X)9^c9&@gvnbck0UQHIn@NG&R~YOBIR#CrF&n?*{sbK3No|v<+kTb>i;0TIW+N9`^acP^GvEUQyoaTyGGcz+Iwzq9{ zPs@{nB2s#n4s!QQJs<2jP{bq!O~d5nyA+jWcl$#P{zvGqVM(h$AB- zeGk4-%PT05QBx}#7~Ct@Z&>}Q%4_lCqe1~HJ~sBGoSK@thu&lT2X!dGi0z}Ncy`AZ zTcn7~eF_eZ<)wJ3Li3(D(DL$fLS|+g!dBxt05lLRXC%+lD&P!-pPQ# zu%1YoV}3pp3t7+B$z#7u*ZZ2;14TLheVDJos^z0K7OK0AOT=(Eyzy+_=b=1J#^2$7 zt7VC%0y?hpJTSXF+0tEX{-hXhxi{ZxJKr+(RP&0ruZUrg1^zI*9k*z&)I;T$#)wg6 zx36m2ui2(R9#FR|-?KE68Uu<(8C8 zoSpsM$Nxd!Z45q^~n)? zwh)lB*ctwX!G;Zfk{I$ZnY87b5qomTn0oo^dKN*!)B@FX=NY?(7md3 zR%Ls(TsZN?shG_;kEq+G{L$*5-xj66hKdTId3Vg>v`uBfyV1gd4{on7KKE@sXJ_Ze%gxfr zxVTm0n@ei!*`C!@jYWQ8;bXVWF|!%p%Z;M4*Y#1A?bq*n7y;nr(3UY(YgKFBLkt*K z&-PSp@FBK@kR3`E$r&0ys-~p0-+EsSsb!f8zq&lRxW?{XY!u~0#Ku~TtVxe$68K+k!_~WZd3Su_4gySR+`>tyMqeUhVsCo9vmDP zxc*Q8WPhO7jso&ugpxd$?}t?c4!&NZJuI0!(YaL2YjBrvb41P zS**>m;Mx;MFXDB`=5xBuEFh44x-)}K6SN+S(AE$sm^{7i2cvAKI@r?X?Jm>kCA{m#2-=n<9a>LbdY^9h0&4H= z?OjY%WQdITk_AMq{BiHAlZmMY2S$*3rqH*g15!##AS6AEh>Bv7keF-OeW7dkZB$cA z{n;}-FE6jzfSaorx~Fk~9xEDu6Rr;D4A)rn3;X{O=HlW?oo`A>PyZX4tE;PRr|TjC zBYr_!c_V2jfl>O$52@1wy*{Ul@z&mKa_tHI3MHccS*pwX`}c3;lXv7Us{?s5!FXNW z-G^u#635-9wWNdubQC3b<6;sh-aFOP;)cscr z0Gqc{HSBk2pKzWX<@g>d&-)&!|6W>ZT1nIY$0gkQq8gSDP3FAyDee8u@J*;j$X#5H zqR|4a{#u*tJK&-_bH3-3^D-FKk;J- zXdmp@dUWlLk$Th(gxVJvOXWpz43Wu0g>;`YFn3@BB5plRr#MiB(4GDMeP;|BJY%Xv zLrzZqeQ4;BpwwOV(2=v4TR=MJ{sgO!A})&$AO2p;@1Stl{BmfPFl@ryxKus`lg zkxC-NH~`;3mfhi=p+7nNc=t&#JZtsn6~GkOr0qFE3($zitKl{{4G~INmZj>8?k0Em zaNb&S;gOMXeSHQ;;<@5oLNd_WRDa>%+0%qcLiW>SY;$dfP+=@ox%_hAHiLafuR|ln-Rr?SS7S3 zz|AOGi9BY=#y%ZpiPIUliq+5uv07 zO@hrs9}znml95H4AU>=YfhR!vh@L?Eif3#rEaSLIFv-qY`Z1F4AUL8DD5dx-6z&5V zo%(I+2p4(}kr}uL6wS5#1ak87){)Xl9X{v)gdPSC_zOPrR#y}Cd!_x96I{WDvr3LS zWj4a)On&n7#;z7TbTuY?>61R3{c}TpT0^DDTvCa?F8jTZ&9pJaK4e4LeMSH{EEa!c z7_h&C2nko8f}>#P&z{!)GcJsi}>`9KhZ_vmXKFAwyx@ou^b zp_`gp<#PYLkh2P*eL9~`P_e%33pl5(MmGOr>JDcJnf{B6gd@VXf%i__abh#L7KnS_cg zai2m7?n%E6DeDGi0A#g@vBwCu&{{PkvZ@uN<}tvKG} zd#c+m#}82^e1}YgYeK0^@%o64E7$=8VM5e#%|cpm)I17jaQ2$05+fq?0I86m5BT?- z3mZ(l1%ayLA%&9Q2!9kUlBnT%X3*qHZ}_NGkih)ov+iGepm6<;`S}E5MU8vRLeJvK zsf$abRS0u%NKB^5AE9;F2R#Hh6A9}lK~L|5<&kufbPn*v^4?HOzQ>ay4wD>N+#sH< z-+xqdID0QvA^((MIW71t=9x)|Kr5*yfrly)E%tL9fv4@qA%?r75I7@Z&)#{QOXBoL zT(Fp@^_2F&Yk}wktN69*XvW|rfY$MbmZaF7uzOMwVQ(-QR@HEy@g?-{ib``-q88AC zIEy<^v}HLRB-$xvhdyM9SDk~6^e<_7eDQ^hWPY@_CI!*uaGf@0!Nk!p6PCg{kmdF# zD@3@KvP{tDpUJvQt$b~azI8-Gy6#EbOZi#Li0I)!xgE^X8WXneF^ap@t}0p9*O#TK z316j5cW%clkfN=)Ml=_i4Kw4rqK^73r@!okWfn^gbU}cngN|s|2Qqb%NhphHc?}*j zj9(KA>AFx$fq2V;j>#NHMH0lnsW{NNn4Mj=mVC*gP9}{iRON^*;oKgfD!Wq7FX7}e zz&E&KdzRU7r?LCheR5if`Cx4nI;nlkRtm~rwQcWdDp)rQY5*5Kx}_4qQm>$(oX1dA z8FPWvink<4U0>QS^)X!>O;}(O#)^+I%x4oZ;;?d{C#y-@1%$Cwk&cw?p%lLiR`)DS zNUDY$j9B(*3Mpobq-#NE>~24%Mi-^2wRb3N^%2EerpB6$Cu-*>hO13MEN*(hKqLwJ zL!};p*Z^o_Rac9YX;R0Abcw)2`0FQ*^X3VcpM7$iYRK}hpxFzc=Nu-G+17n~6#eAt zyj4_4bySk&Jbs;w?5~{E=i2+_^n^kxN3xUPO04$K^U`L1?6Rh{ru<@ zO?zzh`IS_J2}6TuokE+*v38Xc^$&(z!GutnzOn(Mp8!s4I|DEv8vy;8o)FMoS)x6( zT5tB4q_TD#RnK=Vj}DjRGV#RQH@&hoy%|IyB4`EaZt-(d&U^2kcM8k4X33Y-)jj$7 z^Jh@ACLMcdI}R4n!yh{^$T>GzmLyBBy&Z*GlsOMj-d7{OS3LB>e!n7)yY*+BC_%Zd z%ui`0S_1kTA`yCKRvMHP{zmwsyzSHs9`nnyQ;XFNpS!PQMNXf)4dR7?2l?4U@DXQ- z2L1^>8gwf9EBOo;*BJjdjkc>InYC~GLk6}V?v7<|Jp`+47R1zWe0j$;25}UsonN zJTYZ7q%M;H9e%O8Od01<9)IvPLHPt4%PS^eJ64|VKdDx=wZR?pOB-bP$rR0=a4ceb z1GS~SGjk0JA1h>{j2;`ZVeu!4~*A{O%nD#Kd;J=Wp1-Se3tP;zhNjm3?FkG zpNkE^Krr$glU|RuH*lof!gB(*De7yl6w00}0|UG1YRZwQSwl3p1zFSI*H;BlYwTCH zmA2k!3(16AjF_=LS->4!lk=4mo}9XUuhD^F`#OF@*rV*7mf5c}z8auzu2-Zs>ACPH zkWrah7;NzsC-obt>#Uo+^>FQLU~%DB?={l%Q>sb%4VP9WC;&9LRZ?O8ONaq0({J)O zz<6$q&)7qy&tB|(_6pfRTjgC(?Dv{|KUb(ft=uzx^L$M(Qtw+*P!VW1E{tYlmCHuK zhD?ZKI(M6UtlB%z2Nq+Czf}=7)-EH{`e4U+q4WF4Ase_@oe@+@n}u0v&`a&)2T|$Z zp69lnb`)tbuym6i(>?pGJ51Kqtb>b#@l5TK1|lyPyo(dACAuWpp=T=-;U30MKQ$WN zw)RUq1i-K19b%bMx2jHeCO2uB+bt5*q98x3>9}VdDFCxyPF&lxdd(EojZ2;sNFsxM zMS+wCB?1*fGu<_IOHO=(tXA|INyq2R!7O7I{}fnP#ZdItILLGHcjgS!<=qb_&MR9g zSs(M6PM`FJb(L571nwwpGB`Z(6{Zi9GMRRhzX!0=EaEj;6ImU)OVC=@R&~O1_b_Bf zi7f_@O`=4!#-UfvvL*jM3MbJKXsVpDJ>=rQA0J|%p{VB~@xe-rlzdbjlWx&eThtp%OBC_99hOQ(0zvJ!YDsqc4e5Cg2~lNjs`c zI7bQI1dLL*p_TYak`45cdif3oz>^sEsyTNU{C&^u0DhB_9qBF>b|^s;JB^02OvmuF zO=n^`2lXN&|tfN9S&o2FR1W4PK=Pl|Zxy{Q;^wY;*7thI7Cc~WwcT{tu4 zD>v3-zhCaKf8PN{_`{;y@G-1@&Z@Kb*~kxfCbM9GSeY1hHw@r)=yNl4(ufux6D?rh{{Dum>ZqXno+C76@S!gMEEti=ck_%oH6arB7FATRY|**$Uy-I*Pm(EYT0OXa_WE1i?s=3ag~ zTmKLm`sMenh{}4=GwZu(~w}nlV${cPIW@-u_K%xVEO+@z{qN^iRUsf6o0=+k{ zot}xiu%{6X^WM?t=bkgB%7J(djB0I9b5g(PKF*y3%`7V2np7iPgJeh(VFXMls_Gm~ zRaBxJzWrNy%F$)vemg%%e)Z)VS8AaxELIa`xw_c8yfRo%pN5;y@cj96zT0^Ik4YsX z!5T1q)<=&Ja^W>QAsqStU95(wo(#g6NId&8PD>hJi+%7r<-K_1a@*jVN4%XZaD6>& zd5!VYdE*s>O8k=XoY!J=<*isjW_o*3{OoCbXu-q}4?$ny2A_%b7W-0lW~vC6`KNf# zKwCWDSnRi2RO07j-rzTPT#sUOW)Mo8lPZMed@mGA5i7vXTv3`CS%aHVc|PgJxDk=J zmQj{Tsk*5c?W+O}&V874&z=2UzL`8Fb=yXAe>d(Y;%qlzW3BUJofK&XZsCUyVKxDyXdz`bGJ3d z8|b5O`+)>A@G50@l&L-xc+v9fIJ9d|y$%>@G(H%;6zaY(87FT51c{1$?^Yf)W2HYv zb8b3cJWY1?#xMrafE3*0dxn~w-gn+PHYV<9u}uO<(7P4-oa2G9E=wH1(hOi}FnJ;? zZYt1{hC7IORCVJj?1tD;>H@&+@2Cs?Re{60L{ukfLs=8mkPao>4(OK4G@R`ljqkoH zRdg7)q^k(2Aj-?zk!G6&Qsuhj>>)F2b6l>eL>9kwc@Bli40L4ForxT1FO$38OdT^m z+VaoX;p?)qdE#vS53^Jc@%Xx!C-od-P<`H@)dVL#KpEun0KHC5VL%_|H2B@PRwws_ z_r-}RPD|UV+f1SoDUd_8T3Z+G9_=|b?eMYbjCYg?)*dSjy$1Y0=>D1Bqa53-kZOsZ zX<`N06~(t&mEhtTZ97F489-SwNArbecc7!2GP?@C56AVdU3veaSZ+Xae9C-{B-L;}WCsO>kKY z4=_PNV1o4$jmt9jTLGDP?a5}%_uW^*+MYTFY+n840BFei;?a?qhb%Ih7xU;g}bSAr7&JEu%NNAUvo^TJ_uj2-9KOMj{J^^fdZ z1WxHI-g{8?yFUUZpd+g+^WfyDH|Jt!b^$KcEUC?#Z7p^$Qo1uKjNj&%$6sLWsc+Q< z4iH|Uw(Oxq2zB%sx;4!#0kkbz7j0Te{K?(}phNFTVd+~AJtY834qw;7D@JYF^6 z55N3zf-@~d9;f*rX>~dqzm5*wm#JGLY9n}MygeLLP9*DXm2~}-+lrOzHZBT6gC;N` z-lrpS(xVuPIX}}?zj)=e zcZ8|J&!}@G4>qFhI!+xGaXbzz%^|v6xE&JvC4L$#c2yXFi}xzxlSV)9_q8Hcsp>0? z`_J0Z3!x+Zw%H5z%z){E&-R~?g5FeXZsNo4NVuw(I79dGy-uKpdR65Ht}OEp?afgy zR6Jt%uyEk(UB9gmPbKk|dLk|@R{v+N5zY+r1dULVY}W3#!``!;{qE+cdI#NvEkl(Z zTPMH2>91<$&RQTUw9jdPWlVPA2@jTHT>c)(%JxJpS5=l;l*6^qp|tJKm2QBQ$rr?v zsCTfsrP#%&}&)KbV@q&$Btj8Auq!SK4_05L8*rQN3(ys+m5J zeEf%O$kxxYidc#VYQ#Y*9*lsgWkS$?(%}8Z1yOxOMcy4%V6(9Rr)Zk^W67o|L=&=! zQ(A0(XAo!#%_^WR)gm#H{nh_`$f6{yj4O$Q0_8wfB#Kx57S$E+XJ*LX`mVSwtA3r$ zs0a46^{iFJARC_NF}1#T9A8p4)ED3HNduRC`&0h1k=iU)$K7`hVSye-&%Kxxx;M6b z{y5@K`+^|yroSGYE}iqhmX7M07$%vwVuY!79v5RgTH(%sLFVSuq<=?u>*TS6`C$&m z8Iai(`-m4WpSOfQgD{Hi;e(BJP4zRaoozug{M3-e2MJ3y;A8x2m4jr<#+#j7%O3pt zr9BVgkuk3T=3jqyr|x0j0^M^jpnG2S;Uo=Wabiv2>Z1>dtgMOi71|{(Rbrwixr+A@ zDGV7CMcdhx>{izw>ND5}@CG36El8Ra)V7q&OutNC;)ZPmv|C8W9r=rlv=Po+0+6Ph z@0YBwl>UpV3c8su4-?M&Hos2{Ib6D{IXU7jK9_j;s)e$AR45Q&+FOm-2&lc~@{^#a zhy?2FYi~>UKrpr%b#-N*|5-=Bz;150<&NVPmJ%qQV|`hAKL3g#((xYxj4gzX{Xc`?q%(s+)^bf6sUSbL9`7 z4HPLXvETBBH|7Re`0#Oz@#NmAYKX#CY@B}88eN)!y6$K02KN3=(Ys+c@jvOj{XXjV zLx-%>AyIy?t&O%@yj}W{f5VXr<32;-cLoiPROz_kSUb6bLVin8Db}mK3H`0}I~LU_&3d?1UF)gY!`wB!)0ndd2I`|ld+>R9DRqr4rnXqr zKHN`S@UG?8HSOU$F$?(o2J1++evmqm=s>kPUL%MOxRoQ6T=ScLuZ2)zjmH@0xb)48 zBYe($E9l~5Io>!$b`M@Eqp{6^2M@kWY7@>|_*c|oVRO&lp?JYquI5-j1@@V!|M(S` z(mo}q@uSbNmLUNzWaVtP`j zKoy;Ac!?23`Alwxi-ym>@cohrJtAC_it&;jc|B0o7vQw239abSA#uYw?3=Xm8fE!E e4!52geB7$pi*qFHW8f=3kg|e?e1)t@(0>8^UvAa_ literal 0 HcmV?d00001 diff --git a/_images/post-processing-content_24_0.png b/_images/post-processing-content_24_0.png new file mode 100644 index 0000000000000000000000000000000000000000..445746eaa8f2d40533ca701520fb7b4c2e933e26 GIT binary patch literal 1000 zcmeAS@N?(olHy`uVBq!ia0vp^zd)FY8AyI@+O!Txv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgBWNcITwWnidMV_;}#foN`c!N5>zz`*b-fq}tl1_Oh5!JJ)zHbAvJ0X`wF z|Ns9l5)yjZFwuAakynl_zd;5jdAqwXbg;^L06Clm9+AaB8pQTsa66f8$H2gJ%G1R$ zB;(%OTi!)W40zZc$P}6-K2-i;Cv%W{4y*f%-vupkEh|5~$ZLuF;@`DWvvThGT<=9p z+wANPeB|u4e|Wf^U*4|f$A{&=Lh9XquUmim#l26ywSDD(xTl9J{QmPQ+wxWL-M()# z^0j1-*WCMAbmaYVaWRD-XMQ~Te&@>{ri%HI@q6aYpBKyUT7KvILUNO_1{0lCNV$W>Awu~e#T?Pm)CQ@ z$hp4(NNuQ1TOKbS;G^%eUuVJQ8fBmTdIvsb&j0PpyQS^?mMRNm-tEYx$AT5`5c!2bi4geh~cby>Cew>QAg83RM*4&uKm*c ztZLMMyPf{Gm?j&w3k#)D3 zY_5OTv;Q;u-p?O7@(b4P-}%SZ=JDSC_um-#z|j-_d-ebNKm7a3D{b7p?)_iz-T%Yi@O3x-&K7l$+PC?={Ken?KmM6! zi$2)#-#3ck-R=)_>;CuN+kg1`|6qoOf6QC{Grry5@Z0{vKjAI^S>NsVyu-xz<^O`e z?gjrZZ))8Bd;Nuf`aAyfysdZs{rRdP`(kYX@0Ff`RQG}JY+3^6pb uGBL9O1fG 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 OzT~8oCF{kFL;nM(7rT-G literal 0 HcmV?d00001 diff --git a/_images/post-processing-content_46_0.png b/_images/post-processing-content_46_0.png new file mode 100644 index 0000000000000000000000000000000000000000..650ef7ba9d67381f8217b8083f77de9c6d0227ad GIT binary patch literal 5136 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 a!K>5pn&o`IIk0=_AhZ?sXoZE><^KY6U+zKx literal 0 HcmV?d00001 diff --git a/_images/post-processing-content_55_2.png b/_images/post-processing-content_55_2.png new file mode 100644 index 0000000000000000000000000000000000000000..01ded05faacfea664a2ea3a0822f1a8b5b1ffde5 GIT binary patch literal 101347 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˗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 0) - - *do i = 1, n_tallies* - - *do k = 1, size(tallies(i) % scores, 2)* - - *do j = 1, size(tallies(i) % scores, 1)* - - **real(8) tallies(i) % scores(j,k) % sum** - - Accumulated sum for the j-th score and k-th filter of the - i-th tally - - **real(8) tallies(i) % scores(j,k) % sum_sq** - - Accumulated sum of squares for the j-th score and k-th - filter of the i-th tally - -if (run_mode == MODE_EIGENVALUE and source_present) - - *do i = 1, n_particles* - - **real(8) source_bank(i) % wgt** - - Weight of the i-th source particle - - **real(8) source_bank(i) % xyz(1:3)** - - Coordinates of the i-th source particle. - - **real(8) source_bank(i) % uvw(1:3)** - - Direction of the i-th source particle - - **real(8) source_bank(i) % E** - - Energy of the i-th source particle. - diff --git a/_sources/devguide/voxel.txt b/_sources/devguide/voxel.txt deleted file mode 100644 index 98f5cb73b2..0000000000 --- a/_sources/devguide/voxel.txt +++ /dev/null @@ -1,52 +0,0 @@ -.. _devguide_voxel: - -===================================== -Voxel Plot Binary File Specifications -===================================== - -The current revision of the voxel plot binary file is 1. - -**integer(4) n_voxels_x** - - Number of voxels in the x direction - -**integer(4) n_voxels_y** - - Number of voxels in the y direction - -**integer(4) n_voxels_z** - - Number of voxels in the z direction - -**real(8) width_voxel_x** - - Width of voxels in the x direction - -**real(8) width_voxel_y** - - Width of voxels in the y direction - -**real(8) width_voxel_z** - - Width of voxels in the z direction - -**real(8) lower_left_x** - - Lower left x point of the voxel grid - -**real(8) lower_left_y** - - Lower left y point of the voxel grid - -**real(8) lower_left_z** - - Lower left z point of the voxel grid - -*do x = 1, n_voxels_x* - *do y = 1, n_voxels_y* - *do z = 1, n_voxels_z* - - **integer(4) id** - - Cell or material id number at this voxel center. Set to -1 when - cell not_found. diff --git a/_sources/methods/eigenvalue.txt b/_sources/methods/eigenvalue.txt index fe99ba22ec..41bf865492 100644 --- a/_sources/methods/eigenvalue.txt +++ b/_sources/methods/eigenvalue.txt @@ -142,7 +142,7 @@ than unity. By ensuring that the expected number of fission sites in each mesh cell is constant, the collision density across all cells, and hence the variance of tallies, is more uniform than it would be otherwise. -.. _Shannon entropy: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-06-3737_entropy.pdf +.. _Shannon entropy: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-06-3737.pdf .. [Lieberoth] J. Lieberoth, "A Monte Carlo Technique to Solve the Static Eigenvalue Problem of the Boltzmann Transport Equation," *Nukleonik*, **11**, diff --git a/_sources/methods/geometry.txt b/_sources/methods/geometry.txt index 9eece1e919..c1be68f72e 100644 --- a/_sources/methods/geometry.txt +++ b/_sources/methods/geometry.txt @@ -10,7 +10,7 @@ Constructive Solid Geometry OpenMC uses a technique known as `constructive solid geometry`_ (CSG) to build arbitrarily complex three-dimensional models in Euclidean space. In a CSG model, -every unique object is described as the union, intersection, or difference of +every unique object is described as the union and/or intersection of *half-spaces* created by bounding `surfaces`_. Every surface divides all of space into exactly two half-spaces. We can mathematically define a surface as a collection of points that satisfy an equation of the form :math:`f(x,y,z) = 0` @@ -54,13 +54,12 @@ dividing space into two half-spaces. Example of an ellipse and its associated half-spaces. References to half-spaces created by surfaces are used to define regions of -space of uniform composition, known as *cells*. While some codes allow regions -to be defined by intersections, unions, and differences or half-spaces, OpenMC -is currently limited to cells defined only as intersections of -half-spaces. Thus, the specification of the cell must include a list of -half-space references whose intersection defines the region. The region is then -assigned a material defined elsewhere. Figure :num:`fig-union` shows an -example of a cell defined as the intersection of an ellipse and two planes. +space of uniform composition, which are then assigned to *cells*. OpenMC allows +regions to be defined using union, intersection, and complement operators. As in +MCNP_, the intersection operator is implicit as doesn't need to be written in a +region specification. A defined region is then associated with a material +composition in a cell. Figure :num:`fig-union` shows an example of a cell region +defined as the intersection of an ellipse and two planes. .. _fig-union: @@ -117,6 +116,10 @@ to fully define the surface. | Cone parallel to the | z-cone | :math:`(x-x_0)^2 + (y-y_0)^2 | :math:`x_0 \; y_0 \; | | :math:`z`-axis | | = R^2(z-z_0)^2` | z_0 \; R^2` | +----------------------+------------+------------------------------+-------------------------+ + | General quadric | quadric | :math:`Ax^2 + By^2 + Cz^2 + | :math:`A \; B \; C \; D | + | surface | | Dxy + Eyz + Fxz + Gx + Hy + | \; E \; F \; G \; H \; | + | | | Jz + K` | J \; K` | + +----------------------+------------+------------------------------+-------------------------+ .. _universes: diff --git a/_sources/methods/physics.txt b/_sources/methods/physics.txt index ed10b32343..e25057488c 100644 --- a/_sources/methods/physics.txt +++ b/_sources/methods/physics.txt @@ -187,11 +187,11 @@ secondary photons from nuclear de-excitation are tracked in OpenMC. ------------------------ These types of reactions are just treated as inelastic scattering and as such -are subject to the same procedure as described in -:ref:`inelastic-scatter`. Rather than tracking multiple secondary neutrons, the -weight of the outgoing neutron is multiplied by the number of secondary -neutrons, e.g. for :math:`(n,2n)`, only one outgoing neutron is tracked but its -weight is doubled. +are subject to the same procedure as described in :ref:`inelastic-scatter`. For +reactions with integral multiplicity, e.g., :math:`(n,2n)`, an appropriate +number of secondary neutrons are created. For reactions that have a multiplicity +given as a function of the incoming neutron energy (which occasionally occurs +for MT=5), the weight of the outgoing neutron is multiplied by the multiplcity. .. _fission: @@ -1027,14 +1027,19 @@ probability distribution function can be found by integrating equation Let us call the normalization factor in the denominator of equation :eq:`target-pdf-1` :math:`C`. -It is normally assumed that :math:`\sigma (v_r)` is constant over the range of + +Constant Cross Section Model +---------------------------- + +It is often assumed that :math:`\sigma (v_r)` is constant over the range of relative velocities of interest. This is a good assumption for almost all cases since the elastic scattering cross section varies slowly with velocity for light nuclei, and for heavy nuclei where large variations can occur due to resonance scattering, the moderating effect is rather small. Nonetheless, this assumption may cause incorrect answers in systems with low-lying resonances that can cause a significant amount of up-scatter that would be ignored by this assumption -(e.g. U-238 in commercial light-water reactors). Nevertheless, with this +(e.g. U-238 in commercial light-water reactors). We will revisit this assumption +later in :ref:`energy_dependent_xs_model`. For now, continuing with the assumption, we write :math:`\sigma (v_r) = \sigma_s` which simplifies :eq:`target-pdf-1` to @@ -1232,6 +1237,35 @@ If is not accepted, then we repeat the process and resample a target speed and cosine until a combination is found that satisfies equation :eq:`freegas-accept-2`. +.. _energy_dependent_xs_model: + +Energy-Dependent Cross Section Model +------------------------------------ + +As was noted earlier, assuming that the elastic scattering cross section is +constant in :eq:`reaction-rate` is not strictly correct, especially when +low-lying resonances are present in the cross sections for heavy nuclides. To +correctly account for energy dependence of the scattering cross section entails +performing another rejection step. The most common method is to sample +:math:`\mu` and :math:`v_T` as in the constant cross section approximation and +then perform a rejection on the ratio of the 0 K elastic scattering cross +section at the relative velocity to the maximum 0 K elastic scattering cross +section over the range of velocities considered: + +.. math:: + :label: dbrc + + p_{dbrc} = \frac{\sigma_s(v_r)}{\sigma_{s,max}} + +where it should be noted that the maximum is taken over the range :math:`[v_n - +4/\beta, 4_n + 4\beta]`. This method is known as Doppler broadening rejection +correction (DBRC) and was first introduced by `Becker et al.`_. OpenMC has an +implementation of DBRC as well as an accelerated sampling method that are +described fully in `Walsh et al.`_ + +.. _Becker et al.: http://dx.doi.org/10.1016/j.anucene.2008.12.001 +.. _Walsh et al.: http://dx.doi.org/10.1016/j.anucene.2014.01.017 + .. _sab_tables: ------------ diff --git a/_sources/publications.txt b/_sources/publications.txt index 79d089605c..369b9d9775 100644 --- a/_sources/publications.txt +++ b/_sources/publications.txt @@ -26,6 +26,10 @@ Overviews Benchmarking ------------ +- Khurrum S. Chaudri and Sikander M. Mirza, "Burnup dependent Monte Carlo + neutron physics calculations of IAEA MTR benchmark," *Prog. Nucl. Energy*, + **81**, 43-52 (2015). ``_ + - Daniel J. Kelly, Brian N. Aviles, Paul K. Romano, Bryan R. Herman, Nicholas E. Horelik, and Benoit Forget, "Analysis of select BEAVRS PWR benchmark cycle 1 results using MC21 and OpenMC," *Proc. PHYSOR*, Kyoto, @@ -57,13 +61,8 @@ Coupling and Multi-physics - Bryan R. Herman, Benoit Forget, and Kord Smith, "Progress toward Monte Carlo-thermal hydraulic coupling using low-order nonlinear diffusion - acceleration methods." In press, *Ann. Nucl. Energy*, - (2014). ``_ - -- Adam G. Nelson and William R. Martin, "Improved Convergence of Monte Carlo - Generated Multi-Group Scattering Moments," *Proc. Int. Conf. Mathematics and - Computational Methods Applied to Nuclear Science and Engineering*, Sun Valley, - Idaho, May 5--9 (2013). + acceleration methods." *Ann. Nucl. Energy*, **84**, 63-72 + (2015). ``_ - Bryan R. Herman, Benoit Forget, and Kord Smith, "Utilizing CMFD in OpenMC to Estimate Dominance Ratio and Adjoint," *Trans. Am. Nucl. Soc.*, **109**, @@ -81,19 +80,65 @@ Geometry Miscellaneous ------------- +- William Boyd, Sterling Harper, and Paul K. Romano, "Equipping OpenMC for the + big data era," Accepted, *PHYSOR 2016*, Sun Valley, Idaho, May 1-5, 2016. + +- Qicang Shen, William Boyd, Benoit Forget, and Kord Smith, "Tally precision + triggers for the OpenMC Monte Carlo code," *Trans. Am. Nucl. Soc.*, **112**, + 637-640 (2015). + - Timothy P. Burke, Brian C. Kiedrowski, and William R. Martin, "Flux and Reaction Rate Kernel Density Estimators in OpenMC," *Trans. Am. Nucl. Soc.*, **109**, 683-686 (2013). +------------------------------------ +Multi-group Cross Section Generation +------------------------------------ + +- Adam G. Nelson and William R. Martin, "Improved Monte Carlo tallying of + multi-group scattering moments using the NDPP code," *Trans. Am. Nucl. Soc.*, + **113**, 645-648 (2015) + +- Adam G. Nelson and William R. Martin, "Improved Monte Carlo tallying of + multi-group scattering moment matrices," *Trans. Am. Nucl. Soc.*, **110**, + 217-220 (2014). + +- Adam G. Nelson and William R. Martin, "Improved Convergence of Monte Carlo + Generated Multi-Group Scattering Moments," *Proc. Int. Conf. Mathematics and + Computational Methods Applied to Nuclear Science and Engineering*, Sun Valley, + Idaho, May 5--9 (2013). + ------------ Nuclear Data ------------ +- Colin Josey, Pablo Ducru, Benoit Forget, and Kord Smith, "Windowed multipole + for cross section Doppler broadening," *J. Comput. Phys.*, In Press + (2016). ``_ + +- Colin Josey, Benoit Forget, and Kord Smith, "Windowed multipole sensitivity to + target accuracy of the optimization procedure," *J. Nucl. Sci. Technol.*, + **52**, 987-992 (2015). ``_ + +- Jonathan A. Walsh, Paul K. Romano, Benoit Forget, and Kord S. Smith, + "Optimizations of the energy grid search algorithm in continuous-energy Monte + Carlo particle transport codes", *Comput. Phys. Commun.*, **196**, 134-142 + (2015). ``_ + - Jonathan A. Walsh, Benoit Forget, Kord S. Smith, Brian C. Kiedrowski, and Forrest B. Brown, "Direct, on-the-fly calculation of unresolved resonance region cross sections in Monte Carlo simulations," *Proc. Joint Int. Conf. M&C+SNA+MC*, Nashville, Tennessee, Apr. 19--23 (2015). +- Amanda L. Lund, Andrew R. Siegel, Benoit Forget, Colin Josey, and + Paul K. Romano, "Using fractional cascading to accelerate cross section + lookups in Monte Carlo particle transport calculations," *Proc. Joint + Int. Conf. M&C+SNA+MC*, Nashville, Tennessee, Apr. 19--23 (2015). + +- Ronald O. Rahaman, Andrew R. Siegel, and Paul K. Romano, "Monte Carlo + performance analysis for varying cross section parameter regimes," + *Proc. Joint Int. Conf. M&C+SNA+MC*, Nashville, Tennessee, Apr. 19--23 (2015). + - Paul K. Romano and Timothy H. Trumbull, "Comparison of algorithms for Doppler broadening pointwise tabulated cross sections," *Ann. Nucl. Energy*, **75**, 358--364 (2015). ``_ @@ -114,6 +159,10 @@ Nuclear Data Parallelism ----------- +- Paul K. Romano, John R. Tramm, and Andrew R. Siegel, "Efficacy of hardware + threading for Monte Carlo particle transport calculations on multi- and + many-core systems," Accepted, *PHYSOR 2016*, Sun Valley, Idaho, May 1-5, 2016. + - David Ozog, Allen D. Malony, and Andrew R. Siegel, "A performance analysis of SIMD algorithms for Monte Carlo simulations of nuclear reactor cores," *Proc. IEEE Int. Parallel and Distributed Processing Symposium*, Hyderabad, diff --git a/_sources/pythonapi/energy_groups.txt b/_sources/pythonapi/energy_groups.txt new file mode 100644 index 0000000000..28ca6f3fe2 --- /dev/null +++ b/_sources/pythonapi/energy_groups.txt @@ -0,0 +1,8 @@ +.. _pythonapi_energy_groups: + +============= +Energy Groups +============= + +.. automodule:: openmc.mgxs.groups + :members: diff --git a/_sources/pythonapi/examples/mgxs-part-i-content.txt b/_sources/pythonapi/examples/mgxs-part-i-content.txt new file mode 100644 index 0000000000..1a2e0af1bd --- /dev/null +++ b/_sources/pythonapi/examples/mgxs-part-i-content.txt @@ -0,0 +1,910 @@ + +This IPython Notebook introduces the use of the ``openmc.mgxs`` module +to calculate multi-group cross sections for an infinite homogeneous +medium. In particular, this Notebook introduces the the following +features: + +- **General equations** for scalar-flux averaged multi-group cross + sections +- Creation of multi-group cross sections for an **infinite homogeneous + medium** +- Use of **tally arithmetic** to manipulate multi-group cross sections + +**Note:** This Notebook illustrates the use of +`Pandas `__ ``DataFrames`` to containerize +multi-group cross section data. We recommend using +`Pandas `__ >v0.15.0 or later since OpenMC's +Python API leverages the multi-indexing feature included in the most +recent releases of `Pandas `__. + +Introduction to Multi-Group Cross Sections (MGXS) +------------------------------------------------- + +Many Monte Carlo particle transport codes, including OpenMC, use +continuous-energy nuclear cross section data. However, most +deterministic neutron transport codes use *multi-group cross sections* +defined over discretized energy bins or *energy groups*. An example of +U-235's continuous-energy fission cross section along with a 16-group +cross section computed for a light water reactor spectrum is displayed +below. + +.. code:: python + + from IPython.display import Image + Image(filename='images/mgxs.png', width=350) + + + + +.. image:: mgxs-part-i-content_files/mgxs-part-i-content_3_0.png + + + +A variety of tools employing different methodologies have been developed +over the years to compute multi-group cross sections for certain +applications, including NJOY (LANL), MC\ :math:`^2`-3 (ANL), and Serpent +(VTT). The ``openmc.mgxs`` Python module is designed to leverage +OpenMC's tally system to calculate multi-group cross sections with +arbitrary energy discretizations for fine-mesh heterogeneous +deterministic neutron transport applications. + +Before proceeding to illustrate how one may use the ``openmc.mgxs`` +module, it is worthwhile to define the general equations used to +calculate multi-group cross sections. This is only intended as a brief +overview of the methodology used by ``openmc.mgxs`` - we refer the +interested reader to the large body of literature on the subject for a +more comprehensive understanding of this complex topic. + +Introductory Notation +~~~~~~~~~~~~~~~~~~~~~ + +The continuous real-valued microscopic cross section may be denoted +:math:`\sigma_{n,x}(\mathbf{r}, E)` for position vector +:math:`\mathbf{r}`, energy :math:`E`, nuclide :math:`n` and interaction +type :math:`x`. Similarly, the scalar neutron flux may be denoted by +:math:`\Phi(\mathbf{r},E)` for position :math:`\mathbf{r}` and energy +:math:`E`. **Note**: Although nuclear cross sections are dependent on +the temperature :math:`T` of the interacting medium, the temperature +variable is neglected here for brevity. + +Spatial and Energy Discretization +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The energy domain for critical systems such as thermal reactors spans +more than 10 orders of magnitude of neutron energies from +10\ :math:`^{-5}` - 10\ :math:`^7` eV. The multi-group approximation +discretization divides this energy range into one or more energy groups. +In particular, for :math:`G` total groups, we denote an energy group +index :math:`g` such that :math:`g \in \{1, 2, ..., G\}`. The energy +group indices are defined such that the smaller group the higher the +energy, and vice versa. The integration over neutron energies across a +discrete energy group is commonly referred to as **energy +condensation**. + +Multi-group cross sections are computed for discretized spatial zones in +the geometry of interest. The spatial zones may be defined on a +structured and regular fuel assembly or pin cell mesh, an arbitrary +unstructured mesh or the constructive solid geometry used by OpenMC. For +a geometry with :math:`K` distinct spatial zones, we designate each +spatial zone an index :math:`k` such that +:math:`k \in \{1, 2, ..., K\}`. The volume of each spatial zone is +denoted by :math:`V_{k}`. The integration over discrete spatial zones is +commonly referred to as **spatial homogenization**. + +General Scalar-Flux Weighted MGXS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The multi-group cross sections computed by ``openmc.mgxs`` are defined +as a *scalar flux-weighted average* of the microscopic cross sections +across each discrete energy group. This formulation is employed in order +to preserve the reaction rates within each energy group and spatial +zone. In particular, spatial homogenization and energy condensation are +used to compute the general multi-group cross section +:math:`\sigma_{n,x,k,g}` as follows: + +.. math:: \sigma_{n,x,k,g} = \frac{\int_{E_{g}}^{E_{g-1}}\mathrm{d}E'\int_{\mathbf{r} \in V_{k}}\mathrm{d}\mathbf{r}\sigma_{n,x}(\mathbf{r},E')\Phi(\mathbf{r},E')}{\int_{E_{g}}^{E_{g-1}}\mathrm{d}E'\int_{\mathbf{r} \in V_{k}}\mathrm{d}\mathbf{r}\Phi(\mathbf{r},E')} + +This scalar flux-weighted average microscopic cross section is computed +by ``openmc.mgxs`` for most multi-group cross sections, including total, +absorption, and fission reaction types. These double integrals are +stochastically computed with OpenMC's tally system - in particular, +`filters `__ on +the energy range and spatial zone (material, cell or universe) define +the bounds of integration for both numerator and denominator. + +Multi-Group Scattering Matrices +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The general multi-group cross section :math:`\sigma_{n,x,k,g}` is a +vector of :math:`G` values for each energy group :math:`g`. The equation +presented above only discretizes the energy of the incoming neutron and +neglects the outgoing energy of the neutron (if any). Hence, this +formulation must be extended to account for the outgoing energy of +neutrons in the discretized scattering matrix cross section used by +deterministic neutron transport codes. + +We denote the incoming and outgoing neutron energy groups as :math:`g` +and :math:`g'` for the microscopic scattering matrix cross section +:math:`\sigma_{n,s}(\mathbf{r},E)`. As before, spatial homogenization +and energy condensation are used to find the multi-group scattering +matrix cross section :math:`\sigma_{n,s,k,g \to g'}` as follows: + +.. math:: \sigma_{n,s,k,g\rightarrow g'} = \frac{\int_{E_{g'}}^{E_{g'-1}}\mathrm{d}E''\int_{E_{g}}^{E_{g-1}}\mathrm{d}E'\int_{\mathbf{r} \in V_{k}}\mathrm{d}\mathbf{r}\sigma_{n,s}(\mathbf{r},E'\rightarrow E'')\Phi(\mathbf{r},E')}{\int_{E_{g}}^{E_{g-1}}\mathrm{d}E'\int_{\mathbf{r} \in V_{k}}\mathrm{d}\mathbf{r}\Phi(\mathbf{r},E')} + +This scalar flux-weighted multi-group microscopic scattering matrix is +computed using OpenMC tallies with both energy in and energy out +filters. + +Multi-Group Fission Spectrum +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The energy spectrum of neutrons emitted from fission is denoted by +:math:`\chi_{n}(\mathbf{r},E' \rightarrow E'')` for incoming and +outgoing energies :math:`E'` and :math:`E''`, respectively. Unlike the +multi-group cross sections :math:`\sigma_{n,x,k,g}` considered up to +this point, the fission spectrum is a probability distribution and must +sum to unity. The outgoing energy is typically much less dependent on +the incoming energy for fission than for scattering interactions. As a +result, it is common practice to integrate over the incoming neutron +energy when computing the multi-group fission spectrum. The fission +spectrum may be simplified as :math:`\chi_{n}(\mathbf{r},E)` with +outgoing energy :math:`E`. + +Unlike the multi-group cross sections defined up to this point, the +multi-group fission spectrum is weighted by the fission production rate +rather than the scalar flux. This formulation is intended to preserve +the total fission production rate in the multi-group deterministic +calculation. In order to mathematically define the multi-group fission +spectrum, we denote the microscopic fission cross section as +:math:`\sigma_{n,f}(\mathbf{r},E)` and the average number of neutrons +emitted from fission interactions with nuclide :math:`n` as +:math:`\nu_{n}(\mathbf{r},E)`. The multi-group fission spectrum +:math:`\chi_{n,k,g}` is then the probability of fission neutrons emitted +into energy group :math:`g`. + +Similar to before, spatial homogenization and energy condensation are +used to find the multi-group fission spectrum :math:`\chi_{n,k,g}` as +follows: + +.. math:: \chi_{n,k,g'} = \frac{\int_{E_{g'}}^{E_{g'-1}}\mathrm{d}E''\int_{0}^{\infty}\mathrm{d}E'\int_{\mathbf{r} \in V_{k}}\mathrm{d}\mathbf{r}\chi_{n}(\mathbf{r},E'\rightarrow E'')\nu_{n}(\mathbf{r},E')\sigma_{n,f}(\mathbf{r},E')\Phi(\mathbf{r},E')}{\int_{0}^{\infty}\mathrm{d}E'\int_{\mathbf{r} \in V_{k}}\mathrm{d}\mathbf{r}\nu_{n}(\mathbf{r},E')\sigma_{n,f}(\mathbf{r},E')\Phi(\mathbf{r},E')} + +The fission production-weighted multi-group fission spectrum is computed +using OpenMC tallies with both energy in and energy out filters. + +This concludes our brief overview on the methodology to compute +multi-group cross sections. The following sections detail more +concretely how users may employ the ``openmc.mgxs`` module to power +simulation workflows requiring multi-group cross sections for downstream +deterministic calculations. + +Generate Input Files +-------------------- + +.. code:: python + + import numpy as np + import matplotlib.pyplot as plt + + import openmc + import openmc.mgxs as mgxs + + %matplotlib inline + +First we need to define materials that will be used in the problem. +Before defining a material, we must create nuclides that are used in the +material. + +.. code:: python + + # Instantiate some Nuclides + h1 = openmc.Nuclide('H-1') + o16 = openmc.Nuclide('O-16') + u235 = openmc.Nuclide('U-235') + u238 = openmc.Nuclide('U-238') + zr90 = openmc.Nuclide('Zr-90') + +With the nuclides we defined, we will now create a material for the +homogeneous medium. + +.. code:: python + + # Instantiate a Material and register the Nuclides + inf_medium = openmc.Material(name='moderator') + inf_medium.set_density('g/cc', 5.) + inf_medium.add_nuclide(h1, 0.028999667) + inf_medium.add_nuclide(o16, 0.01450188) + inf_medium.add_nuclide(u235, 0.000114142) + inf_medium.add_nuclide(u238, 0.006886019) + inf_medium.add_nuclide(zr90, 0.002116053) + +With our material, we can now create a ``MaterialsFile`` object that can +be exported to an actual XML file. + +.. code:: python + + # Instantiate a MaterialsFile, register all Materials, and export to XML + materials_file = openmc.MaterialsFile() + materials_file.default_xs = '71c' + materials_file.add_material(inf_medium) + materials_file.export_to_xml() + +Now let's move on to the geometry. This problem will be a simple square +cell with reflective boundary conditions to simulate an infinite +homogeneous medium. The first step is to create the outer bounding +surfaces of the problem. + +.. code:: python + + # Instantiate boundary Planes + min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63) + max_x = openmc.XPlane(boundary_type='reflective', x0=0.63) + min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63) + max_y = openmc.YPlane(boundary_type='reflective', y0=0.63) + +With the surfaces defined, we can now create a cell that is defined by +intersections of half-spaces created by the surfaces. + +.. code:: python + + # Instantiate a Cell + cell = openmc.Cell(cell_id=1, name='cell') + + # Register bounding Surfaces with the Cell + cell.region = +min_x & -max_x & +min_y & -max_y + + # Fill the Cell with the Material + cell.fill = inf_medium + +OpenMC requires that there is a "root" universe. Let us create a root +universe and add our square cell to it. + +.. code:: python + + # Instantiate Universe + root_universe = openmc.Universe(universe_id=0, name='root universe') + root_universe.add_cell(cell) + +We now must create a geometry that is assigned a root universe, put the +geometry into a ``GeometryFile`` object, and export it to XML. + +.. code:: python + + # Create Geometry and set root Universe + openmc_geometry = openmc.Geometry() + openmc_geometry.root_universe = root_universe + + # Instantiate a GeometryFile + geometry_file = openmc.GeometryFile() + geometry_file.geometry = openmc_geometry + + # Export to "geometry.xml" + geometry_file.export_to_xml() + +Next, we must define simulation parameters. In this case, we will use 10 +inactive batches and 40 active batches each with 2500 particles. + +.. code:: python + + # OpenMC simulation parameters + batches = 50 + inactive = 10 + particles = 2500 + + # Instantiate a SettingsFile + settings_file = openmc.SettingsFile() + settings_file.batches = batches + settings_file.inactive = inactive + settings_file.particles = particles + settings_file.output = {'tallies': True, 'summary': True} + bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63] + settings_file.set_source_space('fission', bounds) + + # Export to "settings.xml" + settings_file.export_to_xml() + +Now we are ready to generate multi-group cross sections! First, let's +define a 2-group structure using the built-in ``EnergyGroups`` class. + +.. code:: python + + # Instantiate a 2-group EnergyGroups object + groups = mgxs.EnergyGroups() + groups.group_edges = np.array([0., 0.625e-6, 20.]) + +We can now use the ``EnergyGroups`` object, along with our previously +created materials and geometry, to instantiate some ``MGXS`` objects +from the ``openmc.mgxs`` module. In particular, the following are +subclasses of the generic and abstract ``MGXS`` class: + +- ``TotalXS`` +- ``TransportXS`` +- ``AbsorptionXS`` +- ``CaptureXS`` +- ``FissionXS`` +- ``NuFissionXS`` +- ``ScatterXS`` +- ``NuScatterXS`` +- ``ScatterMatrixXS`` +- ``NuScatterMatrixXS`` +- ``Chi`` + +These classes provide us with an interface to generate the tally inputs +as well as perform post-processing of OpenMC's tally data to compute the +respective multi-group cross sections. In this case, let's create the +multi-group total, absorption and scattering cross sections with our +2-group structure. + +.. code:: python + + # Instantiate a few different sections + total = mgxs.TotalXS(domain=cell, domain_type='cell', groups=groups) + absorption = mgxs.AbsorptionXS(domain=cell, domain_type='cell', groups=groups) + scattering = mgxs.ScatterXS(domain=cell, domain_type='cell', groups=groups) + +Each multi-group cross section object stores its tallies in a Python +dictionary called ``tallies``. We can inspect the tallies in the +dictionary for our ``Absorption`` object as follows. + +.. code:: python + + absorption.tallies + + + + +.. parsed-literal:: + + OrderedDict([('flux', Tally + ID = 10000 + Name = + Filters = + cell [1] + energy [ 0.00000000e+00 6.25000000e-07 2.00000000e+01] + Nuclides = total + Scores = ['flux'] + Estimator = tracklength + ), ('absorption', Tally + ID = 10001 + Name = + Filters = + cell [1] + energy [ 0.00000000e+00 6.25000000e-07 2.00000000e+01] + Nuclides = total + Scores = ['absorption'] + Estimator = tracklength + )]) + + + +The ``Absorption`` object includes tracklength tallies for the +'absorption' and 'flux' scores in the 2-group structure in cell 1. Now +that each ``MGXS`` object contains the tallies that it needs, we must +add these tallies to a ``TalliesFile`` object to generate the +"tallies.xml" input file for OpenMC. + +.. code:: python + + # Instantiate an empty TalliesFile + tallies_file = openmc.TalliesFile() + + # Add total tallies to the tallies file + for tally in total.tallies.values(): + tallies_file.add_tally(tally) + + # Add absorption tallies to the tallies file + for tally in absorption.tallies.values(): + tallies_file.add_tally(tally) + + # Add scattering tallies to the tallies file + for tally in scattering.tallies.values(): + tallies_file.add_tally(tally) + + # Export to "tallies.xml" + tallies_file.export_to_xml() + +Now we a have a complete set of inputs, so we can go ahead and run our +simulation. + +.. code:: python + + # Run OpenMC + executor = openmc.Executor() + executor.run_simulation() + + +.. parsed-literal:: + + + .d88888b. 888b d888 .d8888b. + d88P" "Y88b 8888b d8888 d88P Y88b + 888 888 88888b.d88888 888 888 + 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 + 888 888 888 "88b d8P Y8b 888 "88b 888 Y888P 888 888 + 888 888 888 888 88888888 888 888 888 Y8P 888 888 888 + Y88b. .d88P 888 d88P Y8b. 888 888 888 " 888 Y88b d88P + "Y88888P" 88888P" "Y8888 888 888 888 888 "Y8888P" + __________________888______________________________________________________ + 888 + 888 + + Copyright: 2011-2015 Massachusetts Institute of Technology + License: http://mit-crpg.github.io/openmc/license.html + Version: 0.7.0 + Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca + Date/Time: 2015-12-02 09:11:05 + MPI Processes: 1 + + =========================================================================== + ========================> INITIALIZATION <========================= + =========================================================================== + + Reading settings XML file... + Reading cross sections XML file... + Reading geometry XML file... + Reading materials XML file... + Reading tallies XML file... + Building neighboring cells lists for each surface... + Loading ACE cross section table: 1001.71c + Loading ACE cross section table: 8016.71c + Loading ACE cross section table: 92235.71c + Loading ACE cross section table: 92238.71c + Loading ACE cross section table: 40090.71c + Maximum neutron transport energy: 20.0000 MeV for 1001.71c + Initializing source particles... + + =========================================================================== + ====================> K EIGENVALUE SIMULATION <==================== + =========================================================================== + + Bat./Gen. k Average k + ========= ======== ==================== + 1/1 1.19804 + 2/1 1.12945 + 3/1 1.15573 + 4/1 1.13929 + 5/1 1.16300 + 6/1 1.22117 + 7/1 1.19012 + 8/1 1.11299 + 9/1 1.16066 + 10/1 1.12566 + 11/1 1.20854 + 12/1 1.14691 1.17773 +/- 0.03082 + 13/1 1.17204 1.17583 +/- 0.01789 + 14/1 1.14148 1.16724 +/- 0.01529 + 15/1 1.17272 1.16834 +/- 0.01189 + 16/1 1.18575 1.17124 +/- 0.01014 + 17/1 1.20498 1.17606 +/- 0.00983 + 18/1 1.14754 1.17249 +/- 0.00923 + 19/1 1.18141 1.17348 +/- 0.00820 + 20/1 1.15074 1.17121 +/- 0.00768 + 21/1 1.15914 1.17011 +/- 0.00703 + 22/1 1.14586 1.16809 +/- 0.00673 + 23/1 1.18999 1.16978 +/- 0.00642 + 24/1 1.15101 1.16844 +/- 0.00609 + 25/1 1.13791 1.16640 +/- 0.00602 + 26/1 1.19791 1.16837 +/- 0.00597 + 27/1 1.19818 1.17012 +/- 0.00587 + 28/1 1.14160 1.16854 +/- 0.00576 + 29/1 1.11487 1.16571 +/- 0.00614 + 30/1 1.17538 1.16620 +/- 0.00584 + 31/1 1.20210 1.16791 +/- 0.00581 + 32/1 1.20078 1.16940 +/- 0.00574 + 33/1 1.14624 1.16839 +/- 0.00558 + 34/1 1.14618 1.16747 +/- 0.00542 + 35/1 1.16866 1.16752 +/- 0.00520 + 36/1 1.18565 1.16821 +/- 0.00504 + 37/1 1.16824 1.16821 +/- 0.00485 + 38/1 1.18299 1.16874 +/- 0.00471 + 39/1 1.21418 1.17031 +/- 0.00480 + 40/1 1.11167 1.16835 +/- 0.00504 + 41/1 1.11545 1.16665 +/- 0.00516 + 42/1 1.11114 1.16491 +/- 0.00529 + 43/1 1.14227 1.16423 +/- 0.00517 + 44/1 1.14104 1.16355 +/- 0.00506 + 45/1 1.16756 1.16366 +/- 0.00492 + 46/1 1.13065 1.16274 +/- 0.00487 + 47/1 1.11251 1.16139 +/- 0.00492 + 48/1 1.14731 1.16101 +/- 0.00481 + 49/1 1.16691 1.16117 +/- 0.00469 + 50/1 1.19679 1.16206 +/- 0.00465 + Creating state point statepoint.50.h5... + + =========================================================================== + ======================> SIMULATION FINISHED <====================== + =========================================================================== + + + =======================> TIMING STATISTICS <======================= + + Total time for initialization = 4.1700E-01 seconds + Reading cross sections = 8.9000E-02 seconds + Total time in simulation = 1.4728E+01 seconds + Time in transport only = 1.4712E+01 seconds + Time in inactive batches = 1.7890E+00 seconds + Time in active batches = 1.2939E+01 seconds + Time synchronizing fission bank = 5.0000E-03 seconds + Sampling source sites = 3.0000E-03 seconds + SEND/RECV source sites = 2.0000E-03 seconds + Time accumulating tallies = 1.0000E-03 seconds + Total time for finalization = 1.0000E-03 seconds + Total time elapsed = 1.5155E+01 seconds + Calculation Rate (inactive) = 13974.3 neutrons/second + Calculation Rate (active) = 7728.57 neutrons/second + + ============================> RESULTS <============================ + + k-effective (Collision) = 1.16131 +/- 0.00453 + k-effective (Track-length) = 1.16206 +/- 0.00465 + k-effective (Absorption) = 1.16096 +/- 0.00364 + Combined k-effective = 1.16120 +/- 0.00325 + Leakage Fraction = 0.00000 +/- 0.00000 + + + + + +.. parsed-literal:: + + 0 + + + +Tally Data Processing +--------------------- + +Our simulation ran successfully and created statepoint and summary +output files. We begin our analysis by instantiating a ``StatePoint`` +object. + +.. code:: python + + # Load the last statepoint file + sp = openmc.StatePoint('statepoint.50.h5') + +In addition to the statepoint file, our simulation also created a +summary file which encapsulates information about the materials and +geometry. This is necessary for the ``openmc.mgxs`` module to properly +process the tally data. We first create a ``Summary`` object and link it +with the statepoint. + +.. code:: python + + # Load the summary file and link it with the statepoint + su = openmc.Summary('summary.h5') + sp.link_with_summary(su) + +The statepoint is now ready to be analyzed by our multi-group cross +sections. We simply have to load the tallies from the ``StatePoint`` +into each object as follows and our ``MGXS`` objects will compute the +cross sections for us under-the-hood. + +.. code:: python + + # Load the tallies from the statepoint into each MGXS object + total.load_from_statepoint(sp) + absorption.load_from_statepoint(sp) + scattering.load_from_statepoint(sp) + +Voila! Our multi-group cross sections are now ready to rock 'n roll! + +Extracting and Storing MGXS Data +-------------------------------- + +Let's first inspect our total cross section by printing it to the +screen. + +.. code:: python + + total.print_xs() + + +.. parsed-literal:: + + Multi-Group XS + Reaction Type = total + Domain Type = cell + Domain ID = 1 + Cross Sections [cm^-1]: + Group 1 [6.25e-07 - 20.0 MeV]: 6.81e-01 +/- 1.88e-01% + Group 2 [0.0 - 6.25e-07 MeV]: 1.40e+00 +/- 5.91e-01% + + + + + +Since the ``openmc.mgxs`` module uses `tally +arithmetic `__ +under-the-hood, the cross section is stored as a "derived" ``Tally`` +object. This means that it can be queried and manipulated using all of +the same methods supported for the ``Tally`` class in the OpenMC Python +API. For example, we can construct a +`Pandas `__ ``DataFrame`` of the multi-group +cross section data. + +.. code:: python + + df = scattering.get_pandas_dataframe() + df.head(10) + + + + +.. raw:: html + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellgroup innuclidemeanstd. dev.
111total0.6683230.001264
012total1.2932580.007624
+
+ + + +Each multi-group cross section object can be easily exported to a +variety of file formats, including CSV, Excel, and LaTeX for storage or +data processing. + +.. code:: python + + absorption.export_xs_data(filename='absorption-xs', format='excel') + +The following code snippet shows how to export all three ``MGXS`` to the +same HDF5 binary data store. + +.. code:: python + + total.build_hdf5_store(filename='mgxs', append=True) + absorption.build_hdf5_store(filename='mgxs', append=True) + scattering.build_hdf5_store(filename='mgxs', append=True) + +Comparing MGXS with Tally Arithmetic +------------------------------------ + +Finally, we illustrate how one can leverage OpenMC's `tally +arithmetic `__ +data processing feature with ``MGXS`` objects. The ``openmc.mgxs`` +module uses tally arithmetic to compute multi-group cross sections with +automated uncertainty propagation. Each ``MGXS`` object includes an +``xs_tally`` attribute which is a "derived" ``Tally`` based on the +tallies needed to compute the cross section type of interest. These +derived tallies can be used in subsequent tally arithmetic operations. +For example, we can use tally artithmetic to confirm that the +``TotalXS`` is equal to the sum of the ``AbsorptionXS`` and +``ScatterXS`` objects. + +.. code:: python + + # Use tally arithmetic to compute the difference between the total, absorption and scattering + difference = total.xs_tally - absorption.xs_tally - scattering.xs_tally + + # The difference is a derived tally which can generate Pandas DataFrames for inspection + difference.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((total / flux) - (absorption / flux)) - (sca...4.884981e-150.011274
11(6.3e-07 - 2.0e+01)total(((total / flux) - (absorption / flux)) - (sca...1.221245e-150.001802
+
+ + + +Similarly, we can use tally arithmetic to compute the ratio of +``AbsorptionXS`` and ``ScatterXS`` to the ``TotalXS``. + +.. code:: python + + # Use tally arithmetic to compute the absorption-to-total MGXS ratio + absorption_to_total = absorption.xs_tally / total.xs_tally + + # The absorption-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection + absorption_to_total.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((absorption / flux) / (total / flux))0.0762190.000651
11(6.3e-07 - 2.0e+01)total((absorption / flux) / (total / flux))0.0193190.000086
+
+ + + +.. code:: python + + # Use tally arithmetic to compute the scattering-to-total MGXS ratio + scattering_to_total = scattering.xs_tally / total.xs_tally + + # The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection + scattering_to_total.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((scatter / flux) / (total / flux))0.9237810.007714
11(6.3e-07 - 2.0e+01)total((scatter / flux) / (total / flux))0.9806810.002617
+
+ + + +Lastly, we sum the derived scatter-to-total and absorption-to-total +ratios to confirm that they sum to unity. + +.. code:: python + + # Use tally arithmetic to ensure that the absorption- and scattering-to-total MGXS ratios sum to unity + sum_ratio = absorption_to_total + scattering_to_total + + # The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection + sum_ratio.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((absorption / flux) / (total / flux)) + ((sc...10.007741
11(6.3e-07 - 2.0e+01)total(((absorption / flux) / (total / flux)) + ((sc...10.002619
+
+ + diff --git a/_sources/pythonapi/examples/mgxs-part-i.txt b/_sources/pythonapi/examples/mgxs-part-i.txt new file mode 100644 index 0000000000..8b29183f05 --- /dev/null +++ b/_sources/pythonapi/examples/mgxs-part-i.txt @@ -0,0 +1,13 @@ +.. _notebook_mgxs_part_i: + +========================= +MGXS Part I: Introduction +========================= + +.. only:: html + + .. notebook:: mgxs-part-i.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/_sources/pythonapi/examples/mgxs-part-ii-content.txt b/_sources/pythonapi/examples/mgxs-part-ii-content.txt new file mode 100644 index 0000000000..b549a89616 --- /dev/null +++ b/_sources/pythonapi/examples/mgxs-part-ii-content.txt @@ -0,0 +1,1532 @@ + +This IPython Notebook illustrates the use of the ``openmc.mgxs`` module +to calculate multi-group cross sections for a heterogeneous fuel pin +cell geometry. In particular, this Notebook illustrates the following +features: + +- Creation of multi-group cross sections on a **heterogeneous + geometry** +- Calculation of cross sections on a **nuclide-by-nuclide basis** +- The use of **`tally precision + triggers `__** + with multi-group cross sections +- Built-in features for **energy condensation** in downstream data + processing +- The use of **`PyNE `__ to plot** continuous-energy + vs. multi-group cross sections +- **Validation** of multi-group cross sections with + **`OpenMOC `__** + +**Note:** This Notebook was created using +`OpenMOC `__ to verify the +multi-group cross-sections generated by OpenMC. In order to run this +Notebook in its entirety, you must have +`OpenMOC `__ installed on your +system, along with OpenCG to convert the OpenMC geometries into OpenMOC +geometries. In addition, this Notebook illustrates the use of +`Pandas `__ ``DataFrames`` to containerize +multi-group cross section data. We recommend using +`Pandas `__ >v0.15.0 or later since OpenMC's +Python API leverages the multi-indexing feature included in the most +recent releases of `Pandas `__. + +Generate Input Files +-------------------- + +.. code:: python + + import numpy as np + import matplotlib.pyplot as plt + import seaborn as sns + + import openmc + import openmc.mgxs as mgxs + import openmoc + from openmoc.compatible import get_openmoc_geometry + import pyne.ace + + %matplotlib inline + + +.. parsed-literal:: + + /usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect + because the backend has already been chosen; + matplotlib.use() must be called *before* pylab, matplotlib.pyplot, + or matplotlib.backends is imported for the first time. + + warnings.warn(_use_error_msg) + /usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:9: QAWarning: pyne.rxname is not yet QA compliant. + /usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:9: QAWarning: pyne.ace is not yet QA compliant. + + +First we need to define materials that will be used in the problem. +Before defining a material, we must create nuclides that are used in the +material. + +.. code:: python + + # Instantiate some Nuclides + h1 = openmc.Nuclide('H-1') + o16 = openmc.Nuclide('O-16') + u235 = openmc.Nuclide('U-235') + u238 = openmc.Nuclide('U-238') + zr90 = openmc.Nuclide('Zr-90') + +With the nuclides we defined, we will now create three distinct +materials for water, clad and fuel. + +.. code:: python + + # 1.6% enriched fuel + fuel = openmc.Material(name='1.6% Fuel') + fuel.set_density('g/cm3', 10.31341) + fuel.add_nuclide(u235, 3.7503e-4) + fuel.add_nuclide(u238, 2.2625e-2) + fuel.add_nuclide(o16, 4.6007e-2) + + # borated water + water = openmc.Material(name='Borated Water') + water.set_density('g/cm3', 0.740582) + water.add_nuclide(h1, 4.9457e-2) + water.add_nuclide(o16, 2.4732e-2) + + # zircaloy + zircaloy = openmc.Material(name='Zircaloy') + zircaloy.set_density('g/cm3', 6.55) + zircaloy.add_nuclide(zr90, 7.2758e-3) + +With our materials, we can now create a ``MaterialsFile`` object that +can be exported to an actual XML file. + +.. code:: python + + # Instantiate a MaterialsFile, add Materials + materials_file = openmc.MaterialsFile() + materials_file.add_material(fuel) + materials_file.add_material(water) + materials_file.add_material(zircaloy) + materials_file.default_xs = '71c' + + # Export to "materials.xml" + materials_file.export_to_xml() + +Now let's move on to the geometry. Our problem will have three regions +for the fuel, the clad, and the surrounding coolant. The first step is +to create the bounding surfaces -- in this case two cylinders and six +reflective planes. + +.. code:: python + + # Create cylinders for the fuel and clad + fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218) + clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720) + + # Create boundary planes to surround the geometry + min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective') + max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective') + min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective') + max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective') + min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective') + max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective') + +With the surfaces defined, we can now create cells that are defined by +intersections of half-spaces created by the surfaces. + +.. code:: python + + # Create a Universe to encapsulate a fuel pin + pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin') + + # Create fuel Cell + fuel_cell = openmc.Cell(name='1.6% Fuel') + fuel_cell.fill = fuel + fuel_cell.region = -fuel_outer_radius + pin_cell_universe.add_cell(fuel_cell) + + # Create a clad Cell + clad_cell = openmc.Cell(name='1.6% Clad') + clad_cell.fill = zircaloy + clad_cell.region = +fuel_outer_radius & -clad_outer_radius + pin_cell_universe.add_cell(clad_cell) + + # Create a moderator Cell + moderator_cell = openmc.Cell(name='1.6% Moderator') + moderator_cell.fill = water + moderator_cell.region = +clad_outer_radius + pin_cell_universe.add_cell(moderator_cell) + +OpenMC requires that there is a "root" universe. Let us create a root +cell that is filled by the pin cell universe and then assign it to the +root universe. + +.. code:: python + + # Create root Cell + root_cell = openmc.Cell(name='root cell') + root_cell.region = +min_x & -max_x & +min_y & -max_y + root_cell.fill = pin_cell_universe + + # Create root Universe + root_universe = openmc.Universe(universe_id=0, name='root universe') + root_universe.add_cell(root_cell) + +We now must create a geometry that is assigned a root universe, put the +geometry into a ``GeometryFile`` object, and export it to XML. + +.. code:: python + + # Create Geometry and set root Universe + openmc_geometry = openmc.Geometry() + openmc_geometry.root_universe = root_universe + + # Instantiate a GeometryFile + geometry_file = openmc.GeometryFile() + geometry_file.geometry = openmc_geometry + + # Export to "geometry.xml" + geometry_file.export_to_xml() + +Next, we must define simulation parameters. In this case, we will use 10 +inactive batches and 190 active batches each with 10,000 particles. + +.. code:: python + + # OpenMC simulation parameters + batches = 50 + inactive = 10 + particles = 10000 + + # Instantiate a SettingsFile + settings_file = openmc.SettingsFile() + settings_file.batches = batches + settings_file.inactive = inactive + settings_file.particles = particles + settings_file.output = {'tallies': True, 'summary': True} + bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63] + settings_file.set_source_space('fission', bounds) + + # Activate tally precision triggers + settings_file.trigger_active = True + settings_file.trigger_max_batches = settings_file.batches * 4 + + # Export to "settings.xml" + settings_file.export_to_xml() + +Now we are finally ready to make use of the ``openmc.mgxs`` module to +generate multi-group cross sections! First, let's define "coarse" +2-group and "fine" 8-group structures using the built-in +``EnergyGroups`` class. + +.. code:: python + + # Instantiate a "coarse" 2-group EnergyGroups object + coarse_groups = mgxs.EnergyGroups() + coarse_groups.group_edges = np.array([0., 0.625e-6, 20.]) + + # Instantiate a "fine" 8-group EnergyGroups object + fine_groups = mgxs.EnergyGroups() + fine_groups.group_edges = np.array([0., 0.058e-6, 0.14e-6, 0.28e-6, + 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.]) + +Now we will instantiate a variety of ``MGXS`` objects needed to run an +OpenMOC simulation to verify the accuracy of our cross sections. In +particular, we define transport, fission, nu-fission, nu-scatter and chi +cross sections for each of the three cells in the fuel pin with the +8-group structure as our energy groups. + +.. code:: python + + # Extract all Cells filled by Materials + openmc_cells = openmc_geometry.get_all_material_cells() + + # Create dictionary to store multi-group cross sections for all cells + xs_library = {} + + # Instantiate 8-group cross sections for each cell + for cell in openmc_cells: + xs_library[cell.id] = {} + xs_library[cell.id]['transport'] = mgxs.TransportXS(groups=fine_groups) + xs_library[cell.id]['fission'] = mgxs.FissionXS(groups=fine_groups) + xs_library[cell.id]['nu-fission'] = mgxs.NuFissionXS(groups=fine_groups) + xs_library[cell.id]['nu-scatter'] = mgxs.NuScatterMatrixXS(groups=fine_groups) + xs_library[cell.id]['chi'] = mgxs.Chi(groups=fine_groups) + +Next, we showcase the use of OpenMC's `tally precision +trigger `__ +feature in conjunction with the ``openmc.mgxs`` module. In particular, +we will assign a tally trigger of 1E-2 on the standard deviation for +each of the tallies used to compute multi-group cross sections. + +.. code:: python + + # Create a tally trigger for +/- 0.01 on each tally used to compute the multi-group cross sections + tally_trigger = openmc.Trigger('std_dev', 1E-2) + + # Add the tally trigger to each of the multi-group cross section tallies + for cell in openmc_cells: + for mgxs_type in xs_library[cell.id]: + xs_library[cell.id][mgxs_type].tally_trigger = tally_trigger + +Now, we must loop over all cells to set the cross section domains to the +various cells - fuel, clad and moderator - included in the geometry. In +addition, we will set each cross section to tally cross sections on a +per-nuclide basis through the use of the ``MGXS`` class' boolean +``by_nuclide`` instance attribute. + +.. code:: python + + # Instantiate an empty TalliesFile + tallies_file = openmc.TalliesFile() + + # Iterate over all cells and cross section types + for cell in openmc_cells: + for rxn_type in xs_library[cell.id]: + + # Set the cross sections domain type to the cell + xs_library[cell.id][rxn_type].domain = cell + xs_library[cell.id][rxn_type].domain_type = 'cell' + + # Tally cross sections by nuclide + xs_library[cell.id][rxn_type].by_nuclide = True + + # Add OpenMC tallies to the tallies file for XML generation + for tally in xs_library[cell.id][rxn_type].tallies.values(): + tallies_file.add_tally(tally, merge=True) + + # Export to "tallies.xml" + tallies_file.export_to_xml() + +Now we a have a complete set of inputs, so we can go ahead and run our +simulation. + +.. code:: python + + # Run OpenMC + executor = openmc.Executor() + executor.run_simulation(output=True, mpi_procs=3) + + +.. parsed-literal:: + + + .d88888b. 888b d888 .d8888b. + d88P" "Y88b 8888b d8888 d88P Y88b + 888 888 88888b.d88888 888 888 + 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 + 888 888 888 "88b d8P Y8b 888 "88b 888 Y888P 888 888 + 888 888 888 888 88888888 888 888 888 Y8P 888 888 888 + Y88b. .d88P 888 d88P Y8b. 888 888 888 " 888 Y88b d88P + "Y88888P" 88888P" "Y8888 888 888 888 888 "Y8888P" + __________________888______________________________________________________ + 888 + 888 + + Copyright: 2011-2015 Massachusetts Institute of Technology + License: http://mit-crpg.github.io/openmc/license.html + Version: 0.7.0 + Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca + Date/Time: 2015-12-02 09:13:42 + MPI Processes: 3 + + =========================================================================== + ========================> INITIALIZATION <========================= + =========================================================================== + + Reading settings XML file... + Reading cross sections XML file... + Reading geometry XML file... + Reading materials XML file... + Reading tallies XML file... + Building neighboring cells lists for each surface... + Loading ACE cross section table: 92235.71c + Loading ACE cross section table: 92238.71c + Loading ACE cross section table: 8016.71c + Loading ACE cross section table: 1001.71c + Loading ACE cross section table: 40090.71c + Maximum neutron transport energy: 20.0000 MeV for 92235.71c + Initializing source particles... + + =========================================================================== + ====================> K EIGENVALUE SIMULATION <==================== + =========================================================================== + + Bat./Gen. k Average k + ========= ======== ==================== + 1/1 1.22593 + 2/1 1.24245 + 3/1 1.24545 + 4/1 1.21868 + 5/1 1.22429 + 6/1 1.22607 + 7/1 1.21456 + 8/1 1.23816 + 9/1 1.25060 + 10/1 1.22806 + 11/1 1.19821 + 12/1 1.19897 1.19859 +/- 0.00038 + 13/1 1.22119 1.20612 +/- 0.00754 + 14/1 1.20701 1.20634 +/- 0.00533 + 15/1 1.24784 1.21464 +/- 0.00927 + 16/1 1.22413 1.21622 +/- 0.00773 + 17/1 1.25050 1.22112 +/- 0.00817 + 18/1 1.22006 1.22099 +/- 0.00707 + 19/1 1.22813 1.22178 +/- 0.00629 + 20/1 1.22791 1.22239 +/- 0.00566 + 21/1 1.22729 1.22284 +/- 0.00514 + 22/1 1.19867 1.22083 +/- 0.00510 + 23/1 1.23796 1.22214 +/- 0.00488 + 24/1 1.22412 1.22228 +/- 0.00452 + 25/1 1.22638 1.22256 +/- 0.00421 + 26/1 1.22181 1.22251 +/- 0.00394 + 27/1 1.19055 1.22063 +/- 0.00415 + 28/1 1.20683 1.21986 +/- 0.00399 + 29/1 1.21689 1.21971 +/- 0.00378 + 30/1 1.23670 1.22056 +/- 0.00368 + 31/1 1.21396 1.22024 +/- 0.00352 + 32/1 1.21389 1.21995 +/- 0.00337 + 33/1 1.24649 1.22111 +/- 0.00342 + 34/1 1.23204 1.22156 +/- 0.00330 + 35/1 1.20768 1.22101 +/- 0.00322 + 36/1 1.22271 1.22107 +/- 0.00309 + 37/1 1.21796 1.22096 +/- 0.00298 + 38/1 1.23842 1.22158 +/- 0.00293 + 39/1 1.23080 1.22190 +/- 0.00285 + 40/1 1.23572 1.22236 +/- 0.00279 + 41/1 1.21691 1.22218 +/- 0.00271 + 42/1 1.24616 1.22293 +/- 0.00272 + 43/1 1.21903 1.22282 +/- 0.00264 + 44/1 1.22967 1.22302 +/- 0.00257 + 45/1 1.22053 1.22295 +/- 0.00250 + 46/1 1.24087 1.22344 +/- 0.00248 + 47/1 1.20251 1.22288 +/- 0.00248 + 48/1 1.20331 1.22236 +/- 0.00246 + 49/1 1.22724 1.22249 +/- 0.00240 + 50/1 1.24798 1.22313 +/- 0.00243 + Triggers unsatisfied, max unc./thresh. is 1.32110 for scatter-p1 in tally 10054 + The estimated number of batches is 80 + Creating state point statepoint.050.h5... + 51/1 1.22253 1.22311 +/- 0.00237 + 52/1 1.24330 1.22359 +/- 0.00236 + 53/1 1.23251 1.22380 +/- 0.00231 + 54/1 1.21133 1.22352 +/- 0.00228 + 55/1 1.24503 1.22399 +/- 0.00228 + 56/1 1.22013 1.22391 +/- 0.00223 + 57/1 1.23877 1.22423 +/- 0.00220 + 58/1 1.23793 1.22451 +/- 0.00218 + 59/1 1.21018 1.22422 +/- 0.00215 + 60/1 1.22417 1.22422 +/- 0.00211 + 61/1 1.23094 1.22435 +/- 0.00207 + 62/1 1.23310 1.22452 +/- 0.00204 + 63/1 1.22488 1.22453 +/- 0.00200 + 64/1 1.22702 1.22457 +/- 0.00196 + 65/1 1.18834 1.22391 +/- 0.00204 + 66/1 1.23112 1.22404 +/- 0.00200 + 67/1 1.21611 1.22390 +/- 0.00197 + 68/1 1.22513 1.22392 +/- 0.00194 + 69/1 1.21741 1.22381 +/- 0.00191 + 70/1 1.22484 1.22383 +/- 0.00188 + 71/1 1.19662 1.22338 +/- 0.00190 + 72/1 1.23315 1.22354 +/- 0.00187 + 73/1 1.22796 1.22361 +/- 0.00185 + 74/1 1.21417 1.22346 +/- 0.00182 + 75/1 1.21020 1.22326 +/- 0.00181 + 76/1 1.23413 1.22343 +/- 0.00179 + 77/1 1.22184 1.22340 +/- 0.00176 + 78/1 1.20309 1.22310 +/- 0.00176 + 79/1 1.23458 1.22327 +/- 0.00174 + 80/1 1.20724 1.22304 +/- 0.00173 + Triggers satisfied for batch 80 + Creating state point statepoint.080.h5... + + =========================================================================== + ======================> SIMULATION FINISHED <====================== + =========================================================================== + + + =======================> TIMING STATISTICS <======================= + + Total time for initialization = 7.5700E-01 seconds + Reading cross sections = 1.5800E-01 seconds + Total time in simulation = 1.4921E+02 seconds + Time in transport only = 1.4336E+02 seconds + Time in inactive batches = 8.6210E+00 seconds + Time in active batches = 1.4059E+02 seconds + Time synchronizing fission bank = 5.6060E+00 seconds + Sampling source sites = 1.4000E-02 seconds + SEND/RECV source sites = 4.0000E-03 seconds + Time accumulating tallies = 6.0000E-03 seconds + Total time for finalization = 1.3000E-02 seconds + Total time elapsed = 1.5002E+02 seconds + Calculation Rate (inactive) = 11599.6 neutrons/second + Calculation Rate (active) = 2845.11 neutrons/second + + ============================> RESULTS <============================ + + k-effective (Collision) = 1.22327 +/- 0.00148 + k-effective (Track-length) = 1.22304 +/- 0.00173 + k-effective (Absorption) = 1.22407 +/- 0.00129 + Combined k-effective = 1.22373 +/- 0.00113 + Leakage Fraction = 0.00000 +/- 0.00000 + + + + + +.. parsed-literal:: + + 0 + + + +Tally Data Processing +--------------------- + +Our simulation ran successfully and created statepoint and summary +output files. We begin our analysis by instantiating a ``StatePoint`` +object. + +.. code:: python + + # Load the last statepoint file + sp = openmc.StatePoint('statepoint.080.h5') + +In addition to the statepoint file, our simulation also created a +summary file which encapsulates information about the materials and +geometry. This is necessary for the ``openmc.mgxs`` module to properly +process the tally data. We first create a ``Summary`` object and link it +with the statepoint. + +.. code:: python + + # Load the summary file and link it with the statepoint + su = openmc.Summary('summary.h5') + sp.link_with_summary(su) + +The statepoint is now ready to be analyzed by our multi-group cross +sections. We simply have to load the tallies from the ``StatePoint`` +into each object as follows and our ``MGXS`` objects will compute the +cross sections for us under-the-hood. + +.. code:: python + + # Iterate over all cells and cross section types + for cell in openmc_cells: + for rxn_type in xs_library[cell.id]: + xs_library[cell.id][rxn_type].load_from_statepoint(sp) + +That's it! Our multi-group cross sections are now ready for the big +spotlight. This time we have cross sections in three distinct spatial +zones - fuel, clad and moderator - on a per-nuclide basis. + +Extracting and Storing MGXS Data +-------------------------------- + +Let's first inspect one of our cross sections by printing it to the +screen as a microscopic cross section in units of barns. + +.. code:: python + + nufission = xs_library[fuel_cell.id]['nu-fission'] + nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238']) + + +.. parsed-literal:: + + Multi-Group XS + Reaction Type = nu-fission + Domain Type = cell + Domain ID = 10000 + Nuclide = U-235 + Cross Sections [barns]: + Group 1 [0.821 - 20.0 MeV]: 3.31e+00 +/- 1.88e-01% + Group 2 [0.00553 - 0.821 MeV]: 3.97e+00 +/- 1.24e-01% + Group 3 [4e-06 - 0.00553 MeV]: 5.50e+01 +/- 2.02e-01% + Group 4 [6.25e-07 - 4e-06 MeV]: 8.83e+01 +/- 3.56e-01% + Group 5 [2.8e-07 - 6.25e-07 MeV]: 2.90e+02 +/- 4.54e-01% + Group 6 [1.4e-07 - 2.8e-07 MeV]: 4.49e+02 +/- 4.10e-01% + Group 7 [5.8e-08 - 1.4e-07 MeV]: 6.87e+02 +/- 2.56e-01% + Group 8 [0.0 - 5.8e-08 MeV]: 1.44e+03 +/- 2.82e-01% + + Nuclide = U-238 + Cross Sections [barns]: + Group 1 [0.821 - 20.0 MeV]: 1.06e+00 +/- 2.30e-01% + Group 2 [0.00553 - 0.821 MeV]: 1.21e-03 +/- 2.25e-01% + Group 3 [4e-06 - 0.00553 MeV]: 5.82e-04 +/- 3.09e+00% + Group 4 [6.25e-07 - 4e-06 MeV]: 6.54e-06 +/- 3.27e-01% + Group 5 [2.8e-07 - 6.25e-07 MeV]: 1.07e-05 +/- 4.39e-01% + Group 6 [1.4e-07 - 2.8e-07 MeV]: 1.55e-05 +/- 4.12e-01% + Group 7 [5.8e-08 - 1.4e-07 MeV]: 2.30e-05 +/- 2.57e-01% + Group 8 [0.0 - 5.8e-08 MeV]: 4.24e-05 +/- 2.81e-01% + + + + + +Our multi-group cross sections are capable of summing across all +nuclides to provide us with macroscopic cross sections as well. + +.. code:: python + + nufission = xs_library[fuel_cell.id]['nu-fission'] + nufission.print_xs(xs_type='macro', nuclides='sum') + + +.. parsed-literal:: + + Multi-Group XS + Reaction Type = nu-fission + Domain Type = cell + Domain ID = 10000 + Cross Sections [cm^-1]: + Group 1 [0.821 - 20.0 MeV]: 2.52e-02 +/- 2.19e-01% + Group 2 [0.00553 - 0.821 MeV]: 1.51e-03 +/- 1.22e-01% + Group 3 [4e-06 - 0.00553 MeV]: 2.06e-02 +/- 2.02e-01% + Group 4 [6.25e-07 - 4e-06 MeV]: 3.31e-02 +/- 3.56e-01% + Group 5 [2.8e-07 - 6.25e-07 MeV]: 1.09e-01 +/- 4.54e-01% + Group 6 [1.4e-07 - 2.8e-07 MeV]: 1.69e-01 +/- 4.10e-01% + Group 7 [5.8e-08 - 1.4e-07 MeV]: 2.58e-01 +/- 2.56e-01% + Group 8 [0.0 - 5.8e-08 MeV]: 5.40e-01 +/- 2.82e-01% + + + + + +Although a printed report is nice, it is not scalable or flexible. Let's +extract the microscopic cross section data for the moderator as a +`Pandas `__ ``DataFrame`` . + +.. code:: python + + nuscatter = xs_library[moderator_cell.id]['nu-scatter'] + df = nuscatter.get_pandas_dataframe(xs_type='micro') + df.head(10) + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellgroup ingroup outnuclidemeanstd. dev.
1261000211H-10.2340220.003645
1271000211O-161.5603050.006280
1241000212H-11.5880250.002815
1251000212O-160.2851470.001392
1221000213H-10.0107760.000186
1231000213O-160.0000000.000000
1201000214H-10.0000230.000010
1211000214O-160.0000000.000000
1181000215H-10.0000000.000000
1191000215O-160.0000000.000000
+
+ + + +Next, we illustate how one can easily take multi-group cross sections +and condense them down to a coarser energy group structure. The ``MGXS`` +class includes a ``get_condensed_xs(...)`` method which takes an +``EnergyGroups`` parameter with a coarse(r) group structure and returns +a new ``MGXS`` condensed to the coarse groups. We illustrate this +process below using the 2-group structure created earlier. + +.. code:: python + + # Extract the 16-group transport cross section for the fuel + fine_xs = xs_library[fuel_cell.id]['transport'] + + # Condense to the 2-group structure + condensed_xs = fine_xs.get_condensed_xs(coarse_groups) + +Group condensation is as simple as that! We now have a new coarse +2-group ``TransportXS`` in addition to our original 16-group +``TransportXS``. Let's inspect the 2-group ``TransportXS`` by printing +it to the screen and extracting a Pandas ``DataFrame`` as we have +already learned how to do. + +.. code:: python + + condensed_xs.print_xs() + + +.. parsed-literal:: + + Multi-Group XS + Reaction Type = transport + Domain Type = cell + Domain ID = 10000 + Nuclide = U-235 + Cross Sections [cm^-1]: + Group 1 [6.25e-07 - 20.0 MeV]: 7.81e-03 +/- 4.75e-01% + Group 2 [0.0 - 6.25e-07 MeV]: 1.82e-01 +/- 1.89e-01% + + Nuclide = U-238 + Cross Sections [cm^-1]: + Group 1 [6.25e-07 - 20.0 MeV]: 2.17e-01 +/- 1.31e-01% + Group 2 [0.0 - 6.25e-07 MeV]: 2.53e-01 +/- 2.08e-01% + + Nuclide = O-16 + Cross Sections [cm^-1]: + Group 1 [6.25e-07 - 20.0 MeV]: 1.45e-01 +/- 1.50e-01% + Group 2 [0.0 - 6.25e-07 MeV]: 1.74e-01 +/- 2.66e-01% + + + + + +.. code:: python + + df = condensed_xs.get_pandas_dataframe(xs_type='micro') + df + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellgroup innuclidemeanstd. dev.
3100001U-23520.8281270.098842
4100001U-2389.5822950.012550
5100001O-163.1573580.004725
0100002U-235485.2176490.916465
1100002U-23811.1760810.023196
2100002O-163.7881670.010090
+
+ + + +Verification with OpenMOC +------------------------- + +Now, let's verify our cross sections using OpenMOC. First, we use OpenCG +construct an equivalent OpenMOC geometry. + +.. code:: python + + # Create an OpenMOC Geometry from the OpenCG Geometry + openmoc_geometry = get_openmoc_geometry(su.opencg_geometry) + +Next, we we can inject the multi-group cross sections into the +equivalent fuel pin cell OpenMOC geometry. + +.. code:: python + + # Get all OpenMOC cells in the gometry + openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells() + + # Inject multi-group cross sections into OpenMOC Materials + for cell_id, cell in openmoc_cells.items(): + + # Ignore the root cell + if cell.getName() == 'root cell': + continue + + # Get a reference to the Material filling this Cell + openmoc_material = cell.getFillMaterial() + + # Set the number of energy groups for the Material + openmoc_material.setNumEnergyGroups(fine_groups.num_groups) + + # Extract the appropriate cross section objects for this cell + transport = xs_library[cell_id]['transport'] + nufission = xs_library[cell_id]['nu-fission'] + nuscatter = xs_library[cell_id]['nu-scatter'] + chi = xs_library[cell_id]['chi'] + + # Inject NumPy arrays of cross section data into the Material + # NOTE: Sum across nuclides to get macro cross sections needed by OpenMOC + openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten()) + openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten()) + openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten()) + openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten()) + +We are now ready to run OpenMOC to verify our cross-sections from +OpenMC. + +.. code:: python + + # Generate tracks for OpenMOC + openmoc_geometry.initializeFlatSourceRegions() + track_generator = openmoc.TrackGenerator(openmoc_geometry, num_azim=128, spacing=0.1) + track_generator.generateTracks() + + # Run OpenMOC + solver = openmoc.CPUSolver(track_generator) + solver.computeEigenvalue() + + +.. parsed-literal:: + + [ NORMAL ] Importing ray tracing data from file... + [ NORMAL ] Computing the eigenvalue... + [ NORMAL ] Iteration 0: k_eff = 0.574633 res = 1.959E-316 + [ NORMAL ] Iteration 1: k_eff = 0.679931 res = 4.254E-01 + [ NORMAL ] Iteration 2: k_eff = 0.660910 res = 1.832E-01 + [ NORMAL ] Iteration 3: k_eff = 0.658975 res = 2.797E-02 + [ NORMAL ] Iteration 4: k_eff = 0.642976 res = 2.928E-03 + [ NORMAL ] Iteration 5: k_eff = 0.625710 res = 2.428E-02 + [ NORMAL ] Iteration 6: k_eff = 0.606520 res = 2.685E-02 + [ NORMAL ] Iteration 7: k_eff = 0.587277 res = 3.067E-02 + [ NORMAL ] Iteration 8: k_eff = 0.568777 res = 3.173E-02 + [ NORMAL ] Iteration 9: k_eff = 0.551415 res = 3.150E-02 + [ NORMAL ] Iteration 10: k_eff = 0.535708 res = 3.052E-02 + [ NORMAL ] Iteration 11: k_eff = 0.521916 res = 2.849E-02 + [ NORMAL ] Iteration 12: k_eff = 0.510221 res = 2.575E-02 + [ NORMAL ] Iteration 13: k_eff = 0.500691 res = 2.241E-02 + [ NORMAL ] Iteration 14: k_eff = 0.493392 res = 1.868E-02 + [ NORMAL ] Iteration 15: k_eff = 0.488317 res = 1.458E-02 + [ NORMAL ] Iteration 16: k_eff = 0.485438 res = 1.028E-02 + [ NORMAL ] Iteration 17: k_eff = 0.484705 res = 5.896E-03 + [ NORMAL ] Iteration 18: k_eff = 0.486045 res = 1.510E-03 + [ NORMAL ] Iteration 19: k_eff = 0.489362 res = 2.766E-03 + [ NORMAL ] Iteration 20: k_eff = 0.494546 res = 6.824E-03 + [ NORMAL ] Iteration 21: k_eff = 0.501481 res = 1.059E-02 + [ NORMAL ] Iteration 22: k_eff = 0.510041 res = 1.402E-02 + [ NORMAL ] Iteration 23: k_eff = 0.520094 res = 1.707E-02 + [ NORMAL ] Iteration 24: k_eff = 0.531507 res = 1.971E-02 + [ NORMAL ] Iteration 25: k_eff = 0.544144 res = 2.194E-02 + [ NORMAL ] Iteration 26: k_eff = 0.557872 res = 2.378E-02 + [ NORMAL ] Iteration 27: k_eff = 0.572557 res = 2.523E-02 + [ NORMAL ] Iteration 28: k_eff = 0.588072 res = 2.632E-02 + [ NORMAL ] Iteration 29: k_eff = 0.604293 res = 2.710E-02 + [ NORMAL ] Iteration 30: k_eff = 0.621101 res = 2.758E-02 + [ NORMAL ] Iteration 31: k_eff = 0.638382 res = 2.781E-02 + [ NORMAL ] Iteration 32: k_eff = 0.656032 res = 2.782E-02 + [ NORMAL ] Iteration 33: k_eff = 0.673950 res = 2.765E-02 + [ NORMAL ] Iteration 34: k_eff = 0.692043 res = 2.731E-02 + [ NORMAL ] Iteration 35: k_eff = 0.710227 res = 2.685E-02 + [ NORMAL ] Iteration 36: k_eff = 0.728423 res = 2.628E-02 + [ NORMAL ] Iteration 37: k_eff = 0.746558 res = 2.562E-02 + [ NORMAL ] Iteration 38: k_eff = 0.764569 res = 2.490E-02 + [ NORMAL ] Iteration 39: k_eff = 0.782396 res = 2.412E-02 + [ NORMAL ] Iteration 40: k_eff = 0.799989 res = 2.332E-02 + [ NORMAL ] Iteration 41: k_eff = 0.817301 res = 2.249E-02 + [ NORMAL ] Iteration 42: k_eff = 0.834292 res = 2.164E-02 + [ NORMAL ] Iteration 43: k_eff = 0.850927 res = 2.079E-02 + [ NORMAL ] Iteration 44: k_eff = 0.867177 res = 1.994E-02 + [ NORMAL ] Iteration 45: k_eff = 0.883017 res = 1.910E-02 + [ NORMAL ] Iteration 46: k_eff = 0.898427 res = 1.827E-02 + [ NORMAL ] Iteration 47: k_eff = 0.913389 res = 1.745E-02 + [ NORMAL ] Iteration 48: k_eff = 0.927891 res = 1.665E-02 + [ NORMAL ] Iteration 49: k_eff = 0.941925 res = 1.588E-02 + [ NORMAL ] Iteration 50: k_eff = 0.955483 res = 1.512E-02 + [ NORMAL ] Iteration 51: k_eff = 0.968562 res = 1.439E-02 + [ NORMAL ] Iteration 52: k_eff = 0.981161 res = 1.369E-02 + [ NORMAL ] Iteration 53: k_eff = 0.993282 res = 1.301E-02 + [ NORMAL ] Iteration 54: k_eff = 1.004928 res = 1.235E-02 + [ NORMAL ] Iteration 55: k_eff = 1.016104 res = 1.172E-02 + [ NORMAL ] Iteration 56: k_eff = 1.026816 res = 1.112E-02 + [ NORMAL ] Iteration 57: k_eff = 1.037073 res = 1.054E-02 + [ NORMAL ] Iteration 58: k_eff = 1.046883 res = 9.989E-03 + [ NORMAL ] Iteration 59: k_eff = 1.056257 res = 9.460E-03 + [ NORMAL ] Iteration 60: k_eff = 1.065205 res = 8.954E-03 + [ NORMAL ] Iteration 61: k_eff = 1.073739 res = 8.472E-03 + [ NORMAL ] Iteration 62: k_eff = 1.081871 res = 8.012E-03 + [ NORMAL ] Iteration 63: k_eff = 1.089613 res = 7.573E-03 + [ NORMAL ] Iteration 64: k_eff = 1.096979 res = 7.156E-03 + [ NORMAL ] Iteration 65: k_eff = 1.103980 res = 6.760E-03 + [ NORMAL ] Iteration 66: k_eff = 1.110631 res = 6.382E-03 + [ NORMAL ] Iteration 67: k_eff = 1.116943 res = 6.024E-03 + [ NORMAL ] Iteration 68: k_eff = 1.122931 res = 5.684E-03 + [ NORMAL ] Iteration 69: k_eff = 1.128607 res = 5.361E-03 + [ NORMAL ] Iteration 70: k_eff = 1.133984 res = 5.055E-03 + [ NORMAL ] Iteration 71: k_eff = 1.139075 res = 4.764E-03 + [ NORMAL ] Iteration 72: k_eff = 1.143892 res = 4.489E-03 + [ NORMAL ] Iteration 73: k_eff = 1.148447 res = 4.229E-03 + [ NORMAL ] Iteration 74: k_eff = 1.152752 res = 3.982E-03 + [ NORMAL ] Iteration 75: k_eff = 1.156819 res = 3.749E-03 + [ NORMAL ] Iteration 76: k_eff = 1.160659 res = 3.528E-03 + [ NORMAL ] Iteration 77: k_eff = 1.164282 res = 3.319E-03 + [ NORMAL ] Iteration 78: k_eff = 1.167701 res = 3.122E-03 + [ NORMAL ] Iteration 79: k_eff = 1.170923 res = 2.936E-03 + [ NORMAL ] Iteration 80: k_eff = 1.173961 res = 2.760E-03 + [ NORMAL ] Iteration 81: k_eff = 1.176822 res = 2.594E-03 + [ NORMAL ] Iteration 82: k_eff = 1.179516 res = 2.437E-03 + [ NORMAL ] Iteration 83: k_eff = 1.182052 res = 2.289E-03 + [ NORMAL ] Iteration 84: k_eff = 1.184438 res = 2.150E-03 + [ NORMAL ] Iteration 85: k_eff = 1.186682 res = 2.019E-03 + [ NORMAL ] Iteration 86: k_eff = 1.188792 res = 1.895E-03 + [ NORMAL ] Iteration 87: k_eff = 1.190775 res = 1.778E-03 + [ NORMAL ] Iteration 88: k_eff = 1.192639 res = 1.668E-03 + [ NORMAL ] Iteration 89: k_eff = 1.194389 res = 1.565E-03 + [ NORMAL ] Iteration 90: k_eff = 1.196032 res = 1.468E-03 + [ NORMAL ] Iteration 91: k_eff = 1.197575 res = 1.376E-03 + [ NORMAL ] Iteration 92: k_eff = 1.199023 res = 1.290E-03 + [ NORMAL ] Iteration 93: k_eff = 1.200381 res = 1.209E-03 + [ NORMAL ] Iteration 94: k_eff = 1.201654 res = 1.133E-03 + [ NORMAL ] Iteration 95: k_eff = 1.202849 res = 1.061E-03 + [ NORMAL ] Iteration 96: k_eff = 1.203968 res = 9.939E-04 + [ NORMAL ] Iteration 97: k_eff = 1.205017 res = 9.307E-04 + [ NORMAL ] Iteration 98: k_eff = 1.206000 res = 8.714E-04 + [ NORMAL ] Iteration 99: k_eff = 1.206921 res = 8.157E-04 + [ NORMAL ] Iteration 100: k_eff = 1.207783 res = 7.634E-04 + [ NORMAL ] Iteration 101: k_eff = 1.208590 res = 7.144E-04 + [ NORMAL ] Iteration 102: k_eff = 1.209346 res = 6.684E-04 + [ NORMAL ] Iteration 103: k_eff = 1.210053 res = 6.252E-04 + [ NORMAL ] Iteration 104: k_eff = 1.210715 res = 5.848E-04 + [ NORMAL ] Iteration 105: k_eff = 1.211334 res = 5.468E-04 + [ NORMAL ] Iteration 106: k_eff = 1.211913 res = 5.113E-04 + [ NORMAL ] Iteration 107: k_eff = 1.212454 res = 4.779E-04 + [ NORMAL ] Iteration 108: k_eff = 1.212960 res = 4.467E-04 + [ NORMAL ] Iteration 109: k_eff = 1.213434 res = 4.175E-04 + [ NORMAL ] Iteration 110: k_eff = 1.213876 res = 3.901E-04 + [ NORMAL ] Iteration 111: k_eff = 1.214289 res = 3.644E-04 + [ NORMAL ] Iteration 112: k_eff = 1.214675 res = 3.404E-04 + [ NORMAL ] Iteration 113: k_eff = 1.215036 res = 3.180E-04 + [ NORMAL ] Iteration 114: k_eff = 1.215373 res = 2.969E-04 + [ NORMAL ] Iteration 115: k_eff = 1.215687 res = 2.773E-04 + [ NORMAL ] Iteration 116: k_eff = 1.215981 res = 2.589E-04 + [ NORMAL ] Iteration 117: k_eff = 1.216255 res = 2.416E-04 + [ NORMAL ] Iteration 118: k_eff = 1.216511 res = 2.256E-04 + [ NORMAL ] Iteration 119: k_eff = 1.216750 res = 2.105E-04 + [ NORMAL ] Iteration 120: k_eff = 1.216973 res = 1.964E-04 + [ NORMAL ] Iteration 121: k_eff = 1.217181 res = 1.833E-04 + [ NORMAL ] Iteration 122: k_eff = 1.217376 res = 1.710E-04 + [ NORMAL ] Iteration 123: k_eff = 1.217557 res = 1.595E-04 + [ NORMAL ] Iteration 124: k_eff = 1.217726 res = 1.488E-04 + [ NORMAL ] Iteration 125: k_eff = 1.217883 res = 1.388E-04 + [ NORMAL ] Iteration 126: k_eff = 1.218030 res = 1.294E-04 + [ NORMAL ] Iteration 127: k_eff = 1.218167 res = 1.207E-04 + [ NORMAL ] Iteration 128: k_eff = 1.218295 res = 1.125E-04 + [ NORMAL ] Iteration 129: k_eff = 1.218414 res = 1.049E-04 + [ NORMAL ] Iteration 130: k_eff = 1.218525 res = 9.777E-05 + [ NORMAL ] Iteration 131: k_eff = 1.218629 res = 9.113E-05 + [ NORMAL ] Iteration 132: k_eff = 1.218725 res = 8.494E-05 + [ NORMAL ] Iteration 133: k_eff = 1.218815 res = 7.916E-05 + [ NORMAL ] Iteration 134: k_eff = 1.218899 res = 7.376E-05 + [ NORMAL ] Iteration 135: k_eff = 1.218977 res = 6.873E-05 + [ NORMAL ] Iteration 136: k_eff = 1.219050 res = 6.404E-05 + [ NORMAL ] Iteration 137: k_eff = 1.219117 res = 5.966E-05 + [ NORMAL ] Iteration 138: k_eff = 1.219180 res = 5.557E-05 + [ NORMAL ] Iteration 139: k_eff = 1.219239 res = 5.177E-05 + [ NORMAL ] Iteration 140: k_eff = 1.219294 res = 4.822E-05 + [ NORMAL ] Iteration 141: k_eff = 1.219345 res = 4.491E-05 + [ NORMAL ] Iteration 142: k_eff = 1.219392 res = 4.182E-05 + [ NORMAL ] Iteration 143: k_eff = 1.219437 res = 3.894E-05 + [ NORMAL ] Iteration 144: k_eff = 1.219478 res = 3.626E-05 + [ NORMAL ] Iteration 145: k_eff = 1.219516 res = 3.376E-05 + [ NORMAL ] Iteration 146: k_eff = 1.219552 res = 3.144E-05 + [ NORMAL ] Iteration 147: k_eff = 1.219585 res = 2.927E-05 + [ NORMAL ] Iteration 148: k_eff = 1.219616 res = 2.724E-05 + [ NORMAL ] Iteration 149: k_eff = 1.219645 res = 2.536E-05 + [ NORMAL ] Iteration 150: k_eff = 1.219672 res = 2.361E-05 + [ NORMAL ] Iteration 151: k_eff = 1.219696 res = 2.197E-05 + [ NORMAL ] Iteration 152: k_eff = 1.219720 res = 2.045E-05 + [ NORMAL ] Iteration 153: k_eff = 1.219741 res = 1.903E-05 + [ NORMAL ] Iteration 154: k_eff = 1.219761 res = 1.771E-05 + [ NORMAL ] Iteration 155: k_eff = 1.219780 res = 1.648E-05 + [ NORMAL ] Iteration 156: k_eff = 1.219797 res = 1.534E-05 + [ NORMAL ] Iteration 157: k_eff = 1.219814 res = 1.427E-05 + [ NORMAL ] Iteration 158: k_eff = 1.219829 res = 1.328E-05 + [ NORMAL ] Iteration 159: k_eff = 1.219843 res = 1.235E-05 + [ NORMAL ] Iteration 160: k_eff = 1.219856 res = 1.149E-05 + [ NORMAL ] Iteration 161: k_eff = 1.219868 res = 1.069E-05 + + +We report the eigenvalues computed by OpenMC and OpenMOC here together +to summarize our results. + +.. code:: python + + # Print report of keff and bias with OpenMC + openmoc_keff = solver.getKeff() + openmc_keff = sp.k_combined[0] + bias = (openmoc_keff - openmc_keff) * 1e5 + + print('openmc keff = {0:1.6f}'.format(openmc_keff)) + print('openmoc keff = {0:1.6f}'.format(openmoc_keff)) + print('bias [pcm]: {0:1.1f}'.format(bias)) + + +.. parsed-literal:: + + openmc keff = 1.223729 + openmoc keff = 1.219868 + bias [pcm]: -386.1 + + +As a sanity check, let's run a simulation with the coarse 2-group cross +sections to ensure that they also produce a reasonable result. + +.. code:: python + + openmoc_geometry = get_openmoc_geometry(su.opencg_geometry) + openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells() + + # Inject multi-group cross sections into OpenMOC Materials + for cell_id, cell in openmoc_cells.items(): + + # Ignore the root cell + if cell.getName() == 'root cell': + continue + + openmoc_material = cell.getFillMaterial() + openmoc_material.setNumEnergyGroups(coarse_groups.num_groups) + + # Extract the appropriate cross section objects for this cell + transport = xs_library[cell_id]['transport'] + nufission = xs_library[cell_id]['nu-fission'] + nuscatter = xs_library[cell_id]['nu-scatter'] + chi = xs_library[cell_id]['chi'] + + # Perform group condensation + transport = transport.get_condensed_xs(coarse_groups) + nufission = nufission.get_condensed_xs(coarse_groups) + nuscatter = nuscatter.get_condensed_xs(coarse_groups) + chi = chi.get_condensed_xs(coarse_groups) + + # Inject NumPy arrays of cross section data into the Material + openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten()) + openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten()) + openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten()) + openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten()) + +.. code:: python + + # Generate tracks for OpenMOC + openmoc_geometry.initializeFlatSourceRegions() + track_generator = openmoc.TrackGenerator(openmoc_geometry, num_azim=128, spacing=0.1) + track_generator.generateTracks() + + # Run OpenMOC + solver = openmoc.CPUSolver(track_generator) + solver.computeEigenvalue() + + +.. parsed-literal:: + + [ NORMAL ] Importing ray tracing data from file... + [ NORMAL ] Computing the eigenvalue... + [ NORMAL ] Iteration 0: k_eff = 0.495594 res = 1.959E-316 + [ NORMAL ] Iteration 1: k_eff = 0.557312 res = 5.044E-01 + [ NORMAL ] Iteration 2: k_eff = 0.518115 res = 1.245E-01 + [ NORMAL ] Iteration 3: k_eff = 0.509016 res = 7.033E-02 + [ NORMAL ] Iteration 4: k_eff = 0.496279 res = 1.756E-02 + [ NORMAL ] Iteration 5: k_eff = 0.488357 res = 2.502E-02 + [ NORMAL ] Iteration 6: k_eff = 0.482659 res = 1.596E-02 + [ NORMAL ] Iteration 7: k_eff = 0.479523 res = 1.167E-02 + [ NORMAL ] Iteration 8: k_eff = 0.478568 res = 6.497E-03 + [ NORMAL ] Iteration 9: k_eff = 0.479590 res = 1.991E-03 + [ NORMAL ] Iteration 10: k_eff = 0.482388 res = 2.136E-03 + [ NORMAL ] Iteration 11: k_eff = 0.486774 res = 5.834E-03 + [ NORMAL ] Iteration 12: k_eff = 0.492575 res = 9.091E-03 + [ NORMAL ] Iteration 13: k_eff = 0.499632 res = 1.192E-02 + [ NORMAL ] Iteration 14: k_eff = 0.507799 res = 1.433E-02 + [ NORMAL ] Iteration 15: k_eff = 0.516943 res = 1.635E-02 + [ NORMAL ] Iteration 16: k_eff = 0.526942 res = 1.801E-02 + [ NORMAL ] Iteration 17: k_eff = 0.537681 res = 1.934E-02 + [ NORMAL ] Iteration 18: k_eff = 0.549060 res = 2.038E-02 + [ NORMAL ] Iteration 19: k_eff = 0.560984 res = 2.116E-02 + [ NORMAL ] Iteration 20: k_eff = 0.573368 res = 2.172E-02 + [ NORMAL ] Iteration 21: k_eff = 0.586133 res = 2.207E-02 + [ NORMAL ] Iteration 22: k_eff = 0.599207 res = 2.226E-02 + [ NORMAL ] Iteration 23: k_eff = 0.612528 res = 2.231E-02 + [ NORMAL ] Iteration 24: k_eff = 0.626035 res = 2.223E-02 + [ NORMAL ] Iteration 25: k_eff = 0.639676 res = 2.205E-02 + [ NORMAL ] Iteration 26: k_eff = 0.653402 res = 2.179E-02 + [ NORMAL ] Iteration 27: k_eff = 0.667170 res = 2.146E-02 + [ NORMAL ] Iteration 28: k_eff = 0.680942 res = 2.107E-02 + [ NORMAL ] Iteration 29: k_eff = 0.694681 res = 2.064E-02 + [ NORMAL ] Iteration 30: k_eff = 0.708356 res = 2.018E-02 + [ NORMAL ] Iteration 31: k_eff = 0.721940 res = 1.969E-02 + [ NORMAL ] Iteration 32: k_eff = 0.735406 res = 1.918E-02 + [ NORMAL ] Iteration 33: k_eff = 0.748734 res = 1.865E-02 + [ NORMAL ] Iteration 34: k_eff = 0.761904 res = 1.812E-02 + [ NORMAL ] Iteration 35: k_eff = 0.774897 res = 1.759E-02 + [ NORMAL ] Iteration 36: k_eff = 0.787700 res = 1.705E-02 + [ NORMAL ] Iteration 37: k_eff = 0.800299 res = 1.652E-02 + [ NORMAL ] Iteration 38: k_eff = 0.812684 res = 1.600E-02 + [ NORMAL ] Iteration 39: k_eff = 0.824844 res = 1.547E-02 + [ NORMAL ] Iteration 40: k_eff = 0.836772 res = 1.496E-02 + [ NORMAL ] Iteration 41: k_eff = 0.848462 res = 1.446E-02 + [ NORMAL ] Iteration 42: k_eff = 0.859908 res = 1.397E-02 + [ NORMAL ] Iteration 43: k_eff = 0.871105 res = 1.349E-02 + [ NORMAL ] Iteration 44: k_eff = 0.882052 res = 1.302E-02 + [ NORMAL ] Iteration 45: k_eff = 0.892745 res = 1.257E-02 + [ NORMAL ] Iteration 46: k_eff = 0.903184 res = 1.212E-02 + [ NORMAL ] Iteration 47: k_eff = 0.913367 res = 1.169E-02 + [ NORMAL ] Iteration 48: k_eff = 0.923297 res = 1.128E-02 + [ NORMAL ] Iteration 49: k_eff = 0.932972 res = 1.087E-02 + [ NORMAL ] Iteration 50: k_eff = 0.942394 res = 1.048E-02 + [ NORMAL ] Iteration 51: k_eff = 0.951566 res = 1.010E-02 + [ NORMAL ] Iteration 52: k_eff = 0.960490 res = 9.733E-03 + [ NORMAL ] Iteration 53: k_eff = 0.969168 res = 9.378E-03 + [ NORMAL ] Iteration 54: k_eff = 0.977604 res = 9.035E-03 + [ NORMAL ] Iteration 55: k_eff = 0.985800 res = 8.704E-03 + [ NORMAL ] Iteration 56: k_eff = 0.993761 res = 8.384E-03 + [ NORMAL ] Iteration 57: k_eff = 1.001491 res = 8.076E-03 + [ NORMAL ] Iteration 58: k_eff = 1.008992 res = 7.778E-03 + [ NORMAL ] Iteration 59: k_eff = 1.016271 res = 7.490E-03 + [ NORMAL ] Iteration 60: k_eff = 1.023330 res = 7.213E-03 + [ NORMAL ] Iteration 61: k_eff = 1.030174 res = 6.946E-03 + [ NORMAL ] Iteration 62: k_eff = 1.036809 res = 6.688E-03 + [ NORMAL ] Iteration 63: k_eff = 1.043238 res = 6.440E-03 + [ NORMAL ] Iteration 64: k_eff = 1.049466 res = 6.201E-03 + [ NORMAL ] Iteration 65: k_eff = 1.055498 res = 5.970E-03 + [ NORMAL ] Iteration 66: k_eff = 1.061339 res = 5.748E-03 + [ NORMAL ] Iteration 67: k_eff = 1.066993 res = 5.534E-03 + [ NORMAL ] Iteration 68: k_eff = 1.072465 res = 5.327E-03 + [ NORMAL ] Iteration 69: k_eff = 1.077760 res = 5.129E-03 + [ NORMAL ] Iteration 70: k_eff = 1.082882 res = 4.937E-03 + [ NORMAL ] Iteration 71: k_eff = 1.087837 res = 4.753E-03 + [ NORMAL ] Iteration 72: k_eff = 1.092628 res = 4.575E-03 + [ NORMAL ] Iteration 73: k_eff = 1.097260 res = 4.404E-03 + [ NORMAL ] Iteration 74: k_eff = 1.101737 res = 4.239E-03 + [ NORMAL ] Iteration 75: k_eff = 1.106065 res = 4.081E-03 + [ NORMAL ] Iteration 76: k_eff = 1.110247 res = 3.928E-03 + [ NORMAL ] Iteration 77: k_eff = 1.114288 res = 3.781E-03 + [ NORMAL ] Iteration 78: k_eff = 1.118191 res = 3.639E-03 + [ NORMAL ] Iteration 79: k_eff = 1.121961 res = 3.503E-03 + [ NORMAL ] Iteration 80: k_eff = 1.125603 res = 3.372E-03 + [ NORMAL ] Iteration 81: k_eff = 1.129119 res = 3.245E-03 + [ NORMAL ] Iteration 82: k_eff = 1.132513 res = 3.124E-03 + [ NORMAL ] Iteration 83: k_eff = 1.135790 res = 3.007E-03 + [ NORMAL ] Iteration 84: k_eff = 1.138954 res = 2.894E-03 + [ NORMAL ] Iteration 85: k_eff = 1.142007 res = 2.785E-03 + [ NORMAL ] Iteration 86: k_eff = 1.144953 res = 2.681E-03 + [ NORMAL ] Iteration 87: k_eff = 1.147796 res = 2.580E-03 + [ NORMAL ] Iteration 88: k_eff = 1.150539 res = 2.483E-03 + [ NORMAL ] Iteration 89: k_eff = 1.153185 res = 2.390E-03 + [ NORMAL ] Iteration 90: k_eff = 1.155738 res = 2.300E-03 + [ NORMAL ] Iteration 91: k_eff = 1.158200 res = 2.214E-03 + [ NORMAL ] Iteration 92: k_eff = 1.160575 res = 2.130E-03 + [ NORMAL ] Iteration 93: k_eff = 1.162865 res = 2.050E-03 + [ NORMAL ] Iteration 94: k_eff = 1.165073 res = 1.973E-03 + [ NORMAL ] Iteration 95: k_eff = 1.167202 res = 1.899E-03 + [ NORMAL ] Iteration 96: k_eff = 1.169255 res = 1.828E-03 + [ NORMAL ] Iteration 97: k_eff = 1.171234 res = 1.759E-03 + [ NORMAL ] Iteration 98: k_eff = 1.173142 res = 1.693E-03 + [ NORMAL ] Iteration 99: k_eff = 1.174980 res = 1.629E-03 + [ NORMAL ] Iteration 100: k_eff = 1.176753 res = 1.567E-03 + [ NORMAL ] Iteration 101: k_eff = 1.178461 res = 1.508E-03 + [ NORMAL ] Iteration 102: k_eff = 1.180107 res = 1.452E-03 + [ NORMAL ] Iteration 103: k_eff = 1.181694 res = 1.397E-03 + [ NORMAL ] Iteration 104: k_eff = 1.183222 res = 1.344E-03 + [ NORMAL ] Iteration 105: k_eff = 1.184695 res = 1.294E-03 + [ NORMAL ] Iteration 106: k_eff = 1.186115 res = 1.245E-03 + [ NORMAL ] Iteration 107: k_eff = 1.187482 res = 1.198E-03 + [ NORMAL ] Iteration 108: k_eff = 1.188799 res = 1.153E-03 + [ NORMAL ] Iteration 109: k_eff = 1.190068 res = 1.109E-03 + [ NORMAL ] Iteration 110: k_eff = 1.191290 res = 1.067E-03 + [ NORMAL ] Iteration 111: k_eff = 1.192468 res = 1.027E-03 + [ NORMAL ] Iteration 112: k_eff = 1.193602 res = 9.883E-04 + [ NORMAL ] Iteration 113: k_eff = 1.194694 res = 9.510E-04 + [ NORMAL ] Iteration 114: k_eff = 1.195746 res = 9.151E-04 + [ NORMAL ] Iteration 115: k_eff = 1.196759 res = 8.805E-04 + [ NORMAL ] Iteration 116: k_eff = 1.197735 res = 8.473E-04 + [ NORMAL ] Iteration 117: k_eff = 1.198674 res = 8.152E-04 + [ NORMAL ] Iteration 118: k_eff = 1.199579 res = 7.844E-04 + [ NORMAL ] Iteration 119: k_eff = 1.200450 res = 7.548E-04 + [ NORMAL ] Iteration 120: k_eff = 1.201289 res = 7.262E-04 + [ NORMAL ] Iteration 121: k_eff = 1.202097 res = 6.988E-04 + [ NORMAL ] Iteration 122: k_eff = 1.202874 res = 6.723E-04 + [ NORMAL ] Iteration 123: k_eff = 1.203623 res = 6.469E-04 + [ NORMAL ] Iteration 124: k_eff = 1.204344 res = 6.224E-04 + [ NORMAL ] Iteration 125: k_eff = 1.205038 res = 5.989E-04 + [ NORMAL ] Iteration 126: k_eff = 1.205706 res = 5.762E-04 + [ NORMAL ] Iteration 127: k_eff = 1.206349 res = 5.544E-04 + [ NORMAL ] Iteration 128: k_eff = 1.206968 res = 5.334E-04 + [ NORMAL ] Iteration 129: k_eff = 1.207564 res = 5.132E-04 + [ NORMAL ] Iteration 130: k_eff = 1.208138 res = 4.938E-04 + [ NORMAL ] Iteration 131: k_eff = 1.208690 res = 4.751E-04 + [ NORMAL ] Iteration 132: k_eff = 1.209221 res = 4.570E-04 + [ NORMAL ] Iteration 133: k_eff = 1.209733 res = 4.397E-04 + [ NORMAL ] Iteration 134: k_eff = 1.210225 res = 4.231E-04 + [ NORMAL ] Iteration 135: k_eff = 1.210699 res = 4.070E-04 + [ NORMAL ] Iteration 136: k_eff = 1.211155 res = 3.916E-04 + [ NORMAL ] Iteration 137: k_eff = 1.211594 res = 3.767E-04 + [ NORMAL ] Iteration 138: k_eff = 1.212017 res = 3.624E-04 + [ NORMAL ] Iteration 139: k_eff = 1.212423 res = 3.487E-04 + [ NORMAL ] Iteration 140: k_eff = 1.212815 res = 3.355E-04 + [ NORMAL ] Iteration 141: k_eff = 1.213191 res = 3.227E-04 + [ NORMAL ] Iteration 142: k_eff = 1.213554 res = 3.105E-04 + [ NORMAL ] Iteration 143: k_eff = 1.213902 res = 2.987E-04 + [ NORMAL ] Iteration 144: k_eff = 1.214238 res = 2.874E-04 + [ NORMAL ] Iteration 145: k_eff = 1.214561 res = 2.764E-04 + [ NORMAL ] Iteration 146: k_eff = 1.214872 res = 2.659E-04 + [ NORMAL ] Iteration 147: k_eff = 1.215171 res = 2.558E-04 + [ NORMAL ] Iteration 148: k_eff = 1.215458 res = 2.461E-04 + [ NORMAL ] Iteration 149: k_eff = 1.215735 res = 2.368E-04 + [ NORMAL ] Iteration 150: k_eff = 1.216002 res = 2.278E-04 + [ NORMAL ] Iteration 151: k_eff = 1.216258 res = 2.191E-04 + [ NORMAL ] Iteration 152: k_eff = 1.216504 res = 2.108E-04 + [ NORMAL ] Iteration 153: k_eff = 1.216742 res = 2.028E-04 + [ NORMAL ] Iteration 154: k_eff = 1.216970 res = 1.951E-04 + [ NORMAL ] Iteration 155: k_eff = 1.217190 res = 1.876E-04 + [ NORMAL ] Iteration 156: k_eff = 1.217401 res = 1.805E-04 + [ NORMAL ] Iteration 157: k_eff = 1.217604 res = 1.736E-04 + [ NORMAL ] Iteration 158: k_eff = 1.217800 res = 1.670E-04 + [ NORMAL ] Iteration 159: k_eff = 1.217988 res = 1.607E-04 + [ NORMAL ] Iteration 160: k_eff = 1.218169 res = 1.546E-04 + [ NORMAL ] Iteration 161: k_eff = 1.218344 res = 1.487E-04 + [ NORMAL ] Iteration 162: k_eff = 1.218511 res = 1.430E-04 + [ NORMAL ] Iteration 163: k_eff = 1.218673 res = 1.376E-04 + [ NORMAL ] Iteration 164: k_eff = 1.218828 res = 1.324E-04 + [ NORMAL ] Iteration 165: k_eff = 1.218977 res = 1.273E-04 + [ NORMAL ] Iteration 166: k_eff = 1.219121 res = 1.225E-04 + [ NORMAL ] Iteration 167: k_eff = 1.219259 res = 1.178E-04 + [ NORMAL ] Iteration 168: k_eff = 1.219392 res = 1.133E-04 + [ NORMAL ] Iteration 169: k_eff = 1.219520 res = 1.090E-04 + [ NORMAL ] Iteration 170: k_eff = 1.219643 res = 1.049E-04 + [ NORMAL ] Iteration 171: k_eff = 1.219761 res = 1.009E-04 + [ NORMAL ] Iteration 172: k_eff = 1.219875 res = 9.702E-05 + [ NORMAL ] Iteration 173: k_eff = 1.219984 res = 9.332E-05 + [ NORMAL ] Iteration 174: k_eff = 1.220090 res = 8.976E-05 + [ NORMAL ] Iteration 175: k_eff = 1.220191 res = 8.634E-05 + [ NORMAL ] Iteration 176: k_eff = 1.220288 res = 8.305E-05 + [ NORMAL ] Iteration 177: k_eff = 1.220382 res = 7.989E-05 + [ NORMAL ] Iteration 178: k_eff = 1.220472 res = 7.684E-05 + [ NORMAL ] Iteration 179: k_eff = 1.220559 res = 7.392E-05 + [ NORMAL ] Iteration 180: k_eff = 1.220643 res = 7.110E-05 + [ NORMAL ] Iteration 181: k_eff = 1.220723 res = 6.839E-05 + [ NORMAL ] Iteration 182: k_eff = 1.220800 res = 6.578E-05 + [ NORMAL ] Iteration 183: k_eff = 1.220874 res = 6.327E-05 + [ NORMAL ] Iteration 184: k_eff = 1.220946 res = 6.086E-05 + [ NORMAL ] Iteration 185: k_eff = 1.221015 res = 5.854E-05 + [ NORMAL ] Iteration 186: k_eff = 1.221081 res = 5.631E-05 + [ NORMAL ] Iteration 187: k_eff = 1.221144 res = 5.416E-05 + [ NORMAL ] Iteration 188: k_eff = 1.221206 res = 5.209E-05 + [ NORMAL ] Iteration 189: k_eff = 1.221264 res = 5.011E-05 + [ NORMAL ] Iteration 190: k_eff = 1.221321 res = 4.820E-05 + [ NORMAL ] Iteration 191: k_eff = 1.221375 res = 4.636E-05 + [ NORMAL ] Iteration 192: k_eff = 1.221428 res = 4.459E-05 + [ NORMAL ] Iteration 193: k_eff = 1.221478 res = 4.289E-05 + [ NORMAL ] Iteration 194: k_eff = 1.221527 res = 4.125E-05 + [ NORMAL ] Iteration 195: k_eff = 1.221573 res = 3.968E-05 + [ NORMAL ] Iteration 196: k_eff = 1.221618 res = 3.816E-05 + [ NORMAL ] Iteration 197: k_eff = 1.221661 res = 3.671E-05 + [ NORMAL ] Iteration 198: k_eff = 1.221703 res = 3.531E-05 + [ NORMAL ] Iteration 199: k_eff = 1.221743 res = 3.396E-05 + [ NORMAL ] Iteration 200: k_eff = 1.221781 res = 3.266E-05 + [ NORMAL ] Iteration 201: k_eff = 1.221818 res = 3.142E-05 + [ NORMAL ] Iteration 202: k_eff = 1.221853 res = 3.022E-05 + [ NORMAL ] Iteration 203: k_eff = 1.221888 res = 2.906E-05 + [ NORMAL ] Iteration 204: k_eff = 1.221920 res = 2.795E-05 + [ NORMAL ] Iteration 205: k_eff = 1.221952 res = 2.689E-05 + [ NORMAL ] Iteration 206: k_eff = 1.221982 res = 2.586E-05 + [ NORMAL ] Iteration 207: k_eff = 1.222012 res = 2.487E-05 + [ NORMAL ] Iteration 208: k_eff = 1.222040 res = 2.392E-05 + [ NORMAL ] Iteration 209: k_eff = 1.222067 res = 2.301E-05 + [ NORMAL ] Iteration 210: k_eff = 1.222093 res = 2.213E-05 + [ NORMAL ] Iteration 211: k_eff = 1.222118 res = 2.129E-05 + [ NORMAL ] Iteration 212: k_eff = 1.222142 res = 2.047E-05 + [ NORMAL ] Iteration 213: k_eff = 1.222165 res = 1.969E-05 + [ NORMAL ] Iteration 214: k_eff = 1.222187 res = 1.894E-05 + [ NORMAL ] Iteration 215: k_eff = 1.222209 res = 1.822E-05 + [ NORMAL ] Iteration 216: k_eff = 1.222229 res = 1.752E-05 + [ NORMAL ] Iteration 217: k_eff = 1.222249 res = 1.685E-05 + [ NORMAL ] Iteration 218: k_eff = 1.222268 res = 1.621E-05 + [ NORMAL ] Iteration 219: k_eff = 1.222287 res = 1.559E-05 + [ NORMAL ] Iteration 220: k_eff = 1.222304 res = 1.499E-05 + [ NORMAL ] Iteration 221: k_eff = 1.222321 res = 1.442E-05 + [ NORMAL ] Iteration 222: k_eff = 1.222337 res = 1.387E-05 + [ NORMAL ] Iteration 223: k_eff = 1.222353 res = 1.334E-05 + [ NORMAL ] Iteration 224: k_eff = 1.222368 res = 1.283E-05 + [ NORMAL ] Iteration 225: k_eff = 1.222383 res = 1.234E-05 + [ NORMAL ] Iteration 226: k_eff = 1.222397 res = 1.187E-05 + [ NORMAL ] Iteration 227: k_eff = 1.222410 res = 1.142E-05 + [ NORMAL ] Iteration 228: k_eff = 1.222423 res = 1.098E-05 + [ NORMAL ] Iteration 229: k_eff = 1.222435 res = 1.056E-05 + [ NORMAL ] Iteration 230: k_eff = 1.222447 res = 1.016E-05 + + +.. code:: python + + # Print report of keff and bias with OpenMC + openmoc_keff = solver.getKeff() + openmc_keff = sp.k_combined[0] + bias = (openmoc_keff - openmc_keff) * 1e5 + + print('openmc keff = {0:1.6f}'.format(openmc_keff)) + print('openmoc keff = {0:1.6f}'.format(openmoc_keff)) + print('bias [pcm]: {0:1.1f}'.format(bias)) + + +.. parsed-literal:: + + openmc keff = 1.223729 + openmoc keff = 1.222447 + bias [pcm]: -128.2 + + +There is a non-trivial bias in both the 2-group and 8-group cases. In +the case of a pin cell, one can show that these biases do not converge +to <100 pcm with more particle histories. For heterogeneous geometries, +additional measures must be taken to address the following three sources +of bias: + +- Appropriate transport-corrected cross sections +- Spatial discretization of OpenMOC's mesh +- Constant-in-angle multi-group cross sections + +Visualizing MGXS Data +--------------------- + +It is often insightful to generate visual depictions of multi-group +cross sections. There are many different types of plots which may be +useful for multi-group cross section visualization, only a few of which +will be shown here for enrichment and inspiration. + +One particularly useful visualization is a comparison of the +continuous-energy and multi-group cross sections for a particular +nuclide and reaction type. We illustrate one option for generating such +plots with the use of the open source `PyNE `__ library +to parse continuous-energy cross sections from the cross section data +library provided with OpenMC. First, we instantiate a +``pyne.ace.Library`` object for U-235 as follows. + +.. code:: python + + # Instantiate a PyNE ACE continuous-energy cross sections library + pyne_lib = pyne.ace.Library('../../../../data/nndc/293.6K/U_235_293.6K.ace') + pyne_lib.read('92235.71c') + + # Extract the U-235 data from the library + u235 = pyne_lib.tables['92235.71c'] + + # Extract the continuous-energy U-235 fission cross section data + fission = u235.reactions[18] + +Now, we use ```matplotlib`` `__ and +```seaborn`` `__ to plot +the continuous-energy and multi-group cross sections on a single plot. + +.. code:: python + + # Create a loglog plot of the U-235 continuous-energy fission cross section + plt.loglog(u235.energy, fission.sigma, color='b', linewidth=1) + + # Extract energy group bounds and MGXS values to plot + nufission = xs_library[fuel_cell.id]['fission'] + energy_groups = nufission.energy_groups + x = energy_groups.group_edges + y = nufission.get_xs(nuclides=['U-235'], order_groups='decreasing', xs_type='micro') + + # Fix low energy bound to the value defined by the ACE library + x[0] = u235.energy[0] + + # Extend the mgxs values array for matplotlib's step plot + y = np.insert(y, 0, y[0]) + + # Create a step plot for the MGXS + plt.plot(x, y, drawstyle='steps', color='r', linewidth=3) + + plt.title('U-235 Fission Cross Section') + plt.xlabel('Energy [MeV]') + plt.ylabel('Micro Fission XS') + plt.legend(['Continuous', 'Multi-Group']) + plt.xlim((x.min(), x.max())) + + + + +.. parsed-literal:: + + (9.9999999999999994e-12, 20.0) + + + + +.. image:: mgxs-part-ii-content_files/mgxs-part-ii-content_67_1.png + + +Another useful type of illustration is scattering matrix sparsity +structures. First, we extract Pandas ``DataFrames`` for the H-1 and O-16 +scattering matrices. + +.. code:: python + + # Construct a Pandas DataFrame for the microscopic nu-scattering matrix + nuscatter = xs_library[moderator_cell.id]['nu-scatter'] + df = nuscatter.get_pandas_dataframe(xs_type='micro') + + # Slice DataFrame in two for each nuclide's mean values + h1 = df[df['nuclide'] == 'H-1']['mean'] + o16 = df[df['nuclide'] == 'O-16']['mean'] + + # Cast DataFrames as NumPy arrays + h1 = h1.as_matrix() + o16 = o16.as_matrix() + + # Reshape arrays to 2D matrix for plotting + h1.shape = (fine_groups.num_groups, fine_groups.num_groups) + o16.shape = (fine_groups.num_groups, fine_groups.num_groups) + +Matplotlib's ``imshow`` routine can be used to plot the matrices to +illustrate their sparsity structures. + +.. code:: python + + # Create plot of the H-1 scattering matrix + fig = plt.subplot(121) + fig.imshow(h1, interpolation='nearest', cmap='jet') + plt.title('H-1 Scattering Matrix') + plt.xlabel('Group Out') + plt.ylabel('Group In') + plt.grid() + + # Create plot of the O-16 scattering matrix + fig2 = plt.subplot(122) + fig2.imshow(o16, interpolation='nearest', cmap='jet') + plt.title('O-16 Scattering Matrix') + plt.xlabel('Group Out') + plt.ylabel('Group In') + plt.grid() + + # Show the plot on screen + plt.show() + + + +.. image:: mgxs-part-ii-content_files/mgxs-part-ii-content_71_0.png + diff --git a/_sources/pythonapi/examples/mgxs-part-ii.txt b/_sources/pythonapi/examples/mgxs-part-ii.txt new file mode 100644 index 0000000000..1f6dd22146 --- /dev/null +++ b/_sources/pythonapi/examples/mgxs-part-ii.txt @@ -0,0 +1,13 @@ +.. _notebook_mgxs_part_ii: + +=============================== +MGXS Part II: Advanced Features +=============================== + +.. only:: html + + .. notebook:: mgxs-part-ii.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/_sources/pythonapi/examples/mgxs-part-iii-content.txt b/_sources/pythonapi/examples/mgxs-part-iii-content.txt new file mode 100644 index 0000000000..8d4da12841 --- /dev/null +++ b/_sources/pythonapi/examples/mgxs-part-iii-content.txt @@ -0,0 +1,1168 @@ + +This IPython Notebook illustrates the use of the +**``openmc.mgxs.Library``** class. The ``Library`` class is designed to +automate the calculation of multi-group cross sections for use cases +with one or more domains, cross section types, and/or nuclides. In +particular, this Notebook illustrates the following features: + +- Calculation of multi-group cross sections for a **fuel assembly** +- Automated creation, manipulation and storage of ``MGXS`` with + **``openmc.mgxs.Library``** +- **Validation** of multi-group cross sections with + **`OpenMOC `__** +- Steady-state pin-by-pin **fission rates comparison** between OpenMC + and `OpenMOC `__ + +**Note:** This Notebook was created using +`OpenMOC `__ to verify the +multi-group cross-sections generated by OpenMC. In order to run this +Notebook in its entirety, you must have +`OpenMOC `__ installed on your +system, along with OpenCG to convert the OpenMC geometries into OpenMOC +geometries. In addition, this Notebook illustrates the use of +`Pandas `__ ``DataFrames`` to containerize +multi-group cross section data. We recommend using +`Pandas `__ >v0.15.0 or later since OpenMC's +Python API leverages the multi-indexing feature included in the most +recent releases of `Pandas `__. + +Generate Input Files +-------------------- + +.. code:: python + + import math + import pickle + from IPython.display import Image + import matplotlib.pylab as pylab + import numpy as np + + import openmc + import openmc.mgxs + from openmc.statepoint import StatePoint + from openmc.summary import Summary + + import openmoc + import openmoc.process + from openmoc.compatible import get_openmoc_geometry + from openmoc.materialize import load_openmc_mgxs_lib + + %matplotlib inline + + +.. parsed-literal:: + + /usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect + because the backend has already been chosen; + matplotlib.use() must be called *before* pylab, matplotlib.pyplot, + or matplotlib.backends is imported for the first time. + + warnings.warn(_use_error_msg) + + +First we need to define materials that will be used in the problem. +Before defining a material, we must create nuclides that are used in the +material. + +.. code:: python + + # Instantiate some Nuclides + h1 = openmc.Nuclide('H-1') + b10 = openmc.Nuclide('B-10') + o16 = openmc.Nuclide('O-16') + u235 = openmc.Nuclide('U-235') + u238 = openmc.Nuclide('U-238') + zr90 = openmc.Nuclide('Zr-90') + +With the nuclides we defined, we will now create three materials for the +fuel, water, and cladding of the fuel pins. + +.. code:: python + + # 1.6 enriched fuel + fuel = openmc.Material(name='1.6% Fuel') + fuel.set_density('g/cm3', 10.31341) + fuel.add_nuclide(u235, 3.7503e-4) + fuel.add_nuclide(u238, 2.2625e-2) + fuel.add_nuclide(o16, 4.6007e-2) + + # borated water + water = openmc.Material(name='Borated Water') + water.set_density('g/cm3', 0.740582) + water.add_nuclide(h1, 4.9457e-2) + water.add_nuclide(o16, 2.4732e-2) + water.add_nuclide(b10, 8.0042e-6) + + # zircaloy + zircaloy = openmc.Material(name='Zircaloy') + zircaloy.set_density('g/cm3', 6.55) + zircaloy.add_nuclide(zr90, 7.2758e-3) + +With our three materials, we can now create a ``MaterialsFile`` object +that can be exported to an actual XML file. + +.. code:: python + + # Instantiate a MaterialsFile, add Materials + materials_file = openmc.MaterialsFile() + materials_file.add_material(fuel) + materials_file.add_material(water) + materials_file.add_material(zircaloy) + materials_file.default_xs = '71c' + + # Export to "materials.xml" + materials_file.export_to_xml() + +Now let's move on to the geometry. This problem will be a square array +of fuel pins and control rod guide tubes for which we can use OpenMC's +lattice/universe feature. The basic universe will have three regions for +the fuel, the clad, and the surrounding coolant. The first step is to +create the bounding surfaces for fuel and clad, as well as the outer +bounding surfaces of the problem. + +.. code:: python + + # Create cylinders for the fuel and clad + fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218) + clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720) + + # Create boundary planes to surround the geometry + min_x = openmc.XPlane(x0=-10.71, boundary_type='reflective') + max_x = openmc.XPlane(x0=+10.71, boundary_type='reflective') + min_y = openmc.YPlane(y0=-10.71, boundary_type='reflective') + max_y = openmc.YPlane(y0=+10.71, boundary_type='reflective') + min_z = openmc.ZPlane(z0=-10., boundary_type='reflective') + max_z = openmc.ZPlane(z0=+10., boundary_type='reflective') + +With the surfaces defined, we can now construct a fuel pin cell from +cells that are defined by intersections of half-spaces created by the +surfaces. + +.. code:: python + + # Create a Universe to encapsulate a fuel pin + fuel_pin_universe = openmc.Universe(name='1.6% Fuel Pin') + + # Create fuel Cell + fuel_cell = openmc.Cell(name='1.6% Fuel') + fuel_cell.fill = fuel + fuel_cell.region = -fuel_outer_radius + fuel_pin_universe.add_cell(fuel_cell) + + # Create a clad Cell + clad_cell = openmc.Cell(name='1.6% Clad') + clad_cell.fill = zircaloy + clad_cell.region = +fuel_outer_radius & -clad_outer_radius + fuel_pin_universe.add_cell(clad_cell) + + # Create a moderator Cell + moderator_cell = openmc.Cell(name='1.6% Moderator') + moderator_cell.fill = water + moderator_cell.region = +clad_outer_radius + fuel_pin_universe.add_cell(moderator_cell) + +Likewise, we can construct a control rod guide tube with the same +surfaces. + +.. code:: python + + # Create a Universe to encapsulate a control rod guide tube + guide_tube_universe = openmc.Universe(name='Guide Tube') + + # Create guide tube Cell + guide_tube_cell = openmc.Cell(name='Guide Tube Water') + guide_tube_cell.fill = water + guide_tube_cell.region = -fuel_outer_radius + guide_tube_universe.add_cell(guide_tube_cell) + + # Create a clad Cell + clad_cell = openmc.Cell(name='Guide Clad') + clad_cell.fill = zircaloy + clad_cell.region = +fuel_outer_radius & -clad_outer_radius + guide_tube_universe.add_cell(clad_cell) + + # Create a moderator Cell + moderator_cell = openmc.Cell(name='Guide Tube Moderator') + moderator_cell.fill = water + moderator_cell.region = +clad_outer_radius + guide_tube_universe.add_cell(moderator_cell) + +Using the pin cell universe, we can construct a 17x17 rectangular +lattice with a 1.26 cm pitch. + +.. code:: python + + # Create fuel assembly Lattice + assembly = openmc.RectLattice(name='1.6% Fuel Assembly') + assembly.dimension = (17, 17) + assembly.pitch = (1.26, 1.26) + assembly.lower_left = [-1.26 * 17. / 2.0] * 2 + +Next, we create a NumPy array of fuel pin and guide tube universes for +the lattice. + +.. code:: python + + # Create array indices for guide tube locations in lattice + template_x = np.array([5, 8, 11, 3, 13, 2, 5, 8, 11, 14, 2, 5, 8, + 11, 14, 2, 5, 8, 11, 14, 3, 13, 5, 8, 11]) + template_y = np.array([2, 2, 2, 3, 3, 5, 5, 5, 5, 5, 8, 8, 8, 8, + 8, 11, 11, 11, 11, 11, 13, 13, 14, 14, 14]) + + # Initialize an empty 17x17 array of the lattice universes + universes = np.empty((17, 17), dtype=openmc.Universe) + + # Fill the array with the fuel pin and guide tube universes + universes[:,:] = fuel_pin_universe + universes[template_x, template_y] = guide_tube_universe + + # Store the array of universes in the lattice + assembly.universes = universes + +OpenMC requires that there is a "root" universe. Let us create a root +cell that is filled by the pin cell universe and then assign it to the +root universe. + +.. code:: python + + # Create root Cell + root_cell = openmc.Cell(name='root cell') + root_cell.fill = assembly + + # Add boundary planes + root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z + + # Create root Universe + root_universe = openmc.Universe(universe_id=0, name='root universe') + root_universe.add_cell(root_cell) + +We now must create a geometry that is assigned a root universe, put the +geometry into a ``GeometryFile`` object, and export it to XML. + +.. code:: python + + # Create Geometry and set root Universe + geometry = openmc.Geometry() + geometry.root_universe = root_universe + +.. code:: python + + # Instantiate a GeometryFile + geometry_file = openmc.GeometryFile() + geometry_file.geometry = geometry + + # Export to "geometry.xml" + geometry_file.export_to_xml() + +With the geometry and materials finished, we now just need to define +simulation parameters. In this case, we will use 10 inactive batches and +40 active batches each with 2500 particles. + +.. code:: python + + # OpenMC simulation parameters + batches = 50 + inactive = 10 + particles = 2500 + + # Instantiate a SettingsFile + settings_file = openmc.SettingsFile() + settings_file.batches = batches + settings_file.inactive = inactive + settings_file.particles = particles + settings_file.output = {'tallies': False, 'summary': True} + source_bounds = [-10.71, -10.71, -10, 10.71, 10.71, 10.] + settings_file.set_source_space('fission', source_bounds) + + # Export to "settings.xml" + settings_file.export_to_xml() + +Let us also create a ``PlotsFile`` that we can use to verify that our +fuel assembly geometry was created successfully. + +.. code:: python + + # Instantiate a Plot + plot = openmc.Plot(plot_id=1) + plot.filename = 'materials-xy' + plot.origin = [0, 0, 0] + plot.width = [21.5, 21.5] + plot.pixels = [250, 250] + plot.color = 'mat' + + # Instantiate a PlotsFile, add Plot, and export to "plots.xml" + plot_file = openmc.PlotsFile() + plot_file.add_plot(plot) + plot_file.export_to_xml() + +With the plots.xml file, we can now generate and view the plot. OpenMC +outputs plots in .ppm format, which can be converted into a compressed +format like .png with the convert utility. + +.. code:: python + + # Run openmc in plotting mode + executor = openmc.Executor() + executor.plot_geometry(output=False) + + + + +.. parsed-literal:: + + 0 + + + +.. code:: python + + # Convert OpenMC's funky ppm to png + !convert materials-xy.ppm materials-xy.png + + # Display the materials plot inline + Image(filename='materials-xy.png') + + + + +.. image:: mgxs-part-iii-content_files/mgxs-part-iii-content_30_0.png + + + +As we can see from the plot, we have a nice array of fuel and guide tube +pin cells with fuel, cladding, and water! + +Create an MGXS Library +---------------------- + +Now we are ready to generate multi-group cross sections! First, let's +define a 2-group structure using the built-in ``EnergyGroups`` class. + +.. code:: python + + # Instantiate a 2-group EnergyGroups object + groups = openmc.mgxs.EnergyGroups() + groups.group_edges = np.array([0., 0.625e-6, 20.]) + +Next, we will instantiate an ``openmc.mgxs.Library`` for the energy +groups with our the fuel assembly geometry. + +.. code:: python + + # Initialize an 2-group MGXS Library for OpenMOC + mgxs_lib = openmc.mgxs.Library(geometry) + mgxs_lib.energy_groups = groups + +Now, we must specify to the ``Library`` which types of cross sections to +compute. In particular, the following are the multi-group cross section +``MGXS`` subclasses that are mapped to string codes accepted by the +``Library`` class: + +- ``TotalXS`` (``"total"``) +- ``TransportXS`` (``"transport"``) +- ``AbsorptionXS`` (``"absorption"``) +- ``CaptureXS`` (``"capture"``) +- ``FissionXS`` (``"fission"``) +- ``NuFissionXS`` (``"nu-fission"``) +- ``ScatterXS`` (``"scatter"``) +- ``NuScatterXS`` (``"nu-scatter"``) +- ``ScatterMatrixXS`` (``"scatter matrix"``) +- ``NuScatterMatrixXS`` (``"nu-scatter matrix"``) +- ``Chi`` (``"chi"``) + +In this case, let's create the multi-group cross sections needed to run +an OpenMOC simulation to verify the accuracy of our cross sections. In +particular, we will define ``"transport"``, ``"nu-fission"``, +``"nu-scatter matrix"`` and ``"chi"`` cross sections for our +``Library``. + +**Note**: A variety of different approximate transport-corrected total +multi-group cross sections (and corresponding scattering matrices) can +be found in the literature. At the present time, the ``openmc.mgxs`` +module only supports the ``"P0"`` transport correction. This correction +can be turned on and off through the boolean ``Library.correction`` +property which may take values of ``"P0"`` (default) or ``None``. + +.. code:: python + + # Specify multi-group cross section types to compute + mgxs_lib.mgxs_types = ['transport', 'nu-fission', 'nu-scatter matrix', 'chi'] + +Now we must specify the type of domain over which we would like the +``Library`` to compute multi-group cross sections. The domain type +corresponds to the type of tally filter to be used in the tallies +created to compute multi-group cross sections. At the present time, the +``Library`` supports ``"material,"`` ``"cell,"`` and ``"universe"`` +domain types. We will use a ``"cell"`` domain type here to compute cross +sections in each of the cells in the fuel assembly geometry. + +**Note:** By default, the ``Library`` class will instantiate ``MGXS`` +objects for each and every domain (material, cell or universe) in the +geometry of interest. However, one may specify a subset of these domains +to the ``Library.domains`` property. In our case, we wish to compute +multi-group cross sections in each and every cell since they will be +needed in our downstream OpenMOC calculation on the identical +combinatorial geometry mesh. + +.. code:: python + + # Specify a "cell" domain type for the cross section tally filters + mgxs_lib.domain_type = "cell" + + # Specify the cell domains over which to compute multi-group cross sections + mgxs_lib.domains = geometry.get_all_material_cells() + +We can easily instruct the ``Library`` to compute multi-group cross +sections on a nuclide-by-nuclide basis with the boolean +``Library.by_nuclide`` property. By default, ``by_nuclide`` is set to +``False``, but we will set it to ``True`` here. + +.. code:: python + + # Compute cross sections on a nuclide-by-nuclide basis + mgxs_lib.by_nuclide = True + +Lastly, we use the ``Library`` to construct the tallies needed to +compute all of the requested multi-group cross sections in each domain +and nuclide. + +.. code:: python + + # Construct all tallies needed for the multi-group cross section library + mgxs_lib.build_library() + +The tallies can now be export to a "tallies.xml" input file for OpenMC. + +**NOTE**: At this point the ``Library`` has constructed nearly 100 +distinct ``Tally`` objects. The overhead to tally in OpenMC scales as +:math:`O(N)` for :math:`N` tallies, which can become a bottleneck for +large tally datasets. To compensate for this, the Python API's +``Tally``, ``Filter`` and ``TalliesFile`` classes allow for the smart +*merging* of tallies when possible. The ``Library`` class supports this +runtime optimization with the use of the optional ``merge`` paramter +(``False`` by default) for the ``Library.add_to_tallies_file(...)`` +method, as shown below. + +.. code:: python + + # Create a "tallies.xml" file for the MGXS Library + tallies_file = openmc.TalliesFile() + mgxs_lib.add_to_tallies_file(tallies_file, merge=True) + +In addition, we instantiate a fission rate mesh tally to compare with +OpenMOC. + +.. code:: python + + # Instantiate a tally Mesh + mesh = openmc.Mesh(mesh_id=1) + mesh.type = 'regular' + mesh.dimension = [17, 17] + mesh.lower_left = [-10.71, -10.71] + mesh.width = [1.26, 1.26] + + # Instantiate tally Filter + mesh_filter = openmc.Filter() + mesh_filter.mesh = mesh + + # Instantiate the Tally + tally = openmc.Tally(name='mesh tally') + tally.add_filter(mesh_filter) + tally.add_score('fission') + tally.add_score('nu-fission') + + # Add mesh and Tally to TalliesFile + tallies_file.add_mesh(mesh) + tallies_file.add_tally(tally) + +.. code:: python + + # Export all tallies to a "tallies.xml" file + tallies_file.export_to_xml() + +.. code:: python + + # Run OpenMC + executor.run_simulation() + + +.. parsed-literal:: + + + .d88888b. 888b d888 .d8888b. + d88P" "Y88b 8888b d8888 d88P Y88b + 888 888 88888b.d88888 888 888 + 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 + 888 888 888 "88b d8P Y8b 888 "88b 888 Y888P 888 888 + 888 888 888 888 88888888 888 888 888 Y8P 888 888 888 + Y88b. .d88P 888 d88P Y8b. 888 888 888 " 888 Y88b d88P + "Y88888P" 88888P" "Y8888 888 888 888 888 "Y8888P" + __________________888______________________________________________________ + 888 + 888 + + Copyright: 2011-2015 Massachusetts Institute of Technology + License: http://mit-crpg.github.io/openmc/license.html + Version: 0.7.0 + Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca + Date/Time: 2015-11-30 21:20:07 + MPI Processes: 1 + + =========================================================================== + ========================> INITIALIZATION <========================= + =========================================================================== + + Reading settings XML file... + Reading cross sections XML file... + Reading geometry XML file... + Reading materials XML file... + Reading tallies XML file... + Building neighboring cells lists for each surface... + Loading ACE cross section table: 92235.71c + Loading ACE cross section table: 92238.71c + Loading ACE cross section table: 8016.71c + Loading ACE cross section table: 1001.71c + Loading ACE cross section table: 5010.71c + Loading ACE cross section table: 40090.71c + Maximum neutron transport energy: 20.0000 MeV for 92235.71c + Initializing source particles... + + =========================================================================== + ====================> K EIGENVALUE SIMULATION <==================== + =========================================================================== + + Bat./Gen. k Average k + ========= ======== ==================== + 1/1 1.02650 + 2/1 1.01386 + 3/1 1.01045 + 4/1 1.05511 + 5/1 1.04873 + 6/1 1.04558 + 7/1 1.03840 + 8/1 1.02086 + 9/1 1.08845 + 10/1 1.03932 + 11/1 1.01271 + 12/1 1.03448 1.02360 +/- 0.01088 + 13/1 1.04395 1.03038 +/- 0.00925 + 14/1 1.05477 1.03648 +/- 0.00894 + 15/1 1.00485 1.03015 +/- 0.00938 + 16/1 1.04523 1.03267 +/- 0.00806 + 17/1 1.01328 1.02990 +/- 0.00735 + 18/1 1.01476 1.02800 +/- 0.00664 + 19/1 1.01490 1.02655 +/- 0.00604 + 20/1 1.00926 1.02482 +/- 0.00567 + 21/1 0.98504 1.02120 +/- 0.00627 + 22/1 1.00397 1.01977 +/- 0.00591 + 23/1 1.02556 1.02021 +/- 0.00545 + 24/1 0.99808 1.01863 +/- 0.00529 + 25/1 0.99638 1.01715 +/- 0.00514 + 26/1 0.99615 1.01584 +/- 0.00499 + 27/1 1.01843 1.01599 +/- 0.00469 + 28/1 1.00315 1.01528 +/- 0.00447 + 29/1 1.00633 1.01480 +/- 0.00426 + 30/1 1.02159 1.01514 +/- 0.00405 + 31/1 1.03395 1.01604 +/- 0.00396 + 32/1 1.02672 1.01652 +/- 0.00381 + 33/1 1.03778 1.01745 +/- 0.00375 + 34/1 1.03807 1.01831 +/- 0.00369 + 35/1 1.07854 1.02072 +/- 0.00428 + 36/1 1.03524 1.02128 +/- 0.00415 + 37/1 1.03100 1.02164 +/- 0.00401 + 38/1 1.03853 1.02224 +/- 0.00391 + 39/1 1.04089 1.02288 +/- 0.00383 + 40/1 1.02150 1.02284 +/- 0.00370 + 41/1 0.98470 1.02161 +/- 0.00379 + 42/1 1.00658 1.02114 +/- 0.00370 + 43/1 0.98652 1.02009 +/- 0.00373 + 44/1 1.02787 1.02032 +/- 0.00363 + 45/1 0.98800 1.01939 +/- 0.00364 + 46/1 1.00286 1.01893 +/- 0.00357 + 47/1 1.02559 1.01911 +/- 0.00348 + 48/1 1.03729 1.01959 +/- 0.00342 + 49/1 1.02538 1.01974 +/- 0.00333 + 50/1 1.01478 1.01962 +/- 0.00325 + Creating state point statepoint.50.h5... + + =========================================================================== + ======================> SIMULATION FINISHED <====================== + =========================================================================== + + + =======================> TIMING STATISTICS <======================= + + Total time for initialization = 4.2800E-01 seconds + Reading cross sections = 9.1000E-02 seconds + Total time in simulation = 4.1240E+01 seconds + Time in transport only = 4.1215E+01 seconds + Time in inactive batches = 4.0230E+00 seconds + Time in active batches = 3.7217E+01 seconds + Time synchronizing fission bank = 8.0000E-03 seconds + Sampling source sites = 6.0000E-03 seconds + SEND/RECV source sites = 2.0000E-03 seconds + Time accumulating tallies = 2.0000E-03 seconds + Total time for finalization = 0.0000E+00 seconds + Total time elapsed = 4.1683E+01 seconds + Calculation Rate (inactive) = 6214.27 neutrons/second + Calculation Rate (active) = 2686.94 neutrons/second + + ============================> RESULTS <============================ + + k-effective (Collision) = 1.01805 +/- 0.00261 + k-effective (Track-length) = 1.01962 +/- 0.00325 + k-effective (Absorption) = 1.01554 +/- 0.00339 + Combined k-effective = 1.01711 +/- 0.00235 + Leakage Fraction = 0.00000 +/- 0.00000 + + + + + +.. parsed-literal:: + + 0 + + + +Tally Data Processing +--------------------- + +Our simulation ran successfully and created statepoint and summary +output files. We begin our analysis by instantiating a ``StatePoint`` +object. + +.. code:: python + + # Load the last statepoint file + sp = openmc.StatePoint('statepoint.50.h5') + +In addition to the statepoint file, our simulation also created a +summary file which encapsulates information about the materials and +geometry. This is necessary for the ``openmc.mgxs`` module to properly +process the tally data. We first create a ``Summary`` object and link it +with the statepoint. + +.. code:: python + + su = openmc.Summary('summary.h5') + sp.link_with_summary(su) + +The statepoint is now ready to be analyzed by the ``Library``. We simply +have to load the tallies from the statepoint into the ``Library`` and +our ``MGXS`` objects will compute the cross sections for us +under-the-hood. + +.. code:: python + + # Initialize MGXS Library with OpenMC statepoint data + mgxs_lib.load_from_statepoint(sp) + + +.. parsed-literal:: + + /usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1514: RuntimeWarning: invalid value encountered in true_divide + /usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1515: RuntimeWarning: invalid value encountered in true_divide + /usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1516: RuntimeWarning: invalid value encountered in true_divide + + +Voila! Our multi-group cross sections are now ready to rock 'n roll! + +Extracting and Storing MGXS Data +-------------------------------- + +The ``Library`` supports a rich API to automate a variety of tasks, +including multi-group cross section data retrieval and storage. We will +highlight a few of these features here. First, the +``Library.get_mgxs(...)`` method allows one to extract an ``MGXS`` +object from the ``Library`` for a particular domain and cross section +type. The following cell illustrates how one may extract the +``NuFissionXS`` object for the fuel cell. + +**Note:** The ``MGXS.get_mgxs(...)`` method will accept either the +domain *or* the integer domain ID of interest. + +.. code:: python + + # Retrieve the NuFissionXS object for the fuel cell from the library + fuel_mgxs = mgxs_lib.get_mgxs(fuel_cell, 'nu-fission') + +The ``NuFissionXS`` object supports all of the methods described +previously the ``openmc.mgxs`` tutorials, such as +`Pandas `__ ``DataFrames``: + +.. code:: python + + df = fuel_mgxs.get_pandas_dataframe() + df + + +.. parsed-literal:: + + /usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellgroup innuclidemeanstd. dev.
3100001U-2358.063513e-034.062984e-05
4100001U-2387.335515e-034.459335e-05
5100001O-160.000000e+000.000000e+00
0100002U-2353.613274e-011.902492e-03
1100002U-2386.738424e-073.536787e-09
2100002O-160.000000e+000.000000e+00
+
+ + + +Similarly, we can use the ``MGXS.print_xs(...)`` method to view a string +representation of the multi-group cross section data. + +.. code:: python + + fuel_mgxs.print_xs() + + +.. parsed-literal:: + + Multi-Group XS + Reaction Type = nu-fission + Domain Type = cell + Domain ID = 10000 + Nuclide = U-235 + Cross Sections [cm^-1]: + Group 1 [6.25e-07 - 20.0 MeV]: 8.06e-03 +/- 5.04e-01% + Group 2 [0.0 - 6.25e-07 MeV]: 3.61e-01 +/- 5.27e-01% + + Nuclide = U-238 + Cross Sections [cm^-1]: + Group 1 [6.25e-07 - 20.0 MeV]: 7.34e-03 +/- 6.08e-01% + Group 2 [0.0 - 6.25e-07 MeV]: 6.74e-07 +/- 5.25e-01% + + Nuclide = O-16 + Cross Sections [cm^-1]: + Group 1 [6.25e-07 - 20.0 MeV]: 0.00e+00 +/- nan% + Group 2 [0.0 - 6.25e-07 MeV]: 0.00e+00 +/- nan% + + + + + +One can export the entire ``Library`` to HDF5 with the +``Library.build_hdf5_store(...)`` method as follows: + +.. code:: python + + # Store the cross section data in an "mgxs/mgxs.h5" HDF5 binary file + mgxs_lib.build_hdf5_store(filename='mgxs.h5', directory='mgxs') + +The HDF5 store will contain the numerical multi-group cross section data +indexed by domain, nuclide and cross section type. Some data workflows +may be optimized by storing and retrieving binary representations of the +``MGXS`` objects in the ``Library``. This feature is supported through +the ``Library.dump_to_file(...)`` and ``Library.load_from_file(...)`` +routines which use Python's +```pickle`` `__ module. +This is illustrated as follows. + +.. code:: python + + # Store a Library and its MGXS objects in a pickled binary file "mgxs/mgxs.pkl" + mgxs_lib.dump_to_file(filename='mgxs', directory='mgxs') + +.. code:: python + + # Instantiate a new MGXS Library from the pickled binary file "mgxs/mgxs.pkl" + mgxs_lib = openmc.mgxs.Library.load_from_file(filename='mgxs', directory='mgxs') + +The ``Library`` class may be used to leverage the energy condensation +features supported by the ``MGXS`` class. In particular, one can use the +``Library.get_condensed_library(...)`` with a coarse group structure +which is a subset of the original "fine" group structure as shown below. + +.. code:: python + + # Create a 1-group structure + coarse_groups = openmc.mgxs.EnergyGroups(group_edges=[0., 20.]) + + # Create a new MGXS Library on the coarse 1-group structure + coarse_mgxs_lib = mgxs_lib.get_condensed_library(coarse_groups) + +.. code:: python + + # Retrieve the NuFissionXS object for the fuel cell from the 1-group library + coarse_fuel_mgxs = coarse_mgxs_lib.get_mgxs(fuel_cell, 'nu-fission') + + # Show the Pandas DataFrame for the 1-group MGXS + coarse_fuel_mgxs.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellgroup innuclidemeanstd. dev.
0100001U-2350.0743830.000280
1100001U-2380.0059590.000036
2100001O-160.0000000.000000
+
+ + + +Verification with OpenMOC +------------------------- + +Of course it is always a good idea to verify that one's cross sections +are accurate. We can easily do so here with the deterministic transport +code `OpenMOC `__. We will extract +an OpenCG geometry from the summary file and convert it into an +equivalent OpenMOC geometry. + +.. code:: python + + # Create an OpenMOC Geometry from the OpenCG Geometry + openmoc_geometry = get_openmoc_geometry(mgxs_lib.opencg_geometry) + +Now, we can inject the multi-group cross sections into the equivalent +fuel assembly OpenMOC geometry. The ``openmoc.materialize`` module +supports the loading of ``Library`` objects from OpenMC as illustrated +below. + +.. code:: python + + # Load the library into the OpenMOC geometry + materials = load_openmc_mgxs_lib(mgxs_lib, openmoc_geometry) + +We are now ready to run OpenMOC to verify our cross-sections from +OpenMC. + +.. code:: python + + # Generate tracks for OpenMOC + openmoc_geometry.initializeFlatSourceRegions() + track_generator = openmoc.TrackGenerator(openmoc_geometry, num_azim=32, spacing=0.1) + track_generator.generateTracks() + + # Run OpenMOC + solver = openmoc.CPUSolver(track_generator) + solver.computeEigenvalue() + + +.. parsed-literal:: + + [ NORMAL ] Ray tracing for track segmentation... + [ NORMAL ] Dumping tracks to file... + [ NORMAL ] Computing the eigenvalue... + [ NORMAL ] Iteration 0: k_eff = 0.854316 res = 0.000E+00 + [ NORMAL ] Iteration 1: k_eff = 0.801593 res = 1.522E-01 + [ NORMAL ] Iteration 2: k_eff = 0.761131 res = 6.380E-02 + [ NORMAL ] Iteration 3: k_eff = 0.731467 res = 5.066E-02 + [ NORMAL ] Iteration 4: k_eff = 0.709897 res = 3.910E-02 + [ NORMAL ] Iteration 5: k_eff = 0.695110 res = 2.954E-02 + [ NORMAL ] Iteration 6: k_eff = 0.685966 res = 2.085E-02 + [ NORMAL ] Iteration 7: k_eff = 0.681511 res = 1.317E-02 + [ NORMAL ] Iteration 8: k_eff = 0.680926 res = 6.520E-03 + [ NORMAL ] Iteration 9: k_eff = 0.683509 res = 1.046E-03 + [ NORMAL ] Iteration 10: k_eff = 0.688659 res = 3.848E-03 + [ NORMAL ] Iteration 11: k_eff = 0.695860 res = 7.565E-03 + [ NORMAL ] Iteration 12: k_eff = 0.704674 res = 1.048E-02 + [ NORMAL ] Iteration 13: k_eff = 0.714726 res = 1.269E-02 + [ NORMAL ] Iteration 14: k_eff = 0.725700 res = 1.428E-02 + [ NORMAL ] Iteration 15: k_eff = 0.737329 res = 1.537E-02 + [ NORMAL ] Iteration 16: k_eff = 0.749388 res = 1.604E-02 + [ NORMAL ] Iteration 17: k_eff = 0.761690 res = 1.637E-02 + [ NORMAL ] Iteration 18: k_eff = 0.774081 res = 1.643E-02 + [ NORMAL ] Iteration 19: k_eff = 0.786432 res = 1.628E-02 + [ NORMAL ] Iteration 20: k_eff = 0.798638 res = 1.597E-02 + [ NORMAL ] Iteration 21: k_eff = 0.810618 res = 1.553E-02 + [ NORMAL ] Iteration 22: k_eff = 0.822303 res = 1.501E-02 + [ NORMAL ] Iteration 23: k_eff = 0.833643 res = 1.443E-02 + [ NORMAL ] Iteration 24: k_eff = 0.844598 res = 1.380E-02 + [ NORMAL ] Iteration 25: k_eff = 0.855140 res = 1.315E-02 + [ NORMAL ] Iteration 26: k_eff = 0.865249 res = 1.249E-02 + [ NORMAL ] Iteration 27: k_eff = 0.874914 res = 1.183E-02 + [ NORMAL ] Iteration 28: k_eff = 0.884128 res = 1.118E-02 + [ NORMAL ] Iteration 29: k_eff = 0.892891 res = 1.054E-02 + [ NORMAL ] Iteration 30: k_eff = 0.901206 res = 9.920E-03 + [ NORMAL ] Iteration 31: k_eff = 0.909080 res = 9.320E-03 + [ NORMAL ] Iteration 32: k_eff = 0.916523 res = 8.745E-03 + [ NORMAL ] Iteration 33: k_eff = 0.923546 res = 8.194E-03 + [ NORMAL ] Iteration 34: k_eff = 0.930162 res = 7.669E-03 + [ NORMAL ] Iteration 35: k_eff = 0.936387 res = 7.171E-03 + [ NORMAL ] Iteration 36: k_eff = 0.942236 res = 6.698E-03 + [ NORMAL ] Iteration 37: k_eff = 0.947725 res = 6.252E-03 + [ NORMAL ] Iteration 38: k_eff = 0.952869 res = 5.830E-03 + [ NORMAL ] Iteration 39: k_eff = 0.957687 res = 5.433E-03 + [ NORMAL ] Iteration 40: k_eff = 0.962193 res = 5.060E-03 + [ NORMAL ] Iteration 41: k_eff = 0.966404 res = 4.710E-03 + [ NORMAL ] Iteration 42: k_eff = 0.970337 res = 4.381E-03 + [ NORMAL ] Iteration 43: k_eff = 0.974006 res = 4.073E-03 + [ NORMAL ] Iteration 44: k_eff = 0.977426 res = 3.785E-03 + [ NORMAL ] Iteration 45: k_eff = 0.980613 res = 3.515E-03 + [ NORMAL ] Iteration 46: k_eff = 0.983580 res = 3.264E-03 + [ NORMAL ] Iteration 47: k_eff = 0.986341 res = 3.029E-03 + [ NORMAL ] Iteration 48: k_eff = 0.988908 res = 2.809E-03 + [ NORMAL ] Iteration 49: k_eff = 0.991293 res = 2.605E-03 + [ NORMAL ] Iteration 50: k_eff = 0.993509 res = 2.415E-03 + [ NORMAL ] Iteration 51: k_eff = 0.995566 res = 2.238E-03 + [ NORMAL ] Iteration 52: k_eff = 0.997475 res = 2.073E-03 + [ NORMAL ] Iteration 53: k_eff = 0.999246 res = 1.920E-03 + [ NORMAL ] Iteration 54: k_eff = 1.000888 res = 1.777E-03 + [ NORMAL ] Iteration 55: k_eff = 1.002409 res = 1.645E-03 + [ NORMAL ] Iteration 56: k_eff = 1.003818 res = 1.522E-03 + [ NORMAL ] Iteration 57: k_eff = 1.005123 res = 1.408E-03 + [ NORMAL ] Iteration 58: k_eff = 1.006331 res = 1.302E-03 + [ NORMAL ] Iteration 59: k_eff = 1.007450 res = 1.203E-03 + [ NORMAL ] Iteration 60: k_eff = 1.008484 res = 1.112E-03 + [ NORMAL ] Iteration 61: k_eff = 1.009440 res = 1.028E-03 + [ NORMAL ] Iteration 62: k_eff = 1.010324 res = 9.496E-04 + [ NORMAL ] Iteration 63: k_eff = 1.011141 res = 8.771E-04 + [ NORMAL ] Iteration 64: k_eff = 1.011897 res = 8.100E-04 + [ NORMAL ] Iteration 65: k_eff = 1.012594 res = 7.478E-04 + [ NORMAL ] Iteration 66: k_eff = 1.013238 res = 6.903E-04 + [ NORMAL ] Iteration 67: k_eff = 1.013833 res = 6.371E-04 + [ NORMAL ] Iteration 68: k_eff = 1.014382 res = 5.879E-04 + [ NORMAL ] Iteration 69: k_eff = 1.014889 res = 5.424E-04 + [ NORMAL ] Iteration 70: k_eff = 1.015357 res = 5.004E-04 + [ NORMAL ] Iteration 71: k_eff = 1.015789 res = 4.615E-04 + [ NORMAL ] Iteration 72: k_eff = 1.016187 res = 4.255E-04 + [ NORMAL ] Iteration 73: k_eff = 1.016554 res = 3.923E-04 + [ NORMAL ] Iteration 74: k_eff = 1.016892 res = 3.617E-04 + [ NORMAL ] Iteration 75: k_eff = 1.017204 res = 3.333E-04 + [ NORMAL ] Iteration 76: k_eff = 1.017492 res = 3.072E-04 + [ NORMAL ] Iteration 77: k_eff = 1.017757 res = 2.831E-04 + [ NORMAL ] Iteration 78: k_eff = 1.018001 res = 2.608E-04 + [ NORMAL ] Iteration 79: k_eff = 1.018226 res = 2.403E-04 + [ NORMAL ] Iteration 80: k_eff = 1.018433 res = 2.213E-04 + [ NORMAL ] Iteration 81: k_eff = 1.018624 res = 2.038E-04 + [ NORMAL ] Iteration 82: k_eff = 1.018800 res = 1.877E-04 + [ NORMAL ] Iteration 83: k_eff = 1.018962 res = 1.728E-04 + [ NORMAL ] Iteration 84: k_eff = 1.019110 res = 1.591E-04 + [ NORMAL ] Iteration 85: k_eff = 1.019248 res = 1.465E-04 + [ NORMAL ] Iteration 86: k_eff = 1.019374 res = 1.348E-04 + [ NORMAL ] Iteration 87: k_eff = 1.019490 res = 1.241E-04 + [ NORMAL ] Iteration 88: k_eff = 1.019597 res = 1.142E-04 + [ NORMAL ] Iteration 89: k_eff = 1.019695 res = 1.051E-04 + [ NORMAL ] Iteration 90: k_eff = 1.019786 res = 9.670E-05 + [ NORMAL ] Iteration 91: k_eff = 1.019869 res = 8.895E-05 + [ NORMAL ] Iteration 92: k_eff = 1.019946 res = 8.183E-05 + [ NORMAL ] Iteration 93: k_eff = 1.020016 res = 7.528E-05 + [ NORMAL ] Iteration 94: k_eff = 1.020081 res = 6.922E-05 + [ NORMAL ] Iteration 95: k_eff = 1.020141 res = 6.368E-05 + [ NORMAL ] Iteration 96: k_eff = 1.020195 res = 5.857E-05 + [ NORMAL ] Iteration 97: k_eff = 1.020246 res = 5.385E-05 + [ NORMAL ] Iteration 98: k_eff = 1.020292 res = 4.954E-05 + [ NORMAL ] Iteration 99: k_eff = 1.020335 res = 4.553E-05 + [ NORMAL ] Iteration 100: k_eff = 1.020374 res = 4.185E-05 + [ NORMAL ] Iteration 101: k_eff = 1.020410 res = 3.848E-05 + [ NORMAL ] Iteration 102: k_eff = 1.020443 res = 3.537E-05 + [ NORMAL ] Iteration 103: k_eff = 1.020474 res = 3.253E-05 + [ NORMAL ] Iteration 104: k_eff = 1.020502 res = 2.989E-05 + [ NORMAL ] Iteration 105: k_eff = 1.020527 res = 2.746E-05 + [ NORMAL ] Iteration 106: k_eff = 1.020551 res = 2.526E-05 + [ NORMAL ] Iteration 107: k_eff = 1.020573 res = 2.319E-05 + [ NORMAL ] Iteration 108: k_eff = 1.020593 res = 2.134E-05 + [ NORMAL ] Iteration 109: k_eff = 1.020611 res = 1.960E-05 + [ NORMAL ] Iteration 110: k_eff = 1.020628 res = 1.800E-05 + [ NORMAL ] Iteration 111: k_eff = 1.020643 res = 1.652E-05 + [ NORMAL ] Iteration 112: k_eff = 1.020657 res = 1.518E-05 + [ NORMAL ] Iteration 113: k_eff = 1.020670 res = 1.398E-05 + [ NORMAL ] Iteration 114: k_eff = 1.020682 res = 1.283E-05 + [ NORMAL ] Iteration 115: k_eff = 1.020693 res = 1.178E-05 + [ NORMAL ] Iteration 116: k_eff = 1.020704 res = 1.083E-05 + + +We report the eigenvalues computed by OpenMC and OpenMOC here together +to summarize our results. + +.. code:: python + + # Print report of keff and bias with OpenMC + openmoc_keff = solver.getKeff() + openmc_keff = sp.k_combined[0] + bias = (openmoc_keff - openmc_keff) * 1e5 + + print('openmc keff = {0:1.6f}'.format(openmc_keff)) + print('openmoc keff = {0:1.6f}'.format(openmoc_keff)) + print('bias [pcm]: {0:1.1f}'.format(bias)) + + +.. parsed-literal:: + + openmc keff = 1.017105 + openmoc keff = 1.020704 + bias [pcm]: 359.8 + + +There is a non-trivial bias between the eigenvalues computed by OpenMC +and OpenMOC. One can show that these biases do not converge to <100 pcm +with more particle histories. For heterogeneous geometries, additional +measures must be taken to address the following three sources of bias: + +- Appropriate transport-corrected cross sections +- Spatial discretization of OpenMOC's mesh +- Constant-in-angle multi-group cross sections + +Flux and Pin Power Visualizations +--------------------------------- + +We will conclude this tutorial by illustrating how to visualize the +fission rates computed by OpenMOC and OpenMC. First, we extract +volume-integrated fission rates from OpenMC's mesh fission rate tally +for each pin cell in the fuel assembly. + +.. code:: python + + # Get the OpenMC fission rate mesh tally data + mesh_tally = sp.get_tally(name='mesh tally') + openmc_fission_rates = mesh_tally.get_values(scores=['nu-fission']) + + # Reshape array to 2D for plotting + openmc_fission_rates.shape = (17,17) + + # Normalize to the average pin power + openmc_fission_rates /= np.mean(openmc_fission_rates) + +Next, we extract OpenMOC's volume-averaged fission rates into a 2D 17x17 +NumPy array. + +.. code:: python + + # Export OpenMOC's fission rates for each pin cell instance in the fuel assembly + openmoc.process.compute_fission_rates(solver) + + # Open the pickle file with the fission rates + fission_rates = pickle.load(open('fission-rates/fission-rates.pkl', 'rb' )) + + # Allocate array for fission rates in each fuel pin + openmoc_fission_rates = np.zeros((17, 17)) + + # Extract fission rates for each fuel pin + for key, value in fission_rates.items(): + lat_x = int(key.split(':')[1].split()[3][1:-1]) + lat_y = int(key.split(':')[1].split()[4][:-1]) + openmoc_fission_rates[lat_x, lat_y] = value + + # Normalize to the average pin fission rate + openmoc_fission_rates /= np.mean(openmoc_fission_rates) + +Now we can easily use Matplotlib to visualize the fission rates from +OpenMC and OpenMOC side-by-side. + +.. code:: python + + # Plot OpenMC's fission rates in the left subplot + fig = pylab.subplot(121) + pylab.imshow(openmc_fission_rates, interpolation='none', cmap='jet') + pylab.title('OpenMC Fission Rates') + + # Plot OpenMOC's fission rates in the right subplot + fig2 = pylab.subplot(122) + pylab.imshow(openmoc_fission_rates, interpolation='none', cmap='jet') + pylab.title('OpenMOC Fission Rates') + + + + +.. parsed-literal:: + + + + + + +.. image:: mgxs-part-iii-content_files/mgxs-part-iii-content_90_1.png + diff --git a/_sources/pythonapi/examples/mgxs-part-iii.txt b/_sources/pythonapi/examples/mgxs-part-iii.txt new file mode 100644 index 0000000000..f441028628 --- /dev/null +++ b/_sources/pythonapi/examples/mgxs-part-iii.txt @@ -0,0 +1,13 @@ +.. _notebook_mgxs_part_iii: + +======================== +MGXS Part III: Libraries +======================== + +.. only:: html + + .. notebook:: mgxs-part-iii.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/_sources/pythonapi/examples/pandas-dataframes-content.txt b/_sources/pythonapi/examples/pandas-dataframes-content.txt new file mode 100644 index 0000000000..db40a36971 --- /dev/null +++ b/_sources/pythonapi/examples/pandas-dataframes-content.txt @@ -0,0 +1,1805 @@ + +This notebook demonstrates how systematic analysis of tally scores is +possible using Pandas dataframes. A dataframe can be automatically +generated using the ``Tally.get_pandas_dataframe(...)`` method. +Furthermore, by linking the tally data in a statepoint file with +geometry and material information from a summary file, the dataframe can +be shown with user-supplied labels. + +**Note:** that this Notebook was created using the latest Pandas +v0.16.1. Everything in the Notebook will wun with older versions of +Pandas, but the multi-indexing option in >v0.15.0 makes the tables look +prettier. + +.. code:: python + + import glob + from IPython.display import Image + import matplotlib.pylab as pylab + import scipy.stats + import numpy as np + + import openmc + from openmc.statepoint import StatePoint + from openmc.summary import Summary + + %matplotlib inline + +Generate Input Files +-------------------- + +First we need to define materials that will be used in the problem. +Before defining a material, we must create nuclides that are used in the +material. + +.. code:: python + + # Instantiate some Nuclides + h1 = openmc.Nuclide('H-1') + b10 = openmc.Nuclide('B-10') + o16 = openmc.Nuclide('O-16') + u235 = openmc.Nuclide('U-235') + u238 = openmc.Nuclide('U-238') + zr90 = openmc.Nuclide('Zr-90') + +With the nuclides we defined, we will now create three materials for the +fuel, water, and cladding of the fuel pin. + +.. code:: python + + # 1.6 enriched fuel + fuel = openmc.Material(name='1.6% Fuel') + fuel.set_density('g/cm3', 10.31341) + fuel.add_nuclide(u235, 3.7503e-4) + fuel.add_nuclide(u238, 2.2625e-2) + fuel.add_nuclide(o16, 4.6007e-2) + + # borated water + water = openmc.Material(name='Borated Water') + water.set_density('g/cm3', 0.740582) + water.add_nuclide(h1, 4.9457e-2) + water.add_nuclide(o16, 2.4732e-2) + water.add_nuclide(b10, 8.0042e-6) + + # zircaloy + zircaloy = openmc.Material(name='Zircaloy') + zircaloy.set_density('g/cm3', 6.55) + zircaloy.add_nuclide(zr90, 7.2758e-3) + +With our three materials, we can now create a materials file object that +can be exported to an actual XML file. + +.. code:: python + + # Instantiate a MaterialsFile, add Materials + materials_file = openmc.MaterialsFile() + materials_file.add_material(fuel) + materials_file.add_material(water) + materials_file.add_material(zircaloy) + materials_file.default_xs = '71c' + + # Export to "materials.xml" + materials_file.export_to_xml() + +Now let's move on to the geometry. This problem will be a square array +of fuel pins for which we can use OpenMC's lattice/universe feature. The +basic universe will have three regions for the fuel, the clad, and the +surrounding coolant. The first step is to create the bounding surfaces +for fuel and clad, as well as the outer bounding surfaces of the +problem. + +.. code:: python + + # Create cylinders for the fuel and clad + fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218) + clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720) + + # Create boundary planes to surround the geometry + # Use both reflective and vacuum boundaries to make life interesting + min_x = openmc.XPlane(x0=-10.71, boundary_type='reflective') + max_x = openmc.XPlane(x0=+10.71, boundary_type='vacuum') + min_y = openmc.YPlane(y0=-10.71, boundary_type='vacuum') + max_y = openmc.YPlane(y0=+10.71, boundary_type='reflective') + min_z = openmc.ZPlane(z0=-10.71, boundary_type='reflective') + max_z = openmc.ZPlane(z0=+10.71, boundary_type='reflective') + +With the surfaces defined, we can now construct a fuel pin cell from +cells that are defined by intersections of half-spaces created by the +surfaces. + +.. code:: python + + # Create a Universe to encapsulate a fuel pin + pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin') + + # Create fuel Cell + fuel_cell = openmc.Cell(name='1.6% Fuel') + fuel_cell.fill = fuel + fuel_cell.region = -fuel_outer_radius + pin_cell_universe.add_cell(fuel_cell) + + # Create a clad Cell + clad_cell = openmc.Cell(name='1.6% Clad') + clad_cell.fill = zircaloy + clad_cell.region = +fuel_outer_radius & -clad_outer_radius + pin_cell_universe.add_cell(clad_cell) + + # Create a moderator Cell + moderator_cell = openmc.Cell(name='1.6% Moderator') + moderator_cell.fill = water + moderator_cell.region = +clad_outer_radius + pin_cell_universe.add_cell(moderator_cell) + +Using the pin cell universe, we can construct a 17x17 rectangular +lattice with a 1.26 cm pitch. + +.. code:: python + + # Create fuel assembly Lattice + assembly = openmc.RectLattice(name='1.6% Fuel - 0BA') + assembly.dimension = (17, 17) + assembly.pitch = (1.26, 1.26) + assembly.lower_left = [-1.26 * 17. / 2.0] * 2 + assembly.universes = [[pin_cell_universe] * 17] * 17 + +OpenMC requires that there is a "root" universe. Let us create a root +cell that is filled by the pin cell universe and then assign it to the +root universe. + +.. code:: python + + # Create root Cell + root_cell = openmc.Cell(name='root cell') + root_cell.fill = assembly + + # Add boundary planes + root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z + + # Create root Universe + root_universe = openmc.Universe(universe_id=0, name='root universe') + root_universe.add_cell(root_cell) + +We now must create a geometry that is assigned a root universe, put the +geometry into a ``GeometryFile`` object, and export it to XML. + +.. code:: python + + # Create Geometry and set root Universe + geometry = openmc.Geometry() + geometry.root_universe = root_universe + +.. code:: python + + # Instantiate a GeometryFile + geometry_file = openmc.GeometryFile() + geometry_file.geometry = geometry + + # Export to "geometry.xml" + geometry_file.export_to_xml() + +With the geometry and materials finished, we now just need to define +simulation parameters. In this case, we will use 5 inactive batches and +15 minimum active batches each with 2500 particles. We also tell OpenMC +to turn tally triggers on, which means it will keep running until some +criterion on the uncertainty of tallies is reached. + +.. code:: python + + # OpenMC simulation parameters + min_batches = 20 + max_batches = 200 + inactive = 5 + particles = 2500 + + # Instantiate a SettingsFile + settings_file = openmc.SettingsFile() + settings_file.batches = min_batches + settings_file.inactive = inactive + settings_file.particles = particles + settings_file.output = {'tallies': False, 'summary': True} + settings_file.trigger_active = True + settings_file.trigger_max_batches = max_batches + source_bounds = [-10.71, -10.71, -10, 10.71, 10.71, 10.] + settings_file.set_source_space('box', source_bounds) + + # Export to "settings.xml" + settings_file.export_to_xml() + +Let us also create a plot file that we can use to verify that our pin +cell geometry was created successfully. + +.. code:: python + + # Instantiate a Plot + plot = openmc.Plot(plot_id=1) + plot.filename = 'materials-xy' + plot.origin = [0, 0, 0] + plot.width = [21.5, 21.5] + plot.pixels = [250, 250] + plot.color = 'mat' + + # Instantiate a PlotsFile, add Plot, and export to "plots.xml" + plot_file = openmc.PlotsFile() + plot_file.add_plot(plot) + plot_file.export_to_xml() + +With the plots.xml file, we can now generate and view the plot. OpenMC +outputs plots in .ppm format, which can be converted into a compressed +format like .png with the convert utility. + +.. code:: python + + # Run openmc in plotting mode + executor = openmc.Executor() + executor.plot_geometry(output=False) + + + + +.. parsed-literal:: + + 0 + + + +.. code:: python + + # Convert OpenMC's funky ppm to png + !convert materials-xy.ppm materials-xy.png + + # Display the materials plot inline + Image(filename='materials-xy.png') + + + + +.. image:: pandas-dataframes-content_files/pandas-dataframes-content_26_0.png + + + +As we can see from the plot, we have a nice array of pin cells with +fuel, cladding, and water! Before we run our simulation, we need to tell +the code what we want to tally. The following code shows how to create a +variety of tallies. + +.. code:: python + + # Instantiate an empty TalliesFile + tallies_file = openmc.TalliesFile() + tallies_file._tallies = [] + +Instantiate a fission rate mesh Tally + +.. code:: python + + # Instantiate a tally Mesh + mesh = openmc.Mesh(mesh_id=1) + mesh.type = 'regular' + mesh.dimension = [17, 17] + mesh.lower_left = [-10.71, -10.71] + mesh.width = [1.26, 1.26] + + # Instantiate tally Filter + mesh_filter = openmc.Filter() + mesh_filter.mesh = mesh + + # Instantiate energy Filter + energy_filter = openmc.Filter() + energy_filter.type = 'energy' + energy_filter.bins = np.array([0, 0.625e-6, 20.]) + + # Instantiate the Tally + tally = openmc.Tally(name='mesh tally') + tally.add_filter(mesh_filter) + tally.add_filter(energy_filter) + tally.add_score('fission') + tally.add_score('nu-fission') + + # Add mesh and Tally to TalliesFile + tallies_file.add_mesh(mesh) + tallies_file.add_tally(tally) + +Instantiate a cell Tally with nuclides + +.. code:: python + + # Instantiate tally Filter + cell_filter = openmc.Filter(type='cell', bins=[fuel_cell.id]) + + # Instantiate the tally + tally = openmc.Tally(name='cell tally') + tally.add_filter(cell_filter) + tally.add_score('scatter-y2') + tally.add_nuclide(u235) + tally.add_nuclide(u238) + + # Add mesh and tally to TalliesFile + tallies_file.add_tally(tally) + +Create a "distribcell" Tally. The distribcell filter allows us to tally +multiple repeated instances of the same cell throughout the geometry. + +.. code:: python + + # Instantiate tally Filter + distribcell_filter = openmc.Filter(type='distribcell', bins=[moderator_cell.id]) + + # Instantiate tally Trigger for kicks + trigger = openmc.Trigger(trigger_type='std_dev', threshold=5e-5) + trigger.add_score('absorption') + + # Instantiate the Tally + tally = openmc.Tally(name='distribcell tally') + tally.add_filter(distribcell_filter) + tally.add_score('absorption') + tally.add_score('scatter') + tally.add_trigger(trigger) + + # Add mesh and tally to TalliesFile + tallies_file.add_tally(tally) + +.. code:: python + + # Export to "tallies.xml" + tallies_file.export_to_xml() + +Now we a have a complete set of inputs, so we can go ahead and run our +simulation. + +.. code:: python + + # Remove old HDF5 (summary, statepoint) files + !rm statepoint.* + + # Run OpenMC with MPI! + executor.run_simulation() + + +.. parsed-literal:: + + + .d88888b. 888b d888 .d8888b. + d88P" "Y88b 8888b d8888 d88P Y88b + 888 888 88888b.d88888 888 888 + 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 + 888 888 888 "88b d8P Y8b 888 "88b 888 Y888P 888 888 + 888 888 888 888 88888888 888 888 888 Y8P 888 888 888 + Y88b. .d88P 888 d88P Y8b. 888 888 888 " 888 Y88b d88P + "Y88888P" 88888P" "Y8888 888 888 888 888 "Y8888P" + __________________888______________________________________________________ + 888 + 888 + + Copyright: 2011-2015 Massachusetts Institute of Technology + License: http://mit-crpg.github.io/openmc/license.html + Version: 0.7.0 + Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366 + Date/Time: 2015-10-28 20:55:18 + MPI Processes: 1 + + =========================================================================== + ========================> INITIALIZATION <========================= + =========================================================================== + + Reading settings XML file... + Reading cross sections XML file... + Reading geometry XML file... + Reading materials XML file... + Reading tallies XML file... + Building neighboring cells lists for each surface... + Loading ACE cross section table: 92235.71c + Loading ACE cross section table: 92238.71c + Loading ACE cross section table: 8016.71c + Loading ACE cross section table: 1001.71c + Loading ACE cross section table: 5010.71c + Loading ACE cross section table: 40090.71c + Maximum neutron transport energy: 20.0000 MeV for 92235.71c + Initializing source particles... + + =========================================================================== + ====================> K EIGENVALUE SIMULATION <==================== + =========================================================================== + + Bat./Gen. k Average k + ========= ======== ==================== + 1/1 0.54958 + 2/1 0.67628 + 3/1 0.70618 + 4/1 0.66601 + 5/1 0.70876 + 6/1 0.69708 + 7/1 0.68623 0.69166 +/- 0.00543 + 8/1 0.69159 0.69163 +/- 0.00313 + 9/1 0.69908 0.69349 +/- 0.00289 + 10/1 0.63865 0.68253 +/- 0.01120 + 11/1 0.65439 0.67784 +/- 0.01027 + 12/1 0.68518 0.67889 +/- 0.00875 + 13/1 0.69507 0.68091 +/- 0.00784 + 14/1 0.70129 0.68317 +/- 0.00728 + 15/1 0.71336 0.68619 +/- 0.00717 + 16/1 0.68725 0.68629 +/- 0.00649 + 17/1 0.72579 0.68958 +/- 0.00678 + 18/1 0.67149 0.68819 +/- 0.00639 + 19/1 0.67771 0.68744 +/- 0.00596 + 20/1 0.68035 0.68697 +/- 0.00557 + Triggers unsatisfied, max unc./thresh. is 1.09851 for absorption in tally 10002 + The estimated number of batches is 24 + Creating state point statepoint.020.h5... + 21/1 0.68105 0.68660 +/- 0.00522 + 22/1 0.67168 0.68572 +/- 0.00498 + 23/1 0.67520 0.68514 +/- 0.00473 + 24/1 0.67940 0.68483 +/- 0.00449 + Triggers satisfied for batch 24 + Creating state point statepoint.024.h5... + + =========================================================================== + ======================> SIMULATION FINISHED <====================== + =========================================================================== + + + =======================> TIMING STATISTICS <======================= + + Total time for initialization = 7.3800E-01 seconds + Reading cross sections = 1.5600E-01 seconds + Total time in simulation = 1.5998E+01 seconds + Time in transport only = 1.5965E+01 seconds + Time in inactive batches = 2.3990E+00 seconds + Time in active batches = 1.3599E+01 seconds + Time synchronizing fission bank = 3.0000E-03 seconds + Sampling source sites = 1.0000E-03 seconds + SEND/RECV source sites = 2.0000E-03 seconds + Time accumulating tallies = 3.0000E-03 seconds + Total time for finalization = 0.0000E+00 seconds + Total time elapsed = 1.6754E+01 seconds + Calculation Rate (inactive) = 5210.50 neutrons/second + Calculation Rate (active) = 2757.56 neutrons/second + + ============================> RESULTS <============================ + + k-effective (Collision) = 0.68264 +/- 0.00405 + k-effective (Track-length) = 0.68483 +/- 0.00449 + k-effective (Absorption) = 0.68225 +/- 0.00336 + Combined k-effective = 0.68275 +/- 0.00346 + Leakage Fraction = 0.34345 +/- 0.00167 + + + + + +.. parsed-literal:: + + 0 + + + +Tally Data Processing +--------------------- + +.. code:: python + + # We do not know how many batches were needed to satisfy the + # tally trigger(s), so find the statepoint file(s) + statepoints = glob.glob('statepoint.*.h5') + + # Load the last statepoint file + sp = StatePoint(statepoints[-1]) + +.. code:: python + + # Load the summary file and link with statepoint + su = Summary('summary.h5') + sp.link_with_summary(su) + +**Analyze the mesh fission rate tally** + +.. code:: python + + # Find the mesh tally with the StatePoint API + tally = sp.get_tally(name='mesh tally') + + # Print a little info about the mesh tally to the screen + print(tally) + + +.. parsed-literal:: + + Tally + ID = 10000 + Name = mesh tally + Filters = + mesh [1] + energy [ 0.00000000e+00 6.25000000e-07 2.00000000e+01] + Nuclides = total + Scores = [u'fission', u'nu-fission'] + Estimator = tracklength + + + +Use the new Tally data retrieval API with pure NumPy + +.. code:: python + + # Get the relative error for the thermal fission reaction + # rates in the four corner pins + data = tally.get_values(scores=['fission'], filters=['mesh', 'energy'], \ + filter_bins=[((1,1),(1,17), (17,1), (17,17)), \ + ((0., 0.625e-6),)], value='rel_err') + print(data) + + +.. parsed-literal:: + + [[[ 0.18257268]] + + [[ 0.07111957]] + + [[ 0.40880276]] + + [[ 0.16407535]]] + + +.. code:: python + + # Get a pandas dataframe for the mesh tally data + df = tally.get_pandas_dataframe(nuclides=False) + + # Print the first twenty rows in the dataframe + df.head(20) + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mesh 1energy [MeV]scoremeanstd. dev.
xyz
0111(0.0e+00 - 6.3e-07)fission0.0002020.000037
1111(0.0e+00 - 6.3e-07)nu-fission0.0004920.000090
2111(6.3e-07 - 2.0e+01)fission0.0000760.000004
3111(6.3e-07 - 2.0e+01)nu-fission0.0002040.000010
4121(0.0e+00 - 6.3e-07)fission0.0003750.000039
5121(0.0e+00 - 6.3e-07)nu-fission0.0009140.000094
6121(6.3e-07 - 2.0e+01)fission0.0001070.000013
7121(6.3e-07 - 2.0e+01)nu-fission0.0002780.000032
8131(0.0e+00 - 6.3e-07)fission0.0005640.000056
9131(0.0e+00 - 6.3e-07)nu-fission0.0013740.000137
10131(6.3e-07 - 2.0e+01)fission0.0001490.000007
11131(6.3e-07 - 2.0e+01)nu-fission0.0003880.000018
12141(0.0e+00 - 6.3e-07)fission0.0006690.000044
13141(0.0e+00 - 6.3e-07)nu-fission0.0016310.000108
14141(6.3e-07 - 2.0e+01)fission0.0001650.000011
15141(6.3e-07 - 2.0e+01)nu-fission0.0004330.000029
16151(0.0e+00 - 6.3e-07)fission0.0009320.000069
17151(0.0e+00 - 6.3e-07)nu-fission0.0022700.000168
18151(6.3e-07 - 2.0e+01)fission0.0001830.000011
19151(6.3e-07 - 2.0e+01)nu-fission0.0004770.000028
+
+ + + +.. code:: python + + # Create a boxplot to view the distribution of + # fission and nu-fission rates in the pins + bp = df.boxplot(column='mean', by='score') + + + +.. image:: pandas-dataframes-content_files/pandas-dataframes-content_46_0.png + + +.. code:: python + + # Extract thermal nu-fission rates from pandas + fiss = df[df['score'] == 'nu-fission'] + fiss = fiss[fiss['energy [MeV]'] == '(0.0e+00 - 6.3e-07)'] + + # Extract mean and reshape as 2D NumPy arrays + mean = fiss['mean'].reshape((17,17)) + + pylab.imshow(mean, interpolation='nearest') + pylab.title('fission rate') + pylab.xlabel('x') + pylab.ylabel('y') + pylab.colorbar() + + + + +.. parsed-literal:: + + + + + + +.. image:: pandas-dataframes-content_files/pandas-dataframes-content_47_1.png + + +**Analyze the cell+nuclides scatter-y2 rate tally** + +.. code:: python + + # Find the cell Tally with the StatePoint API + tally = sp.get_tally(name='cell tally') + + # Print a little info about the cell tally to the screen + print(tally) + + +.. parsed-literal:: + + Tally + ID = 10001 + Name = cell tally + Filters = + cell [10000] + Nuclides = U-235 U-238 + Scores = [u'scatter-Y0,0', u'scatter-Y1,-1', u'scatter-Y1,0', u'scatter-Y1,1', u'scatter-Y2,-2', u'scatter-Y2,-1', u'scatter-Y2,0', u'scatter-Y2,1', u'scatter-Y2,2'] + Estimator = analog + + + +.. code:: python + + # Get a pandas dataframe for the cell tally data + df = tally.get_pandas_dataframe() + + # Print the first twenty rows in the dataframe + df.head(100) + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellnuclidescoremeanstd. dev.
010000U-235scatter-Y0,00.0370950.001150
110000U-235scatter-Y1,-10.0002660.000323
210000U-235scatter-Y1,0-0.0004170.000274
310000U-235scatter-Y1,1-0.0002280.000237
410000U-235scatter-Y2,-20.0000260.000199
510000U-235scatter-Y2,-1-0.0001150.000185
610000U-235scatter-Y2,00.0001510.000159
710000U-235scatter-Y2,1-0.0001220.000280
810000U-235scatter-Y2,20.0000080.000181
910000U-238scatter-Y0,02.3286320.013107
1010000U-238scatter-Y1,-10.0245300.002272
1110000U-238scatter-Y1,0-0.0000590.002804
1210000U-238scatter-Y1,1-0.0279900.002536
1310000U-238scatter-Y2,-2-0.0048610.001575
1410000U-238scatter-Y2,-10.0005570.002018
1510000U-238scatter-Y2,00.0062360.001627
1610000U-238scatter-Y2,1-0.0006480.001551
1710000U-238scatter-Y2,2-0.0010310.001310
+
+ + + +Use the new Tally data retrieval API with pure NumPy + +.. code:: python + + # Get the standard deviations for two of the spherical harmonic + # scattering reaction rates + data = tally.get_values(scores=['scatter-Y2,2', 'scatter-Y0,0'], + nuclides=['U-238', 'U-235'], value='std_dev') + print(data) + + +.. parsed-literal:: + + [[[ 0.00131009 0.01310707] + [ 0.00018089 0.00114976]]] + + +**Analyze the distribcell tally** + +.. code:: python + + # Find the distribcell Tally with the StatePoint API + tally = sp.get_tally(name='distribcell tally') + + # Print a little info about the distribcell tally to the screen + print(tally) + + +.. parsed-literal:: + + Tally + ID = 10002 + Name = distribcell tally + Filters = + distribcell [10002] + Nuclides = total + Scores = [u'absorption', u'scatter'] + Estimator = tracklength + + + +Use the new Tally data retrieval API with pure NumPy + +.. code:: python + + # Get the relative error for the scattering reaction rates in + # the first 30 distribcell instances + data = tally.get_values(scores=['scatter'], filters=['distribcell'], + filter_bins=[(i,) for i in range(10)], value='rel_err') + print(data) + + +.. parsed-literal:: + + [[[ 0.04537029]]] + + +Print the distribcell tally dataframe **without** OpenCG info + +.. code:: python + + # Get a pandas dataframe for the distribcell tally data + df = tally.get_pandas_dataframe(nuclides=False) + + # Print the last twenty rows in the dataframe + df.tail(20) + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
distribcellscoremeanstd. dev.
558279absorption0.0000930.000013
559279scatter0.0135040.000805
560280absorption0.0000840.000010
561280scatter0.0142150.000612
562281absorption0.0000910.000008
563281scatter0.0145450.000590
564282absorption0.0001120.000012
565282scatter0.0163210.000729
566283absorption0.0000920.000007
567283scatter0.0161630.000661
568284absorption0.0001040.000011
569284scatter0.0173840.000599
570285absorption0.0001110.000011
571285scatter0.0180150.000774
572286absorption0.0001250.000012
573286scatter0.0182940.000828
574287absorption0.0001190.000013
575287scatter0.0174830.000757
576288absorption0.0001130.000014
577288scatter0.0182480.000782
+
+ + + +Print the distribcell tally dataframe **with** OpenCG info + +.. code:: python + + # Get a pandas dataframe for the distribcell tally data + df = tally.get_pandas_dataframe(summary=su, nuclides=False) + + # Print the last twenty rows in the dataframe + df.head(20) + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
level 1level 2level 3distribcellscoremeanstd. dev.
cellunivlatcelluniv
idididxyzidid
01000301000100010002100000absorption0.0001230.000012
11000301000100010002100000scatter0.0178050.000808
21000301000110010002100001absorption0.0002170.000020
31000301000110010002100001scatter0.0288670.001263
41000301000120010002100002absorption0.0003180.000020
51000301000120010002100002scatter0.0404930.001269
61000301000130010002100003absorption0.0003860.000018
71000301000130010002100003scatter0.0485760.001337
81000301000140010002100004absorption0.0005010.000026
91000301000140010002100004scatter0.0570630.001715
101000301000150010002100005absorption0.0004840.000026
111000301000150010002100005scatter0.0608220.001581
121000301000160010002100006absorption0.0005320.000039
131000301000160010002100006scatter0.0691010.002249
141000301000170010002100007absorption0.0005770.000039
151000301000170010002100007scatter0.0767220.002335
161000301000180010002100008absorption0.0006490.000039
171000301000180010002100008scatter0.0815640.001610
181000301000190010002100009absorption0.0006800.000032
191000301000190010002100009scatter0.0877150.001959
+
+ + + +.. code:: python + + # Show summary statistics for absorption distribcell tally data + absorption = df[df['score'] == 'absorption'] + absorption[['mean', 'std. dev.']].dropna().describe() + + # Note that the maximum standard deviation does indeed + # meet the 5e-4 threshold set by the tally trigger + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
meanstd. dev.
count289.000000289.000000
mean0.0004180.000022
std0.0002390.000009
min0.0000180.000004
25%0.0002020.000015
50%0.0004020.000021
75%0.0006150.000027
max0.0008920.000044
+
+ + + +Perform a statistical test comparing the tally sample distributions for +two categories of fuel pins. + +.. code:: python + + # Extract tally data from pins in the pins divided along y=x diagonal + multi_index = ('level 2', 'lat',) + lower = df[df[multi_index + ('x',)] + df[multi_index + ('y',)] < 16] + upper = df[df[multi_index + ('x',)] + df[multi_index + ('y',)] > 16] + lower = lower[lower['score'] == 'absorption'] + upper = upper[upper['score'] == 'absorption'] + + # Perform non-parametric Mann-Whitney U Test to see if the + # absorption rates (may) come from same sampling distribution + u, p = scipy.stats.mannwhitneyu(lower['mean'], upper['mean']) + print('Mann-Whitney Test p-value: {0}'.format(p)) + + +.. parsed-literal:: + + Mann-Whitney Test p-value: 0.414863173548 + + +Note that the symmetry implied by the y=x diagonal ensures that the two +sampling distributions are identical. Indeed, as illustrated by the test +above, for any reasonable significance level (*e.g.*, +:math:`\alpha`\ =0.05) one would **not reject** the null hypothesis that +the two sampling distributions are identical. + +Next, perform the same test but with two groupings of pins which are not +symmetrically identical to one another. + +.. code:: python + + # Extract tally data from pins in the pins divided along y=-x diagonal + multi_index = ('level 2', 'lat',) + lower = df[df[multi_index + ('x',)] > df[multi_index + ('y',)]] + upper = df[df[multi_index + ('x',)] < df[multi_index + ('y',)]] + lower = lower[lower['score'] == 'absorption'] + upper = upper[upper['score'] == 'absorption'] + + # Perform non-parametric Mann-Whitney U Test to see if the + # absorption rates (may) come from same sampling distribution + u, p = scipy.stats.mannwhitneyu(lower['mean'], upper['mean']) + print('Mann-Whitney Test p-value: {0}'.format(p)) + + +.. parsed-literal:: + + Mann-Whitney Test p-value: 3.28554363741e-42 + + +Note that the asymmetry implied by the y=-x diagonal ensures that the +two sampling distributions are *not* identical. Indeed, as illustrated +by the test above, for any reasonable significance level (*e.g.*, +:math:`\alpha`\ =0.05) one would **reject** the null hypothesis that the +two sampling distributions are identical. + +.. code:: python + + # Extract the scatter tally data from pandas + scatter = df[df['score'] == 'scatter'] + + scatter['rel. err.'] = scatter['std. dev.'] / scatter['mean'] + + # Show a scatter plot of the mean vs. the std. dev. + scatter.plot(kind='scatter', x='mean', y='rel. err.', title='Scattering Rates') + + +.. parsed-literal:: + + /usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:4: SettingWithCopyWarning: + A value is trying to be set on a copy of a slice from a DataFrame. + Try using .loc[row_indexer,col_indexer] = value instead + + See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy + + + + +.. parsed-literal:: + + + + + + +.. image:: pandas-dataframes-content_files/pandas-dataframes-content_67_2.png + + +.. code:: python + + # Plot a histogram and kernel density estimate for the scattering rates + scatter['mean'].plot(kind='hist', bins=25) + scatter['mean'].plot(kind='kde') + pylab.title('Scattering Rates') + pylab.xlabel('Mean') + pylab.legend(['KDE', 'Histogram']) + + + + +.. parsed-literal:: + + + + + + +.. image:: pandas-dataframes-content_files/pandas-dataframes-content_68_1.png + diff --git a/_sources/pythonapi/examples/post-processing-content.txt b/_sources/pythonapi/examples/post-processing-content.txt new file mode 100644 index 0000000000..660b3f3b06 --- /dev/null +++ b/_sources/pythonapi/examples/post-processing-content.txt @@ -0,0 +1,767 @@ + +This notebook demonstrates some basic post-processing tasks that can be +performed with the Python API, such as plotting a 2D mesh tally and +plotting neutron source sites from an eigenvalue calculation. The +problem we will use is a simple reflected pin-cell. + +.. code:: python + + from IPython.display import Image + import numpy as np + import matplotlib.pyplot as plt + + import openmc + from openmc.statepoint import StatePoint + + %matplotlib inline + +Generate Input Files +-------------------- + +First we need to define materials that will be used in the problem. +Before defining a material, we must create nuclides that are used in the +material. + +.. code:: python + + # Instantiate some Nuclides + h1 = openmc.Nuclide('H-1') + b10 = openmc.Nuclide('B-10') + o16 = openmc.Nuclide('O-16') + u235 = openmc.Nuclide('U-235') + u238 = openmc.Nuclide('U-238') + zr90 = openmc.Nuclide('Zr-90') + +With the nuclides we defined, we will now create three materials for the +fuel, water, and cladding of the fuel pin. + +.. code:: python + + # 1.6 enriched fuel + fuel = openmc.Material(name='1.6% Fuel') + fuel.set_density('g/cm3', 10.31341) + fuel.add_nuclide(u235, 3.7503e-4) + fuel.add_nuclide(u238, 2.2625e-2) + fuel.add_nuclide(o16, 4.6007e-2) + + # borated water + water = openmc.Material(name='Borated Water') + water.set_density('g/cm3', 0.740582) + water.add_nuclide(h1, 4.9457e-2) + water.add_nuclide(o16, 2.4732e-2) + water.add_nuclide(b10, 8.0042e-6) + + # zircaloy + zircaloy = openmc.Material(name='Zircaloy') + zircaloy.set_density('g/cm3', 6.55) + zircaloy.add_nuclide(zr90, 7.2758e-3) + +With our three materials, we can now create a materials file object that +can be exported to an actual XML file. + +.. code:: python + + # Instantiate a MaterialsFile, add Materials + materials_file = openmc.MaterialsFile() + materials_file.add_material(fuel) + materials_file.add_material(water) + materials_file.add_material(zircaloy) + materials_file.default_xs = '71c' + + # Export to "materials.xml" + materials_file.export_to_xml() + +Now let's move on to the geometry. Our problem will have three regions +for the fuel, the clad, and the surrounding coolant. The first step is +to create the bounding surfaces -- in this case two cylinders and six +reflective planes. + +.. code:: python + + # Create cylinders for the fuel and clad + fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218) + clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720) + + # Create boundary planes to surround the geometry + # Use both reflective and vacuum boundaries to make life interesting + min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective') + max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective') + min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective') + max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective') + min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective') + max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective') + +With the surfaces defined, we can now create cells that are defined by +intersections of half-spaces created by the surfaces. + +.. code:: python + + # Create a Universe to encapsulate a fuel pin + pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin') + + # Create fuel Cell + fuel_cell = openmc.Cell(name='1.6% Fuel') + fuel_cell.fill = fuel + fuel_cell.region = -fuel_outer_radius + pin_cell_universe.add_cell(fuel_cell) + + # Create a clad Cell + clad_cell = openmc.Cell(name='1.6% Clad') + clad_cell.fill = zircaloy + clad_cell.region = +fuel_outer_radius & -clad_outer_radius + pin_cell_universe.add_cell(clad_cell) + + # Create a moderator Cell + moderator_cell = openmc.Cell(name='1.6% Moderator') + moderator_cell.fill = water + moderator_cell.region = +clad_outer_radius + pin_cell_universe.add_cell(moderator_cell) + +OpenMC requires that there is a "root" universe. Let us create a root +cell that is filled by the pin cell universe and then assign it to the +root universe. + +.. code:: python + + # Create root Cell + root_cell = openmc.Cell(name='root cell') + root_cell.fill = pin_cell_universe + + # Add boundary planes + root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z + + # Create root Universe + root_universe = openmc.Universe(universe_id=0, name='root universe') + root_universe.add_cell(root_cell) + +We now must create a geometry that is assigned a root universe, put the +geometry into a geometry file, and export it to XML. + +.. code:: python + + # Create Geometry and set root Universe + geometry = openmc.Geometry() + geometry.root_universe = root_universe + +.. code:: python + + # Instantiate a GeometryFile + geometry_file = openmc.GeometryFile() + geometry_file.geometry = geometry + + # Export to "geometry.xml" + geometry_file.export_to_xml() + +With the geometry and materials finished, we now just need to define +simulation parameters. In this case, we will use 10 inactive batches and +90 active batches each with 5000 particles. + +.. code:: python + + # OpenMC simulation parameters + batches = 100 + inactive = 10 + particles = 5000 + + # Instantiate a SettingsFile + settings_file = openmc.SettingsFile() + settings_file.batches = batches + settings_file.inactive = inactive + settings_file.particles = particles + source_bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63] + settings_file.set_source_space('box', source_bounds) + + # Export to "settings.xml" + settings_file.export_to_xml() + +Let us also create a plot file that we can use to verify that our pin +cell geometry was created successfully. + +.. code:: python + + # Instantiate a Plot + plot = openmc.Plot(plot_id=1) + plot.filename = 'materials-xy' + plot.origin = [0, 0, 0] + plot.width = [1.26, 1.26] + plot.pixels = [250, 250] + plot.color = 'mat' + + # Instantiate a PlotsFile, add Plot, and export to "plots.xml" + plot_file = openmc.PlotsFile() + plot_file.add_plot(plot) + plot_file.export_to_xml() + +With the plots.xml file, we can now generate and view the plot. OpenMC +outputs plots in .ppm format, which can be converted into a compressed +format like .png with the convert utility. + +.. code:: python + + # Run openmc in plotting mode + executor = openmc.Executor() + executor.plot_geometry(output=False) + + + + +.. parsed-literal:: + + 0 + + + +.. code:: python + + # Convert OpenMC's funky ppm to png + !convert materials-xy.ppm materials-xy.png + + # Display the materials plot inline + Image(filename='materials-xy.png') + + + + +.. image:: post-processing-content_files/post-processing-content_24_0.png + + + +As we can see from the plot, we have a nice pin cell with fuel, +cladding, and water! Before we run our simulation, we need to tell the +code what we want to tally. The following code shows how to create a 2D +mesh tally. + +.. code:: python + + # Instantiate an empty TalliesFile + tallies_file = openmc.TalliesFile() + +.. code:: python + + # Create mesh which will be used for tally + mesh = openmc.Mesh() + mesh.dimension = [100, 100] + mesh.lower_left = [-0.63, -0.63] + mesh.upper_right = [0.63, 0.63] + tallies_file.add_mesh(mesh) + + # Create mesh filter for tally + mesh_filter = openmc.Filter(type='mesh', bins=[1]) + mesh_filter.mesh = mesh + + # Create mesh tally to score flux and fission rate + tally = openmc.Tally(name='flux') + tally.add_filter(mesh_filter) + tally.add_score('flux') + tally.add_score('fission') + tallies_file.add_tally(tally) + +.. code:: python + + # Export to "tallies.xml" + tallies_file.export_to_xml() + +Now we a have a complete set of inputs, so we can go ahead and run our +simulation. + +.. code:: python + + # Run OpenMC! + executor.run_simulation() + + +.. parsed-literal:: + + + .d88888b. 888b d888 .d8888b. + d88P" "Y88b 8888b d8888 d88P Y88b + 888 888 88888b.d88888 888 888 + 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 + 888 888 888 "88b d8P Y8b 888 "88b 888 Y888P 888 888 + 888 888 888 888 88888888 888 888 888 Y8P 888 888 888 + Y88b. .d88P 888 d88P Y8b. 888 888 888 " 888 Y88b d88P + "Y88888P" 88888P" "Y8888 888 888 888 888 "Y8888P" + __________________888______________________________________________________ + 888 + 888 + + Copyright: 2011-2015 Massachusetts Institute of Technology + License: http://mit-crpg.github.io/openmc/license.html + Version: 0.7.0 + Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca + Date/Time: 2015-11-29 16:46:53 + MPI Processes: 1 + + =========================================================================== + ========================> INITIALIZATION <========================= + =========================================================================== + + Reading settings XML file... + Reading cross sections XML file... + Reading geometry XML file... + Reading materials XML file... + Reading tallies XML file... + Building neighboring cells lists for each surface... + Loading ACE cross section table: 92235.71c + Loading ACE cross section table: 92238.71c + Loading ACE cross section table: 8016.71c + Loading ACE cross section table: 1001.71c + Loading ACE cross section table: 5010.71c + Loading ACE cross section table: 40090.71c + Maximum neutron transport energy: 20.0000 MeV for 92235.71c + Initializing source particles... + + =========================================================================== + ====================> K EIGENVALUE SIMULATION <==================== + =========================================================================== + + Bat./Gen. k Average k + ========= ======== ==================== + 1/1 1.04894 + 2/1 1.01711 + 3/1 1.05357 + 4/1 1.03052 + 5/1 1.06523 + 6/1 1.06806 + 7/1 1.05161 + 8/1 1.04199 + 9/1 1.05010 + 10/1 1.04617 + 11/1 1.04894 + 12/1 1.06806 1.05850 +/- 0.00956 + 13/1 1.05002 1.05567 +/- 0.00620 + 14/1 1.03471 1.05043 +/- 0.00683 + 15/1 1.01803 1.04395 +/- 0.00837 + 16/1 1.05588 1.04594 +/- 0.00712 + 17/1 1.07503 1.05010 +/- 0.00731 + 18/1 1.02786 1.04732 +/- 0.00691 + 19/1 1.00071 1.04214 +/- 0.00800 + 20/1 1.05587 1.04351 +/- 0.00729 + 21/1 1.03886 1.04309 +/- 0.00660 + 22/1 1.04335 1.04311 +/- 0.00603 + 23/1 1.04057 1.04292 +/- 0.00555 + 24/1 1.01976 1.04126 +/- 0.00540 + 25/1 1.05811 1.04238 +/- 0.00515 + 26/1 1.02351 1.04120 +/- 0.00496 + 27/1 1.05261 1.04188 +/- 0.00471 + 28/1 1.03355 1.04141 +/- 0.00446 + 29/1 1.02797 1.04071 +/- 0.00428 + 30/1 1.03758 1.04055 +/- 0.00406 + 31/1 1.04883 1.04094 +/- 0.00388 + 32/1 1.03557 1.04070 +/- 0.00371 + 33/1 1.02947 1.04021 +/- 0.00358 + 34/1 1.03651 1.04006 +/- 0.00343 + 35/1 1.03331 1.03979 +/- 0.00330 + 36/1 1.05947 1.04054 +/- 0.00326 + 37/1 1.05093 1.04093 +/- 0.00316 + 38/1 1.06787 1.04189 +/- 0.00319 + 39/1 1.01451 1.04095 +/- 0.00322 + 40/1 1.02351 1.04037 +/- 0.00317 + 41/1 1.04826 1.04062 +/- 0.00307 + 42/1 1.04228 1.04067 +/- 0.00298 + 43/1 1.03214 1.04041 +/- 0.00290 + 44/1 1.04950 1.04068 +/- 0.00282 + 45/1 1.06616 1.04141 +/- 0.00284 + 46/1 1.07039 1.04221 +/- 0.00287 + 47/1 1.00292 1.04115 +/- 0.00299 + 48/1 1.04477 1.04125 +/- 0.00291 + 49/1 1.03360 1.04105 +/- 0.00284 + 50/1 1.04783 1.04122 +/- 0.00277 + 51/1 1.03985 1.04119 +/- 0.00271 + 52/1 1.02507 1.04080 +/- 0.00267 + 53/1 1.03477 1.04066 +/- 0.00261 + 54/1 1.00412 1.03983 +/- 0.00268 + 55/1 1.02239 1.03945 +/- 0.00265 + 56/1 1.04308 1.03952 +/- 0.00259 + 57/1 1.05534 1.03986 +/- 0.00256 + 58/1 1.06667 1.04042 +/- 0.00257 + 59/1 1.06458 1.04091 +/- 0.00256 + 60/1 1.00304 1.04015 +/- 0.00262 + 61/1 1.05038 1.04036 +/- 0.00258 + 62/1 1.02904 1.04014 +/- 0.00254 + 63/1 1.00249 1.03943 +/- 0.00259 + 64/1 1.01779 1.03903 +/- 0.00257 + 65/1 1.05335 1.03929 +/- 0.00254 + 66/1 1.06231 1.03970 +/- 0.00253 + 67/1 1.02382 1.03942 +/- 0.00250 + 68/1 1.03796 1.03939 +/- 0.00245 + 69/1 1.03672 1.03935 +/- 0.00241 + 70/1 1.02926 1.03918 +/- 0.00238 + 71/1 1.05834 1.03950 +/- 0.00236 + 72/1 1.04332 1.03956 +/- 0.00232 + 73/1 1.05613 1.03982 +/- 0.00230 + 74/1 1.01963 1.03950 +/- 0.00228 + 75/1 1.02228 1.03924 +/- 0.00226 + 76/1 1.04842 1.03938 +/- 0.00223 + 77/1 1.02157 1.03911 +/- 0.00222 + 78/1 1.02810 1.03895 +/- 0.00219 + 79/1 1.05030 1.03912 +/- 0.00216 + 80/1 1.02391 1.03890 +/- 0.00214 + 81/1 1.02488 1.03870 +/- 0.00212 + 82/1 1.04957 1.03885 +/- 0.00210 + 83/1 1.03499 1.03880 +/- 0.00207 + 84/1 1.05922 1.03907 +/- 0.00206 + 85/1 1.05898 1.03934 +/- 0.00205 + 86/1 1.02242 1.03912 +/- 0.00204 + 87/1 1.03278 1.03904 +/- 0.00201 + 88/1 1.06134 1.03932 +/- 0.00201 + 89/1 1.04521 1.03940 +/- 0.00198 + 90/1 1.04277 1.03944 +/- 0.00196 + 91/1 1.04214 1.03947 +/- 0.00193 + 92/1 1.05610 1.03967 +/- 0.00192 + 93/1 1.04531 1.03974 +/- 0.00190 + 94/1 1.01534 1.03945 +/- 0.00190 + 95/1 1.03971 1.03945 +/- 0.00187 + 96/1 1.07183 1.03983 +/- 0.00189 + 97/1 1.07214 1.04020 +/- 0.00191 + 98/1 1.03710 1.04017 +/- 0.00188 + 99/1 1.02532 1.04000 +/- 0.00187 + 100/1 1.03965 1.04000 +/- 0.00185 + Creating state point statepoint.100.h5... + + =========================================================================== + ======================> SIMULATION FINISHED <====================== + =========================================================================== + + + =======================> TIMING STATISTICS <======================= + + Total time for initialization = 3.7900E-01 seconds + Reading cross sections = 8.7000E-02 seconds + Total time in simulation = 2.2064E+02 seconds + Time in transport only = 2.2060E+02 seconds + Time in inactive batches = 8.7100E+00 seconds + Time in active batches = 2.1193E+02 seconds + Time synchronizing fission bank = 1.4000E-02 seconds + Sampling source sites = 8.0000E-03 seconds + SEND/RECV source sites = 2.0000E-03 seconds + Time accumulating tallies = 1.3000E-02 seconds + Total time for finalization = 1.6600E-01 seconds + Total time elapsed = 2.2120E+02 seconds + Calculation Rate (inactive) = 5740.53 neutrons/second + Calculation Rate (active) = 2123.37 neutrons/second + + ============================> RESULTS <============================ + + k-effective (Collision) = 1.03912 +/- 0.00160 + k-effective (Track-length) = 1.04000 +/- 0.00185 + k-effective (Absorption) = 1.04240 +/- 0.00156 + Combined k-effective = 1.04078 +/- 0.00127 + Leakage Fraction = 0.00000 +/- 0.00000 + + + + + +.. parsed-literal:: + + 0 + + + +Tally Data Processing +--------------------- + +Our simulation ran successfully and created a statepoint file with all +the tally data in it. We begin our analysis here loading the statepoint +file and 'reading' the results. By default, data from the statepoint +file is only read into memory when it is requested. This helps keep the +memory use to a minimum even when a statepoint file may be huge. + +.. code:: python + + # Load the statepoint file + sp = StatePoint('statepoint.100.h5') + +Next we need to get the tally, which can be done with the +``StatePoint.get_tally(...)`` method. + +.. code:: python + + tally = sp.get_tally(scores=['flux']) + print(tally) + + +.. parsed-literal:: + + Tally + ID = 10000 + Name = + Filters = + mesh [10000] + Nuclides = total + Scores = [u'flux', u'fission'] + Estimator = tracklength + + + +The statepoint file actually stores the sum and sum-of-squares for each +tally bin from which the mean and variance can be calculated as +described +`here `__. +The sum and sum-of-squares can be accessed using the ``sum`` and +``sum_sq`` properties: + +.. code:: python + + tally.sum + + + + +.. parsed-literal:: + + array([[[ 0.4107676 , 0. ]], + + [[ 0.40849402, 0. ]], + + [[ 0.41014343, 0. ]], + + ..., + [[ 0.41049467, 0. ]], + + [[ 0.40982242, 0. ]], + + [[ 0.40996987, 0. ]]]) + + + +However, the mean and standard deviation of the mean are usually what +you are more interested in. The Tally class also has properties ``mean`` +and ``std_dev`` which automatically calculate these statistics +on-the-fly. + +.. code:: python + + print(tally.mean.shape) + (tally.mean, tally.std_dev) + + +.. parsed-literal:: + + (10000, 1, 2) + + + + +.. parsed-literal:: + + (array([[[ 0.00456408, 0. ]], + + [[ 0.00453882, 0. ]], + + [[ 0.00455715, 0. ]], + + ..., + [[ 0.00456105, 0. ]], + + [[ 0.00455358, 0. ]], + + [[ 0.00455522, 0. ]]]), + array([[[ 1.95085625e-05, 0.00000000e+00]], + + [[ 1.78129859e-05, 0.00000000e+00]], + + [[ 1.89709648e-05, 0.00000000e+00]], + + ..., + [[ 1.56286612e-05, 0.00000000e+00]], + + [[ 1.65813279e-05, 0.00000000e+00]], + + [[ 1.67530331e-05, 0.00000000e+00]]])) + + + +The tally data has three dimensions: one for filter combinations, one +for nuclides, and one for scores. We see that there are 10000 filter +combinations (corresponding to the 100 x 100 mesh bins), a single +nuclide (since none was specified), and two scores. If we only want to +look at a single score, we can use the ``get_slice(...)`` method as +follows. + +.. code:: python + + flux = tally.get_slice(scores=['flux']) + fission = tally.get_slice(scores=['fission']) + print(flux) + + +.. parsed-literal:: + + Tally + ID = 10000 + Name = + Filters = + mesh [10000] + Nuclides = total + Scores = [u'flux'] + Estimator = tracklength + + + +To get the bins into a form that we can plot, we can simply change the +shape of the array since it is a numpy array. + +.. code:: python + + flux.std_dev.shape = (100, 100) + flux.mean.shape = (100, 100) + fission.std_dev.shape = (100, 100) + fission.mean.shape = (100, 100) + +.. code:: python + + fig = plt.subplot(121) + fig.imshow(flux.mean) + fig2 = plt.subplot(122) + fig2.imshow(fission.mean) + + + + +.. parsed-literal:: + + + + + + +.. image:: post-processing-content_files/post-processing-content_44_1.png + + +Now let's say we want to look at the distribution of relative errors of +our tally bins for flux. First we create a new variable called +``relative_error`` and set it to the ratio of the standard deviation and +the mean, being careful not to divide by zero in case some bins were +never scored to. + +.. code:: python + + # Determine relative error + relative_error = np.zeros_like(flux.std_dev) + nonzero = flux.mean > 0 + relative_error[nonzero] = flux.std_dev[nonzero] / flux.mean[nonzero] + + # distribution of relative errors + ret = plt.hist(relative_error[nonzero], bins=50) + + + +.. image:: post-processing-content_files/post-processing-content_46_0.png + + +Source Sites +------------ + +Source sites can be accessed from the ``source`` property. As shown +below, the source sites are represented as a numpy array with a +structured datatype. + +.. code:: python + + sp.source + + + + +.. parsed-literal:: + + array([ (1.0, [0.2712169917165897, -0.04844236597355761, -0.1887902218343974], [0.3889598463000694, 0.8470657529949065, 0.36220139158953857], 2.2746035619924734, 0), + (1.0, [0.080729018085932, 0.19838688738571317, -0.38053428394017363], [-0.6604834049157511, -0.6893239101986768, 0.2976478097673534], 0.7833467555325838, 0), + (1.0, [0.019430574216787868, 0.06594180627832635, 0.23329810254580194], [-0.7472138923667574, 0.13227244377548197, -0.651287493870243], 1.1632342240714935, 0), + ..., + (1.0, [0.18544614514351207, -0.0113070561851496, 0.5468392238881264], [-0.8006491411918817, 0.43855795172388223, -0.4082007786475368], 1.4358240241589555, 0), + (1.0, [0.18544614514351207, -0.0113070561851496, 0.5468392238881264], [-0.5150076397044656, -0.34922134026850293, 0.7828228321575105], 1.5771133724329802, 0), + (1.0, [-0.2722999793764598, 0.22680062445008103, 0.2987060438567475], [0.9207818175032396, -0.2884020326181676, 0.26265017063984586], 2.932342523379745, 0)], + dtype=[('wgt', ' + + + + +.. image:: post-processing-content_files/post-processing-content_53_2.png + + +Let's also look at the spatial distribution of the sites. To make the +plot a little more interesting, we can also include the direction of the +particle emitted from the source and color each source by the logarithm +of its energy. + +.. code:: python + + plt.quiver(sp.source['xyz'][:,0], sp.source['xyz'][:,1], + sp.source['uvw'][:,0], sp.source['uvw'][:,1], + np.log(sp.source['E']), cmap='jet', scale=20.0) + plt.colorbar() + plt.xlim((-0.5,0.5)) + plt.ylim((-0.5,0.5)) + + + + +.. parsed-literal:: + + (-0.5, 0.5) + + + +.. parsed-literal:: + + /usr/lib/pymodules/python2.7/matplotlib/collections.py:548: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison + if self._edgecolors == 'face': + + + +.. image:: post-processing-content_files/post-processing-content_55_2.png + diff --git a/_sources/pythonapi/examples/post-processing.txt b/_sources/pythonapi/examples/post-processing.txt new file mode 100644 index 0000000000..b488d15ffb --- /dev/null +++ b/_sources/pythonapi/examples/post-processing.txt @@ -0,0 +1,13 @@ +.. _notebook_post_processing: + +=============== +Post Processing +=============== + +.. only:: html + + .. notebook:: post-processing.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/_sources/pythonapi/examples/tally-arithmetic-content.txt b/_sources/pythonapi/examples/tally-arithmetic-content.txt new file mode 100644 index 0000000000..e79d87b54a --- /dev/null +++ b/_sources/pythonapi/examples/tally-arithmetic-content.txt @@ -0,0 +1,1127 @@ + +This notebook shows the how tallies can be combined (added, subtracted, +multiplied, etc.) using the Python API in order to create derived +tallies. Since no covariance information is obtained, it is assumed that +tallies are completely independent of one another when propagating +uncertainties. The target problem is a simple pin cell. + +**Note:** that this Notebook was created using the latest Pandas +v0.16.1. Everything in the Notebook will wun with older versions of +Pandas, but the multi-indexing option in >v0.15.0 makes the tables look +prettier. + +.. code:: python + + %load_ext autoreload + %autoreload 2 + +.. code:: python + + import glob + from IPython.display import Image + import numpy as np + + import openmc + from openmc.statepoint import StatePoint + from openmc.summary import Summary + + %matplotlib inline + +Generate Input Files +-------------------- + +First we need to define materials that will be used in the problem. +Before defining a material, we must create nuclides that are used in the +material. + +.. code:: python + + # Instantiate some Nuclides + h1 = openmc.Nuclide('H-1') + b10 = openmc.Nuclide('B-10') + o16 = openmc.Nuclide('O-16') + u235 = openmc.Nuclide('U-235') + u238 = openmc.Nuclide('U-238') + zr90 = openmc.Nuclide('Zr-90') + +With the nuclides we defined, we will now create three materials for the +fuel, water, and cladding of the fuel pin. + +.. code:: python + + # 1.6 enriched fuel + fuel = openmc.Material(name='1.6% Fuel') + fuel.set_density('g/cm3', 10.31341) + fuel.add_nuclide(u235, 3.7503e-4) + fuel.add_nuclide(u238, 2.2625e-2) + fuel.add_nuclide(o16, 4.6007e-2) + + # borated water + water = openmc.Material(name='Borated Water') + water.set_density('g/cm3', 0.740582) + water.add_nuclide(h1, 4.9457e-2) + water.add_nuclide(o16, 2.4732e-2) + water.add_nuclide(b10, 8.0042e-6) + + # zircaloy + zircaloy = openmc.Material(name='Zircaloy') + zircaloy.set_density('g/cm3', 6.55) + zircaloy.add_nuclide(zr90, 7.2758e-3) + +With our three materials, we can now create a materials file object that +can be exported to an actual XML file. + +.. code:: python + + # Instantiate a MaterialsFile, add Materials + materials_file = openmc.MaterialsFile() + materials_file.add_material(fuel) + materials_file.add_material(water) + materials_file.add_material(zircaloy) + materials_file.default_xs = '71c' + + # Export to "materials.xml" + materials_file.export_to_xml() + +Now let's move on to the geometry. Our problem will have three regions +for the fuel, the clad, and the surrounding coolant. The first step is +to create the bounding surfaces -- in this case two cylinders and six +reflective planes. + +.. code:: python + + # Create cylinders for the fuel and clad + fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218) + clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720) + + # Create boundary planes to surround the geometry + # Use both reflective and vacuum boundaries to make life interesting + min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective') + max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective') + min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective') + max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective') + min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective') + max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective') + +With the surfaces defined, we can now create cells that are defined by +intersections of half-spaces created by the surfaces. + +.. code:: python + + # Create a Universe to encapsulate a fuel pin + pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin') + + # Create fuel Cell + fuel_cell = openmc.Cell(name='1.6% Fuel') + fuel_cell.fill = fuel + fuel_cell.region = -fuel_outer_radius + pin_cell_universe.add_cell(fuel_cell) + + # Create a clad Cell + clad_cell = openmc.Cell(name='1.6% Clad') + clad_cell.fill = zircaloy + clad_cell.region = +fuel_outer_radius & -clad_outer_radius + pin_cell_universe.add_cell(clad_cell) + + # Create a moderator Cell + moderator_cell = openmc.Cell(name='1.6% Moderator') + moderator_cell.fill = water + moderator_cell.region = +clad_outer_radius + pin_cell_universe.add_cell(moderator_cell) + +OpenMC requires that there is a "root" universe. Let us create a root +cell that is filled by the pin cell universe and then assign it to the +root universe. + +.. code:: python + + # Create root Cell + root_cell = openmc.Cell(name='root cell') + root_cell.fill = pin_cell_universe + + # Add boundary planes + root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z + + # Create root Universe + root_universe = openmc.Universe(universe_id=0, name='root universe') + root_universe.add_cell(root_cell) + +We now must create a geometry that is assigned a root universe, put the +geometry into a geometry file, and export it to XML. + +.. code:: python + + # Create Geometry and set root Universe + geometry = openmc.Geometry() + geometry.root_universe = root_universe + +.. code:: python + + # Instantiate a GeometryFile + geometry_file = openmc.GeometryFile() + geometry_file.geometry = geometry + + # Export to "geometry.xml" + geometry_file.export_to_xml() + +With the geometry and materials finished, we now just need to define +simulation parameters. In this case, we will use 5 inactive batches and +15 active batches each with 2500 particles. + +.. code:: python + + # OpenMC simulation parameters + batches = 20 + inactive = 5 + particles = 2500 + + # Instantiate a SettingsFile + settings_file = openmc.SettingsFile() + settings_file.batches = batches + settings_file.inactive = inactive + settings_file.particles = particles + settings_file.output = {'tallies': True, 'summary': True} + source_bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63] + settings_file.set_source_space('box', source_bounds) + + # Export to "settings.xml" + settings_file.export_to_xml() + +Let us also create a plot file that we can use to verify that our pin +cell geometry was created successfully. + +.. code:: python + + # Instantiate a Plot + plot = openmc.Plot(plot_id=1) + plot.filename = 'materials-xy' + plot.origin = [0, 0, 0] + plot.width = [1.26, 1.26] + plot.pixels = [250, 250] + plot.color = 'mat' + + # Instantiate a PlotsFile, add Plot, and export to "plots.xml" + plot_file = openmc.PlotsFile() + plot_file.add_plot(plot) + plot_file.export_to_xml() + +With the plots.xml file, we can now generate and view the plot. OpenMC +outputs plots in .ppm format, which can be converted into a compressed +format like .png with the convert utility. + +.. code:: python + + # Run openmc in plotting mode + executor = openmc.Executor() + executor.plot_geometry(output=False) + + + + +.. parsed-literal:: + + 0 + + + +.. code:: python + + # Convert OpenMC's funky ppm to png + !convert materials-xy.ppm materials-xy.png + + # Display the materials plot inline + Image(filename='materials-xy.png') + + + + +.. image:: tally-arithmetic-content_files/tally-arithmetic-content_25_0.png + + + +As we can see from the plot, we have a nice pin cell with fuel, +cladding, and water! Before we run our simulation, we need to tell the +code what we want to tally. The following code shows how to create a +variety of tallies. + +.. code:: python + + # Instantiate an empty TalliesFile + tallies_file = openmc.TalliesFile() + +.. code:: python + + # Create Tallies to compute microscopic multi-group cross-sections + + # Instantiate energy filter for multi-group cross-section Tallies + energy_filter = openmc.Filter(type='energy', bins=[0., 0.625e-6, 20.]) + + # Instantiate flux Tally in moderator and fuel + tally = openmc.Tally(name='flux') + tally.add_filter(openmc.Filter(type='cell', bins=[fuel_cell.id, moderator_cell.id])) + tally.add_filter(energy_filter) + tally.add_score('flux') + tallies_file.add_tally(tally) + + # Instantiate reaction rate Tally in fuel + tally = openmc.Tally(name='fuel rxn rates') + tally.add_filter(openmc.Filter(type='cell', bins=[fuel_cell.id])) + tally.add_filter(energy_filter) + tally.add_score('nu-fission') + tally.add_score('scatter') + tally.add_nuclide(u238) + tally.add_nuclide(u235) + tallies_file.add_tally(tally) + + # Instantiate reaction rate Tally in moderator + tally = openmc.Tally(name='moderator rxn rates') + tally.add_filter(openmc.Filter(type='cell', bins=[moderator_cell.id])) + tally.add_filter(energy_filter) + tally.add_score('absorption') + tally.add_score('total') + tally.add_nuclide(o16) + tally.add_nuclide(h1) + tallies_file.add_tally(tally) + +.. code:: python + + # K-Eigenvalue (infinity) tallies + fiss_rate = openmc.Tally(name='fiss. rate') + abs_rate = openmc.Tally(name='abs. rate') + fiss_rate.add_score('nu-fission') + abs_rate.add_score('absorption') + tallies_file.add_tally(fiss_rate) + tallies_file.add_tally(abs_rate) + +.. code:: python + + # Resonance Escape Probability tallies + therm_abs_rate = openmc.Tally(name='therm. abs. rate') + therm_abs_rate.add_score('absorption') + therm_abs_rate.add_filter(openmc.Filter(type='energy', bins=[0., 0.625])) + tallies_file.add_tally(therm_abs_rate) + +.. code:: python + + # Thermal Flux Utilization tallies + fuel_therm_abs_rate = openmc.Tally(name='fuel therm. abs. rate') + fuel_therm_abs_rate.add_score('absorption') + fuel_therm_abs_rate.add_filter(openmc.Filter(type='energy', bins=[0., 0.625])) + fuel_therm_abs_rate.add_filter(openmc.Filter(type='cell', bins=[fuel_cell.id])) + tallies_file.add_tally(fuel_therm_abs_rate) + +.. code:: python + + # Fast Fission Factor tallies + therm_fiss_rate = openmc.Tally(name='therm. fiss. rate') + therm_fiss_rate.add_score('nu-fission') + therm_fiss_rate.add_filter(openmc.Filter(type='energy', bins=[0., 0.625])) + tallies_file.add_tally(therm_fiss_rate) + +.. code:: python + + # Instantiate energy filter to illustrate Tally slicing + energy_filter = openmc.Filter(type='energy', bins=np.logspace(np.log10(1e-8), np.log10(20), 10)) + + # Instantiate flux Tally in moderator and fuel + tally = openmc.Tally(name='need-to-slice') + tally.add_filter(openmc.Filter(type='cell', bins=[fuel_cell.id, moderator_cell.id])) + tally.add_filter(energy_filter) + tally.add_score('nu-fission') + tally.add_score('scatter') + tally.add_nuclide(h1) + tally.add_nuclide(u238) + tallies_file.add_tally(tally) + +.. code:: python + + # Export to "tallies.xml" + tallies_file.export_to_xml() + +Now we a have a complete set of inputs, so we can go ahead and run our +simulation. + +.. code:: python + + # Remove old HDF5 (summary, statepoint) files + !rm statepoint.* + + # Run OpenMC with MPI! + executor.run_simulation() + + +.. parsed-literal:: + + + .d88888b. 888b d888 .d8888b. + d88P" "Y88b 8888b d8888 d88P Y88b + 888 888 88888b.d88888 888 888 + 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 + 888 888 888 "88b d8P Y8b 888 "88b 888 Y888P 888 888 + 888 888 888 888 88888888 888 888 888 Y8P 888 888 888 + Y88b. .d88P 888 d88P Y8b. 888 888 888 " 888 Y88b d88P + "Y88888P" 88888P" "Y8888 888 888 888 888 "Y8888P" + __________________888______________________________________________________ + 888 + 888 + + Copyright: 2011-2015 Massachusetts Institute of Technology + License: http://mit-crpg.github.io/openmc/license.html + Version: 0.7.0 + Git SHA1: 74ffcb447521c968fb64fdaa63e40598783f2fba + Date/Time: 2015-11-25 14:20:51 + MPI Processes: 1 + + =========================================================================== + ========================> INITIALIZATION <========================= + =========================================================================== + + Reading settings XML file... + Reading cross sections XML file... + Reading geometry XML file... + Reading materials XML file... + Reading tallies XML file... + Building neighboring cells lists for each surface... + Loading ACE cross section table: 92235.71c + Loading ACE cross section table: 92238.71c + Loading ACE cross section table: 8016.71c + Loading ACE cross section table: 1001.71c + Loading ACE cross section table: 5010.71c + Loading ACE cross section table: 40090.71c + Maximum neutron transport energy: 20.0000 MeV for 92235.71c + Initializing source particles... + + =========================================================================== + ====================> K EIGENVALUE SIMULATION <==================== + =========================================================================== + + Bat./Gen. k Average k + ========= ======== ==================== + 1/1 1.05992 + 2/1 1.05251 + 3/1 1.05204 + 4/1 1.02100 + 5/1 1.07784 + 6/1 1.04814 + 7/1 1.02335 1.03574 +/- 0.01239 + 8/1 1.02415 1.03188 +/- 0.00813 + 9/1 1.10331 1.04974 +/- 0.01876 + 10/1 1.05452 1.05069 +/- 0.01456 + 11/1 1.07867 1.05536 +/- 0.01277 + 12/1 1.04203 1.05345 +/- 0.01096 + 13/1 1.04482 1.05237 +/- 0.00955 + 14/1 1.04116 1.05113 +/- 0.00852 + 15/1 1.07569 1.05358 +/- 0.00800 + 16/1 1.04188 1.05252 +/- 0.00732 + 17/1 1.03775 1.05129 +/- 0.00679 + 18/1 0.98462 1.04616 +/- 0.00808 + 19/1 1.08613 1.04902 +/- 0.00801 + 20/1 1.00571 1.04613 +/- 0.00800 + Creating state point statepoint.20.h5... + + =========================================================================== + ======================> SIMULATION FINISHED <====================== + =========================================================================== + + + =======================> TIMING STATISTICS <======================= + + Total time for initialization = 7.9600E-01 seconds + Reading cross sections = 2.1200E-01 seconds + Total time in simulation = 1.8740E+01 seconds + Time in transport only = 1.8727E+01 seconds + Time in inactive batches = 2.5970E+00 seconds + Time in active batches = 1.6143E+01 seconds + Time synchronizing fission bank = 2.0000E-03 seconds + Sampling source sites = 1.0000E-03 seconds + SEND/RECV source sites = 1.0000E-03 seconds + Time accumulating tallies = 0.0000E+00 seconds + Total time for finalization = 2.0000E-03 seconds + Total time elapsed = 1.9553E+01 seconds + Calculation Rate (inactive) = 4813.25 neutrons/second + Calculation Rate (active) = 2322.99 neutrons/second + + ============================> RESULTS <============================ + + k-effective (Collision) = 1.04597 +/- 0.00663 + k-effective (Track-length) = 1.04613 +/- 0.00800 + k-effective (Absorption) = 1.04087 +/- 0.00627 + Combined k-effective = 1.04322 +/- 0.00570 + Leakage Fraction = 0.00000 +/- 0.00000 + + + + + +.. parsed-literal:: + + 0 + + + +Tally Data Processing +--------------------- + +Our simulation ran successfully and created a statepoint file with all +the tally data in it. We begin our analysis here loading the statepoint +file and 'reading' the results. By default, the tally results are not +read into memory because they might be large, even large enough to +exceed the available memory on a computer. + +.. code:: python + + # Load the statepoint file + sp = StatePoint('statepoint.20.h5') + +You may have also noticed we instructed OpenMC to create a summary file +with lots of geometry information in it. This can help to produce more +sensible output from the Python API, so we will use the summary file to +link against. + +.. code:: python + + # Load the summary file and link with statepoint + su = Summary('summary.h5') + sp.link_with_summary(su) + +We have a tally of the total fission rate and the total absorption rate, +so we can calculate k-infinity as: + +.. math:: k_\infty = \frac{\langle \nu \Sigma_f \phi \rangle}{\langle \Sigma_a \phi \rangle} + +In this notation, :math:`\langle \cdot \rangle^a_b` represents an OpenMC +that is integrated over region :math:`a` and energy range :math:`b`. If +:math:`a` or :math:`b` is not reported, it means the value represents an +integral over all space or all energy, respectively. + +.. code:: python + + # Compute k-infinity using tally arithmetic + fiss_rate = sp.get_tally(name='fiss. rate') + abs_rate = sp.get_tally(name='abs. rate') + keff = fiss_rate / abs_rate + keff.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + +
nuclidescoremeanstd. dev.
0 total (nu-fission / absorption) 1.040687 0.010913
+
+ + + +Notice that even though the neutron production rate and absorption rate +are separate tallies, we still get a first-order estimate of the +uncertainty on the quotient of them automatically! + +Often in textbooks you'll see k-infinity represented using the +four-factor formula + +.. math:: k_\infty = p \epsilon f \eta. + +Let's analyze each of these factors, starting with the resonance escape +probability which is defined as + +.. math:: p=\frac{\langle\Sigma_a\phi\rangle_T}{\langle\Sigma_a\phi\rangle} + + where the subscript :math:`T` means thermal energies. + +.. code:: python + + # Compute resonance escape probability using tally arithmetic + therm_abs_rate = sp.get_tally(name='therm. abs. rate') + res_esc = therm_abs_rate / abs_rate + res_esc.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + +
energy [MeV]nuclidescoremeanstd. dev.
0 (0.0e+00 - 6.2e-01) total absorption 0.959302 0.010033
+
+ + + +The fast fission factor can be calculated as + +.. math:: \epsilon=\frac{\langle\nu\Sigma_f\phi\rangle}{\langle\nu\Sigma_f\phi\rangle_T} + +.. code:: python + + # Compute fast fission factor factor using tally arithmetic + therm_fiss_rate = sp.get_tally(name='therm. fiss. rate') + fast_fiss = fiss_rate / therm_fiss_rate + fast_fiss.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + +
energy [MeV]nuclidescoremeanstd. dev.
0 (0.0e+00 - 6.2e-01) total nu-fission 1.09103 0.012491
+
+ + + +The thermal flux utilization is calculated as + +.. math:: f=\frac{\langle\Sigma_a\phi\rangle^F_T}{\langle\Sigma_a\phi\rangle_T} + +where the superscript :math:`F` denotes fuel. + +.. code:: python + + # Compute thermal flux utilization factor using tally arithmetic + fuel_therm_abs_rate = sp.get_tally(name='fuel therm. abs. rate') + therm_util = fuel_therm_abs_rate / therm_abs_rate + therm_util.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + +
energy [MeV]cellnuclidescoremeanstd. dev.
0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.803182 0.008664
+
+ + + +The final factor is the number of fission neutrons produced per +absorption in fuel, calculated as + +.. math:: \eta = \frac{\langle \nu\Sigma_f\phi \rangle_T}{\langle \Sigma_a \phi \rangle^F_T} + +.. code:: python + + # Compute neutrons produced per absorption (eta) using tally arithmetic + eta = therm_fiss_rate / fuel_therm_abs_rate + eta.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + +
energy [MeV]cellnuclidescoremeanstd. dev.
0 (0.0e+00 - 6.2e-01) 10000 total (nu-fission / absorption) 1.237982 0.014179
+
+ + + +Now we can calculate :math:`k_\infty` using the product of the factors +form the four-factor formula. + +.. code:: python + + keff = res_esc * fast_fiss * therm_util * eta + keff.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + +
energy [MeV]cellnuclidescoremeanstd. dev.
0 (0.0e+00 - 6.2e-01) 10000 total (((absorption * nu-fission) * absorption) * (n... 1.040687 0.022989
+
+ + + +We see that the value we've obtained here has exactly the same mean as +before. However, because of the way it was calculated, the standard +deviation appears to be larger. + +Let's move on to a more complicated example now. Before we set up +tallies to get reaction rates in the fuel and moderator in two energy +groups for two different nuclides. We can use tally arithmetic to divide +each of these reaction rates by the flux to get microscopic multi-group +cross sections. + +.. code:: python + + # Compute microscopic multi-group cross-sections + flux = sp.get_tally(name='flux') + flux = flux.get_slice(filters=['cell'], filter_bins=[(fuel_cell.id,)]) + fuel_rxn_rates = sp.get_tally(name='fuel rxn rates') + mod_rxn_rates = sp.get_tally(name='moderator rxn rates') + +.. code:: python + + fuel_xs = fuel_rxn_rates / flux + fuel_xs.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellenergy [MeV]nuclidescoremeanstd. dev.
0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) 0.000001 8.078651e-09
1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) 0.209990 2.449396e-03
2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) 0.356117 4.364366e-03
3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) 0.005555 6.495710e-05
4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) 0.007190 7.596666e-05
5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) 0.227843 1.024510e-03
6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) 0.008086 6.251590e-05
7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) 0.003365 1.646663e-05
+
+ + + +We see that when the two tallies with multiple bins were divided, the +derived tally contains the outer product of the combinations. If the +filters/scores are the same, no outer product is needed. The +``get_values(...)`` method allows us to obtain a subset of tally scores. +In the following example, we obtain just the neutron production +microscopic cross sections. + +.. code:: python + + # Show how to use Tally.get_values(...) with a CrossScore + nu_fiss_xs = fuel_xs.get_values(scores=['(nu-fission / flux)']) + print(nu_fiss_xs) + + +.. parsed-literal:: + + [[[ 6.65302296e-07] + [ 3.56116716e-01]] + + [[ 7.19004460e-03] + [ 8.08598751e-03]]] + + +The same idea can be used not only for scores but also for filters and +nuclides. + +.. code:: python + + # Show how to use Tally.get_values(...) with a CrossScore and CrossNuclide + u235_scatter_xs = fuel_xs.get_values(nuclides=['(U-235 / total)'], + scores=['(scatter / flux)']) + print(u235_scatter_xs) + + +.. parsed-literal:: + + [[[ 0.00555516]] + + [[ 0.00336498]]] + + +.. code:: python + + # Show how to use Tally.get_values(...) with a CrossFilter and CrossScore + fast_scatter_xs = fuel_xs.get_values(filters=['energy'], + filter_bins=[((0.625e-6, 20.),)], + scores=['(scatter / flux)']) + print(fast_scatter_xs) + + +.. parsed-literal:: + + [[[ 0.22784316] + [ 0.00336498]]] + + +A more advanced method is to use ``get_slice(...)`` to create a new +derived tally that is a subset of an existing tally. This has the +benefit that we can use ``get_pandas_dataframe()`` to see the tallies in +a more human-readable format. + +.. code:: python + + # "Slice" the nu-fission data into a new derived Tally + nu_fission_rates = fuel_rxn_rates.get_slice(scores=['nu-fission']) + nu_fission_rates.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellenergy [MeV]nuclidescoremeanstd. dev.
0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.450189e-08
1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.870882 7.895515e-03
2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082484 8.253437e-04
3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.092762 6.444580e-04
+
+ + + +.. code:: python + + # "Slice" the H-1 scatter data in the moderator Cell into a new derived Tally + need_to_slice = sp.get_tally(name='need-to-slice') + slice_test = need_to_slice.get_slice(scores=['scatter'], nuclides=['H-1'], + filters=['cell'], filter_bins=[(moderator_cell.id,)]) + slice_test.get_pandas_dataframe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cellenergy [MeV]nuclidescoremeanstd. dev.
0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.630154 0.044512
1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.042984 0.011429
2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.657517 0.008617
3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.863326 0.008848
4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.043916 0.014195
5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.134458 0.007561
6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.209947 0.013848
7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 2.006967 0.009368
8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.373895 0.002964
+
+ + diff --git a/_sources/pythonapi/index.txt b/_sources/pythonapi/index.txt index 8c42f2d7e2..6d513d5d5b 100644 --- a/_sources/pythonapi/index.txt +++ b/_sources/pythonapi/index.txt @@ -57,13 +57,26 @@ on a given module or class. summary tallies +**Multi-Group Cross Section Generation** + +.. toctree:: + :maxdepth: 1 + + mgxs + energy_groups + mgxs_library + **Example Jupyter Notebooks:** .. toctree:: :maxdepth: 1 + examples/post-processing examples/pandas-dataframes examples/tally-arithmetic + examples/mgxs-part-i + examples/mgxs-part-ii + examples/mgxs-part-iii .. _Jupyter: https://jupyter.org/ .. _NumPy: http://www.numpy.org/ diff --git a/_sources/pythonapi/mgxs.txt b/_sources/pythonapi/mgxs.txt new file mode 100644 index 0000000000..c7084e5653 --- /dev/null +++ b/_sources/pythonapi/mgxs.txt @@ -0,0 +1,66 @@ +.. _pythonapi_mgxs: + +========================== +Multi-Group Cross Sections +========================== + +.. currentmodule:: openmc.mgxs.mgxs + +---------------------------- +Summary of Available Classes +---------------------------- + +.. autosummary:: + + MGXS + AbsorptionXS + CaptureXS + Chi + FissionXS + NuFissionXS + NuScatterXS + NuScatterMatrixXS + ScatterXS + ScatterMatrixXS + TotalXS + TransportXS + +------------------- +Class Documentation +------------------- + +.. autoclass:: MGXS + :members: + +.. autoclass:: AbsorptionXS + :members: + +.. autoclass:: CaptureXS + :members: + +.. autoclass:: Chi + :members: + +.. autoclass:: FissionXS + :members: + +.. autoclass:: NuFissionXS + :members: + +.. autoclass:: NuScatterXS + :members: + +.. autoclass:: NuScatterMatrixXS + :members: + +.. autoclass:: ScatterXS + :members: + +.. autoclass:: ScatterMatrixXS + :members: + +.. autoclass:: TotalXS + :members: + +.. autoclass:: TransportXS + :members: diff --git a/_sources/pythonapi/mgxs_library.txt b/_sources/pythonapi/mgxs_library.txt new file mode 100644 index 0000000000..8ac5457004 --- /dev/null +++ b/_sources/pythonapi/mgxs_library.txt @@ -0,0 +1,8 @@ +.. _pythonapi_mgxs_library: + +============ +MGXS Library +============ + +.. automodule:: openmc.mgxs.library + :members: diff --git a/_sources/quickinstall.txt b/_sources/quickinstall.txt index b64dfebda1..9ce752be7c 100644 --- a/_sources/quickinstall.txt +++ b/_sources/quickinstall.txt @@ -35,8 +35,8 @@ Installing from Source on Linux or Mac OS X ------------------------------------------- All OpenMC source code is hosted on GitHub_. If you have git_, the gfortran_ -compiler, and CMake_ installed, you can download and install OpenMC be entering -the following commands in a terminal: +compiler, CMake_, and HDF5_ installed, you can download and install OpenMC be +entering the following commands in a terminal: .. code-block:: sh diff --git a/_sources/releasenotes.txt b/_sources/releasenotes.txt index dffc17201f..65309fd70a 100644 --- a/_sources/releasenotes.txt +++ b/_sources/releasenotes.txt @@ -1,9 +1,30 @@ .. _releasenotes: ============================== -Release Notes for OpenMC 0.7.0 +Release Notes for OpenMC 0.7.1 ============================== +This release of OpenMC provides some substantial improvements over version +0.7.0. Non-simple cell regions can now be defined through the ``|`` (union) and +``~`` (complement) operators. Similar changes in the Python API also allow +complex cell regions to be defined. A true secondary particle bank now exists; +this is crucial for photon transport (to be added in the next minor release). A +rich API for multi-group cross section generation has been added via the +``openmc.mgxs`` Python module. + +Various improvements to tallies have also been made. It is now possible to +explicitly specify that a collision estimator be used in a tally. A new +``delayedgroup`` filter and ``delayed-nu-fission`` score allow a user to obtain +delayed fission neutron production rates filtered by delayed group. Finally, the +new ``inverse-velocity`` score may be useful for calculating kinetics +parameters. + +.. caution:: In previous versions, depending on how OpenMC was compiled binary + output was either given in HDF5 or a flat binary format. With this + version, all binary output is now HDF5 which means you **must** + have HDF5 in order to install OpenMC. Please consult the user's + guide for instructions on how to compile with HDF5. + ------------------- System Requirements ------------------- @@ -17,36 +38,41 @@ the problem at hand (mostly on the number of nuclides in the problem). New Features ------------ -- Complete Python API -- Python 3 compatability for all scripts -- All scripts consistently named openmc-* and installed together -- New 'distribcell' tally filter for repeated cells -- Ability to specify outer lattice universe -- XML input validation utility (openmc-validate-xml) -- Support for hexagonal lattices -- Material union energy grid method -- Tally triggers -- Remove dependence on PETSc -- Significant OpenMP performance improvements -- Support for Fortran 2008 MPI interface -- Use of Travis CI for continuous integration -- Simplifications and improvements to test suite +- Support for complex cell regions (union and complement operators) +- Generic quadric surface type +- Improved handling of secondary particles +- Binary output is now solely HDF5 +- ``openmc.mgxs`` Python module enabling multi-group cross section generation +- Collision estimator for tallies +- Delayed fission neutron production tallies with ability to filter by delayed + group +- Inverse velocity tally score +- Performance improvements for binary search +- Performance improvements for reaction rate tallies --------- Bug Fixes --------- -- b5f712_: Fix bug in spherical harmonics tallies -- e6675b_: Ensure all constants are double precision -- 04e2c1_: Fix potential bug in sample_nuclide routine -- 6121d9_: Fix bugs related to particle track files -- 2f0e89_: Fixes for nuclide specification in tallies +- 299322_: Bug with material filter when void material present +- d74840_: Fix triggers on tallies with multiple filters +- c29a81_: Correctly handle maximum transport energy +- 3edc23_: Fixes in the nu-scatter score +- 629e3b_: Assume unspecified surface coefficients are zero in Python API +- 5dbe8b_: Fix energy filters for openmc-plot-mesh-tally +- ff66f4_: Fixes in the openmc-plot-mesh-tally script +- 441fd4_: Fix bug in kappa-fission score +- 7e5974_: Allow fixed source simulations from Python API -.. _b5f712: https://github.com/mit-crpg/openmc/commit/b5f712 -.. _e6675b: https://github.com/mit-crpg/openmc/commit/e6675b -.. _04e2c1: https://github.com/mit-crpg/openmc/commit/04e2c1 -.. _6121d9: https://github.com/mit-crpg/openmc/commit/6121d9 -.. _2f0e89: https://github.com/mit-crpg/openmc/commit/2f0e89 +.. _299322: https://github.com/mit-crpg/openmc/commit/299322 +.. _d74840: https://github.com/mit-crpg/openmc/commit/d74840 +.. _c29a81: https://github.com/mit-crpg/openmc/commit/c29a81 +.. _3edc23: https://github.com/mit-crpg/openmc/commit/3edc23 +.. _629e3b: https://github.com/mit-crpg/openmc/commit/629e3b +.. _5dbe8b: https://github.com/mit-crpg/openmc/commit/5dbe8b +.. _ff66f4: https://github.com/mit-crpg/openmc/commit/ff66f4 +.. _441fd4: https://github.com/mit-crpg/openmc/commit/441fd4 +.. _7e5974: https://github.com/mit-crpg/openmc/commit/7e5974 ------------ Contributors @@ -55,13 +81,11 @@ Contributors This release contains new contributions from the following people: - `Will Boyd `_ -- `Matt Ellis `_ - `Sterling Harper `_ -- `Bryan Herman `_ -- `Nicholas Horelik `_ +- `Bryan Herman `_ - `Colin Josey `_ -- `William Lyu `_ - `Adam Nelson `_ - `Paul Romano `_ -- `Anthony Scopatz `_ +- `Kelly Rowland `_ +- `Sam Shaner `_ - `Jon Walsh `_ diff --git a/_sources/usersguide/index.txt b/_sources/usersguide/index.txt index 675ed4081a..5a7e7addfa 100644 --- a/_sources/usersguide/index.txt +++ b/_sources/usersguide/index.txt @@ -5,7 +5,7 @@ User's Guide ============ Welcome to the OpenMC User's Guide! This tutorial will guide you through the -essential aspects of using OpenMC to perform neutronic simulations. +essential aspects of using OpenMC to perform simulations. .. toctree:: :numbered: @@ -14,5 +14,6 @@ essential aspects of using OpenMC to perform neutronic simulations. beginners install input + output/index processing troubleshoot diff --git a/_sources/usersguide/input.txt b/_sources/usersguide/input.txt index 93e8236ec1..fa43ca1d2c 100644 --- a/_sources/usersguide/input.txt +++ b/_sources/usersguide/input.txt @@ -79,14 +79,13 @@ Message Description [VALID] XML file matches RelaxNG. ======================== =================================== -As an example, if OpenMC is installed in the directory -``/opt/openmc/0.6.2`` and the current working directory is where -OpenMC XML input files are located, they can be validated using -the following command: +As an example, if OpenMC is installed in the directory ``/opt/openmc/`` and the +current working directory is where OpenMC XML input files are located, they can +be validated using the following command: .. code-block:: bash - /opt/openmc/0.6.2/bin/xml_validate + /opt/openmc/bin/openmc-validate-xml -------------------------------------- Settings Specification -- settings.xml @@ -721,9 +720,8 @@ Geometry Specification -- geometry.xml The geometry in OpenMC is described using `constructive solid geometry`_ (CSG), also sometimes referred to as combinatorial geometry. CSG allows a user to create complex objects using Boolean operators on a set of simpler surfaces. In -the geometry model, each unique closed volume in defined by its bounding -surfaces. In OpenMC, most `quadratic surfaces`_ can be modeled and used as -bounding surfaces. +the geometry model, each unique volume is defined by its bounding surfaces. In +OpenMC, most `quadratic surfaces`_ can be modeled and used as bounding surfaces. Every geometry.xml must have an XML declaration at the beginning of the file and a root element named geometry. Within the root element the user can define any @@ -746,7 +744,7 @@ number of cells, surfaces, and lattices. Let us look at the following example: 1 0 1 - -1 + -1 @@ -764,7 +762,7 @@ could be written as: - + @@ -788,7 +786,8 @@ Each ```` element can have the following attributes or sub-elements: :type: The type of the surfaces. This can be "x-plane", "y-plane", "z-plane", - "plane", "x-cylinder", "y-cylinder", "z-cylinder", or "sphere". + "plane", "x-cylinder", "y-cylinder", "z-cylinder", "sphere", "x-cone", + "y-cone", "z-cone", or "quadric". *Default*: None @@ -856,6 +855,12 @@ The following quadratic surfaces can be modeled: R^2 (z - z_0)^2`. The coefficients specified are ":math:`x_0 \: y_0 \: z_0 \: R^2`". + :quadric: + A general quadric surface of the form :math:`Ax^2 + By^2 + Cz^2 + Dxy + + Eyz + Fxz + Gx + Hy + Jz + K = 0` The coefficients specified are ":math:`A + \: B \: C \: D \: E \: F \: G \: H \: J \: K`". + + ```` Element ------------------ @@ -892,15 +897,29 @@ Each ```` element can have the following attributes or sub-elements: *Default*: None - :surfaces: - A list of the ``ids`` for surfaces that bound this cell, e.g. if the cell - is on the negative side of surface 3 and the positive side of surface 5, the - bounding surfaces would be given as "-3 5". + :region: + A Boolean expression of half-spaces that defines the spatial region which + the cell occupies. Each half-space is identified by the unique ID of the + surface prefixed by `-` or `+` to indicate that it is the negative or + positive half-space, respectively. The `+` sign for a positive half-space + can be omitted. Valid Boolean operators are parentheses, union `|`, + complement `~`, and intersection. Intersection is implicit and indicated by + the presence of whitespace. The order of operator precedence is parentheses, + complement, intersection, and then union. - .. note:: The surface attribute/element can be omitted to make a cell fill - its entire universe. + As an example, the following code gives a cell that is the union of the + negative half-space of surface 3 and the complement of the intersection of + the positive half-space of surface 5 and the negative half-space of surface + 2: - *Default*: No surfaces + .. code-block:: xml + + + + .. note:: The ``region`` attribute/element can be omitted to make a cell + fill its entire universe. + + *Default*: A region filling all space. :rotation: If the cell is filled with a universe, this element specifies the angles in @@ -1095,8 +1114,10 @@ Each ``material`` element can have the following attributes or sub-elements: An element with attributes/sub-elements called ``value`` and ``units``. The ``value`` attribute is the numeric value of the density while the ``units`` can be "g/cm3", "kg/m3", "atom/b-cm", "atom/cm3", or "sum". The "sum" unit - indicates that the density should be calculated as the sum of the atom - fractions for each nuclide in the material. This should not be used in + indicates that values appearing in ``ao`` attributes for ```` and + ```` sub-elements are to be interpreted as nuclide/element + densities in atom/b-cm, and the total density of the material is taken as + the sum of all nuclides/elements. The "sum" option cannot be used in conjunction with weight percents. *Default*: None @@ -1117,6 +1138,15 @@ Each ``material`` element can have the following attributes or sub-elements: .. note:: If one nuclide is specified in atom percent, all others must also be given in atom percent. The same applies for weight percentages. + An optional attribute/sub-element for each nuclide is ``scattering``. This + attribute may be set to "data" to use the scattering laws specified by the + cross section library (default). Alternatively, when set to "iso-in-lab", + the scattering laws are used to sample the outgoing energy but an + isotropic-in-lab distribution is used to sample the outgoing angle at each + scattering interaction. The ``scattering`` attribute may be most useful + when using OpenMC to compute multi-group cross-sections for deterministic + transport codes and to quantify the effects of anisotropic scattering. + *Default*: None :element: @@ -1143,6 +1173,16 @@ Each ``material`` element can have the following attributes or sub-elements: *Default*: None + An optional attribute/sub-element for each element is ``scattering``. This + attribute may be set to "data" to use the scattering laws specified by the + cross section library (default). Alternatively, when set to "iso-in-lab", + the scattering laws are used to sample the outgoing energy but an + isotropic-in-lab distribution is used to sample the outgoing angle at each + scattering interaction. The ``scattering`` attribute may be most useful + when using OpenMC to compute multi-group cross-sections for deterministic + transport codes and to quantify the effects of anisotropic scattering. + + *Default*: None :sab: Associates an S(a,b) table with the material. This element has @@ -1214,8 +1254,8 @@ The ```` element accepts the following sub-elements: :type: The type of the filter. Accepted options are "cell", "cellborn", - "material", "universe", "energy", "energyout", "mesh", and - "distribcell". + "material", "universe", "energy", "energyout", "mesh", "distribcell", + and "delayedgroup". :bins: For each filter type, the corresponding ``bins`` entry is given as @@ -1240,17 +1280,87 @@ The ```` element accepts the following sub-elements: :energy: A monotonically increasing list of bounding **pre-collision** energies for a number of groups. For example, if this filter is specified as - ````, then two energy bins - will be created, one with energies between 0 and 1 MeV and the other - with energies between 1 and 20 MeV. + + .. code-block:: xml + + + + then two energy bins will be created, one with energies between 0 and + 1 MeV and the other with energies between 1 and 20 MeV. :energyout: A monotonically increasing list of bounding **post-collision** energies for a number of groups. For example, if this filter is - specified as ````, then - two post-collision energy bins will be created, one with energies + specified as + + .. code-block:: xml + + + + then two post-collision energy bins will be created, one with energies between 0 and 1 MeV and the other with energies between 1 and 20 MeV. + :mu: + A monotonically increasing list of bounding **post-collision** cosines + of the change in a particle's angle (i.e., :math:`\mu = \hat{\Omega} + \cdot \hat{\Omega}'`), which represents a portion of the possible + values of :math:`[-1,1]`. For example, spanning all of :math:`[-1,1]` + with five equi-width bins can be specified as: + + .. code-block:: xml + + + + Alternatively, if only one value is provided as a bin, OpenMC will + interpret this to mean the complete range of :math:`[-1,1]` should + be automatically subdivided in to the provided value for the bin. + That is, the above example of five equi-width bins spanning + :math:`[-1,1]` can be instead written as: + + .. code-block:: xml + + + + :polar: + A monotonically increasing list of bounding particle polar angles + which represents a portion of the possible values of :math:`[0,\pi]`. + For example, spanning all of :math:`[0,\pi]` with five equi-width + bins can be specified as: + + .. code-block:: xml + + + + Alternatively, if only one value is provided as a bin, OpenMC will + interpret this to mean the complete range of :math:`[0,\pi]` should + be automatically subdivided in to the provided value for the bin. + That is, the above example of five equi-width bins spanning + :math:`[0,\pi]` can be instead written as: + + .. code-block:: xml + + + + :azimuthal: + A monotonically increasing list of bounding particle azimuthal angles + which represents a portion of the possible values of :math:`[-\pi,\pi)`. + For example, spanning all of :math:`[-\pi,\pi)` with two equi-width + bins can be specified as: + + .. code-block:: xml + + + + Alternatively, if only one value is provided as a bin, OpenMC will + interpret this to mean the complete range of :math:`[-\pi,\pi)` should + be automatically subdivided in to the provided value for the bin. + That is, the above example of five equi-width bins spanning + :math:`[-\pi,\pi)` can be instead written as: + + .. code-block:: xml + + + :mesh: The ``id`` of a structured mesh to be tallied over. @@ -1263,6 +1373,15 @@ The ```` element accepts the following sub-elements: not accept more than one cell ID. It is not recommended to combine this filter with a cell or mesh filter. + :delayedgroup: + A list of delayed neutron precursor groups for which the tally should + be accumulated. For instance, to tally to all 6 delayed groups in the + ENDF/B-VII.1 library the filter is specified as: + + .. code-block:: xml + + + :nuclides: If specified, the scores listed will be for particular nuclides, not the summation of reactions from all nuclides. The format for nuclides should be @@ -1278,26 +1397,32 @@ The ```` element accepts the following sub-elements: *Default*: total :estimator: - The estimator element is used to force the use of either ``analog`` or - ``tracklength`` tally estimation. ''analog'' is generally less efficient - though it can be used with every score type. ''tracklength'' is generally - the most efficient, though its usage is restricted to tallies that do not - score particle information which requires a collision to have occured, such - as a scattering tally which utilizes outgoing energy filters. + The estimator element is used to force the use of either ``analog``, + ``collision``, or ``tracklength`` tally estimation. ``analog`` is generally + the least efficient though it can be used with every score type. + ``tracklength`` is generally the most efficient, but neither ``tracklength`` + nor ``collision`` can be used to score a tally that requires post-collision + information. For example, a scattering tally with outgoing energy filters + cannot be used with ``tracklength`` or ``collision`` because the code will + not know the outgoing energy distribution. - *Default*: ``tracklength`` but will revert to analog if necessary. + *Default*: ``tracklength`` but will revert to ``analog`` if necessary. :scores: A space-separated list of the desired responses to be accumulated. Accepted options are "flux", "total", "scatter", "absorption", "fission", - "nu-fission", "kappa-fission", "nu-scatter", "scatter-N", "scatter-PN", - "scatter-YN", "nu-scatter-N", "nu-scatter-PN", "nu-scatter-YN", "flux-YN", - "total-YN", "current", and "events". These corresponding to the following - physical quantities: + "nu-fission", "delayed-nu-fission", "kappa-fission", "nu-scatter", + "scatter-N", "scatter-PN", "scatter-YN", "nu-scatter-N", "nu-scatter-PN", + "nu-scatter-YN", "flux-YN", "total-YN", "current", "inverse-velocity" and + "events". These correspond to the following physical quantities: :flux: Total flux in particle-cm per source particle. + .. note:: + The ``analog`` estimator is actually identical to the ``collision`` + estimator for the flux score. + :total: Total reaction rate in reactions per source particle. @@ -1316,6 +1441,10 @@ The ```` element accepts the following sub-elements: Total production of neutrons due to fission. Units are neutrons produced per source neutron. + :delayed-nu-fission: + Total production of delayed neutrons due to fission. Units are neutrons produced + per source neutron. + :kappa-fission: The recoverable energy production rate due to fission. The recoverable energy is defined as the fission product kinetic energy, prompt and @@ -1378,6 +1507,14 @@ The ```` element accepts the following sub-elements: specified. Furthermore, it may not be used in conjunction with any other score. + :inverse-velocity: + The flux-weighted inverse velocity where the velocity is in units of + centimeters per second. + + .. note:: + The ``analog`` estimator is actually identical to the ``collision`` + estimator for the inverse-velocity score. + :events: Number of scoring events. Units are events per source particle. @@ -1423,8 +1560,7 @@ a separate element with the tag name ````. This element has the following attributes/sub-elements: :type: - The type of structured mesh. Valid options include "rectangular" and - "hexagonal". + The type of structured mesh. The only valid option is "regular". :dimension: The number of mesh cells in each direction. @@ -1526,16 +1662,16 @@ sub-elements: *Default*: None - Required entry :type: - Keyword for type of plot to be produced. Currently only "slice" and - "voxel" plots are implemented. The "slice" plot type creates 2D pixel - maps saved in the PPM file format. PPM files can be displayed in most - viewers (e.g. the default Gnome viewer, IrfanView, etc.). The "voxel" - plot type produces a binary datafile containing voxel grid positioning and - the cell or material (specified by the ``color`` tag) at the center of each - voxel. These datafiles can be processed into 3D SILO files using the - ``voxel.py`` utility provided with the OpenMC source, and subsequently - viewed with a 3D viewer such as VISIT or Paraview. See the - :ref:`devguide_voxel` for information about the datafile structure. + Keyword for type of plot to be produced. Currently only "slice" and "voxel" + plots are implemented. The "slice" plot type creates 2D pixel maps saved in + the PPM file format. PPM files can be displayed in most viewers (e.g. the + default Gnome viewer, IrfanView, etc.). The "voxel" plot type produces a + binary datafile containing voxel grid positioning and the cell or material + (specified by the ``color`` tag) at the center of each voxel. These + datafiles can be processed into 3D SILO files using the + ``openmc-voxel-to-silovtk`` utility provided with the OpenMC source, and + subsequently viewed with a 3D viewer such as VISIT or Paraview. See the + :ref:`usersguide_voxel` for information about the datafile structure. .. note:: Since the PPM format is saved without any kind of compression, the resulting file sizes can be quite large. Saving the image in diff --git a/_sources/usersguide/install.txt b/_sources/usersguide/install.txt index 7d3cda1733..e3f0df5e91 100644 --- a/_sources/usersguide/install.txt +++ b/_sources/usersguide/install.txt @@ -8,7 +8,7 @@ Installation and Configuration Installing on Ubuntu with PPA ----------------------------- -For users with Ubuntu 11.10 or later, a binary package for OpenMC is available +For users with Ubuntu 15.04 or later, a binary package for OpenMC is available through a Personal Package Archive (PPA) and can be installed through the APT package manager. First, add the following PPA to the repository sources: @@ -28,6 +28,9 @@ Now OpenMC should be recognized within the repository and can be installed: sudo apt-get install openmc +Binary packages from this PPA may exist for earlier versions of Ubuntu, but they +are no longer supported. + -------------------- Building from Source -------------------- @@ -59,6 +62,37 @@ Prerequisites sudo apt-get install cmake + * HDF5_ Library for portable binary output format + + OpenMC uses HDF5 for binary output files. As such, you will need to have + HDF5 installed on your computer. The installed version will need to have + been compiled with the same compiler you intend to compile OpenMC with. If + you are using HDF5 in conjunction with MPI, we recommend that your HDF5 + installation be built with parallel I/O features. An example of + configuring HDF5_ is listed below:: + + FC=/opt/mpich/3.1/bin/mpif90 CC=/opt/mpich/3.1/bin/mpicc \ + ./configure --prefix=/opt/hdf5/1.8.12 --enable-fortran \ + --enable-fortran2003 --enable-parallel + + You may omit ``--enable-parallel`` if you want to compile HDF5_ in serial. + + .. important:: + + OpenMC uses various parts of the HDF5 Fortran 2003 API; as such you + must include ``--enable-fortran2003`` or else OpenMC will not be able + to compile. + + On Debian derivatives, HDF5 and/or parallel HDF5 can be installed through + the APT package manager: + + .. code-block:: sh + + sudo apt-get install libhdf5-8 libhdf5-dev hdf5-helpers + + Note that the exact package names may vary depending on your particular + distribution and version. + .. admonition:: Optional * An MPI implementation for distributed-memory parallel runs @@ -72,20 +106,6 @@ Prerequisites sudo apt-get install mpich libmpich-dev sudo apt-get install openmpi-bin libopenmpi1.6 libopenmpi-dev - * HDF5_ Library for portable binary output format - - To compile with support for HDF5_ output (highly recommended), you will - need to have HDF5 installed on your computer. The installed version will - need to have been compiled with the same compiler you intend to compile - OpenMC with. HDF5_ must be built with parallel I/O features if you intend - to use HDF5_ with MPI. An example of configuring HDF5_ is listed below:: - - FC=/opt/mpich/3.1/bin/mpif90 CC=/opt/mpich/3.1/bin/mpicc \ - ./configure --prefix=/opt/hdf5/1.8.12 --enable-fortran \ - --enable-fortran2003 --enable-parallel - - You may omit ``--enable-parallel`` if you want to compile HDF5_ in serial. - * git_ version control software for obtaining source code .. _gfortran: http://gcc.gnu.org/wiki/GFortran @@ -194,27 +214,26 @@ command, i.e. FC=mpif90 cmake /path/to/openmc -Compiling with HDF5 -+++++++++++++++++++ - -To compile with MPI, set the :envvar:`FC` environment variable to the path to -the HDF5 Fortran wrapper. For example, in a bash shell: +Selecting HDF5 Installation ++++++++++++++++++++++++++++ +CMakeLists.txt searches for the ``h5fc`` or ``h5pfc`` HDF5 Fortran wrapper on +your PATH environment variable and subsequently uses it to determine library +locations and compile flags. If you have multiple installations of HDF5 or one +that does not appear on your PATH, you can set the HDF5_ROOT environment +variable to the root directory of the HDF5 installation, e.g. .. code-block:: sh - export FC=h5fc + export HDF5_ROOT=/opt/hdf5/1.8.15 cmake /path/to/openmc -As noted above, an environment variable can typically be set for a single -command, i.e. +This will cause CMake to search first in /opt/hdf5/1.8.15/bin for ``h5fc`` / +``h5pfc`` before it searches elsewhere. As noted above, an environment variable +can typically be set for a single command, i.e. .. code-block:: sh - FC=h5fc cmake /path/to/openmc - -To compile with support for both MPI and HDF5, use the parallel HDF5 wrapper -``h5pfc`` instead. Note that this requires that your HDF5 installation be -compiled with ``--enable-parallel``. + HDF5_ROOT=/opt/hdf5/1.8.15 cmake /path/to/openmc Compiling on Linux and Mac OS X ------------------------------- @@ -308,6 +327,25 @@ This will build an executable named ``openmc``. .. _MinGW: http://www.mingw.org .. _SourceForge: http://sourceforge.net/projects/mingw +Compiling for the Intel Xeon Phi +-------------------------------- + +In order to build OpenMC for the Intel Xeon Phi using the Intel Fortran +compiler, it is necessary to specify that all objects be compiled with the +``-mmic`` flag as follows: + +.. code-block:: sh + + mkdir build && cd build + FC=ifort FFLAGS=-mmic cmake -Dopenmp=on .. + make + +Note that unless an HDF5 build for the Intel Xeon Phi is already on your target +machine, you will need to cross-compile HDF5 for the Xeon Phi. An `example +script`_ to build zlib and HDF5 provides several necessary workarounds. + +.. _example script: https://github.com/paulromano/install-scripts/blob/master/install-hdf5-mic + Testing Build ------------- diff --git a/_sources/usersguide/output/index.txt b/_sources/usersguide/output/index.txt new file mode 100644 index 0000000000..31bd1da917 --- /dev/null +++ b/_sources/usersguide/output/index.txt @@ -0,0 +1,16 @@ +.. _usersguide_output: + +=================== +Output File Formats +=================== + +.. toctree:: + :numbered: + :maxdepth: 3 + + statepoint + source + summary + particle_restart + track + voxel diff --git a/_sources/usersguide/output/particle_restart.txt b/_sources/usersguide/output/particle_restart.txt new file mode 100644 index 0000000000..e0d89a5156 --- /dev/null +++ b/_sources/usersguide/output/particle_restart.txt @@ -0,0 +1,57 @@ +.. _usersguide_particle_restart: + +============================ +Particle Restart File Format +============================ + +The current revision of the particle restart file format is 1. + +**/filetype** (*char[]*) + + String indicating the type of file. + +**/revision** (*int*) + + Revision of the particle restart file format. Any time a change is made in + the format, this integer is incremented. + +**/current_batch** (*int*) + + The number of batches already simulated. + +**/gen_per_batch** (*int*) + + Number of generations per batch. + +**/current_gen** (*int*) + + The number of generations already simulated. + +**/n_particles** (*int8_t*) + + Number of particles used per generation. + +**/run_mode** (*int*) + + Run mode used. A value of 1 indicates a fixed-source run and a value of 2 + indicates an eigenvalue run. + +**/id** (*int8_t*) + + Unique identifier of the particle. + +**/weight** (*double*) + + Weight of the particle. + +**/energy** (*double*) + + Energy of the particle in MeV. + +**/xyz** (*double[3]*) + + Position of the particle. + +**/uvw** (*double[3]*) + + Direction of the particle. diff --git a/_sources/usersguide/output/source.txt b/_sources/usersguide/output/source.txt new file mode 100644 index 0000000000..2981b0f662 --- /dev/null +++ b/_sources/usersguide/output/source.txt @@ -0,0 +1,19 @@ +.. _usersguide_source: + +================== +Source File Format +================== + +Normally, source data is stored in a state point file. However, it is possible +to request that the source be written separately, in which case the format used +is that documented here. + +**/filetype** (*char[]*) + + String indicating the type of file. + +**/source_bank** (Compound type) + + Source bank information for each particle. The compound type has fields + ``wgt``, ``xyz``, ``uvw``, and ``E`` which represent the weight, position, + direction, and energy of the source particle, respectively. diff --git a/_sources/usersguide/output/statepoint.txt b/_sources/usersguide/output/statepoint.txt new file mode 100644 index 0000000000..d3c1729af6 --- /dev/null +++ b/_sources/usersguide/output/statepoint.txt @@ -0,0 +1,259 @@ +.. _usersguide_statepoint: + +======================= +State Point File Format +======================= + +The current revision of the statepoint file format is 14. + +**/filetype** (*char[]*) + + String indicating the type of file. + +**/revision** (*int*) + + Revision of the state point file format. Any time a change is made in the + format, this integer is incremented. + +**/version_major** (*int*) + + Major version number for OpenMC + +**/version_minor** (*int*) + + Minor version number for OpenMC + +**/version_release** (*int*) + + Release version number for OpenMC + +**/date_and_time** (*char[]*) + + Date and time the state point was written. + +**/path** (*char[]*) + + Absolute path to directory containing input files. + +**/seed** (*int8_t*) + + Pseudo-random number generator seed. + +**/run_mode** (*char[]*) + + Run mode used. A value of 1 indicates a fixed-source run and a value of 2 + indicates an eigenvalue run. + +**/n_particles** (*int8_t*) + + Number of particles used per generation. + +**/n_batches** (*int*) + + Number of batches to simulate. + +**/current_batch** (*int*) + + The number of batches already simulated. + +if run_mode == 'k-eigenvalue': + + **/n_inactive** (*int*) + + Number of inactive batches. + + **/gen_per_batch** (*int*) + + Number of generations per batch. + + **/k_generation** (*double[]*) + + k-effective for each generation simulated. + + **/entropy** (*double[]*) + + Shannon entropy for each generation simulated + + **/k_col_abs** (*double*) + + Sum of product of collision/absorption estimates of k-effective + + **/k_col_tra** (*double*) + + Sum of product of collision/track-length estimates of k-effective + + **/k_abs_tra** (*double*) + + Sum of product of absorption/track-length estimates of k-effective + + **/k_combined** (*double[2]*) + + Mean and standard deviation of a combined estimate of k-effective + + **/cmfd_on** (*int*) + + Flag indicating whether CMFD is on (1) or off (0). + + if (cmfd_on) + + **/cmfd/indices** (*int[4]*) + + Indices for cmfd mesh (i,j,k,g) + + **/cmfd/k_cmfd** (*double[]*) + + CMFD eigenvalues + + **/cmfd/cmfd_src** (*double[][][][]*) + + CMFD fission source + + **/cmfd/cmfd_entropy** (*double[]*) + + CMFD estimate of Shannon entropy + + **/cmfd/cmfd_balance** (*double[]*) + + RMS of the residual neutron balance equation on CMFD mesh + + **/cmfd/cmfd_dominance** (*double[]*) + + CMFD estimate of dominance ratio + + **/cmfd/cmfd_srccmp** (*double[]*) + + RMS comparison of difference between OpenMC and CMFD fission source + +**/tallies/n_meshes** (*int*) + + Number of meshes in tallies.xml file + +**/tally/meshes/ids** (*int[]*) + + Internal unique ID of each mesh. + +**/tally/meshes/keys** (*int[]*) + + User-identified unique ID of each mesh. + +**/tallies/meshes/mesh /type** (*char[]*) + + Type of mesh. + +**/tallies/meshes/mesh /dimension** (*int*) + + Number of mesh cells in each dimension. + +**/tallies/meshes/mesh /lower_left** (*double[]*) + + Coordinates of lower-left corner of mesh. + +**/tallies/meshes/mesh /upper_right** (*double[]*) + + Coordinates of upper-right corner of mesh. + +**/tallies/meshes/mesh /width** (*double[]*) + + Width of each mesh cell in each dimension. + +**/tallies/n_tallies** (*int*) + + Number of user-defined tallies. + +**/tallies/ids** (*int[]*) + + Internal unique ID of each tally. + +**/tallies/keys** (*int[]*) + + User-identified unique ID of each tally. + +**/tallies/tally /estimator** (*char[]*) + + Type of tally estimator, either 'analog', 'tracklength', or 'collision'. + +**/tallies/tally /n_realizations** (*int*) + + Number of realizations. + +**/tallies/tally /n_filters** (*int*) + + Number of filters used. + +**/tallies/tally /filter /type** (*char[]*) + + Type of the j-th filter. Can be 'universe', 'material', 'cell', 'cellborn', + 'surface', 'mesh', 'energy', 'energyout', or 'distribcell'. + +**/tallies/tally /filter /offset** (*int*) + + Filter offset (used for distribcell filter). + +**/tallies/tally /filter /n_bins** (*int*) + + Number of bins for the j-th filter. + +**/tallies/tally /filter /bins** (*int[]* or *double[]*) + + Value for each filter bin of this type. + +**/tallies/tally /nuclides** (*char[][]*) + + Array of nuclides to tally. Note that if no nuclide is specified in the user + input, a single 'total' nuclide appears here. + +**/tallies/tally /n_score_bins** (*int*) + + Number of scoring bins for a single nuclide. In general, this can be greater + than the number of user-specified scores since each score might have + multiple scoring bins, e.g., scatter-PN. + +**/tallies/tally /score_bins** (*char[][]*) + + Values of specified scores. + +**/tallies/tally /n_user_scores** (*int*) + + Number of scores without accounting for those added by expansions, + e.g. scatter-PN. + +**/tallies/tally /moment_orders** (*char[][]*) + + Tallying moment orders for Legendre and spherical harmonic tally expansions + (*e.g.*, 'P2', 'Y1,2', etc.). + +**/tallies/tally /results** (Compound type) + + Accumulated sum and sum-of-squares for each bin of the i-th tally. This is a + two-dimensional array, the first dimension of which represents combinations + of filter bins and the second dimensions of which represents scoring + bins. Each element of the array has fields 'sum' and 'sum_sq'. + +**/source_present** (*int*) + + Flag indicated if source bank is present in the file + +**/n_realizations** (*int*) + + Number of realizations for global tallies. + +**/n_global_tallies** (*int*) + + Number of global tally scores. + +**/global_tallies** (Compound type) + + Accumulated sum and sum-of-squares for each global tally. The compound type + has fields named ``sum`` and ``sum_sq``. + +**tallies_present** (*int*) + + Flag indicated if tallies are present in the file. + +if (run_mode == 'k-eigenvalue' and source_present > 0) + + **/source_bank** (Compound type) + + Source bank information for each particle. The compound type has fields + ``wgt``, ``xyz``, ``uvw``, and ``E`` which represent the weight, + position, direction, and energy of the source particle, respectively. diff --git a/_sources/usersguide/output/summary.txt b/_sources/usersguide/output/summary.txt new file mode 100644 index 0000000000..f87f60c4a0 --- /dev/null +++ b/_sources/usersguide/output/summary.txt @@ -0,0 +1,311 @@ +.. _usersguide_summary: + +=================== +Summary File Format +=================== + +The current revision of the summary file format is 1. + +**/filetype** (*char[]*) + + String indicating the type of file. + +**/revision** (*int*) + + Revision of the summary file format. Any time a change is made in the + format, this integer is incremented. + +**/version_major** (*int*) + + Major version number for OpenMC + +**/version_minor** (*int*) + + Minor version number for OpenMC + +**/version_release** (*int*) + + Release version number for OpenMC + +**/date_and_time** (*char[]*) + + Date and time the summary was written. + +**/n_procs** (*int*) + + Number of MPI processes used. + +**/n_particles** (*int8_t*) + + Number of particles used per generation. + +**/n_batches** (*int*) + + Number of batches to simulate. + +**/n_inactive** (*int*) + + Number of inactive batches. Only present if /run_mode is set to + 'k-eigenvalue'. + +**/n_active** (*int*) + + Number of active batches. Only present if /run_mode is set to + 'k-eigenvalue'. + +**/gen_per_batch** (*int*) + + Number of generations per batch. Only present if /run_mode is set to + 'k-eigenvalue'. + +**/geometry/n_cells** (*int*) + + Number of cells in the problem. + +**/geometry/n_surfaces** (*int*) + + Number of surfaces in the problem. + +**/geometry/n_universes** (*int*) + + Number of unique universes in the problem. + +**/geometry/n_lattices** (*int*) + + Number of lattices in the problem. + +**/geometry/cells/cell /index** (*int*) + + Index in cells array used internally in OpenMC. + +**/geometry/cells/cell /name** (*char[]*) + + Name of the cell. + +**/geometry/cells/cell /universe** (*int*) + + Universe assigned to the cell. If none is specified, the default + universe (0) is assigned. + +**/geometry/cells/cell /fill_type** (*char[]*) + + Type of fill for the cell. Can be 'normal', 'universe', or 'lattice'. + +**/geometry/cells/cell /material** (*int*) + + Unique ID of the material assigned to the cell. This dataset is present only + if fill_type is set to 'normal'. + +**/geometry/cells/cell /offset** (*int[]*) + + Offsets used for distribcell tally filter. This dataset is present only if + fill_type is set to 'universe'. + +**/geometry/cells/cell /translation** (*double[3]*) + + Translation applied to the fill universe. This dataset is present only if + fill_type is set to 'universe'. + +**/geometry/cells/cell /rotation** (*double[3]*) + + Angles in degrees about the x-, y-, and z-axes for which the fill universe + should be rotated. This dataset is present only if fill_type is set to + 'universe'. + +**/geometry/cells/cell /lattice** (*int*) + + Unique ID of the lattice which fills the cell. Only present if fill_type is + set to 'lattice'. + +**/geometry/cells/cell /region** (*char[]*) + + Region specification for the cell. + +**/geometry/surfaces/surface /index** (*int*) + + Index in surfaces array used internally in OpenMC. + +**/geometry/surfaces/surface /name** (*char[]*) + + Name of the surface. + +**/geometry/surfaces/surface /type** (*char[]*) + + Type of the surface. Can be 'x-plane', 'y-plane', 'z-plane', 'plane', + 'x-cylinder', 'y-cylinder', 'sphere', 'x-cone', 'y-cone', 'z-cone', or + 'quadric'. + +**/geometry/surfaces/surface /coefficients** (*double[]*) + + Array of coefficients that define the surface. See :ref:`surface_element` + for what coefficients are defined for each surface type. + +**/geometry/surfaces/surface /boundary_condition** (*char[]*) + + Boundary condition applied to the surface. Can be 'transmission', 'vacuum', + 'reflective', or 'periodic'. + +**/geometry/universes/universe /index** (*int*) + + Index in the universes array used internally in OpenMC. + +**/geometry/universes/universe /cells** (*int[]*) + + Array of unique IDs of cells that appear in the universe. + +**/geometry/lattices/lattice /index** (*int*) + + Index in the lattices array used internally in OpenMC. + +**/geometry/lattices/lattice /name** (*char[]*) + + Name of the lattice. + +**/geometry/lattices/lattice /type** (*char[]*) + + Type of the lattice, either 'rectangular' or 'hexagonal'. + +**/geometry/lattices/lattice /pitch** (*double[]*) + + Pitch of the lattice. + +**/geometry/lattices/lattice /outer** (*int*) + + Outer universe assigned to lattice cells outside the defined range. + +**/geometry/lattices/lattice /offsets** (*int[]*) + + Offsets used for distribcell tally filter. + +**/geometry/lattices/lattice /universes** (*int[]*) + + Three-dimensional array of universes assigned to each cell of the lattice. + +**/geometry/lattices/lattice /dimension** (*int[]*) + + The number of lattice cells in each direction. This dataset is present only + when the 'type' dataset is set to 'rectangular'. + +**/geometry/lattices/lattice /lower_left** (*double[]*) + + The coordinates of the lower-left corner of the lattice. This dataset is + present only when the 'type' dataset is set to 'rectangular'. + +**/geometry/lattices/lattice /n_rings** (*int*) + + Number of radial ring positions in the xy-plane. This dataset is present + only when the 'type' dataset is set to 'hexagonal'. + +**/geometry/lattices/lattice /n_axial** (*int*) + + Number of lattice positions along the z-axis. This dataset is present only + when the 'type' dataset is set to 'hexagonal'. + +**/geometry/lattices/lattice /center** (*double[]*) + + Coordinates of the center of the lattice. This dataset is present only when + the 'type' dataset is set to 'hexagonal'. + +**/n_materials** (*int*) + + Number of materials in the problem. + +**/materials/material /index** (*int*) + + Index in materials array used internally in OpenMC. + +**/materials/material /name** (*char[]*) + + Name of the material. + +**/materials/material /atom_density** (*double[]*) + + Total atom density of the material in atom/b-cm. + +**/materials/material /nuclides** (*char[][]*) + + Array of nuclides present in the material, e.g., 'U-235.71c'. + +**/materials/material /nuclide_densities** (*double[]*) + + Atom density of each nuclide. + +**/materials/material /sab_names** (*char[][]*) + + Names of S(:math:`\alpha`,:math:`\beta`) tables assigned to the material. + +**/tallies/n_tallies** (*int*) + + Number of tallies in the problem. + +**/tallies/n_meshes** (*int*) + + Number of meshes in the problem. + +**/tallies/mesh /index** (*int*) + + Index in the meshes array used internally in OpenMC. + +**/tallies/mesh /type** (*char[]*) + + Type of the mesh. The only valid option is currently 'regular'. + +**/tallies/mesh /dimension** (*int[]*) + + Number of mesh cells in each direction. + +**/tallies/mesh /lower_left** (*double[]*) + + Coordinates of the lower-left corner of the mesh. + +**/tallies/mesh /upper_right** (*double[]*) + + Coordinates of the upper-right corner of the mesh. + +**/tallies/mesh /width** (*double[]*) + + Width of a single mesh cell in each direction. + +**/tallies/tally /index** (*int*) + + Index in tallies array used internally in OpenMC. + +**/tallies/tally /name** (*char[]*) + + Name of the tally. + +**/tallies/tally /n_filters** (*int*) + + Number of filters applied to the tally. + +**/tallies/tally /filter /type** (*char[]*) + + Type of the j-th filter. Can be 'universe', 'material', 'cell', 'cellborn', + 'surface', 'mesh', 'energy', 'energyout', or 'distribcell'. + +**/tallies/tally /filter /offset** (*int*) + + Filter offset (used for distribcell filter). + +**/tallies/tally /filter /n_bins** (*int*) + + Number of bins for the j-th filter. + +**/tallies/tally /filter /bins** (*int[]* or *double[]*) + + Value for each filter bin of this type. + +**/tallies/tally /nuclides** (*char[][]*) + + Array of nuclides to tally. Note that if no nuclide is specified in the user + input, a single 'total' nuclide appears here. + +**/tallies/tally /n_score_bins** (*int*) + + Number of scoring bins for a single nuclide. In general, this can be greater + than the number of user-specified scores since each score might have + multiple scoring bins, e.g., scatter-PN. + +**/tallies/tally /score_bins** (*char[][]*) + + Scoring bins for the tally. diff --git a/_sources/usersguide/output/track.txt b/_sources/usersguide/output/track.txt new file mode 100644 index 0000000000..d3c7a27d83 --- /dev/null +++ b/_sources/usersguide/output/track.txt @@ -0,0 +1,30 @@ +.. _usersguide_track: + +================= +Track File Format +================= + +The current revision of the particle track file format is 1. + +**/filetype** (*char[]*) + + String indicating the type of file. + +**/revision** (*int*) + + Revision of the track file format. Any time a change is made in the format, + this integer is incremented. + +**/n_particles** (*int*) + + Number of particles for which tracks are recorded. + +**/n_coords** (*int[]*) + + Number of coordinates for each particle. + +*do i = 1, n_particles* + + **/coordinates_i** (*double[][3]*) + + (x,y,z) coordinates for the *i*-th particle. diff --git a/_sources/usersguide/output/voxel.txt b/_sources/usersguide/output/voxel.txt new file mode 100644 index 0000000000..1da501fb54 --- /dev/null +++ b/_sources/usersguide/output/voxel.txt @@ -0,0 +1,25 @@ +.. _usersguide_voxel: + +====================== +Voxel Plot File Format +====================== + +**/filetype** (*char[]*) + + String indicating the type of file. + +**/num_voxels** (*int[3]*) + + Number of voxels in the x-, y-, and z- directions. + +**/voxel_width** (*double[3]*) + + Width of a voxel in centimeters. + +**/lower_left** (*double[3]*) + + Cartesian coordinates of the lower-left corner of the plot. + +**/data** (*int[][][]*) + + Data for each voxel that represents a material or cell ID. diff --git a/_sources/usersguide/processing.txt b/_sources/usersguide/processing.txt index e773cf1563..b18569ec6a 100644 --- a/_sources/usersguide/processing.txt +++ b/_sources/usersguide/processing.txt @@ -6,31 +6,34 @@ Data Processing and Visualization This section is intended to explain in detail the recommended procedures for carrying out common post-processing tasks with OpenMC. While several utilities -of varying complexity are provided to help automate the process, in many cases -it will be extremely beneficial to do some coding in Python to quickly obtain -results. In these cases, and for many of the provided utilities, it is necessary -for your Python installation to contain: +of varying complexity are provided to help automate the process, the most +powerful capabilities for post-processing derive from use of the :ref:`Python +API `. Both the provided scripts and the Python API rely on a number +third-party Python packages, including: -* [1]_ `Numpy `_ -* [1]_ `Scipy `_ -* [2]_ `h5py `_ -* [3]_ `Matplotlib `_ -* [3]_ `Silomesh `_ -* [3]_ `VTK `_ +* [1]_ `NumPy `_ +* [2]_ `h5py `_ +* [3]_ `pandas `_ +* [4]_ `matplotlib `_ +* [4]_ `Silomesh `_ +* [4]_ `VTK `_ +* [4]_ `lxml `_ -Most of these are easily obtainable in Ubuntu through the package manager, or -are easily installed with distutils. +Most of these are can easily be installed with `pip `_ +or alternatively obtaining through a package manager. -.. [1] Required for tally data extraction from statepoints with statepoint.py -.. [2] Required only if reading HDF5 statepoint files. -.. [3] Optional for plotting utilities +.. [1] Required for most post-processing tasks +.. [2] Required for reading HDF5 output files +.. [3] Optional dependency for advanced features in Python API +.. [4] Not used directly by the Python API, but are optional dependencies for a + number of scripts. ---------------------- Geometry Visualization ---------------------- Geometry plotting is carried out by creating a plots.xml, specifying plots, and -running OpenMC with the -plot or -p command-line option (See +running OpenMC with the --plot or -p command-line option (See :ref:`usersguide_plotting`). Plotting in 2D @@ -128,27 +131,26 @@ capabilities of 3D voxel plots. Voxel plots are built the same way 2D slice plots are, by determining the cell or material id of a particle at the center of each voxel. In this example, the space covered is the cube between the points (-5,-5,-5) and (5,5,5), with voxel -centers 10/500 = 0.02 cm apart. The binary VOXEL files that are produced do not +centers 10/500 = 0.02 cm apart. The HDF5 voxel files that are produced do not specify any color - instead containing only material or cell ids (material id in this example) - and thus the ``background``, ``col_spec``, and ``mask`` elements are not used. If no cell is found at a voxel center, an id of -1 is stored. -The binary VOXEL files output by OpenMC can not be viewed directly by any -existing viewers. In order to view them, they must be converted into a standard -mesh format that can be viewed in ParaView, Visit, etc. This typically will -compress the size of the file significantly. The provided utility voxel.py -accomplishes this for SILO: +The voxel plot data is written to an HDF5 file. The voxel file can subsequently +be converted into a standard mesh format that can be viewed in ParaView, Visit, +etc. This typically will compress the size of the file significantly. The +provided utility openmc-voxel-to-silovtk accomplishes this for SILO: .. code-block:: sh - /src/utils/voxel.py myplot.voxel -o output.silo + openmc-voxel-to-silovtk myplot.voxel -o output.silo and VTK file formats: .. code-block:: sh - /src/utils/voxel.py myplot.voxel --vtk -o output.vti + openmc-voxel-to-silovtk myplot.voxel --vtk -o output.vti To use this utility you need either @@ -156,11 +158,10 @@ To use this utility you need either or -* `VTK `_ with python bindings - On Ubuntu, these are - easily obtained with ``sudo apt-get install python-vtk`` +* `VTK `_ with python bindings. On debian derivatives, + these are easily obtained with ``sudo apt-get install python-vtk`` -Users can process the binary into any other format if desired by following the -example of voxel.py. For the binary file structure, see :ref:`devguide_voxel`. +For the HDF5 file structure, see :ref:`usersguide_voxel`. Once processed into a standard 3D file format, colors and masks can be defined using the stored id numbers to better explore the geometry. The process for @@ -183,150 +184,38 @@ doing this will depend on the 3D viewer, but should be straightforward. Tally Visualization ------------------- -Tally results are saved in both a text file (tallies.out) as well as a binary +Tally results are saved in both a text file (tallies.out) as well as an HDF5 statepoint file. While the tallies.out file may be fine for simple tallies, in -many cases the user requires more information about the tally or the run, or -has to deal with a large number of result values (e.g. for mesh tallies). In -these cases, extracting data from the statepoint file via Python scripting is -the preferred method of data analysis and visualization. +many cases the user requires more information about the tally or the run, or has +to deal with a large number of result values (e.g. for mesh tallies). In these +cases, extracting data from the statepoint file via the :ref:`pythonapi` is the +preferred method of data analysis and visualization. Data Extraction --------------- A great deal of information is available in statepoint files (See -:ref:`devguide_statepoint`), most of which is easily extracted by the provided -utility statepoint.py. This utility provides a Python class to load statepoints -and extract data - it is used in many of the provided plotting utilities, and -can be used in user-created scripts to carry out manipulations of the data. To -read tallies using this utility, make sure statepoint.py is in your PYTHONPATH, -and then import the class, instantiate it, and call read_results: +:ref:`usersguide_statepoint`), all of which is accessible through the Python +API. The ``openmc.statepoint`` module (see :ref:`pythonapi_statepoint`) provides +a class to load statepoints and access data as requested; it is used in many of +the provided plotting utilities, OpenMC's regression test suite, and can be used +in user-created scripts to carry out manipulations of the data. -.. code-block:: python - - from statepoint import StatePoint - sp = StatePoint('statepoint.100.binary') - sp.read_results() - -At this point the user can extract entire scores from tallies into a data -dictionary containing numpy arrays: - -.. code-block:: python - - tallyid = 1 - score = 'flux' - data = sp.extract_results(tallyid, score) - means = data['means'] - print data.keys() - -The results from this function contain all filter bins (all mesh points, all -energy groups, etc.), which can be reshaped with the bin ordering also contained -in the output dictionary. This is the best choice of output for easily -integrating ranges of data. - -Alternatively the user can extract specific values for a single score/filter -combination: - -.. code-block:: python - - tallyid = 1 - score = 'flux' - filters = [('mesh', (1, 1, 5)), ('energyin', 0)] - value, error = sp.get_value(tallyid, filters, score) - -In the future more documentation may become available here for statepoint.py and -the data extraction functions of StatePoint objects. However, for now it is up -to the user to explore the classes in statepoint.py to discover what data is -available in StatePoint objects (we highly recommend interactively exploring -with `IPython `_). Many examples can be found by looking -through the other utilities that use statepoint.py, and a few common -visualization tasks will be described here in the following sections. +An :ref:`example IPython notebook ` demonstrates how +to extract data from a statepoint using the Python API. Plotting in 2D -------------- +The :ref:`IPython notebook example ` also demonstrates +how to plot a mesh tally in two dimensions using the Python API. Note, however, +that there is also a script distributed with OpenMC, ``openmc-plot-mesh-tally``, +that provides an interactive GUI to explore and plot mesh tallies for any scores +and filter bins. + .. image:: ../_images/plotmeshtally.png :height: 200px -For simple viewing of 2D slices of a mesh plot, the utility plot_mesh_tally.py -is provided. This utility provides an interactive GUI to explore and plot -mesh tallies for any scores and filter bins. It requires statepoint.py. - -.. image:: ../_images/fluxplot.png - :height: 200px - -Alternatively, the user can write their own Python script to manipulate the data -appropriately. Consider a run where the first tally contains a 105x105x20 mesh -over a small core, with a flux score and two energyin filter bins. To explicitly -extract the data and create a plot with gnuplot, the following script can be -used. The script operates in several steps for clarity, and is not necessarily -the most efficient way to extract data from large mesh tallies. This creates the -two heatmaps in the previous figure. - -.. code-block:: python - - #!/usr/bin/env python - - import os - - import statepoint - - # load and parse the statepoint file - sp = statepoint.StatePoint('statepoint.300.binary') - sp.read_results() - - tallyid = 0 # This is tally 1 - score = 0 # This corresponds to flux (see tally.scores) - - # get mesh dimensions - meshid = sp.tallies[tallyid].filters['mesh'].bins[0] - for i,m in enumerate(sp.meshes): - if m.id == meshid: - mesh = m - break - nx,ny,nz = mesh.dimension - - # loop through mesh and extract values to python dictionaries - thermal = {} - fast = {} - for x in range(1,nx+1): - for y in range(1,ny+1): - for z in range(1,nz+1): - val,err = sp.get_value(tallyid, - [('mesh',(x,y,z)),('energyin',0)], - score) - thermal[(x,y,z)] = val - val,err = sp.get_value(tallyid, - [('mesh',(x,y,z)),('energyin',1)], - score) - fast[(x,y,z)] = val - - # sum up the axial values and write datafile for gnuplot - with open('meshdata.dat','w') as fh: - for x in range(1,nx+1): - for y in range(1,ny+1): - thermalval = 0. - fastval = 0. - for z in range(1,nz+1): - thermalval += thermal[(x,y,z)] - fastval += fast[(x,y,z)] - fh.write("{} {} {} {}\n".format(x,y,thermalval,fastval)) - - # write gnuplot file - with open('tmp.gnuplot','w') as fh: - fh.write(r"""set terminal png size 1000 400 - set output 'fluxplot.png' - set nokey - set autoscale fix - set multiplot layout 1,2 title "Pin Mesh Flux Tally" - set title "Thermal" - plot 'meshdata.dat' using 1:2:3 with image - set title "Fast" - plot 'meshdata.dat' using 1:2:4 with image - """) - - # make plot - os.system("gnuplot < tmp.gnuplot") - Plotting in 3D -------------- @@ -334,22 +223,23 @@ Plotting in 3D :height: 200px As with 3D plots of the geometry, meshtally data needs to be put into a standard -format for viewing. The utility statepoint_3d.py is provided to accomplish this -for both VTK and SILO. By default statepoint_3d.py processes a statepoint into a -3D file with all mesh tallies and filter/score combinations, +format for viewing. The utility ``openmc-statepoint-3d`` is provided to +accomplish this for both VTK and SILO. By default ``openmc-statepoint-3d`` +processes a statepoint into a 3D file with all mesh tallies and filter/score +combinations, .. code-block:: sh - /src/utils/statepoint_3d.py -o output.silo - /src/utils/statepoint_3d.py --vtk -o output.vtm + openmc-statepoint-3d -o output.silo + openmc-statepoint-3d --vtk -o output.vtm but it also provides several command-line options to selectively process only certain data arrays in order to keep file sizes down. .. code-block:: sh - statepoint_3d.py --tallies 2,4 --scores 4.1,4.3 -o output.silo - statepoint_3d.py --filters 2.energyin.1 --vtk -o output.vtm + openmc-statepoint-3d --tallies 2,4 --scores 4.1,4.3 -o output.silo + openmc-statepoint-3d --filters 2.energyin.1 --vtk -o output.vtm All available options for specifying a subset of tallies, scores, and filters can be listed with the ``--list`` or ``-l`` command line options. @@ -426,13 +316,11 @@ Getting Data into MATLAB ------------------------ There is currently no front-end utility to dump tally data to MATLAB files, but -the process is straightforward. First extract the data using a custom Python -script with statepoint.py, put the data into appropriately-shaped numpy arrays, -and then use the `Scipy MATLAB IO routines +the process is straightforward. First extract the data using the Python API via +``openmc.statepoint`` and then use the `Scipy MATLAB IO routines `_ to save to a MAT -file. Note that the data contained in the output from -``StatePoint.extract_result`` is already in a Numpy array that can be reshaped -and dumped to MATLAB in one step. +file. Note that all arrays that are accessible in a statepoint are already in +NumPy arrays that can be reshaped and dumped to MATLAB in one step. ---------------------------- Particle Track Visualization @@ -463,15 +351,15 @@ particle numbers, respectively. For example, to output the tracks for particles After running OpenMC, the directory should contain a file of the form -"track_(batch #)_(generation #)_(particle #).(binary or h5)" for each particle -tracked. These track files can be converted into VTK poly data files with the -"track.py" utility. The usage of track.py is of the form "track.py [-o OUT] IN" -where OUT is the optional output filename and IN is one or more filenames -describing track files. The default output name is "track.pvtp". A common -usage of track.py is "track.py track*.binary" which will use the data from all -binary track files in the directory to write a "track.pvtp" VTK output file. -The .pvtp file can then be read and plotted by 3d visualization programs such as -ParaView. +"track_(batch #)_(generation #)_(particle #).h5" for each particle tracked. +These track files can be converted into VTK poly data files with the +``openmc-track-to-vtk`` utility. The usage of ``openmc-track-to-vtk`` is of the +form "openmc-track-to-vtk [-o OUT] IN" where OUT is the optional output filename +and IN is one or more filenames describing track files. The default output name +is "track.pvtp". A common usage of track.py is "openmc-track-to-vtk track*.h5" +which will use the data from all binary track files in the directory to write a +"track.pvtp" VTK output file. The .pvtp file can then be read and plotted by 3d +visualization programs such as ParaView. ---------------------- Source Site Processing @@ -480,43 +368,6 @@ Source Site Processing For eigenvalue problems, OpenMC will store information on the fission source sites in the statepoint file by default. For each source site, the weight, position, sampled direction, and sampled energy are stored. To extract this data -from a statepoint file, the statepoint.py Python module can be used. Below is an -example of an interactive ipython session using the statepoint.py Python module: - -.. code-block:: python - - In [1]: import statepoint - - In [2]: sp = statepoint.StatePoint('statepoint.100.h5') - - In [3]: sp.read_source() - - In [4]: len(sp.source) - Out[4]: 1000 - - In [5]: sp.source[0:10] - Out[5]: - [, - , - , - , - , - , - , - , - , - ] - - In [6]: site = sp.source[0] - - In [7]: site.weight - Out[7]: 1.0 - - In [8]: site.xyz - Out[8]: array([ 2.21980946, -8.92686048, 87.93720485]) - - In [9]: site.uvw - Out[9]: array([ 0.06740523, 0.50612814, 0.85982024]) - - In [10]: site.E - Out[10]: 0.93292326356564159 +from a statepoint file, the ``openmc.statepoint`` module can be used. An +:ref:`example IPython notebook ` demontrates how to +analyze and plot source information. diff --git a/_sources/usersguide/troubleshoot.txt b/_sources/usersguide/troubleshoot.txt index 10ac12184f..c5e4e7c1e1 100644 --- a/_sources/usersguide/troubleshoot.txt +++ b/_sources/usersguide/troubleshoot.txt @@ -31,21 +31,6 @@ f951: error: unrecognized command line option "-fbacktrace" You are probably using a version of the gfortran compiler that is too old. Download and install the latest version of gfortran_. - -make[1]: ifort: Command not found -********************************* - -You tried compiling with the Intel Fortran compiler and it was not found on your -:envvar:`PATH`. If you have the Intel compiler installed, make sure the shell -can locate it (this can be tested with :program:`which ifort`). - -make[1]: pgf90: Command not found -********************************* - -You tried compiling with the PGI Fortran compiler and it was not found on your -:envvar:`PATH`. If you have the PGI compiler installed, make sure the shell can -locate it (this can be tested with :program:`which pgf90`). - ------------------------- Problems with Simulations ------------------------- @@ -56,13 +41,13 @@ Segmentation Fault A segmentation fault occurs when the program tries to access a variable in memory that was outside the memory allocated for the program. The best way to debug a segmentation fault is to re-compile OpenMC with debug options turned -on. First go to your ``openmc/src`` directory where OpenMC was compiled and type -the following commands: +on. Create a new build directory and type the following commands: .. code-block:: sh - make distclean - make DEBUG=yes + mkdir build-debug && cd build-debug + cmake -Ddebug=on /path/to/openmc + make Now when you re-run your problem, it should report exactly where the program failed. If after reading the debug output, you are still unsure why the program diff --git a/_static/searchtools.js b/_static/searchtools.js index 0e794fd3e9..efec3c43cd 100644 --- a/_static/searchtools.js +++ b/_static/searchtools.js @@ -10,6 +10,7 @@ */ +/* Non-minified version JS is _stemmer.js if file is provided */ /** * Porter Stemmer */ @@ -373,8 +374,7 @@ var Search = { } // lookup as search terms in fulltext - results = results.concat(this.performTermsSearch(searchterms, excluded, terms, Scorer.term)) - .concat(this.performTermsSearch(searchterms, excluded, titleterms, Scorer.title)); + results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms)); // let the scorer override scores with a custom scoring function if (Scorer.score) { @@ -538,23 +538,47 @@ var Search = { /** * search for full-text terms in the index */ - performTermsSearch : function(searchterms, excluded, terms, score) { + performTermsSearch : function(searchterms, excluded, terms, titleterms) { var filenames = this._index.filenames; var titles = this._index.titles; - var i, j, file, files; + var i, j, file; var fileMap = {}; + var scoreMap = {}; var results = []; // perform the search on the required terms for (i = 0; i < searchterms.length; i++) { var word = searchterms[i]; + var files = []; + var _o = [ + {files: terms[word], score: Scorer.term}, + {files: titleterms[word], score: Scorer.title} + ]; + // no match but word was a required one - if ((files = terms[word]) === undefined) + if ($u.every(_o, function(o){return o.files === undefined;})) { break; - if (files.length === undefined) { - files = [files]; } + // found search word in contents + $u.each(_o, function(o) { + var _files = o.files; + if (_files === undefined) + return + + if (_files.length === undefined) + _files = [_files]; + files = files.concat(_files); + + // set score for the word in each file to Scorer.term + for (j = 0; j < _files.length; j++) { + file = _files[j]; + if (!(file in scoreMap)) + scoreMap[file] = {} + scoreMap[file][word] = o.score; + } + }); + // create the mapping for (j = 0; j < files.length; j++) { file = files[j]; @@ -576,7 +600,9 @@ var Search = { // ensure that none of the excluded terms is in the search result for (i = 0; i < excluded.length; i++) { if (terms[excluded[i]] == file || - $u.contains(terms[excluded[i]] || [], file)) { + titleterms[excluded[i]] == file || + $u.contains(terms[excluded[i]] || [], file) || + $u.contains(titleterms[excluded[i]] || [], file)) { valid = false; break; } @@ -584,6 +610,9 @@ var Search = { // if we have still a valid result we can add it to the result list if (valid) { + // select one (max) score for the file. + // for better ranking, we should calculate ranking by using words statistics like basic tf-idf... + var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]})); results.push([filenames[file], titles[file], '', null, score]); } } diff --git a/developers.html b/developers.html index f2d316b7e2..817b28a53d 100644 --- a/developers.html +++ b/developers.html @@ -14,7 +14,7 @@ - + @@ -997,7 +1198,7 @@ Merged tallies   ::   Contents   ::   - Pandas Dataframes  » + Multi-Group Cross Sections  »

@@ -1005,7 +1206,7 @@ Merged tallies - + @@ -40,7 +40,7 @@   ::   Contents   ::   - Release Notes for OpenMC 0.7.0  » + Release Notes for OpenMC 0.7.1  »

@@ -69,8 +69,8 @@ described in

Installing from Source on Linux or Mac OS X

All OpenMC source code is hosted on GitHub. If you have git, the gfortran -compiler, and CMake installed, you can download and install OpenMC be entering -the following commands in a terminal:

+compiler, CMake, and HDF5 installed, you can download and install OpenMC be +entering the following commands in a terminal:

git clone https://github.com/mit-crpg/openmc.git
 cd openmc
 git checkout -b master origin/master
@@ -98,7 +98,7 @@ should specify an installation directory where you have write access, e.g.

  ::   Contents   ::   - Release Notes for OpenMC 0.7.0  » + Release Notes for OpenMC 0.7.1  »

@@ -106,7 +106,7 @@ should specify an installation directory where you have write access, e.g.

- + @@ -41,7 +41,7 @@   ::   Contents   ::   - 4. Data Processing and Visualization  » + 4. Output File Formats  »

@@ -130,11 +130,10 @@ is a table of the messages that will be printed after each file is checked.

-

As an example, if OpenMC is installed in the directory -/opt/openmc/0.6.2 and the current working directory is where -OpenMC XML input files are located, they can be validated using -the following command:

-
/opt/openmc/0.6.2/bin/xml_validate
+

As an example, if OpenMC is installed in the directory /opt/openmc/ and the +current working directory is where OpenMC XML input files are located, they can +be validated using the following command:

+
/opt/openmc/bin/openmc-validate-xml
 
@@ -822,9 +821,8 @@ displayed. This element takes the following attributes:

The geometry in OpenMC is described using constructive solid geometry (CSG), also sometimes referred to as combinatorial geometry. CSG allows a user to create complex objects using Boolean operators on a set of simpler surfaces. In -the geometry model, each unique closed volume in defined by its bounding -surfaces. In OpenMC, most quadratic surfaces can be modeled and used as -bounding surfaces.

+the geometry model, each unique volume is defined by its bounding surfaces. In +OpenMC, most quadratic surfaces can be modeled and used as bounding surfaces.

Every geometry.xml must have an XML declaration at the beginning of the file and a root element named geometry. Within the root element the user can define any number of cells, surfaces, and lattices. Let us look at the following example:

@@ -843,7 +841,7 @@ number of cells, surfaces, and lattices. Let us look at the following example:<id>1</id> <universe>0</universe> <material>1</material> - <surfaces>-1</surfaces> + <region>-1</region> </cell> </geometry>
@@ -859,7 +857,7 @@ could be written as:

<!-- This is a comment --> <surface id="1" type="sphere" coeffs="0.0 0.0 0.0 5.0" boundary="vacuum" /> - <cell id="1" universe="0" material="1" surfaces="-1" /> + <cell id="1" universe="0" material="1" region="-1" /> </geometry> @@ -882,7 +880,8 @@ files. This string is limited to 52 characters for formatting purposes.

type:

The type of the surfaces. This can be “x-plane”, “y-plane”, “z-plane”, -“plane”, “x-cylinder”, “y-cylinder”, “z-cylinder”, or “sphere”.

+“plane”, “x-cylinder”, “y-cylinder”, “z-cylinder”, “sphere”, “x-cone”, +“y-cone”, “z-cone”, or “quadric”.

Default: None

@@ -944,6 +943,10 @@ R^2 (y - y_0)^2"/>. The coefficients specified are “. The coefficients specified are “x_0 \: y_0 \: z_0
 \: R^2”. +quadric:A general quadric surface of the form Ax^2 + By^2 + Cz^2 + Dxy +
+Eyz + Fxz + Gx + Hy + Jz + K = 0 The coefficients specified are “A
+\: B \: C \: D \: E \: F \: G \: H \: J \: K”. + @@ -986,15 +989,27 @@ contain no material, this can also be set to “void”.

Default: None

-surfaces:

A list of the ids for surfaces that bound this cell, e.g. if the cell -is on the negative side of surface 3 and the positive side of surface 5, the -bounding surfaces would be given as “-3 5”.

+region:

A Boolean expression of half-spaces that defines the spatial region which +the cell occupies. Each half-space is identified by the unique ID of the +surface prefixed by - or + to indicate that it is the negative or +positive half-space, respectively. The + sign for a positive half-space +can be omitted. Valid Boolean operators are parentheses, union |, +complement ~, and intersection. Intersection is implicit and indicated by +the presence of whitespace. The order of operator precedence is parentheses, +complement, intersection, and then union.

+

As an example, the following code gives a cell that is the union of the +negative half-space of surface 3 and the complement of the intersection of +the positive half-space of surface 5 and the negative half-space of surface +2:

+
<cell id="1" material="1" region="-3 | ~(5 -2)" />
+
+

Note

-

The surface attribute/element can be omitted to make a cell fill -its entire universe.

+

The region attribute/element can be omitted to make a cell +fill its entire universe.

-

Default: No surfaces

+

Default: A region filling all space.

rotation:

If the cell is filled with a universe, this element specifies the angles in @@ -1183,8 +1198,10 @@ files. This string is limited to 52 characters for formatting purposes.

density:

An element with attributes/sub-elements called value and units. The value attribute is the numeric value of the density while the units can be “g/cm3”, “kg/m3”, “atom/b-cm”, “atom/cm3”, or “sum”. The “sum” unit -indicates that the density should be calculated as the sum of the atom -fractions for each nuclide in the material. This should not be used in +indicates that values appearing in ao attributes for <nuclide> and +<element> sub-elements are to be interpreted as nuclide/element +densities in atom/b-cm, and the total density of the material is taken as +the sum of all nuclides/elements. The “sum” option cannot be used in conjunction with weight percents.

Default: None

@@ -1204,6 +1221,14 @@ example would be as follows:

If one nuclide is specified in atom percent, all others must also be given in atom percent. The same applies for weight percentages.

+

An optional attribute/sub-element for each nuclide is scattering. This +attribute may be set to “data” to use the scattering laws specified by the +cross section library (default). Alternatively, when set to “iso-in-lab”, +the scattering laws are used to sample the outgoing energy but an +isotropic-in-lab distribution is used to sample the outgoing angle at each +scattering interaction. The scattering attribute may be most useful +when using OpenMC to compute multi-group cross-sections for deterministic +transport codes and to quantify the effects of anisotropic scattering.

Default: None

@@ -1225,6 +1250,15 @@ would be as follows:

have cross sections. The <natural_elements> Element option determines how a natural element is split into isotopes in these cases.

Default: None

+

An optional attribute/sub-element for each element is scattering. This +attribute may be set to “data” to use the scattering laws specified by the +cross section library (default). Alternatively, when set to “iso-in-lab”, +the scattering laws are used to sample the outgoing energy but an +isotropic-in-lab distribution is used to sample the outgoing angle at each +scattering interaction. The scattering attribute may be most useful +when using OpenMC to compute multi-group cross-sections for deterministic +transport codes and to quantify the effects of anisotropic scattering.

+

Default: None

sab:

Associates an S(a,b) table with the material. This element has @@ -1294,8 +1328,8 @@ specify multiple filters, you must use multiple < type:

The type of the filter. Accepted options are “cell”, “cellborn”, -“material”, “universe”, “energy”, “energyout”, “mesh”, and -“distribcell”.

+“material”, “universe”, “energy”, “energyout”, “mesh”, “distribcell”, +and “delayedgroup”.

bins:

For each filter type, the corresponding bins entry is given as @@ -1321,24 +1355,81 @@ originally born in a specified cell.

energy:

A monotonically increasing list of bounding pre-collision energies -for a number of groups. For example, if this filter is specified as -<filter type="energy" bins="0.0 1.0 20.0" />, then two energy bins -will be created, one with energies between 0 and 1 MeV and the other -with energies between 1 and 20 MeV.

+for a number of groups. For example, if this filter is specified as

+
<filter type="energy" bins="0.0 1.0 20.0" />
+
+
+

then two energy bins will be created, one with energies between 0 and +1 MeV and the other with energies between 1 and 20 MeV.

energyout:

A monotonically increasing list of bounding post-collision energies for a number of groups. For example, if this filter is -specified as <filter type="energyout" bins="0.0 1.0 20.0" />, then -two post-collision energy bins will be created, one with energies +specified as

+
<filter type="energyout" bins="0.0 1.0 20.0" />
+
+
+

then two post-collision energy bins will be created, one with energies between 0 and 1 MeV and the other with energies between 1 and 20 MeV.

-mesh:

The id of a structured mesh to be tallied over.

+mu:

A monotonically increasing list of bounding post-collision cosines +of the change in a particle’s angle (i.e., \mu = \hat{\Omega}
+\cdot \hat{\Omega}'), which represents a portion of the possible +values of [-1,1]. For example, spanning all of [-1,1] +with five equi-width bins can be specified as:

+
<filter type="mu" bins="-1.0 -0.6 -0.2 0.2 0.6 1.0" />
+
+
+

Alternatively, if only one value is provided as a bin, OpenMC will +interpret this to mean the complete range of [-1,1] should +be automatically subdivided in to the provided value for the bin. +That is, the above example of five equi-width bins spanning +[-1,1] can be instead written as:

+
<filter type="mu" bins="5" />
+
+
-distribcell:

The single cell which should be tallied uniquely for all instances.

-
+polar:

A monotonically increasing list of bounding particle polar angles +which represents a portion of the possible values of [0,\pi]. +For example, spanning all of [0,\pi] with five equi-width +bins can be specified as:

+
<filter type="polar" bins="0.0 0.6283 1.2566 1.8850 2.5132 3.1416"/>
+
+
+

Alternatively, if only one value is provided as a bin, OpenMC will +interpret this to mean the complete range of [0,\pi] should +be automatically subdivided in to the provided value for the bin. +That is, the above example of five equi-width bins spanning +[0,\pi] can be instead written as:

+
<filter type="polar" bins="5" />
+
+
+ + +azimuthal:

A monotonically increasing list of bounding particle azimuthal angles +which represents a portion of the possible values of [-\pi,\pi). +For example, spanning all of [-\pi,\pi) with two equi-width +bins can be specified as:

+
<filter type="azimuthal" bins="0.0 3.1416 6.2832" />
+
+
+

Alternatively, if only one value is provided as a bin, OpenMC will +interpret this to mean the complete range of [-\pi,\pi) should +be automatically subdivided in to the provided value for the bin. +That is, the above example of five equi-width bins spanning +[-\pi,\pi) can be instead written as:

+
<filter type="azimuthal" bins="2" />
+
+
+ + +mesh:

The id of a structured mesh to be tallied over.

+ + +distribcell:

The single cell which should be tallied uniquely for all instances.

+

Note

The distribcell filter will take a single cell ID and will tally each unique occurrence of that cell separately. This filter will @@ -1347,6 +1438,14 @@ this filter with a cell or mesh filter.

+delayedgroup:

A list of delayed neutron precursor groups for which the tally should +be accumulated. For instance, to tally to all 6 delayed groups in the +ENDF/B-VII.1 library the filter is specified as:

+
<filter type="delayedgroup" bins="1 2 3 4 5 6" />
+
+
+ + @@ -1368,26 +1467,33 @@ be:

Default: total

-estimator:

The estimator element is used to force the use of either analog or -tracklength tally estimation. ‘’analog’’ is generally less efficient -though it can be used with every score type. ‘’tracklength’’ is generally -the most efficient, though its usage is restricted to tallies that do not -score particle information which requires a collision to have occured, such -as a scattering tally which utilizes outgoing energy filters.

-

Default: tracklength but will revert to analog if necessary.

+estimator:

The estimator element is used to force the use of either analog, +collision, or tracklength tally estimation. analog is generally +the least efficient though it can be used with every score type. +tracklength is generally the most efficient, but neither tracklength +nor collision can be used to score a tally that requires post-collision +information. For example, a scattering tally with outgoing energy filters +cannot be used with tracklength or collision because the code will +not know the outgoing energy distribution.

+

Default: tracklength but will revert to analog if necessary.

scores:

A space-separated list of the desired responses to be accumulated. Accepted options are “flux”, “total”, “scatter”, “absorption”, “fission”, -“nu-fission”, “kappa-fission”, “nu-scatter”, “scatter-N”, “scatter-PN”, -“scatter-YN”, “nu-scatter-N”, “nu-scatter-PN”, “nu-scatter-YN”, “flux-YN”, -“total-YN”, “current”, and “events”. These corresponding to the following -physical quantities:

+“nu-fission”, “delayed-nu-fission”, “kappa-fission”, “nu-scatter”, +“scatter-N”, “scatter-PN”, “scatter-YN”, “nu-scatter-N”, “nu-scatter-PN”, +“nu-scatter-YN”, “flux-YN”, “total-YN”, “current”, “inverse-velocity” and +“events”. These correspond to the following physical quantities:

- + + + - - - - + - - - + + + @@ -1536,8 +1657,7 @@ attributes/sub-elements:

- + @@ -1634,16 +1754,16 @@ respectively.

Default: None - Required entry

-
flux:

Total flux in particle-cm per source particle.

+
+

Note

+

The analog estimator is actually identical to the collision +estimator for the flux score.

+
total:

Total reaction rate in reactions per source particle.

@@ -1408,7 +1514,12 @@ produce secondary neutrons. Units are reactions per source particle.

per source neutron.

kappa-fission:

The recoverable energy production rate due to fission. The recoverable +

delayed-nu-fission:
 

Total production of delayed neutrons due to fission. Units are neutrons produced +per source neutron.

+
kappa-fission:

The recoverable energy production rate due to fission. The recoverable energy is defined as the fission product kinetic energy, prompt and delayed neutron kinetic energies, prompt and delayed \gamma-ray total energies, and the total energy released by the delayed \beta @@ -1417,13 +1528,13 @@ prompt and delayed

scatter-N:

Tally the Nth scattering moment, where N is the Legendre +

scatter-N:

Tally the Nth scattering moment, where N is the Legendre expansion order of the change in particle angle \left(\mu\right). N must be between 0 and 10. As an example, tallying the 2nd scattering moment would be specified as <scores> scatter-2 </scores>. Units are reactions per source particle.

scatter-PN:

Tally all of the scattering moments from order 0 to N, where N is the +

scatter-PN:

Tally all of the scattering moments from order 0 to N, where N is the Legendre expansion order of the change in particle angle \left(\mu\right). That is, scatter-P1 is equivalent to requesting tallies of scatter-0 and scatter-1. Like for @@ -1432,7 +1543,7 @@ the 2nd scattering moment would be specified as scatter-P2 </scores>. Units are reactions per source particle.

scatter-YN:

scatter-YN is similar to scatter-PN except an additional expansion +

scatter-YN:

scatter-YN is similar to scatter-PN except an additional expansion is performed for the incoming particle direction \left(\Omega\right) using the real spherical harmonics. This is useful for performing angular flux moment weighting of the scattering @@ -1441,27 +1552,27 @@ from order 0 to N; N again must be between 0 and 10. Units are reactions per source particle.

nu-scatter, nu-scatter-N, nu-scatter-PN, nu-scatter-YN:
 

These scores are similar in functionality to their scatter* +

nu-scatter, nu-scatter-N, nu-scatter-PN, nu-scatter-YN:
 

These scores are similar in functionality to their scatter* equivalents except the total production of neutrons due to scattering is scored vice simply the scattering rate. This accounts for multiplicity from (n,2n), (n,3n), and (n,4n) reactions. Units are neutrons produced per source particle.

flux-YN:

Spherical harmonic expansion of the direction of motion +

flux-YN:

Spherical harmonic expansion of the direction of motion \left(\Omega\right) of the total flux. This score will tally all of the harmonic moments of order 0 to N. N must be between 0 and 10. Units are particle-cm per source particle.

total-YN:

The total reaction rate expanded via spherical harmonics about the +

total-YN:

The total reaction rate expanded via spherical harmonics about the direction of motion of the neutron, \Omega. This score will tally all of the harmonic moments of order 0 to N. N must be between 0 and 10. Units are reactions per source particle.

current:

Partial currents on the boundaries of each cell in a mesh. Units are +

current:

Partial currents on the boundaries of each cell in a mesh. Units are particles per source particle.

Note

@@ -1471,6 +1582,16 @@ other score.

inverse-velocity:
 

The flux-weighted inverse velocity where the velocity is in units of +centimeters per second.

+
+

Note

+

The analog estimator is actually identical to the collision +estimator for the inverse-velocity score.

+
+
events:

Number of scoring events. Units are events per source particle.

type:The type of structured mesh. Valid options include “rectangular” and -“hexagonal”.
type:The type of structured mesh. The only valid option is “regular”.
dimension:The number of mesh cells in each direction.
type:

Keyword for type of plot to be produced. Currently only “slice” and -“voxel” plots are implemented. The “slice” plot type creates 2D pixel -maps saved in the PPM file format. PPM files can be displayed in most -viewers (e.g. the default Gnome viewer, IrfanView, etc.). The “voxel” -plot type produces a binary datafile containing voxel grid positioning and -the cell or material (specified by the color tag) at the center of each -voxel. These datafiles can be processed into 3D SILO files using the -voxel.py utility provided with the OpenMC source, and subsequently -viewed with a 3D viewer such as VISIT or Paraview. See the -Voxel Plot Binary File Specifications for information about the datafile structure.

+
type:

Keyword for type of plot to be produced. Currently only “slice” and “voxel” +plots are implemented. The “slice” plot type creates 2D pixel maps saved in +the PPM file format. PPM files can be displayed in most viewers (e.g. the +default Gnome viewer, IrfanView, etc.). The “voxel” plot type produces a +binary datafile containing voxel grid positioning and the cell or material +(specified by the color tag) at the center of each voxel. These +datafiles can be processed into 3D SILO files using the +openmc-voxel-to-silovtk utility provided with the OpenMC source, and +subsequently viewed with a 3D viewer such as VISIT or Paraview. See the +Voxel Plot File Format for information about the datafile structure.

Note

Since the PPM format is saved without any kind of compression, @@ -2006,7 +2126,7 @@ running OpenMC.

  ::   Contents   ::   - 4. Data Processing and Visualization  » + 4. Output File Formats  »

@@ -2014,7 +2134,7 @@ running OpenMC.

+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/usersguide/output/particle_restart.html b/usersguide/output/particle_restart.html new file mode 100644 index 0000000000..b65361f12c --- /dev/null +++ b/usersguide/output/particle_restart.html @@ -0,0 +1,128 @@ + + + + + + + + 4.4. Particle Restart File Format — OpenMC Documentation + + + + + + + + + + + + + + + + +
+ + +
+

4.4. Particle Restart File Format

+

The current revision of the particle restart file format is 1.

+

/filetype (char[])

+
+
String indicating the type of file.
+

/revision (int)

+
+
Revision of the particle restart file format. Any time a change is made in +the format, this integer is incremented.
+

/current_batch (int)

+
+
The number of batches already simulated.
+

/gen_per_batch (int)

+
+
Number of generations per batch.
+

/current_gen (int)

+
+
The number of generations already simulated.
+

/n_particles (int8_t)

+
+
Number of particles used per generation.
+

/run_mode (int)

+
+
Run mode used. A value of 1 indicates a fixed-source run and a value of 2 +indicates an eigenvalue run.
+

/id (int8_t)

+
+
Unique identifier of the particle.
+

/weight (double)

+
+
Weight of the particle.
+

/energy (double)

+
+
Energy of the particle in MeV.
+

/xyz (double[3])

+
+
Position of the particle.
+

/uvw (double[3])

+
+
Direction of the particle.
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/usersguide/output/source.html b/usersguide/output/source.html new file mode 100644 index 0000000000..5bef477d4a --- /dev/null +++ b/usersguide/output/source.html @@ -0,0 +1,100 @@ + + + + + + + + 4.2. Source File Format — OpenMC Documentation + + + + + + + + + + + + + + + + +
+ + +
+

4.2. Source File Format

+

Normally, source data is stored in a state point file. However, it is possible +to request that the source be written separately, in which case the format used +is that documented here.

+

/filetype (char[])

+
+
String indicating the type of file.
+

/source_bank (Compound type)

+
+
Source bank information for each particle. The compound type has fields +wgt, xyz, uvw, and E which represent the weight, position, +direction, and energy of the source particle, respectively.
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/usersguide/output/statepoint.html b/usersguide/output/statepoint.html new file mode 100644 index 0000000000..064e4553f3 --- /dev/null +++ b/usersguide/output/statepoint.html @@ -0,0 +1,287 @@ + + + + + + + + 4.1. State Point File Format — OpenMC Documentation + + + + + + + + + + + + + + + + +
+ + +
+

4.1. State Point File Format

+

The current revision of the statepoint file format is 14.

+

/filetype (char[])

+
+
String indicating the type of file.
+

/revision (int)

+
+
Revision of the state point file format. Any time a change is made in the +format, this integer is incremented.
+

/version_major (int)

+
+
Major version number for OpenMC
+

/version_minor (int)

+
+
Minor version number for OpenMC
+

/version_release (int)

+
+
Release version number for OpenMC
+

/date_and_time (char[])

+
+
Date and time the state point was written.
+

/path (char[])

+
+
Absolute path to directory containing input files.
+

/seed (int8_t)

+
+
Pseudo-random number generator seed.
+

/run_mode (char[])

+
+
Run mode used. A value of 1 indicates a fixed-source run and a value of 2 +indicates an eigenvalue run.
+

/n_particles (int8_t)

+
+
Number of particles used per generation.
+

/n_batches (int)

+
+
Number of batches to simulate.
+

/current_batch (int)

+
+
The number of batches already simulated.
+

if run_mode == ‘k-eigenvalue’:

+
+

/n_inactive (int)

+
+
Number of inactive batches.
+

/gen_per_batch (int)

+
+
Number of generations per batch.
+

/k_generation (double[])

+
+
k-effective for each generation simulated.
+

/entropy (double[])

+
+
Shannon entropy for each generation simulated
+

/k_col_abs (double)

+
+
Sum of product of collision/absorption estimates of k-effective
+

/k_col_tra (double)

+
+
Sum of product of collision/track-length estimates of k-effective
+

/k_abs_tra (double)

+
+
Sum of product of absorption/track-length estimates of k-effective
+

/k_combined (double[2])

+
+
Mean and standard deviation of a combined estimate of k-effective
+

/cmfd_on (int)

+
+
Flag indicating whether CMFD is on (1) or off (0).
+

if (cmfd_on)

+
+

/cmfd/indices (int[4])

+
+
Indices for cmfd mesh (i,j,k,g)
+

/cmfd/k_cmfd (double[])

+
+
CMFD eigenvalues
+

/cmfd/cmfd_src (double[][][][])

+
+
CMFD fission source
+

/cmfd/cmfd_entropy (double[])

+
+
CMFD estimate of Shannon entropy
+

/cmfd/cmfd_balance (double[])

+
+
RMS of the residual neutron balance equation on CMFD mesh
+

/cmfd/cmfd_dominance (double[])

+
+
CMFD estimate of dominance ratio
+

/cmfd/cmfd_srccmp (double[])

+
+
RMS comparison of difference between OpenMC and CMFD fission source
+
+
+

/tallies/n_meshes (int)

+
+
Number of meshes in tallies.xml file
+

/tally/meshes/ids (int[])

+
+
Internal unique ID of each mesh.
+

/tally/meshes/keys (int[])

+
+
User-identified unique ID of each mesh.
+

/tallies/meshes/mesh <uid>/type (char[])

+
+
Type of mesh.
+

/tallies/meshes/mesh <uid>/dimension (int)

+
+
Number of mesh cells in each dimension.
+

/tallies/meshes/mesh <uid>/lower_left (double[])

+
+
Coordinates of lower-left corner of mesh.
+

/tallies/meshes/mesh <uid>/upper_right (double[])

+
+
Coordinates of upper-right corner of mesh.
+

/tallies/meshes/mesh <uid>/width (double[])

+
+
Width of each mesh cell in each dimension.
+

/tallies/n_tallies (int)

+
+
Number of user-defined tallies.
+

/tallies/ids (int[])

+
+
Internal unique ID of each tally.
+

/tallies/keys (int[])

+
+
User-identified unique ID of each tally.
+

/tallies/tally <uid>/estimator (char[])

+
+
Type of tally estimator, either ‘analog’, ‘tracklength’, or ‘collision’.
+

/tallies/tally <uid>/n_realizations (int)

+
+
Number of realizations.
+

/tallies/tally <uid>/n_filters (int)

+
+
Number of filters used.
+

/tallies/tally <uid>/filter <j>/type (char[])

+
+
Type of the j-th filter. Can be ‘universe’, ‘material’, ‘cell’, ‘cellborn’, +‘surface’, ‘mesh’, ‘energy’, ‘energyout’, or ‘distribcell’.
+

/tallies/tally <uid>/filter <j>/offset (int)

+
+
Filter offset (used for distribcell filter).
+

/tallies/tally <uid>/filter <j>/n_bins (int)

+
+
Number of bins for the j-th filter.
+

/tallies/tally <uid>/filter <j>/bins (int[] or double[])

+
+
Value for each filter bin of this type.
+

/tallies/tally <uid>/nuclides (char[][])

+
+
Array of nuclides to tally. Note that if no nuclide is specified in the user +input, a single ‘total’ nuclide appears here.
+

/tallies/tally <uid>/n_score_bins (int)

+
+
Number of scoring bins for a single nuclide. In general, this can be greater +than the number of user-specified scores since each score might have +multiple scoring bins, e.g., scatter-PN.
+

/tallies/tally <uid>/score_bins (char[][])

+
+
Values of specified scores.
+

/tallies/tally <uid>/n_user_scores (int)

+
+
Number of scores without accounting for those added by expansions, +e.g. scatter-PN.
+

/tallies/tally <uid>/moment_orders (char[][])

+
+
Tallying moment orders for Legendre and spherical harmonic tally expansions +(e.g., ‘P2’, ‘Y1,2’, etc.).
+

/tallies/tally <uid>/results (Compound type)

+
+
Accumulated sum and sum-of-squares for each bin of the i-th tally. This is a +two-dimensional array, the first dimension of which represents combinations +of filter bins and the second dimensions of which represents scoring +bins. Each element of the array has fields ‘sum’ and ‘sum_sq’.
+

/source_present (int)

+
+
Flag indicated if source bank is present in the file
+

/n_realizations (int)

+
+
Number of realizations for global tallies.
+

/n_global_tallies (int)

+
+
Number of global tally scores.
+

/global_tallies (Compound type)

+
+
Accumulated sum and sum-of-squares for each global tally. The compound type +has fields named sum and sum_sq.
+

tallies_present (int)

+
+
Flag indicated if tallies are present in the file.
+

if (run_mode == ‘k-eigenvalue’ and source_present > 0)

+
+

/source_bank (Compound type)

+
+
Source bank information for each particle. The compound type has fields +wgt, xyz, uvw, and E which represent the weight, +position, direction, and energy of the source particle, respectively.
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/usersguide/output/summary.html b/usersguide/output/summary.html new file mode 100644 index 0000000000..2c0e7219d6 --- /dev/null +++ b/usersguide/output/summary.html @@ -0,0 +1,324 @@ + + + + + + + + 4.3. Summary File Format — OpenMC Documentation + + + + + + + + + + + + + + + + +
+ + +
+

4.3. Summary File Format

+

The current revision of the summary file format is 1.

+

/filetype (char[])

+
+
String indicating the type of file.
+

/revision (int)

+
+
Revision of the summary file format. Any time a change is made in the +format, this integer is incremented.
+

/version_major (int)

+
+
Major version number for OpenMC
+

/version_minor (int)

+
+
Minor version number for OpenMC
+

/version_release (int)

+
+
Release version number for OpenMC
+

/date_and_time (char[])

+
+
Date and time the summary was written.
+

/n_procs (int)

+
+
Number of MPI processes used.
+

/n_particles (int8_t)

+
+
Number of particles used per generation.
+

/n_batches (int)

+
+
Number of batches to simulate.
+

/n_inactive (int)

+
+
Number of inactive batches. Only present if /run_mode is set to +‘k-eigenvalue’.
+

/n_active (int)

+
+
Number of active batches. Only present if /run_mode is set to +‘k-eigenvalue’.
+

/gen_per_batch (int)

+
+
Number of generations per batch. Only present if /run_mode is set to +‘k-eigenvalue’.
+

/geometry/n_cells (int)

+
+
Number of cells in the problem.
+

/geometry/n_surfaces (int)

+
+
Number of surfaces in the problem.
+

/geometry/n_universes (int)

+
+
Number of unique universes in the problem.
+

/geometry/n_lattices (int)

+
+
Number of lattices in the problem.
+

/geometry/cells/cell <uid>/index (int)

+
+
Index in cells array used internally in OpenMC.
+

/geometry/cells/cell <uid>/name (char[])

+
+
Name of the cell.
+

/geometry/cells/cell <uid>/universe (int)

+
+
Universe assigned to the cell. If none is specified, the default +universe (0) is assigned.
+

/geometry/cells/cell <uid>/fill_type (char[])

+
+
Type of fill for the cell. Can be ‘normal’, ‘universe’, or ‘lattice’.
+

/geometry/cells/cell <uid>/material (int)

+
+
Unique ID of the material assigned to the cell. This dataset is present only +if fill_type is set to ‘normal’.
+

/geometry/cells/cell <uid>/offset (int[])

+
+
Offsets used for distribcell tally filter. This dataset is present only if +fill_type is set to ‘universe’.
+

/geometry/cells/cell <uid>/translation (double[3])

+
+
Translation applied to the fill universe. This dataset is present only if +fill_type is set to ‘universe’.
+

/geometry/cells/cell <uid>/rotation (double[3])

+
+
Angles in degrees about the x-, y-, and z-axes for which the fill universe +should be rotated. This dataset is present only if fill_type is set to +‘universe’.
+

/geometry/cells/cell <uid>/lattice (int)

+
+
Unique ID of the lattice which fills the cell. Only present if fill_type is +set to ‘lattice’.
+

/geometry/cells/cell <uid>/region (char[])

+
+
Region specification for the cell.
+

/geometry/surfaces/surface <uid>/index (int)

+
+
Index in surfaces array used internally in OpenMC.
+

/geometry/surfaces/surface <uid>/name (char[])

+
+
Name of the surface.
+

/geometry/surfaces/surface <uid>/type (char[])

+
+
Type of the surface. Can be ‘x-plane’, ‘y-plane’, ‘z-plane’, ‘plane’, +‘x-cylinder’, ‘y-cylinder’, ‘sphere’, ‘x-cone’, ‘y-cone’, ‘z-cone’, or +‘quadric’.
+

/geometry/surfaces/surface <uid>/coefficients (double[])

+
+
Array of coefficients that define the surface. See <surface> Element +for what coefficients are defined for each surface type.
+

/geometry/surfaces/surface <uid>/boundary_condition (char[])

+
+
Boundary condition applied to the surface. Can be ‘transmission’, ‘vacuum’, +‘reflective’, or ‘periodic’.
+

/geometry/universes/universe <uid>/index (int)

+
+
Index in the universes array used internally in OpenMC.
+

/geometry/universes/universe <uid>/cells (int[])

+
+
Array of unique IDs of cells that appear in the universe.
+

/geometry/lattices/lattice <uid>/index (int)

+
+
Index in the lattices array used internally in OpenMC.
+

/geometry/lattices/lattice <uid>/name (char[])

+
+
Name of the lattice.
+

/geometry/lattices/lattice <uid>/type (char[])

+
+
Type of the lattice, either ‘rectangular’ or ‘hexagonal’.
+

/geometry/lattices/lattice <uid>/pitch (double[])

+
+
Pitch of the lattice.
+

/geometry/lattices/lattice <uid>/outer (int)

+
+
Outer universe assigned to lattice cells outside the defined range.
+

/geometry/lattices/lattice <uid>/offsets (int[])

+
+
Offsets used for distribcell tally filter.
+

/geometry/lattices/lattice <uid>/universes (int[])

+
+
Three-dimensional array of universes assigned to each cell of the lattice.
+

/geometry/lattices/lattice <uid>/dimension (int[])

+
+
The number of lattice cells in each direction. This dataset is present only +when the ‘type’ dataset is set to ‘rectangular’.
+

/geometry/lattices/lattice <uid>/lower_left (double[])

+
+
The coordinates of the lower-left corner of the lattice. This dataset is +present only when the ‘type’ dataset is set to ‘rectangular’.
+

/geometry/lattices/lattice <uid>/n_rings (int)

+
+
Number of radial ring positions in the xy-plane. This dataset is present +only when the ‘type’ dataset is set to ‘hexagonal’.
+

/geometry/lattices/lattice <uid>/n_axial (int)

+
+
Number of lattice positions along the z-axis. This dataset is present only +when the ‘type’ dataset is set to ‘hexagonal’.
+

/geometry/lattices/lattice <uid>/center (double[])

+
+
Coordinates of the center of the lattice. This dataset is present only when +the ‘type’ dataset is set to ‘hexagonal’.
+

/n_materials (int)

+
+
Number of materials in the problem.
+

/materials/material <uid>/index (int)

+
+
Index in materials array used internally in OpenMC.
+

/materials/material <uid>/name (char[])

+
+
Name of the material.
+

/materials/material <uid>/atom_density (double[])

+
+
Total atom density of the material in atom/b-cm.
+

/materials/material <uid>/nuclides (char[][])

+
+
Array of nuclides present in the material, e.g., ‘U-235.71c’.
+

/materials/material <uid>/nuclide_densities (double[])

+
+
Atom density of each nuclide.
+

/materials/material <uid>/sab_names (char[][])

+
+
Names of S(\alpha,:math:beta) tables assigned to the material.
+

/tallies/n_tallies (int)

+
+
Number of tallies in the problem.
+

/tallies/n_meshes (int)

+
+
Number of meshes in the problem.
+

/tallies/mesh <uid>/index (int)

+
+
Index in the meshes array used internally in OpenMC.
+

/tallies/mesh <uid>/type (char[])

+
+
Type of the mesh. The only valid option is currently ‘regular’.
+

/tallies/mesh <uid>/dimension (int[])

+
+
Number of mesh cells in each direction.
+

/tallies/mesh <uid>/lower_left (double[])

+
+
Coordinates of the lower-left corner of the mesh.
+

/tallies/mesh <uid>/upper_right (double[])

+
+
Coordinates of the upper-right corner of the mesh.
+

/tallies/mesh <uid>/width (double[])

+
+
Width of a single mesh cell in each direction.
+

/tallies/tally <uid>/index (int)

+
+
Index in tallies array used internally in OpenMC.
+

/tallies/tally <uid>/name (char[])

+
+
Name of the tally.
+

/tallies/tally <uid>/n_filters (int)

+
+
Number of filters applied to the tally.
+

/tallies/tally <uid>/filter <j>/type (char[])

+
+
Type of the j-th filter. Can be ‘universe’, ‘material’, ‘cell’, ‘cellborn’, +‘surface’, ‘mesh’, ‘energy’, ‘energyout’, or ‘distribcell’.
+

/tallies/tally <uid>/filter <j>/offset (int)

+
+
Filter offset (used for distribcell filter).
+

/tallies/tally <uid>/filter <j>/n_bins (int)

+
+
Number of bins for the j-th filter.
+

/tallies/tally <uid>/filter <j>/bins (int[] or double[])

+
+
Value for each filter bin of this type.
+

/tallies/tally <uid>/nuclides (char[][])

+
+
Array of nuclides to tally. Note that if no nuclide is specified in the user +input, a single ‘total’ nuclide appears here.
+

/tallies/tally <uid>/n_score_bins (int)

+
+
Number of scoring bins for a single nuclide. In general, this can be greater +than the number of user-specified scores since each score might have +multiple scoring bins, e.g., scatter-PN.
+

/tallies/tally <uid>/score_bins (char[][])

+
+
Scoring bins for the tally.
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/usersguide/output/track.html b/usersguide/output/track.html new file mode 100644 index 0000000000..083254a02d --- /dev/null +++ b/usersguide/output/track.html @@ -0,0 +1,109 @@ + + + + + + + + 4.5. Track File Format — OpenMC Documentation + + + + + + + + + + + + + + + + +
+ + +
+

4.5. Track File Format

+

The current revision of the particle track file format is 1.

+

/filetype (char[])

+
+
String indicating the type of file.
+

/revision (int)

+
+
Revision of the track file format. Any time a change is made in the format, +this integer is incremented.
+

/n_particles (int)

+
+
Number of particles for which tracks are recorded.
+

/n_coords (int[])

+
+
Number of coordinates for each particle.
+

do i = 1, n_particles

+
+

/coordinates_i (double[][3])

+
+
(x,y,z) coordinates for the i-th particle.
+
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/usersguide/output/voxel.html b/usersguide/output/voxel.html new file mode 100644 index 0000000000..25f46ad465 --- /dev/null +++ b/usersguide/output/voxel.html @@ -0,0 +1,104 @@ + + + + + + + + 4.6. Voxel Plot File Format — OpenMC Documentation + + + + + + + + + + + + + + + + +
+ + +
+

4.6. Voxel Plot File Format

+

/filetype (char[])

+
+
String indicating the type of file.
+

/num_voxels (int[3])

+
+
Number of voxels in the x-, y-, and z- directions.
+

/voxel_width (double[3])

+
+
Width of a voxel in centimeters.
+

/lower_left (double[3])

+
+
Cartesian coordinates of the lower-left corner of the plot.
+

/data (int[][][])

+
+
Data for each voxel that represents a material or cell ID.
+
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/usersguide/processing.html b/usersguide/processing.html index 53a241e1d0..4ffe93ae2c 100644 --- a/usersguide/processing.html +++ b/usersguide/processing.html @@ -6,7 +6,7 @@ - 4. Data Processing and Visualization — OpenMC Documentation + 5. Data Processing and Visualization — OpenMC Documentation @@ -14,7 +14,7 @@ - - + +