From 56a95fb4aa719d70080f301a13a9f7ef7a728b6e Mon Sep 17 00:00:00 2001 From: Brown <2mx@ornl.gov> Date: Thu, 27 Feb 2020 17:02:41 -0500 Subject: [PATCH] Implement Yield class Added classes to store yield variables for the ssm module --- .gitignore | 1 + docs/tex/sammy_main.tex | 1 + docs/tex/sammyrefs.bib | 10 +- docs/tex/scattering-theory.tex | 127 ++++++- ...ions_common.f90 => Convolution_common.f90} | 9 +- sammy/src/blk/Observable_common.f90 | 12 + sammy/src/convolution/CMakeLists.txt | 9 +- sammy/src/convolution/CapYieldCorrections.cpp | 15 +- sammy/src/convolution/YieldNormalization.cpp | 142 +++++++ sammy/src/convolution/YieldNormalization.h | 60 +++ .../src/convolution/cmake/Dependencies.cmake | 2 +- .../cix/YieldNormalization.cpp2f.xml | 15 + .../cpp/YieldNormalizationInterface.cpp | 26 ++ .../cpp/YieldNormalizationInterface.h | 22 ++ .../fortran/YieldNormalization_I.f90 | 32 ++ .../fortran/YieldNormalization_M.f90 | 43 +++ sammy/src/convolution/tests/CMakeLists.txt | 1 + .../tests/YieldNormalizationTest.cpp | 353 ++++++++++++++++++ sammy/src/endf/CovarianceData.h | 2 +- sammy/src/inp/minp04.F | 46 +-- sammy/src/inp/minp05.F | 7 +- sammy/src/mso/mmso5.f | 40 +- sammy/src/par/mpar0.f | 20 +- sammy/src/ref/mcon.F | 2 + sammy/src/salmon/CMakeLists.txt | 11 + sammy/src/salmon/ExperimentalParameters.cpp | 2 + sammy/src/salmon/ExperimentalParameters.h | 18 + sammy/src/salmon/MultipleScattering.cpp | 2 + sammy/src/salmon/MultipleScattering.h | 36 +- sammy/src/salmon/Yield.cpp | 32 ++ sammy/src/salmon/Yield.h | 287 ++++++++++++++ .../cix/ExperimentalParameters.cpp2f.xml | 4 + .../cix/MultipleScattering.cpp2f.xml | 8 +- .../src/salmon/interface/cix/Yield.cpp2f.xml | 70 ++++ .../cpp/ExperimentalParametersInterface.cpp | 12 +- .../cpp/ExperimentalParametersInterface.h | 4 +- .../cpp/MultipleScatteringInterface.cpp | 12 +- .../cpp/MultipleScatteringInterface.h | 4 +- .../salmon/interface/cpp/YieldInterface.cpp | 163 ++++++++ .../src/salmon/interface/cpp/YieldInterface.h | 48 +++ .../fortran/ExperimentalParameters_I.f90 | 13 +- .../fortran/ExperimentalParameters_M.f90 | 16 +- .../fortran/MultipleScattering_I.f90 | 13 +- .../fortran/MultipleScattering_M.f90 | 16 +- .../src/salmon/interface/fortran/Yield_I.f90 | 178 +++++++++ .../src/salmon/interface/fortran/Yield_M.f90 | 226 +++++++++++ sammy/src/salmon/tests/CMakeLists.txt | 1 + .../tests/ExperimentalParametersTest.cpp | 31 +- sammy/src/salmon/tests/YieldTest.cpp | 58 +++ sammy/src/sam/msam.F | 2 + sammy/src/sammy/CMakeLists.txt | 3 +- sammy/src/ssm/mssm04.f90 | 1 + sammy/src/ssm/mssm19.f90 | 59 ++- sammy/src/ssm/mssm20.f90 | 100 +++-- sammy/src/ssm/mssm21.f90 | 130 ++++--- 55 files changed, 2332 insertions(+), 225 deletions(-) rename sammy/src/blk/{CapYCorrections_common.f90 => Convolution_common.f90} (69%) create mode 100644 sammy/src/blk/Observable_common.f90 create mode 100644 sammy/src/convolution/YieldNormalization.cpp create mode 100644 sammy/src/convolution/YieldNormalization.h create mode 100644 sammy/src/convolution/interface/cix/YieldNormalization.cpp2f.xml create mode 100644 sammy/src/convolution/interface/cpp/YieldNormalizationInterface.cpp create mode 100644 sammy/src/convolution/interface/cpp/YieldNormalizationInterface.h create mode 100644 sammy/src/convolution/interface/fortran/YieldNormalization_I.f90 create mode 100644 sammy/src/convolution/interface/fortran/YieldNormalization_M.f90 create mode 100644 sammy/src/convolution/tests/YieldNormalizationTest.cpp create mode 100644 sammy/src/salmon/Yield.cpp create mode 100644 sammy/src/salmon/Yield.h create mode 100644 sammy/src/salmon/interface/cix/Yield.cpp2f.xml create mode 100644 sammy/src/salmon/interface/cpp/YieldInterface.cpp create mode 100644 sammy/src/salmon/interface/cpp/YieldInterface.h create mode 100644 sammy/src/salmon/interface/fortran/Yield_I.f90 create mode 100644 sammy/src/salmon/interface/fortran/Yield_M.f90 create mode 100644 sammy/src/salmon/tests/YieldTest.cpp diff --git a/.gitignore b/.gitignore index 90400f6c7..2f77a0a9a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ sammy/TriBITS .DS_Store sammy/[bB][uU][iI][lL][dD]* /install +[Ss][Cc][Aa][Ll][Ee] .vscode diff --git a/docs/tex/sammy_main.tex b/docs/tex/sammy_main.tex index da8f82f45..8a7b1c831 100644 --- a/docs/tex/sammy_main.tex +++ b/docs/tex/sammy_main.tex @@ -50,6 +50,7 @@ \usepackage{lipsum} \usepackage[hidelinks]{hyperref} % ,backref \usepackage[all]{nowidow} +\usepackage{threeparttable} %\DeclareMathAlphabet{\pazocal}{OMS}{zplm}{m}{n} \newcommand{\Ma}{\mathcal{M}} \newcommand{\Mb}{\pazocal{M}} diff --git a/docs/tex/sammyrefs.bib b/docs/tex/sammyrefs.bib index aca4cfa1e..fdd0f044f 100644 --- a/docs/tex/sammyrefs.bib +++ b/docs/tex/sammyrefs.bib @@ -1161,7 +1161,6 @@ abstract = "The response of the RPI 16-segment NaI(Tl) multiplicity detector sys number = {CONF-880546}, } -<<<<<<< HEAD %----------- SAMMY specific references --------------- @conference{larson_multscat_2002, @@ -1191,9 +1190,12 @@ abstract = "The response of the RPI 16-segment NaI(Tl) multiplicity detector sys publisher = {Los Alamos Scientific Laboratory}, location = {Los Alamos, New Mexico, USA}, } -======= - ->>>>>>> f90b3e53... Added tex files for the manual multiple scattering documentation +@article{lynn_1968, + title={The theory of neutron resonance reactions}, + author={Lynn, John Eric}, + year={1968}, + publisher={Clarendon Press, Oxford} +} @Comment{jabref-meta: databaseType:bibtex;} diff --git a/docs/tex/scattering-theory.tex b/docs/tex/scattering-theory.tex index d1d27cc67..8bc8d065e 100644 --- a/docs/tex/scattering-theory.tex +++ b/docs/tex/scattering-theory.tex @@ -26,26 +26,16 @@ R-matrix theory is expressed in terms of channels, where a channel is defined as \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} + \includegraphics[width=0.4\textwidth]{figures/rmatrix_inc_channel.pdf} \\[\smallskipamount] + \includegraphics[width=0.4\textwidth]{figures/rmatrix_interior_region.pdf}\hfill + \includegraphics[width=0.4\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. +In Section \ref{sec:equations-for-scattering-theory}, 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{}. +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, @@ -75,6 +65,113 @@ vector sum of the spins of the two particles of the pair: $\vec{s} = \vec{i} + \ of $l$ and $s$: $\vec{J} = \vec{l} + \vec{s}$. \end{itemize} +Only $J$ and its associated parity $\pi$ are conserved for any given interaction. The other quantum numbers may differ from channel to channel, as long as the sum rules for spin and parity are obeyed. Within this document and within the SAMMY code, the set of all channels with the same $J$ and $\pi$ are called a ``spin group.'' + +In all formulae given below, spin quantum numbers (e.g., $J$ ) are implicitly assumed to include the associated parity. Quantized vector sum rules are implicitly assumed to be obeyed. Readers unfamiliar with these sum rules are referred to Section II.C.1.a\ref{} for a mini-tutorial on the subject. + +Let the angle-integrated cross sections from entrance channel $c$ to exit channel $c'$ with total angular momentum $J$ be represented by $\sigma_{cc'}$. This cross section is given in terms of the scattering matrix $U_{cc'}$ as + +\begin{equation}\label{eq:sigma-ccprime} +\sigma_{cc'} = \frac{\pi}{k_\alpha^2}g_{J\alpha}\left|e^{2iw_c}\delta_{cc'}-U_{cc'}\right|^2\delta_{JJ'} \:, +\end{equation} + +\noindent +where $k_\alpha$ is the wave number (and $K_\alpha = \hbar k_\alpha =$ center-of-mass momentum) associated with incident particle pair $\alpha$, $g_{J\alpha}$ is the spin statistical factor, and $w_c$ is the Coulomb phase-shift difference. Note that $w_c$ is zero for non-Coulomb channels. (Details for the charged-particle case are presented in Section II.C.4.\ref{}) The spin statistical factor $g_{J\alpha}$ is given by + +\begin{equation}\label{eq:spin-stat-factor} +g_{J\alpha} = \frac{2J+1}{(2i+1)(2I+1)} \:, +\end{equation} + +\noindent +and center-of-mass momentum $K_\alpha$ by + +\begin{equation}\label{eq:center-of-mass-momentum} +K_\alpha^2 = (\hbar k_\alpha)^2 = \frac{2mM^2}{(m+M)^2}E \:. +\end{equation} + +\noindent +Here $E$ is the \textbf{laboratory} kinetic energy of the incident (moving) particle. A derivation of this value for $K_\alpha$ is given in Section II.C.2\ref{}. + +The scattering matrix $U$ can be written in terms of matrix $W$ as + +\begin{equation}\label{eq:scat-matrix} +U_{cc'} = \Omega_cW_{cc'}\Omega_{c'} \:, +\end{equation} + +\noindent +where $\Omega$ is given by + +\begin{equation}\label{eq:omega} +\Omega_c = e^{i(w_c-\phi_c)} \:. +\end{equation} + +\noindent +Here again, $w_c$ is zero for non-Coulomb channels, and the potential scattering phase shifts for non-Coulomb interactions $\phi_c$ are defined in many references (e.g., \cite{lane_thomas_1958}) and shown in Table \ref{}. The matrix $W$ in Eq. \ref{eq:scat-matrix} is related to the R-matrix (in matrix notation with indices suppressed) via + +\begin{equation}\label{eq:W-matrix} +W = P^{1/2}\left(I-RL\right)^{-1}\left(I-RL^*\right)P^{-1/2} \:. +\end{equation} + +\noindent +The quantity $I$ in this equation represents the identity matrix, and superscript $*$ indicates a complex conjugate. The form of the R-matrix given in Section IIA.1\ref{} in general Section II.B\ref{} for the versions used in SAMMY. The quantity $L$ in Eq. \ref{eq:W-matrix} is given by + +\begin{equation}\label{eq:L-matrix} +L = (S-B) + iP \:, +\end{equation} + +\noindent +with $P$ being the penetration factor (penetrability) $S$ the shift factor, and $B$ the arbitrary boundary constant at the channel radius $a_c$. $P$ and $S$ are functions of energy $E$, and also depend on the orbital angular momentum $l$ and the channel radius $a_c$. Formulae for $P$ and $S$ are found in many references (see, for example Eq. (2.9) in \cite{lynn_1968}). + +For non-Coulomb interactions, the penetrability and shift factor have the form + +\begin{equation}\label{eq:pen-shift-func-of-rho} + P\rightarrow P_l(\rho) \qquad \text{and} \qquad S \rightarrow S_l(\rho) \:, +\end{equation} + +\noindent +where $\rho$ is related to the center-of-mass momentum which in turn is related to the laboratory energy of the incident particle $(E)$. For arbitrary channel $c$ with a particle pair $\alpha$, orbital angular momentum $l$, and channel radius $a_c$, $\rho$ has the form + +\begin{equation}\label{eq:de-Broglie-radius} + \rho = k_\alpha a_c = \frac{1}{\hbar} \sqrt{\frac{2m_\alpha M_\alpha}{m_\alpha+M_\alpha} \frac{M}{m+M}} \sqrt{(E-\Xi_\alpha)}\: a_c \:, +\end{equation} + +as shown in Section II.C.2\ref{}. Here $\Xi_\alpha$ is the energy threshold for the particle pair $\alpha$, $m_\alpha$ and $M_\alpha$ are the masses of the two particles of particle pair $\alpha$, and $m$ and $M$ are the masses of the incident particle and target nuclide, respectively. + +Appropriate formulae for $P$, $S$, and $\phi$ in the non-Coulomb case are shown in Table IIA.1. For two charged particles, formulae for the penetrabilities are given in Section II.C.4\ref{}. + +The energy dependence of fission and capture widths is negligible over the energy range of these calculations. Therefore, a penetrability of unity may be used. + +% multiline cell: \begin{tabular}{@{}c@{}} line1 \\ line2 \end{tabular} +\begin{threeparttable} +\centering +\caption{Hard-sphere penetrability (penetration factor) $P$, level shift factor $S$, and potential-scattering phase shift $\phi$ for orbital angular momentum $l$, wave number $k$, and channel radius $a_c$, with $\rho=ka_c$} \label{tab:penetrabilities} +\begin{tabular}{ l c c c } + \hline\hline + $\mathbf{l}$ & $\mathbf{P_l}$ & $\mathbf{S_l}$ & $\mathbf{\phi_l}$ \cr + \hline\hline + 0 & $\rho$ & 0 & $\rho$ \cr + 1 & $\rho^3/(1+\rho^2)$ & $-1/(1+\rho^2)$ & $\rho-tan^{-1}\rho$ \cr + 2 & $\rho^5/(9+3\rho^2+\rho^4)$ & $-(18+3\rho^2)/(9+3\rho^2+\rho^4)$ & $\rho-tan^{-1}\left[3\rho/(3-\rho^2)\right]$ \cr + 3 & \begin{tabular}{@{}c@{}}$\rho^7/$ \\ $(225+45\rho^2+6\rho^4+\rho^6)$\end{tabular} & \begin{tabular}{@{}c@{}} $-(675+90\rho^2+6\rho^4)/$ \\ $(225+45\rho^2+6\rho^4+\rho^6)$ \end{tabular} & $\rho-tan^{-1}\left[\rho(15-\rho^2)/(15-6\rho^2)\right]$ \cr + \hline + $l$ & $\frac{\rho^2P_{l-1}}{(1-S_{l-1})^2+P_{l-1}^2}$ & $\frac{\rho^2(l-S_{l-1})}{(1-S_{l-1})^2+P_{l-1}^2}-l$ & $\phi_{l-1} - tan^{-1}\left(P_{l-1}/(l-S_{l-1})\right)$\tnote{\textdagger} \cr + + \hline\hline + +\end{tabular} +\begin{tablenotes} + \item[\textdagger] \footnotesize{The iterative formula for $\phi_l$ could also be defined by $B_l = (B_{l-1}+X_l)/(1-B_{l-1}X_l)$ where $B_l=tan(\rho-\phi_l)$ and $X_l=P_{l-1}/(l-S_l)$} +\end{tablenotes} +\end{threeparttable} + + + + + + + + + diff --git a/sammy/src/blk/CapYCorrections_common.f90 b/sammy/src/blk/Convolution_common.f90 similarity index 69% rename from sammy/src/blk/CapYCorrections_common.f90 rename to sammy/src/blk/Convolution_common.f90 index e4427788e..43c937565 100644 --- a/sammy/src/blk/CapYCorrections_common.f90 +++ b/sammy/src/blk/Convolution_common.f90 @@ -3,10 +3,13 @@ ! * used to pass the variables contained in C++ classes until ! * the code has been fully modernized. ! **********************************************************/ -module CapYCorrections_common_m - use CapYieldCorrections_M +module Convolution_common_m + use CapYieldCorrections_M + use YieldNormalization_M IMPLICIT NONE type(CapYieldCorrections)::capYieldCor -end module CapYCorrections_common_m + type(YieldNormalization)::yNorm + +end module Convolution_common_m diff --git a/sammy/src/blk/Observable_common.f90 b/sammy/src/blk/Observable_common.f90 new file mode 100644 index 000000000..7fd5eb21f --- /dev/null +++ b/sammy/src/blk/Observable_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 Observable_common_m + use Yield_M + IMPLICIT NONE + + type(Yield)::yld + +end module Observable_common_m diff --git a/sammy/src/convolution/CMakeLists.txt b/sammy/src/convolution/CMakeLists.txt index 81c874b58..f576ac814 100644 --- a/sammy/src/convolution/CMakeLists.txt +++ b/sammy/src/convolution/CMakeLists.txt @@ -11,8 +11,10 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) # Set headers SET(HEADERS CapYieldCorrections.h - interface/cpp/CapYieldCorrectionsInterface.h + + YieldNormalization.h + interface/cpp/YieldNormalizationInterface.h ) APPEND_SET(CONVOLUTION_SOURCES @@ -21,6 +23,11 @@ APPEND_SET(CONVOLUTION_SOURCES interface/cpp/CapYieldCorrectionsInterface.cpp interface/fortran/CapYieldCorrections_I.f90 interface/fortran/CapYieldCorrections_M.f90 + + YieldNormalization.cpp + interface/cpp/YieldNormalizationInterface.cpp + interface/fortran/YieldNormalization_I.f90 + interface/fortran/YieldNormalization_M.f90 ) diff --git a/sammy/src/convolution/CapYieldCorrections.cpp b/sammy/src/convolution/CapYieldCorrections.cpp index ace8fdc6c..8c8f736ac 100644 --- a/sammy/src/convolution/CapYieldCorrections.cpp +++ b/sammy/src/convolution/CapYieldCorrections.cpp @@ -86,6 +86,9 @@ namespace sammy{ if( N_sigma <= 0.0 ){ std::ostringstream err; err << "(sample thickness [at/b]) * (tot. x.s. [b]) is less than zero" << std::endl; + err << "--------------------------------" << std::endl; + err << "N * sigma_tot = " << N_sigma << std::endl; + err << "--------------------------------" << std::endl; throw std::runtime_error(err.str()); } @@ -94,10 +97,11 @@ namespace sammy{ std::ostringstream err; err << "Under or overflow may occur in exponent. Check sample thickness" << std::endl; err << " and total cross section values." << std::endl; + err << "--------------------------------" << std::endl; + err << "N * sigma_tot = " << N_sigma << std::endl; + err << "--------------------------------" << std::endl; throw std::runtime_error(err.str()); } - - } void CapYieldCorrections::check_attenFactor(const double &attenFactor) @@ -106,7 +110,9 @@ namespace sammy{ if( attenFactor <= 0.0 ){ std::ostringstream err; err << "Gamma attenuation factor C1 (from documentation) is less than zero" << std::endl; + err << "--------------------------------" << std::endl; err << "C1 = " << attenFactor << std::endl; + err << "--------------------------------" << std::endl; throw std::runtime_error(err.str()); } @@ -115,7 +121,9 @@ namespace sammy{ 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 << "--------------------------------" << std::endl; err << "C1 = " << attenFactor << std::endl; + err << "--------------------------------" << std::endl; throw std::runtime_error(err.str()); } } @@ -126,9 +134,10 @@ namespace sammy{ 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 << "--------------------------------" << std::endl; err << "k_a = " << gammaCor << std::endl; + err << "--------------------------------" << std::endl; throw std::runtime_error(err.str()); } } - } \ No newline at end of file diff --git a/sammy/src/convolution/YieldNormalization.cpp b/sammy/src/convolution/YieldNormalization.cpp new file mode 100644 index 000000000..1c0ed3720 --- /dev/null +++ b/sammy/src/convolution/YieldNormalization.cpp @@ -0,0 +1,142 @@ + +#include "YieldNormalization.h" + +#include <iostream> +namespace sammy{ + + YieldNormalization::YieldNormalization(){} + + void YieldNormalization::norm(sammy::Yield & yld, sammy::SampleDimensions & sd, + sammy::MultipleScattering &multScat, double & sigTot) + { + // How many scatters considered before neutron absorption? + // (We change the behavior of normTypes == 1 and 2 for different scatters) + int NS = multScat.getNumScatters(); + + if( yld.normTypeIsSelfShielded() ) + { + selfShielded(yld,sd); + } + else if( yld.normTypeIsDivideByN() ) + { + divideByN(yld, sd, NS); + } + else if( yld.normTypeIsTimesSigTot() ) + { + timesSigmaTot(yld, sd, sigTot, NS); + } + else + { + std::ostringstream err; + err << "------------------------------------------" << std::endl; + err << "The yield normalization type has not been set, check input file." << std::endl; + err << "------------------------------------------" << std::endl; + throw std::runtime_error(err.str()); + } + } + + void YieldNormalization::selfShielded(sammy::Yield &yld, sammy::SampleDimensions &sd) + { + yld.setY0( yld.getY0() * sd.getArealDensity() ); + } + + void YieldNormalization::divideByN(sammy::Yield &yld, sammy::SampleDimensions &sd, int numScatters) + { + if( numScatters == 0 ) + { + // do nothing + } + + if( numScatters == 1 or numScatters == 2 ) + { + // Yield + yld.setY1( yld.getY1() / sd.getArealDensity() ); + + // if numParam == 0, we don't need to calculate + for( int i=0; i<yld.getNumTotalParam(); i++ ) + { + // Derivative of yield + yld.setDerivY1(i, yld.getDerivY1(i) / sd.getArealDensity() ); + } + } + + // Really if the number of scatters is >= 2 + if( numScatters == 2 ) + { + // Yield + yld.setY2( yld.getY2() / sd.getArealDensity() ); + + // if numParam == 0, we don't need to calculate + for( int i=0; i<yld.getNumTotalParam(); i++ ) + { + // Derivative of yield + yld.setDerivY2(i, yld.getDerivY2(i) / sd.getArealDensity() ); + } + } + } + + void YieldNormalization::timesSigmaTot(sammy::Yield &yld, sammy::SampleDimensions &sd, + double & sigTot, int numScatters) + { + // for all cases + yld.setY0( yld.getY0() * sigTot * sd.getArealDensity() ); + + if( numScatters == 0 ) + { + // nothing extra + } + + if( numScatters == 1 or numScatters == 2 ) + { + yld.setY1( yld.getY1() * sigTot ); + + // if numParam == 0, we don't need to calculate + for( int i=0; i<yld.getNumTotalParam(); i++ ) + { + yld.setDerivY1(i, yld.getDerivY1(i) * sigTot ); + } + } + + if( numScatters == 2 ) + { + yld.setY2( yld.getY2() * sigTot ); + + // if numParam == 0, we don't need to calculate + for( int i=0; i<yld.getNumTotalParam(); i++ ) + { + yld.setDerivY2(i, yld.getDerivY2(i) * sigTot ); + } + } + } + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sammy/src/convolution/YieldNormalization.h b/sammy/src/convolution/YieldNormalization.h new file mode 100644 index 000000000..b592d3f83 --- /dev/null +++ b/sammy/src/convolution/YieldNormalization.h @@ -0,0 +1,60 @@ +#ifndef YIELDNORMALIZATION_H +#define YIELDNORMALIZATION_H + +#include "../salmon/Yield.h" +#include "../salmon/ExperimentalParameters.h" +#include "../salmon/MultipleScattering.h" + +namespace sammy{ + + /** @brief Normalization of the observed yield + + This class applies normalization to yields (capture, fission, scattering...) + @date February 2020 + */ + class YieldNormalization + { + public: + YieldNormalization(); + YieldNormalization(const YieldNormalization& orig); + virtual ~YieldNormalization(){}; + + /** + * Master normalization function + */ + void norm(sammy::Yield & yld, sammy::SampleDimensions & sd, + sammy::MultipleScattering &multScat, double & sigTot ); + + /** + * Normalize as self-shielded yield \f$ Y \f$ + * \f[ = \frac{\sigma_x}{\sigma_t} \left(1-e^{-n\sigma_t}\right) \f] + */ + void selfShielded(sammy::Yield & yld, sammy::SampleDimensions &sd); + + /** + * Normalize as self-shielded yield divided by sample thickness \f$ Y/n \f$ which, in the + * thin sample approximation, is \f$ \approx \sigma_x \f$ + * \f[ = \frac{\sigma_\gamma}{\sigma_t n} \left(1-e^{-n\sigma_t}\right) \f] + */ + void divideByN(sammy::Yield & yld, sammy::SampleDimensions &sd, int numScatters); + + /** + * Normalize as self-shielded yield \f$ Y \f$ multiplied by total cross section \f$ \sigma_t \f$ + * \f[ = \sigma_x \left(1-e^{-n\sigma_t}\right) \f] + */ + void timesSigmaTot(sammy::Yield & yld, sammy::SampleDimensions &sd, + double & sigTot, int numScatters); + + /** + * Check that the number of varied parameters is greater than zero if + * Bayes' equations are to be solved + * @param yld A sammy::Yield object + */ + //void checkNumParam(sammy::Yield & yld); + + }; + +} + + +#endif // YIELDNORMALIZATION_H \ No newline at end of file diff --git a/sammy/src/convolution/cmake/Dependencies.cmake b/sammy/src/convolution/cmake/Dependencies.cmake index 13244a48a..1cbd56532 100644 --- a/sammy/src/convolution/cmake/Dependencies.cmake +++ b/sammy/src/convolution/cmake/Dependencies.cmake @@ -1,4 +1,4 @@ -SET(LIB_REQUIRED_DEP_PACKAGES) +SET(LIB_REQUIRED_DEP_PACKAGES salmon) SET(LIB_OPTIONAL_DEP_PACKAGES) SET(TEST_REQUIRED_DEP_PACKAGES) SET(TEST_OPTIONAL_DEP_PACKAGES) diff --git a/sammy/src/convolution/interface/cix/YieldNormalization.cpp2f.xml b/sammy/src/convolution/interface/cix/YieldNormalization.cpp2f.xml new file mode 100644 index 000000000..c3fc0a03e --- /dev/null +++ b/sammy/src/convolution/interface/cix/YieldNormalization.cpp2f.xml @@ -0,0 +1,15 @@ +<generate name="YieldNormalization"> + <include_relative name="../../YieldNormalization.h"/> + <using_namespace name="sammy"/> + + <class name="YieldNormalization"> + + <method name="norm"> + <param name="yld" type="Yield"/> + <param name="sampDim" type="SampleDimensions"/> + <param name="multscat" type="MultipleScattering"/> + <param name="sigTot" type="double"/> + </method> + + </class> +</generate> \ No newline at end of file diff --git a/sammy/src/convolution/interface/cpp/YieldNormalizationInterface.cpp b/sammy/src/convolution/interface/cpp/YieldNormalizationInterface.cpp new file mode 100644 index 000000000..908f0efc9 --- /dev/null +++ b/sammy/src/convolution/interface/cpp/YieldNormalizationInterface.cpp @@ -0,0 +1,26 @@ +/*! +* 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: Mon Mar 02 10:18:42 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 "YieldNormalizationInterface.h" +using namespace sammy; +void YieldNormalization_norm(void * YieldNormalization_ptr,Yield * yld,SampleDimensions * sampDim,MultipleScattering * multscat,double * sigTot) +{ + ((YieldNormalization*)YieldNormalization_ptr)->norm(*yld,*sampDim,*multscat,*sigTot); +} + +void* YieldNormalization_initialize() +{ + return new YieldNormalization(); +} + +void YieldNormalization_destroy(void * YieldNormalization_ptr) +{ + delete (YieldNormalization*)YieldNormalization_ptr; +} + diff --git a/sammy/src/convolution/interface/cpp/YieldNormalizationInterface.h b/sammy/src/convolution/interface/cpp/YieldNormalizationInterface.h new file mode 100644 index 000000000..36db444e9 --- /dev/null +++ b/sammy/src/convolution/interface/cpp/YieldNormalizationInterface.h @@ -0,0 +1,22 @@ +/*! +* 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: Mon Mar 02 10:18:42 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 YIELDNORMALIZATIONINTERFACE_H +#define YIELDNORMALIZATIONINTERFACE_H +#include "../../YieldNormalization.h" +using namespace sammy; +#ifdef __cplusplus +extern "C" { +#endif +void YieldNormalization_norm(void * YieldNormalization_ptr,Yield * yld,SampleDimensions * sampDim,MultipleScattering * multscat,double * sigTot); +void* YieldNormalization_initialize(); +void YieldNormalization_destroy(void * YieldNormalization_ptr); +#ifdef __cplusplus +} +#endif +#endif /* YIELDNORMALIZATIONINTERFACE_H */ diff --git a/sammy/src/convolution/interface/fortran/YieldNormalization_I.f90 b/sammy/src/convolution/interface/fortran/YieldNormalization_I.f90 new file mode 100644 index 000000000..4610ddb66 --- /dev/null +++ b/sammy/src/convolution/interface/fortran/YieldNormalization_I.f90 @@ -0,0 +1,32 @@ +!> +!! 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: Mon Mar 02 10:18:42 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 YieldNormalization_I +use, intrinsic :: ISO_C_BINDING +interface +subroutine f_YieldNormalization_norm(YieldNormalization_ptr, yld,sampDim,multscat,sigTot ) BIND(C,name="YieldNormalization_norm") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: YieldNormalization_ptr; + type(C_PTR), value :: yld; + type(C_PTR), value :: sampDim; + type(C_PTR), value :: multscat; + real(C_DOUBLE) :: sigTot; +end subroutine +type(C_PTR) function f_YieldNormalization_initialize( )BIND(C,name="YieldNormalization_initialize") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR) :: YieldNormalization_ptr; +end function +subroutine f_YieldNormalization_destroy(this) BIND(C,name="YieldNormalization_destroy") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: this; +end subroutine +end interface +end module YieldNormalization_I diff --git a/sammy/src/convolution/interface/fortran/YieldNormalization_M.f90 b/sammy/src/convolution/interface/fortran/YieldNormalization_M.f90 new file mode 100644 index 000000000..0473ffa31 --- /dev/null +++ b/sammy/src/convolution/interface/fortran/YieldNormalization_M.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: Mon Mar 02 10:18:42 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 YieldNormalization_M +use, intrinsic :: ISO_C_BINDING +use YieldNormalization_I +use MultipleScattering_M +use ExperimentalParameters_M +use Yield_M +type YieldNormalization + type(C_PTR) :: instance_ptr=C_NULL_PTR + contains + procedure, pass(this) :: norm => YieldNormalization_norm + procedure, pass(this) :: initialize => YieldNormalization_initialize + procedure, pass(this) :: destroy => YieldNormalization_destroy +end type YieldNormalization +contains +subroutine YieldNormalization_norm(this, yld, sampDim, multscat, sigTot) + implicit none + class(YieldNormalization)::this + class(Yield)::yld + class(SampleDimensions)::sampDim + class(MultipleScattering)::multscat + real(C_DOUBLE)::sigTot + call f_YieldNormalization_norm(this%instance_ptr, yld%instance_ptr,sampDim%instance_ptr,multscat%instance_ptr,sigTot) +end subroutine +subroutine YieldNormalization_initialize(this) + implicit none + class(YieldNormalization) :: this + this%instance_ptr = f_YieldNormalization_initialize() +end subroutine +subroutine YieldNormalization_destroy(this) + implicit none + class(YieldNormalization) :: this + call f_YieldNormalization_destroy(this%instance_ptr) + this%instance_ptr = C_NULL_PTR +end subroutine +end module YieldNormalization_M diff --git a/sammy/src/convolution/tests/CMakeLists.txt b/sammy/src/convolution/tests/CMakeLists.txt index 50399bf91..1fb53c922 100644 --- a/sammy/src/convolution/tests/CMakeLists.txt +++ b/sammy/src/convolution/tests/CMakeLists.txt @@ -1,3 +1,4 @@ include(NemesisTest) ADD_NEMESIS_TEST(CapYieldCorrectionsTest.cpp TIMEOUT 60000 NP 1 ) +ADD_NEMESIS_TEST(YieldNormalizationTest.cpp TIMEOUT 60000 NP 1 ) diff --git a/sammy/src/convolution/tests/YieldNormalizationTest.cpp b/sammy/src/convolution/tests/YieldNormalizationTest.cpp new file mode 100644 index 000000000..6dd8ee1a9 --- /dev/null +++ b/sammy/src/convolution/tests/YieldNormalizationTest.cpp @@ -0,0 +1,353 @@ +#include "Nemesis/gtest/Gtest_Functions.hh" +#include "Nemesis/gtest/nemesis_gtest.hh" +#include "../YieldNormalization.h" +#include <exception> +#include <stdexcept> + +using namespace sammy; + +/************************************************************************************************** +* TODO: need to include tests for the Observable class members of yield from Observable<Yield> +**************************************************************************************************/ + +/************************************************************************************************** +* Test norm function: multiply by tot x.s., scattering = 0 +**************************************************************************************************/ +TEST( YieldNormalization,multTot_scat0 ){ + + Yield yld; + SampleDimensions sd; + MultipleScattering ms; + + YieldNormalization yNorm; + + // These change test-to-test + yld.setNormTypeTimesSigTot(); + ms.setNumScatters(0); + yld.setNumTotalParam(1); + + yld.setY0(0.1); + yld.setDerivY0(0,-0.01); + double sigTot = 3.0; + sd.setArealDensity(0.01); + + yNorm.norm(yld, sd, ms, sigTot); + + double gold_Y0 = 0.1 * sigTot * 0.01; + + ASSERT_EQ(gold_Y0, yld.getY0()); + +} + +/************************************************************************************************** +* Test norm function: multiply by tot x.s., scattering = 1 +**************************************************************************************************/ +TEST( YieldNormalization,multTot_scat1 ){ + + Yield yld; + SampleDimensions sd; + MultipleScattering ms; + + YieldNormalization yNorm; + + // These change test-to-test + yld.setNormTypeTimesSigTot(); + yld.setCalcDerivs(true); + ms.setNumScatters(1); + yld.setNumTotalParam(1); + + yld.setY0(0.1); + yld.setY1(0.2); + yld.setDerivY1(0,-0.02); + double sigTot = 3.0; + sd.setArealDensity(0.01); + + yNorm.norm(yld, sd, ms, sigTot); + + double gold_Y0 = 0.1 * sigTot * 0.01; + double gold_Y1 = 0.2 * sigTot; + double gold_DerivY1 = -0.02 * sigTot; + + ASSERT_EQ(gold_Y0, yld.getY0()); + ASSERT_EQ(gold_Y1, yld.getY1()); + ASSERT_EQ(gold_DerivY1,yld.getDerivY1(0)); + +} + +/************************************************************************************************** +* Test norm function: multiply by tot x.s., scattering = 2 +**************************************************************************************************/ +TEST( YieldNormalization,multTot_scat2 ){ + + Yield yld; + SampleDimensions sd; + MultipleScattering ms; + + YieldNormalization yNorm; + + // These change test-to-test + yld.setNormTypeTimesSigTot(); + yld.setCalcDerivs(true); + ms.setNumScatters(2); + yld.setNumTotalParam(1); + + yld.setY0(0.1); + yld.setY1(0.2); + yld.setDerivY1(0,-0.02); + yld.setY2(0.3); + yld.setDerivY2(0,-0.03); + double sigTot = 3.0; + sd.setArealDensity(0.01); + + yNorm.norm(yld, sd, ms, sigTot); + + double gold_Y0 = 0.1 * sigTot * 0.01; + double gold_Y1 = 0.2 * sigTot; + double gold_Y2 = 0.3 * sigTot; + + double gold_DerivY1 = -0.02 * sigTot; + double gold_DerivY2 = -0.03 * sigTot; + + + ASSERT_EQ(gold_Y0, yld.getY0()); + ASSERT_EQ(gold_Y1, yld.getY1()); + ASSERT_EQ(gold_Y2, yld.getY2()); + ASSERT_EQ(gold_DerivY1,yld.getDerivY1(0)); + ASSERT_EQ(gold_DerivY2,yld.getDerivY2(0)); + +} + +/************************************************************************************************** +* Test norm function: divide by thick, scattering = 0 +**************************************************************************************************/ +TEST( YieldNormalization,divideByN_scat0 ){ + + Yield yld; + SampleDimensions sd; + MultipleScattering ms; + + YieldNormalization yNorm; + + // These change test-to-test + yld.setNormTypeDivideByN(); + ms.setNumScatters(0); + + yld.setY0(0.1); + double sigTot = 3.0; + sd.setArealDensity(0.01); + + yNorm.norm(yld, sd, ms, sigTot); + + double gold_Y0 = 0.1; + + ASSERT_EQ(gold_Y0, yld.getY0()); + +} + +/************************************************************************************************** +* Test norm function: divide by thick, scattering = 1 +**************************************************************************************************/ +TEST( YieldNormalization,divideByN_scat1 ){ + + Yield yld; + SampleDimensions sd; + MultipleScattering ms; + + YieldNormalization yNorm; + + // These change test-to-test + yld.setNormTypeDivideByN(); + yld.setCalcDerivs(true); + ms.setNumScatters(1); + yld.setNumTotalParam(1); + + yld.setY0(0.1); + yld.setY1(0.2); + yld.setDerivY1(0,-0.02); + double sigTot = 3.0; + sd.setArealDensity(0.01); + + yNorm.norm(yld, sd, ms, sigTot); + + double gold_Y0 = 0.1; + double gold_Y1 = 0.2 / 0.01; + double gold_DerivY1 = -0.02 / 0.01; + + ASSERT_EQ(gold_Y0, yld.getY0()); + ASSERT_EQ(gold_Y1, yld.getY1()); + ASSERT_EQ(gold_DerivY1,yld.getDerivY1(0)); + +} + +/************************************************************************************************** +* Test norm function: divide by thick, scattering = 2 +**************************************************************************************************/ +TEST( YieldNormalization,divideByN_scat2 ){ + + Yield yld; + SampleDimensions sd; + MultipleScattering ms; + + YieldNormalization yNorm; + + // These change test-to-test + yld.setNormTypeDivideByN(); + yld.setCalcDerivs(true); + ms.setNumScatters(2); + yld.setNumTotalParam(1); + + yld.setY0(0.1); + yld.setY1(0.2); + yld.setDerivY1(0,-0.02); + yld.setY2(0.3); + yld.setDerivY2(0,-0.03); + double sigTot = 3.0; + sd.setArealDensity(0.01); + + yNorm.norm(yld, sd, ms, sigTot); + + double gold_Y0 = 0.1; + double gold_Y1 = 0.2 / 0.01; + double gold_DerivY1 = -0.02 / 0.01; + double gold_Y2 = 0.3 / 0.01; + double gold_DerivY2 = -0.03 / 0.01; + + ASSERT_EQ(gold_Y0, yld.getY0()); + ASSERT_EQ(gold_Y1, yld.getY1()); + ASSERT_EQ(gold_DerivY1,yld.getDerivY1(0)); + ASSERT_EQ(gold_Y2, yld.getY2()); + ASSERT_EQ(gold_DerivY2,yld.getDerivY2(0)); + +} + +/************************************************************************************************** +* Test norm function: self-shielded norm, scattering = 0 +**************************************************************************************************/ +TEST( YieldNormalization,selfShielded_scat0 ){ + + Yield yld; + SampleDimensions sd; + MultipleScattering ms; + + YieldNormalization yNorm; + + // These change test-to-test + yld.setNormTypeSelfShielded(); + ms.setNumScatters(0); + + yld.setY0(0.1); + double sigTot = 3.0; + sd.setArealDensity(0.01); + + yNorm.norm(yld, sd, ms, sigTot); + + double gold_Y0 = 0.1 * 0.01; + + ASSERT_EQ(gold_Y0, yld.getY0()); + +} + +/************************************************************************************************** +* Test norm function: self-shielded norm, scattering = 1 +**************************************************************************************************/ +TEST( YieldNormalization,selfShielded_scat1 ){ + + Yield yld; + SampleDimensions sd; + MultipleScattering ms; + + YieldNormalization yNorm; + + // These change test-to-test + yld.setNormTypeSelfShielded(); + yld.setCalcDerivs(true); + ms.setNumScatters(1); + yld.setNumTotalParam(1); + + yld.setY0(0.1); + yld.setY1(0.2); + yld.setDerivY1(0,-0.02); + double sigTot = 3.0; + sd.setArealDensity(0.01); + + yNorm.norm(yld, sd, ms, sigTot); + + double gold_Y0 = 0.1 * 0.01; + double gold_Y1 = 0.2; + double gold_DerivY1 = -0.02; + + ASSERT_EQ(gold_Y0, yld.getY0()); + ASSERT_EQ(gold_Y1, yld.getY1()); + ASSERT_EQ(gold_DerivY1,yld.getDerivY1(0)); + +} + +/************************************************************************************************** +* Test norm function: self-shielded norm, scattering = 2 +**************************************************************************************************/ +TEST( YieldNormalization,selfShielded_scat2 ){ + + Yield yld; + SampleDimensions sd; + MultipleScattering ms; + + YieldNormalization yNorm; + + // These change test-to-test + yld.setNormTypeSelfShielded(); + yld.setCalcDerivs(true); + ms.setNumScatters(2); + yld.setNumTotalParam(1); + + yld.setY0(0.1); + yld.setY1(0.2); + yld.setDerivY1(0,-0.02); + yld.setY2(0.3); + yld.setDerivY2(0,-0.03); + double sigTot = 3.0; + sd.setArealDensity(0.01); + + yNorm.norm(yld, sd, ms, sigTot); + + double gold_Y0 = 0.1 * 0.01; + double gold_Y1 = 0.2; + double gold_DerivY1 = -0.02; + double gold_Y2 = 0.3; + double gold_DerivY2 = -0.03; + + ASSERT_EQ(gold_Y0, yld.getY0()); + ASSERT_EQ(gold_Y1, yld.getY1()); + ASSERT_EQ(gold_DerivY1,yld.getDerivY1(0)); + ASSERT_EQ(gold_Y2, yld.getY2()); + ASSERT_EQ(gold_DerivY2,yld.getDerivY2(0)); + +} + +/************************************************************************************************** +* Test norm function: normalization not set, throw the user an error +**************************************************************************************************/ +TEST( YieldNormalization,normNotSet ){ + + Yield yld; + SampleDimensions sd; + MultipleScattering ms; + + double sigTot = 3.0; + + YieldNormalization yNorm; + + // Expect to throw error + int gold_result = 0; + int result; + + try{ + yNorm.norm(yld, sd, ms, sigTot); + result = 1; + } + catch(...){ + result = 0; + } + + + ASSERT_EQ(gold_result,result); +} diff --git a/sammy/src/endf/CovarianceData.h b/sammy/src/endf/CovarianceData.h index 9c1031ea5..602ae91a6 100644 --- a/sammy/src/endf/CovarianceData.h +++ b/sammy/src/endf/CovarianceData.h @@ -173,7 +173,7 @@ namespace sammy{ /** - * Get the number of total parameters + * Get the number of total parameters: The pup'd and non-pup'd */ int getNumTotalParam() const{ return (int)paramIndex.size(); diff --git a/sammy/src/inp/minp04.F b/sammy/src/inp/minp04.F index e58f420c3..2e68ef8e7 100644 --- a/sammy/src/inp/minp04.F +++ b/sammy/src/inp/minp04.F @@ -14,6 +14,7 @@ C use lbro_common_m use misccc_common_m use ntyp_common_m + use Observable_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) C C @@ -81,25 +82,26 @@ C C IF (Kdebug.EQ.0) Debug = .False. IF (Kdebug.EQ.1) Debug = .True. - IF (Kyield.EQ.-1 .AND. (Kssmsc.GT.0 .OR. Kssmsc.EQ.-2)) THEN - WRITE (6,10000) - WRITE (21,10000) -10000 FORMAT (/, ' ### CAUTION -- Normalization method has not been - * specified in INPut file. ###', /, - * ' ### See page 56r of the SAMMY users manual for a des - *cription ###', /, - * ' ### of the various options. Please add the appropria - *te command ###', /, - * ' ### to your INPut file and resubmit. Possibilities x - *include ###', /, - * ' ### NORMALIZE AS CROSS SECTION or CROSS SECTION x - * ###', /, - * ' ### NORMALIZE AS YIELD RATHER or YIELD x - * ###', /, - * ' ### NORMALIZE AS (1-E)SIGMA x - * ###') - STOP - END IF +C IF (yld%getNormType().EQ.-1 .AND. +C * (Kssmsc.GT.0 .OR. Kssmsc.EQ.-2)) THEN +C WRITE (6,10000) +C WRITE (21,10000) +C 10000 FORMAT (/, ' ### CAUTION -- Normalization method has not been +C * specified in INPut file. ###', /, +C * ' ### See page 56r of the SAMMY users manual for a des +C *cription ###', /, +C * ' ### of the various options. Please add the appropria +C *te command ###', /, +C * ' ### to your INPut file and resubmit. Possibilities x +C *include ###', /, +C * ' ### NORMALIZE AS CROSS SECTION or CROSS SECTION x +C * ###', /, +C * ' ### NORMALIZE AS YIELD RATHER or YIELD x +C * ###', /, +C * ' ### NORMALIZE AS (1-E)SIGMA x +C * ###') +C STOP +C END IF C IF (Mretro.EQ.1) THEN IF (Nretro.EQ.1) THEN @@ -189,6 +191,7 @@ C use broad_common_m use namfil_common_m use lbro_common_m + use Observable_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) C #ifdef COMPILE_WITH_SAMINT @@ -533,11 +536,12 @@ C C *** Do not make plot file of multiple-scattering pieces (-268,269) Kwssms = 0 C -C *** Normalize as cross section rather than yield +C *** Normalize as cross section rather than yield +C *** Kyield=yld%getNormType() C *** for Kyield=1: (270,271) cross section C *** for Kyield=0: (272,273) yield C *** for Kyield=2: (274 ) 1-e - Kyield = -1 + !call yld%setNormType(-1) C C *** Do not prepare ssm comparison file (-275) C *** (i.e., do not print multiple-scattering corrections) diff --git a/sammy/src/inp/minp05.F b/sammy/src/inp/minp05.F index 2c6bd23e0..6292686e5 100644 --- a/sammy/src/inp/minp05.F +++ b/sammy/src/inp/minp05.F @@ -15,6 +15,7 @@ C use namfil_common_m use lbro_common_m use misccc_common_m + use Observable_common_m use mdf5_m IMPLICIT DOUBLE PRECISION (a-h,o-z) @@ -416,11 +417,11 @@ C ELSE IF (Number.EQ.268 .OR. Number.EQ.269) THEN Kwssms = 1 ELSE IF (Number.EQ.270 .OR. Number.EQ.271) THEN - Kyield = 1 + call yld%setNormTypeDivideByN() ELSE IF (Number.EQ.272 .OR. Number.EQ.273) THEN - Kyield = 0 + call yld%setNormTypeSelfShielded() ELSE IF (Number.EQ.274) THEN - Kyield = 2 + call yld%setNormTypeTimesSigTot() ELSE IF (Number.EQ.275) THEN Kssmpr = 1 ELSE IF (Number.EQ.276 .OR. Number.eq.277) THEN diff --git a/sammy/src/mso/mmso5.f b/sammy/src/mso/mmso5.f index 792fd5a5f..23fff9a61 100644 --- a/sammy/src/mso/mmso5.f +++ b/sammy/src/mso/mmso5.f @@ -487,13 +487,14 @@ C use fixedi_m use ifwrit_m use fixedr_m + use Observable_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Capsig(*), Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*), * Dy2(*), Sigxxx(*), Dasigx(*), Dbsigx(*) DATA Zero /0.0d0/, Half /0.5d0/, One /1.0d0/ C C *** Default normalization is such that Y0 = (1-e)Capture /(n Total) -C *** Which corresponds to Kyield=1 +C *** Which corresponds to yld%normTypeIsDivideByN()==true C Cap = Capsig(Nn) IF (Kssmsc.NE.-2) THEN @@ -522,15 +523,15 @@ C Sigxxx(1) = Y0 IF (Kssmsc.NE.-2) Sigxxx(1) = Sigxxx(1) + Y1 IF (Kssdbl.EQ. 1) Sigxxx(1) = Sigxxx(1) + Y2 - IF (Kyield.EQ. 0) Sigxxx(1) = Sigxxx(1)*Dthick - IF (Kyield.EQ. 2) Sigxxx(1) = Sigxxx(1)*Total*Dthick + IF (yld%normTypeIsSelfShielded() ) Sigxxx(1) = Sigxxx(1)*Dthick + IF (yld%normTypeIsTimesSigTot()) Sigxxx(1) =Sigxxx(1)*Total*Dthick C IF (Kssmpr.EQ.1) THEN - IF (Kyield.EQ.0) THEN + IF ( yld%normTypeIsSelfShielded() ) THEN Y0 = Y0 * Dthick Y1 = Y1 * Dthick Y2 = Y2 * Dthick - ELSE IF (Kyield.EQ.2) THEN + ELSE IF ( yld%normTypeIsTimesSigTot() ) THEN Y0 = Y0 * Dthick * Total Y1 = Y1 * Dthick * Total Y2 = Y2 * Dthick * Total @@ -551,9 +552,9 @@ C IF (Kvthck.GT.0) THEN C *** Add deriv of Y0 wrt Thickness; modify deriv of Y1 & Y2 wrt Thick Kv = Kvthck - Nvadif - Ndasig - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) THEN Dbsigx(Kv) = Exp1*Cap + Dbsigx(Kv) - ELSE IF (Kyield.EQ.1) THEN + ELSE IF (yld%normTypeIsDivideByN()) THEN Sn = Dthick*Total IF (Sn.LT.0.3d0) THEN Abc = Abcexp (-Sn, A, B, C, D, Ijklmn) @@ -564,14 +565,14 @@ C *** Add deriv of Y0 wrt Thickness; modify deriv of Y1 & Y2 wrt Thick Dbsigx(Kv) = F + Dbsigx(Kv) IF (Kssmsc.NE.-2) Dbsigx(Kv) = Dbsigx(Kv) - Y1/Dthick IF (Kssdbl.EQ. 1) Dbsigx(Kv) = Dbsigx(Kv) - Y2/Dthick - ELSE IF (Kyield.EQ.2) THEN + ELSE IF (yld%normTypeIsTimesSigTot()) THEN 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 + IF (yld%normTypeIsSelfShielded()) Asensn = Asensn * Dthick + IF (yld%normTypeIsTimesSigTot()) Asensn = Asensn *Dthick *Total C *** Add deriv of Y0 wrt neutron sensitivity multiplier Kv = Ksensc - Nvadif - Ndasig Dbsigx(Kv) = Asensn @@ -586,6 +587,7 @@ C * Dy2, Y0, Y1, Y2, Dthick, Total, Exp1, Dddyy0, Nn, Nd, Na) use fixedi_m use ifwrit_m + use Observable_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*), Dy2(*),ds(*) DATA One /1.0d0/ @@ -594,40 +596,40 @@ C Iipar = Ipar + Na C C *** First, the derivative of Y0 wrt u(Iipar) - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) 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 + ELSE IF (yld%normTypeIsDivideByN()) 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 + ELSE IF (yld%normTypeIsTimesSigTot()) THEN Ds(Ipar) = Ds(Ipar) + (One-Exp1)*Dcapsi(Iipar,Nn) * + Dtotsi(Iipar,Nn)*Exp1*Cap*Dthick END IF C IF (Kssmsc.NE.-2) THEN C *** Next, the derivative of Y1 wrt u(Iipar) - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar)*Dthick - ELSE IF (Kyield.EQ.1) THEN + ELSE IF (yld%normTypeIsDivideByN()) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) - ELSE IF (Kyield.EQ.2) THEN + ELSE IF (yld%normTypeIsTimesSigTot()) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar)*Total*Dthick + * Y1*Dtotsi(Iipar,Nn)*Dthick END IF C IF (Kssdbl.EQ.1) THEN C *** Finally, the derivative of Y2 wrt u(Iipar) - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) THEN Ds(Ipar) = Ds(Ipar) + Dy2(Iipar)*Dthick - ELSE IF (Kyield.EQ.1) THEN + ELSE IF (yld%normTypeIsDivideByN()) THEN Ds(Ipar) = Ds(Ipar) + Dy2(Iipar) - ELSE IF (Kyield.EQ.2) THEN + ELSE IF (yld%normTypeIsTimesSigTot()) THEN Ds(Ipar) = Ds(Ipar) + Dy2(Iipar)*Total*Dthick * + Y2*Dtotsi(Iipar,Nn)*Dthick END IF diff --git a/sammy/src/par/mpar0.f b/sammy/src/par/mpar0.f index afaa8d445..3650a3b7e 100644 --- a/sammy/src/par/mpar0.f +++ b/sammy/src/par/mpar0.f @@ -427,7 +427,9 @@ C use fixedr_m use ExpPars_common_m use EndfData_common_m + use Observable_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) + character(len=80)::norm_string DATA Zero /0.0d0/ real(kind=8) Ybeam @@ -448,17 +450,15 @@ C 10700 FORMAT ('sigma.dat') WRITE (12,10800) Lllmax-1, Numiso 10800 FORMAT (2I3) - IF (Kyield.EQ.0) THEN - WRITE (12,10900) -10900 FORMAT ('Yield = Normalization type') - ELSE IF (Kyield.EQ.1) THEN - WRITE (12,11000) -11000 FORMAT ('Cross section = Normalization type') - ELSE IF (Kyield.EQ.2) THEN - WRITE (12,11100) -11100 FORMAT ('Other (1-e)sigma = Normalization type') + call yld%getNormString(norm_string) + IF ( yld%normTypeIsSelfShielded() ) THEN + WRITE (12,*) norm_string + ELSE IF ( yld%normTypeIsDivideByN() ) THEN + WRITE (12,*) norm_string + ELSE IF ( yld%normTypeIsTimesSigTot() ) THEN + WRITE (12,*) norm_string ELSE - STOP '[STOP in mpar0.f, Kyield is unknown]' + STOP '[STOP in mpar0.f, Kyield/( normaliz. type) is unknown]' END IF IF (Numiso.GT.0) THEN WRITE (12,11200) (resParData%getMassForIsotope(I),I=1,Numiso) diff --git a/sammy/src/ref/mcon.F b/sammy/src/ref/mcon.F index 270828393..7a9852c99 100644 --- a/sammy/src/ref/mcon.F +++ b/sammy/src/ref/mcon.F @@ -19,6 +19,7 @@ C These are here to replace the common block use zzzzz_common_m use EndfData_common_m use Samdat_0_M + use Observable_common_m C this is not a common block, this contains functions use mold4_m IMPLICIT DOUBLE PRECISION (A-h,o-z) @@ -31,6 +32,7 @@ CC **************************************************** C real(kind=8)::A(-1*(SAMMY_ARRAY_SIZE):(SAMMY_ARRAY_SIZE)) + call yld%initialize() call resParData%initialize() call covData%initialize() call covData%makeNewCovariance() diff --git a/sammy/src/salmon/CMakeLists.txt b/sammy/src/salmon/CMakeLists.txt index f80412a95..c26baf928 100644 --- a/sammy/src/salmon/CMakeLists.txt +++ b/sammy/src/salmon/CMakeLists.txt @@ -1,5 +1,8 @@ INCLUDE(SammyPackageSetup) +# -------------------------------------- +# SAmmy Legacy Memory Obsolete Now +# -------------------------------------- TRIBITS_PACKAGE(salmon) @@ -14,6 +17,9 @@ SET(HEADERS ExperimentalParameters.h MultipleScattering.h interface/cpp/MultipleScatteringInterface.h + + Yield.h + interface/cpp/YieldInterface.h ) APPEND_SET(SALMON_SOURCES @@ -27,6 +33,11 @@ APPEND_SET(SALMON_SOURCES interface/cpp/MultipleScatteringInterface.cpp interface/fortran/MultipleScattering_M.f90 interface/fortran/MultipleScattering_I.f90 + + Yield.cpp + interface/cpp/YieldInterface.cpp + interface/fortran/Yield_M.f90 + interface/fortran/Yield_I.f90 ) diff --git a/sammy/src/salmon/ExperimentalParameters.cpp b/sammy/src/salmon/ExperimentalParameters.cpp index b1f6a370c..5c0ed733e 100644 --- a/sammy/src/salmon/ExperimentalParameters.cpp +++ b/sammy/src/salmon/ExperimentalParameters.cpp @@ -8,6 +8,7 @@ namespace sammy{ radius = 0.0; height = 0.0; thickness = 0.0; + arealDensity = 0.0; beamRadius = 0.0; } @@ -15,6 +16,7 @@ namespace sammy{ radius = orig.radius; height = orig.height; thickness = orig.thickness; + arealDensity = orig.arealDensity; beamRadius = orig.beamRadius; } diff --git a/sammy/src/salmon/ExperimentalParameters.h b/sammy/src/salmon/ExperimentalParameters.h index 59a60b524..17eed0c47 100644 --- a/sammy/src/salmon/ExperimentalParameters.h +++ b/sammy/src/salmon/ExperimentalParameters.h @@ -35,6 +35,13 @@ namespace sammy{ void setThickness(double t){ thickness = t; } + /** + * Set the areal density + * @param ad the areal density of the sample [at/b] + */ + void setArealDensity(double ad){ + arealDensity = ad; + } /** * Set the beam radius * @param br the beam radius [cm] @@ -72,6 +79,12 @@ namespace sammy{ double getThickness() const{ return thickness; } + /** + * Get the thickness of the sample [at/b] + */ + double getArealDensity() const{ + return arealDensity; + } /** * Get the beam radius [cm] */ @@ -106,6 +119,11 @@ namespace sammy{ ******************************/ double thickness; /**< thickness [cm] */ + /****************************** + * The thickness of the sample in atom/b + ******************************/ + double arealDensity; /**< thickness [atom/b] */ + /****************************** * The radius of the beam striking the sample in cm ******************************/ diff --git a/sammy/src/salmon/MultipleScattering.cpp b/sammy/src/salmon/MultipleScattering.cpp index 0257a6664..c83322264 100644 --- a/sammy/src/salmon/MultipleScattering.cpp +++ b/sammy/src/salmon/MultipleScattering.cpp @@ -5,6 +5,7 @@ namespace sammy{ MultipleScattering::MultipleScattering(){ + numScatters = 0; numTheta = 0; numZHatIntegration = 0; numBeamAreaIntegration = 0; @@ -18,6 +19,7 @@ namespace sammy{ } MultipleScattering::MultipleScattering(const MultipleScattering &orig){ + numScatters = orig.numScatters; numTheta = orig.numTheta; numZHatIntegration = orig.numZHatIntegration; numBeamAreaIntegration = orig.numBeamAreaIntegration; diff --git a/sammy/src/salmon/MultipleScattering.h b/sammy/src/salmon/MultipleScattering.h index 7d6d18ce5..36fd5b950 100644 --- a/sammy/src/salmon/MultipleScattering.h +++ b/sammy/src/salmon/MultipleScattering.h @@ -14,54 +14,59 @@ namespace sammy{ * Setters ******************************/ + /** + * Set number of scatters considered before neutron absorption + * @param numScat the number of scatters considered before neutron absorption + */ + void setNumScatters(int numScat) { numScatters = numScat;} /** * Set number of integration points over theta - * @ param Ntheta number of integration points over theta + * @param Ntheta number of integration points over theta */ void setNumTheta(int Ntheta) { numTheta = Ntheta;} /** * Set number of integration points in the z-direction - * @ param Ngausz number of integration points in the z-direction (4, 8, or 16 Default = 16) + * @param Ngausz number of integration points in the z-direction (4, 8, or 16 Default = 16) */ void setNumZHatIntegration(int Ngausz) { numZHatIntegration = Ngausz;} /** * Set number of integration points over cross section of beam - * @ param Ngaus number of integration points over cross section of beam (4, 8, or 16 Default = 16) + * @param Ngaus number of integration points over cross section of beam (4, 8, or 16 Default = 16) */ void setNumBeamAreaIntegration(int Ngaus) { numBeamAreaIntegration = Ngaus;} /** * Set number of theta integration points near the end points - * @ param Mtheta number of integration points theta integration near the end points + * @param Mtheta number of integration points theta integration near the end points */ void setNumThetaEndPoints(int Mtheta) { numThetaEndPoints = Mtheta;} /** * Set number of integration points for interpolation of sigma - * @ param Nxtpt number of integration points for interpolation of sigma + * @param Nxtpt number of integration points for interpolation of sigma */ void setNumInterpSigma(int Nxtpt) { numInterpSigma = Nxtpt;} /** * Set number of integration points for interpolation over sigma prime (scattered) - * @ param Mxtpt number of integration points for interpolation over sigma prime (scattered) + * @param Mxtpt number of integration points for interpolation over sigma prime (scattered) */ void setNumInterpSigmaPrime(int Mxtpt) { numInterpSigmaPrime = Mxtpt;} /** * Set minimum value of log of total cross section - * @ param Xtmin minimum value of log of total cross section + * @param Xtmin minimum value of log of total cross section */ void setLogSigmaTotMin(double Xtmin) { logSigmaTotMin = Xtmin;} /** * Set maximum value of log of total cross section - * @ param Xtmax maximum value of log of total cross section + * @param Xtmax maximum value of log of total cross section */ void setLogSigmaTotMax(double Xtmax) { logSigmaTotMax = Xtmax;} /** * Set number of integration points in theta integration near cos(theta) = 1 - * @ param Jtheta number of integration points in theta integration near cos(theta) = 1 + * @param Jtheta number of integration points in theta integration near cos(theta) = 1 */ void setNumThetaNearOne(int Jtheta) { numThetaNearOne = Jtheta;} /** * Set number of integration points in theta integration near cos(theta) = 0 - * @ param Ktheta number of integration points in theta integration near cos(theta) = 0 + * @param Ktheta number of integration points in theta integration near cos(theta) = 0 */ void setNumThetaNearZero(int Ktheta) { numThetaNearZero = Ktheta;} @@ -69,6 +74,12 @@ namespace sammy{ Getters ******************************/ + /** + * Get number of scatters considered before neutron absorption + */ + int getNumScatters() const{ + return numScatters; + } /** * Get number of integration points over theta */ @@ -134,6 +145,11 @@ namespace sammy{ private: + /** + * How many scatters to consider before neutron absorption? + */ + int numScatters; + /****************************** * The number of points to integrate over angle theta (Default = 33) ******************************/ diff --git a/sammy/src/salmon/Yield.cpp b/sammy/src/salmon/Yield.cpp new file mode 100644 index 000000000..88e4588db --- /dev/null +++ b/sammy/src/salmon/Yield.cpp @@ -0,0 +1,32 @@ +#include "Yield.h" +#include <iostream> + +namespace sammy{ + + Yield::Yield() + { + normString = ""; + normType = normalization::NOTSET; + calcDerivs = false; + numParam = 0; + Y0 = 0.0; + Y1 = 0.0; + Y2 = 0.0; + totY = 0.0; + } + + Yield::Yield(const Yield &orig) + { + normType = orig.normType; + calcDerivs = orig.calcDerivs; + numParam = orig.numParam; + Y0 = orig.Y0; + Y1 = orig.Y1; + Y2 = orig.Y2; + totY = orig.totY; + derivY0.insert( derivY0.begin(), orig.derivY0.begin(), orig.derivY0.end() ); + derivY1.insert( derivY1.begin(), orig.derivY1.begin(), orig.derivY1.end() ); + derivY2.insert( derivY2.begin(), orig.derivY2.begin(), orig.derivY2.end() ); + derivTotY.insert( derivTotY.begin(), orig.derivTotY.begin(), orig.derivTotY.end() ); + } +} \ No newline at end of file diff --git a/sammy/src/salmon/Yield.h b/sammy/src/salmon/Yield.h new file mode 100644 index 000000000..8eca77bfd --- /dev/null +++ b/sammy/src/salmon/Yield.h @@ -0,0 +1,287 @@ +#ifndef YIELD_H +#define YIELD_H + +#include <vector> +#include <string> +#include <memory> + +namespace sammy{ + + /** @brief Storage for the observed quantity of yield. + + Store the values specific to yields (capture, fission, scattering...) + @date February 2020 + */ + class Yield{ + + public: + + + /****************************** + * The type of normalization applied to the yield + ******************************/ + enum normalization {SELFSHIELDED, DIVIDEBYN, TIMESSIGTOT, NOTSET} normType; + + Yield(); + Yield(const Yield& orig); + virtual ~Yield(){}; + + /****************************** + * Setters + ******************************/ + + /** + * Set normalization type for yield to: self-shielded + */ + void setNormTypeSelfShielded() { + normType = normalization::SELFSHIELDED; + normString = "Yield = Normalization type"; + } + + /** + * Set normalization type for yield to: divide by sample thickness \f$ N \f$ + */ + void setNormTypeDivideByN() { + normType = normalization::DIVIDEBYN; + normString = "Cross section = Normalization type"; + } + + /** + * Set normalization type for yield to: multiply by \f$ \sigma_t \f$ + */ + void setNormTypeTimesSigTot() { + normType = normalization::TIMESSIGTOT; + normString = "Other (1-e)sigma = Normalization type"; + } + + /** + * Set the boolean for whether to solve Bayes (calc. derivs.) + * @param sb boolean for whether we are solving Bayes eqtns. + */ + void setCalcDerivs(bool cd) { calcDerivs = cd;} + + /** + * Set the number of varied parameters (this should be temporary...we should take + * the info from a CovarianceData object or resonance parameter object) + */ + void setNumTotalParam(int np){ + numParam = np; + } + + /** + * Set the primary yield + * @param y0 the primary yield + */ + void setY0(double y0) { Y0 = y0;} + + /** + * Set the secondary yield + * @param y1 the secondary yield + */ + void setY1(double y1) { Y1 = y1;} + + /** + * Set the tertiary yield + * @param y2 the tertiary yield + */ + void setY2(double y2) { Y2 = y2;} + + /** + * Set the total yield + * @param yt the total yield + */ + void setTotY(double yt) { totY = yt; } + + /** + * Set the derivative of primary yield w.r.t. parameter at indice iPar + * @param iPar index for the parameter of which deriv. was taken w.r.t. + * @param dy0 the primary yield + */ + void setDerivY0(int iPar, double dy0){ + if ((int)derivY0.size() < (iPar+1)){ + derivY0.resize(iPar+1); + } + derivY0[iPar] = dy0; + } + + /** + * Set the derivative of secondary yield w.r.t. parameter at indice iPar + * @param iPar index for the parameter of which deriv. was taken w.r.t. + * @param dy1 the secondary yield + */ + void setDerivY1(int iPar, double dy1){ + if ((int)derivY1.size() < (iPar+1)){ + derivY1.resize(iPar+1); + } + derivY1[iPar] = dy1; + } + + /** + * Set the derivative of tertiary yield w.r.t. parameter at indice iPar + * @param iPar index for the parameter of which deriv. was taken w.r.t. + * @param dy2 the tertiary yield + */ + void setDerivY2(int iPar, double dy2){ + if ((int)derivY2.size() < (iPar+1)){ + derivY2.resize(iPar+1); + } + derivY2[iPar] = dy2; + } + + /** + * Set the derivative of total yield w.r.t. parameter at indice iPar + * @param iPar index for the parameter of which deriv. was taken w.r.t. + * @param dyt the total yield + */ + void setDerivTotY(int iPar, double dyt){ + if ((int)derivTotY.size() < (iPar+1)){ + derivTotY.resize(iPar+1); + } + derivTotY[iPar] = dyt; + } + + /****************************** + Getters + ******************************/ + + /** + * Get the normalization string for printing + */ + std::string getNormString() const{ return normString; } + + /** + * Get boolean whether normalization type for yield is self-shielded + */ + bool normTypeIsSelfShielded() const{ + return normType == normalization::SELFSHIELDED; + } + + /** + * Get boolean whether normalization type for yield is divide by sample thickness \f$ N \f$ + */ + bool normTypeIsDivideByN() const{ + return normType == normalization::DIVIDEBYN; + } + + /** + * Get boolean whether normalization type for yield is to multiply by \f$ \sigma_t \f$ + */ + bool normTypeIsTimesSigTot() const{ + return normType == normalization::TIMESSIGTOT; + } + + /** + * Get boolean whether normalization type for yield has not been set + */ + bool normTypeIsNotSet() const{ + return normType == normalization::NOTSET; + } + + /** + * Get decision on whether we solve Bayes (calc. derivs.) + */ + bool getCalcDerivs() const{ + return calcDerivs; + } + + /** + * Get the total number of varied parameters (this should be temporary...we want to take + * the info from a CovarianceData object or resonance parameter object) + */ + int getNumTotalParam() const{ + return numParam; + } + + /** + * Get the primary yield + */ + double getY0() const{ + return Y0; + } + + /** + * Get the secondary yield + */ + double getY1() const{ + return Y1; + } + + /** + * Get the tertiary yield + */ + double getY2() const{ + return Y2; + } + + /** + * Get the total yield + */ + double getTotY() const{ + return totY; + } + + /** + * Get the derivative of primary yield w.r.t. param. iPar + * @param iPar the indice of the parameter of which der. was taken w.r.t. + */ + double getDerivY0(int iPar) const{ + return derivY0[iPar]; + } + + /** + * Get the derivative of secondary yield w.r.t. param. iPar + * @param iPar the indice of the parameter of which der. was taken w.r.t. + */ + double getDerivY1(int iPar) const{ + return derivY1[iPar]; + } + + /** + * Get the derivative of tertiary yield w.r.t. param. iPar + * @param iPar the indice of the parameter of which der. was taken w.r.t. + */ + double getDerivY2(int iPar) const{ + return derivY2[iPar]; + } + + /** + * Get the derivative oftotal yield + */ + double getDerivTotY(int iPar) const{ + return derivTotY[iPar]; + } + + private: + + /****************************** + * String to print to files, stdout, etc. + *****************************/ + + std::string normString; + + /****************************** + * Should we calculate derivatives? + *****************************/ + + bool calcDerivs; + + /****************************** + * How many varied parameters are there? + *****************************/ + int numParam; + + /****************************** + * The primary, secondary, tertiary, and total (sum) yields + ******************************/ + double Y0, Y1, Y2, totY; + + /****************************** + * The derivatives of the primary, secondary, tertiary, and total (sum) yields + ******************************/ + std::vector<double> derivY0, derivY1, derivY2, derivTotY; + }; + +} + + +#endif // YIELD_H diff --git a/sammy/src/salmon/interface/cix/ExperimentalParameters.cpp2f.xml b/sammy/src/salmon/interface/cix/ExperimentalParameters.cpp2f.xml index 4169973e6..40d773d09 100644 --- a/sammy/src/salmon/interface/cix/ExperimentalParameters.cpp2f.xml +++ b/sammy/src/salmon/interface/cix/ExperimentalParameters.cpp2f.xml @@ -13,6 +13,9 @@ <method name="setThickness"> <param name="t" type="double"/> </method> + <method name="setArealDensity"> + <param name="t" type="double"/> + </method> <method name="setBeamRadius"> <param name="br" type="double"/> </method> @@ -23,6 +26,7 @@ <method name="getRadius" return_type="double"/> <method name="getHeight" return_type="double"/> <method name="getThickness" return_type="double"/> + <method name="getArealDensity" return_type="double"/> <method name="getBeamRadius" return_type="double"/> <method name="getBeamHeight" return_type="double"/> diff --git a/sammy/src/salmon/interface/cix/MultipleScattering.cpp2f.xml b/sammy/src/salmon/interface/cix/MultipleScattering.cpp2f.xml index ae7d1a398..6262f21a1 100644 --- a/sammy/src/salmon/interface/cix/MultipleScattering.cpp2f.xml +++ b/sammy/src/salmon/interface/cix/MultipleScattering.cpp2f.xml @@ -1,9 +1,12 @@ <generate name="MultipleScattering"> - <include_relative name="../MultipleScattering.h"/> + <include_relative name="../../MultipleScattering.h"/> <using_namespace name="sammy"/> <class name="MultipleScattering"> + <method name="setNumScatters"> + <param name="ns" type="int"/> + </method> <method name="setNumTheta"> <param name="nt" type="int"/> </method> @@ -35,6 +38,7 @@ <param name="ntnearzero" type="int"/> </method> + <method name="getNumScatters" return_type="int"/> <method name="getNumTheta" return_type="int"/> <method name="getNumZHatIntegration" return_type="int"/> <method name="getNumBeamAreaIntegration" return_type="int"/> @@ -47,4 +51,4 @@ <method name="getNumThetaNearZero" return_type="int"/> </class> -</generate> \ No newline at end of file +</generate> diff --git a/sammy/src/salmon/interface/cix/Yield.cpp2f.xml b/sammy/src/salmon/interface/cix/Yield.cpp2f.xml new file mode 100644 index 000000000..1fe843295 --- /dev/null +++ b/sammy/src/salmon/interface/cix/Yield.cpp2f.xml @@ -0,0 +1,70 @@ +<generate name="Yield"> + <include_relative name="../../Yield.h"/> + <using_namespace name="sammy"/> + + <class name="Yield"> + + <method name="setNormTypeSelfShielded"/> + <method name="setNormTypeDivideByN"/> + <method name="setNormTypeTimesSigTot"/> + <method name="setCalcDerivs"> + <param name="sb" type="bool"/> + </method> + <method name="setNumTotalParam"> + <param name="np" type="int"/> + </method> + <method name="setY0"> + <param name="y0" type="double"/> + </method> + <method name="setY1"> + <param name="y1" type="double"/> + </method> + <method name="setY2"> + <param name="y2" type="double"/> + </method> + <method name="setTotY"> + <param name="toty" type="double"/> + </method> + <method name="setDerivY0"> + <param name="iPar" type="int" offset="-1"/> + <param name="dy0" type="double"/> + </method> + <method name="setDerivY1"> + <param name="iPar" type="int" offset="-1"/> + <param name="dy1" type="double"/> + </method> + <method name="setDerivY2"> + <param name="iPar" type="int" offset="-1"/> + <param name="dy2" type="double"/> + </method> + <method name="setDerivTotY"> + <param name="iPar" type="int" offset="-1"/> + <param name="dy2" type="double"/> + </method> + + <method name="getNormString" return_type="string"/> + <method name="normTypeIsSelfShielded" return_type="bool"/> + <method name="normTypeIsDivideByN" return_type="bool"/> + <method name="normTypeIsTimesSigTot" return_type="bool"/> + <method name="getCalcDerivs" return_type="bool"/> + <method name="getNumTotalParam" return_type="int"/> + <method name="getY0" return_type="double"/> + <method name="getY1" return_type="double"/> + <method name="getY2" return_type="double"/> + <method name="getTotY" return_type="double"/> + + <method name="getDerivY0" return_type="double"> + <param name="iPar" type="int" offset="-1"/> + </method> + <method name="getDerivY1" return_type="double"> + <param name="iPar" type="int" offset="-1"/> + </method> + <method name="getDerivY2" return_type="double"> + <param name="iPar" type="int" offset="-1"/> + </method> + <method name="getDerivTotY" return_type="double"> + <param name="iPar" type="int" offset="-1"/> + </method> + + </class> +</generate> \ No newline at end of file diff --git a/sammy/src/salmon/interface/cpp/ExperimentalParametersInterface.cpp b/sammy/src/salmon/interface/cpp/ExperimentalParametersInterface.cpp index c3eacbacf..96e23ad4c 100644 --- a/sammy/src/salmon/interface/cpp/ExperimentalParametersInterface.cpp +++ b/sammy/src/salmon/interface/cpp/ExperimentalParametersInterface.cpp @@ -2,7 +2,7 @@ * 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 Dec 20 13:08:25 EST 2019 +* Date Generated: Tue Mar 03 09:03:32 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 */ @@ -24,6 +24,11 @@ void SampleDimensions_setThickness(void * SampleDimensions_ptr,double * t) ((SampleDimensions*)SampleDimensions_ptr)->setThickness(*t); } +void SampleDimensions_setArealDensity(void * SampleDimensions_ptr,double * t) +{ + ((SampleDimensions*)SampleDimensions_ptr)->setArealDensity(*t); +} + void SampleDimensions_setBeamRadius(void * SampleDimensions_ptr,double * br) { ((SampleDimensions*)SampleDimensions_ptr)->setBeamRadius(*br); @@ -49,6 +54,11 @@ double SampleDimensions_getThickness(void * SampleDimensions_ptr) return ((SampleDimensions*)SampleDimensions_ptr)->getThickness(); } +double SampleDimensions_getArealDensity(void * SampleDimensions_ptr) +{ + return ((SampleDimensions*)SampleDimensions_ptr)->getArealDensity(); +} + double SampleDimensions_getBeamRadius(void * SampleDimensions_ptr) { return ((SampleDimensions*)SampleDimensions_ptr)->getBeamRadius(); diff --git a/sammy/src/salmon/interface/cpp/ExperimentalParametersInterface.h b/sammy/src/salmon/interface/cpp/ExperimentalParametersInterface.h index a33085c0e..43d5407dc 100644 --- a/sammy/src/salmon/interface/cpp/ExperimentalParametersInterface.h +++ b/sammy/src/salmon/interface/cpp/ExperimentalParametersInterface.h @@ -2,7 +2,7 @@ * 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 Dec 20 13:08:25 EST 2019 +* Date Generated: Tue Mar 03 09:03:32 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 */ @@ -16,11 +16,13 @@ extern "C" { void SampleDimensions_setRadius(void * SampleDimensions_ptr,double * r); void SampleDimensions_setHeight(void * SampleDimensions_ptr,double * h); void SampleDimensions_setThickness(void * SampleDimensions_ptr,double * t); +void SampleDimensions_setArealDensity(void * SampleDimensions_ptr,double * t); void SampleDimensions_setBeamRadius(void * SampleDimensions_ptr,double * br); void SampleDimensions_setBeamHeight(void * SampleDimensions_ptr,double * br); double SampleDimensions_getRadius(void * SampleDimensions_ptr); double SampleDimensions_getHeight(void * SampleDimensions_ptr); double SampleDimensions_getThickness(void * SampleDimensions_ptr); +double SampleDimensions_getArealDensity(void * SampleDimensions_ptr); double SampleDimensions_getBeamRadius(void * SampleDimensions_ptr); double SampleDimensions_getBeamHeight(void * SampleDimensions_ptr); void* SampleDimensions_initialize(); diff --git a/sammy/src/salmon/interface/cpp/MultipleScatteringInterface.cpp b/sammy/src/salmon/interface/cpp/MultipleScatteringInterface.cpp index 1e88a180d..65c95b66f 100644 --- a/sammy/src/salmon/interface/cpp/MultipleScatteringInterface.cpp +++ b/sammy/src/salmon/interface/cpp/MultipleScatteringInterface.cpp @@ -2,13 +2,18 @@ * 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: Mon Dec 09 09:48:43 EST 2019 +* Date Generated: Mon Mar 02 10:33:41 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 "MultipleScatteringInterface.h" using namespace sammy; +void MultipleScattering_setNumScatters(void * MultipleScattering_ptr,int * ns) +{ + ((MultipleScattering*)MultipleScattering_ptr)->setNumScatters(*ns); +} + void MultipleScattering_setNumTheta(void * MultipleScattering_ptr,int * nt) { ((MultipleScattering*)MultipleScattering_ptr)->setNumTheta(*nt); @@ -59,6 +64,11 @@ void MultipleScattering_setNumThetaNearZero(void * MultipleScattering_ptr,int * ((MultipleScattering*)MultipleScattering_ptr)->setNumThetaNearZero(*ntnearzero); } +int MultipleScattering_getNumScatters(void * MultipleScattering_ptr) +{ + return ((MultipleScattering*)MultipleScattering_ptr)->getNumScatters(); +} + int MultipleScattering_getNumTheta(void * MultipleScattering_ptr) { return ((MultipleScattering*)MultipleScattering_ptr)->getNumTheta(); diff --git a/sammy/src/salmon/interface/cpp/MultipleScatteringInterface.h b/sammy/src/salmon/interface/cpp/MultipleScatteringInterface.h index 269bd916d..778c51f06 100644 --- a/sammy/src/salmon/interface/cpp/MultipleScatteringInterface.h +++ b/sammy/src/salmon/interface/cpp/MultipleScatteringInterface.h @@ -2,7 +2,7 @@ * 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: Mon Dec 09 09:48:43 EST 2019 +* Date Generated: Mon Mar 02 10:33:41 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 */ @@ -13,6 +13,7 @@ using namespace sammy; #ifdef __cplusplus extern "C" { #endif +void MultipleScattering_setNumScatters(void * MultipleScattering_ptr,int * ns); void MultipleScattering_setNumTheta(void * MultipleScattering_ptr,int * nt); void MultipleScattering_setNumZHatIntegration(void * MultipleScattering_ptr,int * nz); void MultipleScattering_setNumBeamAreaIntegration(void * MultipleScattering_ptr,int * nba); @@ -23,6 +24,7 @@ void MultipleScattering_setLogSigmaTotMin(void * MultipleScattering_ptr,double * void MultipleScattering_setLogSigmaTotMax(void * MultipleScattering_ptr,double * nsigmax); void MultipleScattering_setNumThetaNearOne(void * MultipleScattering_ptr,int * ntnearone); void MultipleScattering_setNumThetaNearZero(void * MultipleScattering_ptr,int * ntnearzero); +int MultipleScattering_getNumScatters(void * MultipleScattering_ptr); int MultipleScattering_getNumTheta(void * MultipleScattering_ptr); int MultipleScattering_getNumZHatIntegration(void * MultipleScattering_ptr); int MultipleScattering_getNumBeamAreaIntegration(void * MultipleScattering_ptr); diff --git a/sammy/src/salmon/interface/cpp/YieldInterface.cpp b/sammy/src/salmon/interface/cpp/YieldInterface.cpp new file mode 100644 index 000000000..e118efb1b --- /dev/null +++ b/sammy/src/salmon/interface/cpp/YieldInterface.cpp @@ -0,0 +1,163 @@ +/*! +* 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: Wed Apr 08 13:29:36 EDT 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 "YieldInterface.h" +using namespace sammy; +void Yield_setNormTypeSelfShielded(void * Yield_ptr) +{ + ((Yield*)Yield_ptr)->setNormTypeSelfShielded(); +} + +void Yield_setNormTypeDivideByN(void * Yield_ptr) +{ + ((Yield*)Yield_ptr)->setNormTypeDivideByN(); +} + +void Yield_setNormTypeTimesSigTot(void * Yield_ptr) +{ + ((Yield*)Yield_ptr)->setNormTypeTimesSigTot(); +} + +void Yield_setCalcDerivs(void * Yield_ptr,bool * sb) +{ + ((Yield*)Yield_ptr)->setCalcDerivs(*sb); +} + +void Yield_setNumTotalParam(void * Yield_ptr,int * np) +{ + ((Yield*)Yield_ptr)->setNumTotalParam(*np); +} + +void Yield_setY0(void * Yield_ptr,double * y0) +{ + ((Yield*)Yield_ptr)->setY0(*y0); +} + +void Yield_setY1(void * Yield_ptr,double * y1) +{ + ((Yield*)Yield_ptr)->setY1(*y1); +} + +void Yield_setY2(void * Yield_ptr,double * y2) +{ + ((Yield*)Yield_ptr)->setY2(*y2); +} + +void Yield_setTotY(void * Yield_ptr,double * toty) +{ + ((Yield*)Yield_ptr)->setTotY(*toty); +} + +void Yield_setDerivY0(void * Yield_ptr,int * iPar,double * dy0) +{ + ((Yield*)Yield_ptr)->setDerivY0(*iPar,*dy0); +} + +void Yield_setDerivY1(void * Yield_ptr,int * iPar,double * dy1) +{ + ((Yield*)Yield_ptr)->setDerivY1(*iPar,*dy1); +} + +void Yield_setDerivY2(void * Yield_ptr,int * iPar,double * dy2) +{ + ((Yield*)Yield_ptr)->setDerivY2(*iPar,*dy2); +} + +void Yield_setDerivTotY(void * Yield_ptr,int * iPar,double * dy2) +{ + ((Yield*)Yield_ptr)->setDerivTotY(*iPar,*dy2); +} + +void Yield_getNormString(void * Yield_ptr, char * string2Populate, int * lengthOfString2Populate) +{ + const std::string& cix_string = ((Yield*)Yield_ptr)->getNormString(); + int t_length = *lengthOfString2Populate < static_cast<int>(cix_string.length()) + ? *lengthOfString2Populate : cix_string.length(); + strncpy(string2Populate, cix_string.c_str(), t_length); + for(int cix_i = t_length; cix_i < *lengthOfString2Populate; cix_i++){ + string2Populate[cix_i] = ' '; + } + +} + +bool Yield_normTypeIsSelfShielded(void * Yield_ptr) +{ + return ((Yield*)Yield_ptr)->normTypeIsSelfShielded(); +} + +bool Yield_normTypeIsDivideByN(void * Yield_ptr) +{ + return ((Yield*)Yield_ptr)->normTypeIsDivideByN(); +} + +bool Yield_normTypeIsTimesSigTot(void * Yield_ptr) +{ + return ((Yield*)Yield_ptr)->normTypeIsTimesSigTot(); +} + +bool Yield_getCalcDerivs(void * Yield_ptr) +{ + return ((Yield*)Yield_ptr)->getCalcDerivs(); +} + +int Yield_getNumTotalParam(void * Yield_ptr) +{ + return ((Yield*)Yield_ptr)->getNumTotalParam(); +} + +double Yield_getY0(void * Yield_ptr) +{ + return ((Yield*)Yield_ptr)->getY0(); +} + +double Yield_getY1(void * Yield_ptr) +{ + return ((Yield*)Yield_ptr)->getY1(); +} + +double Yield_getY2(void * Yield_ptr) +{ + return ((Yield*)Yield_ptr)->getY2(); +} + +double Yield_getTotY(void * Yield_ptr) +{ + return ((Yield*)Yield_ptr)->getTotY(); +} + +double Yield_getDerivY0(void * Yield_ptr,int * iPar) +{ + return ((Yield*)Yield_ptr)->getDerivY0(*iPar); +} + +double Yield_getDerivY1(void * Yield_ptr,int * iPar) +{ + return ((Yield*)Yield_ptr)->getDerivY1(*iPar); +} + +double Yield_getDerivY2(void * Yield_ptr,int * iPar) +{ + return ((Yield*)Yield_ptr)->getDerivY2(*iPar); +} + +double Yield_getDerivTotY(void * Yield_ptr,int * iPar) +{ + return ((Yield*)Yield_ptr)->getDerivTotY(*iPar); +} + +void* Yield_initialize() +{ + return new Yield(); +} + +void Yield_destroy(void * Yield_ptr) +{ + delete (Yield*)Yield_ptr; +} + diff --git a/sammy/src/salmon/interface/cpp/YieldInterface.h b/sammy/src/salmon/interface/cpp/YieldInterface.h new file mode 100644 index 000000000..64065a15a --- /dev/null +++ b/sammy/src/salmon/interface/cpp/YieldInterface.h @@ -0,0 +1,48 @@ +/*! +* 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: Wed Apr 08 13:29:36 EDT 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 YIELDINTERFACE_H +#define YIELDINTERFACE_H +#include "../../Yield.h" +using namespace sammy; +#ifdef __cplusplus +extern "C" { +#endif +void Yield_setNormTypeSelfShielded(void * Yield_ptr); +void Yield_setNormTypeDivideByN(void * Yield_ptr); +void Yield_setNormTypeTimesSigTot(void * Yield_ptr); +void Yield_setCalcDerivs(void * Yield_ptr,bool * sb); +void Yield_setNumTotalParam(void * Yield_ptr,int * np); +void Yield_setY0(void * Yield_ptr,double * y0); +void Yield_setY1(void * Yield_ptr,double * y1); +void Yield_setY2(void * Yield_ptr,double * y2); +void Yield_setTotY(void * Yield_ptr,double * toty); +void Yield_setDerivY0(void * Yield_ptr,int * iPar,double * dy0); +void Yield_setDerivY1(void * Yield_ptr,int * iPar,double * dy1); +void Yield_setDerivY2(void * Yield_ptr,int * iPar,double * dy2); +void Yield_setDerivTotY(void * Yield_ptr,int * iPar,double * dy2); +void Yield_getNormString(void * Yield_ptr, char * string2Populate, int * lengthOfString2Populate); +bool Yield_normTypeIsSelfShielded(void * Yield_ptr); +bool Yield_normTypeIsDivideByN(void * Yield_ptr); +bool Yield_normTypeIsTimesSigTot(void * Yield_ptr); +bool Yield_getCalcDerivs(void * Yield_ptr); +int Yield_getNumTotalParam(void * Yield_ptr); +double Yield_getY0(void * Yield_ptr); +double Yield_getY1(void * Yield_ptr); +double Yield_getY2(void * Yield_ptr); +double Yield_getTotY(void * Yield_ptr); +double Yield_getDerivY0(void * Yield_ptr,int * iPar); +double Yield_getDerivY1(void * Yield_ptr,int * iPar); +double Yield_getDerivY2(void * Yield_ptr,int * iPar); +double Yield_getDerivTotY(void * Yield_ptr,int * iPar); +void* Yield_initialize(); +void Yield_destroy(void * Yield_ptr); +#ifdef __cplusplus +} +#endif +#endif /* YIELDINTERFACE_H */ diff --git a/sammy/src/salmon/interface/fortran/ExperimentalParameters_I.f90 b/sammy/src/salmon/interface/fortran/ExperimentalParameters_I.f90 index 060172f10..f51a57315 100644 --- a/sammy/src/salmon/interface/fortran/ExperimentalParameters_I.f90 +++ b/sammy/src/salmon/interface/fortran/ExperimentalParameters_I.f90 @@ -2,7 +2,7 @@ !! 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 Dec 20 13:08:25 EST 2019 +!! Date Generated: Tue Mar 03 09:03:32 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 !!/ @@ -27,6 +27,12 @@ subroutine f_SampleDimensions_setThickness(SampleDimensions_ptr, t ) BIND(C,name type(C_PTR), value :: SampleDimensions_ptr; real(C_DOUBLE) :: t; end subroutine +subroutine f_SampleDimensions_setArealDensity(SampleDimensions_ptr, t ) BIND(C,name="SampleDimensions_setArealDensity") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: SampleDimensions_ptr; + real(C_DOUBLE) :: t; +end subroutine subroutine f_SampleDimensions_setBeamRadius(SampleDimensions_ptr, br ) BIND(C,name="SampleDimensions_setBeamRadius") use,intrinsic :: ISO_C_BINDING implicit none @@ -54,6 +60,11 @@ real(C_DOUBLE) function f_SampleDimensions_getThickness(SampleDimensions_ptr ) B implicit none type(C_PTR), value :: SampleDimensions_ptr; end function +real(C_DOUBLE) function f_SampleDimensions_getArealDensity(SampleDimensions_ptr ) BIND(C,name="SampleDimensions_getArealDensity") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: SampleDimensions_ptr; +end function real(C_DOUBLE) function f_SampleDimensions_getBeamRadius(SampleDimensions_ptr ) BIND(C,name="SampleDimensions_getBeamRadius") use,intrinsic :: ISO_C_BINDING implicit none diff --git a/sammy/src/salmon/interface/fortran/ExperimentalParameters_M.f90 b/sammy/src/salmon/interface/fortran/ExperimentalParameters_M.f90 index b24a121f3..b608ed5de 100644 --- a/sammy/src/salmon/interface/fortran/ExperimentalParameters_M.f90 +++ b/sammy/src/salmon/interface/fortran/ExperimentalParameters_M.f90 @@ -2,7 +2,7 @@ !! 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 Dec 20 13:08:25 EST 2019 +!! Date Generated: Tue Mar 03 09:03:32 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 !!/ @@ -15,11 +15,13 @@ type SampleDimensions procedure, pass(this) :: setRadius => SampleDimensions_setRadius procedure, pass(this) :: setHeight => SampleDimensions_setHeight procedure, pass(this) :: setThickness => SampleDimensions_setThickness + procedure, pass(this) :: setArealDensity => SampleDimensions_setArealDensity procedure, pass(this) :: setBeamRadius => SampleDimensions_setBeamRadius procedure, pass(this) :: setBeamHeight => SampleDimensions_setBeamHeight procedure, pass(this) :: getRadius => SampleDimensions_getRadius procedure, pass(this) :: getHeight => SampleDimensions_getHeight procedure, pass(this) :: getThickness => SampleDimensions_getThickness + procedure, pass(this) :: getArealDensity => SampleDimensions_getArealDensity procedure, pass(this) :: getBeamRadius => SampleDimensions_getBeamRadius procedure, pass(this) :: getBeamHeight => SampleDimensions_getBeamHeight procedure, pass(this) :: initialize => SampleDimensions_initialize @@ -54,6 +56,12 @@ subroutine SampleDimensions_setThickness(this, t) real(C_DOUBLE)::t call f_SampleDimensions_setThickness(this%instance_ptr, t) end subroutine +subroutine SampleDimensions_setArealDensity(this, t) + implicit none + class(SampleDimensions)::this + real(C_DOUBLE)::t + call f_SampleDimensions_setArealDensity(this%instance_ptr, t) +end subroutine subroutine SampleDimensions_setBeamRadius(this, br) implicit none class(SampleDimensions)::this @@ -84,6 +92,12 @@ function SampleDimensions_getThickness(this) result(result2Return) real(C_DOUBLE):: result2Return result2Return=f_SampleDimensions_getThickness(this%instance_ptr) end function +function SampleDimensions_getArealDensity(this) result(result2Return) + implicit none + class(SampleDimensions)::this + real(C_DOUBLE):: result2Return + result2Return=f_SampleDimensions_getArealDensity(this%instance_ptr) +end function function SampleDimensions_getBeamRadius(this) result(result2Return) implicit none class(SampleDimensions)::this diff --git a/sammy/src/salmon/interface/fortran/MultipleScattering_I.f90 b/sammy/src/salmon/interface/fortran/MultipleScattering_I.f90 index f25f04dc2..5422e5029 100644 --- a/sammy/src/salmon/interface/fortran/MultipleScattering_I.f90 +++ b/sammy/src/salmon/interface/fortran/MultipleScattering_I.f90 @@ -2,13 +2,19 @@ !! 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: Mon Dec 09 09:48:43 EST 2019 +!! Date Generated: Mon Mar 02 10:33:41 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 MultipleScattering_I use, intrinsic :: ISO_C_BINDING interface +subroutine f_MultipleScattering_setNumScatters(MultipleScattering_ptr, ns ) BIND(C,name="MultipleScattering_setNumScatters") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: MultipleScattering_ptr; + integer(C_INT) :: ns; +end subroutine subroutine f_MultipleScattering_setNumTheta(MultipleScattering_ptr, nt ) BIND(C,name="MultipleScattering_setNumTheta") use,intrinsic :: ISO_C_BINDING implicit none @@ -69,6 +75,11 @@ subroutine f_MultipleScattering_setNumThetaNearZero(MultipleScattering_ptr, ntne type(C_PTR), value :: MultipleScattering_ptr; integer(C_INT) :: ntnearzero; end subroutine +integer(C_INT) function f_MultipleScattering_getNumScatters(MultipleScattering_ptr ) BIND(C,name="MultipleScattering_getNumScatters") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: MultipleScattering_ptr; +end function integer(C_INT) function f_MultipleScattering_getNumTheta(MultipleScattering_ptr ) BIND(C,name="MultipleScattering_getNumTheta") use,intrinsic :: ISO_C_BINDING implicit none diff --git a/sammy/src/salmon/interface/fortran/MultipleScattering_M.f90 b/sammy/src/salmon/interface/fortran/MultipleScattering_M.f90 index aa10aee1d..d6ed8dd22 100644 --- a/sammy/src/salmon/interface/fortran/MultipleScattering_M.f90 +++ b/sammy/src/salmon/interface/fortran/MultipleScattering_M.f90 @@ -2,7 +2,7 @@ !! 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: Mon Dec 09 09:48:43 EST 2019 +!! Date Generated: Mon Mar 02 10:33:41 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 !!/ @@ -12,6 +12,7 @@ use MultipleScattering_I type MultipleScattering type(C_PTR) :: instance_ptr=C_NULL_PTR contains + procedure, pass(this) :: setNumScatters => MultipleScattering_setNumScatters procedure, pass(this) :: setNumTheta => MultipleScattering_setNumTheta procedure, pass(this) :: setNumZHatIntegration => MultipleScattering_setNumZHatIntegration procedure, pass(this) :: setNumBeamAreaIntegration => MultipleScattering_setNumBeamAreaIntegration @@ -22,6 +23,7 @@ type MultipleScattering procedure, pass(this) :: setLogSigmaTotMax => MultipleScattering_setLogSigmaTotMax procedure, pass(this) :: setNumThetaNearOne => MultipleScattering_setNumThetaNearOne procedure, pass(this) :: setNumThetaNearZero => MultipleScattering_setNumThetaNearZero + procedure, pass(this) :: getNumScatters => MultipleScattering_getNumScatters procedure, pass(this) :: getNumTheta => MultipleScattering_getNumTheta procedure, pass(this) :: getNumZHatIntegration => MultipleScattering_getNumZHatIntegration procedure, pass(this) :: getNumBeamAreaIntegration => MultipleScattering_getNumBeamAreaIntegration @@ -36,6 +38,12 @@ type MultipleScattering procedure, pass(this) :: destroy => MultipleScattering_destroy end type MultipleScattering contains +subroutine MultipleScattering_setNumScatters(this, ns) + implicit none + class(MultipleScattering)::this + integer(C_INT)::ns + call f_MultipleScattering_setNumScatters(this%instance_ptr, ns) +end subroutine subroutine MultipleScattering_setNumTheta(this, nt) implicit none class(MultipleScattering)::this @@ -96,6 +104,12 @@ subroutine MultipleScattering_setNumThetaNearZero(this, ntnearzero) integer(C_INT)::ntnearzero call f_MultipleScattering_setNumThetaNearZero(this%instance_ptr, ntnearzero) end subroutine +function MultipleScattering_getNumScatters(this) result(result2Return) + implicit none + class(MultipleScattering)::this + integer(C_INT):: result2Return + result2Return=f_MultipleScattering_getNumScatters(this%instance_ptr) +end function function MultipleScattering_getNumTheta(this) result(result2Return) implicit none class(MultipleScattering)::this diff --git a/sammy/src/salmon/interface/fortran/Yield_I.f90 b/sammy/src/salmon/interface/fortran/Yield_I.f90 new file mode 100644 index 000000000..695d2115f --- /dev/null +++ b/sammy/src/salmon/interface/fortran/Yield_I.f90 @@ -0,0 +1,178 @@ +!> +!! 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: Wed Apr 08 13:29:36 EDT 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 Yield_I +use, intrinsic :: ISO_C_BINDING +interface +subroutine f_Yield_setNormTypeSelfShielded(Yield_ptr ) BIND(C,name="Yield_setNormTypeSelfShielded") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end subroutine +subroutine f_Yield_setNormTypeDivideByN(Yield_ptr ) BIND(C,name="Yield_setNormTypeDivideByN") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end subroutine +subroutine f_Yield_setNormTypeTimesSigTot(Yield_ptr ) BIND(C,name="Yield_setNormTypeTimesSigTot") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end subroutine +subroutine f_Yield_setCalcDerivs(Yield_ptr, sb ) BIND(C,name="Yield_setCalcDerivs") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + logical(C_BOOL) :: sb; +end subroutine +subroutine f_Yield_setNumTotalParam(Yield_ptr, np ) BIND(C,name="Yield_setNumTotalParam") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + integer(C_INT) :: np; +end subroutine +subroutine f_Yield_setY0(Yield_ptr, y0 ) BIND(C,name="Yield_setY0") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + real(C_DOUBLE) :: y0; +end subroutine +subroutine f_Yield_setY1(Yield_ptr, y1 ) BIND(C,name="Yield_setY1") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + real(C_DOUBLE) :: y1; +end subroutine +subroutine f_Yield_setY2(Yield_ptr, y2 ) BIND(C,name="Yield_setY2") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + real(C_DOUBLE) :: y2; +end subroutine +subroutine f_Yield_setTotY(Yield_ptr, toty ) BIND(C,name="Yield_setTotY") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + real(C_DOUBLE) :: toty; +end subroutine +subroutine f_Yield_setDerivY0(Yield_ptr, iPar,dy0 ) BIND(C,name="Yield_setDerivY0") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + integer(C_INT) :: iPar; + real(C_DOUBLE) :: dy0; +end subroutine +subroutine f_Yield_setDerivY1(Yield_ptr, iPar,dy1 ) BIND(C,name="Yield_setDerivY1") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + integer(C_INT) :: iPar; + real(C_DOUBLE) :: dy1; +end subroutine +subroutine f_Yield_setDerivY2(Yield_ptr, iPar,dy2 ) BIND(C,name="Yield_setDerivY2") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + integer(C_INT) :: iPar; + real(C_DOUBLE) :: dy2; +end subroutine +subroutine f_Yield_setDerivTotY(Yield_ptr, iPar,dy2 ) BIND(C,name="Yield_setDerivTotY") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + integer(C_INT) :: iPar; + real(C_DOUBLE) :: dy2; +end subroutine +subroutine f_Yield_getNormString(Yield_ptr, string2Populate, lengthOfString2Populate) BIND(C,name="Yield_getNormString") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + character(C_CHAR) :: string2Populate; + integer(C_INT) :: lengthOfString2Populate; +end subroutine +logical(C_BOOL) function f_Yield_normTypeIsSelfShielded(Yield_ptr ) BIND(C,name="Yield_normTypeIsSelfShielded") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end function +logical(C_BOOL) function f_Yield_normTypeIsDivideByN(Yield_ptr ) BIND(C,name="Yield_normTypeIsDivideByN") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end function +logical(C_BOOL) function f_Yield_normTypeIsTimesSigTot(Yield_ptr ) BIND(C,name="Yield_normTypeIsTimesSigTot") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end function +logical(C_BOOL) function f_Yield_getCalcDerivs(Yield_ptr ) BIND(C,name="Yield_getCalcDerivs") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end function +integer(C_INT) function f_Yield_getNumTotalParam(Yield_ptr ) BIND(C,name="Yield_getNumTotalParam") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end function +real(C_DOUBLE) function f_Yield_getY0(Yield_ptr ) BIND(C,name="Yield_getY0") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end function +real(C_DOUBLE) function f_Yield_getY1(Yield_ptr ) BIND(C,name="Yield_getY1") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end function +real(C_DOUBLE) function f_Yield_getY2(Yield_ptr ) BIND(C,name="Yield_getY2") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end function +real(C_DOUBLE) function f_Yield_getTotY(Yield_ptr ) BIND(C,name="Yield_getTotY") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; +end function +real(C_DOUBLE) function f_Yield_getDerivY0(Yield_ptr, iPar ) BIND(C,name="Yield_getDerivY0") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + integer(C_INT) :: iPar; +end function +real(C_DOUBLE) function f_Yield_getDerivY1(Yield_ptr, iPar ) BIND(C,name="Yield_getDerivY1") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + integer(C_INT) :: iPar; +end function +real(C_DOUBLE) function f_Yield_getDerivY2(Yield_ptr, iPar ) BIND(C,name="Yield_getDerivY2") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + integer(C_INT) :: iPar; +end function +real(C_DOUBLE) function f_Yield_getDerivTotY(Yield_ptr, iPar ) BIND(C,name="Yield_getDerivTotY") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: Yield_ptr; + integer(C_INT) :: iPar; +end function +type(C_PTR) function f_Yield_initialize( )BIND(C,name="Yield_initialize") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR) :: Yield_ptr; +end function +subroutine f_Yield_destroy(this) BIND(C,name="Yield_destroy") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: this; +end subroutine +end interface +end module Yield_I diff --git a/sammy/src/salmon/interface/fortran/Yield_M.f90 b/sammy/src/salmon/interface/fortran/Yield_M.f90 new file mode 100644 index 000000000..30eded3bb --- /dev/null +++ b/sammy/src/salmon/interface/fortran/Yield_M.f90 @@ -0,0 +1,226 @@ +!> +!! 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: Wed Apr 08 13:29:36 EDT 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 Yield_M +use, intrinsic :: ISO_C_BINDING +use Yield_I +type Yield + type(C_PTR) :: instance_ptr=C_NULL_PTR + contains + procedure, pass(this) :: setNormTypeSelfShielded => Yield_setNormTypeSelfShielded + procedure, pass(this) :: setNormTypeDivideByN => Yield_setNormTypeDivideByN + procedure, pass(this) :: setNormTypeTimesSigTot => Yield_setNormTypeTimesSigTot + procedure, pass(this) :: setCalcDerivs => Yield_setCalcDerivs + procedure, pass(this) :: setNumTotalParam => Yield_setNumTotalParam + procedure, pass(this) :: setY0 => Yield_setY0 + procedure, pass(this) :: setY1 => Yield_setY1 + procedure, pass(this) :: setY2 => Yield_setY2 + procedure, pass(this) :: setTotY => Yield_setTotY + procedure, pass(this) :: setDerivY0 => Yield_setDerivY0 + procedure, pass(this) :: setDerivY1 => Yield_setDerivY1 + procedure, pass(this) :: setDerivY2 => Yield_setDerivY2 + procedure, pass(this) :: setDerivTotY => Yield_setDerivTotY + procedure, pass(this) :: getNormString => Yield_getNormString + procedure, pass(this) :: normTypeIsSelfShielded => Yield_normTypeIsSelfShielded + procedure, pass(this) :: normTypeIsDivideByN => Yield_normTypeIsDivideByN + procedure, pass(this) :: normTypeIsTimesSigTot => Yield_normTypeIsTimesSigTot + procedure, pass(this) :: getCalcDerivs => Yield_getCalcDerivs + procedure, pass(this) :: getNumTotalParam => Yield_getNumTotalParam + procedure, pass(this) :: getY0 => Yield_getY0 + procedure, pass(this) :: getY1 => Yield_getY1 + procedure, pass(this) :: getY2 => Yield_getY2 + procedure, pass(this) :: getTotY => Yield_getTotY + procedure, pass(this) :: getDerivY0 => Yield_getDerivY0 + procedure, pass(this) :: getDerivY1 => Yield_getDerivY1 + procedure, pass(this) :: getDerivY2 => Yield_getDerivY2 + procedure, pass(this) :: getDerivTotY => Yield_getDerivTotY + procedure, pass(this) :: initialize => Yield_initialize + procedure, pass(this) :: destroy => Yield_destroy +end type Yield +contains +subroutine Yield_setNormTypeSelfShielded(this) + implicit none + class(Yield)::this + call f_Yield_setNormTypeSelfShielded(this%instance_ptr) +end subroutine +subroutine Yield_setNormTypeDivideByN(this) + implicit none + class(Yield)::this + call f_Yield_setNormTypeDivideByN(this%instance_ptr) +end subroutine +subroutine Yield_setNormTypeTimesSigTot(this) + implicit none + class(Yield)::this + call f_Yield_setNormTypeTimesSigTot(this%instance_ptr) +end subroutine +subroutine Yield_setCalcDerivs(this, sb) + implicit none + class(Yield)::this + logical(C_BOOL)::sb + call f_Yield_setCalcDerivs(this%instance_ptr, sb) +end subroutine +subroutine Yield_setNumTotalParam(this, np) + implicit none + class(Yield)::this + integer(C_INT)::np + call f_Yield_setNumTotalParam(this%instance_ptr, np) +end subroutine +subroutine Yield_setY0(this, y0) + implicit none + class(Yield)::this + real(C_DOUBLE)::y0 + call f_Yield_setY0(this%instance_ptr, y0) +end subroutine +subroutine Yield_setY1(this, y1) + implicit none + class(Yield)::this + real(C_DOUBLE)::y1 + call f_Yield_setY1(this%instance_ptr, y1) +end subroutine +subroutine Yield_setY2(this, y2) + implicit none + class(Yield)::this + real(C_DOUBLE)::y2 + call f_Yield_setY2(this%instance_ptr, y2) +end subroutine +subroutine Yield_setTotY(this, toty) + implicit none + class(Yield)::this + real(C_DOUBLE)::toty + call f_Yield_setTotY(this%instance_ptr, toty) +end subroutine +subroutine Yield_setDerivY0(this, iPar, dy0) + implicit none + class(Yield)::this + integer(C_INT)::iPar + real(C_DOUBLE)::dy0 + call f_Yield_setDerivY0(this%instance_ptr, iPar-1,dy0) +end subroutine +subroutine Yield_setDerivY1(this, iPar, dy1) + implicit none + class(Yield)::this + integer(C_INT)::iPar + real(C_DOUBLE)::dy1 + call f_Yield_setDerivY1(this%instance_ptr, iPar-1,dy1) +end subroutine +subroutine Yield_setDerivY2(this, iPar, dy2) + implicit none + class(Yield)::this + integer(C_INT)::iPar + real(C_DOUBLE)::dy2 + call f_Yield_setDerivY2(this%instance_ptr, iPar-1,dy2) +end subroutine +subroutine Yield_setDerivTotY(this, iPar, dy2) + implicit none + class(Yield)::this + integer(C_INT)::iPar + real(C_DOUBLE)::dy2 + call f_Yield_setDerivTotY(this%instance_ptr, iPar-1,dy2) +end subroutine +subroutine Yield_getNormString(this, string2Populate) + implicit none + class(Yield)::this + character(len=*) :: string2Populate + integer(C_INT) :: lengthOfString2Populate + lengthOfString2Populate = len(string2Populate) + call f_Yield_getNormString(this%instance_ptr, string2Populate, lengthOfString2Populate) +end subroutine +function Yield_normTypeIsSelfShielded(this) result(result2Return) + implicit none + class(Yield)::this + logical(C_BOOL):: result2Return + result2Return=f_Yield_normTypeIsSelfShielded(this%instance_ptr) +end function +function Yield_normTypeIsDivideByN(this) result(result2Return) + implicit none + class(Yield)::this + logical(C_BOOL):: result2Return + result2Return=f_Yield_normTypeIsDivideByN(this%instance_ptr) +end function +function Yield_normTypeIsTimesSigTot(this) result(result2Return) + implicit none + class(Yield)::this + logical(C_BOOL):: result2Return + result2Return=f_Yield_normTypeIsTimesSigTot(this%instance_ptr) +end function +function Yield_getCalcDerivs(this) result(result2Return) + implicit none + class(Yield)::this + logical(C_BOOL):: result2Return + result2Return=f_Yield_getCalcDerivs(this%instance_ptr) +end function +function Yield_getNumTotalParam(this) result(result2Return) + implicit none + class(Yield)::this + integer(C_INT):: result2Return + result2Return=f_Yield_getNumTotalParam(this%instance_ptr) +end function +function Yield_getY0(this) result(result2Return) + implicit none + class(Yield)::this + real(C_DOUBLE):: result2Return + result2Return=f_Yield_getY0(this%instance_ptr) +end function +function Yield_getY1(this) result(result2Return) + implicit none + class(Yield)::this + real(C_DOUBLE):: result2Return + result2Return=f_Yield_getY1(this%instance_ptr) +end function +function Yield_getY2(this) result(result2Return) + implicit none + class(Yield)::this + real(C_DOUBLE):: result2Return + result2Return=f_Yield_getY2(this%instance_ptr) +end function +function Yield_getTotY(this) result(result2Return) + implicit none + class(Yield)::this + real(C_DOUBLE):: result2Return + result2Return=f_Yield_getTotY(this%instance_ptr) +end function +function Yield_getDerivY0(this, iPar) result(result2Return) + implicit none + class(Yield)::this + integer(C_INT)::iPar + real(C_DOUBLE):: result2Return + result2Return=f_Yield_getDerivY0(this%instance_ptr, iPar-1) +end function +function Yield_getDerivY1(this, iPar) result(result2Return) + implicit none + class(Yield)::this + integer(C_INT)::iPar + real(C_DOUBLE):: result2Return + result2Return=f_Yield_getDerivY1(this%instance_ptr, iPar-1) +end function +function Yield_getDerivY2(this, iPar) result(result2Return) + implicit none + class(Yield)::this + integer(C_INT)::iPar + real(C_DOUBLE):: result2Return + result2Return=f_Yield_getDerivY2(this%instance_ptr, iPar-1) +end function +function Yield_getDerivTotY(this, iPar) result(result2Return) + implicit none + class(Yield)::this + integer(C_INT)::iPar + real(C_DOUBLE):: result2Return + result2Return=f_Yield_getDerivTotY(this%instance_ptr, iPar-1) +end function +subroutine Yield_initialize(this) + implicit none + class(Yield) :: this + this%instance_ptr = f_Yield_initialize() +end subroutine +subroutine Yield_destroy(this) + implicit none + class(Yield) :: this + call f_Yield_destroy(this%instance_ptr) + this%instance_ptr = C_NULL_PTR +end subroutine +end module Yield_M diff --git a/sammy/src/salmon/tests/CMakeLists.txt b/sammy/src/salmon/tests/CMakeLists.txt index 7f3bf5f57..9bbab0a95 100644 --- a/sammy/src/salmon/tests/CMakeLists.txt +++ b/sammy/src/salmon/tests/CMakeLists.txt @@ -2,3 +2,4 @@ include(NemesisTest) ADD_NEMESIS_TEST(ExperimentalParametersTest.cpp TIMEOUT 60000 NP 1 ) ADD_NEMESIS_TEST(MultipleScatteringTest.cpp TIMEOUT 60000 NP 1 ) +ADD_NEMESIS_TEST(YieldTest.cpp TIMEOUT 60000 NP 1 ) diff --git a/sammy/src/salmon/tests/ExperimentalParametersTest.cpp b/sammy/src/salmon/tests/ExperimentalParametersTest.cpp index 2d6d9c192..96f48c0b2 100644 --- a/sammy/src/salmon/tests/ExperimentalParametersTest.cpp +++ b/sammy/src/salmon/tests/ExperimentalParametersTest.cpp @@ -11,20 +11,23 @@ TEST(SampleDimensions,setterGetter){ sammy::SampleDimensions result; - result.setRadius( 1.0); - result.setHeight( 2.0); - result.setThickness( 3.0); - result.setBeamRadius(4.0); - - double goldRadius = 1.0; - double goldHeight = 2.0; - double goldThickness = 3.0; - double goldBeamRadius = 4.0; - - ASSERT_EQ(goldRadius,result.getRadius()); - ASSERT_EQ(goldHeight,result.getHeight()); - ASSERT_EQ(goldThickness,result.getThickness()); - ASSERT_EQ(goldBeamRadius,result.getBeamRadius()); + result.setRadius( 1.0); + result.setHeight( 2.0); + result.setThickness( 3.0); + result.setArealDensity(4.0); + result.setBeamRadius( 5.0); + + double goldRadius = 1.0; + double goldHeight = 2.0; + double goldThickness = 3.0; + double goldArealDensity = 4.0; + double goldBeamRadius = 5.0; + + ASSERT_EQ(goldRadius, result.getRadius()); + ASSERT_EQ(goldHeight, result.getHeight()); + ASSERT_EQ(goldThickness, result.getThickness()); + ASSERT_EQ(goldArealDensity,result.getArealDensity()); + ASSERT_EQ(goldBeamRadius, result.getBeamRadius()); } /********************************************************** diff --git a/sammy/src/salmon/tests/YieldTest.cpp b/sammy/src/salmon/tests/YieldTest.cpp new file mode 100644 index 000000000..3ce0bb696 --- /dev/null +++ b/sammy/src/salmon/tests/YieldTest.cpp @@ -0,0 +1,58 @@ +#include "Nemesis/gtest/Gtest_Functions.hh" +#include "Nemesis/gtest/nemesis_gtest.hh" +#include "../Yield.h" + + + +/************************************************************************************************** +* Test the getting and setting functions +**************************************************************************************************/ +TEST(Yield,setterGetter){ + + sammy::Yield yield; + + int gold_def_normType_NOTSET = true; + int gold_normType_tst = true; // <-- Normtype is now set to normalization::TIMESSIGTOT + double gold_Y0 = 0.1; + double gold_Y1 = 0.2; + double gold_Y2 = 0.3; + double gold_derivY0 = 0.1; + double gold_derivY1 = 0.2; + double gold_derivY2 = 0.3; + double gold_totY = gold_Y0 + gold_Y1 + gold_Y2; + double gold_derivTotY = -0.1; + bool gold_def_calcDerivs = false; + bool gold_calcDerivs = true; + int gold_numParam = 20; + + + yield.setY0( gold_Y0); + yield.setY1( gold_Y1); + yield.setY2( gold_Y2); + yield.setTotY( gold_totY); + yield.setDerivY0(0, gold_derivY0); + yield.setDerivY1(0, gold_derivY1); + yield.setDerivY2(0, gold_derivY2); + yield.setDerivTotY(0, gold_derivTotY); + yield.setNumTotalParam( gold_numParam); + + + ASSERT_EQ(gold_def_normType_NOTSET, yield.normTypeIsNotSet()); // <-- Default normalization type + ASSERT_EQ(gold_def_calcDerivs, yield.getCalcDerivs()); + + yield.setNormTypeTimesSigTot(); + yield.setCalcDerivs(gold_calcDerivs); + + ASSERT_EQ(gold_normType_tst, yield.normTypeIsTimesSigTot()); + ASSERT_EQ(gold_Y0, yield.getY0()); + ASSERT_EQ(gold_Y1, yield.getY1()); + ASSERT_EQ(gold_Y2, yield.getY2()); + ASSERT_EQ(gold_derivY0, yield.getDerivY0(0)); + ASSERT_EQ(gold_derivY1, yield.getDerivY1(0)); + ASSERT_EQ(gold_derivY2, yield.getDerivY2(0)); + ASSERT_EQ(gold_totY, yield.getTotY()); + ASSERT_EQ(gold_derivTotY, yield.getDerivTotY(0)); + ASSERT_EQ(gold_numParam, yield.getNumTotalParam()); + ASSERT_EQ(gold_calcDerivs, yield.getCalcDerivs()); + +} diff --git a/sammy/src/sam/msam.F b/sammy/src/sam/msam.F index 602134bd4..cce141037 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 Observable_common_m use ssm_m use Samdat_0_M use Samodf_0_m @@ -43,6 +44,7 @@ C call multScat%initialize() call sampleDim%initialize() call covData%initialize() + call yld%initialize() call covData%makeNewUCovariance() call covData%makeNewCovariance() call covData%makeNewInverseUCovariance() diff --git a/sammy/src/sammy/CMakeLists.txt b/sammy/src/sammy/CMakeLists.txt index 8eae11683..bc1bfa2dd 100644 --- a/sammy/src/sammy/CMakeLists.txt +++ b/sammy/src/sammy/CMakeLists.txt @@ -572,7 +572,8 @@ APPEND_SET(SAMMY_SOURCES ../blk/AllocateFunctions.f90 ../blk/ExpPars_common.f90 ../blk/MultScatPars_common.f90 - ../blk/CapYCorrections_common.f90 + ../blk/Convolution_common.f90 + ../blk/Observable_common.f90 ) TRIBITS_ADD_LIBRARY( diff --git a/sammy/src/ssm/mssm04.f90 b/sammy/src/ssm/mssm04.f90 index 12a4ea9c1..df05f554a 100644 --- a/sammy/src/ssm/mssm04.f90 +++ b/sammy/src/ssm/mssm04.f90 @@ -40,6 +40,7 @@ module ssm_4_m Itimes = 1 Kountr = 0 ! +! JMB: The a and b here are Y's at energy a and b read from a file IF (Mcy2.EQ.1) CALL Gety2zzz (Emy2_a, Emy2_b, Y2tab_a, Y2tab_b) ! CALL Findpr (multScat%getNumTheta(), Knthet) diff --git a/sammy/src/ssm/mssm19.f90 b/sammy/src/ssm/mssm19.f90 index 7449e786a..f885014f8 100644 --- a/sammy/src/ssm/mssm19.f90 +++ b/sammy/src/ssm/mssm19.f90 @@ -11,32 +11,47 @@ module ssm_19_m use ifwrit_m use fixedr_m use logic_ssm_common_m - use CapYCorrections_common_m + use Convolution_common_m + use Observable_common_m + use MultScatPars_common_m + use ExpPars_common_m + use Yield_m IMPLICIT DOUBLE PRECISION (a-h,o-z) + logical(C_BOOL) calc_derivs DIMENSION Capsig(*), Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Sigxxx(*), Dasigx(*), Dbsigx(*) DATA Zero /0.0d0/, One /1.0d0/ call capYieldCor%initialize() + call yNorm%initialize() ! ! *** Default normalization is such that Y0 = (1-e)Capture /(n Total) -! *** which corresponds to Kyield=1 ("cross section", not "yield") +! *** which corresponds to yld%normTypeIsDivideByN()==true ("cross section", not "yield") ! IF (Noyzer.NE.0) Y0 = Zero + + ! ----------------------------------- + ! Put things into C++ memory here + ! ----------------------------------- + call yld%setY0(Y0) + calc_derivs = Ksolve.NE.2 + call yld%setCalcDerivs(calc_derivs) + call multScat%setNumScatters(0) + call yld%setNumTotalParam(Nnpar) + call sampleDim%setArealDensity(Dthick) ! 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 + + ! ----------------------------------- + ! Now normalize the yield + ! ----------------------------------- + call yNorm%norm(yld,sampleDim,multScat,Total) ! - Sigxxx(1) = Y0 + call yld%setTotY(yld%getY0()) + Sigxxx(1) = yld%getTotY() + Y0 = yld%getY0() ! ! 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 @@ -61,13 +76,13 @@ module ssm_19_m IF (Kvthck.GT.0) THEN ! *** Add deriv of Y0 wrt Thickness Kv = Kvthck - Nvadif - Ndasig - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) 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 + ELSE IF (yld%normTypeIsDivideByN()) THEN Sn = Dthick*Total IF (Noyzer.EQ.0) THEN IF (Sn.LT.0.3d0) THEN @@ -81,18 +96,21 @@ module ssm_19_m F = Zero END IF Dbsigx(Kv) = F + Dbsigx(Kv) - ELSE IF (Kyield.EQ.2) THEN + ELSE IF (yld%normTypeIsTimesSigTot()) 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 + IF (yld%normTypeIsSelfShielded()) Asensn = Asensn * Dthick + IF (yld%normTypeIsTimesSigTot()) Asensn = Asensn * Dthick * Total ! *** Add deriv of Y0 wrt neutron sensitivity multiplier Kv = Ksensc - Nvadif - Ndasig Dbsigx(Kv) = Asensn END IF + + call capYieldCor%destroy() + RETURN END ! @@ -104,7 +122,8 @@ module ssm_19_m use fixedi_m use ifwrit_m use logic_ssm_common_m - use CapYCorrections_common_m + use Convolution_common_m + use Observable_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Ds(*) DATA One /1.0d0/ @@ -120,18 +139,18 @@ module ssm_19_m IF (Noyzer.EQ.0) THEN ! *** First, the derivative of Y0 wrt u(Iipar) ! *** (Nn=Energy) JMB - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) 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 + ELSE IF (yld%normTypeIsDivideByN()) 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 + ELSE IF (yld%normTypeIsTimesSigTot()) THEN Ds(Ipar) = Ds(Ipar) + (One-Exp1)*Dcapsi(Iipar,Nn) & + Dtotsi(Iipar,Nn)*Exp1*Cap*Dthick END IF diff --git a/sammy/src/ssm/mssm20.f90 b/sammy/src/ssm/mssm20.f90 index 8ce787e29..9c3c3ce70 100644 --- a/sammy/src/ssm/mssm20.f90 +++ b/sammy/src/ssm/mssm20.f90 @@ -149,54 +149,72 @@ module ssm_20_m use ifwrit_m use fixedr_m use logic_ssm_common_m - use CapYCorrections_common_m + use Convolution_common_m + use Observable_common_m + use MultScatPars_common_m + use ExpPars_common_m + use Yield_m IMPLICIT DOUBLE PRECISION (a-h,o-z) + logical(C_BOOL) calc_derivs DIMENSION Capsig(*), Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*), & Sigxxx(*), Dasigx(*), Dbsigx(*) DATA Zero /0.0d0/, One /1.0d0/ call capYieldCor%initialize() + call yNorm%initialize() ! ! *** Default normalization is such that Y0 = (1-e)Capture /(n Total) -! *** which corresponds to Kyield=1 ("cross section", not "yield") +! *** which corresponds to yld%normTypeIsDivideByN()==true ("cross section", not "yield") ! IF (Noyzer.NE.0) Y0 = Zero + + ! ----------------------------------- + ! Put things into C++ memory here + ! ----------------------------------- + call yld%setY0(Y0) + call yld%setY1(Y1) + if( Ksolve.ne.2 ) then + do j=1,Nnpar + call yld%setDerivY1(J,Dy1(J)) + end do + end if + calc_derivs = Ksolve.NE.2 + call yld%setCalcDerivs(calc_derivs) + call multScat%setNumScatters(1) + call yld%setNumTotalParam(Nnpar) + call sampleDim%setArealDensity(Dthick) + + ! ----------------------------------- + ! Now normalize the yield + ! ----------------------------------- + call yNorm%norm(yld,sampleDim,multScat,Total) ! Cap = Capsig(Nn) - IF (Kyield.EQ.0) THEN - Y0 = Y0*Dthick - ELSE IF (Kyield.EQ.1) THEN - Y1 = Y1/Dthick - IF (Ksolve.NE.2) THEN - DO J=1,Nnpar - Dy1(J) = Dy1(J)/Dthick - END DO - END IF - ELSE IF (Kyield.EQ.2) THEN - Y0 = Y0*Total*Dthick - Y1 = Y1*Total - IF (Ksolve.NE.2) THEN - DO J=1,Nnpar - Dy1(J) = Dy1(J)*Total - END DO - END IF - END IF -! -! - Sigxxx(1) = Y0 - Sigxxx(1) = Sigxxx(1) + Y1 + + ! ----------------------------------- + ! Return the values to the old places + ! ----------------------------------- + call yld%setTotY(yld%getY0() + yld%getY1()) + Sigxxx(1) = yld%getTotY() + Y0 = yld%getY0() + Y1 = yld%getY1() + if( yld%getCalcDerivs() ) then + do j=1,yld%getNumTotalParam() + Dy1(j) = yld%getDerivY1(j) + end do + end if ! ! 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 ! -! + ! ----------------------------------- + ! Write yields to file + ! ----------------------------------- IF (Kssmpr.EQ.1) THEN WRITE (60,12000) Em, Y0, Y1, Sigxxx(1) 12000 FORMAT (1X, f15.8, 1P5E15.6) @@ -213,13 +231,13 @@ module ssm_20_m IF (Kvthck.GT.0) THEN ! *** Add deriv of Y0 wrt Thickness; modify deriv of Y1 & Y2 wrt Thick Kv = Kvthck - Nvadif - Ndasig - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) 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 + ELSE IF (yld%normTypeIsDivideByN()) THEN Sn = Dthick*Total IF (Noyzer.EQ.0) THEN IF (Sn.LT.0.3d0) THEN @@ -233,18 +251,21 @@ module ssm_20_m F = Zero END IF Dbsigx(Kv) = F + Dbsigx(Kv) - Y1/Dthick - ELSE IF (Kyield.EQ.2) THEN + ELSE IF (yld%normTypeIsTimesSigTot()) 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 + IF (yld%normTypeIsSelfShielded()) Asensn = Asensn * Dthick + IF (yld%normTypeIsTimesSigTot()) Asensn = Asensn * Dthick * Total ! *** Add deriv of Y0 wrt neutron sensitivity multiplier Kv = Ksensc - Nvadif - Ndasig Dbsigx(Kv) = Asensn END IF + + call capYieldCor%destroy() + RETURN END ! @@ -256,7 +277,8 @@ module ssm_20_m use fixedi_m use ifwrit_m use logic_ssm_common_m - use CapYCorrections_common_m + use Convolution_common_m + use Observable_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*), Ds(*) DATA One /1.0d0/ @@ -272,29 +294,29 @@ module ssm_20_m IF (Noyzer.EQ.0) THEN ! *** First, the derivative of Y0 wrt u(Iipar) ! *** (Nn=Energy) JMB - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) 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 + ELSE IF (yld%normTypeIsDivideByN()) 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 + ELSE IF (yld%normTypeIsTimesSigTot()) THEN Ds(Ipar) = Ds(Ipar) + (One-Exp1)*Dcapsi(Iipar,Nn) & + Dtotsi(Iipar,Nn)*Exp1*Cap*Dthick END IF END IF ! ! *** Next, the derivative of Y1 wrt u(Iipar) - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) - ELSE IF (Kyield.EQ.1) THEN + ELSE IF (yld%normTypeIsDivideByN()) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) - ELSE IF (Kyield.EQ.2) THEN + ELSE IF (yld%normTypeIsTimesSigTot()) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) + & Y1*Dtotsi(Iipar,Nn)/Total END IF diff --git a/sammy/src/ssm/mssm21.f90 b/sammy/src/ssm/mssm21.f90 index 49047ddeb..0bcd285b6 100644 --- a/sammy/src/ssm/mssm21.f90 +++ b/sammy/src/ssm/mssm21.f90 @@ -49,9 +49,16 @@ module ssm_21_m use fixedi_m use ifwrit_m use fixedr_m - use CapYCorrections_common_m + use Convolution_common_m use logic_ssm_common_m + use Observable_common_m + use MultScatPars_common_m + use ExpPars_common_m + use EndfData_common_m + use Yield_m IMPLICIT DOUBLE PRECISION (a-h,o-z) + logical(C_BOOL) calc_derivs + double precision, dimension(:), allocatable :: Dabsigx DIMENSION Capsig(*), Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*),& Dy2(*), Sigxxx(*), Dasigx(*), Dbsigx(*) DATA Zero /0.0d0/, One /1.0d0/ @@ -59,54 +66,72 @@ module ssm_21_m !type(CapYieldCorrections)::capYieldCor call capYieldCor%initialize() + call yNorm%initialize() + + ! ------- Nnpar, Ndasig, and Ndbsig are set to zero when Ksolve = 2 ----------- + ! ! *** Default normalization is such that Y0 = (1-e)Capture /(n Total) -! *** which corresponds to Kyield=1 ("cross section", not "yield") +! *** which corresponds to yld%normTypeIsDivideByN()==true ("cross section", not "yield") ! IF (Noyzer.NE.0) Y0 = Zero + + ! ----------------------------------- + ! Put things into C++ memory here + ! ----------------------------------- + call yld%setY0(Y0) + call yld%setY1(Y1) + call yld%setY2(Y2) + if( Ksolve.ne.2 ) then + do j=1,Nnpar + call yld%setDerivY1(J,Dy1(J)) + call yld%setDerivY2(J,Dy2(J)) + end do + end if + calc_derivs = Ksolve.NE.2 + call yld%setCalcDerivs(calc_derivs) + call multScat%setNumScatters(2) + call yld%setNumTotalParam(Nnpar) + call sampleDim%setArealDensity(Dthick) + + ! ----------------------------------- + ! Now normalize the yield + ! ----------------------------------- + call yNorm%norm(yld,sampleDim,multScat,Total) ! Cap = Capsig(Nn) - IF (Kyield.EQ.0) THEN - Y0 = Y0*Dthick - ELSE IF (Kyield.EQ.1) THEN - Y1 = Y1/Dthick - Y2 = Y2/Dthick - IF (Ksolve.NE.2) THEN - DO J=1,Nnpar - Dy1(J) = Dy1(J)/Dthick - END DO - DO J=1,Nnpar - Dy2(J) = Dy2(J)/Dthick - END DO - END IF - ELSE IF (Kyield.EQ.2) THEN - Y0 = Y0*Total*Dthick - Y1 = Y1*Total - Y2 = Y2*Total - IF (Ksolve.NE.2) THEN - DO J=1,Nnpar - Dy1(J) = Dy1(J)*Total - END DO - DO J=1,Nnpar - Dy2(J) = Dy2(J)*Total - END DO - END IF - END IF - IF (Mcy2.NE.0) Y2 = Y2tab -! - Sigxxx(1) = Y0 + Y1 + Y2 + + IF (Mcy2.NE.0) then + Y2 = Y2tab + call yld%setY2(Y2tab) + end if +! + ! ----------------------------------- + ! Return the values to the old places + ! ----------------------------------- + call yld%setTotY(yld%getY0() + yld%getY1() + yld%getY2()) + Sigxxx(1) = yld%getTotY() + Y0 = yld%getY0() + Y1 = yld%getY1() + Y2 = yld%getY2() + if( yld%getCalcDerivs() ) then + do j=1,yld%getNumTotalParam() + Dy1(j) = yld%getDerivY1(j) + Dy2(j) = yld%getDerivY2(j) + end do + end if ! ! 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 ! -! + ! ----------------------------------- + ! Write yields to file + ! ----------------------------------- IF (Kssmpr.EQ.1) THEN WRITE (60,12000) Em, Y0, Y1, Y2, Sigxxx(1) 12000 FORMAT (1X, f15.8, 1P5E15.6) @@ -115,7 +140,7 @@ module ssm_21_m IF (Ksolve.EQ.2) RETURN ! ###################################### ! It seems that Ndasig is a subset of varied parameters and that -! Ndbsig is the total number of varied parameters minus Ndasig +! Ndbsig is another subset 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, & @@ -127,13 +152,13 @@ module ssm_21_m IF (Kvthck.GT.0) THEN ! *** Add deriv of Y0 wrt Thickness; modify deriv of Y1 & Y2 wrt Thick Kv = Kvthck - Nvadif - Ndasig - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) 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 + ELSE IF (yld%normTypeIsDivideByN()) THEN Sn = Dthick*Total IF (Noyzer.EQ.0) THEN IF (Sn.LT.0.3d0) THEN @@ -148,18 +173,21 @@ module ssm_21_m END IF Dbsigx(Kv) = F + Dbsigx(Kv) - Y1/Dthick IF (Double_Plus) Dbsigx(Kv) = Dbsigx(Kv)-Y2/Dthick - ELSE IF (Kyield.EQ.2) THEN + ELSE IF (yld%normTypeIsTimesSigTot()) 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 + IF (yld%normTypeIsSelfShielded()) Asensn = Asensn * Dthick + IF (yld%normTypeIsTimesSigTot()) Asensn = Asensn * Dthick * Total ! *** Add deriv of Y0 wrt neutron sensitivity multiplier Kv = Ksensc - Nvadif - Ndasig Dbsigx(Kv) = Asensn END IF + + call capYieldCor%destroy() + RETURN END ! @@ -171,10 +199,12 @@ module ssm_21_m use fixedi_m use ifwrit_m use logic_ssm_common_m - use CapYCorrections_common_m + use Convolution_common_m + use Observable_common_m IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Dtotsi(Nnparx,*), Dcapsi(Nnparx,*), Dy1(*), Dy2(*),Ds(*) DATA One /1.0d0/ + ! ! Dthick = N [at/b] ! Cap = sigma_gamma @@ -187,39 +217,39 @@ module ssm_21_m IF (Noyzer.EQ.0) THEN ! *** First, the derivative of Y0 wrt u(Iipar) ! *** (Nn=Energy) JMB - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) 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 + ELSE IF (yld%normTypeIsDivideByN()) 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 + ELSE IF (yld%normTypeIsTimesSigTot()) THEN Ds(Ipar) = Ds(Ipar) + (One-Exp1)*Dcapsi(Iipar,Nn) & + Dtotsi(Iipar,Nn)*Exp1*Cap*Dthick END IF END IF ! ! *** Next, the derivative of Y1 wrt u(Iipar) - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) - ELSE IF (Kyield.EQ.1) THEN + ELSE IF (yld%normTypeIsDivideByN()) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) - ELSE IF (Kyield.EQ.2) THEN + ELSE IF (yld%normTypeIsTimesSigTot()) THEN Ds(Ipar) = Ds(Ipar) + Dy1(Iipar) + & Y1*Dtotsi(Iipar,Nn)/Total END IF ! ! *** Finally, the derivative of Y2 wrt u(Iipar) - IF (Kyield.EQ.0) THEN + IF (yld%normTypeIsSelfShielded()) THEN Ds(Ipar) = Ds(Ipar) + Dy2(Iipar) - ELSE IF (Kyield.EQ.1) THEN + ELSE IF (yld%normTypeIsDivideByN()) THEN Ds(Ipar) = Ds(Ipar) + Dy2(Iipar) - ELSE IF (Kyield.EQ.2) THEN + ELSE IF (yld%normTypeIsTimesSigTot()) THEN Ds(Ipar) = Ds(Ipar) + Dy2(Iipar) & + Y2*Dtotsi(Iipar,Nn)/Total END IF -- GitLab