diff --git a/sammy/src/blk/Clm_common.f90 b/sammy/src/blk/Clm_common.f90
index ddfd9d60eeac7e41fbe4a5416dbf764423c7a7b3..0efdb4fa08cee6ddfd24438c999e16a42977fd94 100644
--- a/sammy/src/blk/Clm_common.f90
+++ b/sammy/src/blk/Clm_common.f90
@@ -4,30 +4,5 @@ module clm_common_m
 ! TODO: Decrypt comment below
 ! *** used only in clm
 !
-      IMPLICIT NONE
-      double precision,save :: Del_Phonon
-      double precision,save :: Twt
-      double precision,save :: C_Trans
-      double precision,save :: Tbeta
-      double precision,save :: Sub
-      double precision,save :: Xdop
-      double precision,save :: Eps
-      double precision,save :: Epsc
-      double precision,save :: F0
-      double precision,save :: Tev
-      double precision,save :: Dwpix
-      double precision,save :: Tbar
-      double precision,save :: Del_S_B
-      double precision,save :: Dw0
-      double precision,save :: Sum_Osc_Wts
-      double precision,save :: Tsave
-      
-      integer,save :: Mode_S_Norm
-      integer,save :: Nphon
-      integer,save :: N_Contin
-      integer,save :: N_Osc
-      integer,save :: Nbeta
-      integer,save :: Nbx
-      integer,save :: Nbeta_Max
-
+      IMPLICIT NONE            
 end module clm_common_m
diff --git a/sammy/src/clm/CrystalLatticeBroadening_M.f90 b/sammy/src/clm/CrystalLatticeBroadening_M.f90
index ed0d5757cefc97bbe63f7f319f86c21b991e3299..cb406d4a84521984d123e89bc4db426718450ea6 100644
--- a/sammy/src/clm/CrystalLatticeBroadening_M.f90
+++ b/sammy/src/clm/CrystalLatticeBroadening_M.f90
@@ -9,6 +9,49 @@ use, intrinsic :: ISO_C_BINDING
 implicit none
 
 type, extends(FreeGasDopplerBroadening) :: CrystalLatticeBroadening
+double precision :: Del_Phonon = 0.0d0
+double precision :: Twt = 0.0d0
+double precision :: C_Trans = 0.0d0
+double precision :: Tbeta = 0.0d0
+double precision :: Sub = 0.0d0
+double precision :: Xdop = 0.0d0
+double precision :: Eps = 0.0d0
+double precision :: Epsc = 0.0d0
+double precision :: F0 = 0.0d0
+double precision :: Tev = 0.0d0
+double precision :: Dwpix = 0.0d0
+double precision :: Tbar = 0.0d0
+double precision :: Del_S_B = 0.0d0
+double precision :: Dw0 = 0.0d0
+double precision :: Sum_Osc_Wts = 0.0d0
+double precision :: Tsave = 0.0d0
+integer :: Mode_S_Norm = 0
+integer :: Nphon = 0
+integer :: N_Contin = 0
+integer :: N_Osc = 0
+integer :: Nbeta = 0
+integer :: Nbx = 0
+integer :: Nbeta_Max = 25999
+
+real(kind=8),dimension(:,:),allocatable::Save
+real(kind=8),dimension(:,:),allocatable::Savex
+real(kind=8),dimension(:),allocatable::Osc_Wts
+real(kind=8),dimension(:),allocatable::Osc_Eng
+real(kind=8),dimension(:),allocatable::Phonon
+real(kind=8),dimension(:),allocatable::Ppp
+real(kind=8),dimension(:),allocatable::Beta
+real(kind=8),dimension(:),allocatable::Osc_Enx
+real(kind=8),dimension(:),allocatable::Osc_Snth
+real(kind=8),dimension(:),allocatable::Osc_Coth
+real(kind=8),dimension(:),allocatable::Bex
+real(kind=8),dimension(:),allocatable::Tlast
+real(kind=8),dimension(:),allocatable::Tnow
+real(kind=8),dimension(:),allocatable::S_Expb
+real(kind=8),dimension(:),allocatable::S_Ex
+real(kind=8),dimension(:),allocatable::Bs
+real(kind=8),dimension(:),allocatable::Ss
+real(kind=8),dimension(:),allocatable::Sab
+integer,dimension(:),allocatable::Max_T
 contains
 procedure, pass(this) :: initialize => CrystalLatticeBroadening_initialize
 procedure, pass(this) :: broaden => CrystalLatticeBroadening_broaden
@@ -29,6 +72,25 @@ subroutine CrystalLatticeBroadening_destroy(this)
     implicit none
     class(CrystalLatticeBroadening) :: this
     call FreeGasDopplerBroadening_destroy(this)
+    if (allocated(this%Save)) deallocate(this%Save)
+    if (allocated(this%Savex)) deallocate(this%Savex)
+    if (allocated(this%Osc_Wts)) deallocate(this%Osc_Wts)
+    if (allocated(this%Osc_Eng)) deallocate(this%Osc_Eng)
+    if (allocated(this%Phonon)) deallocate(this%Phonon)
+    if (allocated(this%Ppp)) deallocate(this%Ppp)
+    if (allocated(this%Beta)) deallocate(this%Beta)
+    if (allocated(this%Osc_Enx)) deallocate(this%Osc_Enx)
+    if (allocated(this%Osc_Snth)) deallocate(this%Osc_Snth)
+    if (allocated(this%Osc_Coth)) deallocate(this%Osc_Coth)
+    if (allocated(this%Bex)) deallocate(this%Bex)
+    if (allocated(this%Tlast)) deallocate(this%TLast)
+    if (allocated(this%TNow)) deallocate(this%TNow)
+    if (allocated(this%S_Ex)) deallocate(this%S_Ex)
+    if (allocated(this%S_Expb)) deallocate(this%S_Expb)
+    if (allocated(this%Bs)) deallocate(this%Bs)
+    if (allocated(this%Ss)) deallocate(this%Ss)
+    if (allocated(this%Sab)) deallocate(this%Sab)
+    if (allocated(this%Max_T)) deallocate(this%Max_T)
 end subroutine
 
 
@@ -44,6 +106,10 @@ subroutine CrystalLatticeBroadening_broaden(this)
    call this%getData(data)
    call data%nullify()
    call data%reserve(ndatb*data%getNnnsig(), this%numPar+1)
+   if( this%hasSelf) then
+      call this%dataSelf%nullify()
+      call this%dataSelf%reserve(ndatb*this%dataSelf%getNnnsig(), this%numPar+1)
+   end if
 end subroutine
 
 end module CrystalLatticeBroadening_M
diff --git a/sammy/src/clm/dopush.f b/sammy/src/clm/dopush.f
index bc9958d63892d5037b681aab3905ecb085c31307..3defe7efe46f3eab3677180c39c729ce5534e746 100644
--- a/sammy/src/clm/dopush.f
+++ b/sammy/src/clm/dopush.f
@@ -19,21 +19,23 @@ C
 C
       use fixedr_m
       use broad_common_m
-      use clm_common_m
       use constn_common_m
       use Isotop_common_m
       use EndfData_common_m
       use xxxb
+      use mclm2_M
+      use CrystalLatticeBroadening_M
+      use DopplerAndResolutionBroadener_M
+      use GridData_M
+      use array_sizes_common_m, only : calcData, calcDataInit
+      use AllocateFunctions_m
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 C
      &   
-      DOUBLE PRECISION  Osc_Eng(50), Osc_Wts(50), Phonon(1000),
-     &   Ar(1000), Beta(25999), Bex(25999), Sigp(4), Eref(500),
+      DOUBLE PRECISION
+     &   Ar(1000), Sigp(4), Eref(500),
      *   Ecalc(5000),
-     &   Sigg(5000), Siggf(5000), Sigc(5000), E(100), Sig(100),
-     &   Save(25999,1000), Ppp(25999), Osc_Snth(50),
-     *   Osc_Enx(50),Osc_Coth(50), Tlast(25999), Tnow(25999),
-     *   Savex(25999,1000)
+     &   Sigg(5000), Siggf(5000), Sigc(5000), E(100), Sig(100)
       DOUBLE PRECISION  Awr, Sigl, Dsig, Tempf,
      &   Rn, Toch, Kn, Sig1, Sig2,  Sumgf, Arat, Rho, Ser,
      &   Per, EE, Sumg,  Em, Sigm, Err
@@ -48,6 +50,9 @@ C     &   Per, EE, Sumg, Aaawww, Spi, Ap, Em, Sigm, Err
       INTEGER CH, Nsyso, Nsysd, K, J, JJ,
      &   Ne, Nsysi, I, Nsysn,  Nref
       CHARACTER*40 Title
+      type(GridData)::grid
+      integer :: Mode_S_Norm
+      class(CrystalLatticeBroadening),pointer::calc
 C
 C
 C
@@ -56,11 +61,26 @@ C
 99999 FORMAT (' *** SAMMY-DOPUSH  9 Dec 05 ***')
       CALL Timer (1)
       CALL Timer (2)
-      Nbeta_Max = 25999
 C               = size of Beta array (& others?)
 C
 C *** INITIALIZATION OF CONSTANTS
       CALL Setcns (1,1)
+
+      if (.not.calcDataInit) then
+         calcDataInit = .true.
+         call calcData%initialize()
+      end if
+      if (.not.workArrayInit) then
+          call workArray%initialize()
+          workArrayInit = .true.
+      end if
+      call expData%initialize()
+      call grid%initialize()
+      call expData%addGrid(grid)
+      allocate(dopplerOption%crystalLattice)
+      calc => dopplerOption%crystalLattice
+      call calc%initialize(calcData,
+     &                     expData, workArray)
 C
 C
 C
@@ -93,25 +113,29 @@ C *** NML added January 2006
 C
 C *** READ GLOBAL USER'S INPUT
       READ (Nsysi,'(A40)') Title
-      READ (Nsysi,*) CH, Mode_S_Norm, Sub
-      READ (Nsysi,*) Emin, Emax, Xdop, Nphon
+      READ (Nsysi,*) CH, Mode_S_Norm, calc%Sub
+      READ (Nsysi,*) Emin, Emax, calc%Xdop, calc%Nphon
       READ (Nsysi,*) Temp, Awr
-      READ (Nsysi,*) Eps, Epsc, Err
+      READ (Nsysi,*) calc%Eps, calc%Epsc, Err
 C
 C *** READ IN CONTINUOUS DISTRIBUTION
-      READ (Nsysi,*) Del_Phonon, N_Contin
-      READ (Nsysi,*) (Phonon(I),I=1,N_Contin)
+      READ (Nsysi,*) calc%Del_Phonon, calc%N_Contin
+      call allocate_real_data(calc%Phonon, calc%N_Contin)
+      READ (Nsysi,*) (calc%Phonon(I),I=1,calc%N_Contin)
 C
 C *** READ IN DISCRETE MODES
-      READ (Nsysi,*) N_Osc
-      IF (N_Osc.NE.0) THEN
-         READ (Nsysi,*) (Osc_Eng(I),I=1,N_Osc)
-         READ (Nsysi,*) (Osc_Wts(I),I=1,N_Osc)
+      READ (Nsysi,*) calc%N_Osc
+      IF (calc%N_Osc.NE.0) THEN
+         call allocate_real_data(calc%Osc_Wts, calc%N_Osc)
+         call allocate_real_data(calc%Osc_Eng, calc%N_Osc)
+         READ (Nsysi,*) (calc%Osc_Eng(I),I=1,calc%N_Osc)
+         READ (Nsysi,*) (calc%Osc_Wts(I),I=1,calc%N_Osc)
       END IF
+
 C
 C *** READ IN TRANSLATIONAL PART
-      READ (Nsysi,*) Twt, C_Trans, Tbeta
-      WRITE (Nsyso,60000) Twt, C_Trans, Tbeta
+      READ (Nsysi,*) calc%Twt, calc%C_Trans, calc%Tbeta
+      WRITE (Nsyso,60000) calc%Twt,calc%C_Trans,calc%Tbeta
 60000 FORMAT (//, 'Twt, C, Tbeta=', 1p6g14.6)
 C
 C *** PRINTING
@@ -126,7 +150,8 @@ C *** PRINTING
      & '' NORMALISATION PRECISION .................. '', F10.3, ''%'',/
      & '' ERROR OF CROSS-SECTION RECONSTRuCTION .... '', F10.3, ''%'',/
      & '' INTEGRATION PRECISION .................... '', F10.3, ''%'')')
-     &    Nphon, Temp, Awr, Emin, Emax, Xdop, Eps*100, Err*100, Epsc*100
+     &    calc%Nphon, Temp, Awr, Emin, Emax,
+     &    calc%Xdop, calc%Eps*100, Err*100, calc%Epsc*100
       WRITE (Nsyso, '(//5X, ''RESULTS OF CONVOLUTION...'')')
       WRITE (Nsyso, '(/5X, ''ENERGY'', 8X, ''SIG(NUCLEAR)'', 4X,
      &''SIG(CRySTAL)'', 4X, ''SIG(fgm)'', 8X, ''SIG(fgmEFF)''/)')
@@ -138,8 +163,8 @@ c nml                       converted from "ratio to neutron" to "amu"
 c nml                       so Arat should use Awr not Aaawww
       Arat = Aaawww/(Aaawww+Aneutr)
       Rn   = Aneutr/(Aaawww+Aneutr)
-      Tev = Temp*Boltzm
-      Dopple = dSQRT(Tev/Awr)
+      calc%Tev = Temp*Boltzm
+      Dopple = dSQRT(calc%Tev/Awr)
 C
 C *** READ IN NUCLEAR CROSS-SECTION PARAMETERS
       READ (Nsysn,*) Spi, Ap_Endf
@@ -149,32 +174,34 @@ C ***                Endf version is in different units from sammy version
 C
 	Zke = Twomhb*Arat
 	Zkte = Zke * Ap
+
+        dopplerOption%crystalLattice%Mode_S_Norm = Mode_S_Norm
 c 
 C
 C
 C *** EFFECTIVE TEMPERATURE CALCULATION FOR CREATION OF Beta GRID
-      Del_Beta = Del_Phonon/Tev
-      CALL Start_Clm (Phonon, Ppp, Del_Beta)
+      Del_Beta = calc%Del_Phonon/calc%Tev
+      CALL Start_Clm (dopplerOption%crystalLattice,
+     &                Del_Beta)
 C *** INPUT  -- Phonon, Tbeta, Del_Beta, N_Contin
 C *** OUTPUT -- Ppp, F0, Tbar
-      Tevf = Tev*Tbar
-      Dwpix = F0
+      Tevf = calc%Tev*calc%Tbar
+      calc%Dwpix = calc%F0
       Tevf_true = Tevf
 C
 C *** INITIAL Beta Mesh CALCULATION
-      CALL Mesh (Beta, Tevf)
-C *** Input  -- Tevf, Tev, Emax, Xdop, Del_Phonon, Sub, Nbeta_Max
+      CALL Mesh (calc, Tevf)
+C *** Input  -- Tevf, Tev, Emax, Xdop, calc%Del_Phonon, Sub, Nbeta_Max
 C *** Output -- Beta(Nbeta), Del_S_B, Nbeta
 C
 C *** Contin_X initializes things, generates Save
-      CALL Contin_X (Ppp, Save, Tlast, Tnow, Savex, Del_Beta)
+      CALL Contin_X (calc, Del_Beta)
 C *** Input  -- Ppp(.), F0, Tbeta, Del_Beta, Sub,
 C ***            N_Contin, Nphon, Nbeta
 C *** Output -- Save(?,Nphon)
 C
 C *** Discre_X initializes things for Discre
-      CALL Discre_X (Osc_Eng, Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth,
-     &   Bex, Beta)
+      CALL Discre_X (calc)
 C
 C
 C *** CREATION OF ARRAY OF RESONANCES ENERGIES (for starters)
@@ -207,15 +234,15 @@ C *** INVERTED STACK MODEL FOR RECONSTRuCTION OF RESONANCE LINE-SHAPE
         E(J+1) = Eref(I  )
         E(J  ) = Eref(I+1)
         Tevf = Tevf_True
-        CALL Sigcri (Ar, Beta, Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth,
-     *    Bex, Save, E(J+1), Sig2, Temp, Rn, Tevf, Ch)
+        CALL Sigcri (Ar,
+     *    E(J+1), Sig2, Temp, Rn, Tevf, Ch)
         Sig(J+1) = Sig2
-        CALL Sigcri (Ar, Beta, Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth,
-     *    Bex, Save, E(J  ), Sig1, Temp, Rn, Tevf, Ch)
+        CALL Sigcri (Ar,
+     *     E(J  ), Sig1, Temp, Rn, Tevf, Ch)
         Sig(J) = Sig1
    20   Em = (E(J+1)+E(J))/2.
-        CALL Sigcri (Ar, Beta, Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth,
-     *    Bex, Save, Em, Sigm, Temp, Rn, Tevf, Ch)
+        CALL Sigcri (Ar,
+     *    Em, Sigm, Temp, Rn, Tevf, Ch)
         Sigl = Sig(J+1) + (Sig(J)-Sig(J+1))*(EM-E(J+1))/(E(J)-E(J+1))
         Dsig = dABS(Sigm-Sigl)
         Toch = Err*Sigm
@@ -228,8 +255,8 @@ C
             Sig(J+1) = Sig(J)
             Sig(J  ) = Sigm
             Em = (E(J+1)+E(J))/2.
-            CALL Sigcri (Ar, Beta, Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth,
-     *        Bex, Save, Em, Sigm, Temp, Rn, Tevf, Ch)
+            CALL Sigcri (Ar,
+     *        Em, Sigm, Temp, Rn, Tevf, Ch)
             Sigl = Sig(J+1) +(Sig(J)-Sig(J+1))*(Em-E(J+1))/(E(J)-E(J+1))
             Dsig = dABS(Sigm-Sigl)
             Toch = Err*Sigm
@@ -247,7 +274,7 @@ C
          END IF
       END IF
 C
-      Tevf = Tbeta*Tevf + 0.5d0*Tsave
+      Tevf = calc%Tbeta*Tevf + 0.5d0*calc%Tsave
       Ne = K - 1
       Dopplef = dSQRT(Tevf/Awr)
       dopplerOption%wantBroaden = .true.
@@ -258,13 +285,13 @@ C
       DO I=1,NE
 C
 C ***    CONVOLUTION FOR FREE GAZ
-         CALL Siggaz (Ecalc(I), AR, CH, Sumg, Epsc)
+         CALL Siggaz (Ecalc(I), AR, CH, Sumg, calc%Epsc)
          Sigg(I) = Sumg
 C
          Dummmm = Dopple
          Dopple = Dopplef
 C ***    CONVOLUTION FOR FREE GAZ AT EFFECTIVE TEMPERATURE
-         CALL Siggaz (Ecalc(I), AR, CH, Sumgf, Epsc)
+         CALL Siggaz (Ecalc(I), AR, CH, Sumgf, calc%Epsc)
          Siggf(I) = Sumgf
          Dopple = Dummmm
 C
@@ -290,7 +317,7 @@ C
      &  '' ADJUSTED XDOP INTERVAL ............... '', F10.3/
      &  '' EFFECTIVE TEMPERATURE................. '', F10.3/
      &  '' DEBAY-WALLER FACTOR................... '', F10.3/)')
-     &  K, Nbeta, Nphon, Xdop, Tempf, Dwpix
+     &  K, calc%Nbeta, calc%Nphon, calc%Xdop, Tempf, Dwpix
       WRITE (6,*) 'correct run!!! '
 C
       CALL Timer (3)
diff --git a/sammy/src/clm/dopush3.f b/sammy/src/clm/dopush3.f
index 35e9c0586a77cca72b4caaec8f7ea800f8c76cfe..961e22abe8afbad3a812676b10921c60eee8608b 100644
--- a/sammy/src/clm/dopush3.f
+++ b/sammy/src/clm/dopush3.f
@@ -2,10 +2,15 @@ C
 C
 C ----------------------------------------------------------------------
 C
-      SUBROUTINE Sigcri (Ar, Beta, Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth,
-     *   Bex, Save, Ei, Sigma, Temp, Rn, Tevf, Ch)
-      use clm_common_m
+      SUBROUTINE Sigcri (Ar,
+     *   Ei, Sigma, Temp, Rn, Tevf, Ch)
       use constn_common_m
+      use mclm5_m
+      use mcml6_m
+      use mclm7_m
+      use broad_common_m
+      use CrystalLatticeBroadening_M
+      use AllocateFunctions_m
       IMPLICIT DOUBLE PRECISION (A-H,O-Z)
 C
 C *** Purpose -- CRYSTAL MODEL CROSS-SECTION CALCULATION
@@ -13,64 +18,63 @@ C *** Input   -- Ei,
 C                Rn, Recul, Tev
 C *** Output  -- Sigma
 C
-      DOUBLE PRECISION Ar, Beta, Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth,
-     *   Bex, Save
-      DIMENSION Ar(*), Beta(*), Osc_Wts(*),
-     &   Osc_Enx(*), Osc_Snth(50), Osc_Coth(*),
-     &   Bex(*), Save(Nbeta_Max,*), Max_T(Nbeta_Max)
+      DOUBLE PRECISION Ar
+      DIMENSION Ar(*)
       DOUBLE PRECISION Ei, Sigma, Temp, Rn
       INTEGER Ch
 C
-      DOUBLE PRECISION Sab, Bs, Ss, Sign, S_Expb, S_Ex
-      DIMENSION Sab(25999), Bs(25999), Ss(25999), Sign(4),
-     *   S_Expb(25999), S_Ex(25999)
+      DOUBLE PRECISION Ss, Sign
+      DIMENSION Bs(25999), Ss(25999), Sign(4)
       DOUBLE PRECISION  Norm1, Sumr1, Norm, Sumr, Sintc, Sel,
      &   Sumc, Recul
       INTEGER K, Ik, Ns, J
       DOUBLE PRECISION  Zero, One, Five
       PARAMETER (Zero=0.0d0, One=1.0d0, Five=5.0d0)
+      class(CrystalLatticeBroadening),pointer::calc
 C
 C
 C     EFFECTIVE TEMPERATURE CALCULATION FOR CREATION OF Beta GRID
 C
+      calc => dopplerOption%crystalLattice
       Recul = Ei*Rn
-      Alpha = Recul/Tev
+      Alpha = Recul/calc%Tev
 C
 C     SCATTERING LaW CALCULATION
 C     Ei is in eV; Beta is unitless
 C
 C
-	ix=0
+	ix=0       
 C *** Continuous part of distribution
-      CALL Cconti (Save, Sab, Beta, Alpha, Norm, Sumr, Max_T)
+      call allocate_real_data(calc%Sab, calc%Nbeta)
+      CALL Cconti (calc, Alpha, Norm, Sumr)
 C
 C
       Tra0 = Norm
       Tra1 = Sumr
-      Tbarx = Tbar
+      Tbarx = calc%Tbar
 C *** Translational part, if any
-      IF (Twt.NE.Zero) THEN
+      IF (calc%Twt.NE.Zero) THEN
          Ndmax = 2000
-         CALL Trans (Beta, Sab, Alpha, Deltab, Tra0, Tra1, Ndmax)
+         CALL Trans (calc, Alpha, Deltab, Tra0, Tra1, Ndmax)
 C ***    UPDATE EFfECTIVE TEMPERATURE (which is used only in Discre)
-         Tevf = (Tbeta*Tevf+Twt*Tev)/(Tbeta+Twt)
-         Tbarx = Tevf/Tev
+         Tevf = (calc%Tbeta*Tevf+calc%Twt*calc%Tev)/
+     &          (calc%Tbeta+calc%Twt)
+         Tbarx = Tevf/calc%Tev
       END IF
 C
 C
       Osc0 = Tra0
       Osc1 = Tra1
 C *** Discrete oscillators, if any
-      IF (N_Osc.NE.0) THEN
-         CALL Discre (Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth, Sab, Beta,
-     *      Bex, S_Expb, S_Ex, Alpha, Tbarx, Osc0, Osc1)
+      IF (calc%N_Osc.NE.0) THEN
+         CALL Discre (calc, Alpha, Tbarx, Osc0, Osc1)
       END IF
 C
 C
       Norm1 = dABS(Norm-One)
       Sumr1 = dABS(Sumr-One)
