From 692c9863c2bd077483bcf18d044a9fc71df4f69f Mon Sep 17 00:00:00 2001 From: Phoebe Pearce Date: Fri, 10 Nov 2023 13:07:30 +1100 Subject: [PATCH] Further Sesame changes - Refactor Sesame PDD into two files, update tests and documentation/docstrings - Remove changes to material_system causing recursion/stack overflow errors - add type annotations and docstrings. Black formatting - fix DA dark current overflow and relevant test - Improve automatic mesh for Sesame PDD - update documentation, add tests - make labelling of SRVs consistent between DA and Sesame. - remove GitHub reference for Sesame installation, refer to new PyPI version - Update outdated examples - Fix issue where plotting error causing examples in GitHub actions to fail - Change build for S4 to install setuptools explicitly (necessary in Python 3.12) - Sesame now scans from long to short wavelengths in QE calculations to improve changes of convergence, and skips wavelengths where absorption = 0 - Fix issue where Fortran PDD did not work if all voltages < 0 - Upgrade from devpy to spin (renamed), and to latest version of meson in the build system --- .github/workflows/build_deploy_wheels.yml | 2 +- .github/workflows/test_unit_and_examples.yml | 27 +- {.devpy => .spin}/cmds.py | 4 +- docs/source/Examples/DA_iv.png | Bin 26706 -> 30115 bytes docs/source/Examples/DA_qe.png | Bin 31223 -> 68584 bytes docs/source/Examples/RAT_of_ARC.png | Bin 82016 -> 79519 bytes .../Examples/example_3J_with_DA_solver.rst | 194 ++--- docs/source/Examples/example_RAT_of_ARC.rst | 98 ++- docs/source/Examples/main.rst | 2 +- docs/source/Solvers/DDsolver.rst | 12 +- docs/source/Solvers/Figures/PDD_np.png | Bin 0 -> 22171 bytes docs/source/Solvers/Figures/PDD_pn.png | Bin 0 -> 22234 bytes docs/source/Solvers/SesameDDsolver.rst | 90 ++- docs/source/Solvers/sign_conventions.rst | 30 +- docs/source/Solvers/solving_solar_cells.rst | 19 +- examples/GaAs_cell_drift_diffusion.py | 162 ----- examples/GaAs_cell_drift_diffusion_np.py | 137 ++++ examples/GaAs_cell_drift_diffusion_pn.py | 135 ++++ examples/MJ_solar_cell_PDD_solver.py | 113 +-- examples/MJ_solar_cell_using_DA.py | 87 +-- examples/Si_cell.py | 89 ++- examples/sesame_PDD_example.py | 305 -------- examples/sesame_testing.py | 478 ------------- pyproject.toml | 12 +- .../depletion_approximation.py | 5 +- solcore/material_data/mobility.py | 2 +- solcore/material_system/material_system.py | 24 - solcore/parameter_system/parameter_system.py | 4 +- .../DriftDiffusionUtilities.py | 6 +- solcore/sesame_drift_diffusion/__init__.py | 2 +- .../process_structure.py | 522 ++++++++++++++ solcore/sesame_drift_diffusion/solve_pdd.py | 664 +++++++----------- tests/test_depletion_approximation.py | 8 +- tests/test_examples.py | 4 + tests/test_optics.py | 6 +- tests/test_sesame_pdd.py | 426 ++++++++++- 36 files changed, 1961 insertions(+), 1708 deletions(-) rename {.devpy => .spin}/cmds.py (96%) create mode 100644 docs/source/Solvers/Figures/PDD_np.png create mode 100644 docs/source/Solvers/Figures/PDD_pn.png delete mode 100644 examples/GaAs_cell_drift_diffusion.py create mode 100644 examples/GaAs_cell_drift_diffusion_np.py create mode 100644 examples/GaAs_cell_drift_diffusion_pn.py delete mode 100644 examples/sesame_PDD_example.py delete mode 100644 examples/sesame_testing.py create mode 100644 solcore/sesame_drift_diffusion/process_structure.py diff --git a/.github/workflows/build_deploy_wheels.yml b/.github/workflows/build_deploy_wheels.yml index 6fb16d78..5655eee5 100644 --- a/.github/workflows/build_deploy_wheels.yml +++ b/.github/workflows/build_deploy_wheels.yml @@ -5,7 +5,7 @@ on: branches: - main - develop - - update_build_312 + tags: - "**" diff --git a/.github/workflows/test_unit_and_examples.yml b/.github/workflows/test_unit_and_examples.yml index 965d23db..0dbba4bb 100644 --- a/.github/workflows/test_unit_and_examples.yml +++ b/.github/workflows/test_unit_and_examples.yml @@ -18,7 +18,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] steps: - name: Checkout @@ -53,13 +53,14 @@ jobs: - name: Install Python dependecies run: | - pip install pytest meson-python ninja cython numpy git+https://github.com/scientific-python/devpy@v0.1 - python3 -m devpy install-dependencies -test-dep + pip install numpy --config-settings=setup-args="-Dallow-noblas=true" + pip install pytest meson-python ninja cython spin + python3 -m spin install-dependencies -test-dep - name: Install S4 if: matrix.os != 'windows-latest' run: | - pip install wheel + pip install wheel setuptools git clone https://github.com/phoebe-p/S4 cd S4 make S4_pyext @@ -68,14 +69,14 @@ jobs: - name: Build solcore run: | - python -m devpy build -- -Dwith_pdd=true -Dinstall_test=true + python -m spin build -- -Dwith_pdd=true -Dinstall_test=true - name: Unit and functional tests (MacOS and Linux) if: matrix.os != 'windows-latest' env: SOLCORE_SPICE: ngspice run: | - python -m devpy test -- -r a -v --cov=solcore/ --ignore=solcore/tests/test_examples.py -n "auto" + python -m spin test -- -r a -v --cov=solcore/ --ignore=solcore/tests/test_examples.py -n "auto" - name: Unit and functional tests (Windows) if: matrix.os == 'windows-latest' @@ -88,7 +89,7 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} run: | python -m pip install codecov - python -m devpy codecov + python -m spin codecov test_examples: @@ -133,13 +134,13 @@ jobs: - name: Install Python dependecies run: | - pip install pytest meson-python ninja cython numpy git+https://github.com/scientific-python/devpy@v0.1 - python3 -m devpy install-dependencies -test-dep + pip install pytest meson-python ninja cython numpy spin + python3 -m spin install-dependencies -test-dep - name: Install S4 if: matrix.os != 'windows-latest' run: | - pip install wheel + pip install wheel setuptools git clone https://github.com/phoebe-p/S4 cd S4 make S4_pyext @@ -148,16 +149,16 @@ jobs: - name: Build solcore run: | - python -m devpy build -- -Dwith_pdd=true -Dinstall_test=true + python -m spin build -- -Dwith_pdd=true -Dinstall_test=true - name: Unit and functional tests (MacOS and Linux) if: matrix.os != 'windows-latest' env: SOLCORE_SPICE: ngspice run: | - python -m devpy test -- -r a -v solcore/tests/test_examples.py -n "auto" + python -m spin test -- -r a -v solcore/tests/test_examples.py -n "auto" # - name: Unit and functional tests (Windows) # if: matrix.os == 'windows-latest' # run: | -# python -m devpy test -- -r a -v solcore/tests/test_examples.py +# python -m spin test -- -r a -v solcore/tests/test_examples.py diff --git a/.devpy/cmds.py b/.spin/cmds.py similarity index 96% rename from .devpy/cmds.py rename to .spin/cmds.py index 38f8153b..e63bfa1e 100644 --- a/.devpy/cmds.py +++ b/.spin/cmds.py @@ -1,6 +1,6 @@ import click -from devpy import util -from devpy.cmds.meson import _get_site_packages +from spin import util +from spin.cmds.meson import _get_site_packages @click.command() diff --git a/docs/source/Examples/DA_iv.png b/docs/source/Examples/DA_iv.png index 445d3a3373210bb8f9c71c2fb4680aa921ece0a5..a8596d3dc35db427f5f908b7d413799f570b2a92 100755 GIT binary patch literal 30115 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

#muHu_2n2A|ntodQm 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 ?lXG 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�GhOiA@%NWH>bJZ;H9trQ5Hlv9oQHGjr-gQ^=)M zP?=QA`^%{6{3Fqq=m%(@F;S#hMVfd2zqTXibpo$gm=Ad|uS-Zs?7OrjCC!Z{QMb95 z1PwdudQiH5AQ7LBTLi_CrB2!A%!M7JqR#>n`m9Rd~rSsmq~eOjaE$3BgCH|d^k8;R-8N{$o*CFe8;c~ zV3!zDsS-1xIX_AqR*%yfETS@ba^X3c=Qj7pk6iynfF*QLeK<|v*3cYM*n)Ty6%F`$ zo&URDQA-6R574?bczMHVyBC$1dk}AV`@(8~A5`&GMP|tr>t2e9V{Iv-{m)cE0HE{{ zGpQJWIukfu?)bgWo_Rfgkc_7-$C%wl<|>)L;c4__92dksG?>jZTNWH4bTN6?j-$6yR&1hJ~(CxtR z)X0ekauo2J;F?O%hK$YzsR5GGT#4f+*@QLAUC@|HwO^Y)c5_GHU+s`xud<=ot-yh+aX3h&rJ=zi) z1)G2XctAQZ3IPcejN9=#maXp-C?bTIp9D_pXr)wk;Fx}oHC zb%DH4fTS*J$S3B~?<|6&lA5WtRS14b5|y7(B=8teQTNGoJ}sOh^ni!T%dBL*eu?QU zvJpR&NO_$gaBR219B&8y#M3SJp<`Ob4b4Na`$?boJtyIBw6nidTo`#(kwpQsG2^>x z%sxAv{k7ZoS!-ao6R`hFvyI!)yv5z=>O|A_S{j@U&|y5*+>|K=(1YK{jH69V`}E{e zeeE<3*KTJ)CmfYsryGcCKS4e)go#UW89;bOlq~re@W$_%$gnXS*Y`Wy$L`1IB+a!- zz;kt~wzT&hO82{Arp{IqV-8=@kvur&vBW<>pECfivi4?P+L0?5U0WrR|Brn(J0)Pg%JrXn!K5TgXAkQO z{6!sF*Drt*j;dV+sbBR@3E#6Mlo;%0LvAANW1MvDqT{IY1iI0P13BBNSCye~Z1!k6@RT?gh<`tW!H)cLm0+d?9s*!S6;# z!WgrdzP>V3Tj;~XL?MsY!1Eqpg2-stTpOoX_Ke8b zV!t&Yq1bYg;Ojihmu4!Vc5?r~8iO(5>yvdU+s@_!Xv1j-=Ey=Ax4GBr#sZM-j+!H4}hKD65}>S`FO zU70)%@-6LksYx%JnG_u9JKXeXijaXH?O$sN*#rO59LqnSLMMdE7WZp1*592sJTO_M zLh|5dr~9biF(2rbqvGTAIxiv#5HOmxdxYS_`pFxy5Nt;Z>cL|b4n0!Uwe5SCUP&;g ze|B!@*>}dAeS!@s=>a2VY-b&O8lb-0EM~a-n}i ziyIf&V>l?)McGzPz74$Sm>UjW(~<;sYsA1JgI6mSE5VzUG58-3z*teWOC=Sxhp#Ib zxfCo-Pjdf?@7~U10=3M~lQb5Mgf8*J^g3s{QBbj$4Nt$<9Bc0NHPLn^zYU&YoH0+Z z+&8X7@UCwthNf)i)|Set)*wVGW_w@01X9a#ARKc@ODj<(5^jjRLJBz!<8)Tc%;|wG zM?^W)(wIVb>Bn$^5^0TwRQ~*avrSSH z9@p=dB)4++Qwk$mkh+k!B$nBDs7&Hdq%>nYJDI!br&~4)q_O%(kiZqYvpT1fF)O|C z#{2cm9%V?oM1>zW()&L~-|W;g6H7}CdMi#9_=O3pC$y8L2Iid8z5h7p%mjFQQp@

T z*q&Nk#B8KwNG?*tP9T^;^UdQ}a{lD@Hmy?S_Ny^7I~?a$sE>aF z_*KZG1K0)R=PjfS`sGXL0Lm7{5W#yJ=(9V)x#9pG8gGmG$2VygDa8CL0TY(_a%&(w>($#Js9$CrNrYM^BDjmp5?G#9#GZD*$Ncg zof4>c?&)b7-GBkOWby0Q`{J#VjVRMY!B37#S4Yd$)P>{$7RT*8ssBrl+3=?ZAO-1e zt*}CsDGB0pd~6r3|1Lh0hWra(Vf`5JpwsPqv&;AKO0V^xB2(u}UHot627jn)=k)}6 zVyT_CY%(@9_BfT^H-q&Zf6zs=*Z9Q97)mm{}n#K%&$yn+mM9s$rQfOeK>n}ezrA?;4uiQIfw4u za-3ifCDVW8D3wvYv?4>;?lz?vw|ossNFyZfb=s?Vk9zS$+P9^kg*EJ=YBWBaq?9_T)Ch{I zc!6bJt<G~N{j{lF9g~i!QeUWSmoo0o`(Ol6;BqlYTLIxYS zV6dFZO8aO;*5l;lv`wZ?ROiozpScb3CdVHJbMYNPt7w~lzpWJ9axl_a%u7uT-9_}k zd8(x3|-xw31BchM13xs&n5e^zO(N-H5>W0L^cd7<6E;Xo8a}KTMZyvsW2w~!vhRtB1zohl!rf{ma%*~W$V<-Mg@25l2AsE|GhrJLJX?}9pz<`3C!5oo z#w1c>z5B`q%w<-+OS_19wy3) zLxj7hoOt%(wnBqLLfZ7az(t7a94ASyVy1}#vuW^+6U59D9xXhqb2WH3-^kp`YL_j! z#IW|62~GgAgG%7OJ%^TbKo^N+odwtUFN|>AaScyS+Vus)f+1!1%Xe@Fg^R4o2szYS z*+u0U)mok~AAFtP(mz?ZQ-auoW-$%%=(8Q|R0!>$4u)nC`$A%itjb`-!#mjJC;wqE zfi&AT@8tGG4*KIq9q_^nVRX!d+qO2;Uz%g`S|@h1$BHtrCdAo|G)S=$xow4`B=4ij zPy)}i&S!IbLSv*2Zb>1ttl#3KGHJ*A^{JJs(N?XI3wri~MI;OVhpo4cs;b@kKmiE> z1qJDnlJ0H<1Oe&p?v`!@kq!ZAq!FaMB&E9%*yIKzH{Ep~ecyAwd+xYn_=jT{tY@vc z=A6Hnb9LS^TB=b$sio|^%bKA-_w4&D8ax+}*j}&H%3$~#+Zbd0so@xIwd3{8=WSM&TQ78k z!9oEZlNrp(HwEgfMCcb?c|E32%vb`KV;|_I`KLhuyC16+8({JA@uA}~YBo3;jeJWC z9G%7a>w|Gm1O*oj5do&YD9Qxk3Ceh{GD8wdhNuziVb?wAe}9zC*dI#uhN&-HvB>qj zsw+dm5Z(hq_1>TUeffvH%xhe_7Xuc?CXcEu;>}#nPT!kN{qW4?3=R9h!rL4N2nTZ@ zE`dQ!E^cmNuwViBYD7K1)@%p~_apCI#P5JxuQf)UO%=;NeA8;J zCdKP{YzmSIy+#?NRHxqkV9Ck7__ARxUp5JBtzcqe8qE|Lo$Dt5d-DMw=t@xQn28#L zA8R3IY<^9M1^hkTQ{xfegX0ho8hU9R(U3SL$zKexE#xs6bV_8+gaFMOd_>#SPn?X{RG z(E=h;x@R&HXEQ*IE#4Oujt}dccRqR@;!i>-&@bLZ;F1Wqz4IOn!=_1Oq+8Q`-0Eoy zX{aaWeb{HX-#tk0-}+AF+8DL@}k(9fPi2)9eBc^ymEzDBPj z2WvMxaHK`7n_(gD*}9(k_OW_t*U^i2zm8UA$2vT zr(nS6m}7GnjntU;g;oPpVRvmUr=@#(x)u<*^EzlFWqQp!Go?2m!Ye8&n%xg(3YEkc z8GbdpJAhaIfA)+hc*VOy9*;j2XLW+JA-=HNIGMXJ>Ff6L=iIuNmq;zCY+wEyUM47yDvqGd=+P;xl#!@hF9f%DU8{QK*zE9v#hVLy zg?bHkqS!Cg?SsRssHh~d7%Vk9|IYNgwz|K)3JVL}v3^w^?ELLf@f{f>)w5rX4x;H#5XM_CkTj}p1 zF@v6BbmI=a#cI!ZRw5=WXZ`+f#&(>dzdyjWFintPm=Zf)q&FL_;7!7pped+-Le7v`OCf+8Q`$hHnU}*d?C^*j|vG25^`EPLXnGB@v*Q1 z^;V(}hUo7vp)uVNB9+gub{m>0>UCDIpH%X~ps&Kp--tc2D0n_C9It9Ijiv&zU!91z#&7qy4F1np4z05Yv0x)LS6zfTiATDu#~n?a0vyo-#M zB8~+~b^XtCG*f6W_~B6r2GG-Z9Q=w5Cky1j$!|=VA3|aWH*97~#wRC>6|)iU8@(^= z-EP2Nsz5h3F_})3l$6Ysicx>~{)&c1DvyGmUS`25k@b1+T|xr0L_;R|WE$l9e89IR z&R0F_K`6-K1RBjd*VjXXZaui{8r;;^_Dbe~e^5q+)(p22KRtcr(g~jjBbrpr{>9@2 zWqpIpcixLlU*3I?lN)w5r0WzPiwO;FS9-B~27(znMvoiegzqq0mht5a&TLJrk2(G* z(a%c9OoWRs@Pd`N*ujR6uxiAxnl90Um1VXH99ax8-oX!}y`95`C98as2ebAGrO+j? z>8Dtu{5=!e5XjT5SDQq)lY@i1^R+g>R|&+K4+v5|L!ibe+D}DSf8a8`6!fL-N(d=7 z^@?}DAaf=wHM*XEa%V67h^#?$=LzF!{%XXnxttR|U!I}@;E}@Z*M6h4Jz%I6TO&iA zCMScUh`u1d_q4+3IeB*a0EPnCOnLXC=4j0*d46}p+bn3(IFKS;u?qH zvCzBo@zD)V*)BbaArqI8DSISKNE+yOwlf_R6!hAu*KRx~_`Iyz;v}=yK=hvj<-Vz} zaOBZIbZk2QoF;!9M%m*30#hSBiYF zH$FR#tXxz$u_0N{yd1iX}ezXCe|JIjS zSfV86F=V4$_%S*m72-FO0~H>4h>j_&=}A&Bd;kG*nZAKvZ=g8Z53GyOd}0LklQbC^Nx`&6k857;Gjb`A!^EHRaR z`bsL+|5HQiZRe`g{2ceudH@TYS^e`I+;^ai5TmM{7@-OAzty@bK_6r4)#m=Y#Hb zsoqW?eWsuN6#mSFvC`v6hJKM0mkpG%*Q}4P_Ln+@0zlUz*7|QV`Rr$QU*}yRE(!*5 z`vu&iM?nLlnG>;P9#`nvuzH@O%WFf8)i0HVH zM+o$u>5yD!qd(TTt3f@sbeeDR*p(7*Gro!)@sIuEe08HF9JbEHq`hDw1liILe~*) z8D62n(VvR!^~W1ZM9Dtydqx;MXgBfxw3{^lDQ#bq;%OA*GrnUNzo?A98J0CgzUPG< ze5jv`jq7WWfet{&$d+YTD!FAm9=+XfPP ztJhZ{%K5ul1LrSkT};|%z!*&WRgk<`0_Q^<#x(&F?UdrPw75@aKb=35VXQ>7qoH3k zM`jDEW9rB4Abh1ncEZe3r2PS2kvsnWS)4zBB3!N^!jD}~$nq)Gjowz=-yMm~LeO(7z+W9?i&kM8- z1}O@1X|CTRpM$k;&L(YnI8|k?W=f4tEq^s9na(~&Bn*mCoOs=)lq(5LXXDI=IiHO1 zZESYoA0ZbG@+MN0kP)loIKuG+db=A@VXSPUPPY?u2(Dk|hg_jqPeQmSsEZ;NU>S zxGQwv3xoUaj2-B6z@!yu23I~kCHjO(7R`0{2ZGw#GRF5egdAb)hTK#ZiLWw8uNG9i zKsmh3^D=!}fYaBkLi9i3kdtS^EBie7=HdRLEmLh}mUj#EQuiFiVK{j6(P@tpd0`>} z5xg*Oa{{bYKV?iW%JL0}u_?naoGWGhuQo|<6X@8KIaTI+#`l*SL2s4;P^30cR_+tM zS!yvIyIXMRmnpO6cX{blU?h&u`;6NbPDSPMQ?(r+A^S;4AkORp!+&>nGr%G(UT4}3 zj;lc^m@coYsw@0{;k`CeQ$LC}pt%aS(~6r&MZ6iU|YvF_Gb8 zGgBZz-~K49F&h5Y&Ep-{&rpG_!+qwuxDPp9gvVi2MLoOi`q9*Yv-iPBNm*He>*--N zL3V*X!C~l3pfeTt2m6lAiMzly78pjKkvOiD9?}Wj;7z- zo$YN~y?$*<47NlbKYKi&o~;zKWh4BK^vTx^UEH?r9$&8GE(E`3i7J#yc=~VX)bvc$ z3vh5*Uc8Ie!yh?tcE%l%qP*Mu?jVbc{mR1u(&^C(7&ws>h-;z=YoEkMvcpcB5c&Kp znW**U$V2QTiXX%CD<-qP+qzG>B$Z*$^A25`m3RVv_>SVApF7ckH@fCx3;F#Lvt$YH zO|GSuur%tmBGMP#0u(s7{LXE4n^);YiZP!UEFr*IzEEW*i-Ho;8$;G+_`2r^KE6Tz zLyeP2Jmvj!z4i%zl#CeB+3;Wj%M9EWQEz>;acd`v&ZE+JakntCvBgKi+={d!Umib# zgHwFI^W1k>${LbUg{0ZiJ9e`b)xD&bTo?tR8#koaGtne5)O@`>L!3(B~Uy5G&Hw zamX_oL$w3vsgcUC92#hnqan0Mg!}1(qG-TqUXQPx%v|5#b50_n3&;yf zmw2(*GCg9C#!T+okI9bmj(NNO5up-xAa(DecaGo`o9!5KUdu*u zqOu%Q5JE$_LnE>M^3J^5=6FVgR#Pm^+h)fV==S*FBERI2j`!*|yX|)bp$uICxm3V) zhtq5zVQ6URSm_5j7cAF!OxXn+y@B$&*p}|1_eJX4H>3h$b?|VaXO2y3a_uuSb$)l( zAh$(_hx3C8RRAl1C@hXlehQ5d@w?hc0+Xxgn3&5IM&ck7t>riC%Q}J`lg`dRd+q?- z-a8I=ED#eSEX#80t=H4OKYQsDhCWB_(?JDOYEx;uWUYbFMJ`1UXp+Qx^U8wAN&97)KG0h@81Exc>oYAo5M->mB?z25@|i zk2eN^W?iaPT>wydwfQgw)I-b~lJ+UbZVMInaK8_p=pvL+_B2pzvaq5wtsiVzEhLq% z|BmYOaCZS5pNaa>WFmg^HC82Fshyo-BqSuZuzYGThpks{Pr~rA^|kr;A(Vs9|Gq%Y zb#-nsGL2Si+uPfOTx!S-+@k;dbvmK-M92mXi6Q_qeWqk)`{WKaYo9tdS;w; zfHn)+pEiRYXHY^*Fc_ zbYIpsHvaclzfBc4UaFA479!L)g9^(dv@U=KmHl@z08pF`OFq9Uj7&MnSi=NvR(#iz zFI4KYr!}vum3PC+tg;V^@FJFD=59B`3mvSW_h(}~ysw0FpTE!k*iu9hm2!#-*G?1T zB|*kvJw?kn3*-PVFR!5&qeMLRHCB_KBB7|SFyqB7p{=y}&x$V|sJvMhaZj_OZVaZ1 zSMUA_tcgB67J?EmS$qd<_i{;8LEHnnPd{bHV6ovsA#a(IOk*|m38y`iX475t7uH&-dmQ*hmi zTszP2CMG7piWVAb>d!cYkK$3vspcDaJc7)_Sd5^pc*AZuF<8{r*^g8$HDs&6zxf{G zQcTF9259x6@o^B8hl}xKiV4=q1dgW2MQVyw1 zUJkK_6l|^^19v*|n_tYvID=R?Q5#786-|u#^4uxAuz?GHK^fB7uqx(GRH-pnS42&C?F&{>XVU*U#eW)ws1N<( z>gw`IkG0!>Z%VwyO`Q7_!kTi|zJJSsHpl9}NkaOs_LIzLsH^dnX8C+)3d)7-Q{TME&459F=Qe=)P8<`gjN2)#@KvSb2{ryd8_YZkJA)%>=tT} z79MT2m^Q|3Q1#;O#8P5dOqD5bxx`X!%|HSAZKBSP^NZVqed8z+2w7_Iu&F%R!m!z+ zX_5tN?kInMF)hnowP8~~ARC+GupBzMJ>Q~J6AYkN_f3R@d%5CL%!NIoS}64shZ6>5 z5HMsjIWt4b4pyrfgN@u^`si5cwq0IV9sbxWYG~;#^5RJgP0q<@q-v0ZHyy?Y*t6rl zPChy$9evJ~p^uJ5rgMUaf*9S^qxUNlYklK08F+=W*uhgw#f(R>)*eZtQsw!me(?H@ ze(vXD?9}UuLIE#nR4HYxxC{euk7)ki_lP7u;iKNSnpnJI zPKWZ*gkMZ@q6a0?)wp{jmi?m$6f( zu+-_PZ5~^uZ{6g~xu2KU9Q_R(oDXB6)F~TCuO^8>B`V)AOdvslfjhJ13Oz@N@hBMt ze3~s6pC)?lst+kjmIh;)5-q(j3mR3|?=PCE5a6;%{|kf;6(9{J1;kk`H}!6`C3#!c z<2ofbNgso@+0yc-2FWB>0_=63O-FFU7JDvN=5G_`Em3j!^As8})mZjCSs2tIB?b=% zNa)NWKKMbtf($!CZ{Fm)!z8qI46J@R3YaW^Q)m-KhKI|V`*Xb@8xK7pD00F?NBpLzYQ|7yb`-^ zb+$(Ge-nFbdZLO0Jkw$j47?R~)?=3IUT9G<{kDPk`T7c(65NmAM7tfErc+V>7Rzv= z3m}0p>oz#Xegq2Tsw{gT4gIS!#Q^OR(Wvv617yBwM~-CId`BM6UX|y-;<_J%P}9ij zlehIF_Ye*I|Hjy=+I1>r{Cxhx4NAErLlQ}ueoe7)aSD>E8KhBMWT*0&=-Q)$A971UaN$a9AfwqzjKN+?P zi&id|dPO!3t3O4d?>S&d%DdHq*?o4yD1i2m7TT(tlC(-roDLK?bpNtD0+` zNNL_Ed-Qbgi5{U}Erp1+u_eb#0uRx$Vd!>{J6acKq2|)>{X>lD+{00odv*)_kVb52 zN!6g_2!yb47VMRt&p z4AZO64rV!?C�Ai7j}y2Op672q11%y8j?AR(k?yO^ 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 literal 82016 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

