From 884523efc56b4f0c8a2bf6e664b4855e8a91b878 Mon Sep 17 00:00:00 2001 From: Brown <2mx@ornl.gov> Date: Fri, 14 Feb 2020 11:15:56 -0500 Subject: [PATCH] Moved ssm folder from f77 to f90 Change ssm from f77 to f90, and implement capture yield corrections into the new C++ code. --- docs/glossary.md | 5 + docs/tex/figures/rmatrix_exit_channel.pdf | Bin 0 -> 22742 bytes docs/tex/figures/rmatrix_inc_channel.pdf | Bin 0 -> 15335 bytes docs/tex/figures/rmatrix_interior_region.pdf | Bin 0 -> 37043 bytes docs/tex/sammy_main.tex | 1 - docs/tex/scattering-theory.tex | 63 +- sammy/PackagesList.cmake | 1 + sammy/script/options_sammy_packages.cmake | 1 + sammy/src/blk/CapYCorrections_common.f90 | 12 + sammy/src/blk/Logic_ssm_common.f90 | 23 +- sammy/src/convolution/CMakeLists.txt | 17 +- sammy/src/convolution/CapYieldCorrections.cpp | 134 +++ sammy/src/convolution/CapYieldCorrections.h | 59 +- .../src/convolution/cmake/Dependencies.cmake | 8 + .../cix/CapYieldCorrections.cpp2f.xml | 24 + .../cpp/CapYieldCorrectionsInterface.cpp | 31 + .../cpp/CapYieldCorrectionsInterface.h | 23 + .../fortran/CapYieldCorrections_I.f90 | 43 + .../fortran/CapYieldCorrections_M.f90 | 52 ++ sammy/src/convolution/tests/CMakeLists.txt | 3 + .../tests/CapYieldCorrectionsTest.cpp | 359 ++++++++ sammy/src/mso/mmso0.f | 1 + sammy/src/mso/mmso2.f | 3 + sammy/src/mso/mmso5.f | 1 + sammy/src/sam/msam.F | 1 + sammy/src/sam012/CMakeLists.txt | 2 +- sammy/src/sammy/CMakeLists.txt | 49 +- sammy/src/sammy/cmake/Dependencies.cmake | 2 +- sammy/src/ssm/{m012.f => m012.f90} | 43 +- sammy/src/ssm/{mssm00.f => mssm00.f90} | 208 ++--- sammy/src/ssm/{mssm01.f => mssm01.f90} | 240 +++--- sammy/src/ssm/mssm02.f | 316 ------- sammy/src/ssm/mssm02.f90 | 129 +++ sammy/src/ssm/{mssm03.f => mssm03.f90} | 782 ++++++++--------- sammy/src/ssm/{mssm04.f => mssm04.f90} | 789 +++++++++--------- sammy/src/ssm/{mssm05.f => mssm05.f90} | 504 ++++++----- sammy/src/ssm/{mssm06.f => mssm06.f90} | 530 ++++++------ sammy/src/ssm/{mssm07.f => mssm07.f90} | 581 +++++++------ sammy/src/ssm/{mssm08.f => mssm08.f90} | 588 +++++++------ sammy/src/ssm/{mssm09.f => mssm09.f90} | 315 +++---- sammy/src/ssm/{mssm10.f => mssm10.f90} | 182 ++-- sammy/src/ssm/{mssm11.f => mssm11.f90} | 352 ++++---- sammy/src/ssm/{mssm12.f => mssm12.f90} | 231 ++--- sammy/src/ssm/{mssm13.f => mssm13.f90} | 258 +++--- sammy/src/ssm/{mssm14.f => mssm14.f90} | 533 ++++++------ sammy/src/ssm/{mssm15.f => mssm15.f90} | 110 +-- sammy/src/ssm/{mssm16.f => mssm16.f90} | 300 +++---- sammy/src/ssm/{mssm17.f => mssm17.f90} | 238 +++--- sammy/src/ssm/{mssm18.f => mssm18.f90} | 246 +++--- sammy/src/ssm/mssm19.f | 160 ---- sammy/src/ssm/mssm19.f90 | 158 ++++ sammy/src/ssm/{mssm20.f => mssm20.f90} | 320 ++++--- sammy/src/ssm/{mssm21.f => mssm21.f90} | 230 ++--- sammy/src/ssm/mssm21a.f | 146 ---- sammy/src/ssm/{mssm22.f => mssm22.f90} | 64 +- sammy/src/ssm/ssm_utils.f90 | 203 +++++ 56 files changed, 5195 insertions(+), 4479 deletions(-) create mode 100644 docs/tex/figures/rmatrix_exit_channel.pdf create mode 100644 docs/tex/figures/rmatrix_inc_channel.pdf create mode 100644 docs/tex/figures/rmatrix_interior_region.pdf create mode 100644 sammy/src/blk/CapYCorrections_common.f90 create mode 100644 sammy/src/convolution/CapYieldCorrections.cpp create mode 100644 sammy/src/convolution/cmake/Dependencies.cmake create mode 100644 sammy/src/convolution/interface/cix/CapYieldCorrections.cpp2f.xml create mode 100644 sammy/src/convolution/interface/cpp/CapYieldCorrectionsInterface.cpp create mode 100644 sammy/src/convolution/interface/cpp/CapYieldCorrectionsInterface.h create mode 100644 sammy/src/convolution/interface/fortran/CapYieldCorrections_I.f90 create mode 100644 sammy/src/convolution/interface/fortran/CapYieldCorrections_M.f90 create mode 100644 sammy/src/convolution/tests/CMakeLists.txt create mode 100644 sammy/src/convolution/tests/CapYieldCorrectionsTest.cpp rename sammy/src/ssm/{m012.f => m012.f90} (85%) rename sammy/src/ssm/{mssm00.f => mssm00.f90} (75%) rename sammy/src/ssm/{mssm01.f => mssm01.f90} (74%) delete mode 100644 sammy/src/ssm/mssm02.f create mode 100644 sammy/src/ssm/mssm02.f90 rename sammy/src/ssm/{mssm03.f => mssm03.f90} (54%) rename sammy/src/ssm/{mssm04.f => mssm04.f90} (51%) rename sammy/src/ssm/{mssm05.f => mssm05.f90} (55%) rename sammy/src/ssm/{mssm06.f => mssm06.f90} (53%) rename sammy/src/ssm/{mssm07.f => mssm07.f90} (52%) rename sammy/src/ssm/{mssm08.f => mssm08.f90} (52%) rename sammy/src/ssm/{mssm09.f => mssm09.f90} (72%) rename sammy/src/ssm/{mssm10.f => mssm10.f90} (55%) rename sammy/src/ssm/{mssm11.f => mssm11.f90} (53%) rename sammy/src/ssm/{mssm12.f => mssm12.f90} (62%) rename sammy/src/ssm/{mssm13.f => mssm13.f90} (52%) rename sammy/src/ssm/{mssm14.f => mssm14.f90} (55%) rename sammy/src/ssm/{mssm15.f => mssm15.f90} (56%) rename sammy/src/ssm/{mssm16.f => mssm16.f90} (55%) rename sammy/src/ssm/{mssm17.f => mssm17.f90} (53%) rename sammy/src/ssm/{mssm18.f => mssm18.f90} (68%) delete mode 100644 sammy/src/ssm/mssm19.f create mode 100644 sammy/src/ssm/mssm19.f90 rename sammy/src/ssm/{mssm20.f => mssm20.f90} (59%) rename sammy/src/ssm/{mssm21.f => mssm21.f90} (53%) delete mode 100644 sammy/src/ssm/mssm21a.f rename sammy/src/ssm/{mssm22.f => mssm22.f90} (63%) create mode 100644 sammy/src/ssm/ssm_utils.f90 diff --git a/docs/glossary.md b/docs/glossary.md index fcfb58129..b04a1f2d5 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -16,6 +16,7 @@ - 1: Don't calc yields or pieces of Y2 just store arrays for Y1 - 2: Em $`>`$ Emaxr so quit - 3: Em $`<`$ Eminr but still need to calc pieces of Y2 +- **Jtheta**: Number of integration points in scattering angle theta near $`cos(\theta)=1`$ (ssm/mso/par/inp) - **Ksolve**: Whether to solve Bayes eqtns - 0: true - 1: @@ -29,6 +30,7 @@ - **Kssmsc**: Whether to include self-shielding - 0: false - $`>`$ 0: options +- **Ktheta**: Number of integration points in scattering angle theta near $`cos(\theta)=0`$ - **Kthet2**: $`\theta=90^\circ`$ - **Kvers7**: Multiple-scattering corrections use the current version (-132,138) - **Kvthck**: Vary sample thickness set in *PAR* file (sometimes updated to index of covariance matrix) @@ -57,6 +59,9 @@ - **Nnpar**: Number of parameters - **Noyzer**: Calculate Y0 (-248) - 0: true +- **Ntheta**: Number of integration points in scattering angle theta (ssm/mso/par/inp) +- **Nxtptv**: Number of interpolation points in $`sigma`$ +- **Nxtptw**: Number of interpolation points in $`\sigma '`$ - **Sigxxx**: Final observable from mult. scat. module - **Sthick**: Sample thickness **[cm]** - **Totsig**: Total cross section (summed over iso) diff --git a/docs/tex/figures/rmatrix_exit_channel.pdf b/docs/tex/figures/rmatrix_exit_channel.pdf new file mode 100644 index 0000000000000000000000000000000000000000..994f0b824a09502213ddd5b26e1d9f6b69e8cf97 GIT binary patch literal 22742 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 b5BUq3Cc6Q*;LnK<++i{Zkcfz?wi@VPnPph@ literal 0 HcmV?d00001 diff --git a/docs/tex/figures/rmatrix_inc_channel.pdf b/docs/tex/figures/rmatrix_inc_channel.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9279f8b6e3a1d294487891bba7485c7c7c6da76f GIT binary patch literal 15335 zcmajG1za4-_P>q0yE8Zh9o&Pv26uON5AJTkA-GGBU;%==1q%?|3GSNwhwSFw-Mzo} z-TA<D_vz}cs_t{9zo+XdDkU)qMj#U#0#)D6#m@KA%lA`#0|@K@7J!4XH3C0BfLYGW z-on)qzyUJ70WeEg*}9rJgO;{Nu4ZCpCJv@%06{?n7guL9BRd37@M=|Ahh-L|&PNT$ z1Ctw)Dk<dxU%fh62XW-1x+Bvn+9*?@wB8>-%EFhazf*~t0Ol<spYHC;BwGR{9dB4@ z-tTYRD&E0#ty_1{q~8kdEKa(UpPuAS*o}^Kf7Enn_i3@|)aSch%pZM?gDX`z*R^)S z=C-%)xkt+xPOu&i?Ve*Yxcy17iV9_!AXUs+B03E)EIDt#x@bfis5AhUjrSEepW<M1 zRC@Qonjz3e8`{E%$s34H)!i6eX=NPk+!lN~)un?Bn99pBNV(lPd<Fx5knh45^d)M8 zdbW1Ew+bL-(d%6p-aMxo3}1@6wkr_^`Zs@9nYl3;<`bu!V8p^wejgP%T7tlfiW~yW z%f_V*k{hq0nDlD6uQCiXl$<@HkNa>}<&MlCNXX#3VyrI86X6o(Gh`Q8jKpz2qr%L{ zi9V?6Qd*Xt%YtvhZdyC7J(qyU_!u>(+WUn=mTr-&8GG!rzB1gBKGLEU2V_kIPARqy zHli7u?FKPSJC-4Szb=H#4Q|W`^@Z4RSA_-v@T*uz$QJn`!w2zt3rJI=P9-xB2>P#m z9U~*^ZdrsF7L9s2DH6+hs4N1r;P0vLe~!$Bw2YbSEOn%m=46l7iq1!?;SYtj#%f!P z6_hClFQVsj`7MJLhg9fGPDQvkv{*J9zA-H|UF)+)Z<4SRF7U%d7|1w<nzOelQ21Cv z>+URO{_)||&=hHo!sudn+k^yquHjW#Gul_E%<9wCqEiYZSNDwu4nd+h<C)jZ>&3gy z9IFM7WQI}@^T;%VD{DxT-?;q28SUN#BAD5m{^@C;wHF6{@yeGaCkxlh&X-lzzxb}I zm!lbgS;@%a*SE8oy(@t24?lim=HlSyY+~jD;QYfN>R|5*+V28*@qLh^%bS^68HqS} z0(4kF23A&X0FaYS4*}%sf7bJI-0v7sa&|CLF>?jzfGQJ{05GeXdAb7h0L-EewhqoJ zjz%VCfR|7bbpZmnew|)W5EMe78h@EpRapT%FJ=U0RaJHX5cs>ue=7t2wO4;eB=FC! zD1iFJEc_Cd_Mn&qFpHVFTbY=>kres&Xw7-&p{lZo6F%9&)iH%Z4xqXs@P-F`;giCK zQjU}kP=W{xp>`L8mcT-%Q#V!p3@#Z?ZX%9_7#w800Dpm|G|;UqCcd*0V*`I$&2hP! z`8=q#wz${4uxN4Wx6lTr^b`cu<EjZBz@D#(b@IJi7Xx#&?-l|N4ID)i{PTvnIh5p` z7{u&Thd@R~nbbhT%?VS0Y5OummlCzh{7?TxaxPIy7%&9!IZpn!)VMnkDJl*9_^dyn zMy^unSi^v<IQj4eRpeWJwYE2<yY%hD>1ov4`2<=M_@CHwW7?HgGpRNTW1#YN)2Y@i z3VmVCI#i`I!FFzGXJ+oQ<-l05G7QG{sPk<jS;evNPa-cMz~EB)cs@C!MBnpR=7M>a zSZqf@MM@i&pf99b?d%VkKb$wH+#3VwQ+nk$B0S|LuNsl!Sa1Vs9o~t9Q)$^{SSB7< z6CEFG&F@;?cP*}wyj6J?81jBpJEuOH%oUEw)mpPXs$%ZI0lT5p&LVE;OjQGGw1W}a z*{D)H1%O>ZgEg*ZUy_8`>L>MWBGDj5A064cfalpT(eHCT<^?&7bcONUW{jRZs`HiL zz7C|2#%41U-zh0Akrf*oLqbWLG=08B`?>X*$7+1ImmxdvGwyllzMArW3VcYUWqT-p zpk@M-DME<<+=f3MCk-tA+Z-D#OE&{Bzfc~f7HQZa2LUiq3P?)(*WM6*-*wP{2t%Ep zEUOc1UE*22f9ySwBI-ujZ^#LgtL)w&#hW@)6)@lzu7%ikLtrGpy1qwX4`gD2U@$}` z3Se`DTm^uI1W2JlzJp|vg0K>Tsuvdg3WgvI{0i<KZ0!g(8|Xa+r4YpF2%`(7@fq0> z5h*}Y2qCOnmIZt@&<ZZ-3=O+LxFP|k2sJ}w9*s~N&P!BSi5m;DUo<iSElKEpin<K% zRd7YVsFJ`Hg)2cDoL=z5d)O%eJIph<UkG|S#EcR0SFn!(i*<ZNaFRWv>tdeR*|4~u zmp5cua0F4BdvG@h&%hW$4SJH{gofZCrzJGu2+zet5;Q5n(aCHQ$%`P$#WNF7iU?a{ zr4pUCAz{MvjneUO2JpASwPH4m)s5zjWmx9YP14onaCbS)(bxj-gNlvkK9p$ERK0eG z=S0tnW$aToj5pM&OZx!%)#!+i2xagy{w9&*+ZH@sR(p;bsAklKnD&70y~rEX=boQl ztzw-9p?15R8T*oTBKQ;eldQ#)4s_8Zz-vR<1fi0>15nyhs-h9V?ZG{Vp!cvV2bL+i zl82#r_30YZeTe%i{7IUKS|J%rI*bzc4JBPhW1y<EHMt(O0Cfjh@-VNdq%)qDkiKFK zWgftQ3N`7qQVK0KmZA)ixX7Xck4&qOmynle@f+ka`&rG3^tK#r#SSq)89!#pWVW=+ zw5{Rl<jO>w)bD9NREjAJX&z|?OnEd0Wd1TgN}gIEl)HtxRRRm^)bk}a8hZpnrNuJ~ zQjH^wGmRsSgEu+)m8m`@1tv9PD3%Ky)P12UCL<7;Dfar((kS1^yJWV+LM+Ku^f;4z z(0@g`-*E+RMrEe6L%Tz?L$K2@@&=}d#qf^p4SsP<a!h+n{3ZKt>*UttGH0!o{?AWz zsrRq!U-_nzr<$jNr^Z*vsX5GH&E-_sRVdD~SW{aYSua{Y&M{TSPL@u3<WA-ou>ahC z3O}rCi}Y@Ju)gj+6gW&K$Ry|_z$Z{6NMj%1z|XYL9M0Uy++!bXwA4myg3{j6-fPll zNzFJJQ#Ge*h~~+!t~oAcoE9uvsT8O-DQnQQC{$>ez|>1((%}+r)@@et5K)w6)?_xQ zRX)uZRL-l;E9#Q$((xbpJOx-Xj26!7F3XR~?=s3YD%>!ks7S1wepRSl$Tz@k^3f^k zTyRT=x-K$DI!QWqSYGAp?5e6^+hpS;lFhCqHG3sT`(Q!cH!ZCyiTU?Dz5GMIg<e_r z^oRn{n$bBpD>w!W#|$cr-x)}?=(M0U?HUj39(tGhGHvus{076Uw@ex)N>+B8s>>PI z+`Eqb_%ikCR&d%C+9z*NZpa_0AAzs};hy0gD7Rl--D%rH{N~WV?{BnBoX2dz()iGP zn2|1B%h8&kn?Rl@L`1?p!<}WsbDnnEXd!Y=WHM!nG4OQEpH*8<-O~R4FebkcyXW3# z*SGRjVDY)-ksehRHBmBpFr_qkk6;o}KO(JGBT=KaIqBB;)cUkkkXJBLFjf$=)4j9O zkNM8%8RFUfVdZk+Z0}*=Q4xw8stSG|p$JL>N*z`Zkrf^T+6}6=8@#(ch?Mz@0j2IN z4ur^)sCy_sJO`2<_Ja!^69an{^^sSLn&(?j4=6@saWT=pcB%NGFGG^iu{g3g9umWn z{o-?y^5Q<?Y2vbJnhaVE+Y&L_F@O>Q98yATA4+%U^4l*fvf*1tn+RJcOl-RE8jhBn zn|8`aCu<T6y0x5Mkr0v+uc7^n#Ox{Gk*m2fX!Y2ET1ajWe@xmNpx=u<*Sj-&N`y)a zsSlYJOY75%G?A{6#+KfKP!w)jcdIwJ2;44DNk}QAV=JF7AGZo=ylb2hp)!i9qt{~- zpy^=lWiMnAZ5y$gJ5j?d5SmVuqjk|TZ%>c=A$KhmLzzVttcBQMUB7A}X_hylJchn| zwVk<bKT14&IsEvR!<@sz&7#x&N7z$0$B7L}b?AJJ?sBVwhhBHv#&zfScsqcd)Z*Ew z#AvJ;;hKHa>a6m6<+@Ho%ZAh40g+Y_<&6%;2^|#Mep_tY;}!FUYU|}Ra{cLR<I&Bi zO+~72N#EDB{50-Y#%@B6JBn|LA3fIH;XJ;r9JF0(W*BSfFHY60>s9ZJT@+k2w`&}A zsvGGz8KPRno5nY?meqI2)LKi<l^zxy1`@<)?sgpdG#}?I4K6Qqt=aj{fX71i!wQmM z5q<I>x>d5N7Pjj*`nFNkJNdofu&v9&-@sq&Sn51+QZiJsc(5nlZH{ktfvb!wg|jC% zY2d?_)1bri`n9MJX61nrTVd-R6gL^q`R3pq>1i$!|DsovU&R5<bKcFzDeWlj{P}P5 zkspgVt$gHs)(!$@a)>908DD4p^u3C?$;fONv5=iioWRb`;>q)Pdm%CqdLA8#8_uiY zD%jSz{UxWSu4Z*KFs)Yqyw$mUx#RIkEv?d`hDVRjFUPOrIP5ugo}@kZox#yttAnOf zyN(0LhUa%%)p4EBetQpkkIbt#ZGJm(KXV8nqhTISm^yua>VFeB@LPSJhAl_ce?8{S z{cQPca<o-IgP`~-x8im6^W5End3ndx(fb9%$%Y7v_^=jH=AWtewTivaljW225{(jv zlGT!vG50Ym-XE^|&qia?X0}4R=ze^>O`WdHd+YJoVPQPncV;vFJ>#{^YFQ`G!~Bii zp6UMfjEB`}Nomw-W#{Xgz~}r&ldHkRgCoT|#nimm*B-v`PZyrlcILZlw;`90|0}_N z$<SZIn-j?TTO7Zr+!q^25KD`SiWs?=nF4-k*f#*Z-(_Cp>u&-5U!m^u|0TU&)U+E& zF#`e2vR0-pAg%qPi9zRk$v^+p<iNisu78|U)X3Gy*1_VBEWqVY`Tv(AUc~m_Tk%Vm zGpo26yZ*`^RGr<-{y5c3H~!curmZL`r$n!6WoPE1VCM10!OqBDNrh3w!PZn7RGpQH zyeh&keJ^I_V&ZJ&=<47M0REXlt2(IJTm8zLfq$kR5?0PGuA-Jk&Hy%$l9x03bAuh! zQw=LqS4$VrW#r=G2C#B~5)sgnjhhF+4f=msa)Po2c6Rn(_P<?;zosX@6NW!>kAKbK z^%BReds)yzPQ9Z9K8CNyX63=e<QGBt?xVUrg2gqW1Zm^cJD)9k6cy23v4lH#NRHJ+ z`CWeFCM@?vEwrb4<B$W-8oT#CG|stRfl-!KeUN@9lZ3YxA${2^ij}>Fw7ddK`5b%{ zt5?oL(VTz8uc8B*qPq=q#qW4o*J^Ure-yxkQQ1aKA&~2H@MOaUhrQTliS)oZf!Okc zTF`<yM9h(aIq}NU^djfoRBLisRBH`NxOODlPwn>TjjskYqh@+kKnJ<%ih3xKF)A8g zFp>QejG6$n%a5`xFd}1>M=M}th9s*HWV>!8Z=poa?2|lTL(b|ac>FPohYlK>RrX!r zT0}bi1(meF@wWOUlKN@0e}{$GicI-God36@vvRZj#|eKYr7tPpAD;8#HGgr1U#_8G zWcQM+{ktdqdf8&(g22iBN6sknD=TH>VCMobvaxUhfb1+l0FZ@^6_jxP;eEpP7Pe*p zMo@WS7n7HymzxLVOD_$0*<fS^aw0H`8aYatSy@=R0ysHY0n93{W_IeJP+->l)5^}q z13KK@;+F>k*g?U|EN|rb#}<$cRQIn=fL;fgu_6Gue?{V7qUy!)JF0$r->($+_xq%m z7PGR0>if4BN*&%_zN+FM&&n&7eLTG7JuEs_4o)bG-~*3xP=?39z@tHsF;ELp8cCYP z53y22AmBN|SbQ4<ClYtWBh4|l!J*=f+l+DQb^0c3w#r?IZUL1WPj#EqMy%X*`n-Dk ze0?IHqoTGq>poGgvZr3^(_el08H_NXdx$5x{axTik*#D3mxWq0jWVY#<kV44mu>f^ z*rGntdnSFy(aifu=aFTw5=6v3w{iKDjaQprLNya<F}GoV_Vlk*V(z4bMz}a=@mfUW zIzx<3^y^iI4}_zBIMVvk<f$L@dJk*!!i;_wd0Lt<pc9QCji0<0_Ujx=NF@edML0{h zy7wKfYLDN07z7;J04uN_`wB?#(d-&<Zl3$<=!UUW+$K70vlf~@OvQ^aJ{y0dmio&j zPSMDZI6H+ZcRb+BR-b~=kDhku`Ix!zWIm5S-gg()0(-FBGdm&h0rfL?o&BqQUJ*y* z>Aa%+BR_`pBU2-klE?G|64NQ=+F8Vb<%W>ogLBevOuUJc0k<DIArqzYu_TFz^4B#_ z>Us*Z(PYP&eBWJ9t0X{@tMlW!l+dMEm^3wsW_-C2+ZED(yOBX4;Da+^QgEboL$pn; zO*}-beCL)e;1OY~;jl1Ocmd=6inBs0YDNY2OEdx_hZVO7O^I1LUOM{8pcq-ySyfV2 zsAF0Zy^v<C6}bS_u^BB3^>tb}VzD`tViat@;5qVnc9}K$UewB_UI8EiWttf$`nupS z+f%scv2SZLPwd9~C+xGU&ClA0+uOV&+=s`<tk;$$I$8d6PjZ(H<039Di{3^ZQ8lIC z@j2Koc=>uK*fQW>TktKubx(rFTx9r|Qf<+r(3Y25RI5TJ?3n`(-!qv3sE1G=r)D+s zlc&y#AJMD$tc8$W_SqU5hgM1Ty;fj7#H7p6?%*f0U4qxoa6ajwjx;4~>3CRxs)0sT zx?{0I?%>D*C<AbG6^;_Ebf^dP&f0Y!gyLO*5Zpc-G-Hddr4DDMdc}t?@}{t=!I3fQ z?~_H_uujDGHxpb*TW7Aub4t`aGOgtrp`N51=@Xo!+ORCsbl=XXyq$r3J0sC$RldgF z>tKDBRsZy9T63sRLYgRP5Bn|zLPHimqeM2N#NRwqaGc#Q#mbv;#?_|8N~^?5zoeXF z#x<MwJ<{?~5|UX7y;;c<tBOPhokB8d=J)aUd<x0=Bz!e792OBy+UPbo=&AjgmwlLx zXqj}vRxuHgU061*uG|rn0Xu+AtBA`KZ_IHjjH>Q>DIEIi3?<4lcl-|pE?;%DtIA*! z*>=Zqx3+IT?8=GJn2dLcUFlY}8t@Cp(MXU>8gD{;7!X4-iN9T^1=8*aB<j;r#goSk z$i$meK7aV)$4z#Dq=kf7_uvts0eJgrmpE>F1?T`@Kx4AXQn1$diE9%rUKHK{Nox>R zP<URb;mhSK!N5#YXZj>ZJ5#DSU&Ku_Q3@vUvF{EFRgnx)*el)Pxv2WZZ&5<9zv0<T zY_ipg>I=%@MePgrVJj7-h<+$A&X%(p<Aac7hNxxrHe&dM8cmMk4a-_eDYhNuMVPoi zKz|@v6w6U7Tof1ih*oY~Opn%$ZrU2re%+%?ZWU>YJBf>o+to7x`)RAcp{0av+)2cE zGkl1MoANE-Ci;}VD!l(z<`jMHd|<dS{cf)==phkTww9B0&n5IV2Hi(d-yK>F3pw9b z+BitOKHR9D%}eo}O_#6iXqfTg@ish{;PrSJw|$YW+c@X&4qbOyN!(tltkLmXUr2<f z9q4(&Cn%W`dN+wzot*?6-fHS<u<Psg@}NeKX1VlHaia&t?sCOr?s=Y~^F?d-A8c&t z9!!N%RG~S1KCm1nb9z<dWNh4cUd-25f^oz{9fv$fm$#kn*oAk#8|n7dK*%|&X}sDP zSw{3#n<P@|DtX*l99Fo=_pb!Nh|Trn5pjy~4YtTgl~IK$LLt%B?nW(w{Cmv?jRsLR zd6i<i`IuRx8B-ewg7|^_CM(7z%4+4x1?wj3>i5OkQ@ooOT2|bz!-=dBC9MNRg@<)$ zCn<#BQY`6Wf^#On$nRHibxX@JSX;<9S~=S_GJM5a7^<GWFjP^UVJ)mqOUP?VF0ouA zvdlb=)XzMM#(XY1P)@CVCuS!<#a=ugJEq(QU2QC*lRfmQf5l2!M{imAN<F{*RDP@F z;>2fp8Q#4MBfGL<W$xoEo3i{LUEnz~W)^;DkAu&C@AkfR$Lt5oCodOtja$a!T*PEg zuVRg79AzxJr`YFbkzY$5n8z(G$6>r)!LZu7?lV}6v!%f1tjDWNv_q84w&T<qTb$Z8 zr?+)OAoNZg9|}7GN3WkI6yCPg^rx^8Wu&>2Nj-UQT*h}Ss#I~7YEAm)4k`&xJt#`b z&jA|Zi1CskF-5p|tYPH6#KbHi3WY3s(9K7E9Xx#RUd~YdL!WvsVSDKW9W3X4A7|;H zZ;1d8!2KZk)7q=?%IBXXboG|bj8@iG-{(Z^e2Ak0O-jwQQjMkOOC{EF++&J9+<r#0 zjX(5jQVy=gsi<5LmZhSzjLIx=bV)AUDKp->{<MUrMo|fa**sXc;ODah1Rv5b#-&it z3X{6$xaY_YX%9n92$|a@OM1Mi!yR1Z6RS6D!X9*&#F^V7m83sEK#@3XZ+9T}4%o71 zsMW=fX~89<0>_RsL<77b-576k2sL!vsZOs!Je*GzuIkn2$vU)19|(@1%UMCS0=u9| zpD=pxb<Flvb7Q-MaY&kE<+HaZF}h6ggg8S!|ICn%@H0SUKWqWG0QD%%AyJJRiBoR` z*)oLXil`9LYh@W&+fDNtmbBYnDDugp?n^HVPA;_xu$~0m=xd0bFP?VDdkE^!7GEbV z3kEyiVIIFn+A^Zxhhgq*Pl&ndw@o_KLn3!EDt#3vFxkI!JB)OJc@KTBcMri&K8gpu z*Xu)><BEv<bq(QjqFeZTqP-TpxANaw=4I01qYW94Ler$)Ju$O%Q{TnFs8zFI5CGqH z0nj$Ey}F)0Jz3zzu_1|Kf9%9330y&=@tYkz+_qB+c57Hy_C&~~@V+1$HC^6;Mhj4$ z0+(H9x#}i#B%ov5hB_|!zHi_tU(5od!H)T^NAFD56Kwe;bWIp5?lb&81q2<H8KuaH zMR@HBP&3x)EkX?s5}Q(-e}Lk;&L$;~DK{N;ENusha}YAzN`;78D$<20UR%b8z5Y5R zDtA=dP=Pak-5$=~A#JbFPvXk@U>aZI_(zqQJl1_6nl6A&38vXQCfmf`?Etug3*NK$ zoCJ;~<1EBD#_M$uZr(Kf;I-XZXLLwt$hpUhMVa5kCh7?nF>O(O)UIm|zju4=%w2R1 z=MDMyW;`m3sN^FLE=63dKrB1u3~oSsqVKQ<d^}@}I~;f$mP|OTIMln%wXJr6(<&G2 z3WS-gonfnrSQ!+=yn)vU6`sSHTbreUT}v6<;Dv)}gJ^LKk;&d**S&^lL8ihN=Xoa4 z4^lbvxPxHYg!48Qi%eZ7>{*PX8s8=(IxxGyCYIN+B#diJSye=3F)U|@cl!XlxFwPZ zfVT;`4V?_7uW$psPxQ;I>7MA8R2pz^6|zr(Jwvp`TKewU7-6r8{90IV6%}=3KU_Kf zwC9mF-{njryIaGNgu^kT%n3)`mzYwnLaED_gl$N-KINPE2?gws@&)yM$Wv-|>8pwo zt;UovE9~n099L{VtTlrf+yjlV31`iOYSZPfz#9l3Sr$Z($|U8-(25TgOmmQjlCwS> zJek1EMbD@%Z^qN5!QjsBhi>R#RFoeIH=`UEa;>tfWUt9cyE`sm@8d5dFBYQYSsIBD zYv_nQjL<xUu&q1cwKpVu)7F`^!ZW)Fy&VmnAV?(WP6ypOqu!nIeuDN7_TS_>H4}+= zhZlitM-ID&9z~o+UzzGy%#~<XlvPDW=+vPz)Ul1btznvWaYEtb9CVexyGBEr)UeG! zH7i2Q9*j~*ab8`B?24`@ds=`xMYAvb!0!jnxJB^*|D5!8oS`a6{4354oDa-vrZsba z^SlrKbq*o6zG-j{2o`GYYRT5AhwyXgbBGlVb4J%lZo1E{64lakcN~nFr5p}6rgkX0 z<clqFY*FlCVC{&nH#^CkD#&d@AJ0~V-4Vc{jpJ%UrMEpAql@cU<SmRYuop!%R0Qr3 zM){_ho*Sc&gxd8{u1y&_5J~W5z`tRlKd{_9AQ02fCNqi%kS4^b=HMi0!L~yBn!=~R z)qX~r3-0kld*5&%xs9Bke&AFkck`)E^qMCtl96*{4;s@a_HgPW)AaBW*A<c<qyu2J zdj&>G%C#l$CV9C`Xd#LC3Nhs_%@tx4$Goog>uIPhcaM1?wqgj;J^f}l>>|V+VteZ9 zV7(S+9>qPPt4hX6i9%a)RX=iC-0BS+d{XFH9!u0wKWae7wi-V?L`o2@dQ#e4Oi7}4 zfr#u)14dhrE#~2n!GVNvNic1i(-msjB0PKi33YAZ+EMYPR!mc(=^g&T`}U3TZbfM< zJ4;?4Fo9Wr%M(+pI<@_PL1}@3celOW-N{E(ci9~h>h=CK6qfJKz#eExM+D<YpA0Y~ z<;-D+_2)FKxxC=tB0Qf_Kf*5^H=G^L4ODhG;;y({EB5Gm$1oTQYf8vW$71z}m{Y2d z**TU!VGzqoO#7qM;PZQ48#pui>{@@BV|o|<V_VRZsAJSK#=)U4rxV^o8kRlZBC?nI z9<_y3{k?<DAm#!3o1oHZ%PUEn>B~>StNOtt_bOK^G(++%LhVK{q}Vt4%y!DhVaLH3 zGEPXoLLYm;@hCh)C<(Ca1MJGWV-xy+^!%V}lx|Wfm6}s4r0>Pfzo<{zEa*|DK$O@< zMcqXn9Un%y^V8CgPtQoqeV4iE&XY{+o;7Ezz>1ITougi;4j+SoM{>^L>RqsyqfEBU zWiBVk{Mc4k@EsOAM;TR}<0+lyaO1cw;fg{5o@ehTY4)2Sm9`0KhFqDlG18OBJO1e( z-gz_%C5qO)PaW5t?uxEL!(8<D$1<xSUbVP{p5!N?*SWL@S7HUol{hzIyx%Xwll6l; zCp5Se^Ij8qU&D+Mu;9Agzq`iJz*c6R#V+6P=R?9|0%jgo#*3-=e#L4x3Y1#-W;t5) zQOYlKVLA6Tzs%w8ow;OSxQTEm^kIq-=yhqC1pYt+ZB%7ob?)khpTP1aPWlQy`^5G5 zapoe9nci1PN^9iJmTTpOC6|-a=&w8jAzA)X@+Ja!C0^Vvij(Gwt_wvUNgL%aFG!Y_ zKcL#mLL%n~Aah@F&SE*?u5aI6-M_(z&fJSW%bdvKSI()OZ?4-bQJ9sqR>aa?@H8ne z|Dt@)P$a=Gpt9t<YU!3)+fgalu>dYmZG%!Im77AUauI&3T?KD-L!A-MDlvn~cB%9Q zJ~K(>t5;3=bsIN)UZR7ost8-=R(D3@y(8HU(HMPrF3%3Fo9`0*$EXQ$4u+`1LtY;S zY)uDY<)pG#hUZ@1Ob`_-TxUD+Hf>?nv*4rR>tgmq3&->_ZJnc%!QGbnB+ZEO#IG>+ zG>cPYFT!i1X4pE-a8SvyNE;iC8g8N>Qd$>Ao7y;-x@{T6xa6#5Qv_J}7-8OkOB^>Q zt2}fTQY!AGAg?LcaGhS|-;->w^&}9@nH&6M)5*RW>WQLt`hmLb1@Ap$YA{oDV3#YU zxR+4QDSxj_C%gwC-b!Xii`%r&^nraup3sFomQJ;?FJq>*!7zUu4;$jHRGq=gUbj$O zMb$c@l+5~oC^_KRyVk?9@TrTSf2Y=q9@=ls))Id@YJEx!b0#j#U-ifIRg6HD6~Y7l z61$nVV*C%uMwlx@0Rdz|MNvfyMGf6mmgT(<ciwUJm`7rh^>7clAre~`AF8dU!|aY* zQbLO$j^Byc)yCUq%+e<^CYLr7_xm7DzN51PBC#Lx+ARA#OWE)pf+wVCkJxxoS)89i zJb1HT;my5zvXZ0<Kt@ngdX;iP^r=wk5JOH=(oi9r`j7#^z~LinLP(yt%ce*Wx!*!? zfZLMTN*I*K30gA_9gYG|*d8j$qwhpyczaYEot<cqdKH-Xc(n*I`N5MynAwn%e3-B9 zot&V!C<~HG2`?0iJ99|F4Rrl_2eSwmMH%o1B>(Vzxwueh`i3fW4DuWTEbW@`X+9o_ z3Gxx4T0>?9GeszdZK;gLhU3@z*0iLpz8E`pS8*g&k?eF-)+rm$U9>=~YHc@+11!Aq zK|~8wc!;-F1{I&wdAgnR>+iLxR83Z$vAfF>^(z+$goM68w;USzX;5M7g2zvVlWsrF zz78~~wZHq`T_ooc(YND4)t5W_PPL68RmfUX@4#}Fop*pb-sNMFz0@4lhT1%OLsPmZ z+EqpC6=k&EtmPXOJX195deihKCBG(&pAmC7ukKjoD@v^236Hx|qQkOMS;^r`qqIvf zqPf&)7os1dgo`@kRUW&;W~T5++b9mZX=)$!oz$1^kH*)#>jGA(p!kAPg=I;ZYTKM$ zzQAE1Q9sXK7*AQdgnl!`2S`1189tUJ4lR5z<`H?bJ7-$XA(wOH$fHN#pk-v0(a~7M zomGUtA6#<K@U&J^{J3{mJI*@R4t%Vy)J?^NYpm*e_$oJjDpedPbSc5vY^Di7HS-|y zS9!o3vB&ee7K#c++A4Sq<-sa~E`gAxs-9KNe8rd=SFnv?;q^WvZkjzKa}1MliwJqx z1QK!G+?&3tu$hV((Y{!5Ml>PUm_|X0t(dZu8=81pIaqoRD_vs9Flt?_i$+xLOTjwp z3O;@Yc-Qhyoejs5E|AMZ^K)#PXTi*lBSzHsFV?MM*hWd*S<F;asKZ=5i|A*MsjqBL zHpxBO^~A<v8w_N%KC>Vd8=IHRWMtb)Ft!|fwW74ky5hFbv}G(82*fQsVSL@`?Bx_~ zia3m%xeygg`?lY$n6OF#Jz>2kM&mNDC?%a{;nAw+?vX2~;NtCHTvp49C-*`3&=Iw$ z1PO`}mzM=Y!Of%w5<1j+$GZusL&p9y!Gr#27W8a0Uztd#NwLoKlR2ZgCvtP+)K6Pj z_))xi&EUWz7yd2Y6VLhLAQXFY;=6UhLx8*UibPEo+&M6avoJ+=RAyAl{bOy6)$W(} zVc3Di%jdL}RJ%4CwwP$#hn>nb6dgX#ag2;A(iGR^psfZeK&^d&GRKcYxf@f%5ycw8 z`AotgNuA73af}`HqMCkgdRp%t*%6`AHCM-f0LcXc=0m&kD&D<!)7ns>!}kXctL;>T zXGl<DXGM)GCYD}nf2**d3ZB;IQ#;*IqO-t1R;8OMrw-Pdj1?*M*muPn#NdGL=zstA zU0ja=`rc(U%E#{k!d=)(x4_D|0ClG!k@GJET?>@Ms?`+cdVwcJC!Z9ihzs+Aa%F&E zHo7OtNagtbhS!>t+8NhSbdY>04eBRBOzS@yb=#*t_=4#vU4!jTYE6)>FLj$D+NsCF z+5b3*4uJj^*A2ksAIZkTei)5PZw|S0^m#bapG%@&lY0m={mFi6p)mnJaE;rUowUq| zrZ$1SHtB(Cj|6vG-HPhaNsE*`Ij!Y6Y5v(Eycw0?dOm@U$skFFVgA)_eY<bX;U|f6 zPA9+B-hnj&4<3)!n>}J2W((?8TXT!3T)!6L=FExg6W)#$=_z|Es}vp@X1?}i8%~1Y zRoC#eQ}kLcy=OA1-Kn=H2MvmQ-*ThhG4V9>dGJ76WWyA1V~N%%Ckrwx*jP!^9MoJH zd9U?^jB3AKF{^&|32*=GZ1ld3f;%7x??T_SdZ)g9o#-SQJVi!$5G>OPPK1n!;G`bm zJXq{_bcBhHsmWz<hvAhNqN{T8tBnp{t;~8buO{om#_80VlA7<$OIPYPZ{6layQ-}| z+Pj(hj1N<@YPnrDP8XJ*vupY?vM<@!WkKr2b^j#NA%RPbrx3Kj8D`un)uJA8MI2#= zWRkfCXw6i{Ye!Cqe}3<xjf7+JIl-(dfc4D=K@KNxhc*$c3EXQkds%(vlVE}2$9@yX zbP^-`60WlGuo-WAHm0n0P38>ZIq%{9vUgX@*X>uz9q;#89ZV0rtgKd;V9;C_G2RaE z)EDO{bO}&E`Zo@8iax!1CTZw?m+`&6PT&EDu$v*ANoV)=A{VXk(+B>q{4A6n;)nYR zOi#_Md+OX^-@Irc4B`gxC`a@aBebfehdN`{fr-hn&Lui9sAihioTEdI6IB^=u}zrY zD2Fq$Nmvu4E3#_&dAa&cWk(L`1a#RxePEdyAtBD&RB*04Vv(6AGf;hwJPyHemhm1? z$JVkL(7X&oKTcI4oM^5XtG3XlyJP%e>+k-4Oix>#vt)W@-GSC2f<4Yk_9T4@c+R<X zI5M6;e*N0PPv|jVEB~x8by+8GR?yCO<lObgOseD?CXKht>#^+Y0f|C|uPNrz3c21L zyn<uDQ$!TJC^)qvy%xyG&eYD-Sf^e8n3JaQzOoE1tddCW6CTRexSD94Q?>~aGbd+U zmZSIPF{AjPG8bo=5dgWNT!)3#%GMGtoc^k{(>iZ^`DA$~`a!i*fG6yebSt!%+J;l? zyLoQH=o;hr1j&bs)rmqcr*||5uWsOszTi?D={s{CS!JhlZA3eL7)X)!s;R4-PUVt* zeM?Ko=ei0Tj5p10(Be43`ndz4#6|;%vR;b;OFM#09T#g|)^`X#`q@qGvQUJF-81EV zHf5wqa0|1MMa%eEd>(;s`}vXi#Nh491-2zD-kxlU?-gw!TXnt@ifkE>$sfNV<eTT0 z!Lj*QJ6wV8J!e9+jGOJMg&P*VN<SW}qq5WlOvPlX0^2zvt)@oLKSLto#Zz8*mOzzR z^b&6nz6-a0_2q&qY{~i}T84lvtt7n>ruwyp#c0%#J)QuQSu3I_ZL;6ybN<!zLR^-7 zrqJk8Yw|Yc0giuSuACVktd2p{SY@UXi}n0gsrBBY3Zdwir|#<Hl_g4fiB@30*Wh8> z(>k*03}yI0(Y&IUgWZD7)hb5#z}M^bgKowBoCaq`Cd^ERC0i-MLGLMZzq4xg0h~tY zjxF0QenN;x$U)WV&xGJP%!}PueMwM)xSA}+qwF+PiImY)QnM(=A26EE8xNvqDUpG$ z<`{Izrs`5mC+N18286oHdhNQ(3ts$TdVQf2>k0jht5Pve^^_%@D;PAu;T<b7&jtmF z&1+Re{h*sfuCpW+(YOzhp5o~%KA7=-%4T?~Et7hOWqoKSJSWC647}>=bgGer27Ds$ zxNxt7Fsz%y?(q8{CHp6x_4ojE3(Cmfj)Z&eU<C3yGwECPc0|>tvyX^sYLWtCQ=R9W z;&oMrPNQe{siZ3M?z87zeM;u!GxzEZm|``*M~|{zO000Yt9aY2BGmiKMJ|)yEyGTt zDlFePU{jdyv_%v879Ns&kP?KyW<a|~Y)##1;3EsK;*FSr^J+<v;7h7p%H}HKkH`ZH zS~TQ59Ak3{0qfp|H%;5xF)3u3CLGR%XX{9YU~}2M--EUv(aLIAxm+e{=VHoBMrs2K zgFPU6t5G78p)ekYxtCv6<p6QN=ybmY+2R~mOx5yWn@Xl;asf9VLj+9SX*<VZi1ZZ5 zUEJ@7+qhVizS*!q_)&@W!JAB0Wp63R+K-GP`th!cKdai^dOk3lNXcSf;6YVDdSvB* zO5g8|6zLlgzwj@iCSAds@mqf3NF~ODhel3sruZ@|*@ogf1HpC5f=?%`eP1y`-i_*z z`|_nzEha^ieXTii+g=ZZ{)mSz7ZOy1c9{B|>qGB~XIfl`AN;#$(c=!1oW$n6Rf9-j ztgiUDwS$o&@zAJBjm9i)pK$h5!YBpJA5AJr>EB5=J{A!+#fIJ&lIph^>E&C>dRRy` z{)oMa>|8f>-)my>ao-rF!sqm1p{Vxt)jQZ`tVF2drH@5PJG<rSY_?6mD;!vXzMi4s zjB|ij&}#Ht9f7~Jx6x~Bv5_9#ep)JS9wS~}aT_h*8COZT?gFz3fS33`2Dx8GZeK=o zxj5K(evfkhw*7sO8#Ivo|Hn<Js;X(r3)2fbTN&B@q9x>2{}@O9@8CEB>kDrU0<izf zNwEF_M1zKk|8Gu${WmA^!i0eMh!-Y;gM$;{FY6$(g6-EnE>_mx`~QcT_*Kt8My)}` zf3@b{hN=I`Oq7HhE=pfQ4xqh(5WEU+^8?e-CKP5w)Z)22=6f@P<(=N!+)hy~vDo^y zq8dJ><6fGBsEkY9C%3dxLyj1AAnFsqPPIk3qWps!d2p-N?q?Ib$H<X4XlAE%W8KV+ zya(l5;hH|znH?V>s|6?JE7&#mIz3GZrJ^dx#|7ei>{n#@Sj~ppYB(OK8EjsV37o-@ z*!3ZQ^*718i%n5}Hn2FwDQaG=szKF17DgQ6YPw=^ywoJ5TLsh$7!UxIJ8=~D0cehx zPKY4^R(I$vvMsSI0%%Fjd1qiDMGU4#B!Os5GLlU~aFWEv&5$CW`3oRKgi>?Q+Z}wB z<$mO*w0XxTe7P-pGG-dMc!pisHb#+Ns~=9#|6j-Yb#Y%VI4jS8=!svq|MyM!H+tg# z_9t5-ix-Ul7ohM0OCabla)S7MMm8=^04oa%3kW^n;QR+H0U{CpWF>f5IR3^;fWU|U zuo4JdAZF*ktc0AIk*Srv#V>5<H#fln{2MpH1={)#H}R|Tzi<<*e-Qlt<tBa^es}&) zZi4mC2?>8}g18BGHc%V>%^%%V{N!}huwLI@cPy|D%!|CHbuBEOYW~Vylt)p?(#eY_ zCxnRKZ^XL~lgNzEq?ywa$}_|w8<-J6n^iZqj*%*-HN+CqXB(M>9}$_srlm{0WfJMX z|2kBkzxEjCxp(=S$4Tp6_S$`pk3u`|+Ep;pDkQv+Xk{%Vc{I{{&keCrok5caX0W70 z>aJQ~MK86CB&L4f5oZd%e6`*R@EJ}<N7koT<&kmLt-A9BPw<<h-rBCswd8XvQ;N@z zHKuREkDYM}KULmFbd5v6E(<Olg0~#S4Sy>O`IJtHm-?9@2r(=W7G^sEdNZemd$ynL z=T^|!0qLOr^1*{nNvgP9o`CBy1}b9eYa5aL@j4>YoPEMu2Ar*;)+;L76j53%grSWL zDvbC%D3aQAA~_dAUs~9&$x2b}nSO92DfhIn=WnIHd7`i;CxkgshBXr3mlWCu9DmIK z#aTGln^`oR$Nrv=Qm?Sf)&ZV|L~nbP2+JuP5<G^vwZJ48;(AF3WYMLJluS3n4fjj* zS)08Af{~{hT#Oag=2<l+8HEvE5ls?YzfTAju2r_-P99F5px?Hx?C;)9Y=mg5Q#hRw z#Q1CqpU0)WUrVQ<82i(4@1k6qy6I#R+d0uwny{5!{by=>gGXxE{^3KoF-kVAb8r^= z-dL0_%n*q^^)^gZiR*V@d)hcOh31r`BX<=}lQxxd1qV#BA%^E_x_$jJ5lU&VRdb{( z+@!2mDhAI+YOlhR&TfBuv;8~iH*5#ipLAc*WpMKXbuQ1>Z+B9U%}CyyYK}XS(7j^* zII@+ob{mJZaHBYr1-Uokrcgb0oO^irR;grk_IpLt?M%OzZ2kI@feDa@&5;{km7<;B zv{anxfgo`Vg@y(LlN8~ge$mxVQdIo%Aa{X2zB1y=(?Sn|9>pQeWqi8ZD1Gkw_K~HY z&%DQFpO_{&RmMV{Ju3O*nYeop%A-l$;2B0W4)Tq3Ir<vEHp}-y!g~Xs(gT>BJYLzx zjlQaafZEzyv90^*Hf?e={6*o$-WcBollo7`hkaM6z`jXIU+@fiao;0)hgn4G_90wK zn5KwaN_UMBn{+g3_bOlMg$WMKoiCV4L*b}W6AuWVf{NOA)zYF9(i$Xcd@-MpF*6SA zczqs3;H}`VuyAtwa0#FcZ9brIm@6Azy0g8qtz%^6`Q%Aya5erQLGM0o<~J98!bz{U zYu*z-AjA8>6c#LZ!%^E&_Vf9SR|N2#Osth812cPx5=d~1HvPq{z^sdkVdWclUnb{C z{&JTu1zV{8bOt#Z7LU>K(C`^46O394nT~84TZOYs`xxAqo+dBvo5X>m&XYBbMLzKv z&6)k!o|4sOpyblL3H6X4#zEIenNk$$-fRS0WUrM5-m$t*Nf7*4KO*mj(!~dl5lEhM zCyR*$tof?|?}<#e^4r`7b!-a*kbq;5pZYPhhU0|k6dfH-2^L?v<iov|y|#E{<JI}T zqxifIR{keg)upE9|MAQI8^i<x**Jbn2G-wT9Ic&^iJ}TX-OSm=%E2D=bIb%}XW|6t z(u%lQ*@8e(Zb>#4Ru)}4fU=vBv#U1%G^gs<^ej(Ty8oQ(H{VDr#>)yS%)$!f0djM& z0NJ!zSZF|h|0(%bz!Nl2%hb&TG=K3|Q$Qj^6f|wo71Rc?mzh(nfAW~}4yJ$I{_oGT zr?Z(k!V80m0D6l2`2lcpaIkRz%mIJcfb1L~obJ~?fc>8~7M2&)@edmt7YN<^hYi$= z|0&19#R7UtynOz0KJJ&M{@upL$pz}^-)+CP{%!-Zvay41!@rheVdDnTdH*cO1M2BN zY;2q$D)pZ>E}s9fv9tg0vFxDd@IQ}bXMX`@Uq1isFFPj>$e;dZ1NGzO!T1jw&;Rrd z$O=+||6A_m{{Q`0HXsiOTKv0>o&Dv3{7)N*w*9A#<3+XnF6ZiO1fn9He@&iMvGNA_ z6$qAm<KO^7mtUd+<aN^a<_;i^`HyumkZR>;Gv?p{vY2u5aIhL1v2(K<o0yq#81ZnM n8Uc;D*ttvv5&pf%A0)JkD=1`sIVzBylZ^|3ib`Bj0^$Dw+d@rf literal 0 HcmV?d00001 diff --git a/docs/tex/figures/rmatrix_interior_region.pdf b/docs/tex/figures/rmatrix_interior_region.pdf new file mode 100644 index 0000000000000000000000000000000000000000..29f66dd2303be06919d7392d023ebc76300702e7 GIT binary patch literal 37043 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 TlsFt1u>{LtVPT1zld%5)B`XE8 literal 0 HcmV?d00001 diff --git a/docs/tex/sammy_main.tex b/docs/tex/sammy_main.tex index dd93ec6ec..da8f82f45 100644 --- a/docs/tex/sammy_main.tex +++ b/docs/tex/sammy_main.tex @@ -80,7 +80,6 @@ \begin{document} %\include{} % titlepage material % \include{} % include for acknowledgements -<<<<<<< HEAD \include{abstract} % abstract \include{introduction} \include{scattering-theory} diff --git a/docs/tex/scattering-theory.tex b/docs/tex/scattering-theory.tex index a50efe9b7..d1d27cc67 100644 --- a/docs/tex/scattering-theory.tex +++ b/docs/tex/scattering-theory.tex @@ -12,7 +12,68 @@ The particular aspect of scattering theory with which we are concerned is the R- R-matrix theory is a mathematically rigorous phenomenological description of what is actually seen in an experiment (i.e., the measured cross section). The theory is not a model of neutron-nucleus interaction, in the sense that it makes no assumptions about the underlying physics of the interaction. Instead it parameterizes the measurement in terms of quantities such as the interaction radii and boundary conditions, resonance energies and widths, and quantum numbers; values for these parameters may be determined by fitting theoretical calculations to observed data. The theory is mathematically correct, in that it is analytic, unitary, and rigorous; nevertheless, in practical applications, the theory is always approximated in some fashion. -R-matrix theory is based on the following assumptions: (1) the applicability of nonrelativistic quantum mechanics; (2) the absence or unimportance of all processes in which more than two product nuclei are formed; (3) the absence or unimportance of all processes of creation or destruction; and (4) the existence of a finite radial separation beyond which no nuclear interactions occur, although Coulomb interactions are given special treatment. [In practical applications two of these four assumptions may be violated in one degree or another: (1) The theory may be used for relativistic neutron energies, and corrected for relativistic effects; nevertheless, non-relativistic quantum mechanics is assumed. (2) A fission experiment with more than two final products is treated as a two-step process. That is, the immediate result of the neutron-nuclide interaction is assumed to be limited to two final products, at least one of which decays prior to detection.] +R-matrix theory is based on the following assumptions\footnote{In practical applications two of these four assumptions may be violated in one degree or another: (1) The theory may be used for relativistic neutron energies, and corrected for relativistic effects; nevertheless, non-relativistic quantum mechanics is assumed. (2) A fission experiment with more than two final products is treated as a two-step process. That is, the immediate result of the neutron-nuclide interaction is assumed to be limited to two final products, at least one of which decays prior to detection.}: + +(1) the applicability of non-relativistic quantum mechanics; + +(2) the absence or unimportance of all processes in which more than two product nuclei are formed; + +(3) the absence or unimportance of all processes of creation or destruction; and + +(4) the existence of a finite radial separation beyond which no nuclear interactions occur, although Coulomb interactions are given special treatment. + +R-matrix theory is expressed in terms of channels, where a channel is defined as a pair of (incoming or outgoing) particles, plus specific information relevant to the interaction between the two particles. A schematic depicting entrance and exit channels is shown in Fig. \ref{scattering-theory_rmatrix_channel_diagram}. Note that entrance channels can also occur as exit channels, but some exit channels (e.g., fission channels) do not occur as entrance channels. Two interacting particles are shown in the portion of the figure that is labeled ``Interior Region''; here the particles are separated by less than the interaction radius $a$. + +\begin{figure} + \centering + \includegraphics[width=0.5\textwidth]{figures/rmatrix_inc_channel.pdf} \\[\smallskipamount] + \includegraphics[width=0.5\textwidth]{figures/rmatrix_interior_region.pdf}\hfill + \includegraphics[width=0.5\textwidth]{figures/rmatrix_exit_channel.pdf} + \caption{Schematic of entrance and exit channels as used in scattering theory. For the interior region (with separation distance $r < a$), no assumptions are made about the nature of the interaction. In the figure, $m$, $i$, and $z$ refer to the mass, spin, and charge of the incident particle while $M$, $I$ and $Z$ refer to the target particle. Orbital angular momentum is denoted by $l$ and velocity by $v$. Primes are used for post-collision quantities.} + \label{scattering-theory_rmatrix_channel_diagram} +\end{figure} + +In Section II.A\ref{}, general equations of scattering theory are presented and their derivations +discussed. The fundamental R-matrix equations are presented. Section II.A.1\ref{} gives a detailed +derivation of the equations for a simple case. Section II.A.2\ref{} shows the relationship between the +R-matrix and the A-matrix, which is another common representation of scattering theory. + +The approximations to R-matrix theory available in the SAMMY code are detailed in +Section II.B\ref{}. The recommended choice for most applications is the Reich-Moore approximation, +described in Section II.B.1\ref{}. For some applications, the Reich-Moore approximation is +inadequate; for those cases, a method for using SAMMY's Reich-Moore approximation to +mimic the full (exact) R-matrix is presented Section II.B.2\ref{}. Two historically useful but now +obsolete approximations are single-level and multilevel Breit Wigner (SLBW and MLBW), +discussed in Section II.B.3\ref{}. Provisions for including non-compound (direct) effects are +discussed in Section II.B.4\ref{}. + +In Section II.C\ref{}, details are given for the SAMMY nomenclature and other conventions, +for transformations to the center-of-momentum system, and for the calculation of penetrability, +shift factors, and hard-sphere phase shifts in both Coulomb and non-Coulomb cases. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Equations For Scattering theory} \label{sec:equations-for-scattering-theory} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +In this section, equations for scattering theory are presented but not derived. Specifics for +the R-matrix formulation of scattering theory are presented in Section II.A.1\ref{}, which provides a +discussion of an alternative formulation (the A-matrix). Readers interested in the derivation of +the equations for scattering theory are referred to the Lane and Thomas article \cite{lane_thomas_1958} for a +detailed derivation in the general case, or to Section II.A.2\ref{} of this document for a simplified +version. + +In scattering theory, a channel may be defined by $c = (\alpha, l, s, J)$, where the following +definitions apply: + +\begin{itemize} +\item $\alpha$ represents the two particles making up the channel; $\alpha$ includes mass ($m$ and $M$), charge ($z$ and $Z$), spin ($i$ and $I$ ) with associated parities, and all other quantum numbers for each of the two particles, plus the Q-value (equivalent to the negative of the threshold energy in the +center of momentum system). +\item $l$ is the orbital angular momentum of the pair, and the associated parity is given by $(-1)^l$. +\item $s$ represents the channel spin (including the associated parity); that is, $s$ is the quantized +vector sum of the spins of the two particles of the pair: $\vec{s} = \vec{i} + \vec{I}$ +\item $J$ is the total angular momentum (and associated parity); that is, $J$ is the quantized vector sum +of $l$ and $s$: $\vec{J} = \vec{l} + \vec{s}$. +\end{itemize} diff --git a/sammy/PackagesList.cmake b/sammy/PackagesList.cmake index 54dd1e89b..7d48709ed 100644 --- a/sammy/PackagesList.cmake +++ b/sammy/PackagesList.cmake @@ -16,6 +16,7 @@ SET( SAMMY_PACKAGES_AND_DIRS_AND_CLASSIFICATIONS coulomb src/coulomb PS endf src/endf PS salmon src/salmon PS + convolution src/convolution PS io src/io PS sammy_executable src/sammy PS samdis src/samdis PS diff --git a/sammy/script/options_sammy_packages.cmake b/sammy/script/options_sammy_packages.cmake index b25c25db1..3613e4871 100755 --- a/sammy/script/options_sammy_packages.cmake +++ b/sammy/script/options_sammy_packages.cmake @@ -9,6 +9,7 @@ SET(_list coulomb endf salmon +convolution io sammy_executable samdis diff --git a/sammy/src/blk/CapYCorrections_common.f90 b/sammy/src/blk/CapYCorrections_common.f90 new file mode 100644 index 000000000..e4427788e --- /dev/null +++ b/sammy/src/blk/CapYCorrections_common.f90 @@ -0,0 +1,12 @@ +! /********************************************************** +! * This common block style module is a temporary solution +! * used to pass the variables contained in C++ classes until +! * the code has been fully modernized. +! **********************************************************/ +module CapYCorrections_common_m + use CapYieldCorrections_M + IMPLICIT NONE + + type(CapYieldCorrections)::capYieldCor + +end module CapYCorrections_common_m diff --git a/sammy/src/blk/Logic_ssm_common.f90 b/sammy/src/blk/Logic_ssm_common.f90 index e07b0b584..fb1c57a90 100644 --- a/sammy/src/blk/Logic_ssm_common.f90 +++ b/sammy/src/blk/Logic_ssm_common.f90 @@ -1,6 +1,7 @@ ! replaces contents of B58ZYX which contains common block 'Logic_Ssm' module logic_ssm_common_m ! *** B58ZYX + use AllocateFunctions_m IMPLICIT NONE LOGICAL,save :: Self_Shield_Only @@ -16,7 +17,7 @@ module logic_ssm_common_m integer,save :: Isqfb integer,save :: Idsqfb integer,save :: Idpsqf - integer,save :: Iqfb + real(kind=8), allocatable,dimension(:)::A_Iqfb integer,save :: Idvqfb integer,save :: Idelas integer,save :: Idt @@ -34,7 +35,7 @@ module logic_ssm_common_m integer, save :: Icsx integer, save :: Iepx integer, save :: Iggx - integer, save :: Iiex + integer, allocatable,dimension(:)::I_Iiex integer, save :: Idyyy1 integer, save :: Idyyy2 integer, save :: Idyy2q @@ -53,7 +54,7 @@ module logic_ssm_common_m integer, save :: Idy2aa integer, save :: Idy2aq integer, save :: Idyaqq - integer, save :: Ixtptw + real(kind=8), allocatable,dimension(:)::A_Ixtptw integer, save :: Ixtptv integer, save :: Interp_Small_Times integer, save :: Icthet @@ -71,4 +72,20 @@ module logic_ssm_common_m real(8) :: Dkadu real(8) :: corr_ka + contains + subroutine make_A_Ixtptw(want) + integer::want + call allocate_real_data(A_Ixtptw,want) + end subroutine make_A_Ixtptw + + subroutine make_A_Iqfb(want) + integer::want + call allocate_real_data(A_Iqfb,want) + end subroutine make_A_Iqfb + + subroutine make_I_Iiex(want) + integer::want + call allocate_integer_data(I_Iiex,want) + end subroutine make_I_Iiex + end module logic_ssm_common_m diff --git a/sammy/src/convolution/CMakeLists.txt b/sammy/src/convolution/CMakeLists.txt index 5599a146c..81c874b58 100644 --- a/sammy/src/convolution/CMakeLists.txt +++ b/sammy/src/convolution/CMakeLists.txt @@ -10,27 +10,30 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) # Set headers SET(HEADERS + CapYieldCorrections.h + + interface/cpp/CapYieldCorrectionsInterface.h ) APPEND_SET(CONVOLUTION_SOURCES + CapYieldCorrections.cpp - + interface/cpp/CapYieldCorrectionsInterface.cpp + interface/fortran/CapYieldCorrections_I.f90 + interface/fortran/CapYieldCorrections_M.f90 ) TRIBITS_ADD_LIBRARY( - SammyIOUtilsLib + SammyConvolutionUtilsLib SOURCES ${CONVOLUTION_SOURCES} ) INSTALL(FILES ${HEADERS} DESTINATION "src/convolution") -# temporarily disable until we properly solve the + # Nemesis gtest dependency -IF (TPL_ENABLE_NEMESIS) - MESSAGE(STATUS "TPL_ENABLE_NEMESIS was ON, but io gtest is currently disabled") - #TRIBITS_ADD_TEST_DIRECTORIES(tests) -ENDIF() +TRIBITS_ADD_TEST_DIRECTORIES(tests) TRIBITS_PACKAGE_POSTPROCESS() diff --git a/sammy/src/convolution/CapYieldCorrections.cpp b/sammy/src/convolution/CapYieldCorrections.cpp new file mode 100644 index 000000000..ace8fdc6c --- /dev/null +++ b/sammy/src/convolution/CapYieldCorrections.cpp @@ -0,0 +1,134 @@ +#include "CapYieldCorrections.h" +#include <cmath> +#include <iostream> +#include <sstream> +#include <exception> +#include <stdexcept> + +namespace sammy{ + + // Maximum absolute value for the std::exp() function before + // under/overflow + #define MAX_IEEE_EXPONENT 708.4 + + CapYieldCorrections::CapYieldCorrections() + { + gammaCor = 0.0; + } + + CapYieldCorrections::CapYieldCorrections(const CapYieldCorrections &orig) + { + gammaCor = orig.gammaCor; + } + + + void CapYieldCorrections::gammaAttenCorr(const double &thickness, + const double &sigma_t, + const double &attenFactor, + double &yield) + { + + // Macroscopic cross section + double N_sigma = thickness*sigma_t; + + // These checks prevent divide-by-zero situtations + CapYieldCorrections::check_nsigma(N_sigma); + CapYieldCorrections::check_attenFactor(attenFactor); + + // Correction factor gammaCor for use in this class + gammaCor = 1.0/(1.0+attenFactor/N_sigma) * (1-std::exp(-N_sigma-attenFactor)) / (1-std::exp(-N_sigma)); + + CapYieldCorrections::check_gammaCor(gammaCor); + + yield = yield * gammaCor; + + } + + void CapYieldCorrections::derivGammaAttenCorr(const double &thickness, const double &sigma_t, + const double &attenFactor,const double &derivSigmaTot, + const double &unattenuatedYield, double &derivYield ) + { + // Macroscopic cross section + double N_sigma = thickness*sigma_t; + // e to the power of neg N_sigma + double exp_Nsig = std::exp(-N_sigma); + // e to the power of neg N_sigma minus attenFactor + double exp_Nsig_c1 = std::exp(-attenFactor-N_sigma); + + // These checks prevent divide-by-zero situtations + CapYieldCorrections::check_nsigma(N_sigma); + CapYieldCorrections::check_attenFactor(attenFactor); + + // Correction factor gammaCor for use in this class + if( gammaCor == 0.0 ){ + gammaCor = 1.0/(1.0+attenFactor/N_sigma) * (1-std::exp(-N_sigma-attenFactor)) / (1-std::exp(-N_sigma)); + } + + CapYieldCorrections::check_gammaCor(gammaCor); + + // Derivative of k_a w.r.t. total cross section + double alpha = (1-exp_Nsig) * (exp_Nsig_c1 * thickness * (1+attenFactor/(N_sigma)) + + attenFactor/(thickness*std::pow(sigma_t,2)) * (1-exp_Nsig_c1)) / std::pow((1+attenFactor/(N_sigma)),2); + double beta = exp_Nsig*(1-exp_Nsig_c1) * thickness / (1+attenFactor/(N_sigma)); + double tau = std::pow((1-exp_Nsig),2); + double dka_dtot = ( alpha - beta ) / tau; + + // Derivative of k_a w.r.t. u-parameter (d(k_a)/dsig_t * d(sig_t)/du) + double dka_du = dka_dtot * derivSigmaTot; + + // Derivative of (k_a * yield) w.r.t. u-paramater + derivYield = dka_du * unattenuatedYield + derivYield * gammaCor; + } + + void CapYieldCorrections::check_nsigma(double &N_sigma) + { + // divide by zero check + if( N_sigma <= 0.0 ){ + std::ostringstream err; + err << "(sample thickness [at/b]) * (tot. x.s. [b]) is less than zero" << std::endl; + throw std::runtime_error(err.str()); + } + + // under/overflow check for exponent (double assumed) + if( std::abs(N_sigma) > MAX_IEEE_EXPONENT){ + std::ostringstream err; + err << "Under or overflow may occur in exponent. Check sample thickness" << std::endl; + err << " and total cross section values." << std::endl; + throw std::runtime_error(err.str()); + } + + + } + + void CapYieldCorrections::check_attenFactor(const double &attenFactor) + { + // divide by zero check + if( attenFactor <= 0.0 ){ + std::ostringstream err; + err << "Gamma attenuation factor C1 (from documentation) is less than zero" << std::endl; + err << "C1 = " << attenFactor << std::endl; + throw std::runtime_error(err.str()); + } + + // under/overflow check for exponent (double assumed) + if( std::abs(attenFactor) > MAX_IEEE_EXPONENT){ + std::ostringstream err; + err << "Gamma attenuation factor C1 (from documentation) is too large, and" << std::endl; + err << " may cause under/overflow issues." << std::endl; + err << "C1 = " << attenFactor << std::endl; + throw std::runtime_error(err.str()); + } + } + + void CapYieldCorrections::check_gammaCor(double &gammaCor) + { + if( gammaCor <= 0.0 or gammaCor > 1.0 ){ + std::ostringstream err; + err << "The gamma attenuation correction to the yield is less than or" << std::endl; + err << "equal to zero or greater than 1.0" << std::endl; + err << "k_a = " << gammaCor << std::endl; + throw std::runtime_error(err.str()); + } + } + +} \ No newline at end of file diff --git a/sammy/src/convolution/CapYieldCorrections.h b/sammy/src/convolution/CapYieldCorrections.h index a019ba2f6..da172c42c 100644 --- a/sammy/src/convolution/CapYieldCorrections.h +++ b/sammy/src/convolution/CapYieldCorrections.h @@ -7,6 +7,10 @@ namespace sammy{ /******************************************************* * Class contains corrections specific to the capture * yield. This includes capture gamma attenuation. + * + * For future organization of the SAMMY code, it might be + * best to make this a child class of some yield/observable + * class. * *******************************************************/ class CapYieldCorrections @@ -14,7 +18,7 @@ namespace sammy{ public: CapYieldCorrections(); CapYieldCorrections(const CapYieldCorrections& orig); - virtual ~CapYieldCorrections(); + virtual ~CapYieldCorrections(){}; /** * Calculate the correction factor \f$ k_a \f$ from input variable \f$ C1 \f$ according @@ -22,18 +26,67 @@ namespace sammy{ * \f[ k_a = \frac{ (1-e^{-N\cdot \sigma_{t}(E)-C1}) }{ (1-e^{-N\cdot\sigma_{t}(E)}) } \cdot \left(\frac{ 1 }{ (1 + C1/N/\sigma_{t}(E)) }\right) \f] * where \f$ \sigma_{t}(E) \f$ is the total cross section and \f$N\f$ is the sample thickness * in atom/barn. This assumes a simple model of capture yield (only the first interaction). + * This will apply the correction to the yield and store the correction factor in memory for + * the derivative calculation. + * * @param thickness The atom/barn thickness of the sample (\f$N\f$) * @param sigma_t The total cross section at a single energy (\f$\sigma_t(E)\f$) + * @param attenFactor the attenuation factor (\f$C1\f$) shown above, analogous to a photon attenuation coefficient * @param yield The yield, which will be modified by the correction factor \f$k_a\f$ */ - void gammaAttenCorr(double thickness, std::vector<double> sigma_t, std::vector<double> &yield ); + void gammaAttenCorr(const double &thickness, const double &sigma_t, const double &attenFactor, double &yield ); /** - * Calculate the derivative + * Calculate the derivative of the attenuated yield with respect to the u-parameters + * and update the derivative to the calculated value: + * \f[ \frac{d}{du}(k_a Y) = \frac{d(k_a)}{d\sigma_t} \cdot \frac{d(\sigma_t)}{du} \cdot Y + \frac{d(Y)}{du} \cdot k_a \f] + * + * \f[ \frac{\partial (k_aY)}{\partial u} = \frac{\partial k_a}{\partial \sigma_t}\frac{\partial \sigma_t}{\partial u}Y + k_a\frac{\partial Y}{\partial u} \f] + * + * \f[ \frac{\partial k_a}{\partial \sigma_t} = \frac{\alpha - \beta}{\tau} \f] + * + * \f[ \alpha=\frac{(1-e^{-N\sigma_t})\left(e^{-(N\sigma_t+C_1)}N(1+\frac{C_1}{N\sigma_t})+\frac{C_1(1-e^{-(N\sigma_t+C_1)})}{N\sigma_t^2}\right)}{(1+\frac{C_1}{N\sigma_t})^2} \f] + * + * \f[ \beta = \frac{Ne^{-N\sigma_t}\left(1-e^{-(N\sigma_t+C_1)}\right)}{1+\frac{C_1}{N\sigma_t}} \f] + * + * \f[ \tau = (1-e^{-N\sigma_t})^2 \f] + * + * @param thickness The atom/barn thickness of the sample (\f$N\f$) + * @param sigma_t The total cross section at a single energy (\f$\sigma_t(E)\f$) + * @param attenFactor the attenuation factor (\f$C1\f$) shown above, analogous to a photon attenuation coefficient + * @param unattenuatedYield the yield before the attenuation correction has been applied + * @param derivSigmaTot the derivative of the total cross section w.r.t. the u-parameters + * @param derivYield the derivative of the unattenuated yield, which will be updated to the new value */ + void derivGammaAttenCorr(const double &thickness, const double &sigma_t, const double &attenFactor, + const double &derivSigmaTot, const double &unattenuatedYield, double &derivYield ); private: + /* The gamma attenuation correction factor which multiplies the capture yield */ + double gammaCor; + + /** + * Check if input will cause mathematical errors: divide by zero and over/underflow + * + * @param N_sigma the thickness [at/b] multiplied by the total cross section [b] + */ + void check_nsigma(double &N_sigma); + + /** + * Check if input will cause mathematical errors: divide by zero and over/underflow + * + * @param attenFactor the attenuation factor (\f$C1\f$) shown above, analogous to a photon attenuation coefficient + */ + void check_attenFactor(const double &attenFactor); + + /** + * Check if input will cause mathematical errors: divide by zero and over/underflow + * + * @param gammaCor the gamma attenuation correction applied to the yield + */ + void check_gammaCor(double &gammaCor); + }; } diff --git a/sammy/src/convolution/cmake/Dependencies.cmake b/sammy/src/convolution/cmake/Dependencies.cmake new file mode 100644 index 000000000..13244a48a --- /dev/null +++ b/sammy/src/convolution/cmake/Dependencies.cmake @@ -0,0 +1,8 @@ +SET(LIB_REQUIRED_DEP_PACKAGES) +SET(LIB_OPTIONAL_DEP_PACKAGES) +SET(TEST_REQUIRED_DEP_PACKAGES) +SET(TEST_OPTIONAL_DEP_PACKAGES) +SET(LIB_REQUIRED_DEP_TPLS SCALE) +SET(LIB_OPTIONAL_DEP_TPLS) +SET(TEST_REQUIRED_DEP_TPLS Nemesis_gtest) +SET(TEST_OPTIONAL_DEP_TPLS) diff --git a/sammy/src/convolution/interface/cix/CapYieldCorrections.cpp2f.xml b/sammy/src/convolution/interface/cix/CapYieldCorrections.cpp2f.xml new file mode 100644 index 000000000..4088cff04 --- /dev/null +++ b/sammy/src/convolution/interface/cix/CapYieldCorrections.cpp2f.xml @@ -0,0 +1,24 @@ +<generate name="CapYieldCorrections"> + <include_relative name="../CapYieldCorrections.h"/> + <using_namespace name="sammy"/> + + <class name="CapYieldCorrections"> + + <method name="gammaAttenCorr"> + <param name="thickness" type="double"/> + <param name="sigma_t" type="double"/> + <param name="attenFactor" type="double"/> + <param name="yield" type="double"/> + </method> + + <method name="derivGammaAttenCorr"> + <param name="thickness" type="double"/> + <param name="sigma_t" type="double"/> + <param name="attenFactor" type="double"/> + <param name="derivSigmaTot" type="double"/> + <param name="unattenuatedYield" type="double"/> + <param name="derivYield" type="double"/> + </method> + + </class> +</generate> \ No newline at end of file diff --git a/sammy/src/convolution/interface/cpp/CapYieldCorrectionsInterface.cpp b/sammy/src/convolution/interface/cpp/CapYieldCorrectionsInterface.cpp new file mode 100644 index 000000000..9c9678dd5 --- /dev/null +++ b/sammy/src/convolution/interface/cpp/CapYieldCorrectionsInterface.cpp @@ -0,0 +1,31 @@ +/*! +* This file has been dynamically generated by Class Interface Xml (CIX) +* DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION +* If changes need to occur, modify the appropriate CIX xml file +* Date Generated: Fri Feb 07 12:33:43 EST 2020 +* If any issues are experiences with this generated file that cannot be fixed +* with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov +*/ +#include <string.h> +#include "CapYieldCorrectionsInterface.h" +using namespace sammy; +void CapYieldCorrections_gammaAttenCorr(void * CapYieldCorrections_ptr,double * thickness,double * sigma_t,double * attenFactor,double * yield) +{ + ((CapYieldCorrections*)CapYieldCorrections_ptr)->gammaAttenCorr(*thickness,*sigma_t,*attenFactor,*yield); +} + +void CapYieldCorrections_derivGammaAttenCorr(void * CapYieldCorrections_ptr,double * thickness,double * sigma_t,double * attenFactor,double * derivSigmaTot,double * unattenuatedYield,double * derivYield) +{ + ((CapYieldCorrections*)CapYieldCorrections_ptr)->derivGammaAttenCorr(*thickness,*sigma_t,*attenFactor,*derivSigmaTot,*unattenuatedYield,*derivYield); +} + +void* CapYieldCorrections_initialize() +{ + return new CapYieldCorrections(); +} + +void CapYieldCorrections_destroy(void * CapYieldCorrections_ptr) +{ + delete (CapYieldCorrections*)CapYieldCorrections_ptr; +} + diff --git a/sammy/src/convolution/interface/cpp/CapYieldCorrectionsInterface.h b/sammy/src/convolution/interface/cpp/CapYieldCorrectionsInterface.h new file mode 100644 index 000000000..234028210 --- /dev/null +++ b/sammy/src/convolution/interface/cpp/CapYieldCorrectionsInterface.h @@ -0,0 +1,23 @@ +/*! +* This file has been dynamically generated by Class Interface Xml (CIX) +* DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION +* If changes need to occur, modify the appropriate CIX xml file +* Date Generated: Fri Feb 07 12:33:43 EST 2020 +* If any issues are experiences with this generated file that cannot be fixed +* with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov +*/ +#ifndef CAPYIELDCORRECTIONSINTERFACE_H +#define CAPYIELDCORRECTIONSINTERFACE_H +#include "../../CapYieldCorrections.h" +using namespace sammy; +#ifdef __cplusplus +extern "C" { +#endif +void CapYieldCorrections_gammaAttenCorr(void * CapYieldCorrections_ptr,double * thickness,double * sigma_t,double * attenFactor,double * yield); +void CapYieldCorrections_derivGammaAttenCorr(void * CapYieldCorrections_ptr,double * thickness,double * sigma_t,double * attenFactor,double * derivSigmaTot,double * unattenuatedYield,double * derivYield); +void* CapYieldCorrections_initialize(); +void CapYieldCorrections_destroy(void * CapYieldCorrections_ptr); +#ifdef __cplusplus +} +#endif +#endif /* CAPYIELDCORRECTIONSINTERFACE_H */ diff --git a/sammy/src/convolution/interface/fortran/CapYieldCorrections_I.f90 b/sammy/src/convolution/interface/fortran/CapYieldCorrections_I.f90 new file mode 100644 index 000000000..6ae142960 --- /dev/null +++ b/sammy/src/convolution/interface/fortran/CapYieldCorrections_I.f90 @@ -0,0 +1,43 @@ +!> +!! This file has been dynamically generated by Class Interface Xml (CIX) +!! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION +!! If changes need to occur, modify the appropriate CIX xml file +!! Date Generated: Fri Feb 07 12:33:43 EST 2020 +!! If any issues are experiences with this generated file that cannot be fixed +!! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov +!!/ +module CapYieldCorrections_I +use, intrinsic :: ISO_C_BINDING +interface +subroutine f_CapYieldCorrections_gammaAttenCorr(CapYieldCorrections_ptr, thickness,sigma_t,attenFactor,yield ) BIND(C,name="CapYieldCorrections_gammaAttenCorr") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: CapYieldCorrections_ptr; + real(C_DOUBLE) :: thickness; + real(C_DOUBLE) :: sigma_t; + real(C_DOUBLE) :: attenFactor; + real(C_DOUBLE) :: yield; +end subroutine +subroutine f_CapYieldCorrections_derivGammaAttenCorr(CapYieldCorrections_ptr, thickness,sigma_t,attenFactor,derivSigmaTot,unattenuatedYield,derivYield ) BIND(C,name="CapYieldCorrections_derivGammaAttenCorr") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: CapYieldCorrections_ptr; + real(C_DOUBLE) :: thickness; + real(C_DOUBLE) :: sigma_t; + real(C_DOUBLE) :: attenFactor; + real(C_DOUBLE) :: derivSigmaTot; + real(C_DOUBLE) :: unattenuatedYield; + real(C_DOUBLE) :: derivYield; +end subroutine +type(C_PTR) function f_CapYieldCorrections_initialize( )BIND(C,name="CapYieldCorrections_initialize") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR) :: CapYieldCorrections_ptr; +end function +subroutine f_CapYieldCorrections_destroy(this) BIND(C,name="CapYieldCorrections_destroy") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: this; +end subroutine +end interface +end module CapYieldCorrections_I diff --git a/sammy/src/convolution/interface/fortran/CapYieldCorrections_M.f90 b/sammy/src/convolution/interface/fortran/CapYieldCorrections_M.f90 new file mode 100644 index 000000000..393f77dff --- /dev/null +++ b/sammy/src/convolution/interface/fortran/CapYieldCorrections_M.f90 @@ -0,0 +1,52 @@ +!> +!! This file has been dynamically generated by Class Interface Xml (CIX) +!! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION +!! If changes need to occur, modify the appropriate CIX xml file +!! Date Generated: Fri Feb 07 12:33:43 EST 2020 +!! If any issues are experiences with this generated file that cannot be fixed +!! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov +!!/ +module CapYieldCorrections_M +use, intrinsic :: ISO_C_BINDING +use CapYieldCorrections_I +type CapYieldCorrections + type(C_PTR) :: instance_ptr=C_NULL_PTR + contains + procedure, pass(this) :: gammaAttenCorr => CapYieldCorrections_gammaAttenCorr + procedure, pass(this) :: derivGammaAttenCorr => CapYieldCorrections_derivGammaAttenCorr + procedure, pass(this) :: initialize => CapYieldCorrections_initialize + procedure, pass(this) :: destroy => CapYieldCorrections_destroy +end type CapYieldCorrections +contains +subroutine CapYieldCorrections_gammaAttenCorr(this, thickness, sigma_t, attenFactor, yield) + implicit none + class(CapYieldCorrections)::this + real(C_DOUBLE)::thickness + real(C_DOUBLE)::sigma_t + real(C_DOUBLE)::attenFactor + real(C_DOUBLE)::yield + call f_CapYieldCorrections_gammaAttenCorr(this%instance_ptr, thickness,sigma_t,attenFactor,yield) +end subroutine +subroutine CapYieldCorrections_derivGammaAttenCorr(this, thickness, sigma_t, attenFactor, derivSigmaTot, unattenuatedYield, derivYield) + implicit none + class(CapYieldCorrections)::this + real(C_DOUBLE)::thickness + real(C_DOUBLE)::sigma_t + real(C_DOUBLE)::attenFactor + real(C_DOUBLE)::derivSigmaTot + real(C_DOUBLE)::unattenuatedYield + real(C_DOUBLE)::derivYield + call f_CapYieldCorrections_derivGammaAttenCorr(this%instance_ptr, thickness,sigma_t,attenFactor,derivSigmaTot,unattenuatedYield,derivYield) +end subroutine +subroutine CapYieldCorrections_initialize(this) + implicit none + class(CapYieldCorrections) :: this + this%instance_ptr = f_CapYieldCorrections_initialize() +end subroutine +subroutine CapYieldCorrections_destroy(this) + implicit none + class(CapYieldCorrections) :: this + call f_CapYieldCorrections_destroy(this%instance_ptr) + this%instance_ptr = C_NULL_PTR +end subroutine +end module CapYieldCorrections_M diff --git a/sammy/src/convolution/tests/CMakeLists.txt b/sammy/src/convolution/tests/CMakeLists.txt new file mode 100644 index 000000000..50399bf91 --- /dev/null +++ b/sammy/src/convolution/tests/CMakeLists.txt @@ -0,0 +1,3 @@ +include(NemesisTest) + +ADD_NEMESIS_TEST(CapYieldCorrectionsTest.cpp TIMEOUT 60000 NP 1 ) diff --git a/sammy/src/convolution/tests/CapYieldCorrectionsTest.cpp b/sammy/src/convolution/tests/CapYieldCorrectionsTest.cpp new file mode 100644 index 000000000..6ddc83b07 --- /dev/null +++ b/sammy/src/convolution/tests/CapYieldCorrectionsTest.cpp @@ -0,0 +1,359 @@ +#include "Nemesis/gtest/Gtest_Functions.hh" +#include "Nemesis/gtest/nemesis_gtest.hh" +#include "../CapYieldCorrections.h" +#include <exception> +#include <stdexcept> + + + +/************************************************************************************************** +* Does the gamma attenuation function have the right math? +**************************************************************************************************/ +TEST(CapYieldCorrections,gammaAttenuation){ + + const double thickness = std::log(2.0); + const double sigma_t = 2.0; + const double attenFactor = std::log(2.0); + double yield = 1.0; + + sammy::CapYieldCorrections result; + + // modifies the yield + result.gammaAttenCorr(thickness,sigma_t,attenFactor,yield); + + double gold = 1.0/(1.0+1.0/2.0) * (1.0-1.0/8.0)/(1.0-1.0/4.0); + + ASSERT_EQ(gold,yield); +} + + +/************************************************************************************************** +* Does the derivative of the gamma attenuation function w.r.t. total x.s. have the right math? +**************************************************************************************************/ +TEST(CapYieldCorrections,derivGammaAttenuation){ + + const double thickness = std::log(2.0); + const double sigma_t = 2.0; + const double attenFactor = std::log(2.0); + const double derivSigmaTot = 2.0; + const double unattenuatedYield = 1.0; + double derivYield = 1.0; + + + sammy::CapYieldCorrections result; + + // -------------- unused but maybe helpful math ------------------------------------- + // double gold_alpha = (1.0-1/4.0) * ( 1/8.0 * std::log(2) * (1.0+1/2.0) + 1/4.0*(1-1/8.0) ) / std::pow(1.0+1/2.0,2); + // double gold_beta = 1/4.0*(1.0-1/8.0)*std::log(2) / (1.0+1/2.0); + // double gold_tau = std::pow(1.0-1/4.0,2); + // double gold_broken_up_deriv_ka_sigtot = ( gold_alpha - gold_beta ) / gold_tau; + // ---------------------------------------------------------------------------------- + + // derivative of k_a w.r.t. the total cross section "sigma_t" + double gold_deriv_ka_sigtot = ( (1.0-1/4.0) * ( 1/8.0 * std::log(2) * (1.0+1/2.0) + 1/4.0*(1-1/8.0) ) / std::pow(1.0+1/2.0,2) + - 1/4.0*(1.0-1/8.0)*std::log(2) / (1.0+1/2.0) ) + / std::pow(1.0-1/4.0,2); + + double deriv_ka_du = derivSigmaTot * gold_deriv_ka_sigtot; + + // { ----- Gamma attenuation correction ----- } + double gold_deriv = deriv_ka_du * unattenuatedYield + derivYield * 1.0/(1.0+1.0/2.0) * (1.0-1.0/8.0)/(1.0-1.0/4.0); + + // modifies derivYield + result.derivGammaAttenCorr(thickness,sigma_t,attenFactor,derivSigmaTot,unattenuatedYield,derivYield); + + ASSERT_EQ(gold_deriv,derivYield); +} + +/************************************************************************************************** +* Cause error to be thrown by gamma cor. func. from bad input thickness value (less than zero) +**************************************************************************************************/ +TEST(CapYieldCorrections,throwError_gammAttCor_Nsigma_ltz){ + + int result; + + sammy::CapYieldCorrections cyc; + const double thickness = -1.0; + const double sigma_t = 2.0; + const double attenFactor = std::log(2.0); + double yield = 1.0; + + // Try the functions with bad input, if none throw an error the test has failed + try{ + cyc.gammaAttenCorr(thickness,sigma_t,attenFactor,yield ); + + result = -1; + } + catch(...){ + result = 0; + } + + int gold = 0; + + ASSERT_EQ(gold,result); +} + +/************************************************************************************************** +* Cause error to be thrown by gamma cor. func. from bad input thickness value (abs(N*sigma) > ~708) +**************************************************************************************************/ +TEST(CapYieldCorrections,throwError_gammAttCor_Nsigma_gtmax){ + + int result; + + sammy::CapYieldCorrections cyc; + const double thickness = 355.0; + const double sigma_t = 2.0; + const double attenFactor = 2.0; + double yield = 1.0; + + // Try the functions with bad input, if none throw an error the test has failed + try{ + cyc.gammaAttenCorr(thickness,sigma_t,attenFactor,yield ); + + result = -1; + } + catch(...){ + result = 0; + } + + int gold = 0; + + ASSERT_EQ(gold,result); +} + +/************************************************************************************************** +* Cause error to be thrown by gamma cor. func. from bad attenuation factor (less than zero) +**************************************************************************************************/ +TEST(CapYieldCorrections,throwError_gammAttCor_attFactor_ltz){ + + int result; + + sammy::CapYieldCorrections cyc; + const double thickness = 1.0; + const double sigma_t = 2.0; + const double attenFactor = -1.0; + double yield = 1.0; + + // Try the functions with bad input, if none throw an error the test has failed + try{ + cyc.gammaAttenCorr(thickness,sigma_t,attenFactor,yield ); + + result = -1; + } + catch(...){ + result = 0; + } + + int gold = 0; + + ASSERT_EQ(gold,result); +} + +/************************************************************************************************** +* Cause error to be thrown by gamma cor. func. from bad attenuation factor (abs(N*sigma) > ~708) +**************************************************************************************************/ +TEST(CapYieldCorrections,throwError_gammAttCor_attFactor_gtmax){ + + int result; + + sammy::CapYieldCorrections cyc; + const double thickness = 1.0; + const double sigma_t = 2.0; + const double attenFactor = 710.0; + double yield = 1.0; + + // Try the functions with bad input, if none throw an error the test has failed + try{ + cyc.gammaAttenCorr(thickness,sigma_t,attenFactor,yield ); + + result = -1; + } + catch(...){ + result = 0; + } + + int gold = 0; + + ASSERT_EQ(gold,result); +} + +/************************************************************************************************** +* Cause error to be thrown by gamma cor. func. from bad calculated gamma attenuation correction (> 0) +**************************************************************************************************/ +TEST(CapYieldCorrections,throwError_gammAttCor_gammaCor_gtone){ + + int result; + + sammy::CapYieldCorrections cyc; + const double thickness = 1.0; + const double sigma_t = 0.1; + const double attenFactor = -0.01; + double yield = 1.0; + + // Try the functions with bad input, if none throw an error the test has failed + try{ + cyc.gammaAttenCorr(thickness,sigma_t,attenFactor,yield ); + + result = -1; + } + catch(...){ + result = 0; + } + + int gold = 0; + + ASSERT_EQ(gold,result); +} + +/************************************************************************************************** +* Cause error to be thrown by derivative func. from bad input thickness value (less than zero) +**************************************************************************************************/ +TEST(CapYieldCorrections,throwError_derivGammAttCor_Nsigma_ltz){ + + int result; + + sammy::CapYieldCorrections cyc; + const double thickness = -1.0; + const double sigma_t = 2.0; + const double attenFactor = std::log(2.0); + const double derivSigmaTot = 2.0; + const double unattenuatedYield = 1.0; + double derivYield = 1.0; + + // Try the functions with bad input, if none throw an error the test has failed + try{ + cyc.derivGammaAttenCorr(thickness,sigma_t,attenFactor,derivSigmaTot,unattenuatedYield,derivYield ); + + result = -1; + } + catch(...){ + result = 0; + } + + int gold = 0; + + ASSERT_EQ(gold,result); +} + +/************************************************************************************************** +* Cause error to be thrown by derivative func. from bad input thickness value (abs(N*sigma) > ~708) +**************************************************************************************************/ +TEST(CapYieldCorrections,throwError_derivGammAttCor_Nsigma_gtmax){ + + int result; + + sammy::CapYieldCorrections cyc; + const double thickness = 355.0; + const double sigma_t = 2.0; + const double attenFactor = 2.0; + const double derivSigmaTot = 2.0; + const double unattenuatedYield = 1.0; + double derivYield = 1.0; + + // Try the functions with bad input, if none throw an error the test has failed + try{ + cyc.derivGammaAttenCorr(thickness,sigma_t,attenFactor,derivSigmaTot,unattenuatedYield,derivYield ); + + result = -1; + } + catch(...){ + result = 0; + } + + int gold = 0; + + ASSERT_EQ(gold,result); +} + +/************************************************************************************************** +* Cause error to be thrown by derivative func. from bad attenuation factor (less than zero) +**************************************************************************************************/ +TEST(CapYieldCorrections,throwError_derivGammAttCor_attFactor_ltz){ + + int result; + + sammy::CapYieldCorrections cyc; + const double thickness = 1.0; + const double sigma_t = 2.0; + const double attenFactor = -1.0; + const double derivSigmaTot = 2.0; + const double unattenuatedYield = 1.0; + double derivYield = 1.0; + + // Try the functions with bad input, if none throw an error the test has failed + try{ + cyc.derivGammaAttenCorr(thickness,sigma_t,attenFactor,derivSigmaTot,unattenuatedYield,derivYield ); + + result = -1; + } + catch(...){ + result = 0; + } + + int gold = 0; + + ASSERT_EQ(gold,result); +} + +/************************************************************************************************** +* Cause error to be thrown by derivative func. from bad attenuation factor (abs(N*sigma) > ~708) +**************************************************************************************************/ +TEST(CapYieldCorrections,throwError_derivGammAttCor_attFactor_gtmax){ + + int result; + + sammy::CapYieldCorrections cyc; + const double thickness = 1.0; + const double sigma_t = 2.0; + const double attenFactor = 710.0; + const double derivSigmaTot = 2.0; + const double unattenuatedYield = 1.0; + double derivYield = 1.0; + + // Try the functions with bad input, if none throw an error the test has failed + try{ + cyc.derivGammaAttenCorr(thickness,sigma_t,attenFactor,derivSigmaTot,unattenuatedYield,derivYield ); + + result = -1; + } + catch(...){ + result = 0; + } + + int gold = 0; + + ASSERT_EQ(gold,result); +} + +/************************************************************************************************** +* Cause error to be thrown by derivative func. from bad calculated gamma attenuation correction (> 0) +**************************************************************************************************/ +TEST(CapYieldCorrections,throwError_derivGammAttCor_gammaCor_gtone){ + + int result; + + sammy::CapYieldCorrections cyc; + const double thickness = 1.0; + const double sigma_t = 0.1; + const double attenFactor = -0.01; + const double derivSigmaTot = 2.0; + const double unattenuatedYield = 1.0; + double derivYield = 1.0; + + // Try the functions with bad input, if none throw an error the test has failed + try{ + cyc.derivGammaAttenCorr(thickness,sigma_t,attenFactor,derivSigmaTot,unattenuatedYield,derivYield ); + + result = -1; + } + catch(...){ + result = 0; + } + + int gold = 0; + + ASSERT_EQ(gold,result); +} + + + diff --git a/sammy/src/mso/mmso0.f b/sammy/src/mso/mmso0.f index 37e073d05..7543ed373 100644 --- a/sammy/src/mso/mmso0.f +++ b/sammy/src/mso/mmso0.f @@ -18,6 +18,7 @@ C use cbro_common_m use lbro_common_m use MultScatPars_common_m + use ssm_1_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION A(-Msize:Msize) C diff --git a/sammy/src/mso/mmso2.f b/sammy/src/mso/mmso2.f index a74b73c77..833f7f1d0 100644 --- a/sammy/src/mso/mmso2.f +++ b/sammy/src/mso/mmso2.f @@ -23,6 +23,8 @@ C use constn_common_m use EndfData_common_m use MultScatPars_common_m + use ssm_18_m + use ssm_20_m IMPLICIT DOUBLE PRECISION (a-h,o-z) LOGICAL Another_Process_will_Happen C @@ -332,6 +334,7 @@ C use cbro_common_m use lbro_common_m use MultScatPars_common_m + use ssm_9_m IMPLICIT DOUBLE PRECISION (a-h,o-z) LOGICAL Forward, Backward C diff --git a/sammy/src/mso/mmso5.f b/sammy/src/mso/mmso5.f index c0b966818..792fd5a5f 100644 --- a/sammy/src/mso/mmso5.f +++ b/sammy/src/mso/mmso5.f @@ -195,6 +195,7 @@ C C use fixedi_m use ifwrit_m + use ssm_18_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Energb(*), Xtpt(*), Ftheta(*), Qfb(*), Dqfb(*),Delas(*), * Dt(*), Dc(*), Ccclll(*), Dddlll(*), Totsig(*), Capsig(*), diff --git a/sammy/src/sam/msam.F b/sammy/src/sam/msam.F index ed1a51968..6f002252f 100755 --- a/sammy/src/sam/msam.F +++ b/sammy/src/sam/msam.F @@ -16,6 +16,7 @@ C use EndfData_common_m use MultScatPars_common_m use ExpPars_common_m + use ssm_m IMPLICIT DOUBLE PRECISION (A-H,O-Z) C This is the main routine for the SAMMY program diff --git a/sammy/src/sam012/CMakeLists.txt b/sammy/src/sam012/CMakeLists.txt index d55f501d7..36ac21575 100644 --- a/sammy/src/sam012/CMakeLists.txt +++ b/sammy/src/sam012/CMakeLists.txt @@ -12,7 +12,7 @@ TRIBITS_ADD_EXECUTABLE( sam012 NOEXEPREFIX NOEXESUFFIX - SOURCES ${SAM012_SOURCES} ../ssm/m012.f + SOURCES ${SAM012_SOURCES} ../ssm/m012.f90 LINKER_LANGUAGE Fortran INSTALLABLE ) diff --git a/sammy/src/sammy/CMakeLists.txt b/sammy/src/sammy/CMakeLists.txt index 7ecb1ea9f..503470e75 100644 --- a/sammy/src/sammy/CMakeLists.txt +++ b/sammy/src/sammy/CMakeLists.txt @@ -417,30 +417,30 @@ APPEND_SET(SAMMY_SOURCES ../squ/msqu0.f - ../ssm/mssm00.f - ../ssm/mssm01.f - ../ssm/mssm02.f - ../ssm/mssm03.f - ../ssm/mssm04.f - ../ssm/mssm05.f - ../ssm/mssm06.f - ../ssm/mssm07.f - ../ssm/mssm08.f - ../ssm/mssm09.f - ../ssm/mssm10.f - ../ssm/mssm11.f - ../ssm/mssm12.f - ../ssm/mssm13.f - ../ssm/mssm14.f - ../ssm/mssm15.f - ../ssm/mssm16.f - ../ssm/mssm17.f - ../ssm/mssm18.f - ../ssm/mssm19.f - ../ssm/mssm20.f - ../ssm/mssm21.f - ../ssm/mssm21a.f - ../ssm/mssm22.f + ../ssm/mssm00.f90 + ../ssm/mssm01.f90 + ../ssm/mssm02.f90 + ../ssm/mssm03.f90 + ../ssm/mssm04.f90 + ../ssm/mssm05.f90 + ../ssm/mssm06.f90 + ../ssm/mssm07.f90 + ../ssm/mssm08.f90 + ../ssm/mssm09.f90 + ../ssm/mssm10.f90 + ../ssm/mssm11.f90 + ../ssm/mssm12.f90 + ../ssm/mssm13.f90 + ../ssm/mssm14.f90 + ../ssm/mssm15.f90 + ../ssm/mssm16.f90 + ../ssm/mssm17.f90 + ../ssm/mssm18.f90 + ../ssm/mssm19.f90 + ../ssm/mssm20.f90 + ../ssm/mssm21.f90 + ../ssm/mssm22.f90 + ../ssm/ssm_utils.f90 ../the/mthe0.f ../the/mthe1.f @@ -572,6 +572,7 @@ APPEND_SET(SAMMY_SOURCES ../blk/AllocateFunctions.f90 ../blk/ExpPars_common.f90 ../blk/MultScatPars_common.f90 + ../blk/CapYCorrections_common.f90 ) TRIBITS_ADD_LIBRARY( diff --git a/sammy/src/sammy/cmake/Dependencies.cmake b/sammy/src/sammy/cmake/Dependencies.cmake index 3cbe5fa0e..82851db70 100644 --- a/sammy/src/sammy/cmake/Dependencies.cmake +++ b/sammy/src/sammy/cmake/Dependencies.cmake @@ -2,7 +2,7 @@ # it here for clarity - we can iterate on this later #add back in self_shielding library dependency when it is reintroduced (SSM subdir) #add back in global_data library when equivalency problems in library are resolved -SET(LIB_REQUIRED_DEP_PACKAGES endf coulomb salmon io) +SET(LIB_REQUIRED_DEP_PACKAGES endf coulomb salmon io convolution) SET(LIB_OPTIONAL_DEP_PACKAGES) SET(TEST_REQUIRED_DEP_PACKAGES TestRunner) SET(TEST_OPTIONAL_DEP_PACKAGES) diff --git a/sammy/src/ssm/m012.f b/sammy/src/ssm/m012.f90 similarity index 85% rename from sammy/src/ssm/m012.f rename to sammy/src/ssm/m012.f90 index b278036a7..e0321a522 100755 --- a/sammy/src/ssm/m012.f +++ b/sammy/src/ssm/m012.f90 @@ -1,30 +1,28 @@ -C -C -C -------------------------------------------------------------- -C +! +! +! -------------------------------------------------------------- +! PROGRAM Fix_Sam012 use EndfData_common_m -C -C *** PURPOSE -- Read ascii file (pieces of multiple-scattering -C *** correction) and create comparable odf file -C -C +! +! *** PURPOSE -- Read ascii file (pieces of multiple-scattering +! *** correction) and create comparable odf file +! +! IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION Energy(50000), Fzer(50000), Fone(50000), Ftwo(50000) CHARACTER*70 Asciif, Blank CHARACTER*50 Title DATA Nchmax /50000/ - DATA Blank /' * - * '/ -C + DATA Blank /' '/ +! call resParData%initialize() WRITE (6,10000) -10000 FORMAT (/, - 1' **********************************************************') +10000 FORMAT (/,' **********************************************************') WRITE (6,10100) 10100 FORMAT (/, ' *** SAM012 14 Aug 08 ***') WRITE (6,10000) -C +! WRITE (6,10200) 10200 FORMAT (' What is name of ASCII file containing Y0, Y1, & Y2 ?') READ (5,10300) Asciif @@ -32,7 +30,7 @@ C IF (Asciif.EQ.Blank) Asciif='fort.22' WRITE (6,10400) Asciif 10400 FORMAT (' <<< ', A70, ' >>>') -C +! CALL Filopn (14, Asciif, 0) READ (14,10500) Title 10500 FORMAT (A50) @@ -40,8 +38,7 @@ C 10600 FORMAT (' TITLE ###', A50, '###') READ (14,10500) Title DO II=1,Nchmax - READ (14,10700,END=10) Energy(Ii), Fzer(Ii), Fone(Ii), - * Ftwo(Ii) + READ (14,10700,END=10) Energy(Ii), Fzer(Ii), Fone(Ii),Ftwo(Ii) END DO 10700 FORMAT (E17.1,4E15.1) Ii = Nchmax + 1 @@ -51,7 +48,7 @@ C WRITE (6,10800) Nchi 10800 FORMAT (' Number of channels is', I8) IF (Nchi.GT.Nchmax) STOP '[STOP in Fix_Sam012 in ssm/m012.f]' -C +! Nch = Nchi Nsect = 6 Kkkkev = 1 @@ -69,7 +66,7 @@ C END DO CALL Pltout (Iu, Nsect, 5, 1, Nch, Fone, 1) CALL Pltout (Iu, Nsect, 6, 1, Nch, Ftwo, 1) -C +! CALL Newopn (14, 'Y0.DAT ', 0) DO I=1,Nch Err = Fzer(I)/10.0d0 @@ -77,21 +74,21 @@ C END DO 11000 FORMAT (F20.10, F20.15, F20.15) CLOSE (UNIT=14) -C +! CALL Newopn (14, 'Y1.DAT ', 0) DO I=1,Nch Err = Fone(I)/10.0d0 WRITE (14,11000) Energy(I), Fone(I), Err END DO CLOSE (UNIT=14) -C +! CALL Newopn (14, 'Y2.DAT ', 0) DO I=1,Nch Err = Ftwo(I)/10.0d0 WRITE (14,11000) Energy(I), Ftwo(I), Err END DO CLOSE (UNIT=14) -C +! WRITE (6,11100) 11100 FORMAT ( ' Normal finish in Fix_Sam012 in ssm/m012.f') call resParData%destroy() diff --git a/sammy/src/ssm/mssm00.f b/sammy/src/ssm/mssm00.f90 similarity index 75% rename from sammy/src/ssm/mssm00.f rename to sammy/src/ssm/mssm00.f90 index b6e46c972..afffd5b1e 100644 --- a/sammy/src/ssm/mssm00.f +++ b/sammy/src/ssm/mssm00.f90 @@ -1,11 +1,13 @@ -C -C +! +module ssm_m + contains +! SUBROUTINE Samssm_0 (A) -C -C *** Self-Shielding Multiple Scattering -C *** This version contains both single & double scattering -C *** plus of course self-shielding -C +! +! *** Self-Shielding Multiple Scattering +! *** This version contains both single & double scattering +! *** plus of course self-shielding +! use oops_common_m use fixedi_m use ifwrit_m @@ -16,10 +18,12 @@ C use cbro_common_m use lbro_common_m use MultScatPars_common_m + use ssm_1_m + use ssm_2_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION A(-Msize:Msize) -C -C +! +! WRITE (6,99999) 99999 FORMAT (' *** SAMMY-SSM 28 Aug 08 ***') Segmen(1) = 'S' @@ -27,7 +31,7 @@ C Segmen(3) = 'M' Nowwww = 0 -C +! CALL Initix Nthhhh = multScat%getNumTheta() Kthhhh = multScat%getNumThetaNearZero() @@ -37,47 +41,47 @@ C Ntheta = 10 call multScat%setNumTheta(10) end if -C -C *** Set logical flags for this module +! +! *** Set logical flags for this module CALL Set_Logic_Ssm -C +! Kdatb = Ndatmx -C *** Read first portion of file holding edge-effects, if needed +! *** Read first portion of file holding edge-effects, if needed CALL Qqqxxx (Delthe) CALL Estss1 (Nx, Mx) -C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < - Ixtptw = Idimen (Nx, 1, 'Nx, 1') +! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < + call make_A_Ixtptw(Nx) + Ixtptw = Idimen (1, 1, 'Nx, 1') Ixtptv = Idimen (Mx, 1, 'Mx, 1') -C *** Read Xtpt's - CALL Qqqyyy (A(Ixtptw), A(Ixtptv)) -C -C -C *** Guesstimate size of array needed for Samssm - CALL Estssm (Kdatb, Nf, M1, M2, M3, M4, Nd, Ng, Nh, Maxx, Ndbl, - * Nx, Nnx) -C -C +! *** Read Xtpt's + CALL Qqqyyy (A_Ixtptw, A(Ixtptv)) +! +! +! *** Guesstimate size of array needed for Samssm + CALL Estssm (Kdatb, Nf, M1, M2, M3, M4, Nd, Ng, Nh, Maxx, Ndbl, Nx, Nnx) +! +! Ie = Ienerg Ieb = Ienerb + (Ndatmn-1) -C -C ### One ### +! +! ### One ### CALL Set_Kws -C -C ### Two ### +! +! ### Two ### Ifthet = Idimen (Nf, 1, 'Nf, 1') Isqfb = Idimen (M2, 1, 'M2, 1') -C *** Call Thtget for no finite size corrections (no edge effects) +! *** Call Thtget for no finite size corrections (no edge effects) IF (Single_Inf) CALL Thtget(A(Ifthet)) -C *** Read rest of file containing edge effects +! *** Read rest of file containing edge effects IF (Single_Fin) CALL Qqqget (A(Ifthet), A(Isqfb), Delthe) -C -C -C ### three ### - CALL Ssm_Get_Organized (A, Kdatb, Nf, M1, M2, M3, M4, Nd, Ng, - * Nh, Maxx, Ndbl, Nx, Nnx) -C -C ### ??? ### +! +! +! ### three ### + CALL Ssm_Get_Organized (A, Kdatb, Nf, M1, M2, M3, M4, Nd, & + Ng, Nh, Maxx, Ndbl, Nx, Nnx) +! +! ### ??? ### IF (Double_Plus) THEN Idps = Idimen (Kdatb*2, 1, 'Kdatb*2, 1') Kthet2 = 65 @@ -98,16 +102,16 @@ C ### ??? ### Isphi = 1 END IF -C -C *** Do the self shielding and multiple scattering corrections - CALL Ssssds ( A, I_Ixciso , A(Ie), A(Ieb), A(Itotsi), A(Icapsi), - * A(Iy2ccc), A(Idy2cc), Nx, Maxx, Kdatb) -C -C +! +! *** Do the self shielding and multiple scattering corrections + CALL Ssssds ( A, I_Ixciso , A(Ie), A(Ieb), A(Itotsi), A(Icapsi), & + A(Iy2ccc), A(Idy2cc), Nx, Maxx, Kdatb) +! +! I = Idimen (Ixtptw, -1, 'Ixtptw, -1') -C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > -C -C +! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > +! +! Jwwwww = 8 Numcro = 1 Nnnsig = 1 @@ -123,12 +127,12 @@ C IF (Nudwhi.NE.0) Segnam = 'samudr' IF (Numorr.GT.0) Segnam = 'samorr' IF (Numrpi.GT.0) Segnam = 'samrpi' - IF (Numorr.GT.0 .AND. Numrpi.GT.0) - * STOP '[STOP -- Cannot do both RPI and ORR resolution]' - IF (Numorr.GT.0 .AND. Nudwhi.NE.0) - * STOP '[STOP -- Cannot do both ORR and UDR resolution]' - IF (Nudwhi.NE.0 .AND. Numrpi.GT.0) - * STOP '[STOP -- Cannot do both RPI and UDR resolution]' + IF (Numorr.GT.0 .AND. Numrpi.GT.0) & + STOP '[STOP -- Cannot do both RPI and ORR resolution]' + IF (Numorr.GT.0 .AND. Nudwhi.NE.0) & + STOP '[STOP -- Cannot do both ORR and UDR resolution]' + IF (Nudwhi.NE.0 .AND. Numrpi.GT.0) & + STOP '[STOP -- Cannot do both RPI and UDR resolution]' IF (Kkkdex.NE.0) Segnam = 'samdex' ELSE IF (Kkkdex.EQ.0) THEN @@ -138,9 +142,9 @@ C END IF END IF END IF -C -c here is stop -c stop +! +! here is stop +! stop call multScat%setNumTheta( Nthhhh ) Ntheta = Nthhhh ! remove call multScat%setNumThetaNearZero( Kthhhh ) @@ -158,15 +162,15 @@ c stop END IF RETURN END -C -C -C _______________________________________________________________ -C +! +! +! _______________________________________________________________ +! SUBROUTINE Estss1 (Nx, Mx) use fixedi_m use ifwrit_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C +! IF (Kssmsc.EQ.1) THEN Nx = Nxtptw Mx = Nxtptv @@ -178,25 +182,24 @@ C END IF RETURN END -C -C -C _______________________________________________________________ -C - SUBROUTINE Estssm (Kdatb, NF, M1, M2, M3, M4, ND, NG, NH, Maxx, - * Ndbl, Nx, Nnx) -C -C *** Purpose -- Guesstimate size of array needed for samSSM -C +! +! +! _______________________________________________________________ +! + SUBROUTINE Estssm (Kdatb, NF, M1, M2, M3, M4, ND, NG, NH, Maxx, Ndbl, Nx, Nnx) +! +! *** Purpose -- Guesstimate size of array needed for samSSM +! use fixedi_m use ifwrit_m use lbro_common_m use MultScatPars_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C +! Nnparx = Nnpar IF (Nnpar.EQ.0 .OR. Ksolve.EQ.2) Nnparx = 1 -C -C ### Two ### +! +! ### Two ### M1 = Nsqfb*Nxtptw*multScat%getNumTheta() M2 = M1*Nxtptv IF (Kssmsc.NE.1) M1 = 1 @@ -206,12 +209,12 @@ C ### Two ### call multScat%setNumThetaNearOne(multScat%getNumTheta()) end if Nf = Jtheta -cx M4 = M2 -cx IF (Nnpar.EQ.0 .OR. Ksolve.EQ.2) M4 = 1 -cx K2 = M2 + M4 + Nf +!x M4 = M2 +!x IF (Nnpar.EQ.0 .OR. Ksolve.EQ.2) M4 = 1 +!x K2 = M2 + M4 + Nf K2 = M2 + Nf -C -C ### three ### +! +! ### three ### M3 = M1 IF (Nnpar.EQ.0 .OR. Ksolve.EQ.2) M3 = 1 Nh = Nnpar @@ -223,9 +226,9 @@ C ### three ### Maxx = 100 K3 = M1 + M3 + 3*Nh + Nnnsig*Niniso + Nd + 3*Kdatb + 2*Ng K3 = K3 + 3*Niniso + Maxx*4 -C +! K = K2 + K3 -C +! Nx = Nnpar IF (Ksolve.EQ.2) Nx = 0 IF (Nx.EQ.0) THEN @@ -240,21 +243,21 @@ C Ndbl = 1 IF (Kssdbl.EQ.1) Ndbl = Kdatb K = K + Ndbl*(Nnx+1) + 2*Nx + 14*Nnx -C +! Kk = Idimen (K, 1, 'K, 1') I = Idimen (Kk, -1, 'Kk, -1') I = Idimen (0, 0, '0, 0') RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Set_Logic_Ssm use ifwrit_m use logic_ssm_common_m use lbro_common_m -C +! Another_Process_Will_Happen = Yresol.OR.Yaverg Self_Shield_Only = .FALSE. Single_Inf = .FALSE. @@ -271,11 +274,11 @@ C WRITE (6,10100) WRITE (21,10100) ELSE -cx WRITE (6,10200) +!x WRITE (6,10200) WRITE (21,10200) END IF -10100 FORMAT (' Using linear interpolation for multiple-scattering') -10200 FORMAT(' Using quadratic interpolation for multiple-scattering') +10100 FORMAT(' Using linear interpolation for multiple-scattering') +10200 FORMAT(' Using quadratic interpolation for multiple-scattering') ELSE IF (Kssmsc.EQ.2) THEN Single_Inf = .TRUE. END IF @@ -284,12 +287,12 @@ cx WRITE (6,10200) END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssm_Get_Organized (A, Kdatb, Nf, M1, M2, M3, M4, Nd, - * Ng, Nh, Maxx, Ndbl, Nx, Nnx) +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssm_Get_Organized (A, Kdatb, Nf, M1, M2, M3, M4, Nd, & + Ng, Nh, Maxx, Ndbl, Nx, Nnx) use oops_common_m use fixedi_m use ifwrit_m @@ -298,8 +301,8 @@ C use lbro_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION A(-Msize:Msize) -C - Iqfb = Idimen (M1, 1, 'M1, 1') +! + call make_A_Iqfb(M1) Idvqfb = Idimen (M3, 1, 'M3, 1') Idelas = Idimen (Nh, 1, 'Nh, 1') Idt = Idimen (Nh, 1, 'Nh, 1') @@ -317,7 +320,7 @@ C Icsx = Idimen (Maxx, 1, 'Maxx, 1') Iepx = Idimen (Maxx, 1, 'Maxx, 1') Iggx = Idimen (Maxx, 1, 'Maxx, 1') - Iiex = Idimen (Maxx, 1, 'Maxx, 1') + call make_I_Iiex(Maxx) Idyyy1 = Idimen (Nx, 1, 'Nx, 1') Idyyy2 = Idimen (Nnx, 1, 'Nnx, 1') Idyy2q = Idimen (Nnx, 1, 'Nnx, 1') @@ -336,6 +339,13 @@ C Idy2aa = Idimen (Nnx, 1, 'Nnx, 1') Idy2aq = Idimen (Nnx, 1, 'Nnx, 1') Idyaqq = Idimen (Nnx, 1, 'Nnx, 1') - CALL Zero_Array ( A(Iqfb), (Idyaqq-Iqfb+Nnx) ) + ! --------------------------- + ! Idvqfb and Idyaqq+Nnx define the limits of the + ! array we need to zero out, this will change for + ! each move we make from Idimen to make_A_* + ! --------------------------- + CALL Zero_Array ( A(Idvqfb), (Idyaqq-Idvqfb+Nnx) ) RETURN END + +end module ssm_m diff --git a/sammy/src/ssm/mssm01.f b/sammy/src/ssm/mssm01.f90 similarity index 74% rename from sammy/src/ssm/mssm01.f rename to sammy/src/ssm/mssm01.f90 index 65effe9e7..fe1df2e8a 100644 --- a/sammy/src/ssm/mssm01.f +++ b/sammy/src/ssm/mssm01.f90 @@ -1,15 +1,17 @@ -C -C -C -------------------------------------------------------------- -C +! +module ssm_1_m + contains +! +! -------------------------------------------------------------- +! SUBROUTINE Qqqxxx (Delthe) -C -C *** Read the dimensions of Xtpt_V & _W etc *** -C *** Xtpt_V is log of energy grid for V=sigma_total(E) -C *** Xtpt_W is log of energy grid for W=sigma_total(Ep) -C *** Both are to be used for interpolation on Sqfb(V,W,mu) -C *** where mu = cos(theta) -C +! +! *** Read the dimensions of Xtpt_V & _W etc *** +! *** Xtpt_V is log of energy grid for V=sigma_total(E) +! *** Xtpt_W is log of energy grid for W=sigma_total(Ep) +! *** Both are to be used for interpolation on Sqfb(V,W,mu) +! *** where mu = cos(theta) +! use fixedi_m use ifwrit_m use fixedr_m @@ -22,19 +24,19 @@ C use MultScatPars_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA One /1.0d0/ -C +! Dthick = Thick IF (Self_Shield_Only) THEN -C *** Here for no multiple-scattering at all +! *** Here for no multiple-scattering at all Nxtptw = 1 Nzzz = 1 Ntheta = 1 -C +! ELSE IF (Single_Inf) THEN -C *** Here for multiple-scattering without edge effects -C +! *** Here for multiple-scattering without edge effects +! ELSE -C *** Here for multiple-scattering with edge effects +! *** Here for multiple-scattering with edge effects IF (Debug) WRITE (6,10100) Fqqqqq 10100 FORMAT (' Fqqqqq = <<< ', A70, ' >>>') CALL Filopn (25, Fqqqqq, 1) @@ -53,18 +55,18 @@ C *** Here for multiple-scattering with edge effects IF (Nxtptw.NE.Nxtptwa .OR. Nxtptv.NE.Nxtptva) THEN IF (Nxtptw.NE.0 .OR. Nxtptv.NE.0) THEN WRITE (6,10101) Nxtptva, Nxtptwa, Nxtptv, Nxtptw -10101 FORMAT (' Dimensions in SSM file are different from those', - * /, ' specified in INPut file.', /, - * ' In *.SSM file, Nxtptv and Nxtptw =', 2I5, /, - * ' In INPut file, ', 2I5, /, - * ' Values from *.SSM file will be used.') +10101 FORMAT (' Dimensions in SSM file are different from those', & + /, ' specified in INPut file.', /, & + ' In *.SSM file, Nxtptv and Nxtptw =', 2I5, /, & + ' In INPut file, ', 2I5, /, & + ' Values from *.SSM file will be used.') END IF Nxtptv = Nxtptva Nxtptw = Nxtptwa END IF READ (25) Rs, Rb, Sthick, Dthick, Densty, A1, B1, Costh1, Area IF (Densty.NE.Dnsty) Dnsty = Densty -cx READ (25) Xtpt_W, Xtpt_V +!x READ (25) Xtpt_W, Xtpt_V N = Ntheta - 1 Jtheta = Ntheta call multScat%setNumThetaNearOne(multScat%getNumTheta()) @@ -79,51 +81,51 @@ cx READ (25) Xtpt_W, Xtpt_V END IF END IF RETURN -C +! END -C -C -C -------------------------------------------------------------- -C +! +! +! -------------------------------------------------------------- +! SUBROUTINE Qqqyyy (Xtpt_W, Xtpt_V) -C -C *** Read the Xtpt's *** -C +! +! *** Read the Xtpt's *** +! use fixedi_m use logic_ssm_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Xtpt_W(Nxtptw), Xtpt_V(Nxtptv) -C +! IF (Self_Shield_Only) THEN ELSE IF (Single_Inf) THEN ELSE -C *** Here for multiple-scattering with edge effects +! *** Here for multiple-scattering with edge effects READ (25) Xtpt_W, Xtpt_V END IF RETURN END -C -C -C -------------------------------------------------------------- -C +! +! +! -------------------------------------------------------------- +! SUBROUTINE Thtget (Ftheta) -C -C *** Initialize array Ftheta, when there are no edge corrections -C +! +! *** Initialize array Ftheta, when there are no edge corrections +! use fixedi_m use ifwrit_m use MultScatPars_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Ftheta(*) DATA Zero /0.0d0/, One /1.0d0/ -C +! D = One/(Ntheta-One) Ftheta(1) = Zero DO I=2,Ntheta-1 Ftheta(I) = D*(I-One) END DO Ftheta(Ntheta) = One -C +! IF (Kdebug.NE.0) THEN WRITE (6,10000) Ntheta 10000 FORMAT (/, ' ### Ftheta(I), I=1,', I5, ' =') @@ -132,21 +134,21 @@ C END IF Jtheta = Ntheta call multScat%setNumThetaNearOne(multScat%getNumTheta()) -C +! RETURN END -C -C -C -------------------------------------------------------------- -C +! +! +! -------------------------------------------------------------- +! SUBROUTINE Qqqget (Ftheta, Sqfb, Delthe) -C -C *** Read the arrays Ftheta and Sqfb -C *** Also generate rest of Ftheta -C *** (NOTE that dimension of Ftheta may be larger than Ntheta, which is -C *** the number of points on which Sqfb is to be interpolated. -C *** Dimension of Ftheta is Jtheta, the total number of THETA points.) -C +! +! *** Read the arrays Ftheta and Sqfb +! *** Also generate rest of Ftheta +! *** (NOTE that dimension of Ftheta may be larger than Ntheta, which is +! *** the number of points on which Sqfb is to be interpolated. +! *** Dimension of Ftheta is Jtheta, the total number of THETA points.) +! use fixedi_m use ifwrit_m use ssssss_common_m @@ -154,13 +156,13 @@ C IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Ftheta(Jtheta), Sqfb(Nsqfb,Nxtptv,Nxtptw,Ntheta) DATA One /1.0d0/ -C +! READ (25) (Ftheta(I),I=1,Ntheta) READ (25) Sqfb CLOSE (UNIT=25) -C +! IF (Jtheta.NE.Ntheta) THEN -C +! Min = Ntheta + 1 IF (Min.NE.Jtheta) THEN Max = Jtheta - 1 @@ -184,12 +186,12 @@ C END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Ssm_Initialize (Aaa, Bbb, Rmass, Iv, Kk) -C +! use fixedi_m use ifwrit_m use fixedr_m @@ -201,16 +203,16 @@ C IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Rmass(*), Aaa(*), Bbb(*) DATA Zero /0.0d0/, One /1.0d0/ -C +! R0 = Zero Rd = Zero Fffdbl = One -C +! R0 = Rs IF (Rb.LT.Rs) R0 = Rb Rd = dSQRT(Area/Pi) IF (Rd.NE.Zero) Fffdbl = One + Sthick/Rd -C +! IF (Numiso.EQ.0) THEN Rmass(1) = Aaawww/A_Mass_Small Aaa(1) = Rmass(1)**2 @@ -233,26 +235,26 @@ C END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Getcrs (Ccclll, Dddlll, Isopar, Vsigxx, Vdasig, Vdbsig, - * We, Totsig, Capsig, Dtotsi, Dcapsi, Ee, Elastic, Nx, Nn, Istop) -C -C *** Purpose -- Find next cross section, store values in appropriate places -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Getcrs (Ccclll, Dddlll, Isopar, Vsigxx, Vdasig, Vdbsig, & + We, Totsig, Capsig, Dtotsi, Dcapsi, Ee, Elastic, Nx, Nn, Istop) +! +! *** Purpose -- Find next cross section, store values in appropriate places +! use fixedi_m use ifwrit_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C - DIMENSION Ccclll(Nnnsig,*), Dddlll(Nnnsig,Nnpar,*), Isopar(*), - * Vsigxx(Nnnsig,Niniso,*), Vdasig(Nnnsig,Ndaxxx,*), - * Vdbsig(Nnnsig,Ndbxxx,Niniso,*), We(*), Totsig(*), Capsig(*), - * Dtotsi(Nx,*), Dcapsi(Nx,*) -C +! + DIMENSION Ccclll(Nnnsig,*), Dddlll(Nnnsig,Nnpar,*), Isopar(*), & + Vsigxx(Nnnsig,Niniso,*), Vdasig(Nnnsig,Ndaxxx,*), & + Vdbsig(Nnnsig,Ndbxxx,Niniso,*), We(*), Totsig(*), & + Capsig(*), Dtotsi(Nx,*), Dcapsi(Nx,*) +! Istop = 0 -C +! Elastic = 0.0d0 N = Nn Ee = We(N) @@ -262,8 +264,7 @@ C END DO Elastic = Elastic + Ccclll(1,Iso) END DO - IF (Nnpar.GT.0 .AND. KSOLVE.NE.2) CALL Zero_Array (Dddlll, - * Nnnsig*Ndasig*Niniso) + IF (Nnpar.GT.0 .AND. KSOLVE.NE.2) CALL Zero_Array (Dddlll, Nnnsig*Ndasig*Niniso) IF (Ndasig.GT.0) THEN DO Iso=1,Niniso DO J=1,Ndasig @@ -284,12 +285,12 @@ C END DO END DO END IF -C +! DO Iso=1,Niniso Totsig(N) = Ccclll(Lllmax+1,Iso) + Totsig(N) Capsig(N) = Ccclll(Lllmax+2,Iso) + Capsig(N) END DO -C +! IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO Iso=1,Niniso DO J=1,Nnpar @@ -298,55 +299,55 @@ C END DO END DO END IF -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Getem (Em, Kkkdat, Idone) -C -C *** Purpose -- Determine where we are, energy-wise; i.e. which pieces -C *** of the calculation need doing now -C +! +! *** Purpose -- Determine where we are, energy-wise; i.e. which pieces +! *** of the calculation need doing now +! use ifwrit_m use fixedr_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C +! IF (Em.LT.Eminr) THEN -C +! IF (Kssdbl.EQ.1) THEN Idone = 3 -C *** "Idone = 3" means E < Eminr = min energy at which we need to -C *** calculate the yields; however, need to calculate pieces -C *** of Y2 anyway +! *** "Idone = 3" means E < Eminr = min energy at which we need to +! *** calculate the yields; however, need to calculate pieces +! *** of Y2 anyway ELSE Idone = 1 -C *** "Idone = 1" means don't calculate yields, don't calculate -C *** pieces of Y2, just store arrays etc for use in generating Y1 +! *** "Idone = 1" means don't calculate yields, don't calculate +! *** pieces of Y2, just store arrays etc for use in generating Y1 END IF -C +! ELSE IF (Em.GT.Emaxr) THEN Idone = 2 -C *** "Idone = 2" means bigger than biggest energy so just quit -C +! *** "Idone = 2" means bigger than biggest energy so just quit +! ELSE -C *** Here for normal state, Eminr < Em < Emaxr so calculate everything +! *** Here for normal state, Eminr < Em < Emaxr so calculate everything Idone = 0 Kkkdat = Kkkdat + 1 -C +! END IF RETURN END -C -C -C -------------------------------------------------------------- -C +! +! +! -------------------------------------------------------------- +! SUBROUTINE Get_Angles (Ctheta, Stheta, Cphi, Sphi) -C -C *** Purpose -- Define angle grids -C +! +! *** Purpose -- Define angle grids +! use logic_ssm_common_m use ssssss_common_m use xsect_x_common_m @@ -354,7 +355,7 @@ C IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Ctheta(*), Stheta(*), Cphi(*), Sphi(*) DATA Zero /0.0d0/, One /1.0d0/ -C +! D = One/(Kthet2-One) Ctheta(1) = Zero Stheta(1) = One @@ -364,7 +365,7 @@ C END DO Ctheta(Kthet2) = One Stheta(Kthet2) = Zero -C +! D = One/(Kphi2-One) Cphi(1) = Zero DO I=2,Kphi2-1 @@ -376,13 +377,14 @@ C Cphi(I) = dCOS(Cc) Sphi(I) = dSIN(Cc) END DO -C +! Kkphi = Kphi2 - 1 Kkthet = Kthet2 - 1 -cx X_Mult = Ctheta(1)/(Kphi-One) wrong! -cx X_Mult = Ctheta(1)/(Kkphi-One) maybe? +! X_Mult = Ctheta(1)/(Kphi2-One) X_Mult = X_Mult**2 * Pi -C +! RETURN END + +end module ssm_1_m diff --git a/sammy/src/ssm/mssm02.f b/sammy/src/ssm/mssm02.f deleted file mode 100644 index 3ddde1deb..000000000 --- a/sammy/src/ssm/mssm02.f +++ /dev/null @@ -1,316 +0,0 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssssds (A, Jxciso, Energy, Energb, Totsig, Capsig, - * Y2cccc, Dy2ccc, Nx, Maxx, Kdatb) -C -C *** Ssssds generates the the self-shielded + multiple-scattered -C *** capture yield for an infinite slab, and calls Mulsca to -C *** generate the finite-slab results -C - use oops_common_m - use fixedi_m - use ifwrit_m - use exploc_common_m - use samxxx_common_m - use array_sizes_common_m - use fixedr_m - use logic_ssm_common_m - use lbro_common_m - use ssssss_common_m - use xsect_x_common_m - use constn_common_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) -C - DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), - * Totsig(*), Capsig(*), Y2cccc(*), Dy2ccc(Nx,*) -C - IF (Kssmpr.EQ.1) THEN - CALL Newopn (60, 'SAM012.DAT', 0) - WRITE (60,10000) -10000 FORMAT (' SAMMY-calculated values') - WRITE (60,10100) -10100 FORMAT (' Energy, Zero-scat, One-scat, Two-scat, Sum=Yield') - END IF -C - Ksolvx = Ksolve - CALL Ssm_Initialize ( A(Iaaa), A(Ibbb), A(Irmass),Iv,Kk) - - Jgbmax = 0 - Kkknew = 0 - CALL Read_Cross_Sections (A(Ivsigx), A(Ivdasi), A(Ivdbsi), - * A(Ivsigs), A_Ivdass , A_Ivdbss , A(Iwe), Jgbmax, Kkknew, 1, Iv) - IF (Kdatb.NE.Kkknew) THEN - WRITE (6,10200) Kdatb, Kkknew, Jgbmax, Iv -10200 FORMAT (' Kdatb, Kkknew, Jgbmax, Iv =', I10, 6I5) - STOP '[STOP in Ssssds in ssm/mssm02.f]' - END IF -C - CALL Zero_Cross_Sections (A(Ith), A(Iwsigx), A(Iwdasi), A(Iwdbsi), - * A(Isigxx), A(Isigxx), A(Isigxx), Kk, Kdatb, 0) -C - IF (Kwssms.EQ.1) CALL Newopn (15, Sam15x, 1) - CALL Zero_Array (Totsig, Kdatb) - CALL Zero_Array (Capsig, Kdatb) - IF (Ksolve.NE.2) CALL Zero_Array (A(Idtots), Nnpar*Kdatb) - IF (Ksolve.NE.2) CALL Zero_Array (A(Idcaps), Nnpar*Kdatb) -C -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC - IF (Self_Shield_Only) THEN -C *** Case 0: self-shielding and nothing else - CALL Ssssds_0xx (A, Jxciso, Energy, Energb, Totsig, - * Capsig, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) - ELSE IF (Double_Plus) THEN - IF (Single_Fin) THEN - IF (Linear.EQ.0) THEN -C *** Case 2fl: Double sct, finite slab, linear interpolation - CALL Ssssds_2fl (A, Jxciso, Energy, Energb, Totsig, - * Capsig, Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, - * Kkkdat) - ELSE -C *** Case 2fq: Double sct, finite slab, quadratic interpolation - CALL Ssssds_2fq (A, Jxciso, Energy, Energb, Totsig, - * Capsig, Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, - * Kkkdat) - END IF - ELSE - IF (Linear.EQ.0) THEN -C *** Case 2il: Double sct, infinite slab, linear interpolation - CALL Ssssds_2il (A, Jxciso, Energy, Energb, Totsig, - * Capsig, Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, - * Kkkdat) - ELSE -C *** Case 2iq: Double sct, infinite slab, quadratic interpolation - CALL Ssssds_2iq (A, Jxciso, Energy, Energb, Totsig, - * Capsig, Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, - * Kkkdat) - END IF - END IF - ELSE IF (Single_Fin) THEN - IF (Linear.EQ.0) THEN -C *** Case 1fl: Single sct, finite slab, linear interpolation - CALL Ssssds_1fl (A, Jxciso, Energy, Energb, Totsig, - * Capsig, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) - ELSE -C *** Case 1fq: Single sct, finite slab, quadratic interpolation - CALL Ssssds_1fq (A, Jxciso, Energy, Energb, Totsig, - * Capsig, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) - END IF - ELSE - IF (Linear.EQ.0) THEN -C *** Case 1il: Single sct, infinite slab, linear interpolation - CALL Ssssds_1il (A, Jxciso, Energy, Energb, Totsig, - * Capsig, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) - ELSE -C *** Case 1iq: Single sct, infinite slab, quadratic interpolation - CALL Ssssds_1iq (A, Jxciso, Energy, Energb, Totsig, - * Capsig, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) - END IF - END IF -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -C - CLOSE (UNIT=66) - CALL Finish_02 (A, Energy, Energb, Kkkdat, Kdatmn) - RETURN - END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Zero0_1f (A, Yyy1fb, Y0, Yyy1, Nx) - use oops_common_m - use fixedi_m - use ifwrit_m - use array_sizes_common_m - use logic_ssm_common_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION A(-Msize:Msize), Yyy1fb(*) - DATA Zero /0.0d0/ -C - Y0 = Zero - Yyy1 = Zero - Yyy1fb(1) = Zero - Yyy1fb(2) = Zero - IF (Ksolve.NE.2) CALL Zero_Array (A(Idyyy1), Nx) -C - RETURN - END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Zero0_2i (A, Y0, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Nx) - use oops_common_m - use fixedi_m - use ifwrit_m - use array_sizes_common_m - use logic_ssm_common_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION A(-Msize:Msize) - DATA Zero /0.0d0/ -C - Y0 = Zero - Yyy1 = Zero -C - IF (Ksolve.NE.2) CALL Zero_Array (A(Idyyy1), Nx) -C - Yyy2 = Zero - Y2bbbb = Zero - IF (Double_Plus) THEN - Yyy2q = Zero - Y2cccc = Zero - Y2bbbq = Zero -C - IF (Ksolve.NE.2) THEN - CALL Zero_Array (A(Idyyy2), Nx) - CALL Zero_Array (A(Idyy2q), Nx) - CALL Zero_Array (A(Idy2qq), Nx) - CALL Zero_Array (A(Idy2cc), Nx) - CALL Zero_Array (A(Idy2bb), Nx) - CALL Zero_Array (A(Idy2bq), Nx) - CALL Zero_Array (A(Idybqq), Nx) - END IF - END IF - RETURN - END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Zero0_2f (A, Yyy1fb, Y0, Yyy1, Yyy2, Yyy2q, - * Y2bbbb, Y2bbbq, Nx) - use oops_common_m - use fixedi_m - use ifwrit_m - use array_sizes_common_m - use logic_ssm_common_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION A(-Msize:Msize), Yyy1fb(*) - DATA Zero /0.0d0/ -C - Y0 = Zero - Yyy1 = Zero - Yyy1fb(1) = Zero - Yyy1fb(2) = Zero -C - IF (Ksolve.NE.2) CALL Zero_Array (A(Idyyy1), Nx) -C - Yyy2 = Zero - Y2bbbb = Zero - IF (Double_Plus) THEN - Yyy2q = Zero - Y2cccc = Zero - Y2bbbq = Zero -C - IF (Ksolve.NE.2) THEN - CALL Zero_Array (A(Idyyy2), Nx) - CALL Zero_Array (A(Idyy2q), Nx) - CALL Zero_Array (A(Idy2qq), Nx) - CALL Zero_Array (A(Idy2cc), Nx) - CALL Zero_Array (A(Idy2bb), Nx) - CALL Zero_Array (A(Idy2bq), Nx) - CALL Zero_Array (A(Idybqq), Nx) - END IF - END IF - RETURN - END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Tell_Finite (A) - use oops_common_m - use fixedi_m - use logic_ssm_common_m - use MultScatPars_common_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION A(-Msize:Msize) - DATA Zero /0.0d0/ - IF (multScat%getLogSigmaTotMax().GT.Zero) THEN - call multScat%setLogSigmaTotMin( - * dLOG(multScat%getLogSigmaTotMin()) ) - Xtmin = dLOG(multScat%getLogSigmaTotMin()) - call multScat%setLogSigmaTotMax( - * dLOG(multScat%getLogSigmaTotMax()) ) - Xtmax = dLOG(multScat%getLogSigmaTotMax()) - WRITE ( 6,10200) multScat%getLogSigmaTotMin(), - * multScat%getLogSigmaTotMax() - WRITE (21,10200) multScat%getLogSigmaTotMin(), - * multScat%getLogSigmaTotMax() - WRITE ( 6,10300) A(Ixtptv), A(Ixtptv-1+Nxtptv) - WRITE (21,10300) A(Ixtptv), A(Ixtptv-1+Nxtptv) -10200 FORMAT ('Interpolation limits needed: Xtmin, Xtmax=', 1P5G14.6) -10300 FORMAT ('Interpolation limits used: Xtmin, Xtmax=', 1P5G14.6) - END IF - IF (Interp_Small_Times.GT.0) THEN - WRITE ( 6,10400) - WRITE (21,10400) -10400 FORMAT (' Expand interpolation limits and try again.') - STOP - END IF - RETURN - END - -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE X_Trpths_Lin (A, Ftheta, Knthet, Jfb, Jth, Itntrp, Nn, - * Nxtptwn) - use oops_common_m - use ifwrit_m - use logic_ssm_common_m - use ssssss_common_m - use xsect_x_common_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION A(-Msize:Msize) -C - CALL Trpths1_Lin (A(Ixtptw), Ftheta, A(Iqfb), A(Idvqfb), Knthet, - * Jfb, Jth, Itntrp, Nn, Nxtptwn) - Fz1 = Fz - IF (Ksolvx.NE.2) THEN - Dfz1 = Dfz - Dpfz1 = Dpfz - Dnfz1 = Dnfz - END IF - CALL Trpths2 - Fz = Fz1 + Fz - IF (Ksolvx.NE.2) THEN - Dfz = Dfz1 + Dfz - Dpfz = Dpfz1 + Dpfz - Dnfz = Dnfz1 + Dnfz - END IF - RETURN - END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE X_Trpths_Quad (A, Ftheta, Knthet, Jfb, Jth, Itntrp, Nn, - * Nxtptwn) - use oops_common_m - use ifwrit_m - use logic_ssm_common_m - use ssssss_common_m - use xsect_x_common_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION A(-Msize:Msize) -C - CALL Trpths1_Quad (A(Ixtptw), Ftheta, A(Iqfb), A(Idvqfb), Knthet, - * Jfb, Jth, Itntrp, Nn, Nxtptwn) - Fz1 = Fz - IF (Ksolvx.NE.2) THEN - Dfz1 = Dfz - Dpfz1 = Dpfz - Dnfz1 = Dnfz - END IF - CALL Trpths2 - Fz = Fz1 + Fz - IF (Ksolvx.NE.2) THEN - Dfz = Dfz1 + Dfz - Dpfz = Dpfz1 + Dpfz - Dnfz = Dnfz1 + Dnfz - END IF - RETURN - END diff --git a/sammy/src/ssm/mssm02.f90 b/sammy/src/ssm/mssm02.f90 new file mode 100644 index 000000000..e16800062 --- /dev/null +++ b/sammy/src/ssm/mssm02.f90 @@ -0,0 +1,129 @@ +! +module ssm_2_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssssds (A, Jxciso, Energy, Energb, Totsig, Capsig, & + Y2cccc, Dy2ccc, Nx, Maxx, Kdatb) +! +! *** Ssssds generates the the self-shielded + multiple-scattered +! *** capture yield for an infinite slab, and calls Mulsca to +! *** generate the finite-slab results +! + use oops_common_m + use fixedi_m + use ifwrit_m + use exploc_common_m + use samxxx_common_m + use array_sizes_common_m + use fixedr_m + use logic_ssm_common_m + use lbro_common_m + use ssssss_common_m + use xsect_x_common_m + use constn_common_m + use ssm_1_m + use ssm_3_m + use ssm_4_m + IMPLICIT DOUBLE PRECISION (a-h,o-z) +! + DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), & + Totsig(*), Capsig(*), Y2cccc(*), Dy2ccc(Nx,*) +! + IF (Kssmpr.EQ.1) THEN + CALL Newopn (60, 'SAM012.DAT', 0) + WRITE (60,10000) +10000 FORMAT (' SAMMY-calculated values') + WRITE (60,10100) +10100 FORMAT (' Energy, Zero-scat, One-scat, Two-scat, Sum=Yield') + END IF +! + Ksolvx = Ksolve + CALL Ssm_Initialize ( A(Iaaa), A(Ibbb), A(Irmass),Iv,Kk) + + Jgbmax = 0 + Kkknew = 0 + CALL Read_Cross_Sections (A(Ivsigx), A(Ivdasi), A(Ivdbsi), & + A(Ivsigs), A_Ivdass , A_Ivdbss , A(Iwe), Jgbmax, Kkknew, 1, Iv) + IF (Kdatb.NE.Kkknew) THEN + WRITE (6,10200) Kdatb, Kkknew, Jgbmax, Iv +10200 FORMAT (' Kdatb, Kkknew, Jgbmax, Iv =', I10, 6I5) + STOP '[STOP in Ssssds in ssm/mssm02.f]' + END IF +! + CALL Zero_Cross_Sections (A(Ith), A(Iwsigx), A(Iwdasi), A(Iwdbsi), & + A(Isigxx), A(Isigxx), A(Isigxx), Kk, Kdatb, 0) +! + IF (Kwssms.EQ.1) CALL Newopn (15, Sam15x, 1) + CALL Zero_Array (Totsig, Kdatb) + CALL Zero_Array (Capsig, Kdatb) + IF (Ksolve.NE.2) CALL Zero_Array (A(Idtots), Nnpar*Kdatb) + IF (Ksolve.NE.2) CALL Zero_Array (A(Idcaps), Nnpar*Kdatb) +! +!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +! ----------------------------------------------------------------------------- +! ----------- SELF SHIELDING -------------------------------------------------- +! ----------------------------------------------------------------------------- + IF (Self_Shield_Only) THEN +! *** Case 0: self-shielding and nothing else + CALL Ssssds_0xx (A, Jxciso, Energy, Energb, Totsig, & + Capsig, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) +! ----------------------------------------------------------------------------- +! ----------- MULTIPLE SCATTERING --------------------------------------------- +! ----------------------------------------------------------------------------- + ELSE IF (Double_Plus) THEN + IF (Single_Fin) THEN + IF (Linear.EQ.0) THEN +! *** Case 2fl: Double sct, finite slab, linear interpolation + CALL Ssssds_2fl (A, Jxciso, Energy, Energb, Totsig, & + Capsig, Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) + ELSE +! *** Case 2fq: Double sct, finite slab, quadratic interpolation + CALL Ssssds_2fq (A, Jxciso, Energy, Energb, Totsig, & + Capsig, Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) + END IF + ELSE + IF (Linear.EQ.0) THEN +! *** Case 2il: Double sct, infinite slab, linear interpolation + CALL Ssssds_2il (A, Jxciso, Energy, Energb, Totsig, & + Capsig, Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) + ELSE +! *** Case 2iq: Double sct, infinite slab, quadratic interpolation + CALL Ssssds_2iq (A, Jxciso, Energy, Energb, Totsig, & + Capsig, Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) + END IF + END IF +! ----------------------------------------------------------------------------- +! ----------- SINGLE SCATTERING ----------------------------------------------- +! ----------------------------------------------------------------------------- + ELSE IF (Single_Fin) THEN + IF (Linear.EQ.0) THEN +! *** Case 1fl: Single sct, finite slab, linear interpolation + CALL Ssssds_1fl (A, Jxciso, Energy, Energb, Totsig, & + Capsig, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) + ELSE +! *** Case 1fq: Single sct, finite slab, quadratic interpolation + CALL Ssssds_1fq (A, Jxciso, Energy, Energb, Totsig, & + Capsig, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) + END IF + ELSE + IF (Linear.EQ.0) THEN +! *** Case 1il: Single sct, infinite slab, linear interpolation + CALL Ssssds_1il (A, Jxciso, Energy, Energb, Totsig, & + Capsig, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) + ELSE +! *** Case 1iq: Single sct, infinite slab, quadratic interpolation + CALL Ssssds_1iq (A, Jxciso, Energy, Energb, Totsig, & + Capsig, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) + END IF + END IF +!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +! + CLOSE (UNIT=66) + CALL Finish_02 (A, Energy, Energb, Kkkdat, Kdatmn) + RETURN + END + + +end module ssm_2_m diff --git a/sammy/src/ssm/mssm03.f b/sammy/src/ssm/mssm03.f90 similarity index 54% rename from sammy/src/ssm/mssm03.f rename to sammy/src/ssm/mssm03.f90 index d56ba5109..53712221a 100644 --- a/sammy/src/ssm/mssm03.f +++ b/sammy/src/ssm/mssm03.f90 @@ -1,13 +1,15 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssssds_0xx (A, Jxciso, Energy, Energb, Totsig, Capsig, - * Nx, Maxx, Kdatb, Kdatmn, Kkkdat) -C -C *** Ssssds_0xx generates the the self-shielded capture yield with -C *** no multiple-scattering corrections -C +! +module ssm_3_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssssds_0xx (A, Jxciso, Energy, Energb, Totsig, Capsig, & + Nx, Maxx, Kdatb, Kdatmn, Kkkdat) +! +! *** Ssssds_0xx generates the the self-shielded capture yield with +! *** no multiple-scattering corrections +! use oops_common_m use fixedi_m use ifwrit_m @@ -20,115 +22,115 @@ C use ssssss_common_m use xsect_x_common_m use constn_common_m + use ssm_1_m + use ssm_19_m + use ssm_20_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C - DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), - * Totsig(*), Capsig(*) -C +! + DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), Totsig(*), Capsig(*) +! DIMENSION Wssmsc(10) DATA Zero /0.0d0/, One /1.0d0/ -C +! Itimes = 1 Imin = 1 Kkkdat = 0 Kdatmn = 0 Nsen = 1 -C -C *** Start major do-loop on Energy +! +! *** Start major do-loop on Energy DO N=1,Kdatb Nn = N Y0 = Zero - CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), - * A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, - * A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) + CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), & + A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, & + A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) IF (Istop.EQ.1) GO TO 80 -C -C *** get Energy Em +! +! *** get Energy Em Em = Energb(Nn) CALL Getem (Em, Kkkdat, Idone) -C +! IF (Idone.EQ.2) THEN -C *** Here E > Emax, so we're done. +! *** Here E > Emax, so we're done. GO TO 80 -C +! ELSE IF (Idone.EQ.0) THEN -C *** If Idone=0, energy Em is bigger than Eminr, so -C *** calculation can proceed -C +! *** If Idone=0, energy Em is bigger than Eminr, so +! *** calculation can proceed +! IF (Kdatmn.EQ.0) Kdatmn = Nn Total = Totsig(N) Exp1 = dEXP(-Dthick*Total) -C +! IF (Kwssms.EQ.1) THEN Wssmsc(1) = Em Wssmsc(2) = Capsig(N) Wssmsc(3) = Totsig(N) END IF -C +! CALL Zero_Array (A(Isigxx), 1) IF (Ksolve.NE.2) THEN IF (Ndasig.GT.0) CALL Zero_Array (A(Idasig), Ndasig) IF (Ndbsig.GT.0) CALL Zero_Array (A(Idbsig), Ndbsig) END IF -C -C *** Y0 is self-shielded capture yield; normalized to be the -C *** cross section in the limit of Zero thickness +! +! *** Y0 is self-shielded capture yield; normalized to be the +! *** cross section in the limit of Zero thickness Td = Total*Dthick IF (Nonu.EQ.0) THEN -C *** Uniform thickness +! *** Uniform thickness Exxxx = Exp1 ELSE -C *** Non-uniform thickness - CALL Non_Uniform_Thickness (A_Iznonu , A_Irnonu , - * Td, Exxxx, Nonu) +! *** Non-uniform thickness + CALL Non_Uniform_Thickness (A_Iznonu, A_Irnonu, Td, Exxxx, Nonu) END IF Y0 = (One-Exxxx)*Capsig(N)/Td -C +! IF (Sensin.NE.Zero) THEN -C *** When neutron sensitivity is given (as "miscellaneous -C *** parameters card 11"), then correction term is added +! *** When neutron sensitivity is given (as "miscellaneous +! *** parameters card 11"), then correction term is added CALL Get_Ratio_Sensin (Em, Ratio_Sensin, Nsen, Itimes) - Asensn = (One-Exp1) * Ratio_Sensin * - * (100.0d0*Fourpi*Elastic/Total) / Dthick -C *** Remember that "Fourpi" is really 4*pi/100 + Asensn = (One-Exp1) * Ratio_Sensin * (100.0d0*Fourpi*Elastic/Total) / Dthick +! *** Remember that "Fourpi" is really 4*pi/100 Y0 = Y0 + Asensn*Sensin END IF -C -C *** Normalize if needed; store in Sigxxx; calc derivs +! +! *** Normalize if needed; store in Sigxxx; calc derivs Dddyy0 = Zero - CALL Ynrm_0 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), - * A(Idasig), A(Idbsig), Y0, Dthick, Total, Exp1, Em, - * Dddyy0, Asensn, Nn) -C -C *** Modify for self-indication experiments - IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), - * A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) -C + CALL Ynrm_0 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), & + A(Idasig), A(Idbsig), Y0, Dthick, Total, Exp1, Em, & + Dddyy0, Asensn, Nn) +! +! *** Modify for self-indication experiments + IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), & + A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) +! IF (Debug) THEN WRITE (66,10200) Em, Y0 10200 FORMAT (' E,Y0=', F12.4, 1p4g14.5) END IF CALL Finish_01 (A, Ee, Wssmsc, Em, Y0, Kdatb, Kkkdat, N) END IF -C +! END DO -C *** Done with loop on Energies Em +! *** Done with loop on Energies Em IF (Kssmpr.EQ.1) CLOSE (UNIT=60) -C +! 80 CONTINUE -C *** Completely done +! *** Completely done RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssssds_1il (A, Jxciso, Energy, Energb, Totsig, Capsig, - * Nx, Maxx, Kdatb, Kdatmn, Kkkdat) -C -C *** Ssssds_1il generates the the self-shielded + single-scattered -C *** capture yield for an infinite slab with linear interpolation -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssssds_1il (A, Jxciso, Energy, Energb, Totsig, Capsig, & + Nx, Maxx, Kdatb, Kdatmn, Kkkdat) +! +! *** Ssssds_1il generates the the self-shielded + single-scattered +! *** capture yield for an infinite slab with linear interpolation +! use oops_common_m use fixedi_m use ifwrit_m @@ -142,156 +144,156 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_1_m + use ssm_5_m + use ssm_20_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C - DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), - * Totsig(*), Capsig(*) -C +! + DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), Totsig(*), Capsig(*) +! DIMENSION Wssmsc(10) DATA Zero /0.0d0/, One /1.0d0/ -C +! Itimes = 1 Kountr = 0 -C +! CALL Findpr (multScat%getNumTheta(), Knthet) CALL Findpr (Nxtptw, Nxtptwn) CALL Findpr (Nxtptv, Nxtptvm) -C +! Imin = 1 Kkkdat = 0 Kdatmn = 0 Nsen = 1 -C -C *** Start major do-loop on Energy +! +! *** Start major do-loop on Energy DO N=1,Kdatb Nn = N -C +! Y0 = Zero Yyy1 = Zero IF (Ksolve.NE.2) CALL Zero_Array (A(Idyyy1), Nx) -C - CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), - * A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, - * A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) +! + CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), & + A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, & + A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) IF (Istop.EQ.1) GO TO 80 -C -C *** get Energy Em +! +! *** get Energy Em Em = Energb(Nn) CALL Getem (Em, Kkkdat, Idone) -C +! IF (Idone.EQ.2) THEN -C *** Here E > Emax, so we're done. +! *** Here E > Emax, so we're done. GO TO 80 -C -C +! +! ELSE IF (Idone.EQ.0) THEN -C *** Here if Idone=0, energy Em is bigger than Eminr, so -C *** calculation can proceed -C +! *** Here if Idone=0, energy Em is bigger than Eminr, so +! *** calculation can proceed +! IF (Kdatmn.EQ.0) Kdatmn = Nn Total = Totsig(N) Exp1 = dEXP(-Dthick*Total) -C +! IF (Kwssms.EQ.1) THEN Wssmsc(1) = Em Wssmsc(2) = Capsig(N) Wssmsc(3) = Totsig(N) END IF -C +! CALL Zero_Array (A(Isigxx), 1) IF (Ksolve.NE.2) THEN IF (Ndasig.GT.0) CALL Zero_Array (A(Idasig), Ndasig) IF (Ndbsig.GT.0) CALL Zero_Array (A(Idbsig), Ndbsig) END IF -C -C -C *** Here begin multiple-scattering calculation -C +! +! +! *** Here begin multiple-scattering calculation +! Wssmsc(5) = Zero Wssmsc(6) = Zero DO Iso=1,Niniso -C *** Start loop over nuclides (ie over "isotopes") +! *** Start loop over nuclides (ie over "isotopes") IF (Jxciso(Iso).NE.1) THEN Iiso = Iso - CALL Mulsca_1il (A, Energb, A(Ifthet), Totsig, Capsig, - * A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), A(Iepx), - * A(Iggx), A(Iiex), Wssmsc, Em, Exp1, Yyy1, - * Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, - * Knthet, Kountr, Nxtptwn, Nxtptvm) + CALL Mulsca_1il (A, Energb, A(Ifthet), Totsig, Capsig, & + A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), A(Iepx), & + A(Iggx), I_Iiex, Wssmsc, Em, Exp1, Yyy1, & + Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, & + Knthet, Kountr, Nxtptwn, Nxtptvm) END IF END DO -C *** END of loop on Isotopes -C -C *** Fix value of Y1 (Needs multiply by Pi) +! *** END of loop on Isotopes +! +! *** Fix value of Y1 (Needs multiply by Pi) CALL Fixy_1i (A(Idyyy1), Yyy1) -C -C *** Finished with multiple-scattering corrections -C -C *** Y0 is self-shielded capture yield; normalized to be the -C *** cross section in the limit of Zero thickness +! +! *** Finished with multiple-scattering corrections +! +! *** Y0 is self-shielded capture yield; normalized to be the +! *** cross section in the limit of Zero thickness Td = Total*Dthick IF (Nonu.EQ.0) THEN -C *** Uniform thickness +! *** Uniform thickness Exxxx = Exp1 ELSE -C *** Non-uniform thickness - CALL Non_Uniform_Thickness (A_Iznonu , A_Irnonu , - * Td, Exxxx, Nonu) +! *** Non-uniform thickness + CALL Non_Uniform_Thickness (A_Iznonu, A_Irnonu, Td, Exxxx, Nonu) END IF Y0 = (One-Exxxx)*Capsig(N)/Td -C +! IF (Sensin.NE.Zero) THEN -C *** When neutron sensitivity is given (as "miscellaneous -C *** parameters card 11"), then correction term is added +! *** When neutron sensitivity is given (as "miscellaneous +! *** parameters card 11"), then correction term is added CALL Get_Ratio_Sensin (Em, Ratio_Sensin, Nsen, Itimes) - Asensn = (One-Exp1) * Ratio_Sensin * - * (100.0d0*Fourpi*Elastic/Total) / Dthick -C *** Remember that "Fourpi" is really 4*pi/100 + Asensn = (One-Exp1) * Ratio_Sensin * (100.0d0*Fourpi*Elastic/Total) / Dthick +! *** Remember that "Fourpi" is really 4*pi/100 Y0 = Y0 + Asensn*Sensin END IF -C -C *** Normalize Y1 same as Y0; renormalize all if needed; -C *** store in Sigxxx; also calculate derivs for all pieces +! +! *** Normalize Y1 same as Y0; renormalize all if needed; +! *** store in Sigxxx; also calculate derivs for all pieces Dddyy0 = Zero - CALL Ynrm_1 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), - * A(Idasig), A(Idbsig), A(Idyyy1), Y0, Yyy1, - * Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) -C -C *** Modify for self-indication experiments - IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), - * A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) -C + CALL Ynrm_1 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), & + A(Idasig), A(Idbsig), A(Idyyy1), Y0, Yyy1, & + Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) +! +! *** Modify for self-indication experiments + IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), & + A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) +! IF (Debug) THEN WRITE (66,10400) Em, Y0, Yyy1 10400 FORMAT (' E,0,1=', F12.4, 1p4g14.5) END IF CALL Finish_01 (A, Ee, Wssmsc, Em, Y0, Kdatb, Kkkdat, N) -C +! ELSE IF (Idone.EQ.1) THEN -C *** Here E < Eminr, so do not calculate Yield. -C +! *** Here E < Eminr, so do not calculate Yield. +! END IF -C finish check on value of Idone +! finish check on value of Idone END DO -C *** Done with loop on Energies Em +! *** Done with loop on Energies Em IF (Kssmpr.EQ.1) CLOSE (UNIT=60) -C -C +! +! 80 CONTINUE -C *** Completely done -C +! *** Completely done +! RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssssds_1iq (A, Jxciso, Energy, Energb, Totsig, Capsig, - * Nx, Maxx, Kdatb, Kdatmn, Kkkdat) -C -C *** Ssssds_1iq generates the the self-shielded + single-scattered -C *** capture yield for an infinite slab with quadratic interpolation -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssssds_1iq (A, Jxciso, Energy, Energb, Totsig, Capsig, & + Nx, Maxx, Kdatb, Kdatmn, Kkkdat) +! +! *** Ssssds_1iq generates the the self-shielded + single-scattered +! *** capture yield for an infinite slab with quadratic interpolation +! use oops_common_m use fixedi_m use ifwrit_m @@ -305,155 +307,155 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_1_m + use ssm_5_m + use ssm_20_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C - DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), - * Totsig(*), Capsig(*) -C +! + DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), Totsig(*), Capsig(*) +! DIMENSION Wssmsc(10) DATA Zero /0.0d0/, One /1.0d0/ -C +! Itimes = 1 Kountr = 0 -C +! CALL Findpr (multScat%getNumTheta(), Knthet) CALL Findpr (Nxtptw, Nxtptwn) CALL Findpr (Nxtptv, Nxtptvm) -C +! Imin = 1 Kkkdat = 0 Kdatmn = 0 Nsen = 1 -C -C *** Start major do-loop on Energy +! +! *** Start major do-loop on Energy DO N=1,Kdatb Nn = N -C +! Y0 = Zero Yyy1 = Zero IF (Ksolve.NE.2) CALL Zero_Array (A(Idyyy1), Nx) -C - CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), - * A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, - * A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) +! + CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), & + A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, & + A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) IF (Istop.EQ.1) GO TO 80 -C -C *** get Energy Em +! +! *** get Energy Em Em = Energb(Nn) CALL Getem (Em, Kkkdat, Idone) -C +! IF (Idone.EQ.2) THEN -C *** Here E > Emax, so we're done. +! *** Here E > Emax, so we're done. GO TO 80 -C -C +! +! ELSE IF (Idone.EQ.0) THEN -C *** Here if Idone=0, energy Em is bigger than Eminr, so -C *** calculation can proceed -C +! *** Here if Idone=0, energy Em is bigger than Eminr, so +! *** calculation can proceed +! IF (Kdatmn.EQ.0) Kdatmn = Nn Total = Totsig(N) Exp1 = dEXP(-Dthick*Total) -C +! IF (Kwssms.EQ.1) THEN Wssmsc(1) = Em Wssmsc(2) = Capsig(N) Wssmsc(3) = Totsig(N) END IF -C +! CALL Zero_Array (A(Isigxx), 1) IF (Ksolve.NE.2) THEN IF (Ndasig.GT.0) CALL Zero_Array (A(Idasig), Ndasig) IF (Ndbsig.GT.0) CALL Zero_Array (A(Idbsig), Ndbsig) END IF -C -C -C *** Here begin multiple-scattering calculation -C +! +! +! *** Here begin multiple-scattering calculation +! Wssmsc(5) = Zero Wssmsc(6) = Zero DO Iso=1,Niniso -C *** Start loop over nuclides (ie over "isotopes") +! *** Start loop over nuclides (ie over "isotopes") IF (Jxciso(Iso).NE.1) THEN Iiso = Iso - CALL Mulsca_1iq (A, Energb, A(Ifthet), Totsig, Capsig, - * A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), A(Iepx), - * A(Iggx), A(Iiex), Wssmsc, Em, Exp1, Yyy1, - * Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, - * Knthet, Kountr, Nxtptwn, Nxtptvm) + CALL Mulsca_1iq (A, Energb, A(Ifthet), Totsig, Capsig, & + A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), A(Iepx), & + A(Iggx), I_Iiex, Wssmsc, Em, Exp1, Yyy1, & + Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, & + Knthet, Kountr, Nxtptwn, Nxtptvm) END IF END DO -C *** END of loop on Isotopes -C -C *** Fix value of Y1 (Needs multiply by Pi) +! *** END of loop on Isotopes +! +! *** Fix value of Y1 (Needs multiply by Pi) CALL Fixy_1i (A(Idyyy1), Yyy1) -C -C *** Finished with multiple-scattering corrections -C -C *** Y0 is self-shielded capture yield; normalized to be the -C *** cross section in the limit of Zero thickness +! +! *** Finished with multiple-scattering corrections +! +! *** Y0 is self-shielded capture yield; normalized to be the +! *** cross section in the limit of Zero thickness Td = Total*Dthick IF (Nonu.EQ.0) THEN -C *** Uniform thickness +! *** Uniform thickness Exxxx = Exp1 ELSE -C *** Non-uniform thickness - CALL Non_Uniform_Thickness (A_Iznonu , A_Irnonu , - * Td, Exxxx, Nonu) +! *** Non-uniform thickness + CALL Non_Uniform_Thickness (A_Iznonu, A_Irnonu, Td, Exxxx, Nonu) END IF Y0 = (One-Exxxx)*Capsig(N)/Td -C +! IF (Sensin.NE.Zero) THEN -C *** When neutron sensitivity is given (as "miscellaneous -C *** parameters card 11"), then correction term is added +! *** When neutron sensitivity is given (as "miscellaneous +! *** parameters card 11"), then correction term is added CALL Get_Ratio_Sensin (Em, Ratio_Sensin, Nsen, Itimes) - Asensn = (One-Exp1) * Ratio_Sensin * - * (100.0d0*Fourpi*Elastic/Total) / Dthick -C *** Remember that "Fourpi" is really 4*pi/100 + Asensn = (One-Exp1) * Ratio_Sensin * (100.0d0*Fourpi*Elastic/Total) / Dthick +! *** Remember that "Fourpi" is really 4*pi/100 Y0 = Y0 + Asensn*Sensin END IF -C -C *** Normalize Y1 same as Y0; renormalize all if needed; -C *** store in Sigxxx; also calculate derivs for all pieces +! +! *** Normalize Y1 same as Y0; renormalize all if needed; +! *** store in Sigxxx; also calculate derivs for all pieces Dddyy0 = Zero - CALL Ynrm_1 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), - * A(Idasig), A(Idbsig), A(Idyyy1), Y0, Yyy1, - * Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) -C -C *** Modify for self-indication experiments - IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), - * A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) -C + CALL Ynrm_1 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), & + A(Idasig), A(Idbsig), A(Idyyy1), Y0, Yyy1, & + Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) +! +! *** Modify for self-indication experiments + IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), & + A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) +! IF (Debug) THEN WRITE (66,10400) Em, Y0, Yyy1 10400 FORMAT (' E,0,1=', F12.4, 1p4g14.5) END IF CALL Finish_01 (A, Ee, Wssmsc, Em, Y0, Kdatb, Kkkdat, N) -C +! ELSE IF (Idone.EQ.1) THEN -C *** Here E < Eminr, so do not calculate Yield. -C +! *** Here E < Eminr, so do not calculate Yield. +! END IF -C finish check on value of Idone +! finish check on value of Idone END DO -C *** Done with loop on Energies Em +! *** Done with loop on Energies Em IF (Kssmpr.EQ.1) CLOSE (UNIT=60) -C -C +! +! 80 CONTINUE -C *** Completely done +! *** Completely done RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssssds_1fl (A, Jxciso, Energy, Energb, Totsig, Capsig, - * Nx, Maxx, Kdatb, Kdatmn, Kkkdat) -C -C *** Ssssds_1fl generates the the self-shielded + single-scattered -C *** capture yield for a finite slab with linear interpolation -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssssds_1fl (A, Jxciso, Energy, Energb, Totsig, Capsig, & + Nx, Maxx, Kdatb, Kdatmn, Kkkdat) +! +! *** Ssssds_1fl generates the the self-shielded + single-scattered +! *** capture yield for a finite slab with linear interpolation +! use oops_common_m use fixedi_m use ifwrit_m @@ -467,160 +469,161 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_1_m + use ssm_utils_m + use ssm_6_m + use ssm_20_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C +! DIMENSION Yyy1fb(2) - DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), - * Totsig(*), Capsig(*) -C + DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), Totsig(*), Capsig(*) +! DIMENSION Wssmsc(10) DATA Zero /0.0d0/, One /1.0d0/ -C +! Itimes = 1 Kountr = 0 -C +! CALL Findpr (multScat%getNumTheta(), Knthet) CALL Findpr (Nxtptw, Nxtptwn) CALL Findpr (Nxtptv, Nxtptvm) -C +! Imin = 1 Kkkdat = 0 Kdatmn = 0 Nsen = 1 -C -C +! +! call multScat%setLogSigmaTotMin( 1.d20) call multScat%setLogSigmaTotMax( -1.0d0) Interp_Small_Times = 0 -C *** Start major do-loop on Energy +! *** Start major do-loop on Energy DO N=1,Kdatb Nn = N -C +! CALL Zero0_1f (A, Yyy1fb, Y0, Yyy1, Nx) -C - CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), - * A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, - * A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) +! + CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), & + A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, & + A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) IF (Istop.EQ.1) GO TO 80 -C -C *** get Energy Em +! +! *** get Energy Em Em = Energb(Nn) CALL Getem (Em, Kkkdat, Idone) -C +! IF (Idone.EQ.2) THEN -C *** Here E > Emax, so we're done. +! *** Here E > Emax, so we're done. GO TO 80 -C -C +! +! ELSE IF (Idone.EQ.0) THEN -C *** Here if Idone=0, energy Em is bigger than Eminr, so -C *** calculation can proceed -C +! *** Here if Idone=0, energy Em is bigger than Eminr, so +! *** calculation can proceed +! IF (Kdatmn.EQ.0) Kdatmn = Nn Total = Totsig(N) Exp1 = dEXP(-Dthick*Total) -C +! IF (Kwssms.EQ.1) THEN Wssmsc(1) = Em Wssmsc(2) = Capsig(N) Wssmsc(3) = Totsig(N) END IF -C +! CALL Zero_Array (A(Isigxx), 1) IF (Ksolve.NE.2) THEN IF (Ndasig.GT.0) CALL Zero_Array (A(Idasig), Ndasig) IF (Ndbsig.GT.0) CALL Zero_Array (A(Idbsig), Ndbsig) END IF -C -C -C *** Here begin multiple-scattering calculation -C +! +! +! *** Here begin multiple-scattering calculation +! Wssmsc(5) = Zero Wssmsc(6) = Zero DO Iso=1,Niniso -C *** Start loop over nuclides (ie over "isotopes") +! *** Start loop over nuclides (ie over "isotopes") IF (Jxciso(Iso).NE.1) THEN Iiso = Iso - CALL Mulsca_1fl (A, Energb, A(Ifthet), Totsig, Capsig, - * A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), A(Iepx), - * A(Iggx), A(Iiex), Wssmsc, Em, Exp1, Yyy1, - * Yyy1fb, Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, - * Knthet, Kountr, Nxtptwn, Nxtptvm) + CALL Mulsca_1fl (A, Energb, A(Ifthet), Totsig, Capsig, & + A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), A(Iepx), & + A(Iggx), I_Iiex, Wssmsc, Em, Exp1, Yyy1, & + Yyy1fb, Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, & + Knthet, Kountr, Nxtptwn, Nxtptvm) END IF END DO -C *** END of loop on Isotopes -C -C *** Fix value of Y1 (Needs multiply by Pi) +! *** END of loop on Isotopes +! +! *** Fix value of Y1 (Needs multiply by Pi) CALL Fixy_1f (A(Idyyy1), Yyy1, Yyy1fb) -C -C *** Finished with multiple-scattering corrections -C -C *** Y0 is self-shielded capture yield; normalized to be the -C *** cross section in the limit of Zero thickness +! +! *** Finished with multiple-scattering corrections +! +! *** Y0 is self-shielded capture yield; normalized to be the +! *** cross section in the limit of Zero thickness Td = Total*Dthick IF (Nonu.EQ.0) THEN -C *** Uniform thickness +! *** Uniform thickness Exxxx = Exp1 ELSE -C *** Non-uniform thickness - CALL Non_Uniform_Thickness (A_Iznonu , A_Irnonu , - * Td, Exxxx, Nonu) +! *** Non-uniform thickness + CALL Non_Uniform_Thickness (A_Iznonu, A_Irnonu, Td, Exxxx, Nonu) END IF Y0 = (One-Exxxx)*Capsig(N)/Td -C +! IF (Sensin.NE.Zero) THEN -C *** When neutron sensitivity is given (as "miscellaneous -C *** parameters card 11"), then correction term is added +! *** When neutron sensitivity is given (as "miscellaneous +! *** parameters card 11"), then correction term is added CALL Get_Ratio_Sensin (Em, Ratio_Sensin, Nsen, Itimes) - Asensn = (One-Exp1) * Ratio_Sensin * - * (100.0d0*Fourpi*Elastic/Total) / Dthick -C *** Remember that "Fourpi" is really 4*pi/100 + Asensn = (One-Exp1) * Ratio_Sensin * (100.0d0*Fourpi*Elastic/Total) / Dthick +! *** Remember that "Fourpi" is really 4*pi/100 Y0 = Y0 + Asensn*Sensin END IF -C -C *** Normalize Y1 same as Y0; renormalize all if needed; -C *** store in Sigxxx; also calculate derivs for all pieces +! +! *** Normalize Y1 same as Y0; renormalize all if needed; +! *** store in Sigxxx; also calculate derivs for all pieces Dddyy0 = Zero - CALL Ynrm_1 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), - * A(Idasig), A(Idbsig), A(Idyyy1), Y0, Yyy1, - * Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) -C -C *** Modify for self-indication experiments - IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), - * A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) -C + CALL Ynrm_1 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), & + A(Idasig), A(Idbsig), A(Idyyy1), Y0, Yyy1, & + Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) +! +! *** Modify for self-indication experiments + IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), & + A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) +! IF (Debug) THEN WRITE (66,10400) Em, Y0, Yyy1 10400 FORMAT (' E,0,1=', F12.4, 1p4g14.5) END IF CALL Finish_01 (A, Ee, Wssmsc, Em, Y0, Kdatb, Kkkdat, N) -C +! ELSE IF (Idone.EQ.1) THEN -C *** Here E < Eminr, so do not calculate Yield. -C +! *** Here E < Eminr, so do not calculate Yield. +! END IF -C finish check on value of Idone +! finish check on value of Idone END DO -C *** Done with loop on Energies Em +! *** Done with loop on Energies Em IF (Kssmpr.EQ.1) CLOSE (UNIT=60) -C -C +! +! 80 CONTINUE -C *** Completely done +! *** Completely done Call Tell_Finite (A) RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssssds_1fq (A, Jxciso, Energy, Energb, Totsig, Capsig, - * Nx, Maxx, Kdatb, Kdatmn, Kkkdat) -C -C *** Ssssds_1fq generates the the self-shielded + single-scattered -C *** capture yield for a finite slab with quadratic interpolation -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssssds_1fq (A, Jxciso, Energy, Energb, Totsig, Capsig, & + Nx, Maxx, Kdatb, Kdatmn, Kkkdat) +! +! *** Ssssds_1fq generates the the self-shielded + single-scattered +! *** capture yield for a finite slab with quadratic interpolation +! use oops_common_m use fixedi_m use ifwrit_m @@ -634,146 +637,149 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_1_m + use ssm_utils_m + use ssm_6_m + use ssm_20_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C +! DIMENSION Yyy1fb(2) - DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), - * Totsig(*), Capsig(*) -C + DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), Totsig(*), Capsig(*) +! DIMENSION Wssmsc(10) DATA Zero /0.0d0/, One /1.0d0/ -C +! Itimes = 1 Kountr = 0 -C +! CALL Findpr (multScat%getNumTheta(), Knthet) CALL Findpr (Nxtptw, Nxtptwn) CALL Findpr (Nxtptv, Nxtptvm) -C +! Imin = 1 Kkkdat = 0 Kdatmn = 0 Nsen = 1 -C -C +! +! call multScat%setLogSigmaTotMin( 1.d20 ) call multScat%setLogSigmaTotMax( -1.0d0 ) Interp_Small_Times = 0 -C *** Start major do-loop on Energy +! *** Start major do-loop on Energy DO N=1,Kdatb Nn = N -C +! CALL Zero0_1f (A, Yyy1fb, Y0, Yyy1, Nx) -C - CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), - * A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, - * A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) +! + CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), & + A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, & + A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) IF (Istop.EQ.1) GO TO 80 -C -C *** get Energy Em +! +! *** get Energy Em Em = Energb(Nn) CALL Getem (Em, Kkkdat, Idone) -C +! IF (Idone.EQ.2) THEN -C *** Here E > Emax, so we're done. +! *** Here E > Emax, so we're done. GO TO 80 -C -C +! +! ELSE IF (Idone.EQ.0) THEN -C *** Here if Idone=0, energy Em is bigger than Eminr, so -C *** calculation can proceed -C +! *** Here if Idone=0, energy Em is bigger than Eminr, so +! *** calculation can proceed +! IF (Kdatmn.EQ.0) Kdatmn = Nn Total = Totsig(N) Exp1 = dEXP(-Dthick*Total) -C +! IF (Kwssms.EQ.1) THEN Wssmsc(1) = Em Wssmsc(2) = Capsig(N) Wssmsc(3) = Totsig(N) END IF -C +! CALL Zero_Array (A(Isigxx), 1) IF (Ksolve.NE.2) THEN IF (Ndasig.GT.0) CALL Zero_Array (A(Idasig), Ndasig) IF (Ndbsig.GT.0) CALL Zero_Array (A(Idbsig), Ndbsig) END IF -C -C -C *** Here begin multiple-scattering calculation -C +! +! +! *** Here begin multiple-scattering calculation +! Wssmsc(5) = Zero Wssmsc(6) = Zero DO Iso=1,Niniso -C *** Start loop over nuclides (ie over "isotopes") +! *** Start loop over nuclides (ie over "isotopes") IF (Jxciso(Iso).NE.1) THEN Iiso = Iso - CALL Mulsca_1fq (A, Energb, A(Ifthet), Totsig, Capsig, - * A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), A(Iepx), - * A(Iggx), A(Iiex), Wssmsc, Em, Exp1, Yyy1, - * Yyy1fb, Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, - * Knthet, Kountr, Nxtptwn, Nxtptvm) + CALL Mulsca_1fq (A, Energb, A(Ifthet), Totsig, Capsig, & + A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), A(Iepx), & + A(Iggx), I_Iiex, Wssmsc, Em, Exp1, Yyy1, & + Yyy1fb, Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, & + Knthet, Kountr, Nxtptwn, Nxtptvm) END IF END DO -C *** END of loop on Isotopes -C -C *** Fix value of Y1 (Needs multiply by Pi) +! *** END of loop on Isotopes +! +! *** Fix value of Y1 (Needs multiply by Pi) CALL Fixy_1f (A(Idyyy1), Yyy1, Yyy1fb) -C -C *** Finished with multiple-scattering corrections -C -C *** Y0 is self-shielded capture yield; normalized to be the -C *** cross section in the limit of Zero thickness +! +! *** Finished with multiple-scattering corrections +! +! *** Y0 is self-shielded capture yield; normalized to be the +! *** cross section in the limit of Zero thickness Td = Total*Dthick IF (Nonu.EQ.0) THEN -C *** Uniform thickness +! *** Uniform thickness Exxxx = Exp1 ELSE -C *** Non-uniform thickness - CALL Non_Uniform_Thickness (A_Iznonu , A_Irnonu , - * Td, Exxxx, Nonu) +! *** Non-uniform thickness + CALL Non_Uniform_Thickness (A_Iznonu, A_Irnonu, Td, Exxxx, Nonu) END IF Y0 = (One-Exxxx)*Capsig(N)/Td -C +! IF (Sensin.NE.Zero) THEN -C *** When neutron sensitivity is given (as "miscellaneous -C *** parameters card 11"), then correction term is added +! *** When neutron sensitivity is given (as "miscellaneous +! *** parameters card 11"), then correction term is added CALL Get_Ratio_Sensin (Em, Ratio_Sensin, Nsen, Itimes) - Asensn = (One-Exp1) * Ratio_Sensin * - * (100.0d0*Fourpi*Elastic/Total) / Dthick -C *** Remember that "Fourpi" is really 4*pi/100 + Asensn = (One-Exp1) * Ratio_Sensin * (100.0d0*Fourpi*Elastic/Total) / Dthick +! *** Remember that "Fourpi" is really 4*pi/100 Y0 = Y0 + Asensn*Sensin END IF -C -C *** Normalize Y1 same as Y0; renormalize all if needed; -C *** store in Sigxxx; also calculate derivs for all pieces +! +! *** Normalize Y1 same as Y0; renormalize all if needed; +! *** store in Sigxxx; also calculate derivs for all pieces Dddyy0 = Zero - CALL Ynrm_1 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), - * A(Idasig), A(Idbsig), A(Idyyy1), Y0, Yyy1, - * Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) -C -C *** Modify for self-indication experiments - IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), - * A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) -C + CALL Ynrm_1 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), & + A(Idasig), A(Idbsig), A(Idyyy1), Y0, Yyy1, & + Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) +! +! *** Modify for self-indication experiments + IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), & + A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) +! IF (Debug) THEN WRITE (66,10400) Em, Y0, Yyy1 10400 FORMAT (' E,0,1=', F12.4, 1p4g14.5) END IF CALL Finish_01 (A, Ee, Wssmsc, Em, Y0, Kdatb, Kkkdat, N) -C +! ELSE IF (Idone.EQ.1) THEN -C *** Here E < Eminr, so do not calculate Yield. -C +! *** Here E < Eminr, so do not calculate Yield. +! END IF -C finish check on value of Idone +! finish check on value of Idone END DO -C *** Done with loop on Energies Em +! *** Done with loop on Energies Em IF (Kssmpr.EQ.1) CLOSE (UNIT=60) -C -C +! +! 80 CONTINUE -C *** Completely done +! *** Completely done Call Tell_Finite (A) RETURN END + +end module ssm_3_m diff --git a/sammy/src/ssm/mssm04.f b/sammy/src/ssm/mssm04.f90 similarity index 51% rename from sammy/src/ssm/mssm04.f rename to sammy/src/ssm/mssm04.f90 index 976608503..d1bb6de4b 100644 --- a/sammy/src/ssm/mssm04.f +++ b/sammy/src/ssm/mssm04.f90 @@ -1,13 +1,15 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssssds_2il (A, Jxciso, Energy, Energb, Totsig, Capsig, - * Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) -C -C *** Ssssds_2il generates the the self-shielded + multiple-scattered -C *** capture yield for an infinite slab with linear interpolation -C +! +module ssm_4_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssssds_2il (A, Jxciso, Energy, Energb, Totsig, Capsig, & + Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) +! +! *** Ssssds_2il generates the the self-shielded + multiple-scattered +! *** capture yield for an infinite slab with linear interpolation +! use oops_common_m use fixedi_m use ifwrit_m @@ -21,66 +23,71 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_1_m + use ssm_utils_m + use ssm_7_m + use ssm_18_m + use ssm_20_m + use ssm_21_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C - DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), - * Totsig(*), Capsig(*), Y2cccc(*), Dy2ccc(Nx,*) -C +! + DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), & + Totsig(*), Capsig(*), Y2cccc(*), Dy2ccc(Nx,*) +! DIMENSION Wssmsc(10) DATA Zero /0.0d0/, One /1.0d0/ -C +! Itimes = 1 Kountr = 0 -C +! IF (Mcy2.EQ.1) CALL Gety2zzz (Emy2_a, Emy2_b, Y2tab_a, Y2tab_b) -C +! CALL Findpr (multScat%getNumTheta(), Knthet) CALL Findpr (Nxtptw, Nxtptwn) CALL Findpr (Nxtptv, Nxtptvm) -C +! Imin = 1 Kkkdat = 0 Kdatmn = 0 Nsen = 1 -C -C *** Start major do-loop on Energy +! +! *** Start major do-loop on Energy DO N=1,Kdatb Nn = N -C +! CALL Zero0_2i (A, Y0, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Nx) -C - CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), - * A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, - * A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) +! + CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), & + A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, & + A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) IF (Istop.EQ.1) GO TO 80 -C -C *** get Energy Em +! +! *** get Energy Em Em = Energb(Nn) CALL Getem (Em, Kkkdat, Idone) - IF (Mcy2.EQ.1) CALL Gety2tab (Em, Y2tab, Emy2_a, Emy2_b, - * Y2tab_a, Y2tab_b) -C + IF (Mcy2.EQ.1) CALL Gety2tab (Em, Y2tab, Emy2_a, Emy2_b, Y2tab_a, Y2tab_b) +! IF (Idone.EQ.2) THEN -C *** Here E > Emax, so we're done. +! *** Here E > Emax, so we're done. GO TO 80 -C +! ELSE IF (Idone.EQ.3 .OR. Idone.EQ.0) THEN -C *** Here if Idone=3, which means don't calculate yield, but do -C *** calculate the pieces needed for Y2 -C -C *** Also here if Idone=0, energy Em is bigger than Eminr, so -C *** calculation can proceed -C +! *** Here if Idone=3, which means don't calculate yield, but do +! *** calculate the pieces needed for Y2 +! +! *** Also here if Idone=0, energy Em is bigger than Eminr, so +! *** calculation can proceed +! IF (Idone.NE.3 .AND. Kdatmn.EQ.0) Kdatmn = Nn Total = Totsig(N) Exp1 = dEXP(-Dthick*Total) -C +! IF (Kwssms.EQ.1) THEN Wssmsc(1) = Em Wssmsc(2) = Capsig(N) Wssmsc(3) = Totsig(N) END IF -C +! IF (Idone.NE.3) THEN CALL Zero_Array (A(Isigxx), 1) IF (Ksolve.NE.2) THEN @@ -88,106 +95,103 @@ C IF (Ndbsig.GT.0) CALL Zero_Array (A(Idbsig), Ndbsig) END IF END IF -C -C *** Here begin multiple-scattering calculation -C +! +! *** Here begin multiple-scattering calculation +! Wssmsc(5) = Zero Wssmsc(6) = Zero DO Iso=1,Niniso -C *** Start loop over nuclides (ie over "isotopes") +! *** Start loop over nuclides (ie over "isotopes") IF (Jxciso(Iso).NE.1) THEN Iiso = Iso - CALL Mulsca_2il (A, Energb, A(Ifthet), Totsig, - * Capsig, A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), - * A(Iepx), A(Iggx), A(Iiex), Y2cccc, Dy2ccc, - * Wssmsc, Em, Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, - * Y2bbbq, Nx, Maxx, Kdatb, Iiso, Nn, Imin, - * Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) + CALL Mulsca_2il (A, Energb, A(Ifthet), Totsig, & + Capsig, A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), & + A(Iepx), A(Iggx), I_Iiex, Y2cccc, Dy2ccc, & + Wssmsc, Em, Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, & + Y2bbbq, Nx, Maxx, Kdatb, Iiso, Nn, Imin, & + Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) END IF END DO -C *** END of loop on Isotopes -C -C *** Fix value of Y1 (Needs multiply by Pi) +! *** END of loop on Isotopes +! +! *** Fix value of Y1 (Needs multiply by Pi) IF (Idone.NE.3) CALL Fixy_1i (A(Idyyy1), Yyy1) -C -C *** Now fix the value of Y2cccc & derivatives; also fix Yyy2 - CALL Fixy_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), Y2cccc(Nn), - * Dy2ccc(1,Nn), A(Idy2bb), A(Idy2bq), A(Idybqq), Yyy2, - * Yyy2q, Y2bbbb, Y2bbbq, Idone, Nn, Em) -C -C *** Finished with multiple-scattering corrections +! +! *** Now fix the value of Y2cccc & derivatives; also fix Yyy2 + CALL Fixy_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), Y2cccc(Nn), & + Dy2ccc(1,Nn), A(Idy2bb), A(Idy2bq), A(Idybqq), Yyy2, & + Yyy2q, Y2bbbb, Y2bbbq, Idone, Nn, Em) +! +! *** Finished with multiple-scattering corrections END IF -C +! IF (Idone.NE.3) THEN -C -C *** Y0 is self-shielded capture yield; normalized to be the -C *** cross section in the limit of Zero thickness +! +! *** Y0 is self-shielded capture yield; normalized to be the +! *** cross section in the limit of Zero thickness Td = Total*Dthick IF (Nonu.EQ.0) THEN -C *** Uniform thickness +! *** Uniform thickness Exxxx = Exp1 ELSE -C *** Non-uniform thickness - CALL Non_Uniform_Thickness (A_Iznonu , A_Irnonu , - * Td, Exxxx, Nonu) +! *** Non-uniform thickness + CALL Non_Uniform_Thickness (A_Iznonu, A_Irnonu, Td, Exxxx, Nonu) END IF Y0 = (One-Exxxx)*Capsig(N)/Td -C +! IF (Sensin.NE.Zero) THEN -C *** When neutron sensitivity is given (as "miscellaneous -C *** parameters card 11"), then correction term is added +! *** When neutron sensitivity is given (as "miscellaneous +! *** parameters card 11"), then correction term is added CALL Get_Ratio_Sensin (Em, Ratio_Sensin, Nsen, Itimes) - Asensn = (One-Exp1) * Ratio_Sensin * - * (100.0d0*Fourpi*Elastic/Total) / Dthick -C *** Remember that "Fourpi" is really 4*pi/100 + Asensn = (One-Exp1) * Ratio_Sensin * (100.0d0*Fourpi*Elastic/Total) / Dthick +! *** Remember that "Fourpi" is really 4*pi/100 Y0 = Y0 + Asensn*Sensin END IF -C -C *** Normalize Y1 & Y2 same as Y0; renormalize all if needed; -C *** store in Sigxxx; also calculate derivs for all pieces +! +! *** Normalize Y1 & Y2 same as Y0; renormalize all if needed; +! *** store in Sigxxx; also calculate derivs for all pieces Dddyy0 = Zero - CALL Ynrm_2 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), - * A(Idasig), A(Idbsig), A(Idyyy1), A(Idyyy2), Y0, Yyy1, - * Yyy2, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Y2tab, - * Nn) -C -C *** Modify for self-indication experiments - IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), - * A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) -C -C + CALL Ynrm_2 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), & + A(Idasig), A(Idbsig), A(Idyyy1), A(Idyyy2), Y0, Yyy1, & + Yyy2, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Y2tab, Nn) +! +! *** Modify for self-indication experiments + IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), & + A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) +! +! IF (Debug) THEN WRITE (66,10300) Em, Y0, Yyy1, Yyy2, Y2bbbb 10300 FORMAT (' E,0,1,2,x=', F12.4, 1p4g14.5) END IF CALL Finish_01 (A, Ee, Wssmsc, Em, Y0, Kdatb, Kkkdat, N) -C +! ELSE IF (Idone.EQ.1) THEN -C *** Here E < Eminr, so do not calculate Yield. -C *** Also do not calculate Pieces of Y2. -C +! *** Here E < Eminr, so do not calculate Yield. +! *** Also do not calculate Pieces of Y2. +! END IF -C finish check on value of Idone +! finish check on value of Idone END DO -C *** Done with loop on Energies Em +! *** Done with loop on Energies Em IF (Kssmpr.EQ.1) CLOSE (UNIT=60) -C -C +! +! 80 CONTINUE -C *** Completely done +! *** Completely done RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssssds_2iq (A, Jxciso, Energy, Energb, Totsig, Capsig, - * Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) -C -C *** Ssssds_2iq generates the the self-shielded + multiple-scattered -C *** capture yield for an infinite slab with quadratic interpolation -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssssds_2iq (A, Jxciso, Energy, Energb, Totsig, Capsig, & + Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) +! +! *** Ssssds_2iq generates the the self-shielded + multiple-scattered +! *** capture yield for an infinite slab with quadratic interpolation +! use oops_common_m use fixedi_m use ifwrit_m @@ -201,66 +205,71 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_1_m + use ssm_utils_m + use ssm_7_m + use ssm_18_m + use ssm_20_m + use ssm_21_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C - DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), - * Totsig(*), Capsig(*), Y2cccc(*), Dy2ccc(Nx,*) -C +! + DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), & + Totsig(*), Capsig(*), Y2cccc(*), Dy2ccc(Nx,*) +! DIMENSION Wssmsc(10) DATA Zero /0.0d0/, One /1.0d0/ -C +! Itimes = 1 Kountr = 0 -C +! IF (Mcy2.EQ.1) CALL Gety2zzz (Emy2_a, Emy2_b, Y2tab_a, Y2tab_b) -C +! CALL Findpr (multScat%getNumTheta(), Knthet) CALL Findpr (Nxtptw, Nxtptwn) CALL Findpr (Nxtptv, Nxtptvm) -C +! Imin = 1 Kkkdat = 0 Kdatmn = 0 Nsen = 1 -C -C *** Start major do-loop on Energy +! +! *** Start major do-loop on Energy DO N=1,Kdatb Nn = N -C +! CALL Zero0_2i (A, Y0, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Nx) -C - CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), - * A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, - * A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) +! + CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), & + A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, & + A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) IF (Istop.EQ.1) GO TO 80 -C -C *** get Energy Em +! +! *** get Energy Em Em = Energb(Nn) CALL Getem (Em, Kkkdat, Idone) - IF (Mcy2.EQ.1) CALL Gety2tab (Em, Y2tab, Emy2_a, Emy2_b, - * Y2tab_a, Y2tab_b) -C + IF (Mcy2.EQ.1) CALL Gety2tab (Em, Y2tab, Emy2_a, Emy2_b, Y2tab_a, Y2tab_b) +! IF (Idone.EQ.2) THEN -C *** Here E > Emax, so we're done. +! *** Here E > Emax, so we're done. GO TO 80 -C +! ELSE IF (Idone.EQ.3 .OR. Idone.EQ.0) THEN -C *** Here if Idone=3, which means don't calculate yield, but do -C *** calculate the pieces needed for Y2 -C -C *** Also here if Idone=0, energy Em is bigger than Eminr, so -C *** calculation can proceed -C +! *** Here if Idone=3, which means don't calculate yield, but do +! *** calculate the pieces needed for Y2 +! +! *** Also here if Idone=0, energy Em is bigger than Eminr, so +! *** calculation can proceed +! IF (Idone.NE.3 .AND. Kdatmn.EQ.0) Kdatmn = Nn Total = Totsig(N) Exp1 = dEXP(-Dthick*Total) -C +! IF (Kwssms.EQ.1) THEN Wssmsc(1) = Em Wssmsc(2) = Capsig(N) Wssmsc(3) = Totsig(N) END IF -C +! IF (Idone.NE.3) THEN CALL Zero_Array (A(Isigxx), 1) IF (Ksolve.NE.2) THEN @@ -268,107 +277,105 @@ C IF (Ndbsig.GT.0) CALL Zero_Array (A(Idbsig), Ndbsig) END IF END IF -C -C *** Here begin multiple-scattering calculation -C +! +! *** Here begin multiple-scattering calculation +! Wssmsc(5) = Zero Wssmsc(6) = Zero DO Iso=1,Niniso -C *** Start loop over nuclides (ie over "isotopes") +! *** Start loop over nuclides (ie over "isotopes") IF (Jxciso(Iso).NE.1) THEN Iiso = Iso - CALL Mulsca_2iq (A, Energb, A(Ifthet), Totsig, - * Capsig, A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), - * A(Iepx), A(Iggx), A(Iiex), Y2cccc, Dy2ccc, - * Wssmsc, Em, Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, - * Y2bbbq, Nx, Maxx, Kdatb, Iiso, Nn, Imin, - * Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) + CALL Mulsca_2iq (A, Energb, A(Ifthet), Totsig, & + Capsig, A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), & + A(Iepx), A(Iggx), I_Iiex, Y2cccc, Dy2ccc, & + Wssmsc, Em, Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, & + Y2bbbq, Nx, Maxx, Kdatb, Iiso, Nn, Imin, & + Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) END IF END DO -C *** END of loop on Isotopes -C -C *** Fix value of Y1 (Needs multiply by Pi) +! *** END of loop on Isotopes +! +! *** Fix value of Y1 (Needs multiply by Pi) IF (Idone.NE.3) CALL Fixy_1i (A(Idyyy1), Yyy1) -C -C *** Now fix the value of Y2cccc & derivatives; also fix Yyy2 - CALL Fixy_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), Y2cccc(Nn), - * Dy2ccc(1,Nn), A(Idy2bb), A(Idy2bq), A(Idybqq), Yyy2, - * Yyy2q, Y2bbbb, Y2bbbq, Idone, Nn, Em) -C -C *** Finished with multiple-scattering corrections +! +! *** Now fix the value of Y2cccc & derivatives; also fix Yyy2 + CALL Fixy_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), Y2cccc(Nn), & + Dy2ccc(1,Nn), A(Idy2bb), A(Idy2bq), A(Idybqq), Yyy2, & + Yyy2q, Y2bbbb, Y2bbbq, Idone, Nn, Em) +! +! *** Finished with multiple-scattering corrections END IF -C +! IF (Idone.NE.3) THEN -C -C *** Y0 is self-shielded capture yield; normalized to be the -C *** cross section in the limit of Zero thickness +! +! *** Y0 is self-shielded capture yield; normalized to be the +! *** cross section in the limit of Zero thickness Td = Total*Dthick IF (Nonu.EQ.0) THEN -C *** Uniform thickness +! *** Uniform thickness Exxxx = Exp1 ELSE -C *** Non-uniform thickness - CALL Non_Uniform_Thickness (A_Iznonu , A_Irnonu , - * Td, Exxxx, Nonu) +! *** Non-uniform thickness + CALL Non_Uniform_Thickness (A_Iznonu, A_Irnonu, Td, Exxxx, Nonu) END IF Y0 = (One-Exxxx)*Capsig(N)/Td -C +! IF (Sensin.NE.Zero) THEN -C *** When neutron sensitivity is given (as "miscellaneous -C *** parameters card 11"), then correction term is added +! *** When neutron sensitivity is given (as "miscellaneous +! *** parameters card 11"), then correction term is added CALL Get_Ratio_Sensin (Em, Ratio_Sensin, Nsen, Itimes) - Asensn = (One-Exp1) * Ratio_Sensin * - * (100.0d0*Fourpi*Elastic/Total) / Dthick -C *** Remember that "Fourpi" is really 4*pi/100 + Asensn = (One-Exp1) * Ratio_Sensin * (100.0d0*Fourpi*Elastic/Total) / Dthick +! *** Remember that "Fourpi" is really 4*pi/100 Y0 = Y0 + Asensn*Sensin END IF -C -C *** Normalize Y1 & Y2 same as Y0; renormalize all if needed; -C *** store in Sigxxx; also calculate derivs for all pieces +! +! *** Normalize Y1 & Y2 same as Y0; renormalize all if needed; +! *** store in Sigxxx; also calculate derivs for all pieces Dddyy0 = Zero - CALL Ynrm_2 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), - * A(Idasig), A(Idbsig), A(Idyyy1), A(Idyyy2), Y0, Yyy1, - * Yyy2, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Y2tab, - * Nn) -C -C *** Modify for self-indication experiments - IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), - * A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) -C -C + CALL Ynrm_2 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), & + A(Idasig), A(Idbsig), A(Idyyy1), A(Idyyy2), Y0, Yyy1, & + Yyy2, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Y2tab, & + Nn) +! +! *** Modify for self-indication experiments + IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), & + A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) +! +! IF (Debug) THEN WRITE (66,10300) Em, Y0, Yyy1, Yyy2, Y2bbbb 10300 FORMAT (' E,0,1,2,x=', F12.4, 1p4g14.5) END IF CALL Finish_01 (A, Ee, Wssmsc, Em, Y0, Kdatb, Kkkdat, N) -C +! ELSE IF (Idone.EQ.1) THEN -C *** Here E < Eminr, so do not calculate Yield. -C *** Also do not calculate Pieces of Y2. -C +! *** Here E < Eminr, so do not calculate Yield. +! *** Also do not calculate Pieces of Y2. +! END IF -C finish check on value of Idone +! finish check on value of Idone END DO -C *** Done with loop on Energies Em +! *** Done with loop on Energies Em IF (Kssmpr.EQ.1) CLOSE (UNIT=60) -C +! 80 CONTINUE -C *** Completely done +! *** Completely done RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssssds_2fl (A, Jxciso, Energy, Energb, Totsig, Capsig, - * Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) -C -C *** Ssssds_2fl generates the the self-shielded + multiple-scattered -C *** capture yield for an infinite slab, calls Mulsca to generate -C *** the finite-slab results. -C *** Using linear interpolation. -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssssds_2fl (A, Jxciso, Energy, Energb, Totsig, Capsig, & + Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) +! +! *** Ssssds_2fl generates the the self-shielded + multiple-scattered +! *** capture yield for an infinite slab, calls Mulsca to generate +! *** the finite-slab results. +! *** Using linear interpolation. +! use oops_common_m use fixedi_m use ifwrit_m @@ -382,71 +389,75 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_1_m + use ssm_utils_m + use ssm_8_m + use ssm_18_m + use ssm_20_m + use ssm_21_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C +! DIMENSION Yyy1fb(2) - DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), - * Totsig(*), Capsig(*), Y2cccc(*), Dy2ccc(Nx,*) -C + DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), & + Totsig(*), Capsig(*), Y2cccc(*), Dy2ccc(Nx,*) +! DIMENSION Wssmsc(10) DATA Zero /0.0d0/, One /1.0d0/ -C +! Itimes = 1 Kountr = 0 -C +! IF (Mcy2.EQ.1) CALL Gety2zzz (Emy2_a, Emy2_b, Y2tab_a, Y2tab_b) -C +! CALL Findpr (multScat%getNumTheta(), Knthet) CALL Findpr (Nxtptw, Nxtptwn) CALL Findpr (Nxtptv, Nxtptvm) -C +! Imin = 1 Kkkdat = 0 Kdatmn = 0 Nsen = 1 -C +! call multScat%setLogSigmaTotMin(1.d20) call multScat%setLogSigmaTotMax( -1.0d0) Interp_Small_Times = 0 -C *** Start major do-loop on Energy +! *** Start major do-loop on Energy DO N=1,Kdatb Nn = N -C - CALL Zero0_2f (A, Yyy1fb, Y0, Yyy1, Yyy2, Yyy2q, - * Y2bbbb, Y2bbbq, Nx) -C - CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), - * A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, - * A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) +! + CALL Zero0_2f (A, Yyy1fb, Y0, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Nx) +! + CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), & + A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, & + A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) IF (Istop.EQ.1) GO TO 80 -C -C *** get Energy Em +! +! *** get Energy Em Em = Energb(Nn) CALL Getem (Em, Kkkdat, Idone) - IF (Mcy2.EQ.1) CALL Gety2tab (Em, Y2tab, Emy2_a, Emy2_b, - * Y2tab_a, Y2tab_b) -C + IF (Mcy2.EQ.1) CALL Gety2tab (Em, Y2tab, Emy2_a, Emy2_b, Y2tab_a, Y2tab_b) +! IF (Idone.EQ.2) THEN -C *** Here E > Emax, so we're done. +! *** Here E > Emax, so we're done. GO TO 80 -C +! ELSE IF (Idone.EQ.3 .OR. Idone.EQ.0) THEN -C *** Here if Idone=3, which means don't calculate yield, but do -C *** calculate the pieces needed for Y2 -C -C *** Also here if Idone=0, energy Em is bigger than Eminr, so -C *** calculation can proceed -C +! *** Here if Idone=3, which means don't calculate yield, but do +! *** calculate the pieces needed for Y2 +! +! *** Also here if Idone=0, energy Em is bigger than Eminr, so +! *** calculation can proceed +! IF (Idone.NE.3 .AND. Kdatmn.EQ.0) Kdatmn = Nn Total = Totsig(N) Exp1 = dEXP(-Dthick*Total) -C +! IF (Kwssms.EQ.1) THEN Wssmsc(1) = Em Wssmsc(2) = Capsig(N) Wssmsc(3) = Totsig(N) END IF -C +! IF (Idone.NE.3) THEN CALL Zero_Array (A(Isigxx), 1) IF (Ksolve.NE.2) THEN @@ -454,107 +465,105 @@ C IF (Ndbsig.GT.0) CALL Zero_Array (A(Idbsig), Ndbsig) END IF END IF -C -C *** Here begin multiple-scattering calculation -C +! +! *** Here begin multiple-scattering calculation +! Wssmsc(5) = Zero Wssmsc(6) = Zero DO Iso=1,Niniso -C *** Start loop over nuclides (ie over "isotopes") +! *** Start loop over nuclides (ie over "isotopes") IF (Jxciso(Iso).NE.1) THEN Iiso = Iso - CALL Mulsca_2fl (A, Energb, A(Ifthet), Totsig, - * Capsig, A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), - * A(Iepx), A(Iggx), A(Iiex), Y2cccc, Dy2ccc, - * Wssmsc, Em, Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, - * Y2bbbq, Yyy1fb, Nx, Maxx, Kdatb, Iiso, Nn, - * Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) + CALL Mulsca_2fl (A, Energb, A(Ifthet), Totsig, & + Capsig, A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), & + A(Iepx), A(Iggx), I_Iiex, Y2cccc, Dy2ccc, & + Wssmsc, Em, Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, & + Y2bbbq, Yyy1fb, Nx, Maxx, Kdatb, Iiso, Nn, & + Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) END IF END DO -C *** END of loop on Isotopes -C -C *** Fix value of Y1 (Needs multiply by Pi) +! *** END of loop on Isotopes +! +! *** Fix value of Y1 (Needs multiply by Pi) IF (Idone.NE.3) CALL Fixy_1f (A(Idyyy1), Yyy1, Yyy1fb) -C -C *** Now fix the value of Y2cccc & derivatives; also fix Yyy2 - CALL Fixy_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), Y2cccc(Nn), - * Dy2ccc(1,Nn), A(Idy2bb), A(Idy2bq), A(Idybqq), Yyy2, - * Yyy2q, Y2bbbb, Y2bbbq, Idone, Nn, Em) -C -C *** Finished with multiple-scattering corrections +! +! *** Now fix the value of Y2cccc & derivatives; also fix Yyy2 + CALL Fixy_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), Y2cccc(Nn), & + Dy2ccc(1,Nn), A(Idy2bb), A(Idy2bq), A(Idybqq), Yyy2, & + Yyy2q, Y2bbbb, Y2bbbq, Idone, Nn, Em) +! +! *** Finished with multiple-scattering corrections END IF -C +! IF (Idone.NE.3) THEN -C -C *** Y0 is self-shielded capture yield; normalized to be the -C *** cross section in the limit of Zero thickness +! +! *** Y0 is self-shielded capture yield; normalized to be the +! *** cross section in the limit of Zero thickness Td = Total*Dthick IF (Nonu.EQ.0) THEN -C *** Uniform thickness +! *** Uniform thickness Exxxx = Exp1 ELSE -C *** Non-uniform thickness - CALL Non_Uniform_Thickness (A_Iznonu , A_Irnonu , - * Td, Exxxx, Nonu) +! *** Non-uniform thickness + CALL Non_Uniform_Thickness (A_Iznonu, A_Irnonu, Td, Exxxx, Nonu) END IF Y0 = (One-Exxxx)*Capsig(N)/Td -C +! IF (Sensin.NE.Zero) THEN -C *** When neutron sensitivity is given (as "miscellaneous -C *** parameters card 11"), then correction term is added +! *** When neutron sensitivity is given (as "miscellaneous +! *** parameters card 11"), then correction term is added CALL Get_Ratio_Sensin (Em, Ratio_Sensin, Nsen, Itimes) - Asensn = (One-Exp1) * Ratio_Sensin * - * (100.0d0*Fourpi*Elastic/Total) / Dthick -C *** Remember that "Fourpi" is really 4*pi/100 + Asensn = (One-Exp1) * Ratio_Sensin * (100.0d0*Fourpi*Elastic/Total) / Dthick +! *** Remember that "Fourpi" is really 4*pi/100 Y0 = Y0 + Asensn*Sensin END IF -C -C *** Normalize Y1 & Y2 same as Y0; renormalize all if needed; -C *** store in Sigxxx; also calculate derivs for all pieces +! +! *** Normalize Y1 & Y2 same as Y0; renormalize all if needed; +! *** store in Sigxxx; also calculate derivs for all pieces Dddyy0 = Zero - CALL Ynrm_2 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), - * A(Idasig), A(Idbsig), A(Idyyy1), A(Idyyy2), Y0, Yyy1, - * Yyy2, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Y2tab, Nn) -C -C *** Modify for self-indication experiments - IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), - * A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) -C + CALL Ynrm_2 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), & + A(Idasig), A(Idbsig), A(Idyyy1), A(Idyyy2), Y0, Yyy1, & + Yyy2, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Y2tab, Nn) +! +! *** Modify for self-indication experiments + IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), & + A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) +! IF (Debug) THEN WRITE (66,10300) Em, Y0, Yyy1, Yyy2, Y2bbbb 10300 FORMAT (' E,0,1,2,x=', F12.4, 1p4g14.5) END IF CALL Finish_01 (A, Ee, Wssmsc, Em, Y0, Kdatb, Kkkdat, N) -C +! ELSE IF (Idone.EQ.1) THEN -C *** Here E < Eminr, so do not calculate Yield. -C *** Also do not calculate Pieces of Y2. -C +! *** Here E < Eminr, so do not calculate Yield. +! *** Also do not calculate Pieces of Y2. +! END IF -C finish check on value of Idone +! finish check on value of Idone END DO -C *** Done with loop on Energies Em +! *** Done with loop on Energies Em IF (Kssmpr.EQ.1) CLOSE (UNIT=60) -C +! 80 CONTINUE -C *** Completely done -C +! *** Completely done +! Call Tell_Finite (A) RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssssds_2fq (A, Jxciso, Energy, Energb, Totsig, Capsig, - * Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) -C -C *** Ssssds_2fq generates the the self-shielded + multiple-scattered -C *** capture yield for an infinite slab, calls Mulsca to generate -C *** the finite-slab results. -C *** Using quadratic interpolation. -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssssds_2fq (A, Jxciso, Energy, Energb, Totsig, Capsig, & + Y2cccc, Dy2ccc, Nx, Maxx, Kdatb, Kdatmn, Kkkdat) +! +! *** Ssssds_2fq generates the the self-shielded + multiple-scattered +! *** capture yield for an infinite slab, calls Mulsca to generate +! *** the finite-slab results. +! *** Using quadratic interpolation. +! use oops_common_m use fixedi_m use ifwrit_m @@ -568,71 +577,75 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_1_m + use ssm_utils_m + use ssm_8_m + use ssm_18_m + use ssm_20_m + use ssm_21_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -C +! DIMENSION Yyy1fb(2) - DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), - * Totsig(*), Capsig(*), Y2cccc(*), Dy2ccc(Nx,*) -C + DIMENSION A(-Msize:Msize), Jxciso(*), Energy(*), Energb(*), & + Totsig(*), Capsig(*), Y2cccc(*), Dy2ccc(Nx,*) +! DIMENSION Wssmsc(10) DATA Zero /0.0d0/, One /1.0d0/ -C +! Itimes = 1 Kountr = 0 -C +! IF (Mcy2.EQ.1) CALL Gety2zzz (Emy2_a, Emy2_b, Y2tab_a, Y2tab_b) -C +! CALL Findpr (multScat%getNumTheta(), Knthet) CALL Findpr (Nxtptw, Nxtptwn) CALL Findpr (Nxtptv, Nxtptvm) -C +! Imin = 1 Kkkdat = 0 Kdatmn = 0 Nsen = 1 -C +! call multScat%setLogSigmaTotMin(1.d20) call multScat%setLogSigmaTotMax( -1.0d0) Interp_Small_Times = 0 -C *** Start major do-loop on Energy +! *** Start major do-loop on Energy DO N=1,Kdatb Nn = N -C - CALL Zero0_2f (A, Yyy1fb, Y0, Yyy1, Yyy2, Yyy2q, - * Y2bbbb, Y2bbbq, Nx) -C - CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), - * A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, - * A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) +! + CALL Zero0_2f (A, Yyy1fb, Y0, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Nx) +! + CALL Getcrs (A(Icccll), A(Idddll), I_Iisopa , A(Ivsigx), & + A(Ivdasi), A(Ivdbsi), Energb, Totsig, Capsig, & + A(Idtots), A(Idcaps), Ee, Elastic, Nx, Nn, Istop) IF (Istop.EQ.1) GO TO 80 -C -C *** get Energy Em +! +! *** get Energy Em Em = Energb(Nn) CALL Getem (Em, Kkkdat, Idone) - IF (Mcy2.EQ.1) CALL Gety2tab (Em, Y2tab, Emy2_a, Emy2_b, - * Y2tab_a, Y2tab_b) -C + IF (Mcy2.EQ.1) CALL Gety2tab (Em, Y2tab, Emy2_a, Emy2_b, Y2tab_a, Y2tab_b) +! IF (Idone.EQ.2) THEN -C *** Here E > Emax, so we're done. +! *** Here E > Emax, so we're done. GO TO 80 -C +! ELSE IF (Idone.EQ.3 .OR. Idone.EQ.0) THEN -C *** Here if Idone=3, which means don't calculate yield, but do -C *** calculate the pieces needed for Y2 -C -C *** Also here if Idone=0, energy Em is bigger than Eminr, so -C *** calculation can proceed -C +! *** Here if Idone=3, which means don't calculate yield, but do +! *** calculate the pieces needed for Y2 +! +! *** Also here if Idone=0, energy Em is bigger than Eminr, so +! *** calculation can proceed +! IF (Idone.NE.3 .AND. Kdatmn.EQ.0) Kdatmn = Nn Total = Totsig(N) Exp1 = dEXP(-Dthick*Total) -C +! IF (Kwssms.EQ.1) THEN Wssmsc(1) = Em Wssmsc(2) = Capsig(N) Wssmsc(3) = Totsig(N) END IF -C +! IF (Idone.NE.3) THEN CALL Zero_Array (A(Isigxx), 1) IF (Ksolve.NE.2) THEN @@ -640,93 +653,93 @@ C IF (Ndbsig.GT.0) CALL Zero_Array (A(Idbsig), Ndbsig) END IF END IF -C -C *** Here begin multiple-scattering calculation -C +! +! *** Here begin multiple-scattering calculation +! Wssmsc(5) = Zero Wssmsc(6) = Zero DO Iso=1,Niniso -C *** Start loop over nuclides (ie over "isotopes") +! *** Start loop over nuclides (ie over "isotopes") IF (Jxciso(Iso).NE.1) THEN Iiso = Iso - CALL Mulsca_2fq (A, Energb, A(Ifthet), Totsig, - * Capsig, A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), - * A(Iepx), A(Iggx), A(Iiex), Y2cccc, Dy2ccc, - * Wssmsc, Em, Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, - * Y2bbbq, Yyy1fb, Nx, Maxx, Kdatb, Iiso, Nn, - * Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) + CALL Mulsca_2fq (A, Energb, A(Ifthet), Totsig, & + Capsig, A(Irmass), A(Iaaa), A(Ibbb), A(Icsx), & + A(Iepx), A(Iggx), I_Iiex, Y2cccc, Dy2ccc, & + Wssmsc, Em, Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, & + Y2bbbq, Yyy1fb, Nx, Maxx, Kdatb, Iiso, Nn, & + Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) END IF END DO -C *** END of loop on Isotopes -C -C *** Fix value of Y1 (Needs multiply by Pi) +! *** END of loop on Isotopes +! +! *** Fix value of Y1 (Needs multiply by Pi) IF (Idone.NE.3) CALL Fixy_1f (A(Idyyy1), Yyy1, Yyy1fb) -C -C *** Now fix the value of Y2cccc & derivatives; also fix Yyy2 - CALL Fixy_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), Y2cccc(Nn), - * Dy2ccc(1,Nn), A(Idy2bb), A(Idy2bq), A(Idybqq), Yyy2, - * Yyy2q, Y2bbbb, Y2bbbq, Idone, Nn, Em) -C -C *** Finished with multiple-scattering corrections +! +! *** Now fix the value of Y2cccc & derivatives; also fix Yyy2 + CALL Fixy_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), Y2cccc(Nn), & + Dy2ccc(1,Nn), A(Idy2bb), A(Idy2bq), A(Idybqq), Yyy2, & + Yyy2q, Y2bbbb, Y2bbbq, Idone, Nn, Em) +! +! *** Finished with multiple-scattering corrections END IF -C +! IF (Idone.NE.3) THEN -C -C *** Y0 is self-shielded capture yield; normalized to be the -C *** cross section in the limit of Zero thickness +! +! *** Y0 is self-shielded capture yield; normalized to be the +! *** cross section in the limit of Zero thickness Td = Total*Dthick IF (Nonu.EQ.0) THEN -C *** Uniform thickness +! *** Uniform thickness Exxxx = Exp1 ELSE -C *** Non-uniform thickness - CALL Non_Uniform_Thickness (A_Iznonu , A_Irnonu , - * Td, Exxxx, Nonu) +! *** Non-uniform thickness + CALL Non_Uniform_Thickness (A_Iznonu, A_Irnonu, Td, Exxxx, Nonu) END IF Y0 = (One-Exxxx)*Capsig(N)/Td -C +! IF (Sensin.NE.Zero) THEN -C *** When neutron sensitivity is given (as "miscellaneous -C *** parameters card 11"), then correction term is added +! *** When neutron sensitivity is given (as "miscellaneous +! *** parameters card 11"), then correction term is added CALL Get_Ratio_Sensin (Em, Ratio_Sensin, Nsen, Itimes) - Asensn = (One-Exp1) * Ratio_Sensin * - * (100.0d0*Fourpi*Elastic/Total) / Dthick -C *** Remember that "Fourpi" is really 4*pi/100 + Asensn = (One-Exp1) * Ratio_Sensin * (100.0d0*Fourpi*Elastic/Total) / Dthick +! *** Remember that "Fourpi" is really 4*pi/100 Y0 = Y0 + Asensn*Sensin END IF -C -C *** Normalize Y1 & Y2 same as Y0; renormalize all if needed; -C *** store in Sigxxx; also calculate derivs for all pieces +! +! *** Normalize Y1 & Y2 same as Y0; renormalize all if needed; +! *** store in Sigxxx; also calculate derivs for all pieces Dddyy0 = Zero - CALL Ynrm_2 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), - * A(Idasig), A(Idbsig), A(Idyyy1), A(Idyyy2), Y0, Yyy1, - * Yyy2, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Y2tab, Nn) -C -C *** Modify for self-indication experiments - IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), - * A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) -C + CALL Ynrm_2 (Capsig, A(Idtots), A(Idcaps), A(Isigxx), & + A(Idasig), A(Idbsig), A(Idyyy1), A(Idyyy2), Y0, Yyy1, & + Yyy2, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Y2tab, Nn) +! +! *** Modify for self-indication experiments + IF (Yselfi) CALL Selfin (A(Isigxx), A(Idasig), A(Idbsig), & + A(Ivsigs), A_Ivdass , A_Ivdbss , A(Idtots), Total, Nn) +! IF (Debug) THEN WRITE (66,10300) Em, Y0, Yyy1, Yyy2, Y2bbbb 10300 FORMAT (' E,0,1,2,x=', F12.4, 1p4g14.5) END IF CALL Finish_01 (A, Ee, Wssmsc, Em, Y0, Kdatb, Kkkdat, N) -C +! ELSE IF (Idone.EQ.1) THEN -C *** Here E < Eminr, so do not calculate Yield. -C *** Also do not calculate Pieces of Y2. -C +! *** Here E < Eminr, so do not calculate Yield. +! *** Also do not calculate Pieces of Y2. +! END IF -C finish check on value of Idone +! finish check on value of Idone END DO -C *** Done with loop on Energies Em +! *** Done with loop on Energies Em IF (Kssmpr.EQ.1) CLOSE (UNIT=60) -C -C +! +! 80 CONTINUE -C *** Completely done +! *** Completely done Call Tell_Finite (A) -C +! RETURN END + +end module ssm_4_m diff --git a/sammy/src/ssm/mssm05.f b/sammy/src/ssm/mssm05.f90 similarity index 55% rename from sammy/src/ssm/mssm05.f rename to sammy/src/ssm/mssm05.f90 index 8c425ae5f..79e0c64cc 100644 --- a/sammy/src/ssm/mssm05.f +++ b/sammy/src/ssm/mssm05.f90 @@ -1,24 +1,26 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Mulsca_1il (A, Energb, Ftheta, Totsig, Capsig, Rmass, - * Aaa, Bbb, Csx, Epx, Ggx, Iex, Wssmsc, Em, Exp1, Yyy1, Nx, Maxx, - * Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) -C -C *** Mulsca generates the [approximation to] the multiple-scattering -C *** correction to the capture & fission yield -C *** The integration over mu is performed on a grid composed of: -C *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta -C *** (2) Values of mu corresponding to E' as in Energb grid -C *** (3) Extra points as needed when integrand changes rapidly -C *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been -C *** calculated earlier (in INP); these are used for edge-effects -C *** correction to single-scattering term -C *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = -C *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). -C *** Log interpolation is used on Ftheta and N*sigma', to give Fz. -C +! +module ssm_5_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Mulsca_1il (A, Energb, Ftheta, Totsig, Capsig, Rmass, & + Aaa, Bbb, Csx, Epx, Ggx, Iex, Wssmsc, Em, Exp1, Yyy1, Nx, Maxx, & + Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) +! +! *** Mulsca generates the [approximation to] the multiple-scattering +! *** correction to the capture & fission yield +! *** The integration over mu is performed on a grid composed of: +! *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta +! *** (2) Values of mu corresponding to E' as in Energb grid +! *** (3) Extra points as needed when integrand changes rapidly +! *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been +! *** calculated earlier (in INP); these are used for edge-effects +! *** correction to single-scattering term +! *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = +! *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). +! *** Log interpolation is used on Ftheta and N*sigma', to give Fz. +! use oops_common_m use fixedi_m use ifwrit_m @@ -31,14 +33,16 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_9_m + use ssm_11_m IMPLICIT DOUBLE PRECISION (a-h,o-z) LOGICAL Backward, Forward DIMENSION A(-Msize:Msize) -C - DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), - * Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), - * Wssmsc(*) -C +! + DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), & + Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), & + Wssmsc(*) +! DATA Big /1.5d0/, Small /1.0d-12/, Lost /0/ DATA Zero /0.0d0/, One /1.0d0/, Two/2.0d0/ @@ -46,17 +50,17 @@ C character(len=80)::srcfile interpType = "Mulsca_1il" srcfile = "mssm05.f" -C -C +! +! CALL Zero2_1 (A, Sumw, Yyy1xx, Nx) -C -C *** Costhe (E') integration: first, find limits -C +! +! *** Costhe (E') integration: first, find limits +! CALL Limit (Energb, E1, E2, Rmass(Iiso), I1, Nn, Imin) -C *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 -C *** E2=E*((M-1)/(M+1)) -C *** I1=grid Number just above E1 -C +! *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 +! *** E2=E*((M-1)/(M+1)) +! *** I1=grid Number just above E1 +! Ggg = Zero Gggnew = Zero Izero = 1 @@ -66,163 +70,159 @@ C J1 = I1 J2 = 0 Ientrp = 0 -C -C *** Find Ggg for Costhe & Eb - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, - * Kdatb, Nn, Idone) +! +! *** Find Ggg for Costhe & Eb + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, & + Kdatb, Nn, Idone) CALL Getggg (Exp1, Ggg) -C +! Cosold = Cosb Cosp = Cosb Kadd = 0 Kaddm = 0 call multScat%setNumThetaNearZero( 0 ) -C -C *** Do integrations from mu = -1 to mu = +1: -C *** for Backward (E1 <E'<E1e) top -C *** (E1e<E'<E2 ) edge -C *** and Forward (E2 <E'<E2e) edge -C *** (E2e<E'<Em ) bottom -C *** (if assume beam goes from top to bottom) +! +! *** Do integrations from mu = -1 to mu = +1: +! *** for Backward (E1 <E'<E1e) top +! *** (E1e<E'<E2 ) edge +! *** and Forward (E2 <E'<E2e) edge +! *** (E2e<E'<Em ) bottom +! *** (if assume beam goes from top to bottom) DO 80 Jfbx=1,2 IF (Jfbx.EQ.1) THEN -C Jfbx=1 => Backward (low E, high angle, Negative cosine) +! Jfbx=1 => Backward (low E, high angle, Negative cosine) Jfb = 2 Backward = .TRUE. Forward = .FALSE. ELSE -C Jfbx=2 => Forward (high E, low angle, positive cosine) +! Jfbx=2 => Forward (high E, low angle, positive cosine) Jfb = 1 Backward = .FALSE. Forward = .TRUE. Cosb = Zero Eb = E2 END IF -C +! Jthxx = 0 -C ------ Loop over cosine(theta) (& therefore over E'=Ep) +! ------ Loop over cosine(theta) (& therefore over E'=Ep) DO Jthx=1,Jtheta IF (Jthx.EQ.1) Jthxx = 1 Jth = Jthx -C = 1 to Jtheta +! = 1 to Jtheta IF (Backward) Jth = Jtheta + 1 - Jthx -C = Jtheta to 1 +! = Jtheta to 1 Cosa = Cosb Ea = Eb IF (Forward .AND.Jth.LT.Jtheta) Cosb = Ftheta(Jth+1) IF (Backward.AND.Jth.GT.1 ) Cosb = - Ftheta(Jth-1) Itntb = 1 - Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) - * /Bbb(Iiso) )**2 + Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) / Bbb(Iiso) )**2 IF (Jth+1.EQ.Jtheta .AND. Forward) Eb = Em -C -C *** ----- Are there energy-points between Cosa & Cosb ? +! +! *** ----- Are there energy-points between Cosa & Cosb ? CALL Pickee (Energb, Ea, Eb, J1, J2, Kdatb) -C +! IF (Forward) THEN IF (Jth+1.EQ.Jtheta) THEN -C if (Forward & next point is last...) +! if (Forward & next point is last...) IF (J2.EQ.Nn) J2 = Nn - 1 ELSE IF (Jth.EQ.Jtheta) THEN -C IF (Forward & this point is last...) +! IF (Forward & this point is last...) IF (J2.GE.Nn) J2 = Nn - 1 IF (J1.GE.Nn) J1 = Nn END IF END IF -C +! Ep = Ea Costhe = Cosa J3 = J2 + 1 Ientrp = 0 Itntrp = 1 -C -C --------- Loop on energy points between Cosa & Cosb +! +! --------- Loop on energy points between Cosa & Cosb DO Jjj=J1,J3 Jj = Jjj -C +! 10 CONTINUE -C *** -------- Find Gggnew for Costhe & Ep_new - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone) +! *** -------- Find Gggnew for Costhe & Ep_new + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone) CALL Getggg (Exp1, Gggnew) -C -C ------------ Compare Gggnew to Ggg +! +! ------------ Compare Gggnew to Ggg Ag = dABS(Gggnew-Ggg) IF (Ggg+Ag.EQ.Ggg) GO TO 30 Bg = Ag/Gggnew Ag = Ag/Ggg IF (Ag.LT.Big .AND. Bg.LT.Big) GO TO 30 IF (Ggg.LT.Small .AND. Gggnew.LT.Small) GO TO 30 -C -C ------------ Additional points are needed so store this one +! +! ------------ Additional points are needed so store this one Kadd = Kadd + 1 Kaddm = Kaddm + 1 IF (Kadd.GT.Maxx) then call talk_kadd_gt_maxx(Kadd,Maxx,srcfile,interpType) - CALL Talk (Kadd, Maxx, Em, Eb, Ea, - * Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, - * Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, - * Nn, Iiso, 1) + CALL Talk (Kadd, Maxx, Em, Eb, Ea, & + Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, & + Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, & + Nn, Iiso, 1) end if -C +! IF (Lost.GT.20 .AND. Kadd.GT.20) then - call talk_kadd_and_lost_gt(Kadd,Lost,srcfile, - * interpType) - CALL Talk (Kadd, Maxx, - * Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, - * Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, - * Niniso, Nnpar, Nn, Iiso, 2) + call talk_kadd_and_lost_gt(Kadd,Lost,srcfile,interpType) + CALL Talk (Kadd, Maxx, & + Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, & + Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, & + Niniso, Nnpar, Nn, Iiso, 2) end if -C +! Csx(Kadd) = Costhe Epx(Kadd) = Ep Ggx(Kadd) = Gggnew Iex(Kadd) = Ientrp -C +! 20 CONTINUE -C ------------ Figure location of next possible point +! ------------ Figure location of next possible point Costhe = (Cosold+Costhe)/Two - Ep = Em*((Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) - * /Bbb(Iiso))**2 + Ep = Em*( (Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) / Bbb(Iiso) )**2 Ientrp = 0 Itntrp = 0 GO TO 10 -C +! 30 CONTINUE -C ------------ This point is acceptable so add in the integral -C ------------ from Cosold to Costhe +! ------------ This point is acceptable so add in the integral +! ------------ from Cosold to Costhe W = Costhe - Cosold Sumw = Sumw + W -C -C *** Add contributions from Eold (ie from Cosold) +! +! *** Add contributions from Eold (ie from Cosold) IF (Jthxx.NE.1 .AND. Izero.EQ.1) THEN CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF -C -C ------------ Now, find values of everything for new point - call multScat%setNumThetaNearZero( - * multScat%getNumThetaNearZero() + 1 ) +! +! ------------ Now, find values of everything for new point + call multScat%setNumThetaNearZero( multScat%getNumThetaNearZero() + 1 ) Ktheta = multScat%getNumThetaNearZero() + 1 - CALL Finds_1il (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, - * A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), - * A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Exp1, Ep, Ggg, - * Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, Knthet, Nn, - * Kdatb, Izero, Idone, Nxtptwn) -C + CALL Finds_1il (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, & + A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), & + A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Exp1, Ep, Ggg, & + Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, Knthet, Nn, & + Kdatb, Izero, Idone, Nxtptwn) +! IF (Jthxx.EQ.1) THEN Jthxx = 0 GO TO 40 END IF -C -C *** Add contributions from Enew (ie from Costhe) +! +! *** Add contributions from Enew (ie from Costhe) IF (Izero.EQ.1) THEN CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF -C +! Cosold = Costhe IF (Kadd.EQ.0) GO TO 40 -C +! Ep = Epx(Kadd) Costhe = Csx(Kadd) Gggnew = Ggx(Kadd) @@ -234,15 +234,15 @@ C Ag = Ag/Ggg IF (Ag.GT.Big .OR. Bg.GT.Big) GO TO 20 Kadd = Kadd - 1 - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone) + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone) CALL Getggg (Exp1, Gggnew) GO TO 30 -C +! 40 CONTINUE -C *** -------- Finished adding extra points for rapid changes in Ggg -C -C *** -------- Now pick next Ep & Cosp +! *** -------- Finished adding extra points for rapid changes in Ggg +! +! *** -------- Now pick next Ep & Cosp IF (Ep.NE.Em) THEN IF (Jj.LE.J2) THEN Ientrp = Jj @@ -257,28 +257,27 @@ C *** -------- Now pick next Ep & Cosp Itntrp = Itntb END IF END IF -C -C *** -------- Update cos(theta) and continue +! +! *** -------- Update cos(theta) and continue Costhe = Cosp END DO -C *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) -C +! *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) +! END DO -C *** -- Finished do-loop on Jtheta (ie on mu) -C +! *** -- Finished do-loop on Jtheta (ie on mu) +! 80 CONTINUE -C *** Finished do-loop on Jfb (ie on positive vs negative mu) -C - CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, - * Nn, I1) +! *** Finished do-loop on Jfb (ie on positive vs negative mu) +! + CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, Nn, I1) IF (Kwssms.EQ.1) Wssmsc(5) = Yyy1*Pi/Dthick + Wssmsc(5) -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Zero2_1 (A, Sumw, Yyy1xx, Nx) use oops_common_m use fixedi_m @@ -288,36 +287,36 @@ C IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION A(-Msize:Msize) DATA Zero /0.0d0/ -C +! Sumw = Zero Yyy1xx = Zero IF (Ksolve.NE.2) THEN CALL Zero_Array (A(Idyy1x), Nx) END IF -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Mulsca_1iq (A, Energb, Ftheta, Totsig, Capsig, Rmass, - * Aaa, Bbb, Csx, Epx, Ggx, Iex, Wssmsc, Em, Exp1, Yyy1, Nx, Maxx, - * Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) -C -C *** Mulsca generates the [approximation to] the multiple-scattering -C *** correction to the capture & fission yield -C *** The integration over mu is performed on a grid composed of: -C *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta -C *** (2) Values of mu corresponding to E' as in Energb grid -C *** (3) Extra points as needed when integrand changes rapidly -C *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been -C *** calculated earlier (in INP); these are used for edge-effects -C *** correction to single-scattering term -C *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = -C *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). -C *** Log interpolation is used on Ftheta and N*sigma', to give Fz. -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Mulsca_1iq (A, Energb, Ftheta, Totsig, Capsig, Rmass, & + Aaa, Bbb, Csx, Epx, Ggx, Iex, Wssmsc, Em, Exp1, Yyy1, Nx, Maxx, & + Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) +! +! *** Mulsca generates the [approximation to] the multiple-scattering +! *** correction to the capture & fission yield +! *** The integration over mu is performed on a grid composed of: +! *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta +! *** (2) Values of mu corresponding to E' as in Energb grid +! *** (3) Extra points as needed when integrand changes rapidly +! *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been +! *** calculated earlier (in INP); these are used for edge-effects +! *** correction to single-scattering term +! *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = +! *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). +! *** Log interpolation is used on Ftheta and N*sigma', to give Fz. +! use oops_common_m use fixedi_m use ifwrit_m @@ -330,14 +329,16 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_9_m + use ssm_11_m IMPLICIT DOUBLE PRECISION (a-h,o-z) LOGICAL Backward, Forward DIMENSION A(-Msize:Msize) -C - DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), - * Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), - * Wssmsc(*) -C +! + DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), & + Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), & + Wssmsc(*) +! DATA Big /1.5d0/, Small /1.0d-12/, Lost /0/ DATA Zero /0.0d0/, One /1.0d0/, Two/2.0d0/ @@ -345,17 +346,17 @@ C character(len=80)::srcfile interpType = "Mulsca_1iq" srcfile = "mssm05.f" -C -C +! +! CALL Zero2_1 (A, Sumw, Yyy1xx, Nx) -C -C *** Costhe (E') integration: first, find limits -C +! +! *** Costhe (E') integration: first, find limits +! CALL Limit (Energb, E1, E2, Rmass(Iiso), I1, Nn, Imin) -C *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 -C *** E2=E*((M-1)/(M+1)) -C *** I1=grid Number just above E1 -C +! *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 +! *** E2=E*((M-1)/(M+1)) +! *** I1=grid Number just above E1 +! Ggg = Zero Gggnew = Zero Izero = 1 @@ -365,163 +366,159 @@ C J1 = I1 J2 = 0 Ientrp = 0 -C -C *** find Ggg for Costhe & Eb - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, - * Kdatb, Nn, Idone, Not_Quad) +! +! *** find Ggg for Costhe & Eb + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, & + Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Ggg) -C +! Cosold = Cosb Cosp = Cosb Kadd = 0 Kaddm = 0 call multScat%setNumThetaNearZero( 0 ) -C -C *** Do integrations from mu = -1 to mu = +1: -C *** for Backward (E1 <E'<E1e) top -C *** (E1e<E'<E2 ) edge -C *** and Forward (E2 <E'<E2e) edge -C *** (E2e<E'<Em ) bottom -C *** (if assume beam goes from top to bottom) +! +! *** Do integrations from mu = -1 to mu = +1: +! *** for Backward (E1 <E'<E1e) top +! *** (E1e<E'<E2 ) edge +! *** and Forward (E2 <E'<E2e) edge +! *** (E2e<E'<Em ) bottom +! *** (if assume beam goes from top to bottom) DO 80 Jfbx=1,2 IF (Jfbx.EQ.1) THEN -C Jfbx=1 => Backward (low E, high angle, Negative cosine) +! Jfbx=1 => Backward (low E, high angle, Negative cosine) Jfb = 2 Backward = .TRUE. Forward = .FALSE. ELSE -C Jfbx=2 => Forward (high E, low angle, positive cosine) +! Jfbx=2 => Forward (high E, low angle, positive cosine) Jfb = 1 Backward = .FALSE. Forward = .TRUE. Cosb = Zero Eb = E2 END IF -C +! Jthxx = 0 -C ------ Loop over cosine(theta) (& therefore over E'=Ep) +! ------ Loop over cosine(theta) (& therefore over E'=Ep) DO Jthx=1,Jtheta IF (Jthx.EQ.1) Jthxx = 1 Jth = Jthx -C = 1 to Jtheta +! = 1 to Jtheta IF (Backward) Jth = Jtheta + 1 - Jthx -C = Jtheta to 1 +! = Jtheta to 1 Cosa = Cosb Ea = Eb IF (Forward .AND.Jth.LT.Jtheta) Cosb = Ftheta(Jth+1) IF (Backward.AND.Jth.GT.1 ) Cosb = - Ftheta(Jth-1) Itntb = 1 - Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) - * /Bbb(Iiso) )**2 + Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) / Bbb(Iiso) )**2 IF (Jth+1.EQ.Jtheta .AND. Forward) Eb = Em -C -C *** ----- Are there energy-points between Cosa & Cosb ? +! +! *** ----- Are there energy-points between Cosa & Cosb ? CALL Pickee (Energb, Ea, Eb, J1, J2, Kdatb) -C +! IF (Forward) THEN IF (Jth+1.EQ.Jtheta) THEN -C if (Forward & next point is last...) +! if (Forward & next point is last...) IF (J2.EQ.Nn) J2 = Nn - 1 ELSE IF (Jth.EQ.Jtheta) THEN -C IF (Forward & this point is last...) +! IF (Forward & this point is last...) IF (J2.GE.Nn) J2 = Nn - 1 IF (J1.GE.Nn) J1 = Nn END IF END IF -C +! Ep = Ea Costhe = Cosa J3 = J2 + 1 Ientrp = 0 Itntrp = 1 -C -C --------- Loop on energy points between Cosa & Cosb +! +! --------- Loop on energy points between Cosa & Cosb DO Jjj=J1,J3 Jj = Jjj -C +! 10 CONTINUE -C *** -------- Find Gggnew for Costhe & Ep_new - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone, Not_Quad) +! *** -------- Find Gggnew for Costhe & Ep_new + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Gggnew) -C -C ------------ Compare Gggnew to Ggg +! +! ------------ Compare Gggnew to Ggg Ag = dABS(Gggnew-Ggg) IF (Ggg+Ag.EQ.Ggg) GO TO 30 Bg = Ag/Gggnew Ag = Ag/Ggg IF (Ag.LT.Big .AND. Bg.LT.Big) GO TO 30 IF (Ggg.LT.Small .AND. Gggnew.LT.Small) GO TO 30 -C -C ------------ Additional points are needed so store this one +! +! ------------ Additional points are needed so store this one Kadd = Kadd + 1 Kaddm = Kaddm + 1 IF (Kadd.GT.Maxx) then call talk_kadd_gt_maxx(Kadd,Maxx,srcfile,interpType) - CALL Talk (Kadd, Maxx, Em, Eb, Ea, - * Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, - * Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, - * Nn, Iiso, 1) + CALL Talk (Kadd, Maxx, Em, Eb, Ea, & + Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, & + Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, & + Nn, Iiso, 1) end if -C +! IF (Lost.GT.20 .AND. Kadd.GT.20) then - call talk_kadd_and_lost_gt(Kadd,Lost,srcfile, - * interpType) - CALL Talk (Kadd, Maxx, - * Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, - * Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, - * Niniso, Nnpar, Nn, Iiso, 2) + call talk_kadd_and_lost_gt(Kadd,Lost,srcfile,interpType) + CALL Talk (Kadd, Maxx, & + Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, & + Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, & + Niniso, Nnpar, Nn, Iiso, 2) end if -C +! Csx(Kadd) = Costhe Epx(Kadd) = Ep Ggx(Kadd) = Gggnew Iex(Kadd) = Ientrp -C +! 20 CONTINUE -C ------------ Figure location of next possible point +! ------------ Figure location of next possible point Costhe = (Cosold+Costhe)/Two - Ep = Em*((Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) - * /Bbb(Iiso))**2 + Ep = Em*( (Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) / Bbb(Iiso) )**2 Ientrp = 0 Itntrp = 0 GO TO 10 -C +! 30 CONTINUE -C ------------ This point is acceptable so add in the integral -C ------------ from Cosold to Costhe +! ------------ This point is acceptable so add in the integral +! ------------ from Cosold to Costhe W = Costhe - Cosold Sumw = Sumw + W -C -C *** Add contributions from Eold (ie from Cosold) +! +! *** Add contributions from Eold (ie from Cosold) IF (Jthxx.NE.1 .AND. Izero.EQ.1) THEN CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF -C -C ------------ Now, find values of everything for new point - call multScat%setNumThetaNearZero( - * multScat%getNumThetaNearZero() + 1 ) +! +! ------------ Now, find values of everything for new point + call multScat%setNumThetaNearZero( multScat%getNumThetaNearZero() + 1 ) Ktheta = multScat%getNumThetaNearZero() + 1 - CALL Finds_1iq (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, - * A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), - * A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Exp1, Ep, Ggg, - * Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, Knthet, Nn, - * Kdatb, Izero, Idone, Nxtptwn) -C + CALL Finds_1iq (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, & + A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), & + A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Exp1, Ep, Ggg, & + Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, Knthet, Nn, & + Kdatb, Izero, Idone, Nxtptwn) +! IF (Jthxx.EQ.1) THEN Jthxx = 0 GO TO 40 END IF -C -C *** Add contributions from Enew (ie from Costhe) +! +! *** Add contributions from Enew (ie from Costhe) IF (Izero.EQ.1) THEN CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF -C +! Cosold = Costhe IF (Kadd.EQ.0) GO TO 40 -C +! Ep = Epx(Kadd) Costhe = Csx(Kadd) Gggnew = Ggx(Kadd) @@ -533,15 +530,15 @@ C Ag = Ag/Ggg IF (Ag.GT.Big .OR. Bg.GT.Big) GO TO 20 Kadd = Kadd - 1 - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone, Not_Quad) + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Gggnew) GO TO 30 -C +! 40 CONTINUE -C *** -------- Finished adding extra points for rapid changes in Ggg -C -C *** -------- Now pick next Ep & Cosp +! *** -------- Finished adding extra points for rapid changes in Ggg +! +! *** -------- Now pick next Ep & Cosp IF (Ep.NE.Em) THEN IF (Jj.LE.J2) THEN Ientrp = Jj @@ -556,22 +553,23 @@ C *** -------- Now pick next Ep & Cosp Itntrp = Itntb END IF END IF -C -C *** -------- Update cos(theta) and continue +! +! *** -------- Update cos(theta) and continue Costhe = Cosp END DO -C *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) -C -C +! *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) +! +! END DO -C *** -- Finished do-loop on Jtheta (ie on mu) -C +! *** -- Finished do-loop on Jtheta (ie on mu) +! 80 CONTINUE -C *** Finished do-loop on Jfb (ie on positive vs negative mu) -C - CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, - * Nn, I1) +! *** Finished do-loop on Jfb (ie on positive vs negative mu) +! + CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, Nn, I1) IF (Kwssms.EQ.1) Wssmsc(5) = Yyy1*Pi/Dthick + Wssmsc(5) -C +! RETURN END + +end module ssm_5_m diff --git a/sammy/src/ssm/mssm06.f b/sammy/src/ssm/mssm06.f90 similarity index 53% rename from sammy/src/ssm/mssm06.f rename to sammy/src/ssm/mssm06.f90 index dfee22677..20d64092f 100644 --- a/sammy/src/ssm/mssm06.f +++ b/sammy/src/ssm/mssm06.f90 @@ -1,25 +1,27 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Mulsca_1fl (A, Energb, Ftheta, Totsig, Capsig, Rmass, - * Aaa, Bbb, Csx, Epx, Ggx, Iex, Wssmsc, Em, Exp1, Yyy1, Yyy1fb, - * Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, - * Nxtptwn, Nxtptvm) -C -C *** Mulsca generates the [approximation to] the multiple-scattering -C *** correction to the capture & fission yield -C *** The integration over mu is performed on a grid composed of: -C *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta -C *** (2) Values of mu corresponding to E' as in Energb grid -C *** (3) Extra points as needed when integrand changes rapidly -C *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been -C *** calculated earlier (in INP); these are used for edge-effects -C *** correction to single-scattering term -C *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = -C *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). -C *** Log interpolation is used on Ftheta and N*sigma', to give Fz. -C +! +module ssm_6_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Mulsca_1fl (A, Energb, Ftheta, Totsig, Capsig, Rmass, & + Aaa, Bbb, Csx, Epx, Ggx, Iex, Wssmsc, Em, Exp1, Yyy1, Yyy1fb, & + Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, & + Nxtptwn, Nxtptvm) +! +! *** Mulsca generates the [approximation to] the multiple-scattering +! *** correction to the capture & fission yield +! *** The integration over mu is performed on a grid composed of: +! *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta +! *** (2) Values of mu corresponding to E' as in Energb grid +! *** (3) Extra points as needed when integrand changes rapidly +! *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been +! *** calculated earlier (in INP); these are used for edge-effects +! *** correction to single-scattering term +! *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = +! *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). +! *** Log interpolation is used on Ftheta and N*sigma', to give Fz. +! use oops_common_m use fixedi_m use ifwrit_m @@ -31,14 +33,18 @@ C use ssssss_common_m use xsect_x_common_m use MultScatPars_common_m + use ssm_5_m + use ssm_9_m + use ssm_10_m + use ssm_11_m IMPLICIT DOUBLE PRECISION (a-h,o-z) LOGICAL Backward, Forward DIMENSION A(-Msize:Msize) -C - DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), - * Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), - * Wssmsc(*), Yyy1fb(*) -C +! + DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), & + Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), & + Wssmsc(*), Yyy1fb(*) +! DATA Big /1.5d0/, Small /1.0d-12/, Lost /0/ DATA Zero /0.0d0/, One /1.0d0/, Two/2.0d0/ @@ -46,37 +52,28 @@ C character(len=80)::srcfile interpType = "Mulsca_1fl" srcfile = "mssm06.f" - - write(6,*) "-----------------------------------------------------" - write(6,*) "Jtheta,multScat%getNumThetaNearOne() = ",Jtheta, - *multScat%getNumThetaNearOne() - write(6,*) "Ktheta,multScat%getNumThetaNearZero() = ",Ktheta, - *multScat%getNumThetaNearZero() - write(6,*) "Ntheta,multScat%getNumTheta() = ",Ntheta, - *multScat%getNumTheta() - write(6,*) "-----------------------------------------------------" -C -C -C *** Interpolate Sqfb to give Qfb at Total(E) (if doing edge-effects -C *** correction to single-scattering) - CALL Trptot_Lin (A(Ixtptv), A(Isqfb), A(Iqfb), A(Idvqfb), - * Total, Nxtptvm, Em) +! +! +! *** Interpolate Sqfb to give Qfb at Total(E) (if doing edge-effects +! *** correction to single-scattering) + CALL Trptot_Lin (A(Ixtptv), A(Isqfb), A_Iqfb, A(Idvqfb), & + Total, Nxtptvm, Em) IF (Total.LT.multScat%getLogSigmaTotMin()) then call multScat%setLogSigmaTotMin( Total) end if IF (Total.GT.multScat%getLogSigmaTotMax()) then call multScat%setLogSigmaTotMax( Total) end if -C +! CALL Zero2_1 (A, Sumw, Yyy1xx, Nx) -C -C *** Costhe (E') integration: first, find limits -C +! +! *** Costhe (E') integration: first, find limits +! CALL Limit (Energb, E1, E2, Rmass(Iiso), I1, Nn, Imin) -C *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 -C *** E2=E*((M-1)/(M+1)) -C *** I1=grid Number just above E1 -C +! *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 +! *** E2=E*((M-1)/(M+1)) +! *** I1=grid Number just above E1 +! Ggg = Zero Gggnew = Zero Izero = 1 @@ -86,164 +83,159 @@ C J1 = I1 J2 = 0 Ientrp = 0 -C -C *** find Ggg for Costhe & Eb - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, - * Kdatb, Nn, Idone) +! +! *** find Ggg for Costhe & Eb + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, Kdatb, Nn, Idone) CALL Getggg (Exp1, Ggg) -C +! Cosold = Cosb Cosp = Cosb Kadd = 0 Kaddm = 0 call multScat%setNumThetaNearZero( 0 ) -C -C *** Do integrations from mu = -1 to mu = +1: -C *** for Backward (E1 <E'<E1e) top -C *** (E1e<E'<E2 ) edge -C *** and Forward (E2 <E'<E2e) edge -C *** (E2e<E'<Em ) bottom -C *** (if assume beam goes from top to bottom) +! +! *** Do integrations from mu = -1 to mu = +1: +! *** for Backward (E1 <E'<E1e) top +! *** (E1e<E'<E2 ) edge +! *** and Forward (E2 <E'<E2e) edge +! *** (E2e<E'<Em ) bottom +! *** (if assume beam goes from top to bottom) DO 80 Jfbx=1,2 IF (Jfbx.EQ.1) THEN -C Jfbx=1 => Backward (low E, high angle, Negative cosine) +! Jfbx=1 => Backward (low E, high angle, Negative cosine) Jfb = 2 Backward = .TRUE. Forward = .FALSE. ELSE -C Jfbx=2 => Forward (high E, low angle, positive cosine) +! Jfbx=2 => Forward (high E, low angle, positive cosine) Jfb = 1 Backward = .FALSE. Forward = .TRUE. Cosb = Zero Eb = E2 END IF -C +! Jthxx = 0 -C ------ Loop over cosine(theta) (& therefore over E'=Ep) +! ------ Loop over cosine(theta) (& therefore over E'=Ep) DO Jthx=1,Jtheta IF (Jthx.EQ.1) Jthxx = 1 Jth = Jthx -C = 1 to Jtheta +! = 1 to Jtheta IF (Backward) Jth = Jtheta + 1 - Jthx -C = Jtheta to 1 +! = Jtheta to 1 Cosa = Cosb Ea = Eb IF (Forward .AND.Jth.LT.Jtheta) Cosb = Ftheta(Jth+1) IF (Backward.AND.Jth.GT.1 ) Cosb = - Ftheta(Jth-1) Itntb = 1 - Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) - * /Bbb(Iiso) )**2 + Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) / Bbb(Iiso) )**2 IF (Jth+1.EQ.Jtheta .AND. Forward) Eb = Em -C -C *** ----- Are there energy-points between Cosa & Cosb ? +! +! *** ----- Are there energy-points between Cosa & Cosb ? CALL Pickee (Energb, Ea, Eb, J1, J2, Kdatb) -C +! IF (Forward) THEN IF (Jth+1.EQ.Jtheta) THEN -C if (Forward & next point is last...) +! if (Forward & next point is last...) IF (J2.EQ.Nn) J2 = Nn - 1 ELSE IF (Jth.EQ.Jtheta) THEN -C IF (Forward & this point is last...) +! IF (Forward & this point is last...) IF (J2.GE.Nn) J2 = Nn - 1 IF (J1.GE.Nn) J1 = Nn END IF END IF -C +! Ep = Ea Costhe = Cosa J3 = J2 + 1 Ientrp = 0 Itntrp = 1 -C -C --------- Loop on energy points between Cosa & Cosb +! +! --------- Loop on energy points between Cosa & Cosb DO Jjj=J1,J3 Jj = Jjj -C +! 10 CONTINUE -C *** -------- Find Gggnew for Costhe & Ep_new - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone) +! *** -------- Find Gggnew for Costhe & Ep_new + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone) CALL Getggg (Exp1, Gggnew) -C -C ------------ Compare Gggnew to Ggg +! +! ------------ Compare Gggnew to Ggg Ag = dABS(Gggnew-Ggg) IF (Ggg+Ag.EQ.Ggg) GO TO 30 Bg = Ag/Gggnew Ag = Ag/Ggg IF (Ag.LT.Big .AND. Bg.LT.Big) GO TO 30 IF (Ggg.LT.Small .AND. Gggnew.LT.Small) GO TO 30 -C -C ------------ Additional points are needed so store this one +! +! ------------ Additional points are needed so store this one Kadd = Kadd + 1 Kaddm = Kaddm + 1 IF (Kadd.GT.Maxx) then call talk_kadd_gt_maxx(Kadd,Maxx,srcfile,interpType) - CALL Talk (Kadd, Maxx, Em, Eb, Ea, - * Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, - * Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, - * Nn, Iiso, 1) + CALL Talk (Kadd, Maxx, Em, Eb, Ea, & + Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, & + Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, & + Nn, Iiso, 1) end if -C +! IF (Lost.GT.20 .AND. Kadd.GT.20) then - call talk_kadd_and_lost_gt(Kadd,Lost,srcfile, - * interpType) - CALL Talk (Kadd, Maxx, - * Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, - * Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, - * Niniso, Nnpar, Nn, Iiso, 2) + call talk_kadd_and_lost_gt(Kadd,Lost,srcfile,interpType) + CALL Talk (Kadd, Maxx, & + Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, & + Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, & + Niniso, Nnpar, Nn, Iiso, 2) end if -C +! Csx(Kadd) = Costhe Epx(Kadd) = Ep Ggx(Kadd) = Gggnew Iex(Kadd) = Ientrp -C +! 20 CONTINUE -C ------------ Figure location of next possible point +! ------------ Figure location of next possible point Costhe = (Cosold+Costhe)/Two - Ep = Em*((Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) - * /Bbb(Iiso))**2 + Ep = Em*( (Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) / Bbb(Iiso) )**2 Ientrp = 0 Itntrp = 0 GO TO 10 -C +! 30 CONTINUE -C ------------ This point is acceptable so add in the integral -C ------------ from Cosold to Costhe +! ------------ This point is acceptable so add in the integral +! ------------ from Cosold to Costhe W = Costhe - Cosold Sumw = Sumw + W -C -C *** Add contributions from Eold (ie from Cosold) +! +! *** Add contributions from Eold (ie from Cosold) IF (Jthxx.NE.1 .AND. Izero.EQ.1) THEN Yyy1fb(Jfb) = Yyy1fb(Jfb) -Yyy1zz*W CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF -C -C ------------ Now, find values of everything for new point - call multScat%setNumThetaNearZero( - * multScat%getNumThetaNearZero() + 1 ) +! +! ------------ Now, find values of everything for new point + call multScat%setNumThetaNearZero( multScat%getNumThetaNearZero() + 1 ) - CALL Finds_1fl (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, - * A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), - * A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Yyy1zz, - * Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, - * Jfb, Jth, Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) -C + CALL Finds_1fl (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, & + A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), & + A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Yyy1zz, & + Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, & + Jfb, Jth, Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) +! IF (Jthxx.EQ.1) THEN Jthxx = 0 GO TO 40 END IF -C -C *** Add contributions from Enew (ie from Costhe) +! +! *** Add contributions from Enew (ie from Costhe) IF (Izero.EQ.1) THEN Yyy1fb(Jfb) = Yyy1fb(Jfb) -Yyy1zz*W CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF -C +! Cosold = Costhe IF (Kadd.EQ.0) GO TO 40 -C +! Ep = Epx(Kadd) Costhe = Csx(Kadd) Gggnew = Ggx(Kadd) @@ -255,15 +247,15 @@ C Ag = Ag/Ggg IF (Ag.GT.Big .OR. Bg.GT.Big) GO TO 20 Kadd = Kadd - 1 - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone) + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone) CALL Getggg (Exp1, Gggnew) GO TO 30 -C +! 40 CONTINUE -C *** -------- Finished adding extra points for rapid changes in Ggg -C -C *** -------- Now pick next Ep & Cosp +! *** -------- Finished adding extra points for rapid changes in Ggg +! +! *** -------- Now pick next Ep & Cosp IF (Ep.NE.Em) THEN IF (Jj.LE.J2) THEN Ientrp = Jj @@ -278,47 +270,46 @@ C *** -------- Now pick next Ep & Cosp Itntrp = Itntb END IF END IF -C -C *** -------- Update cos(theta) and continue +! +! *** -------- Update cos(theta) and continue Costhe = Cosp END DO -C *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) -C -C +! *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) +! +! END DO -C *** -- Finished do-loop on Jtheta (ie on mu) -C +! *** -- Finished do-loop on Jtheta (ie on mu) +! 80 CONTINUE -C *** Finished do-loop on Jfb (ie on positive vs negative mu) -C - CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, - * Nn, I1) +! *** Finished do-loop on Jfb (ie on positive vs negative mu) +! + CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, Nn, I1) CALL W_Wssmsc (Yyy1, Dthick, Total, Wssmsc, Yyy1fb, Kwssms) -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Mulsca_1fq (A, Energb, Ftheta, Totsig, Capsig, Rmass, - * Aaa, Bbb, Csx, Epx, Ggx, Iex, Wssmsc, Em, Exp1, Yyy1, Yyy1fb, - * Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, - * Nxtptwn, Nxtptvm) -C -C *** Mulsca generates the [approximation to] the multiple-scattering -C *** correction to the capture & fission yield -C *** The integration over mu is performed on a grid composed of: -C *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta -C *** (2) Values of mu corresponding to E' as in Energb grid -C *** (3) Extra points as needed when integrand changes rapidly -C *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been -C *** calculated earlier (in INP); these are used for edge-effects -C *** correction to single-scattering term -C *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = -C *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). -C *** Log interpolation is used on Ftheta and N*sigma', to give Fz. -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Mulsca_1fq (A, Energb, Ftheta, Totsig, Capsig, Rmass, & + Aaa, Bbb, Csx, Epx, Ggx, Iex, Wssmsc, Em, Exp1, Yyy1, Yyy1fb, & + Nx, Maxx, Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, & + Nxtptwn, Nxtptvm) +! +! *** Mulsca generates the [approximation to] the multiple-scattering +! *** correction to the capture & fission yield +! *** The integration over mu is performed on a grid composed of: +! *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta +! *** (2) Values of mu corresponding to E' as in Energb grid +! *** (3) Extra points as needed when integrand changes rapidly +! *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been +! *** calculated earlier (in INP); these are used for edge-effects +! *** correction to single-scattering term +! *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = +! *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). +! *** Log interpolation is used on Ftheta and N*sigma', to give Fz. +! use oops_common_m use fixedi_m use ifwrit_m @@ -330,14 +321,18 @@ C use ssssss_common_m use xsect_x_common_m use MultScatPars_common_m + use ssm_5_m + use ssm_9_m + use ssm_10_m + use ssm_11_m IMPLICIT DOUBLE PRECISION (a-h,o-z) LOGICAL Backward, Forward DIMENSION A(-Msize:Msize) -C - DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), - * Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), - * Wssmsc(*), Yyy1fb(*) -C +! + DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), & + Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), & + Wssmsc(*), Yyy1fb(*) +! DATA Big /1.5d0/, Small /1.0d-12/, Lost /0/ DATA Zero /0.0d0/, One /1.0d0/, Two/2.0d0/ @@ -345,28 +340,28 @@ C character(len=80)::srcfile interpType = "Mulsca_1fq" srcfile = "mssm06.f" -C -C -C *** Interpolate Sqfb to give Qfb at Total(E) (if doing edge-effects -C *** correction to single-scattering) - CALL Trptot_Quad (A(Ixtptv), A(Isqfb), A(Iqfb), A(Idvqfb), - * Total, Nxtptvm, Em) +! +! +! *** Interpolate Sqfb to give Qfb at Total(E) (if doing edge-effects +! *** correction to single-scattering) + CALL Trptot_Quad (A(Ixtptv), A(Isqfb), A_Iqfb, A(Idvqfb), & + Total, Nxtptvm, Em) IF (Total.LT.multScat%getLogSigmaTotMin()) then call multScat%setLogSigmaTotMin( Total) end if IF (Total.GT.multScat%getLogSigmaTotMax()) then call multScat%setLogSigmaTotMax( Total) end if -C +! CALL Zero2_1 (A, Sumw, Yyy1xx, Nx) -C -C *** Costhe (E') integration: first, find limits -C +! +! *** Costhe (E') integration: first, find limits +! CALL Limit (Energb, E1, E2, Rmass(Iiso), I1, Nn, Imin) -C *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 -C *** E2=E*((M-1)/(M+1)) -C *** I1=grid Number just above E1 -C +! *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 +! *** E2=E*((M-1)/(M+1)) +! *** I1=grid Number just above E1 +! Ggg = Zero Gggnew = Zero Izero = 1 @@ -376,163 +371,159 @@ C J1 = I1 J2 = 0 Ientrp = 0 -C -C *** find Ggg for Costhe & Eb - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, - * Kdatb, Nn, Idone, Not_Quad) +! +! *** find Ggg for Costhe & Eb + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, & + Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Ggg) -C +! Cosold = Cosb Cosp = Cosb Kadd = 0 Kaddm = 0 call multScat%setNumThetaNearZero( 0 ) -C -C *** Do integrations from mu = -1 to mu = +1: -C *** for Backward (E1 <E'<E1e) top -C *** (E1e<E'<E2 ) edge -C *** and Forward (E2 <E'<E2e) edge -C *** (E2e<E'<Em ) bottom -C *** (if assume beam goes from top to bottom) +! +! *** Do integrations from mu = -1 to mu = +1: +! *** for Backward (E1 <E'<E1e) top +! *** (E1e<E'<E2 ) edge +! *** and Forward (E2 <E'<E2e) edge +! *** (E2e<E'<Em ) bottom +! *** (if assume beam goes from top to bottom) DO 80 Jfbx=1,2 IF (Jfbx.EQ.1) THEN -C Jfbx=1 => Backward (low E, high angle, Negative cosine) +! Jfbx=1 => Backward (low E, high angle, Negative cosine) Jfb = 2 Backward = .TRUE. Forward = .FALSE. ELSE -C Jfbx=2 => Forward (high E, low angle, positive cosine) +! Jfbx=2 => Forward (high E, low angle, positive cosine) Jfb = 1 Backward = .FALSE. Forward = .TRUE. Cosb = Zero Eb = E2 END IF -C +! Jthxx = 0 -C ------ Loop over cosine(theta) (& therefore over E'=Ep) +! ------ Loop over cosine(theta) (& therefore over E'=Ep) DO Jthx=1,Jtheta IF (Jthx.EQ.1) Jthxx = 1 Jth = Jthx -C = 1 to Jtheta +! = 1 to Jtheta IF (Backward) Jth = Jtheta + 1 - Jthx -C = Jtheta to 1 +! = Jtheta to 1 Cosa = Cosb Ea = Eb IF (Forward .AND.Jth.LT.Jtheta) Cosb = Ftheta(Jth+1) IF (Backward.AND.Jth.GT.1 ) Cosb = - Ftheta(Jth-1) Itntb = 1 - Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) - * /Bbb(Iiso) )**2 + Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) / Bbb(Iiso) )**2 IF (Jth+1.EQ.Jtheta .AND. Forward) Eb = Em -C -C *** ----- Are there energy-points between Cosa & Cosb ? +! +! *** ----- Are there energy-points between Cosa & Cosb ? CALL Pickee (Energb, Ea, Eb, J1, J2, Kdatb) -C +! IF (Forward) THEN IF (Jth+1.EQ.Jtheta) THEN -C if (Forward & next point is last...) +! if (Forward & next point is last...) IF (J2.EQ.Nn) J2 = Nn - 1 ELSE IF (Jth.EQ.Jtheta) THEN -C IF (Forward & this point is last...) +! IF (Forward & this point is last...) IF (J2.GE.Nn) J2 = Nn - 1 IF (J1.GE.Nn) J1 = Nn END IF END IF -C +! Ep = Ea Costhe = Cosa J3 = J2 + 1 Ientrp = 0 Itntrp = 1 -C -C --------- Loop on energy points between Cosa & Cosb +! +! --------- Loop on energy points between Cosa & Cosb DO Jjj=J1,J3 Jj = Jjj -C +! 10 CONTINUE -C *** -------- Find Gggnew for Costhe & Ep_new - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone, Not_Quad) +! *** -------- Find Gggnew for Costhe & Ep_new + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Gggnew) -C -C ------------ Compare Gggnew to Ggg +! +! ------------ Compare Gggnew to Ggg Ag = dABS(Gggnew-Ggg) IF (Ggg+Ag.EQ.Ggg) GO TO 30 Bg = Ag/Gggnew Ag = Ag/Ggg IF (Ag.LT.Big .AND. Bg.LT.Big) GO TO 30 IF (Ggg.LT.Small .AND. Gggnew.LT.Small) GO TO 30 -C -C ------------ Additional points are needed so store this one +! +! ------------ Additional points are needed so store this one Kadd = Kadd + 1 Kaddm = Kaddm + 1 IF (Kadd.GT.Maxx) then call talk_kadd_gt_maxx(Kadd,Maxx,srcfile,interpType) - CALL Talk (Kadd, Maxx, Em, Eb, Ea, - * Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, - * Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, - * Nn, Iiso, 1) + CALL Talk (Kadd, Maxx, Em, Eb, Ea, & + Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, & + Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, & + Nn, Iiso, 1) end if -C +! IF (Lost.GT.20 .AND. Kadd.GT.20) then - call talk_kadd_and_lost_gt(Kadd,Lost,srcfile, - * interpType) - CALL Talk (Kadd, Maxx, - * Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, - * Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, - * Niniso, Nnpar, Nn, Iiso, 2) + call talk_kadd_and_lost_gt(Kadd,Lost,srcfile,interpType) + CALL Talk (Kadd, Maxx, & + Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, & + Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, & + Niniso, Nnpar, Nn, Iiso, 2) end if -C +! Csx(Kadd) = Costhe Epx(Kadd) = Ep Ggx(Kadd) = Gggnew Iex(Kadd) = Ientrp -C +! 20 CONTINUE -C ------------ Figure location of next possible point +! ------------ Figure location of next possible point Costhe = (Cosold+Costhe)/Two - Ep = Em*((Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) - * /Bbb(Iiso))**2 + Ep = Em*( (Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) / Bbb(Iiso) )**2 Ientrp = 0 Itntrp = 0 GO TO 10 -C +! 30 CONTINUE -C ------------ This point is acceptable so add in the integral -C ------------ from Cosold to Costhe +! ------------ This point is acceptable so add in the integral +! ------------ from Cosold to Costhe W = Costhe - Cosold Sumw = Sumw + W -C -C *** Add contributions from Eold (ie from Cosold) +! +! *** Add contributions from Eold (ie from Cosold) IF (Jthxx.NE.1 .AND. Izero.EQ.1) THEN Yyy1fb(Jfb) = Yyy1fb(Jfb) -Yyy1zz*W CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF -C -C ------------ Now, find values of everything for new point - call multScat%setNumThetaNearZero( - * multScat%getNumThetaNearZero() + 1 ) - CALL Finds_1fq (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, - * A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), - * A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Yyy1zz, - * Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, - * Jfb, Jth, Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) -C +! +! ------------ Now, find values of everything for new point + call multScat%setNumThetaNearZero( multScat%getNumThetaNearZero() + 1 ) + CALL Finds_1fq (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, & + A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), & + A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Yyy1zz, & + Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, & + Jfb, Jth, Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) +! IF (Jthxx.EQ.1) THEN Jthxx = 0 GO TO 40 END IF -C -C *** Add contributions from Enew (ie from Costhe) +! +! *** Add contributions from Enew (ie from Costhe) IF (Izero.EQ.1) THEN Yyy1fb(Jfb) = Yyy1fb(Jfb) -Yyy1zz*W CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF -C +! Cosold = Costhe IF (Kadd.EQ.0) GO TO 40 -C +! Ep = Epx(Kadd) Costhe = Csx(Kadd) Gggnew = Ggx(Kadd) @@ -544,15 +535,15 @@ C Ag = Ag/Ggg IF (Ag.GT.Big .OR. Bg.GT.Big) GO TO 20 Kadd = Kadd - 1 - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone, Not_Quad) + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Gggnew) GO TO 30 -C +! 40 CONTINUE -C *** -------- Finished adding extra points for rapid changes in Ggg -C -C *** -------- Now pick next Ep & Cosp +! *** -------- Finished adding extra points for rapid changes in Ggg +! +! *** -------- Now pick next Ep & Cosp IF (Ep.NE.Em) THEN IF (Jj.LE.J2) THEN Ientrp = Jj @@ -567,22 +558,23 @@ C *** -------- Now pick next Ep & Cosp Itntrp = Itntb END IF END IF -C -C *** -------- Update cos(theta) and continue +! +! *** -------- Update cos(theta) and continue Costhe = Cosp END DO -C *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) -C -C +! *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) +! +! END DO -C *** -- Finished do-loop on Jtheta (ie on mu) -C +! *** -- Finished do-loop on Jtheta (ie on mu) +! 80 CONTINUE -C *** Finished do-loop on Jfb (ie on positive vs negative mu) -C - CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, - * Nn, I1) +! *** Finished do-loop on Jfb (ie on positive vs negative mu) +! + CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, Nn, I1) CALL W_Wssmsc (Yyy1, Dthick, Total, Wssmsc, Yyy1fb, Kwssms) -C +! RETURN END + +end module ssm_6_m diff --git a/sammy/src/ssm/mssm07.f b/sammy/src/ssm/mssm07.f90 similarity index 52% rename from sammy/src/ssm/mssm07.f rename to sammy/src/ssm/mssm07.f90 index 4fe73baf8..02824638e 100644 --- a/sammy/src/ssm/mssm07.f +++ b/sammy/src/ssm/mssm07.f90 @@ -1,25 +1,27 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Mulsca_2il (A, Energb, Ftheta, Totsig, Capsig, Rmass, - * Aaa, Bbb, Csx, Epx, Ggx, Iex, Y2cccc, Dy2ccc, Wssmsc, Em, - * Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Nx, Maxx, Kdatb, - * Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) -C -C *** Mulsca generates the [approximation to] the multiple-scattering -C *** correction to the capture & fission yield -C *** The integration over mu is performed on a grid composed of: -C *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta -C *** (2) Values of mu corresponding to E' as in Energb grid -C *** (3) Extra points as needed when integrand changes rapidly -C *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been -C *** calculated earlier (in INP); these are used for edge-effects -C *** correction to single-scattering term -C *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = -C *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). -C *** Log interpolation is used on Ftheta and N*sigma', to give Fz. -C +! +module ssm_7_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Mulsca_2il (A, Energb, Ftheta, Totsig, Capsig, Rmass, & + Aaa, Bbb, Csx, Epx, Ggx, Iex, Y2cccc, Dy2ccc, Wssmsc, Em, & + Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Nx, Maxx, Kdatb, & + Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) +! +! *** Mulsca generates the [approximation to] the multiple-scattering +! *** correction to the capture & fission yield +! *** The integration over mu is performed on a grid composed of: +! *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta +! *** (2) Values of mu corresponding to E' as in Energb grid +! *** (3) Extra points as needed when integrand changes rapidly +! *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been +! *** calculated earlier (in INP); these are used for edge-effects +! *** correction to single-scattering term +! *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = +! *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). +! *** Log interpolation is used on Ftheta and N*sigma', to give Fz. +! use oops_common_m use fixedi_m use ifwrit_m @@ -32,14 +34,17 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_9_m + use ssm_11_m + use ssm_18_m IMPLICIT DOUBLE PRECISION (a-h,o-z) LOGICAL Backward, Forward DIMENSION A(-Msize:Msize) -C - DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), - * Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), - * Y2cccc(*), Dy2ccc(Nx,*), Wssmsc(*) -C +! + DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), & + Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), & + Y2cccc(*), Dy2ccc(Nx,*), Wssmsc(*) +! DATA Big /1.5d0/, Small /1.0d-12/, Lost /0/ DATA Zero /0.0d0/, One /1.0d0/, Two/2.0d0/ @@ -47,17 +52,17 @@ C character(len=80)::srcfile interpType = "Mulsca_2il" srcfile = "mssm07.f" -C -C +! +! CALL Zero2_2 (A, Sumw, Yyy1xx, Yyy2xx, Yyy2xq, Y2aaaa, Y2aaaq, Nx) -C -C *** Costhe (E') integration: first, find limits -C +! +! *** Costhe (E') integration: first, find limits +! CALL Limit (Energb, E1, E2, Rmass(Iiso), I1, Nn, Imin) -C *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 -C *** E2=E*((M-1)/(M+1)) -C *** I1=grid Number just above E1 -C +! *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 +! *** E2=E*((M-1)/(M+1)) +! *** I1=grid Number just above E1 +! Ggg = Zero Gggnew = Zero Izero = 1 @@ -67,187 +72,181 @@ C J1 = I1 J2 = 0 Ientrp = 0 -C -C *** find Ggg for Costhe & Eb +! +! *** find Ggg for Costhe & Eb IF (Idone.NE.3) THEN - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, - * Kdatb, Nn, Idone) + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, Kdatb, Nn, Idone) CALL Getggg (Exp1, Ggg) END IF -C +! Cosold = Cosb Cosp = Cosb Kadd = 0 Kaddm = 0 call multScat%setNumThetaNearZero( 0 ) -C -C *** Do integrations from mu = -1 to mu = +1: -C *** for Backward (E1 <E'<E1e) top -C *** (E1e<E'<E2 ) edge -C *** and Forward (E2 <E'<E2e) edge -C *** (E2e<E'<Em ) bottom -C *** (if assume beam goes from top to bottom) +! +! *** Do integrations from mu = -1 to mu = +1: +! *** for Backward (E1 <E'<E1e) top +! *** (E1e<E'<E2 ) edge +! *** and Forward (E2 <E'<E2e) edge +! *** (E2e<E'<Em ) bottom +! *** (if assume beam goes from top to bottom) DO 80 Jfbx=1,2 IF (Jfbx.EQ.1) THEN -C Jfbx=1 => Backward (low E, high angle, Negative cosine) +! Jfbx=1 => Backward (low E, high angle, Negative cosine) Jfb = 2 Backward = .TRUE. Forward = .FALSE. ELSE -C Jfbx=2 => Forward (high E, low angle, positive cosine) +! Jfbx=2 => Forward (high E, low angle, positive cosine) Jfb = 1 Backward = .FALSE. Forward = .TRUE. Cosb = Zero Eb = E2 END IF -C +! Jthxx = 0 -C ------ Loop over cosine(theta) (& therefore over E'=Ep) +! ------ Loop over cosine(theta) (& therefore over E'=Ep) DO Jthx=1,Jtheta IF (Jthx.EQ.1) Jthxx = 1 Jth = Jthx -C = 1 to Jtheta +! = 1 to Jtheta IF (Backward) Jth = Jtheta + 1 - Jthx -C = Jtheta to 1 +! = Jtheta to 1 Cosa = Cosb Ea = Eb IF (Forward .AND.Jth.LT.Jtheta) Cosb = Ftheta(Jth+1) IF (Backward.AND.Jth.GT.1 ) Cosb = - Ftheta(Jth-1) Itntb = 1 - Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) - * /Bbb(Iiso) )**2 + Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) / Bbb(Iiso) )**2 IF (Jth+1.EQ.Jtheta .AND. Forward) Eb = Em -C -C *** ----- Are there energy-points between Cosa & Cosb ? +! +! *** ----- Are there energy-points between Cosa & Cosb ? CALL Pickee (Energb, Ea, Eb, J1, J2, Kdatb) -C +! IF (Forward) THEN IF (Jth+1.EQ.Jtheta) THEN -C if (Forward & next point is last...) +! if (Forward & next point is last...) IF (J2.EQ.Nn) J2 = Nn - 1 ELSE IF (Jth.EQ.Jtheta) THEN -C IF (Forward & this point is last...) +! IF (Forward & this point is last...) IF (J2.GE.Nn) J2 = Nn - 1 IF (J1.GE.Nn) J1 = Nn END IF END IF -C +! Ep = Ea Costhe = Cosa J3 = J2 + 1 Ientrp = 0 Itntrp = 1 -C -C --------- Loop on energy points between Cosa & Cosb +! +! --------- Loop on energy points between Cosa & Cosb DO Jjj=J1,J3 Jj = Jjj -C +! 10 CONTINUE -C *** -------- Find Gggnew for Costhe & Ep_new - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone) +! *** -------- Find Gggnew for Costhe & Ep_new + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, Ientrp, Kdatb, Nn, Idone) CALL Getggg (Exp1, Gggnew) -C +! IF (Idone.EQ.3) GO TO 30 -C -C ------------ Compare Gggnew to Ggg +! +! ------------ Compare Gggnew to Ggg Ag = dABS(Gggnew-Ggg) IF (Ggg+Ag.EQ.Ggg) GO TO 30 Bg = Ag/Gggnew Ag = Ag/Ggg IF (Ag.LT.Big .AND. Bg.LT.Big) GO TO 30 IF (Ggg.LT.Small .AND. Gggnew.LT.Small) GO TO 30 -C -C ------------ Additional points are needed so store this one +! +! ------------ Additional points are needed so store this one Kadd = Kadd + 1 Kaddm = Kaddm + 1 IF (Kadd.GT.Maxx) then call talk_kadd_gt_maxx(Kadd,Maxx,srcfile,interpType) - CALL Talk (Kadd, Maxx, Em, Eb, Ea, - * Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, - * Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, - * Nn, Iiso, 1) + CALL Talk (Kadd, Maxx, Em, Eb, Ea, & + Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, & + Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, & + Nn, Iiso, 1) end if -C +! IF (Lost.GT.20 .AND. Kadd.GT.20) then - call talk_kadd_and_lost_gt(Kadd,Lost,srcfile, - * interpType) - CALL Talk (Kadd, Maxx, - * Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, - * Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, - * Niniso, Nnpar, Nn, Iiso, 2) + call talk_kadd_and_lost_gt(Kadd,Lost,srcfile,interpType) + CALL Talk (Kadd, Maxx, & + Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, & + Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, & + Niniso, Nnpar, Nn, Iiso, 2) end if -C +! Csx(Kadd) = Costhe Epx(Kadd) = Ep Ggx(Kadd) = Gggnew Iex(Kadd) = Ientrp -C +! 20 CONTINUE -C ------------ Figure location of next possible point +! ------------ Figure location of next possible point Costhe = (Cosold+Costhe)/Two - Ep = Em*((Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) - * /Bbb(Iiso))**2 + Ep = Em*( (Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2) ) / Bbb(Iiso) )**2 Ientrp = 0 Itntrp = 0 GO TO 10 -C +! 30 CONTINUE -C ------------ This point is acceptable so add in the integral -C ------------ from Cosold to Costhe +! ------------ This point is acceptable so add in the integral +! ------------ from Cosold to Costhe W = Costhe - Cosold Sumw = Sumw + W -C -C *** Add contributions from Eold (ie from Cosold) +! +! *** Add contributions from Eold (ie from Cosold) IF (Jthxx.NE.1 .AND. Izero.EQ.1) THEN IF (Idone.NE.3) THEN CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF - CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), - * A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), - * A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), - * A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, - * Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) + CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), & + A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), & + A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), & + A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, & + Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) END IF -C -C ------------ Now, find values of everything for new point - call multScat%setNumThetaNearZero( - * multScat%getNumThetaNearZero() + 1 ) +! +! ------------ Now, find values of everything for new point + call multScat%setNumThetaNearZero( multScat%getNumThetaNearZero() + 1 ) - CALL Finds_1il (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, - * A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), - * A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Exp1, Ep, Ggg, - * Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, Knthet, Nn, - * Kdatb, Izero, Idone, Nxtptwn) - CALL Finds_2 (A(Ieb), A(Idelas), A(Idt), A(Idc), - * A(Idtots), A(Idyy2x), A(Idy2xq), A(Idyxqq), - * A(Idy2dd), A(Idy2dq), Y2cccc, Dy2ccc, A(Idy2aa), - * A(Idy2aq), A(Idyaqq), Yyy2xx, Yyy2xq, Y2aaaa, - * Y2aaaq, Ep, Ggg, Nx, Ientrp, Nn, Izero, Idone, - * Not_Quad) -C + CALL Finds_1il (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, & + A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), & + A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Exp1, Ep, Ggg, & + Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, Knthet, Nn, & + Kdatb, Izero, Idone, Nxtptwn) + CALL Finds_2 (A(Ieb), A(Idelas), A(Idt), A(Idc), & + A(Idtots), A(Idyy2x), A(Idy2xq), A(Idyxqq), & + A(Idy2dd), A(Idy2dq), Y2cccc, Dy2ccc, A(Idy2aa), & + A(Idy2aq), A(Idyaqq), Yyy2xx, Yyy2xq, Y2aaaa, & + Y2aaaq, Ep, Ggg, Nx, Ientrp, Nn, Izero, Idone, & + Not_Quad) +! IF (Jthxx.EQ.1) THEN Jthxx = 0 GO TO 40 END IF -C -C *** Add contributions from Enew (ie from Costhe) +! +! *** Add contributions from Enew (ie from Costhe) IF (Izero.EQ.1) THEN IF (Idone.NE.3) THEN CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF - CALL Ssum_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), - * A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), - * A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), - * A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, - * Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) + CALL Ssum_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), & + A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), & + A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), & + A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, & + Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) END IF -C +! Cosold = Costhe IF (Idone.EQ.3) GO TO 40 IF (Kadd.EQ.0) GO TO 40 -C +! Ep = Epx(Kadd) Costhe = Csx(Kadd) Gggnew = Ggx(Kadd) @@ -259,15 +258,15 @@ C Ag = Ag/Ggg IF (Ag.GT.Big .OR. Bg.GT.Big) GO TO 20 Kadd = Kadd - 1 - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone) + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone) CALL Getggg (Exp1, Gggnew) GO TO 30 -C +! 40 CONTINUE -C *** -------- Finished adding extra points for rapid changes in Ggg -C -C *** -------- Now pick next Ep & Cosp +! *** -------- Finished adding extra points for rapid changes in Ggg +! +! *** -------- Now pick next Ep & Cosp IF (Ep.NE.Em) THEN IF (Jj.LE.J2) THEN Ientrp = Jj @@ -282,31 +281,29 @@ C *** -------- Now pick next Ep & Cosp Itntrp = Itntb END IF END IF -C -C *** -------- Update cos(theta) and continue +! +! *** -------- Update cos(theta) and continue Costhe = Cosp END DO -C *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) -C -C +! *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) +! +! END DO -C *** -- Finished do-loop on Jtheta (ie on mu) -C +! *** -- Finished do-loop on Jtheta (ie on mu) +! 80 CONTINUE -C *** Finished do-loop on Jfb (ie on positive vs negative mu) -C - CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, - * Nn, I1) +! *** Finished do-loop on Jfb (ie on positive vs negative mu) +! + CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, Nn, I1) IF (Kwssms.EQ.1) Wssmsc(5) = Yyy1*Pi/Dthick + Wssmsc(5) -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Zero2_2 (A, Sumw, Yyy1xx, Yyy2xx, Yyy2xq, Y2aaaa, - * Y2aaaq, Nx) +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Zero2_2 (A, Sumw, Yyy1xx, Yyy2xx, Yyy2xq, Y2aaaa, Y2aaaq, Nx) use oops_common_m use fixedi_m use ifwrit_m @@ -315,13 +312,13 @@ C IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION A(-Msize:Msize) DATA Zero /0.0d0/ -C +! Sumw = Zero Yyy1xx = Zero IF (Ksolve.NE.2) THEN CALL Zero_Array (A(Idyy1x), Nx) END IF -C +! Yyy2xx = Zero Yyy2xq = Zero Y2aaaa = Zero @@ -338,28 +335,28 @@ C END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Mulsca_2iq (A, Energb, Ftheta, Totsig, Capsig, Rmass, - * Aaa, Bbb, Csx, Epx, Ggx, Iex, Y2cccc, Dy2ccc, Wssmsc, Em, - * Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Nx, Maxx, Kdatb, - * Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) -C -C *** Mulsca generates the [approximation to] the multiple-scattering -C *** correction to the capture & fission yield -C *** The integration over mu is performed on a grid composed of: -C *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta -C *** (2) Values of mu corresponding to E' as in Energb grid -C *** (3) Extra points as needed when integrand changes rapidly -C *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been -C *** calculated earlier (in INP); these are used for edge-effects -C *** correction to single-scattering term -C *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = -C *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). -C *** Log interpolation is used on Ftheta and N*sigma', to give Fz. -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Mulsca_2iq (A, Energb, Ftheta, Totsig, Capsig, Rmass, & + Aaa, Bbb, Csx, Epx, Ggx, Iex, Y2cccc, Dy2ccc, Wssmsc, Em, & + Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Nx, Maxx, Kdatb, & + Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, Nxtptvm) +! +! *** Mulsca generates the [approximation to] the multiple-scattering +! *** correction to the capture & fission yield +! *** The integration over mu is performed on a grid composed of: +! *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta +! *** (2) Values of mu corresponding to E' as in Energb grid +! *** (3) Extra points as needed when integrand changes rapidly +! *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been +! *** calculated earlier (in INP); these are used for edge-effects +! *** correction to single-scattering term +! *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = +! *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). +! *** Log interpolation is used on Ftheta and N*sigma', to give Fz. +! use oops_common_m use fixedi_m use ifwrit_m @@ -372,14 +369,17 @@ C use xsect_x_common_m use constn_common_m use MultScatPars_common_m + use ssm_9_m + use ssm_11_m + use ssm_18_m IMPLICIT DOUBLE PRECISION (a-h,o-z) LOGICAL Backward, Forward DIMENSION A(-Msize:Msize) -C - DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), - * Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), - * Y2cccc(*), Dy2ccc(Nx,*), Wssmsc(*) -C +! + DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), & + Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), & + Y2cccc(*), Dy2ccc(Nx,*), Wssmsc(*) +! DATA Big /1.5d0/, Small /1.0d-12/, Lost /0/ DATA Zero /0.0d0/, One /1.0d0/, Two/2.0d0/ @@ -387,17 +387,17 @@ C character(len=80)::srcfile interpType = "Mulsca_2iq" srcfile = "mssm07.f" -C -C +! +! CALL Zero2_2 (A, Sumw, Yyy1xx, Yyy2xx, Yyy2xq, Y2aaaa, Y2aaaq, Nx) -C -C *** Costhe (E') integration: first, find limits -C +! +! *** Costhe (E') integration: first, find limits +! CALL Limit (Energb, E1, E2, Rmass(Iiso), I1, Nn, Imin) -C *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 -C *** E2=E*((M-1)/(M+1)) -C *** I1=grid Number just above E1 -C +! *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 +! *** E2=E*((M-1)/(M+1)) +! *** I1=grid Number just above E1 +! Ggg = Zero Gggnew = Zero Izero = 1 @@ -407,189 +407,185 @@ C J1 = I1 J2 = 0 Ientrp = 0 -C -C *** find Ggg for Costhe & Eb +! +! *** find Ggg for Costhe & Eb IF (Idone.NE.3) THEN - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, - * Kdatb, Nn, Idone, Not_Quad) + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, & + Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Ggg) END IF -C +! Cosold = Cosb Cosp = Cosb Kadd = 0 Kaddm = 0 call multScat%setNumThetaNearZero( 0 ) -C -C *** Do integrations from mu = -1 to mu = +1: -C *** for Backward (E1 <E'<E1e) top -C *** (E1e<E'<E2 ) edge -C *** and Forward (E2 <E'<E2e) edge -C *** (E2e<E'<Em ) bottom -C *** (if assume beam goes from top to bottom) +! +! *** Do integrations from mu = -1 to mu = +1: +! *** for Backward (E1 <E'<E1e) top +! *** (E1e<E'<E2 ) edge +! *** and Forward (E2 <E'<E2e) edge +! *** (E2e<E'<Em ) bottom +! *** (if assume beam goes from top to bottom) DO 80 Jfbx=1,2 IF (Jfbx.EQ.1) THEN -C Jfbx=1 => Backward (low E, high angle, Negative cosine) +! Jfbx=1 => Backward (low E, high angle, Negative cosine) Jfb = 2 Backward = .TRUE. Forward = .FALSE. ELSE -C Jfbx=2 => Forward (high E, low angle, positive cosine) +! Jfbx=2 => Forward (high E, low angle, positive cosine) Jfb = 1 Backward = .FALSE. Forward = .TRUE. Cosb = Zero Eb = E2 END IF -C +! Jthxx = 0 -C ------ Loop over cosine(theta) (& therefore over E'=Ep) +! ------ Loop over cosine(theta) (& therefore over E'=Ep) DO Jthx=1,Jtheta IF (Jthx.EQ.1) Jthxx = 1 Jth = Jthx -C = 1 to Jtheta +! = 1 to Jtheta IF (Backward) Jth = Jtheta + 1 - Jthx -C = Jtheta to 1 +! = Jtheta to 1 Cosa = Cosb Ea = Eb IF (Forward .AND.Jth.LT.Jtheta) Cosb = Ftheta(Jth+1) IF (Backward.AND.Jth.GT.1 ) Cosb = - Ftheta(Jth-1) Itntb = 1 - Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) - * /Bbb(Iiso) )**2 + Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) / Bbb(Iiso) )**2 IF (Jth+1.EQ.Jtheta .AND. Forward) Eb = Em -C -C *** ----- Are there energy-points between Cosa & Cosb ? +! +! *** ----- Are there energy-points between Cosa & Cosb ? CALL Pickee (Energb, Ea, Eb, J1, J2, Kdatb) -C +! IF (Forward) THEN IF (Jth+1.EQ.Jtheta) THEN -C if (Forward & next point is last...) +! if (Forward & next point is last...) IF (J2.EQ.Nn) J2 = Nn - 1 ELSE IF (Jth.EQ.Jtheta) THEN -C IF (Forward & this point is last...) +! IF (Forward & this point is last...) IF (J2.GE.Nn) J2 = Nn - 1 IF (J1.GE.Nn) J1 = Nn END IF END IF -C +! Ep = Ea Costhe = Cosa J3 = J2 + 1 Ientrp = 0 Itntrp = 1 -C -C --------- Loop on energy points between Cosa & Cosb +! +! --------- Loop on energy points between Cosa & Cosb DO Jjj=J1,J3 Jj = Jjj -C +! 10 CONTINUE -C *** -------- Find Gggnew for Costhe & Ep_new - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone, Not_Quad) +! *** -------- Find Gggnew for Costhe & Ep_new + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Gggnew) -C +! IF (Idone.EQ.3) GO TO 30 -C -C ------------ Compare Gggnew to Ggg +! +! ------------ Compare Gggnew to Ggg Ag = dABS(Gggnew-Ggg) IF (Ggg+Ag.EQ.Ggg) GO TO 30 Bg = Ag/Gggnew Ag = Ag/Ggg IF (Ag.LT.Big .AND. Bg.LT.Big) GO TO 30 IF (Ggg.LT.Small .AND. Gggnew.LT.Small) GO TO 30 -C -C ------------ Additional points are needed so store this one +! +! ------------ Additional points are needed so store this one Kadd = Kadd + 1 Kaddm = Kaddm + 1 IF (Kadd.GT.Maxx) then write(6,*) "Failure in Mulsca_2iq in mssm07.f" call talk_kadd_gt_maxx(Kadd,Maxx,srcfile,interpType) - CALL Talk (Kadd, Maxx, Em, Eb, Ea, - * Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, - * Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, - * Nn, Iiso, 1) + CALL Talk (Kadd, Maxx, Em, Eb, Ea, & + Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, & + Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, & + Nn, Iiso, 1) end if -C +! IF (Lost.GT.20 .AND. Kadd.GT.20) then write(6,*) "Failure in Mulsca_2iq in mssm07.f" - call talk_kadd_and_lost_gt(Kadd,Lost,srcfile, - * interpType) - CALL Talk (Kadd, Maxx, - * Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, - * Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, - * Niniso, Nnpar, Nn, Iiso, 2) + call talk_kadd_and_lost_gt(Kadd,Lost,srcfile,interpType) + CALL Talk (Kadd, Maxx, & + Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, & + Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, & + Niniso, Nnpar, Nn, Iiso, 2) end if -C +! Csx(Kadd) = Costhe Epx(Kadd) = Ep Ggx(Kadd) = Gggnew Iex(Kadd) = Ientrp -C +! 20 CONTINUE -C ------------ Figure location of next possible point +! ------------ Figure location of next possible point Costhe = (Cosold+Costhe)/Two - Ep = Em*((Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) - * /Bbb(Iiso))**2 + Ep = Em*( (Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) / Bbb(Iiso) )**2 Ientrp = 0 Itntrp = 0 GO TO 10 -C +! 30 CONTINUE -C ------------ This point is acceptable so add in the integral -C ------------ from Cosold to Costhe +! ------------ This point is acceptable so add in the integral +! ------------ from Cosold to Costhe W = Costhe - Cosold Sumw = Sumw + W -C -C *** Add contributions from Eold (ie from Cosold) +! +! *** Add contributions from Eold (ie from Cosold) IF (Jthxx.NE.1 .AND. Izero.EQ.1) THEN IF (Idone.NE.3) THEN CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF - CALL Ssum_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), - * A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), - * A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), - * A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, - * Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) + CALL Ssum_2 (A(Idyyy2), A(Idyy2q), A(Idy2qq), & + A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), & + A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), & + A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, & + Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) END IF -C -C ------------ Now, find values of everything for new point - call multScat%setNumThetaNearZero( - * multScat%getNumThetaNearZero() + 1 ) +! +! ------------ Now, find values of everything for new point + call multScat%setNumThetaNearZero( multScat%getNumThetaNearZero() + 1 ) - CALL Finds_1iq (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, - * A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), - * A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Exp1, Ep, Ggg, - * Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, Knthet, Nn, - * Kdatb, Izero, Idone, Nxtptwn) - CALL Finds_2 (A(Ieb), A(Idelas), A(Idt), A(Idc), - * A(Idtots), A(Idyy2x), A(Idy2xq), A(Idyxqq), - * A(Idy2dd), A(Idy2dq), Y2cccc, Dy2ccc, A(Idy2aa), - * A(Idy2aq), A(Idyaqq), Yyy2xx, Yyy2xq, Y2aaaa, - * Y2aaaq, Ep, Ggg, Nx, Ientrp, Nn, Izero, Idone, - * Not_Quad) -C + CALL Finds_1iq (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, & + A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), & + A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Exp1, Ep, Ggg, & + Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, Knthet, Nn, & + Kdatb, Izero, Idone, Nxtptwn) + CALL Finds_2 (A(Ieb), A(Idelas), A(Idt), A(Idc), & + A(Idtots), A(Idyy2x), A(Idy2xq), A(Idyxqq), & + A(Idy2dd), A(Idy2dq), Y2cccc, Dy2ccc, A(Idy2aa), & + A(Idy2aq), A(Idyaqq), Yyy2xx, Yyy2xq, Y2aaaa, & + Y2aaaq, Ep, Ggg, Nx, Ientrp, Nn, Izero, Idone, & + Not_Quad) +! IF (Jthxx.EQ.1) THEN Jthxx = 0 GO TO 40 END IF -C -C *** Add contributions from Enew (ie from Costhe) +! +! *** Add contributions from Enew (ie from Costhe) IF (Izero.EQ.1) THEN IF (Idone.NE.3) THEN CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF - CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), - * A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), - * A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), - * A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, - * Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) + CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), & + A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), & + A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), & + A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, & + Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) END IF -C +! Cosold = Costhe IF (Idone.EQ.3) GO TO 40 IF (Kadd.EQ.0) GO TO 40 -C +! Ep = Epx(Kadd) Costhe = Csx(Kadd) Gggnew = Ggx(Kadd) @@ -601,15 +597,15 @@ C Ag = Ag/Ggg IF (Ag.GT.Big .OR. Bg.GT.Big) GO TO 20 Kadd = Kadd - 1 - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone, Not_Quad) + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Gggnew) GO TO 30 -C +! 40 CONTINUE -C *** -------- Finished adding extra points for rapid changes in Ggg -C -C *** -------- Now pick next Ep & Cosp +! *** -------- Finished adding extra points for rapid changes in Ggg +! +! *** -------- Now pick next Ep & Cosp IF (Ep.NE.Em) THEN IF (Jj.LE.J2) THEN Ientrp = Jj @@ -624,22 +620,23 @@ C *** -------- Now pick next Ep & Cosp Itntrp = Itntb END IF END IF -C -C *** -------- Update cos(theta) and continue +! +! *** -------- Update cos(theta) and continue Costhe = Cosp END DO -C *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) -C -C +! *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) +! +! END DO -C *** -- Finished do-loop on Jtheta (ie on mu) -C +! *** -- Finished do-loop on Jtheta (ie on mu) +! 80 CONTINUE -C *** Finished do-loop on Jfb (ie on positive vs negative mu) -C - CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, - * Nn, I1) +! *** Finished do-loop on Jfb (ie on positive vs negative mu) +! + CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, Nn, I1) IF (Kwssms.EQ.1) Wssmsc(5) = Yyy1*Pi/Dthick + Wssmsc(5) -C +! RETURN END + +end module ssm_7_m diff --git a/sammy/src/ssm/mssm08.f b/sammy/src/ssm/mssm08.f90 similarity index 52% rename from sammy/src/ssm/mssm08.f rename to sammy/src/ssm/mssm08.f90 index 42376af03..f84756eca 100644 --- a/sammy/src/ssm/mssm08.f +++ b/sammy/src/ssm/mssm08.f90 @@ -1,26 +1,28 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Mulsca_2fl (A, Energb, Ftheta, Totsig, Capsig, Rmass, - * Aaa, Bbb, Csx, Epx, Ggx, Iex, Y2cccc, Dy2ccc, Wssmsc, Em, - * Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Yyy1fb, Nx, - * Maxx, Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, - * Nxtptvm) -C -C *** Mulsca generates the [approximation to] the multiple-scattering -C *** correction to the capture & fission yield -C *** The integration over mu is performed on a grid composed of: -C *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta -C *** (2) Values of mu corresponding to E' as in Energb grid -C *** (3) Extra points as needed when integrand changes rapidly -C *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been -C *** calculated earlier (in INP); these are used for edge-effects -C *** correction to single-scattering term -C *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = -C *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). -C *** Log interpolation is used on Ftheta and N*sigma', to give Fz. -C +! +module ssm_8_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Mulsca_2fl (A, Energb, Ftheta, Totsig, Capsig, Rmass, & + Aaa, Bbb, Csx, Epx, Ggx, Iex, Y2cccc, Dy2ccc, Wssmsc, Em, & + Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Yyy1fb, Nx, & + Maxx, Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, & + Nxtptvm) +! +! *** Mulsca generates the [approximation to] the multiple-scattering +! *** correction to the capture & fission yield +! *** The integration over mu is performed on a grid composed of: +! *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta +! *** (2) Values of mu corresponding to E' as in Energb grid +! *** (3) Extra points as needed when integrand changes rapidly +! *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been +! *** calculated earlier (in INP); these are used for edge-effects +! *** correction to single-scattering term +! *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = +! *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). +! *** Log interpolation is used on Ftheta and N*sigma', to give Fz. +! use oops_common_m use fixedi_m use ifwrit_m @@ -32,14 +34,19 @@ C use ssssss_common_m use xsect_x_common_m use MultScatPars_common_m + use ssm_7_m + use ssm_9_m + use ssm_10_m + use ssm_11_m + use ssm_18_m IMPLICIT DOUBLE PRECISION (a-h,o-z) LOGICAL Backward, Forward DIMENSION A(-Msize:Msize) -C - DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), - * Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), - * Y2cccc(*), Dy2ccc(Nx,*), Wssmsc(*), Yyy1fb(*) -C +! + DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), & + Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), & + Y2cccc(*), Dy2ccc(Nx,*), Wssmsc(*), Yyy1fb(*) +! DATA Big /1.5d0/, Small /1.0d-12/, Lost /0/ DATA Zero /0.0d0/, One /1.0d0/, Two/2.0d0/ @@ -47,13 +54,12 @@ C character(len=80)::srcfile interpType = "Mulsca_2fl" srcfile = "mssm08.f" -C -C -C *** Interpolate Sqfb to give Qfb at Total(E) (if doing edge-effects -C *** correction to single-scattering) +! +! +! *** Interpolate Sqfb to give Qfb at Total(E) (if doing edge-effects +! *** correction to single-scattering) IF (Idone.NE.3) THEN - CALL Trptot_Lin (A(Ixtptv), A(Isqfb), A(Iqfb), A(Idvqfb), - * Total, Nxtptvm, Em) + CALL Trptot_Lin (A(Ixtptv), A(Isqfb), A_Iqfb, A(Idvqfb), Total, Nxtptvm, Em) if ( Total.lt.multScat%getLogSigmaTotMin() ) then call multScat%setLogSigmaTotMin( Total ) @@ -63,16 +69,16 @@ C *** correction to single-scattering) end if END IF -C +! CALL Zero2_2 (A, Sumw, Yyy1xx, Yyy2xx, Yyy2xq, Y2aaaa, Y2aaaq, Nx) -C -C *** Costhe (E') integration: first, find limits -C +! +! *** Costhe (E') integration: first, find limits +! CALL Limit (Energb, E1, E2, Rmass(Iiso), I1, Nn, Imin) -C *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 -C *** E2=E*((M-1)/(M+1)) -C *** I1=grid Number just above E1 -C +! *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 +! *** E2=E*((M-1)/(M+1)) +! *** I1=grid Number just above E1 +! Ggg = Zero Gggnew = Zero Izero = 1 @@ -82,189 +88,183 @@ C J1 = I1 J2 = 0 Ientrp = 0 -C -C *** find Ggg for Costhe & Eb +! +! *** find Ggg for Costhe & Eb IF (Idone.NE.3) THEN - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, - * Kdatb, Nn, Idone) + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, Kdatb, Nn, Idone) CALL Getggg (Exp1, Ggg) END IF -C +! Cosold = Cosb Cosp = Cosb Kadd = 0 Kaddm = 0 call multScat%setNumThetaNearZero( 0 ) -C -C *** Do integrations from mu = -1 to mu = +1: -C *** for Backward (E1 <E'<E1e) top -C *** (E1e<E'<E2 ) edge -C *** and Forward (E2 <E'<E2e) edge -C *** (E2e<E'<Em ) bottom -C *** (if assume beam goes from top to bottom) +! +! *** Do integrations from mu = -1 to mu = +1: +! *** for Backward (E1 <E'<E1e) top +! *** (E1e<E'<E2 ) edge +! *** and Forward (E2 <E'<E2e) edge +! *** (E2e<E'<Em ) bottom +! *** (if assume beam goes from top to bottom) DO 80 Jfbx=1,2 IF (Jfbx.EQ.1) THEN -C Jfbx=1 => Backward (low E, high angle, Negative cosine) +! Jfbx=1 => Backward (low E, high angle, Negative cosine) Jfb = 2 Backward = .TRUE. Forward = .FALSE. ELSE -C Jfbx=2 => Forward (high E, low angle, positive cosine) +! Jfbx=2 => Forward (high E, low angle, positive cosine) Jfb = 1 Backward = .FALSE. Forward = .TRUE. Cosb = Zero Eb = E2 END IF -C +! Jthxx = 0 -C ------ Loop over cosine(theta) (& therefore over E'=Ep) +! ------ Loop over cosine(theta) (& therefore over E'=Ep) DO Jthx=1,Jtheta IF (Jthx.EQ.1) Jthxx = 1 Jth = Jthx -C = 1 to Jtheta +! = 1 to Jtheta IF (Backward) Jth = Jtheta + 1 - Jthx -C = Jtheta to 1 +! = Jtheta to 1 Cosa = Cosb Ea = Eb IF (Forward .AND.Jth.LT.Jtheta) Cosb = Ftheta(Jth+1) IF (Backward.AND.Jth.GT.1 ) Cosb = - Ftheta(Jth-1) Itntb = 1 - Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) - * /Bbb(Iiso) )**2 + Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) / Bbb(Iiso) )**2 IF (Jth+1.EQ.Jtheta .AND. Forward) Eb = Em -C -C *** ----- Are there energy-points between Cosa & Cosb ? +! +! *** ----- Are there energy-points between Cosa & Cosb ? CALL Pickee (Energb, Ea, Eb, J1, J2, Kdatb) -C +! IF (Forward) THEN IF (Jth+1.EQ.Jtheta) THEN -C if (Forward & next point is last...) +! if (Forward & next point is last...) IF (J2.EQ.Nn) J2 = Nn - 1 ELSE IF (Jth.EQ.Jtheta) THEN -C IF (Forward & this point is last...) +! IF (Forward & this point is last...) IF (J2.GE.Nn) J2 = Nn - 1 IF (J1.GE.Nn) J1 = Nn END IF END IF -C +! Ep = Ea Costhe = Cosa J3 = J2 + 1 Ientrp = 0 Itntrp = 1 -C -C --------- Loop on energy points between Cosa & Cosb +! +! --------- Loop on energy points between Cosa & Cosb DO Jjj=J1,J3 Jj = Jjj -C +! 10 CONTINUE -C *** -------- Find Gggnew for Costhe & Ep_new - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone) +! *** -------- Find Gggnew for Costhe & Ep_new + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, Ientrp, Kdatb, Nn, Idone) CALL Getggg (Exp1, Gggnew) -C +! IF (Idone.EQ.3) GO TO 30 -C -C ------------ Compare Gggnew to Ggg +! +! ------------ Compare Gggnew to Ggg Ag = dABS(Gggnew-Ggg) IF (Ggg+Ag.EQ.Ggg) GO TO 30 Bg = Ag/Gggnew Ag = Ag/Ggg IF (Ag.LT.Big .AND. Bg.LT.Big) GO TO 30 IF (Ggg.LT.Small .AND. Gggnew.LT.Small) GO TO 30 -C -C ------------ Additional points are needed so store this one +! +! ------------ Additional points are needed so store this one Kadd = Kadd + 1 Kaddm = Kaddm + 1 IF (Kadd.GT.Maxx) then call talk_kadd_gt_maxx(Kadd,Maxx,srcfile,interpType) - CALL Talk (Kadd, Maxx, Em, Eb, Ea, - * Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, - * Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, - * Nn, Iiso, 1) + CALL Talk (Kadd, Maxx, Em, Eb, Ea, & + Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, & + Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, & + Nn, Iiso, 1) end if -C +! IF (Lost.GT.20 .AND. Kadd.GT.20) then - call talk_kadd_and_lost_gt(Kadd,Lost,srcfile, - * interpType) - CALL Talk (Kadd, Maxx, - * Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, - * Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, - * Niniso, Nnpar, Nn, Iiso, 2) + call talk_kadd_and_lost_gt(Kadd,Lost,srcfile,interpType) + CALL Talk (Kadd, Maxx, & + Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, & + Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, & + Niniso, Nnpar, Nn, Iiso, 2) end if -C +! Csx(Kadd) = Costhe Epx(Kadd) = Ep Ggx(Kadd) = Gggnew Iex(Kadd) = Ientrp -C +! 20 CONTINUE -C ------------ Figure location of next possible point +! ------------ Figure location of next possible point Costhe = (Cosold+Costhe)/Two - Ep = Em*((Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) - * /Bbb(Iiso))**2 + Ep = Em*( ( Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2) ) / Bbb(Iiso) )**2 Ientrp = 0 Itntrp = 0 GO TO 10 -C +! 30 CONTINUE -C ------------ This point is acceptable so add in the integral -C ------------ from Cosold to Costhe +! ------------ This point is acceptable so add in the integral +! ------------ from Cosold to Costhe W = Costhe - Cosold Sumw = Sumw + W -C -C *** Add contributions from Eold (ie from Cosold) +! +! *** Add contributions from Eold (ie from Cosold) IF (Jthxx.NE.1 .AND. Izero.EQ.1) THEN IF (Idone.NE.3) THEN Yyy1fb(Jfb) = Yyy1fb(Jfb) -Yyy1zz*W CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF - CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), - * A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), - * A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), - * A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, - * Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) + CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), & + A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), & + A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), & + A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, & + Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) END IF -C -C ------------ Now, find values of everything for new point - call multScat%setNumThetaNearZero( - * multScat%getNumThetaNearZero() + 1 ) +! +! ------------ Now, find values of everything for new point + call multScat%setNumThetaNearZero( multScat%getNumThetaNearZero() + 1 ) - CALL Finds_1fl (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, - * A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), - * A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Yyy1zz, - * Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, - * Jfb, Jth, Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) - CALL Finds_2 (A(Ieb), A(Idelas), A(Idt), A(Idc), - * A(Idtots), A(Idyy2x), A(Idy2xq), A(Idyxqq), - * A(Idy2dd), A(Idy2dq), Y2cccc, Dy2ccc, A(Idy2aa), - * A(Idy2aq), A(Idyaqq), Yyy2xx, Yyy2xq, Y2aaaa, - * Y2aaaq, Ep, Ggg, Nx, Ientrp, Nn, Izero, Idone, - * Not_Quad) -C + CALL Finds_1fl (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, & + A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), & + A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Yyy1zz, & + Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, & + Jfb, Jth, Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) + CALL Finds_2 (A(Ieb), A(Idelas), A(Idt), A(Idc), & + A(Idtots), A(Idyy2x), A(Idy2xq), A(Idyxqq), & + A(Idy2dd), A(Idy2dq), Y2cccc, Dy2ccc, A(Idy2aa), & + A(Idy2aq), A(Idyaqq), Yyy2xx, Yyy2xq, Y2aaaa, & + Y2aaaq, Ep, Ggg, Nx, Ientrp, Nn, Izero, Idone, & + Not_Quad) +! IF (Jthxx.EQ.1) THEN Jthxx = 0 GO TO 40 END IF -C -C *** Add contributions from Enew (ie from Costhe) +! +! *** Add contributions from Enew (ie from Costhe) IF (Izero.EQ.1) THEN IF (Idone.NE.3) THEN Yyy1fb(Jfb) = Yyy1fb(Jfb) -Yyy1zz*W CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF - CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), - * A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), - * A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), - * A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, - * Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) + CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), & + A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), & + A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), & + A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, & + Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) END IF -C +! Cosold = Costhe IF (Idone.EQ.3) GO TO 40 IF (Kadd.EQ.0) GO TO 40 -C +! Ep = Epx(Kadd) Costhe = Csx(Kadd) Gggnew = Ggx(Kadd) @@ -276,15 +276,14 @@ C Ag = Ag/Ggg IF (Ag.GT.Big .OR. Bg.GT.Big) GO TO 20 Kadd = Kadd - 1 - CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone) + CALL Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, Ientrp, Kdatb, Nn, Idone) CALL Getggg (Exp1, Gggnew) GO TO 30 -C +! 40 CONTINUE -C *** -------- Finished adding extra points for rapid changes in Ggg -C -C *** -------- Now pick next Ep & Cosp +! *** -------- Finished adding extra points for rapid changes in Ggg +! +! *** -------- Now pick next Ep & Cosp IF (Ep.NE.Em) THEN IF (Jj.LE.J2) THEN Ientrp = Jj @@ -299,48 +298,47 @@ C *** -------- Now pick next Ep & Cosp Itntrp = Itntb END IF END IF -C -C *** -------- Update cos(theta) and continue +! +! *** -------- Update cos(theta) and continue Costhe = Cosp END DO -C *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) -C -C +! *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) +! +! END DO -C *** -- Finished do-loop on Jtheta (ie on mu) -C +! *** -- Finished do-loop on Jtheta (ie on mu) +! 80 CONTINUE -C *** Finished do-loop on Jfb (ie on positive vs negative mu) -C - CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, - * Nn, I1) +! *** Finished do-loop on Jfb (ie on positive vs negative mu) +! + CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, Nn, I1) CALL W_Wssmsc (Yyy1, Dthick, Total, Wssmsc, Yyy1fb, Kwssms) -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Mulsca_2fq (A, Energb, Ftheta, Totsig, Capsig, Rmass, - * Aaa, Bbb, Csx, Epx, Ggx, Iex, Y2cccc, Dy2ccc, Wssmsc, Em, - * Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Yyy1fb, Nx, - * Maxx, Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, - * Nxtptvm) -C -C *** Mulsca generates the [approximation to] the multiple-scattering -C *** correction to the capture & fission yield -C *** The integration over mu is performed on a grid composed of: -C *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta -C *** (2) Values of mu corresponding to E' as in Energb grid -C *** (3) Extra points as needed when integrand changes rapidly -C *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been -C *** calculated earlier (in INP); these are used for edge-effects -C *** correction to single-scattering term -C *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = -C *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). -C *** Log interpolation is used on Ftheta and N*sigma', to give Fz. -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Mulsca_2fq (A, Energb, Ftheta, Totsig, Capsig, Rmass, & + Aaa, Bbb, Csx, Epx, Ggx, Iex, Y2cccc, Dy2ccc, Wssmsc, Em, & + Exp1, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Yyy1fb, Nx, & + Maxx, Kdatb, Iiso, Nn, Imin, Idone, Knthet, Kountr, Nxtptwn, & + Nxtptvm) +! +! *** Mulsca generates the [approximation to] the multiple-scattering +! *** correction to the capture & fission yield +! *** The integration over mu is performed on a grid composed of: +! *** (1) Values of mu = Ftheta(1:Jtheta) where Jtheta > or = Ntheta +! *** (2) Values of mu corresponding to E' as in Energb grid +! *** (3) Extra points as needed when integrand changes rapidly +! *** Values of Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta) have been +! *** calculated earlier (in INP); these are used for edge-effects +! *** correction to single-scattering term +! *** Log interpolation gives Qfb(N*sigma',Ftheta,ifb) = +! *** Sqfb(ifb,N*sigma(E),N*sigma(E'),Ftheta). +! *** Log interpolation is used on Ftheta and N*sigma', to give Fz. +! use oops_common_m use fixedi_m use ifwrit_m @@ -352,14 +350,19 @@ C use ssssss_common_m use xsect_x_common_m use MultScatPars_common_m + use ssm_7_m + use ssm_9_m + use ssm_10_m + use ssm_11_m + use ssm_18_m IMPLICIT DOUBLE PRECISION (a-h,o-z) LOGICAL Backward, Forward DIMENSION A(-Msize:Msize) -C - DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), - * Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), - * Y2cccc(*), Dy2ccc(Nx,*), Wssmsc(*), Yyy1fb(*) -C +! + DIMENSION Energb(*), Ftheta(Jtheta), Totsig(*), Capsig(*), & + Rmass(*), Aaa(*), Bbb(*), Csx(*), Epx(*), Ggx(*), Iex(*), & + Y2cccc(*), Dy2ccc(Nx,*), Wssmsc(*), Yyy1fb(*) +! DATA Big /1.5d0/, Small /1.0d-12/, Lost /0/ DATA Zero /0.0d0/, One /1.0d0/, Two/2.0d0/ @@ -367,13 +370,12 @@ C character(len=80)::srcfile interpType = "Mulsca_2fq" srcfile = "mssm08.f" -C -C -C *** Interpolate Sqfb to give Qfb at Total(E) (if doing edge-effects -C *** correction to single-scattering) +! +! +! *** Interpolate Sqfb to give Qfb at Total(E) (if doing edge-effects +! *** correction to single-scattering) IF (Idone.NE.3) THEN - CALL Trptot_Quad (A(Ixtptv), A(Isqfb), A(Iqfb), A(Idvqfb), - * Total, Nxtptvm, Em) + CALL Trptot_Quad (A(Ixtptv), A(Isqfb), A_Iqfb, A(Idvqfb), Total, Nxtptvm, Em) if ( Total.lt.multScat%getLogSigmaTotMin() ) then call multScat%setLogSigmaTotMin( Total ) @@ -383,16 +385,16 @@ C *** correction to single-scattering) end if END IF -C +! CALL Zero2_2 (A, Sumw, Yyy1xx, Yyy2xx, Yyy2xq, Y2aaaa, Y2aaaq, Nx) -C -C *** Costhe (E') integration: first, find limits -C +! +! *** Costhe (E') integration: first, find limits +! CALL Limit (Energb, E1, E2, Rmass(Iiso), I1, Nn, Imin) -C *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 -C *** E2=E*((M-1)/(M+1)) -C *** I1=grid Number just above E1 -C +! *** subprogram Limit finds E1=E*((M-1)/(M+1))**2 +! *** E2=E*((M-1)/(M+1)) +! *** I1=grid Number just above E1 +! Ggg = Zero Gggnew = Zero Izero = 1 @@ -402,192 +404,187 @@ C J1 = I1 J2 = 0 Ientrp = 0 -C -C *** find Ggg for Costhe & Eb +! +! *** find Ggg for Costhe & Eb IF (Idone.NE.3) THEN - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, - * Kdatb, Nn, Idone, Not_Quad) + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Eb, J1+1, Ientrp, Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Ggg) END IF -C +! Cosold = Cosb Cosp = Cosb Kadd = 0 Kaddm = 0 call multScat%setNumThetaNearZero( 0 ) Ktheta = 0 -C -C *** Do integrations from mu = -1 to mu = +1: -C *** for Backward (E1 <E'<E1e) top -C *** (E1e<E'<E2 ) edge -C *** and Forward (E2 <E'<E2e) edge -C *** (E2e<E'<Em ) bottom -C *** (if assume beam goes from top to bottom) +! +! *** Do integrations from mu = -1 to mu = +1: +! *** for Backward (E1 <E'<E1e) top +! *** (E1e<E'<E2 ) edge +! *** and Forward (E2 <E'<E2e) edge +! *** (E2e<E'<Em ) bottom +! *** (if assume beam goes from top to bottom) DO 80 Jfbx=1,2 IF (Jfbx.EQ.1) THEN -C Jfbx=1 => Backward (low E, high angle, Negative cosine) +! Jfbx=1 => Backward (low E, high angle, Negative cosine) Jfb = 2 Backward = .TRUE. Forward = .FALSE. ELSE -C Jfbx=2 => Forward (high E, low angle, positive cosine) +! Jfbx=2 => Forward (high E, low angle, positive cosine) Jfb = 1 Backward = .FALSE. Forward = .TRUE. Cosb = Zero Eb = E2 END IF -C +! Jthxx = 0 -C ------ Loop over cosine(theta) (& therefore over E'=Ep) +! ------ Loop over cosine(theta) (& therefore over E'=Ep) DO Jthx=1,Jtheta IF (Jthx.EQ.1) Jthxx = 1 Jth = Jthx -C = 1 to Jtheta +! = 1 to Jtheta IF (Backward) Jth = Jtheta + 1 - Jthx -C = Jtheta to 1 +! = Jtheta to 1 Cosa = Cosb Ea = Eb IF (Forward .AND.Jth.LT.Jtheta) Cosb = Ftheta(Jth+1) IF (Backward.AND.Jth.GT.1 ) Cosb = - Ftheta(Jth-1) Itntb = 1 - Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) - * /Bbb(Iiso) )**2 + Eb = Em * ( ( Cosb + Dsqrt(Aaa(Iiso)-One+Cosb**2) ) / Bbb(Iiso) )**2 IF (Jth+1.EQ.Jtheta .AND. Forward) Eb = Em -C -C *** ----- Are there energy-points between Cosa & Cosb ? +! +! *** ----- Are there energy-points between Cosa & Cosb ? CALL Pickee (Energb, Ea, Eb, J1, J2, Kdatb) -C +! IF (Forward) THEN IF (Jth+1.EQ.Jtheta) THEN -C if (Forward & next point is last...) +! if (Forward & next point is last...) IF (J2.EQ.Nn) J2 = Nn - 1 ELSE IF (Jth.EQ.Jtheta) THEN -C IF (Forward & this point is last...) +! IF (Forward & this point is last...) IF (J2.GE.Nn) J2 = Nn - 1 IF (J1.GE.Nn) J1 = Nn END IF END IF -C +! Ep = Ea Costhe = Cosa J3 = J2 + 1 Ientrp = 0 Itntrp = 1 -C -C --------- Loop on energy points between Cosa & Cosb +! +! --------- Loop on energy points between Cosa & Cosb DO Jjj=J1,J3 Jj = Jjj -C +! 10 CONTINUE -C *** -------- Find Gggnew for Costhe & Ep_new - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone, Not_Quad) +! *** -------- Find Gggnew for Costhe & Ep_new + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, Ientrp, & + Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Gggnew) -C +! IF (Idone.EQ.3) GO TO 30 -C -C ------------ Compare Gggnew to Ggg +! +! ------------ Compare Gggnew to Ggg Ag = dABS(Gggnew-Ggg) IF (Ggg+Ag.EQ.Ggg) GO TO 30 Bg = Ag/Gggnew Ag = Ag/Ggg IF (Ag.LT.Big .AND. Bg.LT.Big) GO TO 30 IF (Ggg.LT.Small .AND. Gggnew.LT.Small) GO TO 30 -C -C ------------ Additional points are needed so store this one +! +! ------------ Additional points are needed so store this one Kadd = Kadd + 1 Kaddm = Kaddm + 1 IF (Kadd.GT.Maxx) then ! Stop the program call talk_kadd_gt_maxx(kadd,maxx,srcfile,interpType) - CALL Talk (Kadd, Maxx, Em, Eb, Ea, - * Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, - * Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, - * Nn, Iiso, 1) + CALL Talk (Kadd, Maxx, Em, Eb, Ea, & + Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, Ggx, Emind, & + Emins, Eminr, Energb, Totsig, Nnnsig, Niniso, Nnpar, & + Nn, Iiso, 1) end if -C +! IF (Lost.GT.20 .AND. Kadd.GT.20) then ! Stop the program - call talk_kadd_and_lost_gt(kadd,lost,srcfile, - * interpType) - CALL Talk (Kadd, Maxx, - * Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, - * Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, - * Niniso, Nnpar, Nn, Iiso, 2) + call talk_kadd_and_lost_gt(kadd,lost,srcfile,interpType) + CALL Talk (Kadd, Maxx, & + Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, J1, J3, Csx, Epx, & + Ggx, Emind, Emins, Eminr, Energb, Totsig, Nnnsig, & + Niniso, Nnpar, Nn, Iiso, 2) end if -C +! Csx(Kadd) = Costhe Epx(Kadd) = Ep Ggx(Kadd) = Gggnew Iex(Kadd) = Ientrp -C +! 20 CONTINUE -C ------------ Figure location of next possible point +! ------------ Figure location of next possible point Costhe = (Cosold+Costhe)/Two - Ep = Em*((Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2)) - * /Bbb(Iiso))**2 + Ep = Em*( ( Costhe+dSQRT(Aaa(Iiso)-One+Costhe**2) ) / Bbb(Iiso) )**2 Ientrp = 0 Itntrp = 0 GO TO 10 -C +! 30 CONTINUE -C ------------ This point is acceptable so add in the integral -C ------------ from Cosold to Costhe +! ------------ This point is acceptable so add in the integral +! ------------ from Cosold to Costhe W = Costhe - Cosold Sumw = Sumw + W -C -C *** Add contributions from Eold (ie from Cosold) +! +! *** Add contributions from Eold (ie from Cosold) IF (Jthxx.NE.1 .AND. Izero.EQ.1) THEN IF (Idone.NE.3) THEN Yyy1fb(Jfb) = Yyy1fb(Jfb) -Yyy1zz*W CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF - CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), - * A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), - * A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), - * A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, - * Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) + CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), & + A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), & + A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), & + A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, & + Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) END IF -C -C ------------ Now, find values of everything for new point - call multScat%setNumThetaNearZero( - * multScat%getNumThetaNearZero() + 1 ) +! +! ------------ Now, find values of everything for new point + call multScat%setNumThetaNearZero( multScat%getNumThetaNearZero() + 1 ) - CALL Finds_1fq (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, - * A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), - * A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Yyy1zz, - * Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, - * Jfb, Jth, Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) - CALL Finds_2 (A(Ieb), A(Idelas), A(Idt), A(Idc), - * A(Idtots), A(Idyy2x), A(Idy2xq), A(Idyxqq), - * A(Idy2dd), A(Idy2dq), Y2cccc, Dy2ccc, A(Idy2aa), - * A(Idy2aq), A(Idyaqq), Yyy2xx, Yyy2xq, Y2aaaa, - * Y2aaaq, Ep, Ggg, Nx, Ientrp, Nn, Izero, Idone, - * Not_Quad) -C + CALL Finds_1fq (A, A(Ieb), A(Icccll), A(Idddll), Ftheta, & + A(Idelas), A(Idt), A(Idc), Totsig, Capsig, A(Idtots), & + A(Idcaps), Rmass, A(Idyy1x), Yyy1xx, Yyy1zz, & + Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, & + Jfb, Jth, Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) + CALL Finds_2 (A(Ieb), A(Idelas), A(Idt), A(Idc), & + A(Idtots), A(Idyy2x), A(Idy2xq), A(Idyxqq), & + A(Idy2dd), A(Idy2dq), Y2cccc, Dy2ccc, A(Idy2aa), & + A(Idy2aq), A(Idyaqq), Yyy2xx, Yyy2xq, Y2aaaa, & + Y2aaaq, Ep, Ggg, Nx, Ientrp, Nn, Izero, Idone, & + Not_Quad) +! IF (Jthxx.EQ.1) THEN Jthxx = 0 GO TO 40 END IF -C -C *** Add contributions from Enew (ie from Costhe) +! +! *** Add contributions from Enew (ie from Costhe) IF (Izero.EQ.1) THEN IF (Idone.NE.3) THEN Yyy1fb(Jfb) = Yyy1fb(Jfb) -Yyy1zz*W CALL Ssum_1 (A(Idyyy1), A(Idyy1x), Yyy1, Yyy1xx, W) END IF - CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), - * A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), - * A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), - * A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, - * Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) + CALL Ssum_2 ( A(Idyyy2), A(Idyy2q), A(Idy2qq), & + A(Idyy2x), A(Idy2xq), A(Idyxqq), A(Idy2bb), & + A(Idy2bq), A(Idybqq), A(Idy2aa), A(Idy2aq), & + A(Idyaqq), Yyy2, Yyy2q, Yyy2xx, Yyy2xq, & + Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) END IF -C +! Cosold = Costhe IF (Idone.EQ.3) GO TO 40 IF (Kadd.EQ.0) GO TO 40 -C +! Ep = Epx(Kadd) Costhe = Csx(Kadd) Gggnew = Ggx(Kadd) @@ -599,15 +596,15 @@ C Ag = Ag/Ggg IF (Ag.GT.Big .OR. Bg.GT.Big) GO TO 20 Kadd = Kadd - 1 - CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, - * Ientrp, Kdatb, Nn, Idone, Not_Quad) + CALL Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, & + Ientrp, Kdatb, Nn, Idone, Not_Quad) CALL Getggg (Exp1, Gggnew) GO TO 30 -C +! 40 CONTINUE -C *** -------- Finished adding extra points for rapid changes in Ggg -C -C *** -------- Now pick next Ep & Cosp +! *** -------- Finished adding extra points for rapid changes in Ggg +! +! *** -------- Now pick next Ep & Cosp IF (Ep.NE.Em) THEN IF (Jj.LE.J2) THEN Ientrp = Jj @@ -622,21 +619,22 @@ C *** -------- Now pick next Ep & Cosp Itntrp = Itntb END IF END IF -C -C *** -------- Update cos(theta) and continue +! +! *** -------- Update cos(theta) and continue Costhe = Cosp END DO -C *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) -C +! *** ----- Finished loop on Jjj (on energies between Cosa & Cosb) +! END DO -C *** -- Finished do-loop on Jtheta (ie on mu) -C +! *** -- Finished do-loop on Jtheta (ie on mu) +! 80 CONTINUE -C *** Finished do-loop on Jfb (ie on positive vs negative mu) -C - CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, - * Nn, I1) +! *** Finished do-loop on Jfb (ie on positive vs negative mu) +! + CALL Testx (Em, E1, E2, Energb(Nn), Sumw, Kaddm, Lost, Kountr, Nn, I1) CALL W_Wssmsc (Yyy1, Dthick, Total, Wssmsc, Yyy1fb, Kwssms) -C +! RETURN END + +end module ssm_8_m diff --git a/sammy/src/ssm/mssm09.f b/sammy/src/ssm/mssm09.f90 similarity index 72% rename from sammy/src/ssm/mssm09.f rename to sammy/src/ssm/mssm09.f90 index 88ffe9339..0c1531a3d 100644 --- a/sammy/src/ssm/mssm09.f +++ b/sammy/src/ssm/mssm09.f90 @@ -1,39 +1,41 @@ -C -C -C ----------------------------------------------------------------- -C +! +module ssm_9_m + contains +! +! ----------------------------------------------------------------- +! SUBROUTINE Limit (Energb, E1, E2, Rmass, I1, Iie, Imin) -C -C *** Purpose -- find limits E1=E*((M-1)/(M+1))**2 -C *** E2=E*((M-1)/(M+1)) -C *** I1=grid Number just above E1 -C *** I2=grid Number just below E2 -C +! +! *** Purpose -- find limits E1=E*((M-1)/(M+1))**2 +! *** E2=E*((M-1)/(M+1)) +! *** I1=grid Number just above E1 +! *** I2=grid Number just below E2 +! IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Energb(*) DATA One /1.0d0/ -C +! E = Energb(Iie) A = (Rmass-One) / (Rmass+One) E2 = E*A E1 = E2*A -C +! Nnn = Iie - Imin + 1 CALL Findpr (Nnn, K) CALL Where (Energb(Imin), E1, K, Nnn, Nwhere) I1 = Imin + Nwhere - 1 RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, Ientrp, - * Kdatb, Nn, Idone) -C -C *** Purpose -- Find total cross section Totalp at energy Ep -C *** using linear interpolation only -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Get_Totalp_Lin (Energb, Totsig, Exp1, Ep, Jj, Ientrp, & + Kdatb, Nn, Idone) +! +! *** Purpose -- Find total cross section Totalp at energy Ep +! *** using linear interpolation only +! use fixedi_m use ifwrit_m use ssssss_common_m @@ -41,7 +43,7 @@ C IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Totsig(*), Energb(*) DATA Zero /0.0d0/ -C +! IF (Ientrp.NE.0) THEN Ii = Ientrp Intrp = 0 @@ -67,24 +69,23 @@ C 20 CONTINUE END IF Iep = Ii -C -C +! +! IF (Intrp.EQ.0) THEN -C -C *** Here get cross sections when Ep=Energb(Iep) or when Iep=1 or -C *** Iep=Nn, so must use constant value +! +! *** Here get cross sections when Ep=Energb(Iep) or when Iep=1 or +! *** Iep=Nn, so must use constant value Totalp = Totsig(Iep) -C +! ELSE IF (Iep.GT.0 .AND. Iep.LT.Kdatb) THEN -C *** Here Energb(Iep) < Ep < Energb(Iep+1) -C *** so get cross section at E'=Ep via linear interpolation +! *** Here Energb(Iep) < Ep < Energb(Iep+1) +! *** so get cross section at E'=Ep via linear interpolation A = Energb(Iep+1) - Ep B = Ep - Energb(Iep) IF (A.LT.Zero .OR. B.LT.Zero) THEN WRITE (6,10000) Iep, Energb(Iep), Ep, Energb(Iep+1) -10000 FORMAT (' Interpolation problem in Get_Totalp_Lin', I5, - * 1P3G14.7) +10000 FORMAT (' Interpolation problem in Get_Totalp_Lin', I5, 1P3G14.7) STOP '[STOP in Get_Totalp_Lin in ssm/mssm09.f]' END IF C = Energb(Iep+1) - Energb(Iep) @@ -95,22 +96,22 @@ C *** so get cross section at E'=Ep via linear interpolation Antrp2 = A Antrp3 = B Antrp4 = Zero -C +! END IF END IF -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, Ientrp, - * Kdatb, Nn, Idone, Not_Quad) -C -C *** Purpose -- Find total cross section Totalp at energy Ep using -C *** quadratic interpolation wherever possible -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Get_Totalp_Quad (Energb, Totsig, Exp1, Ep, Jj, Ientrp, & + Kdatb, Nn, Idone, Not_Quad) +! +! *** Purpose -- Find total cross section Totalp at energy Ep using +! *** quadratic interpolation wherever possible +! use fixedi_m use ifwrit_m use ssssss_common_m @@ -118,7 +119,7 @@ C IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Totsig(*), Energb(*) DATA Zero /0.0d0/, Half /0.5d0/ -C +! Not_Quad = 0 IF (Ientrp.NE.0) THEN Ii = Ientrp @@ -145,20 +146,20 @@ C 20 CONTINUE END IF Iep = Ii -C -C +! +! IF (Intrp.EQ.0) THEN -C -C *** Here get cross sections when Ep=Energb(Iep) or when Iep=1 or -C *** Iep=Nn, so must use constant value +! +! *** Here get cross sections when Ep=Energb(Iep) or when Iep=1 or +! *** Iep=Nn, so must use constant value Totalp = Totsig(Iep) -C +! ELSE IF (Iep.GT.1 .AND. Iep.LT.Kdatb-1) THEN -C ================================================================ -C *** Here Energb(Iep) < Ep < Energb(Iep+1) and 1<Iep<Kdatb-1 -C *** so get cross section at E'=Ep via two -C *** quadratic interpolations +! ================================================================ +! *** Here Energb(Iep) < Ep < Energb(Iep+1) and 1<Iep<Kdatb-1 +! *** so get cross section at E'=Ep via two +! *** quadratic interpolations A3 = Energb(Iep+2) - Ep A2 = Energb(Iep+1) - Ep A1 = Ep - Energb(Iep ) @@ -169,13 +170,13 @@ C *** quadratic interpolations C20 = Energb(Iep+1) - Energb(Iep-1) C10 = Energb(Iep ) - Energb(Iep-1) B0 = - A2/C20 * A1/C10 * Half - B1 = A2/C21 * A0/C10 * Half - * + A3/C31 * A2/C21 * Half - B2 = A1/C21 * A0/C20 * Half - * + A3/C32 * A1/C21 * Half + B1 = A2/C21 * A0/C10 * Half & + + A3/C31 * A2/C21 * Half + B2 = A1/C21 * A0/C20 * Half & + + A3/C32 * A1/C21 * Half B3 = - A2/C32 * A1/C31 * Half - Totalp = B1*Totsig(Iep ) + B2*Totsig(Iep+1) - * + B0*Totsig(Iep-1) + B3*Totsig(Iep+2) + Totalp = B1*Totsig(Iep ) + B2*Totsig(Iep+1) & + + B0*Totsig(Iep-1) + B3*Totsig(Iep+2) Antrp1 = B0 Antrp2 = B1 Antrp3 = B2 @@ -193,16 +194,15 @@ C *** quadratic interpolations Antrp3 = B Antrp4 = Zero END IF -C ================================================================ +! ================================================================ ELSE -C *** Here Energb(Iep) < Ep < Energb(Iep+1) and 1=Iep or Iep=Kdatb-1 -C *** so get cross section at E'=Ep via linear interpolation +! *** Here Energb(Iep) < Ep < Energb(Iep+1) and 1=Iep or Iep=Kdatb-1 +! *** so get cross section at E'=Ep via linear interpolation A = Energb(Iep+1) - Ep B = Ep - Energb(Iep) IF (A.LT.Zero .OR. B.LT.Zero) THEN WRITE (6,10000) Iep, Energb(Iep), Ep, Energb(Iep+1) -10000 FORMAT (' Interpolation problem in Get_Totalp_Quad', I5, - * 1P3G14.7) +10000 FORMAT (' Interpolation problem in Get_Totalp_Quad', I5, 1P3G14.7) STOP '[STOP in Get_Totalp_Quad in ssm/mssm09.f]' END IF C = Energb(Iep+1) - Energb(Iep) @@ -213,53 +213,53 @@ C *** so get cross section at E'=Ep via linear interpolation Antrp2 = A Antrp3 = B Antrp4 = Zero -C +! END IF END IF -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Getggg (Exp1, Ggg) -C -C *** Purpose -- Find Ggg, which is the value of the exponential piece -C *** of integrand when edge effects are neglected -C *** Ggg = ( [1-e]/Total + [e-e']/[d] ) -C +! +! *** Purpose -- Find Ggg, which is the value of the exponential piece +! *** of integrand when edge effects are neglected +! *** Ggg = ( [1-e]/Total + [e-e']/[d] ) +! use fixedi_m use ifwrit_m use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Zero /0.0d0/, One /1.0d0/ -C +! Ggg = Zero -C -C *** exactly forward +! +! *** exactly forward IF (Costhe.EQ.One) THEN Ggg = ( One - Exp1*(1.0d0+Dthick*Total) ) /Total -C +! ELSE D = Total*Costhe - Totalp Sn = Dthick*Total -C +! IF (Sn.LT.0.3d0) THEN Abc = Abcexp (-Sn, Ax, Bxxxxx, Cxxxxx, Dxxxxx, Ijklmn) Ax = Ax*Dthick ELSE Ax = (One-Exp1)/Total END IF -C +! IF (Costhe.EQ.Zero) THEN -C *** ----- sideways exactly +! *** ----- sideways exactly Ggg = Ax ELSE Dn = Dthick*D/Costhe IF (Costhe.GT.Zero) THEN -C *** -------- forward +! *** -------- forward IF (dABS(Dn).LT.0.3d0) THEN Abc = Abcexp (Dn, Ay, By, Cxxxxx, Dxxxxx, Ijklmn) Ay = - Exp1*Dthick*Ay @@ -269,7 +269,7 @@ C *** -------- forward END IF Ggg = Ax + Ay ELSE -C *** -------- backward +! *** -------- backward IF (dABS(Dn).LT.0.3d0) THEN Abc = Abcexp (-Dn, Ay, By, Cxxxxx, Dxxxxx, Ijklmn) Ay = - Dthick*Ay @@ -282,18 +282,18 @@ C *** -------- backward END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Pickee (Energb, Ea, Eb, J1, J2, Kdatb) -C -C *** Purpose -- Choose the next value of E' to be included in the -C *** grid for integrating over mu -C +! +! *** Purpose -- Choose the next value of E' to be included in the +! *** grid for integrating over mu +! IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Energb(*) -C +! J2 = 0 Jj = J1 DO J=Jj,Kdatb @@ -304,43 +304,43 @@ C RETURN 20 CONTINUE J1 = J -C -C *** now have Energb(J1-1) < ea < Energb(J1) -C -C +! +! *** now have Energb(J1-1) < ea < Energb(J1) +! +! Jj = J1 DO J=Jj,Kdatb IF (Energb(J).GT.Eb) GO TO 40 END DO J2 = Kdatb RETURN -C +! 40 CONTINUE J2 = J - 1 -C -C *** Now have Energb(J1-1) < Ea < Energb(J1 ) -C *** and Energb(J2 ) < Eb < Energb(J2+1) -C *** and Ea < Eb -C *** and J2+1.GE.J1 => J2+1 > J1-1 => J2 > J1-2 -C -C *** Note that J2 = J1-1 means there are no points k such that -C *** Energb(J1-1=J2) <Ea < Energb(k) < Eb < Energb(J2+1=J1) -C *** J2 = J1 means "Energb(J1-1) <Ea< Energb(J1) = Energb(J2) <Eb< Energb(J2+1) -C *** J2 > J1 means "Energb(J1-1) <Ea< Energb(J1) < Energb(J2) <Eb< Energb(J2+1) -C +! +! *** Now have Energb(J1-1) < Ea < Energb(J1 ) +! *** and Energb(J2 ) < Eb < Energb(J2+1) +! *** and Ea < Eb +! *** and J2+1.GE.J1 => J2+1 > J1-1 => J2 > J1-2 +! +! *** Note that J2 = J1-1 means there are no points k such that +! *** Energb(J1-1=J2) <Ea < Energb(k) < Eb < Energb(J2+1=J1) +! *** J2 = J1 means "Energb(J1-1) <Ea< Energb(J1) = Energb(J2) <Eb< Energb(J2+1) +! *** J2 > J1 means "Energb(J1-1) <Ea< Energb(J1) < Energb(J2) <Eb< Energb(J2+1) +! RETURN END -C -C -C ----------------------------------------------------------------- -C I'm going to add more information and call another print routine -C before the "Talk" routine is called for several cases that are -C repeated in mssm module +! +! +! ----------------------------------------------------------------- +! I'm going to add more information and call another print routine +! before the "Talk" routine is called for several cases that are +! repeated in mssm module subroutine talk_kadd_gt_maxx(Kadd,Maxx,srcfile,interpType) implicit none - integer (kind=4) Kadd,Maxx + integer ( kind=4 ) Kadd,Maxx character(len=12)::interpType character(len=80)::srcfile @@ -355,7 +355,7 @@ C repeated in mssm module subroutine talk_kadd_and_lost_gt(Kadd,Lost,srcfile,interpType) implicit none - integer (kind=4) Kadd,Lost + integer ( kind=4 ) Kadd,Lost character(len=12)::interpType character(len=80)::srcfile @@ -367,17 +367,16 @@ C repeated in mssm module return end -C -C ----------------------------------------------------------------- -C - SUBROUTINE Talk (Kadd, Maxx, Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, - * J1, J3, Csx, Epx, Ggx, Emind, Emins, Eminr, Energb, Totsig, - * Nnnsig, Niniso, Nnpar, N, Iso, Kwhich) +! +! ----------------------------------------------------------------- +! + SUBROUTINE Talk (Kadd, Maxx, Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, & + J1, J3, Csx, Epx, Ggx, Emind, Emins, Eminr, Energb, Totsig, & + Nnnsig, Niniso, Nnpar, N, Iso, Kwhich) IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Csx(*), Epx(*), Ggx(*), Energb(*), Totsig(*) WRITE (6,10100) Kadd, Maxx, Kwhich -10100 FORMAT (' Trouble in mulsca: too many points needed, Kadd,Maxx=', - * 3i5) +10100 FORMAT (' Trouble in mulsca: too many points needed, Kadd,Maxx=', 3i5) WRITE (6,10200) Em, Eb, Ea WRITE (6,10300) Cosb, Cosa 10200 FORMAT (' Em,Eb,Ea =', 1P6G14.6) @@ -401,17 +400,17 @@ C 60010 FORMAT (' Nnnsig,Niniso,Nnpar,N,Iso=', 5I5) STOP '[STOP in Talk in ssm/mssm09.f]' END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Ssum_1 (Dyyy1, Dyy1xx, Yyy1, Yyy1xx, W) -C +! use fixedi_m use ifwrit_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Dyyy1(*), Dyy1xx(*) -C +! Yyy1 = Yyy1 + Yyy1xx*W IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO J=1,Nnpar @@ -420,24 +419,24 @@ C END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ssum_2 (Dyyy2, Dyyy2q, Dyy2qq, Dyy2xx, Dyy2xq, Dy2xqq, - * Dy2bbb, Dy2bbq, Dy2bqq, Dy2aaa, Dy2aaq, Dy2aqq, Yyy2, Yyy2q, - * Yyy2xx, Yyy2xq, Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ssum_2 (Dyyy2, Dyyy2q, Dyy2qq, Dyy2xx, Dyy2xq, Dy2xqq, & + Dy2bbb, Dy2bbq, Dy2bqq, Dy2aaa, Dy2aaq, Dy2aqq, Yyy2, Yyy2q, & + Yyy2xx, Yyy2xq, Y2bbbb, Y2bbbq, Y2aaaa, Y2aaaq, W, Idone) +! use fixedi_m use ifwrit_m IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Dyyy2(*), Dyyy2q(*), Dyy2qq(*), Dyy2xx(*), Dyy2xq(*), - * Dy2xqq(*), Dy2bbb(*), Dy2bbq(*), Dy2bqq(*), Dy2aaa(*), - * Dy2aaq(*), Dy2aqq(*) + DIMENSION Dyyy2(*), Dyyy2q(*), Dyy2qq(*), Dyy2xx(*), Dyy2xq(*), & + Dy2xqq(*), Dy2bbb(*), Dy2bbq(*), Dy2bqq(*), Dy2aaa(*), & + Dy2aaq(*), Dy2aqq(*) DATA Zero /0.0d0/ -C +! IF (Idone.NE.3) THEN -C *** Here if calculating Y2, not just pieces for it +! *** Here if calculating Y2, not just pieces for it Yyy2 = Yyy2 + Yyy2xx*W IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO J=1,Nnpar @@ -454,8 +453,8 @@ C *** Here if calculating Y2, not just pieces for it END IF END IF END IF -C -C *** Here we set up inner loop for second, third, fourth, ... scatter +! +! *** Here we set up inner loop for second, third, fourth, ... scatter Y2bbbb = Y2bbbb + Y2aaaa*W IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO J=1,Nnpar @@ -471,30 +470,32 @@ C *** Here we set up inner loop for second, third, fourth, ... scatter END DO END IF END IF -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Testx (Em, E1, E2, Eb, Sumw, Kaddm, Lost, Kountr,Nn,I1) use constn_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Two /2.0d0/ -C +! IF (Kaddm.GT.10) THEN WRITE (6,30000) Em, Kaddm 30000 FORMAT (' Energy, Kaddm=', 1pg14.6, I10) Lost = Lost + 1 END IF -C +! IF (Dabs(Sumw-Two).GT.0.0002d0) THEN Kountr = Kountr + 1 WRITE (6,50000) Kountr, I1, Nn, E1, E2, Eb, Sumw 50000 FORMAT (' Kountr, I1,N =', 3i5, /' E1,E2,E,Sumw=', 4F12.3) END IF IF (Kountr.GT.5) STOP '[STOP in Testx in ssm/mssm09.f]' -C +! RETURN END + +end module ssm_9_m diff --git a/sammy/src/ssm/mssm10.f b/sammy/src/ssm/mssm10.f90 similarity index 55% rename from sammy/src/ssm/mssm10.f rename to sammy/src/ssm/mssm10.f90 index 641ead906..672e011c9 100644 --- a/sammy/src/ssm/mssm10.f +++ b/sammy/src/ssm/mssm10.f90 @@ -1,39 +1,41 @@ -C -C -C ----------------------------------------------------------------- -C +! +module ssm_10_m + contains +! +! ----------------------------------------------------------------- +! SUBROUTINE Trptot_Lin (Xtpt_V, Sqfb, Qfb, Dqfb, Vvv, Nxtptvm, Em) -C -C *** log-log interpolation on Sqfb(Jfb,Jsig_V,Ksig_W,Jth) to give -C *** Qfb(Ksig_W,Jth,Jfb) at correct Vvv=Total -C *** This version uses linear interpolation, not 4-point interpolation -C +! +! *** log-log interpolation on Sqfb(Jfb,Jsig_V,Ksig_W,Jth) to give +! *** Qfb(Ksig_W,Jth,Jfb) at correct Vvv=Total +! *** This version uses linear interpolation, not 4-point interpolation +! use fixedi_m use ifwrit_m use MultScatPars_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Xtpt_V(*), - * Sqfb(Nsqfb,Nxtptv,Nxtptw,Ntheta), - * Qfb(Nxtptw,Ntheta,Nsqfb), - * Dqfb(Nxtptw,Ntheta,2) + DIMENSION Xtpt_V(*), & + Sqfb(Nsqfb,Nxtptv,Nxtptw,Ntheta), & + Qfb(Nxtptw,Ntheta,Nsqfb), & + Dqfb(Nxtptw,Ntheta,2) DATA One /1.0d0/ -C +! Tt = dLOG(Vvv) CALL Where (Xtpt_V, Tt, Nxtptvm, Nxtptv, M) -C *** Now we know that Xtpt_V(M) < log(Vvv) < Xtpt_V(M+1) -C +! *** Now we know that Xtpt_V(M) < log(Vvv) < Xtpt_V(M+1) +! Mm = M A10 = Xtpt_V(Mm+1) - Xtpt_V(Mm) D0a = (Xtpt_V(Mm+1)-Tt)/A10 D1a = (Tt-Xtpt_V(Mm ))/A10 -C +! DO Jfb=1,Nsqfb DO Ltheta=1,multScat%getNumTheta() DO Ksig=1,Nxtptw - IF (Sqfb(Jfb,Mm ,Ksig,Ltheta).GT.-7999.9D0 .AND. - * Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-7999.9D0) THEN - Q = D0a*Sqfb(Jfb,Mm ,Ksig,Ltheta) - * + D1a*Sqfb(Jfb,Mm+1,Ksig,Ltheta) + IF (Sqfb(Jfb,Mm ,Ksig,Ltheta).GT.-7999.9D0 .AND. & + Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-7999.9D0) THEN + Q = D0a*Sqfb(Jfb,Mm ,Ksig,Ltheta) & + + D1a*Sqfb(Jfb,Mm+1,Ksig,Ltheta) ELSE Q = -8000.0D0 END IF @@ -41,20 +43,20 @@ C END DO END DO END DO -C +! IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN D0a = -One/A10 D1a = One/A10 -C -C *** Dqfb is logarithm of the negative of the derivative wrt v, -C *** where v=sigma_total +! +! *** Dqfb is logarithm of the negative of the derivative wrt v, +! *** where v=sigma_total DO Jfb=1,2 DO Ltheta=1,multScat%getNumTheta() DO Ksig=1,Nxtptw - IF (Sqfb(Jfb,Mm ,Ksig,Ltheta).GT.-7999.9D0 .AND. - * Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-7999.9D0) THEN - Q = D0a*Sqfb(Jfb,Mm ,Ksig,Ltheta) - * + D1a*Sqfb(Jfb,Mm+1,Ksig,Ltheta) + IF (Sqfb(Jfb,Mm ,Ksig,Ltheta).GT.-7999.9D0 .AND. & + Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-7999.9D0) THEN + Q = D0a*Sqfb(Jfb,Mm ,Ksig,Ltheta) & + + D1a*Sqfb(Jfb,Mm+1,Ksig,Ltheta) Dqfb(Ksig,Ltheta,Jfb) = Q -Tt +Qfb(Ksig,Ltheta,Jfb) ELSE Dqfb(Ksig,Ltheta,Jfb) = -8000.0d0 @@ -65,74 +67,74 @@ C *** where v=sigma_total END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Trptot_Quad (Xtpt_V, Sqfb, Qfb, Dqfb, Vvv, Nxtptvm, Em) -C -C *** log-log interpolation on Sqfb(Jfb,Jsig_V,Ksig_W,Jth) to give -C *** Qfb(Ksig_W,Jth,Jfb) at correct Vvv=Total -C *** This version uses four-point interpolation scheme -C *** (Takes more time, but should be more accurate) -C +! +! *** log-log interpolation on Sqfb(Jfb,Jsig_V,Ksig_W,Jth) to give +! *** Qfb(Ksig_W,Jth,Jfb) at correct Vvv=Total +! *** This version uses four-point interpolation scheme +! *** (Takes more time, but should be more accurate) +! use fixedi_m use ifwrit_m use MultScatPars_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Xtpt_V(*), - * Sqfb(Nsqfb,Nxtptv,Nxtptw,Ntheta), - * Qfb(Nxtptw,Ntheta,Nsqfb), - * Dqfb(Nxtptw,Ntheta,2) + DIMENSION Xtpt_V(*), & + Sqfb(Nsqfb,Nxtptv,Nxtptw,Ntheta), & + Qfb(Nxtptw,Ntheta,Nsqfb), & + Dqfb(Nxtptw,Ntheta,2) DATA Two /2.0d0/ -C +! Tt = dLOG(Vvv) CALL Where (Xtpt_V, Tt, Nxtptvm, Nxtptv, M) -C *** Now we know that Xtpt_V(M) < log(Vvv) < Xtpt_V(M+1) -C +! *** Now we know that Xtpt_V(M) < log(Vvv) < Xtpt_V(M+1) +! M = M - 1 IF (M.EQ.0) THEN M = 1 ELSE IF (M.EQ.Nxtptv-2) THEN M = Nxtptv - 3 END IF -C *** Use four-point interpolation with M, M+1, M+2, and M+3 +! *** Use four-point interpolation with M, M+1, M+2, and M+3 Mm = M A10 = Xtpt_V(Mm+1) - Xtpt_V(Mm) A21 = Xtpt_V(Mm+2) - Xtpt_V(Mm+1) A20 = Xtpt_V(Mm+2) - Xtpt_V(Mm) A31 = Xtpt_V(Mm+3) - Xtpt_V(Mm+1) A32 = Xtpt_V(Mm+3) - Xtpt_V(Mm+2) -C +! D0a = ((Xtpt_V(Mm+2)-Tt)/A20) * ((Xtpt_V(Mm+1)-Tt)/A10) D1a = ((Xtpt_V(Mm+2)-Tt)/A21) * ((Tt-Xtpt_V(Mm ))/A10) D2a = ((Tt-Xtpt_V(Mm+1))/A21) * ((Tt-Xtpt_V(Mm ))/A20) D1b = ((Xtpt_V(Mm+3)-Tt)/A31) * ((Xtpt_V(Mm+2)-Tt)/A21) D2b = ((Xtpt_V(Mm+3)-Tt)/A32) * ((Tt-Xtpt_V(Mm+1))/A21) D3b = ((Tt-Xtpt_V(Mm+2))/A32) * ((Tt-Xtpt_V(Mm+1))/A31) -C +! DO Jfb=1,Nsqfb DO Ltheta=1,multScat%getNumTheta() DO Ksig=1,Nxtptw - IF (Sqfb(Jfb,Mm ,Ksig,Ltheta).GT.-8000.0D0 .AND. - * Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-8000.0D0 .AND. - * Sqfb(Jfb,Mm+2,Ksig,Ltheta).GT.-8000.0D0) THEN - Q = D0a*Sqfb(Jfb,Mm ,Ksig,Ltheta) - * + D1a*Sqfb(Jfb,Mm+1,Ksig,Ltheta) - * + D2a*Sqfb(Jfb,Mm+2,Ksig,Ltheta) + IF (Sqfb(Jfb,Mm ,Ksig,Ltheta).GT.-8000.0D0 .AND. & + Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-8000.0D0 .AND. & + Sqfb(Jfb,Mm+2,Ksig,Ltheta).GT.-8000.0D0) THEN + Q = D0a*Sqfb(Jfb,Mm ,Ksig,Ltheta) & + + D1a*Sqfb(Jfb,Mm+1,Ksig,Ltheta) & + + D2a*Sqfb(Jfb,Mm+2,Ksig,Ltheta) IF (Sqfb(Jfb,Mm+3,Ksig,Ltheta).GT.-8000.0D0) THEN - Q = Q + D1b*Sqfb(Jfb,Mm+1,Ksig,Ltheta) - * + D2b*Sqfb(Jfb,Mm+2,Ksig,Ltheta) - * + D3b*Sqfb(Jfb,Mm+3,Ksig,Ltheta) + Q = Q + D1b*Sqfb(Jfb,Mm+1,Ksig,Ltheta) & + + D2b*Sqfb(Jfb,Mm+2,Ksig,Ltheta) & + + D3b*Sqfb(Jfb,Mm+3,Ksig,Ltheta) Q = Q/Two ELSE END IF - ELSE IF (Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-8000.0D0 .AND. - * Sqfb(Jfb,Mm+2,Ksig,Ltheta).GT.-8000.0D0 .AND. - * Sqfb(Jfb,Mm+3,Ksig,Ltheta).GT.-8000.0D0) THEN - Q = D1b*Sqfb(Jfb,Mm+1,Ksig,Ltheta) - * + D2b*Sqfb(Jfb,Mm+2,Ksig,Ltheta) - * + D3b*Sqfb(Jfb,Mm+3,Ksig,Ltheta) + ELSE IF (Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-8000.0D0 .AND. & + Sqfb(Jfb,Mm+2,Ksig,Ltheta).GT.-8000.0D0 .AND. & + Sqfb(Jfb,Mm+3,Ksig,Ltheta).GT.-8000.0D0) THEN + Q = D1b*Sqfb(Jfb,Mm+1,Ksig,Ltheta) & + + D2b*Sqfb(Jfb,Mm+2,Ksig,Ltheta) & + + D3b*Sqfb(Jfb,Mm+3,Ksig,Ltheta) ELSE Q = -8000.0D0 END IF @@ -140,7 +142,7 @@ C END DO END DO END DO -C +! IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN D0a = ( Two*Tt-Xtpt_V(Mm+2)-Xtpt_V(Mm+1))/(A10*A20) D1a = (-Two*Tt+Xtpt_V(Mm+2)+Xtpt_V(Mm ))/(A10*A21) @@ -148,32 +150,32 @@ C D1b = ( Two*Tt-Xtpt_V(Mm+3)-Xtpt_V(Mm+2))/(A21*A31) D2b = (-Two*Tt+Xtpt_V(Mm+3)+Xtpt_V(Mm+1))/(A21*A32) D3b = ( Two*Tt-Xtpt_V(Mm+2)-Xtpt_V(Mm+1))/(A31*A32) -C -C *** Dqfb is logarithm of the negative of the derivative wrt v, -C *** where v=sigma_total +! +! *** Dqfb is logarithm of the negative of the derivative wrt v, +! *** where v=sigma_total DO Jfb=1,2 DO Ltheta=1,multScat%getNumTheta() DO Ksig=1,Nxtptw - IF (Sqfb(Jfb,Mm ,Ksig,Ltheta).GT.-8000.0D0 .AND. - * Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-8000.0D0 .AND. - * Sqfb(Jfb,Mm+2,Ksig,Ltheta).GT.-8000.0D0) THEN - Q = D0a*Sqfb(Jfb,Mm ,Ksig,Ltheta) - * + D1a*Sqfb(Jfb,Mm+1,Ksig,Ltheta) - * + D2a*Sqfb(Jfb,Mm+2,Ksig,Ltheta) + IF (Sqfb(Jfb,Mm ,Ksig,Ltheta).GT.-8000.0D0 .AND. & + Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-8000.0D0 .AND. & + Sqfb(Jfb,Mm+2,Ksig,Ltheta).GT.-8000.0D0) THEN + Q = D0a*Sqfb(Jfb,Mm ,Ksig,Ltheta) & + + D1a*Sqfb(Jfb,Mm+1,Ksig,Ltheta) & + + D2a*Sqfb(Jfb,Mm+2,Ksig,Ltheta) IF (Sqfb(Jfb,Mm+3,Ksig,Ltheta).GT.-8000.0D0) THEN - Q = Q + D1b*Sqfb(Jfb,Mm+1,Ksig,Ltheta) - * + D2b*Sqfb(Jfb,Mm+2,Ksig,Ltheta) - * + D3b*Sqfb(Jfb,Mm+3,Ksig,Ltheta) + Q = Q + D1b*Sqfb(Jfb,Mm+1,Ksig,Ltheta) & + + D2b*Sqfb(Jfb,Mm+2,Ksig,Ltheta) & + + D3b*Sqfb(Jfb,Mm+3,Ksig,Ltheta) Q = Q/Two ELSE END IF Dqfb(Ksig,Ltheta,Jfb) = Q -Tt +Qfb(Ksig,Ltheta,Jfb) - ELSE IF (Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-8000.0D0 .AND. - * Sqfb(Jfb,Mm+2,Ksig,Ltheta).GT.-8000.0D0 .AND. - * Sqfb(Jfb,Mm+3,Ksig,Ltheta).GT.-8000.0D0) THEN - Q = D1b*Sqfb(Jfb,Mm+1,Ksig,Ltheta) - * + D2b*Sqfb(Jfb,Mm+2,Ksig,Ltheta) - * + D3b*Sqfb(Jfb,Mm+3,Ksig,Ltheta) + ELSE IF (Sqfb(Jfb,Mm+1,Ksig,Ltheta).GT.-8000.0D0 .AND. & + Sqfb(Jfb,Mm+2,Ksig,Ltheta).GT.-8000.0D0 .AND. & + Sqfb(Jfb,Mm+3,Ksig,Ltheta).GT.-8000.0D0) THEN + Q = D1b*Sqfb(Jfb,Mm+1,Ksig,Ltheta) & + + D2b*Sqfb(Jfb,Mm+2,Ksig,Ltheta) & + + D3b*Sqfb(Jfb,Mm+3,Ksig,Ltheta) Dqfb(Ksig,Ltheta,Jfb) = Q -Tt +Qfb(Ksig,Ltheta,Jfb) ELSE Dqfb(Ksig,Ltheta,Jfb) = -8000.0d0 @@ -184,19 +186,21 @@ C *** where v=sigma_total END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE W_Wssmsc (Yyy1, Dthick, Total, Wssmsc, Yyy1fb, Kwssms) use constn_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Wssmsc(*), Yyy1fb(*) -C +! IF (Kwssms.EQ.1) THEN Wssmsc(5) = Yyy1*Pi/Dthick + Wssmsc(5) Wssmsc(6) = (Yyy1fb(1)+Yyy1fb(2))*Total*Pi/Dthick + Wssmsc(6) END IF -C +! RETURN END + +end module ssm_10_m diff --git a/sammy/src/ssm/mssm11.f b/sammy/src/ssm/mssm11.f90 similarity index 53% rename from sammy/src/ssm/mssm11.f rename to sammy/src/ssm/mssm11.f90 index 0c09e3038..776a7c77d 100644 --- a/sammy/src/ssm/mssm11.f +++ b/sammy/src/ssm/mssm11.f90 @@ -1,144 +1,148 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Finds_1il (A, Energb, Ccclll, Dddlll, Ftheta, Delas, - * Dt, Dc, Totsig, Capsig, Dtotsi, Dcapsi, Rmass, Dyy1xx, Yyy1xx, - * Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, - * Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) -C +! +module ssm_11_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Finds_1il (A, Energb, Ccclll, Dddlll, Ftheta, Delas, & + Dt, Dc, Totsig, Capsig, Dtotsi, Dcapsi, Rmass, Dyy1xx, Yyy1xx, & + Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, & + Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) +! use oops_common_m use fixedi_m use ifwrit_m use logic_ssm_common_m use ssssss_common_m use xsect_x_common_m + use ssm_9_m + use ssm_12_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION A(-Msize:Msize) - DIMENSION Energb(*), Ccclll(*), Dddlll(*), Ftheta(*), Delas(*), - * Dt(*), Dc(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), Dcapsi(Nx,*), - * Rmass(*), Dyy1xx(*) -C + DIMENSION Energb(*), Ccclll(*), Dddlll(*), Ftheta(*), Delas(*), & + Dt(*), Dc(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), Dcapsi(Nx,*), & + Rmass(*), Dyy1xx(*) +! DATA Zero /0.0d0/ -C +! Izero = 1 Kv = Kvthck - Nvadif -C -C *** Find differential elastic scattering cross section Elas and -C *** derivatives Delas at Energy Em and angle Theta - CALL Xsect (Delas, Ccclll, Dddlll, Rmass(Iiso), Costhe, - * Elas, Iiso) -C -C *** At energy E'=Ep, find capture cross section (Capt) and total cross -C *** section (Totalp) & derivatives - CALL Xsect21_Lin (Energb, Totsig, Capsig, Dtotsi, Dcapsi, Dt, Dc, - * Ep, Jj, Nx, Ientrp, Kdatb, Nn) +! +! *** Find differential elastic scattering cross section Elas and +! *** derivatives Delas at Energy Em and angle Theta + CALL Xsect (Delas, Ccclll, Dddlll, Rmass(Iiso), Costhe, Elas, Iiso) +! +! *** At energy E'=Ep, find capture cross section (Capt) and total cross +! *** section (Totalp) & derivatives + CALL Xsect21_Lin (Energb, Totsig, Capsig, Dtotsi, Dcapsi, Dt, Dc, & + Ep, Jj, Nx, Ientrp, Kdatb, Nn) IF (Capt.EQ.Zero .OR. Elas.EQ.Zero) THEN Izero = 0 RETURN END IF -C -C *** Generate pieces of the integrand when there are no edge effects +! +! *** Generate pieces of the integrand when there are no edge effects CALL Getggg (Exp1, Ggg) Egt = Elas*Ggg/Totalp -C +! Ec = Elas*Capt Ect = Ec/Totalp -C +! Yyy1xx = Ect*Ggg -C +! IF (Nnpar.NE.0 .AND. Ksolve.NE.2) THEN -C *** Calculate pieces to add to deriv +! *** Calculate pieces to add to deriv CALL Getg_Derivatives (Exp1) Cgt = Capt*Ggg/Totalp Dp = Ect* ( Dggbdp - Ggg/Totalp ) Ds = Ect* ( Dggads + Dggbds ) DO J=1,Nnpar IF (J.NE.Kv) THEN - Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + - * Dtotsi(J,Nn)*Ds + Dt(J)*Dp + Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + & + Dtotsi(J,Nn)*Ds + Dt(J)*Dp END IF END DO IF (Kvthck.GT.0) Dyy1xx(Kv) = Ect*(Dggadn+Dggbdn) END IF -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Finds_1iq (A, Energb, Ccclll, Dddlll, Ftheta, Delas, - * Dt, Dc, Totsig, Capsig, Dtotsi, Dcapsi, Rmass, Dyy1xx, Yyy1xx, - * Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, - * Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Finds_1iq (A, Energb, Ccclll, Dddlll, Ftheta, Delas, & + Dt, Dc, Totsig, Capsig, Dtotsi, Dcapsi, Rmass, Dyy1xx, Yyy1xx, & + Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, & + Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) +! use oops_common_m use fixedi_m use ifwrit_m use logic_ssm_common_m use ssssss_common_m use xsect_x_common_m + use ssm_9_m + use ssm_12_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION A(-Msize:Msize) - DIMENSION Energb(*), Ccclll(*), Dddlll(*), Ftheta(*), Delas(*), - * Dt(*), Dc(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), Dcapsi(Nx,*), - * Rmass(*), Dyy1xx(*) -C + DIMENSION Energb(*), Ccclll(*), Dddlll(*), Ftheta(*), Delas(*), & + Dt(*), Dc(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), Dcapsi(Nx,*), & + Rmass(*), Dyy1xx(*) +! DATA Zero /0.0d0/ -C +! Izero = 1 Kv = Kvthck - Nvadif -C -C *** Find differential elastic scattering cross section Elas and -C *** derivatives Delas at Energy Em and angle Theta - CALL Xsect (Delas, Ccclll, Dddlll, Rmass(Iiso), Costhe, - * Elas, Iiso) -C -C *** At energy E'=Ep, find capture cross section (Capt) and total cross -C *** section (Totalp) & derivatives - CALL Xsect21_Quad (Energb, Totsig, Capsig, Dtotsi, Dcapsi, Dt, Dc, - * Ep, Jj, Nx, Ientrp, Kdatb, Nn) +! +! *** Find differential elastic scattering cross section Elas and +! *** derivatives Delas at Energy Em and angle Theta + CALL Xsect (Delas, Ccclll, Dddlll, Rmass(Iiso), Costhe, Elas, Iiso) +! +! *** At energy E'=Ep, find capture cross section (Capt) and total cross +! *** section (Totalp) & derivatives + CALL Xsect21_Quad (Energb, Totsig, Capsig, Dtotsi, Dcapsi, Dt, Dc, & + Ep, Jj, Nx, Ientrp, Kdatb, Nn) IF (Capt.EQ.Zero .OR. Elas.EQ.Zero) THEN Izero = 0 RETURN END IF -C -C *** Generate pieces of the integrand when there are no edge effects +! +! *** Generate pieces of the integrand when there are no edge effects CALL Getggg (Exp1, Ggg) Egt = Elas*Ggg/Totalp -C +! Ec = Elas*Capt Ect = Ec/Totalp -C +! Yyy1xx = Ect*Ggg -C +! IF (Nnpar.NE.0 .AND. Ksolve.NE.2) THEN -C *** Calculate pieces to add to deriv +! *** Calculate pieces to add to deriv CALL Getg_Derivatives (Exp1) Cgt = Capt*Ggg/Totalp Dp = Ect* ( Dggbdp - Ggg/Totalp ) Ds = Ect* ( Dggads + Dggbds ) DO J=1,Nnpar IF (J.NE.Kv) THEN - Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + - * Dtotsi(J,Nn)*Ds + Dt(J)*Dp + Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + & + Dtotsi(J,Nn)*Ds + Dt(J)*Dp END IF END DO IF (Kvthck.GT.0) Dyy1xx(Kv) = Ect*(Dggadn+Dggbdn) END IF -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Finds_1fl (A, Energb, Ccclll, Dddlll, Ftheta, Delas, - * Dt, Dc, Totsig, Capsig, Dtotsi, Dcapsi, Rmass, Dyy1xx, Yyy1xx, - * Yyy1zz, Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, - * Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Finds_1fl (A, Energb, Ccclll, Dddlll, Ftheta, Delas, & + Dt, Dc, Totsig, Capsig, Dtotsi, Dcapsi, Rmass, Dyy1xx, Yyy1xx, & + Yyy1zz, Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, & + Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) +! use oops_common_m use fixedi_m use ifwrit_m @@ -146,66 +150,67 @@ C use ssssss_common_m use xsect_x_common_m use MultScatPars_common_m + use ssm_utils_m + use ssm_9_m + use ssm_12_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION A(-Msize:Msize) - DIMENSION Energb(*), Ccclll(*), Dddlll(*), Ftheta(*), Delas(*), - * Dt(*), Dc(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), Dcapsi(Nx,*), - * Rmass(*), Dyy1xx(*) -C + DIMENSION Energb(*), Ccclll(*), Dddlll(*), Ftheta(*), Delas(*), & + Dt(*), Dc(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), Dcapsi(Nx,*), & + Rmass(*), Dyy1xx(*) +! DATA Zero /0.0d0/ -C +! Izero = 1 Kv = Kvthck - Nvadif -C -C *** Find differential elastic scattering cross section Elas and -C *** derivatives Delas at Energy Em and angle Theta - CALL Xsect (Delas, Ccclll, Dddlll, Rmass(Iiso), Costhe, - * Elas, Iiso) -C -C *** At energy E'=Ep, find capture cross section (Capt) and total cross -C *** section (Totalp) & derivatives - CALL Xsect21_Lin (Energb, Totsig, Capsig, Dtotsi, Dcapsi, Dt, Dc, - * Ep, Jj, Nx, Ientrp, Kdatb, Nn) +! +! *** Find differential elastic scattering cross section Elas and +! *** derivatives Delas at Energy Em and angle Theta + CALL Xsect (Delas, Ccclll, Dddlll, Rmass(Iiso), Costhe, Elas, Iiso) +! +! *** At energy E'=Ep, find capture cross section (Capt) and total cross +! *** section (Totalp) & derivatives + CALL Xsect21_Lin (Energb, Totsig, Capsig, Dtotsi, Dcapsi, Dt, Dc, & + Ep, Jj, Nx, Ientrp, Kdatb, Nn) IF (Capt.EQ.Zero .OR. Elas.EQ.Zero) THEN Izero = 0 RETURN END IF -C -C *** Generate pieces of the integrand +! +! *** Generate pieces of the integrand CALL Getggg (Exp1, Ggg) Egt = Elas*Ggg/Totalp -C +! Ec = Elas*Capt Ect = Ec/Totalp -C +! IF ( (Costhe.GE.Costh1) .OR. (Costhe.LE.-Costh1) ) THEN -C *** Here for no edge effects +! *** Here for no edge effects Yyy1xx = Ect*Ggg Yyy1zz = Zero -C +! IF (Nnpar.NE.0 .AND. Ksolve.NE.2) THEN -C *** Calculate pieces to add to deriv +! *** Calculate pieces to add to deriv CALL Getg_Derivatives (Exp1) Cgt = Capt*Ggg/Totalp Dp = Ect* ( Dggbdp - Ggg/Totalp ) Ds = Ect* ( Dggads + Dggbds ) DO J=1,Nnpar IF (J.NE.Kv) THEN - Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + - * Dtotsi(J,Nn)*Ds + Dt(J)*Dp + Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + & + Dtotsi(J,Nn)*Ds + Dt(J)*Dp END IF END DO IF (Kvthck.GT.0) Dyy1xx(Kv) = Ect*(Dggadn+Dggbdn) END IF -C +! ELSE -C -C *** Here do edge effects; numerical differentiation -C *** Interpolate Costhe on Ftheta(Jth) and Totalp on Xtpt_W(Jsig) -C *** to get Q = [Qfb at correct theta and E'] -C *** Intrp=0 => interpolate on Costhe; Intrp=1 => don't - CALL X_Trpths_Lin (A, Ftheta, Knthet, Jfb, Jth, Itntrp, Nn, - * Nxtptwn) +! +! *** Here do edge effects; numerical differentiation +! *** Interpolate Costhe on Ftheta(Jth) and Totalp on Xtpt_W(Jsig) +! *** to get Q = [Qfb at correct theta and E'] +! *** Intrp=0 => interpolate on Costhe; Intrp=1 => don't + CALL X_Trpths_Lin (A, Ftheta, Knthet, Jfb, Jth, Itntrp, Nn, Nxtptwn) Gggb = Fz if ( Totalp.lt.multScat%getLogSigmaTotMin() ) then @@ -216,15 +221,15 @@ C *** Intrp=0 => interpolate on Costhe; Intrp=1 => don't call multScat%setLogSigmaTotMax( Totalp ) Xtmax = Totalp ! remove end if -C -C *** Figure piece to add to Yyy1; Note that Yyy1xx includes both -C *** infinite-slab term AND edge effects correction term. -C *** Variable Yyy1zz stores difference between infinite slab & edge -C *** for use in array Yyy1fb, which is for debug purposes only. +! +! *** Figure piece to add to Yyy1; Note that Yyy1xx includes both +! *** infinite-slab term AND edge effects correction term. +! *** Variable Yyy1zz stores difference between infinite slab & edge +! *** for use in array Yyy1fb, which is for debug purposes only. Ggg_Ab = Gggb Yyy1xx = Ect*Gggb -cz Yyy1zz = Ect*(Ggg-Gggb) -C +!z Yyy1zz = Ect*(Ggg-Gggb) +! Egt = Elas*Ggg_Ab/Totalp IF (Nnpar.NE.0 .AND. Ksolve.NE.2) THEN Cgt = Capt*Ggg_Ab/Totalp @@ -232,27 +237,27 @@ C Ds = Ect* (Dfz ) DO J=1,Nnpar IF (J.NE.Kv) THEN - Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + - * Dtotsi(J,Nn)*Ds + Dt(J)*Dp + Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + & + Dtotsi(J,Nn)*Ds + Dt(J)*Dp END IF END DO IF (Kvthck.GT.0) Dyy1xx(Kv) = Ect*Dnfz END IF -C -C *** finished edge-effects +! +! *** finished edge-effects END IF -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Finds_1fq (A, Energb, Ccclll, Dddlll, Ftheta, Delas, - * Dt, Dc, Totsig, Capsig, Dtotsi, Dcapsi, Rmass, Dyy1xx, Yyy1xx, - * Yyy1zz, Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, - * Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Finds_1fq (A, Energb, Ccclll, Dddlll, Ftheta, Delas, & + Dt, Dc, Totsig, Capsig, Dtotsi, Dcapsi, Rmass, Dyy1xx, Yyy1xx, & + Yyy1zz, Exp1, Ep, Ggg, Iiso, Nx, Jj, Ientrp, Itntrp, Jfb, Jth, & + Knthet, Nn, Kdatb, Izero, Idone, Nxtptwn) +! use oops_common_m use fixedi_m use ifwrit_m @@ -260,66 +265,67 @@ C use ssssss_common_m use xsect_x_common_m use MultScatPars_common_m + use ssm_utils_m + use ssm_9_m + use ssm_12_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION A(-Msize:Msize) - DIMENSION Energb(*), Ccclll(*), Dddlll(*), Ftheta(*), Delas(*), - * Dt(*), Dc(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), Dcapsi(Nx,*), - * Rmass(*), Dyy1xx(*) -C + DIMENSION Energb(*), Ccclll(*), Dddlll(*), Ftheta(*), Delas(*), & + Dt(*), Dc(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), Dcapsi(Nx,*), & + Rmass(*), Dyy1xx(*) +! DATA Zero /0.0d0/ -C +! Izero = 1 Kv = Kvthck - Nvadif -C -C *** Find differential elastic scattering cross section Elas and -C *** derivatives Delas at Energy Em and angle Theta - CALL Xsect (Delas, Ccclll, Dddlll, Rmass(Iiso), Costhe, - * Elas, Iiso) -C -C *** At energy E'=Ep, find capture cross section (Capt) and total cross -C *** section (Totalp) & derivatives - CALL Xsect21_Quad (Energb, Totsig, Capsig, Dtotsi, Dcapsi, Dt, Dc, - * Ep, Jj, Nx, Ientrp, Kdatb, Nn) +! +! *** Find differential elastic scattering cross section Elas and +! *** derivatives Delas at Energy Em and angle Theta + CALL Xsect (Delas, Ccclll, Dddlll, Rmass(Iiso), Costhe, Elas, Iiso) +! +! *** At energy E'=Ep, find capture cross section (Capt) and total cross +! *** section (Totalp) & derivatives + CALL Xsect21_Quad (Energb, Totsig, Capsig, Dtotsi, Dcapsi, Dt, Dc, & + Ep, Jj, Nx, Ientrp, Kdatb, Nn) IF (Capt.EQ.Zero .OR. Elas.EQ.Zero) THEN Izero = 0 RETURN END IF -C -C *** Generate pieces of the integrand +! +! *** Generate pieces of the integrand CALL Getggg (Exp1, Ggg) Egt = Elas*Ggg/Totalp -C +! Ec = Elas*Capt Ect = Ec/Totalp -C +! IF ( (Costhe.GE.Costh1) .OR. (Costhe.LE.-Costh1) ) THEN -C *** Here for no edge effects +! *** Here for no edge effects Yyy1xx = Ect*Ggg Yyy1zz = Zero -C +! IF (Nnpar.NE.0 .AND. Ksolve.NE.2) THEN -C *** Calculate pieces to add to deriv +! *** Calculate pieces to add to deriv CALL Getg_Derivatives (Exp1) Cgt = Capt*Ggg/Totalp Dp = Ect* ( Dggbdp - Ggg/Totalp ) Ds = Ect* ( Dggads + Dggbds ) DO J=1,Nnpar IF (J.NE.Kv) THEN - Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + - * Dtotsi(J,Nn)*Ds + Dt(J)*Dp + Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + & + Dtotsi(J,Nn)*Ds + Dt(J)*Dp END IF END DO IF (Kvthck.GT.0) Dyy1xx(Kv) = Ect*(Dggadn+Dggbdn) END IF -C +! ELSE -C -C *** Here do edge effects; numerical differentiation -C *** Interpolate Costhe on Ftheta(Jth) and Totalp on Xtpt_W(Jsig) -C *** to get Q = [Qfb at correct theta and E'] -C *** Intrp=0 => interpolate on Costhe; Intrp=1 => don't - CALL X_Trpths_Quad (A, Ftheta, Knthet, Jfb, Jth, Itntrp, Nn, - * Nxtptwn) +! +! *** Here do edge effects; numerical differentiation +! *** Interpolate Costhe on Ftheta(Jth) and Totalp on Xtpt_W(Jsig) +! *** to get Q = [Qfb at correct theta and E'] +! *** Intrp=0 => interpolate on Costhe; Intrp=1 => don't + CALL X_Trpths_Quad (A, Ftheta, Knthet, Jfb, Jth, Itntrp, Nn, Nxtptwn) Gggb = Fz if ( Totalp.lt.multScat%getLogSigmaTotMin() ) then @@ -330,15 +336,15 @@ C *** Intrp=0 => interpolate on Costhe; Intrp=1 => don't call multScat%setLogSigmaTotMax( Totalp ) Xtmax = Totalp ! remove end if -C -C *** Figure piece to add to Yyy1; Note that Yyy1xx includes both -C *** infinite-slab term AND edge effects correction term. -C *** Variable Yyy1zz stores difference between infinite slab & edge -C *** for use in array Yyy1fb, which is for debug purposes only. +! +! *** Figure piece to add to Yyy1; Note that Yyy1xx includes both +! *** infinite-slab term AND edge effects correction term. +! *** Variable Yyy1zz stores difference between infinite slab & edge +! *** for use in array Yyy1fb, which is for debug purposes only. Ggg_Ab = Gggb Yyy1xx = Ect*Gggb -cz Yyy1zz = Ect*(Ggg-Gggb) -C +!z Yyy1zz = Ect*(Ggg-Gggb) +! Egt = Elas*Ggg_Ab/Totalp IF (Nnpar.NE.0 .AND. Ksolve.NE.2) THEN Cgt = Capt*Ggg_Ab/Totalp @@ -346,15 +352,17 @@ C Ds = Ect* (Dfz ) DO J=1,Nnpar IF (J.NE.Kv) THEN - Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + - * Dtotsi(J,Nn)*Ds + Dt(J)*Dp + Dyy1xx(J) = Delas(J) *Cgt + Dc(J)*Egt + & + Dtotsi(J,Nn)*Ds + Dt(J)*Dp END IF END DO IF (Kvthck.GT.0) Dyy1xx(Kv) = Ect*Dnfz END IF -C -C *** finished edge-effects +! +! *** finished edge-effects END IF -C +! RETURN END + +end module ssm_11_m \ No newline at end of file diff --git a/sammy/src/ssm/mssm12.f b/sammy/src/ssm/mssm12.f90 similarity index 62% rename from sammy/src/ssm/mssm12.f rename to sammy/src/ssm/mssm12.f90 index a0bdec299..caf1ccd27 100644 --- a/sammy/src/ssm/mssm12.f +++ b/sammy/src/ssm/mssm12.f90 @@ -1,33 +1,35 @@ -C -C -C ----------------------------------------------------------------- -C +! +module ssm_12_m + contains +! +! ----------------------------------------------------------------- +! SUBROUTINE Xsect (Delas, Ccclll, Dddlll, Rmass, Costhe, Elas, Iso) -C -C *** Purpose -- Generate center-of-mass differential elastic cross -C *** section for a fixed lab angle Theta (equivalent to -C *** com angle Alpha), and convert the diff. el. cross -C *** section to the lab -C +! +! *** Purpose -- Generate center-of-mass differential elastic cross +! *** section for a fixed lab angle Theta (equivalent to +! *** com angle Alpha), and convert the diff. el. cross +! *** section to the lab +! use fixedi_m use ifwrit_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Ccclll(Nnnsig,*), Dddlll(Nnnsig,Nnparx,*), Delas(*) DIMENSION Poly(20) DATA Zero /0.0d0/, One /1.0D0/, Two /2.0D0/ -C -C *** convert from theta to center-of-mass angle Cosalf=cos(Alpha) +! +! *** convert from theta to center-of-mass angle Cosalf=cos(Alpha) Sinth2 = One - Costhe**2 A = Rmass**2 - Sinth2 B = DSQRT(A) Cosalf = (Costhe*B-Sinth2)/Rmass A = (Costhe**2+A)/B Dadmu = (Two*Costhe+A)/Rmass -C *** Double-checked December 2001; same formulae but different -C *** programming for cosalf and dadmu as in mang1.f -C -C *** generate differential elastic cross section in c-o-m -C *** first: the Legendre polynomials +! *** Double-checked December 2001; same formulae but different +! *** programming for cosalf and dadmu as in mang1.f +! +! *** generate differential elastic cross section in c-o-m +! *** first: the Legendre polynomials Poly(1) = One IF (Lllmax.GT.1) THEN Poly(2) = Cosalf @@ -35,21 +37,20 @@ C *** first: the Legendre polynomials DO LL=2,Lllmax-1 EL = dFLOAT(LL-1) Twoel1 = Two*EL + One - Poly(LL+1) = (Cosalf*Twoel1*Poly(LL) - EL*Poly(LL-1))/ - * (EL + One) + Poly(LL+1) = (Cosalf*Twoel1*Poly(LL) - EL*Poly(LL-1)) / (EL + One) END DO END IF END IF -C *** now: add them up +! *** now: add them up S = Zero DO LL=1,Lllmax S = S + Ccclll(LL,Iso)*Poly(LL) END DO -C -C *** convert to lab ... +! +! *** convert to lab ... Elas = S*Dadmu -C -C *** derivatives... +! +! *** derivatives... IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO J=1,Nnpar Delas(J) = Zero @@ -61,28 +62,28 @@ C *** derivatives... END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Xsect21_Lin (Energb, Totsig, Capsig, Dtotsi, Dcapsi, - * Dt, Dc, Ep, Jj, Nx, Ientrp, Kdatb, Nn) -C -C *** Purpose -- Find total and capture cross sections & derivatives at -C *** scattered energy Ep using linear interpolation. -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Xsect21_Lin (Energb, Totsig, Capsig, Dtotsi, Dcapsi, & + Dt, Dc, Ep, Jj, Nx, Ientrp, Kdatb, Nn) +! +! *** Purpose -- Find total and capture cross sections & derivatives at +! *** scattered energy Ep using linear interpolation. +! use fixedi_m use ifwrit_m use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Energb(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), - * Dcapsi(Nx,*), Dt(*), Dc(*) -C -C + DIMENSION Energb(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), & + Dcapsi(Nx,*), Dt(*), Dc(*) +! +! IF (Intrp.EQ.0) THEN -C *** Here get cross sections and derivatives when Ep=Energb(Iep) -C *** (Intrp=0), or when Iep=1, so must use constant value +! *** Here get cross sections and derivatives when Ep=Energb(Iep) +! *** (Intrp=0), or when Iep=1, so must use constant value Totalp = Totsig(Iep) Capt = Capsig(Iep) IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN @@ -93,16 +94,16 @@ C *** (Intrp=0), or when Iep=1, so must use constant value Dc(J) = Dcapsi(J,Iep) END DO END IF -C +! ELSE -C -C *** Here Energb(Iep) < Ep < Energb(Iep+1) -C *** so get cross section at E'=Ep via linear interpolation +! +! *** Here Energb(Iep) < Ep < Energb(Iep+1) +! *** so get cross section at E'=Ep via linear interpolation A = Antrp2 B = Antrp3 Totalp = A*Totsig(Iep) + B*Totsig(Iep+1) Capt = A*Capsig(Iep) + B*Capsig(Iep+1) -C +! IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO J=1,Nnpar Dt(J) = A*Dtotsi(J,Iep) + B*Dtotsi(J,Iep+1) @@ -111,129 +112,129 @@ C Dc(J) = A*Dcapsi(J,Iep) + B*Dcapsi(J,Iep+1) END DO END IF -C +! END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Getg_Derivatives (Exp1) -C -C *** Purpose -- Generate pieces (Ggga and Gggb) of the integrand and -C *** derivatives thereof for the infinite-slab situation. -C *** This routine used only when derivatives are needed -C +! +! *** Purpose -- Generate pieces (Ggga and Gggb) of the integrand and +! *** derivatives thereof for the infinite-slab situation. +! *** This routine used only when derivatives are needed +! use fixedi_m use ifwrit_m use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Zero /0.0d0/, One /1.0d0/, Two /2.0d0/ -C -C *** -- Calculate F_{zRphi}^(0) for all values of Costhe +! +! *** -- Calculate F_{zRphi}^(0) for all values of Costhe Vv = Dthick*Total IF (Vv.LT.0.3d0) THEN -C *** *** Ggga = F_{zRphi}^(0) from Equation (D.12-14) in ssm manual +! *** *** Ggga = F_{zRphi}^(0) from Equation (D.12-14) in ssm manual Abc = Abcexp (-Vv, Ax, Bx, Cxxxxx, Dxxxxx, Ijklmn) Ggga = Ax*Dthick Dggads = (Bx-Ax)*Dthick**2 Dggadn = Abc ELSE -C *** *** Ggga = F_{zRphi}^(0) from Equation (D.7-9) in ssm manual +! *** *** Ggga = F_{zRphi}^(0) from Equation (D.7-9) in ssm manual Ggga = (One-Exp1)/Total Dggads =(Dthick*Exp1-Ggga)/Total Dggadn = Exp1 END IF -C -C *** -- Calculate F_{zRphi}^(1) for all values of Costhe (infinite-slab) +! +! *** -- Calculate F_{zRphi}^(1) for all values of Costhe (infinite-slab) Gggb = Zero Dggbds = Zero Dggbdp = Zero Dggbdn = Zero D = Total*Costhe - Totalp -C +! IF (Costhe.EQ.One) THEN -C *** ----- exactly forward -C *** *** Gggb = F_{zRphi}^(1) from Equations (D.30-33) +! *** ----- exactly forward +! *** *** Gggb = F_{zRphi}^(1) from Equations (D.30-33) Gggb = - Exp1*Dthick Dggbds = Dthick**2*Exp1/Two Dggbdp = Dthick**2*Exp1/Two Dggbdn = (Vv-One)*Exp1 -C +! ELSE IF (Costhe.EQ.Zero) THEN -C *** ----- sideways exactly +! *** ----- sideways exactly Gggb = Zero Dggbds = Zero Dggbdp = Zero Dggbdn = Zero -C +! ELSE IF (Costhe.GT.Zero) THEN -C *** ----- forward +! *** ----- forward Dn = Dthick*D/Costhe Ww = Dthick*Totalp/Costhe IF (dABS(Dn).LT.0.3d0) THEN -C *** *** Gggb = F_{zRphi}^(1) from Equation (D.24) (plus 27-29) +! *** *** Gggb = F_{zRphi}^(1) from Equation (D.24) (plus 27-29) Abc = Abcexp (Dn, Ax, Bx, Cxxxxx, Dxxxxx, Ijklmn) Gggb = -Exp1*Dthick * Ax Dggbds = Exp1*Dthick**2* Bx Dggbdp = Exp1*Dthick**2*(Ax-Bx)/Costhe Dggbdn = Exp1*((Ww-One)*Ax-Dn*Bx) ELSE -C *** *** Gggb = F_{zRphi}^(1) from Eq. (D.16) (with D.21,D.22,D.20) +! *** *** Gggb = F_{zRphi}^(1) from Eq. (D.16) (with D.21,D.22,D.20) Exp2 = dEXP(-Ww) Gggb = Costhe*(Exp1-Exp2)/D Dggbds = -Costhe*(Gggb+Dthick*Exp1)/D Dggbdp = (Gggb+Dthick*Exp2)/D Dggbdn = (-Total*Exp1*Costhe+Totalp*Exp2)/D END IF -C +! ELSE -C -C *** ----- backward +! +! *** ----- backward Dn = Dthick*D/Costhe Exp2 = dEXP(-Dn) IF (dABS(Dn).LT.0.3d0) THEN -C *** *** Gggb = F_{zRphi}^(1) from Eqs. (E.19,21,22,20) +! *** *** Gggb = F_{zRphi}^(1) from Eqs. (E.19,21,22,20) Abc = Abcexp (-Dn, Ax, Bx, Cxxxxx, Dxxxxx, Ijklmn) Gggb = - Dthick * Ax Dggbds = Dthick**2*(Ax-Bx) Dggbdp = - Dthick**2*(Ax-Bx)/Costhe Dggbdn = - Abc ELSE -C *** *** Gggb = F_{zRphi}^(1) from Equation (E.11,16,17,15) +! *** *** Gggb = F_{zRphi}^(1) from Equation (E.11,16,17,15) Gggb = Costhe*(Exp2-One)/D Dggbds = - Costhe*(Gggb+Dthick*Exp2)/D Dggbdp = (Gggb+Dthick*Exp2)/D Dggbdn = - Exp2 END IF END IF -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Xsect21_Quad (Energb, Totsig, Capsig, Dtotsi, Dcapsi, - * Dt, Dc, Ep, Jj, Nx, Ientrp, Kdatb, Nn) -C -C *** Purpose -- Find total and capture cross sections & derivatives at -C *** scattered energy Ep using quadratic interpolation -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Xsect21_Quad (Energb, Totsig, Capsig, Dtotsi, Dcapsi, & + Dt, Dc, Ep, Jj, Nx, Ientrp, Kdatb, Nn) +! +! *** Purpose -- Find total and capture cross sections & derivatives at +! *** scattered energy Ep using quadratic interpolation +! use fixedi_m use ifwrit_m use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Energb(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), - * Dcapsi(Nx,*), Dt(*), Dc(*) -C -C + DIMENSION Energb(*), Totsig(*), Capsig(*), Dtotsi(Nx,*), & + Dcapsi(Nx,*), Dt(*), Dc(*) +! +! IF (Intrp.EQ.0) THEN -C *** Here get cross sections and derivatives when Ep=Energb(Iep) -C *** (Intrp=0), or when Iep=1, so must use constant value +! *** Here get cross sections and derivatives when Ep=Energb(Iep) +! *** (Intrp=0), or when Iep=1, so must use constant value Totalp = Totsig(Iep) Capt = Capsig(Iep) IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN @@ -244,44 +245,44 @@ C *** (Intrp=0), or when Iep=1, so must use constant value Dc(J) = Dcapsi(J,Iep) END DO END IF -C -C +! +! ELSE -C -C +! +! IF (Iep.GT.1 .AND. Iep.LT.Kdatb-1) THEN -C ================================================================ -C *** Here Energb(Iep) < Ep < Energb(Iep+1) and 1<Iep<Kdatb-1 -C *** so get cross section at E'=Ep via two -C *** quadratic interpolations +! ================================================================ +! *** Here Energb(Iep) < Ep < Energb(Iep+1) and 1<Iep<Kdatb-1 +! *** so get cross section at E'=Ep via two +! *** quadratic interpolations B0 = Antrp1 B1 = Antrp2 B2 = Antrp3 B3 = Antrp4 - Totalp = B1*Totsig(Iep ) + B2*Totsig(Iep+1) - * + B0*Totsig(Iep-1) + B3*Totsig(Iep+2) - Capt = B1*Capsig(Iep ) + B2*Capsig(Iep+1) - * + B0*Capsig(Iep-1) + B3*Capsig(Iep+2) -C + Totalp = B1*Totsig(Iep ) + B2*Totsig(Iep+1) & + + B0*Totsig(Iep-1) + B3*Totsig(Iep+2) + Capt = B1*Capsig(Iep ) + B2*Capsig(Iep+1) & + + B0*Capsig(Iep-1) + B3*Capsig(Iep+2) +! IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO J=1,Nnpar - Dt(J) = B1*Dtotsi(J,Iep ) + B2*Dtotsi(J,Iep+1) - * + B0*Dtotsi(J,Iep-1) + B3*Dtotsi(J,Iep+2) + Dt(J) = B1*Dtotsi(J,Iep ) + B2*Dtotsi(J,Iep+1) & + + B0*Dtotsi(J,Iep-1) + B3*Dtotsi(J,Iep+2) END DO DO J=1,Nnpar - Dc(J) = B1*Dcapsi(J,Iep ) + B2*Dcapsi(J,Iep+1) - * + B0*Dcapsi(J,Iep-1) + B3*Dcapsi(J,Iep+2) + Dc(J) = B1*Dcapsi(J,Iep ) + B2*Dcapsi(J,Iep+1) & + + B0*Dcapsi(J,Iep-1) + B3*Dcapsi(J,Iep+2) END DO END IF -C ================================================================ +! ================================================================ ELSE -C *** Here Energb(Iep) < Ep < Energb(Iep+1) and 1=Iep or Iep=Kdatb-1 -C *** so get cross section at E'=Ep via linear interpolation +! *** Here Energb(Iep) < Ep < Energb(Iep+1) and 1=Iep or Iep=Kdatb-1 +! *** so get cross section at E'=Ep via linear interpolation A = Antrp2 B = Antrp3 Totalp = A*Totsig(Iep) + B*Totsig(Iep+1) Capt = A*Capsig(Iep) + B*Capsig(Iep+1) -C +! IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO J=1,Nnpar Dt(J) = A*Dtotsi(J,Iep) + B*Dtotsi(J,Iep+1) @@ -290,8 +291,10 @@ C Dc(J) = A*Dcapsi(J,Iep) + B*Dcapsi(J,Iep+1) END DO END IF -C +! END IF END IF RETURN END + +end module ssm_12_m \ No newline at end of file diff --git a/sammy/src/ssm/mssm13.f b/sammy/src/ssm/mssm13.f90 similarity index 52% rename from sammy/src/ssm/mssm13.f rename to sammy/src/ssm/mssm13.f90 index 8719d8d54..f10418043 100644 --- a/sammy/src/ssm/mssm13.f +++ b/sammy/src/ssm/mssm13.f90 @@ -1,19 +1,21 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Trpths1_Lin (Xtpt_W, Ftheta, Qfb, Dqfb, Knthet, Ifb, - * Jth, Itntrp, Nn, Nxtptwn) -C -C *** This version uses linear interpolation -C *** Interpolate on Qfb(Jsig,Jth,Ifb) to give -C *** Fz=Q((Total),Totalp,Costhe) -C *** where Total is already fixed via earlier interpolation -C *** Also evaluate Dfz = deriv (Qfb) wrt (Total) -C *** and Dpfz = deriv (Qfb) wrt (Totalp) -C *** and Dnfz = deriv (Qfb) wrt (Thickness) -C *** Note that all terms require interp over Totalp & Costhe -C +! +module ssm_13_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Trpths1_Lin (Xtpt_W, Ftheta, Qfb, Dqfb, Knthet, Ifb, & + Jth, Itntrp, Nn, Nxtptwn) +! +! *** This version uses linear interpolation +! *** Interpolate on Qfb(Jsig,Jth,Ifb) to give +! *** Fz=Q((Total),Totalp,Costhe) +! *** where Total is already fixed via earlier interpolation +! *** Also evaluate Dfz = deriv (Qfb) wrt (Total) +! *** and Dpfz = deriv (Qfb) wrt (Totalp) +! *** and Dnfz = deriv (Qfb) wrt (Thickness) +! *** Note that all terms require interp over Totalp & Costhe +! use fixedi_m use ifwrit_m use logic_ssm_common_m @@ -21,29 +23,29 @@ C use xsect_x_common_m use MultScatPars_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) -cx CHARACTER*1 Cha - DIMENSION Xtpt_W(Nxtptw), Ftheta(Ntheta), - * Qfb(Nxtptw,Ntheta,Nsqfb), Dqfb(Nxtptw,Ntheta,2) +!x CHARACTER*1 Cha + DIMENSION Xtpt_W(Nxtptw), Ftheta(Ntheta), & + Qfb(Nxtptw,Ntheta,Nsqfb), Dqfb(Nxtptw,Ntheta,2) DATA Zero /0.0d0/, One /1.0d0/ -C +! Iwhich = Ifb L = Nsqfb Ith = Jth Ccc = Costhe IF (Costhe.LT.Zero) Ccc = -Costhe -C +! V = Total U = Totalp Tt = dLOG(U) -C +! IF (Tt.LT.Xtpt_W(1) .OR. Tt.GT.Xtpt_W(Nxtptw)) THEN Msig = 0 Interp_Small_Times = Interp_Small_Times + 1 IF (Interp_Small_Times.LE.10) THEN WRITE (6,10100) Tt, Xtpt_W(1), Xtpt_W(Nxtptw) WRITE (21,10100) Tt, Xtpt_W(1), Xtpt_W(Nxtptw) -10100 FORMAT (' Trying to interpolate outside the range', - * /, ' dlog(Totalp) =', 1PG14.6, ', Limits are', 1P2G14.6) +10100 FORMAT (' Trying to interpolate outside the range', & + /, ' dlog(Totalp) =', 1PG14.6, ', Limits are', 1P2G14.6) END IF Fz = Zero Dfz = Zero @@ -51,21 +53,21 @@ C Dnfz = Zero RETURN END IF -C -C -C ********************************************************************** -C *** Find interpolator on Totalp wrt Xtpt_W -C ********************************************************************** +! +! +! ********************************************************************** +! *** Find interpolator on Totalp wrt Xtpt_W +! ********************************************************************** CALL Where (Xtpt_W, Tt, Nxtptwn, Nxtptw, M) -C *** Xtpt_W(m) < tt < Xtpt_W(m+1) +! *** Xtpt_W(m) < tt < Xtpt_W(m+1) CALL Get_W_Coef_2 (Xtpt_W, Tt, Nxtptw, M, C0a, C1a, D0a, D1a) Mm = M -C -C +! +! IF (Itntrp.NE.0) THEN -C -C ******************************************************************* -C *** First, when no interpolation on Ftheta is needed: +! +! ******************************************************************* +! *** First, when no interpolation on Ftheta is needed: IF (Ftheta(Ith).EQ.One) THEN Fz = Zero IF (Ksolvx.NE.2) THEN @@ -77,34 +79,34 @@ C *** First, when no interpolation on Ftheta is needed: CALL Get_Ffz_2 (Qfb, Ffz, Dnfzz, C0a, C1a, Mm, Ith,Iwhich,L) Fz = Get_Exp (Ffz) IF (Nsqfb.EQ.4) Dnfz = Get_Exp (Dnfzz) -cx cha='c' +!x cha='c' IF (Ksolvx.NE.2) THEN CALL Get_Ffz_2 (Dqfb, Dfv, X, C0a, C1a, Mm, Ith,Iwhich,2) Dfv = - Get_Exp (Dfv) -C *** Dfv is deriv (e^Qfb) wrt Total, interpolated on Totalp +! *** Dfv is deriv (e^Qfb) wrt Total, interpolated on Totalp CALL Get_Ffz_2 (Qfb, Dfw, X, D0a, D1a, Mm, Ith, Iwhich,2) IF (Dfw.EQ.-8000.0D0) THEN Dfw = Zero ELSE Dfw = Dfw*Fz/Totalp -C *** Dfw = d(e^Q)/d(U) = dQ/d(Tt) e^Q d(Tt)/d(Totalp) -C *** where Fz=e^Q and d(Tt)/d(Totalp) = 1/Totalp -C *** dQ/d(Tt) is found from deriv of interpolation +! *** Dfw = d(e^Q)/d(U) = dQ/d(Tt) e^Q d(Tt)/d(Totalp) +! *** where Fz=e^Q and d(Tt)/d(Totalp) = 1/Totalp +! *** dQ/d(Tt) is found from deriv of interpolation END IF END IF END IF -C -C ******************************************************************* +! +! ******************************************************************* ELSE -C ******************************************************************* -C -C *** Here have to interpolate on Costhe as well as Totalp +! ******************************************************************* +! +! *** Here have to interpolate on Costhe as well as Totalp CALL Where (Ftheta, Ccc, Knthet, multScat%getNumTheta(), Mth) -C *** Now we know that Ftheta(mth) < Ccc < Ftheta(mth+1) -C -C **************************************************************** +! *** Now we know that Ftheta(mth) < Ccc < Ftheta(mth+1) +! +! **************************************************************** IF (Mth.LT.multScat%getNumTheta()-1) THEN -C **************************************************************** +! **************************************************************** Ith = Mth C10 = Ftheta(Mth+1) - Ftheta(Mth ) D0 = (Ftheta(Mth+1)-Ccc)/C10 @@ -115,47 +117,47 @@ C **************************************************************** IF (L.EQ.4) THEN Dnfz = Get_Exp_X_2 (Dnfzz, An, Bn, D0, D1) END IF -cx cha='d' -C +!x cha='d' +! IF (Ksolvx.NE.2) THEN CALL Get_Ffz_2 (Dqfb, Aa, X, C0a, C1a, Mm,Mth ,Iwhich,2) CALL Get_Ffz_2 (Dqfb, Bb, X, C0a, C1a, Mm,Mth+1,Iwhich,2) Dfv = - Get_Exp_X_2 (Dfv, Aa, Bb, D0, D1) -C +! CALL Get_Ffz_2 (Qfb, Aa, X, D0a, D1a, Mm, Mth ,Iwhich,2) CALL Get_Ffz_2 (Qfb, Bb, X, D0a, D1a, Mm, Mth+1,Iwhich,2) Dfw = D0*Aa + D1*Bb Dfw = Dfw*Fz/Totalp -C *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/D(Total) -C *** where Fz=e^Q; note that d(Tt)/d(Total) = 1/Total +! *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/D(Total) +! *** where Fz=e^Q; note that d(Tt)/d(Total) = 1/Total END IF -C -C **************************************************************** +! +! **************************************************************** ELSE -C ELSE IF (Mth.GE.Ntheta-1) THEN -C **************************************************************** -C jmb - Ntheta = multScat%getNumTheta() -C -C *** Interpolate on Ntheta-1 and Ntheta, using proportionality -C *** to tan(theta) -C *** Remember that the Ntheta value of Q is really calculated at -C *** Costhe = 0.9d0 + Ftheta(Ntheta-1)*0.1d0 -C *** That is, if G = e^(-Q)/tan(Theta), then interpolate on G -C *** and then set Fz = G_interpolated * tan(Theta) - Fth = 0.9d0*Ftheta(multScat%getNumTheta()) + - * Ftheta(multScat%getNumTheta()-1)*0.1d0 +! ELSE IF (Mth.GE.Ntheta-1) THEN +! **************************************************************** +! jmb - Ntheta = multScat%getNumTheta() +! +! *** Interpolate on Ntheta-1 and Ntheta, using proportionality +! *** to tan(theta) +! *** Remember that the Ntheta value of Q is really calculated at +! *** Costhe = 0.9d0 + Ftheta(Ntheta-1)*0.1d0 +! *** That is, if G = e^(-Q)/tan(Theta), then interpolate on G +! *** and then set Fz = G_interpolated * tan(Theta) + Fth = 0.9d0*Ftheta(multScat%getNumTheta()) + & + Ftheta(multScat%getNumTheta()-1)*0.1d0 C0 = Fth - Ftheta(multScat%getNumTheta()-1) D0 = (Fth-Ccc)/C0 D1 = (Ccc-Ftheta(multScat%getNumTheta()-1))/C0 Tta = dSQRT(One-Fth**2)/Fth - Ttb = dSQRT(One-Ftheta(multScat%getNumTheta()-1)**2) / - * Ftheta(multScat%getNumTheta()-1) + Ttb = dSQRT(One-Ftheta(multScat%getNumTheta()-1)**2) / & + Ftheta(multScat%getNumTheta()-1) Ttt = dSQRT(One-Ccc**2)/Ccc -C - CALL Get_Ffz_2 (Qfb, Aa, An, C0a, C1a, Mm, - * multScat%getNumTheta() ,Iwhich,L) - CALL Get_Ffz_2 (Qfb, Bb, Bn, C0a, C1a, Mm, - * multScat%getNumTheta()-1,Iwhich,L) +! + CALL Get_Ffz_2 (Qfb, Aa, An, C0a, C1a, Mm, & + multScat%getNumTheta() ,Iwhich,L) + CALL Get_Ffz_2 (Qfb, Bb, Bn, C0a, C1a, Mm, & + multScat%getNumTheta()-1,Iwhich,L) Aa = Get_Exp (Aa) /Tta Bb = Get_Exp (Bb) /Ttb Fz = D1*Aa + D0*Bb @@ -166,65 +168,65 @@ C Dnfz = D1*An + D0*Bn DnFz = Dnfz*Ttt END IF -cx cha='f' -C +!x cha='f' +! IF (Ksolvx.NE.2) THEN - CALL Get_Ffz_2 (Dqfb, Daa, X, C0a, C1a, Mm, - * multScat%getNumTheta(), Iwhich, 2) - CALL Get_Ffz_2 (Dqfb, Dbb, X, C0a, C1a, Mm, - * multScat%getNumTheta()-1, Iwhich, 2) + CALL Get_Ffz_2 (Dqfb, Daa, X, C0a, C1a, Mm, & + multScat%getNumTheta(), Iwhich, 2) + CALL Get_Ffz_2 (Dqfb, Dbb, X, C0a, C1a, Mm, & + multScat%getNumTheta()-1, Iwhich, 2) Daa = Get_Exp (Daa) /Tta Dbb = Get_Exp (Dbb) /Ttb Dfv = D1*Daa + D0*Dbb Dfv = - Dfv*Ttt -c???????????????? negative is correct, methinks -C - CALL Get_Ffz_2 (Qfb, Daa, X, D0a, D1a, Mm, - * multScat%getNumTheta() , Iwhich, 2) - CALL Get_Ffz_2 (Qfb, Dbb, X, D0a, D1a, Mm, - * multScat%getNumTheta()-1, Iwhich, 2) +!???????????????? negative is correct, methinks +! + CALL Get_Ffz_2 (Qfb, Daa, X, D0a, D1a, Mm, & + multScat%getNumTheta() , Iwhich, 2) + CALL Get_Ffz_2 (Qfb, Dbb, X, D0a, D1a, Mm, & + multScat%getNumTheta()-1, Iwhich, 2) Daa = Get_Exp (Daa) Dbb = Get_Exp (Dbb) Dfw = D1*Daa*Aa + D0*Dbb*Bb Dfw = Dfw /Totalp * Ttt -C *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/D(Totalp) -C *** where Fz=e^Q and d(Tt)/d(U) = 1/Totalp +! *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/D(Totalp) +! *** where Fz=e^Q and d(Tt)/d(U) = 1/Totalp END IF -C **************************************************************** +! **************************************************************** END IF -C ******************************************************************* +! ******************************************************************* END IF -C ********************************************************************** -C -C -C *** OK, now we have Fz = contribution from integrals #4 & 5 of Eq. (35), -C *** for a given mu [ergo, given Total =Sigma_Total(E ), -C *** Totalp=Sigma_Total(E'), & -C *** cos(theta) which corresponds to E'] -C +! ********************************************************************** +! +! +! *** OK, now we have Fz = contribution from integrals #4 & 5 of Eq. (35), +! *** for a given mu [ergo, given Total =Sigma_Total(E ), +! *** Totalp=Sigma_Total(E'), & +! *** cos(theta) which corresponds to E'] +! IF (Ksolvx.NE.2) THEN Dfz = Dfv Dpfz = Dfw IF (Kvthck.GT.0) THEN IF (Iwhich.EQ.1) THEN Dnfz = Dnfz - Total*Fz -CC ELSE -CC Dnfz = Dnfz +!C ELSE +!C Dnfz = Dnfz END IF END IF END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Get_W_Coef_2 (Xtpt_W, Tt, Nxtptw, M, C0a, C1a, D0a,D1a) -C *** Purpose -- Figure coefficients for interpolation +! *** Purpose -- Figure coefficients for interpolation IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION Xtpt_W(Nxtptw) DATA One /1.0d0/ -C *** Use linear interpolation +! *** Use linear interpolation Mm = M A10 = Xtpt_W(Mm+1) - Xtpt_W(Mm) C0a = (Xtpt_W(Mm+1)-Tt)/A10 @@ -233,36 +235,36 @@ C *** Use linear interpolation D1a = One/A10 RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Get_Ffz_2 (Qfb, Ffz, Fnz, D0a, D1a, Mm, Ith,Iwhich,Nxx) use fixedi_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Qfb(Nxtptw,Ntheta,*) - IF (Qfb(Mm ,Ith,Iwhich).GT.-8000.0D0 .AND. - * Qfb(Mm+1,Ith,Iwhich).GT.-8000.0D0) THEN - Ffz = D0a*Qfb(Mm ,Ith,Iwhich) - * + D1a*Qfb(Mm+1,Ith,Iwhich) + IF (Qfb(Mm ,Ith,Iwhich).GT.-8000.0D0 .AND. & + Qfb(Mm+1,Ith,Iwhich).GT.-8000.0D0) THEN + Ffz = D0a*Qfb(Mm ,Ith,Iwhich) & + + D1a*Qfb(Mm+1,Ith,Iwhich) ELSE Ffz = -8000. END IF IF (Nxx.EQ.4) THEN - IF (Qfb(Mm ,Ith,Iwhich+2).GT.-8000.0D0 .AND. - * Qfb(Mm+1,Ith,Iwhich+2).GT.-8000.0D0) THEN - Fnz = D0a*Qfb(Mm ,Ith,Iwhich+2) - * + D1a*Qfb(Mm+1,Ith,Iwhich+2) + IF (Qfb(Mm ,Ith,Iwhich+2).GT.-8000.0D0 .AND. & + Qfb(Mm+1,Ith,Iwhich+2).GT.-8000.0D0) THEN + Fnz = D0a*Qfb(Mm ,Ith,Iwhich+2) & + + D1a*Qfb(Mm+1,Ith,Iwhich+2) ELSE Fnz = -8000. END IF END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! DOUBLE PRECISION FUNCTION Get_Exp (Ffz) IMPLICIT REAL*8 (A-H,O-Z) DATA Zero /0.0d0/ @@ -274,10 +276,10 @@ C Get_Exp = Fz RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! DOUBLE PRECISION FUNCTION Get_Exp_X_2 (Ffz, Aa, Bb, D0, D1) IMPLICIT REAL*8 (A-H,O-Z) DATA Zero /0.0d0/ @@ -290,3 +292,5 @@ C Get_Exp_X_2 = Fz RETURN END + +end module ssm_13_m \ No newline at end of file diff --git a/sammy/src/ssm/mssm14.f b/sammy/src/ssm/mssm14.f90 similarity index 55% rename from sammy/src/ssm/mssm14.f rename to sammy/src/ssm/mssm14.f90 index 5e01699a8..12b8eb3f3 100644 --- a/sammy/src/ssm/mssm14.f +++ b/sammy/src/ssm/mssm14.f90 @@ -1,52 +1,55 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Trpths1_Quad (Xtpt_W, Ftheta, Qfb, Dqfb, Knthet, Ifb, - * Jth, Itntrp, Nn, Nxtptwn) -C -C *** Quadratic interpolate on Qfb(Jsig,Jth,Ifb) to give -C *** Fz=Q((Total),Totalp,Costhe) -C *** where Total is already fixed via earlier interpolation -C *** Also evaluate Dfz = deriv (Qfb) wrt (Total) -C *** and Dpfz = deriv (Qfb) wrt (Totalp) -C *** and Dnfz = deriv (Qfb) wrt (Thickness) -C *** Note that all terms require interp over Totalp & Costhe -C +! +module ssm_14_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Trpths1_Quad (Xtpt_W, Ftheta, Qfb, Dqfb, Knthet, Ifb, & + Jth, Itntrp, Nn, Nxtptwn) +! +! *** Quadratic interpolate on Qfb(Jsig,Jth,Ifb) to give +! *** Fz=Q((Total),Totalp,Costhe) +! *** where Total is already fixed via earlier interpolation +! *** Also evaluate Dfz = deriv (Qfb) wrt (Total) +! *** and Dpfz = deriv (Qfb) wrt (Totalp) +! *** and Dnfz = deriv (Qfb) wrt (Thickness) +! *** Note that all terms require interp over Totalp & Costhe +! use fixedi_m use ifwrit_m use logic_ssm_common_m use ssssss_common_m use xsect_x_common_m use MultScatPars_common_m + use ssm_13_m IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Xtpt_W(Nxtptw), Ftheta(Ntheta), - * Qfb(Nxtptw,Ntheta,Nsqfb), Dqfb(Nxtptw,Ntheta,2) + DIMENSION Xtpt_W(Nxtptw), Ftheta(Ntheta), & + Qfb(Nxtptw,Ntheta,Nsqfb), Dqfb(Nxtptw,Ntheta,2) DATA Zero /0.0d0/, One /1.0d0/ -C +! Fz = Zero Dfz = Zero Dpfz = Zero Dnfz = Zero -C +! L = Nsqfb Iwhich = Ifb Ith = Jth Ccc = Costhe IF (Costhe.LT.Zero) Ccc = -Costhe -C +! V = Total U = Totalp Tt = dLOG(U) -C +! IF (Tt.LT.Xtpt_W(1) .OR. Tt.GT.Xtpt_W(Nxtptw)) THEN Msig = 0 Interp_Small_Times = Interp_Small_Times + 1 IF (Interp_Small_Times.LE.10) THEN WRITE (6,10100) Tt, Xtpt_W(1), Xtpt_W(Nxtptw) WRITE (21,10100) Tt, Xtpt_W(1), Xtpt_W(Nxtptw) -10100 FORMAT (' Trying to interpolate outside the range', - * /, ' dlog(Totalp) =', 1PG14.6, ', Limits are', 1P2G14.6) +10100 FORMAT (' Trying to interpolate outside the range', & + /, ' dlog(Totalp) =', 1PG14.6, ', Limits are', 1P2G14.6) END IF Fz = Zero Dfz = Zero @@ -54,42 +57,42 @@ C Dnfz = Zero RETURN END IF -C -C -C ********************************************************************** -C *** Find interpolator on Totalp wrt Xtpt_W -C ********************************************************************** +! +! +! ********************************************************************** +! *** Find interpolator on Totalp wrt Xtpt_W +! ********************************************************************** CALL Where (Xtpt_W, Tt, Nxtptwn, Nxtptw, M) -C *** Xtpt_W(m) < tt < Xtpt_W(m+1) - CALL Get_W_Coef (Xtpt_W, Tt, Nxtptw, M, C0a, C1a, - * C2a, C1b, C2b, C3b, D0a, D1a, D2a, D1b, D2b, D3b) +! *** Xtpt_W(m) < tt < Xtpt_W(m+1) + CALL Get_W_Coef (Xtpt_W, Tt, Nxtptw, M, C0a, C1a, & + C2a, C1b, C2b, C3b, D0a, D1a, D2a, D1b, D2b, D3b) Mm = M -C -C +! +! IF (Itntrp.NE.0) THEN -C -C ******************************************************************* -C *** First, when no interpolation on Ftheta is needed: +! +! ******************************************************************* +! *** First, when no interpolation on Ftheta is needed: IF (Ftheta(Ith).NE.One) THEN - CALL Get_Ffz (Qfb, Ffz, Dnfzz, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Ith, Iwhich, L) + CALL Get_Ffz (Qfb, Ffz, Dnfzz, C0a, C1a, C2a, C1b, C2b, C3b, & + Mm, Ith, Iwhich, L) Fz = Get_Exp (Ffz) IF (Kvthck.GT.0) Dnfz = Get_Exp (Dnfzz) -C +! IF (Ksolvx.NE.2) THEN - CALL Get_Ffz (Dqfb, Dfv, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Ith, Iwhich, 2) + CALL Get_Ffz (Dqfb, Dfv, X, C0a, C1a, C2a, C1b, C2b, C3b, & + Mm, Ith, Iwhich, 2) Dfv = - Get_Exp (Dfv) -C *** Dfv is deriv (e^Qfb) wrt Total, interpolated on Totalp - CALL Get_Ffz (Qfb, Dfw, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Ith, Iwhich, 2) +! *** Dfv is deriv (e^Qfb) wrt Total, interpolated on Totalp + CALL Get_Ffz (Qfb, Dfw, X, D0a, D1a, D2a, D1b, D2b, D3b, & + Mm, Ith, Iwhich, 2) IF (Dfw.EQ.-8000.0D0) THEN Dfw = Zero ELSE Dfw = Dfw*Fz/Totalp -C *** Dfw = d(e^Q)/d(U) = dQ/d(Tt) e^Q d(Tt)/d(Totalp) -C *** where Fz=e^Q and d(Tt)/d(Totalp) = 1/Totalp -C *** dQ/d(Tt) is found from deriv of interpolation +! *** Dfw = d(e^Q)/d(U) = dQ/d(Tt) e^Q d(Tt)/d(Totalp) +! *** where Fz=e^Q and d(Tt)/d(Totalp) = 1/Totalp +! *** dQ/d(Tt) is found from deriv of interpolation END IF END IF ELSE @@ -97,20 +100,20 @@ C *** dQ/d(Tt) is found from deriv of interpolation Dfw = Zero Dfv = Zero END IF -C -C ******************************************************************* +! +! ******************************************************************* ELSE -C ******************************************************************* -C -C *** Here have to interpolate on Costhe as well as Totalp +! ******************************************************************* +! +! *** Here have to interpolate on Costhe as well as Totalp CALL Where (Ftheta, Ccc, Knthet, multScat%getNumTheta(), Mth) -C *** Now we know that Ftheta(mth) < Ccc < Ftheta(mth+1) -C *** We'll (usually) do quadratic interpolation, not always -C -C **************************************************************** +! *** Now we know that Ftheta(mth) < Ccc < Ftheta(mth+1) +! *** We'll (usually) do quadratic interpolation, not always +! +! **************************************************************** IF (Mth.EQ.1) THEN -C **************************************************************** -C *** Here Ftheta(1) = Zero and curve is very sharp +! **************************************************************** +! *** Here Ftheta(1) = Zero and curve is very sharp Ith = Mth C10 = Ftheta(Mth+1) - Ftheta(Mth ) C21 = Ftheta(Mth+2) - Ftheta(Mth+1) @@ -119,46 +122,46 @@ C *** Here Ftheta(1) = Zero and curve is very sharp D0 = (Ftheta(Mth+2)-Ccc)/C20 * (Ftheta(Mth+1)-Ccc)/C10 D1 = (Ftheta(Mth+2)-Ccc)/C21 * (Ccc-Ftheta(Mth ))/C10 D2 = (Ccc-Ftheta(Mth+1))/C21 * (Ccc-Ftheta(Mth ))/C20 - CALL Get_Ffz (Qfb, Aa, An, C0a, C1a, C2a, C1b, C2b, C3b, Mm, - * Mth , Iwhich, L) - CALL Get_Ffz (Qfb, Bb, Bn, C0a, C1a, C2a, C1b, C2b, C3b, Mm, - * Mth+1, Iwhich, L) - CALL Get_Ffz (Qfb, Dd, Dn, C0a, C1a, C2a, C1b, C2b, C3b, Mm, - * Mth+2, Iwhich, L) + CALL Get_Ffz (Qfb, Aa, An, C0a, C1a, C2a, C1b, C2b, C3b, Mm, & + Mth , Iwhich, L) + CALL Get_Ffz (Qfb, Bb, Bn, C0a, C1a, C2a, C1b, C2b, C3b, Mm, & + Mth+1, Iwhich, L) + CALL Get_Ffz (Qfb, Dd, Dn, C0a, C1a, C2a, C1b, C2b, C3b, Mm, & + Mth+2, Iwhich, L) Ffz = D0*Aa + D1*Bb + D2*Dd Fz = Get_Exp_X (Ffz, Aa, Bb, Dd) IF (Kvthck.GT.0) THEN Dnfzz = D0*An + D1*Bn + D2*Dn Dnfz = Get_Exp_X (Dnfzz, An, Bn, Dn) END IF -C +! IF (Ksolvx.NE.2) THEN - CALL Get_Ffz (Dqfb, Aa, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth, Iwhich, 2) - CALL Get_Ffz (Dqfb, Bb, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth+1, Iwhich, 2) - CALL Get_Ffz (Dqfb, Dd, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth+2, Iwhich, 2) + CALL Get_Ffz (Dqfb, Aa, X, C0a, C1a, C2a, C1b, C2b, C3b, & + Mm, Mth, Iwhich, 2) + CALL Get_Ffz (Dqfb, Bb, X, C0a, C1a, C2a, C1b, C2b, C3b, & + Mm, Mth+1, Iwhich, 2) + CALL Get_Ffz (Dqfb, Dd, X, C0a, C1a, C2a, C1b, C2b, C3b, & + Mm, Mth+2, Iwhich, 2) Dfv = D0*Aa + D1*Bb + D2*Dd Dfv = - Get_Exp_X (Dfv, Aa, Bb, Dd) -C - CALL Get_Ffz (Qfb, Aa, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Mth, Iwhich, 2) - CALL Get_Ffz (Qfb, Bb, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Mth+1, Iwhich, 2) - CALL Get_Ffz (Qfb, Dd, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Mth+2, Iwhich, 2) +! + CALL Get_Ffz (Qfb, Aa, X, D0a, D1a, D2a, D1b, D2b, D3b, & + Mm, Mth, Iwhich, 2) + CALL Get_Ffz (Qfb, Bb, X, D0a, D1a, D2a, D1b, D2b, D3b, & + Mm, Mth+1, Iwhich, 2) + CALL Get_Ffz (Qfb, Dd, X, D0a, D1a, D2a, D1b, D2b, D3b, & + Mm, Mth+2, Iwhich, 2) Dfw = D0*Aa + D1*Bb + D2*Dd Dfw = Dfw*Fz/Totalp -C *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/D(Total) -C *** where Fz=e^Q; note that d(Tt)/d(Total) = 1/Total +! *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/D(Total) +! *** where Fz=e^Q; note that d(Tt)/d(Total) = 1/Total END IF -C -C **************************************************************** +! +! **************************************************************** ELSE IF (Mth.LT.multScat%getNumTheta()-2) THEN -C **************************************************************** -C -C *** Here we can use the general quadratic formula +! **************************************************************** +! +! *** Here we can use the general quadratic formula C0m = Ftheta(Mth ) - Ftheta(Mth-1) C10 = Ftheta(Mth+1) - Ftheta(Mth ) C1m = Ftheta(Mth+1) - Ftheta(Mth-1) @@ -170,58 +173,42 @@ C *** Here we can use the general quadratic formula A0b = (Ftheta(Mth+2)-Ccc)/C20*(Ftheta(Mth+1)-Ccc)/C10 A1b = (Ftheta(Mth+2)-Ccc)/C21*(Ccc-Ftheta(Mth ))/C10 A2b = (Ccc-Ftheta(Mth+1))/C21*(Ccc-Ftheta(Mth ))/C20 -C - CALL Get_Ffz (Qfb, Cc, Cn, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth-1, Iwhich, L) - CALL Get_Ffz (Qfb, Aa, An, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth , Iwhich, L) - CALL Get_Ffz (Qfb, Bb, Bn, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth+1, Iwhich, L) - CALL Get_Ffz (Qfb, Dd, Dn, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth+2, Iwhich, L) - CALL Get_Ffz_1 (Fz, Cc, Aa, Bb, Dd, Ama, A0a, A1a, - * A0b, A1b, A2b) - IF (Kvthck.GT.0) CALL Get_Ffz_1 (Dnfz, Cn, An, Bn, Dn, Ama, - * A0a, A1a, A0b, A1b, A2b) -C +! + CALL Get_Ffz (Qfb, Cc, Cn, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth-1, Iwhich, L) + CALL Get_Ffz (Qfb, Aa, An, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth , Iwhich, L) + CALL Get_Ffz (Qfb, Bb, Bn, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth+1, Iwhich, L) + CALL Get_Ffz (Qfb, Dd, Dn, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth+2, Iwhich, L) + CALL Get_Ffz_1 (Fz, Cc, Aa, Bb, Dd, Ama, A0a, A1a, A0b, A1b, A2b) + IF (Kvthck.GT.0) CALL Get_Ffz_1 (Dnfz, Cn, An, Bn, Dn, Ama, A0a, A1a, A0b, A1b, A2b) +! IF (Ksolvx.NE.2) THEN - CALL Get_Ffz (Dqfb, Cc, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth-1, Iwhich, 2) - CALL Get_Ffz (Dqfb, Aa, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth , Iwhich, 2) - CALL Get_Ffz (Dqfb, Bb, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth+1, Iwhich, 2) - CALL Get_Ffz (Dqfb, Dd, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth+2, Iwhich, 2) - CALL Get_Ffz_1 (Dfv, Cc, Aa, Bb, Dd, Ama, A0a, A1a, - * A0b, A1b, A2b) + CALL Get_Ffz (Dqfb, Cc, X, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth-1, Iwhich, 2) + CALL Get_Ffz (Dqfb, Aa, X, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth , Iwhich, 2) + CALL Get_Ffz (Dqfb, Bb, X, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth+1, Iwhich, 2) + CALL Get_Ffz (Dqfb, Dd, X, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth+2, Iwhich, 2) + CALL Get_Ffz_1 (Dfv, Cc, Aa, Bb, Dd, Ama, A0a, A1a, A0b, A1b, A2b) Dfv = - Dfv -C - CALL Get_Ffz (Qfb, Cc, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Mth-1, Iwhich, 2) - CALL Get_Ffz (Qfb, Aa, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Mth , Iwhich, 2) - CALL Get_Ffz (Qfb, Bb, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Mth+1, Iwhich, 2) - CALL Get_Ffz (Qfb, Dd, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Mth+2, Iwhich, 2) - CALL Get_Ffz_3 (Dfw, Cc, Aa, Bb, Dd, Ama, A0a, A1a, - * A0b, A1b, A2b) +! + CALL Get_Ffz (Qfb, Cc, X, D0a, D1a, D2a, D1b, D2b, D3b, Mm, Mth-1, Iwhich, 2) + CALL Get_Ffz (Qfb, Aa, X, D0a, D1a, D2a, D1b, D2b, D3b, Mm, Mth , Iwhich, 2) + CALL Get_Ffz (Qfb, Bb, X, D0a, D1a, D2a, D1b, D2b, D3b, Mm, Mth+1, Iwhich, 2) + CALL Get_Ffz (Qfb, Dd, X, D0a, D1a, D2a, D1b, D2b, D3b, Mm, Mth+2, Iwhich, 2) + CALL Get_Ffz_3 (Dfw, Cc, Aa, Bb, Dd, Ama, A0a, A1a, A0b, A1b, A2b) Dfw = Dfw*Fz/Totalp -C *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/d(U) -C *** where Fz=e^Q and d(Tt)/d(Totalp) = 1/Totalp +! *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/d(U) +! *** where Fz=e^Q and d(Tt)/d(Totalp) = 1/Totalp END IF -C -C **************************************************************** +! +! **************************************************************** ELSE IF (Mth.GE.multScat%getNumTheta()-2) THEN -C **************************************************************** -C +! **************************************************************** +! IF (Mth.GT.multScat%getNumTheta()-2) then Mth = multScat%getNumTheta() - 2 end if -C *** Here we can use the quadratic formula with different last point - Fth = 0.9d0*Ftheta(multScat%getNumTheta()) + - * Ftheta(multScat%getNumTheta()-1)*0.1d0 +! *** Here we can use the quadratic formula with different last point + Fth = 0.9d0*Ftheta(multScat%getNumTheta()) + & + Ftheta(multScat%getNumTheta()-1)*0.1d0 C0m = Ftheta(Mth ) - Ftheta(Mth-1) C10 = Ftheta(Mth+1) - Ftheta(Mth ) C1m = Ftheta(Mth+1) - Ftheta(Mth-1) @@ -233,73 +220,55 @@ C *** Here we can use the quadratic formula with different last point A0b = (Fth -Ccc)/C20*(Ftheta(Mth+1)-Ccc)/C10 A1b = (Fth -Ccc)/C21*(Ccc-Ftheta(Mth ))/C10 A2b = (Ccc-Ftheta(Mth+1))/C21*(Ccc-Ftheta(Mth ))/C20 -C - CALL Get_Ffz (Qfb, Cc, Cn, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth-1, Iwhich, L) - CALL Get_Ffz (Qfb, Aa, An, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth , Iwhich, L) - CALL Get_Ffz (Qfb, Bb, Bn, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth+1, Iwhich, L) - CALL Get_Ffz (Qfb, Dd, Dn, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth+2, Iwhich, L) - CALL Get_Ffz_1 (Fz, Cc, Aa, Bb, Dd, Ama, A0a, A1a, - * A0b, A1b, A2b) - IF (Kvthck.GT.0) CALL Get_Ffz_1 (Dnfz, Cn, An, Bn, Dn, Ama, - * A0a, A1a, A0b, A1b, A2b) -C +! + CALL Get_Ffz (Qfb, Cc, Cn, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth-1, Iwhich, L) + CALL Get_Ffz (Qfb, Aa, An, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth , Iwhich, L) + CALL Get_Ffz (Qfb, Bb, Bn, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth+1, Iwhich, L) + CALL Get_Ffz (Qfb, Dd, Dn, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth+2, Iwhich, L) + CALL Get_Ffz_1 (Fz, Cc, Aa, Bb, Dd, Ama, A0a, A1a, A0b, A1b, A2b) + IF (Kvthck.GT.0) CALL Get_Ffz_1 (Dnfz, Cn, An, Bn, Dn, Ama, A0a, A1a, A0b, A1b, A2b) +! IF (Ksolvx.NE.2) THEN - CALL Get_Ffz (Dqfb, Cc, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth-1, Iwhich, 2) - CALL Get_Ffz (Dqfb, Aa, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth , Iwhich, 2) - CALL Get_Ffz (Dqfb, Bb, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth+1, Iwhich, 2) - CALL Get_Ffz (Dqfb, Dd, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, Mth+2, Iwhich, 2) - CALL Get_Ffz_1 (Dfv, Cc, Aa, Bb, Dd, Ama, A0a, A1a, - * A0b, A1b, A2b) + CALL Get_Ffz (Dqfb, Cc, X, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth-1, Iwhich, 2) + CALL Get_Ffz (Dqfb, Aa, X, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth , Iwhich, 2) + CALL Get_Ffz (Dqfb, Bb, X, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth+1, Iwhich, 2) + CALL Get_Ffz (Dqfb, Dd, X, C0a, C1a, C2a, C1b, C2b, C3b, Mm, Mth+2, Iwhich, 2) + CALL Get_Ffz_1 (Dfv, Cc, Aa, Bb, Dd, Ama, A0a, A1a, A0b, A1b, A2b) Dfv = - Dfv -C - CALL Get_Ffz (Qfb, Cc, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Mth-1, Iwhich, 2) - CALL Get_Ffz (Qfb, Aa, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Mth , Iwhich, 2) - CALL Get_Ffz (Qfb, Bb, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Mth+1, Iwhich, 2) - CALL Get_Ffz (Qfb, Dd, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Mth+2, Iwhich, 2) - CALL Get_Ffz_3 (Dfw, Cc, Aa, Bb, Dd, Ama, A0a, A1a, - * A0b, A1b, A2b) +! + CALL Get_Ffz (Qfb, Cc, X, D0a, D1a, D2a, D1b, D2b, D3b, Mm, Mth-1, Iwhich, 2) + CALL Get_Ffz (Qfb, Aa, X, D0a, D1a, D2a, D1b, D2b, D3b, Mm, Mth , Iwhich, 2) + CALL Get_Ffz (Qfb, Bb, X, D0a, D1a, D2a, D1b, D2b, D3b, Mm, Mth+1, Iwhich, 2) + CALL Get_Ffz (Qfb, Dd, X, D0a, D1a, D2a, D1b, D2b, D3b, Mm, Mth+2, Iwhich, 2) + CALL Get_Ffz_3 (Dfw, Cc, Aa, Bb, Dd, Ama, A0a, A1a, A0b, A1b, A2b) Dfw = Dfw*Fz/Totalp -C *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/d(U) -C *** where Fz=e^Q and d(Tt)/d(Totalp) = 1/Totalp +! *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/d(U) +! *** where Fz=e^Q and d(Tt)/d(Totalp) = 1/Totalp END IF -C -C **************************************************************** +! +! **************************************************************** ELSE IF (Mth.GT.multScat%getNumTheta()-2) THEN -C **************************************************************** -C jmb - Ntheta = multScat%getNumTheta() -C -C *** Interpolate on Ntheta-1 and Ntheta, using proportionality -C *** to tan(theta) -C *** Remember that the Ntheta value of Q is really calculated at -C *** Costhe = 0.9d0 + Ftheta(Ntheta-1)*0.1d0 -C *** That is, if G = e^(-Q)/tan(Theta), then interpolate on G -C *** and then set Fz = G_interpolated * tan(Theta) - Fth = 0.9d0*Ftheta(multScat%getNumTheta()) + - * Ftheta(multScat%getNumTheta()-1)*0.1d0 +! **************************************************************** +! jmb - Ntheta = multScat%getNumTheta() +! +! *** Interpolate on Ntheta-1 and Ntheta, using proportionality +! *** to tan(theta) +! *** Remember that the Ntheta value of Q is really calculated at +! *** Costhe = 0.9d0 + Ftheta(Ntheta-1)*0.1d0 +! *** That is, if G = e^(-Q)/tan(Theta), then interpolate on G +! *** and then set Fz = G_interpolated * tan(Theta) + Fth = 0.9d0*Ftheta(multScat%getNumTheta()) + & + Ftheta(multScat%getNumTheta()-1)*0.1d0 C0 = Fth - Ftheta(multScat%getNumTheta()-1) D0 = (Fth-Ccc)/C0 D1 = (Ccc-Ftheta(multScat%getNumTheta()-1))/C0 Tta = dSQRT(One-Fth**2)/Fth - Ttb = dSQRT(One-Ftheta(multScat%getNumTheta()-1)**2) / - * Ftheta(multScat%getNumTheta()-1) + Ttb = dSQRT(One-Ftheta(multScat%getNumTheta()-1)**2) / & + Ftheta(multScat%getNumTheta()-1) Ttt = dSQRT(One-Ccc**2)/Ccc -C - CALL Get_Ffz (Qfb, Aa, An, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, multScat%getNumTheta(), Iwhich, L) - CALL Get_Ffz (Qfb, Bb, Bn, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, multScat%getNumTheta()-1, Iwhich, L) +! + CALL Get_Ffz (Qfb, Aa, An, C0a, C1a, C2a, C1b, C2b, C3b, Mm, multScat%getNumTheta(), Iwhich, L) + CALL Get_Ffz (Qfb, Bb, Bn, C0a, C1a, C2a, C1b, C2b, C3b, Mm, multScat%getNumTheta()-1, Iwhich, L) Aa = Get_Exp (Aa) /Tta Bb = Get_Exp (Bb) /Ttb Fz = D1*Aa + D0*Bb @@ -310,60 +279,56 @@ C Dnfz = D1*An + D0*Bn Dnfz = Dnfz*Ttt END IF -C +! IF (Ksolvx.NE.2) THEN - CALL Get_Ffz (Dqfb, Daa, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, multScat%getNumTheta(), Iwhich, 2) - CALL Get_Ffz (Dqfb, Dbb, X, C0a, C1a, C2a, C1b, C2b, C3b, - * Mm, multScat%getNumTheta()-1, Iwhich, 2) + CALL Get_Ffz (Dqfb, Daa, X, C0a, C1a, C2a, C1b, C2b, C3b, Mm, multScat%getNumTheta(), Iwhich, 2) + CALL Get_Ffz (Dqfb, Dbb, X, C0a, C1a, C2a, C1b, C2b, C3b, Mm, multScat%getNumTheta()-1, Iwhich, 2) Daa = Get_Exp (Daa) /Tta Dbb = Get_Exp (Dbb) /Ttb Dfv = D1*Daa + D0*Dbb Dfv = Dfv*Ttt -C - CALL Get_Ffz (Qfb, Daa, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, multScat%getNumTheta(), Iwhich, 2) - CALL Get_Ffz (Qfb, Dbb, X, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, multScat%getNumTheta()-1, Iwhich, 2) +! + CALL Get_Ffz (Qfb, Daa, X, D0a, D1a, D2a, D1b, D2b, D3b, Mm, multScat%getNumTheta(), Iwhich, 2) + CALL Get_Ffz (Qfb, Dbb, X, D0a, D1a, D2a, D1b, D2b, D3b, Mm, multScat%getNumTheta()-1, Iwhich, 2) Daa = Get_Exp (Daa) Dbb = Get_Exp (Dbb) Dfw = D1*Daa*Aa + D0*Dbb*Bb Dfw = Dfw /Totalp * Ttt -C *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/D(Totalp) -C *** where Fz=e^Q and d(Tt)/d(U) = 1/Totalp +! *** Dfw = d(e^Q)/d(Totalp) = dQ/d(Tt) e^Q d(Tt)/D(Totalp) +! *** where Fz=e^Q and d(Tt)/d(U) = 1/Totalp END IF -C **************************************************************** +! **************************************************************** END IF -C ******************************************************************* +! ******************************************************************* END IF -C ********************************************************************** -C -C -C *** OK, now we have Fz = contribution from integrals #4 & 5 of Eq. (35), -C *** for a given mu [ergo, given Total =Sigma_Total(E ), -C *** Totalp=Sigma_Total(E'), & -C *** cos(theta) which corresponds to E'] -C +! ********************************************************************** +! +! +! *** OK, now we have Fz = contribution from integrals #4 & 5 of Eq. (35), +! *** for a given mu [ergo, given Total =Sigma_Total(E ), +! *** Totalp=Sigma_Total(E'), & +! *** cos(theta) which corresponds to E'] +! IF (Ksolvx.NE.2) THEN Dfz = Dfv Dpfz = Dfw IF (Kvthck.GT.0) THEN IF (Iwhich.EQ.1) THEN Dnfz = Dnfz - Total*Fz -CC ELSE -CC Dnfz = Dnfz +!C ELSE +!C Dnfz = Dnfz END IF END IF END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Get_W_Coef (Xtpt_W, Tt, Nxtptw, M, C0a, C1a, - * C2a, C1b, C2b, C3b, D0a, D1a, D2a, D1b, D2b, D3b) -C *** Purpose -- Figure coefficients for interpolation +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Get_W_Coef (Xtpt_W, Tt, Nxtptw, M, C0a, C1a, & + C2a, C1b, C2b, C3b, D0a, D1a, D2a, D1b, D2b, D3b) +! *** Purpose -- Figure coefficients for interpolation IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION Xtpt_W(Nxtptw) DATA Two /2.0d0/ @@ -373,104 +338,103 @@ C *** Purpose -- Figure coefficients for interpolation ELSE IF (M.EQ.Nxtptw-2) THEN M = Nxtptw - 3 END IF -C *** Use four-point interpolation with M, M+1, M+2, and M+3 +! *** Use four-point interpolation with M, M+1, M+2, and M+3 Mm = M A10 = Xtpt_W(Mm+1) - Xtpt_W(Mm) A20 = Xtpt_W(Mm+2) - Xtpt_W(Mm) A21 = Xtpt_W(Mm+2) - Xtpt_W(Mm+1) A31 = Xtpt_W(Mm+3) - Xtpt_W(Mm+1) A32 = Xtpt_W(Mm+3) - Xtpt_W(Mm+2) -C +! C0a = ((Xtpt_W(Mm+2)-Tt)/A20) * ((Xtpt_W(Mm+1)-Tt)/A10) C1a = ((Xtpt_W(Mm+2)-Tt)/A21) * ((Tt-Xtpt_W(Mm ))/A10) C2a = ((Tt-Xtpt_W(Mm+1))/A21) * ((Tt-Xtpt_W(Mm ))/A20) C1b = ((Xtpt_W(Mm+3)-Tt)/A31) * ((Xtpt_W(Mm+2)-Tt)/A21) C2b = ((Xtpt_W(Mm+3)-Tt)/A32) * ((Tt-Xtpt_W(Mm+1))/A21) C3b = ((Tt-Xtpt_W(Mm+2))/A32) * ((Tt-Xtpt_W(Mm+1))/A31) -C +! D0a = ( Two*Tt-Xtpt_W(Mm+2)-Xtpt_W(Mm+1))/(A10*A20) D1a = (-Two*Tt+Xtpt_W(Mm+2)+Xtpt_W(Mm ))/(A10*A21) D2a = ( Two*Tt-Xtpt_W(Mm+1)-Xtpt_W(Mm ))/(A20*A21) D1b = ( Two*Tt-Xtpt_W(Mm+3)-Xtpt_W(Mm+2))/(A21*A31) D2b = (-Two*Tt+Xtpt_W(Mm+3)+Xtpt_W(Mm+1))/(A21*A32) D3b = ( Two*Tt-Xtpt_W(Mm+2)-Xtpt_W(Mm+1))/(A31*A32) -C +! RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Get_Ffz (Qfb, Ffz, Dffz, D0a, D1a, D2a, D1b, D2b, D3b, - * Mm, Ith, Iwhich, L) +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Get_Ffz (Qfb, Ffz, Dffz, D0a, D1a, D2a, D1b, D2b, D3b, & + Mm, Ith, Iwhich, L) use fixedi_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Qfb(Nxtptw,Ntheta,2) DATA Half /0.5d0/ Ffz = -8000.0d0 - IF (Qfb(Mm ,Ith,Iwhich).GT.-8000.0D0 .AND. - * Qfb(Mm+1,Ith,Iwhich).GT.-8000.0D0 .AND. - * Qfb(Mm+2,Ith,Iwhich).GT.-8000.0D0) THEN - Ffz = D0a*Qfb(Mm ,Ith,Iwhich) - * + D1a*Qfb(Mm+1,Ith,Iwhich) - * + D2a*Qfb(Mm+2,Ith,Iwhich) + IF (Qfb(Mm ,Ith,Iwhich).GT.-8000.0D0 .AND. & + Qfb(Mm+1,Ith,Iwhich).GT.-8000.0D0 .AND. & + Qfb(Mm+2,Ith,Iwhich).GT.-8000.0D0) THEN + Ffz = D0a*Qfb(Mm ,Ith,Iwhich) & + + D1a*Qfb(Mm+1,Ith,Iwhich) & + + D2a*Qfb(Mm+2,Ith,Iwhich) IF (Qfb(Mm+3,Ith,Iwhich).GT.-8000.0D0) THEN - Ffz = Ffz + D1b*Qfb(Mm+1,Ith,Iwhich) - * + D2b*Qfb(Mm+2,Ith,Iwhich) - * + D3b*Qfb(Mm+3,Ith,Iwhich) + Ffz = Ffz + D1b*Qfb(Mm+1,Ith,Iwhich) & + + D2b*Qfb(Mm+2,Ith,Iwhich) & + + D3b*Qfb(Mm+3,Ith,Iwhich) Ffz = Ffz*Half END IF - ELSE IF (Qfb(Mm+1,Ith,Iwhich).GT.-8000.0D0 .AND. - * Qfb(Mm+2,Ith,Iwhich).GT.-8000.0D0 .AND. - * Qfb(Mm+3,Ith,Iwhich).GT.-8000.0D0) THEN - Ffz = D1b*Qfb(Mm+1,Ith,Iwhich) - * + D2b*Qfb(Mm+2,Ith,Iwhich) - * + D3b*Qfb(Mm+3,Ith,Iwhich) + ELSE IF (Qfb(Mm+1,Ith,Iwhich).GT.-8000.0D0 .AND. & + Qfb(Mm+2,Ith,Iwhich).GT.-8000.0D0 .AND. & + Qfb(Mm+3,Ith,Iwhich).GT.-8000.0D0) THEN + Ffz = D1b*Qfb(Mm+1,Ith,Iwhich) & + + D2b*Qfb(Mm+2,Ith,Iwhich) & + + D3b*Qfb(Mm+3,Ith,Iwhich) END IF -C +! IF (L.EQ.4) THEN Dffz = -8000. - IF (Qfb(Mm ,Ith,Iwhich+2).GT.-8000.0D0 .AND. - * Qfb(Mm+1,Ith,Iwhich+2).GT.-8000.0D0 .AND. - * Qfb(Mm+2,Ith,Iwhich+2).GT.-8000.0D0) THEN - Dffz = D0a*Qfb(Mm ,Ith,Iwhich+2) - * + D1a*Qfb(Mm+1,Ith,Iwhich+2) - * + D2a*Qfb(Mm+2,Ith,Iwhich+2) + IF (Qfb(Mm ,Ith,Iwhich+2).GT.-8000.0D0 .AND. & + Qfb(Mm+1,Ith,Iwhich+2).GT.-8000.0D0 .AND. & + Qfb(Mm+2,Ith,Iwhich+2).GT.-8000.0D0) THEN + Dffz = D0a*Qfb(Mm ,Ith,Iwhich+2) & + + D1a*Qfb(Mm+1,Ith,Iwhich+2) & + + D2a*Qfb(Mm+2,Ith,Iwhich+2) IF (Qfb(Mm+3,Ith,Iwhich+2).GT.-8000.0D0) THEN - Dffz = Dffz + D1b*Qfb(Mm+1,Ith,Iwhich+2) - * + D2b*Qfb(Mm+2,Ith,Iwhich+2) - * + D3b*Qfb(Mm+3,Ith,Iwhich+2) + Dffz = Dffz + D1b*Qfb(Mm+1,Ith,Iwhich+2) & + + D2b*Qfb(Mm+2,Ith,Iwhich+2) & + + D3b*Qfb(Mm+3,Ith,Iwhich+2) Dffz = Dffz*Half END IF - ELSE IF (Qfb(Mm+1,Ith,Iwhich+2).GT.-8000.0D0 .AND. - * Qfb(Mm+2,Ith,Iwhich+2).GT.-8000.0D0 .AND. - * Qfb(Mm+3,Ith,Iwhich+2).GT.-8000.0D0) THEN - Dffz = D1b*Qfb(Mm+1,Ith,Iwhich+2) - * + D2b*Qfb(Mm+2,Ith,Iwhich+2) - * + D3b*Qfb(Mm+3,Ith,Iwhich+2) + ELSE IF (Qfb(Mm+1,Ith,Iwhich+2).GT.-8000.0D0 .AND. & + Qfb(Mm+2,Ith,Iwhich+2).GT.-8000.0D0 .AND. & + Qfb(Mm+3,Ith,Iwhich+2).GT.-8000.0D0) THEN + Dffz = D1b*Qfb(Mm+1,Ith,Iwhich+2) & + + D2b*Qfb(Mm+2,Ith,Iwhich+2) & + + D3b*Qfb(Mm+3,Ith,Iwhich+2) END IF END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Get_Ffz_1 (Ans, Cc, Aa, Bb, Dd, Ama, A0a, A1a, - * A0b, A1b, A2b) +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Get_Ffz_1 (Ans, Cc, Aa, Bb, Dd, Ama, A0a, A1a, A0b, A1b, A2b) use fixedi_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Zero /0.0d0/, Half /0.5d0/ - IF (Aa.NE.-8000.d0 .AND. Bb.NE.-8000.d0 .AND. - * Cc.NE.-8000.d0) THEN + IF (Aa.NE.-8000.d0 .AND. Bb.NE.-8000.d0 .AND. & + Cc.NE.-8000.d0) THEN Ffz = Ama*Cc + A0a*Aa + A1a*Bb IF (Dd.NE.-8000.d0) THEN Ffz = Ffz + A0b*Aa + A1b*Bb + A2b*Dd Ffz = Ffz*Half END IF Fz = dEXP(Ffz) - ELSE IF (Aa.NE.-8000.d0 .AND. Bb.NE.-8000.d0 .AND. - * Dd.NE.-8000.d0) THEN + ELSE IF (Aa.NE.-8000.d0 .AND. Bb.NE.-8000.d0 .AND. & + Dd.NE.-8000.d0) THEN Ffz = A0b*Aa + A1b*Bb + A2b*Dd Fz = dEXP(Ffz) ELSE @@ -479,24 +443,23 @@ C Ans = Fz RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Get_Ffz_3 (Ans, Cc, Aa, Bb, Dd, Ama, A0a, A1a, - * A0b, A1b, A2b) +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Get_Ffz_3 (Ans, Cc, Aa, Bb, Dd, Ama, A0a, A1a, A0b, A1b, A2b) use fixedi_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Half /0.5d0/ - IF (Aa.NE.-8000.d0 .AND. Bb.NE.-8000.d0 .AND. - * Cc.NE.-8000.d0) THEN + IF (Aa.NE.-8000.d0 .AND. Bb.NE.-8000.d0 .AND. & + Cc.NE.-8000.d0) THEN Ffz = Ama*Cc + A0a*Aa + A1a*Bb IF (Dd.NE.-8000.d0) THEN Ffz = Ffz + A0b*Aa + A1b*Bb + A2b*Dd Ffz = Ffz*Half END IF - ELSE IF (Aa.NE.-8000.d0 .AND. Bb.NE.-8000.d0 .AND. - * Dd.NE.-8000.d0) THEN + ELSE IF (Aa.NE.-8000.d0 .AND. Bb.NE.-8000.d0 .AND. & + Dd.NE.-8000.d0) THEN Ffz = A0b*Aa + A1b*Bb + A2b*Dd ELSE Ffz = -8000.0d0 @@ -504,15 +467,15 @@ C Ans = Ffz RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! DOUBLE PRECISION FUNCTION Get_Exp_X (Ffz, Aa, Bb, Dd) IMPLICIT REAL*8 (A-H,O-Z) DATA Zero /0.0d0/ - IF (Ffz.NE.-8000.d0 .AND. Aa.NE.-8000.0d0 .AND. Bb.NE.-8000.0d0 - * .AND. Dd.NE.-8000.0D0) THEN + IF (Ffz.NE.-8000.d0 .AND. Aa.NE.-8000.0d0 .AND. Bb.NE.-8000.0d0 & + .AND. Dd.NE.-8000.0D0) THEN Fz = dEXP(Ffz) ELSE Fz = Zero @@ -520,3 +483,5 @@ C Get_Exp_X = Fz RETURN END + +end module ssm_14_m diff --git a/sammy/src/ssm/mssm15.f b/sammy/src/ssm/mssm15.f90 similarity index 56% rename from sammy/src/ssm/mssm15.f rename to sammy/src/ssm/mssm15.f90 index 55388afd1..2cacd4945 100644 --- a/sammy/src/ssm/mssm15.f +++ b/sammy/src/ssm/mssm15.f90 @@ -1,73 +1,77 @@ -C -C -C ----------------------------------------------------------------- -C +! +module ssm_15_m + contains +! +! ----------------------------------------------------------------- +! SUBROUTINE Trpths2 -C -C *** Purpose -- Add contribution from terms 1 through 3 in Eq. (36) -C *** Normalization: Do not include 2 pi -C +! +! *** Purpose -- Add contribution from terms 1 through 3 in Eq. (36) +! *** Normalization: Do not include 2 pi +! use fixedi_m use ifwrit_m use ssssss_common_m use xsect_x_common_m + use ssm_16_m + use ssm_17_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Zero /0.0d0/, One /1.0d0/ -C +! IF (Costhe.NE.Zero) THEN CALL Trpths2_Initialize -C +! IF (Costhe.EQ.One) THEN -C *** ----- F_{zRphi}^(1) from (D.24)ff + (D.34) through (D.37) +! *** ----- F_{zRphi}^(1) from (D.24)ff + (D.34) through (D.37) CALL Forward_One -C +! ELSE IF (Costhe.GT.Zero) THEN -C *** ----- Forward, mu = Costhe > 0 -C +! *** ----- Forward, mu = Costhe > 0 +! IF (Fffmu.LE.Rrr*Costhe) THEN -C *** -------- F_{zRphi}^(1), Equations (D.7) thru (D.33) in ssm manual -C *** valid for mu_f < mu < 1 +! *** -------- F_{zRphi}^(1), Equations (D.7) thru (D.33) in ssm manual +! *** valid for mu_f < mu < 1 CALL Forward_1 -C +! ELSE IF (Fffmu.LE.Rs*Costhe) THEN -C *** ---------F_{zRphi}^(2+3), Equations (D.45) and (D.60) in ssm manual -C *** valid for 0 < mu < mu_s = cos(invtan(Rs/tanthe)) +! *** ---------F_{zRphi}^(2+3), Equations (D.45) and (D.60) in ssm manual +! *** valid for 0 < mu < mu_s = cos(invtan(Rs/tanthe)) CALL Forward_2p3 -C +! ELSE -C ELSE IF (Fffmu.GT.Rs*Costhe) THEN -C *** -------- F_{zRphi}^(2+4), Equations (D.80) and (D.87) in ssm -C *** valid for mu_s < mu < mu_f = cos(invtan([Rs-R0]/tanthe)) +! ELSE IF (Fffmu.GT.Rs*Costhe) THEN +! *** -------- F_{zRphi}^(2+4), Equations (D.80) and (D.87) in ssm +! *** valid for mu_s < mu < mu_f = cos(invtan([Rs-R0]/tanthe)) CALL Forward_2p4 END IF -C -C *** ----- finished with forward -C +! +! *** ----- finished with forward +! ELSE -C *** ----- backward, mu = Costhe < 0 -C +! *** ----- backward, mu = Costhe < 0 +! Costhp = - Costhe IF (Fffmu.LE.Rrr*Costhp) THEN -C *** -------- B_{zRphi}^(1) = Equations (E.4) thru (E.24) in ssm manual +! *** -------- B_{zRphi}^(1) = Equations (E.4) thru (E.24) in ssm manual CALL Backward_1 -C +! ELSE IF (Fffmu.LE.Rs*Costhp) THEN -C *** -------- B_{zRphi}^(2+3), Eqs. (E.39) and (E.46) in ssm manual +! *** -------- B_{zRphi}^(2+3), Eqs. (E.39) and (E.46) in ssm manual CALL Backward_2p3 -C +! ELSE -C ELSE IF (Fffmu.GT.Rs*Costhp) THEN -C *** -------- B_{zRphi}^(2+4), Equations (E.59) and (E.63) in ssm manual +! ELSE IF (Fffmu.GT.Rs*Costhp) THEN +! *** -------- B_{zRphi}^(2+4), Equations (E.59) and (E.63) in ssm manual CALL Backward_2p4 END IF -C -C *** ----- finished with backward -C +! +! *** ----- finished with backward +! END IF -C *** -- end of forward/backward if -C +! *** -- end of forward/backward if +! ELSE -C *** Here when Costhe = Zero +! *** Here when Costhe = Zero Fz = Zero Dfz = Zero Dpfz = Zero @@ -75,21 +79,21 @@ C *** Here when Costhe = Zero END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Trpths2_Initialize use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Zero /0.0d0/, One /1.0d0/ -C +! Fz = Zero Dfz = Zero Dpfz = Zero Dnfz = Zero -C +! Xnml = 0.3d0 Rrr = Rs - R0 Vv = Dthick*Total @@ -98,7 +102,7 @@ C Ww = Wwmu/Costhe Xxxmu = Dthick*(Total*Costhe-Totalp) Xxx = Xxxmu/Costhe -C = X in Appendix D & E notes +! = X in Appendix D & E notes IF (Costhe.LE.-One .OR. Costhe.GE.One) THEN Fffmu = Zero Fff = Zero @@ -112,15 +116,15 @@ C = X in Appendix D & E notes Rzf = Rrr*Costhe/Sinthe Fffmu = Sthick*Sinthe Fff = Fffmu/Costhe -C f = Fffmu/Costhe = Z tan(Theta) +! f = Fffmu/Costhe = Z tan(Theta) Yyv = Rrr*Vv*Costhe/Fffmu Yyy = Rrr*Xxxmu/Fffmu -C = rX/f in Appendix D -C = -rX/f in Appendix E +! = rX/f in Appendix D +! = -rX/f in Appendix E Zzv = Rs*Vv*Costhe/Fffmu Zzz = Rs *Xxxmu/Fffmu -C = R_s X/f in Appendix D -C = -R_s X/f in Appendix E +! = R_s X/f in Appendix D +! = -R_s X/f in Appendix E END IF Fz = Zero IF (Ksolvx.NE.2) THEN @@ -130,3 +134,5 @@ C = -R_s X/f in Appendix E END IF RETURN END + +end module ssm_15_m \ No newline at end of file diff --git a/sammy/src/ssm/mssm16.f b/sammy/src/ssm/mssm16.f90 similarity index 55% rename from sammy/src/ssm/mssm16.f rename to sammy/src/ssm/mssm16.f90 index fa3e99fc7..eb5ff6e56 100644 --- a/sammy/src/ssm/mssm16.f +++ b/sammy/src/ssm/mssm16.f90 @@ -1,86 +1,88 @@ -C -C -C ----------------------------------------------------------------- -C +! +module ssm_16_m + contains +! +! ----------------------------------------------------------------- +! SUBROUTINE Forward_One -C *** Pupose -- Calculate F_{zRphi}^(1) when Costhe = 1.0 -C *** Equations (D.34) through (D.37) in the ssm manual. +! *** Pupose -- Calculate F_{zRphi}^(1) when Costhe = 1.0 +! *** Equations (D.34) through (D.37) in the ssm manual. use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Zero /0.0d0/, One /1.0d0/, Two /2.0d0/ IF (Vv.GT.Xnml) THEN -C *** Eq. (D.10) +! *** Eq. (D.10) Ev = dEXP(-Vv) Av = (One-Ev)/Vv IF (Ksolvx.NE.2) THEN Dpav = Zero -C *** Eq. (D.30) +! *** Eq. (D.30) Dav = (Ev-Av)*Dthick/Total -C *** Eq. (D.14) +! *** Eq. (D.14) END IF Ax = Ev ELSE -C *** Eq. (D.24) +! *** Eq. (D.24) Ev = Abcexp (-Vv, Aaz, Bbz, Ccz, Ddz, Ijklmn) Av = Aaz IF (Ksolvx.NE.2) THEN Dpav = Zero -C *** Eq. (D.30) +! *** Eq. (D.30) Dav = Dthick**2*(Bbz-Aaz) -C *** Eq. (D.28) +! *** Eq. (D.28) END IF END IF Ax = Ev -C *** Eq. (D.34) +! *** Eq. (D.34) A = Dthick*(Av-Ax) Fz = A IF (Ksolvx.NE.2) THEN Dax = - Dthick**2*Ev/Two -C *** Eq. (D.35) +! *** Eq. (D.35) Dpax = Dax -C *** Eq. (D.36) +! *** Eq. (D.36) Dfz = Dav - Dax Dpfz = - Dpax Dnfz = Ev*Vv -C *** Eqs. (D.18) + (D.37) +! *** Eqs. (D.18) + (D.37) END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Forward_1 -C *** Pupose -- Calculate F_{zRphi}^(1), Eq. (D.7-33) in ssm manual. -C *** Large Costhe so that the neutron cannot exit -C *** through the curved edge. +! *** Pupose -- Calculate F_{zRphi}^(1), Eq. (D.7-33) in ssm manual. +! *** Large Costhe so that the neutron cannot exit +! *** through the curved edge. use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Zero /0.0d0/ One /1.0d0/ -C +! IF (Vv.GT.Xnml) THEN Ev = dEXP(-Vv) Av = (One-Ev)/Vv -C *** F_{zRphi}^(1a) Eq. (D.10) +! *** F_{zRphi}^(1a) Eq. (D.10) ELSE Ev = Abcexp (-Vv, Aaz, Bbz, Ccz, Ddz, Ijklmn) Av = Aaz -C *** F_{zRphi}^(1a) Eq. (D.24) +! *** F_{zRphi}^(1a) Eq. (D.24) END IF IF (Ksolvx.NE.2) THEN Dav = Dthick*(Ev-Av)/Total -C *** Eq. (D.14) +! *** Eq. (D.14) Dnav = Ev -C *** Eq. (D.18) +! *** Eq. (D.18) Dpav = Zero -C *** Eq. (D.16) +! *** Eq. (D.16) END IF -C +! IF (Xxx.GT.Xnml .OR. Xxx.LT.-Xnml) THEN -C (X is not small) -C *** -- F_{zRphi}^(1b), Equation (D.11) in ssm manual. +! (X is not small) +! *** -- F_{zRphi}^(1b), Equation (D.11) in ssm manual. Ex = dEXP (Xxx) T = (Ex-One)*Costhe/Xxxmu Ax = Ev*T @@ -88,31 +90,31 @@ C *** -- F_{zRphi}^(1b), Equation (D.11) in ssm manual. IF (Ksolvx.NE.2) THEN Dadx = Ev*(Ex-T) Dadx = Dadx/Xxxmu * Dthick**2 -C = dA/d(X) /Costhe, (D.13) +! = dA/d(X) /Costhe, (D.13) Dpax = - Dadx -C = dA/d(totalp), Eq.(D.17) +! = dA/d(totalp), Eq.(D.17) Dax = Dadx*Costhe - Ax*Dthick**2 -C = dA/d(total), Eq. (D.15) +! = dA/d(total), Eq. (D.15) Ew = dEXP (-Ww) Dnax = Total*Costhe*Ev - Totalp*Ew Dnax = Dnax/Xxxmu*Dthick -C = dA/d(thick), Eq. (D.19) +! = dA/d(thick), Eq. (D.19) END IF ELSE -C (X is small) -C *** -- F_{zRphi}^(1b), Equation (D.25-33) in ssm manual. +! (X is small) +! *** -- F_{zRphi}^(1b), Equation (D.25-33) in ssm manual. Abc = Abcexp (Xxx, Aaz, Bbz, Ccz, Ddz, Ijklmn) Ax = Ev*Aaz -C *** Eq. (D.25) +! *** Eq. (D.25) IF (Ksolvx.NE.2) THEN Dadx = Ev*(Aaz-Bbz) -C *** Eq. (D.27) +! *** Eq. (D.27) Dax = - Dthick**2*Ev*Bbz -C *** Eq. (D.29) +! *** Eq. (D.29) Dpax = - Dthick**2*Dadx/Costhe -C *** Eq. (D.31) +! *** Eq. (D.31) Dnax = Ev*(One-Ww*Aaz) -C *** Eq. (D.33) +! *** Eq. (D.33) END IF END IF Fz = Dthick*(Av-Ax) @@ -123,26 +125,26 @@ C *** Eq. (D.33) END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Forward_2p3 -C -C *** Purpose -- Calculate F_{zRphi}^(2+3), Equations (D.38) through -C *** (D.77) in ssm manual -C *** Costhe is small and positive, so that the neutron may -C *** exit through the curved edge. -C *** The value of (Z-Rs/tan(Theta)) is negative so the -C *** lower limit of the integration over z is zero. -C +! +! *** Purpose -- Calculate F_{zRphi}^(2+3), Equations (D.38) through +! *** (D.77) in ssm manual +! *** Costhe is small and positive, so that the neutron may +! *** exit through the curved edge. +! *** The value of (Z-Rs/tan(Theta)) is negative so the +! *** lower limit of the integration over z is zero. +! use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA One /1.0d0/, Two /2.0d0/, Three /3.0d0/ Rsf = Rs - Fff IF (Yyv.GT.Xnml .OR. Yyv.LT.-Xnml) THEN -C *** F_{zRphi}^(2a+3a) from Eq. (D.45) +! *** F_{zRphi}^(2a+3a) from Eq. (D.45) Eyv = dEXP (Yyv) Twofx = Two *(Fff/Vv) Twofxs = Twofx*(Fff/Vv) @@ -152,13 +154,13 @@ C *** F_{zRphi}^(2a+3a) from Eq. (D.45) Av = Ccz/Vv IF (Ksolvx.NE.2) THEN Dnav = - Rsf*Twofx - Twofxs + Ev*Eyv*Bbz + Ev*R0**2 -C *** dF_{zRphi}^(2a+3a)/dn from Eq.(D.47) +! *** dF_{zRphi}^(2a+3a)/dn from Eq.(D.47) Ddz = Rsf**2 + Two*Rsf*Twofx + Three*Twofxs Ddz = - Ddz/Vv + Ev*R0**2*(One+One/Vv) Ccz = Two*R0*Twofx + Three*Twofxs Ccz = Ccz/Vv + Bbz*(One-Rrr/Fff) Dav = (Ddz+Ev*Eyv*Ccz)*Dthick/Total -C *** dF_{zRphi}^(2a+3a)/dtotal from Eq.(D.46) +! *** dF_{zRphi}^(2a+3a)/dtotal from Eq.(D.46) END IF ELSE Abcx = Abcexp (Vv , Aax, Bbx, Ccx, Ddx, Ijklmn) @@ -166,90 +168,90 @@ C *** dF_{zRphi}^(2a+3a)/dtotal from Eq.(D.46) Aaz = Two*Rsf*Fff*Bbx + Two*Fff**2*Ccx + Rsf**2*Aax Bbz =(Two*R0 *Rrr*Bby + Two*Rrr**2*Ccy) * (Rrr/Fff) Av = Ev * (Aaz-Bbz) -C *** F_{zRphi}^(2a+3a) from Eq. (D.53) +! *** F_{zRphi}^(2a+3a) from Eq. (D.53) IF (Ksolvx.NE.2) THEN - Aaz = Two*Rsf*Fff*(Bbx-Two *Ccx) - * + Two*Fff**2 *(Ccx-Three*Ddx) - * + Rsf**2 *(Aax- Bbx) - Bbz = (Two*R0 *Rrr*(Bby-Two *Ccy) - * + Two*Rrr**2 *(Ccy-Three*Ddy) )* (Rrr/Fff)**2 + Aaz = Two*Rsf*Fff*(Bbx-Two *Ccx) & + + Two*Fff**2 *(Ccx-Three*Ddx) & + + Rsf**2 *(Aax- Bbx) + Bbz = (Two*R0 *Rrr*(Bby-Two *Ccy) & + + Two*Rrr**2 *(Ccy-Three*Ddy) )* (Rrr/Fff)**2 Dadx = Ev * (Aaz-Bbz) Dadx = Dadx * Dthick Dav = Dthick*(Dadx-Av*Dthick) -C *** dF_{zRphi}^(2a+3a)/dTotal from Eq. (D.55) - Dnav = - Fff*(Rsf*Aax+Fff*Bbx) - * + Rrr*(R0 *Aay+Rrr*Bby) +! *** dF_{zRphi}^(2a+3a)/dTotal from Eq. (D.55) + Dnav = - Fff*(Rsf*Aax+Fff*Bbx) & + + Rrr*(R0 *Aay+Rrr*Bby) Dnav = R0**2 + Two*Dnav Dnav = Dnav*Ev -C *** dF_{zRphi}^(2a+3a)/dn from Eq. (D.56) or (D.57) -C Dpav = Zero +! *** dF_{zRphi}^(2a+3a)/dn from Eq. (D.56) or (D.57) +! Dpav = Zero END IF END IF -C +! IF (Xxx.GT.Xnml .OR. Xxx.LT.-Xnml) THEN -C (X is not small) -C *** -- F_{zRphi}^(2b+3b), Equation (D.61) in ssm +! (X is not small) +! *** -- F_{zRphi}^(2b+3b), Equation (D.61) in ssm Ex = dEXP (Xxx) Ey = dEXP (Yyy) Twofx = Two *(Fffmu/Xxxmu) Twofxs = Twofx*(Fffmu/Xxxmu) Aaz = Rsf**2 + Rsf*Twofx + Twofxs -C Aaz=T1 in (D.62) +! Aaz=T1 in (D.62) Bbz = R0 *Twofx + Twofxs -C Bbz=T2 in (D.62) +! Bbz=T2 in (D.62) Ccz = Ex*Aaz - Ey*Bbz - R0**2 -C Ccz={} in (D.61) +! Ccz={} in (D.61) Ax = Ev*Ccz/Xxx -C F in (D.61) without Dthick/R0^2 +! F in (D.61) without Dthick/R0^2 IF (Ksolvx.NE.2) THEN Dnax = Wwmu*Rsf**2 + (Rsf*Twofx+Twofxs)*Vv*Costhe Dnax = - Ex*Dnax/Xxxmu + Vv*(Ey*Bbz+R0**2)/Xxx Dnax = Ev*Dnax -C ~ dF/d(thick) in (D.68) - Ddz = Ex*( Aaz - (Rsf*Twofx+Two*Twofxs)/Xxx ) - * - Ey*( Bbz*(Rrr/Fff) - * - (R0 *Twofx+Two*Twofxs)/Xxx ) +! ~ dF/d(thick) in (D.68) + Ddz = Ex*( Aaz - (Rsf*Twofx+Two*Twofxs)/Xxx ) & + - Ey*( Bbz*(Rrr/Fff) & + - (R0 *Twofx+Two*Twofxs)/Xxx ) Ddz = Ddz*Ev - Ax Dadxmu = Dthick**2 * Ddz/Xxxmu -C = dA/d(X) /Costhe * R_0**2 in (D.63) +! = dA/d(X) /Costhe * R_0**2 in (D.63) Dpax = - Dadxmu -C ~ dA/d(totalp) in (D.66) +! ~ dA/d(totalp) in (D.66) Dax = Dadxmu*Costhe - Ax*Dthick**2 -C ~ dA/d(total) in (D.65) +! ~ dA/d(total) in (D.65) END IF -C +! ELSE -C (Xxx is small) -C *** -- F_{zRphi}^(2b+3b), Equation (D.71) in ssm manual +! (Xxx is small) +! *** -- F_{zRphi}^(2b+3b), Equation (D.71) in ssm manual Abcx = Abcexp (Xxx, Aax, Bbx, Ccx, Ddx, Ijklmn) Abcy = Abcexp (Yyy, Aay, Bby, Ccy, Ddy, Ijklmn) Aaz = Two*Rsf*Fff*Bbx + Two*Fff**2*Ccx + Rsf**2*Aax Bbz =(Two*R0 *Rrr*Bby + Two*Rrr**2*Ccy) * (Rrr/Fff) Ax = Ev * (Aaz-Bbz) -C F = Ax*Dthick/R0^2 in (D.71) +! F = Ax*Dthick/R0^2 in (D.71) IF (Ksolvx.NE.2) THEN - Aaz = Two*Rsf*Fff*(Bbx-Two *Ccx) - * + Two*Fff**2 *(Ccx-Three*Ddx) - * + Rsf**2 *(Aax- Bbx) - Bbz = (Two*R0 *Rrr*(Bby-Two *Ccy) - * + Two*Rrr**2 *(Ccy-Three*Ddy) )* (Rrr/Fff)**2 + Aaz = Two*Rsf*Fff*(Bbx-Two *Ccx) & + + Two*Fff**2 *(Ccx-Three*Ddx) & + + Rsf**2 *(Aax- Bbx) + Bbz = (Two*R0 *Rrr*(Bby-Two *Ccy) & + + Two*Rrr**2 *(Ccy-Three*Ddy) )* (Rrr/Fff)**2 Dadx = Ev * (Aaz-Bbz) -C = dA/d(X) / Dthick in (D.74) +! = dA/d(X) / Dthick in (D.74) Dadx = Dadx * Dthick Dax = Dthick*(Dadx-Ax*Dthick) -C = dA/d(total) in (D.75) +! = dA/d(total) in (D.75) Dpax = - Dthick*Dadx/Costhe -C = dA/d(totalp) in (D.76) - Dnax = - Fff *(Rsf*Bbx+Fff*Ccx) - * + Rrr**2*(R0 *Bby+Rrr*Ccy)/Fff +! = dA/d(totalp) in (D.76) + Dnax = - Fff *(Rsf*Bbx+Fff*Ccx) & + + Rrr**2*(R0 *Bby+Rrr*Ccy)/Fff Dnax = Dnax*Two*Vv + Rsf**2*(One-Ww*Aax) Dnax = Dnax*Ev -C = dA/d(thick) in (D.77) +! = dA/d(thick) in (D.77) END IF END IF A = (Av-Ax)*Dthick Fz = A /(R0**2) + Fz -C +! IF (Ksolvx.NE.2) THEN Da = Dav - Dax Dpa = - Dpax @@ -260,24 +262,24 @@ C END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Forward_2p4 -C *** Pupose -- Calculate F_{zRphi}^(2+4), Equations (D.78) thru (D.98) -C *** in the ssm manual. -C *** Costhe is small and positive and so that the neutron may -C *** exit through the curved edge. -C *** The value of (Z-Rs/tan(Theta)) is > zero, so the lower -C *** limit of the integration over z is (Z-Rs/tan(Theta)). +! *** Pupose -- Calculate F_{zRphi}^(2+4), Equations (D.78) thru (D.98) +! *** in the ssm manual. +! *** Costhe is small and positive and so that the neutron may +! *** exit through the curved edge. +! *** The value of (Z-Rs/tan(Theta)) is > zero, so the lower +! *** limit of the integration over z is (Z-Rs/tan(Theta)). use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Two /2.0d0/, Three /3.0d0/ -C +! IF (Zzv.GT.Xnml .OR. Zzv.LT.-Xnml) THEN -C *** Here for relatively large exponentials (small Fff) +! *** Here for relatively large exponentials (small Fff) Eyv = dEXP (Yyv) Ezv = dEXP (Zzv) Aaz = Two*Fff/Vv @@ -285,7 +287,7 @@ C *** Here for relatively large exponentials (small Fff) Aaz = Aaz*Fff/Vv Aay = Bby + Aaz Av = Ev*(Ezv*Aaz-Eyv*Aay-R0**2)/Vv -C *** -- F_{zRphi}^(2a+4a), Equation (D.82) in ssm manual +! *** -- F_{zRphi}^(2a+4a), Equation (D.82) in ssm manual IF (Ksolvx.NE.2) THEN Dnav = - Vv*Av Ddz = - Two*Aaz/Vv @@ -295,26 +297,26 @@ C *** -- F_{zRphi}^(2a+4a), Equation (D.82) in ssm manual Dav = (Ddx-Av)*Dthick**2 END IF ELSE -C *** Here for relatively small exponentials (large Fff) +! *** Here for relatively small exponentials (large Fff) Abc = Abcexp (Zzv, Aaz, Bbz, Ccz, Ddz, Ijklmn) Abc = Abcexp (Yyv, Aay, Bby, Ccy, Ddy, Ijklmn) Aax = Rs**3*Ccz - Rrr**2*(Rrr*Ccy+R0*Bby) Aax = Two*Aax/Fffmu Av = Ev*Aax*Costhe -C *** -- F_{zRphi}^(2a+4a), Equation (???) +! *** -- F_{zRphi}^(2a+4a), Equation (???) IF (Ksolvx.NE.2) THEN - Ddx = Rs**3*(Ccz-Three*Ddz)*Rs - * - Rrr**3*(Ccy-Three*Ddy)*Rrr - * - R0*Rrr**2*(Bby-Two*Ccy)*Rrr + Ddx = Rs**3*(Ccz-Three*Ddz)*Rs & + - Rrr**3*(Ccy-Three*Ddy)*Rrr & + - R0*Rrr**2*(Bby-Two*Ccy)*Rrr Ddx = Two*Ev*Ddx*(Costhe/Fffmu)**2 Dnav = -Vv*Av Dav = (Ddx-Av)*Dthick**2 END IF END IF -C +! IF (Xxx.GT.Xnml .OR. Xxx.LT.-Xnml) THEN -C (Xxx is not small) -C *** -- F_{zRphi}^(2b+4b), Equation (D.80) in ssm manual +! (Xxx is not small) +! *** -- F_{zRphi}^(2b+4b), Equation (D.80) in ssm manual Ey = dEXP (Yyy) Ez = dEXP (Zzz) Aaz = Two*Fffmu/Xxxmu @@ -323,54 +325,54 @@ C *** -- F_{zRphi}^(2b+4b), Equation (D.80) in ssm manual Aay = Bby + Aaz Aax = Ev*(Ez*Aaz-Ey*Aay-R0**2)/Xxxmu Ax = Aax*Costhe -C F = Ax*Dthick/R0^2 in (D.80) +! F = Ax*Dthick/R0^2 in (D.80) IF (Ksolvx.NE.2) THEN Ddz = - Two*Aaz/Xxxmu -C d(Aaz)/dX = Costhe*Ddz +! d(Aaz)/dX = Costhe*Ddz Ddy = Ddz - Bby/Xxxmu -C d(Aay)/dX = Costhe*Ddy +! d(Aay)/dX = Costhe*Ddy Ddx = Ez*(Ddz+Aaz*Rs/Fffmu) - Ey*(Ddy+Aay*Rrr/Fffmu) Ddx = (Ev*Ddx-Aax)/Xxxmu -C d(Aax)/dX = Costhe*dF/dX in (D.84) +! d(Aax)/dX = Costhe*dF/dX in (D.84) Dnax = - Vv*Ax -C dF/d(thick) in (D.89) +! dF/d(thick) in (D.89) Ddx = Ddx * Dthick**2 Dpax = - Ddx*Costhe -C dF/d(totalp) in (D.84+85) +! dF/d(totalp) in (D.84+85) Dax = - Dpax*Costhe - Ax*Dthick**2 -C dF/d(total) in (D.84+85) +! dF/d(total) in (D.84+85) END IF -C +! ELSE -C (Xxx is small) -C +! (Xxx is small) +! IF (Zzz.LT.Xnml .AND. Zzz.GT.-Xnml) THEN -C (Zzz=Rs*X/f is small) -C *** ----- F_{zRphi}^(2b+4b), Equation (D.92) in ssm manual +! (Zzz=Rs*X/f is small) +! *** ----- F_{zRphi}^(2b+4b), Equation (D.92) in ssm manual Abc = Abcexp (Zzz, Aaz, Bbz, Ccz, Ddz, Ijklmn) Abc = Abcexp (Yyy, Aay, Bby, Ccy, Ddy, Ijklmn) Aax = Rs**3*Ccz - Rrr**2*(Rrr*Ccy+R0*Bby) Aax = Two*Aax/Fffmu Ax = Ev*Aax*Costhe -C F = A*Dthick/R0^2 in (D.92) +! F = A*Dthick/R0^2 in (D.92) IF (Ksolvx.NE.2) THEN - Ddx = Rs**3*(Ccz-Three*Ddz)*Rs - * - Rrr**3*(Ccy-Three*Ddy)*Rrr - * - R0*Rrr**2*(Bby-Two*Ccy)*Rrr + Ddx = Rs**3*(Ccz-Three*Ddz)*Rs & + - Rrr**3*(Ccy-Three*Ddy)*Rrr & + - R0*Rrr**2*(Bby-Two*Ccy)*Rrr Ddx = Two*Ev*Ddx/Fffmu**2 * Costhe -C dA/dX / Costhe in (D.94) +! dA/dX / Costhe in (D.94) Dnax = -Vv*Ax -C dF/d(thick) in (D.89) +! dF/d(thick) in (D.89) Ddx = Ddx * Dthick**2 Dpax = - Ddx -C dF/d(totalp) in (D.94+85) +! dF/d(totalp) in (D.94+85) Dax = - Dpax*Costhe - Dthick**2*Ax -C dF/d(total) in (D.94+85) +! dF/d(total) in (D.94+85) END IF ELSE -C (Zzz=Rs*X/f is large) -C *** ----- F_{zRphi}^(2+4), Equation (D.99) in ssm manual -C *** This one hasn't been well checked; not sure we ever get here +! (Zzz=Rs*X/f is large) +! *** ----- F_{zRphi}^(2+4), Equation (D.99) in ssm manual +! *** This one hasn't been well checked; not sure we ever get here Ez = dEXP (Zzz) Yzz = -R0*Xxxmu/Fffmu Abc = Abcexp (Zzz, Aaz, Bbz, Ccz, Ddz, Ijklmn) @@ -379,20 +381,20 @@ C *** This one hasn't been well checked; not sure we ever get here Aax = Bbx + Rs*Aaz Aax = Aax/Fffmu Ax = Ev*Aax*Costhe -C F = A*Dthick in (D.99) +! F = A*Dthick in (D.99) IF (Ksolvx.NE.2) THEN Ddx = Three*Ccy - Three*Ddy - Bby Ddx = Ez*Two*R0**2*Ddx + Rs**2*(Aaz-Bbz) Ddx = (Bbx*Rs+Ddx)/Fffmu Ddx = Ev*Ddx*R0**2/Fffmu * Costhe -C dF/dX = Ddx*Costhe*Dthick in (D.102) +! dF/dX = Ddx*Costhe*Dthick in (D.102) Dna = Ddx*Xxxmu - Vv*Ax -C dF/d(thick) in (D.102+85) +! dF/d(thick) in (D.102+85) Ddx = Ddx*Dthick**2 Dax = Ddx*Costhe - Ax*Dthick**2 -C dF/d(total) in (D.75+66) +! dF/d(total) in (D.75+66) Dpax = - Ddx -C dF/d(totalp) in (D.75+66) +! dF/d(totalp) in (D.75+66) END IF END IF END IF @@ -408,3 +410,5 @@ C dF/d(totalp) in (D.75+66) END IF RETURN END + +end module ssm_16_m diff --git a/sammy/src/ssm/mssm17.f b/sammy/src/ssm/mssm17.f90 similarity index 53% rename from sammy/src/ssm/mssm17.f rename to sammy/src/ssm/mssm17.f90 index e1db99706..aed574b4e 100644 --- a/sammy/src/ssm/mssm17.f +++ b/sammy/src/ssm/mssm17.f90 @@ -1,53 +1,55 @@ -C -C -C ----------------------------------------------------------------- -C +! +module ssm_17_m + contains +! +! ----------------------------------------------------------------- +! SUBROUTINE Backward_1 -C *** Pupose -- Calculate B_{zRphi}^(1) = Equation (E.6-7) in ssm manual. -C *** Costhe is near -1.0 so the neutron may not exit through -C *** the curved edge. +! *** Pupose -- Calculate B_{zRphi}^(1) = Equation (E.6-7) in ssm manual. +! *** Costhe is near -1.0 so the neutron may not exit through +! *** the curved edge. use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA One /1.0d0/ -C +! Fpf = - Fff Costhp= - Costhe IF (Vv.GT.Xnml) THEN Av = (One-Ev)/Vv -C *** -- B_{zRphi}^(1a) = Equation (E.6) in ssm manual. +! *** -- B_{zRphi}^(1a) = Equation (E.6) in ssm manual. ELSE Ev = Abcexp (-Vv, Aaz, Bbz, Ccz, Ddz, Ijklmn) Av = Aaz -C *** -- B_{zRphi}^(1a) = Equation (E.17) in ssm manual. +! *** -- B_{zRphi}^(1a) = Equation (E.17) in ssm manual. END IF IF (Ksolvx.NE.2) THEN Dav = Dthick*(Ev-Av)/Total -C *** -- dB_{zRphi}^(1a)/dTotal = Equation (E.11) in ssm manual. +! *** -- dB_{zRphi}^(1a)/dTotal = Equation (E.11) in ssm manual. Dnav = Ev -C *** -- dB_{zRphi}^(1a)/dThick = Equation (E.10) in ssm manual. +! *** -- dB_{zRphi}^(1a)/dThick = Equation (E.10) in ssm manual. END IF -C +! IF (Xxx.GT.Xnml .OR. Xxx.LT.-Xnml) THEN -C (Xxx is not small) +! (Xxx is not small) Ex = dEXP(-Xxx) Ax = (One-Ex)*Costhe/Xxxmu -C *** -- B_{zRphi}^(1b) = Equation (E.7) in ssm manual. +! *** -- B_{zRphi}^(1b) = Equation (E.7) in ssm manual. IF (Ksolvx.NE.2) THEN Dadxmu = (Ex-Ax)/Xxxmu -C = dA/d(X) /Costhe +! = dA/d(X) /Costhe Dpax = - Dthick**2*Dadxmu -C = dA/d(totalp) in (E.15) +! = dA/d(totalp) in (E.15) Dax = - Dpax*Costhe -C = dA/d(total) in (E.14) +! = dA/d(total) in (E.14) Dnax = Ex -C = dA/d(thick) in (E.13) +! = dA/d(thick) in (E.13) END IF -C +! ELSE -C -C (Xxx is small) -C *** -- B_{zRphi}^(1b) = Equation (E.21) in ssm manual. +! +! (Xxx is small) +! *** -- B_{zRphi}^(1b) = Equation (E.21) in ssm manual. Abc = Abcexp (-Xxx, Aaz, Bbz, Ccz, Ddz, Ijklmn) Ax = Aaz IF (Ksolvx.NE.2) THEN @@ -55,7 +57,7 @@ C *** -- B_{zRphi}^(1b) = Equation (E.21) in ssm manual. Dax = Dthick**2*Dadx Dpax= - Dax/Costhe Dnax = One - Aaz*Xxx -C (E.23), (E.24), (E.22) +! (E.23), (E.24), (E.22) END IF END IF Fz = Dthick*(Av-Ax) @@ -66,17 +68,17 @@ C (E.23), (E.24), (E.22) END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Backward_2p3 -C *** Pupose -- Calculate B_{zRphi}^(2+3), Eqs. (E.46) and (E.39) in -C *** ssm manual. -C *** Costhp is small so that the neutron may exit -C *** through the curved edge. -C *** The value of (Z-Rs/|tan(Theta)|) is negative so the -C *** lower limit of the integration over z is zero. +! *** Pupose -- Calculate B_{zRphi}^(2+3), Eqs. (E.46) and (E.39) in +! *** ssm manual. +! *** Costhp is small so that the neutron may exit +! *** through the curved edge. +! *** The value of (Z-Rs/|tan(Theta)|) is negative so the +! *** lower limit of the integration over z is zero. use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) @@ -85,9 +87,9 @@ C *** lower limit of the integration over z is zero. Costhp= - Costhe Ex = dEXP (-Xxx) Rsf = Rs - Fpf -C +! IF (Yyv.GT.Xnml .OR. Yyv.LT.-Xnml) THEN -C *** -- B_{zRphi}^(2a+3a) from Eq. (E.46) plus (47-51) +! *** -- B_{zRphi}^(2a+3a) from Eq. (E.46) plus (47-51) Eyv = dEXP (Yyv) Twofx = Two *(Fpf/Vv) Twofxs = Twofx*(Fpf/Vv) @@ -97,88 +99,88 @@ C *** -- B_{zRphi}^(2a+3a) from Eq. (E.46) plus (47-51) Av = Ccz/Vv IF (Ksolvx.NE.2) THEN Dnav = Ev * Rsf**2 - Ddz = Ev *( Aaz-(Rsf*Twofx-Two*Twofxs)/Vv ) - * + Eyv*(-Bbz*(Rrr/Fpf) - * + (R0 *Twofx-Two*Twofxs)/Vv ) + Ddz = Ev *( Aaz-(Rsf*Twofx-Two*Twofxs)/Vv ) & + + Eyv*(-Bbz*(Rrr/Fpf) & + + (R0 *Twofx-Two*Twofxs)/Vv ) Dadx = (Ddz-Av)/Vv Dav = Dthick**2*Dadx END IF ELSE -C *** -- B_{zRphi}^(2a+3a) from Eq. (E.54) with X->v +! *** -- B_{zRphi}^(2a+3a) from Eq. (E.54) with X->v Abc = Abcexp (-Vv , Aax, Bbx, Ccx, Ddx, Ijklmn) Abc = Abcexp ( Yyv, Aay, Bby, Ccy, Ddy, Ijklmn) Aaz = Two*Fpf*(Rsf*Bbx+Fpf*Ccx) + Rsf**2*Aax Bbz = Two*Rrr*(R0 *Bby+Rrr*Ccy) * (Rrr/Fpf) Av = Aaz - Bbz IF (Ksolvx.NE.2) THEN - Aaz = Two*Rsf*Fpf*(Bbx-Two *Ccx) - * + Two*Fpf**2 *(Ccx-Three*Ddx) - * + Rsf**2 *(Aax- Bbx) - Bbz = (Two*R0 *Rrr*(Bby-Two *Ccy) - * + Two*Rrr**2 *(Ccy-Three*Ddy) )* (Rrr/Fpf)**2 + Aaz = Two*Rsf*Fpf*(Bbx-Two *Ccx) & + + Two*Fpf**2 *(Ccx-Three*Ddx) & + + Rsf**2 *(Aax- Bbx) + Bbz = (Two*R0 *Rrr*(Bby-Two *Ccy) & + + Two*Rrr**2 *(Ccy-Three*Ddy) )* (Rrr/Fpf)**2 Dadx= Bbz - Aaz Dav = Dthick**2*Dadx - Aaz = Two*Rsf*Fpf*(Aax-Bbx) - * + Two*Fpf**2 *(Bbx-Ccx*Two) - * + Rsf**2 *(One-Aax) - Bbz = (R0*Bby + Ccy*Rrr)*Rrr/Fpf - * + (Aay-Two*Bby)*R0 + (Bby-Three*Ccy) + Aaz = Two*Rsf*Fpf*(Aax-Bbx) & + + Two*Fpf**2 *(Bbx-Ccx*Two) & + + Rsf**2 *(One-Aax) + Bbz = (R0*Bby + Ccy*Rrr)*Rrr/Fpf & + + (Aay-Two*Bby)*R0 + (Bby-Three*Ccy) Bbz = Two*Bbz * (Rrr**2/Fpf) Dnav= Ev*Rsf**2 END IF END IF -C +! IF (Xxx.GT.Xnml .OR. Xxx.LT.-Xnml) THEN -C (Xxx is not small) -C *** -- B_{zRphi}^(2b+3b), Equation (E.39) in ssm manual. +! (Xxx is not small) +! *** -- B_{zRphi}^(2b+3b), Equation (E.39) in ssm manual. Ex = dEXP(-Xxx) Ey = dEXP (Yyy) Twofx = Two *(Fffmu/Xxxmu) -C Twofx = - 2f/X = 2fmu/Xmu +! Twofx = - 2f/X = 2fmu/Xmu Twofxs = Twofx*(Fffmu/Xxxmu) Aaz = Rsf**2 + Rsf*Twofx + Twofxs Bbz = + R0 *Twofx + Twofxs Ccz = - Ex*Aaz + Ey*Bbz + R0**2 Ax = Ccz/Xxx -C B/Dthick in (E.39) +! B/Dthick in (E.39) IF (Ksolvx.NE.2) THEN - Ddz = Ex*( Aaz + (Rsf*Twofx+Two*Twofxs)/Xxx ) - * + Ey*(-Bbz*(Rrr/Fpf) - (R0 *Twofx+Two*Twofxs)/Xxx ) + Ddz = Ex*( Aaz + (Rsf*Twofx+Two*Twofxs)/Xxx ) & + + Ey*(-Bbz*(Rrr/Fpf) - (R0 *Twofx+Two*Twofxs)/Xxx ) Dadxmu = (Ddz-Ax)/Xxxmu -C = dA/d(X) /Costhe in (E.42) +! = dA/d(X) /Costhe in (E.42) Dpax = - Dthick**2*Dadxmu -C = dA/d(totalp) in (E.44) +! = dA/d(totalp) in (E.44) Dax = - Dpax*Costhe -C = dA/d(total) in (E.43) +! = dA/d(total) in (E.43) Dnax = Ex*Rsf**2 -C = dA/d(thick) in (E.45) +! = dA/d(thick) in (E.45) END IF -C +! ELSE -C -C (Xxx is small) -C *** -- B_{zRphi}^(2b+3b), Equation (E.54) in ssm manual. +! +! (Xxx is small) +! *** -- B_{zRphi}^(2b+3b), Equation (E.54) in ssm manual. Abc = Abcexp (-Xxx, Aax, Bbx, Ccx, Ddx, Ijklmn) Abc = Abcexp ( Yyy, Aay, Bby, Ccy, Ddy, Ijklmn) Aaz = Two*Fpf*(Rsf*Bbx+Fpf*Ccx) + Rsf**2*Aax Bbz = Two*Rrr*(R0 *Bby+Rrr*Ccy)*(Rrr/Fpf) Ax = Aaz - Bbz -C in (E.54) +! in (E.54) IF (Ksolvx.NE.2) THEN - Aaz = Two*Rsf*Fpf*(Bbx-Two *Ccx) - * + Two*Fpf**2 *(Ccx-Three*Ddx) - * + Rsf**2 *(Aax- Bbx) - Bbz = (Two*R0 *Rrr*(Bby-Two *Ccy) - * + Two*Rrr**2 *(Ccy-Three*Ddy) )* (Rrr/Fpf)**2 + Aaz = Two*Rsf*Fpf*(Bbx-Two *Ccx) & + + Two*Fpf**2 *(Ccx-Three*Ddx) & + + Rsf**2 *(Aax- Bbx) + Bbz = (Two*R0 *Rrr*(Bby-Two *Ccy) & + + Two*Rrr**2 *(Ccy-Three*Ddy) )* (Rrr/Fpf)**2 Dadx= Bbz - Aaz -C in (E.55) +! in (E.55) Dax = Dthick**2*Dadx Dpax = - Dax/Costhe Dnax = Ex*Rsf**2 -C = dA/d(thick) in (E.56) +! = dA/d(thick) in (E.56) END IF END IF -C +! A = Dthick*(Av-Ax) Fz = A /(R0**2) + Fz IF (Ksolvx.NE.2) THEN @@ -191,27 +193,27 @@ C END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Backward_2p4 -C *** Pupose -- Calculate B_{zRphi}^(2+4), Equations (E.63) and (E.59) in -C *** the ssm manual. -C *** Costhp is small and positive so that the neutron may exit -C *** through the curved edge. -C *** The value of (Z-Rs/|tan(Theta)|) is > zero, so the lower -C *** limit of the integration over z is (Z-Rs/|tan(Theta)|). +! *** Pupose -- Calculate B_{zRphi}^(2+4), Equations (E.63) and (E.59) in +! *** the ssm manual. +! *** Costhp is small and positive so that the neutron may exit +! *** through the curved edge. +! *** The value of (Z-Rs/|tan(Theta)|) is > zero, so the lower +! *** limit of the integration over z is (Z-Rs/|tan(Theta)|). use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Zero /0.0d0/, Two /2.0d0/, Three /3.0d0/ -C +! Fpf = - Fff Costhp= - Costhe IF (Yyv.GT.Xnml .OR. Zzv.GT.Xnml) THEN -C ??? what's the correct IF-test here? -C *** -- B_{zRphi}^(2a+4a), Equation (E.63) in ssm manual. +! ??? what's the correct IF-test here? +! *** -- B_{zRphi}^(2a+4a), Equation (E.63) in ssm manual. Eyv = dEXP (Yyv) Ezv = dEXP (Zzv) Twofx = - Two *(Fff/Vv) @@ -221,33 +223,33 @@ C *** -- B_{zRphi}^(2a+4a), Equation (E.63) in ssm manual. Ccz = - Ezv*Aaz + Eyv*Bbz + R0**2 Av = Ccz/Vv IF (Ksolvx.NE.2) THEN - Ddz = Ezv*( Aaz*(Rs /Fpf) + Two*Twofxs /Vv ) - * + Eyv*(-Bbz*(Rrr/Fpf) - * + (R0 *Twofx-Two*Twofxs)/Vv ) + Ddz = Ezv*( Aaz*(Rs /Fpf) + Two*Twofxs /Vv ) & + + Eyv*(-Bbz*(Rrr/Fpf) & + + (R0 *Twofx-Two*Twofxs)/Vv ) Dadx = (Ddz-Av)/Vv Dav = Dthick**2*Dadx END IF ELSE -C *** -- B_{zRphi}^(2a+4a), Equation (E.68) with X -> v +! *** -- B_{zRphi}^(2a+4a), Equation (E.68) with X -> v Abc = Abcexp (Zzv, Aaz, Bbz, Ccz, Ddz, Ijklmn) Abc = Abcexp (Yyv, Aay, Bby, Ccy, Ddy, Ijklmn) Aax = Rs**3*Ccz - Rrr**2*(Rrr*Ccy+R0*Bby) Aax = Two*Aax/Fffmu Av = Aax*Costhp IF (Ksolvx.NE.2) THEN - Ddx = Rs**3*(Ccz-Three*Ddz)*Rs - * - Rrr**3*(Ccy-Three*Ddy)*Rrr - * - R0*Rrr**2*(Bby-Two*Ccy)*Rrr + Ddx = Rs**3*(Ccz-Three*Ddz)*Rs & + - Rrr**3*(Ccy-Three*Ddy)*Rrr & + - R0*Rrr**2*(Bby-Two*Ccy)*Rrr Ddx = Two*Ddx*(Dthick*Costhe/Fffmu)**2 Dav = - Ddx END IF END IF -C +! IF (Xxx.GT.Xnml .OR. Xxx.LT.-Xnml) THEN -C *** -- B_{zRphi}^(2b+4b), Equation (E.59) in ssm manual. -C *** Remember that Yyy and Zzz are negative since fff < 0 -C *** (except, of course, that Xxx can be negative so Yyy -C *** and Zzz would then be positive) +! *** -- B_{zRphi}^(2b+4b), Equation (E.59) in ssm manual. +! *** Remember that Yyy and Zzz are negative since fff < 0 +! *** (except, of course, that Xxx can be negative so Yyy +! *** and Zzz would then be positive) Ey = dEXP (Yyy) Ez = dEXP (Zzz) Twofx = - Two *(Fffmu/Xxxmu) @@ -257,36 +259,36 @@ C *** and Zzz would then be positive) Ccz = - Ez*Aaz + Ey*Bbz + R0**2 Aax = Ccz/Xxxmu Ax = Aax*Costhe -C (E.59) +! (E.59) IF (Ksolvx.NE.2) THEN - Ddz = Ez*( Aaz*(Rs /Fpf) + Two*Twofxs /Xxx ) - * + Ey*(-Bbz*(Rrr/Fpf) - * + (R0 *Twofx-Two*Twofxs)/Xxx ) + Ddz = Ez*( Aaz*(Rs /Fpf) + Two*Twofxs /Xxx ) & + + Ey*(-Bbz*(Rrr/Fpf) & + + (R0 *Twofx-Two*Twofxs)/Xxx ) Dadxmu = (Ddz-Ax)/Xxxmu -C = dA/d(X) /Costhe (E.61) +! = dA/d(X) /Costhe (E.61) Dpax = - Dthick**2*Dadxmu -C = dA/d(totalp) +! = dA/d(totalp) Dax = - Dpax*Costhe -C = dA/d(total) -C Dnax = Zero -C = dA/d(thick) +! = dA/d(total) +! Dnax = Zero +! = dA/d(thick) END IF -C +! ELSE -C -C *** -- B_{zRphi}^(2b+4b), Equation (E.68) in ssm manual. +! +! *** -- B_{zRphi}^(2b+4b), Equation (E.68) in ssm manual. Abc = Abcexp (Zzz, Aaz, Bbz, Ccz, Ddz, Ijklmn) Abc = Abcexp (Yyy, Aay, Bby, Ccy, Ddy, Ijklmn) Aax = Rs**3*Ccz - Rrr**2*(Rrr*Ccy+R0*Bby) Aax = Two*Aax/Fffmu Ax = Aax*Costhp -C (E.68) +! (E.68) IF (Ksolvx.NE.2) THEN - Ddx = Rs**3*(Ccz-Three*Ddz)*Rs - * - Rrr**3*(Ccy-Three*Ddy)*Rrr - * - R0*Rrr**2*(Bby-Two*Ccy)*Rrr + Ddx = Rs**3*(Ccz-Three*Ddz)*Rs & + - Rrr**3*(Ccy-Three*Ddy)*Rrr & + - R0*Rrr**2*(Bby-Two*Ccy)*Rrr Ddx = Two*Ddx/Fffmu**2 * Costhe -C d(A)/dX = Ddx*Costhp (E.69) +! d(A)/dX = Ddx*Costhp (E.69) Dpax = Ddx*Dthick**2 Dax = - Dpax*Costhe END IF @@ -299,7 +301,9 @@ C d(A)/dX = Ddx*Costhp (E.69) Dna = Zero Dfz = Da /(R0**2) + Dfz Dpfz = Dpa/(R0**2) + Dpfz -C Dnfz = Dnfz +! Dnfz = Dnfz END IF RETURN END + +end module ssm_17_m \ No newline at end of file diff --git a/sammy/src/ssm/mssm18.f b/sammy/src/ssm/mssm18.f90 similarity index 68% rename from sammy/src/ssm/mssm18.f rename to sammy/src/ssm/mssm18.f90 index 9563e1a0f..bdd00e93a 100644 --- a/sammy/src/ssm/mssm18.f +++ b/sammy/src/ssm/mssm18.f90 @@ -1,30 +1,32 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Finds_2 (Energb, Delas, Dt, Dc, Dtotsi, Dyy2xx, Dyy2xq, - * Dy2xqq, Dy2ddd, Dy2ddq, Y2cccc, Dy2ccc, Dy2aaa, Dy2aaq, Dy2aqq, - * Yyy2xx, Yyy2xq, Y2aaaa, Y2aaaq, Ep, Ggg, Nx, Ientrp, Nn, Izero, - * Idone, Non_Quad) -C +! +module ssm_18_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Finds_2 (Energb, Delas, Dt, Dc, Dtotsi, Dyy2xx, Dyy2xq,& + Dy2xqq, Dy2ddd, Dy2ddq, Y2cccc, Dy2ccc, Dy2aaa, Dy2aaq, Dy2aqq,& + Yyy2xx, Yyy2xq, Y2aaaa, Y2aaaq, Ep, Ggg, Nx, Ientrp, Nn, Izero,& + Idone, Non_Quad) +! use fixedi_m use ifwrit_m use logic_ssm_common_m use ssssss_common_m use xsect_x_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Energb(*), Delas(*), Dt(*), Dc(*), Dtotsi(Nx,*), - * Dyy2xx(*), Dyy2xq(*), Dy2xqq(*), Dy2ddd(*), Dy2ddq(*), - * Y2cccc(*), Dy2ccc(Nx,*), Dy2aaa(*), Dy2aaq(*), Dy2aqq(*) -C + DIMENSION Energb(*), Delas(*), Dt(*), Dc(*), Dtotsi(Nx,*), & + Dyy2xx(*), Dyy2xq(*), Dy2xqq(*), Dy2ddd(*), Dy2ddq(*), & + Y2cccc(*), Dy2ccc(Nx,*), Dy2aaa(*), Dy2aaq(*), Dy2aqq(*) +! DATA Zero /0.0d0/, Half /0.5d0/, One /1.0d0/ -C +! Kv = Kvthck - Nvadif - tttppp=totalp - CALL Xsect22 (Energb, Dy2ddd, Dy2ddq, Y2cccc, Dy2ccc, Y2dddd, - * Y2dddq, Ep, Nx, Ientrp, Nn, Non_Quad) -C -C *** Set Y2aaaa at energy Ep + tttppp=totalp + CALL Xsect22 (Energb, Dy2ddd, Dy2ddq, Y2cccc, Dy2ccc, Y2dddd, & + Y2dddq, Ep, Nx, Ientrp, Nn, Non_Quad) +! +! *** Set Y2aaaa at energy Ep Dn = Dthick*Totalp Pp = Hmez3x (Dn, Number, Dhmez3) Aa = (Half+Dn)/(Half+Dn/Fffdbl) @@ -33,11 +35,11 @@ C *** Set Y2aaaa at energy Ep Ebt= Elas*Bb/Totalp Y2aaaa = Ebt*Cy IF (Y2dddq.NE.Zero) Y2aaaq = Ebt*Y2dddq -C -C *** Now, are we doing derivatives? +! +! *** Now, are we doing derivatives? IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN Dbb = - Aa*Dhmez3 - Pp*(One-Aa/Fffdbl)/(Half+Dn/Fffdbl) -C *** Note that Dbb is derivative of Bb wrt (Dn=Thick*Totalp) +! *** Note that Dbb is derivative of Bb wrt (Dn=Thick*Totalp) Ec = Elas*Cy Ect = Ec/Totalp Cbt = Cy*Bb/Totalp @@ -59,10 +61,10 @@ C *** Note that Dbb is derivative of Bb wrt (Dn=Thick*Totalp) IF (Kvthck.GT.0) Dy2aqq(Kv) = Elas*Y2dddq*Dbb+Dy2aqq(Kv) END IF END IF -C +! IF (Idone.NE.3) THEN -C *** Now set Yyy2xx which will be added up in sbroutine Ssum to -C *** give double(etc)-scattering term +! *** Now set Yyy2xx which will be added up in sbroutine Ssum to +! *** give double(etc)-scattering term Yyy2xx = Egt*Y2dddd IF (Y2dddq.NE.Zero) Yyy2xq = Egt*Y2dddq IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN @@ -72,11 +74,11 @@ C *** give double(etc)-scattering term Dp = Eyt * ( Dggbdp - Ggg/Totalp ) Ds = Eyt * ( Dggads + Dggbds ) DO J=1,Nnpar - Dyy2xx(J) = Delas(J )*Ygt + Dy2ddd(J)*Egt + - * Dtotsi(j,Nn)*Ds + Dt(J)*Dp + Dyy2xx(J) = Delas(J )*Ygt + Dy2ddd(J)*Egt + & + Dtotsi(j,Nn)*Ds + Dt(J)*Dp END DO - IF (Kvthck.GT.0) Dyy2xx(Kv) = ( Egt*Dy2ddd(Kv) + - * Elas*Y2dddd*(Dggadn+Dggbdn)/Totalp) + IF (Kvthck.GT.0) Dyy2xx(Kv) = ( Egt*Dy2ddd(Kv) + & + Elas*Y2dddd*(Dggadn+Dggbdn)/Totalp) IF (Y2dddq.NE.Zero) THEN Ey = Elas*Y2dddq Eyt = Ey/Totalp @@ -86,8 +88,8 @@ C *** give double(etc)-scattering term DO J=1,Nnpar IF (J.NE.Kv) THEN Dyy2xq(J) = + Dy2ddq(J)*Egt - Dy2xqq(J) = Delas (J )*Ygt + - * Dtotsi(J,Nn)*Ds + Dt(J)*Dp + Dy2xqq(J) = Delas (J )*Ygt + & + Dtotsi(J,Nn)*Ds + Dt(J)*Dp END IF END DO IF (Kvthck.GT.0) THEN @@ -97,38 +99,38 @@ C *** give double(etc)-scattering term END IF END IF END IF -C +! RETURN END -C -C -C -------------------------------------------------------------- -C +! +! +! -------------------------------------------------------------- +! DOUBLE PRECISION FUNCTION Hmez3x (Alfa, Number, Dhmez3) -C -C *** Purpose -- Evaluate Hmez3x = Alpha^-1 { 0.5 - integ from 1 to inf -C *** [ z^(-3) e^(-Alpha*z) dz ] } -C -C *** This function is used in double-scattering approximation, to -C *** calculate the escape probability assuming uniform distribution -C *** of (1) neutron positions and (2) directions of motion -C -C *** See Abromowitz and Stegun, page 228, Eq. (5.1.4), for the function -C *** E_3(Alpha). Equation (5.1.14) is used twice to give E_3 in -C *** terms of E_1, and Equation (5.1.11) is used to evaluate E_1. -C +! +! *** Purpose -- Evaluate Hmez3x = Alpha^-1 { 0.5 - integ from 1 to inf +! *** [ z^(-3) e^(-Alpha*z) dz ] } +! +! *** This function is used in double-scattering approximation, to +! *** calculate the escape probability assuming uniform distribution +! *** of (1) neutron positions and (2) directions of motion +! +! *** See Abromowitz and Stegun, page 228, Eq. (5.1.4), for the function +! *** E_3(Alpha). Equation (5.1.14) is used twice to give E_3 in +! *** terms of E_1, and Equation (5.1.11) is used to evaluate E_1. +! IMPLICIT DOUBLE PRECISION (a-h,o-z) DATA Kntr /0/, Zero /0.0d0/, Half /0.5d0/, One /1.0d0/, Two/2.0d0/ DATA Gamma /0.577215664901532860606512d0/ -C *** Gamma is Euler's constant, value on page 3 of Abramowitz & -C *** Stegun -C +! *** Gamma is Euler's constant, value on page 3 of Abramowitz & +! *** Stegun +! Alpha = Alfa IF (Alpha.LE.20.0d0) THEN C = Zero IF (Alpha.LT.0.3d0) THEN Abc = Abcexp (-Alpha, Aa, Bb, Cc, Dxxxxx, Ijklmn) -C *** Aa = (One-Abc)/Alpha +! *** Aa = (One-Abc)/Alpha C = Half * (One+Aa*(One-Alpha)) ELSE Abc = dEXP(-Alpha) @@ -137,8 +139,8 @@ C *** Aa = (One-Abc)/Alpha END IF B = (Gamma+dLOG(Alpha))*Alpha/Two A = C + B -cx bb=b -cx cc=c +!x bb=b +!x cc=c B = - Alpha**2/Two DO N=1,5000 C = B/dFLOAT(N) @@ -148,33 +150,32 @@ cx cc=c END DO WRITE (6,10000) Alpha, Dhmez3, A, C Kntr = Kntr + 1 -10000 FORMAT(' no convergence in Hmez3x; Alfa,Dhmez3,a,c=', - * 1P4G14.6) +10000 FORMAT(' no convergence in Hmez3x; Alfa,Dhmez3,a,c=', 1P4G14.6) IF (Kntr.GE.10) STOP '[STOP in Hmez3x in ssm/mssm18.f]' -cx IF (Kntr.GT.200) STOP '[STOP in Hmez3x in ssm/mssm18.f]' -C +!x IF (Kntr.GT.200) STOP '[STOP in Hmez3x in ssm/mssm18.f]' +! 20 CONTINUE Number = N Hmez3x = A Dhmez3 = (Hmez3x-Aa)/Alpha -C +! ELSE Hmez3x = Half/Alpha Dhmez3 = Zero Number = 0 -C +! END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Xsect22 (Energb, Dy2ddd, Dy2ddq, Y2cccc, Dy2ccc, - * Y2dddd, Y2dddq, Ep, Nx, Ientrp, Nn, Non_Quad) -C -C *** Purpose -- Find Y2cccc(Ep) and derivatives thereof. -C +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Xsect22 (Energb, Dy2ddd, Dy2ddq, Y2cccc, Dy2ccc, & + Y2dddd, Y2dddq, Ep, Nx, Ientrp, Nn, Non_Quad) +! +! *** Purpose -- Find Y2cccc(Ep) and derivatives thereof. +! use fixedi_m use ifwrit_m use ssssss_common_m @@ -182,7 +183,7 @@ C IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Energb(*), Dy2ddd(*), Dy2ddq(*), Y2cccc(*), Dy2ccc(Nx,*) DATA Zero /0.0d0/, One /1.0d0/ -C +! Y2dddd = Zero Y2dddq = Zero IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN @@ -191,10 +192,10 @@ C Dy2ddq(J) = Zero END DO END IF -C +! IF (Intrp.EQ.0) THEN -C *** Here get values when Ep=Energb(Iep) -C *** (Intrp=0), or when Iep=1, so must use constant value +! *** Here get values when Ep=Energb(Iep) +! *** (Intrp=0), or when Iep=1, so must use constant value Y2dddd = Y2cccc(Iep) IF (Y2dddd.NE.Zero) THEN IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN @@ -204,11 +205,11 @@ C *** (Intrp=0), or when Iep=1, so must use constant value END IF ELSE IF (Iep.NE.Nn) THEN -C *** Here when Y2cccc(Iep)=0 and Iep.NE.Nn, so we are below -C *** the minimum value for which y's can be generated +! *** Here when Y2cccc(Iep)=0 and Iep.NE.Nn, so we are below +! *** the minimum value for which y's can be generated ELSE -C *** Here when Y2cccc(Iep)=0 and Iep=Nn, so we need to figure -C *** the "q" terms -- coefficient of y(Nn) and dy(Nn) +! *** Here when Y2cccc(Iep)=0 and Iep=Nn, so we need to figure +! *** the "q" terms -- coefficient of y(Nn) and dy(Nn) Y2dddq = One IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO J=1,Nnpar @@ -217,32 +218,32 @@ C *** the "q" terms -- coefficient of y(Nn) and dy(Nn) END IF END IF END IF -C +! ELSE -C -C *** Here Energb(Iep) < Ep < Energb(Iep+1) so get values -C *** at E'=Ep via interpolation -C +! +! *** Here Energb(Iep) < Ep < Energb(Iep+1) so get values +! *** at E'=Ep via interpolation +! IF (Iep.GT.1 .AND. Iep.LT.Nn-2 .AND. Non_Quad.EQ.0) THEN -C *** Here can use quadratic form for interpolation, since -C *** all needed Y2cccc are known +! *** Here can use quadratic form for interpolation, since +! *** all needed Y2cccc are known B0 = Antrp1 B1 = Antrp2 B2 = Antrp3 B3 = Antrp4 - Y2dddd = B1*Y2cccc(Iep ) + B2*Y2cccc(Iep+1) - * + B0*Y2cccc(Iep-1) + B3*Y2cccc(Iep+2) + Y2dddd = B1*Y2cccc(Iep ) + B2*Y2cccc(Iep+1) & + + B0*Y2cccc(Iep-1) + B3*Y2cccc(Iep+2) IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO J=1,Nnpar - Dy2ddd(J) = B1*Dy2ccc(J,Iep ) + B2*Dy2ccc(J,Iep+1) - * + B0*Dy2ccc(J,Iep-1) + B3*Dy2ccc(J,Iep+2) + Dy2ddd(J) = B1*Dy2ccc(J,Iep ) + B2*Dy2ccc(J,Iep+1) & + + B0*Dy2ccc(J,Iep-1) + B3*Dy2ccc(J,Iep+2) END DO END IF -C +! ELSE IF (Iep.GT.1 .AND. Iep.EQ.Nn-1) THEN -C *** Here we cannot do quadratic because we would need Nn+1, -C *** and that Y2cccc is not known yet; hence, use linear -C *** and save the Y2dddq piece +! *** Here we cannot do quadratic because we would need Nn+1, +! *** and that Y2cccc is not known yet; hence, use linear +! *** and save the Y2dddq piece C = Energb(Iep+1) - Energb(Iep) A = (Energb(Iep+1)-Ep)/C B = (Ep-Energb(Iep ))/C @@ -254,17 +255,17 @@ C *** and save the Y2dddq piece Dy2ddq(J) = B END DO END IF -C -cx ELSE IF (Iep.GE.Nn-1) THEN +! +!x ELSE IF (Iep.GE.Nn-1) THEN ELSE IF (Iep.GE.Nn) THEN -C *** This is above the current energy value; should not get here. +! *** This is above the current energy value; should not get here. WRITE (6,*) Iep, Nn STOP '[STOP in Xsect22 in mssm18.f]' -C +! ELSE -C *** Here do linear because we're at the ends of the energy region +! *** Here do linear because we're at the ends of the energy region IF (Y2cccc(Iep+1).NE.Zero) THEN -C *** Here Y2cccc(Iep+1).NE.0 +! *** Here Y2cccc(Iep+1).NE.0 A = Energb(Iep+1) - Ep B = Ep - Energb(Iep) C = Energb(Iep+1) - Energb(Iep) @@ -281,18 +282,18 @@ C *** Here Y2cccc(Iep+1).NE.0 END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Reorder_Energy (Energy, We, Wsigxx, Wdasig, Wdbsig, - * Theory, Kdatmn, Kdatmx, Kkkdat) +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Reorder_Energy (Energy, We, Wsigxx, Wdasig, Wdbsig, & + Theory, Kdatmn, Kdatmx, Kkkdat) use fixedi_m IMPLICIT DOUBLE PRECISION (A-H,O-Z) - DIMENSION Energy(*), We(*), Wsigxx(*), Wdasig(Ndaxxx,*), - * Wdbsig(Ndbxxx,*), Theory(*) + DIMENSION Energy(*), We(*), Wsigxx(*), Wdasig(Ndaxxx,*), & + Wdbsig(Ndbxxx,*), Theory(*) DATA Thous /1000.0d0/ -C +! Jj = 1 Em = Energy(jj) Kk = 0 @@ -315,7 +316,7 @@ C Jj = Jj + 1 Em = Energy(Jj) ELSE IF (We(k).GT.Em) THEN -C *** Here have to interpolate between last and next point +! *** Here have to interpolate between last and next point D = We(K) - We(K-1) A = We(K) - Em B = Em - We(K-1) @@ -325,14 +326,14 @@ C *** Here have to interpolate between last and next point Theory(Jj) = Wsigxx(Jj) IF (Ndasig.GT.0) THEN DO Iipar=1,Ndasig - Wdasig(Iipar,Jj) = Wdasig(Iipar,Kk )*B + - * Wdasig(Iipar,Kk-1)*A + Wdasig(Iipar,Jj) = Wdasig(Iipar,Kk )*B + & + Wdasig(Iipar,Kk-1)*A END DO END IF IF (Ndbsig.GT.0) THEN DO Iipar=1,Ndbsig - Wdbsig(Iipar,Jj) = Wdbsig(Iipar,Kk )*B + - * Wdbsig(Iipar,Kk-1)*A + Wdbsig(Iipar,Jj) = Wdbsig(Iipar,Kk )*B + & + Wdbsig(Iipar,Kk-1)*A END DO Jj = Jj + 1 Em = Energy(Jj) @@ -344,10 +345,10 @@ C *** Here have to interpolate between last and next point Kkkdat = Jj - 1 RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Gety2zzz (Emy2_a, Emy2_b, Y2tab_a, Y2tab_b) use namfil_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) @@ -357,12 +358,11 @@ C 10000 FORMAT (2F20.10) RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Gety2tab (Em, Y2tab, Emy2_a, Emy2_b, - * Y2tab_a, Y2tab_b) +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Gety2tab (Em, Y2tab, Emy2_a, Emy2_b, Y2tab_a, Y2tab_b) IMPLICIT DOUBLE PRECISION (a-h,o-z) 10 CONTINUE IF (Em.LT.Emy2_b) THEN @@ -387,3 +387,5 @@ C Y2tab = A*Y2tab_a + B*Y2tab_b RETURN END + +end module ssm_18_m diff --git a/sammy/src/ssm/mssm19.f b/sammy/src/ssm/mssm19.f deleted file mode 100644 index 897e245d1..000000000 --- a/sammy/src/ssm/mssm19.f +++ /dev/null @@ -1,160 +0,0 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ynrm_0 (Capsig, Dtotsi, Dcapsi, Sigxxx, Dasigx, - * Dbsigx, Y0, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) - - use fixedi_m - use ifwrit_m - use fixedr_m - use logic_ssm_common_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Capsig(*), Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), - * Sigxxx(*), Dasigx(*), Dbsigx(*) - DATA Zero /0.0d0/, One /1.0d0/ -C -C *** Default normalization is such that Y0 = (1-e)Capture /(n Total) -C *** which corresponds to Kyield=1 ("cross section", not "yield") -C - IF (Noyzer.NE.0) Y0 = Zero -C - Cap = Capsig(Nn) - IF (Kyield.EQ.0) THEN - Y0 = Y0*Dthick - ELSE IF (Kyield.EQ.1) THEN - ELSE IF (Kyield.EQ.2) THEN - Y0 = Y0*Total*Dthick - END IF -C - Sigxxx(1) = Y0 -C -C If the gamma attenuation factor C1 is not zero - IF (Gam_att_C1.NE.0.0) THEN - C1 = Gam_att_C1 - dC1 = dGam_att_C1 - Td = Total*Dthick -C Sigxxx(1) is the place we store the output to ODF/LST files - Sigxxx(1) = Sigxxx(1) * Gamma_attenuation_corr(C1,Td) - END IF -C -C - IF (Kssmpr.EQ.1) THEN - Y1 = Zero - Y2 = Zero - WRITE (60,12000) Em, Y0, Y1, Y2, Sigxxx(1) -12000 FORMAT (1X, F15.8, 1P5E15.6) - END IF -C - IF (Ksolve.EQ.2) RETURN -C - IF (Ndasig.GT.0) CALL Ynrm_0_Derivative (Cap, Dtotsi, Dcapsi, - * Dasigx, Y0, Dthick, Total, Exp1, Dddyy0, Nn, Ndasig, 0) - IF (Ndbsig.GT.0) CALL Ynrm_0_Derivative (Cap, Dtotsi, Dcapsi, - * Dbsigx, Y0, Dthick, Total, Exp1, Dddyy0, Nn, Ndbsig, Ndasig) -C - IF (Kvthck.GT.0) THEN -C *** Add deriv of Y0 wrt Thickness - Kv = Kvthck - Nvadif - Ndasig - IF (Kyield.EQ.0) THEN - IF (Noyzer.EQ.0) THEN - Dbsigx(Kv) = Exp1*Cap + Dbsigx(Kv) -C ELSE -C disabling Y0 portion of calculation - END IF - ELSE IF (Kyield.EQ.1) THEN - Sn = Dthick*Total - IF (Noyzer.EQ.0) THEN - IF (Sn.LT.0.3d0) THEN - Abc = Abcexp (-Sn, A, B, C, Dxxxxx, Ijklmn) - F = Cap*Total*(B-A) - ELSE - F = Cap*(Exp1-(One-Exp1)/Sn)/Dthick - END IF - ELSE -C disabling Y0 portion of calculation - F = Zero - END IF - Dbsigx(Kv) = F + Dbsigx(Kv) - ELSE IF (Kyield.EQ.2) THEN - IF (Noyzer.EQ.0) Dbsigx(Kv)= Exp1*Cap*Total + Dbsigx(Kv) - END IF - END IF -C - IF (Sensin.NE.Zero .AND. Ksensc.GT.0) THEN - IF (Kyield.EQ.0) Asensn = Asensn * Dthick - IF (Kyield.EQ.2) Asensn = Asensn * Dthick * Total -C *** Add deriv of Y0 wrt neutron sensitivity multiplier - Kv = Ksensc - Nvadif - Ndasig - Dbsigx(Kv) = Asensn - END IF - RETURN - END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ynrm_0_Derivative (Cap, Dtotsi, Dcapsi, Ds, - * Y0, Dthick, Total, Exp1, Dddyy0, Nn, Nd, Na) - use fixedi_m - use ifwrit_m - use logic_ssm_common_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Ds(*) - DATA One /1.0d0/ -C -C Dthick = N [at/b] -C Cap = sigma_gamma -C Total = sigma_tot -C Exp1 = e^(-N*sigma_tot) -C - DO Ipar=1,Nd - Iipar = Ipar + Na -C - IF (Noyzer.EQ.0) THEN -C *** First, the derivative of Y0 wrt u(Iipar) -C *** (Nn=Energy) JMB - IF (Kyield.EQ.0) THEN - Ds(Ipar) = Ds(Ipar) + - * Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) - * + Dtotsi(Iipar,Nn)*Exp1*Cap/Total * Dthick - ELSE IF (Kyield.EQ.1) THEN - Ds(Ipar) = Ds(Ipar) + - * Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) - * + Dtotsi(Iipar,Nn)*Exp1*Cap/Total - IF (Iipar.EQ.1) Dddyy0 = Dddyy0 + - * Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) - * + Dtotsi(Iipar,Nn)*Exp1*Cap/Total - ELSE IF (Kyield.EQ.2) THEN - Ds(Ipar) = Ds(Ipar) + (One-Exp1)*Dcapsi(Iipar,Nn) - * + Dtotsi(Iipar,Nn)*Exp1*Cap*Dthick - END IF - END IF -C ------------------------------------------------------------------ -C *** If gamma attenuation is being used, add the derivative for the -C *** attenuated yield -C -C *** d/du(k_a Y) = d(k_a)/dsig_t * d(sig_t)/du * Y + -C *** d(Y)/du * k_a - IF (Gam_att_C1.GT.0) THEN -C -C d(k_a)/dsig_t = - Dka = Gamma_atten_corr_deriv(Gam_att_C1,Dthick,Total) -C -C d(k_a)/du = - Dkadu = Dka*Dtotsi(Iipar,Nn) -C -C corr_ka is correction factor k_a - corr_ka = Gamma_attenuation_corr(Gam_att_C1,Dthick*Total) -C -C ----------------------------------------- - Ds(Ipar) = Dkadu*(Y0) + Ds(Ipar)*corr_ka -C ----------------------------------------- - - END IF -C ------------------------------------------------------------------ -C -C - END DO - RETURN - END diff --git a/sammy/src/ssm/mssm19.f90 b/sammy/src/ssm/mssm19.f90 new file mode 100644 index 000000000..7449e786a --- /dev/null +++ b/sammy/src/ssm/mssm19.f90 @@ -0,0 +1,158 @@ +! +module ssm_19_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ynrm_0 (Capsig, Dtotsi, Dcapsi, Sigxxx, Dasigx, & + Dbsigx, Y0, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) + + use fixedi_m + use ifwrit_m + use fixedr_m + use logic_ssm_common_m + use CapYCorrections_common_m + IMPLICIT DOUBLE PRECISION (a-h,o-z) + DIMENSION Capsig(*), Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Sigxxx(*), Dasigx(*), Dbsigx(*) + DATA Zero /0.0d0/, One /1.0d0/ + + call capYieldCor%initialize() +! +! *** Default normalization is such that Y0 = (1-e)Capture /(n Total) +! *** which corresponds to Kyield=1 ("cross section", not "yield") +! + IF (Noyzer.NE.0) Y0 = Zero +! + Cap = Capsig(Nn) + IF (Kyield.EQ.0) THEN + Y0 = Y0*Dthick + ELSE IF (Kyield.EQ.1) THEN + ELSE IF (Kyield.EQ.2) THEN + Y0 = Y0*Total*Dthick + END IF +! + Sigxxx(1) = Y0 +! +! If the gamma attenuation factor C1 is not zero + IF (Gam_att_C1.NE.0.0) THEN + dC1 = dGam_att_C1 + Td = Total*Dthick +! Sigxxx(1) is the place we store the output to ODF/LST files +! -- Here we are modifying Sigxxx(1) with the gamma attenuation +! -- correction + call capYieldCor%gammaAttenCorr( Dthick,Total,Gam_att_C1,Sigxxx(1) ) + END IF +! +! + IF (Kssmpr.EQ.1) THEN + Y1 = Zero + Y2 = Zero + WRITE (60,12000) Em, Y0, Y1, Y2, Sigxxx(1) +12000 FORMAT (1X, F15.8, 1P5E15.6) + END IF +! + IF (Ksolve.EQ.2) RETURN +! + IF (Ndasig.GT.0) CALL Ynrm_0_Derivative (Cap, Dtotsi, Dcapsi, & + Dasigx, Y0, Dthick, Total, Exp1, Dddyy0, Nn, Ndasig, 0) + IF (Ndbsig.GT.0) CALL Ynrm_0_Derivative (Cap, Dtotsi, Dcapsi, & + Dbsigx, Y0, Dthick, Total, Exp1, Dddyy0, Nn, Ndbsig, Ndasig) +! + IF (Kvthck.GT.0) THEN +! *** Add deriv of Y0 wrt Thickness + Kv = Kvthck - Nvadif - Ndasig + IF (Kyield.EQ.0) THEN + IF (Noyzer.EQ.0) THEN + Dbsigx(Kv) = Exp1*Cap + Dbsigx(Kv) +! ELSE +! disabling Y0 portion of calculation + END IF + ELSE IF (Kyield.EQ.1) THEN + Sn = Dthick*Total + IF (Noyzer.EQ.0) THEN + IF (Sn.LT.0.3d0) THEN + Abc = Abcexp (-Sn, A, B, C, Dxxxxx, Ijklmn) + F = Cap*Total*(B-A) + ELSE + F = Cap*(Exp1-(One-Exp1)/Sn)/Dthick + END IF + ELSE +! disabling Y0 portion of calculation + F = Zero + END IF + Dbsigx(Kv) = F + Dbsigx(Kv) + ELSE IF (Kyield.EQ.2) THEN + IF (Noyzer.EQ.0) Dbsigx(Kv)= Exp1*Cap*Total + Dbsigx(Kv) + END IF + END IF +! + IF (Sensin.NE.Zero .AND. Ksensc.GT.0) THEN + IF (Kyield.EQ.0) Asensn = Asensn * Dthick + IF (Kyield.EQ.2) Asensn = Asensn * Dthick * Total +! *** Add deriv of Y0 wrt neutron sensitivity multiplier + Kv = Ksensc - Nvadif - Ndasig + Dbsigx(Kv) = Asensn + END IF + RETURN + END +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ynrm_0_Derivative (Cap, Dtotsi, Dcapsi, Ds, & + Y0, Dthick, Total, Exp1, Dddyy0, Nn, Nd, Na) + use fixedi_m + use ifwrit_m + use logic_ssm_common_m + use CapYCorrections_common_m + IMPLICIT DOUBLE PRECISION (a-h,o-z) + DIMENSION Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Ds(*) + DATA One /1.0d0/ +! +! Dthick = N [at/b] +! Cap = sigma_gamma +! Total = sigma_tot +! Exp1 = e^(-N*sigma_tot) +! + DO Ipar=1,Nd + Iipar = Ipar + Na +! + IF (Noyzer.EQ.0) THEN +! *** First, the derivative of Y0 wrt u(Iipar) +! *** (Nn=Energy) JMB + IF (Kyield.EQ.0) THEN + Ds(Ipar) = Ds(Ipar) + & + Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) & + + Dtotsi(Iipar,Nn)*Exp1*Cap/Total * Dthick + ELSE IF (Kyield.EQ.1) THEN + Ds(Ipar) = Ds(Ipar) + & + Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) & + + Dtotsi(Iipar,Nn)*Exp1*Cap/Total + IF (Iipar.EQ.1) Dddyy0 = Dddyy0 + & + Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) & + + Dtotsi(Iipar,Nn)*Exp1*Cap/Total + ELSE IF (Kyield.EQ.2) THEN + Ds(Ipar) = Ds(Ipar) + (One-Exp1)*Dcapsi(Iipar,Nn) & + + Dtotsi(Iipar,Nn)*Exp1*Cap*Dthick + END IF + END IF +! ------------------------------------------------------------------ +! *** If gamma attenuation is being used, add the derivative for the +! *** attenuated yield +! +! *** d/du(k_a Y) = d(k_a)/dsig_t * d(sig_t)/du * Y + +! *** d(Y)/du * k_a + IF (Gam_att_C1.GT.0) THEN + + call capYieldCor%derivGammaAttenCorr(Dthick, Total, & + Gam_att_C1, Dtotsi(Iipar,Nn), & + Y0, Ds(Ipar) ) + END IF +! ------------------------------------------------------------------ +! +! + END DO + RETURN + END + +end module ssm_19_m diff --git a/sammy/src/ssm/mssm20.f b/sammy/src/ssm/mssm20.f90 similarity index 59% rename from sammy/src/ssm/mssm20.f rename to sammy/src/ssm/mssm20.f90 index 51ccc8169..8ce787e29 100644 --- a/sammy/src/ssm/mssm20.f +++ b/sammy/src/ssm/mssm20.f90 @@ -1,22 +1,24 @@ -C -C -C ----------------------------------------------------------------- -C +! +module ssm_20_m + contains +! +! ----------------------------------------------------------------- +! SUBROUTINE Fixy_1i (Dyyy1, Yyy1) -C -C *** Normalization: factor-of-2 is from "wrong" Weights for integration -C *** over mu (cuz Sumw = 2.0*2 but really we want Sumw = 1.0*2) -C *** Then Multiply by 2 Pi (for integ over d-phi). -C +! +! *** Normalization: factor-of-2 is from "wrong" Weights for integration +! *** over mu (cuz Sumw = 2.0*2 but really we want Sumw = 1.0*2) +! *** Then Multiply by 2 Pi (for integ over d-phi). +! use fixedi_m use ifwrit_m use constn_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Dyyy1(*) -C -C +! +! Yyy1 = Yyy1*Pi -C +! IF (Ksolve.NE.2) THEN IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO J=1,Nnpar @@ -26,28 +28,28 @@ C END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Fixy_1f (Dyyy1, Yyy1, Yyy1fb) -C -C *** Normalization: factor-of-2 is from "wrong" Weights for integration -C *** over mu (cuz Sumw = 2.0*2 but really we want Sumw = 1.0*2) -C *** Then Multiply by 2 Pi (for integ over d-phi). -C +! +! *** Normalization: factor-of-2 is from "wrong" Weights for integration +! *** over mu (cuz Sumw = 2.0*2 but really we want Sumw = 1.0*2) +! *** Then Multiply by 2 Pi (for integ over d-phi). +! use fixedi_m use ifwrit_m use constn_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Dyyy1(*), Yyy1fb(2) -C -C +! +! Yyy1 = Yyy1*Pi -C +! Yyy1fb(1) = Yyy1fb(1)*Pi Yyy1fb(2) = Yyy1fb(2)*Pi -C +! IF (Ksolve.NE.2) THEN IF (Nnpar.GT.0 .AND. Ksolve.NE.2) THEN DO J=1,Nnpar @@ -57,10 +59,10 @@ C END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Non_Uniform_Thickness (Znonu, Rnonu, Td, Exxxx, Nonu) IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Znonu(*), Rnonu(*) @@ -72,7 +74,7 @@ C IF (dABS(Epsiln).GT.0.3d0) THEN Eepsil = dEXP(Epsiln) B = (Rnonu(J)-Rnonu(J-1))/ Epsiln - C = Eepsil*Rnonu(J-1) - Rnonu(J) + ! = Eepsil*Rnonu(J-1) - Rnonu(J) D = Eepsil - 1.0d0 Qnonu = Qnonu + Enonu*(C+D*B)*B ELSE IF (dABS(Epsiln).GT.0.0d0) THEN @@ -87,23 +89,23 @@ C Exxxx = 2.0d0*Qnonu RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Get_Ratio_Sensin (Em, Ratio_Sensin, Nsen, Itimes) -C -C *** Purpose -- Use log-log interpolation to obtain ratio of neutron -C *** sensitivity to capture sensitivity, as function of E -C +! +! *** Purpose -- Use log-log interpolation to obtain ratio of neutron +! *** sensitivity to capture sensitivity, as function of E +! IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION Esn(16), Rsn(16), Esnl(16), Rsnl(16) - DATA Esn /1.0d3 , 2.0d3 , 3.0d3 , 4.0d3 , 5.0d3 , 7.0d3 , 8.0d3 , - * 1.0d4 , 2.0d4 , 3.0d4 , 4.0d4 , 6.0d4 , 8.0d4 , 2.0d5 , 7.0d5 , - * 1.0d8 / - DATA Rsn /3.2d-4, 2.7d-4, 2.7d-4, 2.4d-4, 2.2d-4, 2.8d-4, 7.5d-4, - * 4.0d-4, 2.5d-4, 4.0d-4, 6.3d-4, 4.2d-4, 2.1d-4, 1.8d-4, 1.1d-4, - * 7.5d-5/ + DATA Esn /1.0d3 , 2.0d3 , 3.0d3 , 4.0d3 , 5.0d3 , 7.0d3 , 8.0d3 , & + 1.0d4 , 2.0d4 , 3.0d4 , 4.0d4 , 6.0d4 , 8.0d4 , 2.0d5 , 7.0d5 , & + 1.0d8 / + DATA Rsn /3.2d-4, 2.7d-4, 2.7d-4, 2.4d-4, 2.2d-4, 2.8d-4, 7.5d-4, & + 4.0d-4, 2.5d-4, 4.0d-4, 6.3d-4, 4.2d-4, 2.1d-4, 1.8d-4, 1.1d-4, & + 7.5d-5/ DATA BE_Gold /31.1411/ DATA Nsen_Max /16/ Bel = dLOG(Be_Gold) @@ -114,8 +116,8 @@ C END DO Itimes = 2 WRITE (21,10100) -10100 FORMAT (/, ' Neutron sensitivity ratio to capture sensitivity', - * /, ' Energy (eV) Ratio') +10100 FORMAT (/, ' Neutron sensitivity ratio to capture sensitivity', & + /, ' Energy (eV) Ratio') WRITE (21,10200) (I, Esn(I), Rsn(I), I=1,Nsen_Max) 10200 FORMAT (I5, F11.0, F12.6) END IF @@ -126,9 +128,9 @@ C IF (Em.LT.Esn(I+1)) THEN El = dLOG(Em) Nsen = I - Ratio_Sensin_Log = ( Rsnl(Nsen )*(Esnl(Nsen+1)-El)+ - * Rsnl(Nsen+1)*(El-Esnl(Nsen)) ) - * /(Esnl(Nsen+1)-Esnl(Nsen)) + Ratio_Sensin_Log = ( Rsnl(Nsen )*(Esnl(Nsen+1)-El)+ & + Rsnl(Nsen+1)*(El-Esnl(Nsen)) ) & + /(Esnl(Nsen+1)-Esnl(Nsen)) Ratio_Sensin = dEXP(Ratio_Sensin_Log) END IF END DO @@ -137,26 +139,29 @@ C END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ynrm_1 (Capsig, Dtotsi, Dcapsi, Sigxxx, Dasigx, Dbsigx, - * Dy1, Y0, Y1, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ynrm_1 (Capsig, Dtotsi, Dcapsi, Sigxxx, Dasigx, Dbsigx, & + Dy1, Y0, Y1, Dthick, Total, Exp1, Em, Dddyy0, Asensn, Nn) use fixedi_m use ifwrit_m use fixedr_m use logic_ssm_common_m + use CapYCorrections_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Capsig(*), Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*), - * Sigxxx(*), Dasigx(*), Dbsigx(*) + DIMENSION Capsig(*), Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*), & + Sigxxx(*), Dasigx(*), Dbsigx(*) DATA Zero /0.0d0/, One /1.0d0/ -C -C *** Default normalization is such that Y0 = (1-e)Capture /(n Total) -C *** which corresponds to Kyield=1 ("cross section", not "yield") -C + + call capYieldCor%initialize() +! +! *** Default normalization is such that Y0 = (1-e)Capture /(n Total) +! *** which corresponds to Kyield=1 ("cross section", not "yield") +! IF (Noyzer.NE.0) Y0 = Zero -C +! Cap = Capsig(Nn) IF (Kyield.EQ.0) THEN Y0 = Y0*Dthick @@ -176,42 +181,43 @@ C END DO END IF END IF -C -C +! +! Sigxxx(1) = Y0 Sigxxx(1) = Sigxxx(1) + Y1 -C -C If the gamma attenuation factor C1 is not zero +! +! If the gamma attenuation factor C1 is not zero IF (Gam_att_C1.NE.0.0) THEN - C1 = Gam_att_C1 dC1 = dGam_att_C1 Td = Total*Dthick -C Sigxxx(1) is the place we store the output to ODF/LST files - Sigxxx(1) = Sigxxx(1) * Gamma_attenuation_corr(C1,Td) +! Sigxxx(1) is the place we store the output to ODF/LST files +! -- Here we are modifying Sigxxx(1) with the gamma attenuation +! -- correction + call capYieldCor%gammaAttenCorr( Dthick,Total,Gam_att_C1,Sigxxx(1) ) END IF -C -C +! +! IF (Kssmpr.EQ.1) THEN WRITE (60,12000) Em, Y0, Y1, Sigxxx(1) 12000 FORMAT (1X, f15.8, 1P5E15.6) END IF -C +! IF (Ksolve.EQ.2) RETURN -C - IF (Ndasig.GT.0) CALL Ynrm_1_Derivative (Cap, Dtotsi, Dcapsi, - * Dasigx, Dy1, Y0, Y1, Dthick, Total, Exp1, Dddyy0, Nn, Ndasig,0) - IF (Ndbsig.GT.0) CALL Ynrm_1_Derivative (Cap, Dtotsi, Dcapsi, - * Dbsigx, Dy1, Y0, Y1, Dthick, Total, Exp1, Dddyy0, Nn, Ndbsig, - * Ndasig) -C +! + IF (Ndasig.GT.0) CALL Ynrm_1_Derivative (Cap, Dtotsi, Dcapsi, & + Dasigx, Dy1, Y0, Y1, Dthick, Total, Exp1, Dddyy0, Nn, Ndasig,0) + IF (Ndbsig.GT.0) CALL Ynrm_1_Derivative (Cap, Dtotsi, Dcapsi, & + Dbsigx, Dy1, Y0, Y1, Dthick, Total, Exp1, Dddyy0, Nn, Ndbsig, & + Ndasig) +! IF (Kvthck.GT.0) THEN -C *** Add deriv of Y0 wrt Thickness; modify deriv of Y1 & Y2 wrt Thick +! *** Add deriv of Y0 wrt Thickness; modify deriv of Y1 & Y2 wrt Thick Kv = Kvthck - Nvadif - Ndasig IF (Kyield.EQ.0) THEN IF (Noyzer.EQ.0) THEN Dbsigx(Kv) = Exp1*Cap + Dbsigx(Kv) -C ELSE -C disabling Y0 portion of calculation +! ELSE +! disabling Y0 portion of calculation END IF ELSE IF (Kyield.EQ.1) THEN Sn = Dthick*Total @@ -223,7 +229,7 @@ C disabling Y0 portion of calculation F = Cap*(Exp1-(One-Exp1)/Sn)/Dthick END IF ELSE -C disabling Y0 portion of calculation +! disabling Y0 portion of calculation F = Zero END IF Dbsigx(Kv) = F + Dbsigx(Kv) - Y1/Dthick @@ -231,109 +237,99 @@ C disabling Y0 portion of calculation IF (Noyzer.EQ.0) Dbsigx(Kv)= Exp1*Cap*Total + Dbsigx(Kv) END IF END IF -C +! IF (Sensin.NE.Zero .AND. Ksensc.GT.0) THEN IF (Kyield.EQ.0) Asensn = Asensn * Dthick IF (Kyield.EQ.2) Asensn = Asensn * Dthick * Total -C *** Add deriv of Y0 wrt neutron sensitivity multiplier +! *** Add deriv of Y0 wrt neutron sensitivity multiplier Kv = Ksensc - Nvadif - Ndasig Dbsigx(Kv) = Asensn END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ynrm_1_Derivative (Cap, Dtotsi, Dcapsi, Ds, Dy1, - * Y0, Y1, Dthick, Total, Exp1, Dddyy0, Nn, Nd, Na) +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ynrm_1_Derivative (Cap, Dtotsi, Dcapsi, Ds, Dy1, & + Y0, Y1, Dthick, Total, Exp1, Dddyy0, Nn, Nd, Na) use fixedi_m use ifwrit_m use logic_ssm_common_m + use CapYCorrections_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*), Ds(*) DATA One /1.0d0/ -C -C Dthick = N [at/b] -C Cap = sigma_gamma -C Total = sigma_tot -C Exp1 = e^(-N*sigma_tot) -C +! +! Dthick = N [at/b] +! Cap = sigma_gamma +! Total = sigma_tot +! Exp1 = e^(-N*sigma_tot) +! DO Ipar=1,Nd Iipar = Ipar + Na -C +! IF (Noyzer.EQ.0) THEN -C *** First, the derivative of Y0 wrt u(Iipar) -C *** (Nn=Energy) JMB +! *** First, the derivative of Y0 wrt u(Iipar) +! *** (Nn=Energy) JMB IF (Kyield.EQ.0) THEN - Ds(Ipar) = Ds(Ipar) + - * Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) - * + Dtotsi(Iipar,Nn)*Exp1*Cap/Total * Dthick + Ds(Ipar) = Ds(Ipar) + & + Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) & + + Dtotsi(Iipar,Nn)*Exp1*Cap/Total * Dthick ELSE IF (Kyield.EQ.1) THEN - Ds(Ipar) = Ds(Ipar) + - * Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) - * + Dtotsi(Iipar,Nn)*Exp1*Cap/Total - IF (Iipar.EQ.1) Dddyy0 = Dddyy0 + - * Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) - * + Dtotsi(Iipar,Nn)*Exp1*Cap/Total + Ds(Ipar) = Ds(Ipar) + & + Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) & + + Dtotsi(Iipar,Nn)*Exp1*Cap/Total + IF (Iipar.EQ.1) Dddyy0 = Dddyy0 + & + Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) & + + Dtotsi(Iipar,Nn)*Exp1*Cap/Total ELSE IF (Kyield.EQ.2) THEN - Ds(Ipar) = Ds(Ipar) + (One-Exp1)*Dcapsi(Iipar,Nn) - * + Dtotsi(Iipar,Nn)*Exp1*Cap*Dthick + Ds(Ipar) = Ds(Ipar) + (One-Exp1)*Dcapsi(Iipar,Nn) & + + Dtotsi(Iipar,Nn)*Exp1*Cap*Dthick END IF END IF -C -C *** Next, the derivative of Y1 wrt u(Iipar) +! +! *** Next, the derivative of Y1 wrt u(Iipar) IF (Kyield.EQ.0) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) ELSE IF (Kyield.EQ.1) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) ELSE IF (Kyield.EQ.2) THEN - Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) + - * Y1*Dtotsi(Iipar,Nn)/Total + Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) + & + Y1*Dtotsi(Iipar,Nn)/Total END IF -C ------------------------------------------------------------------ -C *** If gamma attenuation is being used, add the derivative for the -C *** attenuated yield -C -C *** d/du(k_a Y) = d(k_a)/dsig_t * d(sig_t)/du * Y + -C *** d(Y)/du * k_a +! ------------------------------------------------------------------ +! *** If gamma attenuation is being used, add the derivative for the +! *** attenuated yield +! +! *** d/du(k_a Y) = d(k_a)/dsig_t * d(sig_t)/du * Y + +! *** d(Y)/du * k_a IF (Gam_att_C1.GT.0) THEN -C -C d(k_a)/dsig_t = - Dka = Gamma_atten_corr_deriv(Gam_att_C1,Dthick,Total) -C -C d(k_a)/du = - Dkadu = Dka*Dtotsi(Iipar,Nn) -C -C corr_ka is correction factor k_a - corr_ka = Gamma_attenuation_corr(Gam_att_C1,Dthick*Total) -C -C ----------------------------------------- - Ds(Ipar) = Dkadu*(Y0+Y1) + Ds(Ipar)*corr_ka -C ----------------------------------------- + call capYieldCor%derivGammaAttenCorr(Dthick, Total, & + Gam_att_C1, Dtotsi(Iipar,Nn), & + Y0+Y1, Ds(Ipar) ) END IF -C ------------------------------------------------------------------ -C -C +! ------------------------------------------------------------------ +! +! END DO RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Selfin (Sigxxx, Dasigx, Dbsigx, Vsigsi, Vdasis, Vdbsis, - * Dtotsi, Total, Nn) -C *** Self-Indication Experiment +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Selfin (Sigxxx, Dasigx, Dbsigx, Vsigsi, Vdasis, Vdbsis, Dtotsi, Total, Nn) +! *** Self-Indication Experiment use fixedi_m use ifwrit_m use fixedr_m IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Sigxxx(*), Dasigx(*), Dbsigx(*), Vsigsi(*), - * Vdasis(Ndaxxx,*), Vdbsis(Ndbxxx,*), Dtotsi(Nnpar,*) + DIMENSION Sigxxx(*), Dasigx(*), Dbsigx(*), Vsigsi(*), & + Vdasis(Ndaxxx,*), Vdbsis(Ndbxxx,*), Dtotsi(Nnpar,*) DATA Zero /0.0d0/ -C +! Total2 = Total IF (Ksindi.GT.0 .OR. (Ksitmp.GT.0 .AND. Kbrd.EQ.1)) THEN Total2 = Vsigsi(Nn) @@ -348,43 +344,45 @@ C Exp2 = Thick2*Total2 Exp2 = Dexp(-Exp2) Sigxxx(1) = Exp2*Sigxxx(1) -C +! IF (Ksolve.EQ.2) RETURN ! We're done if Bayes solve isn't wanted IF (Ksindi.GT.0 .OR. (Kbrd.EQ.1 .AND. Ksitmp.GT.0)) THEN -C *** Here cross sections for trans sample & capture smp are different +! *** Here cross sections for trans sample & capture smp are different IF (Ndasig.GT.0) THEN DO Ipar=1,Ndasig - Dasigx(Ipar) = Dasigx(Ipar)*Exp2 - - * Sigxxx(1)*Thick2*Vdasis(Ipar,Nn) + Dasigx(Ipar) = Dasigx(Ipar)*Exp2 - & + Sigxxx(1)*Thick2*Vdasis(Ipar,Nn) END DO END IF IF (Ndbsig.GT.0) THEN DO Ipar=1,Ndbsig - Dbsigx(Ipar) = Dbsigx(Ipar)*Exp2 - - * Sigxxx(1)*Thick2*Vdbsis(Ipar,Nn) + Dbsigx(Ipar) = Dbsigx(Ipar)*Exp2 - & + Sigxxx(1)*Thick2*Vdbsis(Ipar,Nn) END DO END IF ELSE -C *** Here cross sections are the same for trans sample as for -C *** capture sample +! *** Here cross sections are the same for trans sample as for +! *** capture sample IF (Ndasig.GT.0) THEN DO Ipar=1,Ndasig - Dasigx(Ipar) = Dasigx(Ipar)*Exp2 - - * Sigxxx(1)*Thick2*Dtotsi(Ipar,Nn) + Dasigx(Ipar) = Dasigx(Ipar)*Exp2 - & + Sigxxx(1)*Thick2*Dtotsi(Ipar,Nn) END DO END IF IF (Ndbsig.GT.0) THEN DO Ipar=1,Ndbsig - Dbsigx(Ipar) = Dbsigx(Ipar)*Exp2 - - * Sigxxx(1)*Thick2*Dtotsi(Ipar+Ndasig,Nn) + Dbsigx(Ipar) = Dbsigx(Ipar)*Exp2 - & + Sigxxx(1)*Thick2*Dtotsi(Ipar+Ndasig,Nn) END DO END IF END IF -C +! IF (Kv.GT.0) THEN -C *** Add deriv of Y0 wrt Thickness of transmission sample +! *** Add deriv of Y0 wrt Thickness of transmission sample Kv = Kv - Nvadif - Ndasig Dbsigx(Kv) = Dbsigx(Kv) - Sigxxx(1)*Total2 END IF RETURN END + +end module ssm_20_m diff --git a/sammy/src/ssm/mssm21.f b/sammy/src/ssm/mssm21.f90 similarity index 53% rename from sammy/src/ssm/mssm21.f rename to sammy/src/ssm/mssm21.f90 index 53dcf0ff6..49047ddeb 100644 --- a/sammy/src/ssm/mssm21.f +++ b/sammy/src/ssm/mssm21.f90 @@ -1,22 +1,24 @@ -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Fixy_2 (Dyyy2, Dyyy2q, Dyy2qq, Y2cccc, Dy2ccc, Dy2bbb, - * Dy2bbq, Dy2bqq, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Idone, Nn, Su) -C -C *** Purpose -- Solve for Y2cccc, now that we know "c=pi*[b+bq*c]" -C *** Then finish setting Y2 -C +! +module ssm_21_m + contains +! +! ----------------------------------------------------------------- +! + SUBROUTINE Fixy_2 (Dyyy2, Dyyy2q, Dyy2qq, Y2cccc, Dy2ccc, Dy2bbb,& + Dy2bbq, Dy2bqq, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Idone, Nn, Su) +! +! *** Purpose -- Solve for Y2cccc, now that we know "c=pi*[b+bq*c]" +! *** Then finish setting Y2 +! use fixedi_m use ifwrit_m use constn_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Dyyy2(*), Dyyy2q(*), Dyy2qq(*), Dy2ccc(*), Dy2bbb(*), - * Dy2bbq(*), Dy2bqq(*) + DIMENSION Dyyy2(*), Dyyy2q(*), Dyy2qq(*), Dy2ccc(*), Dy2bbb(*),& + Dy2bbq(*), Dy2bqq(*) DATA One /1.0d0/ -C -C +! +! Y2cccc = Y2bbbb/(One/Pi-Y2bbbq) Yyy2 = (Yyy2+Yyy2q*Y2cccc)*Pi IF (Ksolve.NE.2) THEN @@ -29,35 +31,40 @@ C IF (Idone.EQ.3) RETURN IF (Nnpar.GT.0) THEN DO j=1,Nnpar - Dyyy2(J) = Pi*( Dyyy2(J) + Dyyy2q(J)*Dy2ccc(J) + - * Dyy2qq(J)*Y2cccc ) + Dyyy2(J) = Pi*( Dyyy2(J) + Dyyy2q(J)*Dy2ccc(J) + & + Dyy2qq(J)*Y2cccc ) END DO END IF -C +! END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ynrm_2 (Capsig, Dtotsi, Dcapsi, Sigxxx, Dasigx, Dbsigx, - * Dy1, Dy2, Y0, Y1, Y2, Dthick, Total, Exp1, Em, Dddyy0, Asensn, - * Y2tab, Nn) +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ynrm_2 (Capsig, Dtotsi, Dcapsi, Sigxxx, Dasigx,Dbsigx,& + Dy1, Dy2, Y0, Y1, Y2, Dthick, Total, Exp1, Em, Dddyy0, Asensn,& + Y2tab, Nn) use fixedi_m use ifwrit_m use fixedr_m + use CapYCorrections_common_m use logic_ssm_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Capsig(*), Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*), - * Dy2(*), Sigxxx(*), Dasigx(*), Dbsigx(*) + DIMENSION Capsig(*), Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*),& + Dy2(*), Sigxxx(*), Dasigx(*), Dbsigx(*) DATA Zero /0.0d0/, One /1.0d0/ -C -C *** Default normalization is such that Y0 = (1-e)Capture /(n Total) -C *** which corresponds to Kyield=1 ("cross section", not "yield") -C + + !type(CapYieldCorrections)::capYieldCor + + call capYieldCor%initialize() +! +! *** Default normalization is such that Y0 = (1-e)Capture /(n Total) +! *** which corresponds to Kyield=1 ("cross section", not "yield") +! IF (Noyzer.NE.0) Y0 = Zero -C +! Cap = Capsig(Nn) IF (Kyield.EQ.0) THEN Y0 = Y0*Dthick @@ -86,44 +93,45 @@ C END IF END IF IF (Mcy2.NE.0) Y2 = Y2tab -C +! Sigxxx(1) = Y0 + Y1 + Y2 -C -C If the gamma attenuation factor C1 is not zero +! +! If the gamma attenuation factor C1 is not zero IF (Gam_att_C1.NE.0.0) THEN - C1 = Gam_att_C1 dC1 = dGam_att_C1 Td = Total*Dthick -C Sigxxx(1) is the place we store the output to ODF/LST files - Sigxxx(1) = Sigxxx(1) * Gamma_attenuation_corr(C1,Td) +! Sigxxx(1) is the place we store the output to ODF/LST files +! -- Here we are modifying Sigxxx(1) with the gamma attenuation +! -- correction + call capYieldCor%gammaAttenCorr( Dthick,Total,Gam_att_C1,Sigxxx(1) ) END IF -C -C +! +! IF (Kssmpr.EQ.1) THEN WRITE (60,12000) Em, Y0, Y1, Y2, Sigxxx(1) 12000 FORMAT (1X, f15.8, 1P5E15.6) END IF -C +! IF (Ksolve.EQ.2) RETURN -C ###################################### -C It seems that Ndasig is a subset of varied parameters and that -C Ndbsig is the total number of varied parameters minus Ndasig -C ###################################### - IF (Ndasig.GT.0) CALL Ynrm_2_Derivative (Cap, Dtotsi, Dcapsi, - * Dasigx, Dy1, Dy2, Y0, Y1, Y2, Dthick, Total, Exp1, Dddyy0, - * Nn, Ndasig, 0) - IF (Ndbsig.GT.0) CALL Ynrm_2_Derivative (Cap, Dtotsi, Dcapsi, - * Dbsigx, Dy1, Dy2, Y0, Y1, Y2, Dthick, Total, Exp1, Dddyy0, - * Nn, Ndbsig, Ndasig) -C +! ###################################### +! It seems that Ndasig is a subset of varied parameters and that +! Ndbsig is the total number of varied parameters minus Ndasig +! ###################################### + IF (Ndasig.GT.0) CALL Ynrm_2_Derivative (Cap, Dtotsi, Dcapsi, & + Dasigx, Dy1, Dy2, Y0, Y1, Y2, Dthick, Total, Exp1, Dddyy0, & + Nn, Ndasig, 0) + IF (Ndbsig.GT.0) CALL Ynrm_2_Derivative (Cap, Dtotsi, Dcapsi, & + Dbsigx, Dy1, Dy2, Y0, Y1, Y2, Dthick, Total, Exp1, Dddyy0, & + Nn, Ndbsig, Ndasig) +! IF (Kvthck.GT.0) THEN -C *** Add deriv of Y0 wrt Thickness; modify deriv of Y1 & Y2 wrt Thick +! *** Add deriv of Y0 wrt Thickness; modify deriv of Y1 & Y2 wrt Thick Kv = Kvthck - Nvadif - Ndasig IF (Kyield.EQ.0) THEN IF (Noyzer.EQ.0) THEN Dbsigx(Kv) = Exp1*Cap + Dbsigx(Kv) -C ELSE -C disabling Y0 portion of calculation +! ELSE +! disabling Y0 portion of calculation END IF ELSE IF (Kyield.EQ.1) THEN Sn = Dthick*Total @@ -135,7 +143,7 @@ C disabling Y0 portion of calculation F = Cap*(Exp1-(One-Exp1)/Sn)/Dthick END IF ELSE -C disabling Y0 portion of calculation +! disabling Y0 portion of calculation F = Zero END IF Dbsigx(Kv) = F + Dbsigx(Kv) - Y1/Dthick @@ -144,106 +152,98 @@ C disabling Y0 portion of calculation IF (Noyzer.EQ.0) Dbsigx(Kv)= Exp1*Cap*Total + Dbsigx(Kv) END IF END IF -C +! IF (Sensin.NE.Zero .AND. Ksensc.GT.0) THEN IF (Kyield.EQ.0) Asensn = Asensn * Dthick IF (Kyield.EQ.2) Asensn = Asensn * Dthick * Total -C *** Add deriv of Y0 wrt neutron sensitivity multiplier +! *** Add deriv of Y0 wrt neutron sensitivity multiplier Kv = Ksensc - Nvadif - Ndasig Dbsigx(Kv) = Asensn END IF RETURN END -C -C -C ----------------------------------------------------------------- -C - SUBROUTINE Ynrm_2_Derivative (Cap, Dtotsi, Dcapsi, Ds, Dy1, - * Dy2, Y0, Y1, Y2, Dthick, Total, Exp1, Dddyy0, Nn, Nd, Na) +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Ynrm_2_Derivative (Cap, Dtotsi, Dcapsi, Ds, Dy1, & + Dy2, Y0, Y1, Y2, Dthick, Total, Exp1, Dddyy0, Nn, Nd, Na) use fixedi_m use ifwrit_m use logic_ssm_common_m + use CapYCorrections_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*), Dy2(*),Ds(*) DATA One /1.0d0/ -C -C Dthick = N [at/b] -C Cap = sigma_gamma -C Total = sigma_tot -C Exp1 = e^(-N*sigma_tot) -C +! +! Dthick = N [at/b] +! Cap = sigma_gamma +! Total = sigma_tot +! Exp1 = e^(-N*sigma_tot) +! DO Ipar=1,Nd Iipar = Ipar + Na -C +! IF (Noyzer.EQ.0) THEN -C *** First, the derivative of Y0 wrt u(Iipar) -C *** (Nn=Energy) JMB +! *** First, the derivative of Y0 wrt u(Iipar) +! *** (Nn=Energy) JMB IF (Kyield.EQ.0) THEN - Ds(Ipar) = Ds(Ipar) + - * Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) - * + Dtotsi(Iipar,Nn)*Exp1*Cap/Total * Dthick + Ds(Ipar) = Ds(Ipar) + & + Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) & + + Dtotsi(Iipar,Nn)*Exp1*Cap/Total * Dthick ELSE IF (Kyield.EQ.1) THEN - Ds(Ipar) = Ds(Ipar) + - * Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) - * + Dtotsi(Iipar,Nn)*Exp1*Cap/Total - IF (Iipar.EQ.1) Dddyy0 = Dddyy0 + - * Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) - * + Dtotsi(Iipar,Nn)*Exp1*Cap/Total + Ds(Ipar) = Ds(Ipar) + & + Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) & + + Dtotsi(Iipar,Nn)*Exp1*Cap/Total + IF (Iipar.EQ.1) Dddyy0 = Dddyy0 + & + Y0* (Dcapsi(Iipar,Nn)/Cap-Dtotsi(Iipar,Nn)/Total) & + + Dtotsi(Iipar,Nn)*Exp1*Cap/Total ELSE IF (Kyield.EQ.2) THEN - Ds(Ipar) = Ds(Ipar) + (One-Exp1)*Dcapsi(Iipar,Nn) - * + Dtotsi(Iipar,Nn)*Exp1*Cap*Dthick + Ds(Ipar) = Ds(Ipar) + (One-Exp1)*Dcapsi(Iipar,Nn) & + + Dtotsi(Iipar,Nn)*Exp1*Cap*Dthick END IF END IF -C -C *** Next, the derivative of Y1 wrt u(Iipar) +! +! *** Next, the derivative of Y1 wrt u(Iipar) IF (Kyield.EQ.0) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) ELSE IF (Kyield.EQ.1) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) ELSE IF (Kyield.EQ.2) THEN - Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) + - * Y1*Dtotsi(Iipar,Nn)/Total + Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) + & + Y1*Dtotsi(Iipar,Nn)/Total END IF -C -C *** Finally, the derivative of Y2 wrt u(Iipar) +! +! *** Finally, the derivative of Y2 wrt u(Iipar) IF (Kyield.EQ.0) THEN Ds(Ipar) = Ds(Ipar) + Dy2(Iipar) ELSE IF (Kyield.EQ.1) THEN Ds(Ipar) = Ds(Ipar) + Dy2(Iipar) ELSE IF (Kyield.EQ.2) THEN - Ds(Ipar) = Ds(Ipar) + Dy2(Iipar) - * + Y2*Dtotsi(Iipar,Nn)/Total + Ds(Ipar) = Ds(Ipar) + Dy2(Iipar) & + + Y2*Dtotsi(Iipar,Nn)/Total END IF -C -C ------------------------------------------------------------------ -C *** If gamma attenuation is being used, add the derivative for the -C *** attenuated yield -C -C *** d/du(k_a Y) = d(k_a)/dsig_t * d(sig_t)/du * Y + -C *** d(Y)/du * k_a +! +! ------------------------------------------------------------------ +! *** If gamma attenuation is being used, add the derivative for the +! *** attenuated yield +! +! *** d/du(k_a Y) = d(k_a)/dsig_t * d(sig_t)/du * Y + +! *** d(Y)/du * k_a IF (Gam_att_C1.GT.0) THEN -C -C d(k_a)/dsig_t = - Dka = Gamma_atten_corr_deriv(Gam_att_C1,Dthick,Total) -C -C d(k_a)/du = - Dkadu = Dka*Dtotsi(Iipar,Nn) -C -C corr_ka is correction factor k_a - corr_ka = Gamma_attenuation_corr(Gam_att_C1,Dthick*Total) -C -C ----------------------------------------- - Ds(Ipar) = Dkadu*(Y0+Y1+Y2) + Ds(Ipar)*corr_ka -C ----------------------------------------- + + call capYieldCor%derivGammaAttenCorr(Dthick, Total, & + Gam_att_C1, Dtotsi(Iipar,Nn), & + Y0+Y1+Y2, Ds(Ipar) ) END IF -C ---------------------------------------------------------------------- -C +! ---------------------------------------------------------------------- +! END DO RETURN END -C - +! +end module ssm_21_m diff --git a/sammy/src/ssm/mssm21a.f b/sammy/src/ssm/mssm21a.f deleted file mode 100644 index dfbc438cd..000000000 --- a/sammy/src/ssm/mssm21a.f +++ /dev/null @@ -1,146 +0,0 @@ -C - FUNCTION Gamma_attenuation_corr(C1,N_sigtot) -C ---------------------------------------------------------------------- -C ---------------------------------------------------------------------- -C *** Function to correct for the attenuation of capture gammas in a -C *** thick capture sample. Functional form is found from -C *** Y_atten / Y -C -C *** Parameters -C ---------- -C -C C1 : double -C C1 is a parameter fitted to the gamma attenuation correction -C function by Monte Carlo calculation for gammas exiting a -C sample. It is specific to the experimental geometry. -C N_sigtot : double -C The total cross section multiplied by the thickness in atoms/b -C -C *** Returns -C ------- -C -C Gamma_attenuation_corr : double -C A correction to be applied to yield, including the singly and -C multiply scattered yield. -C (Y0+Y1+Y2...) * Gamma_attenuation_corr -C ---------------------------------------------------------------------- -C ---------------------------------------------------------------------- -C - IMPLICIT NONE - DOUBLE PRECISION :: C1 - DOUBLE PRECISION :: N_sigtot - DOUBLE PRECISION :: Gamma_attenuation_corr - Gamma_attenuation_corr = (1.0d0-dexp(-N_sigtot-C1))/ - * (1.0d0-dexp(-N_sigtot))* - * (1.0d0/(1.0d0+C1/N_sigtot)) -C - RETURN - END FUNCTION -C -C ---------------------------------------------------------------------- -C - FUNCTION Gamma_atten_corr_deriv(C1,N,sigtot) -C ---------------------------------------------------------------------- -C ---------------------------------------------------------------------- -C *** Derivative of the gamma attenuation correction function w.r.t. the -C *** total cross section -C -C *** Parameters -C ---------- -C -C C1 : double -C C1 is a parameter fitted to the gamma attenuation correction -C function by Monte Carlo calculation for gammas exiting a -C sample. It is specific to the experimental geometry. -C N : double -C N is the sample thickness [atoms/barn] -C sigtot : double -C The total neutron cross section of the sample -C -C *** Returns -C ------- -C -C Gamma_atten_corr_deriv : double -C The derivative of the gamma attenuation correction w.r.t. the -C total cross section -C ---------------------------------------------------------------------- -C ---------------------------------------------------------------------- -C - IMPLICIT NONE - DOUBLE PRECISION :: C1 - DOUBLE PRECISION :: N - DOUBLE PRECISION :: sigtot - DOUBLE PRECISION :: Gamma_atten_corr_deriv -C -C --------------------------------- - Gamma_atten_corr_deriv = ((1-exp(-N*sigtot)) * (exp(-C1-N*sigtot)* - * N*(1+C1/(N*sigtot)) + C1/(N*sigtot**2) * - * (1-exp(-C1-N*sigtot))) / (1+C1/(N*sigtot))**2 - - * exp(-N*sigtot)*(1-exp(-C1-N*sigtot)) * N / - * (1+C1/(N*sigtot))) / (1-exp(-N*sigtot))**2 -C - RETURN - END FUNCTION -C -C ---------------------------------------------------------------------- -C - FUNCTION Test_gam_atten_corr(C1,N_sigtot) BIND(C, - * name="Test_gam_atten_corr") -C -C *** Function to be called by the C++ testing program -C -C *** Just returns the function Gamma_atten_corr, but in a format -C *** the C++ language can appreciate. -C - use,intrinsic :: ISO_C_BINDING -C - IMPLICIT NONE -C - DOUBLE PRECISION :: C1 - DOUBLE PRECISION :: N_sigtot - DOUBLE PRECISION :: Test_gam_atten_corr - DOUBLE PRECISION :: Gamma_attenuation_corr -C - Test_gam_atten_corr = Gamma_attenuation_corr(C1,N_sigtot) -C - RETURN - END FUNCTION -C -C ---------------------------------------------------------------------- -C - FUNCTION Test_gam_atten_corr_deriv(C1,N,sigtot) BIND(C, - * name="Test_gam_atten_corr_deriv") -C -C *** Function to be called by the C++ testing program -C -C *** Just returns the function Gamma_atten_corr_deriv, but in a format -C *** the C++ language can appreciate. -C - use,intrinsic :: ISO_C_BINDING - - IMPLICIT NONE - - DOUBLE PRECISION :: C1 - DOUBLE PRECISION :: N - DOUBLE PRECISION :: sigtot - DOUBLE PRECISION :: Test_gam_atten_corr_deriv - DOUBLE PRECISION :: Gamma_atten_corr_deriv - - Test_gam_atten_corr_deriv = Gamma_atten_corr_deriv(C1,N,sigtot) - - RETURN - END FUNCTION -C -C ---------------------------------------------------------------------- -C - - - - - - - - - - - diff --git a/sammy/src/ssm/mssm22.f b/sammy/src/ssm/mssm22.f90 similarity index 63% rename from sammy/src/ssm/mssm22.f rename to sammy/src/ssm/mssm22.f90 index 9c9d5190e..2a718f128 100644 --- a/sammy/src/ssm/mssm22.f +++ b/sammy/src/ssm/mssm22.f90 @@ -1,7 +1,7 @@ -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Finish_01 (A, Ee, Wssmsc, Em, Y0, Kdatb, Kkkdat, N) use oops_common_m use fixedi_m @@ -13,38 +13,38 @@ C use lbro_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION A(-Msize:Msize) -C +! DIMENSION Wssmsc(10) IF (Kwssms.EQ.1) THEN Wssmsc(4) = Y0 WRITE (15) Wssmsc END IF -C +! Nnnxxx = 1000 Nnn = N/Nnnxxx IF (Nnn*Nnnxxx.EQ.N) THEN WRITE (6,20000) N, Kdatb, Ee, A(Isigxx), Y0 20000 FORMAT(' Completing E #', I6, ' of', I6,' = ', F18.8, 1P2G13.6) END IF -C +! IF (Another_Process_Will_Happen) THEN - CALL Store_W (A(Iwsigx), A(Iwdasi), A(Iwdbsi), - * A(Isigxx), A(Idasig), A(Idbsig), 1, 1, Kkkdat) + CALL Store_W (A(Iwsigx), A(Iwdasi), A(Iwdbsi), & + A(Isigxx), A(Idasig), A(Idbsig), 1, 1, Kkkdat) ELSE - IF (Numnbk.GT.0) CALL Norm (A_Iprnbk , I_Iflnbk , - * A(Isigxx), A(Idasig), A(Idbsig), Em, 1) - IF (Numbgf.GT.0) CALL Bgfrpi (A_Iprbgf , I_Iflbgf , A_Indbgf , - * A_Ibgfmi , A_Ibgfma , A_Itexbg , A_Iteabg , A(Isigxx), - * A(Idbsig), Em, 1) - CALL Store_W (A(Iwsigx), A(Iwdasi), A(Iwdbsi), - * A(Isigxx), A(Idasig), A(Idbsig), 1, 1, Kkkdat) + IF (Numnbk.GT.0) CALL Norm (A_Iprnbk , I_Iflnbk , & + A(Isigxx), A(Idasig), A(Idbsig), Em, 1) + IF (Numbgf.GT.0) CALL Bgfrpi (A_Iprbgf , I_Iflbgf , A_Indbgf , & + A_Ibgfmi , A_Ibgfma , A_Itexbg , A_Iteabg , A(Isigxx), & + A(Idbsig), Em, 1) + CALL Store_W (A(Iwsigx), A(Iwdasi), A(Iwdbsi), & + A(Isigxx), A(Idasig), A(Idbsig), 1, 1, Kkkdat) END IF RETURN END -C -C -C ----------------------------------------------------------------- -C +! +! +! ----------------------------------------------------------------- +! SUBROUTINE Finish_02 (A, Energy, Energb, Kkkdat, Kdatmn) use oops_common_m use fixedi_m @@ -56,29 +56,29 @@ C use logic_ssm_common_m use lbro_common_m use constn_common_m + use ssm_18_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION A(-Msize:Msize) DIMENSION Energy(*), Energb(*) -C +! Kdatmx = Kkkdat + Kdatmn - 1 Ndatmn = Ndatmn + Kdatmn - 1 IF (Another_Process_Will_Happen) THEN Kkkmin = Kdatmn - 1 Iw = 0 - CALL Write_Cross_Sections (Energb, A(Iwsigx), A(Iwdasi), - * A(Iwdbsi), A(Iwe), A(Iwe), A(Iwe), 1, Kkkdat, Kkkmin, Iw) -C + CALL Write_Cross_Sections (Energb, A(Iwsigx), A(Iwdasi), & + A(Iwdbsi), A(Iwe), A(Iwe), A(Iwe), 1, Kkkdat, Kkkmin, Iw) +! ELSE -C ELSE IF (.NOT.Another_Process_Will_Happen) THEN -C *** need to reorder such that keep only the energies in the -C *** experimental grid; may need to interpolate - CALL Reorder_Energy (Energy, Energb, A(Iwsigx), A(Iwdasi), - * A(Iwdbsi), A(Ith), Kdatmn, Kdatmx, Kkkdat) - IF (Ksolve.NE.2) CALL Write_W_48 (A(Iwdasi), A(Iwdbsi), - * 1, Kkkdat) +! ELSE IF (.NOT.Another_Process_Will_Happen) THEN +! *** need to reorder such that keep only the energies in the +! *** experimental grid; may need to interpolate + CALL Reorder_Energy (Energy, Energb, A(Iwsigx), A(Iwdasi), & + A(Iwdbsi), A(Ith), Kdatmn, Kdatmx, Kkkdat) + IF (Ksolve.NE.2) CALL Write_W_48 (A(Iwdasi), A(Iwdbsi), 1, Kkkdat) END IF Ndatmx = Kkkdat -C +! IF (Kwssms.EQ.1) CLOSE (UNIT=15) IF (Mcy2.EQ.1) CLOSE (UNIT=1) RETURN diff --git a/sammy/src/ssm/ssm_utils.f90 b/sammy/src/ssm/ssm_utils.f90 new file mode 100644 index 000000000..504e555f3 --- /dev/null +++ b/sammy/src/ssm/ssm_utils.f90 @@ -0,0 +1,203 @@ + +module ssm_utils_m + contains + +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Zero0_1f (A, Yyy1fb, Y0, Yyy1, Nx) + use oops_common_m + use fixedi_m + use ifwrit_m + use array_sizes_common_m + use logic_ssm_common_m + IMPLICIT DOUBLE PRECISION (a-h,o-z) + DIMENSION A(-Msize:Msize), Yyy1fb(*) + DATA Zero /0.0d0/ +! + Y0 = Zero + Yyy1 = Zero + Yyy1fb(1) = Zero + Yyy1fb(2) = Zero + IF (Ksolve.NE.2) CALL Zero_Array (A(Idyyy1), Nx) +! + RETURN + END +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Zero0_2i (A, Y0, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Nx) + use oops_common_m + use fixedi_m + use ifwrit_m + use array_sizes_common_m + use logic_ssm_common_m + IMPLICIT DOUBLE PRECISION (a-h,o-z) + DIMENSION A(-Msize:Msize) + DATA Zero /0.0d0/ +! + Y0 = Zero + Yyy1 = Zero +! + IF (Ksolve.NE.2) CALL Zero_Array (A(Idyyy1), Nx) +! + Yyy2 = Zero + Y2bbbb = Zero + IF (Double_Plus) THEN + Yyy2q = Zero + Y2cccc = Zero + Y2bbbq = Zero +! + IF (Ksolve.NE.2) THEN + CALL Zero_Array (A(Idyyy2), Nx) + CALL Zero_Array (A(Idyy2q), Nx) + CALL Zero_Array (A(Idy2qq), Nx) + CALL Zero_Array (A(Idy2cc), Nx) + CALL Zero_Array (A(Idy2bb), Nx) + CALL Zero_Array (A(Idy2bq), Nx) + CALL Zero_Array (A(Idybqq), Nx) + END IF + END IF + RETURN + END +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Zero0_2f (A, Yyy1fb, Y0, Yyy1, Yyy2, Yyy2q, Y2bbbb, Y2bbbq, Nx) + use oops_common_m + use fixedi_m + use ifwrit_m + use array_sizes_common_m + use logic_ssm_common_m + IMPLICIT DOUBLE PRECISION (a-h,o-z) + DIMENSION A(-Msize:Msize), Yyy1fb(*) + DATA Zero /0.0d0/ +! + Y0 = Zero + Yyy1 = Zero + Yyy1fb(1) = Zero + Yyy1fb(2) = Zero +! + IF (Ksolve.NE.2) CALL Zero_Array (A(Idyyy1), Nx) +! + Yyy2 = Zero + Y2bbbb = Zero + IF (Double_Plus) THEN + Yyy2q = Zero + Y2cccc = Zero + Y2bbbq = Zero +! + IF (Ksolve.NE.2) THEN + CALL Zero_Array (A(Idyyy2), Nx) + CALL Zero_Array (A(Idyy2q), Nx) + CALL Zero_Array (A(Idy2qq), Nx) + CALL Zero_Array (A(Idy2cc), Nx) + CALL Zero_Array (A(Idy2bb), Nx) + CALL Zero_Array (A(Idy2bq), Nx) + CALL Zero_Array (A(Idybqq), Nx) + END IF + END IF + RETURN + END +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE Tell_Finite (A) + use oops_common_m + use fixedi_m + use logic_ssm_common_m + use MultScatPars_common_m + IMPLICIT DOUBLE PRECISION (a-h,o-z) + DIMENSION A(-Msize:Msize) + DATA Zero /0.0d0/ + IF (multScat%getLogSigmaTotMax().GT.Zero) THEN + call multScat%setLogSigmaTotMin( dLOG(multScat%getLogSigmaTotMin()) ) + Xtmin = dLOG(multScat%getLogSigmaTotMin()) + call multScat%setLogSigmaTotMax( dLOG(multScat%getLogSigmaTotMax()) ) + Xtmax = dLOG(multScat%getLogSigmaTotMax()) + WRITE ( 6,10200) multScat%getLogSigmaTotMin(), multScat%getLogSigmaTotMax() + WRITE (21,10200) multScat%getLogSigmaTotMin(), multScat%getLogSigmaTotMax() + WRITE ( 6,10300) A(Ixtptv), A(Ixtptv-1+Nxtptv) + WRITE (21,10300) A(Ixtptv), A(Ixtptv-1+Nxtptv) +10200 FORMAT ('Interpolation limits needed: Xtmin, Xtmax=', 1P5G14.6) +10300 FORMAT ('Interpolation limits used: Xtmin, Xtmax=', 1P5G14.6) + END IF + IF (Interp_Small_Times.GT.0) THEN + WRITE ( 6,10400) + WRITE (21,10400) +10400 FORMAT (' Expand interpolation limits and try again.') + STOP + END IF + RETURN + END + +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE X_Trpths_Lin (A, Ftheta, Knthet, Jfb, Jth, Itntrp, Nn, Nxtptwn) + use oops_common_m + use ifwrit_m + use logic_ssm_common_m + use ssssss_common_m + use xsect_x_common_m + use ssm_13_m + use ssm_15_m + IMPLICIT DOUBLE PRECISION (a-h,o-z) + DIMENSION A(-Msize:Msize), Ftheta(*) +! + CALL Trpths1_Lin (A_Ixtptw, Ftheta, A_Iqfb, A(Idvqfb), Knthet, & + Jfb, Jth, Itntrp, Nn, Nxtptwn) + Fz1 = Fz + IF (Ksolvx.NE.2) THEN + Dfz1 = Dfz + Dpfz1 = Dpfz + Dnfz1 = Dnfz + END IF + CALL Trpths2 + Fz = Fz1 + Fz + IF (Ksolvx.NE.2) THEN + Dfz = Dfz1 + Dfz + Dpfz = Dpfz1 + Dpfz + Dnfz = Dnfz1 + Dnfz + END IF + RETURN + END +! +! +! ----------------------------------------------------------------- +! + SUBROUTINE X_Trpths_Quad (A, Ftheta, Knthet, Jfb, Jth, Itntrp, Nn, Nxtptwn) + use oops_common_m + use ifwrit_m + use logic_ssm_common_m + use ssssss_common_m + use xsect_x_common_m + use ssm_14_m + use ssm_15_m + IMPLICIT DOUBLE PRECISION (a-h,o-z) + DIMENSION A(-Msize:Msize), Ftheta(*) +! + CALL Trpths1_Quad (A_Ixtptw, Ftheta, A_Iqfb, A(Idvqfb), Knthet, & + Jfb, Jth, Itntrp, Nn, Nxtptwn) + Fz1 = Fz + IF (Ksolvx.NE.2) THEN + Dfz1 = Dfz + Dpfz1 = Dpfz + Dnfz1 = Dnfz + END IF + CALL Trpths2 + Fz = Fz1 + Fz + IF (Ksolvx.NE.2) THEN + Dfz = Dfz1 + Dfz + Dpfz = Dpfz1 + Dpfz + Dnfz = Dnfz1 + Dnfz + END IF + RETURN + END + +end module ssm_utils_m \ No newline at end of file -- GitLab