-      IF (Norm1.GT.Eps .OR. Sumr1.GT.Eps) THEN
-         Nphon = Nphon + 5
+      IF (Norm1.GT.calc%Eps .OR. Sumr1.GT.calc%Eps) THEN
+         calc%Nphon = calc%Nphon + 5
       END IF
 C
 C
@@ -78,15 +82,15 @@ C     Dimensioning of Alpha and Beta values
 C     Centering of Beta in Recul=<Beta>=Ei/(Awr+1)
 C
       K=0
-      DO IK=Nbeta,1,-1
+      DO IK=calc%Nbeta,1,-1
          K = K + 1
-         Bs(K) = Recul - Beta(IK)*Tev
-         Ss(K) = Sab(IK)/Tev
+         Bs(K) = Recul - calc%Beta(IK)*calc%Tev
+         Ss(K) = calc%Sab(IK)/calc%Tev
       END DO
-      DO IK=2,Nbeta
+      DO IK=2,calc%Nbeta
          K = K + 1
-         Bs(K) = Recul + Beta(IK)*Tev
-         Ss(K) = Sab(IK)*dEXP(-Beta(IK))/Tev
+         Bs(K) = Recul + calc%Beta(IK)*calc%Tev
+         Ss(K) = calc%Sab(IK)*dEXP(-calc%Beta(IK))/calc%Tev
       END DO
 C
 C
@@ -103,7 +107,7 @@ C
 C     Convolution for crystal between Ss and Sigman
 C
       DO J=1,Ns-1
-         CALL Qtrapc (Ei, J, Sintc, Bs, Ss, Ns, Ar, Ch, Epsc)
+         CALL Qtrapc (Ei, J, Sintc, Bs, Ss, Ns, Ar, Ch, calc%Epsc)
          Sumc = Sumc + Sintc
       END DO
 C
@@ -113,10 +117,10 @@ C     Sigman(Ei+Recul)*EXP(-W*A)
 C
       CALL Csrmat (Ei+Recul, Sign, Ar)
 C
-      Sel = dEXP(-Dwpix*Alpha)
-      IF (Mode_S_Norm.EQ.0) THEN
+      Sel = dEXP(-calc%Dwpix*Alpha)
+      IF (calc%Mode_S_Norm.EQ.0) THEN
          Sigma = Sumc + Sign(Ch)*Sel
-      ELSE IF (Mode_S_Norm.EQ.1) THEN
+      ELSE IF (calc%Mode_S_Norm.EQ.1) THEN
          SIGMA = Sumc * (One-Sel)/(Norm-Sel) + Sign(Ch)*Sel
       END IF
       RETURN
diff --git a/sammy/src/clm/mclm0.f90 b/sammy/src/clm/mclm0.f90
index 47807003c77807b00cfc9847bf4fe8988537d00c..125c380deefa5f434ed3aa9753b60088279d4a3c 100644
--- a/sammy/src/clm/mclm0.f90
+++ b/sammy/src/clm/mclm0.f90
@@ -1,159 +1,72 @@
-C
-C
-      Subroutine Samclm_0
-C
-C *** Purpose -- Calculate Doppler broadening using Crystal-Lattice Model
-C ***            Coding based on Dmitri Naberejnev's DOPUSH code,
-C ***              modified greatly by NML to conform to SAMMY conventions
-C
-      use fixedi_m, only : K2reso, Kkkdex, Kkkrsl,
-     *             Nudwhi, Numorr, Numrpi,
-     *             Ndatd
-      use ifwrit_m, only : Kcros, Ksolve, Kvers7, Ndatb, Ntgrlq
-      use exploc_common_m
-      use array_sizes_common_m
-      use oopsch_common_m, only : Nowwww, Segmen
-      use clm_common_m, only : N_Contin, N_Osc, Nbeta_Max, Nphon
-      use lbro_common_m, only : Debug, Yresol, Yssmsc
-      use AllocateFunctions_m
-      use rsl7_m
-      use mxct27_m
+module Samclm_m
+use CrystalLatticeBroadening_M
+implicit none
+contains
+!
+!
+      Subroutine Samclm_0(broadener)
+!
+! *** Purpose -- Calculate Doppler broadening using Crystal-Lattice Model
+! ***            Coding based on Dmitri Naberejnev's DOPUSH code,
+! ***              modified greatly by NML to conform to SAMMY conventions
+!
+      use fixedi_m, only : Lllmax, Ndatd, numUsedPar
+      use ifwrit_m, only : Kcros, Kdebug, Ksindi, Ksitmp, Ndatb
+      use exploc_common_m, only : I_Iflmsc
+      use lbro_common_m, only : Debug
+      use array_sizes_common_m, only : calcDataSelf
+
+      use Readclm_m
+      use mclm3_m
+
+
       IMPLICIT None
-      real(kind=8),allocatable,dimension(:)::A_Isave
-      real(kind=8),allocatable,dimension(:)::A_Ioscwt
-      real(kind=8),allocatable,dimension(:)::A_Ioscex
-      real(kind=8),allocatable,dimension(:)::A_Ioscsn
-      real(kind=8),allocatable,dimension(:)::A_Ioscco
-      real(kind=8),allocatable,dimension(:)::A_Ibex
-      real(kind=8),allocatable,dimension(:)::A_Iphono
-      real(kind=8),allocatable,dimension(:)::A_Ioscen
-      real(kind=8),allocatable,dimension(:)::A_Ippp
-      real(kind=8),allocatable,dimension(:)::A_Itlast
-      real(kind=8),allocatable,dimension(:)::A_Itnowx
-      real(kind=8),allocatable,dimension(:)::A_Isavex
-      real(kind=8),allocatable,dimension(:)::A_Isexpb
-      real(kind=8),allocatable,dimension(:)::A_Isexxx
-      real(kind=8),allocatable,dimension(:)::A_Ibs
-      real(kind=8),allocatable,dimension(:)::A_Iss
-      integer,allocatable,dimension(:)::I_Imaxt
-      real(kind=8),allocatable,dimension(:)::A_IbetaGrid
+
       integer::M, N, N_Osc_Blank, Nn, Kdatb
-C
-C
+      class(CrystalLatticeBroadening)::broadener
+!
+!
       WRITE (6,99999)
 99999 FORMAT (' *** SAMMY-CLM   15 Nov 07 ***')
-      Segmen(1) = 'C'
-      Segmen(2) = 'L'
-      Segmen(3) = 'M'
-      Nowwww = 0
-C
+!
       CALL Initix
-C
-C
-      Kdatb = Ndatd
-      IF (Kdatb.EQ.0) Kdatb = Ndatb
-C
-C *** Read through the CLM file to learn array dimensions
-      CALL Readclm_0 (N_Osc_Blank)
-C
-C *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR SAMCLM
-      CALL Estclm (Kdatb)
-C
-      Nbeta_Max = 25999
-      call allocate_real_data(A_Isave, Nphon*Nbeta_Max)
-      M = IABS (N_Contin)
-      N = IABS (N_Osc)
-      IF (M.EQ.0) M = 1
-      IF (N.EQ.0) N = 1
-      call allocate_real_data(A_Ioscwt, N)
-      call allocate_real_data(A_IbetaGrid, Nbeta_Max)
-      call allocate_real_data(A_Ioscex , N)
-      call allocate_real_data(A_Ioscsn , N)
-      call allocate_real_data(A_Ioscco , N)
-      call allocate_real_data(A_Ibex   , Nbeta_Max)
-C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
-      call allocate_real_data(A_Iphono , M)
-      call allocate_real_data(A_Ioscen , N)
-      call allocate_real_data(A_Ippp   , Nbeta_Max)
-      call allocate_real_data(A_Itlast , Nbeta_Max)
-      call allocate_real_data(A_Itnowx , Nbeta_Max)
-      call allocate_real_data(A_Isavex , Nbeta_Max*Nphon)
-C *** Read the CLM file for real
-      CALL Readclm (A_Iphono , A_Ioscen , A_Ioscwt , N_Osc_Blank)
-C
-C *** Initialize the crystal-lattice calculation
-      CALL Initclm (A_Isave  , A_Iphono , A_Ioscen , A_Ioscwt , A_Ippp ,
-     *   A_IbetaGrid  , A_Ioscex , A_Ioscsn , A_Ioscco , A_Ibex   ,
-     *   A_Itlast , A_Itnowx , A_Isavex )
-      deallocate(A_Iphono)
-      deallocate(A_Ioscen)
-      deallocate(A_Ippp)
-      deallocate(A_Itlast)
-      deallocate(A_Itnowx)
-      deallocate(A_Isavex)
-C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-C
-C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-C *** One ***
-C
+
+      broadener%numPar = numUsedPar
+      broadener%debugOutput = .false.
+      if (Kdebug.ne.0) broadener%debugOutput = .true.
+
+      if (Kcros.EQ.8) THEN
+         call broadener%addSelfData(calcDataSelf, Ksindi.le.0.and.Ksitmp.GT.0, Lllmax+1)
+      END IF
+      call broadener%broaden()
+
+!
+! *** Read through the CLM file to learn array dimensions
+      CALL Readclm_0 (broadener, N_Osc_Blank)
+! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
+! *** Read the CLM file for real
+      CALL Readclm (broadener,  N_Osc_Blank)
+!
+! *** Initialize the crystal-lattice calculation
+      CALL Initclm (broadener)
+! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
+!
+! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+! *** One ***
+!
       N = 1
       Nn = 1      
-C
-C
-C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
-      call allocate_real_data(A_Isexpb , Nbeta_Max)
-      call allocate_real_data(A_Isexxx , Nbeta_Max)
-      call allocate_real_data(A_Ibs    , Nbeta_Max)
-      call allocate_real_data(A_Iss    , Nbeta_Max)
-      call allocate_integer_data(I_Imaxt , Nbeta_Max) ! now allocated as real integer
-C
-C *** Dopclm performs CLM Doppler operation
-      CALL Dopclm (          I_Iflmsc ,
-     * A_IbetaGrid, A_Ioscwt , A_Ioscex, A_Ioscsn, A_Ioscco , A_Ibex  ,
-     * A_Isexpb , A_Isexxx , A_Isave  , A_Ibs    , A_Iss    , I_Imaxt )
+!
+!
+! *** Dopclm performs CLM Doppler operation
+      CALL Dopclm (broadener,        I_Iflmsc)
 
-C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-C
-C
-C
+! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+!
+!
+!
       CALL Write_Commons_many
-      deallocate(A_IbetaGrid)
-      deallocate(A_Isave)
-      deallocate(A_Ioscwt)
-      deallocate(A_Ioscex)
-      deallocate(A_Ioscsn)
-      deallocate(A_Ioscco)
-      deallocate(A_Ibex)
-      deallocate(A_Isexpb)
-      deallocate(A_Isexxx)
-      deallocate(A_Ibs)
-      deallocate(A_Iss)
-      deallocate(I_Imaxt)
-      RETURN
-C
-      END
-C
-C
-C __________________________________________________________________
-C
-      SUBROUTINE Estclm (Kdatb)
-C
-C *** purpose -- estimate array size for this segment
-C
-      IMPLICIT None
-      integer::Kdatb, Idimen
-      integer::I, K
-      logical Need_isotopes
-      external Idimen
-C
-C
-C *** One
-cx      CALL Figure_KWs_1 (Kone)
-C
-cx      K = Kone + 2*Kdatb
-      K = 2*Kdatb
-      K = Idimen (K, 1, 'K, 1')
-      I = Idimen (K, -1, 'K, -1')
-      I = Idimen (0, 1, '0, 1')
       RETURN
+!
       END
+end module Samclm_m
diff --git a/sammy/src/clm/mclm1.f90 b/sammy/src/clm/mclm1.f90
index 70b93ac778e7b9a273192ca7ba5c56edad95ecaa..295ab48db74c75e1929eef7af28313e07ead196f 100644
--- a/sammy/src/clm/mclm1.f90
+++ b/sammy/src/clm/mclm1.f90
@@ -1,76 +1,89 @@
-C
-C
-C -----------------------------------------------------------------
-C
-      SUBROUTINE Readclm_0 (N_Osc_Blank)
-C
-C *** Purpose -- Read CLM file to learn array dimensions
-C
-      use namfil_common_m
-      use clm_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      CHARACTER*80 Title
-      CHARACTER*5 A, Blank
-      CHARACTER*1 B(80)
-      CHARACTER*89 B_one
-      DATA Blank /'     '/
-C
+module Readclm_m
+   use CrystalLatticeBroadening_M
+   use AllocateFunctions_m, only : allocate_real_data
+
+   public Readclm_0, Readclm, Initclm
+contains
+!
+!
+! -----------------------------------------------------------------
+!
+      SUBROUTINE Readclm_0 (calc, N_Osc_Blank)
+!
+! *** Purpose -- Read CLM file to learn array dimensions
+!
+      use namfil_common_m, only : Fclmxx
+      IMPLICIT None
+      class(CrystalLatticeBroadening)::calc
+      integer::N_Osc_Blank
+      CHARACTER(80)::Title
+      CHARACTER(5):: A
+      CHARACTER(1)::B(80)
+      CHARACTER(89)::B_one
+      CHARACTER(5), parameter :: Blank = '     '
+      integer::Ixx, Kpound
+!
       equivalence(B,B_one) 
       
       CALL Filopn (10, Fclmxx, 0)
-C
+!
       READ (10,10200,END=400,ERR=500) Title
 10200 FORMAT (A80)
-      READ (10,*) Mode_S_Norm, Nphon, Sub, Xdop, Eps, Epsc
+      READ (10,*) calc%Mode_S_Norm, calc%Nphon, calc%Sub, calc%Xdop, calc%Eps, calc%Epsc
       READ (10,10300) A
 10300 FORMAT (A5)
       IF (A.NE.Blank) STOP '[Stop in Readclm_0 in clm/mclm1.f   # 4]'
-C
+!
       READ (10,10300) A
       CALL Convert_To_Caps (A, 5, Kpound)
-C
+!
       IF (A.EQ.'CONTI') THEN
          READ (10,10400) B
 10400    FORMAT (80A1)
-         CALL Find_Con (B, B_one, N_Contin, Ixx)
-C ***    Done reading Continuous Mode; Read next card
+         CALL Find_Con (B, B_one, calc%N_Contin, Ixx)
+! ***    Done reading Continuous Mode; Read next card
          IF (Ixx.EQ.1) GO TO 400
          READ (10,10300,End=400) A
          CALL Convert_To_Caps (A, 5, Kpound)
       END IF
-C
+!
       IF (A.EQ.'DISCR') THEN
          READ (10,10400) B
-         CALL Find_Osc (B, B_one, N_Osc, N_Osc_Blank, Ixx)
+         CALL Find_Osc (B, B_one, calc%N_Osc, N_Osc_Blank, Ixx)
          IF (Ixx.EQ.1) GO TO 400
-C ***    Done reading Discrete Mode; Read next card
+! ***    Done reading Discrete Mode; Read next card
          READ (10,10300,END=400) A
          CALL Convert_To_Caps (A, 5, Kpound)
       END IF
-C
+!
       IF (A.EQ.'TRANS') THEN
          READ (10,10400,END=400) B
       END IF
-C
+!
   400 CONTINUE
       REWIND (UNIT=10)
       RETURN
-C
-C
+!
+!
   500 CONTINUE
       CLOSE (UNIT=10)
       STOP '[Stop in Readclm_0 in clm/mclm1.f problem reading CLM file]'
       END
-C
-C
-C --------------------------------------------------------------
-C
+!
+!
+! --------------------------------------------------------------
+!
       SUBROUTINE Find_Con (B, Bb, Nn, Ixx)
-      CHARACTER*1 B(80)
-      CHARACTER*80 Bb
-      CHARACTER*10 A, Blank
-      DIMENSION C(8)
-      DATA Blank /'          '/, Zero /0.0d0/
+      IMPLICIT none
+      CHARACTER(1):: B(80)
+      CHARACTER(80):: Bb
+      CHARACTER(10):: A
+      integer::Nn, Ixx
+      real(kind=8)::C(8)
+      CHARACTER(10), parameter ::Blank ='          '
+      real(kind=8),parameter::Zero=0.0d0
+      real(kind=8)::Cx
+      integer::I, L, M, N
       Ixx = 0
       L = 0
       N = 0
@@ -95,8 +108,8 @@ C
          END IF
       END DO
       Nn = 0
-C *** User did not count the phonons; ergo
-C *** i.e., fixed-format where SAMMY counts the number of points
+! *** User did not count the phonons; ergo
+! *** i.e., fixed-format where SAMMY counts the number of points
       N = 0
    30 CONTINUE
          READ (10,10500,END=400) C
@@ -110,17 +123,17 @@ C *** i.e., fixed-format where SAMMY counts the number of points
          END DO
          GO TO 30
    40 CONTINUE
-C *** Note that we have read and counted the blank line
+! *** Note that we have read and counted the blank line
       RETURN
-C
+!
    50 CONTINUE
-C *** User did count the phonons, so now we need to count cards
+! *** User did count the phonons, so now we need to count cards
          READ (10,10000) A
 10000    FORMAT (A10)
          IF (A.EQ.Blank) GO TO 60
          GO TO 50
    60 CONTINUE
-C *** So number of cards read should now be Ncard + Ncardx; includes blank
+! *** So number of cards read should now be Ncard + Ncardx; includes blank
       READ (Bb,*) Cx, Nn
       RETURN
 
@@ -128,20 +141,25 @@ C *** So number of cards read should now be Ncard + Ncardx; includes blank
       Ixx = 1
       RETURN
       END
-C
-C
-C --------------------------------------------------------------
-C
+!
+!
+! --------------------------------------------------------------
+!
       SUBROUTINE Find_Osc (B, Bb, Nn, N_Osc_Blank, Ixx)
-      CHARACTER*1 B(80)
-      CHARACTER*80 Bb
-      DIMENSION C(8)
-      CHARACTER*10 A, Blank
-      DATA Blank /'          '/, Zero /0.0d0/
-C
+      IMPLICIT none
+      CHARACTER(1):: B(80)
+      CHARACTER(80)::Bb
+      integer::Nn, N_Osc_Blank, Ixx
+      real(kind=8)::C(8)
+      CHARACTER(10)::A
+      CHARACTER(10), parameter :: Blank = '          '
+      real(kind=8),parameter:: Zero=0.0d0
+      integer::I, L, N
+
+!
       Ixx = 0
       N_Osc_Blank = 0
-C *** Is card entirely blank?
+! *** Is card entirely blank?
       DO I=1,80
          IF (B(I).NE.' ') THEN
             L = I
@@ -153,22 +171,22 @@ C *** Is card entirely blank?
       N_Osc_Blank = 1
       READ (10,10500,END=400) C
       READ (10,10500,END=400) C
-C *** User did not count the phonons; nothing is on the card
+! *** User did not count the phonons; nothing is on the card
       GO TO 50
-C
+!
    10 CONTINUE
-C *** Does card have a decimal point?
+! *** Does card have a decimal point?
       DO I=L+1,80
          IF (B(I).EQ.'.') THEN
-C ***       User did not count the phonons
+! ***       User did not count the phonons
             GO TO 40
          ELSE IF (B(I).EQ.' ') THEN
             GO TO 20
          END IF
       END DO
-C
+!
    20 CONTINUE
-C *** User did count the oscillators, so now we need to count cards
+! *** User did count the oscillators, so now we need to count cards
          READ (10,10000) A
 10000    FORMAT (A10)
          IF (A.EQ.Blank) GO TO 30
@@ -176,7 +194,7 @@ C *** User did count the oscillators, so now we need to count cards
    30 CONTINUE
       READ (Bb,*) Nn
       RETURN
-C
+!
    40 CONTINUE
       N  = 0
       Nn = 0
@@ -184,7 +202,7 @@ C
       READ (10,10500) C
 10500 FORMAT (8F10.1)
    50 CONTINUE
-C *** Fixed-format where SAMMY counts the number of points
+! *** Fixed-format where SAMMY counts the number of points
          DO I=1,8
             N = N + 1
             IF (C(I).EQ.Zero) THEN
@@ -197,180 +215,184 @@ C *** Fixed-format where SAMMY counts the number of points
          GO TO 50
    60 CONTINUE
       RETURN
-C
+!
   400 CONTINUE
       Nn = - N
       Ixx = 1
       RETURN
       END
-C
-C
-C -----------------------------------------------------------------
-C
-      SUBROUTINE Readclm (Phonon, Osc_Eng, Osc_Wts, N_Osc_Blank)
-C
-C *** Purpose -- Read CLM file for real
-C
-      use fixedr_m
-      use namfil_common_m
-      use clm_common_m
-      use constn_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Phonon(*), Osc_Eng(*), Osc_Wts(*)
-      CHARACTER*80 Title
-      CHARACTER*5 A, Blank
-      DATA Blank /'     '/, Zero /0.0d0/, Half /0.5d0/, One /1.0d0/
-C
+!
+!
+! -----------------------------------------------------------------
+!
+      SUBROUTINE Readclm (calc, N_Osc_Blank)
+!
+! *** Purpose -- Read CLM file for real
+!
+      use fixedr_m, only : Emax, Emin, Temp
+      IMPLICIT None
+      class(CrystalLatticeBroadening)::calc
+      integer::N_Osc_Blank
+      CHARACTER(80):: Title
+      CHARACTER(5)::A
+      CHARACTER(5), parameter::Blank = '     '
+      real(kind=8),parameter::Zero=0.0d0, Half=0.5d0, One=1.0d0
+      real(kind=8)::Bbbb, Cccc
+      integer::I, Kpound, N
+!
       READ (10,10200,END=400,ERR=400) Title
 10200 FORMAT (A80)
-      READ (10,*) Mode_S_Norm, Nphon, Sub, Xdop, Eps, Epsc
-         IF (Sub .EQ.Zero) Sub  = One
-         IF (Xdop.EQ.Zero) Xdop = One
-         IF (Eps .EQ.Zero) Eps  = 0.080d0
-         IF (Epsc.EQ.Zero) Epsc = 0.001d0
+      READ (10,*) calc%Mode_S_Norm, calc%Nphon, calc%Sub, calc%Xdop, calc%Eps, calc%Epsc
+         IF (calc%Sub .EQ.Zero) calc%Sub  = One
+         IF (calc%Xdop.EQ.Zero) calc%Xdop = One
+         IF (calc%Eps .EQ.Zero) calc%Eps  = 0.080d0
+         IF (calc%Epsc.EQ.Zero) calc%Epsc = 0.001d0
       READ (10,10300) A
 10300 FORMAT (A5)
       IF (A.NE.Blank) STOP '[Stop in Readclm in clm/mclm1.f]'
-C
+!
       READ (10,10300) A
       CALL Convert_To_Caps (A, 5, Kpound)
-C
+!
       IF (A.EQ.'CONTI') THEN
-         IF (N_Contin.LE.0) THEN
-            READ (10,*) Del_Phonon
-C ***       Fixed-format where SAMMY counts the number of points
-            N_Contin = - N_Contin
-            READ (10,10500,END=400) (Phonon(I),I=1,N_Contin)
+         IF (calc%N_Contin.LE.0) THEN
+            READ (10,*) calc%Del_Phonon
+! ***       Fixed-format where SAMMY counts the number of points
+            calc%N_Contin = - calc%N_Contin
+            call allocate_real_data(calc%Phonon,calc%N_Contin)
+            READ (10,10500,END=400) (calc%Phonon(I),I=1,calc%N_Contin)
 10500       FORMAT (8F10.1)
          ELSE
-C ***       Free-format but user must count
-            READ (10,*) Del_Phonon, N
-            IF (N.NE.N_Contin) STOP '[Stop in Readclm in mclm1.f # 2]'
-            READ (10,*) (Phonon(I),I=1,N_Contin)
+! ***       Free-format but user must count
+            READ (10,*) calc%Del_Phonon, N
+            IF (N.NE.calc%N_Contin) STOP '[Stop in Readclm in mclm1.f # 2]'
+            call allocate_real_data(calc%Phonon,calc%N_Contin)
+            READ (10,*) (calc%Phonon(I),I=1,calc%N_Contin)
          END IF
          READ (10,10300) A