j8irb= 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 diff --git a/docs/source/Examples/example_3J_with_DA_solver.rst b/docs/source/Examples/example_3J_with_DA_solver.rst index 9661dd84..2e9fa847 100755 --- a/docs/source/Examples/example_3J_with_DA_solver.rst +++ b/docs/source/Examples/example_3J_with_DA_solver.rst @@ -6,128 +6,156 @@ Example of a 3J solar cell calculated with the DA solver .. image:: DA_qe.png :width: 40% -- Required extra files, available in `Solcore's Github repository (Examples folder) `_: - - - MgF-ZnS_AR.csv - - in01gaas.csv - - Ge-Palik.csv - .. code-block:: Python import numpy as np import matplotlib.pyplot as plt from solcore import siUnits, material, si - from solcore.interpolate import interp1d from solcore.solar_cell import SolarCell from solcore.structure import Junction, Layer from solcore.solar_cell_solver import solar_cell_solver + from solcore.light_source import LightSource - all_materials = [] - + # Define materials for the anti-reflection coating: + MgF2 = material("MgF2")() + ZnS = material("ZnScub")() - def this_dir_file(f): - from pathlib import Path - return str(Path(__file__).parent / "data" / f) + ARC_layers = [Layer(si("100nm"), material=MgF2), + Layer(si("50nm"), material=ZnS)] + # TOP CELL - InGaP + # Now we build the top cell, which requires the n and p sides of GaInP and a window + # layer. We also add some extra parameters needed for the calculation using the + # depletion approximation: the minority carriers diffusion lengths and the doping. - # We need to build the solar cell layer by layer. - # We start from the AR coating. In this case, we load it from an an external file - refl_nm = np.loadtxt(this_dir_file("MgF-ZnS_AR.csv"), unpack=True, delimiter=",") - ref = interp1d(x=siUnits(refl_nm[0], "nm"), y=refl_nm[1], bounds_error=False, fill_value=0) - - # TOP CELL - GaInP - # Now we build the top cell, which requires the n and p sides of GaInP and a window layer. - # We also load the absorption coefficient from an external file. We also add some extra parameters needed for the - # calculation such as the minority carriers diffusion lengths AlInP = material("AlInP") InGaP = material("GaInP") window_material = AlInP(Al=0.52) - top_cell_n_material = InGaP(In=0.49, Nd=siUnits(2e18, "cm-3"), hole_diffusion_length=si("200nm")) - top_cell_p_material = InGaP(In=0.49, Na=siUnits(1e17, "cm-3"), electron_diffusion_length=si("1um")) - - all_materials.append(window_material) - all_materials.append(top_cell_n_material) - all_materials.append(top_cell_p_material) - # MID CELL - InGaAs - # We add manually the absorption coefficient of InGaAs since the one contained in the database doesn't cover - # enough range, keeping in mind that the data has to be provided as a function that takes wavelengths (m) as input and - # returns absorption (1/m) - InGaAs = material("InGaAs") - InGaAs_alpha = np.loadtxt(this_dir_file("in01gaas.csv"), unpack=True, delimiter=",") - InGaAs.alpha = interp1d(x=1240e-9 / InGaAs_alpha[0][::-1], y=InGaAs_alpha[1][::-1], bounds_error=False, fill_value=0) + top_cell_n_material = InGaP(In=0.49, Nd=siUnits(2e18, "cm-3"), + hole_diffusion_length=si("200nm")) + top_cell_p_material = InGaP(In=0.49, Na=siUnits(1e17, "cm-3"), + electron_diffusion_length=si("2um")) + # MID CELL - GaAs + GaAs = material("GaAs") - mid_cell_n_material = InGaAs(In=0.01, Nd=siUnits(3e18, "cm-3"), hole_diffusion_length=si("500nm")) - mid_cell_p_material = InGaAs(In=0.01, Na=siUnits(1e17, "cm-3"), electron_diffusion_length=si("5um")) - - all_materials.append(mid_cell_n_material) - all_materials.append(mid_cell_p_material) + mid_cell_n_material = GaAs(In=0.01, Nd=siUnits(3e18, "cm-3"), + hole_diffusion_length=si("500nm")) + mid_cell_p_material = GaAs(In=0.01, Na=siUnits(1e17, "cm-3"), + electron_diffusion_length=si("5um")) # BOTTOM CELL - Ge - # We add manually the absorption coefficient of Ge since the one contained in the database doesn't cover - # enough range. Ge = material("Ge") - Ge_alpha = np.loadtxt(this_dir_file("Ge-Palik.csv"), unpack=True, delimiter=",") - Ge.alpha = interp1d(x=1240e-9 / Ge_alpha[0][::-1], y=Ge_alpha[1][::-1], bounds_error=False, fill_value=0) - - bot_cell_n_material = Ge(Nd=siUnits(2e18, "cm-3"), hole_diffusion_length=si("800nm")) - bot_cell_p_material = Ge(Na=siUnits(1e17, "cm-3"), electron_diffusion_length=si("50um")) - - all_materials.append(bot_cell_n_material) - all_materials.append(bot_cell_p_material) - - # We add some other properties to the materials, assumed the same in all cases, for simplicity. - # If different, we should have added them above in the definition of the materials. - for mat in all_materials: - mat.hole_mobility = 5e-2 - mat.electron_mobility = 3.4e-3 - mat.hole_mobility = 3.4e-3 - mat.electron_mobility = 5e-2 - mat.relative_permittivity = 9 - - # And, finally, we put everything together, adding also the surface recombination velocities. We also add some shading - # due to the metallisation of the cell = 8%, and indicate it has an area of 0.7x0.7 mm2 (converted to m2) + + bot_cell_n_material = Ge(Nd=siUnits(2e18, "cm-3"), + hole_diffusion_length=si("800nm")) + bot_cell_p_material = Ge(Na=siUnits(1e17, "cm-3"), + electron_diffusion_length=si("50um")) + + # Now that the layers are configured, we can now assemble the triple junction solar + # cell. Note that we also specify a metal shading of 2% and a cell area of $1cm^{2}$. + # SolCore calculates the EQE for all three junctions and light-IV showing the relative + # contribution of each sub-cell. We set "kind = 'DA'" to use the depletion + # approximation. We can also set the surface recombination velocities, where sn + # refers to the surface recombination velocity at the n-type surface, and sp refers + # to the SRV on the p-type side. + solar_cell = SolarCell( - [ + ARC_layers + + [ Junction([Layer(si("25nm"), material=window_material, role='window'), Layer(si("100nm"), material=top_cell_n_material, role='emitter'), - Layer(si("600nm"), material=top_cell_p_material, role='base'), - ], sn=1, sp=1, kind='DA'), + Layer(si("400nm"), material=top_cell_p_material, role='base'), + ], sn=si("1e5cm s-1"), sp=si("1e5cm s-1"), kind='DA'), Junction([Layer(si("200nm"), material=mid_cell_n_material, role='emitter'), Layer(si("3000nm"), material=mid_cell_p_material, role='base'), - ], sn=1, sp=1, kind='DA'), + ], sn=si("1e5cm s-1"), sp=si("1e5cm s-1"), kind='DA'), Junction([Layer(si("400nm"), material=bot_cell_n_material, role='emitter'), Layer(si("100um"), material=bot_cell_p_material, role='base'), - ], sn=1, sp=1, kind='DA'), - ], reflectivity=ref, shading=0.08, cell_area=0.7 * 0.7 / 1e4) - - wl = np.linspace(300, 1800, 700) * 1e-9 - solar_cell_solver(solar_cell, 'qe', user_options={'wavelength': wl}) + ], sn=si("1e5cm s-1"), sp=si("1e5cm s-1"), kind='DA') + ], + shading=0.02, cell_area=1 * 1 / 1e4) + + # Choose wavelength range (in m): + wl = np.linspace(280, 1850, 700) * 1e-9 + + # Calculate the EQE for the solar cell: + solar_cell_solver(solar_cell, 'qe', user_options={'wavelength': wl, + 'da_mode': 'green', + 'optics_method': 'TMM' + }) + # we pass options to use the TMM optical method to calculate realistic R, A and T + # values with interference in the ARC (and semiconductor) layers. We can also choose + # which solver mode to use for the depletion approximation. The default is 'green', + # which uses the (faster) Green's function method. The other method is 'bvp'. + + # Plot the EQE and absorption of the individual junctions. Note that we can access + # the properties of the first junction (ignoring any other layers, such as the ARC, + # which are not part of a junction) using solar_cell(0), and the second junction using + # solar_cell(1), etc. plt.figure(1) - plt.plot(wl * 1e9, solar_cell[0].eqe(wl) * 100, 'b', label='GaInP') - plt.plot(wl * 1e9, solar_cell[1].eqe(wl) * 100, 'g', label='InGaAs') - plt.plot(wl * 1e9, solar_cell[2].eqe(wl) * 100, 'r', label='Ge') - + plt.plot(wl * 1e9, solar_cell(0).eqe(wl) * 100, 'b', label='GaInP QE') + plt.plot(wl * 1e9, solar_cell(1).eqe(wl) * 100, 'g', label='GaAs QE') + plt.plot(wl * 1e9, solar_cell(2).eqe(wl) * 100, 'r', label='Ge QE') + plt.fill_between(wl * 1e9, solar_cell(0).layer_absorption * 100, 0, alpha=0.3, + label='GaInP Abs.', color='b') + plt.fill_between(wl * 1e9, solar_cell(1).layer_absorption * 100, 0, alpha=0.3, + label='GaAs Abs.', color='g') + plt.fill_between(wl * 1e9, solar_cell(2).layer_absorption * 100, 0, alpha=0.3, + label='Ge Abs.', color='r') + + plt.plot(wl*1e9, 100*(1-solar_cell.reflected), '--k', label="100 - Reflectivity") plt.legend() plt.ylim(0, 100) plt.ylabel('EQE (%)') plt.xlabel('Wavelength (nm)') + plt.show() + + # Set up the AM0 (space) solar spectrum for the light I-V calculation: + am0 = LightSource(source_type='standard',version='AM0',x=wl, + output_units='photon_flux_per_m') + + + # Set up the voltage range for the overall cell (at which the total I-V will be + # calculated) as well as the internal voltages which are used to calculate the results + # for the individual junctions. The range of the internal_voltages should generally + # be wider than that for the voltages. - V = np.linspace(0, 3, 300) - solar_cell_solver(solar_cell, 'iv', user_options={'voltages': V, 'light_iv': True, 'wavelength': wl}) + # this is an n-p cell, so we need to scan negative voltages + + V = np.linspace(-3, 0, 300) + internal_voltages = np.linspace(-4, 2, 400) + + # Calculate the current-voltage relationship under illumination: + + solar_cell_solver(solar_cell, 'iv', user_options={'light_source': am0, + 'voltages': V, + 'internal_voltages': internal_voltages, + 'light_iv': True, + 'wavelength': wl, + 'optics_method': 'TMM', + 'mpp': True, + }) + + # We pass the same options as for solving the EQE, but also set 'light_iv' and 'mpp' to + # True to indicate we want the IV curve under illumination and to find the maximum + # power point (MPP). We also pass the AM0 light source and voltages created above. plt.figure(2) - plt.plot(V, solar_cell.iv['IV'][1], 'k', linewidth=3, label='Total') - plt.plot(V, -solar_cell[0].iv(V), 'b', label='GaInP') - plt.plot(V, -solar_cell[1].iv(V), 'g', label='InGaAs') - plt.plot(V, -solar_cell[2].iv(V), 'r', label='Ge') + plt.plot(abs(V), -solar_cell.iv['IV'][1]/10, 'k', linewidth=3, label='3J cell') + plt.plot(abs(V), solar_cell(0).iv(V)/10, 'b', label='InGaP sub-cell') + plt.plot(abs(V), solar_cell(1).iv(V)/10, 'g', label='GaAs sub-cell') + plt.plot(abs(V), solar_cell(2).iv(V)/10, 'r', label='Ge sub-cell') + plt.text(0.5,30,f'Jsc= {abs(solar_cell.iv.Isc/10):.2f} mA.cm' + r'$^{-2}$') + plt.text(0.5,28,f'Voc= {abs(solar_cell.iv.Voc):.2f} V') + plt.text(0.5,26,f'FF= {solar_cell.iv.FF*100:.2f} %') + plt.text(0.5,24,f'Eta= {solar_cell.iv.Eta*100:.2f} %') plt.legend() - plt.ylim(0, 200) + plt.ylim(0, 33) plt.xlim(0, 3) - plt.ylabel('Current (A/m$^2$)') + plt.ylabel('Current (mA/cm$^2$)') plt.xlabel('Voltage (V)') - plt.show() diff --git a/docs/source/Examples/example_RAT_of_ARC.rst b/docs/source/Examples/example_RAT_of_ARC.rst index ea2eb9ff..1d88cd8c 100755 --- a/docs/source/Examples/example_RAT_of_ARC.rst +++ b/docs/source/Examples/example_RAT_of_ARC.rst @@ -2,83 +2,69 @@ Using the TMM solver to calculate the reflection of a multilayered ARC ====================================================================== .. image:: RAT_of_ARC.png - :width: 50% - -- Required extra files, available in `Solcore's Github repository (Examples folder) `_: - - - AlInP_nk.csv - - GaInP_nk.csv - - MgF_nk.csv - - SiCx_nk.csv - - ZnS_nk.csv + :width: 100% .. code-block:: Python - from scipy.interpolate import interp1d import matplotlib.pyplot as plt import numpy as np + from solcore.solar_cell import Layer + from solcore.absorption_calculator import calculate_rat, OptiStack + from solcore import material, si - from solcore.structure import Structure - from solcore.absorption_calculator import calculate_rat - - E_eV = np.linspace(0.65, 4, 1000) - - - def nk_convert(fname, energy): - """ Designed to handle nk data files""" - - # Import data... - E_n, n, E_k, k = np.loadtxt(fname, delimiter=",", unpack=True) - print("File :: " + fname + " :: Imported Successfully!") + wl = np.linspace(300, 1900, 1000) - # Interpolate data... - n_interp = interp1d(E_n, n, bounds_error=False, fill_value=(n[0], n[-1]))(energy) - k_interp = interp1d(E_k, k, bounds_error=False, fill_value=(k[0], k[-1]))(energy) + MgF2 = material("MgF2")() + HfO2 = material("HfO2")() + ZnS = material("ZnScub")() + AlInP = material("AlInP")(Al=0.52) + GaInP = material("GaInP")(In=0.49) - return (energy, n_interp, k_interp) - - - # Load nk data using nk_convert function... - alinp_nk = nk_convert("AlInP_nk.csv", energy=E_eV) - gainp_nk = nk_convert("GaInP_nk.csv", energy=E_eV) - mgf_nk = nk_convert("MgF_nk.csv", energy=E_eV) - sic_nk = nk_convert("SiCx_nk.csv", energy=E_eV) - zns_nk = nk_convert("ZnS_nk.csv", energy=E_eV) - - # Build the optical stack... - stack = Structure([ - [117, 1240 / E_eV, mgf_nk[1], mgf_nk[2]], - [80, 1240 / E_eV, sic_nk[1], sic_nk[2]], - [61, 1240 / E_eV, zns_nk[1], zns_nk[2]], - [25, 1240 / E_eV, alinp_nk[1], alinp_nk[2]], - [350000, 1240 / E_eV, gainp_nk[1], gainp_nk[2]] - ]) + stack = OptiStack([ + Layer(si('141nm'), material=MgF2), + Layer(si('82nm'), material=HfO2), + Layer(si('70nm'), material=ZnS), + Layer(si('25nm'), material=AlInP), + ], substrate=GaInP, no_back_reflection=False) angles = np.linspace(0, 80, 10) - RAT_angles = [] + RAT_angles = np.zeros((len(angles), 3, len(wl))) - print("Calculate RAT ::") - for theta in angles: - print("Calculating at angle :: %4.1f deg" % theta) + print("Calculate RAT:") + for i, theta in enumerate(angles): + print("Calculating at angle: %4.1f deg" % theta) # Calculate RAT data... - rat_data = calculate_rat(stack, angle=theta, wavelength=1240 / E_eV) + rat_data = calculate_rat(stack, angle=theta, wavelength=wl, + no_back_reflection=False) - RAT_angles.append((theta, rat_data["R"], rat_data["A"])) + RAT_angles[i] = [rat_data["R"], rat_data["A"], rat_data["T"]] colors = plt.cm.jet(np.linspace(1, 0, len(RAT_angles))) - fig, ax2 = plt.subplots(1, 1) + fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)) for i, RAT in enumerate(RAT_angles): - ax2.plot(1240 / E_eV, RAT[1] * 100, ls="-", color=colors[i], label="%4.1f$^\circ$" % RAT[0]) - ax2.plot(1240 / E_eV, RAT[2] * 100, ls="--", color=colors[i]) + if i == 0: + ax1.plot(wl, RAT[0] * 100, ls="-", color=colors[i], label="R") + ax1.plot(wl, (RAT[1] + RAT[2]) * 100, ls="--", color=colors[i], label="A+T") + + else: + ax1.plot(wl, RAT[0] * 100, ls="-", color=colors[i]) + ax1.plot(wl, (RAT[1] + RAT[2]) * 100, ls="--", color=colors[i]) + + ax2.plot(wl, RAT[1]*100, color=colors[i], label="%4.1f$^\circ$" % angles[i]) + + ax1.set_ylim([0, 100]) + ax1.set_xlim([300, 1800]) + ax1.set_xlabel("Wavelength (nm)") + ax1.set_ylabel("Reflection and transmission into structure (%)") + ax1.legend(loc=5) ax2.set_ylim([0, 100]) ax2.set_xlim([300, 1800]) ax2.set_xlabel("Wavelength (nm)") - ax2.set_ylabel("Reflection and Transmission (%)") + ax2.set_ylabel("Absorption in surface layers (%)") ax2.legend(loc=5) - ax2.text(0.05, 0.45, '(a)', transform=ax2.transAxes, fontsize=12) - plt.tight_layout(w_pad=4) - plt.show() + plt.tight_layout() + plt.show() \ No newline at end of file diff --git a/docs/source/Examples/main.rst b/docs/source/Examples/main.rst index 94ffea4b..8e8ced00 100755 --- a/docs/source/Examples/main.rst +++ b/docs/source/Examples/main.rst @@ -17,7 +17,7 @@ Light sources Optical methods --------------- -- :doc:`Using the TMM solver to calculate the reflextion of a multilayered ARC ` +- :doc:`Using the TMM solver to calculate the reflection of a multilayered ARC ` - :doc:`Looking at the effect of substrate and the no_back_reflection option in the TMM solver ` - :doc:`Comparing optical models (TMM, Beer-Lambert, and RCWA) ` diff --git a/docs/source/Solvers/DDsolver.rst b/docs/source/Solvers/DDsolver.rst index d3267778..1528fb8b 100755 --- a/docs/source/Solvers/DDsolver.rst +++ b/docs/source/Solvers/DDsolver.rst @@ -3,12 +3,20 @@ Fortran Poisson Drift-Diffusion solver (PDD) This section documents the functionality of the original, Fortran-based Poisson Drift-Diffusion Solver included in Solcore. For the newer interface to the Python-based Sesame solver, which also solves the PDD equations, see -:doc:`sesame`. +:doc:`sesame`. While the two solvers should in principle have the same functionality, the Fortran solver was developed +specifically to deal with solar cells containing quantum wells (QWs), where the abrupt and frequent change in material parameters +can cause convergence issues. The Sesame solver has not been tested for the QW use case. The Fortran solver is less +suitable for cells containing thick (> 10 microns or so) layers, as it was designed for III-V cells. The Sesame solver +was designed for silicon-based cells and thus can handle thicker layers. The Fortran solver can handle only constant +values of doping per layer, while the Sesame solver also accepts depth-dependent doping profiles defined by the user. - Example 1: :doc:`Example of a simple 2J solar cell calculated with the PDD solver <../Examples/example_PDD_solver>` - Example 2: :doc:`Tutorial: 2J solar cell with QWs in the bottom cell <../Examples/tutorial>` -The PDD package provide all tools necesary to build a solar cell structure and calculate its properties by solving simultaneously the Poisson equation and the drfit diffusion equations. Normally, these functions will not need to be accessed directly, but are called internally by :literal:`Solcore` when using the higher level methods in the :doc:`solar cell solver `. +The PDD package provide all tools necesary to build a solar cell structure and calculate its properties by solving +simultaneously the Poisson equation and the drfit diffusion equations. Normally, these functions will not need to be +accessed directly, but are called internally by :literal:`Solcore` when using the higher level methods in the +:doc:`solar cell solver `. For using the PDD package, it is enough to include the following line in your code: diff --git a/docs/source/Solvers/Figures/PDD_np.png b/docs/source/Solvers/Figures/PDD_np.png new file mode 100644 index 0000000000000000000000000000000000000000..904a60899619d5c9fe50a17d5bbbbedca4e722b4 GIT binary patch literal 22171 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 +SW4V!01vN< zJ|~Oxb#`)caVd@kVIK;$!V|QcDlu3I=ws029+2dJuYo0Tlg!7jLw4u5^&fEb{-6wkRbmF+JE~1@=)a+ zBf9glP%89i+yM4&uAtbkNqES0lq&R2`PQpxnV^>}!8B;|KE)9bV^tzQ$~PQGSZY`W z@2;U*U@ifKz|NbNergkcX;CiO0~`tr|Jw_?eI>m}3aXfmrBQpSvuG4|G z&sEt1IBS_g%bGK9ZEdYPM7{B8>J?=4cGZisuy%rSa%j-5tBND1FIVSlhybcT;5_$mB7f+u7WX=-8^LyK zAy%8!Dxf0BDKB>f!M$ROC08y|GN{ftRkbw2QVekk%rFpDw-=NYwcctzJc{QZ3iXW3 zCdRR*fX;TDZ228lJ6=G*b0|jWu!^xY&bQPEZX$ckntI&+uRbZ*i3!3sNoC|XR}*k$ zQqUjrYreNThSL#fXc-JE7RQu_<3QrKerA5;DJspl-UNPshIZ(;cyswULY@ToMi9Uz z#>asYni?P9!D0acfU%(RmmUF3qmI-3NTnF{I2&ZmONOAx$jHC<1V{)5gi@zPjasnh zFa?70YL2T{u<9FO$wOcR*U9|7b~Y_NXvWITb*MmG4#H6eDid~-wX7V?DF=D?#fOx| zuoI~Lj=V+U;3FZ#fgYz<2c6*b3c$@hFeWamQ#^1q+Xl1-nEf5IG~ZCvgX*HP%fiBO z?YBHG<^S1zfVg6bi#1>l*UOfF`Qd{!NRTiJe1?t4wl-7fmpaP9_zCy#8y zpLWeGkSFlBe(Uff7kv?aF*v1VsvKz0{oTJfxW6!&27Mz4YnwP)9Z*hw=Kfg$X?qEca^zQ!P>UB)c0;eNSUDcort=OpN;HkB+^hZRf4@TlAQ28%>OqxWvv zzdxHdab)@1b+^ubvviY z&w557qAuVzlBAdzKhkarYu$Slj>}}vZyuFXUou0kvx@C|f<$)gNRFUGvr>do@mN8O z|NdPQ`dW_ECtbT~9}>*Xs!?Ex0nto0c*bK}LcrHjiTa#Q3SC|HKzdjQVyj7AwKO;u zvpU9=0tM{Q>~*IfkMZz~ZCso7J(Q40o!jwg z0y7-EQA;p*<$@vB_rzIY6*Ee#NECfek0B3|%BEX;1bsI&m2lwjNm|Ag@10FpLJK{K zTuev+Ed)IgBuP89{TvsZx)R0GDa^?DBYJ7(*n0&A+b(CIU!FRJ{5LV;YYhJ%W<0 zVsDZRB%{YT(6t-E6X`hDMF~~?>RCGkf@#eh%beLx)`Hv0RLOa@S;V5>k7pS0qsHT2 zT7D$AmT~uN>(7!L+%kbd0nNr=coteY!G8Vz$({ZK*!`k9c!XQ@RXP{ za7=>|8x=uF2KX>l^TY&}aZynb4DHLeKiq5IzrSiXB@VhINb*%xRnUMH>H8S`g85fn zi$LS2#Y(5*Zspu_DAnj6AU&7mJX^y|`vO=D=DGSB+bW2W0(S-2`ahl9hRLGl()@Av zt~YiSbVh^mY5H)~ArQzU5Pht`(umzaSV7OdhUoZlH&4$d?_KTtTR@p{El)MnmGzhS z?5Re+Ploj2*@NhtrGy*K?WbGuu@LhMzyO(F5_goDLW#SL!_qDY%j|CA? z37Vv?oe&&VUtc>zK@qdIAN7csjI8PPiS7MOK<(5V>ghnlf=OwE^e?Q)zhy!exclj) z_4{Mt62ij59>J^##7XdfFd^^a^^S3lfgVOnPhWT$P=z<6tI*_Ad?G6}{_x>G7^^y? z$2PWr{gjQgf~ACQ4+G~&qIAvOGVlR40j_aEJ-m?5B_J@^+Z#T=3ba&#PH|Ov`4Ccv zneOV@7H_nEm3SlU+M%q>fiT!={lIdZJAr8nqfTaJ8tIZUc5roNl=7+nyBI62LQsuv z{CW)2uo^58E!1X5x&0W*_8$0Ov~v`VYl`o;#B~HmYTz+JssopF*=i#M<8CVO$YCo6 zW@LEJgdPbnTB8o$l3rU;&-h*)llFi}bHbISI~fF8laA4iTFo)#Q>sn4O!tiMIC?9oYxFN<_XuR3rC z_%UBRGgNaRG!oaou1}OiWHaIhMgSY**M~0sZS=csX2SB<%Y`62dZ^e~8X)hj-DjXK z0U~c4+aU>$%#Zu^eh`Uq&2&>=96K5ch8(#!;>k=1#L-=m`XsKYfo!(2|=>KqGd- z*&bM}+1143@Bn`G{S3c?m0*(z3Y*sd`4xjUsd2Qmg($SiWME(bE2rlxo^&msTCSfG9r|54G!U);(I1F9qnasJ}AWy>H1C3UkmB7oh={VJgTBuBSXP_YHo z#Zu~h<`Wf#*5No1PB*`a*o%IF2+<4GW%Va<= z@JK#iBj*6qbT|+QK?B(1Lr5MDJcw*o-1^B)7HPAut~T!`Wrnx`aeC16sv@{V9g;zZ z)`nAI!Gg$|!JiHZ2l4|NBp0L+qykuov{3nj-69WMB534 zyjS{+wir?~bQ%EV86O-4&J(zh4TNmC76?)pY(cj&A=jd;sTuR-8wkCir$Q6@H7K9~ zm-W5AenaFs7-o=6;^KSY+W`&{OaOW9LXwlvP74#iI@>6<^K+Qn>fD(#>)^lx?hO2% zjo>r}-g%=rkhgy}x4<#UO47%)Xt%Eh~Exaa3_P|yE zwEs>>$)#yjKHbyv^{ck+x7F1??WIqg+q02UWzM1$H5&dvzm+iKxiS#@=uVC(`$puWD|;tROx?Hawdt86E^uBHzZ0JR1a`1{WvUTq*V zXWGD~qR^cS762vE2nGpoB8@?F#ho-@ItNBZs^RZKWd~3|Y2efLS$%z{K>q-mEJQ)= z1XGL8{tnbtqcu;mzWB9QrTOgSgSQ2E#m7_i*Gb#K)R~Tsr9(FPHr)t5y;+@mCds1` z)-9NQz<(1jBID2KYzDQ&?(ZcLpnPGrPtyun0RIjw?@QW#LmMy+3B87rKPk>n=*>`A zaJw^YY7U`L`XE9IY#Xo|dQ&BmgSKJ*4xpOoYBB1keF85e^qmj9Ww-ZX-mpFdw3RH` z7I+1xN*>}Hq<3H&ggg*X@qc2lC)&1!%PW!+-+@_M~m4fB8eE8@l;4 z(~tLVAEbpH2rUl&7W7GT7Uu1^q+(L*p+$mGP8@Z}$`~=OnHgQjb|cY8W`@tt0t1)3 z?+&5{%k39Ybn4gVZb7z%`PhchzgyOSA?=uftu&|f%bP6NZ$vag1qEiPJJxr6I_o}` zJZyokbvngbAZ*ot-uXkxsqwv_xG^*RB`tIuUji2q$W}4QF{vO}_kdM0T>9aYJcjJe zj1M^kM03T^-x4kXXirFSpon|gU!cykVnKl z1hy(wbNG;g27VV`m1^+D9V_X_wD6ZQEi38!?OzxB)0D03vHi=c!Gro%(n}0gs&WTs zc?d4(t4Y4=-w8LZ z9v1ZW{BUL!NvEdKvoX7!RfhC?5N%zVm(vQ#xcZ!dLKh)ry1>ev6BmMqRdlU|; zWV_=x_~qo|lb(gO>j4>HF$ZFii%0Jew_%dBI7%E*^8y;XS&)`VHwL74#huUfTEv)_ zrk^}xN~(3Icz{Ip3CljfOUk6j>NV!QU2*vAT@;HA@o(O6(CPrfxltFjS49#l?)m4% zpYusc1EEhZzF>R2dGV$1pIg3Yu=DhPNtkyP>dt!45Pm`EcNS;z7e8C2@>@yFgMKp1 zN<;0yoDV(HPhA?A9J~;HEQu{yXbD``3qYb-G~>S0f!9lFnW;E548Q{P$cVUOK-g!# zyecH5X(de-a{E})uR-ZDqmR#|4)=ZmNs+Fw4#dHnXFBIED6`<>8=|IN6tpkc!6?VK z2o9J}kx%C*g@o@Shpd9y#c8R1cUMGowd6^E-0$ycfG=l21ck6Xg0-Jz$&n?Eci*7+ zeFJuiZ_=(05y6H;Go9vNE?e)L8lNCftH^>6JcKNBp>u1Ff z(}lk8Zf_5~F$7bO?nQah69znnjp97U7Myo$oh-pcOl&*1USR11O~Zym;(pq)gPQ3e ztZi(`{FtwB%PfhTKOPej^P=MHE4qG(p%XIQe7XU5QZ?RcR1G$Ck^-T9;}~$= zh(MQks6_Ebv5*ONhw{XJSHKUS8LXE%s1N;`TQQnBwg3}oaUyT51(J^Cv6nN&;!t8* z2Gk9L_G57&PSPe>%$1jPazoA$9Hn`j()C|YLdnZT%?r3Lfe(Sm29hc9UX7IZP7KwH z3ajX%!R9;&Bn~`0uNOOqhz)oZ!0o4b-BpzYbKyGJNfD~x{1QN6MLQsVJ#4{l_EPHQ z+OJ_CU{bnvqz#yVV~^-GY)9I)#78y3!NG>A0ee2R%1ItdhRG_> zYh-9W&p-kA6O9DQ8NnV+;>ruTIm5ih_t1wKjjy$x_X1-4m#;)`J0kz-Ci(#V6Ut0T ze0+TK-Xv$xNB}Z{b+cOky#v7J=*H#?=g%*K+w~U)063_`6JukRO9fGK5kU4yNns1o zqYLnXn-|PxkOp=2^njnN1Awr>CwIIpG66X`38vrTniL7e%p1)=Q- zTlyaI1bGG$|IZ<{&c-#nJ6OK+_0b^(I^fB@hG9WScO4;1?IJMvTWMjd8t4fJ6lb~Z zz>nPD`=3Y2QEIa|? zih6L}ab)?N-2dSlS9MRr86;|<=>$j!Ku^X?6vied!6fHjL2dvB6HqhGHmTe@l&1zd zvbmg`oW~4cP4Ddu)(P1>V6V)G0qGg*B|L{{>*?+eV(aeK)^P%Y(qU2fMiGzZ8}iEa zKYxG-;nuTBlH6^D52n1^J9k&9D$r6CIwRm@tfy4X3e0}i&aWX3fE{tLs|&t`9`9}Wal=xf&|CR%)IF&VE!4dW|G?rijUx^TLn z!@*VpT_HYu+F%Vb^w|#Nxq4N|a^-7bGS)uF2HGPGP1y8J3y|Faf6Wy@0VX_Y8hZJ< zn)o8MFD*O;XwStK1DPAcSk&1bFP4JeJjwCO#~VI;IRc;QxbBnL7jB?Tb!?Oot=@WCS3Th(6=ncc&sYqAb%ql!HZp)>Ao zZpz8RDvgRtwcu^y{HdZQkan$MD?c$W&l~{u8{uo$5-g2=zB++{-fXS~-ip?YTQ4#t zwO|8YT(r+45NnWx3XCaU$QGHv<`K%qX4aFy56qxu9P|qHq=@O#%)klI{h@1l# z42(II7 z2ICBe>zh;4F0(>;@+%9D`{yz>_TXtoRmNrApY{?Sd$f!L!(Ty_t7_4#ajp z@_&OGcM}ORk&;rJ8^-vecJTw1*>$M5EHoj%vg~u_@ad>2(ntpL0L<^pAbVXT zFnpJLy(l-z)m}f?6RI8B*o2Bw$h^9=^yJBtA+CJ6Auf+BBXjMstuhAbDJflxAwxs) zwMKZPYHqW+a1 zJwpmGkJVdw@xT1}*woP~KiCQ;UJTa#HCXo%!Jtx~W6DXRplu$|>Cyo85Lz^{sMeVj zGi090lss=f#m|2X0!ax<*pS`B#;wM_&9xioHT9VWvjmK833LbFG&WifARWv`I832) z2O0T&t{F89zayN1ur>Or#~#{gOq7_qu^rlmQGSpgR!QpSv=WP~&=2N`&|vNkp*>;M zeN&)r#S!i84XW9Wbx`KLLSP<5-?&}yL)A$?vKTDVyn}qB-%&|xYr$;dwhlfKM#Z!P4k>|%Hb#oaxIlCPl&yh3h zV`LUC;bef5xXxO2IDgg~jasvzc4l>PGOQ=cO)*STZ-7)mzG3u?;(0q68{#onU`2tL zAOZmbK)dm)d*N{bRmLEu=_xjHRq3MJV?fzk?8z{Eee{RBYO`c1T!;Cpw zx@K^n3H2~n;ITghzx^bt;Q0*d;^u<%O`8oyl-o;fk(4dj_8$vlP&a@eP)ZrAL* znAfp^|4k(H$U#0HVK6X<#N6Nc9vxU=qnevt9D4{9knC3ZyW7qUBG8Y6vp=1TU`93U zDElMLGLZDPj+gE&F`+}Lv{{^KhGZpQ`y0M99r0jJP6zfm&ZC&McNhht&pEeq!B#e{ zk9n@slV4dk&!wjHU_ly)lZsR*( zMQQ-`-}+Q6+fKeOo`6P;<_LFWsMw>ABfpiu0Nn$oLz2=0RYmb6r3Wqk{#E%TbPfOK z-4*oN)5>~WHZTkU3iGs46;|@sLpE2!R_$xr(YQjcnW+4C|GtiJxkiE;pkXNfS=I5E z7f)XSUBPW^n2f0cMOv!8qR|*}7F5H8CP3P#6PBig2Va^y`0Gc(KU%C`f(kJDiyF0l^DPPWd0muVI<>X@rAd$h|bT1Cs487ap0Pu^q}VZbj9 ziF32ux?@(a8ph&$6ZBcQU^hKC=^DEV#6s(lk}fb%0nN%kibbeZ*tBpdw;)av$OLf# zb!iu29!-lXlr%N)AE22~=#tNu94FD*kd4JH{7-PIN~Z(j2VdTi11@QzUzL32%(O;I zpANT|hl|N%YN*f)T*YVR4F-l-zfYU$NG8BRkSB#rw3iT7v=hp*ryyW(d_nxw_nUBI z0UbeecU=j^DN$6Ux?2|i3Y`rwK9p5?H|J39vwN#Rpj4hJNbL;GfkQe#Ih6A0go`hyg{6ps$fYs&;5{ej@G&Sl$fOGd366mU zi)Y$|$L-O}KZj0`1iJVg#EwASBI~=iO@{E*Uwj}}B(04W4|4ho_r!`-Y6Rr^(7R;T?*1vxH94C7OKMxn{3t%wJU9tlDg&^KsN* zOXRdcB#t$|KCfg~B_H*>?%j-Z70csXvnV*>hW`KjF}tVA{2ebZ?@~bhMY)0K zOu>7{4T-V|gT({+X{j(in;4apxlUmxerU#wM7wXu8V+t6E}ltd@$pq!S% zXL!YX!DaD7m(Fv&io&-=YFQVq*xmV%er>tSu)%?ml9F9Cu$KT$R;WVcq1Z*mXTWPv zTWtHO+_eGzY}d@DiPC#;#RTrYEUADm zZ^9|6bxO6L(KCs;J`N@KKEG3!#BZ!PryfK=TD{M7fCIUA8Xv~uF;h#;S(#W93Sc=pkHlaXZJ$8+6gVo z-RQnTH~lm+GVeyAmFM=lhAuQ6>xAa zw%xBMk+UML!?`RL<5V=8ePLL;!_8wcDV5lJ#R^YJ`R%ZUiFcOEpXZ97KchYWM>e9LFCp1U;7%no zIYz{G)S}(*`)HYS*~T2FR|v^z4+Dnxb-j*cDWtn*#|8PCJbF$L5;Cctr=sF0Cfkgl z01XEDs?rpkDQ@5rqMiJ9t6yBo_|R#sLE z_&UMj?~mdli7dpZ#k0zl(_-;M25c|w&|SFKl0&Qa??is%o&C*O_I1J4 z%Bfq9a>i z*YR~2(W?&@R#3UZ3v?tdTuVL)FfxY`7D$JKgMIZ)eA?Q%XTW@n-ZGjYP0G zULdV33Lh_-1@~jOEBXQx(;-Aqa&mG29-cB`0hMLaLDq^@lT*=56&{|TO8i~B;)09A zA>vW~nuJvy7x4mfDERlHLpr4h$tvf$709*rD_+Jfw`c4;7F%NK3x^6ZB>(!+qmYp7 ztF14+TgF422=N3FYHC7L0wxwcI-mRavA51?Y>q@82AJImBDJd(aqU6Re+&2eW+&l+NE5wOWOX z7n*XJH|zO`?&BXmwaKoO7|&-odOOdc&Sv+|N?iABTY!}HKsIDatDeL%`^kE>EJ>Av zt9+i~r|<&%3zW=Ii+w$~I~Jb9G<*DT+=wjc&>x&!TnrnXEtQo?3id|J3=7&0~=Qj0`mR*s&Mg9`KD!Gp9b_SIEYr-_O4PK(=r>q!!rpE!P!s5ebi zZSeYF*cqmS+ZT<))DOvy<9&AdkxYYOSE`=>mTZp-3l6q`ET@#n%g@gb)wCd%l>Ul( zH_xPYxslgMu}1g#uHe(;ys^V=L3nsu3}S4dK8?;W();w7s;a66hiM`*vI`R4u28a& z3*`YQ^93?I+OYds6qp3=D%>4-K315v1sopi{7lq18ojtj1lpvG&aj-!(LKci^$AMf zt>_Cwgr$@9_HjgxQ>c3n&uAa}EY;xloCZ^81D9F7pM(tFT^h_&OTYSH6EhtXbGFGI ziS$|;V3Bd*Wa}G^z92!zz+hw?}z+z zbI2o_)x@_=%^*RzI5}Al7xs}$@Y{4w%HZMoj=nh8(fYu=-iUGLhj5gWDDwH+J;i(g<#8XRYzK6#Sg`37b-p8%e(aBzNkxG3Oof3pUVgH*u5m(Iu}0aJfP zv7*b<*@KTK-o1T0w1PsRP6TD1qriL89zkh_YOsF&H%|TbS3Ay7O+cR1un~0ord_W( z_q8idGw38SRizspAsIsq-3x=d2;EEW?(Tp7{28ydbb;&!|KsL1-RjdY@;O@SV0Cr% zeTKNlOpBLOi$U!{1FE|5) z9~|s?EkAED_4}<;1|k2c+!&U%qV2%ofPd`w_fHU66EE~@0DIH|AaeUYTFbUGdw6h3 z6cupjk4@d~D-*3gn-ByW-#$i;>iF&cDVSBUkq#AK%|UQ+sH7si*1vLT6{>$y$&xgde13w|A07b8^F3+lSGn?$iM;yj zJpyfzJfGC7+MH!#YJ+>u`tRCzgpy*1*W&dnkhp&TaYV%MAtHEKR|>u}n0Kqz%{eGJ znTD=qx$ef?4wP^Rom;G%P?+ZlVs7*4Ukvq`tpA%mK2ck$|M@Y_Wn*k)#OV%D0N@^H z$b3uk75mhJ0`{~iDykyYj95DLyH##<@sgTBaOWB~I%jtXnar}`?BqDQA7fQP@RLP6 z9RonKvf-F$VKKiQgkh0Pnt(|5isg3%zzSB8>;zKy)dK;MEx?##Vx)8|`2-ZHb{RJz z#S{=wWZPvBMBUWHH?z0z(>1&^qW6QKK#JYa{$9@BSm;gl`ib`3^e><1VJ@pbQc=lA zP&}j8F4g9OZLeQ*KjE#N_v?Y4&u)q)I-Xg9H4|kjQ_Ddb^^@+~9LUmS3;-7AE z%VTMTU4ghTY|SPzhI%ju^)>&Q=bOjpSZ_Vu*xW2?*5ke+vNz zh*qwGiq0E(k6Q%ggoYi%$- zP))xoQ-RpFSKxs}5mQ+yXh5rFZa_Y)zO%Jv?xnBXV>EFwPJfx-h%b5ueBB)9_%{KKV|e*nQiunE{s5glY<*^nYV1DMV~TBsXAUrEgouqJfpPnAzzeI zqHHA4e+t45S(_bxMP(7$t~6|tx)&N2)R^8k0EM@(=*l|E&N2RDv(<95S+QNx6&|6 z#&ER~5^wyn-_Ax3CEmVK$+3B|kaO~0P}L^uY;S!hFp#LV`50j)ZzIj9B(pF#Czo@x zhs?ltq(m!>>f$<{ob^Ll4TXmaRSFMopVNnU*^zO^=PqI^C^*9xXia-#O;PD$gnZ+% zvWM0bMeGzI!t$3-B1maWeb+*!0-e)uyMHO$8oIWB3c~MV#TQ>qL}DdGAAf{ar=~>> z{4^TzTzbIst*-5Rw5mkcDDwTd%6|VSazGdc)QJ5dQp-lr{l}ep)gUT4P5e|^NQUu0 zHSzZsB{uZ3kHr@1Z@kN`iZPkg#5Z6X=8hYUueHgSXCXz_mga?hcM+E9$fM>C@%dE# zuh=WF(wTG0A?^Hk|L~D2Ag&zdv500rcv_ehA3Kz+LOvw!ff+b-#;0pXzU7V@MfhSf z`Bb9|;%*NqClfMV(sxTRY8cY-7!-gDr10RxNYBC);l3o~u?F`Q1EgJI5yb|lViV-; zff(gEA(d9-aaFnM>jl{|Nd)FZ)=0L(uHAtgIj({EjiSXQ!n>(k9xD?G!tuKJ>ubaa zL&w2fd1<r=^4VNfm}3^ZcC4on3^~7f&!D40)SZKbAn1?&Q32YTMp=WOK96Q-*8S z*W~fJ`5tqDdTsIpK)edd=Ou@N1Mwajg$n+E5G9znwN zt~JXGc`+h=?fSq_SYi<3d(r&wHmQz44mGNd)_?$9#RQ-hxSjVbFp-1LupWSUW%~N| zuf;a+-`tbht!s0gPMg0iaWxsBr3F95lE1${gtfPM#Hkqwl*3}N9ccsCY-nV zbG9e!wC~Oa5{g*B{%^f?4y1@LiUu>GYF12u1Dwn?^jGX?I%TWOI!WSw%7s2gA9S4g zx8#An7|e9DiHV8kODX6f%N9hOvS~2nmjM1?w>=}CbnhmlIrXa)0wzZGFE^K2Lw83? z{(T$oto+TJ3;kJH>p3^V&+nv%2jtCW9#q@<<2EprcvJyXVi-ez;t0Ukdj9^F z5EO*p*$HbiE;h}reYV56?{)md-x+Imm~PTABB2osEE_0uMG8&Dl`lGQ9>M7W%=>4o zRH@G=)-(RJ-VqX-Qp>dXx8Q;9z|dIsBm(E+sI5(5SS0uQkr|4R;6H1@tTUBWcplq< z#PJ{6|GlChr-z5ol$`8;rY)OTWd1TSec!Dr&C)%)_EK2m9GFLDf(kVYk%V zPfGgjXs;bL7R)Rxue-X!b6I(LpOl%mcqh!x4?;>ePRW^gbZeXvY!Sb)XgH&Hx* za0jU}uRf3+@Qtvyx99Wl@btW@19*~u96xpr+jKZXInT~!_A*E*Em9-zFz%n@`29A` znBdeVP#Kbdod6IFA}k8p;0A+KCe7|D3Swpb*iOVCb)-K{^ylm-*Qz^^gkfQ4IxQON z@Av4;^_AC#?Lt8Z7^2ziZZ9q_&cnl_q@=WyRbA&e`x48!8PY5G`uajre7Wvzf$y!S}ndB@`{ zUSRe$ck{I`osgsuofhBY9cG}H>=6uF^MeO{S<_iclHa1?ndbJig9O^7J&Z_kpyXfH?%f>%vTE~eBhKnF~ z|G_O9KgMac$?bVjkrg~FGUR-+D`N?yKMqIB7HmH&UG4SjzG8I$j|*4bl}R>Z*~gtf zde%gWPjQVFRBRCv5(4w+4anWKSvG{oPTU+9oUt$pO>b0F(>JlI-5fbHR1(j-#ODxS zQ)m+a9^3A&uC6N+b(d69gHy!ul3SrH80zb51TIbNH+xjj;JVGywfoc_s83~vNudJU z4iF}QjcY8ra;?oqaN}}6*xQDXswq(XPX`J!@*r#%wyxGw10Y}TD?XueBs_-aG}fd; zvT0B^_IKo3xdn>q>I1-Fx^q=VJs~*y3<{DnIZGQV`JKvpPS8@)w zUD?&t)VgB;F;-K?h7fl;9WKz<8;Q*P(4@z}&a#J`0X;L8HCBIUZ-v0kPl-$rK|D)I z=5O~83_?@Q?v~gc%3p_89sUD&Tue;N+slhmS+iK3r9NX2H{=2qxlr{`U+C-XLM(P% zg{FLdoBjO~28|YS`!>>_-a3HQHgmklMV&u7A^xp>$?1*83y19z~_pcst9atvd z36!Y@yYcnKtbqGGC)T>N%us6S?{TY#rNJbBE%fElAU~Be8p`Z!oa>Nalnnohoi0iH z3B?3fgsU zr6)w#;1UGPa!Uxhx&7tgOZDYimxQJk`>p;?t%I#CJuPhsZ==g18RdVz@nvof+kM`4 zm_ofCt+Txpx|=KiZ}wVSTLX4iL@m3T+`c>Qz~vnQqn~8&ddet17NJ}A#>uq)37=k+ zX!A(uE{w+I>w7>4r9O0R2Rl5|8CUG-CO=qX7g1W#xXCq#ZE&6P0~Vy1)aMV=uF>$P#GX}CY+L5fQZ@K z{soK!P~-T9Ru89CeGx9g5u zc10g-@IzfS%FN7!bU4-EXliH2JK4^O4Hmqx?u1UK*_triP=_vH9xZrgLrDPWTz#j? zOjT7C7(L*(?Ok0FlOK*^RTsz%PSclr(2K<;=oT|$DeEpG(ubnW+9AzDK#Ev>NY~H1 zNlH(j28>Bxro=AfUprRTSJ<%`=#(4j_YB4qC`F?EzbaJA$^nxa6w=Jg&258j4}rPJ z_qF=|1P{B;)*tKb4T<6c0|PAzIwQi-{_7S;pO*{8)kQu--2z2QD2nw*3lOL~>$k}m z(gkxJn?S|Q7P{N$ax^d!a?B;w^d%rG>g~oOsQAA9{0V)lSAEFQPA$9NpQ&I6JswR(;$NPT+ORf%VS(;WB)kPTLnl3QEB zy~^&^EuksL*@K2R(w;RuD`0ky=Fb3Xm#HzrmME>Tp>$(Oj!PUI zZ%0SnhYM8>>qkSe)w5PHaaq{VP-yDs?7skP{tA39?1%3lA6NoHvb3zb`}z?uAXQN$ zw`eiYp64_JfFlW;-%RHzpYht7TXyn$*kKUj1RWS`N`rIp4iuv$Z;P_yAQTYKi*ZW_U9k`$(FXeYc#t z$#uE4bD#ext~6Geg@4q>UwLhm!o(3LrS9lZAn zK*$wc-}VTT!IAKL$uBY>3}6!jIUZ1M)W{omd25-_q|M(?Kd9awu&C?Y%Y_bW1MNN5jQ;{rq7BG1b!VF^YyE% zI3w97H7RVlj7bINPAl_{zCN%Zw_BKKxk8(R@Fzc<^{n}S6wSbqH=Ui9eW?i-=OLcH z?5Bx#I(a;}H%SY^1{4hlNPzLRKqVzY`ASh$K|zNIgecezyci|<^ZpuJF*L@!ja^D8BzkF zJ`a!EH6Bf~hl@)GVJRM7E*6IgXa@6%!j6GClM5p&ND()*d4sFqVX%BjkO(0xzhs!d zd*dXa@yOod6l`>;pd_?kzI?&LY}n=Z0C?rS#%3!qECG430EFT%8FFFp4ZWxTzVY2g z3kbe{C6w_|P!N~qx&l)!W|}9|r$Et;6`R=V&<@T=_XavH?PBN9knoi&x?_!6B%3xL z$8KVu4@u&&Ji^}uIrTB0@Nw*-WXt*bwnRmd7IedaL&^+0ovip%?3r7}6W%&O8iJjD z2&}<4QQtf!QNYxs$rU-b$4!o1_a$9mg%uMZe-qJ*MxYOVf3hQnVU#06cOgQIwKH|b)M_m1C;$?{sjN%LPe^KiV2{0oU;8Cfu1QoH`xv` z!4rk%2P$G3NdC56Of&ogz1HJ)KhQUzOqoy8lH>A?{pVK?Va~AXWe6qD8z;w^bo+bQ zdFGx{dG?e{Q9)q~3YL#Tz)1f@1;d%ULy5egDyY!cPn~tONYXvEc>~lFxJ@$|ZHTww z^(MSm>AXNkHrMl9d!A(AUO<56kBE+LgDe4JgPEBbr1f_nF2Bw$4lBtjX(;JeS$c5; zFH6+wDGkQBxq3b{Tcp`l8WqX;z?y&i3S&8vxFlz$P%_}KvFGA(nzr}v--Di+z^Ngd zENKjjp?xB>@aPNqPPYau*fy>uM*%Q4wD#RugVedZX=OF*LvIfW>v}pFxxN z@$n%_v^F&rnj$=N|L6lU_9&3M_Cc-%*f~5QbBazsL(J{vE=GL0J}K!F)b_Yf^dvhB zy|;nb;<|%z!|;Xz|7BOlV%^8jI1=jfT(|5+SsB0+pvi607wPX>uP~bvr-G0VVgip^ z=Jk<=lSCA&zkcPpF->y%EsB@STm3DdRMvMVRb#tVWboGxi-Xh8Yk1C%iOLZ4pLp#`K2=v=F#o`jB)372LA zntBS1T3@ON{8m+_5l}Kvu){6PVq&TGsT@s*Vn%3xFerTM1<9Gy7CMo5pbOtbzApMu zyu%<}00PK>58C(lH#1Z;V~;L9b^>4HL8|v$yQne`$jEu2_nPa{z~jfK>O;;AOvv1% zL?EOWdXj#^9&ql0h-P45ARuEIl-tLU!|XqkFQ82?QQ(#_fP$OeNnlW5r}yIfbF5s zp=m4;umWIdu`6y71ggiNm>ohx@)GP2EL>B>RJ@!zgQnjAIl(Ury+q5-`vZRu8r6xD zCvU60r^g_IuU@;>W$3Z7q_Lw9xqq+0jl1^GwZL!#NMa?L1&?@iDLN$l_*IJ_nAPbq zwQpwuO#xK^A;qIpTI;&3xori@IQ{XXh}W;f%u%u-It0}O!hS;ALAnMBtn{OH4F_o+ z8cTQ-xx06n>!zyA3AKO*O@NMO)-~;s+xpio&1))OAxyca`8D$&JChv@t4Zk;$(w1S zz=9!NZZ?qR2tvk?{ftw<_BwmnM{5!0=@m#D5J&TgV%94zc*CQu%`}*r`&CEVbb#l9 zE0li1K2AbXx*NmNg%LA<5QY{+hb{)<3bq5BF8YZ=Xw|ukTID30AkN%oG9S8;>786S z^XPtpH0h6(l^XV{x;i%x59-+V{f*_}^_tGk&cRjnLS@>WNev|fb6`$PO23eL3_(O2 zq>|s!s?f}OFH?~=DoH44pCJaM){1dnCPb%9#hby0!jHDiF0ntAOj_TnfX!DX)A2+5 zS^lO&3N|4a7!VzBz;vvn~LjWoZ2FD1U-7IdKoii@nQA^A>vPhW!5 zsz_tIVb;Idd7ellF9o~1^GgxIyU$o}@gkZ-A(fX;$>$vnWMv{8{nGlJp~ESI8YM!g zB9@lyA(2nMgcBvO-;}o{q}3S!RcT;&_;TGDZFbnJjKIFbwI@*z%o_zAXIj=VbOrHf zKpMXwIVv^G&CNwp@s)B+6`aw4-C)@2?M4?&LFy({DoLnbaWjhU(8``Kbhp~lF5_?V z5m#YJaccAUd4c^|^_yaN_B^80$B!RF4?kL}^Br>9nG4s)0NtbrTPDk~V7H-$YM=F= zGTz#T2GAzafCuGdWr1T8@xU0#7^2S5U*QGF4Xr^=8D_GfqNb)M)rlIhyNSFfBgHN# zsIFfgr1AS&pf|f>{FaoW`%Z%mrJ)t}@x!3M5hP8`2lJ71lgi%SUa4-GA}h`0gf%W5 z($O*dY%GCS?Vi283fFau_h%QBltG=Vt*a}L*?)^`MOoz1)q5 z7&=kV2#kMo^Dby^O&&kXg{PP#eHAK#A+PZeyIrn_ndy4>ZZU=e6Ty{q3<)V2+9Nj+ z>jhN}{%H=l=8xI7wg(r`{DY9%Q=f!M5?&q#e}lOu%5kQ5lop%eSXR*d%i}dg2U5K> zFxV3+Z{@OrQgSF)kX%!TTR~-)|E6Ej^RPPW>+98Zb!D0b5qo|NWwq{SA92j(^uO+X zVbmzBK(s00GbScCkZLTJFEj;}oP%+Vi_V;p(~c%uGuwD4W*VW z`1<0t;N1W+Ke7c5e$~oaijMs*^7`(x!eUdubtUWAUgH>&8^oonkSeNf7&s!gYRVpUkthVgoH$uf6pB^9ApAbFI!0-c&eqFDG zTd%r0!5HM*2X)wi0kDy|k@;+2~Wx73{?WC44xi1n%5(|B947whcXi*(ewJbAhTHc8Lpp(G9_PjdCk^wIN+j;i&w`S# zaj~9U3eG3~ImGeePE{_XDX?ciAJgsiz}ngxN>O@xIs+r4?dS^-UF{d{<^aPb)NBc| zFnH@M4K~$@c6WDsWQ+j*0G0NH;o4ANUtdRu+`%%*{Oyas+f3@Q8RJ-QhSJYoQYxzM zhCtjlB{_@1YTd~~=GH#mSVj^cj9Cx|i;U+l4&wtPe?fj)COQ*R1l0MNCbypc{%B_- zvB}-MThSmk%z)BBOwB*l;^p$OR7ccd%5#6m4Vq4{r0(5d1@umf**Hr`7zT9Uptmg~ z(`zmZ@c~33%{4W@AT5FiX0+Vc_Q-xyqIjDYvtufd28B*b)Sb8WazK5hHI@{!{F~TS zfBFJI18bZ5g*x54leDB|jBf}?E#q9Do(eitQj}oaAlU?*d%I!Qx;(Q9JS8$Nt#+wg z0ef3Q%QE4~SQ{vlxVs(D@CC$Mr&C=Eb7UvFZlcRuCPex$bst_Qpvw<`SC7L&yWtZI zi2q8OYJ^V22X+J&)7W%mP_2VO(p)Jj89PUBDUMv7lzkP*`zoTT2;@+!k4K|XA?ws6 z^b9ptYK`Bz6L_@Q8E3#}dfB_N6!a>CPZr%y)Eh5Nu1qfC6{lTvgDsm{|9bz{9Wbu1hRujCT*m&Dh!{{HwS=+#XRRl3C)^ zWsDZuGOS_Z`?0gWzoKetT;Oh>Ug&rHaQQ@s`3eaeicfw^;b~8BBmsLP7Xs)V@*?8; z9j6OKDfLdD7QM%@K$hUH)vceskEn9vpIiMtTJPzvN2MGn1nB)j_(a69AGB%p}B-C4{<*3)#U!eJpHUS3{cEsZL>EPiun5f2#ohcp=AyvHWB+7)>2 zcVP1!Y|9~z7ohOk;eR|DryrIFxdm>iy1Kdqg6BX1f)T261-q61mX`#nLyC@8 z?UM8Cig&Cf$Ia-Av0WPgU7)#QUP{g_Epdj3lj_s@cAN4Wh@X;)TN_xstLuMgjFm31 z5aM)=%c5%iLz|}u+mdkvn2$$sxgrNZcr(P?wkELmv3J6$6ry9GIEFR7HilwqW^Y= zKq$v^X+eRxUvkgN>QYwOz}13L8EDNC*E8i1!f5>HvD0cgbj^sYpD zRh#hyx;iv}IFJj(#Kc5I-upWuKrCy1XQnI2_YHd@)5@1MK=A6Th&|j7HoESM)jxkO z2$`Ljl&%}8<`Ds|VjgKxYsPdJ;p(9dtfqK>uxnte&|Qa8UCIu>cTYh$)@+A1?xB5l zD&~hGR}{MZdfXGhdO<;Q@=?G{4jRXaH;~{3a?i||p|Y+wLbs!s4EVE(R2%e8L};@e z1T?UIF>M;RMS)lq0l@gR?8zxCDdC%$mPUiQcTe2?M|NczWgB_xDIs|nO`f{Q$GV3 z8T=d;yoMwE)l*GB3NGA9!fFYxtbWV@AWt%_o+s!`GY&oNL4Nd1Ro-S_JnKOAXA%zYjx0f;C?7D1iw`HRL}t zuF+6VgP|8y+yoorEf(^a_}`)JI0_GlFK%u{eP`Gk8&?Bo)sN<)JCU+u|Fg`p2>>8Y z3#=B>^2`8uu0Kvmsw+xy8^`bo-dpYb{`KoQgaU~5W24{HMRh7nrs1(VJ3~sa1rdnp z5^mrvzy-1oB4siG36_J}deY+6>2!uH5ktx(nJ#-D>@i*RB`}l7Gak#nZ3vel&Lp+N z$;x{jpgjTkURm~Wd+i+)RHj?TZ-ae|jEtbMp+i_ZfrtxPXudba1*qh10xq1w#((wHHztQoc~lvK5m|3E4$o*I!GfTS(#jqlLWB8rXc|tnh>44X z)0KNt5Jw3ni8`L|r~C6QLAw$dYKW{T;f>$gURdJQDnA|#XF9gP2;bwu%F2qI0}(yn z`r-~w&%Yq)`~D-uchgjx07r9O-PI5^wL=-y;r3#d`P(OOGc|#e_0L%HNj4$3h}ey( zzXVI0;e==E2cFc&9LmXepQRsQX-48c4z4Me#rr*^e0d#ya0*6OR~L@KAOZH+f;OlM z=NFW>y5Ypg{Cy-Dj!ti7kOZ}TdC0CY$I=xA_Ey9FsvRgk=n{2|v>GkO8}rx2Y<$HL zTu<)yjm#G>=7QS*mz7r=Ko&_h7G|}cuzxhYS#hl2B>U$NRUgP5Nf6M*4UdpLS)eNAh6f)T31g5+p zNTJ${O-?StvIBpyb)Fp0qWI@aF!s-y@;{D>N-+D@8A%=CZgaG8+g|2t{|^^z+~f|) zaFo|F1#711ozAZip#|?y3F%+yvp71+OZxn)lC#!;JsZR__emib*J+4+T6Q@5N_P? zfc8miZS{kk1Ugr+J?t$Ijt3a1ZLH2|l75QUZSSnxQWX&576f6RBzZ2eBjcb*|N3yRCr$+|&CP|Q2`+^9p1;FR zbt{NbU<9Y4K&z5(gUVgKa^w)m=e};F{D*@2oB`N^!2NU0=Z{^X5h?Dnu&05d(!P5) zJ1%Y*RJqX#(<~tF;oMQmUsak}2kY`TK?!PI2e8+j0+~W^-Ug?+s3|BU3tK9J4#q12 z#3BH*cUOctaB4@Xaq}Ce3ZoP*$Xb%~$^hO|oJBzD&_My9UV~=zDNr2$ies$mwplNB zikN{M4@b|S9z=Z6iN72w;ShsWI>ozEE*HJ7NKP$3`b>>gBzmTRSZnVcQ-JyhI2;hf zr5A+LjKR{lPifUFu9r^eCD<6OTf8TsAA_O2C9S(nxBcULzhMfn<*72`}(-1&M=zw3?GAW5P2NC z)q^K}Kk-sD4Tf5vdVV<&`w-$!6ORQdbF;`)R-NnEpOL6nJS*n9q~7Q}4`gvAB@!~L zO$Q_Pn;gG)+`i~{)cSeVSP$k>h`>=f3!b3}+(mq{pAf)>@P6GQcUN>zZ5gJJ3=wGC zi_Hc7Rl-i*02i;K*Ki`pbY~k!f&%F<98txNVS0b|t8RPj5iG-kWfQd>P zHJ)o`^%u){Z9BooWW>`M>Tu&e(6**j3^>?JLk7Pml07pQ2Mh2jq z_y5GI>0Eg@d0^j@XiLH<7N2{6V`=c;u&f5oIKWW|@Cb|%9c{S@l~g$J(dKX0_!a;x znB3n!1!_B=5_ap=soM$)kHIu$XmjKq5tovJ<2$0FpJ0=bFkzshb#`;JREolxWvo9H zMABdgTGdO*aPWbeoA*xTtJzs8Ao4&lFoU)br>m4dFc+HAD}$B7MagPmfqHS<+Fc2NCn5mR91s>ei;t0b@xI9L8NH&Ly#+{>pi_seS z3MNk6C!l~aU31R2=!)%CiwF+jMH(4l_8gH3xkJMoiKJy>>K`pQ4Q4BeDPjsv zC+M#0wX^T>P6hIua|Rj-=pky}I|Cm+l!L7u4ndg1VMrq%D5hYJ0YC+kfFl@lBHkf! zRtJL{Hy*>0CceU!E0DEo1|Elp-}^okEZPiQU3?J?#Y{eI*?%TM1zXyrm~p zF2F{O&CSs?Lb9c~D;uk;OVE8-TQ3!=qydQx$LkXJ26=IlZno_#GzBLKd*ayG*zOn_ zYE4XmDY8t799Qj!*}Nf(*p)Ev0eXPcX{JPK1q#agFF3~erms&W^F2@)fGPK83ny?! zA1W-zEa`vUusr6nm8xPI9M-A7sDe}CG2g!%0tSN8#zTx`mkj~8js_LoD9HTkAk8nk z!_#1`26~JV-tkuspa40Ce+8oKkj-mrl|>H#awRCq0+k*coQ4JJFYX9YQzwBX5w0%G zKLr3Q6)O^K{{oY|OA(x!xV*$qsYy9GAq}Vw1elg|svC6BMDFiyCfRnhw_DF?`JWfO z*M0)In52w78FhCW#lq2CRu<#y-lH(!el8l(gL0yN^F3zDb|^nQAt9lFU^=_`*|TSM z&HZben^x_5ROMHD!P|8U4paari8ji$!X1DLt#vJ-!MJ^g)WRj#VZ08?4aDH^5bONG zSqbb}q9WOutbzDP})*wo@4J69r%{lmAObrtqPcg`MYY?1CLPBk5Fo#k zpYrIy3fO@b6ZHTQx+&_fhX8$~K0)*CP0U}1u%T~Dj08v`Rv#*LxPUf$G*k#ehn;-t zUwg5mUiss$Oun=jSB5Y$;9PTROHy{Yh*1Cj{A&^FQ1Lm#@;*@Mx$NP5HRL4NZdf<= z#%Of`JOM+q4D_F%P4&ccb^P~_L^=mtw zZ_Z!e%RF>hnGmUe#Ps*-XDQe?nx8-4sw$l!qUKkA=mJ*u|Nd3b9BkQqhSl?8Ixp@# zJ8lJA-0q~*Q75yMqrrOQ`*JHaY~Vln0Sf&%k^j*wZly;vb!w5Rqf8syb(crLT|tx% z*r}Rw?`T}B*TCf1mB||B`9<&oNO?uC1{dwVWlSq|M%sXrZY^zV4Jcy{6dW0_o@Hm0z5dW8^Q6Tf#o}VmKGYHo(g`iP|t0CG(*gk zAftCVAh~`_zSFh5dh|hSm-&dhR+mDXBP156`Hie+U+%-9pRs?>pn#rN%27BcG@gb) zOUT|_e)SNa;wrExRyb!>!!3P4(g2!opkKRp^AV2Ur*Kqe0}i?1`vSJ+!k6{{4OY${rx$ z8xP~)q~{5`DL=PT#}U)la5&H3+Z$ow^W$>AT;r9*s$u zJXJ=@mlK*-8+HoLnB?UR0V`E>QC2Xuz*tzZG`V|fz1G42MP}LD8{B*gickzN zNf9~DM!c)t+izI?{LpE){wx)TQ4?FbBp<_d&b_s;N{5U}*AhXWdcpfo2AUfNS{l_0 zB0kTvk4+w?Ev&blXAjN_pvn?tL^U>QEEu)Xy^pXa;Un&HAA?lNDren=|V>P$N>XgQ+7)K~1!Z!&Aml zto&4iY8$uxdN{ePGRbbkWjK9oLi?5E1UAkN)o%YhL|uJACwp%7K!W~Qt*q~Xk@B(B zOm(8`UKcS$@sB765MbFPMBM?Gl{H9b=n56S8oC;Sx_=PA`GtQe1 z#}mJMdivH=w#ZPw-8XqBtp~XaI{vJ**W0%z@`WF(x+iCL^M!F5FGr#Pwg0yK)B`T| zlPZs>c+W2MkuQ9pEK+qgQO@Az_nCiBBW1FMCVXHfUm|2P()L=&wb(P1w9hBGqt~q4JD@`m%whI@Ex}plr)%0R=lqYlXL4y=CFFNcPAJu90FE?FxSF zGVZtCNv08tBsmsbrY61}TBvwlE(!sD3LXwmpU87smD$O{+rNl2Gi7I5WHD2Z!op}o zuQ@+9z3t&fnV!+vT1!Uuh1!JE`$bvjkIGsL{F8@6KeM8uwk~D2or*fKp_eDcz8}7< zrZz{^s=8En1D~>0ahYAk@u9fKkW&PWIrxN5dF(4^@vCw!k*c{wT$GP(T|_#|{PgnH z8T6T%HlDJ-B_Nz?JusQMK&Pr2{?pfhWJo;ABt*X^!qNYC&6&N+(E$jOf$tAZC^sgu z(GN{7Z9K|37GxrY@EouWCphnIJV^ZHCbf6#;PY~ImNiNR0eQM$YtGzbCCao9EOJ>Q z2)OCWtp{>xg-GurVh25M4u7p^qoPBceRqv+)p{(?3(;4Iu+}WkgVRo&>wlVIe+Wy6wjuQD$o*6(%O4cB%t#~@{UcZ+4<-v9J?NiE{pu#`o z9FLiNyVhj#Uc@s)o#lbUdjs4LM~NsdDkX6&yzfp3*O0X(Hn14b45DJ7;H=%sWQgWo@W>Hg6{C=@H{cb?il zg(F$GMm~}XY!v=k-)e@jsKZ!lgFy1Z#We^_BJYmjT3PRYLc++O+dWC-vwuF7hdb_m z|I`@{I!U#Mq>5OwsFaHI(moSo#@0d6Y{bRSee`QVj9e!r{cjNACD)c4H)}5Rriw)V zP2hNet_aW7yWQzb{#y@mzk}BZ05E)?CDm3|W)EyJl4eh7ZT}HiUjcZ>l>%ob>aw8R z8B~jN`inqQrj#=G{dW#Ux3(*Yw_QKoy=^dQ=e!PIV?n3xC-`}|38dpvM)i3CQdbZ>tjKxXC( zH{22X?6=U@%BBp1_p$yFIh-Q8gSvI=mdDZn`Z>I20yA`X3@}OKAArZTYXYwRKFQdw zY-Fq!Np1YUU>rEOHwKkaA3r}v9`7hwu31SUfy2W$xpuEJXuwX z1%AcZ4Neiz0nwM&TcVzG-0*c58?aTgvll5rfYM9@5_lTSAV5VR>>Vd+OI#0>CBWPi ze7bk|+bjTUn}M$|aY=xq?M_~bBiSr2E?(7szdLL>G_nh?c6c;%bYMrzDi-}=9w^h= z5NLbIV%e#p%K_}WJ1O)}bM+}#PZcZFjeIRZlD7a+f9+W~yxwg8R zz3l^?7PO1de`85Hngrm;fvR+a*#RtO$9M+bE%4Ck%<0o5P-oyY67W{whq?;1-aPW> zJXl`6y+0%i$*o;o!7*4^`yH6TBQn6BRpWLYH;Cy<+@IL>^z?{3(JaWL7hVKz%+Jru zSCP}uyw_dDW&?3N=^Y@C89F}zSRN<3@E16l*4cc_9UE_Q<1u^<91ix)7|YKgZYaco zg|guBJi^+{er_P4nOQ*$+MR?kV^6x}SAd}v`n}@o_`s%M0kksS|NZaKCvYC^Z2pY) z!z|+tBWX{-n-e-eK*Q7b-$CuP9qvj+WB?mfMF~%Y#nLe^Au{Bv=2lkz=W|4-Pv?wv zCGb%Hcc4m5Z(@MM`tL7zz`-p$2aTOw#tbx?!y(NhJz%`vBgA8tYw_LIB-(^7tIEwg zuKZB>^xIGaZee4T5)j09BRF4=sVm7B5^rv8d46N0+aJ3(IFPTw=E8qYc%|NIg7okb zxuZ|0{nY}heF{avD+%GhjBnbo0@E(R^ zjV1^|4M-Ea=rE>w$Juh$DbN>SBQC9|1#AQc;&~rqxat&WAFpv1v;4?pR;)dva0OwN zCE-)=D$2nTdS4V2T*aC0_yMI9lQrmCVleP_f!U#zcM#S$P{Ql>AJl$xN5bA3~Z z&ZJir@VC*;mVO9&f`+}dHRtfFk>yh$65DVs^4Gq}k$;jaDaSH390ISVIw{^Nc|ppb zH>uWfHj~3Uf`j8eIMX{LD76y5b|=`v0>CR_K$f-6p*w%R+JE00m;rFbSMoi%P^Pfd z@A2n{exn6wQHTN^#5sLKLwKEw#!K+Pnt`udzIA!frK99EJS7t2416?XNUf&jfQxc* z*{o9#m|}2rY8zX(O4dNCrceaFF3lOFc%4$m&iW7%-sWMSgqX8nkW2qLwUdwZ`JbIR9oc29>IN{_< z=nh(H?+usz#+3Loq(_e+jObI9`K|hq_~la`KN5uknmUYkq}{;vJv0qYn|IeG)k(=f zY6E6X5d4S<@Y*Pq=q5PTZg_9Qy6M~Z?>y5_qoX%BHk7v;FYRZe>40Bz+W}b8)rY0q@G2Eal`gOp!;7Xo_2neLq?ydG zTet&G3$m=)* z(e^lL5w%nlruKR(n3ns-SAP6xZ*PYSA#+8mH=Y(cWr;don9ddzPZ$mzUQn{nmt%qV z8Ql)p0H$tEU7=0bq2yTHl%tiopDQ;ia&>-4MsJwC2!O93eX)_(gcM3+&jR$#4VDYbnehS@LE!Hg4 zj}$WU!g$CmyDcJi^wFIzJK!Qc^TaBD-AHT)tO*RPrj|KEDd-P4cC6`*MIgcMBC+@@ zl!#JkPxprM01Tt@v~_g!K}WN^HUnCmM{ai?SZ)RraD70Oa6dY%v51ZnKvlf!hZNh# z2PE%dGKB`C5zbashc2SmYNSgX#Ntzfn0-*w&yt^@)Pa!MHLm{EY}RAhfI-%T zwf%;p*gLqEdt>EhaGtf*Wu#Cj=n(rB7gZVVd9W*HjU+BvwnqY=7bZ_frnO3CfL>94 z#>B)74-d!bp+55=EKmexDSQd5u47*)mEG1x%Tw^-rB}GGsLEiyh%-JlC8ZLSb?vde zUPb{_vv>;ndjuUGDvmSB2@ZWHN_HI9EooKH$Gn87%n>=@Xa(ZvWp8xuK!bk;dc)~5 zD2lj)mA*|{f_CJKtovtps2_ur+jrYLk9Of%(pDs`vFhl8fEK}kRJi73BhUiLdoG4`5$*#2F5-!Ks&$#s7}N8EB&t^g_>owIAh0!#>8TtAi3f~qDzXc_Wp$CG%Ez2 zjnB)8WwV67-0-y=rMslHnww_0}cA*+PC7l9_r%+(w%?QXFlcotYVG z3@gE2H0(Y>RTJSgO(Zb$5`-1pgT=vFlOv@=%rT+5HUv}U0@wzYPbrz z%u*NqZjRxb02y}`0cf5;0TWy7%lEvtk2Nvf_KB*<@-x52)OL?0aa*r~_wO*BjekPt zr45oKC8mXls45O>5U>5)=58e-P2%V)gpuc_`+@3YBzbXERs0IWiVYIPzpffjuq(TjjBuxU3>w9j@q0gCGbvfKh__|{gY*BVA(hIvUY35{}nILX0;W$aJxuYNI!g3*is z?x%;LXy|0t1uAs?#V}(4+Q(8cMoS5_XKD(Q^ye=-sT>b;vkXMHU{+2x!ZyKy3zkF2 z*)9|cKj<%fa0nSPhmj8QhbfeupAKfbM`ZIeNyNdCnjNokw)R3`MnFiOZkj9JAnIO`<~3Wt_N-gzl3|d@<`%0ucJAQyC>-S07#zR z;pY*&AGGg3YQ256ei(lqzuf*9Hz9SbXl#quPlw}iPbK8ESj9=agwtsPy%jHXQb@`V oCmO5&^(Q252LD`_ to solve the +Drift-Diffusion equations. While it serves the same purpose as the legacy Fortran PDD solver, this solver has +the advantage of being written entirely in Python, thus being more transparent to most users. +While the two solvers should in principle have the same functionality, the Fortran solver was developed +specifically to deal with solar cells containing quantum wells (QWs), where the abrupt and frequent change in material parameters +can cause convergence issues. The Sesame solver has not been tested for the QW use case. The Fortran solver is less +suitable for cells containing thick (> 10 microns or so) layers, as it was designed for III-V cells. The Sesame solver +was designed for silicon-based cells and thus can handle thicker layers. + +Unlike the Fortran-based solver, this solver can handle both constant values of doping per layer, +or depth-dependent doping profiles defined by the user. + +Material constants +------------------- + +The following material parameters will be extracted from each layer in a junction and used by +Sesame: + +- ``Nc``: Conduction band effective density of states +- ``Nv``: Valence band effective density of states +- ``band_gap`` +- ``electron_affinity`` +- ``relative_permittivity`` +- ``electron_mobility`` +- ``hole_mobility`` +- ``electron_minority_lifetime`` +- ``hole_minority_lifetime`` +- ``bulk_recombination_energy``: this is an optional parameter (will be set to 0 by default). + It should be set (in joules!), in the ``material`` definition, if the user wants to use a different value +- ``radiative_recombination``: radiative recombination rate (m\ :sup:`3` s\ :sup:`-1`) +- ``electron_auger_recombination``: Auger recombination rate for electrons (m\ :sup:`6` s\ :sup:`-1`) +- ``hole_auger_recombination``: Auger recombination rate for holes (m\ :sup:`6` s\ :sup:`-1`) + +Note that this list uses the names of the parameters used by Solcore's material system, not the +names used internally by Sesame (which can be found in the Sesame documentation). While Sesame internally uses different units, values should be passed to +materials/layers in base SI units, as for the rest of Solcore (m, s, kg, etc). + +Mesh +----- + +Solcore will try to construct a reasonable mesh to solve the PDD equations, putting +more mesh points close to the front surface of the cell and in regions where the doping +is changing. However, the user can also provide a custom mesh, defined in terms of +distance *from the front surface of the junction* in m. +This is is passed as a 1-dimensional array through the ``mesh`` argument to ``Junction``). + +Doping profile +--------------- + +As for the Fortran PDD solver and the depletion approximation (DA) solver, the user can set fixed +doping levels for each layer in a junction using the ``Nd`` argument for n-type doping and the ``Na`` +argument for p-type. However, it is also possible to define depth-dependent doping profiles. These should be a function +which accepts an array of positions (in m) and returns the doping at that position in units of +m\ :sup:`-3`. Sesame will interpret positive values as n-type doping and negative values as p-type. +The doping profile can be specified for the whole junction by setting the ``doping_profile`` argument +of ``Junction``, or for individual layers by setting the ``doping_profile`` argument for ``Layer``. It is +possible to mix constant doping in some layers with depth-dependent doping in others. The position argument +of the function should always be in terms of distance from the front surface of the junction or layer it is for. + +Outputs +------- +In addition to updating the individual junctions and the solar cell as a whole with the current-voltage output +(if ``solar_cell_solver`` is called with task ``iv``) and quantum efficiency +(if ``solar_cell_solver`` is called with task ``qe``), the Sesame solver will also update each junction it solves the +IV for with an attribute called ``pdd_output``, which contains the following: + +- ``pdd_output.potential``: the potential (V) +- ``pdd_output.n``: the electron density (m\ :sup:`-3`) +- ``pdd_output.p``: the hole density (m\ :sup:`-3`) +- ``pdd_output.Ec``: the level of the conduction band (eV) +- ``pdd_output.Ev``: the level of the valence band (eV) +- ``pdd_output.Efe``: the electron quasi-Fermi level (eV) +- ``pdd_output.Efh``: the hole quasi-Fermi level (eV) +- ``pdd_output.Rrad``: the radiative recombination rate (m\ :sup:`-3` s\ :sup:`-1`) +- ``pdd_output.Raug``: the Auger recombination rate (m\ :sup:`-3` s\ :sup:`-1`) +- ``pdd_output.Rsrh``: the bulk recombination due to Shockley-Read-Hall processes (m\ :sup:`-3` s\ :sup:`-1`) + +Each of these is a 2-dimensional array, with dimensions ``(len(options.internal_voltages), len(mesh))``. + +Sub-function documentation +--------------------------- + +Note that the functions below should generally not be accessed directly, but will be called by +``solar_cell_solver`` for junctions with ``kind="sesame_PDD"``. + +.. automodule:: solcore.sesame_drift_diffusion.solve_pdd + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/Solvers/sign_conventions.rst b/docs/source/Solvers/sign_conventions.rst index 63ab6367..538e3020 100644 --- a/docs/source/Solvers/sign_conventions.rst +++ b/docs/source/Solvers/sign_conventions.rst @@ -1,9 +1,33 @@ +.. _sign-conventions: + Current-voltage sign conventions ================================ In order to maintain internal consistency, the following sign conventions are used for current and voltage: - A positive voltage means that a higher potential is applied to the front contact of the cell. - For a p-n junction (i.e. p-type material is on top of n-type material), this means that a positive - voltage results in 'solar cell operation' under illumination, with a positive Voc. - For an n-p junction, a negative voltage must be applied and Voc will be negative. + + - For a **p-n junction** (i.e. p-type material is on top of n-type material), this means that a **positive + voltage** results in 'solar cell operation' under illumination, with a positive open-circuit voltage (V\ :sub:`OC`). + - For an **n-p junction**, a **negative voltage** must be applied for PV operation and V\ :sub:`OC` will be negative. + +- For the junction object itself, the short-circuit current (J\ :sub:`SC`) is negative if the cell operates at positive voltage, and positive + if the cell operates at negative voltage (the product of current and voltage is negative, i.e. work is being done + *by* the cell). This relates to the data which is stored in ``junction.iv``. + +- For the cell as a whole (i.e. the multi-junction IV for a multi-junction cell, or the IV with shunt resistance for + a single-junction cell), the short-circuit current was taken to be positive for positive voltages. This means that + it will be negative for negative voltages. + +- The two-diode (2D) and detailed-balance (DB) models always assume that, in this sign convention, the cell has the polarity of + a p-n junction (positive voltage should be applied) + +.. image:: Figures/PDD_pn.png + :width: 40% +.. image:: Figures/PDD_np.png + :width: 40% + +Note that the sign conventions here were always the case for the (Fortran) PDD solver, but were not used consistently +by the depletion approximation solver before version 5.10, which always assumed that V\ :sub:`OC` and J\ :sub:`SC` were positive. This +does not matter for single-junction cells, since the choice is arbitrary, but caused inconsistencies when defining +n-p cells which mix different types of junction. diff --git a/docs/source/Solvers/solving_solar_cells.rst b/docs/source/Solvers/solving_solar_cells.rst index 898a50d8..6b7c5c00 100755 --- a/docs/source/Solvers/solving_solar_cells.rst +++ b/docs/source/Solvers/solving_solar_cells.rst @@ -21,18 +21,33 @@ The *task* has to be "optics", "iv", "qe", "equilibrium" or "short_circuit", the All of the above calculations modify the original solar cell object, adding attributes or methods to its structure. For example, after calculating the IV curve of my_solar_cell_object, this will have a new attribute called "iv" that is a dictionary with the IV of the total solar cell, the IV curves of each of the junctions, information of the Voc and Isc, if relevant, etc. -More details of the specific electrical solvers included in Solcore can be found in: +Kinds of junction +----------------- + +The following types of junctions are currently implemented in Solcore, specified through the :literal:`kind` argument passed to +when creating a :literal:`Junction` object: + +1. **DB**: detailed balance (the Shockley-Queisser limit) +2. **2D**: two-diode model +3. **DA**: depletion approximation +4. **PDD**: Poisson-drift-diffusion, using the legacy Fortran solver +5. **sesame_PDD**: Poisson-drift-diffusion, using the new Python-based Sesame solver + +For the current and voltage sign conventions used by Solcore, please see :doc:`here `. + +More details of these specific electrical solvers included in Solcore can be found in: .. toctree:: :maxdepth: 0 + sign_conventions detailed_balance TwoDiode depletion + SesameDDsolver DDsolver multijunction_iv - .. _solver-options: Solver Options diff --git a/examples/GaAs_cell_drift_diffusion.py b/examples/GaAs_cell_drift_diffusion.py deleted file mode 100644 index d6fe102f..00000000 --- a/examples/GaAs_cell_drift_diffusion.py +++ /dev/null @@ -1,162 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt -from solcore import material, si -from solcore.structure import Junction, Layer -from solcore.solar_cell_solver import solar_cell_solver, SolarCell -from solcore.state import State -from solcore.light_source import LightSource - -# set up structure similar to https://doi.org/10.1109/16.46385 - -# define user options -options = State() -options.wavelength = np.linspace(280, 950, 100)*1e-9 -options.voltages = np.linspace(0, 1.3, 20) -options.light_iv = True -options.mpp = True -options.optics_method = 'TMM' -options.recalculate_absorption = True -options.light_source = LightSource(source_type="standard", - version="AM1.5g", x=options.wavelength, output_units="photon_flux_per_m") - - -# define materials - -MgF2 = material("MgF2")() -ZnS = material("ZnScub")() - -ARC_layers = [Layer(si("100nm"), material=MgF2), - Layer(si("50nm"), material=ZnS)] - -AlGaAs_window = material('AlGaAs')(Al=0.8, Na=si('4e18cm-3'), - relative_permittivity=11, - electron_minority_lifetime=1e-6, - hole_minority_lifetime=1e-6 - ) -GaAs_emitter = material('GaAs')(Na=si('4e18cm-3'), - electron_minority_lifetime=1e-6, - hole_minority_lifetime=1e-6) -GaAs_base = material('GaAs')(Nd=si('2e17cm-3'), - electron_minority_lifetime=1e-6, - hole_minority_lifetime=1e-6) -GaAs_bsf = material('GaAs')(Nd=si('2e18cm-3'), - electron_minority_lifetime=1e-6, - hole_minority_lifetime=1e-6 - ) -GaAs_substrate = material('GaAs')() - -junction_layers = [ - Layer(si('30nm'), AlGaAs_window, role='window'), - Layer(si('100nm'), GaAs_emitter, role='emitter'), - Layer(si('3000nm'), GaAs_base, role='base'), - Layer(si('100nm'), GaAs_bsf, role='bsf'), - ] - -# define solar cell -mesh = np.linspace(0, 3230, 4000)*1e-9 - -solar_cell = SolarCell( - ARC_layers + [Junction(junction_layers, kind='PDD', sn=1e6, sp=1e6,)], - substrate=GaAs_substrate) - -solar_cell_sesame = SolarCell( - ARC_layers + [Junction(junction_layers, kind='sesame_PDD', sn=1e6, sp=1e6, - # mesh=mesh - )], - substrate=GaAs_substrate) - -solar_cell_optics = SolarCell( - ARC_layers + junction_layers, substrate=GaAs_substrate -) - -solar_cell_solver(solar_cell_optics, 'optics', options) - -solar_cell_solver(solar_cell, 'iv', options) -solar_cell_solver(solar_cell, 'qe', options) - -solar_cell_solver(solar_cell_sesame, 'iv', options) -solar_cell_solver(solar_cell_sesame, 'qe', options) - -absorption_per_layer = np.array([layer.layer_absorption for layer in solar_cell_optics]) - -fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)) - -ax1.plot(solar_cell.iv['IV'][0], solar_cell.iv['IV'][1]/10, label='IV') -ax1.plot(options.voltages, solar_cell[2].iv(options.voltages)/10, label='IV internal') - -ax2.stackplot(options.wavelength*1e9, 100*absorption_per_layer[::-1], alpha=0.4) -ax2.plot(options.wavelength*1e9, 100*solar_cell[2].eqe(options.wavelength), '-k') - -ax2.legend(['GaAs BSF', 'GaAs base', 'GaAs emitter', 'AlGaAs window', 'ZnS', 'MgF$_2$']) - -ax1.set_xlabel('Voltage (V)') -ax1.set_ylabel('Current density (mA/cm$^2$)') -ax1.set_ylim(-10, 35) - -ax2.set_xlabel('Wavelength (nm)') -ax2.set_ylabel('EQE (%)') - -plt.tight_layout() -plt.show() - -fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)) - -ax1.plot(solar_cell_sesame.iv['IV'][0], solar_cell_sesame.iv['IV'][1]/10, label='IV') -ax1.plot(options.voltages, solar_cell_sesame[2].iv(options.voltages)/10, label='IV internal') - -ax2.stackplot(options.wavelength*1e9, 100*absorption_per_layer[::-1], alpha=0.4) -ax2.plot(options.wavelength*1e9, 100*solar_cell_sesame[2].eqe(options.wavelength), '-k') - -ax2.legend(['GaAs BSF', 'GaAs base', 'GaAs emitter', 'AlGaAs window', 'ZnS', 'MgF$_2$']) - -ax1.set_xlabel('Voltage (V)') -ax1.set_ylabel('Current density (mA/cm$^2$)') -ax1.set_ylim(-10, 35) - -ax2.set_xlabel('Wavelength (nm)') -ax2.set_ylabel('EQE / Absorption (%)') - -plt.tight_layout() -plt.show() - -# from solcore import material, si -# from solcore.structure import Junction, Layer -# from solcore.solar_cell_solver import solar_cell_solver, SolarCell -# from solcore.analytic_solar_cells import iv_depletion -# from solcore.sesame_drift_diffusion import iv_sesame -# from solcore.state import State -# from solcore.optics import solve_tmm -# from solcore.light_source import LightSource -# import numpy as np -# -# options = State() -# options.wavelength = np.linspace(300, 950, 100) * 1e-9 -# options.voltages = np.linspace(-1.2, 1.2, 20) -# options.internal_voltages = np.linspace(-1.2, 1.2, 20) -# options.T = 300 -# options.light_iv = True -# options.light_source = LightSource(source_type='standard', version='AM1.5g', x=options.wavelength, -# output_units='photon_flux_per_m') -# options.da_mode = 'green' -# options.optics_method = 'TMM' -# -# mesh = np.linspace(0, 3100, 2000)*1e-9 -# -# GaAs_n = material('GaAs')(T=300, Na=si('4e18cm-3'), hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6, -# electron_mobility=1, hole_mobility=1) -# GaAs_p = material('GaAs')(T=300, Nd=si('2e17cm-3'), hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6, -# electron_mobility=1, hole_mobility=1) -# -# pn_junction = Junction([Layer(si('100nm'), GaAs_n, role='emitter'), Layer(si('3000nm'), GaAs_p, role='base')], -# kind='sesame_PDD', -# # mesh=mesh -# ) -# -# solar_cell_solver(SolarCell([pn_junction]), 'optics', options) -# -# plt.figure() -# iv_sesame(pn_junction, options) -# plt.plot(options.voltages, pn_junction.iv(options.voltages), label='Sesame') -# plt.ylim(-250, 250) -# plt.show() - diff --git a/examples/GaAs_cell_drift_diffusion_np.py b/examples/GaAs_cell_drift_diffusion_np.py new file mode 100644 index 00000000..584ad08a --- /dev/null +++ b/examples/GaAs_cell_drift_diffusion_np.py @@ -0,0 +1,137 @@ +import numpy as np +import matplotlib.pyplot as plt +from solcore import material, si +from solcore.structure import Junction, Layer +from solcore.solar_cell_solver import solar_cell_solver, SolarCell +from solcore.state import State +from solcore.light_source import LightSource + +# set up structure similar to https://doi.org/10.1109/16.46385 (but with doping flipped) +# Compare performance of the two PDD solvers. + +# define user options +options = State() +options.wavelength = np.linspace(280, 950, 70)*1e-9 +options.voltages = np.linspace(-1.2, -0.2, 60) +options.internal_voltages = np.linspace(-1.2, 0.00, 60) +options.light_iv = True +options.mpp = True +options.optics_method = 'TMM' +options.light_source = LightSource(source_type="standard", + version="AM1.5g", x=options.wavelength, output_units="photon_flux_per_m") +options.no_back_reflection = False +options.recalculate_absorption = True + + +# define materials + +MgF2 = material("MgF2")() +ZnS = material("ZnScub")() +Ag = material("Ag")() + +ARC_layers = [Layer(si("100nm"), material=MgF2), + Layer(si("50nm"), material=ZnS)] + +AlGaAs_window = material('AlGaAs')(Al=0.8, Nd=si('4e18cm-3'), + relative_permittivity=11, + electron_minority_lifetime=1e-9, + hole_minority_lifetime=1e-9, + ) +GaAs_emitter = material('GaAs')(Nd=si('4e18cm-3'), + electron_minority_lifetime=5e-9, + hole_minority_lifetime=5e-9) +GaAs_base = material('GaAs')(Na=si('2e17cm-3'), + electron_minority_lifetime=5e-9, + hole_minority_lifetime=5e-9) +GaAs_bsf = material('GaAs')(Na=si('2e18cm-3'), + electron_minority_lifetime=5e-9, + hole_minority_lifetime=5e-9, + ) +GaAs_substrate = material('GaAs')() + +junction_layers = [ + Layer(si('30nm'), AlGaAs_window, role='window'), + Layer(si('100nm'), GaAs_emitter, role='emitter'), + Layer(si('3000nm'), GaAs_base, role='base'), + Layer(si('100nm'), GaAs_bsf, role='bsf'), + ] + +solar_cell = SolarCell( + ARC_layers + [Junction(junction_layers, kind='PDD', sn=1e6, sp=1e6, + R_shunt=1, + ), + Layer(si('100um'), GaAs_substrate) + ], + substrate=Ag, + R_series=0.0001, +) + +solar_cell_sesame = SolarCell( + ARC_layers + [Junction(junction_layers, kind='sesame_PDD', sn=1e6, sp=1e6, + R_shunt=1, + ), + Layer(si('100um'), GaAs_substrate) + ], + substrate=Ag, + R_series=0.0001, +) + +solar_cell_optics = SolarCell( + ARC_layers + junction_layers + [Layer(si('100um'), GaAs_substrate)], substrate=Ag, +) + +solar_cell_solver(solar_cell, 'iv', options) +solar_cell_solver(solar_cell, 'qe', options) + +solar_cell_solver(solar_cell_sesame, 'iv', options) +solar_cell_solver(solar_cell_sesame, 'qe', options) + +solar_cell_solver(solar_cell_optics, 'optics', options) + +absorption_per_layer = np.array([layer.layer_absorption for layer in solar_cell_optics]) + +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)) + +ax1.plot(solar_cell.iv['IV'][0], solar_cell.iv['IV'][1]/10, '--k', label='Overall IV') +ax1.plot(options.voltages, -solar_cell[2].iv(options.voltages)/10, '-r', label='junction IV') + +ax1.legend() +ax1.set_title("Fortran PDD solver") + +ax2.stackplot(options.wavelength*1e9, 100*absorption_per_layer[::-1], alpha=0.4) +ax2.plot(options.wavelength*1e9, 100*solar_cell[2].eqe(options.wavelength), '-k') + +ax2.legend(['substrate', 'GaAs BSF', 'GaAs base', 'GaAs emitter', 'AlGaAs window', 'ZnS', 'MgF$_2$']) + +ax1.set_xlabel('Voltage (V)') +ax1.set_ylabel('Current density (mA/cm$^2$)') +ax1.set_ylim(-35, 10) + +ax2.set_xlabel('Wavelength (nm)') +ax2.set_ylabel('EQE / Absorption (%)') + +plt.tight_layout() +plt.show() + +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)) + +ax1.plot(solar_cell_sesame.iv['IV'][0], solar_cell_sesame.iv['IV'][1]/10, '--k', label='Overall IV') +ax1.plot(options.voltages, -solar_cell_sesame[2].iv(options.voltages)/10, '-r', label='junction IV') + +ax1.legend() +ax1.set_title("Sesame PDD solver") + +ax2.stackplot(options.wavelength*1e9, 100*absorption_per_layer[::-1], alpha=0.4) +ax2.plot(options.wavelength*1e9, 100*solar_cell_sesame[2].eqe(options.wavelength), '-k') + +ax2.legend(['substrate', 'GaAs BSF', 'GaAs base', 'GaAs emitter', 'AlGaAs window', 'ZnS', 'MgF$_2$']) + +ax1.set_xlabel('Voltage (V)') +ax1.set_ylabel('Current density (mA/cm$^2$)') +ax1.set_ylim(-35, 10) + +ax2.set_xlabel('Wavelength (nm)') +ax2.set_ylabel('EQE / Absorption (%)') + +plt.tight_layout() +plt.show() \ No newline at end of file diff --git a/examples/GaAs_cell_drift_diffusion_pn.py b/examples/GaAs_cell_drift_diffusion_pn.py new file mode 100644 index 00000000..718842ac --- /dev/null +++ b/examples/GaAs_cell_drift_diffusion_pn.py @@ -0,0 +1,135 @@ +import numpy as np +import matplotlib.pyplot as plt +from solcore import material, si +from solcore.structure import Junction, Layer +from solcore.solar_cell_solver import solar_cell_solver, SolarCell +from solcore.state import State +from solcore.light_source import LightSource + +# set up structure similar to https://doi.org/10.1109/16.46385 + +# define user options +options = State() +options.wavelength = np.linspace(280, 950, 70)*1e-9 +options.voltages = np.linspace(0, 1.1, 30) +options.internal_voltages = options.voltages +options.light_iv = True +options.mpp = True +options.optics_method = 'TMM' +options.light_source = LightSource(source_type="standard", + version="AM1.5g", x=options.wavelength, output_units="photon_flux_per_m") +options.no_back_reflection = False +options.recalculate_absorption = True + +# define materials + +MgF2 = material("MgF2")() +ZnS = material("ZnScub")() +Ag = material("Ag")() + +ARC_layers = [Layer(si("100nm"), material=MgF2), + Layer(si("50nm"), material=ZnS)] + +AlGaAs_window = material('AlGaAs')(Al=0.8, Na=si('4e18cm-3'), + relative_permittivity=11, + electron_minority_lifetime=1e-9, + hole_minority_lifetime=1e-9, + ) +GaAs_emitter = material('GaAs')(Na=si('4e18cm-3'), + electron_minority_lifetime=5e-9, + hole_minority_lifetime=5e-9) +GaAs_base = material('GaAs')(Nd=si('2e17cm-3'), + electron_minority_lifetime=5e-9, + hole_minority_lifetime=5e-9) +GaAs_bsf = material('GaAs')(Nd=si('2e18cm-3'), + electron_minority_lifetime=5e-9, + hole_minority_lifetime=5e-9, + ) +GaAs_substrate = material('GaAs')() + +junction_layers = [ + Layer(si('30nm'), AlGaAs_window, role='window'), + Layer(si('100nm'), GaAs_emitter, role='emitter'), + Layer(si('3000nm'), GaAs_base, role='base'), + Layer(si('100nm'), GaAs_bsf, role='bsf'), + ] + +solar_cell = SolarCell( + ARC_layers + [Junction(junction_layers, kind='PDD', sn=1e6, sp=1e6, + R_shunt=1, + ), + Layer(si('100um'), GaAs_substrate) + ], + substrate=Ag, + R_series=0.0001, +) + +solar_cell_sesame = SolarCell( + ARC_layers + [Junction(junction_layers, kind='sesame_PDD', sn=1e6, sp=1e6, + R_shunt=1, + ), + Layer(si('100um'), GaAs_substrate) + ], + substrate=Ag, + R_series=0.0001, +) + +solar_cell_optics = SolarCell( + ARC_layers + junction_layers + [Layer(si('100um'), GaAs_substrate)], substrate=Ag, +) + +solar_cell_solver(solar_cell, 'iv', options) +solar_cell_solver(solar_cell, 'qe', options) + +solar_cell_solver(solar_cell_sesame, 'iv', options) +solar_cell_solver(solar_cell_sesame, 'qe', options) + +solar_cell_solver(solar_cell_optics, 'optics', options) + +absorption_per_layer = np.array([layer.layer_absorption for layer in solar_cell_optics]) + +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)) + +ax1.plot(solar_cell.iv['IV'][0], solar_cell.iv['IV'][1]/10, '--k', label='Overall IV') +ax1.plot(options.voltages, -solar_cell[2].iv(options.voltages)/10, '-r', label='junction IV') + +ax1.legend() +ax1.set_title("Fortran PDD solver") + +ax2.stackplot(options.wavelength*1e9, 100*absorption_per_layer[::-1], alpha=0.4) +ax2.plot(options.wavelength*1e9, 100*solar_cell[2].eqe(options.wavelength), '-k') + +ax2.legend(['substrate', 'GaAs BSF', 'GaAs base', 'GaAs emitter', 'AlGaAs window', 'ZnS', 'MgF$_2$']) + +ax1.set_xlabel('Voltage (V)') +ax1.set_ylabel('Current density (mA/cm$^2$)') +ax1.set_ylim(-10, 35) + +ax2.set_xlabel('Wavelength (nm)') +ax2.set_ylabel('EQE / Absorption (%)') + +plt.tight_layout() +plt.show() + +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)) + +ax1.plot(solar_cell_sesame.iv['IV'][0], solar_cell_sesame.iv['IV'][1]/10, '--k', label='Overall IV') +ax1.plot(options.voltages, -solar_cell_sesame[2].iv(options.voltages)/10, '-r', label='junction IV') + +ax1.legend() +ax1.set_title("Sesame PDD solver") + +ax2.stackplot(options.wavelength*1e9, 100*absorption_per_layer[::-1], alpha=0.4) +ax2.plot(options.wavelength*1e9, 100*solar_cell_sesame[2].eqe(options.wavelength), '-k') + +ax2.legend(['substrate', 'GaAs BSF', 'GaAs base', 'GaAs emitter', 'AlGaAs window', 'ZnS', 'MgF$_2$']) + +ax1.set_xlabel('Voltage (V)') +ax1.set_ylabel('Current density (mA/cm$^2$)') +ax1.set_ylim(-10, 35) + +ax2.set_xlabel('Wavelength (nm)') +ax2.set_ylabel('EQE / Absorption (%)') + +plt.tight_layout() +plt.show() \ No newline at end of file diff --git a/examples/MJ_solar_cell_PDD_solver.py b/examples/MJ_solar_cell_PDD_solver.py index be5f2875..d1b0dab4 100755 --- a/examples/MJ_solar_cell_PDD_solver.py +++ b/examples/MJ_solar_cell_PDD_solver.py @@ -16,41 +16,45 @@ # TOP CELL - InGaP # Now we build the top cell, which requires the n and p sides of GaInP and a window -# layer. We also add some extra parameters needed for the calculation using the -# depletion approximation: the minority carriers diffusion lengths and the doping. +# layer. We can also add extra parameters (in this case, the carrier lifetimes and +# the doping levels). AlInP = material("AlInP") InGaP = material("GaInP") -window_material = AlInP(Al=0.52, Nd=siUnits(2e18, "cm-3"), relative_permittivity=9, - electron_minority_lifetime=1e-9, hole_minority_lifetime=1e-9) +window_material = AlInP(Al=0.52, Nd=siUnits(3e18, "cm-3"), relative_permittivity=9, + electron_minority_lifetime=1e-10, hole_minority_lifetime=1e-10) top_cell_n_material = InGaP(In=0.49, Nd=siUnits(2e18, "cm-3"), electron_minority_lifetime=5e-9, hole_minority_lifetime=5e-9) top_cell_p_material = InGaP(In=0.49, Na=siUnits(1e17, "cm-3"), electron_minority_lifetime=5e-9, hole_minority_lifetime=5e-9) -# For convenience we will set the carrier transport properties to default values for -# all the materials in one place. To do that we add the materials to a list called -# all_materials: - # MID CELL - GaAs GaAs = material("GaAs") -mid_cell_n_material = GaAs(In=0.01, Nd=siUnits(3e18, "cm-3")) -mid_cell_p_material = GaAs(In=0.01, Na=siUnits(1e17, "cm-3")) +mid_cell_n_material = GaAs(In=0.01, Nd=siUnits(3e18, "cm-3"), + electron_minority_lifetime=5e-9, hole_minority_lifetime=5e-9) +mid_cell_p_material = GaAs(In=0.01, Na=siUnits(1e17, "cm-3"), + electron_minority_lifetime=5e-9, hole_minority_lifetime=5e-9) # BOTTOM CELL - Ge Ge = material("Ge") -bot_cell_n_material = Ge(Nd=siUnits(2e18, "cm-3")) -bot_cell_p_material = Ge(Na=siUnits(1e17, "cm-3")) - +bot_cell_n_material = Ge(Nd=siUnits(2e18, "cm-3"), + electron_minority_lifetime=5e-5, hole_minority_lifetime=5e-5) +bot_cell_p_material = Ge(Na=siUnits(1e17, "cm-3"), + electron_minority_lifetime=5e-4, hole_minority_lifetime=5e-4) # Now that the layers are configured, we can now assemble the triple junction solar # cell. Note that we also specify a metal shading of 2% and a cell area of $1cm^{2}$. # SolCore calculates the EQE for all three junctions and light-IV showing the relative -# contribution of each sub-cell. We set "kind = 'DA'" to use the depletion -# approximation. +# contribution of each sub-cell. We set "kind = 'PDD'" to use the drift-diffusion +# solver. Note that this will invoke the Fortran PDD solver. To use the Sesame PDD +# solver, we can change the kind to 'sesame_PDD'. We can also mix and match different +# kinds of junction in a single calculation. +# We can also set the surface recombination velocities, where sn +# refers to the surface recombination velocity at the n-type surface, and sp refers +# to the SRV on the p-type side (input units m/s). solar_cell = SolarCell( ARC_layers + @@ -58,7 +62,7 @@ Junction([ Layer(si("25nm"), material=window_material, role='window'), Layer(si("100nm"), material=top_cell_n_material, role='emitter'), - Layer(si("400nm"), material=top_cell_p_material, role='base'), + Layer(si("300nm"), material=top_cell_p_material, role='base'), ], sn=1e4, sp=1e4, kind='PDD'), Junction([Layer(si("200nm"), material=mid_cell_n_material, role='emitter'), Layer(si("3000nm"), material=mid_cell_p_material, role='base'), @@ -70,43 +74,51 @@ shading=0.02, cell_area=1 * 1 / 1e4) # Choose wavelength range (in m): -wl = np.linspace(280, 1850, 200) * 1e-9 +wl = np.linspace(280, 1850, 100) * 1e-9 # Calculate the EQE for the solar cell: -# solar_cell_solver(solar_cell, 'qe', user_options={'wavelength': wl, -# # 'da_mode': 'bvp', -# 'optics_method': 'TMM' -# }) -# # we pass options to use the TMM optical method to calculate realistic R, A and T -# # values with interference in the ARC (and semiconductor) layers. We can also choose -# # which solver mode to use for the depletion approximation. The default is 'green', -# # which uses the (faster) Green's function method. The other method is 'bvp'. -# -# plt.figure(1) -# plt.plot(wl * 1e9, solar_cell[0 + len(ARC_layers)].eqe(wl) * 100, 'b', label='GaInP QE') -# plt.plot(wl * 1e9, solar_cell[1 + len(ARC_layers)].eqe(wl) * 100, 'g', label='GaAs QE') -# plt.plot(wl * 1e9, solar_cell[2 + len(ARC_layers)].eqe(wl) * 100, 'r', label='Ge QE') -# plt.plot(wl * 1e9, solar_cell[0 + len(ARC_layers)].layer_absorption * 100, '--b', -# label='GaInP Abs.') -# plt.plot(wl * 1e9, solar_cell[1 + len(ARC_layers)].layer_absorption * 100, '--g', -# label='GaAs Abs.') -# plt.plot(wl * 1e9, solar_cell[2 + len(ARC_layers)].layer_absorption * 100, '--r', -# label='Ge Abs.') -# -# plt.plot(wl*1e9, solar_cell.reflected*100, '--k', label="Reflected") -# plt.legend() -# plt.ylim(0, 100) -# plt.ylabel('EQE (%)') -# plt.xlabel('Wavelength (nm)') -# plt.show() +solar_cell_solver(solar_cell, 'qe', user_options={'wavelength': wl, + 'optics_method': 'TMM' + }) + +# we pass options to use the TMM optical method to calculate realistic R, A and T +# values with interference in the ARC (and semiconductor) layers. +# Plot the EQE and absorption of the individual junctions. Note that we can access +# the properties of the first junction (ignoring any other layers, such as the ARC, +# which are not part of a junction) using solar_cell(0), and the second junction using +# solar_cell(1), etc. + +plt.figure(1) +plt.plot(wl * 1e9, solar_cell(0).eqe(wl) * 100, 'b', label='GaInP QE') +plt.plot(wl * 1e9, solar_cell(1).eqe(wl) * 100, 'g', label='GaAs QE') +plt.plot(wl * 1e9, solar_cell(2).eqe(wl) * 100, 'r', label='Ge QE') +plt.fill_between(wl * 1e9, solar_cell(0).layer_absorption * 100, 0, alpha=0.3, + label='GaInP Abs.', color='b') +plt.fill_between(wl * 1e9, solar_cell(1).layer_absorption * 100, 0, alpha=0.3, + label='GaAs Abs.', color='g') +plt.fill_between(wl * 1e9, solar_cell(2).layer_absorption * 100, 0, alpha=0.3, + label='Ge Abs.', color='r') + +plt.plot(wl*1e9, 100*(1-solar_cell.reflected), '--k', label="100 - Reflectectivity") +plt.legend() +plt.ylim(0, 100) +plt.ylabel('EQE (%)') +plt.xlabel('Wavelength (nm)') +plt.show() # Set up the AM0 (space) solar spectrum am0 = LightSource(source_type='standard',version='AM0',x=wl, output_units='photon_flux_per_m') +# Set up the voltage range for the overall cell (at which the total I-V will be +# calculated) as well as the internal voltages which are used to calculate the results +# for the individual junctions. The range of the internal_voltages should generally +# be wider than that for the voltages. + # this is an n-p cell, so we need to scan negative voltages -V = np.linspace(-3, 0, 50) -internal_voltages = np.linspace(-4, 1.7, 100) + +V = np.linspace(-2.8, 0, 50) +internal_voltages = np.linspace(-3, 1.7, 120) # Calculate the current-voltage relationship under illumination: @@ -118,22 +130,23 @@ 'optics_method': 'TMM', 'mpp': True, }) + # We pass the same options as for solving the EQE, but also set 'light_iv' and 'mpp' to # True to indicate we want the IV curve under illumination and to find the maximum # power point (MPP). We also pass the AM0 light source and voltages created above. plt.figure(2) -plt.plot(abs(V), -solar_cell.iv['IV'][1]/10, 'k', linewidth=3, label='3J cell') -plt.plot(abs(V), solar_cell[0 + len(ARC_layers)].iv(V)/10, 'b', label='InGaP sub-cell') -plt.plot(abs(V), solar_cell[1 + len(ARC_layers)].iv(V)/10, 'g', label='GaAs sub-cell') -plt.plot(abs(V), solar_cell[2 + len(ARC_layers)].iv(V)/10, 'r', label='Ge sub-cell') +plt.plot(-solar_cell.iv['IV'][0], -solar_cell.iv['IV'][1]/10, 'k', linewidth=3, label='3J cell') +plt.plot(-internal_voltages, solar_cell(0).iv(internal_voltages)/10, 'b', label='InGaP sub-cell') +plt.plot(-internal_voltages, solar_cell(1).iv(internal_voltages)/10, 'g', label='GaAs sub-cell') +plt.plot(-internal_voltages, solar_cell(2).iv(internal_voltages)/10, 'r', label='Ge sub-cell') plt.text(0.5,30,f'Jsc= {abs(solar_cell.iv.Isc/10):.2f} mA.cm' + r'$^{-2}$') plt.text(0.5,28,f'Voc= {abs(solar_cell.iv.Voc):.2f} V') plt.text(0.5,26,f'FF= {solar_cell.iv.FF*100:.2f} %') plt.text(0.5,24,f'Eta= {solar_cell.iv.Eta*100:.2f} %') plt.legend() -plt.ylim(0, 35) +plt.ylim(-10, 35) plt.xlim(0, 3) plt.ylabel('Current (mA/cm$^2$)') plt.xlabel('Voltage (V)') diff --git a/examples/MJ_solar_cell_using_DA.py b/examples/MJ_solar_cell_using_DA.py index be983fbd..85c0d060 100755 --- a/examples/MJ_solar_cell_using_DA.py +++ b/examples/MJ_solar_cell_using_DA.py @@ -27,16 +27,6 @@ hole_diffusion_length=si("200nm")) top_cell_p_material = InGaP(In=0.49, Na=siUnits(1e17, "cm-3"), electron_diffusion_length=si("2um")) - -# For convenience we will set the carrier transport properties to default values for -# all the materials in one place. To do that we add the materials to a list called -# all_materials: - -all_materials = [] -all_materials.append(window_material) -all_materials.append(top_cell_n_material) -all_materials.append(top_cell_p_material) - # MID CELL - GaAs GaAs = material("GaAs") @@ -45,9 +35,6 @@ mid_cell_p_material = GaAs(In=0.01, Na=siUnits(1e17, "cm-3"), electron_diffusion_length=si("5um")) -all_materials.append(mid_cell_n_material) -all_materials.append(mid_cell_p_material) - # BOTTOM CELL - Ge Ge = material("Ge") @@ -56,24 +43,13 @@ bot_cell_p_material = Ge(Na=siUnits(1e17, "cm-3"), electron_diffusion_length=si("50um")) -all_materials.append(bot_cell_n_material) -all_materials.append(bot_cell_p_material) - -# We now set the electronic properties of these materials to some default values. -# Although in practice there will be differences, for this example we set them to -# reasonable generic values for simplicity. - -for mat in all_materials: - mat.hole_mobility = 5e-2 - mat.electron_mobility = 3.4e-3 - mat.hole_mobility = 3.4e-3 - mat.electron_mobility = 5e-2 - # Now that the layers are configured, we can now assemble the triple junction solar # cell. Note that we also specify a metal shading of 2% and a cell area of $1cm^{2}$. # SolCore calculates the EQE for all three junctions and light-IV showing the relative # contribution of each sub-cell. We set "kind = 'DA'" to use the depletion -# approximation. +# approximation. We can also set the surface recombination velocities, where sn +# refers to the surface recombination velocity at the n-type surface, and sp refers +# to the SRV on the p-type side. solar_cell = SolarCell( ARC_layers + @@ -81,13 +57,13 @@ Junction([Layer(si("25nm"), material=window_material, role='window'), Layer(si("100nm"), material=top_cell_n_material, role='emitter'), Layer(si("400nm"), material=top_cell_p_material, role='base'), - ], sn=1, sp=1, kind='DA'), + ], sn=si("1e5cm s-1"), sp=si("1e5cm s-1"), kind='DA'), Junction([Layer(si("200nm"), material=mid_cell_n_material, role='emitter'), Layer(si("3000nm"), material=mid_cell_p_material, role='base'), - ], sn=1, sp=1, kind='DA'), + ], sn=si("1e5cm s-1"), sp=si("1e5cm s-1"), kind='DA'), Junction([Layer(si("400nm"), material=bot_cell_n_material, role='emitter'), Layer(si("100um"), material=bot_cell_p_material, role='base'), - ], sn=1, sp=1, kind='DA') + ], sn=si("1e5cm s-1"), sp=si("1e5cm s-1"), kind='DA') ], shading=0.02, cell_area=1 * 1 / 1e4) @@ -96,7 +72,7 @@ # Calculate the EQE for the solar cell: solar_cell_solver(solar_cell, 'qe', user_options={'wavelength': wl, - # 'da_mode': 'bvp', + 'da_mode': 'green', 'optics_method': 'TMM' }) # we pass options to use the TMM optical method to calculate realistic R, A and T @@ -104,28 +80,41 @@ # which solver mode to use for the depletion approximation. The default is 'green', # which uses the (faster) Green's function method. The other method is 'bvp'. +# Plot the EQE and absorption of the individual junctions. Note that we can access +# the properties of the first junction (ignoring any other layers, such as the ARC, +# which are not part of a junction) using solar_cell(0), and the second junction using +# solar_cell(1), etc. + plt.figure(1) -plt.plot(wl * 1e9, solar_cell[0 + len(ARC_layers)].eqe(wl) * 100, 'b', label='GaInP QE') -plt.plot(wl * 1e9, solar_cell[1 + len(ARC_layers)].eqe(wl) * 100, 'g', label='GaAs QE') -plt.plot(wl * 1e9, solar_cell[2 + len(ARC_layers)].eqe(wl) * 100, 'r', label='Ge QE') -plt.plot(wl * 1e9, solar_cell[0 + len(ARC_layers)].layer_absorption * 100, '--b', - label='GaInP Abs.') -plt.plot(wl * 1e9, solar_cell[1 + len(ARC_layers)].layer_absorption * 100, '--g', - label='GaAs Abs.') -plt.plot(wl * 1e9, solar_cell[2 + len(ARC_layers)].layer_absorption * 100, '--r', - label='Ge Abs.') - -plt.plot(wl*1e9, solar_cell.reflected*100, '--k', label="Reflected") +plt.plot(wl * 1e9, solar_cell(0).eqe(wl) * 100, 'b', label='GaInP QE') +plt.plot(wl * 1e9, solar_cell(1).eqe(wl) * 100, 'g', label='GaAs QE') +plt.plot(wl * 1e9, solar_cell(2).eqe(wl) * 100, 'r', label='Ge QE') +plt.fill_between(wl * 1e9, solar_cell(0).layer_absorption * 100, 0, alpha=0.3, + label='GaInP Abs.', color='b') +plt.fill_between(wl * 1e9, solar_cell(1).layer_absorption * 100, 0, alpha=0.3, + label='GaAs Abs.', color='g') +plt.fill_between(wl * 1e9, solar_cell(2).layer_absorption * 100, 0, alpha=0.3, + label='Ge Abs.', color='r') + +plt.plot(wl*1e9, 100*(1-solar_cell.reflected), '--k', label="100 - Reflectivity") plt.legend() plt.ylim(0, 100) plt.ylabel('EQE (%)') plt.xlabel('Wavelength (nm)') plt.show() -# Set up the AM0 (space) solar spectrum +# Set up the AM0 (space) solar spectrum for the light I-V calculation: am0 = LightSource(source_type='standard',version='AM0',x=wl, output_units='photon_flux_per_m') + +# Set up the voltage range for the overall cell (at which the total I-V will be +# calculated) as well as the internal voltages which are used to calculate the results +# for the individual junctions. The range of the internal_voltages should generally +# be wider than that for the voltages. + +# this is an n-p cell, so we need to scan negative voltages + V = np.linspace(-3, 0, 300) internal_voltages = np.linspace(-4, 2, 400) @@ -138,19 +127,19 @@ 'wavelength': wl, 'optics_method': 'TMM', 'mpp': True, - # 'da_mode': 'bvp' }) + # We pass the same options as for solving the EQE, but also set 'light_iv' and 'mpp' to # True to indicate we want the IV curve under illumination and to find the maximum # power point (MPP). We also pass the AM0 light source and voltages created above. plt.figure(2) plt.plot(abs(V), -solar_cell.iv['IV'][1]/10, 'k', linewidth=3, label='3J cell') -plt.plot(abs(V), solar_cell[0 + len(ARC_layers)].iv(V)/10, 'b', label='InGaP sub-cell') -plt.plot(abs(V), solar_cell[1 + len(ARC_layers)].iv(V)/10, 'g', label='GaAs sub-cell') -plt.plot(abs(V), solar_cell[2 + len(ARC_layers)].iv(V)/10, 'r', label='Ge sub-cell') -plt.text(0.5,30,f'Jsc= {solar_cell.iv.Isc/10:.2f} mA.cm' + r'$^{-2}$') -plt.text(0.5,28,f'Voc= {solar_cell.iv.Voc:.2f} V') +plt.plot(abs(V), solar_cell(0).iv(V)/10, 'b', label='InGaP sub-cell') +plt.plot(abs(V), solar_cell(1).iv(V)/10, 'g', label='GaAs sub-cell') +plt.plot(abs(V), solar_cell(2).iv(V)/10, 'r', label='Ge sub-cell') +plt.text(0.5,30,f'Jsc= {abs(solar_cell.iv.Isc/10):.2f} mA.cm' + r'$^{-2}$') +plt.text(0.5,28,f'Voc= {abs(solar_cell.iv.Voc):.2f} V') plt.text(0.5,26,f'FF= {solar_cell.iv.FF*100:.2f} %') plt.text(0.5,24,f'Eta= {solar_cell.iv.Eta*100:.2f} %') diff --git a/examples/Si_cell.py b/examples/Si_cell.py index c4fe2d28..b43663f6 100644 --- a/examples/Si_cell.py +++ b/examples/Si_cell.py @@ -2,23 +2,21 @@ from solcore.state import State from solcore.solar_cell_solver import solar_cell_solver import numpy as np -import os from solcore.light_source import LightSource -from solcore.absorption_calculator import search_db from scipy.special import erfc + import matplotlib.pyplot as plt from solcore import material, si -d_bulk = 130e-6 +d_bulk = 100e-6 Air = material("Air")() -MgF2_pageid = str(search_db(os.path.join("MgF2", "Rodriguez-de Marcos"))[0][0]) -MgF2 = material(MgF2_pageid, nk_db=True)() -Ag = material("Ag_Jiang")() +MgF2 = material("MgF2")() +Ag = material("Ag")() Si_pn = material("Si")(electron_mobility=si("1e4cm2"), hole_mobility=si("1e3cm2"), - electron_minority_lifetime=0.01, hole_minority_lifetime=0.01) + electron_minority_lifetime=0.001, hole_minority_lifetime=0.001) wavelengths = np.linspace(280, 1200, 100)*1e-9 @@ -36,13 +34,13 @@ options.T = 298 options.light_source = LightSource(source_type="standard", - version="AM1.5g", x=options.wavelength, output_units="photon_flux_per_m") + version="AM1.5g", x=options.wavelength) -options.voltages = np.linspace(0, 0.8, 30) +options.voltages = np.linspace(0, 0.8, 40) options.internal_voltages = options.voltages options.mpp = True -options.recalculate_absorption = True options.no_back_reflection = False +options.position = 10e-9 nD = si("1e20cm-3") nA = si("1e19cm-3") @@ -59,12 +57,10 @@ def doping_profile_func(x): return doping_profile + doping_profile_rear + bulk_doping -L_cm = d_bulk*100 # length of the system in the x-direction [cm] - -surface_recomb = dict(sn_front=si('5e3 cm s-1'), # important - sp_front=si('1e4 cm s-1'), - sn_rear=si('1e4 cm s-1'), - sp_rear=si('1e4 cm s-1')) # important +surface_recomb = dict(sp_e=si('100 cm s-1'), # important (minority carrier at front) + sp_h=si('100 cm s-1'), + sn_e=si('100 cm s-1'), + sn_h=si('100 cm s-1')) # important (minority carrier at rear) Si_junction = [Junction([Layer(d_bulk, Si_pn)], doping_profile=doping_profile_func, kind='sesame_PDD', @@ -72,7 +68,6 @@ def doping_profile_func(x): ) ] - Si_cell = SolarCell(front_materials + Si_junction + back_materials, @@ -90,7 +85,7 @@ def doping_profile_func(x): ax.stackplot(wavelengths * 1e9, 100 * result_stack[::-1], linewidth=0.5, alpha=0.5, labels=['MgF2 (rear)', 'TCO (rear)', 'Si bulk', 'TCO (front)', 'MgF2 (front)', 'Reflection']) -ax.plot(wavelengths * 1e9, 100 * Si_cell(0).eqe(wavelengths), '-r', linewidth=2, +ax.plot(wavelengths * 1e9, 100 * Si_cell(0).eqe(wavelengths), '-k', linewidth=2, label='EQE') ax.set_xlim(280, 1200) @@ -135,7 +130,7 @@ def doping_profile_func(x): ax2.text(0.1, 0.9 * jsc, r'= {:.2f} mA/cm$^2$'.format(jsc)) ax2.text(0.1, 0.8 * jsc, r'= {:.3f} V'.format(Si_cell.iv.Voc)) ax2.text(0.1, 0.7 * jsc, '= {:.2f} %'.format(Si_cell.iv.FF * 100)) -ax2.text(0.1, 0.6 * jsc, r'= {:.2f} %'.format(Si_cell.iv.Pmpp / 10)) +ax2.text(0.1, 0.6 * jsc, r'= {:.2f} %'.format(Si_cell.iv.Eta * 100)) ax2.text(0.1, 0.5 * jsc, r'= {:.2f} mA/cm$^2$'.format( Si_cell.iv.Impp / 10)) ax2.text(0.1, 0.4 * jsc, r'= {:.3f} V'.format(Si_cell.iv.Vmpp)) ax2.grid(which='major', alpha=0.35) @@ -144,3 +139,59 @@ def doping_profile_func(x): plt.tight_layout() plt.show() + +# Scan through lifetimes + +lifetime_exp = np.arange(-4, 0, 1) + +lifetimes = 10.0**lifetime_exp + +cell_results = np.zeros(([len(lifetimes), 4])) # save efficiency, FF, Voc, Jsc + +for i1, lt in enumerate(lifetimes): + + options.recalculate_absorption = True + + Si_pn = material("Si")(electron_mobility=si("1e4cm2"), hole_mobility=si("1e3cm2"), + electron_minority_lifetime=lt, hole_minority_lifetime=lt) + + Si_junction = [Junction([Layer(d_bulk, Si_pn)], + doping_profile=doping_profile_func, kind='sesame_PDD', + **surface_recomb)] + + Si_cell = SolarCell(front_materials + + Si_junction + + back_materials, + shading=0.02, + substrate=Ag, + ) + + solar_cell_solver(Si_cell, 'iv', options) + + cell_results[i1] = np.array([100*Si_cell.iv.Eta, 100*Si_cell.iv.FF, Si_cell.iv.Voc, Si_cell.iv.Isc/10]) + + print(lt, Si_cell.iv.Eta, Si_cell.iv.FF) + + +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 3.5)) + +ax1.plot(cell_results[:, 2], cell_results[:, 1], 'ko') + +for i, lt in enumerate(lifetimes): + ax1.annotate(str(lt), (cell_results[i, 2] - 0.001, cell_results[i, 1]), ha='right') + +ax1.set_xlabel(r'V$_{oc}$ (V)') +ax1.set_ylabel('FF (%)') +ax1.set_xlim(0.98*np.min(cell_results[:, 2]), 1.01*np.max(cell_results[:, 2])) + +ax2.semilogx(lifetimes, cell_results[:, 0], 'o', color='k') +ax2.set_ylabel('Efficiency (%)') +ax3 = ax2.twinx() +ax3.plot(lifetimes, cell_results[:, 3], 'o', color='r', markerfacecolor='none') +ax3.set_ylim(32, 35) +ax3.set_ylabel(r'$J_{sc}$ (mA/cm$^2$)', color='r') + +ax2.set_xlabel(r'$\tau$ (s)') + +plt.tight_layout() +plt.show() \ No newline at end of file diff --git a/examples/sesame_PDD_example.py b/examples/sesame_PDD_example.py deleted file mode 100644 index d80b3dce..00000000 --- a/examples/sesame_PDD_example.py +++ /dev/null @@ -1,305 +0,0 @@ -from solcore import material, si -from solcore.solar_cell import SolarCell, Junction, Layer -from solcore.state import State -from solcore.solar_cell_solver import solar_cell_solver -from solcore.light_source import LightSource -import numpy as np -import matplotlib.pyplot as plt - -options = State() -# options.wavelength = np.linspace(280, 700, 20)*1e-9 -# options.optics_method = 'TMM' -# options.light_iv = True -# options.light_source = LightSource(source_type="standard", -# version="AM1.5g", x=options.wavelength, output_units="photon_flux_per_m") -# options.voltages = np.linspace(0, 2, 40) -# # options.minimum_spacing = 1e-09 -# # options.maximum_spacing = 1e-8 -# -# T = 293 -# -# add_args = {'relative_permittivity': 10, 'electron_minority_lifetime': 5e-6, -# 'hole_minority_lifetime': 5e-6, -# 'electron_auger_recombination': 1e-45, -# 'hole_auger_recombination': 1e-45} -# -# ARC = material('Si3N4')() -# window = material('AlGaAs')(T=T, Na=5e24, Al=0.8, **add_args) -# p_AlGaAs = material('AlGaAs')(T=T, Na=1e24, Al=0.4, **add_args) -# n_AlGaAs = material('AlGaAs')(T=T, Nd=8e22, Al=0.4, **add_args) -# bsf = material('AlGaAs')(T=T, Nd=2e24, Al=0.6, **add_args) -# -# junction = Junction([Layer(width=si('30nm'), material=window, role="Window"), -# Layer(width=si('1000nm'), material=p_AlGaAs, role="Emitter"), -# Layer(width=si('150nm'), material=n_AlGaAs, role="Base"), -# Layer(width=si('200nm'), material=bsf, role="BSF")], sn=1e6, sp=1e6, T=T, kind='sesame_PDD') -# -# widths = [layer.width for layer in junction] -# -# # x = np.concatenate((np.linspace(0,3e-7, 400, endpoint=False), -# # np.linspace(3e-7, np.sum(widths) - 100e-9, 100, endpoint=False), -# # np.linspace(np.sum(widths) - 100e-9, np.sum(widths), 200))) -# # junction.mesh = x -# -# solar_cell = SolarCell( -# [Layer(60e-0, ARC), junction] -# ) -# -# solar_cell_solver(solar_cell, 'iv', options) -# solar_cell_solver(solar_cell, 'qe', options) -# -# # # qe_sesame(solar_cell[1], options) -# # -# # iv_sesame(solar_cell[1], options) -# -# junction_old = Junction([Layer(width=si('30nm'), material=window, role="Window"), -# Layer(width=si('150nm'), material=p_AlGaAs, role="Emitter"), -# Layer(width=si('1000nm'), material=n_AlGaAs, role="Base"), -# Layer(width=si('200nm'), material=bsf, role="BSF")], sn=1e6, sp=1e6, T=T, -# kind='PDD') -# -# -# solar_cell_old = SolarCell( -# [Layer(60e-0, ARC), junction_old] -# ) -# -# # solar_cell_solver(solar_cell_old, 'iv', options) -# # -# plt.figure() -# plt.plot(options.voltages, solar_cell[1].iv(options.voltages), 'o-', label='IV') -# # plt.plot(options.voltages, solar_cell_old[1].iv(options.voltages), 'o-', label='IV') -# # plt.xlim(-2, 1.8) -# plt.ylim(-200, 200) -# plt.show() -# -# plt.figure() -# plt.plot(options.wavelength*1e9, solar_cell.absorbed) -# # plt.plot(options.wavelength*1e9, solar_cell_old.absorbed) -# plt.show() -# -# plt.figure() -# plt.plot(options.wavelength*1e9, solar_cell[1].eqe(options.wavelength)) -# plt.plot(options.wavelength*1e9, solar_cell[1].iqe(options.wavelength)) -# plt.show() -# -# solar_cell[1].absorbed(solar_cell[1].mesh) -# -# plt.figure() -# plt.plot(junction.mesh, 'x') -# plt.show() -# -# - -##### - -import os -from solcore.constants import q -from solcore.light_source import LightSource -from solcore.interpolate import interp1d -from solcore.absorption_calculator import search_db -from scipy.special import erfc -import matplotlib.pyplot as plt -from rayflare.textures import regular_pyramids - -from rayflare.transfer_matrix_method import tmm_structure - -from rayflare.textures import regular_pyramids, rough_pyramids -from solcore import material, si -from rayflare.options import default_options -from solcore.structure import Layer -from rayflare.ray_tracing import rt_structure -from rayflare.utilities import make_absorption_function -from os.path import exists - -# Note Sesame assumes all quantities of length are input in units of cm. Other assumed -# input units are: time in s, energy in eV. - -# LONGi paper: -# To further increase JSC, a 150-nm-thick MgF2 film was evaporated on the front TCO layer -# as a second antireflective coating. For 26.81% cell, an additional 120-nm-thick MgF2/150-nm-thick -# Ag stack was evaporated on the rear TCO layer, which means this cell is a monofacial solar cell. - -options = State() -options.wavelength = np.linspace(280, 1200, 20)*1e-9 -options.optics_method = 'TMM' -options.light_iv = True -options.light_source = LightSource(source_type="standard", - version="AM1.5g", x=options.wavelength, output_units="photon_flux_per_m") -options.voltages = np.linspace(0, 0.8, 20) -options.mpp = True - -# ray-tracing for optics first -d_bulk = 130e-6 - -# ITO_front = material("ITO_front_transparent")() -ITO_front = material("ITO_front_transparent")() -ITO_back = material("ITO_back")() -Ag = material("Ag_Jiang")() -aSi_i = material("aSi_i")() -aSi_p = material("aSi_p")() -aSi_n = material("aSi_n")() -Air = material("Air")() -MgF2_pageid = str(search_db(os.path.join("MgF2", "Rodriguez-de Marcos"))[0][0]) -MgF2 = material(MgF2_pageid, nk_db=True)() -Ag = material("Ag_Jiang")() - -Si_pn = material("Si")(Nc=3e25, Nv=1e25, electron_mobility=si("1e4cm2"), hole_mobility=si("1e3cm2"), - electron_minority_lifetime=0.05, hole_minority_lifetime=0.05, - radiative_recombination=si("1.89e-15cm3"), - electron_auger_recombination=si("3e-31cm6"), hole_auger_recombination=si("1e-31cm6")) - -front_materials = [Layer(110e-9, MgF2), Layer(40 * 1e-9, ITO_front), - Layer(1e-9, aSi_i), Layer(1e-9, aSi_n)] -back_materials = [Layer(2e-9, aSi_i), Layer(2e-9, aSi_p), Layer(100e-9, ITO_back), - Layer(120e-9, MgF2), Layer(150e-9, Ag)] - -front_width = np.sum([layer.width for layer in front_materials]) -back_width = np.sum([layer.width for layer in back_materials]) - -L = 130e-6 - -# rear junction - -nD = si("1e20cm-3") -nA = si("1e19cm-3") -bulk_doping = si("1e15cm-3") # n type bulk -def doping_profile_func(x): - - L = d_bulk - - doping_profile = - nA * erfc(x/150e-9) # characteristic depth of 150 nm - - doping_profile_rear = nD * erfc((L - x)/200e-9) # characteristic depth of 200 nm - - return doping_profile + doping_profile_rear + bulk_doping - -L_cm = d_bulk*100 # length of the system in the x-direction [cm] - -# Mesh -x = np.concatenate((np.linspace(0,2e-4, 2000, endpoint=False), - np.linspace(2e-4, L_cm - 2e-4, 2000, endpoint=False), - np.linspace(L_cm - 2e-4, L_cm, 2000))) - -options.position = np.concatenate((np.linspace(0, front_width, 100), front_width + x/100, - np.linspace(front_width + d_bulk, - front_width + d_bulk + back_width, 100))) - -options.minimum_spacing = 5e-9 - -Si_junction = [Junction([Layer(d_bulk, Si_pn)], - doping_profile=doping_profile_func, kind='sesame_PDD', - # mesh=x/100 - )] - -Si_cell = SolarCell(front_materials + - Si_junction + - back_materials) - -Si_ind = len(front_materials) - -solar_cell_solver(Si_cell, 'qe', options) - -plt.figure() -plt.plot(options.wavelength*1e9, Si_cell[Si_ind].layer_absorption, '--', label='Si absorption') -plt.plot(options.wavelength*1e9, Si_cell[Si_ind].eqe(options.wavelength), '-k', label='Si EQE') -plt.plot(options.wavelength*1e9, Si_cell[Si_ind].iqe(options.wavelength), '-r', label='Si IQE') -plt.legend() -plt.show() - -solar_cell_solver(Si_cell, 'iv', options) - -jsc = Si_cell.iv.Isc/10 - -plt.figure() -plt.plot(options.voltages, -Si_cell[Si_ind].iv(options.voltages)/10, 'o-', label='IV') -# plt.plot(options.voltages, solar_cell_old[1].iv(options.voltages), 'o-', label='IV') -# plt.xlim(-2, 1.8) -plt.text(0.02, 0.9*jsc, r'Jsc = {:.2f} mA/cm$^2$'.format(jsc)) -plt.text(0.02, 0.8*jsc, 'Voc = {:.3f} V'.format(Si_cell.iv.Voc)) -plt.text(0.02, 0.7*jsc, 'FF = {:.3f} %'.format(Si_cell.iv.FF*100)) -plt.text(0.02, 0.6*jsc, 'Eff = {:.3f} %'.format(Si_cell.iv.Eta*100)) -plt.text(0.02, 0.5*jsc, r'Jmpp = {:.3f} mA/cm$^2$'.format(Si_cell.iv.Impp/10)) -plt.text(0.02, 0.4*jsc, 'Vmpp = {:.3f} V'.format(Si_cell.iv.Vmpp)) -plt.ylim(0, 1.1*jsc) -plt.xlim(np.min(options.voltages), np.max(options.voltages)) -plt.xlabel('Voltage (V)') -plt.ylabel('Current density (mA/cm$^2$)') -plt.show() - -# plt.figure() -# plt.plot(x*1e4, Si_cell[Si_ind].sesame_sys.g, 'o') -# plt.xlim(0, 0.1) -# plt.show() -# -# plt.figure() -# plt.semilogy(Si_junction[0].mesh*1e6, Si_cell[Si_ind].absorbed(Si_junction[0].mesh), 'o', markerfacecolor='none') -# plt.xlim(0, 1) -# plt.ylim(1e-3,1e8) -# plt.show() - -# -# x = np.linspace(0, d_bulk, int(1e7)) -# int_A = np.trapz(Si_cell[Si_ind].absorbed(x), x, axis=0) -# def doping_profile_test(x): -# -# L = 8000e-9 -# -# doping_profile = - 1e20 * erfc(x / 150e-9) # characteristic depth of 150 nm -# -# doping_profile_2 = - 5e19 * erfc(x/400e-9) # characteristic depth of 150 nm -# # doping_profile = 0 -# # doping_profile_2 = 0 -# doping_profile_rear = 5e19 * erfc(((L/2)- x)/200e-9) # characteristic depth of 200 nm -# -# doping_profile_3 = 1e20 * erfc((L - x) / 150e-9) # characteristic depth of 150 nm -# -# return (doping_profile + doping_profile_2 + doping_profile_3 + -# doping_profile_rear + 1e16) -# -# x_test = np.linspace(0, 8000, 1000)*1e-9 -# -# doping_test = doping_profile_test(x_test) -# -# diff_rho = np.abs(np.gradient(doping_test, x_test)) -# -# -# -# -# doping_change = np.where(diff_rho/np.max(diff_rho) > 1e-3)[0] -# -# # identify continuous stretches of high doping change, and where there are gaps: -# -# change_point = np.where(np.diff(doping_change) != 1)[0] -# -# last_points = doping_change[change_point] -# first_points = doping_change[change_point + 1] -# -# first_points = np.insert(first_points, 0, doping_change[0]) -# last_points = np.append(last_points, doping_change[-1]) -# -# first_x = x_test[first_points] -# last_x = x_test[last_points] -# -# plt.figure() -# plt.plot(x_test*1e9, doping_test/np.max(doping_test), 'o-') -# plt.plot(x_test*1e9, diff_rho/np.max(diff_rho), 'o--') -# plt.plot(x_test[first_points]*1e9, [0.5]*len(first_points), 'xr') -# plt.plot(x_test[last_points]*1e9, [0.5]*len(last_points), 'xk') -# plt.show() -# -# current_mesh = x_test -# -# minimum_spacing = 1e-9 -# -# for i1 in range(len(first_points)): -# # want to make mesh denser where there are large changes in doping -# -# mesh_above = current_mesh[current_mesh < first_x[i1]] -# mesh_below = current_mesh[current_mesh >= last_x[i1]] -# mesh_dense = np.arange(first_x[i1], last_x[i1] - 1e-12, minimum_spacing) # last point not included -# -# current_mesh = np.unique(np.concatenate((mesh_above, mesh_dense, mesh_below))) -# -# plt.figure() -# plt.plot(current_mesh*1e9) -# plt.show() \ No newline at end of file diff --git a/examples/sesame_testing.py b/examples/sesame_testing.py deleted file mode 100644 index 037bfd81..00000000 --- a/examples/sesame_testing.py +++ /dev/null @@ -1,478 +0,0 @@ -import sesame -import numpy as np -import os -from solcore.constants import q -from solcore.light_source import LightSource -from solcore.interpolate import interp1d -from solcore.absorption_calculator import search_db -from scipy.special import erfc -import matplotlib.pyplot as plt -from rayflare.textures import regular_pyramids - -from rayflare.transfer_matrix_method import tmm_structure - -from rayflare.textures import regular_pyramids, rough_pyramids -from solcore import material, si -from rayflare.options import default_options -from solcore.structure import Layer -from rayflare.ray_tracing import rt_structure -from rayflare.utilities import make_absorption_function -from os.path import exists - -# Note Sesame assumes all quantities of length are input in units of cm. Other assumed -# input units are: time in s, energy in eV. - -# LONGi paper: -# To further increase JSC, a 150-nm-thick MgF2 film was evaporated on the front TCO layer -# as a second antireflective coating. For 26.81% cell, an additional 120-nm-thick MgF2/150-nm-thick -# Ag stack was evaporated on the rear TCO layer, which means this cell is a monofacial solar cell. - -force_recalculate = True - -step_size = 20 - -shading = 0.02 - -wls = np.arange(280, 1200, step_size) * 1e-9 - -wls_ls = np.linspace(250, 4500, 4000) -base_light = LightSource(source_type="standard", - version="AM1.5g", x=wls_ls, output_units="photon_flux_per_nm") - -base_flux = base_light.spectrum()[1] - -# ray-tracing for optics first -d_bulk = 130e-6 - -# photons at wavelength shorter than the singlet energy S1 are assumed to be absorbed, -# and turned into two photons through singlet fission. Assuming thermally neutral SF, these -# two photons will have half the energy/two times the wavelength of S1. - -absorption_data = f'rt_data_{step_size}3.npy' - -# ITO_front = material("ITO_front_transparent")() -ITO_front = material("ITO_front_transparent")() -ITO_back = material("ITO_back")() -Ag = material("Ag_Jiang")() -aSi_i = material("aSi_i")() -aSi_p = material("aSi_p")() -aSi_n = material("aSi_n")() -Si = material("Si")() -Air = material("Air")() -SiNx = material("SiNx_Ox")() -MgF2_pageid = str(search_db(os.path.join("MgF2", "Rodriguez-de Marcos"))[0][0]) -MgF2 = material(MgF2_pageid, nk_db=True)() -Ag = material("Ag_Jiang")() - - -plt.figure() -plt.plot(wls*1e9, SiNx.n(wls)) -plt.plot(wls*1e9, SiNx.k(wls)) -plt.plot(wls*1e9, ITO_front.n(wls), '--') -plt.plot(wls*1e9, ITO_front.k(wls), '--') -plt.plot(wls*1e9, ITO_back.n(wls), '-.') -plt.plot(wls*1e9, ITO_back.k(wls), '-.') -plt.show() -# build structure - -options = default_options() -options.wavelengths = wls -options.pol = "u" -options.I_thresh = 1e-3 -options.randomize_surface = True -options.n_jobs = -3 -options.periodic = True -options.project_name = "basic_cell_model" -options.nx = 20 -options.ny = options.nx -options.n_rays = 4*options.nx ** 2 -options.lookuptable_angles = 500 -options.depth_spacing = 1e-9 -options.depth_spacing_bulk = 1e-9 -options.theta_in = 0*np.pi/180 -options.phi_in = 0*np.pi/180 -options.parallel = True - -options.theta_in = 0*np.pi/180 - - -front_materials = [Layer(110e-9, MgF2), Layer(40 * 1e-9, ITO_front), - Layer(1e-9, aSi_i), Layer(1e-9, aSi_n)] -back_materials = [Layer(2e-9, aSi_i), Layer(2e-9, aSi_p), Layer(100e-9, ITO_back), - Layer(120e-9, MgF2), Layer(150e-9, Ag)] - -# thickness of front: -d_front = np.sum([x.width*1e9 for x in front_materials]) - -tmm_str = tmm_structure(front_materials + [Layer(d_bulk, Si)] + back_materials, incidence=Air, transmission=Air) - -options.coherent = False -options.coherency_list = ['c']*len(front_materials) + ['i']*(len(back_materials) + 1) - -tmm_result = tmm_str.calculate_profile(options) - -bulk_profile = tmm_result['profile'] - -Si_profile = bulk_profile[:, int(d_front):(int(1e9*d_bulk)+int(d_front)+1)] - - -# plot integrated absorption - this is what we actually need to compare the EQE to see where losses are -# coming from. - -bulk_positions_cm = np.arange(0, d_bulk * 1e2, options.depth_spacing_bulk * 1e2) - -# convert bulk_profile from nm-1 to cm-1 - -profile_func = interp1d(bulk_positions_cm, 1e7 * Si_profile, kind='linear', bounds_error=False, fill_value=0) - -L = d_bulk*100 # length of the system in the x-direction [cm] - -# Mesh -x = np.concatenate((np.linspace(0,2e-4, 2000, endpoint=False), - np.linspace(2e-4, L - 2e-4, 2000, endpoint=False), - np.linspace(L - 2e-4, L, 2000))) - -A_intgr = np.trapz(profile_func(x), x, axis=1) - -Si = material("Si")() - -nD = 1e19 # [cm^-3] -nA = 1e20 # [cm^-3] -bulk_doping = 1e15 # p-type - -doping_profile = nD * erfc(x/150e-7) # characteristic depth of 150 nm - -doping_profile_rear = - nA * erfc((L - x)/200e-7) # characteristic depth of 200 nm - -overall_profile = doping_profile + doping_profile_rear - bulk_doping -# Create a system -sys = sesame.Builder(x) - -# https://www.pveducation.org/es/fotovoltaica/materials/general-properties-of-silicon - -# Dictionary with the material parameters -material_Si = {'Nc': 3e19, 'Nv': 1e19, 'Eg': 1.12, 'affinity': 4.05, 'epsilon': 11.7, - 'mu_e': 1000, 'mu_h': 10000, 'tau_e': 0.05, 'tau_h': 0.05, 'Et': 0, - 'B': 1.89e-15, - 'Cn': 3e-31, 'Cp': 1e-31 - } - -# Auger: https://ui.adsabs.harvard.edu/abs/1977ApPhL..31..346D/abstract#:~:text=The%20Auger%20coefficients%20at%20300,31%20cm6%20s%2D1. - - -# Et: energy levels of the bulk recombination centers [eV] -# B: radiation recombination constant [cm\ :sup:`3`/s], Cn (Cp): Auger - # recombination constant for electrons (holes) [cm\ :sup:`6`/s], - # mass_e (mass_h): effective mass of electrons (holes). All parameters - # can be scalars or callable functions similar to the location - # argument. -# can all be location dependent - - - -# Add the material to the system -sys.add_material(material_Si) - -# fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True) -# ax1.plot(x, overall_profile, label='erfc') -# # ax1.plot(x, sys.rho*sys.scaling.density, label='flat') -# ax1.set_xlim(0, 400e-7) -# ax1.legend() -# -# ax2.plot(x, overall_profile) -# # ax2.plot(x, sys.rho*sys.scaling.density) -# ax2.set_xlim(L - 600e-7, L) -# -# plt.show() - -sys.rho = overall_profile/sys.scaling.density - -# Define Ohmic contacts -sys.contact_type('Ohmic', 'Ohmic') - -# Define the surface recombination velocities for electrons and holes [cm/s] -Sn_left, Sp_left, Sn_right, Sp_right = 1, 1e3, 1e3, 1 -# lower than 1e-6: diverges -sys.contact_S(Sn_left, Sp_left, Sn_right, Sp_right) - -def gfcn_fun_rt(wl_index, flux): - - # profile_func is in m-1, but as a function of cm - - def gcfn(x, y): - return flux*profile_func(x)[wl_index] - - return gcfn - -test_rt = gfcn_fun_rt(8, 1e20) -rt_data = test_rt(x, 0) - -eqe = np.zeros_like(wls) - -for i1, wl in enumerate(wls): - - flux = 1e20 - print(wl) - sys.generation(gfcn_fun_rt(i1, flux)) - print(gfcn_fun_rt(i1, flux)(0, 0)) - print(gfcn_fun_rt(i1, flux)(1e-6, 0)) - voltages = [0] - - if i1 == 0: - guess = None - - else: - guess = {key: result[key][0,:] for key in result.keys()} - - j, result = sesame.IVcurve(sys, voltages, guess=guess) - - # A[i1] = 1 - np.exp(-alpha*L) - # eqe[i1] = j/(q*flux) - - eqe[i1] = j/(q*flux) - - -A = tmm_result['A_per_layer'][:, len(front_materials)] -iqe = eqe/A - -# convert dimensionless current to dimension-ful current -eqe = eqe * sys.scaling.current -iqe = iqe * sys.scaling.current - -plt.figure() -plt.plot(wls*1e9, eqe,'-b', label='EQE') -plt.plot(wls*1e9, iqe,'--r', label='IQE') -plt.plot(wls*1e9, A_intgr, '--k', label='A') -plt.xlabel('Wavelength (nm)') -plt.ylabel('EQE') -plt.legend() -plt.grid() -plt.show() - -# def gen_wl(x): -# return 1e-2*Si.alpha(wls)[None,:]*1e-2 * np.exp(-1e-2*Si.alpha(wls)[None,:]* x[:, -# None]) - -gen_wl = profile_func - -# gg = light_source.spectrum()[1][None,:] * gen_wl(x) -# photon flux m-2 / m, generation cm-1 -gg = base_light.spectrum(wls, output_units="photon_flux_per_m")[1][:, None] * gen_wl(x) -# g_vs_z = np.trapz(gg, wls, axis=1) / 1e4 # m-2 cm-1 -> cm-3 -g_vs_z = (1-shading)*np.trapz(gg, wls, axis=0) / 1e4 -g_vs_z[np.isnan(g_vs_z)] = 0 - - -# somehow missing a factor of 100 somewhere (with Beer-Lambert)... -# g_vs_z = 100*g_vs_z - -# result: entries are v, efn, and efp. Store in arrays instead. - -# equilibrium solution: -j0, result0 = sesame.IVcurve(sys, [0]) - -voltages = np.concatenate((np.linspace(0,0.55, 8, endpoint=False), - np.linspace(0.55, 0.7, 12, endpoint=False), - np.linspace(0.7, 0.8, 12))) -sys.generation(g_vs_z) -j, result = sesame.IVcurve(sys, voltages)#, verbose=False) -j = j * sys.scaling.current - -jsc = j[0]*1e4 - -# jsc = q*np.trapz(eqe*light_source.spectrum()[1], wls) # A/m2 - -zero_crossing = np.where(np.diff(np.sign(j)))[0][0] -j_above = j[zero_crossing] -j_below = j[zero_crossing + 1] - -voc = voltages[zero_crossing] + (voltages[zero_crossing + 1] - voltages[zero_crossing]) * j_above / (j_above - j_below) - -vmpp = voltages[np.nanargmax(j*voltages)] -jmpp = j[np.nanargmax(j*voltages)]*1e4 - -FF = vmpp*jmpp/(jsc*voc) - -plt.figure() - -plt.plot(voltages, 1e4*j, '-k', label='Current') -plt.plot(voltages, 1e4*j*voltages, '--r', label='Power') - -plt.xlabel('Voltage [V]') -plt.ylabel(r'Current (A/m$^2$) / Power (W)') -plt.text(0.02, 0.9*jsc, r'Jsc = {:.2f} mA/cm$^2$'.format(jsc/10)) -plt.text(0.02, 0.8*jsc, 'Voc = {:.3f} V'.format(voc)) -plt.text(0.02, 0.7*jsc, 'FF = {:.3f} %'.format(FF*100)) -plt.text(0.02, 0.6*jsc, 'Pmax = {:.3f} W'.format(jmpp*vmpp)) -plt.text(0.02, 0.5*jsc, 'Eff = {:.3f} %'.format(jmpp*vmpp/10)) -plt.text(0.02, 0.4*jsc, r'Jmpp = {:.3f} mA/cm$^2$'.format(jmpp/10)) -plt.text(0.02, 0.3*jsc, 'Vmpp = {:.3f} V'.format(vmpp)) - -plt.ylim(-100, 1.1e4*j[0]) -plt.grid() # add grid -plt.legend() -plt.show() - -# print("Jsc", jsc) -# print("Voc", voc) -# print("eff", np.max(1e4*j*voltages)/1000) -# print("FF", FF) -# print("Vmpp", vmpp) -# print("Jmpp", jmpp) - -line = ((0, 0), (L, 0)) - -# sys, result = sesame.load_sim(f'1dhomo_V_0.gzip') -analyzer = sesame.Analyzer(sys, {key: result[key][0, :] for key in result.keys()}) -x, s = analyzer.line(sys, *line) - -electron_density_eq = analyzer.electron_density(location=line)*sys.scaling.density -hole_density_eq = analyzer.hole_density(location=line)*sys.scaling.density - -result_maxPP = {key: result[key][np.nanargmax(j*voltages), :] for key in result.keys()} -# sys, result = sesame.load_sim(f'1dhomo_V_0.gzip') -analyzer = sesame.Analyzer(sys, result_maxPP) -x, s = analyzer.line(sys, *line) - -electron_density = analyzer.electron_density(location=line) -hole_density = analyzer.hole_density(location=line) - -srh = analyzer.bulk_srh_rr(location=line) -auger = analyzer.auger_rr(location=line) -rad = analyzer.radiative_rr(location=line) - -fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True) -ax1.semilogy(sys.xpts[s]*1e4, electron_density*sys.scaling.density, label='e-') -ax1.semilogy(sys.xpts[s]*1e4, hole_density*sys.scaling.density, label='h+') -ax1.set_xlim(0, 10) -ax1.set_xlabel('x (um)') -ax1.set_ylabel('density (cm-3)') -ax1.legend() - -ax2.semilogy(sys.xpts[s]*1e4, electron_density*sys.scaling.density, label='e-') -ax2.semilogy(sys.xpts[s]*1e4, hole_density*sys.scaling.density, label='h+') -# ax2.plot(x, sys.rho*sys.scaling.density) -ax2.set_xlim(d_bulk*1e6 - 8, d_bulk*1e6) -ax2.set_xlabel('x (um)') -plt.show() - - -fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True) -ax1.semilogy(sys.xpts[s]*1e4, electron_density*sys.scaling.density, label='e-') -ax1.semilogy(sys.xpts[s]*1e4, hole_density*sys.scaling.density, label='h+') -ax1.set_xlim(0, 10) -ax1.set_xlabel('x (um)') -ax1.set_ylabel('density (cm-3)') -ax1.legend() - -ax2.semilogy(sys.xpts[s]*1e4, electron_density*sys.scaling.density, label='e-') -ax2.semilogy(sys.xpts[s]*1e4, hole_density*sys.scaling.density, label='h+') -# ax2.plot(x, sys.rho*sys.scaling.density) -ax2.set_xlim(d_bulk*1e6 - 8, d_bulk*1e6) -ax2.set_xlabel('x (um)') -plt.show() - -fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True, figsize=(5, 3)) -ax1.semilogy(sys.xpts[s]*1e4, srh, label='SRH') -ax1.semilogy(sys.xpts[s]*1e4, auger, label='Auger') -ax1.semilogy(sys.xpts[s]*1e4, rad, label='Radiative') -ax1.set_xlim(0, 2) -ax1.set_xlabel('x (um)') -ax1.legend() - -ax2.semilogy(sys.xpts[s]*1e4, srh, label='SRH') -ax2.semilogy(sys.xpts[s]*1e4, auger, label='Auger') -ax2.semilogy(sys.xpts[s]*1e4, rad, label='Radiative') -# ax2.plot(x, sys.rho*sys.scaling.density) -ax2.set_xlim(d_bulk*1e6 - 2, d_bulk*1e6) -ax2.set_xlabel('x (um)') -plt.tight_layout() -plt.show() - -# analyzer.full_current()*sys.scaling.current * sys.scaling.length - -# jsc = analyzer.full_current()*sys.scaling.current - -# bulk SRH: -bulk_SRH = analyzer.integrated_bulk_srh_recombination()*sys.scaling.generation * sys.scaling.length -bulk_aug = analyzer.integrated_auger_recombination()*sys.scaling.generation * sys.scaling.length -bulk_rad = analyzer.integrated_radiative_recombination()*sys.scaling.generation * sys.scaling.length - -# current_loss = q*(bulk_SRH + bulk_aug + bulk_rad)/jsc - -# integrated current: - -jsc_max = 1e9*q*np.trapz(A_intgr*base_light.spectrum(wls*1e9)[1], wls) - -# current_loss_2 = 1 - jsc*1e4/jsc_max -# -# print(current_loss, current_loss_2) - -# account for all the losses - -auger_loss = 1e4*q*bulk_aug -srh_loss = 1e4*q*bulk_SRH -rad_loss = 1e4*q*bulk_rad - -# current available above 1200 nm: - -total_J = 1e9*q*np.trapz(base_light.spectrum(wls*1e9)[1], wls) - -R_loss = 1e9*q*np.trapz(tmm_result['R']*base_light.spectrum(wls*1e9)[1], wls) - -escape_loss = tmm_result['T'] -escape_loss = 1e9*q*np.trapz(escape_loss*base_light.spectrum(wls*1e9)[1], wls) - -parasitic_abs = np.sum(tmm_result['A_per_layer'], 1) - A - -parasitic_loss = 1e9*q*np.trapz(parasitic_abs*base_light.spectrum(wls*1e9)[1], wls) -# units of SRV: cm/s -# units of carrier density: cm-3 -# SRV*carrier density = cm-2/s -# q*SRV*carrier density = q*cm-2/s = A cm-2 - -shading_loss = 1e9*q*np.trapz(shading*base_light.spectrum(wls*1e9)[1], wls) - -# think this should be excess carrier density -n_front_eq = electron_density_eq[0] -p_rear_eq = hole_density_eq[-1] - -n_rear_eq = electron_density_eq[-1] -p_front_eq = hole_density_eq[0] - -e_sr_left = Sn_left*1e4*q*(electron_density[0]*sys.scaling.density - n_front_eq) -h_sr_left = Sp_left*1e4*q*(hole_density[0]*sys.scaling.density - p_front_eq) -e_sr_right = Sn_right*1e4*q*(electron_density[-1]*sys.scaling.density - n_rear_eq) -h_sr_right = Sp_right*1e4*q*(hole_density[-1]*sys.scaling.density - p_rear_eq) - -# only minority carrier recombination matters -sr_left = e_sr_left if hole_density[0]*sys.scaling.density > electron_density[0]*sys.scaling.density else h_sr_left -sr_right = e_sr_right if hole_density[-1]*sys.scaling.density > electron_density[-1]*sys.scaling.density else h_sr_right - -print(shading_loss + R_loss + parasitic_loss + escape_loss + jmpp + auger_loss + srh_loss + rad_loss + sr_left + sr_right) -print(total_J) - -J_list = [jmpp, shading_loss, R_loss, parasitic_loss, escape_loss, auger_loss, srh_loss, rad_loss, sr_left, sr_right] -fig, ax = plt.subplots(figsize=(4, 6)) - -labels = [r'$J_{MPP}$', 'Shading', r'R$_{front}$', r'A$_{parasitic}$', 'Escape', 'Auger', 'SRH', 'Radiative', 'Front surface', 'Rear surface'] - -for j1, item in enumerate(J_list): - - ax.bar(['J'], item, bottom=np.sum(J_list[:j1]), label=labels[j1]) - -ax.set_ylim(300, 1.01*total_J) -ax.axhline(total_J, color='k', linestyle='--', label='Available current') -plt.legend() -plt.show() - -print(total_J - np.sum(J_list)) - -# LONGi: -# Jsc: 41.16 -# Voc: 0.751 -# FF: 86.5 - -# 33.91 -# 0.777 -# 22.766 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 7d646f3d..cd9dca70 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [build-system] build-backend = 'mesonpy' requires = [ - 'meson-python==0.13.0rc0', + 'meson-python', 'numpy', 'cython' ] @@ -39,7 +39,7 @@ dependencies = [ "pyyaml", "yabox", "joblib", - "sesame@git+https://github.com/phoebe-p/sesame.git" + "solsesame", ] dynamic = ["version"] @@ -64,12 +64,12 @@ doc = ["Sphinx", "recommonmark"] dev = ["pre-commit"] -[tool.devpy] +[tool.spin] package = 'solcore' -[tool.devpy.commands] -"Build" = ["devpy.cmds.meson.build", "devpy.cmds.meson.test"] -"Extensions" = ['.devpy/cmds.py:codecov', '.devpy/cmds.py:install_dependencies'] +[tool.spin.commands] +"Build" = ["spin.cmds.meson.build", "spin.cmds.meson.test"] +"Extensions" = ['.spin/cmds.py:codecov', '.spin/cmds.py:install_dependencies'] [tool.pytest.ini_options] addopts = "--cov=solcore --cov-report=html:htmlcov -p no:warnings -n \"auto\" -v" diff --git a/solcore/analytic_solar_cells/depletion_approximation.py b/solcore/analytic_solar_cells/depletion_approximation.py index 05ce76e1..37bbef4f 100755 --- a/solcore/analytic_solar_cells/depletion_approximation.py +++ b/solcore/analytic_solar_cells/depletion_approximation.py @@ -364,9 +364,12 @@ def get_j_dark(x, w, L, s, d, V, minority, T): :return: J_top_dark """ - # We calculate some fractions harg = (x - w) / L + + # only do cosh and sinh if harg is < 200 (avoid inf/nan errors) + harg[harg > 200] = 200 + sinh_harg = np.sinh(harg) cosh_harg = np.cosh(harg) lsod = (L * s) / d diff --git a/solcore/material_data/mobility.py b/solcore/material_data/mobility.py index 61675054..59ffd61f 100755 --- a/solcore/material_data/mobility.py +++ b/solcore/material_data/mobility.py @@ -48,7 +48,7 @@ def calculate_mobility(material, holes, N, x=0.0, y=0.0, T=300): if holes: i = 2 if material not in data.keys(): - print("Error: Material {0} not in the database for the mobility. Reverting to GaAs.".format(material)) + print("Warning: material {0} not in the database for the mobility. Reverting to GaAs.".format(material)) d = data['GaAs'][i] elif data[material][0] == 2: d = data[material][i] diff --git a/solcore/material_system/material_system.py b/solcore/material_system/material_system.py index b3ab1817..1f3799ac 100755 --- a/solcore/material_system/material_system.py +++ b/solcore/material_system/material_system.py @@ -353,30 +353,6 @@ def __getattr__(self, attrname): # only used for unknown attributes. return 1.0 / self.ni ** 2 * 2 * pi / (h ** 3 * c ** 2) * quad(inter, 0, upper)[0] if attrname == "permittivity": return self.relative_permittivity * vacuum_permittivity - if attrname == "electron_diffusion_length": - try: - mobility, lifetime = self.electron_mobility, self.electron_minority_lifetime - return np.sqrt(kb * self.T * mobility * lifetime / q) - except: - ValueError("Cannot calculate electron diffusion length. Need electron mobility and lifetime") - if attrname == "hole_diffusion_length": - try: - mobility, lifetime = self.hole_mobility, self.hole_minority_lifetime - return np.sqrt(kb * self.T * mobility * lifetime / q) - except: - ValueError("Cannot calculate hole diffusion length. Need hole mobility and lifetime") - if attrname == "electron_minority_lifetime": - try: - mobility, diffusion_length = self.electron_mobility, self.electron_diffusion_length - return q*diffusion_length**2/(kb*self.T*mobility) - except: - ValueError("Cannot calculate electron minority lifetime. Need electron mobility and diffusion length") - if attrname == "hole_minority_lifetime": - try: - mobility, diffusion_length = self.hole_mobility, self.hole_diffusion_length - return q * diffusion_length ** 2 / (kb * self.T * mobility) - except: - ValueError("Cannot calculate hole minority lifetime. Need hole mobility and diffusion length") kwargs = {element: getattr(self, element) for element in self.composition} kwargs["T"] = self.T diff --git a/solcore/parameter_system/parameter_system.py b/solcore/parameter_system/parameter_system.py index 73be1685..4ff53a1b 100755 --- a/solcore/parameter_system/parameter_system.py +++ b/solcore/parameter_system/parameter_system.py @@ -72,8 +72,8 @@ def get_parameter(self, material, parameter, verbose=False, **others): """ - warn('Passing alloy fractions to get_parameter in the material name (e.g. In0.2GaAs) is now deprecated; \ - pass the alloy fraction as an argument instead.', DeprecationWarning) + # warn('Passing alloy fractions to get_parameter in the material name (e.g. In0.2GaAs) is now deprecated; \ + # pass the alloy fraction as an argument instead.', DeprecationWarning) relevant_parameters = others diff --git a/solcore/poisson_drift_diffusion/DriftDiffusionUtilities.py b/solcore/poisson_drift_diffusion/DriftDiffusionUtilities.py index 568bff0d..3667559a 100644 --- a/solcore/poisson_drift_diffusion/DriftDiffusionUtilities.py +++ b/solcore/poisson_drift_diffusion/DriftDiffusionUtilities.py @@ -21,7 +21,7 @@ reason_to_exclude = None except ImportError: reason_to_exclude = ( - "The built-in Poisson-Drift-Difussion solver could not be found." + "The built-in Fortran Poisson-Drift-Diffusion solver could not be found." ) @@ -295,6 +295,10 @@ def iv_pdd( This is in addition to the attributes added by the equilibrium and the short circuit calculations, as relevant. See the description of those functions. """ + + if np.max(internal_voltages) <= 0: + internal_voltages = np.append(internal_voltages, 0.01) + junction.voltage = internal_voltages R_shunt = min(junction.R_shunt, 1e14) if hasattr(junction, "R_shunt") else 1e14 diff --git a/solcore/sesame_drift_diffusion/__init__.py b/solcore/sesame_drift_diffusion/__init__.py index 61c2cc9b..c4b27a7f 100644 --- a/solcore/sesame_drift_diffusion/__init__.py +++ b/solcore/sesame_drift_diffusion/__init__.py @@ -1 +1 @@ -from .solve_pdd import qe_sesame, iv_sesame, equilibrium \ No newline at end of file +from .solve_pdd import qe_sesame, iv_sesame, equilibrium diff --git a/solcore/sesame_drift_diffusion/process_structure.py b/solcore/sesame_drift_diffusion/process_structure.py new file mode 100644 index 00000000..926e6352 --- /dev/null +++ b/solcore/sesame_drift_diffusion/process_structure.py @@ -0,0 +1,522 @@ +from __future__ import annotations + +from sesame import Builder +import numpy as np +from scipy.optimize import root +from solcore.constants import q, kb +from solcore.state import State +from solcore.structure import Junction +from solcore import material + +def process_structure(junction: Junction, options: State): + """ + Process the layers in the junction and convert it to a format which can be used by Sesame. This includes unit + conversions from Solcore base SI units to the units used by Sesame (eV, cm). This function also sets the mesh, + either from a user-supplied junction.mesh (in m) attribute, or by trying to guess an appropriate mesh depending on the + doping profile and layer thicknesses. It will also extract the doping profile, which can be supplied in + the following formats: + + - a constant value for each layer, set by the Nd or Na attribute of the material + - a doping profile for the whole junction, passed as a function which accepts a depth in the junction in m + and returns doping in m-3 + - a doping profile for each layer, passed as a function which accepts a depth in the layer in m and returns + doping in m-3 + - Combinations of the above + + Note that since we can specify a doping profile for the whole junction, the Sesame solver can support a junction + which is made up of a single layer, unlike the depletion approximation and Fortran-based PDD solvers. + + This function will add or update the following attributes in the Junction object: + + - mesh: the mesh used by the Sesame solver, in m + - mesh_cm: the mesh used by the Sesame solver, in cm + - sesame_sys: a Sesame Builder object defining the junction in Sesame format, used to solve the IV and QE + + :param junction: a Junction object + :param options: a State object containing options for the solver + + """ + + materials = [] # list of dictionaries for Sesame + layer_widths = [] # layer widths in cm + doping_profile_functions = ( + [] + ) # list of functions which take an argument of depth in junction in m and + # return doping in cm-3 + offset = 0 # offset relative to front of junction of the current layer in cm + + for layer in junction: + layer_widths.append(layer.width * 1e2) # m to cm + + # this will always be set, even if the layer has a doping profile + # constant_doping = layer.material.Nd / 1e6 if layer.material.Nd > layer.material.Na else -layer.material.Na /1e6 + + if hasattr(layer, "doping_profile"): + doping_profile_functions.append( + lambda i, x: junction[i].doping_profile(x) / 1e6 + ) + # function which takes an argument of depth in junction in m and returns doping in cm-3 + + else: + doping_profile_functions.append( + lambda i, x: junction[i].material.Nd / 1e6 + if junction[i].material.Nd > junction[i].material.Na + else -junction[i].material.Na / 1e6 + ) + # to be consistent with functions passed by user, this should be a function which takes an argument in m + # and returns doping in cm-3 + + offset += layer.width * 1e2 + # Note: in Sesame, all of these can be functions of position as well as constants - but this is untested! + + new_mat = get_material_parameters(layer.material) + materials.append(new_mat) + + # see if we can determine the junction depth: + + edges = np.insert( + np.cumsum(layer_widths), 0, 0 + ) # locations of interfaces between layers + edges[-1] = ( + edges[-1] + 1e-10 + ) # otherwise final point will not be assigned any values + + if hasattr(junction, "doping_profile"): + junction_depth = ( + 100 * root(junction.doping_profile, np.sum(layer_widths) / (2 * 100)).x + ) # in cm + # this is where doping crosses zero - not necessarily the junction depth, but not sure how best to determine + # this. Maybe want to find slope of doping profile and identify locations where it is steepest? + + else: + # identify where the doping profile changes sign for constant doping layers or individual doping profiles + # per layer + doping_sign = [ + np.sign(doping_profile_functions[i1](i1, edges[i1] / 100)) + for i1 in range(len(edges) - 1) + ] + junction_depth = edges[np.where(np.diff(doping_sign))[0] + 1] + + if not hasattr(junction, "mesh"): + # calculate appropriate mesh (hopefully) if not supplied as input in junction.mesh + make_mesh(junction, layer_widths, options, junction_depth) + user_mesh = False + + else: + # user-provided mesh + junction.mesh_cm = junction.mesh * 1e2 # m to cm + user_mesh = True + + if hasattr(junction, "doping_profile"): + doping_profile_x = junction.doping_profile(junction.mesh) / 1e6 # in cm-3 + + else: + doping_profile_x = np.zeros(len(junction.mesh_cm)) + for i1, doping_profile_fn in enumerate(doping_profile_functions): + doping_profile_x[ + np.all( + (junction.mesh_cm >= edges[i1], junction.mesh_cm < edges[i1 + 1]), + axis=0, + ) + ] = doping_profile_fn( + i1, + junction.mesh[ + np.all( + ( + junction.mesh_cm >= edges[i1], + junction.mesh_cm < edges[i1 + 1], + ), + axis=0, + ) + ] + - edges[i1] / 100, + ) + + # Make Sesame Builder object for simulations + junction.sesame_sys = Builder(junction.mesh_cm, T=options.T) # Sesame system + + junction.sesame_sys.rho = doping_profile_x / junction.sesame_sys.scaling.density + + if ( + not user_mesh + ): # do not update mesh after finding doping profile if a specific mesh was supplied by the user + update_mesh(junction, layer_widths, options) + + if hasattr(junction, "doping_profile"): + doping_profile_x = junction.doping_profile(junction.mesh) / 1e6 # in cm-3 + + else: + doping_profile_x = np.zeros(len(junction.mesh_cm)) + for i1, doping_profile_fn in enumerate(doping_profile_functions): + doping_profile_x[ + np.all( + ( + junction.mesh_cm >= edges[i1], + junction.mesh_cm < edges[i1 + 1], + ), + axis=0, + ) + ] = doping_profile_fn( + i1, + junction.mesh[ + np.all( + ( + junction.mesh_cm >= edges[i1], + junction.mesh_cm < edges[i1 + 1], + ), + axis=0, + ) + ] + - edges[i1] / 100, + ) + + junction.sesame_sys = Builder(junction.mesh_cm, T=options.T) # Sesame system + + # set doping profile in Sesame Builder objects + junction.sesame_sys.rho = doping_profile_x / junction.sesame_sys.scaling.density + + for i1 in range(len(junction)): + junction.sesame_sys.add_material( + materials[i1], lambda x: np.all((x >= edges[i1], x < edges[i1 + 1]), axis=0) + ) + + junction.sesame_sys.contact_type("Ohmic", "Ohmic") + # should also be able to choose other options, since Sesame can handle them + + # get surface recombination velocities + junction.sesame_sys.contact_S(*get_srv(junction)) + +def get_material_parameters(mat: material): + """ + Extract approriate material parameters for Sesame from a Solcore material object. + + :param mat: a Solcore material + """ + try: + bulk_recombination_energy = mat.bulk_recombination_energy / q + # this is an option which can be used by Sesame, but is not currently used by Solcore + # anywhere else, or defined in the database for any materials + except ValueError: + bulk_recombination_energy = 0 # default value + + try: + auger_electron = ( + mat.electron_auger_recombination * 1e12 + ) # m6/s to cm6/s + + except ValueError: + auger_electron = 0 + + try: + auger_hole = mat.hole_auger_recombination * 1e12 # m6/s to cm6/s + + except ValueError: + auger_hole = 0 + + # mobility must be provided, but if the user has provided a diffusion length, we can calculate + # the minority carrier lifetime from the mobility and diffusion length + try: + electron_minority_lifetime = mat.electron_minority_lifetime + except ValueError: + electron_minority_lifetime = carrier_constants("electron_minority_lifetime", mat) + + try: + hole_minority_lifetime = mat.hole_minority_lifetime + except ValueError: + hole_minority_lifetime = carrier_constants("hole_minority_lifetime", mat) + + new_mat = { + "Nc": mat.Nc + * 1e-6, # effective density of states at CB edge (cm-3) + "Nv": mat.Nv + * 1e-6, # effective density of states at VB edge (cm-3) + "Eg": mat.band_gap / q, # material bandgap (eV) + "affinity": mat.electron_affinity / q, # electron affinity (eV) + "epsilon": mat.relative_permittivity, + # relative permittivity (dimensionless) + "mu_e": mat.electron_mobility + * 1e4, # electron mobility (cm2/(V s)) + "mu_h": mat.hole_mobility * 1e4, # hole mobility (cm2/(V s)) + "tau_e": electron_minority_lifetime, # electron bulk lifetime (s) + "tau_h": hole_minority_lifetime, # hole bulk lifetime (s) + "Et": bulk_recombination_energy, # energy level of bulk recombination centres (eV) + "B": mat.radiative_recombination * 1e6, + # radiative recombination constant (cm3/s) + "Cn": auger_electron, # Auger recombination constant for electrons (cm6/s) + "Cp": auger_hole, # Auger recombination constant for holes (cm6/s) + } + + return new_mat + +def carrier_constants(quantity, mat): + if quantity == "electron_diffusion_length": + mobility, lifetime = mat.electron_mobility, mat.electron_minority_lifetime + return np.sqrt(kb * mat.T * mobility * lifetime / q) + + if quantity == "hole_diffusion_length": + mobility, lifetime = mat.hole_mobility, mat.hole_minority_lifetime + return np.sqrt(kb * mat.T * mobility * lifetime / q) + + if quantity == "electron_minority_lifetime": + mobility, diffusion_length = mat.electron_mobility, mat.electron_diffusion_length + return q * diffusion_length ** 2 / (kb * mat.T * mobility) + + if quantity == "hole_minority_lifetime": + mobility, diffusion_length = mat.hole_mobility, mat.hole_diffusion_length + return q * diffusion_length ** 2 / (kb * mat.T * mobility) + + +def make_mesh( + junction: Junction, layer_width: float, options: State, junction_depth: list[float] +): + """ + Make a mesh for Sesame, in case one was not supplied. This will try to make the mesh dense near + the front surface, at the (guessed) junction depth, and near the rear surface. The user can specify + the minimum and maximum spacing allowed (in m) through options.minimum_spacing or options.maximum_spacing. + Otherwise these will be set so that there is a maximum of 10,000 and a minimum of 500 points in the + mesh + + :param junction: a Junction object + :param layer_width: a list of layer widths in m + :param options: a State object containing options for the solver + :param junction_depth: a list of junction depths in cm + """ + + # TODO: general improvement of the meshing; should generate a smooth mesh rather than either coarse or fine + + total_width = np.sum(layer_width) + + if "minimum_spacing" in options.keys(): + minimum_spacing = options.minimum_spacing * 1e2 + + else: + minimum_spacing = total_width / 1e4 # maximum of 10000 points + + if "maximum_spacing" in options.keys(): + maximum_spacing = options.maximum_spacing * 1e2 + + else: + maximum_spacing = total_width / 500 # minimum of 500 points + + if maximum_spacing == minimum_spacing: + mesh = np.arange(0, total_width, maximum_spacing) + + # identify location of junction. doping_profile is a function + + else: + # edges = np.insert(np.cumsum(layer_width), 0, 0) + + front_spacing = np.min([minimum_spacing, 0.5e-7]) + + dense_front_width = 200e-7 + + end_front = np.min([dense_front_width - 1e-10, total_width]) + + front = np.arange(0, end_front, front_spacing) + + # 1 nm in cm = 1e-7 + if end_front != total_width: + if junction_depth[0] < total_width / 2: + end_dense = ( + junction_depth[0] + 0.1 * total_width + if (junction_depth[0] + 0.1 * total_width < total_width) + else total_width + ) + + include_end = True if end_dense == total_width else False + + if end_dense > end_front: + n_points = int((end_dense - end_front) / minimum_spacing) + mesh = np.linspace( + end_front, end_dense, n_points, endpoint=include_end + ) + + mesh = np.concatenate((front, mesh)) + + else: + mesh = front + + if not include_end: + n_points = int((total_width - end_dense) / maximum_spacing) + mesh_rest = np.linspace( + end_dense, total_width, n_points, endpoint=True + ) + + mesh = np.concatenate((mesh, mesh_rest)) + + else: + n_points = int((0.2 * total_width - end_front) / minimum_spacing) + + mesh_dense_front = np.linspace( + end_front, 0.2 * total_width, n_points, endpoint=False + ) + + n_points = int( + (junction_depth[0] - 0.3 * total_width) / maximum_spacing + ) + + mesh_bulk = np.linspace( + 0.2 * total_width, + junction_depth[0] - 0.1 * total_width, + n_points, + endpoint=False, + ) + + end_dense = ( + junction_depth[0] + 0.1 * total_width + if (junction_depth[0] + 0.1 * total_width < total_width) + else total_width + ) + + include_end = True if end_dense == total_width else False + + n_points = int( + (end_dense - (junction_depth[0] - 0.1 * total_width)) + / minimum_spacing + ) + + mesh_dense = np.linspace( + junction_depth[0] - 0.1 * total_width, + end_dense, + n_points, + endpoint=include_end, + ) + + if not include_end: + n_points = int((total_width - end_dense) / maximum_spacing) + + mesh_rest = np.linspace( + end_dense, total_width, n_points, endpoint=True + ) + + mesh = np.unique( + np.concatenate( + (front, mesh_dense_front, mesh_bulk, mesh_dense, mesh_rest) + ) + ) + + else: + mesh = np.unique( + np.concatenate((front, mesh_dense_front, mesh_bulk, mesh_dense)) + ) + + junction.mesh_cm = mesh + junction.mesh = junction.mesh_cm * 1e-2 # cm to m + + +def update_mesh(junction: Junction, layer_width: list[float], options: State): + """ + Update mesh after the doping profile is known. + + :param junction: a Junction object + :param layer_width: a list of layer widths in cm + :param options: a State object containing options for the solver + """ + + total_width = np.sum(layer_width) + + # always do 1 nm spacing near front surface? + + if "minimum_spacing" in options.keys(): + minimum_spacing = options.minimum_spacing * 1e2 + + else: + minimum_spacing = total_width / 1e4 # maximum of 10000 points + + current_mesh = junction.mesh_cm + + diff_rho = np.abs(np.gradient(junction.sesame_sys.rho, current_mesh)) + + doping_change = np.where(diff_rho / np.max(diff_rho) > 1e-4)[0] + + # identify continuous stretches of high doping change, and where there are gaps: + + change_point = np.where(np.diff(doping_change) != 1)[0] + + last_points = doping_change[change_point] + first_points = doping_change[change_point + 1] + + first_points = np.insert(first_points, 0, doping_change[0]) + last_points = np.append(last_points, doping_change[-1]) + + first_x = current_mesh[first_points] + last_x = current_mesh[last_points] + + for i1 in range(len(first_points)): + # want to make mesh denser where there are large changes in doping + # print('denser mesh between', first_x[i1], last_x[i1]) + + mesh_above = current_mesh[current_mesh < first_x[i1]] + mesh_below = current_mesh[current_mesh >= last_x[i1]] + mesh_dense = np.arange( + first_x[i1], last_x[i1] - 1e-12, minimum_spacing + ) # last point not included + + current_mesh = np.unique(np.concatenate((mesh_above, mesh_dense, mesh_below))) + + junction.mesh_cm = current_mesh + junction.mesh = junction.mesh_cm * 1e-2 # cm to m + + +def get_srv(junction: Junction): + """ + Extract approriate surface recombination velocities for Sesame from a Junction object. + The labelling sn and sp in the junction object refers to the doping of the region, NOT the + carrier type. For the Sesame solver, it is also possible to specify the recombination velocities + for the carrier types separately in the defintion of the Junction as sn_e/sn_h, sp_e/sp_h, + being respectively the electron/hole SRVs in the n-type region and the electron/hole SRVs in the + p_type region. Note that the majority carrier surface recombination (sn_e and sp_h) generally + do not affect the solution. + + :param junction: a Junction object + """ + + if junction.sesame_sys.rho[junction.sesame_sys.nx - 1] < 0: + # p-type at back + polarity = "np" + + else: + polarity = "pn" + + if hasattr(junction, "sn_e"): + Sn_e = junction.sn_e * 100 + + elif hasattr(junction, "sn"): + Sn_e = junction.sn * 100 + + else: + Sn_e = 1e4 # same as Fortran PDD default (this one is in cm s-1, not m s-1 + + if hasattr(junction, "sp_e"): + Sp_e = junction.sp_e * 100 + + elif hasattr(junction, "sp"): + Sp_e = junction.sp * 100 + + else: + Sp_e = 1e4 + + if hasattr(junction, "sn_h"): + Sn_h = junction.sn_h * 100 + + elif hasattr(junction, "sn"): + Sn_h = junction.sn * 100 + + else: + Sn_h = 1e4 # is this the same as the Fortran PDD? + + if hasattr(junction, "sp_h"): + Sp_h = junction.sp_h * 100 + + elif hasattr(junction, "sp"): + Sp_h = junction.sp * 100 + + else: + Sp_h = 1e4 + + if polarity == "pn": + return Sp_e, Sp_h, Sn_e, Sn_h + + else: + return Sn_e, Sn_h, Sp_e, Sp_h + diff --git a/solcore/sesame_drift_diffusion/solve_pdd.py b/solcore/sesame_drift_diffusion/solve_pdd.py index b83ce48e..b6add5f7 100644 --- a/solcore/sesame_drift_diffusion/solve_pdd.py +++ b/solcore/sesame_drift_diffusion/solve_pdd.py @@ -1,388 +1,79 @@ +from __future__ import annotations + from sesame import Builder, IVcurve, Analyzer import numpy as np from scipy.optimize import root -from solcore.constants import q +from solcore.constants import q, kb from scipy.interpolate import interp1d from solcore.state import State +from solcore.structure import Junction, Layer +from solcore.sesame_drift_diffusion.process_structure import process_structure import warnings -from joblib import Parallel, delayed - -from solcore.registries import ( - register_iv_solver, - register_equilibrium_solver -) - -try: - import sesame - reason_to_exclude = None -except ImportError: - reason_to_exclude = ( - "Sesame was not installed." - ) - -def process_structure(junction, options): +from solcore.registries import register_iv_solver, register_equilibrium_solver +@register_equilibrium_solver("sesame_PDD") +def equilibrium(junction: Junction, + **kwargs): """ - Process the layers in the junction and convert it to a format which can be used by Sesame. This includes unit - conversions from Solcore base SI units to the units used by Sesame (eV, cm). This function also sets the mesh, - either from a user-supplied junction.mesh (in m) attribute, or by guessing an appropriate mesh depending on the - doping profile and layer thicknesses. It will also extract the doping profile, which can be supplied in - the following formats: - - - a constant value for each layer, set by the Nd or Na attribute of the material - - a doping profile for the whole junction, passed as a function which accepts a depth in the junction in m - and returns doping in m-3 - - a doping profile for each layer, passed as a function which accepts a depth in the layer in m and returns - doping in m-3 - - Combinations of the above - - Note that since we can specify a doping profile for the whole junction, the Sesame solver can support a junction - which is made up of a single layer, unlike the depletion approximation and Fortran-based PDD solvers. - - This function will add or update the following attributes in the Junction object: - - - mesh: the mesh used by the Sesame solver, in m - - mesh_cm: the mesh used by the Sesame solver, in cm - - sesame_sys: a Sesame Builder object defining the junction in Sesame format, used to solve the IV and QE - - :param junction: a Junction object - :param options: a State object containing options for the solver - - """ - - materials = [] # list of dictionaries for Sesame - layer_widths = [] # layer widths in cm - doping_profile_functions = [] # list of functions which take an argument of depth in junction in m and - # return doping in cm-3 - offset = 0 # offset relative to front of junction of the current layer in cm - - for layer in junction: - - try: - bulk_recombination_energy = layer.material.bulk_recombination_energy - - except: - bulk_recombination_energy = 0 # should this be the degau - - layer_widths.append(layer.width*1e2) # m to cm - - # this will always be set, even if the layer has a doping profile - constant_doping = layer.material.Nd / 1e6 if layer.material.Nd > layer.material.Na else -layer.material.Na /1e6 - - if hasattr(layer, "doping_profile"): - doping_profile_functions.append(lambda x: layer.doping_profile(x) / 1e6) - # function which takes an argument of depth in junction in m and returns doping in cm-3 - - else: - doping_profile_functions.append(interp1d([offset/100, offset + layer.width], - [constant_doping, constant_doping])) - # to be consistent with functions passed by user, this should be a function which takes an argument in m - # and returns doping in cm-3 - - try: - auger_electron = layer.material.electron_auger_recombination * 1e12 # m6/s to cm6/s - - except: - auger_electron = 0 - - try: - auger_hole = layer.material.hole_auger_recombination * 1e12 # m6/s to cm6/s - - except: - auger_hole = 0 - - new_mat = { - 'Nc': layer.material.Nc * 1e-6, # effective density of states at CB edge (cm-3) - 'Nv': layer.material.Nv * 1e-6, # effective density of states at VB edge (cm-3) - 'Eg': layer.material.band_gap / q, # material bandgap (eV) - 'affinity': layer.material.electron_affinity / q, # electron affinity (eV) - 'epsilon': layer.material.relative_permittivity, # relative permittivity (dimensionless) - 'mu_e': layer.material.electron_mobility*1e4, # electron mobility (cm2/(V s)) - 'mu_h': layer.material.hole_mobility*1e4, # hole mobility (cm2/(V s)) - 'tau_e': layer.material.electron_minority_lifetime, # electron bulk lifetime (s) - 'tau_h': layer.material.hole_minority_lifetime, # hole bulk lifetime (s) - 'Et': bulk_recombination_energy, # energy level of bulk recombination centres (eV) - 'B': layer.material.radiative_recombination*1e6, # radiative recombination constant (cm3/s) - 'Cn': auger_electron, # Auger recombination constant for electrons (cm6/s) - 'Cp': auger_hole, # Auger recombination constant for holes (cm6/s) - } - - offset += layer.width*1e2 - # Note: in Sesame, all of these can be functions of position as well as constants - but this is untested! - - materials.append(new_mat) - - # see if we can determine the junction depth: - - edges = np.insert(np.cumsum(layer_widths), 0, 0) # locations of interfaces between layers - edges[-1] = edges[-1] + 1e-10 # otherwise final point will not be assigned any values - - if hasattr(junction, "doping_profile"): - junction_depth = 100*root(junction.doping_profile, np.sum(layer_widths) / (2*100)).x # in cm - # this is where doping crosses zero - not necessarily the junction depth, but not sure how best to determine - # this. Maybe want to find slope of doping profile and identify locations where it is steepest? - - else: - # identify where the doping profile changes sign for constant doping layers or individual doping profiles - # per layer - doping_sign = [np.sign(doping_profile_functions[i1](edges[i1]+1e-9)) for i1 in range(len(edges) - 1)] - junction_depth = edges[np.where(np.diff(doping_sign))[0] + 1] - - if not hasattr(junction, "mesh"): - # calculate appropriate mesh (hopefully) if not supplied as input in junction.mesh - make_mesh(junction, layer_widths, options, junction_depth) - user_mesh = False - - else: - # user-provided mesh - junction.mesh_cm = junction.mesh*1e2 # m to cm - user_mesh = True - - if hasattr(junction, "doping_profile"): - doping_profile_x = junction.doping_profile(junction.mesh) / 1e6 # in cm-3 - - else: - doping_profile_x = np.zeros(len(junction.mesh_cm)) - for i1, doping_profile_fn in enumerate(doping_profile_functions): - doping_profile_x[np.all((junction.mesh_cm >= edges[i1], junction.mesh_cm < edges[i1 + 1]), axis=0)] = ( - doping_profile_fn(junction.mesh[np.all((junction.mesh_cm >= edges[i1], junction.mesh_cm < edges[i1 + 1]), axis=0)])) - - # Make Sesame Builder object for simulations - junction.sesame_sys = Builder(junction.mesh_cm, T=options.T) # Sesame system - - junction.sesame_sys.rho = doping_profile_x / junction.sesame_sys.scaling.density - - if not user_mesh: - update_mesh(junction, layer_widths, options) - - if hasattr(junction, "doping_profile"): - doping_profile_x = junction.doping_profile(junction.mesh) / 1e6 # in cm-3 - - else: - doping_profile_x = np.zeros(len(junction.mesh_cm)) - for i1, doping_profile_fn in enumerate(doping_profile_functions): - doping_profile_x[np.all((junction.mesh_cm >= edges[i1], junction.mesh_cm < edges[i1 + 1]), axis=0)] = ( - doping_profile_fn(junction.mesh[ - np.all((junction.mesh_cm >= edges[i1], junction.mesh_cm < edges[i1 + 1]), - axis=0)])) - - junction.sesame_sys = Builder(junction.mesh_cm, T=options.T) # Sesame system - - junction.sesame_sys.rho = doping_profile_x / junction.sesame_sys.scaling.density - - for i1 in range(len(junction)): - junction.sesame_sys.add_material(materials[i1], - lambda x: np.all((x >= edges[i1], x < edges[i1 + 1]), axis=0)) - - - junction.sesame_sys.contact_type('Ohmic', 'Ohmic') - # should also be able to choose other options, since Sesame can handle them - - # get surface recombination velocities - junction.sesame_sys.contact_S(*get_srv(junction)) - print('mesh points:', len(junction.mesh_cm)) - - -def make_mesh(junction, layer_width, options, junction_depth): - # want the mesh to be dense close to the front surface, where the doping is changing rapidly/at the junction, - # and where material changes happen. - # (changing from n-type to p-type). - # dense linear mesh near surface and junction - # less dense linear mesh in rest of bulk - - total_width = np.sum(layer_width) - - # always do 1 nm spacing near front surface? - - if "minimum_spacing" in options.keys(): - minimum_spacing = options.minimum_spacing*1e2 - - else: - minimum_spacing = total_width / 1e4 # maximum of 10000 points - - if "maximum_spacing" in options.keys(): - maximum_spacing = options.maximum_spacing*1e2 - - else: - maximum_spacing = total_width / 500 # minimum of 500 points - - print(minimum_spacing, maximum_spacing) - - if maximum_spacing == minimum_spacing: - mesh = np.arange(0, total_width, maximum_spacing) - - # identify location of junction. doping_profile is a function - - else: - # edges = np.insert(np.cumsum(layer_width), 0, 0) - - front_spacing = np.min([minimum_spacing, 0.5e-7]) - - dense_front_width = 50e-7 - - end_front = np.min([dense_front_width - 1e-10, total_width]) - - front = np.arange(0, end_front, front_spacing) - - # 1 nm in cm = 1e-7 - if end_front != total_width: - - if junction_depth[0] < total_width / 2: - print('front junction') - end_dense = junction_depth[0] + 0.1 * total_width if ( - junction_depth[0] + 0.1 * total_width < total_width) else total_width - - include_end = True if end_dense == total_width else False - - n_points = int((end_dense - end_front) / minimum_spacing) - mesh = np.linspace(end_front, end_dense, n_points, endpoint=include_end) - - mesh = np.concatenate((front, mesh)) - - if not include_end: - n_points = int((total_width - end_dense) / maximum_spacing) - mesh_rest = np.linspace(end_dense, total_width, n_points, endpoint=True) - - mesh = np.concatenate((mesh, mesh_rest)) - - else: - - n_points = int((0.2 * total_width- end_front) / minimum_spacing) - - mesh_dense_front = np.linspace(end_front, 0.2 * total_width, n_points, endpoint=False) - - n_points = int((junction_depth[0] - 0.3 * total_width) / maximum_spacing) - - mesh_bulk = np.linspace(0.2 * total_width, junction_depth[0] - 0.1 * total_width, n_points, endpoint=False) - - end_dense = junction_depth[0] + 0.1 * total_width if ( - - junction_depth[0] + 0.1 * total_width < total_width) else total_width - - include_end = True if end_dense == total_width else False - - n_points = int((end_dense - (junction_depth[0] - 0.1 * total_width)) / minimum_spacing) - - mesh_dense = np.linspace(junction_depth[0] - 0.1 * total_width, end_dense, n_points, endpoint=include_end) - - if not include_end: - n_points = int((total_width - end_dense) / maximum_spacing) - - mesh_rest = np.linspace(end_dense, total_width, n_points, endpoint=True) + Solve at equilibrium (no illumination, no applied voltage) using the Sesame solver. - mesh = np.unique(np.concatenate((front, mesh_dense_front, mesh_bulk, mesh_dense, mesh_rest))) + :param junction: a Junction object + :param options: a State object containing options for the solver + """ - else: - mesh = np.unique(np.concatenate((front, mesh_dense_front, mesh_bulk, mesh_dense))) + # TODO: pass output from 'result' parameter to the user, similar to the Fortran PDD solver, so that + # band structures etc. can be plotted. - junction.mesh_cm = mesh - junction.mesh = junction.mesh_cm*1e-2 # cm to m + options = State(kwargs) # needs to be passed as kwargs to be compatible with Fortran equilibrium solver + # in registries -def update_mesh(junction, layer_width, options): - - total_width = np.sum(layer_width) - - # always do 1 nm spacing near front surface? - - if "minimum_spacing" in options.keys(): - minimum_spacing = options.minimum_spacing*1e2 - - else: - minimum_spacing = total_width / 1e4 # maximum of 10000 points - - current_mesh = junction.mesh_cm - - diff_rho = np.abs(np.gradient(junction.sesame_sys.rho, current_mesh)) - - doping_change = np.where(diff_rho / np.max(diff_rho) > 1e-4)[0] - - # identify continuous stretches of high doping change, and where there are gaps: - - change_point = np.where(np.diff(doping_change) != 1)[0] - - last_points = doping_change[change_point] - first_points = doping_change[change_point + 1] - - first_points = np.insert(first_points, 0, doping_change[0]) - last_points = np.append(last_points, doping_change[-1]) - - first_x = current_mesh[first_points] - last_x = current_mesh[last_points] - - for i1 in range(len(first_points)): - # want to make mesh denser where there are large changes in doping - # print('denser mesh between', first_x[i1], last_x[i1]) - - mesh_above = current_mesh[current_mesh < first_x[i1]] - mesh_below = current_mesh[current_mesh >= last_x[i1]] - mesh_dense = np.arange(first_x[i1], last_x[i1]-1e-12, minimum_spacing) # last point not included - - current_mesh = np.unique(np.concatenate((mesh_above, mesh_dense, mesh_below))) - - junction.mesh_cm = current_mesh - junction.mesh = junction.mesh_cm*1e-2 # cm to m - -def get_srv(junction): - # Define the surface recombination velocities for electrons and holes [cm/s] - if hasattr(junction, "sn_front"): - Sn_left = junction.sn_front * 100 - - elif hasattr(junction, "sn"): - Sn_left = junction.sn * 100 - - else: - Sn_left = 1e4 # is this the same as the Fortran PDD? - - if hasattr(junction, "sp_front"): - Sp_left = junction.sp_front * 100 - - elif hasattr(junction, "sp"): - Sp_left = junction.sp * 100 - - else: - Sp_left = 1e4 - - if hasattr(junction, "sn_rear"): - Sn_right = junction.sn_rear * 100 + if not hasattr(junction, "sesame_sys"): + process_structure(junction, options) - elif hasattr(junction, "sn"): - Sn_right = junction.sn * 100 + j, result = IVcurve(junction.sesame_sys, [0]) - else: - Sn_right = 1e4 # is this the same as the Fortran PDD? + if np.any(np.isnan(j)): + warnings.warn( + "Current calculation did not converge at all voltages", UserWarning + ) - if hasattr(junction, "sp_rear"): - Sp_right = junction.sp_rear * 100 + j = j * junction.sesame_sys.scaling.current * 1e4 # cm-2 -> m-2 - elif hasattr(junction, "sp"): - Sp_right = junction.sp * 100 + junction.sesame_output = result - else: - Sp_right = 1e4 - return Sn_left, Sp_left, Sn_right, Sp_right +@register_iv_solver("sesame_PDD") +def iv_sesame(junction, options): + """ + Solve the dark or light IV using the Sesame solver. This will scan through the voltages + in options.internal_voltages and call sesame.IVcurve. If your calculation is failing to converge, + make sure your calculation includes 0 V and try scanning more voltage points or setting a denser + mesh. Note that the solver will not calculate anything at voltages > the bandgap + 10*kb*T, since + it will fail to converge for the high injection regime. -@register_equilibrium_solver("sesame_PDD", reason_to_exclude=reason_to_exclude) -def equilibrium(): - pass + :param junction: a Junction object + :param options: a State object containing options for the solver + """ -@register_iv_solver("sesame_PDD", reason_to_exclude=reason_to_exclude) -def iv_sesame(junction, options): + # TODO: pass output from 'result' parameter to the user, similar to the Fortran PDD solver, so that + # band structures etc. can be plotted. if not hasattr(junction, "sesame_sys"): process_structure(junction, options) - # gen_wl = profile_func - - if options.light_iv and np.all(junction.sesame_sys.g == 0): - - gen_wl = junction.absorbed(junction.mesh) / 100 # m-1 -> cm-1 + if options.light_iv: # and np.all(junction.sesame_sys.g == 0): + gen_wl = junction.absorbed(junction.mesh) / 100 # m-1 -> cm-1 wls = options.wavelength - gg = options.light_source.spectrum(wls, output_units="photon_flux_per_m")[1][:, None] * gen_wl.T + gg = ( + options.light_source.spectrum(wls, output_units="photon_flux_per_m")[1][ + :, None + ] + * gen_wl.T + ) - g_vs_z = np.trapz(gg, wls, axis=0) / 1e4 # m^2 -> cm^2 + g_vs_z = np.trapz(gg, wls, axis=0) / 1e4 # m^2 -> cm^2 g_vs_z[np.isnan(g_vs_z)] = 0 # can also pass a function to generation - more flexible? @@ -392,19 +83,32 @@ def iv_sesame(junction, options): R_shunt = min(junction.R_shunt, 1e14) if hasattr(junction, "R_shunt") else 1e14 - # voltages need to go from 0 (or close) to highest applied +ve or -ve voltage. Split if necessary. + max_Eg = np.max(junction.sesame_sys.Eg * junction.sesame_sys.scaling.energy) + max_V = ( + max_Eg + 10 * 8.617e-05 * options.T + ) # do not go into the high injection regime, will not get convergence + + # voltages need to go from 0 (or close) to highest applied +ve or -ve voltage, otherwise + # do not get convergence; need to go from V = 0 to high applied voltage so that Sesame can + # use the previous solution as a guess for the next voltage. - if junction.sesame_sys.rho[junction.sesame_sys.nx-1] < 0: + if junction.sesame_sys.rho[junction.sesame_sys.nx - 1] < 0: # this is necessary because Sesame will internally flip the sign for an n-p junction voltages_for_solve = -voltages if np.all(options.voltages >= 0): - warnings.warn('All voltages are positive, but junction has been identified as n-p, so the ' - 'open-circuit voltage (Voc) of the junction will be negative.', UserWarning) + warnings.warn( + "All voltages are positive, but junction has been identified as n-p, so the " + "open-circuit voltage (Voc) of the junction will be negative.", + UserWarning, + ) else: voltages_for_solve = voltages + voltages_for_solve = voltages_for_solve[voltages_for_solve <= max_V] + + warnings.filterwarnings("ignore") # split +ve and -ve voltages if necessary: if np.any(voltages_for_solve < 0): if np.any(voltages_for_solve > 0): @@ -419,31 +123,43 @@ def iv_sesame(junction, options): negative_voltages = negative_voltages[negative_voltages_order] positive_voltages = positive_voltages[positive_voltages_order] - j_positive, result_positive = sesame.IVcurve(junction.sesame_sys, positive_voltages) - j_negative, result_negative = sesame.IVcurve(junction.sesame_sys, negative_voltages) + j_positive, result_positive = IVcurve( + junction.sesame_sys, positive_voltages + ) + j_negative, result_negative = IVcurve( + junction.sesame_sys, negative_voltages + ) j_negative = j_negative[::-1] - result_positive = {key: result_positive[key][positive_voltages_order, :] for key in result_positive.keys()} - result_negative = {key: result_negative[key][negative_voltages_order, :] for key in result_negative.keys()} + result_negative = { + key: result_negative[key][::-1] + for key in result_negative.keys() + } negative_voltages = negative_voltages[::-1] if np.any(voltages_for_solve == 0): - # V = 0 would have been included in both the +ve and -ve voltages, so # exclude it from the negative voltage results when concatenating j = np.concatenate((j_negative[:-1], j_positive)) - result = {key: np.concatenate((result_negative[key][:-1], result_positive[key])) for key in - result_positive.keys()} - final_voltages = np.concatenate((negative_voltages[:-1], positive_voltages)) - + result = { + key: np.concatenate( + (result_negative[key][:-1], result_positive[key]) + ) + for key in result_positive.keys() + } + final_voltages = np.concatenate( + (negative_voltages[:-1], positive_voltages) + ) else: - j = np.concatenate((j_negative, j_positive)) - result = {key: np.concatenate((result_negative[key], result_positive[key])) for key in result_positive.keys()} + result = { + key: np.concatenate((result_negative[key], result_positive[key])) + for key in result_positive.keys() + } final_voltages = np.concatenate((negative_voltages, positive_voltages)) # this results in j and result in order of increasing values for voltages_for_solve @@ -451,21 +167,29 @@ def iv_sesame(junction, options): # negative voltages only voltage_order = np.argsort(voltages_for_solve)[::-1] final_voltages = voltages_for_solve[voltage_order] - j, result = sesame.IVcurve(junction.sesame_sys, final_voltages) + j, result = IVcurve(junction.sesame_sys, final_voltages) else: # positive voltages only voltage_order = np.argsort(voltages_for_solve) final_voltages = voltages_for_solve[voltage_order] - j, result = sesame.IVcurve(junction.sesame_sys, final_voltages) # , verbose=False) + j, result = IVcurve( + junction.sesame_sys, final_voltages + ) # , verbose=False) + + warnings.resetwarnings() + + if np.any(np.isnan(j)): + warnings.warn( + "Current calculation did not converge at all voltages", UserWarning + ) # final_voltages are the voltages corresponding to the entries in j and result, USING # Sesame's sign convention. So if the voltage sign was flipped above, need to flip it back # for Solcore if junction.sesame_sys.rho[junction.sesame_sys.nx - 1] < 0: - print('flipping back') result_voltage = -final_voltages sort_result = np.argsort(result_voltage) j = j[sort_result] @@ -475,24 +199,47 @@ def iv_sesame(junction, options): else: result_voltage = final_voltages - j = j * junction.sesame_sys.scaling.current * 1e4 # cm-2 -> m-2 + j = j * junction.sesame_sys.scaling.current * 1e4 # cm-2 -> m-2 + + shunted_current = j + result_voltage / R_shunt + + non_nans = np.where(~np.isnan(shunted_current))[0] - junction.current = j + result_voltage / R_shunt + if len(non_nans) > 0: + # may be NaNs in j - find values closest to edge which are not NaN: + first_non_nan = shunted_current[non_nans[0]] + last_non_nan = shunted_current[non_nans[-1]] - # current_increasing = j[voltage_increasing] + else: + Exception( + "No solutions found for IV curve. Try increasing the number of voltage points scanned." + ) + + junction.sesame_output = result junction.iv = interp1d( - result_voltage, - junction.current, + result_voltage[non_nans], + shunted_current[non_nans], kind="linear", bounds_error=False, assume_sorted=True, - fill_value=(j[0], j[-1]), + fill_value=(first_non_nan, last_non_nan), ) - junction.voltage = result_voltage + junction.voltage = options.internal_voltages + junction.current = junction.iv(options.internal_voltages) + junction.pdd_output = process_sesame_results(junction.sesame_sys, result) + + +def qe_sesame(junction: Junction, options: State): + """ + Calculate the quantum efficiency of a junction using Sesame. This will scan through the wavelengths + set in options.wavelength. It will scan from long wavelengths to short wavelengths, to improve + the chance of convergence, since carrier generation profiles will be less steep at longer wavelengths. -def qe_sesame(junction, options): + :param junction: a Junction object + :param options: a State object containing options for the solver + """ if not hasattr(junction, "sesame_sys"): process_structure(junction, options) @@ -501,7 +248,7 @@ def qe_sesame(junction, options): # # else: # n_jobs = options.n_jobs if hasattr(options, "n_jobs") else -1 - n_jobs = 1 + # n_jobs = 1 # parallel implementation does not work due to pickling error. Unsure of cause. wls = options.wavelength @@ -509,48 +256,86 @@ def qe_sesame(junction, options): voltages = [0] # profile_func = interp1d(bulk_positions_cm, 1e7 * Si_profile, kind='linear', bounds_error=False, fill_value=0) - profile_func = junction.absorbed # this returns an array of shape (mesh_points, wavelengths) + profile_func = ( + junction.absorbed + ) # this returns an array of shape (mesh_points, wavelengths) A = np.trapz(junction.absorbed(junction.mesh), junction.mesh, axis=0) def make_gfcn_fun(wl_index, flux): def gcfn_fun(x, y): - return flux * profile_func(x / 100)[wl_index] / 100 # convert to cm-1 from m-1 + return ( + flux * profile_func(np.array([x / 100]))[0, wl_index] / 100 + ) # convert to cm-1 from m-1 return gcfn_fun + # def qe_i(i1): + # + # junction.sesame_sys.generation(make_gfcn_fun(i1, flux)) + # + # j, result = IVcurve(junction.sesame_sys, voltages) + # + # eqe = np.abs(j) / (q * flux) + # + # return eqe, result + # + # allres = Parallel(n_jobs=n_jobs)( + # delayed(qe_i)( + # i1, + # ) + # for i1 in range(len(wls)) + # ) + # + # eqe = np.concatenate([item[0] for item in allres]) + # + # efn = np.concatenate([item[1]['efn'] for item in allres]) + # efp = np.concatenate([item[1]['efp'] for item in allres]) + # vres = np.concatenate([item[1]['v'] for item in allres]) + flux = 1e20 - # for i1, wl in enumerate(wls): + eqe = np.zeros_like(wls) + + # do not solve EQE if absorption is ~ 0 + + EQE_threshold = 1e-5 + + wl_solve = np.where(A >= EQE_threshold)[0][::-1] + # go in backwards order through wavelengths - since generation profile tends to be flatter at longer wavelengths, + # this increases the change of convergence, since the solution for the previous wavelength is always used as a guess + # for the next wavelength. Gaving a good guess helps the short wavelength solutions converge - def qe_i(i1): + warnings.filterwarnings("ignore") + # this is to prevent warning from Sesame flooding the output. Not ideal but unsure on best way to solve. + for i1 in wl_solve: junction.sesame_sys.generation(make_gfcn_fun(i1, flux)) - j, result = sesame.IVcurve(junction.sesame_sys, voltages) + if i1 == wl_solve[0]: + guess = None - eqe = np.abs(j) / (q * flux) + else: + guess = {key: result[key][0, :] for key in result.keys()} - return eqe, result + j, result = IVcurve(junction.sesame_sys, voltages, guess=guess) - allres = Parallel(n_jobs=n_jobs)( - delayed(qe_i)( - i1, - ) - for i1 in range(len(wls)) - ) + eqe[i1] = np.abs(j) / (q * flux) - eqe = np.concatenate([item[0] for item in allres]) + if np.any(np.isnan(eqe)): + warnings.warn( + "EQE calculation did not converge at all wavelengths", UserWarning + ) - efn = np.concatenate([item[1]['efn'] for item in allres]) - efp = np.concatenate([item[1]['efp'] for item in allres]) - vres = np.concatenate([item[1]['v'] for item in allres]) + warnings.resetwarnings() eqe = eqe * junction.sesame_sys.scaling.current - iqe = eqe / A + iqe = np.divide(eqe, A, out=np.zeros_like(eqe), where=A > 0) + + # line = ((0, 0), (np.max(junction.mesh_cm), 0)) + # scale_sesame_result(junction.sesame_sys, result, line) # convert dimensionless current to dimension-ful current - # iqe = iqe * junction.sesame_sys.scaling.current junction.iqe = interp1d(wls, iqe) @@ -563,14 +348,73 @@ def qe_i(i1): fill_value=(eqe[0], eqe[-1]), ) - junction.qe = State( - { - "WL": wls, - "IQE": junction.iqe(wls), - "EQE": junction.eqe(wls), - } - ) + junction.qe = State({"WL": wls, "IQE": junction.iqe(wls), "EQE": junction.eqe(wls)}) +def process_sesame_results(sys: Builder, result: dict): + """ + Scale the result of a Sesame calculation to SI units, and calculate other quantities like + the positions of the conduction and valence band and the recombination rates. Produces a + State object with entries: + + - potential: the potential (V) + - n: the electron density (m\ :sup:`-3`) + - p: the hole density (m\ :sup:`-3`) + - Ec: the level of the conduction band (eV) + - Ev the level of the valence band (eV) + - Efe: the electron quasi-Fermi level (eV) + - Efh the hole quasi-Fermi level (eV) + - Rrad: the radiative recombination rate (m\ :sup:`-3` s\ :sup:`-1`) + - Raug: the Auger recombination rate (m\ :sup:`-3` s\ :sup:`-1`) + - Rsrh: the bulk recombination due to Shockley-Read-Hall processes (m\ :sup:`-3` s\ :sup:`-1`) + +Each of these is a 2-dimensional array, with dimensions ``(len(options.internal_voltages), len(mesh))``. + + + :param sys: a Sesame Builder object + :param result: a dictionary containing the results from a Sesame calculation + """ + + line = ((0, 0), (np.max(sys.xpts), 0)) + n_voltages = len(result["v"]) + + potential = result['v'] * sys.scaling.energy + Efe = result['efn'] * sys.scaling.energy + Efh = result['efp'] * sys.scaling.energy + Ec = -(result['v'] + sys.bl) * sys.scaling.energy + Ev = -(result['v'] + sys.bl + sys.Eg) * sys.scaling.energy + + n = np.zeros((n_voltages, sys.nx)) + p = np.zeros((n_voltages, sys.nx)) + + Rrad = np.zeros((n_voltages, sys.nx)) + Raug = np.zeros((n_voltages, sys.nx)) + Rsrh = np.zeros((n_voltages, sys.nx)) + + for i1 in range(n_voltages): + result_loop = {key: result[key][i1, :] for key in result.keys()} + + analyzer = Analyzer(sys, result_loop) + + n[i1] = analyzer.electron_density(location=line) * sys.scaling.density * 1e6 # m-3 + p[i1] = analyzer.hole_density(location=line) * sys.scaling.density * 1e6 # m-3 + + Rsrh[i1] = analyzer.bulk_srh_rr(location=line) * sys.scaling.generation * 1e6 # m-3 + Raug[i1] = analyzer.auger_rr(location=line) * sys.scaling.generation * 1e6 # m-3 + Rrad[i1] = analyzer.radiative_rr(location=line) * sys.scaling.generation * 1e6 # m-3 + + output = State( + potential=potential, + Efe=Efe, + Efh=Efh, + Ec=Ec, + Ev=Ev, + n=n, + p=p, + Rrad=Rrad, + Raug=Raug, + Rsrh=Rsrh, + ) + return output diff --git a/tests/test_depletion_approximation.py b/tests/test_depletion_approximation.py index 995ce29c..f47babea 100644 --- a/tests/test_depletion_approximation.py +++ b/tests/test_depletion_approximation.py @@ -31,12 +31,16 @@ def test_get_j_dark(): w = wn + wp + xi + arg = (x - w) / L + + arg[arg > 200] = 200 + expected = ( (q * d * minor / L) * (np.exp(q * V / (kb * T)) - 1) * ( - (((s * L) / d) * np.cosh((x - w) / L) + np.sinh((x - w) / L)) - / (((s * L) / d) * np.sinh((x - w) / L) + np.cosh((x - w) / L)) + (((s * L) / d) * np.cosh(arg) + np.sinh(arg)) + / (((s * L) / d) * np.sinh(arg) + np.cosh(arg)) ) ) diff --git a/tests/test_examples.py b/tests/test_examples.py index cfd6ab52..ed782158 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -51,6 +51,8 @@ def test_example_scripts(example, examples_directory): skip("No SMARTS solver found.") elif b"RCWASolverError" in process.stderr: skip("No RCWA solver found.") + elif b"FigureCanvasAgg" in process.stderr: + skip("Plotting issue due to non-interactive Agg backend.") elif process.stderr != b"": raise Exception(process.stderr.decode()) @@ -82,5 +84,7 @@ def test_example_notebooks(example, examples_directory): skip("No SMARTS solver found.") elif b"RCWASolverError" in process.stderr: skip("No RCWA solver found.") + elif b"FigureCanvasAgg" in process.stderr: + skip("Plotting issue due to non-interactive Agg backend.") elif process.stderr != b"": raise Exception(process.stderr.decode()) diff --git a/tests/test_optics.py b/tests/test_optics.py index e34a0379..008657f7 100644 --- a/tests/test_optics.py +++ b/tests/test_optics.py @@ -126,9 +126,9 @@ def test_pol_rcwa(): rat_output_A=A_output_p, parallel=True, steps_size=step_size, pol='p') - assert np.mean(A_output_u, 1) == approx(0.5*(A_output_p + A_output_s)) + assert np.mean(A_output_u, 1) == approx(0.5*(A_output_p + A_output_s), rel=1e-4) - assert result_u["absorption"] == approx(0.5*(result_s["absorption"] + result_p["absorption"])) + assert result_u["absorption"] == approx(0.5*(result_s["absorption"] + result_p["absorption"]), rel=1e-4) @mark.skipif(skip_s4_test(), reason="Only works if S4 installed") @@ -176,7 +176,7 @@ def test_arbitrary_pol_rcwa(): assert A_output == approx(A_output_s) - assert result["absorption"] == approx(result_s["absorption"]) + assert result["absorption"] == approx(result_s["absorption"], rel=1e-4) @mark.skipif(skip_s4_test(), reason="Only works if S4 installed") diff --git a/tests/test_sesame_pdd.py b/tests/test_sesame_pdd.py index fe94cd1d..bc6f8a49 100644 --- a/tests/test_sesame_pdd.py +++ b/tests/test_sesame_pdd.py @@ -1,11 +1,11 @@ import numpy as np -from pytest import approx +from pytest import approx, raises def test_constant_doping(): # test sesame PDD process_structure when constant doping levels are passed from solcore import material, si from solcore.structure import Junction, Layer - from solcore.sesame_drift_diffusion.solve_pdd import process_structure + from solcore.sesame_drift_diffusion.process_structure import process_structure from solcore.state import State Si_n = material('Si')(Nd=1e24, electron_minority_lifetime=1e-6, hole_minority_lifetime=1e-7) @@ -27,28 +27,108 @@ def test_constant_doping(): assert sesame_obj.rho[0] == 1e24*1e-6/sesame_obj.scaling.density assert sesame_obj.rho[-1] == -2e24*1e-6/sesame_obj.scaling.density - pass -def test_layer_doping_profile(): - # test process_structure when a doping profile is passed for one of the layers - pass +def test_doping_profile(): + # test process_structure when a doping profile is passed for one of the layers, + # or to the whole junction + from solcore import material, si + from solcore.structure import Junction, Layer + from solcore.sesame_drift_diffusion.process_structure import process_structure + from solcore.state import State + from scipy.interpolate import interp1d + + Si_n = material('Si')(Nd=1e25, electron_minority_lifetime=1e-6, hole_minority_lifetime=1e-7) + Si_i = material('Si')(electron_minority_lifetime=2e-6, hole_minority_lifetime=2e-7) + Si_p = material('Si')(Na=2e24, electron_minority_lifetime=1.5e-6, hole_minority_lifetime=1.5e-7) + + doping_profile = np.linspace(Si_n.Nd, -Si_p.Na, 2000) + x_pos = np.linspace(0, 2000, 2000) * 1e-9 + doping_profile_func = interp1d(x_pos, doping_profile, fill_value=(Si_n.Nd, -Si_p.Na), bounds_error=False) + + junction = Junction([Layer(si('200nm'), Si_n), + Layer(si('2000nm'), Si_i, doping_profile=doping_profile_func), + Layer(si('2000nm'), Si_p)]) + + options = State() + options.T = 300 + + process_structure(junction, options) -def test_junction_doping_profile(): - # test process_structure when a doping profile is passed for the whole junction - pass + rho_1 = interp1d(junction.mesh, junction.sesame_sys.rho) + + x_pos_2 = np.linspace(200, 2200, 2000) * 1e-9 + doping_profile_func = interp1d(x_pos_2, doping_profile, fill_value=(Si_n.Nd, -Si_p.Na), bounds_error=False) + + junction = Junction([Layer(si('200nm'), Si_n), + Layer(si('2000nm'), Si_i), + Layer(si('2000nm'), Si_p)], doping_profile=doping_profile_func) + + process_structure(junction, options) + + rho_2 = interp1d(junction.mesh, junction.sesame_sys.rho) + + assert np.allclose(rho_1(junction.mesh), rho_2(junction.mesh)) def test_parameter_extraction(): # test all material parameters are correctly extracted by process_structure - pass + from solcore.sesame_drift_diffusion.process_structure import get_material_parameters + from solcore import material + from solcore.constants import q, kb + + test_mat = material('Si')(Nd=1e24, Na=2e24) + + with raises(ValueError) as excinfo: + get_material_parameters(test_mat) + assert excinfo.match("nor in calculable parameters") + + test_mat.hole_diffusion_length, test_mat.electron_diffusion_length = 100e-9, 200e-9 + + expected_tau_e = (q * test_mat.electron_diffusion_length ** 2 / + (kb * test_mat.T * test_mat.electron_mobility)) + expected_tau_h = (q * test_mat.hole_diffusion_length ** 2 / + (kb * test_mat.T * test_mat.hole_mobility)) + + result = get_material_parameters(test_mat) + + expected_dict = { + "Nc": test_mat.Nc * 1e-6, + "Nv": test_mat.Nv * 1e-6, + "Eg": test_mat.band_gap / q, + "affinity": test_mat.electron_affinity / q, + "epsilon": test_mat.relative_permittivity, + "mu_e": test_mat.electron_mobility * 1e4, + "mu_h": test_mat.hole_mobility * 1e4, + "tau_e": expected_tau_e, + "tau_h": expected_tau_h, # hole bulk lifetime (s) + "Et": 0, # energy level of bulk recombination centres (eV) + "B": test_mat.radiative_recombination * 1e6, + # radiative recombination constant (cm3/s) + "Cn": test_mat.electron_auger_recombination * 1e12, + # Auger recombination constant for electrons (cm6/s) + "Cp": test_mat.hole_auger_recombination * 1e12, + # Auger recombination constant for holes (cm6/s) + } -def test_dark_IV(): - pass + assert result == expected_dict -def test_light_IV(): - pass + test_mat.electron_minority_lifetime = 1e-6 + test_mat.hole_minority_lifetime = 1e-5 + + expected_dict["tau_e"] = 1e-6 + expected_dict["tau_h"] = 1e-5 + + result = get_material_parameters(test_mat) + + assert result == expected_dict + + test_mat.bulk_recombination_energy = 0.5 + + expected_dict["Et"] = test_mat.bulk_recombination_energy / q + + result = get_material_parameters(test_mat) + + assert result == expected_dict -def test_multijunction_IV(): - pass def test_compare_DA_np(): @@ -56,7 +136,8 @@ def test_compare_DA_np(): from solcore.structure import Junction, Layer from solcore.solar_cell_solver import solar_cell_solver, SolarCell from solcore.analytic_solar_cells import iv_depletion - from solcore.sesame_drift_diffusion import iv_sesame + from solcore.sesame_drift_diffusion.solve_pdd import iv_sesame + from solcore.sesame_drift_diffusion.process_structure import carrier_constants from solcore.state import State from solcore.light_source import LightSource @@ -65,6 +146,9 @@ def test_compare_DA_np(): GaAs_p = material('GaAs')(T=300, Na=1e24, hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + GaAs_p.electron_diffusion_length = carrier_constants("electron_diffusion_length", GaAs_p) + GaAs_n.hole_diffusion_length = carrier_constants("hole_diffusion_length", GaAs_n) + options = State() options.wavelength = np.linspace(300, 950, 100)*1e-9 options.voltages = np.linspace(-1.3, 0.5, 30) @@ -77,18 +161,18 @@ def test_compare_DA_np(): mesh = np.linspace(0, 2200, 500)*1e-9 - pn_junction = Junction([Layer(si('200nm'), GaAs_n, role='emitter'), Layer(si('2000nm'), GaAs_p, role='base')], - kind='DA', R_shunt=0.1, mesh=mesh) + np_junction = Junction([Layer(si('200nm'), GaAs_n, role='emitter'), Layer(si('2000nm'), GaAs_p, role='base')], + kind='DA', R_shunt=0.1, mesh=mesh, sn=10, sp=10) - solar_cell_solver(SolarCell([pn_junction]), 'optics', options) + solar_cell_solver(SolarCell([np_junction]), 'optics', options) - iv_depletion(pn_junction, options) - depletion_current = pn_junction.current - depletion_current_interp = pn_junction.iv(options.voltages) + iv_depletion(np_junction, options) + depletion_current = np_junction.current + depletion_current_interp = np_junction.iv(options.voltages) - iv_sesame(pn_junction, options) - sesame_current = pn_junction.current - sesame_current_interp = pn_junction.iv(options.voltages) + iv_sesame(np_junction, options) + sesame_current = np_junction.current + sesame_current_interp = np_junction.iv(options.voltages) assert depletion_current[-1] == approx(sesame_current[-1], rel=0.05) assert np.sign(depletion_current[0]) == np.sign(sesame_current[0]) @@ -105,15 +189,19 @@ def test_compare_DA_pn(): from solcore.structure import Junction, Layer from solcore.solar_cell_solver import solar_cell_solver, SolarCell from solcore.analytic_solar_cells import iv_depletion - from solcore.sesame_drift_diffusion import iv_sesame + from solcore.sesame_drift_diffusion.solve_pdd import iv_sesame + from solcore.sesame_drift_diffusion.process_structure import carrier_constants from solcore.state import State from solcore.light_source import LightSource - GaAs_n = material('GaAs')(T=300, Na=1e24, + GaAs_p = material('GaAs')(T=300, Na=1e24, hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) - GaAs_p = material('GaAs')(T=300, Nd=1e24, + GaAs_n = material('GaAs')(T=300, Nd=1e24, hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + GaAs_p.electron_diffusion_length = carrier_constants("electron_diffusion_length", GaAs_p) + GaAs_n.hole_diffusion_length = carrier_constants("hole_diffusion_length", GaAs_n) + options = State() options.wavelength = np.linspace(300, 950, 100)*1e-9 options.voltages = np.linspace(-0.5, 1.3, 30) @@ -126,7 +214,7 @@ def test_compare_DA_pn(): mesh = np.linspace(0, 2200, 500)*1e-9 - pn_junction = Junction([Layer(si('200nm'), GaAs_n, role='emitter'), Layer(si('2000nm'), GaAs_p, role='base')], + pn_junction = Junction([Layer(si('200nm'), GaAs_p, role='emitter'), Layer(si('2000nm'), GaAs_n, role='base')], kind='DA', R_shunt=0.1, mesh=mesh) solar_cell_solver(SolarCell([pn_junction]), 'optics', options) @@ -146,3 +234,281 @@ def test_compare_DA_pn(): assert np.sign(depletion_current_interp[-1]) == np.sign(sesame_current_interp[-1]) assert np.all(sesame_current == sesame_current_interp) + + +def test_qe(): + + from solcore import material, si + from solcore.structure import Junction, Layer + from solcore.solar_cell_solver import solar_cell_solver, SolarCell + from solcore.analytic_solar_cells import qe_depletion + from solcore.sesame_drift_diffusion.solve_pdd import qe_sesame + from solcore.sesame_drift_diffusion.process_structure import carrier_constants + from solcore.state import State + + GaAs_p = material('GaAs')(T=300, Na=1e24, + hole_minority_lifetime=1e-6, + electron_minority_lifetime=1e-6) + GaAs_n = material('GaAs')(T=300, Nd=1e24, + hole_minority_lifetime=1e-6, + electron_minority_lifetime=1e-6) + + GaAs_p.electron_diffusion_length = carrier_constants("electron_diffusion_length", GaAs_p) + GaAs_n.hole_diffusion_length = carrier_constants("hole_diffusion_length", GaAs_n) + + wls = np.linspace(300, 950, 100)*1e-9 + options = State() + options.wavelength = wls + options.T = 300 + options.light_iv = True + options.da_mode = 'green' + options.optics_method = 'BL' + + mesh = np.linspace(0, 2500, 1000) * 1e-9 + + pn_junction = Junction([Layer(si('500nm'), GaAs_p, role='emitter'), + Layer(si('2000nm'), GaAs_n, role='base')], + kind='DA', R_shunt=0.1, mesh=mesh, + sn=1e5, sp=1e5) + + solar_cell_solver(SolarCell([pn_junction]), 'optics', options) + + qe_sesame(pn_junction, options) + + sesame_EQE = pn_junction.eqe(wls) + sesame_IQE = pn_junction.iqe(wls) + + qe_depletion(pn_junction, options) + depletion_EQE = pn_junction.eqe(wls) + depletion_IQE = pn_junction.iqe(wls) + + assert sesame_EQE == approx(depletion_EQE, rel=0.1) + assert sesame_IQE == approx(depletion_IQE, rel=0.1) + + +def test_mesh_generation(): + from solcore.sesame_drift_diffusion.process_structure import make_mesh + from solcore import material, si + from solcore.structure import Junction, Layer + from solcore.state import State + + GaAs_n = material('GaAs')() + GaAs_p = material('GaAs')() + + options = State(minimum_spacing=1e-9, maximum_spacing=1e-9) + + pn_junction = Junction([Layer(si('500nm'), GaAs_n), + Layer(si('2000nm'), GaAs_p)]) + + layer_width = [layer.width*1e2 for layer in pn_junction] + + make_mesh(pn_junction, layer_width, options, [500e-7]) + + assert pn_junction.mesh == approx(np.arange(0, 2500.01, 1)*1e-9) + + +def test_get_srv_np(np_junction): + from solcore.sesame_drift_diffusion.process_structure import get_srv, process_structure + from solcore import material, si + from solcore.structure import Junction, Layer + from solcore.state import State + + options = State(T=300) + + GaAs_n = material('GaAs')(T=300, Nd=1e24, + hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + GaAs_p = material('GaAs')(T=300, Na=1e24, + hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + + junction = Junction([Layer(si('200nm'), GaAs_n, role='emitter'), Layer(si('2000nm'), GaAs_p, role='base')]) + + junction.sn = 5 + junction.sp = 8 + + process_structure(junction, options) + + Sfront_e, Sfront_h, Sback_e, Sback_h = get_srv(junction) + + assert Sfront_e == junction.sn*100 + assert Sfront_h == junction.sn*100 + + assert Sback_e == junction.sp*100 + assert Sback_e == junction.sp*100 + + junction.sn_e = 2 + junction.sn_h = 3 + junction.sp_e = 4 + junction.sp_h = 5 + + Sfront_e, Sfront_h, Sback_e, Sback_h = get_srv(junction) + + assert Sfront_e == junction.sn_e*100 + assert Sfront_h == junction.sn_h*100 + + assert Sback_e == junction.sp_e*100 + assert Sback_h == junction.sp_h*100 + +def test_get_srv_pn(np_junction): + from solcore.sesame_drift_diffusion.process_structure import get_srv, process_structure + from solcore import material, si + from solcore.structure import Junction, Layer + from solcore.state import State + + options = State(T=300) + + GaAs_p = material('GaAs')(T=300, Na=1e24, + hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + GaAs_n = material('GaAs')(T=300, Nd=1e24, + hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + + junction = Junction([Layer(si('200nm'), GaAs_p, role='emitter'), Layer(si('2000nm'), GaAs_n, role='base')]) + + junction.sn = 5 + junction.sp = 8 + + process_structure(junction, options) + + Sfront_e, Sfront_h, Sback_e, Sback_h = get_srv(junction) + + assert Sfront_e == junction.sp*100 + assert Sfront_h == junction.sp*100 + + assert Sback_e == junction.sn*100 + assert Sback_e == junction.sn*100 + + junction.sn_e = 2 + junction.sn_h = 3 + junction.sp_e = 4 + junction.sp_h = 5 + + Sfront_e, Sfront_h, Sback_e, Sback_h = get_srv(junction) + + assert Sfront_e == junction.sp_e*100 + assert Sfront_h == junction.sp_h*100 + + assert Sback_e == junction.sn_e*100 + assert Sback_h == junction.sn_h*100 + +def test_voltages_np(): + from solcore import material, si + from solcore.structure import Junction, Layer + from solcore.solar_cell_solver import solar_cell_solver, SolarCell + from solcore.sesame_drift_diffusion import iv_sesame + from solcore.state import State + from solcore.light_source import LightSource + + GaAs_n = material('GaAs')(T=300, Nd=1e24, + hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + GaAs_p = material('GaAs')(T=300, Na=1e24, + hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + + options = State() + options.wavelength = np.linspace(300, 950, 100)*1e-9 + options.T = 300 + options.light_iv = True + options.light_source = LightSource(source_type='standard', version='AM1.5g', x=options.wavelength, output_units='photon_flux_per_m') + options.optics_method = 'TMM' + + np_junction = Junction([Layer(si('200nm'), GaAs_n, role='emitter'), Layer(si('2000nm'), GaAs_p, role='base')], + kind='sesame_PDD') + + solar_cell_solver(SolarCell([np_junction]), 'optics', options) + + voltage_end = [0, 1.3, 1.3] + voltage_points = [20, 41, 40] + + interp_voltages = np.linspace(-1, 0, 10) + + interp_results = np.zeros((len(voltage_end), len(interp_voltages))) + + for i, V_end in enumerate(voltage_end): + options.voltages = np.linspace(-1.3, V_end, voltage_points[i]) + options.internal_voltages = np.linspace(-1.3, V_end, voltage_points[i]) + + iv_sesame(np_junction, options) + + interp_results[i] = np_junction.iv(interp_voltages) + + assert interp_results[0] == approx(interp_results[1], rel=0.02) + assert interp_results[1] == approx(interp_results[2], rel=0.02) + + +def test_voltages_pn(): + from solcore import material, si + from solcore.structure import Junction, Layer + from solcore.solar_cell_solver import solar_cell_solver, SolarCell + from solcore.sesame_drift_diffusion import iv_sesame + from solcore.state import State + from solcore.light_source import LightSource + + GaAs_p = material('GaAs')(T=300, Na=1e24, + hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + GaAs_n = material('GaAs')(T=300, Nd=1e24, + hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + + options = State() + options.wavelength = np.linspace(300, 950, 100)*1e-9 + options.T = 300 + options.light_iv = True + options.light_source = LightSource(source_type='standard', version='AM1.5g', x=options.wavelength, output_units='photon_flux_per_m') + options.optics_method = 'TMM' + + pn_junction = Junction([Layer(si('200nm'), GaAs_p, role='emitter'), Layer(si('2000nm'), GaAs_n, role='base')], + kind='sesame_PDD') + + solar_cell_solver(SolarCell([pn_junction]), 'optics', options) + + voltage_start = [0, -1.3, -1.3] + voltage_points = [20, 41, 40] + + interp_voltages = np.linspace(0, 1, 10) + + interp_results = np.zeros((len(voltage_start), len(interp_voltages))) + + for i, V_start in enumerate(voltage_start): + options.voltages = np.linspace(V_start, 1.3, voltage_points[i]) + options.internal_voltages = np.linspace(V_start, 1.3, voltage_points[i]) + + iv_sesame(pn_junction, options) + + interp_results[i] = pn_junction.iv(interp_voltages) + + assert interp_results[0] == approx(interp_results[1], rel=0.02) + assert interp_results[1] == approx(interp_results[2], rel=0.02) + + +def test_reverse_bias(): + from solcore import material, si + from solcore.structure import Junction, Layer + from solcore.solar_cell_solver import solar_cell_solver, SolarCell + from solcore.sesame_drift_diffusion import iv_sesame + from solcore.state import State + from solcore.light_source import LightSource + + GaAs_n = material('GaAs')(T=300, Nd=1e24, + hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + GaAs_p = material('GaAs')(T=300, Na=1e24, + hole_minority_lifetime=1e-6, electron_minority_lifetime=1e-6) + + options = State() + options.wavelength = np.linspace(300, 950, 100)*1e-9 + options.T = 300 + options.light_iv = True + options.light_source = LightSource(source_type='standard', version='AM1.5g', x=options.wavelength, output_units='photon_flux_per_m') + options.optics_method = 'TMM' + + np_junction = Junction([Layer(si('200nm'), GaAs_n, role='emitter'), Layer(si('2000nm'), GaAs_p, role='base')], + kind='sesame_PDD') + + solar_cell_solver(SolarCell([np_junction]), 'optics', options) + options.voltages = np.linspace(0, 1.3, 10) + options.internal_voltages = options.voltages + + iv_sesame(np_junction, options) + + # this is reverse bias for an n-p junction, so check that all currents are > 0: + + assert np.all(np_junction.current > 0) + assert np.all(np_junction.iv(options.voltages) > 0) + +