-C ***    Done reading Continuous Mode; Read next card
+! ***    Done reading Continuous Mode; Read next card
          READ (10,10300) A
          CALL Convert_To_Caps (A, 5, Kpound)
       END IF
-C
+!
       IF (A.EQ.'DISCR') THEN
          IF (N_Osc_Blank.EQ.1) READ (10,10300) A
-         IF (N_Osc.LE.0) THEN
-C ***       Fixed-format where SAMMY counts the number of points
-            N_Osc = - N_Osc
-            READ (10,10500,END=400) (Osc_Eng(I),I=1,N_Osc)
-            READ (10,10500,END=400) (Osc_Wts(I),I=1,N_Osc)
+         IF (calc%N_Osc.LE.0) THEN
+! ***       Fixed-format where SAMMY counts the number of points
+            calc%N_Osc = - calc%N_Osc
+            call allocate_real_data(calc%Osc_Wts,calc%N_Osc)
+            call allocate_real_data(calc%Osc_Eng,calc%N_Osc)
+            READ (10,10500,END=400) (calc%Osc_Eng(I),I=1,calc%N_Osc)
+            READ (10,10500,END=400) (calc%Osc_Wts(I),I=1,calc%N_Osc)
          ELSE
-C ***       Free-format but user must count
+! ***       Free-format but user must count
             READ (10,*) N
-            IF (N.NE.N_Osc) STOP '[Stop in Readclm in mclm1.f   # 3]'
-            READ (10,*) (Osc_Eng(I),I=1,N_Osc)
-            READ (10,*) (Osc_Wts(I),I=1,N_Osc)
+            IF (N.NE.calc%N_Osc) STOP '[Stop in Readclm in mclm1.f   # 3]'
+            call allocate_real_data(calc%Osc_Wts, calc%N_Osc)
+            call allocate_real_data(calc%Osc_Eng,calc%N_Osc)
+            READ (10,*) (calc%Osc_Eng(I),I=1,calc%N_Osc)
+            READ (10,*) (calc%Osc_Wts(I),I=1,calc%N_Osc)
          END IF
          READ (10,10300,END=400) A
-C ***    Done reading Discrete Mode; Read next card
+! ***    Done reading Discrete Mode; Read next card
          READ (10,10300,END=400) A
          CALL Convert_To_Caps (A, 5, Kpound)
       END IF
-C
+!
       IF (A.EQ.'TRANS') THEN
-         READ (10,*) Twt, C_Trans, Tbeta
-         WRITE (21,10600) Twt, C_Trans, Tbeta
+         READ (10,*) calc%Twt, calc%C_Trans, calc%Tbeta
+         WRITE (21,10600) calc%Twt, calc%C_Trans, calc%Tbeta
 10600    FORMAT (//, 'Twt, C, Tbeta=', 1P6G14.6)
       END IF
-      IF (Tbeta.EQ.Zero) Tbeta = One
-C
+      IF (calc%Tbeta.EQ.Zero) calc%Tbeta = One
+!
   400 CONTINUE
-C
-C *** Printing the input almost as DOPUSH does
+!
+! *** Printing the input almost as DOPUSH does
       WRITE (21,10650) Title
 10650 FORMAT (//, 1X, A40)
-      WRITE (21,10660) Nphon, Temp, Emin, Emax, Xdop, Eps*100, Epsc*100
-10660 FORMAT (//,
-     & ' REQUIRED PHONON-EXPANSION ORDER .......... ', I10, /,
-     & ' TEMPERATURE............................... ', F10.3, /,
-     & ' MINIMAL ENERGY ........................... ', F10.3, /,
-     & ' MAXIMAL ENERGY............................ ', F10.3, /,
-     & ' INITIAL XDOP INTERVAL .................... ', F10.3, /,
-     & ' NORMALISATION PRECISION .................. ', F10.3, '%', /,
-     & ' INTEGRATION PRECISION .................... ', F10.3, '%')
-C
+      WRITE (21,10660) calc%Nphon, Temp, Emin, Emax, calc%Xdop, calc%Eps*100, calc%Epsc*100
+10660 FORMAT (//,                                                    &
+       ' REQUIRED PHONON-EXPANSION ORDER .......... ', I10, /,       &
+       ' TEMPERATURE............................... ', F10.3, /,     &
+       ' MINIMAL ENERGY ........................... ', F10.3, /,     &
+       ' MAXIMAL ENERGY............................ ', F10.3, /,     &
+       ' INITIAL XDOP INTERVAL .................... ', F10.3, /,     &
+       ' NORMALISATION PRECISION .................. ', F10.3, '%', /,&
+       ' INTEGRATION PRECISION .................... ', F10.3, '%')
+!
       CLOSE (UNIT=10)
-C
-      WRITE (21,10700) N_Contin
+!
+      WRITE (21,10700) calc%N_Contin
 10700 FORMAT (/, ' Number of points in phonon distribution =', I5)
-      Bbbb = Phonon(1)*Half
-      DO I=2,N_Contin-1
-         Bbbb = Bbbb + Phonon(I)
+      Bbbb = calc%Phonon(1)*Half
+      DO I=2,calc%N_Contin-1
+         Bbbb = Bbbb + calc%Phonon(I)
       END DO
-      Bbbb = Bbbb + Phonon(N_Contin)*Half
-      Cccc = Bbbb*Del_Phonon
-      WRITE (21,10800) Bbbb, Del_Phonon, Cccc
-10800 FORMAT (' Sum of points=', 1PG14.6, '   Spacing=',G14.6,
-     *   '   *=',G14.6)
-      WRITE (21,10900) (Phonon(I),I=1,N_Contin)
+      Bbbb = Bbbb + calc%Phonon(calc%N_Contin)*Half
+      Cccc = Bbbb*calc%Del_Phonon
+      WRITE (21,10800) Bbbb, calc%Del_Phonon, Cccc
+10800 FORMAT (' Sum of points=', 1PG14.6, '   Spacing=',G14.6, &
+         '   *=',G14.6)
+      WRITE (21,10900) (calc%Phonon(I),I=1,calc%N_Contin)
 10900 FORMAT (1P5G14.6)
-      IF (Phonon(1).NE.Zero) THEN
-         WRITE (6,11000) Phonon(1)
+      IF (calc%Phonon(1).NE.Zero) THEN
+         WRITE (6,11000) calc%Phonon(1)
 11000    FORMAT ('First term must be zero, not', 1PG14.6)
          STOP '[STOP in Readclm in clm/mclm1.f]'
       END IF
-C
+!
       RETURN
       END
-C
-C
-C -----------------------------------------------------------------
-C
-      SUBROUTINE Initclm (Save, Phonon, Osc_Eng, Osc_Wts, Ppp, Beta,
-     *   Osc_Enx, Osc_Snth, Osc_Coth, Bex, Tlast, Tnow, Savex)
-C
-C *** Purpose -- Initialize things
-C
-      use ifwrit_m
-      use fixedr_m
-      use clm_common_m
-      use constn_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Phonon(*), Osc_Eng(*), Osc_Wts(*), Ppp(*), Beta(*),
-     *   Osc_Enx(*), Osc_Snth(*), Osc_Coth(*), Bex(*)
-      DIMENSION Save(Nbeta_Max,*), Tlast(*), Tnow(*), Savex(Nbeta_Max,*)
-C
-C
-      Tev = Boltzm*Temp
-C *** Effective temperature calculation for creation of beta grid
-      Del_Beta = Del_Phonon/Tev
-      IF (N_Contin.GT.0) THEN
-         CALL Start_Clm (Phonon, Ppp, Del_Beta)
-C ***    INPUT  -- Phonon, Tbeta, Del_Beta, N_Contin
-C ***    OUTPUT -- Ppp, F0, Tbar
+!
+!
+! -----------------------------------------------------------------
+!
+      SUBROUTINE Initclm (calc)
+!
+! *** Purpose -- Initialize things
+!
+      use fixedr_m, only : Temp
+      use constn_common_m, only : Boltzm
+      use mclm2_M
+      IMPLICIT None
+      class(CrystalLatticeBroadening)::calc
+      real(kind=8)::Del_Beta, Tevf, Tevf_true
+!
+!
+      calc%Tev = Boltzm*Temp
+! *** Effective temperature calculation for creation of beta grid
+      Del_Beta = calc%Del_Phonon/calc%Tev
+      IF (calc%N_Contin.GT.0) THEN
+         CALL Start_Clm (calc, Del_Beta)
+! ***    INPUT  -- Phonon, Tbeta, Del_Beta, N_Contin
+! ***    OUTPUT -- Ppp, F0, Tbar
       END IF
-      Tevf = Tev*Tbar
-      Dwpix = F0
+      Tevf = calc%Tev*calc%Tbar
+      calc%Dwpix = calc%F0
       Tevf_true = Tevf
-C
-C *** Initial beta mesh calculation
-      CALL Mesh (Beta, Tevf)
-C *** Input  -- Tevf, Tev, Emax, Xdop, Del_Phonon, Sub
-C *** Output -- Beta(Nbeta), Del_S_B, Nbeta
-C
-      IF (N_Contin.GT.0) THEN
-C ***    Contin_X initializes things, generates array Save
-         CALL Contin_X (Ppp, Save, Tlast, Tnow, Savex, Del_Beta)
-C ***    Input  -- Pppppp(.), Alpha, Omega, F0, Tbeta, Del_Beta, Sub,
-C ***               N_Contin, Nphon, Nbeta
-C ***    Output -- Save(?,Nphon)
+!
+! *** Initial beta mesh calculation
+      CALL Mesh (calc, Tevf)
+! *** Input  -- Tevf, Tev, Emax, Xdop, calc%Del_Phonon, Sub
+! *** Output -- Beta(Nbeta), Del_S_B, Nbeta
+!
+      IF (calc%N_Contin.GT.0) THEN
+! ***    Contin_X initializes things, generates array Save
+         CALL Contin_X (calc, Del_Beta)
+! ***    Input  -- Pppppp(.), Alpha, Omega, F0, Tbeta, Del_Beta, Sub,
+! ***               N_Contin, Nphon, Nbeta
+! ***    Output -- Save(?,Nphon)
       END IF
-C
-      IF (N_Osc.GT.0) THEN
-C ***    Discre_X initializes things for Discre
-         CALL Discre_X (Osc_Eng, Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth,
-     *      Bex, Beta)
-C ***    Input  -- Osc_Eng(), Osc_Wts(), Tev, Beta(Nbeta)
-C ***    Output -- Osc_Enx()
+!
+      IF (calc%N_Osc.GT.0) THEN
+! ***    Discre_X initializes things for Discre
+         CALL Discre_X (calc)
+! ***    Input  -- Osc_Eng(), Osc_Wts(), Tev, Beta(Nbeta)
+! ***    Output -- Osc_Enx()
       END IF
-C
-C
+!
+!
       RETURN
       END
+end module Readclm_m
diff --git a/sammy/src/clm/mclm2.f90 b/sammy/src/clm/mclm2.f90
index 7f3cee7f259b8c28eeaddc8eac8492dd59394e56..b4dd8ab46c65e0f9ed6149542ca1cafe0bf88384 100644
--- a/sammy/src/clm/mclm2.f90
+++ b/sammy/src/clm/mclm2.f90
@@ -1,359 +1,361 @@
-C
-C
-C -------------------------------------------------------------------
-C
-      SUBROUTINE Start_Clm (Phonon, Ppp, Del_Beta)
-C
-C *** Purpose   -- Compute several integral functions of the phonon
-C ***              frequency distribution.
-C *** Called by -- Initclm
-C *** Input     -- Phonon(.), Tbeta, Del_Beta, N_Contin
-C *** Output    -- Ppp(.), F0, Tbar
-C *** Local     -- Q, Annnnn, Ubeta, V, Vv, Fs0, Fs2, W2
-C
-      use clm_common_m
-      IMPLICIT NONE
+module mclm2_M
+use CrystalLatticeBroadening_M
+use AllocateFunctions_m
+implicit none
+contains
+!
+!
+! -------------------------------------------------------------------
+!
+      SUBROUTINE Start_Clm (calc, Del_Beta)
+!
+! *** Purpose   -- Compute several integral functions of the phonon
+! ***              frequency distribution.
+! *** Called by -- Initclm
+! *** Input     -- Phonon(.), Tbeta, Del_Beta, N_Contin
+! *** Output    -- Ppp(.), F0, Tbar
+! *** Local     -- Q, Annnnn, Ubeta, V, Vv, Fs0, Fs2, W2
+!
+      class(CrystalLatticeBroadening)::calc
       INTEGER I
-      DIMENSION Phonon(*), Ppp(*)
-      DOUBLE PRECISION Phonon, Ppp, Del_Beta,
-     *   Q, Annnnn, Ubeta, V, Vv, Fs0, Fs2, W2
+      DOUBLE PRECISION Del_Beta,   &
+        Q, Annnnn, Ubeta, V, Vv, Fs0, Fs2, W2
       DOUBLE PRECISION  Zero, Half, One
       DATA Zero /0.0d0/, Half /0.5d0/, One /1.0d0/
-C
-C
-C *** ---
-C *** Copy input spectrum into Ppp array
-      DO I=1,N_Contin
-         Ppp(I) = Phonon(I)
+!
+!
+! *** ---
+! *** Copy input spectrum into Ppp array
+      call allocate_real_data(calc%Ppp, calc%N_Contin)
+      DO I=1,calc%N_Contin
+         calc%Ppp(I) = calc%Phonon(I)
       END DO
-C
-C *** ---
-C *** Calculate normalizing constant = Annnnn
-      Annnnn = Ppp(1)*Half
-      DO I=2,N_Contin-1
-         Annnnn = Annnnn + Ppp(I)
+!
+! *** ---
+! *** Calculate normalizing constant = Annnnn
+      Annnnn = calc%Ppp(1)*Half
+      DO I=2,calc%N_Contin-1
+         Annnnn = Annnnn + calc%Ppp(I)
       END DO
-      Annnnn = Annnnn + Ppp(N_Contin)*Half
-C
-C *** ---
-C *** Calculate Debye-Waller Lambda and effective temperature
-C ***    at the same time as calculate Ppp = Phonon/sinth/beta
-C *** From here to next "C * ---" used to be Fsum(0...) and Fsum(2...)
-cq      Ppp(1) = Ppp(2)/Del_Beta**2   Clearly this is wrong
-cq      Ppp(1) = Ppp(1)/Del_Beta**2   This is also wrong
-cq      Ppp(1) = Ppp(1)/Zero          This is right! but ill-defined
-      Ppp(1) = Ppp(1)/Del_Beta**2
+      Annnnn = Annnnn + calc%Ppp(calc%N_Contin)*Half
+!
+! *** ---
+! *** Calculate Debye-Waller Lambda and effective temperature
+! ***    at the same time as calculate calc%Ppp = calc%Phonon/sinth/beta
+! *** From here to next "C * ---" used to be Fsum(0...) and Fsum(2...)
+!q      calc%Ppp(1) = calc%Ppp(2)/Del_Beta**2   Clearly this is wrong
+!q      calc%Ppp(1) = calc%Ppp(1)/Del_Beta**2   This is also wrong
+!q      calc%Ppp(1) = calc%Ppp(1)/Zero          This is right! but ill-defined
+      calc%Ppp(1) = calc%Ppp(1)/Del_Beta**2
       Ubeta = Del_Beta
       V = dEXP(Half*Del_Beta)
       Vv = V
-cq      Fs0 = Ppp(1)
+!q      Fs0 = calc%Ppp(1)
       Fs0 = Zero
       Fs2 = Zero
-      DO I=2,N_Contin-1
+      DO I=2,calc%N_Contin-1
          W2  = Ubeta**2
-         Ppp(I) = ( Ppp(I)/Ubeta ) / (Vv-One/Vv)
-         Q = Ppp(I) * (Vv+One/Vv)
-C nml    so P(I   )= Phonon(I+1 ) / sinth(I Del_Beta/2) / { I Del_Beta }
-C nml       P(Beta)= Phonon(Beta) / sinth(      Beta/2) / {       Beta }
-C nml       Q      = Phonon(I+1 ) * coth (I Del_Beta/2) / { I Del_Beta }
-C nml       Q(Beta)= Phonon(Beta) * coth (      Beta/2) / {       Beta }
+         calc%Ppp(I) = ( calc%Ppp(I)/Ubeta ) / (Vv-One/Vv)
+         Q = calc%Ppp(I) * (Vv+One/Vv)
+! nml    so P(I   )= calc%Phonon(I+1 ) / sinth(I Del_Beta/2) / { I Del_Beta }
+! nml       P(Beta)= calc%Phonon(Beta) / sinth(      Beta/2) / {       Beta }
+! nml       Q      = calc%Phonon(I+1 ) * coth (I Del_Beta/2) / { I Del_Beta }
+! nml       Q(Beta)= calc%Phonon(Beta) * coth (      Beta/2) / {       Beta }
          Fs0 = Fs0 + Q
          Fs2 = Fs2 + Q * W2
          Vv = V*Vv
          Ubeta = Ubeta + Del_Beta
       END DO
-      Ppp(N_Contin) = ( Ppp(N_Contin)/Ubeta ) / (Vv-One/Vv)
-      Q = Ppp(N_Contin) * (Vv+One/Vv)
+      calc%Ppp(calc%N_Contin) = ( calc%Ppp(calc%N_Contin)/Ubeta ) / (Vv-One/Vv)
+      Q = calc%Ppp(calc%N_Contin) * (Vv+One/Vv)
       W2  = Ubeta**2
       Fs0 = Fs0 + Q*Half
       Fs2 = Fs2 + Q*Half*W2
-C *** ---
-      F0   = ( Fs0 * Tbeta) / Annnnn
-      Tbar = ( Fs2 * Half ) / Annnnn
-C
-C *** ---
-C *** Convert Ppp(Beta) into first term in phonon expansion sum
+! *** ---
+      calc%F0   = ( Fs0 * calc%Tbeta) / Annnnn
+      calc%Tbar = ( Fs2 * Half ) / Annnnn
+!
+! *** ---
+! *** Convert Ppp(Beta) into first term in phonon expansion sum
       Q = Fs0*Del_Beta
-      DO I=1,N_Contin
+      DO I=1,calc%N_Contin
          Ubeta = Del_Beta*(I-1)
-         Ppp(I) = Ppp(I)*dEXP(Half*Ubeta)/Q
+         calc%Ppp(I) = calc%Ppp(I)*dEXP(Half*Ubeta)/Q
       END DO
-C
+!
       RETURN
       END
-C
-C
-C ----------------------------------------------------------------------
-C
-      SUBROUTINE Mesh (Beta, Tevf)
-C
-C     Beta GRID CALCULATION
-C
-C     &&& Del_S_B - THE SOLID SPECTRUM GRID Mesh
-C         Sub     - NUMBER OF SubINTERVALS OF Beta GRID
-C         Bmax    - MAXIMAL VALUE OF Beta
-C         Nbeta   - NUMBER OF Beta VALUES IN THE INTERVAL (0,Bmax)
-C
-C *** Input  -- Tevf, Tev, Awr, Emax, Xdop, Del_Phonon, Sub, Nbeta_Max
-C *** Output -- Beta(Nbeta), Del_S_B, Nbeta
-C
-      use fixedr_m
-      use clm_common_m
-      use constn_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+!
+!
+! ----------------------------------------------------------------------
+!
+      SUBROUTINE Mesh (calc, Tevf)
+!
+!     Beta GRID CALCULATION
+!
+!     &&& Del_S_B - THE SOLID SPECTRUM GRID Mesh
+!         Sub     - NUMBER OF SubINTERVALS OF Beta GRID
+!         Bmax    - MAXIMAL VALUE OF Beta
+!         Nbeta   - NUMBER OF Beta VALUES IN THE INTERVAL (0,Bmax)
+!
+! *** Input  -- Tevf, Tev, Awr, Emax, Xdop, calc%Del_Phonon, Sub, Nbeta_Max
+! *** Output -- Beta(Nbeta), Del_S_B, Nbeta
+!
+      use fixedr_m, only : Aaawww, Emax
+      use constn_common_m, only : Aneutr
+      class(CrystalLatticeBroadening)::calc
       INTEGER  J
-      DOUBLE PRECISION Beta(*), Bmax, Tevf
-C
-      IF (Del_Phonon.GT.0.0d0) THEN
-         Del_S_B =  Del_Phonon/(Sub*Tev)
-         Bmax    =  Xdop/Tev * dSQRT(4.0D0*Emax*Tevf*Aneutr/Aaawww)
-         Nbeta   =  Int(Bmax/Del_S_B)
-C
-         IF (Nbeta.GT.Nbeta_Max) THEN
-            WRITE (6,10000) Nbeta, Nbeta_Max, Xdop
+      DOUBLE PRECISION Bmax, Tevf
+!
+      IF (calc%Del_Phonon.GT.0.0d0) THEN
+         calc%Del_S_B =  calc%Del_Phonon/(calc%Sub*calc%Tev)
+         Bmax    =  calc%Xdop/calc%Tev * dSQRT(4.0D0*Emax*Tevf*Aneutr/Aaawww)
+         calc%Nbeta   =  Int(Bmax/calc%Del_S_B)
+!
+         IF (calc%Nbeta.GT.calc%Nbeta_Max) THEN
+            WRITE (6,10000) calc%Nbeta, calc%Nbeta_Max, calc%Xdop
 10000       FORMAT ('Nbeta is too big', 2I10, 1P6G14.6)
          END IF
-C
-         Beta(1) = 0.0D0
-         DO J=2,Nbeta
-            Beta(J) = Beta(J-1) + Del_S_B
+!
+         call allocate_real_data(calc%Beta, calc%Nbeta)
+         calc%Beta(1) = 0.0D0
+         DO J=2,calc%Nbeta
+            calc%Beta(J) = calc%Beta(J-1) + calc%Del_S_B
          END DO
       ELSE
-         Nbeta = 0
-      END IF
+         calc%Nbeta = 0
+      END IF   
       RETURN
       END
-C
-C
-C -------------------------------------------------------------------
-C
-      SUBROUTINE Contin_X (Ppp, Save, Tlast, Tnow, Savex, Del_Beta)
-C
-C *** Purpose -- Generate array Save(Kbeta,Kphon) for use in Contin
-C *** Input   -- Ppp(.), Alpha, Omega, F0, Tbeta, Del_Beta, Sub,
-C ***            N_Contin, Nphon, Nbeta
-C *** Output  -- Save (?,Nphon)
-C *** Dummy   -- Savex(?,Nphon), Tlast(?), Tnow(?)
-C
-      use fixedr_m
-      use clm_common_m
-      use constn_common_m
-      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
-      DOUBLE PRECISION Ppp(*), Save(Nbeta_Max,*),
-     &   Tlast(*), Tnow(*), Savex(Nbeta_Max,*)
-      DOUBLE PRECISION Del_Beta, Exx, Exy, Alf0, Omf0, B, C, Bt, Btp, X
-      INTEGER NLast, Nnow, I, K, N
-      DOUBLE PRECISION Zero, One
-      PARAMETER (Zero=0.0d0, One=1.0d0)
-C
-C *** Note that Ppp(Beta) = Phonon(Beta) * dEXP(Beta/2) /
-C ***                                   [Beta sinh(Beta/2) normalization]
-C
-C *** ------
-C *** First term in the phonon expansion sum
-C
-      CALL Zero_Array (Save , Nphon*Nbeta_Max)
-      CALL Zero_Array (Savex, Nphon*Nbeta_Max)
-C
-      DO I=1,N_Contin
-         Tlast(I) = Ppp(I)
-         Savex(I,1) = Ppp(I)
+!
+!
+! -------------------------------------------------------------------
+!
+      SUBROUTINE Contin_X (calc, Del_Beta)
+!
+! *** Purpose -- Generate array Save(Kbeta,Kphon) for use in Contin
+! *** Input   -- Ppp(.), Alpha, Omega, F0, Tbeta, Del_Beta, Sub,
+! ***            N_Contin, Nphon, Nbeta
+! *** Output  -- Save (?,Nphon)
+! *** Dummy   -- Savex(?,Nphon)
+!
+      use fixedr_m, only : Aaawww, Emax, Emin
+      use constn_common_m, only : Aneutr
+      class(CrystalLatticeBroadening)::calc
+      DOUBLE PRECISION Del_Beta, Exx, Exy, Alf0, Omf0, B, C, Bt, Btp, X, Rn
+      INTEGER NLast, Nnow, I, K, N      
+      real(kind=8),parameter::Zero=0.0d0, One=1.0d0
+!
+! *** Note that Ppp(Beta) = Phonon(Beta) * dEXP(Beta/2) /
+! ***                                   [Beta sinh(Beta/2) normalization]
+!
+! *** ------
+! *** First term in the phonon expansion sum
+!      
+!
+      call allocate_real_data(calc%Tlast, calc%N_Contin)
+      call reallocate_real_data_2d(calc%savex, calc%NBeta, 0, calc%Nphon, 0)
+      DO I=1,calc%N_Contin
+         calc%Tlast(I) = calc%Ppp(I)
+         calc%Savex(I,1) = calc%Ppp(I)
       END DO
-      N = Nphon
-      NLast = N_Contin
-C
-C
-C *** ------
-C *** Add other terms in the phonon expansion sum
-      IF (Tbeta.NE.Zero) THEN
+      N = calc%Nphon
+      NLast = calc%N_Contin
+!
+!
+! *** ------
+! *** Add other terms in the phonon expansion sum
+      IF (calc%Tbeta.NE.Zero) THEN
          Rn    = Aneutr/(Aaawww+Aneutr)
-         Alf0 = Emin*Rn/Tev * F0
-         Omf0 = Emax*Rn/Tev * F0
+         Alf0 = Emin*Rn/calc%Tev * calc%F0
+         Omf0 = Emax*Rn/calc%Tev * calc%F0
          Exx  = Alf0*dEXP(-Alf0)
          Exy  = Omf0*dEXP(-Omf0)
          B = Exx
          C = Exy
-         DO N=2,Nphon
+         DO N=2,calc%Nphon
             Exx = Alf0*Exx/N
             Exy = Omf0*Exy/N
             IF (B+Exx.EQ.B .AND. C+Exy.EQ.C) GO TO 10
             B = B + Exx
             C = C + Exy
-            Nnow = N_Contin + NLast - 1
-            CALL Convol (Ppp, Tlast, Tnow, N_Contin, NLast, Nnow,
-     &         Del_Beta)
+            Nnow = calc%N_Contin + NLast - 1
+            CALL Convol (calc,  NLast, Nnow, Del_Beta)
+            call reallocate_real_data(calc%Tlast, Nnow, 10)
+            call reallocate_real_data(calc%Tnow, Nnow, 10)
+            call reallocate_real_data_2d(calc%savex, Nnow, 0, calc%Nphon, 0)
             DO I=1,Nnow
-               Tlast(I) = Tnow(I)
-               Savex(I,N) = Tnow(I)
+               calc%Tlast(I) = calc%Tnow(I)
+               calc%Savex(I,N) = calc%Tnow(I)
             END DO
             NLast = Nnow
          END DO
-         IF (N.GT.Nphon) N = Nphon
+         IF (N.GT.calc%Nphon) N = calc%Nphon
       END IF
-C
+!
    10 CONTINUE
-      IF (Nphon.EQ.N) WRITE (6,10000) Nphon
-10000 FORMAT (' ### Caution ### Number of phonons may not be enough to',
-     &   ' ###', /,
-     &   '             ###  reach convergence.  Try more than', I4,
-     &   ' ###')
-      Nphon = N
-C
-      DO K=1,Nbeta
-         X = (K-1)/Sub
+      IF (calc%Nphon.EQ.N) WRITE (6,10000) calc%Nphon
+10000 FORMAT (' ### Caution ### Number of phonons may not be enough to',  &
+         ' ###', /,                                                       &
+         '             ###  reach convergence.  Try more than', I4,       &
+         ' ###')
+      calc%Nphon = N
+!
+      call reallocate_real_data_2d(calc%save, calc%NBeta, 0, calc%Nphon, 0)
+      calc%save = 0.0d0
+      DO K=1,calc%Nbeta
+         X = (K-1)/calc%Sub
          I = X
-C ***    Note that equally-spaced points in Beta are assumed throughout
+! ***    Note that equally-spaced points in Beta are assumed throughout
          IF (I.LT.0 .OR. I.GE.Nnow-1) THEN
-C ***       Don't need to zero Save cuz is already zero
+! ***       Don't need to zero Save cuz is already zero
          ELSE IF (I.EQ.0) THEN
             Bt = Zero
             Btp = One
             I = I + 1
-            DO N=1,Nphon
-               Save(K,N) = Savex(I,N)*(Btp-X) + X*Savex(I+1,N)
+            DO N=1,calc%Nphon
+               calc%Save(K,N) = calc%Savex(I,N)*(Btp-X) + X*calc%Savex(I+1,N)
             END DO
          ELSE IF (I.LT.Nnow-1) THEN
             Bt = dFLOAT(I)
             Btp = Bt + One
             I = I + 1
-            DO N=1,Nphon
-               Save(K,N) = Savex(I,N)*(Btp-X) + (X-Bt)*Savex(I+1,N)
+            DO N=1,calc%Nphon
+               calc%Save(K,N) = calc%Savex(I,N)*(Btp-X) + (X-Bt)*calc%Savex(I+1,N)
             END DO
          ELSE
             STOP '[Should never get here in Contin_X in clm/mclm3.f]'
          END IF
       END DO
-C
+!
       RETURN
       END
-C
-C
-C ----------------------------------------------------------------------
-C
-      SUBROUTINE Convol (Ppp, TLast, Tnow, N_Contin, NLast, Nnow,
-     &   Del_Beta)
-C
-C *** PURPOSE   -- Calculate the next term in the phonon expansion by
-C ***                convolving P with Tlast and writing the result into
-C ***                Tnow.  The integral of Tnow is also checked.
-C *** METHOD    -- Trapazoidal integration
-C *** CALLED BY -- Contin_X
-C
-      IMPLICIT NONE
-      INTEGER N_Contin, NLast, Nnow, K, J, I1, I2, Kmax
-      DOUBLE PRECISION Ppp(*), Tlast(*), Tnow(*),
-     &   EP, Be, Del_Beta, F2, Cc, F1, Zero, Half, One, Small
-      DATA Zero /0.0d0/, Half /0.5d0/, One /1.0d0/, Small /1.d-20/
-C
+!
+!
+! ----------------------------------------------------------------------
+!
+      SUBROUTINE Convol (calc, NLast, Nnow, Del_Beta)
+!
+! *** PURPOSE   -- Calculate the next term in the phonon expansion by
+! ***                convolving P with Tlast and writing the result into
+! ***                Tnow.  The integral of Tnow is also checked.
+! *** METHOD    -- Trapazoidal integration
+! *** CALLED BY -- Contin_X
+!
+      class(CrystalLatticeBroadening)::calc
+      INTEGER NLast, Nnow, K, J, I1, I2, Kmax
+      DOUBLE PRECISION EP, Be, Del_Beta, F2, Cc, F1
+      real(kind=8),parameter:: Zero = 0.0d0, Half = 0.5d0, One = 1.0d0, Small = 1.d-20
+!
       Kmax = 0
+      call reallocate_real_data(calc%Tnow, Nnow, 10)
       DO K=1,Nnow
-         Tnow(K) = Zero
+         calc%Tnow(K) = Zero
          EP = One
-C
-         DO J=1,N_Contin
+!
+         DO J=1,calc%N_Contin
             I1 = K + J - 2
             I2 = K - J
             F1 = Zero
             Be = (J-1)*Del_Beta
-C
-            IF (Ppp(J).GT.Zero) THEN
-               IF (I1+1.LE.NLast) F1 = Tlast(I1+1)*dEXP(-Be)
+!
+            IF (calc%Ppp(J).GT.Zero) THEN
+               call reallocate_real_data(calc%Tlast, NLast, 10)
+               IF (I1+1.LE.NLast) F1 = calc%Tlast(I1+1)*dEXP(-Be)
                F2 = Zero
                IF (I2.GE.0 .AND. I2+1.LE.NLast) THEN
-                  F2 = Tlast(I2+1)
+                  F2 = calc%Tlast(I2+1)
                ELSE IF (I2.LT.0 .AND. 1-I2.LE.NLast) THEN
                   Be = -I2*Del_Beta
-                  F2 = Tlast(1-I2)*dEXP(-Be)
+                  F2 = calc%Tlast(1-I2)*dEXP(-Be)
                ENDIF
-               Cc = Ppp(J)*(F1+F2)
-               IF (J.EQ.1 .OR. J.EQ.N_Contin) Cc = Half*Cc
-               Tnow(K) = Tnow(K)+Cc
+               Cc = calc%Ppp(J)*(F1+F2)
+               IF (J.EQ.1 .OR. J.EQ.calc%N_Contin) Cc = Half*Cc
+               calc%Tnow(K) = calc%Tnow(K)+Cc
             END IF
-C
+!
          END DO
-C
-         Tnow(K) = Tnow(K)*Del_Beta
-         IF (Tnow(K).LT.Small) THEN
-            Tnow(K) = Zero
+!
+         calc%Tnow(K) = calc%Tnow(K)*Del_Beta
+         IF (calc%Tnow(K).LT.Small) THEN
+            calc%Tnow(K) = Zero
          ELSE
             IF (K.GT.Kmax) Kmax = K
          END IF
       END DO
-C
+!
       IF (Kmax.LT.Nnow) Nnow = Kmax
       RETURN
       END
-C
-C
-C ----------------------------------------------------------------------
-C
-      SUBROUTINE Discre_X (Osc_Eng, Osc_Wts, Osc_Enx, Osc_Snth,
-     *   Osc_Coth, Bex, Beta)
-C
-C
-C *** PURPOSE   -- Do energy-independent bits of Discre calculations
-C *** Called by -- Samclm_0
-C *** Uses      -- no routines
-C
-C
-      use fixedr_m
-      use clm_common_m
-      use constn_common_m
-      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
-      DOUBLE PRECISION Osc_Eng(*), Osc_Wts(*), Osc_Enx(*), Osc_Snth(*),
-     &   Osc_Coth(*), Bex(*), Beta(Nbeta)
-      DOUBLE PRECISION Sn, Cn, Eb
-      INTEGER K, I
-      DOUBLE PRECISION  Zero, Half, One
-      PARAMETER (Zero=0.0d0, Half=0.5d0, One=1.0d0)
-C
-C *** SET UP OSCILLATOR PARAMETERS
-C
-      Sum_Osc_Wts = Zero
-      DO I=1,N_Osc
-         Sum_Osc_Wts = Sum_Osc_Wts + Osc_Wts(I)
+!
+!
+! ----------------------------------------------------------------------
+!
+      SUBROUTINE Discre_X (calc)
+!
+!
+! *** PURPOSE   -- Do energy-independent bits of Discre calculations
+! *** Called by -- Samclm_0
+! *** Uses      -- no routines
+!
+!
+      class(CrystalLatticeBroadening)::calc
+      real(kind=8)::Sn, Cn, Eb
+      INTEGER::K, I
+      real(kind=8),parameter::Zero=0.0d0, Half=0.5d0, One=1.0d0
+!
+! *** SET UP OSCILLATOR PARAMETERS
+!
+      calc%Sum_Osc_Wts = Zero
+      DO I=1,calc%N_Osc
+         calc%Sum_Osc_Wts = calc%Sum_Osc_Wts + calc%Osc_Wts(I)
       END DO
-C
-      DO I=1,N_Osc
-         Osc_Enx(I) = Osc_Eng(I)/Tev
+!
+      call allocate_real_data(calc%Osc_Enx, calc%N_Osc)
+      DO I=1,calc%N_Osc
+         calc%Osc_Enx(I) = calc%Osc_Eng(I)/calc%Tev
       END DO
-C
-      Tsave = Zero
-      Dw0 = Dwpix
-      DO I=1,N_Osc
-         Eb = dEXP(Half*Osc_Enx(I))
+!
+      calc%Tsave = Zero
+      calc%Dw0 = calc%Dwpix
+      call allocate_real_data(calc%Osc_Snth, calc%N_Osc)
+      call allocate_real_data(calc%Osc_Coth, calc%N_Osc)
+      DO I=1,calc%N_Osc
+         Eb = dEXP(Half*calc%Osc_Enx(I))
          Sn = Half* (Eb-One/Eb)
          Cn = Half* (Eb+One/Eb)
-         Osc_Snth(I) = Osc_Wts(I)/(Sn*Osc_Enx(I))
-         Osc_Coth(I) = Osc_Snth(I)*Cn
-         IF (Dwpix.GT.Zero) Dwpix = Dwpix + Osc_Coth(I)
-         Tsave = Tsave + Osc_Wts(I) * Osc_Eng(I) *Cn/Sn
+         calc%Osc_Snth(I) = calc%Osc_Wts(I)/(Sn*calc%Osc_Enx(I))
+         calc%Osc_Coth(I) = calc%Osc_Snth(I)*Cn
+         IF (calc%Dwpix.GT.Zero) calc%Dwpix = calc%Dwpix + calc%Osc_Coth(I)
+         calc%Tsave = calc%Tsave + calc%Osc_Wts(I) * calc%Osc_Eng(I) *Cn/Sn
       END DO
-C
-C
-      K = Nbeta
-      DO I=1,Nbeta
-         Bex(I) = - Beta(K)
+!
+!
+      K = calc%Nbeta
+      call allocate_real_data(calc%Bex, 2*calc%Nbeta)
+      DO I=1,calc%Nbeta
+         calc%Bex(I) = - calc%Beta(K)
          K = K - 1
       END DO
-C
-      IF (Beta(1).LE.0.000000001) THEN
-         Bex(Nbeta) = Zero
-         K = Nbeta + 1
+!
+      IF (calc%Beta(1).LE.0.000000001) THEN
+         calc%Bex(calc%Nbeta) = Zero
+         K = calc%Nbeta + 1
       ELSE
-         K = Nbeta + 2
-         Bex(Nbeta+1) = Beta(1)
+         K = calc%Nbeta + 2
+         calc%Bex(calc%Nbeta+1) = calc%Beta(1)
       END IF
-C
-      DO I=2,Nbeta
-         Bex(K) = Beta(I)
+!
+      DO I=2,calc%Nbeta
+         calc%Bex(K) = calc%Beta(I)
          K = K + 1
       END DO
-      Nbx = K - 1
-      IF (Nbx.GT.Nbeta_Max) THEN
-         WRITE (6,10000) Nbx, Nbeta_Max
+      calc%Nbx = K - 1
+      IF (calc%Nbx.GT.calc%Nbeta_Max) THEN
+         WRITE (6,10000) calc%Nbx, calc%Nbeta_Max
 10000    FORMAT ('Nbeta_Max must be', I5, ' but is only', I5)
          STOP '[Stop in Discre_X in clm/mclm2.f]'
       END IF
       RETURN
       END
+end module mclm2_M
diff --git a/sammy/src/clm/mclm3.f90 b/sammy/src/clm/mclm3.f90
index 7dc8be21e98cc6ef92e7c39eab3fbecdb8ff011c..98cd1234a71ed4f470852a675c08feb6c6e250f3 100644
--- a/sammy/src/clm/mclm3.f90
+++ b/sammy/src/clm/mclm3.f90
@@ -1,47 +1,35 @@
-C
-C
-C --------------------------------------------------------------
-C
-      SUBROUTINE Dopclm (Iflmsc,
-     *   Beta, Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth,
-     *   Bex, S_Expb, S_Ex, Save, Bs, Ss, Max_T)
+module mclm3_m
+use CrystalLatticeBroadening_M
 
-C
-C *** PURPOSE -- FORM DOPPLER-BROADENED CROSS SECTION AND DERIVATIVES
-C
-      use fixedi_m, only : Ktruet, Lllmax,
-     *                     Numiso, numUsedPar
-      use ifwrit_m, only : Kcros, Kdebug, Kfinit, Ksindi, Ksitmp,
-     *                     Kvtemp, Kvthck, Nonu
-      use fixedr_m, only : Emax, Emaxs, Emin, Emins, Temp, Thick,
-     *                     Sitemp
+contains
+!
+!
+! --------------------------------------------------------------
+!
+      SUBROUTINE Dopclm (calc, Iflmsc)
+
+!
+! *** PURPOSE -- FORM DOPPLER-BROADENED CROSS SECTION AND DERIVATIVES
+!
+      use fixedi_m, only : Lllmax
+      use ifwrit_m, only : Kcros, Ksindi, Ksitmp,Kvtemp
+      use fixedr_m, only : Emax, Emaxs, Emin, Emins, Sitemp
       use brdd_common_m, only : Iup, Kc
-      use clm_common_m, only : Nbeta_Max, Tev
-      use lbro_common_m, only : Yresol, Yssmsc, Ytrans
       use constn_common_m, only : Boltzm
-      use EndfData_common_m, only : expData, resparData,
-     *                              radFitFlags
-      use AuxGridHelper_M, only : setAuxGridOffset,
-     *                            setAuxGridRowMax
+      use EndfData_common_m, only : expData, resparData,radFitFlags
+      use AuxGridHelper_M, only : setAuxGridOffset, setAuxGridRowMax
       use SammyGridAccess_M
-      use xct2_m
-      use mxct27_m
-      use mfgm3_M
+      use mfgm3_M, only : stetd
       use Qtrap_Clm_m
+      use Getsab_m
       use array_sizes_common_m, only : calcData, calcDataSelf
       use convert_to_transmission_m
       use DerivativeHandler_M
-      use broad_common_m
-      use SumIsoAndConvertToTrans_M
       IMPLICIT None
-      LOGICAL Need_Isotopes
-      LOGICAL Another_Process_Will_Happen
       type(SammyGridAccess)::grid, auxGrid
-C
+      class(CrystalLatticeBroadening)::calc
+!
       integer::Iflmsc(*)
-      real(kind=8):: Beta(*), Osc_Wts(*), Osc_Enx(*), Osc_Snth(*),
-     *   Osc_Coth(*), Bex(*), S_Expb(*), S_Ex(*), Save(Nbeta_Max,*),
-     *   Bs(*), Ss(*), Max_T(*)
       real(kind=8)::C_Norm, eaux, em, Tevf, Tevx
       integer::Isomax, Isox, Iv, Iw, J, Jdat, Kkkdat, insig
       integer(C_SIZE_T)::Iso
@@ -52,73 +40,64 @@ C
       call grid%setToExpGrid(expData)
       call auxGrid%initialize()
       call auxGrid%setToAuxGrid(expData)
-      call setAuxGridOffset(1) ! reset auxillary grid starting point
-      numEl    = grid%getNumEnergies(expData)
-      numElAux = auxGrid%getNumEnergies(expData)
+      call setAuxGridOffset(1) ! reset auxillary grid starting point  
+      numElAux = calc%getNumEnergyUnbroadened()
+      numEl    = calc%getNumEnergyBroadened()
       call tmpCalc%initialize()
       call tmpCalc%setUpList(resparData,  radFitFlags, 1)
-C
-C *** Note that Sigxxx does not keep track of isotope, but calcData does
-C
-C      DIMENSION Iflmsc(Nummsc), Parnbk(Numnbk), Iflnbk(Numnbk),
-C     *   Parbgf(Numbgf), Iflbgf(*), Kndbgf(*), Bgfmin(*), Bgfmax(*)
-C
-      Tev = Boltzm*Temp
-      Need_Isotopes = Yssmsc
-      Another_Process_Will_Happen = Yresol.OR.Yssmsc
-C
+!
+! *** Note that Sigxxx does not keep track of isotope, but calcData does
+!
+!      DIMENSION Iflmsc(Nummsc), Parnbk(Numnbk), Iflnbk(Numnbk),
+!     *   Parbgf(Numbgf), Iflbgf(*), Kndbgf(*), Bgfmin(*), Bgfmax(*)
+!
+      calc%Tev = Boltzm*calc%getTemperature()
+
+!
       IF (Kcros.EQ.8 .AND. Ksindi.GT.0) THEN
          Iv = 1
       ELSE
          Iv = 0
       END IF
-C
-      Iw = 0
-      call calcData%nullify()  
+!
+      Iw = 0     
       IF (Kcros.EQ.8 .AND. (Ksindi.GT.0 .OR. Ksitmp.GT.0)) Iw = 1
-      call calcDataSelf%nullify()
-      call calcData%reserve(numElAux*calcData%getNnnsig(), numUsedPar+1)
-      IF ((Ksindi.GT.0.OR.Ksitmp.GT.0).AND. Kcros.EQ.8) THEN
-          call calcDataSelf%reserve(numElAux, numUsedPar+1)       
-      end if
-C
-C
+!
+!
       Now = 0
       Nowx = 0
       Kkkdat = 0
-C
+!
       Isomax = calcData%getUsedIsotopes()
       IF (Isomax.EQ.0) STOP '[STOP in Dopclm in clm/mclm3.f]'
-C
-C *** Do separately for each isotope (nuclide), since Doppler-width is
-C ***    isotope-dependent
+!
+! *** Do separately for each isotope (nuclide), since Doppler-width is
+! ***    isotope-dependent
       DO Iso=1,Isomax
          Isox = Iso
-         if (Isomax.gt.1.and.
-     *       calcData%getRealIsotopeIndex(Iso).le.0) then
+         if (Isomax.gt.1.and.   &
+             calcData%getRealIsotopeIndex(Iso).le.0) then
              GO TO 80
          end if
-C
+!
          Kc = 1
          Iup = 0
-C
+!
          Kkkmin = 0
          Kkkkkk = 0
          Kkkdat = 0
          nauxStart = 0
-C
-C ***    Start of major loop over energy-points
+!
+! ***    Start of major loop over energy-points
          DO 70 J=1,numElAux
             Jdat = J       
-C
-            IF ((J/1000)*1000.EQ.J .AND. Isomax.GT.1) WRITE (6,10000) J,
-     *         Isox
-10000       FORMAT ('     *** on data point number', i10,
-     *              ' for nuclide number', i3)
+!
+            IF ((J/1000)*1000.EQ.J .AND. Isomax.GT.1) WRITE (6,10000) J, Isox
+10000       FORMAT ('     *** on data point number', i10, ' for nuclide number', i3)
             IF ((J/1000)*1000.EQ.J .AND. Isomax.EQ.1) WRITE (6,10001) J
 10001       FORMAT ('     *** on data point number', I10)
-C
-            IF (Another_Process_Will_Happen) THEN
+!
+            IF (numElAux.eq.numEl) THEN
                em = auxGrid%getEnergy(J, expData)
             ELSE
                IF (J.GT.numEl) THEN
@@ -127,24 +106,24 @@ C
                   Em = grid%getEnergy(J, expData)
                END IF
             END IF
-C
+!
             IF (Em.LT.Emins) THEN
-C                            These points are the very low-energy limit,
-C                                  of very little interest, ergo "stetd"
+!                            These points are the very low-energy limit,
+!                                  of very little interest, ergo "stetd"
                eaux = auxGrid%getEnergy(J + 1, expData)
                IF (eaux.GE.Emin) THEN
-                  CALL Stetd (calcData, calcData,Kkkkkk+1,
-     *               Now, Kvtemp, Isox,
-     *               Jdat, 0)
+                  CALL Stetd (calcData, calcData,Kkkkkk+1,  &
+                     Now, Kvtemp, Isox,                     &
+                     Jdat, 0)
                   IF (Kcros.EQ.8) THEN
                      IF (Ksindi.GT.0) THEN
-                        CALL Stetd (calcDataSelf,calcDataSelf,
-     *                     Kkkkkk+1, Nowx, Iflmsc(Ksitmp),
-     *                     Isox, Jdat, 0)
+                        CALL Stetd (calcDataSelf,calcDataSelf,  &
+                           Kkkkkk+1, Nowx, Iflmsc(Ksitmp),      &
+                           Isox, Jdat, 0)
                      ELSE IF (Ksitmp.GT.0) THEN
-                        CALL Stetd (calcData, calcDataSelf,
-     *                     Kkkkkk+1, Nowx, Iflmsc(Ksitmp),
-     *                     Isox, Jdat, Lllmax+1)
+                        CALL Stetd (calcData, calcDataSelf,   &
+                           Kkkkkk+1, Nowx, Iflmsc(Ksitmp),    &
+                           Isox, Jdat, Lllmax+1)
                      END IF
                   END IF
                   GO TO 40
@@ -153,22 +132,22 @@ C                                  of very little interest, ergo "stetd"
                   GO TO 70
                END IF
             ELSE IF (Em.GT.Emaxs) THEN
-C                            These points are the very high-energy limit,
-C                                  of very little interest, ergo "stetd"
+!                            These points are the very high-energy limit,
+!                                  of very little interest, ergo "stetd"
                eaux = auxGrid%getEnergy(J - 1, expData)
                IF (eaux.LE.Emax) THEN
-                  CALL Stetd (calcData, calcData,Kkkkkk+1,
-     *               Now, Kvtemp, Isox,
-     *               Jdat, 0)
+                  CALL Stetd (calcData, calcData,Kkkkkk+1,  &
+                     Now, Kvtemp, Isox,                     &
+                     Jdat, 0)
                   IF (Kcros.EQ.8) THEN
                      IF (Ksindi.GT.0) THEN
-                        CALL Stetd (calcDataSelf, calcDataSelf,
-     *                     Kkkkkk+1, Nowx, Iflmsc(Ksitmp),
-     *                    Isox, Jdat, 0)
+                        CALL Stetd (calcDataSelf, calcDataSelf, &
+                           Kkkkkk+1, Nowx, Iflmsc(Ksitmp),      &
+                          Isox, Jdat, 0)
                      ELSE IF (Ksitmp.gt.0) THEN
-                        Call Stetd (calcData, calcDataSelf,
-     *                     Kkkkkk+1, Nowx, Iflmsc(Ksitmp),
-     *                     Isox, Jdat, Lllmax+1)
+                        Call Stetd (calcData, calcDataSelf,  &
+                           Kkkkkk+1, Nowx, Iflmsc(Ksitmp),   &
+                           Isox, Jdat, Lllmax+1)
                      END IF
                   END IF
                   GO TO 40
@@ -176,81 +155,73 @@ C                                  of very little interest, ergo "stetd"
                   GO TO 80
                END IF
             END IF
-C
-C
-C          "ELSE" but others have "GO TO" so not inside "IF" test.
-C ********* regular CLM Doppler for most cross sections
-            CALL Getsab (Beta, Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth,
-     *         Bex, S_Expb, S_Ex, Save, Bs, Ss, Max_T, Em, Tev, C_Norm,
-     *         Tevf, Ns)
-            CALL Qtrap_Clm (tmpCalc,
-     *         calcData, Bs, Ss, Tev, Temp, Em,
-     *         C_Norm, Kvtemp, calcData%getNnnsig(),
-     *         Isox, 0, Ns, calcData,
-     *         Kkkkkk+1)
-C
-C ********* Doppler widths etc for self-indication transmission
+!
+!
+!          "ELSE" but others have "GO TO" so not inside "IF" test.
+! ********* regular CLM Doppler for most cross sections
+            CALL Getsab (calc, Em, calc%Tev, C_Norm,  Tevf, Ns)
+            CALL Qtrap_Clm (calc, tmpCalc,  calcData, calc%Tev, calc%getTemperature(), Em,      &
+                            C_Norm, Kvtemp, calcData%getNnnsig(), &
+                            Isox, 0, Ns, calcData,                &
+                            Kkkkkk+1)
+!
+! ********* Doppler widths etc for self-indication transmission
             IF (Ksitmp.GT.0) THEN
                Tevx = Boltzm*Sitemp
             ELSE
-               Tevx = Tev
+               Tevx = calc%Tev
             END IF
-C
-C ********* Broaden self-indication transmission separately
+!
+! ********* Broaden self-indication transmission separately
             IF (Ksindi.GT.0 .AND. Kcros.EQ.8) THEN
-               CALL Getsab (Beta, Osc_Wts, Osc_Enx, Osc_Snth,
-     *            Osc_Coth, Bex, S_Expb, S_Ex, Save, Bs, Ss, Max_T,
-     *            Em, Tevx, C_Norm, Tevf, Ns)
-               CALL Qtrap_Clm (tmpCalc,
-     *            calcDataSelf,
-     *            Bs, Ss, Tevx, Sitemp, Em,
-     *            C_Norm, Iflmsc(Ksitmp), 1, Isox, 0, Ns, calcDataSelf,
-     *            Kkkkkk+1)
+               CALL Getsab (calc,  Em, Tevx, C_Norm, Tevf, Ns)
+               CALL Qtrap_Clm (calc, tmpCalc,                          &
+                  calcDataSelf,                                        &
+                  Tevx, Sitemp, Em,                            &
+                  C_Norm, Iflmsc(Ksitmp), 1, Isox, 0, Ns, calcDataSelf,&
+                  Kkkkkk+1)
             END IF
-C
-C ********* Broaden self-indication transm; but stored in calcData old data originally
+!
+! ********* Broaden self-indication transm; but stored in calcData old data originally
             IF (Ksindi.EQ.0 .AND. Ksitmp.GT.0 .AND. Kcros.EQ.8) THEN
-               CALL Getsab (Beta, Osc_Wts, Osc_Enx, Osc_Snth,
-     *            Osc_Coth, Bex, S_Expb, S_Ex, Save, Bs, Ss, Max_T,
-     *            Em, Tevx, C_Norm, Tevf, Ns)
-               CALL Qtrap_Clm (tmpCalc,
-     *            calcData, Bs, Ss, Tevx, Sitemp, Em,
-     *            C_Norm, Iflmsc(Ksitmp), 1, Isox,
-     *            Lllmax+1, Ns, calcDataSelf, Kkkkkk+1)
+               CALL Getsab (calc,  Em, Tevx, C_Norm, Tevf, Ns)
+               CALL Qtrap_Clm (calc, tmpCalc,           &
+                  calcData, Tevx, Sitemp, Em,   &
+                  C_Norm, Iflmsc(Ksitmp), 1, Isox,      &
+                  Lllmax+1, Ns, calcDataSelf, Kkkkkk+1)
             END IF
-C
+!
    40       CONTINUE
 
             Kkkkkk = Kkkkkk + 1
-C
-C
+!
+!
             Kkkdat = Kkkdat + 1
-C
-C
+!
+!
 
    70    CONTINUE
-C ***    END of do-loop on energy
-C
+! ***    END of do-loop on energy
+!
    80    CONTINUE
       END DO
-C *** end of do-loop on isotopes (nuclides)
-C
-C
+! *** end of do-loop on isotopes (nuclides)
+!
+!
       nauxStart = nauxStart + 1
       call setAuxGridRowMax(Kkkdat)
       IF (Now.NE.0) WRITE (21,99997) Now, Kkkdat*Isomax
-      IF (Now.NE.0 .AND. Kdebug.NE.0) WRITE (06,99997) Now,Kkkdat*Isomax
-99997 FORMAT (' No Doppler broadening occured', I8,
-     *     ' times of a possible', I8)
-C
-      call dopplerOption%crystalLattice%updateBroadenedOffset(
-     *      nauxStart)
-      call dopplerOption%crystalLattice%setLength(Kkkkkk)
+      IF (Now.NE.0 .AND. calc%debugOutput) WRITE (06,99997) Now,Kkkdat*Isomax
+99997 FORMAT (' No Doppler broadening occured', I8, ' times of a possible', I8)
+!
+      call calc%updateBroadenedOffset( nauxStart)
+      call calc%setLength(Kkkkkk)
 
       call grid%destroy()
       call auxGrid%destroy()
       call setAuxGridOffset(nauxStart)
       call tmpCalc%destroy()
       RETURN
-C
+!
       END
+end module mclm3_m
diff --git a/sammy/src/clm/mclm4.f90 b/sammy/src/clm/mclm4.f90
index a4db678152a45cf4c2e566f20ba607b0fc06c593..0277114eb1996c3cd1af15849341bcfb4cdd44fb 100644
--- a/sammy/src/clm/mclm4.f90
+++ b/sammy/src/clm/mclm4.f90
@@ -1,101 +1,107 @@
-C
-C
-C ----------------------------------------------------------------------
-C
-      SUBROUTINE Getsab (Beta, Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth,
-     *   Bex, S_Expb, S_Ex, Save, Bs, Ss, Max_T, Em, Tevx, C_Norm, Tevf,
-     *   Ns)
-C
-C *** Purpose -- CRYSTAL MODEL CROSS-SECTION CALCULATION
-C *** Input   -- Em, etc.
-C *** Output  -- Bs, Ss
-C
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use broad_common_m
-      use clm_common_m
-      use constn_common_m
-      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
-C
-      DIMENSION Beta(*), Osc_Wts(*), Osc_Enx(*), Osc_Snth(*),
-     *   Osc_Coth(*), Bex(*), S_Expb(*), S_Ex(*), Save(Nbeta_Max,*),
-     *   Bs(*), Ss(*), Max_T(*)
-cx      DOUBLE PRECISION Em, Tevx
-C
-      DIMENSION Sab(25999)
-cx      DOUBLE PRECISION  C_Norm1, C_Sumr1, C_Norm, C_Sumr, Recul
+module Getsab_m
+use AllocateFunctions_m
+use CrystalLatticeBroadening_M
+IMPLICIT None
+contains
+!
+!
+! ----------------------------------------------------------------------
+!
+      SUBROUTINE Getsab (calc, Em, Tevx, C_Norm, Tevf, &
+         Ns)
+!
+! *** Purpose -- CRYSTAL MODEL CROSS-SECTION CALCULATION
+! *** Input   -- Em, etc.
+! *** Output  -- Bs, Ss
+!
+      use fixedr_m, only : Aaawww
+      use mclm5_m
+      use mcml6_m
+      use mclm7_m
+      use constn_common_m, only : Aneutr
+!
+      class(CrystalLatticeBroadening)::calc
+       real(Kind=8)::Em, Tevx, Tevf, C_Norm
+!x      DOUBLE PRECISION Em, Tevx
+!
+!x      DOUBLE PRECISION  C_Norm1, C_Sumr1, C_Norm, C_Sumr, Recul
       INTEGER K, Ik, Ns
-cx      DOUBLE PRECISION Zero, One, Five
-      PARAMETER (Zero=0.0d0, One=1.0d0, Five=5.0d0)
-C
-C
-C     EFFECTIVE TEMPERATURE CALCULATION FOR CREATION OF Beta GRID
-C     SCATTERING LaW CALCULATION
-C     Em is in eV; Beta is unitless
-C
-C
-C *** Temporarily assume (1) neutrons only, (2) one isotope only
-C *** Eventually need to fix this!
+!x      DOUBLE PRECISION Zero, One, Five
+      real(kind=8),PARAMETER::Zero=0.0d0, One=1.0d0, Five=5.0d0
+      real(kind=8)::Alpha, C_Norm1, C_Sumr, C_Sumr1, Deltab
+      integer::Ndmax
+      real(kind=8)::Osc0, Osc1, Recul, Tra0, Tra1, Tbarx
+!
+!
+!     EFFECTIVE TEMPERATURE CALCULATION FOR CREATION OF Beta GRID
+!     SCATTERING LaW CALCULATION
+!     Em is in eV; Beta is unitless
+!
+!
+! *** Temporarily assume (1) neutrons only, (2) one isotope only
+! *** Eventually need to fix this!
       Recul = Em*(Aneutr/(Aaawww+Aneutr))
       Alpha = Recul/Tevx
-C
-C
-C *** Continuous part of distribution
-      CALL Cconti (Save, Sab, Beta, Alpha, C_Norm, C_Sumr, Max_T)
-C
-C
+      call allocate_real_data(calc%Sab, calc%Nbeta)
+!
+!
+! *** Continuous part of distribution
+      CALL Cconti (calc, Alpha, C_Norm, C_Sumr)
+!
+!
       Tra0 = C_Norm
       Tra1 = C_Sumr
-      Tbarx = Tbar
-C *** Translational part, if any
-      IF (Twt.NE.Zero) THEN
+      Tbarx = calc%Tbar
+! *** Translational part, if any
+      IF (calc%Twt.NE.Zero) THEN
          Ndmax = 2000
-         CALL Trans (Beta, Sab, Alpha, Deltab, Tra0, Tra1, Ndmax)
-C ***    UPDATE EFfECTIVE TEMPERATURE (which is used only in Discre)
-         Tevf = (Tbeta*Tevf+Twt*Tevx)/(Tbeta+Twt)
+         CALL Trans (calc, Alpha, Deltab, Tra0, Tra1, Ndmax)
+! ***    UPDATE EFfECTIVE TEMPERATURE (which is used only in Discre)
+         Tevf = (calc%Tbeta*Tevf+calc%Twt*Tevx)/(calc%Tbeta+calc%Twt)
          Tbarx = Tevf/Tevx
       END IF
-C
-C
+!
+!
       Osc0 = Tra0
       Osc1 = Tra1
-C *** Discrete oscillators, if any
-      IF (N_Osc.NE.0) THEN
-         CALL Discre (Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth, Sab, Beta,
-     *      Bex, S_Expb, S_Ex, Alpha, Tbarx, Osc0, Osc1)
+! *** Discrete oscillators, if any
+      IF (calc%N_Osc.NE.0) THEN
+         CALL Discre (calc, Alpha, Tbarx, Osc0, Osc1)
       END IF
-C
-C
+!
+!
       C_Norm1 = dABS(C_Norm-One)
       C_Sumr1 = dABS(C_Sumr-One)
-      IF (C_Norm1.GT.Eps .OR. C_Sumr1.GT.Eps) THEN
-         Nphon = Nphon + 5
+      IF (C_Norm1.GT.calc%Eps .OR. C_Sumr1.GT.calc%Eps) THEN
+         calc%Nphon = calc%Nphon + 5
       END IF
-C
-C
-C     Dimensioning of Alpha and Beta values
-C     Centering of Beta in Recul=<Beta>=Em/(Awr+1)
-C
+!
+!
+!     Dimensioning of Alpha and Beta values
+!     Centering of Beta in Recul=<Beta>=Em/(Awr+1)
+!
       K=0
-      DO IK=Nbeta,1,-1
+      call allocate_real_data(calc%Bs, 2*calc%Nbeta)
+      call allocate_real_data(calc%Ss, 2*calc%Nbeta)
+      DO IK=calc%Nbeta,1,-1
          K = K + 1
-         Bs(K) = Recul - Beta(IK)*Tevx
-         Ss(K) = Sab(IK)/Tevx
+         calc%Bs(K) = Recul - calc%Beta(IK)*Tevx
+         calc%Ss(K) = calc%Sab(IK)/Tevx
       END DO
-      DO IK=2,Nbeta
+      DO IK=2,calc%Nbeta
          K = K + 1
-         Bs(K) = Recul + Beta(IK)*Tevx
-         Ss(K) = Sab(IK)*dEXP(-Beta(IK))/Tevx
+         calc%Bs(K) = Recul + calc%Beta(IK)*Tevx
+         calc%Ss(K) = calc%Sab(IK)*dEXP(-calc%Beta(IK))/Tevx
       END DO
-C
-C
-C     ATTENTION!!! Betas ARE NOW CENTERED AROUND Recul!!!
-C     THE ELASTIC SCATTERING CONTRIBUTION
-C        S(A,B) = Smult(A,B) + Delta(B)
-C     IS ADDED DIRECTLY TO THE CROSS-SECTION OUT OF CONVOLUTION
-C     Sigma = SigmaCONVOL + Sigma*EXP(-W*A)
-C
+!
+!
+!     ATTENTION!!! Betas ARE NOW CENTERED AROUND Recul!!!
+!     THE ELASTIC SCATTERING CONTRIBUTION
+!        S(A,B) = Smult(A,B) + Delta(B)
+!     IS ADDED DIRECTLY TO THE CROSS-SECTION OUT OF CONVOLUTION
+!     Sigma = SigmaCONVOL + Sigma*EXP(-W*A)
+!
       NS = K
       RETURN
       END
+end module Getsab_m
diff --git a/sammy/src/clm/mclm5.f90 b/sammy/src/clm/mclm5.f90
index a9ab9eb27ca3afa26e27e4651ef89a867e04d57f..bbf1ebc3c5edf051babb57ad62a2fc7bf77da9d4 100644
--- a/sammy/src/clm/mclm5.f90
+++ b/sammy/src/clm/mclm5.f90
@@ -1,49 +1,57 @@
-C
-C
-C -------------------------------------------------------------------
-C
-      SUBROUTINE Cconti (Save, Sab, Beta, Alpha, C_Norm, C_Sumr, Max_T)
-C
-C
-C     Phonon expansion method for scattering low calculation
-C     Continuous frequency distribution case
-C     Calculation of two first moments of S(Alpha,Beta)
-C
-C     Main routine for calculating S(Alpha,Beta) at temperature "Tev"
-C        for continuous phonon frequency distributions.
-C     Called by Sigcri
-C
-      use fixedr_m
-      use clm_common_m
-      use constn_common_m
-      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
-      DIMENSION Save(Nbeta_Max,*), Sab(*), Beta(*), Max_T(*)
-cx      DOUBLE PRECISION Alpha, C_Sumr, C_Norm,
-cx     &   Exx, Be, St, Add, Alw, Alp, Ssct, Ff2, Ff1, Ff1m, Ff2m,
-cx     &   Bem, Alf0, Sab_Max, X
+module mclm5_m
+use AllocateFunctions_m
+use constn_common_m, only : Pi
+use CrystalLatticeBroadening_M
+IMPLICIT None
+public Cconti
+contains
+!
+!
+! -------------------------------------------------------------------
+!
+      SUBROUTINE Cconti (calc, Alpha, C_Norm, C_Sumr)
+!
+!
+!     Phonon expansion method for scattering low calculation
+!     Continuous frequency distribution case
+!     Calculation of two first moments of S(Alpha,Beta)
+!
+!     Main routine for calculating S(Alpha,Beta) at temperature "Tev"
+!        for continuous phonon frequency distributions.
+!     Called by Sigcri
+!
+      class(CrystalLatticeBroadening)::calc
+      real(kind=8)::Alpha, C_Norm, C_Sumr
+!x      DOUBLE PRECISION Alpha, C_Sumr, C_Norm,
+!x     &   Exx, Be, St, Add, Alw, Alp, Ssct, Ff2, Ff1, Ff1m, Ff2m,
+!x     &   Bem, Alf0, Sab_Max, X
       INTEGER K, N, Ksmall, Kountr
-cx      DOUBLE PRECISION  Zero, Half, One, Four, Small, Pi
-      PARAMETER (Zero=0.0d0, Half =0.5d0, One=1.0d0, Four=4.0d0,
-     &           Small=1.d-20)
-C
-C
+!x      DOUBLE PRECISION  Zero, Half, One, Four, Small, Pi
+      real(kind=8),PARAMETER::Zero=0.0d0, Half =0.5d0, One=1.0d0, Four=4.0d0,  &
+                 Small=1.d-20
+      real(kind=8)::Add, Alf0, Alp, Alw, Be, Bem, Exx, Ff1, Ff1m, Ff2, Ff2m
+      integer::Ntime
+      real(kind=8)::Sab_Max, Ssct, St, X
+!
+!
       Sab_Max = Zero
-      Alf0 = Alpha*F0
+      Alf0 = Alpha*calc%F0
       Exx  = Alf0*dEXP(-Alf0)
-      DO K=1,Nbeta
-         Add = Save(K,1)*Exx
+      DO K=1,calc%Nbeta
+         Add = calc%Save(K,1)*Exx
          IF (Add.GT.Sab_Max) Sab_Max = Add
-         Sab(K) = Add
+         calc%Sab(K) = Add
       END DO
-C
-C
-C *** Add other terms in the phonon expansion sum
-C
-      DO K=1,Nbeta
-         Max_T(K) = 2
+!
+!
+! *** Add other terms in the phonon expansion sum
+!
+      call reallocate_integer_data(calc%Max_T, calc%Nbeta, 0)
+      DO K=1,calc%Nbeta
+         calc%Max_T(K) = 2
       END DO
       Ksmall = 1
-      DO N=2,Nphon
+      DO N=2,calc%Nphon
          IF (Ksmall.EQ.0) THEN
             GO TO 20
          END IF
@@ -53,20 +61,20 @@ C
          ELSE IF (Exx.NE.Zero) THEN
             Ksmall = 0
             Kountr = 0
-            DO K=1,Nbeta-1
+            DO K=1,calc%Nbeta-1
                IF (Kountr.GT.10) GO TO 10
-               St = Save(K,N)
+               St = calc%Save(K,N)
                Add = St*Exx
-               IF (Add+Sab(K).NE.Sab(K)) THEN
+               IF (Add+calc%Sab(K).NE.calc%Sab(K)) THEN
                   Ksmall = 1
-                  Sab(K) = Sab(K) + Add
-                  IF (N.EQ.Nphon .AND. Sab(K)+Sab_Max.NE.Sab_Max) THEN
-                     IF (Add.GT.Sab(K)*0.001d0 .AND. Max_T(K).EQ.2) THEN
-C ***                IF (still adding a significant amount) THEN
-C ***                   switch to using asymptotic form
-C ***                   [NML: but why bother?  we already know Sab more
-C ***                         accurately than this.]
-                        Max_T(K) = 1
+                  calc%Sab(K) = calc%Sab(K) + Add
+                  IF (N.EQ.calc%Nphon .AND. calc%Sab(K)+Sab_Max.NE.Sab_Max) THEN
+                     IF (Add.GT.calc%Sab(K)*0.001d0 .AND. calc%Max_T(K).EQ.2) THEN
+! ***                IF (still adding a significant amount) THEN
+! ***                   switch to using asymptotic form
+! ***                   [NML: but why bother?  we already know Sab more
+! ***                         accurately than this.]
+                        calc%Max_T(K) = 1
                      END IF
                   END IF
                ELSE
@@ -77,53 +85,53 @@ C ***                         accurately than this.]
          END IF
       END DO
    20 CONTINUE
-C
-C
-C *** ------
-C *** Start of SCT range for each Beta
-C
-      DO K=2,Nbeta
-         IF (Max_T(K).GT.Max_T(K-1)) Max_T(K) = Max_T(K-1)
+!
+!
+! *** ------
+! *** Start of SCT range for each Beta
+!
+      DO K=2,calc%Nbeta
+         IF (calc%Max_T(K).GT.calc%Max_T(K-1)) calc%Max_T(K) = calc%Max_T(K-1)
       END DO
-C
-C
-C *** ------
-C *** Check the moments of S(Alpha,Beta); Also redefine Sab if Max_T=1
-C
+!
+!
+! *** ------
+! *** Check the moments of S(Alpha,Beta); Also redefine Sab if Max_T=1
+!
       Ntime = 0
-      Alw = ALpha*Tbeta
-      Alp = Alw*Tbar*Four
+      Alw = ALpha*calc%Tbeta
+      Alp = Alw*calc%Tbar*Four
       X = dSQRT(Pi*Alp)
       K = 1
-         Bem  = Beta(K)
-         Ff2m = Sab(K)
-         Ff1m = Sab(K)*dEXP(-Bem)
+         Bem  = calc%Beta(K)
+         Ff2m = calc%Sab(K)
+         Ff1m = calc%Sab(K)*dEXP(-Bem)
          C_Norm = Zero
          C_Sumr = Zero
-         IF (Max_T(K).EQ.1) THEN
-C           (asymptotic redefinition of Sab)
+         IF (calc%Max_T(K).EQ.1) THEN
+!           (asymptotic redefinition of Sab)
             Exx = -(Alw-Bem)**2/Alp
             Ssct = Zero
             IF (Exx.GT.-45.0d0) Ssct = dEXP(Exx)/X
-            Sab(K) = Ssct
+            calc%Sab(K) = Ssct
          END IF
-      DO K=2,Nbeta
-         Be = Beta(K)
-         IF (Max_T(K).EQ.1) THEN
-C           (asymptotic redefinition of Sab)
+      DO K=2,calc%Nbeta
+         Be = calc%Beta(K)
+         IF (calc%Max_T(K).EQ.1) THEN
+!           (asymptotic redefinition of Sab)
             Exx = -(Alw-Be)**2/Alp
             Ssct = Zero
             IF (Exx.GT.-45.0d0) Ssct = dEXP(Exx)/X
-            Sab(K) = Ssct
+            calc%Sab(K) = Ssct
          END IF
-         IF (Sab(K).EQ.Zero) THEN
+         IF (calc%Sab(K).EQ.Zero) THEN
             Ntime = Ntime + 1
             IF (Ntime.GT.20) GO TO 30
          ELSE
             Ntime = 0
          END IF
-         Ff2 = Sab(K)
-         Ff1 = Sab(K)*dEXP(-Be)
+         Ff2 = calc%Sab(K)
+         Ff1 = calc%Sab(K)*dEXP(-Be)
          C_Norm =C_Norm +Half*(Be-Bem)*(Ff2m    +Ff2   +Ff1m    +Ff1   )
          C_Sumr =C_Sumr +Half*(Be-Bem)*(Ff2m*Bem+Ff2*Be-Ff1m*Bem-Ff1*Be)
          Ff1m = Ff1
@@ -131,16 +139,17 @@ C           (asymptotic redefinition of Sab)
          Bem  = Be
       END DO
    30 CONTINUE
-C
-C
-C *** ------
-C *** Add the Del_Beta contribution to the norm
-C
-      C_Norm = C_Norm + dEXP(-F0*ALpha)
-      C_Sumr = C_Sumr/ALpha/Tbeta
-C
-C *** ------
-C *** Finished with continuous distribution
-C
+!
+!
+! *** ------
+! *** Add the Del_Beta contribution to the norm
+!
+      C_Norm = C_Norm + dEXP(-calc%F0*ALpha)
+      C_Sumr = C_Sumr/ALpha/calc%Tbeta
+!
+! *** ------
+! *** Finished with continuous distribution
+!
       RETURN
       END
+end module mclm5_m
diff --git a/sammy/src/clm/mclm6.f90 b/sammy/src/clm/mclm6.f90
index c44e2d54777a4d68dd1ffc0f9cc561e9e8c28162..f0b7eec906888ddd0248c2719477a0f32eefbca0 100644
--- a/sammy/src/clm/mclm6.f90
+++ b/sammy/src/clm/mclm6.f90
@@ -1,79 +1,82 @@
-C
-C
-C ----------------------------------------------------------------------
-C
-      SUBROUTINE Trans (Beta, Sab, Alpha, Deltab, Tra0, Tra1, Ndmax)
-C
-C *** PURPOSE   -- Control the addition of a translational contribution
-C ***              to a continuous S(Alpha,Beta).  The translational
-C ***              component can be either diffusion, or a free gas.
-C ***              The values of the input S(Alpha,Beta) for the
-C ***              convoltion are obtained by interpolation.
-C *** CALLED BY -- Sigcri.
-C *** USES      -- Stable, Sbfill, Terps.
-C *** Input     -- Beta(), Sab()
-C ***           -- Alpha, F0, Deltab, Twt, C_Trans, Tbeta
-C *** Output    -- Sab(), Tra0, Tra1
-C *** Dummies   -- Betax(), Sabx(), Sd(), Sb()
-C
-      use clm_common_m
-      IMPLICIT NONE
-      DOUBLE PRECISION Beta(*), Sab(*)
+module mcml6_m
+use CrystalLatticeBroadening_M
+IMPLICIT NONE
+
+public Trans
+contains
+!
+!
+! ----------------------------------------------------------------------
+!
+      SUBROUTINE Trans (calc, Alpha, Deltab, Tra0, Tra1, Ndmax)
+!
+! *** PURPOSE   -- Control the addition of a translational contribution
+! ***              to a continuous S(Alpha,Beta).  The translational
+! ***              component can be either diffusion, or a free gas.
+! ***              The values of the input S(Alpha,Beta) for the
+! ***              convoltion are obtained by interpolation.
+! *** CALLED BY -- Sigcri.
+! *** USES      -- Stable, Sbfill, Terps.
+! *** Input     -- Beta(), Sab()
+! ***           -- Alpha, F0, Deltab, Twt, C_Trans, Tbeta
+! *** Output    -- Sab(), Tra0, Tra1
+! *** Dummies   -- Betax(), Sabx(), Sd(), Sb()
+!
+      class(CrystalLatticeBroadening)::calc
       DOUBLE PRECISION Alpha, Deltab, Tra0, Tra1
       INTEGER Ndmax
-C
+!
       DOUBLE PRECISION Betax(2000), Sabx(2000), Sd(2000), Sb(2000)
-      DOUBLE PRECISION Ded, Deb, Delta, S, St, Be, Bb, Ff1, Ff2,
-     &   Ff1_Km1, Ff2_Km1, Be_Km1, AL, F, Ebe, Ebe_Km1, Tcal
-      DOUBLE PRECISION Terps
+      DOUBLE PRECISION Ded, Deb, Delta, S, St, Be, Bb, Ff1, Ff2,  &
+         Ff1_Km1, Ff2_Km1, Be_Km1, AL, F, Ebe, Ebe_Km1, Tcal
       INTEGER Nsd, Iprt, Nu, I, Ibeta, Nbt
       DOUBLE PRECISION Zero, Half, One, Two, Small
-      PARAMETER (Zero=0.0d0, Half=0.5d0, One=1.0d0, Two=2.0d0, 
-     *   Small=1.d-20)
-C
-C
+      PARAMETER (Zero=0.0d0, Half=0.5d0, One=1.0d0, Two=2.0d0,   &
+         Small=1.d-20)
+!
+!
       AL = Alpha
       Iprt = 1
-C
-C
-C *** Choose Beta interval for convolution
-C
-      Tcal = Twt*C_Trans*AL
-      Ded = 0.4*(Tcal)/dSQRT(One+1.42*(Tcal)*C_Trans)
+!
+!
+! *** Choose Beta interval for convolution
+!
+      Tcal = calc%Twt*calc%C_Trans*AL
+      Ded = 0.4*(Tcal)/dSQRT(One+1.42*(Tcal)*calc%C_Trans)
       IF (Ded.EQ.Zero ) Ded = 1000.0d0
-      IF (Ded.EQ.1000.) Ded = 0.2d0*dSQRT(Twt*AL)
+      IF (Ded.EQ.1000.) Ded = 0.2d0*dSQRT(calc%Twt*AL)
       Deb   = 10.0d0 *AL*Deltab
       Delta = dMIN1 (Deb, Ded)
       Nu = 1
-C
-C
-C *** Make table of S-diffusion or S-free on this interval
-C
-      CALL Stable (Sabx, Sd, Alpha, Delta, Twt, C_Trans,
-     *   Nu, Nsd, Ndmax)
-C
-C
+!
+!
+! *** Make table of S-diffusion or S-free on this interval
+!
+      CALL Stable (Sabx, Sd, Alpha, Delta, calc%Twt, calc%C_Trans, &
+         Nu, Nsd, Ndmax)
+!
+!
       IF (Nsd.GT.1) THEN
-C
-C ***    Copy original Ss(-Beta) to a temporary array
-         DO I=1,Nbeta
-            Betax(I) = Beta(I)
-            Sabx (I) = Sab (I)
+!
+! ***    Copy original Ss(-Beta) to a temporary array
+         DO I=1,calc%Nbeta
+            Betax(I) = calc%Beta(I)
+            Sabx (I) = calc%Sab (I)
          END DO
-C
-C ***    Loop over Beta values
-         DO Ibeta=1,Nbeta
+!
+! ***    Loop over Beta values
+         DO Ibeta=1,calc%Nbeta
             S = Zero
             Be = Betax(Ibeta)
-C
-C ***       Prepare table of continuous Ss on new interval
+!
+! ***       Prepare table of continuous Ss on new interval
             Nbt = Nsd
-            CALL Sbfill (Sb, Sabx, Betax, Delta, Be, Nbt, Nbeta, Ibeta)
-C
-C ***       Convolve S-transport with S-continuous
+            CALL Sbfill (Sb, Sabx, Betax, Delta, Be, Nbt, calc%Nbeta, Ibeta)
+!
+! ***       Convolve S-transport with S-continuous
             DO I=1,Nbt
                F = Two*(MOD(I-1,2)+1)
-C ***          If I=even, F=4.  If I=odd, F=2.
+! ***          If I=even, F=4.  If I=odd, F=2.
                IF (I.EQ.1 .OR. I.EQ.Nbt) F = One
                Bb = (I-1)*Delta
                S  = S + F*Sd(I)* ( Sb(Nbt+I-1) + Sb(Nbt-I+1)*dEXP(-Bb) )
@@ -81,27 +84,27 @@ C ***          If I=even, F=4.  If I=odd, F=2.
             S = S*Delta/3.0D0
             IF (S.LT.Small) S = Zero
             St = Terps (Sd, Nbt, Delta, Be)
-            IF (St.GT.Zero) S = S + dEXP(-AL*F0)*St
-C
-C ***       Store results and continue Beta loop
-            Sab(Ibeta) = S
+            IF (St.GT.Zero) S = S + dEXP(-AL*calc%F0)*St
+!
+! ***       Store results and continue Beta loop
+            calc%Sab(Ibeta) = S
          END DO
-C
-C
-C ***    Check moments of calculated S(Alpha, Beta).
-C
+!
+!
+! ***    Check moments of calculated S(Alpha, Beta).
+!
          IF (Iprt.EQ.1) THEN
             Tra0 = Zero
             Tra1 = Zero
             Be_Km1 = Betax(1)
             Ebe_Km1 = dEXP(-Be_Km1)
-            Ff1_Km1 = Sab(1) * (One+Ebe_Km1)
-            Ff2_Km1 = Sab(1) * (One-Ebe_Km1) * Be_Km1
-            DO Ibeta=2,Nbeta
+            Ff1_Km1 = calc%Sab(1) * (One+Ebe_Km1)
+            Ff2_Km1 = calc%Sab(1) * (One-Ebe_Km1) * Be_Km1
+            DO Ibeta=2,calc%Nbeta
                Be   = Betax(Ibeta)
                Ebe  = dEXP(-Be)
-               Ff1  = Sab(Ibeta) * (One+Ebe)
-               Ff2  = Sab(Ibeta) * (One-Ebe) * Be
+               Ff1  = calc%Sab(Ibeta) * (One+Ebe)
+               Ff2  = calc%Sab(Ibeta) * (One-Ebe) * Be
                Tra0 = Tra0 + Half*(Be-Be_Km1) * ( Ff1_Km1 + Ff1 )
                Tra1 = Tra1 + Half*(Be-Be_Km1) * ( Ff2_Km1 + Ff2 )
                Ff1_Km1 = Ff1
@@ -109,131 +112,129 @@ C
                Be_Km1  = Be
                Ebe_Km1 = Ebe
             END DO
-            Tra1 = Tra1/AL/(Tbeta+Twt)
+            Tra1 = Tra1/AL/(calc%Tbeta+calc%Twt)
          END IF
-C
+!
       END IF
-C
+!
       RETURN
       END
-C
-C
-C ----------------------------------------------------------------------
-C
+!
+!
+! ----------------------------------------------------------------------
+!
       SUBROUTINE Sbfill (Sb, Sabx, Betax, Delta, Be, Nbt, Nbeta, Ibeta)
-C
-C *** PURPOSE   -- Generate S(Beta) on a new energy grid for convolution
-C ***                 with a diffusion or free-gas shape.  Interpolation
-C ***                 is used.
-C ***              For translational cases only.
-C *** CALLED BY -- Trans.
-C
-      IMPLICIT NONE
+!
+! *** PURPOSE   -- Generate S(Beta) on a new energy grid for convolution
+! ***                 with a diffusion or free-gas shape.  Interpolation
+! ***                 is used.
+! ***              For translational cases only.
+! *** CALLED BY -- Trans.
+!
       INTEGER Nbt, Nbeta, Ibeta
       DOUBLE PRECISION Sb(*), Sabx(*), Betax(Nbeta), Delta, Be
-C ***    note that Ibeta is not used, but maybe should be ?!?
-C
+! ***    note that Ibeta is not used, but maybe should be ?!?
+!
       DOUBLE PRECISION Bmin, Bmax, Bet, B, St, Stm
       INTEGER J, I
       DOUBLE PRECISION Zero, Hundth
       PARAMETER (Zero=0.0d0, Hundth=0.01d0)
-C
+!
       Bmin = - Be - (Nbt-1)*Delta
       Bmax = - Be + (Nbt-1)*Delta + Hundth*Delta
       J = Nbeta
       I = 0
       Bet = Bmin
-C
+!
    10 CONTINUE
-C
+!
          I = I + 1
          B = dABS(Bet)
-C
+!
    20    CONTINUE
-C
-C ***    SEARCH FOR CORRECT Beta RANGE
+!
+! ***    SEARCH FOR CORRECT Beta RANGE
          IF (B.GT.Betax(J)) THEN
             IF (J.EQ.Nbeta) THEN
                Sb(I) = Zero
                GO TO 30
             END IF
-C           MOVE UP
+!           MOVE UP
             J = J + 1
             GO TO 20
          END IF
-C
+!
          IF (B.LE.Betax(J-1)) THEN
             IF (J.EQ.2) THEN
                Sb(I) = Zero
                GO TO 30
             END IF
-C           MOVE DOWN
+!           MOVE DOWN
             J = J - 1
             GO TO 20
          END IF
-C
-C
-C        INTERPOLATE IN THIS RANGE
-C
+!
+!
+!        INTERPOLATE IN THIS RANGE
+!
          IF (Sabx(J).LE.Zero) THEN
             St = -225.d0
          ELSE
             St = dLOG(Sabx(J))
          END IF
-C
+!
          IF (Sabx(J-1).LE.Zero) THEN
             Stm = -225.d0
          ELSE
            Stm = dLOG(Sabx(J-1))
          END IF
-C
+!
          Sb(I) = St + (B-Betax(J))*(Stm-St) / (Betax(J-1)-Betax(J))
          IF (Bet.GT.Zero) Sb(I) = Sb(I) - Bet
          Sb(I) = dEXP(Sb(I))
-C
+!
    30    CONTINUE
          Bet = Bet + Delta
          IF (Bet.LE.Bmax) GO TO 10
-C
-C *** end of loop on Bet
-C
+!
+! *** end of loop on Bet
+!
       RETURN
       END
-C
-C
-C ----------------------------------------------------------------------
-C
-      SUBROUTINE Stable (Sabx, Sd, Alpha, Delta, Twt, C_Trans,
-     *   Nu, Nsd, Ndmax)
-C
-C *** PURPOSE -- Set up a table of S-Diffusion or S-Free in the array
-C ***              Sd, evaluated at intervals Delta determined by Trans.
-C ***            Tabulation is continued until
-C ***              Sd(J) is less than 1.0d-7 * Sd(1), or Nsd is 1999
-C ***            Nsd is always odd for use with Simpson's rule.
-C ***            Array Sabx is used for temporary storage of Beta values.
-C ***            Stable returns -Beta side of asymmetric S(Alpha,Beta).
-C *** CALLED BY- Trans.
-C *** USES    -- Besk1.
-C
-      IMPLICIT NONE
+!
+!
+! ----------------------------------------------------------------------
+!
+      SUBROUTINE Stable (Sabx, Sd, Alpha, Delta, Twt, C_Trans,  &
+         Nu, Nsd, Ndmax)
+!
+! *** PURPOSE -- Set up a table of S-Diffusion or S-Free in the array
+! ***              Sd, evaluated at intervals Delta determined by Trans.
+! ***            Tabulation is continued until
+! ***              Sd(J) is less than 1.0d-7 * Sd(1), or Nsd is 1999
+! ***            Nsd is always odd for use with Simpson's rule.
+! ***            Array Sabx is used for temporary storage of Beta values.
+! ***            Stable returns -Beta side of asymmetric S(Alpha,Beta).
+! *** CALLED BY- Trans.
+! *** USES    -- Besk1.
+!
       INTEGER Nu, Nsd, Ndmax
       DOUBLE PRECISION Sabx(Ndmax), Sd(Ndmax)
       DOUBLE PRECISION Alpha, Delta, Twt, C_Trans
       INTEGER Icheck, J, I
-      DOUBLE PRECISION C2, C3, C4, C8, Be, C6, C7, Wal, Check0, Check1,
-     &                 Eps, D, C5, Ex, Sfree, F, Bb, Besk1
+      DOUBLE PRECISION C2, C3, C4, C8, Be, C6, C7, Wal, Check0, Check1,   &
+                       Eps, D, C5, Ex, Sfree, F, Bb
       DOUBLE PRECISION Pi, Zero, Quarter, Half, One, Two, Three, Four
-      PARAMETER (PI=3.141592653589793238462643d0, Zero=0.0d0,
-     &   Quarter=0.25d0, Half=0.5d0, One=1.0d0, Two=2.0d0, Three=3.0d0,
-     &   Four=4.0d0)
-C
+      PARAMETER (PI=3.141592653589793238462643d0, Zero=0.0d0,           &
+         Quarter=0.25d0, Half=0.5d0, One=1.0d0, Two=2.0d0, Three=3.0d0, &
+         Four=4.0d0)
+!
       Icheck = 0
       Eps = 1.E-7
-C
+!
       IF (C_Trans.NE.Zero) THEN
-C
-C ***    DIFFUSION BRANCH
+!
+! ***    DIFFUSION BRANCH
          D  = Twt*C_Trans
          C2 = dSQRT(C_Trans**2+Quarter)
          C3 = Two*D*Alpha
@@ -245,33 +246,33 @@ C ***    DIFFUSION BRANCH
   100    CONTINUE
          C6 = dSQRT(Be*Be+C4)
          C7 = C6*C2
-C
+!
          IF (C7.LE.One) THEN
             C5 = C8*dEXP(C3+Half*Be)
          ELSE
-C        ELSE IF (C7.GT.One) THEN
+!        ELSE IF (C7.GT.One) THEN
             C5 = Zero
             Ex = C3 - C7 + Half*Be
             C5 = C8*dEXP(Ex)
          END IF
-C
+!
          Sd(J) = C5*Besk1(C7)/C6
          Sabx(J) = Be
          Be = Be + Delta
          J  = J + 1
-C
+!
          IF (MOD(J,2).NE.0) THEN
             GO TO 100
          ELSE IF (J.LT.2000) THEN
             IF (Eps*Sd(1).LT.Sd(J-1)) GO TO 100
          END IF
-C
+!
          J   = J - 1
          Nsd = J
-C
+!
       ELSE
-C
-C ***    FREE-GAS BRANCH
+!
+! ***    FREE-GAS BRANCH
          Be  = Zero
          J   = 1
          Wal = Twt*Alpha
@@ -282,22 +283,22 @@ C ***    FREE-GAS BRANCH
          Sabx(J) = Be
          Be    = Be + Delta
          J     = J + 1
-C
+!
          IF (MOD(J,2).NE.0) THEN
             GO TO 170
          ELSE IF (J.LT.2000) THEN
             IF (Eps*Sd(1).LT.Sd(J-1)) GO TO 170
          END IF
-C
+!
          J = J - 1
          Nsd = J
-C
+!
       END IF
-C
-C
-C
+!
+!
+!
       IF (Icheck.NE.0) THEN
-C ***    Check the moments of the distribution
+! ***    Check the moments of the distribution
          Check0 = Zero
          Check1 = Zero
          DO I=1,Nsd
@@ -312,93 +313,92 @@ C ***    Check the moments of the distribution
          Check0 = Check0*Delta/Three
          Check1 = Check1*Delta/Three
          Check1 = Check1/(Alpha*Twt)
-C ***    Huh?  Must return these values or print them or something?
-C ***    Otherwise they are just ignored
+! ***    Huh?  Must return these values or print them or something?
+! ***    Otherwise they are just ignored
       END IF
-C
+!
       RETURN
       END
-C
-C
-C -------------------------------------------------------------------
-C
-      FUNCTION Besk1 (X)
-C
-C *** PURPOSE -- Compute modified Bessel Function K1
-C ***            The exponential part for X>1 is omitted (See Stable).
-C     CALLED BY- Stable.
-C
-      IMPLICIT NONE
-      DOUBLE PRECISION X, V, U, BI1, BI3, Besk1
-C
+!
+!
+! -------------------------------------------------------------------
+!
+      real(kind=8) FUNCTION Besk1 (X)
+!
+! *** PURPOSE -- Compute modified Bessel Function K1
+! ***            The exponential part for X>1 is omitted (See Stable).
+!     CALLED BY- Stable.
+!
+      DOUBLE PRECISION X, V, U, BI1, BI3
+!
       IF (X.LE.1.0) THEN
          V = 0.125d0 * X
          U = V*V
-         Bi1 = (((((((((  0.442850424d0 *U +  0.584115288d0)*U
-     &                  + 6.070134559d0)*U + 17.864913364d0)*U
-     &                 + 48.858995315d0)*U + 90.924600045d0)*U
-     &                + 113.795967431d0)*U + 85.331474517d0)*U
-     &                 + 32.00008698 d0)*U +  3.999998802d0     )*V
-         Bi3 = (((((((((  1.304923514d0 *U +  1.47785657 d0)*U
-     &                 + 16.402802501d0)*U + 44.732901977d0)*U
-     &                + 115.837493464d0)*U +198.437197312d0)*U
-     &                + 222.869709703d0)*U +142.216613971d0)*U
-     &                 + 40.000262262d0)*U +  1.999996391d0)
+         Bi1 = (((((((((  0.442850424d0 *U +  0.584115288d0)*U  &
+                        + 6.070134559d0)*U + 17.864913364d0)*U  &
+                       + 48.858995315d0)*U + 90.924600045d0)*U  &
+                      + 113.795967431d0)*U + 85.331474517d0)*U  &
+                       + 32.00008698d0)*U  +  3.999998802d0     )*V
+         Bi3 = (((((((((  1.304923514d0 *U +  1.47785657d0)*U   &
+                       + 16.402802501d0)*U + 44.732901977d0)*U  &
+                      + 115.837493464d0)*U +198.437197312d0)*U  &
+                      + 222.869709703d0)*U +142.216613971d0)*U  &
+                       + 40.000262262d0)*U +  1.999996391d0)
          Besk1 = 1.0d0/X + Bi1*(dLOG(0.5d0*X)+0.5772156649d0) - V*Bi3
-C
+!
       ELSE
-C
+!
          U = 1.0d0/X
-         Bi3 = ((((((((((((- 0.0108241775d0 *U + 0.0788000118d0)*U
-     &                     - 0.2581303765d0)*U + 0.5050238576d0)*U
-     &                     - 0.663229543 d0)*U + 0.6283380681d0)*U
-     &                     - 0.4594342117d0)*U + 0.2847618149d0)*U
-     &                     - 0.1736431637d0)*U + 0.1280426636d0)*U
-     &                     - 0.1468582957d0)*U + 0.4699927013d0)*U
-     &                     + 1.2533141373d0)
+         Bi3 = ((((((((((((- 0.0108241775d0 *U + 0.0788000118d0)*U  &
+                           - 0.2581303765d0)*U + 0.5050238576d0)*U  &
+                           - 0.663229543d0)*U  + 0.6283380681d0)*U  &
+                           - 0.4594342117d0)*U + 0.2847618149d0)*U  &
+                           - 0.1736431637d0)*U + 0.1280426636d0)*U  &
+                           - 0.1468582957d0)*U + 0.4699927013d0)*U  &
+                           + 1.2533141373d0)
          Besk1 = dSQRT(U)*Bi3
       END IF
       RETURN
       END
-C
-C
-C ----------------------------------------------------------------------
-C
+!
+!
+! ----------------------------------------------------------------------
+!
       DOUBLE PRECISION FUNCTION Terps (Sd, Nsd, Delta, Be)
-C
-C *** PURPOSE -- Interpolate for Beta=Be in table of S(Alpha,Beta).
-C *** USED IN -- Trans.
-C
-      IMPLICIT NONE
+!
+! *** PURPOSE -- Interpolate for Beta=Be in table of S(Alpha,Beta).
+! *** USED IN -- Trans.
+!
       INTEGER          Nsd, I
       DOUBLE PRECISION Sd(Nsd), Bt, Btp, ST, Delta, Stp, Stt, Be
       DOUBLE PRECISION Zero
       PARAMETER (Zero=0.0d0)
-C
+!
       I = Be/Delta
-C
+!
       IF (I.GE.Nsd-1) THEN
          Terps = Zero
          RETURN
       END IF
-C
+!
       Bt  = I*Delta
       Btp = Bt + Delta
       I   = I + 1
-C
+!
       IF (Sd(I).LE.Zero) THEN
          St = -225.d0
       ELSE
          St = dLOG(Sd(I))
       END IF
-C
+!
       IF (SD(I+1).LE.Zero) THEN
          Stp = -225.d0
       ELSE
          Stp = dLOG(Sd(I+1))
       END IF
-C
+!
       Stt = St + (Be-Bt)*(Stp-ST)/(Btp-Bt)
       Terps = dEXP(Stt)
       RETURN
       END
+end module mcml6_m
diff --git a/sammy/src/clm/mclm7.f90 b/sammy/src/clm/mclm7.f90
index d63b954fd39e36db48fa41cb58e9ca90b06c72dd..8b8cce6a04b906163ea956b98990e5757df1d1ec 100644
--- a/sammy/src/clm/mclm7.f90
+++ b/sammy/src/clm/mclm7.f90
@@ -1,80 +1,79 @@
-C
-C
-C ----------------------------------------------------------------------
-C
-      SUBROUTINE Discre (Osc_Wts, Osc_Enx, Osc_Snth, Osc_Coth, Sab,
-     &   Beta, Bex, S_Expb, S_Ex, Alpha, Tbarx, Osc0, Osc1)
-C
-C
-C     Scattering low calculation for discrete frequency distribution
-C
-C *** PURPOSE   -- Control the convolution of discrete oscillators with
-C ***                the continuous S(Alpha,Beta) computed in Contin.
-C *** Called by -- Sigcri
-C *** Uses      -- Bfact, Exts, Sint
-C *** Input     -- Osc_Wts(), Osc_Enx(), Osc_Snth(), Osc_Coth(),
-C ***              Beta(), Bex()
-C ***           -- Alpha, Dwpix, Tbeta, Tbarx
-C *** Output    -- Sab()
-C ***           -- Osc0, Osc1
-C *** Dummies   -- Bplus(), Bminus(), S_Expb(), S_Ex(),
-C ***              Bes(), Wts(), Ben(), Wtn()
-C
-C
-      use clm_common_m
-      use constn_common_m
-      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
-      DOUBLE PRECISION Osc_Wts(*), Osc_Enx(*), Osc_Snth(*), Osc_Coth(*),
-     *  Sab(*), Beta(*), Bex(*), S_Expb(*), S_Ex(*)
-      DOUBLE PRECISION Bplus(50), Bminus(50), Bes(2000), Wts(2000),
-     *  Ben(2000), Wtn(2000)
+module mclm7_m
+use AllocateFunctions_m
+use CrystalLatticeBroadening_M
+IMPLICIT none
+contains
+!
+!
+! ----------------------------------------------------------------------
+!
+      SUBROUTINE Discre (calc, Alpha, Tbarx, Osc0, Osc1)
+!
+!
+!     Scattering low calculation for discrete frequency distribution
+!
+! *** PURPOSE   -- Control the convolution of discrete oscillators with
+! ***                the continuous S(Alpha,Beta) computed in Contin.
+! *** Called by -- Sigcri
+! *** Uses      -- Bfact, Exts, Sint
+! *** Input     -- Osc_Wts(), Osc_Enx(), Osc_Snth(), Osc_Coth(),
+! ***              Beta(), Bex()
+! ***           -- Alpha, Dwpix, Tbeta, Tbarx
+! *** Output    -- Sab()
+! ***           -- Osc0, Osc1
+! *** Dummies   -- Bplus(), Bminus(), S_Expb(), S_Ex(),
+! ***              Bes(), Wts(), Ben(), Wtn()
+!
+!
+      class(CrystalLatticeBroadening)::calc
+      DOUBLE PRECISION Bplus(50), Bminus(50), Bes(2000), Wts(2000), &
+        Ben(2000), Wtn(2000)
       DOUBLE PRECISION Alpha, Tbarx, Osc0, Osc1
-      INTEGER Maxdd
-      DATA Maxdd /2000/
-C
-      DOUBLE PRECISION Dwf, Wt, X, Y, Besn, Wtsn, Wsave,
-     &   Ff1, Ff2, Ff1m, Ff2m, Bem, Be, Qqq, AL,
-     &   Bzero, St, Add, Db, Sint, Enx, Sum0, Sum1, Alwt
+      INTEGER, parameter:: Maxdd = 2000
+!
+      DOUBLE PRECISION Dwf, Wt, X, Y, Besn, Wtsn, Wsave,  &
+         Ff1, Ff2, Ff1m, Ff2m, Bem, Be, Qqq, AL,          &
+         Bzero, St, Add, Db, Enx, Sum0, Sum1, Alwt
       INTEGER I, J, Nn, N, M, K, Jj, Ibeta
-      DOUBLE PRECISION Zero, Half, One
-      PARAMETER (Zero=0.0d0, Half=0.5d0, One=1.0d0)
-C
-C
-C *** SET UP OSCILLATOR PARAMETERS
-      CALL Exts (Sab, S_Ex, Beta, Nbeta)
-C *** initializes S_Ex as needed by Sint
-C
-      Wt   = Tbeta
+      real(kind=8),PARAMETER::Zero=0.0d0, Half=0.5d0, One=1.0d0
+!
+!
+! *** SET UP OSCILLATOR PARAMETERS
+      call allocate_real_data(calc%S_Ex, 2*calc%Nbeta)
+      CALL Exts (calc%Sab, calc%S_Ex, calc%Beta, calc%Nbeta)
+! *** initializes S_Ex as needed by Sint
+!
+      Wt   = calc%Tbeta
       Qqq  = Tbarx
       AL   = Alpha
       Dwf  = Zero
-      IF (AL*Dw0.LT.45.0d0) Dwf = dEXP(-AL*Dw0)
-C
-      CALL Zero_Array (S_Expb,Nbeta)
-C
-C
-C *** INITIALIZE FOR DELTA FUNCTION CALCULATION
+      IF (AL*calc%Dw0.LT.45.0d0) Dwf = dEXP(-AL*calc%Dw0)
+!
+      call allocate_real_data(calc%S_Expb,calc%Nbeta)
+!
+!
+! *** INITIALIZE FOR DELTA FUNCTION CALCULATION
       Ben(1) = Zero
       Wtn(1) = One
       Nn = 1
       N  = 0
-C
-C
-C *** -----
-C *** LOOP OVER ALL OSCILLATORS
-C
-      DO 10 I=1,N_Osc
-         X   = AL*Osc_Snth(I)
-         Y   = AL*Osc_Coth(I)
-         Enx = Osc_Enx(I)
+!
+!
+! *** -----
+! *** LOOP OVER ALL OSCILLATORS
+!
+      DO 10 I=1,calc%N_Osc
+         X   = AL*calc%Osc_Snth(I)
+         Y   = AL*calc%Osc_Coth(I)
+         Enx = calc%Osc_Enx(I)
          CALL Bfact (Bplus, Bminus, Bzero, X, Y, Enx)
-         Qqq = Qqq + Osc_Coth(I)*Enx**2
-C
-C
-C ***    Do convolution for the delta functions
-C ***    -----
-C ***    N = 0 TERM
-C
+         Qqq = Qqq + calc%Osc_Coth(I)*Enx**2
+!
+!
+! ***    Do convolution for the delta functions
+! ***    -----
+! ***    N = 0 TERM
+!
          DO M=1,Nn
             Besn = Ben(M)
             Wtsn = Wtn(M)*Bzero
@@ -86,12 +85,12 @@ C
                END IF
             END IF
          END DO
-C
-C
-C ***    -----
-C ***    NEGATIVE N TERMS
-C                                          ########## DO K=1,50 ? #######
-C ###    BFACT is hard-wired for max of 30, not 50
+!
+!
+! ***    -----
+! ***    NEGATIVE N TERMS
+!                                          ########## DO K=1,50 ? #######
+! ###    BFACT is hard-wired for max of 30, not 50
          DO K=1,30
             IF (Bminus(K).GT.Zero) THEN
                DO M=1,Nn
@@ -105,12 +104,12 @@ C ###    BFACT is hard-wired for max of 30, not 50
                END DO
             END IF
          END DO
-C
-C
-C ***    -----
-C ***    POSITIVE N TERMS
-C                                          ########## DO K=1,50 ? #######
-C ###    BFACT is hard-wired for max of 30, not 50
+!
+!
+! ***    -----
+! ***    POSITIVE N TERMS
+!                                          ########## DO K=1,50 ? #######
+! ###    BFACT is hard-wired for max of 30, not 50
          DO K=1,30
             IF (Bplus(K).GT.Zero) THEN
                DO M=1,Nn
@@ -124,27 +123,27 @@ C ###    BFACT is hard-wired for max of 30, not 50
                END DO
             END IF
          END DO
-C
-C
-C ***    -----
-C ***    CONTINUE OSCILLATOR LOOP
-C
+!
+!
+! ***    -----
+! ***    CONTINUE OSCILLATOR LOOP
+!
          Nn = N
          DO M=1,Nn
             Ben(M) = Bes(M)
             Wtn(M) = Wts(M)
          END DO
          N = 0
-         Wt = Wt + Osc_Wts(I)
-C
+         Wt = Wt + calc%Osc_Wts(I)
+!
    10 CONTINUE
-C *** END OF LOOP OVER ALL OSCILLATORS
+! *** END OF LOOP OVER ALL OSCILLATORS
       N = Nn
-C
-C
-C
-C *** -----
-C *** Sort the discrete lines and throw out the smallest ones
+!
+!
+!
+! *** -----
+! *** Sort the discrete lines and throw out the smallest ones
       Nn = N - 1
       DO I=1,N-1
          K = 0
@@ -162,128 +161,125 @@ C *** Sort the discrete lines and throw out the smallest ones
          IF (K.EQ.0) GO TO 20
       END DO
    20 CONTINUE
-C
+!
       DO I=1,Nn
          N = I
          IF (Wts(I).LT.1.E-5) GO TO 30
       END DO
    30 CONTINUE
-C
-C
-C
-C *** -----
-C *** Add the continuum part to the scattering law
+!
+!
+!
+! *** -----
+! *** Add the continuum part to the scattering law
       Alwt = Alpha * Wt
       Qqq = Qqq * Alwt * 2.0d0
       DO M=1,N
          IF (Wts(M).NE.Zero) THEN
-            DO J=1,Nbeta
-               Be = - Beta(J) - Bes(M)
-               St = Sint (Beta, Bex, S_Ex, Be, Alwt, Qqq, Del_S_B, Nbx,
-     *            Nbeta)
+            DO J=1,calc%Nbeta
+               Be = - calc%Beta(J) - Bes(M)
+               St = Sint (calc%Beta, calc%Bex, calc%S_Ex, Be, Alwt, Qqq, calc%Del_S_B, calc%Nbx, calc%Nbeta)
                IF (St.NE.Zero) THEN
                   Add = Wts(M)*St
                   IF (Add.GE.1.E-20) THEN
-                     S_Expb(J) = S_Expb(J) + Add
+                     calc%S_Expb(J) = calc%S_Expb(J) + Add
                   END IF
                END IF
             END DO
          END IF
       END DO
-C
-C
-C *** -----
-C *** Add the delta functions to the scattering law
-C *** Delta(0.) is saved fro [from? for?] the incoherent elastic
-C
+!
+!
+! *** -----
+! *** Add the delta functions to the scattering law
+! *** Delta(0.) is saved fro [from? for?] the incoherent elastic
+!
       JJ = 0
       IF (Dwf.GE.1.E-10) THEN
-         IF (Twt.LE.Zero) THEN
+         IF (calc%Twt.LE.Zero) THEN
             DO M=1,N
                IF (Bes(M).LT.Zero) THEN
                   Be = -Bes(M)
-C
-                  IF (Be.LE.Beta(Nbeta-1)) THEN
+!
+                  IF (Be.LE.calc%Beta(calc%Nbeta-1)) THEN
                      Db = 1000.d0
-                     DO J=1,Nbeta
+                     DO J=1,calc%Nbeta
                         JJ = J
-                        IF (dABS(Be-Beta(J)).GT.Db) GO TO 40
-                        Db = dABS(Be-Beta(J))
+                        IF (dABS(Be-calc%Beta(J)).GT.Db) GO TO 40
+                        Db = dABS(Be-calc%Beta(J))
                      END DO
    40                CONTINUE
-C
+!
                      IF (JJ.LE.2) THEN
-                        Add = Wts(M)/Beta(JJ)
+                        Add = Wts(M)/calc%Beta(JJ)
                      ELSE
-                        Add = 2*Wts(M)/(Beta(JJ)-Beta(JJ-2))
+                        Add = 2*Wts(M)/(calc%Beta(JJ)-calc%Beta(JJ-2))
                      END IF
-C
+!
                      Add = Add*Dwf
                      IF (Add.GE.1.d-20) THEN
-                        S_Expb(JJ-1) = S_Expb(JJ-1) + Add
+                        calc%S_Expb(JJ-1) = calc%S_Expb(JJ-1) + Add
                      END IF
-C
+!
                   END IF
                END IF
             END DO
          END IF
       END IF
-C
-C
-C *** -----
-C *** Record the results
-      DO J=1,Nbeta
-         Sab(J) = S_Expb(J)
+!
+!
+! *** -----
+! *** Record the results
+      DO J=1,calc%Nbeta
+         calc%Sab(J) = calc%S_Expb(J)
       END DO
-C
-C
-C *** -----
-C *** Check moments of calculated S(Alpha,Beta).
-C     Ibeta = 1
-      Bem  = Beta(1)
-      Ff1m = Sab(1)
-      Ff2m = Sab(1)*dEXP(-Bem)
+!
+!
+! *** -----
+! *** Check moments of calculated S(Alpha,Beta).
+!     Ibeta = 1
+      Bem  = calc%Beta(1)
+      Ff1m = calc%Sab(1)
+      Ff2m = calc%Sab(1)*dEXP(-Bem)
       Sum0 = Zero
       Sum1 = Zero
-      DO Ibeta=2,Nbeta
-         Be = Beta(Ibeta)
-         Ff2 = Sab(Ibeta)
-         Ff1 = Sab(Ibeta)*dEXP(-Be)
+      DO Ibeta=2,calc%Nbeta
+         Be = calc%Beta(Ibeta)
+         Ff2 = calc%Sab(Ibeta)
+         Ff1 = calc%Sab(Ibeta)*dEXP(-Be)
          Sum0 = Sum0 + Half*(Be-Bem)*(Ff1m+Ff2m+Ff1+Ff2)
-         Sum1 = Sum1 + Half*(Be-Bem)
-     &      *(Ff2m*Bem+Ff2*Be-Ff1m*Bem-Ff1*Be)
+         Sum1 = Sum1 + Half*(Be-Bem)*(Ff2m*Bem+Ff2*Be-Ff1m*Bem-Ff1*Be)
          Ff1m = Ff1
          Ff2m = Ff2
          Bem  = Be
       END DO
-      IF (Twt.EQ.Zero) Sum0 = Sum0 + dEXP(-AL*Dwpix)
+      IF (calc%Twt.EQ.Zero) Sum0 = Sum0 + dEXP(-AL*calc%Dwpix)
       Sum1 = Sum1/AL
       Osc0 = Sum0
       Osc1 = Sum1
       RETURN
       END
-C
-C
-C ----------------------------------------------------------------------
-C
+!
+!
+! ----------------------------------------------------------------------
+!
       SUBROUTINE Exts (Sab, S_Ex, Beta, Nbeta)
-C
-C *** PURPOSE   -- Set up the Array S_Ex for Sint.
-C ***              Sab contains the asymmetric S(alpha,beta) for negative
-C ***                 Beta, and S_Ex contains the asymmetrix S(alpha,beta)
-C ***                 extended to plus and minus Beta.
-C *** CALLED BY -- Discre.
-C
-      IMPLICIT NONE
+!
+! *** PURPOSE   -- Set up the Array S_Ex for Sint.
+! ***              Sab contains the asymmetric S(alpha,beta) for negative
+! ***                 Beta, and S_Ex contains the asymmetrix S(alpha,beta)
+! ***                 extended to plus and minus Beta.
+! *** CALLED BY -- Discre.
+!
       INTEGER          Nbeta, K, I
-      DOUBLE PRECISION Sab(*), S_Ex(*), Beta(Nbeta)
-C
+      real(kind=8)::Beta(:), S_Ex(:), Sab(:)
+!
       K = Nbeta
       DO I=1,Nbeta
          S_Ex(I) = Sab(K)
          K = K - 1
       END DO
-C
+!
       IF (Beta(1).LE.0.000000001) THEN
          S_Ex(Nbeta) = Sab(1)
          K = Nbeta + 1
@@ -291,40 +287,39 @@ C
          K = Nbeta + 2
          S_Ex(Nbeta+1) = Sab(1)
       END IF
-C
+!
       DO I=2,Nbeta
          S_Ex(K) = Sab(I)*dEXP(-Beta(I))
          K = K + 1
       END DO
-C
+!
       RETURN
       END
-C
-C
-C ----------------------------------------------------------------------
-C
-      DOUBLE PRECISION FUNCTION Sint (Beta, Bex, S_Ex, Be, Alwt,
-     *   Qqq, Del_S_B, Nbx, Nbeta)
-C
-C     INTERPOLATES IN SCATTERING FUNCTION, OR USES SCT APPROX
-C        TO EXTRAPOLATE OUTSIDE THE RANGE IN MEMORY.
-C     CALLED BY DISCRE.
-C
-      IMPLICIT NONE
-      DOUBLE PRECISION Beta(*), Bex(*), S_Ex(*)
+!
+!
+! ----------------------------------------------------------------------
+!
+      DOUBLE PRECISION FUNCTION Sint (Beta, Bex, S_Ex, Be, Alwt,  &
+         Qqq, Del_S_B, Nbx, Nbeta)
+!
+!     INTERPOLATES IN SCATTERING FUNCTION, OR USES SCT APPROX
+!        TO EXTRAPOLATE OUTSIDE THE RANGE IN MEMORY.
+!     CALLED BY DISCRE.
+!
+      real(kind=8)::Beta(:), Bex(:), S_Ex(:)
       DOUBLE PRECISION Be, Alwt, Qqq, Del_S_B
       INTEGER Nbx, Nbeta
-C
+!
       DOUBLE PRECISION Sv, Ex, Ss1, Ss3
       INTEGER K1, K2, K3
       DOUBLE PRECISION Zero, Pi
       PARAMETER (Zero=0.0d0, Pi=3.141592653589793238462643d0)
-C
-C
+!
+!
       IF (dABS(Be).GT.Beta(Nbeta)) THEN
-C
-C ***    -----
-C ***    SCT approximation [extrapolation]
+!
+! ***    -----
+! ***    SCT approximation [extrapolation]
          IF (Alwt.LE.Zero) THEN
             Sv = Zero
          ELSE
@@ -332,16 +327,16 @@ C ***    SCT approximation [extrapolation]
             IF (Be.GT.Zero) Ex = Ex - Be
             Sv = dEXP(Ex)/(Pi*Qqq)
          END IF
-C
+!
       ELSE
-C
-C *** -----
-C ***    Interpolation
+!
+! *** -----
+! ***    Interpolation
          K1 = 1
          K2 = Nbeta
          K3 = Nbx
-C
-C **     Bisect for Be
+!
+! **     Bisect for Be
   130    CONTINUE
          IF (Be.EQ.Bex(K2)) THEN
             Sv = S_Ex(K2)
@@ -369,61 +364,60 @@ C **     Bisect for Be
             END IF
          END IF
       END IF
-C
+!
       Sint = Sv
-C
+!
       RETURN
       END
-C
-C
-C -------------------------------------------------------------------
-C
+!
+!
+! -------------------------------------------------------------------
+!
       SUBROUTINE Bfact (Bplus, Bminus, Bzero, X, Y, Enx)
-C
-C     CALCULATES THE Bessel-FUNCTION TERMS FOR DISCRETE OSCILLATORS.
-C     CALLED BY DISCRE.
-C
-      IMPLICIT NONE
+!
+!     CALCULATES THE Bessel-FUNCTION TERMS FOR DISCRETE OSCILLATORS.
+!     CALLED BY DISCRE.
+!
       DOUBLE PRECISION Bplus(*), Bminus(*), Bzero, X, Y, Enx
-      DOUBLE PRECISION Xx, Yy, Xy, Xt, U, V,
-     &                 Bessio, Bessi1, Zero, One, Half
+      DOUBLE PRECISION Xx, Yy, Xy, Xt, U, V,           &
+                       Bessio, Bessi1, Zero, One, Half
       INTEGER          Imax, I, J, K
       PARAMETER (Zero=0.0d0, Half=0.5d0, One=1.0D0)
-C
-C
+!
+!
       Xx  = X
       Yy  = Y
       Xy = Enx
       Xt = Xx/3.75d0
-C
-C
-C *** Compute Bessio and Bessi1
-C
+!
+!
+! *** Compute Bessio and Bessi1
+!
       IF (Xt.LE.One) THEN
          U = Xt*Xt
-         Bessio = One
-     &     + U * (3.5156229 + U * (3.0899424 + U * (1.2067492
-     &     + U * (0.2659732 + U * (0.0360768 + U * 0.0045813 )))))
-         Bessi1 = (0.5
-     &     + U * (0.87890594 + U * (0.51498869 + U *(0.15084934
-     &     + U * (0.02658733 + U * (0.00301532 + U * 0.00032411))))))*Xx
+         Bessio = One                                                &
+           + U * (3.5156229 + U * (3.0899424 + U * (1.2067492        &
+           + U * (0.2659732 + U * (0.0360768 + U * 0.0045813 )))))
+         Bessi1 = (0.5                                                    &
+           + U * (0.87890594 + U * (0.51498869 + U *(0.15084934           &
+           + U * (0.02658733 + U * (0.00301532 + U * 0.00032411))))))*Xx
       ELSE
          U = One/Xt
-         Bessio = (
-     &              0.39894228 + U * (0.01328592 + U * ( 0.00225319
-     &      + U * (-0.00157565 + U * (0.00916281 + U * (-0.02057706
-     &      + U * ( 0.02635537 + U * (-.01647633 + U *   0.00392377
-     &            )))))))) / SQRT(Xx)
-         Bessi1 = 0.02282967 + U * (-0.02895312 + U * ( 0.01787654
-     &                                           -U *   0.00420059 ))
-         Bessi1 = 0.39894228 + U * (-0.03988024 + U * (-0.00362018
-     &    + U * ( 0.00163801 + U * (-0.01031555 + U * Bessi1 ))))
+         Bessio = (                                                  &
+                    0.39894228 + U * (0.01328592 + U * ( 0.00225319  &
+            + U * (-0.00157565 + U * (0.00916281 + U * (-0.02057706  &
+            + U * ( 0.02635537 + U * (-.01647633 + U *   0.00392377  &
+                  )))))))) / SQRT(Xx)
+         Bessi1 = 0.02282967 + U * (-0.02895312 + U * ( 0.01787654    &
+                                                 -U *   0.00420059 ))
+         Bessi1 = 0.39894228 + U * (-0.03988024 + U * (-0.00362018    &
+          + U * ( 0.00163801 + U * (-0.01031555 + U * Bessi1 ))))
          Bessi1 = Bessi1/SQRT(Xx)
       END IF
-C
-C
-C *** Generate higher-order Bessel functions by reverse recursion
-C
+!
+!
+! *** Generate higher-order Bessel functions by reverse recursion
+!
       Imax = 30
       Bplus(Imax  ) = Zero
       Bplus(Imax-1) = One
@@ -436,17 +430,17 @@ C
                Bplus(J) = Bplus(J)*1.0d-10
             END DO
          END IF
-C     end of loop on I
+!     end of loop on I
       END DO
-C
+!
       U = Bessi1/Bplus(1)
       DO I=1,Imax-1
          Bplus(I) = Bplus(I)*U
       END DO
-C
-C
-C *** Apply exponential terms to Bessel Functiions
-C
+!
+!
+! *** Apply exponential terms to Bessel Functiions
+!
       U = Xy*Half
       IF (Xt.LT.One) THEN
          V = - Yy
@@ -462,3 +456,4 @@ C
       END DO
       RETURN
       END
+end module mclm7_m
diff --git a/sammy/src/clm/mclm8.f90 b/sammy/src/clm/mclm8.f90
index b8816fe2a46fc465fb9052dcdee146ea2a7e9dc9..9d10f02a4c5df27d6ef0c207779892b4c6aba0ce 100644
--- a/sammy/src/clm/mclm8.f90
+++ b/sammy/src/clm/mclm8.f90
@@ -1,22 +1,22 @@
-C
-C
-C -----------------------------------------------------------------
-C
-      SUBROUTINE Find_L (grid, Xx, L1, L2, Lstart, L1_Error,
-     *   L2_Error)
-C *** Purpose -- find L1 & L2 such that Energy(L1) < Xx < Energy(L2)
-C
-      use SammyGridAccess_M
-      use EndfData_common_m
-      IMPLICIT NONE
+module mcml8_m
+use CrystalLatticeBroadening_M
+implicit none
+contains
+!
+!
+! -----------------------------------------------------------------
+!
+      SUBROUTINE Find_L (calc, Xx, L1, L2, Lstart, L1_Error, L2_Error)
+! *** Purpose -- find L1 & L2 such that Energy(L1) < Xx < Energy(L2)
+!
+      class(CrystalLatticeBroadening)::calc
       DOUBLE PRECISION Xx
-      type(SammyGridAccess)::grid    ! can pass even in f77 as in same compile unit
       INTEGER L1, L2, Lstart, Lk, L1_Error, L2_Error
       real(kind=8)::eLstart, eL1, eL2, eLk
       integer::numEl
-C
-      numEl = grid%getNumEnergies(expData)
-      eLstart = grid%getEnergy(Lstart, expData)
+!
+      numEl = calc%getNumEnergyUnbroadened()
+      eLstart = calc%getEnergyUnbroadened(Lstart)
       IF (Xx.EQ.eLstart) THEN
          L1 = Lstart
          L2 = Lstart
@@ -25,24 +25,24 @@ C
             L1_Error = L1_Error + 1
             L1 = 1
             L2 = 2
-CX            STOP '[Stop in Find_L in clm/mclm8.f    # 1]'
+!X            STOP '[Stop in Find_L in clm/mclm8.f    # 1]'
          ELSE
             DO Lk=Lstart-1,1,-1
-               eLk = grid%getEnergy(Lk, expData)
+               eLk = calc%getEnergyUnbroadened(Lk)
                IF (Xx.GE.eLk) THEN
                   L1 = Lk
                   L2 = Lk + 1
-                  eL1 = grid%getEnergy(L1, expData)
-                  eL2 = grid%getEnergy(L2, expData)
+                  eL1 = calc%getEnergyUnbroadened(L1)
+                  eL2 = calc%getEnergyUnbroadened(L2)
                   IF (Xx.LT.eL2) RETURN
                   WRITE (6,10000) L1, eL1, Xx, L2, eL2
-10000             FORMAT (' Eb(', I5, ')=',1PG14.6,'   Xx=', 1PG14.6,
-     *               '   Eb(', I5, ')=', 1PG14.6)
+10000             FORMAT (' Eb(', I5, ')=',1PG14.6,'   Xx=', 1PG14.6,  &
+                     '   Eb(', I5, ')=', 1PG14.6)
                   STOP '[Stop in Find_L in clm/mclm8.f    # 2]'
                END IF
             END DO
             Lk = 1
-            eLk = grid%getEnergy(Lk, expData)
+            eLk = calc%getEnergyUnbroadened(Lk)
             WRITE (6,10000) Lstart, eLstart, Xx, Lk, eLk
             STOP '[Stop in Find_L in clm/mclm8.f    # 3]'
          END IF
@@ -53,24 +53,25 @@ CX            STOP '[Stop in Find_L in clm/mclm8.f    # 1]'
             L2 = numEl
          ELSE
             DO Lk=Lstart+1,numEl
-               eLk = grid%getEnergy(Lk, expData)
+               eLk = calc%getEnergyUnbroadened(Lk)
                IF (Xx.LE.eLk) THEN
                   L2 = Lk
                   L1 = Lk - 1
-                  eL1 = grid%getEnergy(L1, expData)
-                  eL2 = grid%getEnergy(L2, expData)
+                  eL1 = calc%getEnergyUnbroadened(L1)
+                  eL2 = calc%getEnergyUnbroadened(L2)
                   IF (Xx.GE.eL1) RETURN
                   WRITE (6,10000) L1, eL1, Xx, L2, eL2
                   STOP '[Stop in Find_L in clm/mclm8.f    # 5]'
                END IF
             END DO
-            eL2 = grid%getEnergy(numEl, expData)
+            eL2 = calc%getEnergyUnbroadened(numEl)
             WRITE (6,10100) numEl, eL2, Xx
 10100       FORMAT (' Eb(', I5, ')=',1PG14.6,'   Xx=', 1PG14.6)
             L1 = numEl - 1
             L2 = numEl
-cx            STOP '[Stop in Find_L in clm/mclm8.f    # 6]'
+!x            STOP '[Stop in Find_L in clm/mclm8.f    # 6]'
          END IF
       END IF
       RETURN
       END
+end module mcml8_m
diff --git a/sammy/src/clm/mclm8a.f90 b/sammy/src/clm/mclm8a.f90
index 663426350013c5c8761ad222a414a6abfe1640af..af60f35106e3108ce5c57fa804769a194a05f750 100644
--- a/sammy/src/clm/mclm8a.f90
+++ b/sammy/src/clm/mclm8a.f90
@@ -1,4 +1,12 @@
 module Qtrap_Clm_m
+  use CrystalLatticeBroadening_M
+  use fixedr_m, only : Aaawww
+  use constn_common_m, only : Aneutr
+  use DerivativeHandler_M
+  use mcml8_m
+  use, intrinsic :: ISO_C_BINDING
+  IMPLICIT none
+
   private
   public Qtrap_Clm
   contains
@@ -6,8 +14,8 @@ module Qtrap_Clm_m
 !
 ! -----------------------------------------------------------------
 !
-      SUBROUTINE Qtrap_Clm (tmpCalc, derivs,           &
-         Bs, Ss, Tevx, Tempx, Em, C_Norm, Ktempx, Na,  &
+      SUBROUTINE Qtrap_Clm (calc, tmpCalc, derivs,           &
+         Tevx, Tempx, Em, C_Norm, Ktempx, Na,  &
          Isox, Locate, Ns, derivsNew, irow)
 !
 !     ***  INTEGRATION BY TRAPEZOIDAL METHOD
@@ -19,36 +27,23 @@ module Qtrap_Clm_m
 !     *** Bs     - Beta array (variable of integration)
 !     *** Ss     - Weighting function (S_alpha_beta)
 !
-      use fixedi_m, only : numUsedPar
-      use fixedr_m, only : Aaawww
-      use clm_common_m, only : Dwpix, Eps, Mode_S_Norm
-      use constn_common_m, only : Aneutr
-      use SammyGridAccess_M
-      use EndfData_common_m
-      use DerivativeHandler_M
-      use, intrinsic :: ISO_C_BINDING
-      IMPLICIT None
+      class(CrystalLatticeBroadening)::calc
       INTEGER Ktempx, Na, Isox, Locate, Ns
-      DOUBLE PRECISION Bs(*), Ss(*)
       DOUBLE PRECISION Tevx, Tempx, Em, C_Norm
       DOUBLE PRECISION S, Olds, Xxa, Xxb, Del, Sel, E_Prime
       DOUBLE PRECISION Aaa, Xx, Yy, val
       INTEGER Jmax, Ibet, Lstart, L1, L2, irow, Ipar, N
-      type(SammyGridAccess)::grid
       type(DerivativeHandler)::derivs, derivsNew, tmpCalc
       real(kind=8),parameter:: Zero=0.0d0, Half=0.5d0, One=1.0d0
       real(kind=8)::Alpha, Recul
       integer::It, J, Jj, L1er, L2er, Nax, numEl
       logical(C_BOOL)::accu
-!
-      call grid%initialize()
-      call grid%setToAuxGrid(expData)
 !
       L1er = 0
       L2er = 0
       Nax = derivsNew%getNnnsig()      
       call tmpCalc%setNnsig(Nax)
-      call tmpCalc%reserve(Nax, numUsedPar+1)
+      call tmpCalc%reserve(Nax, calc%numPar+1)
       IF (Locate.NE.0) Nax = 1
 !
       Lstart = 1
@@ -58,20 +53,20 @@ module Qtrap_Clm_m
 !
          call tmpCalc%nullify()
 !
-         Xxa = Bs(Ibet)
-         Xxb = Bs(Ibet+1)
+         Xxa = calc%Bs(Ibet)
+         Xxb = calc%Bs(Ibet+1)
          Del = Xxb - Xxa
          Aaa = Del*Half
 !
 ! ***    First Point (Xxa)
             Xx = Em + Xxa
-            Call Find_L (grid, Xx, L1, L2, Lstart, L1er, L2er)
+            Call Find_L (calc, Xx, L1, L2, Lstart, L1er, L2er)
             Lstart = L1
-            Yy = Ss(Ibet)
+            Yy = calc%Ss(Ibet)
             IF (Yy.EQ.Zero) THEN
             ELSE
                Yy = Yy*Aaa
-               Call Sig_Int (grid, tmpCalc, derivs,        &
+               Call Sig_Int (calc, tmpCalc, derivs,        &
                   Tempx, Xx, Yy, Ktempx, Na, Isox,         &
                   Locate, L1, L2, 1, 1)
             END IF
@@ -79,12 +74,12 @@ module Qtrap_Clm_m
 !
 ! ***    Last Point (Xxb)
             Xx = Em + Xxb
-            Call Find_L (grid, Xx, L1, L2, Lstart, L1er, L2er)
-            Yy = Ss(Ibet+1)
+            Call Find_L (calc, Xx, L1, L2, Lstart, L1er, L2er)
+            Yy = calc%Ss(Ibet+1)
             IF (Yy.EQ.Zero) THEN
             ELSE
                Yy = Yy*Aaa
-               Call Sig_Int (grid, tmpCalc,  derivs,  &
+               Call Sig_Int (calc, tmpCalc,  derivs,  &
                   Tempx, Xx, Yy, Ktempx, Na, Isox,    &
                   Locate, L1, L2, 1, 1)
             END IF
@@ -97,7 +92,7 @@ module Qtrap_Clm_m
             E_Prime = Xxa + Half*Del
 !
 ! ***       Take half of what's already there
-            do ipar = 0, numUsedPar
+            do ipar = 0, calc%numPar
                do N = 1, Nax
                  val = tmpCalc%getDataNs(1, N, ipar, 1)*Half
                 if (val.eq.0.0d0) cycle
@@ -108,14 +103,14 @@ module Qtrap_Clm_m
             DO Jj=1,It
 !
 ! ***          Find multiplier Yy
-               IF (Ss(Ibet).EQ.Zero) THEN
+               IF (calc%Ss(Ibet).EQ.Zero) THEN
                   Yy = Zero
                ELSE
-                  Yy = Ss(Ibet)*(Xxb-E_Prime)
+                  Yy = calc%Ss(Ibet)*(Xxb-E_Prime)
                END IF
-               IF (Ss(Ibet+1).EQ.Zero) THEN
+               IF (calc%Ss(Ibet+1).EQ.Zero) THEN
                ELSE
-                  Yy = Yy + Ss(Ibet+1)*(E_Prime-Xxa)
+                  Yy = Yy + calc%Ss(Ibet+1)*(E_Prime-Xxa)
                END IF
 !
 ! ***          Add new piece
@@ -123,9 +118,9 @@ module Qtrap_Clm_m
                ELSE
                   Yy = Yy*Aaa
                   Xx = Em + E_Prime
-                  Call Find_L (grid, Xx, L1, L2, Lstart, L1er, L2er)
+                  Call Find_L (calc, Xx, L1, L2, Lstart, L1er, L2er)
 
-                  Call Sig_Int (grid, tmpCalc,  derivs,          &
+                  Call Sig_Int (calc, tmpCalc,  derivs,          &
                                 Tempx, Xx, Yy, Ktempx, Nax, Isox, &
                                 Locate, L1, L2, 1, 1)
                END IF
@@ -134,7 +129,7 @@ module Qtrap_Clm_m
             END DO
 !
             S = tmpCalc%getDataNs(1,1,0,1)
-            IF (ABS(S-Olds).LT.Eps*ABS(Olds)) GO TO 10
+            IF (ABS(S-Olds).LT.calc%Eps*ABS(Olds)) GO TO 10
             It = It*2
             Aaa = Aaa*Half
             Del = Del*Half
@@ -147,7 +142,7 @@ module Qtrap_Clm_m
 
          accu = .true.
          call derivsNew%setAccumulate(accu)
-         do ipar = 0, numUsedPar
+         do ipar = 0, calc%numPar
             do N = 1, Nax
               val = tmpCalc%getDataNs(1, N, ipar, 1)
              if (val.eq.0.0d0) cycle
@@ -166,11 +161,11 @@ module Qtrap_Clm_m
       Recul = Em*(Aneutr/(Aaawww+Aneutr))
       Alpha = Recul/Tevx
 !
-      Sel = dEXP(-Dwpix*Alpha)
-      IF (Mode_S_Norm.EQ.0) THEN
-      ELSE IF (Mode_S_Norm.EQ.1) THEN
+      Sel = dEXP(-calc%Dwpix*Alpha)
+      IF (calc%Mode_S_Norm.EQ.0) THEN
+      ELSE IF (calc%Mode_S_Norm.EQ.1) THEN
          Yy = (One-Sel)/(C_Norm-Sel)
-         do ipar = 0, numUsedPar
+         do ipar = 0, calc%numPar
             do N = 1, Nax
                val = Yy * derivsNew%getDataNs( irow, N, Ipar, Isox)
                if (val.eq.0.0d0) cycle
@@ -183,25 +178,23 @@ module Qtrap_Clm_m
 !     Sigman(Em+Recul)*EXP(-W*A)
       Xx = Em + Recul
       Yy = Sel
-      Call Find_L (grid, Xx, L1, L2, Lstart, L1er, L2er)
-      Call Sig_Int (grid, derivsNew, derivs,          &
+      Call Find_L (calc, Xx, L1, L2, Lstart, L1er, L2er)
+      Call Sig_Int (calc, derivsNew, derivs,          &
                     Tempx, Xx, Yy, Ktempx, Na, Isox,  &
                     Locate, L1, L2, irow, Isox)
 !
       IF (L1er.GT.0) THEN
-         WRITE (6,10100) L1er, Em, grid%getEnergy(1, expData)
+         WRITE (6,10100) L1er, Em,  calc%getEnergyUnbroadened(1)
 10100    FORMAT ('###', I5, '= number of omitted terms', 1X,  &
                  'for E=', 1PG13.5, ' at Eb(1)=', 1PG13.5)
       END IF
       IF (L2er.GT.0) THEN
-         numEl = grid%getNumEnergies(expData)
+         numEl = calc%getNumEnergyUnbroadened()
          WRITE (6,10200) L2er, numEl, Em,             &
-                     grid%getEnergy(numEl, expData)   
+                     calc%getEnergyUnbroadened(numEl)
 10200    FORMAT ('###', I5, '= omitted terms', 1X,    &
                  'for E=', 1PG13.5, ' at Eb(', I5, ')=', 1PG13.5)
       END IF
-!
-      call grid%destroy()
 
       RETURN
       END SUBROUTINE Qtrap_Clm
@@ -210,20 +203,14 @@ module Qtrap_Clm_m
 !
 ! -----------------------------------------------------------------
 !
-      SUBROUTINE Sig_Int_L (grid, tmpCalc, derivs,    &
+      SUBROUTINE Sig_Int_L (calc, tmpCalc, derivs,    &
          Tempx, Xx, Yy, Ktempx, Na, Isox,             &
          Locate, L1, L2, irow, ourIso)
 !
 ! *** Purpose -- Linear interpolate to get CrossSection(Xx) using
 ! ***              CrossSection(Energb(L1)) and CrossSection(Energb(L2))
 !
-      use fixedi_m, only : numUsedPar
-      use constn_common_m
-      use SammyGridAccess_M
-      use EndfData_common_m
-      use DerivativeHandler_M
-      IMPLICIT none
-      type(SammyGridAccess)::grid
+      class(CrystalLatticeBroadening)::calc
       INTEGER Ktempx, Na, Isox, Locate, L1, L2
       type(DerivativeHandler)::derivs, tmpCalc
       real(kind=8)::Tempx, Xx, Yy
@@ -237,8 +224,8 @@ module Qtrap_Clm_m
          Aa(1) = Yy
          Aa(2) = Zero
       ELSE
-         E1 = grid%getEnergy(L1, expData)
-         E2 = grid%getEnergy(L2, expData)
+         E1 = calc%getEnergyUnbroadened(L1)
+         E2 = calc%getEnergyUnbroadened(L2)
          D  = E2 - E1
          Aa(1) = (E2-Xx)/D * Yy
          Aa(2) = (Xx-E1)/D * Yy
@@ -249,7 +236,7 @@ module Qtrap_Clm_m
 ! ***
 ! ---
          ! update cross section (ipar=0) as well as derivatives
-         do Ipar = 0, numUsedPar
+         do Ipar = 0, calc%numPar
             DO N=1,Na
                L = 0
                val = 0.0d0
@@ -267,7 +254,7 @@ module Qtrap_Clm_m
 ! ***
 ! ---
          ! update cross section (ipar=0) as well as derivatives
-         do Ipar = 0, numUsedPar
+         do Ipar = 0, calc%numPar
              L = 0
              val = 0.0d0
              DO LL=L1,L2
@@ -287,21 +274,14 @@ module Qtrap_Clm_m
 !
 ! -----------------------------------------------------------------
 !
-      SUBROUTINE Sig_Int (grid, tmpCalc, derivs,    &
+      SUBROUTINE Sig_Int (calc, tmpCalc, derivs,    &
          Tempx, Xx, Yy, Ktempx, Na, Isox,           &
          Locate, L1, L2, irow, ourIso)
 !
 ! *** Purpose -- Quadratic interpolate to get CrossSection(Xx) using
 ! ***              CrossSection(Energb(L1-1)) to CrossSection(Energb(L2+1))
 !
-      use fixedi_m, only : numUsedPar
-      use constn_common_m
-      use SammyGridAccess_M
-      use EndfData_common_m
-      use DerivativeHandler_M
-      use, intrinsic :: ISO_C_BINDING
-      IMPLICIT none
-      type(SammyGridAccess)::grid
+      class(CrystalLatticeBroadening)::calc
       INTEGER Ktempx, Na, Isox, Locate, L1, L2
       real(kind=8)::Tempx, Xx, Yy
       type(DerivativeHandler)::derivs, tmpCalc
@@ -313,19 +293,19 @@ module Qtrap_Clm_m
       logical(C_BOOL)::accu
 
 !
-      Ndatb  = grid%getNumEnergies(expData)
+      Ndatb  = calc%getNumEnergyUnbroadened()
       IF (L1.EQ.1 .OR. L2.EQ.Ndatb .OR. L1.EQ.L2) THEN
-         CALL Sig_Int_L (grid, tmpCalc, derivs,  &
+         CALL Sig_Int_L (calc, tmpCalc, derivs,  &
             Tempx, Xx, Yy, Ktempx, Na, Isox,     &
             Locate, L1, L2, irow, ourIso)
          RETURN
       END IF
 !
       Iso = Isox
-      E1 = grid%getEnergy(L1-1, expData)
-      E2 = grid%getEnergy(L1  , expData)
-      E3 = grid%getEnergy(L2  , expData)
-      E4 = grid%getEnergy(L2+1, expData)
+      E1 = calc%getEnergyUnbroadened(L1-1)
+      E2 = calc%getEnergyUnbroadened(L1)
+      E3 = calc%getEnergyUnbroadened(L2)
+      E4 = calc%getEnergyUnbroadened(L2+1)
 !
       D21 = E2 - E1
       D32 = E3 - E2
@@ -353,7 +333,7 @@ module Qtrap_Clm_m
 ! ***
 ! ---
          ! update cross section (ipar=0) as well as derivatives
-         Do Ipar = 0, numUsedPar
+         Do Ipar = 0, calc%numPar
            DO N=1,Na
               L = 0
               val = 0.0d0
@@ -371,7 +351,7 @@ module Qtrap_Clm_m
 !     IF (Locate.NE.0) THEN
 ! ***
          ! update cross section (ipar=0) as well as derivatives
-         Do Ipar = 0, numUsedPar
+         Do Ipar = 0, calc%numPar
             L = 0
             val = 0.0d0
             DO LL=L1-1,L2+1
diff --git a/sammy/src/cro/mcro5.f90 b/sammy/src/cro/mcro5.f90
index b96d0626a33445d2f05f011b6fdb9d0a0a8aa3b0..c708f3fcf0bcd289bdd0ec783e150c5e9ba681a3 100644
--- a/sammy/src/cro/mcro5.f90
+++ b/sammy/src/cro/mcro5.f90
@@ -163,6 +163,7 @@ end module sumAndConvertAfterBroadening_m
       use broad_common_m
       use samdbd_m
       use Samfgm_0_m
+      use Samclm_m
       use FreeGasDopplerBroadening_M
       use DopplerAndResolutionBroadener_M
       use GridData_M
@@ -257,7 +258,7 @@ end module sumAndConvertAfterBroadening_m
          else IF ( dopplerOption%bType.EQ.2)  then
             call Samfgm_0(dopplerOption%freeGas)            
          else IF ( dopplerOption%bType.EQ.3) then
-            call Samclm_0                     
+            call Samclm_0(dopplerOption%crystalLattice)
          end if
          call sumAndConvertAfterBroadening(moreBroadening, Yssmsc, dopplerOption%broadener)
 
diff --git a/sammy/src/dbd/HighEnergyFreeGas_m.f90 b/sammy/src/dbd/HighEnergyFreeGas_m.f90
index 293fbcd84ea30bc89b769bf6655229c31931418a..65d4210abd11ebc35e175a407935887859d862be 100644
--- a/sammy/src/dbd/HighEnergyFreeGas_m.f90
+++ b/sammy/src/dbd/HighEnergyFreeGas_m.f90
@@ -41,7 +41,6 @@ subroutine HighEnergyFreeGas_broaden(this)
 
    ! reserve the data
    ndatb =  this%getNumEnergyBroadened()
-   write(0,*)"  I am called !!!!"
    call this%getData(data)
    call data%nullify()
    call data%reserve(ndatb*data%getNnnsig(), this%numPar+1)
diff --git a/sammy/src/fgm/FreeGasDopplerBroadening_M.f90 b/sammy/src/fgm/FreeGasDopplerBroadening_M.f90
index ef6b5e421b7c27397e1952aa0a91d4afcfa65124..bee13b3510fca9e246f6a7fb5d6cbc7388ef1707 100644
--- a/sammy/src/fgm/FreeGasDopplerBroadening_M.f90
+++ b/sammy/src/fgm/FreeGasDopplerBroadening_M.f90
@@ -36,6 +36,7 @@ subroutine FreeGasDopplerBroadening_initialize(this, hand, list, work)
     call DopplerBroadening_initialize(this, hand, list, work)
     this%debugOutput = .false.
     this%Elowbr = 0.0d0
+    this%numPar = 0
 end subroutine
 
 subroutine FreeGasDopplerBroadening_destroy(this)