diff --git a/sammy/samtry/tr057/answers/rr.lpt b/sammy/samtry/tr057/answers/rr.lpt index ac4b9c6f414685a202167c66edd8989f4a9ff8a2..09b430293d4451329d5d8040eafa297db9ca4051 100755 --- a/sammy/samtry/tr057/answers/rr.lpt +++ b/sammy/samtry/tr057/answers/rr.lpt @@ -632,9 +632,9 @@ __________________________ DeltaG = 0.00000 DeltaE = 0.00000 Emind Emins Eminr Emin - 1300695.1778912749 1300970.2343750000 1300970.2343750000 1300970.2343750000 + 1300695.1778912698 1300970.2343750000 1300970.2343750000 1300970.2343750000 Emax Emaxr Emaxs Emaxd - 1699256.5312500000 1699256.5312500000 1699256.5312500000 1699570.9154586825 + 1699256.5312500000 1699256.5312500000 1699256.5312500000 1699570.9154586885 DOPPLER WIDTHS Nuclide Doppler Width (eV) Doppler FWHM (eV) diff --git a/sammy/samtry/tr057/answers/rr.par b/sammy/samtry/tr057/answers/rr.par index 4af81c87d927604241012c9153b249c40853295c..2d8e9b3ef486d19259c8d6c2f1f8ac25fb78eb58 100755 --- a/sammy/samtry/tr057/answers/rr.par +++ b/sammy/samtry/tr057/answers/rr.par @@ -132,6 +132,6 @@ BROADENING PARAMETERS FOLLOW MISCEllaneous parameters follow SELFI 1 1 291.84018 10.000000 1.5065823 .30000000 -SIABN 1 1 .93223521 .20000000 2.0141045 .20000000 +SIABN 1 1 .93223522 .20000000 2.0141045 .20000000 COVARIANCE MATRIX IS IN BINARY FORM diff --git a/sammy/samtry/tr057/answers/rt.lpt b/sammy/samtry/tr057/answers/rt.lpt index 7c61b91074eee7368ef0a2fde9d842dc32c61cbf..32785e4f44ffe70ef2038366f24360312b82718c 100755 --- a/sammy/samtry/tr057/answers/rt.lpt +++ b/sammy/samtry/tr057/answers/rt.lpt @@ -639,9 +639,9 @@ __________________________ DeltaG = 0.00000 DeltaE = 0.00000 Emind Emins Eminr Emin - 1300379.4359482517 1300616.4825519433 1300616.4825519433 1300970.2031250000 + 1300379.4359482457 1300616.4825519689 1300616.4825519689 1300970.2031250000 Emax Emaxr Emaxs Emaxd - 1699256.7968750000 1699718.8075240660 1699718.8075240660 1699989.8171710928 + 1699256.7968750000 1699718.8075240324 1699718.8075240324 1699989.8171710952 DOPPLER WIDTHS Nuclide Doppler Width (eV) Doppler FWHM (eV) diff --git a/sammy/samtry/tr057/answers/rt.par b/sammy/samtry/tr057/answers/rt.par index 2f57a9749b4d53e4b980b6d1be9eac1307b9c03b..8ffeb708031c0d6299d4617fbadd25bb9cbefa8f 100755 --- a/sammy/samtry/tr057/answers/rt.par +++ b/sammy/samtry/tr057/answers/rt.par @@ -131,7 +131,7 @@ BROADENING PARAMETERS FOLLOW 4.13642000 79.376032 .01060163 .00532793 0. 0. 0 1 1 1 0 0 MISCEllaneous parameters follow -SELFI 1 1 271.05828 10.000000 1.4981596 .30000000 -SIABN 1 1 .93136162 .20000000 2.0214670 .20000000 +SELFI 1 1 271.05828 10.000000 1.4981595 .30000000 +SIABN 1 1 .93136160 .20000000 2.0214670 .20000000 COVARIANCE MATRIX IS IN BINARY FORM diff --git a/sammy/samtry/tr057/answers/rv.lpt b/sammy/samtry/tr057/answers/rv.lpt index daea8273fc469c427a88735be2af4d3f7230dd61..5d92ab6c53a4a40255f5d2d4676c911247523dba 100755 --- a/sammy/samtry/tr057/answers/rv.lpt +++ b/sammy/samtry/tr057/answers/rv.lpt @@ -644,9 +644,9 @@ __________________________ DeltaG = 0.00000 DeltaE = 0.00000 Emind Emins Eminr Emin - 1125646.9042793550 1125898.1216265869 1300641.2301131238 1300970.1718750000 + 1125646.9042793582 1125898.1216265932 1300641.2301131312 1300970.1718750000 Emax Emaxr Emaxs Emaxd - 1699256.9218750000 1699686.5678252652 1699686.5678252652 1699995.2620073126 + 1699256.9218750000 1699686.5678252554 1699686.5678252554 1699995.2620073061 DOPPLER WIDTHS Nuclide Doppler Width (eV) Doppler FWHM (eV) diff --git a/sammy/samtry/tr057/answers/rw.lpt b/sammy/samtry/tr057/answers/rw.lpt index 6b8cd836b8d38067d1e74d302648942041ec4f28..75e935d85c047d0c59f286690b0bf2f96813b20c 100755 --- a/sammy/samtry/tr057/answers/rw.lpt +++ b/sammy/samtry/tr057/answers/rw.lpt @@ -657,7 +657,7 @@ __________________________ DeltaG = 0.00000 DeltaE = 0.00000 Emind Emins Eminr Emin - 1125646.8946453319 1125898.1094657907 1300641.2160649318 1300970.1718750000 + 1125646.8946453319 1125898.1094657909 1300641.2160649321 1300970.1718750000 Emax Emaxr Emaxs Emaxd 1699256.9218750000 1699686.5861742541 1699686.5861742541 1699995.2772544394 @@ -685,5 +685,5 @@ __________________________ No resolution broadening occured 403 times of a possible 1061 CUSTOMARY CHI SQUARED = 5.58549 - CUSTOMARY CHI SQUARED DIVIDED BY NDAT = 5.264365E-03 + CUSTOMARY CHI SQUARED DIVIDED BY NDAT = 5.264364E-03 Normal finish to SAMMY diff --git a/sammy/samtry/tr066/answers/rd4.lpt b/sammy/samtry/tr066/answers/rd4.lpt index 67cefdd0363da4fd2fd4d920bdf33c4a9e244be3..047270fe41d3a883be999ea3c16b1dcec9f811d0 100755 --- a/sammy/samtry/tr066/answers/rd4.lpt +++ b/sammy/samtry/tr066/answers/rd4.lpt @@ -5946,7 +5946,7 @@ There are no non-zero derivatives of this type for this nuclide. 37 1147.68 -4.83549E-07 -4.4134 0.0000 0.0000 38 1147.90 -5.57323E-07 -4.4161 0.0000 0.0000 39 1148.11 -6.45681E-07 -4.4192 0.0000 0.0000 - 40 1148.32 -7.52686E-07 -4.4226 0.0000 0.0000 + 40 1148.32 -7.52685E-07 -4.4226 0.0000 0.0000 41 1148.54 -8.83582E-07 -4.4265 0.0000 0.0000 42 1148.75 -1.04595E-06 -4.4310 0.0000 0.0000 43 1148.97 -1.24802E-06 -4.4360 0.0000 0.0000 @@ -5987,7 +5987,7 @@ There are no non-zero derivatives of this type for this nuclide. 78 1154.42 3.27282E-04 -8.2569 0.0000 0.0000 79 1154.49 3.19437E-04 -8.2359 0.0000 0.0000 80 1154.56 3.06235E-04 -8.2003 0.0000 0.0000 - 81 1154.63 2.88023E-04 -8.1504 0.0000 0.0000 + 81 1154.63 2.88022E-04 -8.1504 0.0000 0.0000 82 1154.71 2.65229E-04 -8.0865 0.0000 0.0000 83 1154.78 2.38412E-04 -8.0089 0.0000 0.0000 84 1154.85 2.08206E-04 -7.9184 0.0000 0.0000 @@ -6420,7 +6420,7 @@ There are no non-zero derivatives of this type for this nuclide. 113 1165.87 -4.80913E-08 -4.3662 -4.02124E-04 -1.69146E-04 114 1166.09 -4.45277E-08 -4.3654 -3.85219E-04 -1.62066E-04 115 1166.31 -4.13024E-08 -4.3647 -3.69154E-04 -1.55336E-04 - 116 1166.53 -3.83672E-08 -4.3641 -3.54259E-04 -1.49096E-04 + 116 1166.53 -3.83671E-08 -4.3641 -3.54259E-04 -1.49096E-04 117 1166.75 -3.56760E-08 -4.3634 -3.41151E-04 -1.43606E-04 118 1166.97 -3.32300E-08 -4.3628 -3.28165E-04 -1.38166E-04 119 1167.19 -3.09814E-08 -4.3622 -3.16434E-04 -1.33252E-04 diff --git a/sammy/samtry/tr066/answers/re1.lpt b/sammy/samtry/tr066/answers/re1.lpt index 65146c6fc3f0a70106cbc56b411295320dae70a3..463cbd6a62306b8c0346d6249135ec5be5c14fae 100755 --- a/sammy/samtry/tr066/answers/re1.lpt +++ b/sammy/samtry/tr066/answers/re1.lpt @@ -657,7 +657,7 @@ __________________________ DeltaG = 0.00000 DeltaE = 0.00000 Emind Emins Eminr Emin - 1125646.8946453319 1125898.1094657907 1300641.2160649318 1300970.1718750000 + 1125646.8946453319 1125898.1094657909 1300641.2160649321 1300970.1718750000 Emax Emaxr Emaxs Emaxd 1699256.9218750000 1699686.5861742541 1699686.5861742541 1699995.2772544394 @@ -685,5 +685,5 @@ __________________________ No resolution broadening occured 403 times of a possible 1061 CUSTOMARY CHI SQUARED = 5.58549 - CUSTOMARY CHI SQUARED DIVIDED BY NDAT = 5.264365E-03 + CUSTOMARY CHI SQUARED DIVIDED BY NDAT = 5.264364E-03 Normal finish to SAMMY diff --git a/sammy/samtry/tr066/answers/re2.lpt b/sammy/samtry/tr066/answers/re2.lpt index 2edede468642c9b835c002fe1f930eb181915ec5..20ab10a1eb2fe08917177322f8e1dc1684baa8b7 100755 --- a/sammy/samtry/tr066/answers/re2.lpt +++ b/sammy/samtry/tr066/answers/re2.lpt @@ -653,9 +653,9 @@ __________________________ DeltaG = 0.00000 DeltaE = 0.00000 Emind Emins Eminr Emin - 1125647.5568195195 1125898.2589740690 1300641.3887773890 1300970.1718750000 + 1125647.5568195069 1125898.2589740823 1300641.3887774043 1300970.1718750000 Emax Emaxr Emaxs Emaxd - 1699256.9218750000 1699686.3605865778 1699686.3605865778 1699994.4216018277 + 1699256.9218750000 1699686.3605865578 1699686.3605865578 1699994.4216018401 DOPPLER WIDTHS Nuclide Doppler Width (eV) Doppler FWHM (eV) diff --git a/sammy/samtry/tr066/answers/re2.par b/sammy/samtry/tr066/answers/re2.par index ea9535279cf6bb03a9753591e12d250b0af1d882..8779c799ef13db29509a3a8ebc4b77c3e5a9e0d6 100755 --- a/sammy/samtry/tr066/answers/re2.par +++ b/sammy/samtry/tr066/answers/re2.par @@ -34,18 +34,18 @@ 1201238.750 3600.00000 4601200.00 0 0 0 1 1256447.250 3600.00000 17383000.0 0 0 0 1 1264441.750 1000.00000 843640.000 0 0 0 5 -1379920.000 2336.86209 65316.8563 0 1 1 4 -1408269.750 2661.70878 5192382.28 0 1 1 3 -1479927.250 1617.76933 3467622.45 0 1 1 4 -1482395.375 8873.00371 848.797549 0 1 1 2 -1512343.875 981.898836 91322.4810 0 1 1 5 -1528742.375 2356.25066 2926488.06 0 1 1 4 +1379920.000 2336.86210 65316.8563 0 1 1 4 +1408269.750 2661.70879 5192382.28 0 1 1 3 +1479927.250 1617.76934 3467622.45 0 1 1 4 +1482395.375 8873.00371 848.797551 0 1 1 2 +1512343.875 981.898838 91322.4810 0 1 1 5 +1528742.375 2356.25067 2926488.06 0 1 1 4 1580564.875 2308.13029 1488424.15 0 1 1 4 -1592844.250 8533.33865 11352161.1 0 1 1 2 -1597168.625 2349.29295 4010869.82 0 1 1 4 +1592844.250 8533.33866 11352161.1 0 1 1 2 +1597168.625 2349.29296 4010869.82 0 1 1 4 1639561.500 1001.74135 15156653.0 0 1 1 5 1651146.000 936.099135 21193334.1 0 1 1 5 -1658595.000 8342.63175 1553560.29 0 1 1 2 +1658595.000 8342.63176 1553560.29 0 1 1 2 1664961.125 2227.70639 214172.246 0 1 1 4 1784952.750 2400.00000 192940.000 0 0 0 4 1805652.625 2500.00000 1299100.00 0 0 0 3 diff --git a/sammy/samtry/tr066/answers/re4.lpt b/sammy/samtry/tr066/answers/re4.lpt index 7fa309c424512ff0bb2a095be0419a8a44087622..2c10878563173683962ebf2bf0f4b9391e7eee3b 100755 --- a/sammy/samtry/tr066/answers/re4.lpt +++ b/sammy/samtry/tr066/answers/re4.lpt @@ -1977,7 +1977,7 @@ __________________________ 179 1.386790E+06 2.96263E-15 -6.48497E-18 -1.48666E-08 -6.17824E-09 180 1.388091E+06 3.10144E-15 -3.94101E-18 -1.59591E-08 -6.62488E-09 181 1.389260E+06 3.27935E-15 -2.06439E-18 -1.71658E-08 -7.11504E-09 - 182 1.390430E+06 3.46835E-15 -5.14339E-20 -1.86355E-08 -7.70845E-09 + 182 1.390430E+06 3.46835E-15 -5.14336E-20 -1.86355E-08 -7.70845E-09 183 1.391497E+06 3.64624E-15 1.78005E-18 -2.02573E-08 -8.35957E-09 184 1.392564E+06 3.85081E-15 4.04813E-18 -2.22192E-08 -9.14288E-09 185 1.393525E+06 4.03824E-15 5.82698E-18 -2.43609E-08 -9.99362E-09 diff --git a/sammy/src/amr/mamr2.f90 b/sammy/src/amr/mamr2.f90 index 73b31a1eb70f45922189e6ade6dd4a0674538ccd..2be1722f888d6bd71c061ad7f8fa825dd05afcf7 100644 --- a/sammy/src/amr/mamr2.f90 +++ b/sammy/src/amr/mamr2.f90 @@ -222,6 +222,9 @@ module amr2 ! call radFitFlags%addMatchingRadius(Dum(1)) Temp = Dum(2) + if (associated(dopplerInfo%broadener)) then + call dopplerInfo%broadener%setTemperature(temp) + end if Thick = Dum(3) Deltal = Dum(4) Deltag = Dum(5) @@ -231,6 +234,11 @@ module amr2 Co2 = Dum(9) Do2 = Dum(10) Dopple = Dum(11) + if (Dopple.ne.0.0d0) then + dopplerInfo%wantBroaden = .true. + else + dopplerInfo%wantBroaden = .false. + end if call radFitFlags%setMatchingK(Dum(12)) Dist = Dum(13) Anorm = Dum(14) diff --git a/sammy/src/ang/mang0.f b/sammy/src/ang/mang0.f index 676deda549b3bfc74ff1f955b1f69bc5bb7bae15..386cededc659bed30bf6d5a136a6992167bee496 100644 --- a/sammy/src/ang/mang0.f +++ b/sammy/src/ang/mang0.f @@ -2,15 +2,14 @@ C C SUBROUTINE Samang_0 C - use fixedi_m, only : Ifdif, Jwwwww, K2reso, Kkkdex, + use fixedi_m, only : Ifdif, K2reso, Kkkdex, * Kkkrsl, Lllmax, Nangle, * Nudwhi, Numcro, * Numorr, Numrpi - use ifwrit_m, only : Kkkdop use exploc_common_m use array_sizes_common_m use oopsch_common_m, only : Nowwww, Segmen - use lbro_common_m, only : Debug, Ydoppr, Yresol + use lbro_common_m, only : Debug use AuxGridHelper_M, only : getNumAuxGridPoints use rsl7_m, only : Set_Kws use mxct27_m @@ -87,9 +86,7 @@ C C C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > C -C - Jwwwww = 9 - Numcro = Nangle +C CALL Write_Commons_Many C END diff --git a/sammy/src/ang/mang1.f b/sammy/src/ang/mang1.f index a77049d17f5d5473d0047381525858552bc7ce72..a68607376df99d6ea4ed0ca2be891d1b7e79a38b 100644 --- a/sammy/src/ang/mang1.f +++ b/sammy/src/ang/mang1.f @@ -50,10 +50,8 @@ C call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToExpGrid(expData) call auxGrid%initialize() - call auxGrid%setParameters(numcro, ktzero) call auxGrid%setToAuxGrid(expData) C Kkkmin = 0 @@ -195,18 +193,6 @@ C 190 CONTINUE END DO C *** end of loop on isotopes -C - if (.not.Another_Process_Will_Happen.or. - * .not.Need_Isotopes) then - call calcData%sumOverIsotopes(numUsedPar+1) - end if - if (.not.Another_Process_Will_Happen) then - DO Jdat=1, grid%getNumEnergies(expData) - Em = grid%getEnergy(Jdat, expData) - CALL Only_Norm_Ang (Parnbk, Iflnbk, - * Em, Jdat, Jdat, Nangle) - end do - end if nauxStart = getAuxGridOffset() nauxStart = nauxStart + Kkkmin - 1 @@ -214,11 +200,9 @@ C call setAuxGridOffset(nauxStart) call setAuxGridRowMax(Kkkdat - 1) IF (Kkkdat.EQ.1) STOP '[STOP in Diffee in ang/mang1.f # 4]' - IF (Another_Process_Will_Happen) THEN - Kkkmin = Kkkmin - 1 - CALL Write_Cross_Sections (calcData, - * Kkkkkk, Kkkmin, 0) - END IF + + Kksave = Kkkkkk + call grid%destroy() call auxGrid%destroy() RETURN diff --git a/sammy/src/ang/mang2.f b/sammy/src/ang/mang2.f index 2480ffb55d4ad95ad7b8aba6e2c029e8b24a09a4..f3ffae8ea1b12758371888fe811906f0e2ce8e08 100644 --- a/sammy/src/ang/mang2.f +++ b/sammy/src/ang/mang2.f @@ -75,8 +75,8 @@ C SUBROUTINE Outnat (Parmsc, Iflmsc, * Total, Dtotal, Prime, Ee, Jjdat, irow, iso) C - use fixedi_m, only : Nangle, numcro, numUsedPar - use ifwrit_m, only : Nnpar, Kjatto, ktzero + use fixedi_m, only : Nangle, numUsedPar + use ifwrit_m, only : Nnpar, Kjatto use EndfData_common_m, only : covData, expData use SammyGridAccess_M use array_sizes_common_m, only : calcData @@ -97,8 +97,7 @@ C *** Theta-Dtheta to Theta+Dtheta. This is not really correct, but C *** corresponds to what FGP (Francis Perey?) did in RFUNC. C N = Jjdat - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) Kkk = Kjatto - 1 DO Iangle=1,Nangle diff --git a/sammy/src/avg/mavg4.f b/sammy/src/avg/mavg4.f index 2a5169da25bdcc05b644df5bab6cc09ce5c4c4b5..9af17cf83fbc726d61bcc9a59ae942524b5797ba 100644 --- a/sammy/src/avg/mavg4.f +++ b/sammy/src/avg/mavg4.f @@ -60,7 +60,6 @@ C * Emn(Ndatq), Emx(Ndatq), Deld(Ndatq), Delu(Ndatq) DATA Half /0.5d0/, Three /3.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) C C @@ -188,8 +187,7 @@ C * Emn(Ndatq), Emx(Ndatq), Deld(Ndatq), Delu(Ndatq) * Emx(*), Deld(*), Delu(*) DATA One /1.0d0/, Two /2.0d0/ - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) C C diff --git a/sammy/src/blk/Abro_common.f90 b/sammy/src/blk/Abro_common.f90 index 46317cb405bef50234f972dba0fd2213c789bc23..9c70f35d297d7f53a680a98b7c1d7d374fccf47e 100644 --- a/sammy/src/blk/Abro_common.f90 +++ b/sammy/src/blk/Abro_common.f90 @@ -7,7 +7,6 @@ module abro_common_m double precision, pointer :: Thck => Aabro(1) double precision, pointer :: Tempe => Aabro(2) double precision, pointer :: Delv => Aabro(3) - double precision, pointer :: Delt => Aabro(4) double precision, pointer :: Dddelt => Aabro(5) double precision, pointer :: Odffff => Aabro(6) double precision, pointer :: Abro1 => Aabro(7) diff --git a/sammy/src/blk/AllocateFunctions.f90 b/sammy/src/blk/AllocateFunctions.f90 index 510eb1fe5327e786cf0e6ffebded8376f6663b5d..b2bfcbf9fa9a3873ec909bb49d228983d89ed3b0 100644 --- a/sammy/src/blk/AllocateFunctions.f90 +++ b/sammy/src/blk/AllocateFunctions.f90 @@ -148,6 +148,7 @@ module AllocateFunctions_m if( .not.allocated(array)) then allocate(array(nsize1, nsize2)) + array = 0.0d0 return end if if (size(array,dim=1).ge.want1.and. size(array,dim=2).ge.want2) return diff --git a/sammy/src/blk/Broad_common.f90 b/sammy/src/blk/Broad_common.f90 index 4bcdb15add6326dc267cced76a62c0a6adb7fe80..d86a67729a0e225bdc2cd26612ab21fe2d01930b 100644 --- a/sammy/src/blk/Broad_common.f90 +++ b/sammy/src/blk/Broad_common.f90 @@ -1,7 +1,13 @@ ! replaces previous common block "Broad" in B04ZYX module broad_common_m use FreeGasDopplerBroadening_M + use HighEnergyFreeGasImpl_M + use LealHwangBroadeningImpl_M + use CrystalLatticeBroadeningImpl_M use DopplerAndResolutionBroadener_M + use FreeGasDopplerBroadeningImpl_M + use DopplerBroadening_M + use FortranExtDopplerBroadening_M use GridData_M IMPLICIT NONE @@ -33,15 +39,18 @@ module broad_common_m double precision, pointer :: Deltc2 => Abcd_real(19) type DopplerBroadenInfo - type(FreeGasDopplerBroadening),pointer::freeGas - type(DopplerAndResolutionBroadener),pointer::highEnergyFreeGas - type(DopplerAndResolutionBroadener),pointer::lealHwang - type(DopplerAndResolutionBroadener),pointer::crystalLattice + type(FreeGasDopplerBroadeningImpl),pointer::freeGas + type(HighEnergyFreeGasImpl),pointer::highEnergyFreeGas + type(LealHwangBroadeningImpl),pointer::lealHwang + type(CrystalLatticeBroadeningImpl),pointer::crystalLattice - class(DopplerAndResolutionBroadener),pointer::broadener + class(FortranExtDopplerBroadening),pointer::broadener integer::bType=2 ! default to freeGas + logical::wantBroaden=.false. + contains + procedure, pass(this) :: setDopple => DopplerBroadenInfo_setDopple end type - type(DopplerBroadenInfo)::dopplerOption + type(DopplerBroadenInfo)::dopplerInfo type ResolutionBroadenInfo type(DopplerAndResolutionBroadener),pointer::orrRes ! oak ridge resolution function @@ -57,5 +66,13 @@ module broad_common_m type(GridDataList)::workArray logical::workArrayInit = .false. +contains +subroutine DopplerBroadenInfo_setDopple(this) + class(DopplerBroadenInfo)::this + if (associated(this%highEnergyFreeGas)) then + this%highEnergyFreeGas%Dopple = Dopple + end if + +end subroutine end module broad_common_m diff --git a/sammy/src/blk/Clm_common.f90 b/sammy/src/blk/Clm_common.f90 deleted file mode 100644 index ddfd9d60eeac7e41fbe4a5416dbf764423c7a7b3..0000000000000000000000000000000000000000 --- a/sammy/src/blk/Clm_common.f90 +++ /dev/null @@ -1,33 +0,0 @@ -! replaces contents of B37ZYX which contains common block 'Clm' -module clm_common_m -! *** b37 -! 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 - -end module clm_common_m diff --git a/sammy/src/blk/Exploc_common.f90 b/sammy/src/blk/Exploc_common.f90 index e973c218b70c251a005d4affbab5bd1a2105d36a..17d751ab0bb64a196d7cb023e6e4df09f0601f20 100644 --- a/sammy/src/blk/Exploc_common.f90 +++ b/sammy/src/blk/Exploc_common.f90 @@ -29,7 +29,6 @@ module exploc_common_m real(kind=8),allocatable,dimension(:)::A_Ispiso integer,allocatable,dimension(:)::I_Ixciso real(kind=8),allocatable,dimension(:)::A_Idpiso - real(kind=8),allocatable,dimension(:)::A_Idsiso real(kind=8),allocatable,dimension(:)::A_Iprdet integer,allocatable,dimension(:)::I_Ifldet @@ -222,12 +221,6 @@ module exploc_common_m call allocate_real_data(A_Idpiso,want) end subroutine make_A_Idpiso - - subroutine make_A_Idsiso(want) - integer::want - call allocate_real_data(A_Idsiso,want) - end subroutine make_A_Idsiso - subroutine make_A_Iprdet(want) integer::want call allocate_real_data(A_Iprdet,want) diff --git a/sammy/src/blk/Fixedi_common.f90 b/sammy/src/blk/Fixedi_common.f90 index d6b0d06897945fc1d8d96a2fa979d7f6e91fd794..9045efbb59c9073dcf93cf047c8f19d4d00d399a 100644 --- a/sammy/src/blk/Fixedi_common.f90 +++ b/sammy/src/blk/Fixedi_common.f90 @@ -122,11 +122,8 @@ module fixedi_m integer,pointer :: Nres => lfdim(75) integer,pointer :: Nrext => lfdim(76) integer,pointer :: Nlfdimsiz => lfdim(77) - integer,pointer :: Kjjjjj => lfdim(78) - integer,pointer :: K2pls1 => lfdim(79) integer,pointer :: Ngtvv => lfdim(80) integer,pointer :: Nxtra => lfdim(81) - integer,pointer :: Jwwwww => lfdim(82) integer,pointer :: Nntype => lfdim(83) integer,pointer :: Jcros => lfdim(84) integer,pointer :: Jtrans => lfdim(85) diff --git a/sammy/src/blk/Fixedr_common.f90 b/sammy/src/blk/Fixedr_common.f90 index 6266616648a36584d9983883f1d54b730abf9af3..4d07c589f38a69eb02d41df4c70130cc48df9874 100644 --- a/sammy/src/blk/Fixedr_common.f90 +++ b/sammy/src/blk/Fixedr_common.f90 @@ -13,7 +13,6 @@ module fixedr_m double precision, pointer :: Thick => Ff(7) double precision, pointer :: Dcova => Ff(8) double precision, pointer :: Dcovb => Ff(9) - double precision, pointer :: Elowbr => Ff(10) double precision, pointer :: Emaxt => Ff(11) double precision, pointer :: Datcr => Ff(12) double precision, pointer :: Odfmul => Ff(13) @@ -30,7 +29,6 @@ module fixedr_m ! old group 3 double precision, pointer :: Backd => Ff(21) double precision, pointer :: Backf => Ff(22) - double precision, pointer :: Delttt => Ff(23) double precision, pointer :: Delttx => Ff(24) double precision, pointer :: Delvvv => Ff(25) double precision, pointer :: Delvvx => Ff(26) @@ -69,7 +67,6 @@ module fixedr_m ! old group 8 double precision, pointer :: Ttoe => Ff(56) - double precision, pointer :: Dosind => Ff(57) double precision, pointer :: Sitemp => Ff(58) double precision, pointer :: Sithck => Ff(59) double precision, pointer :: Effcap => Ff(62) diff --git a/sammy/src/blk/Ifwrit_common.f90 b/sammy/src/blk/Ifwrit_common.f90 index df2c07138e34ef5a557489b2d460f28c08a3838c..fd1bebafe5d7b2a985ab2f71e73ed6ba5fd69196 100644 --- a/sammy/src/blk/Ifwrit_common.f90 +++ b/sammy/src/blk/Ifwrit_common.f90 @@ -83,7 +83,6 @@ module ifwrit_m ! old group 8 integer,pointer :: Kedxfw => Lwrit(63) - integer,pointer :: Jjjdop => Lwrit(64) integer,pointer :: Inmdts => Lwrit(65) integer,pointer :: Kexpsh => Lwrit(66) integer,pointer :: Kendf => Lwrit(67) diff --git a/sammy/src/blk/Lbro_common.f90 b/sammy/src/blk/Lbro_common.f90 index d3c5d877775cf408bfea4c8c93d5fd3e8d8b4838..bc705103568f12e759b49976a015c5dc8af52447 100644 --- a/sammy/src/blk/Lbro_common.f90 +++ b/sammy/src/blk/Lbro_common.f90 @@ -9,7 +9,6 @@ module lbro_common_m LOGICAL,pointer:: Yresol => Lbro(3) LOGICAL,pointer:: Ytotrs => Lbro(4) LOGICAL,pointer:: Ynrmbk => Lbro(5) - LOGICAL,pointer:: Yangle => Lbro(6) LOGICAL,pointer:: Yssmsc => Lbro(7) LOGICAL,pointer:: Debug => Lbro(8) LOGICAL,pointer:: Yselfi => Lbro(9) diff --git a/sammy/src/ccm/mccm1.F b/sammy/src/ccm/mccm1.F index 05944eb5346b3cc534f29274590c9714fb73a8b4..1d1fbb1fa5c158de9f6adffbfc58814f8c36898d 100755 --- a/sammy/src/ccm/mccm1.F +++ b/sammy/src/ccm/mccm1.F @@ -34,8 +34,7 @@ C type(ResonanceCovariance)::uCov DATA Ncol/10/, Zero /0.0d0/ - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToExpGrid(expData) C N = Nnndat diff --git a/sammy/src/clm/CrystalLatticeBroadening_M.f90 b/sammy/src/clm/CrystalLatticeBroadening_M.f90 new file mode 100644 index 0000000000000000000000000000000000000000..249c5ef9264360788005054de97607a894d65a0a --- /dev/null +++ b/sammy/src/clm/CrystalLatticeBroadening_M.f90 @@ -0,0 +1,108 @@ +module CrystalLatticeBroadening_M +use FortranExtDopplerBroadening_M +use DopplerBroadening_M +use DerivativeHandler_M +use GridData_M +use, intrinsic :: ISO_C_BINDING + + +implicit none + +type, extends(FortranExtDopplerBroadening) :: CrystalLatticeBroadening +real(kind=8) :: Del_Phonon = 0.0d0 +real(kind=8) :: Twt = 0.0d0 +real(kind=8) :: C_Trans = 0.0d0 +real(kind=8) :: Tbeta = 0.0d0 +real(kind=8) :: Sub = 0.0d0 +real(kind=8) :: Xdop = 0.0d0 +real(kind=8) :: Eps = 0.0d0 +real(kind=8) :: Epsc = 0.0d0 +real(kind=8) :: F0 = 0.0d0 +real(kind=8) :: Tev = 0.0d0 +real(kind=8) :: Dwpix = 0.0d0 +real(kind=8) :: Tbar = 0.0d0 +real(kind=8) :: Del_S_B = 0.0d0 +real(kind=8) :: Dw0 = 0.0d0 +real(kind=8) :: Sum_Osc_Wts = 0.0d0 +real(kind=8) :: 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):: Aaawww + +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 +procedure, pass(this) :: destroy => CrystalLatticeBroadening_destroy +end type CrystalLatticeBroadening + +contains +subroutine CrystalLatticeBroadening_initialize(this, hand, list, work) + implicit none + class(CrystalLatticeBroadening) :: this + class(DerivativeHandler)::hand + class(GridDataList)::list + class(GridDataList)::work + call FortranExtDopplerBroadening_initialize(this, hand, list, work) +end subroutine + +subroutine CrystalLatticeBroadening_destroy(this) + implicit none + class(CrystalLatticeBroadening) :: this + call FortranExtDopplerBroadening_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 + + + +subroutine CrystalLatticeBroadening_broaden(this) + class(CrystalLatticeBroadening) :: this + + integer::ndatb + + call FortranExtDopplerBroadening_broaden(this) +end subroutine + +end module CrystalLatticeBroadening_M diff --git a/sammy/src/clm/dopush.f b/sammy/src/clm/dopush.f index 1de204dccbbf71ddebd9346540b86836fe550a81..0feeb9accc5c1503bb17d265d0258c082f5fe48c 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(dopplerInfo%crystalLattice) + calc => dopplerInfo%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 + + dopplerInfo%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 (dopplerInfo%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,9 +274,10 @@ 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) + dopplerInfo%wantBroaden = .true. C C *** FREE GAZ, FREE GAZ AT EFFECTIVE TEMPERATURE AND C NUCLEAR CROSS-SECTION CALCULATIONS ON ADJUSTED ENERGY GRID @@ -257,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 @@ -289,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, calc%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..38855a1f03f12d0f36a74892f8573887c3e26ff4 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,28 +18,26 @@ 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 => dopplerInfo%crystalLattice Recul = Ei*Rn - Alpha = Recul/Tev + Alpha = Recul/calc%Tev C C SCATTERING LaW CALCULATION C Ei is in eV; Beta is unitless @@ -42,35 +45,36 @@ C C 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.f b/sammy/src/clm/mclm0.f deleted file mode 100644 index 4d5c492e103083582425df449f1cf3c7a0d1317a..0000000000000000000000000000000000000000 --- a/sammy/src/clm/mclm0.f +++ /dev/null @@ -1,164 +0,0 @@ -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 : Jwwwww, K2reso, Kkkdex, Kkkrsl, - * Nudwhi, Numorr, Numrpi, - * Ndatd - use ifwrit_m, only : Kcros, Ksolve, Kvers7, Ndatb, Ntgrlq, Kplotu - 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 - 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 - WRITE (6,99999) -99999 FORMAT (' *** SAMMY-CLM 15 Nov 07 ***') - Segmen(1) = 'C' - Segmen(2) = 'L' - Segmen(3) = 'M' - Nowwww = 0 -C - CALL Initix - IF (Kplotu.NE.0) Kplotu = 0 -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 - N = 1 - Nn = 1 - Jwwwww = 2 - IF (Kcros.EQ.8) THEN - Jwwwww = 6 - END IF -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 ) - -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 diff --git a/sammy/src/clm/mclm0.f90 b/sammy/src/clm/mclm0.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d37e073318d9b90165f3ea716240284bbfccb27f --- /dev/null +++ b/sammy/src/clm/mclm0.f90 @@ -0,0 +1,60 @@ +module CrystalLatticeBroadeningImpl_m +use CrystalLatticeBroadening_M +implicit none +type, extends(CrystalLatticeBroadening) :: CrystalLatticeBroadeningImpl +contains +procedure, pass(this) :: initialize => CrystalLatticeBroadeningImpl_initialize +procedure, pass(this) :: broaden => CrystalLatticeBroadeningImpl_broaden +procedure, pass(this) :: destroy => CrystalLatticeBroadeningImpl_destroy +end type CrystalLatticeBroadeningImpl + +contains +subroutine CrystalLatticeBroadeningImpl_initialize(this, hand, list, work) + implicit none + class(CrystalLatticeBroadeningImpl) :: this + class(DerivativeHandler)::hand + class(GridDataList)::list + class(GridDataList)::work + call CrystalLatticeBroadening_initialize(this, hand, list, work) +end subroutine + +subroutine CrystalLatticeBroadeningImpl_destroy(this) + implicit none + class(CrystalLatticeBroadeningImpl) :: this + call CrystalLatticeBroadening_destroy(this) +end subroutine + +subroutine CrystalLatticeBroadeningImpl_broaden(this) + use fixedr_m, only : Aaawww + use exploc_common_m, only : I_Iflmsc + use Readclm_m + use mclm3_m + class(CrystalLatticeBroadeningImpl) :: this + + integer::ndatb + type(DerivativeHandler)::data + integer::N_Osc_Blank, Nn + + + this%Aaawww = Aaawww + + call CrystalLatticeBroadening_broaden(this) + + WRITE (6,99999) +99999 FORMAT (' *** SAMMY-CLM 15 Nov 07 ***') + + ! *** Read through the CLM file to learn array dimensions + CALL Readclm_0 (this, N_Osc_Blank) + + ! *** Read the CLM file for real + CALL Readclm (this, N_Osc_Blank) + + ! *** Initialize the crystal-lattice calculation + CALL Initclm (this) + + ! *** Dopclm performs CLM Doppler operation + CALL Dopclm (this, I_Iflmsc) +end subroutine + +end module CrystalLatticeBroadeningImpl_M + diff --git a/sammy/src/clm/mclm1.f b/sammy/src/clm/mclm1.f deleted file mode 100644 index 70b93ac778e7b9a273192ca7ba5c56edad95ecaa..0000000000000000000000000000000000000000 --- a/sammy/src/clm/mclm1.f +++ /dev/null @@ -1,376 +0,0 @@ -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 - 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,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 - 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) - IF (Ixx.EQ.1) GO TO 400 -C *** 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/ - Ixx = 0 - L = 0 - N = 0 - DO I=1,80 - IF (B(I).NE.' ') THEN - L = I - GO TO 10 - END IF - END DO - 10 CONTINUE - DO I=L+1,80 - IF (B(I).EQ.' ') THEN - N = I - GO TO 20 - END IF - END DO - 20 CONTINUE - DO I=N+1,80 - IF (B(I).NE.' ') THEN - M = I - GO TO 50 - 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 - N = 0 - 30 CONTINUE - READ (10,10500,END=400) C -10500 FORMAT (8F10.1) - DO I=1,8 - N = N + 1 - IF (C(I).EQ.Zero) THEN - Nn = - N - GO TO 40 - END IF - END DO - GO TO 30 - 40 CONTINUE -C *** 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 - 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 - READ (Bb,*) Cx, Nn - RETURN - - 400 CONTINUE - 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 - Ixx = 0 - N_Osc_Blank = 0 -C *** Is card entirely blank? - DO I=1,80 - IF (B(I).NE.' ') THEN - L = I - GO TO 10 - END IF - END DO - N = 0 - Nn = 0 - 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 - GO TO 50 -C - 10 CONTINUE -C *** Does card have a decimal point? - DO I=L+1,80 - IF (B(I).EQ.'.') THEN -C *** 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 - READ (10,10000) A -10000 FORMAT (A10) - IF (A.EQ.Blank) GO TO 30 - GO TO 20 - 30 CONTINUE - READ (Bb,*) Nn - RETURN -C - 40 CONTINUE - N = 0 - Nn = 0 - READ (Bb,10500) C - READ (10,10500) C -10500 FORMAT (8F10.1) - 50 CONTINUE -C *** Fixed-format where SAMMY counts the number of points - DO I=1,8 - N = N + 1 - IF (C(I).EQ.Zero) THEN - Nn = - N + 1 - GO TO 60 - END IF - END DO - READ (10,10500,END=400) C - READ (10,10500,END=400) C - 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 - 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,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) -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) - END IF - READ (10,10300) A -C *** 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) - ELSE -C *** 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) - END IF - READ (10,10300,END=400) A -C *** 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 -10600 FORMAT (//, 'Twt, C, Tbeta=', 1P6G14.6) - END IF - IF (Tbeta.EQ.Zero) Tbeta = One -C - 400 CONTINUE -C -C *** 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 - CLOSE (UNIT=10) -C - WRITE (21,10700) 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) - 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) -10900 FORMAT (1P5G14.6) - IF (Phonon(1).NE.Zero) THEN - WRITE (6,11000) 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 - END IF - Tevf = Tev*Tbar - Dwpix = 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) - 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() - END IF -C -C - RETURN - END diff --git a/sammy/src/clm/mclm1.f90 b/sammy/src/clm/mclm1.f90 new file mode 100644 index 0000000000000000000000000000000000000000..295ab48db74c75e1929eef7af28313e07ead196f --- /dev/null +++ b/sammy/src/clm/mclm1.f90 @@ -0,0 +1,398 @@ +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) +! + READ (10,10200,END=400,ERR=500) Title +10200 FORMAT (A80) + 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]' +! + READ (10,10300) A + CALL Convert_To_Caps (A, 5, Kpound) +! + IF (A.EQ.'CONTI') THEN + READ (10,10400) B +10400 FORMAT (80A1) + 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 +! + IF (A.EQ.'DISCR') THEN + READ (10,10400) B + CALL Find_Osc (B, B_one, calc%N_Osc, N_Osc_Blank, Ixx) + IF (Ixx.EQ.1) GO TO 400 +! *** Done reading Discrete Mode; Read next card + READ (10,10300,END=400) A + CALL Convert_To_Caps (A, 5, Kpound) + END IF +! + IF (A.EQ.'TRANS') THEN + READ (10,10400,END=400) B + END IF +! + 400 CONTINUE + REWIND (UNIT=10) + RETURN +! +! + 500 CONTINUE + CLOSE (UNIT=10) + STOP '[Stop in Readclm_0 in clm/mclm1.f problem reading CLM file]' + END +! +! +! -------------------------------------------------------------- +! + SUBROUTINE Find_Con (B, Bb, Nn, Ixx) + 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 + DO I=1,80 + IF (B(I).NE.' ') THEN + L = I + GO TO 10 + END IF + END DO + 10 CONTINUE + DO I=L+1,80 + IF (B(I).EQ.' ') THEN + N = I + GO TO 20 + END IF + END DO + 20 CONTINUE + DO I=N+1,80 + IF (B(I).NE.' ') THEN + M = I + GO TO 50 + END IF + END DO + Nn = 0 +! *** 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 +10500 FORMAT (8F10.1) + DO I=1,8 + N = N + 1 + IF (C(I).EQ.Zero) THEN + Nn = - N + GO TO 40 + END IF + END DO + GO TO 30 + 40 CONTINUE +! *** Note that we have read and counted the blank line + RETURN +! + 50 CONTINUE +! *** 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 +! *** So number of cards read should now be Ncard + Ncardx; includes blank + READ (Bb,*) Cx, Nn + RETURN + + 400 CONTINUE + Ixx = 1 + RETURN + END +! +! +! -------------------------------------------------------------- +! + SUBROUTINE Find_Osc (B, Bb, Nn, N_Osc_Blank, Ixx) + 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 +! *** Is card entirely blank? + DO I=1,80 + IF (B(I).NE.' ') THEN + L = I + GO TO 10 + END IF + END DO + N = 0 + Nn = 0 + N_Osc_Blank = 1 + READ (10,10500,END=400) C + READ (10,10500,END=400) C +! *** User did not count the phonons; nothing is on the card + GO TO 50 +! + 10 CONTINUE +! *** Does card have a decimal point? + DO I=L+1,80 + IF (B(I).EQ.'.') THEN +! *** User did not count the phonons + GO TO 40 + ELSE IF (B(I).EQ.' ') THEN + GO TO 20 + END IF + END DO +! + 20 CONTINUE +! *** 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 + GO TO 20 + 30 CONTINUE + READ (Bb,*) Nn + RETURN +! + 40 CONTINUE + N = 0 + Nn = 0 + READ (Bb,10500) C + READ (10,10500) C +10500 FORMAT (8F10.1) + 50 CONTINUE +! *** Fixed-format where SAMMY counts the number of points + DO I=1,8 + N = N + 1 + IF (C(I).EQ.Zero) THEN + Nn = - N + 1 + GO TO 60 + END IF + END DO + READ (10,10500,END=400) C + READ (10,10500,END=400) C + GO TO 50 + 60 CONTINUE + RETURN +! + 400 CONTINUE + Nn = - N + Ixx = 1 + RETURN + END +! +! +! ----------------------------------------------------------------- +! + 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,*) 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]' +! + READ (10,10300) A + CALL Convert_To_Caps (A, 5, Kpound) +! + IF (A.EQ.'CONTI') THEN + 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 +! *** 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 +! *** Done reading Continuous Mode; Read next card + READ (10,10300) A + CALL Convert_To_Caps (A, 5, Kpound) + END IF +! + IF (A.EQ.'DISCR') THEN + IF (N_Osc_Blank.EQ.1) READ (10,10300) A + 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 +! *** Free-format but user must count + READ (10,*) N + 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 +! *** Done reading Discrete Mode; Read next card + READ (10,10300,END=400) A + CALL Convert_To_Caps (A, 5, Kpound) + END IF +! + IF (A.EQ.'TRANS') THEN + 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 (calc%Tbeta.EQ.Zero) calc%Tbeta = One +! + 400 CONTINUE +! +! *** Printing the input almost as DOPUSH does + WRITE (21,10650) Title +10650 FORMAT (//, 1X, A40) + 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) +! + WRITE (21,10700) calc%N_Contin +10700 FORMAT (/, ' Number of points in phonon distribution =', I5) + Bbbb = calc%Phonon(1)*Half + DO I=2,calc%N_Contin-1 + Bbbb = Bbbb + calc%Phonon(I) + END DO + 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 (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 +! + RETURN + END +! +! +! ----------------------------------------------------------------- +! + 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 = calc%Tev*calc%Tbar + calc%Dwpix = calc%F0 + Tevf_true = Tevf +! +! *** 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 +! + 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 +! +! + RETURN + END +end module Readclm_m diff --git a/sammy/src/clm/mclm2.f b/sammy/src/clm/mclm2.f deleted file mode 100644 index 7f3cee7f259b8c28eeaddc8eac8492dd59394e56..0000000000000000000000000000000000000000 --- a/sammy/src/clm/mclm2.f +++ /dev/null @@ -1,359 +0,0 @@ -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 - INTEGER I - DIMENSION Phonon(*), Ppp(*) - DOUBLE PRECISION Phonon, Ppp, 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) - END DO -C -C *** --- -C *** Calculate normalizing constant = Annnnn - Annnnn = Ppp(1)*Half - DO I=2,N_Contin-1 - Annnnn = Annnnn + 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 - Ubeta = Del_Beta - V = dEXP(Half*Del_Beta) - Vv = V -cq Fs0 = Ppp(1) - Fs0 = Zero - Fs2 = Zero - DO I=2,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 } - 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) - 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 - Q = Fs0*Del_Beta - DO I=1,N_Contin - Ubeta = Del_Beta*(I-1) - Ppp(I) = 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) - 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 -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 - END DO - ELSE - 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) - END DO - N = Nphon - NLast = N_Contin -C -C -C *** ------ -C *** Add other terms in the phonon expansion sum - IF (Tbeta.NE.Zero) THEN - Rn = Aneutr/(Aaawww+Aneutr) - Alf0 = Emin*Rn/Tev * F0 - Omf0 = Emax*Rn/Tev * F0 - Exx = Alf0*dEXP(-Alf0) - Exy = Omf0*dEXP(-Omf0) - B = Exx - C = Exy - DO N=2,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) - DO I=1,Nnow - Tlast(I) = Tnow(I) - Savex(I,N) = Tnow(I) - END DO - NLast = Nnow - END DO - IF (N.GT.Nphon) N = 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 - I = X -C *** 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 - 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) - 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) - 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 - Kmax = 0 - DO K=1,Nnow - Tnow(K) = Zero - EP = One -C - DO J=1,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) - F2 = Zero - IF (I2.GE.0 .AND. I2+1.LE.NLast) THEN - F2 = Tlast(I2+1) - ELSE IF (I2.LT.0 .AND. 1-I2.LE.NLast) THEN - Be = -I2*Del_Beta - F2 = 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 - END IF -C - END DO -C - Tnow(K) = Tnow(K)*Del_Beta - IF (Tnow(K).LT.Small) THEN - 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) - END DO -C - DO I=1,N_Osc - Osc_Enx(I) = Osc_Eng(I)/Tev - END DO -C - Tsave = Zero - Dw0 = Dwpix - DO I=1,N_Osc - Eb = dEXP(Half*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 - END DO -C -C - K = Nbeta - DO I=1,Nbeta - Bex(I) = - Beta(K) - K = K - 1 - END DO -C - IF (Beta(1).LE.0.000000001) THEN - Bex(Nbeta) = Zero - K = Nbeta + 1 - ELSE - K = Nbeta + 2 - Bex(Nbeta+1) = Beta(1) - END IF -C - DO I=2,Nbeta - Bex(K) = Beta(I) - K = K + 1 - END DO - Nbx = K - 1 - IF (Nbx.GT.Nbeta_Max) THEN - WRITE (6,10000) Nbx, 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 diff --git a/sammy/src/clm/mclm2.f90 b/sammy/src/clm/mclm2.f90 new file mode 100644 index 0000000000000000000000000000000000000000..b4dd8ab46c65e0f9ed6149542ca1cafe0bf88384 --- /dev/null +++ b/sammy/src/clm/mclm2.f90 @@ -0,0 +1,361 @@ +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 + 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/ +! +! +! *** --- +! *** 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 +! +! *** --- +! *** 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 + 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 +!q Fs0 = calc%Ppp(1) + Fs0 = Zero + Fs2 = Zero + DO I=2,calc%N_Contin-1 + W2 = Ubeta**2 + 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 + 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 +! *** --- + 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,calc%N_Contin + Ubeta = Del_Beta*(I-1) + calc%Ppp(I) = calc%Ppp(I)*dEXP(Half*Ubeta)/Q + END DO +! + RETURN + END +! +! +! ---------------------------------------------------------------------- +! + 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 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 +! + 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 + calc%Nbeta = 0 + END IF + RETURN + END +! +! +! ------------------------------------------------------------------- +! + 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 = 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/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,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 = 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 + calc%Tlast(I) = calc%Tnow(I) + calc%Savex(I,N) = calc%Tnow(I) + END DO + NLast = Nnow + END DO + IF (N.GT.calc%Nphon) N = calc%Nphon + END IF +! + 10 CONTINUE + 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 +! *** Note that equally-spaced points in Beta are assumed throughout + IF (I.LT.0 .OR. I.GE.Nnow-1) THEN +! *** 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,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,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 +! + RETURN + END +! +! +! ---------------------------------------------------------------------- +! + 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 + calc%Tnow(K) = Zero + EP = One +! + DO J=1,calc%N_Contin + I1 = K + J - 2 + I2 = K - J + F1 = Zero + Be = (J-1)*Del_Beta +! + 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 = calc%Tlast(I2+1) + ELSE IF (I2.LT.0 .AND. 1-I2.LE.NLast) THEN + Be = -I2*Del_Beta + F2 = calc%Tlast(1-I2)*dEXP(-Be) + ENDIF + 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 +! + END DO +! + 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 +! + IF (Kmax.LT.Nnow) Nnow = Kmax + RETURN + END +! +! +! ---------------------------------------------------------------------- +! + 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 +! + 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 +! + 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) + 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 +! +! + 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 +! + IF (calc%Beta(1).LE.0.000000001) THEN + calc%Bex(calc%Nbeta) = Zero + K = calc%Nbeta + 1 + ELSE + K = calc%Nbeta + 2 + calc%Bex(calc%Nbeta+1) = calc%Beta(1) + END IF +! + DO I=2,calc%Nbeta + calc%Bex(K) = calc%Beta(I) + K = K + 1 + END DO + 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.f b/sammy/src/clm/mclm3.f deleted file mode 100644 index c4638ab379af5d35e7d25c3df91fcf8fe83e7786..0000000000000000000000000000000000000000 --- a/sammy/src/clm/mclm3.f +++ /dev/null @@ -1,258 +0,0 @@ -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) - -C -C *** PURPOSE -- FORM DOPPLER-BROADENED CROSS SECTION AND DERIVATIVES -C - use fixedi_m, only : Ktruet, Lllmax, - * Numiso, numcro, numUsedPar - use ifwrit_m, only : Kcros, Kdebug, Kfinit, Ksindi, Ksitmp, - * ktzero, Kvtemp, Kvthck, Nonu - use fixedr_m, only : Emax, Emaxs, Emin, Emins, Temp, Thick, - * 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 SammyGridAccess_M - use xct2_m - use mxct27_m - use mfgm3_M - use Qtrap_Clm_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 - 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 - integer::Kkkmin, Now, Nowx, Ns, numEl, numElAux, Kkkkkk, nauxStart - type(DerivativeHandler)::tmpCalc - - call grid%initialize() - call grid%setParameters(numcro, ktzero) - call grid%setToExpGrid(expData) - call auxGrid%initialize() - call auxGrid%setParameters(numcro, ktzero) - call auxGrid%setToAuxGrid(expData) - call setAuxGridOffset(1) ! reset auxillary grid starting point - numEl = grid%getNumEnergies(expData) - numElAux = auxGrid%getNumEnergies(expData) - 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 - IF (Kcros.EQ.8 .AND. Ksindi.GT.0) THEN - Iv = 1 - ELSE - Iv = 0 - END IF -C - Iw = 0 - call calcData%nullify() - 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 Iso=1,Isomax - Isox = Iso - 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 - 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.EQ.1) WRITE (6,10001) J -10001 FORMAT (' *** on data point number', I10) -C - IF (Another_Process_Will_Happen) THEN - em = auxGrid%getEnergy(J, expData) - ELSE - IF (J.GT.numEl) THEN - GO TO 80 - ELSE - 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" - eaux = auxGrid%getEnergy(J + 1, expData) - IF (eaux.GE.Emin) THEN - 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) - ELSE IF (Ksitmp.GT.0) THEN - CALL Stetd (calcData, calcDataSelf, - * Kkkkkk+1, Nowx, Iflmsc(Ksitmp), - * Isox, Jdat, Lllmax+1) - END IF - END IF - GO TO 40 - ELSE - nauxStart = J - 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" - eaux = auxGrid%getEnergy(J - 1, expData) - IF (eaux.LE.Emax) THEN - 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) - ELSE IF (Ksitmp.gt.0) THEN - Call Stetd (calcData, calcDataSelf, - * Kkkkkk+1, Nowx, Iflmsc(Ksitmp), - * Isox, Jdat, Lllmax+1) - END IF - END IF - GO TO 40 - ELSE - 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 - IF (Ksitmp.GT.0) THEN - Tevx = Boltzm*Sitemp - ELSE - Tevx = Tev - END IF -C -C ********* 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) - END IF -C -C ********* 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) - 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 - 80 CONTINUE - END DO -C *** end of do-loop on isotopes (nuclides) -C -C - 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) - - call grid%destroy() - call auxGrid%destroy() - call setAuxGridOffset(nauxStart) - call tmpCalc%destroy() - RETURN -C - END diff --git a/sammy/src/clm/mclm3.f90 b/sammy/src/clm/mclm3.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a9bf46bcaceda142d1d025c03f4d8f81a5af6afa --- /dev/null +++ b/sammy/src/clm/mclm3.f90 @@ -0,0 +1,154 @@ +module mclm3_m +use CrystalLatticeBroadening_M + +contains +! +! +! -------------------------------------------------------------- +! + SUBROUTINE Dopclm (calc, Iflmsc) + +! +! *** PURPOSE -- FORM DOPPLER-BROADENED CROSS SECTION AND DERIVATIVES +! + use ifwrit_m, only : Ksitmp,Kvtemp + use fixedr_m, only : Emax, Emaxs, Emin, Emins, Sitemp + use constn_common_m, only : Boltzm + use EndfData_common_m, only : resparData,radFitFlags + use Qtrap_Clm_m + use Getsab_m + use convert_to_transmission_m + use DerivativeHandler_M + IMPLICIT None + + class(CrystalLatticeBroadening)::calc +! + integer::Iflmsc(*) + real(kind=8)::C_Norm, eaux, em, Tevf, Tevx + integer::Isomax, Isox, J, Jdat, insig + integer(C_SIZE_T)::Iso + integer::Kkkmin, Now, Ns, numEl, numElAux, Kkkkkk, nauxStart + type(DerivativeHandler)::tmpCalc + type(DerivativeHandler)::calcData + + numElAux = calc%getNumEnergyUnbroadened() + numEl = calc%getNumEnergyBroadened() + call tmpCalc%initialize() + call tmpCalc%setUpList(resparData, radFitFlags, 1) +! +! *** 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() + call calc%getData(calcData) + +! +! + Now = 0 +! + Isomax = calcData%getUsedIsotopes() + IF (Isomax.EQ.0) STOP '[STOP in Dopclm in clm/mclm3.f]' +! +! *** 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 + cycle + end if +! + Kkkmin = 0 + Kkkkkk = 0 + nauxStart = 0 +! +! *** Start of major loop over energy-points + Jdat = 0 + DO J=1,numEl + call calc%setCurrentPos(Kkkkkk+1) +! + 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) +! + Em = calc%getEnergyBroadened(J) + Jdat = calc%getEmInUnbroadened(Em, Jdat) +! + IF (Em.LT.Emins) THEN +! These points are the very low-energy limit, +! of very little interest, ergo "stetd" + eaux = calc%getEnergyUnbroadened(Jdat + 1) + IF (eaux.GE.Emin) THEN + NOW = NOW + 1 + call calc%transferUnbroadenedAll(Jdat, Isox, Kvtemp, Iflmsc(Ksitmp)) + Kkkkkk = Kkkkkk + 1 + cycle + ELSE + nauxStart = J + cycle + END IF + ELSE IF (Em.GT.Emaxs) THEN +! These points are the very high-energy limit, +! of very little interest, ergo "stetd" + eaux = calc%getEnergyUnbroadened(Jdat - 1) + IF (eaux.LE.Emax) THEN + NOW = NOW + 1 + call calc%transferUnbroadenedAll(Jdat, Isox, Kvtemp, Iflmsc(Ksitmp)) + Kkkkkk = Kkkkkk + 1 + cycle + ELSE + exit + END IF + END IF +! +! +! "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, Isox, Ns) +! +! ********* Doppler widths etc for self-indication transmission + IF (Ksitmp.GT.0) THEN + Tevx = Boltzm*Sitemp + ELSE + Tevx = calc%Tev + END IF +! +! ********* Broaden self-indication transmission separately +! necessary copies have been made so we do need to +! distinguish between where the data are saved +! + IF (calc%hasSelf) THEN + CALL Getsab (calc, Em, Tevx, C_Norm, Tevf, Ns) + CALL Qtrap_Clm (calc, tmpCalc, & + calc%dataSelf, & + Tevx, Sitemp, Em, & + C_Norm, Iflmsc(Ksitmp), Isox,Ns) + END IF + + + Kkkkkk = Kkkkkk + 1 + + end do ! *** END of do-loop on energy +! + END DO +! *** end of do-loop on isotopes (nuclides) +! +! + nauxStart = nauxStart + 1 + IF (Now.NE.0) WRITE (21,99997) Now, Kkkkkk*Isomax + IF (Now.NE.0 .AND. calc%debugOutput) WRITE (06,99997) Now,Kkkkkk*Isomax +99997 FORMAT (' No Doppler broadening occured', I8, ' times of a possible', I8) +! + call calc%updateBroadenedOffset( nauxStart) + call calc%setLength(Kkkkkk) + + call tmpCalc%destroy() + RETURN +! + END +end module mclm3_m diff --git a/sammy/src/clm/mclm4.f b/sammy/src/clm/mclm4.f deleted file mode 100644 index a4db678152a45cf4c2e566f20ba607b0fc06c593..0000000000000000000000000000000000000000 --- a/sammy/src/clm/mclm4.f +++ /dev/null @@ -1,101 +0,0 @@ -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 - 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! - 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 - Tra0 = C_Norm - Tra1 = C_Sumr - Tbarx = Tbar -C *** Translational part, if any - IF (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) - 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) - 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 - END IF -C -C -C Dimensioning of Alpha and Beta values -C Centering of Beta in Recul=<Beta>=Em/(Awr+1) -C - K=0 - DO IK=Nbeta,1,-1 - K = K + 1 - Bs(K) = Recul - Beta(IK)*Tevx - Ss(K) = Sab(IK)/Tevx - END DO - DO IK=2,Nbeta - K = K + 1 - Bs(K) = Recul + Beta(IK)*Tevx - Ss(K) = Sab(IK)*dEXP(-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 - NS = K - RETURN - END diff --git a/sammy/src/clm/mclm4.f90 b/sammy/src/clm/mclm4.f90 new file mode 100644 index 0000000000000000000000000000000000000000..da6926973aa255d237ab4c356d229bc947f41d0d --- /dev/null +++ b/sammy/src/clm/mclm4.f90 @@ -0,0 +1,106 @@ +module Getsab_m +use AllocateFunctions_m +use CrystalLatticeBroadening_M +use mclm5_m +use mcml6_m +use mclm7_m +use constn_common_m, only : Aneutr +IMPLICIT None +contains +! +! +! ---------------------------------------------------------------------- +! + SUBROUTINE Getsab (calc, Em, Tevx, C_Norm, Tevf, & + Ns) +! +! *** Purpose -- CRYSTAL MODEL CROSS-SECTION CALCULATION +! *** Input -- Em, etc. +! *** Output -- Bs, Ss +! +! + 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 +!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/(calc%Aaawww+Aneutr)) + Alpha = Recul/Tevx + 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 = calc%Tbar +! *** Translational part, if any + IF (calc%Twt.NE.Zero) THEN + Ndmax = 2000 + 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 +! +! + Osc0 = Tra0 + Osc1 = Tra1 +! *** Discrete oscillators, if any + IF (calc%N_Osc.NE.0) THEN + CALL Discre (calc, Alpha, Tbarx, Osc0, Osc1) + END IF +! +! + C_Norm1 = dABS(C_Norm-One) + C_Sumr1 = dABS(C_Sumr-One) + IF (C_Norm1.GT.calc%Eps .OR. C_Sumr1.GT.calc%Eps) THEN + calc%Nphon = calc%Nphon + 5 + END IF +! +! +! Dimensioning of Alpha and Beta values +! Centering of Beta in Recul=<Beta>=Em/(Awr+1) +! + K=0 + 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 + calc%Bs(K) = Recul - calc%Beta(IK)*Tevx + calc%Ss(K) = calc%Sab(IK)/Tevx + END DO + DO IK=2,calc%Nbeta + K = K + 1 + calc%Bs(K) = Recul + calc%Beta(IK)*Tevx + calc%Ss(K) = calc%Sab(IK)*dEXP(-calc%Beta(IK))/Tevx + END DO +! +! +! 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.f b/sammy/src/clm/mclm5.f deleted file mode 100644 index a9ab9eb27ca3afa26e27e4651ef89a867e04d57f..0000000000000000000000000000000000000000 --- a/sammy/src/clm/mclm5.f +++ /dev/null @@ -1,146 +0,0 @@ -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 - 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 - Sab_Max = Zero - Alf0 = Alpha*F0 - Exx = Alf0*dEXP(-Alf0) - DO K=1,Nbeta - Add = Save(K,1)*Exx - IF (Add.GT.Sab_Max) Sab_Max = Add - 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 - END DO - Ksmall = 1 - DO N=2,Nphon - IF (Ksmall.EQ.0) THEN - GO TO 20 - END IF - Exx = Alf0*Exx/N - IF (Exx.EQ.Zero) THEN - GO TO 20 - ELSE IF (Exx.NE.Zero) THEN - Ksmall = 0 - Kountr = 0 - DO K=1,Nbeta-1 - IF (Kountr.GT.10) GO TO 10 - St = Save(K,N) - Add = St*Exx - IF (Add+Sab(K).NE.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 - END IF - END IF - ELSE - Kountr = Kountr + 1 - END IF - END DO - 10 CONTINUE - 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) - END DO -C -C -C *** ------ -C *** Check the moments of S(Alpha,Beta); Also redefine Sab if Max_T=1 -C - Ntime = 0 - Alw = ALpha*Tbeta - Alp = Alw*Tbar*Four - X = dSQRT(Pi*Alp) - K = 1 - Bem = Beta(K) - Ff2m = Sab(K) - Ff1m = Sab(K)*dEXP(-Bem) - C_Norm = Zero - C_Sumr = Zero - IF (Max_T(K).EQ.1) THEN -C (asymptotic redefinition of Sab) - Exx = -(Alw-Bem)**2/Alp - Ssct = Zero - IF (Exx.GT.-45.0d0) Ssct = dEXP(Exx)/X - Sab(K) = Ssct - END IF - DO K=2,Nbeta - Be = Beta(K) - IF (Max_T(K).EQ.1) THEN -C (asymptotic redefinition of Sab) - Exx = -(Alw-Be)**2/Alp - Ssct = Zero - IF (Exx.GT.-45.0d0) Ssct = dEXP(Exx)/X - Sab(K) = Ssct - END IF - IF (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) - 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 - Ff2m = Ff2 - 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 - RETURN - END diff --git a/sammy/src/clm/mclm5.f90 b/sammy/src/clm/mclm5.f90 new file mode 100644 index 0000000000000000000000000000000000000000..bbf1ebc3c5edf051babb57ad62a2fc7bf77da9d4 --- /dev/null +++ b/sammy/src/clm/mclm5.f90 @@ -0,0 +1,155 @@ +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 +!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*calc%F0 + Exx = Alf0*dEXP(-Alf0) + DO K=1,calc%Nbeta + Add = calc%Save(K,1)*Exx + IF (Add.GT.Sab_Max) Sab_Max = Add + calc%Sab(K) = Add + END DO +! +! +! *** 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,calc%Nphon + IF (Ksmall.EQ.0) THEN + GO TO 20 + END IF + Exx = Alf0*Exx/N + IF (Exx.EQ.Zero) THEN + GO TO 20 + ELSE IF (Exx.NE.Zero) THEN + Ksmall = 0 + Kountr = 0 + DO K=1,calc%Nbeta-1 + IF (Kountr.GT.10) GO TO 10 + St = calc%Save(K,N) + Add = St*Exx + IF (Add+calc%Sab(K).NE.calc%Sab(K)) THEN + Ksmall = 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 + Kountr = Kountr + 1 + END IF + END DO + 10 CONTINUE + END IF + END DO + 20 CONTINUE +! +! +! *** ------ +! *** 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 +! +! +! *** ------ +! *** Check the moments of S(Alpha,Beta); Also redefine Sab if Max_T=1 +! + Ntime = 0 + Alw = ALpha*calc%Tbeta + Alp = Alw*calc%Tbar*Four + X = dSQRT(Pi*Alp) + K = 1 + Bem = calc%Beta(K) + Ff2m = calc%Sab(K) + Ff1m = calc%Sab(K)*dEXP(-Bem) + C_Norm = Zero + C_Sumr = Zero + 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 + calc%Sab(K) = Ssct + END IF + 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 + calc%Sab(K) = Ssct + END IF + IF (calc%Sab(K).EQ.Zero) THEN + Ntime = Ntime + 1 + IF (Ntime.GT.20) GO TO 30 + ELSE + Ntime = 0 + END IF + 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 + Ff2m = Ff2 + Bem = Be + END DO + 30 CONTINUE +! +! +! *** ------ +! *** 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.f b/sammy/src/clm/mclm6.f90 similarity index 52% rename from sammy/src/clm/mclm6.f rename to sammy/src/clm/mclm6.f90 index c44e2d54777a4d68dd1ffc0f9cc561e9e8c28162..f0b7eec906888ddd0248c2719477a0f32eefbca0 100644 --- a/sammy/src/clm/mclm6.f +++ 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.f b/sammy/src/clm/mclm7.f90 similarity index 52% rename from sammy/src/clm/mclm7.f rename to sammy/src/clm/mclm7.f90 index d63b954fd39e36db48fa41cb58e9ca90b06c72dd..8b8cce6a04b906163ea956b98990e5757df1d1ec 100644 --- a/sammy/src/clm/mclm7.f +++ 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.f b/sammy/src/clm/mclm8.f90 similarity index 60% rename from sammy/src/clm/mclm8.f rename to sammy/src/clm/mclm8.f90 index b8816fe2a46fc465fb9052dcdee146ea2a7e9dc9..9d10f02a4c5df27d6ef0c207779892b4c6aba0ce 100644 --- a/sammy/src/clm/mclm8.f +++ 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 601c779b31aaa9069d47b158b6c62082b2a3b7cc..129246c46728076b6b394764cd50ff2d5d22dd16 100644 --- a/sammy/src/clm/mclm8a.f90 +++ b/sammy/src/clm/mclm8a.f90 @@ -1,4 +1,11 @@ module Qtrap_Clm_m + use CrystalLatticeBroadening_M + 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,9 +13,8 @@ module Qtrap_Clm_m ! ! ----------------------------------------------------------------- ! - SUBROUTINE Qtrap_Clm (tmpCalc, derivs, & - Bs, Ss, Tevx, Tempx, Em, C_Norm, Ktempx, Na, & - Isox, Locate, Ns, derivsNew, irow) + SUBROUTINE Qtrap_Clm (calc, tmpCalc, derivs, & + Tevx, Tempx, Em, C_Norm, Ktempx, Isox, Ns) ! ! *** INTEGRATION BY TRAPEZOIDAL METHOD ! CRySTAL SCATTERING FUNCTION INTEGRATION @@ -19,39 +25,24 @@ module Qtrap_Clm_m ! *** Bs - Beta array (variable of integration) ! *** Ss - Weighting function (S_alpha_beta) ! - use fixedi_m, only : numcro,numUsedPar - use ifwrit_m, only : ktzero - 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 - INTEGER Ktempx, Na, Isox, Locate, Ns - DOUBLE PRECISION Bs(*), Ss(*) + class(CrystalLatticeBroadening)::calc + INTEGER Ktempx, Na, Isox, Ns 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 + type(DerivativeHandler)::derivs, 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 + integer::It, J, Jj, L1er, L2er, numEl logical(C_BOOL)::accu -! - call grid%initialize() - call grid%setParameters(numcro, ktzero) - call grid%setToAuxGrid(expData) ! L1er = 0 L2er = 0 - Nax = derivsNew%getNnnsig() - call tmpCalc%setNnsig(Nax) - call tmpCalc%reserve(Nax, numUsedPar+1) - IF (Locate.NE.0) Nax = 1 + irow = calc%getCurrentPos() + Na = derivs%getNnnsig() + call tmpCalc%setNnsig(Na) + call tmpCalc%reserve(Na, calc%getNumParams()+1) ! Lstart = 1 Jmax = 10 @@ -60,35 +51,35 @@ 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) + L1, L2, 1, 1) END IF ! ! *** 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) + L1, L2, 1, 1) END IF ! Aaa = Half @@ -99,8 +90,8 @@ module Qtrap_Clm_m E_Prime = Xxa + Half*Del ! ! *** Take half of what's already there - do ipar = 0, numUsedPar - do N = 1, Nax + do ipar = 0, calc%getNumParams() + do N = 1, Na val = tmpCalc%getDataNs(1, N, ipar, 1)*Half if (val.eq.0.0d0) cycle call tmpCalc%addDataNs(1, N, Ipar, 1, val) @@ -110,14 +101,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 @@ -125,18 +116,18 @@ 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, & - Tempx, Xx, Yy, Ktempx, Nax, Isox, & - Locate, L1, L2, 1, 1) + Call Sig_Int (calc, tmpCalc, derivs, & + Tempx, Xx, Yy, Ktempx, Na, Isox, & + L1, L2, 1, 1) END IF E_Prime = E_Prime + Del ! 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 @@ -148,16 +139,16 @@ module Qtrap_Clm_m 10 CONTINUE accu = .true. - call derivsNew%setAccumulate(accu) - do ipar = 0, numUsedPar - do N = 1, Nax + call derivs%setAccumulate(accu) + do ipar = 0, calc%getNumParams() + do N = 1, Na val = tmpCalc%getDataNs(1, N, ipar, 1) if (val.eq.0.0d0) cycle - call derivsNew%addDataNs(irow, N, Ipar, Isox, val) + call derivs%addDataNs(irow, N, Ipar, Isox, val) end do end do accu = .false. - call derivsNew%setAccumulate(accu) + call derivs%setAccumulate(accu) end do ! ! @@ -165,18 +156,18 @@ module Qtrap_Clm_m 20 CONTINUE ! *** Temporarily assume (1) neutrons only, (2) one isotope only ! *** Eventually need to fix this! - Recul = Em*(Aneutr/(Aaawww+Aneutr)) + Recul = Em*(Aneutr/(calc%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 N = 1, Nax - val = Yy * derivsNew%getDataNs( irow, N, Ipar, Isox) + do ipar = 0, calc%getNumParams() + do N = 1, Na + val = Yy * derivs%getDataNs( irow, N, Ipar, Isox) if (val.eq.0.0d0) cycle - call derivsNew%addDataNs(irow, N, Ipar, Isox, val) + call derivs%addDataNs(irow, N, Ipar, Isox, val) end do end do END IF @@ -185,25 +176,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, derivs, derivs, & Tempx, Xx, Yy, Ktempx, Na, Isox, & - Locate, L1, L2, irow, Isox) + 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 @@ -212,21 +201,15 @@ 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) + 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 - INTEGER Ktempx, Na, Isox, Locate, L1, L2 + class(CrystalLatticeBroadening)::calc + INTEGER Ktempx, Na, Isox, L1, L2 type(DerivativeHandler)::derivs, tmpCalc real(kind=8)::Tempx, Xx, Yy real(kind=8):: Aa(4) @@ -239,19 +222,15 @@ 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 END IF -! -! *** - IF (Locate.EQ.0) THEN -! *** -! --- + ! update cross section (ipar=0) as well as derivatives - do Ipar = 0, numUsedPar + do Ipar = 0, calc%getNumParams() DO N=1,Na L = 0 val = 0.0d0 @@ -264,23 +243,6 @@ module Qtrap_Clm_m END DO END DO ! *** - ELSE -! IF (Locate.NE.0) THEN -! *** -! --- - ! update cross section (ipar=0) as well as derivatives - do Ipar = 0, numUsedPar - L = 0 - val = 0.0d0 - DO LL=L1,L2 - L = L + 1 - val = val + Aa(L)*derivs%getDataNsOld(LL, Locate, Ipar, Iso) - end do - if (val.eq.0.0d0) cycle - call tmpCalc%addDataNs(irow, 1, Ipar, ourIso, val) - END DO -! *** - END IF ! *** ! RETURN @@ -289,22 +251,15 @@ 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) + 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 - INTEGER Ktempx, Na, Isox, Locate, L1, L2 + class(CrystalLatticeBroadening)::calc + INTEGER Ktempx, Na, Isox, L1, L2 real(kind=8)::Tempx, Xx, Yy type(DerivativeHandler)::derivs, tmpCalc real(kind=8)::Aa(4) @@ -315,19 +270,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) + 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 @@ -351,11 +306,9 @@ module Qtrap_Clm_m ! ! ! *** - IF (Locate.EQ.0) THEN -! *** -! --- + ! update cross section (ipar=0) as well as derivatives - Do Ipar = 0, numUsedPar + Do Ipar = 0, calc%getNumParams() DO N=1,Na L = 0 val = 0.0d0 @@ -367,25 +320,6 @@ module Qtrap_Clm_m call tmpCalc%addDataNs(irow, N, Ipar, ourIso, val) end do END DO -! --- -! *** - ELSE -! IF (Locate.NE.0) THEN -! *** - ! update cross section (ipar=0) as well as derivatives - Do Ipar = 0, numUsedPar - L = 0 - val = 0.0d0 - DO LL=L1-1,L2+1 - L = L + 1 - val = val + Aa(L) * derivs%getDataNsOld(LL, Locate, Ipar, Iso) - end do - if (val.eq.0.0d0) cycle - call tmpCalc%addDataNs(irow, 1, Ipar, ourIso, val) - END DO -! *** - END IF -! *** ! accu = .false. diff --git a/sammy/src/convolution/CMakeLists.txt b/sammy/src/convolution/CMakeLists.txt index 51936cfc0465900a23c196c364480bb27f17653d..33308c90251f05126aac60df4e62a313740bdc5c 100644 --- a/sammy/src/convolution/CMakeLists.txt +++ b/sammy/src/convolution/CMakeLists.txt @@ -18,6 +18,9 @@ SET(HEADERS DopplerAndResolutionBroadener.h interface/cpp/DopplerAndResolutionBroadenerInterface.h + + DopplerBroadening.h + interface/cpp/DopplerBroadeningInterface.h ) APPEND_SET(CONVOLUTION_SOURCES @@ -36,6 +39,13 @@ APPEND_SET(CONVOLUTION_SOURCES interface/cpp/DopplerAndResolutionBroadenerInterface.cpp interface/fortran/DopplerAndResolutionBroadener_I.f90 interface/fortran/DopplerAndResolutionBroadener_M.f90 + + DopplerBroadening.cpp + interface/cpp/DopplerBroadeningInterface.cpp + interface/fortran/DopplerBroadening_I.f90 + interface/fortran/DopplerBroadening_M.f90 + + FortranExtDopplerBroadening_M.f90 ) diff --git a/sammy/src/convolution/DopplerAndResolutionBroadener.cpp b/sammy/src/convolution/DopplerAndResolutionBroadener.cpp index a2bf61a4bbfa092f1aa84259fbca5c3479c08363..a63353c9a97a24560b43bf1065e4a3b0dd353f7c 100644 --- a/sammy/src/convolution/DopplerAndResolutionBroadener.cpp +++ b/sammy/src/convolution/DopplerAndResolutionBroadener.cpp @@ -9,10 +9,10 @@ DopplerAndResolutionBroadener::DopplerAndResolutionBroadener(DerivativeHandler & GridDataList & list, GridDataList & work):handler(hand), gridList(list), workSpace(work) { - numIso = 0; numPerEner = 1; posUn = posBroad = 0; offUn = offBroad = 0; + numParams = 0; if( !(list.getLength() > 0)) throw std::runtime_error( "We need at least one energy grid in order to broaden"); unGrid = 0; broadGrid = 0; @@ -70,6 +70,16 @@ void DopplerAndResolutionBroadener::updateBroadenedOffset(int offSet){ } } +void DopplerAndResolutionBroadener::setLength(int l){ + length = l; + + if (broadGrid > 0){ + int ii = l - 1; + if (ii < 0) ii = 0; + gridList.getGrid(broadGrid)->setRowMax(ii); + } +} + int DopplerAndResolutionBroadener::getUpperLimitBroadened() const{ int jj = gridList.getGrid(broadGrid)->getRowMax(); if (jj > 0) { @@ -127,8 +137,24 @@ void DopplerAndResolutionBroadener::insertEnergyBroadened(int pos){ } -void DopplerAndResolutionBroadener::broaden(bool makebroadGrid){} +void DopplerAndResolutionBroadener::broaden(bool makebroadGrid){ + // reserve the data + int ndatb = getNumEnergyBroadened(); + handler.nullify(); + handler.reserve(ndatb*handler.getNnnsig(), numParams+1); +} +void DopplerAndResolutionBroadener::transferUnbroadened(int ipos, int iso){ + int nsig = handler.getNnnsig(); + for (int ipar = 0; ipar < numParams+1; ipar++){ + for (int n = 0; n < nsig; n++){ + double val = handler.getDataNs(ipos, n, ipar, iso, false); + if (val != 0.0){ + handler.addDataNs(currentPos, n, ipar, iso, val); + } + } + } +} int DopplerAndResolutionBroadener::getEmInUnbroadened(double em, int istart) const{ int nener = getNumEnergyUnbroadened(); @@ -170,10 +196,17 @@ int DopplerAndResolutionBroadener::getEmInUnbroadened(double em, int istart) con void DopplerAndResolutionBroadener::calcIntegralSpan(double elow, double ehigh, bool oneExtra){ int nener = getNumEnergyUnbroadened(); + int ihigh = integralStart + integralPts; + if (ihigh < 0) ihigh = 0; + if (ihigh >= nener) ihigh = nener -1; + double eCurrent = getEnergyUnbroadened(ihigh); + if (eCurrent > ehigh) ihigh = 0; + + if ( integralStart < 0) integralStart = 0; if ( integralStart >= nener) integralStart = nener - 1; - double eCurrent = getEnergyUnbroadened(integralStart); + eCurrent = getEnergyUnbroadened(integralStart); // assume data are ascending in energy while (eCurrent > elow && integralStart > 0){ @@ -195,6 +228,7 @@ void DopplerAndResolutionBroadener::calcIntegralSpan(double elow, double ehigh, int i = integralStart; for (; i < nener-1; i++){ integralPts = integralPts + 1; + if (i < ihigh) continue; eCurrent = getEnergyUnbroadened(i); if ( eCurrent >= ehigh) break; } @@ -231,28 +265,31 @@ void DopplerAndResolutionBroadener::ensureWorkGridLength(int length){ } } -void DopplerAndResolutionBroadener::setupBroadnener(int numcro, int ktzero, bool moreBroadening){ - int nn = numcro; - if (nn == 0) nn = 1; - setNumPerEnergy(nn); - - nn = 0; - if (ktzero != 0){ - if (numcro > 1){ - nn = 2; - } - else{ - nn = 1; - } +void DopplerAndResolutionBroadener::setupBroadener(bool moreBroadening, int num){ + const std::unique_ptr<GridData> & grid = gridList.getGrid(0); + int numcro = 1; + int ipos = 0; + if (grid != nullptr) { + numcro = grid->getNumPerEnergy(); + + // ipos is only relevant for the experimental grid (index 0) + // it is ignored for auxillary grid (index > 0) + ipos = grid->getDataColumn() - 1; + if (numcro > 1) ipos--; + if (ipos < 0) ipos = 0; } + if (numcro == 0) numcro = 1; + setNumPerEnergy(numcro); - setUnbroadenedGrid(1, nn); // unbroadened grid is always auxillary grid + setUnbroadenedGrid(1, ipos); // unbroadened grid is always auxillary grid if (moreBroadening){ - setBroadenedGrid(1,nn); // and if more brodening is to happen, it is also broadened to the auxillary grid + setBroadenedGrid(1,ipos); // and if more brodening is to happen, it is also broadened to the auxillary grid } else{ - setBroadenedGrid(0,nn); // if last broadening it is on the experimental grid + setBroadenedGrid(0,ipos); // if last broadening it is on the experimental grid } + + numParams = num; } void DopplerAndResolutionBroadener::setXoefWeights(int index){ diff --git a/sammy/src/convolution/DopplerAndResolutionBroadener.h b/sammy/src/convolution/DopplerAndResolutionBroadener.h index 4798a18dbc8a31cd19f6942760380b1b2a73be82..b3c6a265bd70ca33ea51db09464523d8c46b3e2a 100644 --- a/sammy/src/convolution/DopplerAndResolutionBroadener.h +++ b/sammy/src/convolution/DopplerAndResolutionBroadener.h @@ -28,21 +28,6 @@ public: DopplerAndResolutionBroadener(const DopplerAndResolutionBroadener & orig)=delete; virtual ~DopplerAndResolutionBroadener(){} - /** - * Get the number of isotopes to consider. - * - * @return the number of isotopes to consider - */ - int getNumIso() const{ return numIso;} - - /** - * Set the number of isotopes. - * If 1, only shared values in DerivativeHandler are considered - * - * @param iso the number of isotopes - */ - void setNumIso(int iso) { numIso = iso;} - /** * Get the number of points per energy * @@ -272,11 +257,11 @@ public: /** * Set up the grid - * @param numcro the number of points per energy - * @param ktzero if t_0 is adjusted, the position of the energy in the grid shifts + * * @param moreBroadening true if more broadening is to happen after + * @param the number of parameters that have derivatives */ - void setupBroadnener(int numcro, int ktzero, bool moreBroadening); + void setupBroadener(bool moreBroadening, int num); /** * Indicate where broadenend data actually start on the @@ -290,7 +275,7 @@ public: * The the number of broadened data actually added * @param l the number of broadened data actually added */ - void setLength(int l) { length = l; } + void setLength(int l); /** * Get the number of broadened data actually added @@ -298,11 +283,27 @@ public: */ int getLength() const { return length;} + /** + * Get the number of parameters for which derivatives exist + * @return the number of parameters for which derivatives exist + */ + int getNumParams() const { return numParams; } + + /** + * Transfer the unbroadened data unchanged to the broadened + * data array. + * The broadened data will be storted at position + * getCurrentPos() and the unbroadened data are retrieved from + * ipos. + * + * @param ipos the position of the unbroadened data + * @param iso the isotope for which to transfer the data + */ + void transferUnbroadened(int ipos, int iso); private: void ensureWorkGridLength(int length); - int numIso; // number of isotopes (if 1 - always use shared value) int numPerEner; // number of points per energy int posUn, posBroad; // the position of the energy in the unbroadened and braodened grid @@ -319,6 +320,8 @@ private: int integralStart, integralPts; + int numParams; + int currentPos; int length; }; diff --git a/sammy/src/convolution/DopplerBroadening.cpp b/sammy/src/convolution/DopplerBroadening.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c3bff21aadaa6141b248f9ea2cbd9cf5a6aa1474 --- /dev/null +++ b/sammy/src/convolution/DopplerBroadening.cpp @@ -0,0 +1,5 @@ +#include "DopplerBroadening.h" + +namespace sammy{ + +} diff --git a/sammy/src/convolution/DopplerBroadening.h b/sammy/src/convolution/DopplerBroadening.h new file mode 100644 index 0000000000000000000000000000000000000000..0b4637d4ba6043b2a8f9bab4554caa59c27d4395 --- /dev/null +++ b/sammy/src/convolution/DopplerBroadening.h @@ -0,0 +1,30 @@ +#ifndef SAMMY_DOPPLERBROADENING_H +#define SAMMY_DOPPLERBROADENING_H + +#include "DopplerAndResolutionBroadener.h" +#include "salmon/GridData.h" +#include "salmon/DerivativeHandler.h" + +namespace sammy{ +class DopplerBroadening : public DopplerAndResolutionBroadener +{ +public: + DopplerBroadening(DerivativeHandler & hand, GridDataList & list, GridDataList & work): + DopplerAndResolutionBroadener(hand, list, work), temp(0.0), brdLim(5.0){} + DopplerBroadening(const DopplerBroadening & orig) = delete; + virtual ~DopplerBroadening(){} + + void setTemperature(double t) { temp = t; } + + double getTemperature() const { return temp; } + + void setBrdLim( double b) { brdLim = b; } + + double getBrdLim() const { return brdLim; } +private: + double temp; // the temperature + + double brdLim; +}; +} +#endif // SAMMY_DOPPLERBROADENING_H diff --git a/sammy/src/convolution/FortranExtDopplerBroadening_M.f90 b/sammy/src/convolution/FortranExtDopplerBroadening_M.f90 new file mode 100644 index 0000000000000000000000000000000000000000..8a6089ba25d3e6a2b223a754fbc9c3cbf0ff050d --- /dev/null +++ b/sammy/src/convolution/FortranExtDopplerBroadening_M.f90 @@ -0,0 +1,165 @@ +module FortranExtDopplerBroadening_M +use, intrinsic :: ISO_C_BINDING +use DopplerBroadening_M +use DerivativeHandler_M +use GridData_M + +implicit none + +type, extends(DopplerBroadening) :: FortranExtDopplerBroadening +real(kind=8),allocatable,dimension(:,:)::rowData +logical::debugOutput +type(DerivativeHandler)::dataSelf +real(kind=8)::Sitemp +logical::hasSelf = .false. + +integer::Kc, Ipnts +real(kind=8)::Brdlim + +real(kind=8)::Elowbr ! energy below which no broadening is wanted, for high- energy Gaussian approximation to Doppler broadening (eV) +contains +procedure, pass(this) :: initialize => FortranExtDopplerBroadening_initialize +procedure, pass(this) :: broaden => FortranExtDopplerBroadening_broaden +procedure, pass(this) :: addSelfData => FortranExtDopplerBroadening_addSelfData +procedure, pass(this) :: transferUnbroadenedAll => FortranExtDopplerBroadening_transferUnbroadenedAll +procedure, pass(this) :: transferUnbroadenedBroad => FortranExtDopplerBroadening_transferUnbroadened +procedure, pass(this) :: copyRowData => FortranExtDopplerBroadening_copyRowData +procedure, pass(this) :: destroy => FortranExtDopplerBroadening_destroy +end type FortranExtDopplerBroadening + +contains +subroutine FortranExtDopplerBroadening_initialize(this, hand, list, work) + implicit none + class(FortranExtDopplerBroadening) :: this + class(DerivativeHandler)::hand + class(GridDataList)::list + class(GridDataList)::work + call DopplerBroadening_initialize(this, hand, list, work) + this%debugOutput = .false. + this%Elowbr = 0.0d0 + this%Sitemp = 0.0d0 +end subroutine + +subroutine FortranExtDopplerBroadening_destroy(this) + implicit none + class(FortranExtDopplerBroadening) :: this + call DopplerBroadening_destroy(this) +end subroutine + +subroutine FortranExtDopplerBroadening_addSelfData(this, copyData, ipos) + class(FortranExtDopplerBroadening) :: this + type(DerivativeHandler)::self + type(DerivativeHandler)::data + logical::copyData + + integer::iso, jdat, Ii, ipos + real(kind=8)::val + + this%hasSelf = .true. + if( .not.copyData) return + + call this%getData(data) + + + ! Note this is after the switch, ergo operate on old data + DO Iso=1,this%dataSelf%getUsedIsotopes() + do jdat = 1, this%getNumEnergyUnbroadened() + DO Ii=0,this%getNumParams() + val = data%getDataNsOld(Jdat, ipos, Ii, Iso) + if (val.ne.0.0d0) then + call this%dataSelf%addDataNsOld(Jdat, 1, Ii, Iso, val) + else + if (this%dataSelf%getDataNsOld(Jdat, 1, Ii, Iso).ne.0.0d0) then + call this%dataSelf%addDataNsOld(Jdat, 1, Ii, Iso, val) + end if + end if + end do + end do + end do +end subroutine + +subroutine FortranExtDopplerBroadening_transferUnbroadened(this, data, ipos, iso, iflag) + class(FortranExtDopplerBroadening) :: this + integer::ipos, iso, iflag + + type(DerivativeHandler)::data + integer::ipar, n, inew + real(kind=8)::val + + inew = this%getCurrentPos() + do ipar = 0, this%getNumParams() + if (ipar.gt.0.and.iflag.eq.ipar) cycle + do n = 1, data%getNnnsig() + val = data%getDataNsOld(ipos, N, ipar, iso) + if (val.eq.0.0d0) cycle + call data%addDataNs(inew, N, ipar, Iso, val) + end do + end do +end subroutine + +subroutine FortranExtDopplerBroadening_transferUnbroadenedAll(this, ipos, iso, iflag, iflagSelf) + class(FortranExtDopplerBroadening) :: this + integer::ipos, iso, iflag, iflagSelf + type(DerivativeHandler)::data + + call this%getData(data) + call FortranExtDopplerBroadening_transferUnbroadened(this, data, ipos, iso, iflag) + if (this%hasSelf) then + call FortranExtDopplerBroadening_transferUnbroadened(this, this%dataSelf, ipos, iso, iflagSelf) + end if +end subroutine + +subroutine FortranExtDopplerBroadening_broaden(this) + class(FortranExtDopplerBroadening) :: this + + integer::ndatb, i,current1, current2 + real(kind=8)::ener + type(DerivativeHandler)::data + + call DopplerBroadening_broaden(this) + + + ndatb = this%getNumEnergyUnbroadened() + + ! reserve the data for self indication experiments + ndatb = this%getNumEnergyBroadened() + if( this%hasSelf) then + call this%dataSelf%nullify() + call this%dataSelf%reserve(ndatb*this%dataSelf%getNnnsig(), this%getNumParams()+1) + end if + + call this%getData(data) + + + if (allocated(this%rowData)) then + current1 = size(this%rowData,dim=1) + current2 = size(this%rowData,dim=2) + if (current1.lt.data%getNnnsig().or. & + current2.lt.this%getNumParams()+ 1) then + deallocate(this%rowData) + end if + end if + if( .not.allocated(this%rowData)) then + allocate(this%rowData(data%getNnnsig(), 0:this%getNumParams())) + end if +end subroutine + +subroutine FortranExtDopplerBroadening_copyRowData(this, data, iso) + class(FortranExtDopplerBroadening) :: this + type(DerivativeHandler)::data + integer::iso + + integer::ipar, n, inew + real(kind=8)::val + + inew = this%getCurrentPos() + do ipar = 0, this%getNumParams() + do n = 1, data%getNnnsig() + val = this%rowData(N, ipar) + if (val.eq.0.0d0) cycle + call data%addDataNs(inew, N, ipar, Iso, val) + end do + end do +end subroutine + +end module FortranExtDopplerBroadening_M diff --git a/sammy/src/convolution/interface/cix/DopplerAndResolutionBroadener.cpp2f.xml b/sammy/src/convolution/interface/cix/DopplerAndResolutionBroadener.cpp2f.xml index 6a18bf648f32d512d9e653d321be2559b0dbcb59..af0dc3779a4b419d018d0560e56e0a46f8d569b1 100644 --- a/sammy/src/convolution/interface/cix/DopplerAndResolutionBroadener.cpp2f.xml +++ b/sammy/src/convolution/interface/cix/DopplerAndResolutionBroadener.cpp2f.xml @@ -11,11 +11,6 @@ <param name="work" type="GridDataList"/> </constructor> - <method name="getNumIso" return_type="int"/> - <method name="setNumIso"> - <param name="iso" type="int"/> - </method> - <method name="getNumPerEnergy" return_type="int"/> <method name="setNumPerEnergy"> <param name="n" type="int"/> @@ -94,11 +89,11 @@ <method name="setXoefWeights"> <param name="index" type="int" offset="-1"/> </method> - <method name="setupBroadnener"> - <param name="numcro" type="int"/> - <param name="ktzero" type="int"/> + <method name="setupBroadener"> <param name="moreBroadening" type="bool"/> + <param name="num" type="int"/> </method> + <method name="getNumParams" return_type="int"/> <method name="updateBroadenedOffset"> <param name="offSet" type="int" offset="-1"/> @@ -110,6 +105,11 @@ <method name="getLength" return_type="int"/> <method name="broaden"/> + + <method name="transferUnbroadened"> + <param name="ipos" type="int" offset="-1"/> + <param name="iso" type="int" offset="-1"/> + </method> </class> </generate> diff --git a/sammy/src/convolution/interface/cix/DopplerBroadening.cpp2f.xml b/sammy/src/convolution/interface/cix/DopplerBroadening.cpp2f.xml new file mode 100644 index 0000000000000000000000000000000000000000..423d51c66794a94a91d00711967250be3c4a26f1 --- /dev/null +++ b/sammy/src/convolution/interface/cix/DopplerBroadening.cpp2f.xml @@ -0,0 +1,27 @@ +<generate name="DopplerBroadening"> + <include_relative name="../../DopplerAndResolutionBroadener.h"/> + <include_relative name="../../DopplerBroadening.h"/> + <include name="salmon/GridData.h"/> + <include name="salmon/DerivativeHandler.h"/> + <using_namespace name="sammy"/> + + <class name="DopplerBroadening" abstract="yes" parent="DopplerAndResolutionBroadener"> + <constructor name="initialize"> + <param name="hand" type="DerivativeHandler"/> + <param name="list" type="GridDataList"/> + <param name="work" type="GridDataList"/> + </constructor> + + <method name="getTemperature" return_type="double"/> + <method name="setTemperature"> + <param name="t" type="double"/> + </method> + + <method name="getBrdLim" return_type="double"/> + <method name="setBrdLim"> + <param name="b" type="double"/> + </method> + + <method name="broaden"/> + </class> +</generate> diff --git a/sammy/src/convolution/interface/cpp/DopplerAndResolutionBroadenerInterface.cpp b/sammy/src/convolution/interface/cpp/DopplerAndResolutionBroadenerInterface.cpp index 1262a7cfaf455ffd141df543da4d1f3879cbbced..50feec0f176c96f7732209bfc5e91b30d47ff2c4 100644 --- a/sammy/src/convolution/interface/cpp/DopplerAndResolutionBroadenerInterface.cpp +++ b/sammy/src/convolution/interface/cpp/DopplerAndResolutionBroadenerInterface.cpp @@ -2,7 +2,7 @@ * This file has been dynamically generated by Class Interface Xml (CIX) * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION * If changes need to occur, modify the appropriate CIX xml file -* Date Generated: Fri Feb 11 16:55:04 EST 2022 +* Date Generated: Tue Apr 19 09:05:33 EDT 2022 * If any issues are experiences with this generated file that cannot be fixed * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov */ @@ -14,16 +14,6 @@ void* DopplerAndResolutionBroadener_initialize(DerivativeHandler * hand,GridData return new DopplerAndResolutionBroadener(*hand,*list,*work); } -int DopplerAndResolutionBroadener_getNumIso(void * DopplerAndResolutionBroadener_ptr) -{ - return ((DopplerAndResolutionBroadener*)DopplerAndResolutionBroadener_ptr)->getNumIso(); -} - -void DopplerAndResolutionBroadener_setNumIso(void * DopplerAndResolutionBroadener_ptr,int * iso) -{ - ((DopplerAndResolutionBroadener*)DopplerAndResolutionBroadener_ptr)->setNumIso(*iso); -} - int DopplerAndResolutionBroadener_getNumPerEnergy(void * DopplerAndResolutionBroadener_ptr) { return ((DopplerAndResolutionBroadener*)DopplerAndResolutionBroadener_ptr)->getNumPerEnergy(); @@ -144,9 +134,14 @@ void DopplerAndResolutionBroadener_setXoefWeights(void * DopplerAndResolutionBro ((DopplerAndResolutionBroadener*)DopplerAndResolutionBroadener_ptr)->setXoefWeights(*index); } -void DopplerAndResolutionBroadener_setupBroadnener(void * DopplerAndResolutionBroadener_ptr,int * numcro,int * ktzero,bool * moreBroadening) +void DopplerAndResolutionBroadener_setupBroadener(void * DopplerAndResolutionBroadener_ptr,bool * moreBroadening,int * num) { - ((DopplerAndResolutionBroadener*)DopplerAndResolutionBroadener_ptr)->setupBroadnener(*numcro,*ktzero,*moreBroadening); + ((DopplerAndResolutionBroadener*)DopplerAndResolutionBroadener_ptr)->setupBroadener(*moreBroadening,*num); +} + +int DopplerAndResolutionBroadener_getNumParams(void * DopplerAndResolutionBroadener_ptr) +{ + return ((DopplerAndResolutionBroadener*)DopplerAndResolutionBroadener_ptr)->getNumParams(); } void DopplerAndResolutionBroadener_updateBroadenedOffset(void * DopplerAndResolutionBroadener_ptr,int * offSet) @@ -169,6 +164,11 @@ void DopplerAndResolutionBroadener_broaden(void * DopplerAndResolutionBroadener_ ((DopplerAndResolutionBroadener*)DopplerAndResolutionBroadener_ptr)->broaden(); } +void DopplerAndResolutionBroadener_transferUnbroadened(void * DopplerAndResolutionBroadener_ptr,int * ipos,int * iso) +{ + ((DopplerAndResolutionBroadener*)DopplerAndResolutionBroadener_ptr)->transferUnbroadened(*ipos,*iso); +} + void DopplerAndResolutionBroadener_destroy(void * DopplerAndResolutionBroadener_ptr) { delete (DopplerAndResolutionBroadener*)DopplerAndResolutionBroadener_ptr; diff --git a/sammy/src/convolution/interface/cpp/DopplerAndResolutionBroadenerInterface.h b/sammy/src/convolution/interface/cpp/DopplerAndResolutionBroadenerInterface.h index 5aa65f409c5c2278a84c474ac5180743e5dff8c6..14186fd61076fb758bba22e1c394f8f308245870 100644 --- a/sammy/src/convolution/interface/cpp/DopplerAndResolutionBroadenerInterface.h +++ b/sammy/src/convolution/interface/cpp/DopplerAndResolutionBroadenerInterface.h @@ -2,7 +2,7 @@ * This file has been dynamically generated by Class Interface Xml (CIX) * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION * If changes need to occur, modify the appropriate CIX xml file -* Date Generated: Fri Feb 11 16:55:04 EST 2022 +* Date Generated: Tue Apr 19 09:05:33 EDT 2022 * If any issues are experiences with this generated file that cannot be fixed * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov */ @@ -15,8 +15,6 @@ using namespace sammy; extern "C" { #endif void* DopplerAndResolutionBroadener_initialize(DerivativeHandler * hand,GridDataList * list,GridDataList * work ); -int DopplerAndResolutionBroadener_getNumIso(void * DopplerAndResolutionBroadener_ptr); -void DopplerAndResolutionBroadener_setNumIso(void * DopplerAndResolutionBroadener_ptr,int * iso); int DopplerAndResolutionBroadener_getNumPerEnergy(void * DopplerAndResolutionBroadener_ptr); void DopplerAndResolutionBroadener_setNumPerEnergy(void * DopplerAndResolutionBroadener_ptr,int * n); int DopplerAndResolutionBroadener_getIntegralStart(void * DopplerAndResolutionBroadener_ptr); @@ -41,11 +39,13 @@ void DopplerAndResolutionBroadener_nullifyWorkGrid(void * DopplerAndResolutionBr double DopplerAndResolutionBroadener_getWorkData(void * DopplerAndResolutionBroadener_ptr,int * index,int * row,int * col); void DopplerAndResolutionBroadener_setWorkData(void * DopplerAndResolutionBroadener_ptr,int * index,int * row,int * col,double * val); void DopplerAndResolutionBroadener_setXoefWeights(void * DopplerAndResolutionBroadener_ptr,int * index); -void DopplerAndResolutionBroadener_setupBroadnener(void * DopplerAndResolutionBroadener_ptr,int * numcro,int * ktzero,bool * moreBroadening); +void DopplerAndResolutionBroadener_setupBroadener(void * DopplerAndResolutionBroadener_ptr,bool * moreBroadening,int * num); +int DopplerAndResolutionBroadener_getNumParams(void * DopplerAndResolutionBroadener_ptr); void DopplerAndResolutionBroadener_updateBroadenedOffset(void * DopplerAndResolutionBroadener_ptr,int * offSet); void DopplerAndResolutionBroadener_setLength(void * DopplerAndResolutionBroadener_ptr,int * l); int DopplerAndResolutionBroadener_getLength(void * DopplerAndResolutionBroadener_ptr); void DopplerAndResolutionBroadener_broaden(void * DopplerAndResolutionBroadener_ptr); +void DopplerAndResolutionBroadener_transferUnbroadened(void * DopplerAndResolutionBroadener_ptr,int * ipos,int * iso); void DopplerAndResolutionBroadener_destroy(void * DopplerAndResolutionBroadener_ptr); #ifdef __cplusplus } diff --git a/sammy/src/convolution/interface/cpp/DopplerBroadeningInterface.cpp b/sammy/src/convolution/interface/cpp/DopplerBroadeningInterface.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e7a565a951261b1d18012bfb58848b12d904809b --- /dev/null +++ b/sammy/src/convolution/interface/cpp/DopplerBroadeningInterface.cpp @@ -0,0 +1,46 @@ +/*! +* This file has been dynamically generated by Class Interface Xml (CIX) +* DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION +* If changes need to occur, modify the appropriate CIX xml file +* Date Generated: Tue Apr 19 10:21:53 EDT 2022 +* If any issues are experiences with this generated file that cannot be fixed +* with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov +*/ +#include <string.h> +#include "DopplerBroadeningInterface.h" +using namespace sammy; +void* DopplerBroadening_initialize(DerivativeHandler * hand,GridDataList * list,GridDataList * work ) +{ + return new DopplerBroadening(*hand,*list,*work); +} + +double DopplerBroadening_getTemperature(void * DopplerBroadening_ptr) +{ + return ((DopplerBroadening*)DopplerBroadening_ptr)->getTemperature(); +} + +void DopplerBroadening_setTemperature(void * DopplerBroadening_ptr,double * t) +{ + ((DopplerBroadening*)DopplerBroadening_ptr)->setTemperature(*t); +} + +double DopplerBroadening_getBrdLim(void * DopplerBroadening_ptr) +{ + return ((DopplerBroadening*)DopplerBroadening_ptr)->getBrdLim(); +} + +void DopplerBroadening_setBrdLim(void * DopplerBroadening_ptr,double * b) +{ + ((DopplerBroadening*)DopplerBroadening_ptr)->setBrdLim(*b); +} + +void DopplerBroadening_broaden(void * DopplerBroadening_ptr) +{ + ((DopplerBroadening*)DopplerBroadening_ptr)->broaden(); +} + +void DopplerBroadening_destroy(void * DopplerBroadening_ptr) +{ + delete (DopplerBroadening*)DopplerBroadening_ptr; +} + diff --git a/sammy/src/convolution/interface/cpp/DopplerBroadeningInterface.h b/sammy/src/convolution/interface/cpp/DopplerBroadeningInterface.h new file mode 100644 index 0000000000000000000000000000000000000000..0008d6585ff5ba4fe85f1d8e5ed371c9e0dd39ee --- /dev/null +++ b/sammy/src/convolution/interface/cpp/DopplerBroadeningInterface.h @@ -0,0 +1,31 @@ +/*! +* This file has been dynamically generated by Class Interface Xml (CIX) +* DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION +* If changes need to occur, modify the appropriate CIX xml file +* Date Generated: Tue Apr 19 10:21:53 EDT 2022 +* If any issues are experiences with this generated file that cannot be fixed +* with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov +*/ +#ifndef DOPPLERBROADENINGINTERFACE_H +#define DOPPLERBROADENINGINTERFACE_H +#include "salmon/DerivativeHandler.h" +#include "salmon/GridData.h" +#include "../../DopplerAndResolutionBroadener.h" +#include "../../DopplerBroadening.h" + + +using namespace sammy; +#ifdef __cplusplus +extern "C" { +#endif +void* DopplerBroadening_initialize(DerivativeHandler * hand,GridDataList * list,GridDataList * work ); +double DopplerBroadening_getTemperature(void * DopplerBroadening_ptr); +void DopplerBroadening_setTemperature(void * DopplerBroadening_ptr,double * t); +double DopplerBroadening_getBrdLim(void * DopplerBroadening_ptr); +void DopplerBroadening_setBrdLim(void * DopplerBroadening_ptr,double * b); +void DopplerBroadening_broaden(void * DopplerBroadening_ptr); +void DopplerBroadening_destroy(void * DopplerBroadening_ptr); +#ifdef __cplusplus +} +#endif +#endif /* DOPPLERBROADENINGINTERFACE_H */ diff --git a/sammy/src/convolution/interface/fortran/DopplerAndResolutionBroadener_I.f90 b/sammy/src/convolution/interface/fortran/DopplerAndResolutionBroadener_I.f90 index 0cfe834e4d94dc5eb090824d6c1586b523a76e5a..dfa816925c873b8c2112742aab87967809ec80c2 100644 --- a/sammy/src/convolution/interface/fortran/DopplerAndResolutionBroadener_I.f90 +++ b/sammy/src/convolution/interface/fortran/DopplerAndResolutionBroadener_I.f90 @@ -2,7 +2,7 @@ !! This file has been dynamically generated by Class Interface Xml (CIX) !! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION !! If changes need to occur, modify the appropriate CIX xml file -!! Date Generated: Fri Feb 11 16:55:04 EST 2022 +!! Date Generated: Tue Apr 19 09:05:33 EDT 2022 !! If any issues are experiences with this generated file that cannot be fixed !! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov !!/ @@ -17,17 +17,6 @@ type(C_PTR) function f_DopplerAndResolutionBroadener_initialize( hand,list,work type(C_PTR), value :: list; type(C_PTR), value :: work; end function -integer(C_INT) function f_DopplerAndResolutionBroadener_getNumIso(DopplerAndResolutionBroadener_ptr ) BIND(C,name="DopplerAndResolutionBroadener_getNumIso") - use,intrinsic :: ISO_C_BINDING - implicit none - type(C_PTR), value :: DopplerAndResolutionBroadener_ptr; -end function -subroutine f_DopplerAndResolutionBroadener_setNumIso(DopplerAndResolutionBroadener_ptr, iso ) BIND(C,name="DopplerAndResolutionBroadener_setNumIso") - use,intrinsic :: ISO_C_BINDING - implicit none - type(C_PTR), value :: DopplerAndResolutionBroadener_ptr; - integer(C_INT) :: iso; -end subroutine integer(C_INT) function f_DopplerAndResolutionBroadener_getNumPerEnergy(DopplerAndResolutionBroadener_ptr ) BIND(C,name="DopplerAndResolutionBroadener_getNumPerEnergy") use,intrinsic :: ISO_C_BINDING implicit none @@ -175,14 +164,18 @@ subroutine f_DopplerAndResolutionBroadener_setXoefWeights(DopplerAndResolutionBr type(C_PTR), value :: DopplerAndResolutionBroadener_ptr; integer(C_INT) :: index; end subroutine -subroutine f_DopplerAndResolutionBroadener_setupBroadnener(DopplerAndResolutionBroadener_ptr, numcro,ktzero,moreBroadening ) BIND(C,name="DopplerAndResolutionBroadener_setupBroadnener") +subroutine f_DopplerAndResolutionBroadener_setupBroadener(DopplerAndResolutionBroadener_ptr, moreBroadening,num ) BIND(C,name="DopplerAndResolutionBroadener_setupBroadener") use,intrinsic :: ISO_C_BINDING implicit none type(C_PTR), value :: DopplerAndResolutionBroadener_ptr; - integer(C_INT) :: numcro; - integer(C_INT) :: ktzero; logical(C_BOOL) :: moreBroadening; + integer(C_INT) :: num; end subroutine +integer(C_INT) function f_DopplerAndResolutionBroadener_getNumParams(DopplerAndResolutionBroadener_ptr ) BIND(C,name="DopplerAndResolutionBroadener_getNumParams") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: DopplerAndResolutionBroadener_ptr; +end function subroutine f_DopplerAndResolutionBroadener_updateBroadenedOffset(DopplerAndResolutionBroadener_ptr, offSet ) BIND(C,name="DopplerAndResolutionBroadener_updateBroadenedOffset") use,intrinsic :: ISO_C_BINDING implicit none @@ -205,6 +198,13 @@ subroutine f_DopplerAndResolutionBroadener_broaden(DopplerAndResolutionBroadener implicit none type(C_PTR), value :: DopplerAndResolutionBroadener_ptr; end subroutine +subroutine f_DopplerAndResolutionBroadener_transferUnbroadened(DopplerAndResolutionBroadener_ptr, ipos,iso ) BIND(C,name="DopplerAndResolutionBroadener_transferUnbroadened") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: DopplerAndResolutionBroadener_ptr; + integer(C_INT) :: ipos; + integer(C_INT) :: iso; +end subroutine subroutine f_DopplerAndResolutionBroadener_destroy(this) BIND(C,name="DopplerAndResolutionBroadener_destroy") use,intrinsic :: ISO_C_BINDING implicit none diff --git a/sammy/src/convolution/interface/fortran/DopplerAndResolutionBroadener_M.f90 b/sammy/src/convolution/interface/fortran/DopplerAndResolutionBroadener_M.f90 index c49b5640f6e8d49b40e46caad109fee15e9f373f..d53ed0dbc79288de13c4e4611f0240490312fdac 100644 --- a/sammy/src/convolution/interface/fortran/DopplerAndResolutionBroadener_M.f90 +++ b/sammy/src/convolution/interface/fortran/DopplerAndResolutionBroadener_M.f90 @@ -2,7 +2,7 @@ !! This file has been dynamically generated by Class Interface Xml (CIX) !! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION !! If changes need to occur, modify the appropriate CIX xml file -!! Date Generated: Fri Feb 11 16:55:04 EST 2022 +!! Date Generated: Tue Apr 19 09:05:33 EDT 2022 !! If any issues are experiences with this generated file that cannot be fixed !! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov !!/ @@ -15,8 +15,6 @@ type DopplerAndResolutionBroadener type(C_PTR) :: instance_ptr=C_NULL_PTR contains procedure, pass(this) :: initialize => DopplerAndResolutionBroadener_initialize - procedure, pass(this) :: getNumIso => DopplerAndResolutionBroadener_getNumIso - procedure, pass(this) :: setNumIso => DopplerAndResolutionBroadener_setNumIso procedure, pass(this) :: getNumPerEnergy => DopplerAndResolutionBroadener_getNumPerEnergy procedure, pass(this) :: setNumPerEnergy => DopplerAndResolutionBroadener_setNumPerEnergy procedure, pass(this) :: getIntegralStart => DopplerAndResolutionBroadener_getIntegralStart @@ -41,11 +39,13 @@ type DopplerAndResolutionBroadener procedure, pass(this) :: getWorkData => DopplerAndResolutionBroadener_getWorkData procedure, pass(this) :: setWorkData => DopplerAndResolutionBroadener_setWorkData procedure, pass(this) :: setXoefWeights => DopplerAndResolutionBroadener_setXoefWeights - procedure, pass(this) :: setupBroadnener => DopplerAndResolutionBroadener_setupBroadnener + procedure, pass(this) :: setupBroadener => DopplerAndResolutionBroadener_setupBroadener + procedure, pass(this) :: getNumParams => DopplerAndResolutionBroadener_getNumParams procedure, pass(this) :: updateBroadenedOffset => DopplerAndResolutionBroadener_updateBroadenedOffset procedure, pass(this) :: setLength => DopplerAndResolutionBroadener_setLength procedure, pass(this) :: getLength => DopplerAndResolutionBroadener_getLength procedure, pass(this) :: broaden => DopplerAndResolutionBroadener_broaden + procedure, pass(this) :: transferUnbroadened => DopplerAndResolutionBroadener_transferUnbroadened procedure, pass(this) :: destroy => DopplerAndResolutionBroadener_destroy end type DopplerAndResolutionBroadener contains @@ -57,18 +57,6 @@ subroutine DopplerAndResolutionBroadener_initialize(this, hand, list, work) class(GridDataList)::work this%instance_ptr = f_DopplerAndResolutionBroadener_initialize( hand%instance_ptr,list%instance_ptr,work%instance_ptr) end subroutine -function DopplerAndResolutionBroadener_getNumIso(this) result(result2Return) - implicit none - class(DopplerAndResolutionBroadener)::this - integer(C_INT):: result2Return - result2Return=f_DopplerAndResolutionBroadener_getNumIso(this%instance_ptr) -end function -subroutine DopplerAndResolutionBroadener_setNumIso(this, iso) - implicit none - class(DopplerAndResolutionBroadener)::this - integer(C_INT)::iso - call f_DopplerAndResolutionBroadener_setNumIso(this%instance_ptr, iso) -end subroutine function DopplerAndResolutionBroadener_getNumPerEnergy(this) result(result2Return) implicit none class(DopplerAndResolutionBroadener)::this @@ -233,14 +221,19 @@ subroutine DopplerAndResolutionBroadener_setXoefWeights(this, index) integer(C_INT)::index call f_DopplerAndResolutionBroadener_setXoefWeights(this%instance_ptr, index-1) end subroutine -subroutine DopplerAndResolutionBroadener_setupBroadnener(this, numcro, ktzero, moreBroadening) +subroutine DopplerAndResolutionBroadener_setupBroadener(this, moreBroadening, num) implicit none class(DopplerAndResolutionBroadener)::this - integer(C_INT)::numcro - integer(C_INT)::ktzero logical(C_BOOL)::moreBroadening - call f_DopplerAndResolutionBroadener_setupBroadnener(this%instance_ptr, numcro,ktzero,moreBroadening) + integer(C_INT)::num + call f_DopplerAndResolutionBroadener_setupBroadener(this%instance_ptr, moreBroadening,num) end subroutine +function DopplerAndResolutionBroadener_getNumParams(this) result(result2Return) + implicit none + class(DopplerAndResolutionBroadener)::this + integer(C_INT):: result2Return + result2Return=f_DopplerAndResolutionBroadener_getNumParams(this%instance_ptr) +end function subroutine DopplerAndResolutionBroadener_updateBroadenedOffset(this, offSet) implicit none class(DopplerAndResolutionBroadener)::this @@ -264,6 +257,13 @@ subroutine DopplerAndResolutionBroadener_broaden(this) class(DopplerAndResolutionBroadener)::this call f_DopplerAndResolutionBroadener_broaden(this%instance_ptr) end subroutine +subroutine DopplerAndResolutionBroadener_transferUnbroadened(this, ipos, iso) + implicit none + class(DopplerAndResolutionBroadener)::this + integer(C_INT)::ipos + integer(C_INT)::iso + call f_DopplerAndResolutionBroadener_transferUnbroadened(this%instance_ptr, ipos-1,iso-1) +end subroutine subroutine DopplerAndResolutionBroadener_destroy(this) implicit none class(DopplerAndResolutionBroadener) :: this diff --git a/sammy/src/convolution/interface/fortran/DopplerBroadening_I.f90 b/sammy/src/convolution/interface/fortran/DopplerBroadening_I.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1860946f0e3a4473e38e32dffeca2df623bae2f9 --- /dev/null +++ b/sammy/src/convolution/interface/fortran/DopplerBroadening_I.f90 @@ -0,0 +1,53 @@ +!> +!! This file has been dynamically generated by Class Interface Xml (CIX) +!! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION +!! If changes need to occur, modify the appropriate CIX xml file +!! Date Generated: Tue Apr 19 10:21:53 EDT 2022 +!! If any issues are experiences with this generated file that cannot be fixed +!! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov +!!/ +module DopplerBroadening_I +use, intrinsic :: ISO_C_BINDING +interface +type(C_PTR) function f_DopplerBroadening_initialize( hand,list,work )BIND(C,name="DopplerBroadening_initialize") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR) :: DopplerBroadening_ptr; + type(C_PTR), value :: hand; + type(C_PTR), value :: list; + type(C_PTR), value :: work; +end function +real(C_DOUBLE) function f_DopplerBroadening_getTemperature(DopplerBroadening_ptr ) BIND(C,name="DopplerBroadening_getTemperature") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: DopplerBroadening_ptr; +end function +subroutine f_DopplerBroadening_setTemperature(DopplerBroadening_ptr, t ) BIND(C,name="DopplerBroadening_setTemperature") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: DopplerBroadening_ptr; + real(C_DOUBLE) :: t; +end subroutine +real(C_DOUBLE) function f_DopplerBroadening_getBrdLim(DopplerBroadening_ptr ) BIND(C,name="DopplerBroadening_getBrdLim") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: DopplerBroadening_ptr; +end function +subroutine f_DopplerBroadening_setBrdLim(DopplerBroadening_ptr, b ) BIND(C,name="DopplerBroadening_setBrdLim") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: DopplerBroadening_ptr; + real(C_DOUBLE) :: b; +end subroutine +subroutine f_DopplerBroadening_broaden(DopplerBroadening_ptr ) BIND(C,name="DopplerBroadening_broaden") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: DopplerBroadening_ptr; +end subroutine +subroutine f_DopplerBroadening_destroy(this) BIND(C,name="DopplerBroadening_destroy") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: this; +end subroutine +end interface +end module DopplerBroadening_I diff --git a/sammy/src/convolution/interface/fortran/DopplerBroadening_M.f90 b/sammy/src/convolution/interface/fortran/DopplerBroadening_M.f90 new file mode 100644 index 0000000000000000000000000000000000000000..669e667ae770b759c5927e4af9db4ddc72967473 --- /dev/null +++ b/sammy/src/convolution/interface/fortran/DopplerBroadening_M.f90 @@ -0,0 +1,69 @@ +!> +!! This file has been dynamically generated by Class Interface Xml (CIX) +!! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION +!! If changes need to occur, modify the appropriate CIX xml file +!! Date Generated: Tue Apr 19 10:21:53 EDT 2022 +!! If any issues are experiences with this generated file that cannot be fixed +!! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov +!!/ +module DopplerBroadening_M +use, intrinsic :: ISO_C_BINDING +use DopplerBroadening_I +use DopplerAndResolutionBroadener_M +use DerivativeHandler_M +use GridData_M +type , extends(DopplerAndResolutionBroadener) :: DopplerBroadening + contains + procedure, pass(this) :: initialize => DopplerBroadening_initialize + procedure, pass(this) :: getTemperature => DopplerBroadening_getTemperature + procedure, pass(this) :: setTemperature => DopplerBroadening_setTemperature + procedure, pass(this) :: getBrdLim => DopplerBroadening_getBrdLim + procedure, pass(this) :: setBrdLim => DopplerBroadening_setBrdLim + procedure, pass(this) :: broaden => DopplerBroadening_broaden + procedure, pass(this) :: destroy => DopplerBroadening_destroy +end type DopplerBroadening +contains +subroutine DopplerBroadening_initialize(this, hand, list, work) + implicit none + class(DopplerBroadening) :: this + class(DerivativeHandler)::hand + class(GridDataList)::list + class(GridDataList)::work + this%instance_ptr = f_DopplerBroadening_initialize( hand%instance_ptr,list%instance_ptr,work%instance_ptr) +end subroutine +function DopplerBroadening_getTemperature(this) result(result2Return) + implicit none + class(DopplerBroadening)::this + real(C_DOUBLE):: result2Return + result2Return=f_DopplerBroadening_getTemperature(this%instance_ptr) +end function +subroutine DopplerBroadening_setTemperature(this, t) + implicit none + class(DopplerBroadening)::this + real(C_DOUBLE)::t + call f_DopplerBroadening_setTemperature(this%instance_ptr, t) +end subroutine +function DopplerBroadening_getBrdLim(this) result(result2Return) + implicit none + class(DopplerBroadening)::this + real(C_DOUBLE):: result2Return + result2Return=f_DopplerBroadening_getBrdLim(this%instance_ptr) +end function +subroutine DopplerBroadening_setBrdLim(this, b) + implicit none + class(DopplerBroadening)::this + real(C_DOUBLE)::b + call f_DopplerBroadening_setBrdLim(this%instance_ptr, b) +end subroutine +subroutine DopplerBroadening_broaden(this) + implicit none + class(DopplerBroadening)::this + call f_DopplerBroadening_broaden(this%instance_ptr) +end subroutine +subroutine DopplerBroadening_destroy(this) + implicit none + class(DopplerBroadening) :: this + call f_DopplerBroadening_destroy(this%instance_ptr) + this%instance_ptr = C_NULL_PTR +end subroutine +end module DopplerBroadening_M diff --git a/sammy/src/cro/mcro5.f90 b/sammy/src/cro/mcro5.f90 index 3ed9e6ff64e1ac9bf40348705ec5e7657a87346d..57e4186c6b65086fd5267375560e459aa0740e53 100644 --- a/sammy/src/cro/mcro5.f90 +++ b/sammy/src/cro/mcro5.f90 @@ -5,6 +5,9 @@ contains use DopplerAndResolutionBroadener_M use SumIsoAndConvertToTrans_M use array_sizes_common_m, only : calcData, calcDataSelf + use normalize_and_background, only : Nnneta + use broad_common_m, only : dopplerInfo + use exploc_common_m, only : I_Iflmsc use ifwrit_m, only : Kcros use fixedi_m, only : numUsedPar use, intrinsic :: ISO_C_BINDING @@ -14,10 +17,12 @@ contains class(DopplerAndResolutionBroadener)::broadener type(SumIsoAndConvertToTrans)::summer - call summer%initialize(broadener, calcDataSelf, Kcros.eq.8) summer%Need_Isotopes=needIso summer%Another_Process_Will_Happen=moreBroadening + if (.not.moreBroadening.and.Kcros.EQ.6.and.dopplerInfo%bType.EQ.0) then + CALL Nnneta (I_Iflmsc, calcData) + end if call summer%sumAndConvert(numUsedPar) call summer%destroy end subroutine sumAndConvertAfterBroadening @@ -42,6 +47,27 @@ contains call summer%normalize(numUsedPar) call summer%destroy end subroutine normAndBack + + subroutine normAfterAng(moreBroadening, needIsos, broadener) + use DerivativeHandler_M + use DopplerAndResolutionBroadener_M + use SumIsoAndConvertToTrans_M + use array_sizes_common_m, only : calcData, calcDataSelf + use ifwrit_m, only : Kcros + use fixedi_m, only : numUsedPar + use, intrinsic :: ISO_C_BINDING + implicit none + logical(C_BOOL)::moreBroadening, needIsos + class(DopplerAndResolutionBroadener)::broadener + + type(SumIsoAndConvertToTrans)::summer + + call summer%initialize(broadener, calcDataSelf, Kcros.eq.8) + summer%Need_Isotopes= needIsos + summer%Another_Process_Will_Happen=moreBroadening + call summer%angPostProcessing(numUsedPar) + call summer%destroy + end subroutine normAfterAng end module sumAndConvertAfterBroadening_m ! @@ -58,25 +84,19 @@ end module sumAndConvertAfterBroadening_m use cbro_common_m use lbro_common_m use EndfData_common_m, only : covData, radFitFlags + use broad_common_m, only : dopplerInfo IMPLICIT none integer::icr, Ntotal - logical::haveDerivs -! -! deltdp => delttt from fixedr_m (Ff(23) assigned to delt (from common block b39 -! dpdelv => delvvv from fixedr_m (Ff(25) assigned to delv (from common block b39 -! dpdelt => Gammmm from fixedr_m (Ff(27) assigned to Dddelt (from common block b39 -! -! EQUIVALENCE (Deltdp,Delttt), (Dpdelv,Delvvv), (Dpdelt,Gammmm) -! - Jwwwww = 1 + logical::haveDerivs, doAngle + Jcros = Kcros Icr = Kcros + doAngle = Kcros.EQ.7 .OR. Kcros.eq.11 Jtrans = Ktrans ! Thck = Thick Tempe = Temp Delv = Delvvv ! Dpdelv - Delt = Delttt ! Deltdp Dddelt = Gammmm ! Dpdelt Odffff = Odfmul ! @@ -102,13 +122,13 @@ end module sumAndConvertAfterBroadening_m ! *** here there is no broadening and no angular distributions and ! *** no multiple-scattering, so all affected theory parameters ! *** occur in output files - IF (.Not.Ydoppr .AND. .Not.Yresol .AND. .Not.Yangle .AND. & + IF (.Not.Ydoppr .AND. .Not.Yresol .AND. .Not.doAngle .AND. & .Not.Yssmsc) Ngbout = Ntotal ! ! *** if there is broadening (or ang dis or mul sct), figure ngbout = ! *** # of par in output GB file. Note that this number may be ! *** smaller than in the above case (where all are needed). - IF (Ydoppr .OR. Yresol .OR. Yangle .OR. Yssmsc .OR. Ntgrlq.EQ.1) & + IF (Ydoppr .OR. Yresol .OR. doAngle .OR. Yssmsc .OR. Ntgrlq.EQ.1) & Ngbout = Nfpres + Nvpext + & radFitFlags%getNumPupedVaried(covData) + Nvpiso + Nvpdet + & Nvpbrd + Nvpmsc + Nvppmc @@ -117,7 +137,6 @@ end module sumAndConvertAfterBroadening_m Filein = 'SAM51.DAT' Filout = 'SAM54.DAT' ! - Jjjdop = Kkkdop RETURN END @@ -130,40 +149,49 @@ end module sumAndConvertAfterBroadening_m use abro_common_m use cbro_common_m use lbro_common_m - use dop_m use ssm_m use orr_m use rpi_m use rsl_m - use dop_m use ssm_m use rsl_m use rpi_m use orr_m use rsl7_m use broad_common_m - use FreeGasDopplerBroadening_M use DopplerAndResolutionBroadener_M use GridData_M use EndfData_common_m, only : expData use array_sizes_common_m, only : calcData, calcDataSelf use sumAndConvertAfterBroadening_m use, intrinsic :: ISO_C_BINDING + IMPLICIT none logical::debugOut - logical(C_BOOL)::moreBroadening + logical(C_BOOL)::moreBroadening, needIsos + type(FreeGasDopplerBroadening)::broadener + integer::Jwwwww, Jjjdop, btypeSave - !TODO: break up this function that is now too long + if (Kresol.EQ.1) Kplotu = 0 debugOut = debug.or.Kplotu.ne.0 + ! jjjdop = 1 is for special print-out in + ! Samint_0 right after Leal Hwang broadening + ! Samint_0 will reset to 0, for normal + ! intermediate printout + Jjjdop = dopplerInfo%bType + + ! Jwwwww sets the title for intermediate or final output + Jwwwww = 1 + IF (Ksindi.GT.0 .and. Kcros.EQ.8) jwwwww = 5 ! do maxwellian if desired if (Maxwel.eq.1) then ! if we want intermediate output, do so - if (debugOut) call Samint_0(debugOut, Yssmsc) - if (Ksolve.ne.2) then + if (debugOut) call Samint_0(debugOut, Yssmsc, Jwwwww, Jjjdop) + if (Ksolve.ne.2) then call Samsqu_0 - end if + end if call Sammxw_0 call Samend_0 return @@ -176,7 +204,7 @@ end module sumAndConvertAfterBroadening_m call calcDataSelf%sumOverIsotopes(numUsedPar+1) ! if we want intermediate output, do so - if (debugOut) call Samint_0(debugOut, Yssmsc) + if (debugOut) call Samint_0(debugOut, Yssmsc, Jwwwww, Jjjdop) ! if fit: set's fitoption and 'genfit' call Samsqu_0 @@ -184,14 +212,25 @@ end module sumAndConvertAfterBroadening_m end if ! any angles to calculate - if (Yangle) then + IF (Kcros.EQ.7 .OR. Kcros.EQ.11) then ! if we want intermediate output, do so - if (debugOut) call Samint_0(debugOut, Yssmsc) + if (debugOut) call Samint_0(debugOut, Yssmsc, Jwwwww, Jjjdop) call Samang_0 + Jwwwww = 9 + + moreBroadening = Ydoppr.or.Yresol.or.Yssmsc + needIsos = Ydoppr.or.Yssmsc + if (.not.workArrayInit) then + call workArray%initialize() + workArrayInit = .true. + end if + call broadener%initialize(calcData, expData, workArray) + call normAfterAng(moreBroadening, needIsos, broadener) + call broadener%destroy() end if ! any doppler broadening - if (Ydoppr) then + if (Ydoppr) then moreBroadening = Yresol.OR.Yssmsc if (.not.workArrayInit) then call workArray%initialize() @@ -199,73 +238,58 @@ end module sumAndConvertAfterBroadening_m end if ! if we want intermediate output, do so - if (debugOut) call Samint_0(debugOut, Yssmsc) + if (debugOut) call Samint_0(debugOut, Yssmsc, Jwwwww, Jjjdop) ! switch handler data grid call Set_Kws - IF (Kkkdop.EQ.0) then - if (.not.associated(dopplerOption%highEnergyFreeGas)) then - allocate(dopplerOption%highEnergyFreeGas) - dopplerOption%broadener => dopplerOption%highEnergyFreeGas - call dopplerOption%broadener%initialize(calcData, expData, workArray) - end if - else IF (Kkkdop.EQ.1) then - if (.not.associated(dopplerOption%lealHwang)) then - allocate(dopplerOption%lealHwang) - dopplerOption%broadener => dopplerOption%lealHwang - call dopplerOption%broadener%initialize(calcData, expData, workArray) - end if - else IF ( Kkkdop.EQ.2) then - if (.not.associated(dopplerOption%freeGas)) then - allocate(dopplerOption%freeGas) - dopplerOption%broadener => dopplerOption%freeGas - call dopplerOption%broadener%initialize(calcData, expData, workArray) - end if - else IF ( Kkkdop.EQ.3) then - if (.not.associated(dopplerOption%crystalLattice)) then - allocate(dopplerOption%crystalLattice) - dopplerOption%broadener => dopplerOption%crystalLattice - call dopplerOption%broadener%initialize(calcData, expData, workArray) - end if - else - STOP 'Invalid doppler broadening option in cro/mcro5.f' - end if - call dopplerOption%broadener%setupBroadnener(numcro, ktzero, moreBroadening) - - IF (Kkkdop.EQ.0) then - call Samdbd_0 - else IF (Kkkdop.EQ.1) then - call Samdop_0 - else IF ( Kkkdop.EQ.2) then - call Samfgm_0(dopplerOption%freeGas) - else IF ( Kkkdop.EQ.3) then - call Samclm_0 - end if - call sumAndConvertAfterBroadening(moreBroadening, Yssmsc, dopplerOption%broadener) + dopplerInfo%broadener%debugOutput = .false. + if (Kdebug.ne.0) dopplerInfo%broadener%debugOutput = .true. + + call dopplerInfo%broadener%setupBroadener(moreBroadening, numUsedPar) + if (Kcros.EQ.8) THEN + call dopplerInfo%broadener%addSelfData(Ksindi.le.0.and.Ksitmp.GT.0, Lllmax+1) + END IF + call dopplerInfo%setDopple() + dopplerInfo%broadener%Sitemp = Sitemp + CALL Initix + call dopplerInfo%broadener%broaden() + CALL Write_Commons_Many + + IF (dopplerInfo%bType.EQ.1) Jjjdop = 1 + + call sumAndConvertAfterBroadening(moreBroadening, Yssmsc, dopplerInfo%broadener) + + Jwwwww = 2 + IF (Kcros.EQ.8) Jwwwww = 6 + IF (Kaverg.NE.2 .AND. Kaverg.NE.3) Kplotu = 0 end if + ! integral experiments - if (Ntgrlq.EQ.1) then - ! if we want intermediate output, do so - if (debugOut) call Samint_0(debugOut, Yssmsc) + if (Ntgrlq.EQ.1) then if (Ksolve.NE.2) then + ! if we want intermediate output, do so + if (debugOut) call Samint_0(debugOut, Yssmsc, Jwwwww, Jjjdop) call Samsqu_0 else if (Ksolve.EQ.2) then call Samntg_0 - end if + Kplotu = 0 + end if return ! can't have multiple scattering or resolution broadening end if ! multiple scattering IF (Yssmsc) THEN ! if we want intermediate output, do so - if (debugOut) call Samint_0(debugOut, Yssmsc) + if (debugOut) call Samint_0(debugOut, Yssmsc, Jwwwww, Jjjdop) + Jjjdop = 0 IF (Kvers7.EQ.0) then call Samssm_0 else IF (Kvers7.EQ.1) then call Sammso_0 end if + Jwwwww = 8 END IF ! sum over isotopes @@ -275,7 +299,9 @@ end module sumAndConvertAfterBroadening_m ! resolution brodening IF (Yresol) THEN ! if we want intermediate output, do so - if (debugOut) call Samint_0(debugOut, Yssmsc) + if (debugOut) call Samint_0(debugOut, Yssmsc, Jwwwww, Jjjdop) + Jjjdop = 0 + Kplotu = 0 ! allowed is: !1. one occurrence of the Gaussian plus exponential function; and/or @@ -372,7 +398,7 @@ end module sumAndConvertAfterBroadening_m ! switch handler data grid call Set_Kws - call resolutionOption%resBroad1%setupBroadnener(numcro, ktzero, moreBroadening) + call resolutionOption%resBroad1%setupBroadener(moreBroadening, numUsedPar) if (Nudwhi.ne.0) then call samudr_0 @@ -386,6 +412,7 @@ end module sumAndConvertAfterBroadening_m call Samrsl_0 end if call normAndBack(moreBroadening, resolutionOption%resBroad1) + Jwwwww = 4 else ! two resolution functions ! dex is first @@ -393,7 +420,7 @@ end module sumAndConvertAfterBroadening_m ! switch handler data grid call Set_Kws - call resolutionOption%resBroad1%setupBroadnener(numcro, ktzero, moreBroadening) + call resolutionOption%resBroad1%setupBroadener(moreBroadening, numUsedPar) if (Kkkdex.ne.0) then call samdex_0 @@ -402,15 +429,24 @@ end module sumAndConvertAfterBroadening_m end if call normAndBack(moreBroadening, resolutionOption%resBroad1) + ! if Leal Hwang we use a different auxillary grid + ! after first resolution function this is the + ! normal grid, so signal that to the + ! second resolution function + btypeSave = dopplerInfo%bType + dopplerInfo%bType = 2 + + Jwwwww = 4 + ! if we want output after first resolution function - if (debugOut) call Samint_0(debugOut, Yssmsc) + if (debugOut) call Samint_0(debugOut, Yssmsc, Jwwwww, Jjjdop) moreBroadening = .false. ! switch handler data grid call Set_Kws - call resolutionOption%resBroad2%setupBroadnener(numcro, ktzero, moreBroadening) + call resolutionOption%resBroad2%setupBroadener(moreBroadening, numUsedPar) if (Nudwhi.ne.0) then @@ -423,12 +459,20 @@ end module sumAndConvertAfterBroadening_m call Samrsl_0 end if + ! ensure that doppler broadening is reset to the user desired type + dopplerInfo%bType = btypeSave + + Jwwwww = 4 + call normAndBack(moreBroadening, resolutionOption%resBroad2) end if END IF + ! final output - call Samint_0 (.false., Yssmsc) ! which will set the correct values for where to next + ! TODO: check whether we should set Jjjdop to 0 to make sure we print + ! final output. Tr058 will fail if that is done + call Samint_0 (.false., Yssmsc, Jwwwww, Jjjdop) ! which will set the correct values for where to next end subroutine diff --git a/sammy/src/cro/mnrm1.f90 b/sammy/src/cro/mnrm1.f90 index ef2d17e2e1f686da4998222227eaaf69cab58905..3509409454926a720982e774eb8ef3d52a8bd09b 100644 --- a/sammy/src/cro/mnrm1.f90 +++ b/sammy/src/cro/mnrm1.f90 @@ -359,7 +359,7 @@ contains ! ! -------------------------------------------------------------- ! - SUBROUTINE Nnneta (Iflmsc, deriv, irow, Niso) + SUBROUTINE Nnneta (Iflmsc, deriv) ! ! *** Purpose -- Generate derivative with respect to NU ! @@ -369,7 +369,7 @@ contains use DerivativeHandler_M IMPLICIT None ! - integer::irow, Niso + integer::irow integer::Iflmsc(*) real(kind=8)::val type(DerivativeHandler)::deriv @@ -380,10 +380,12 @@ contains IF (Kjetan.LE.0) RETURN IF (Iflmsc(Kjetan).EQ.0) RETURN N = Iflmsc(Kjetan) - DO Iso=1,Niso - val = deriv%getDataNs(irow, 1, 0, iso) - val = val/Etanuu - call deriv%addDataNs(irow, 1, N, iso, val) + Do irow = 1, deriv%getLength() + DO Iso=1,deriv%getUsedIsotopes() + val = deriv%getDataNs(irow, 1, 0, iso) + val = val/Etanuu + call deriv%addDataNs(irow, 1, N, iso, val) + end do end do RETURN END diff --git a/sammy/src/dat/mdat0.f90 b/sammy/src/dat/mdat0.f90 index 31bf3d2c9c63bea00c184d247fb3881b0b74f3c6..58b020b9ab6ae31abf47ca7f6dfc7518029cf959 100644 --- a/sammy/src/dat/mdat0.f90 +++ b/sammy/src/dat/mdat0.f90 @@ -5,8 +5,8 @@ contains ! SUBROUTINE Samdat_0(secondPass) ! - use fixedi_m, only : Krefit, Medrpi, Mmmrpi, Ngtvv, Nres, Nrext, Ntotc, Nudtim, Numcro, Numdtp, Numorr - use ifwrit_m, only : Iptdop, Iptwid, Kartgd, Kdata, Kdatv, Kdebug, Kendbd, Keveng, Kidcxx, Kkkdop, & + use fixedi_m, only : Krefit, Medrpi, Mmmrpi, Ngtvv, Nres, Nrext, Ntotc, Nudtim, Numdtp, Numorr + use ifwrit_m, only : Iptdop, Iptwid, Kartgd, Kdata, Kdatv, Kdebug, Kendbd, Keveng, Kidcxx, & Kphase, Kresol, Ktzero, Ndat, Ndatb, kkclqx use exploc_common_m use oopsch_common_m, only : If_Odf, Nowwww, Segmen @@ -23,6 +23,7 @@ contains use mdat7_M use xxx4 use rst_m + use broad_common_m, only : dopplerInfo IMPLICIT none real(kind=8),allocatable,dimension(:)::A_Iedrpi, A_Ixxrpi real(kind=8),allocatable,dimension(:)::A_J1, A_J2 @@ -52,13 +53,19 @@ contains integer::ipos, j, Kdatbm, Krext, Maxd, Maxe, Mind integer::minDataIndex, Mine, Mnp, Mnr, N, Ndatbm integer,save::Ndatt - integer::Nmax, Nn, Nnndat, Np, Nr, Nwd + integer::Nmax, Nn, Nnndat, Np, Nr, Nwd, numPerEner real(kind=8),save::oldEmin,oldEmax ! Segmen(1) = 'D' Segmen(2) = 'A' Segmen(3) = 'T' Nowwww = 0 + if (expData%getLength().eq.0) then + numPerEner = 1 + else + call expData%getGrid(grid, 1) + numPerEner = grid%getNumPerEnergy() + end if ! CALL Initil hasAuxGrid = .true. @@ -116,7 +123,7 @@ contains ! ! ! *** GUESSTIMATE ARRAY Sizes - CALL Estdat (Ndatt, Ndatbm, Nnndat, Nr, Np) + CALL Estdat (Ndatt, Ndatbm, Nnndat, Nr, Np, numPerEner) ! ! ! ### one ### @@ -128,7 +135,7 @@ contains ! ### two ### ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < call allocate_real_data(A_Id, Ndatb) - call allocate_real_data(A_Idata, Ndat*Numcro) + call allocate_real_data(A_Idata, Ndat*numPerEner) call allocate_real_data(A_Ivarda, Ndatt) call allocate_integer_data(I_Iiflag, Ndat) Igtild = 1 @@ -155,12 +162,12 @@ contains indat = 1 minDataIndex = 2 if(Ktzero.NE.0) minDataIndex = minDataIndex + 1 - if(Numcro.gt.1) minDataIndex = minDataIndex + 1 - call grid%setDataIndex(minDataIndex) - maxRow = Ndat * Numcro + if(numPerEner.gt.1) minDataIndex = minDataIndex + 1 + call grid%setDataIndex(minDataIndex) + maxRow = Ndat * numPerEner maxCol = 2 - if (Numcro.gt.1) maxCol = 3 - if (Ktzero.NE.0) maxCol = maxCol + 1 + if (numPerEner.gt.1) maxCol = 3 + if (Ktzero.NE.0) maxCol = maxCol + 1 call grid%reserve(maxRow, maxCol) do i = 1, Ndat @@ -171,8 +178,8 @@ contains end if ! if not angle data - if ( Numcro.gt.1) then - do j = 1, Numcro + if ( numPerEner.gt.1) then + do j = 1, numPerEner call grid%addData(indat, 1, ee) call grid%addData(indat, 2, A_Iangle(j)) if (Ktzero.NE.0) then @@ -210,7 +217,7 @@ contains end do end if - call read_implict_data_cov(expData, numcro) + call read_implict_data_cov(expData, numPerEner) if (.not.(Kartgd.EQ.1 .OR. Kkclqx.NE.0)) then ! only if not an articial grid - in which case read data is only called once ! articial grid is not included here because ! we mulitply and and divide A_Ienerg by a factor before and after saving to ODF file @@ -238,7 +245,7 @@ contains I_Inud_E , I_Inud_T , A_Iude , A_Iudr , A_Iudt, A_J1, A_J2, Krext, I_Iflrpi) ! preserve output - CALL Estdat (Ndatt, Ndatbm, Nnndat, Nr, Np) + CALL Estdat (Ndatt, Ndatbm, Nnndat, Nr, Np, numPerEner) WRITE (21,99998) Emin, Emax, Ndat 99998 FORMAT (/' Energy range of data is from ', 1PE11.5, ' to ', & E11.5, ' eV.', /, & @@ -255,7 +262,7 @@ contains ! *** Write data onto ascii files IF (Kdata.NE.0) THEN CALL Outdat (A_Iptild , Ndat) - call reallocate_real_data(A_Id, Ndat*Numcro) + call reallocate_real_data(A_Id, Ndat*numPerEner) CALL Outv (A_Id , I_Iiflag ) ! temporary arrays used in the subroutine END IF END IF @@ -325,7 +332,7 @@ contains ! *** (Kdatbm is the maximum Ndatb could ever be) ! ! - IF (Kkkdop.NE.1) THEN + IF (dopplerInfo%bType.NE.1) THEN ! IF (Numorr.NE.0) Kendbd = 2 ! *** IF (use OR Resolution function) THEN (use grid evenly spaced @@ -367,7 +374,7 @@ contains ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > ! ! - ELSE IF (Kkkdop.EQ.1) THEN + ELSE IF (dopplerInfo%bType.EQ.1) THEN ! ! *** Here for Leal-Hwang version of Doppler broadening and ! *** choice of auxiliary grid @@ -408,18 +415,19 @@ contains else call auxGrid%initialize() call expData%addGrid(auxGrid) + call auxGrid%setNumPerEnergy(numPerEner) end if - maxRow = Ndatb * Numcro + maxRow = Ndatb * numPerEner maxCol = 1 call auxGrid%reserve(maxRow, maxCol) ipos = 1 do i = 1, Ndatb - do ii = 1, numcro + do ii = 1, numPerEner call auxGrid%addData(ipos, 1, A_Ie(i)) ipos = ipos + 1 end do end do - call auxGrid%setDataIndex(0) + call auxGrid%setDataIndex(2) end if ! @@ -451,19 +459,19 @@ contains subroutine fill_initial_aux(ener, nn, Emind, Emaxd) use EndfData_common_m, only : expData, auxEndData - use fixedi_m, only : numcro use GridData_M implicit none real(kind=8)::ener(:) real(kind=8)::Emind, Emaxd, val - integer::nn + integer::nn, numPerEner integer::ii, i, ndat real(kind=8)::ee type(GridData)::grid call expData%getGrid(grid, 1) - ndat = grid%getLength()/numcro + numPerEner = grid%getNumPerEnergy() + ndat = grid%getLength()/numPerEner nn = 0 @@ -489,7 +497,7 @@ contains ! add experimental data do i = 1, ndat - ee = grid%getData((i-1)*numcro + 1, 1) + ee = grid%getData((i-1)*numPerEner + 1, 1) nn = nn + 1 ener(nn) = ee end do @@ -509,14 +517,15 @@ contains ! ! ______________________________________________________________ ! - SUBROUTINE Estdat (Ndatt, Ndatbm, Nnndat, Nr, Np) + SUBROUTINE Estdat (Ndatt, Ndatbm, Nnndat, Nr, Np, numPerEner) ! use oops_common_m, only : Msize - use fixedi_m, only : Krefit, Nres, Ntotc, numcro, Numdtp - use ifwrit_m, only : Iptdop, Iptwid, Jjjdop, Kartgd, Kdatv, Kkkdop, Ktzero, Ndat, Ndatb + use fixedi_m, only : Krefit, Nres, Ntotc, Numdtp + use ifwrit_m, only : Iptdop, Iptwid, Kartgd, Kdatv, Ktzero, Ndat, Ndatb use fixedr_m + use broad_common_m, only : dopplerInfo IMPLICIT none - integer::Ndatt, Ndatbm, Nnndat, Nr, Np + integer::Ndatt, Ndatbm, Nnndat, Nr, Np, numPerEner integer::I,II, K, K1, K1x, K2, K3, K4, K5, K6 integer::Mnp, Mnr, N, N1, N2, Ne, Nnn, Idimen external Idimen @@ -527,7 +536,7 @@ contains IF (Ktzero.NE.0) K1 = K1 + Ndat ! ! ### two ### - Nnndat = Ndat*Numcro + Nnndat = Ndat*numPerEner IF (Kdatv.NE.0) THEN Ndatt = (Nnndat*(Nnndat+1))/2 ELSE @@ -535,7 +544,7 @@ contains END IF N = Numdtp*Ndat IF (N.EQ.0) N = 1 - K2 = Ndatb + Ndat*Numcro + Ndatt + Ndat + N + K2 = Ndatb + Ndat*numPerEner + Ndatt + Ndat + N ! ! ### three ### K3 = 8*Ntotc @@ -548,7 +557,7 @@ contains ! I = Idimen (1, 1, '1, 1') II = I + K1 + K2 - IF (Kkkdop.NE.1) THEN + IF (dopplerInfo%bType.NE.1) THEN ! --- from ### five ### N = Nres IF (Nres.EQ.0) N = 1 @@ -593,7 +602,6 @@ contains END IF ! ### four ### K4 = Ndatbm - Jjjdop = 1 ! END IF I = Idimen (I, -1, 'I, -1') diff --git a/sammy/src/dat/mdat1.f90 b/sammy/src/dat/mdat1.f90 index 305546d5fbbf52e32a19346f11571b5ff39bb879..b72f1e5a4427cc2204095582ea610eaf058cfbc5 100644 --- a/sammy/src/dat/mdat1.f90 +++ b/sammy/src/dat/mdat1.f90 @@ -31,6 +31,7 @@ contains use rpi2_m use rpi3_m use orr3_m + use broad_common_m, only : dopplerInfo IMPLICIT DOUBLE PRECISION (a-h,o-z) ! DIMENSION Bcf(*), Cf2(*), Dopwid(*), & @@ -164,12 +165,9 @@ contains ! ----------------------------------------- ! ! *** angular dispersion - Yangle = .FALSE. Emins = Eminr Emaxs = Emaxr - IF (Kcros.EQ.7) Yangle = .TRUE. IF (Kssmsc.GT.0) THEN - Yangle = .TRUE. ! *** Mass of projectile, default value Emins = Eminr* ((Aaawww-A_Mass_Small)/(Aaawww+A_Mass_Small))**2 IF (Kssdbl.GT.0) Emins = Eminr * & @@ -186,7 +184,7 @@ contains Emaxd = Emaxs IF (Dopple.GT.Zero) THEN Ydoppr = .TRUE. - IF (Kkkdop.EQ.0 .OR. Kkkdop.EQ.1) THEN + IF (dopplerInfo%bType.EQ.0 .OR. dopplerInfo%bType.EQ.1) THEN ! *** Here for high-Energy Gaussian approximation to Doppler brdng ! *** Or for Leal-Hwang Doppler broadening IF (Nolowb.EQ.0) Emind = Emind - Two*Brdlim*Dopple*dSQRT(Emind) @@ -194,12 +192,12 @@ contains IF (Maxwel.EQ.1) THEN Emind = Emins/10.0d0 ELSE - IF (Kkkdop.NE.1) STOP '[STOP in Limits in mdat1.f]' + IF (dopplerInfo%bType.NE.1) STOP '[STOP in Limits in mdat1.f]' END IF ELSE END IF Emaxd = Emaxd + Two*Brdlim*Dopple*dSQRT(Emaxd) - ELSE IF (Kkkdop.EQ.2 .OR. Kkkdop.EQ.3) THEN + ELSE IF (dopplerInfo%bType.EQ.2 .OR. dopplerInfo%bType.EQ.3) THEN ! *** here for free gas Model of Doppler broadening ! *** Also (but may change this) for crystal-lattice Doppler brdng IF (Emins.LE.Zero) THEN @@ -207,7 +205,7 @@ contains ELSE V = dSQRT(Emins) END IF - IF (Kkkdop.EQ.2) THEN + IF (dopplerInfo%bType.EQ.2) THEN V = V - Brdlim*1.001d0*Dopple ELSE ! temporary, eventually do this more logically @@ -221,7 +219,7 @@ contains END IF END IF V = dSQRT(Emaxd) - IF (Kkkdop.EQ.2) THEN + IF (dopplerInfo%bType.EQ.2) THEN V = V + Brdlim*1.001d0*Dopple ELSE ! *** temporary, eventually do this more logically ? @@ -251,6 +249,7 @@ contains use broad_common_m use lbro_common_m use Wdsint_m + use broad_common_m, only : dopplerInfo IMPLICIT DOUBLE PRECISION (a-h,o-z) ! DIMENSION Bcf(*), Cf2(*), Dopwid(*) @@ -294,7 +293,7 @@ contains DO Iso=1,Numiso A = Dopwid(Iso)*dSQRT(Emin) B = Dopwid(Iso)*dSQRT(Emax) - IF (Kkkdop.EQ.2) THEN + IF (dopplerInfo%bType.EQ.2) THEN A = Two*A B = Two*B END IF @@ -438,6 +437,7 @@ contains use fixedr_m use mdat9_m use GridData_M + use broad_common_m, only : dopplerInfo use AuxGridHelper_M, only : setAuxGridRowMax IMPLICIT DOUBLE PRECISION (a-h,o-z) real(kind=8),allocatable,dimension(:)::E(:), Energy(:) @@ -519,7 +519,7 @@ contains Ndatr = Ndatry - Ndatrx + 1 Ndatx = Ndatxy - Ndatxx + 1 IF (Ndatx+1.LT.Ndat .AND. Kartgd.NE.1 .AND. Maxwel.NE.1) THEN - IF (Kkkdop.NE.1) THEN + IF (dopplerInfo%bType.NE.1) THEN WRITE (6,20000) Ndatx, Ndat 20000 FORMAT (' Possible problem in FIX -- Ndatx < Ndat', 2I6) END IF diff --git a/sammy/src/dat/mdat4.f90 b/sammy/src/dat/mdat4.f90 index 9f98163741dd25b8cc456997e9a17e4314ff7017..5e8795f8c71251ed0587f4b49d045b33b3b17aa3 100644 --- a/sammy/src/dat/mdat4.f90 +++ b/sammy/src/dat/mdat4.f90 @@ -20,6 +20,7 @@ contains use EndfData_common_m use SammyGridAccess_M use mthe0_M + use broad_common_m, only : dopplerInfo IMPLICIT DOUBLE PRECISION (a-h,o-z) ! type(SammyGridAccess)::grid @@ -52,7 +53,7 @@ contains N5 = 5 IF (Ndatb.LT.N5) N5 = Ndatb ! - IF (Kkkdop.NE.2) THEN + IF (dopplerInfo%bType.NE.2) THEN D = (Ee(N5)-Ee(1))/Dfloat(N5-1) ! = average spacing between first N5 data points X = Ee(1) - Emind @@ -99,7 +100,7 @@ contains N5 = 5 IF (Ndatb.LT.N5) N5 = Ndatb ! - IF (Kkkdop.EQ.2) THEN + IF (dopplerInfo%bType.EQ.2) THEN ! *** Here equally-spaced in velocity (Ie in sqrt(E)) for ! *** free-gas Doppler D = ( DSQRT(Ee(Ndatb))-DSQRT(Ee(Ndatb-N5+1)) )/Dfloat(N5-1) @@ -174,8 +175,7 @@ contains ELSE ! ! *** Here there's really no broadening - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToExpGrid(expData) numEl = grid%getNumEnergies(expData) diff --git a/sammy/src/dat/mdat7.f90 b/sammy/src/dat/mdat7.f90 index 84af315fdc9c3782c4faa27b31d9dcdd2bbc5442..95fe7ae5540953c9841e2dbf5dadc7dd59588f86 100644 --- a/sammy/src/dat/mdat7.f90 +++ b/sammy/src/dat/mdat7.f90 @@ -22,21 +22,16 @@ module mdat7_M use dop2_m IMPLICIT DOUBLE PRECISION (a-h,o-z) ! - type(GridData)::coefGrid real(kind=8),allocatable,dimension(:)::Energb -! -! delt => delttt from fixedr_m (Ff(23) assigned to delt -! dpdelt => gammmm from fixedr_m (Ff(27) -! dpdelv => delvvv from fixedr_m (Ff(25) assigned t -! -! EQUIVALENCE (Delttt,Delt), (Gammmm,Dpdelt), (Delvvv,Dpdelv) + ! Todo: Retrieve Boltzman constant from the SAMMY constant module. DATA Xkb /8.617065D-05/, Zero /0.0d0/ ! - double precision, pointer::delt => Ff(23) + double precision, pointer::Dpdelt => Ff(27) double precision, pointer::Dpdelv => Ff(25) + if (.not.associated(dopplerInfo%lealHwang)) return Emid = (Emin+Emax)*0.5d0 Vvmin = DSQRT(Eminr) @@ -44,15 +39,17 @@ module mdat7_M Xvmin = DSQRT(Emin) Xvmax = DSQRT(Emax) ! - Delt = Delttt - IF (Delt.EQ.0.0D0) Delt = 5.0D0 + delT = dopplerInfo%lealHwang%Delt + if (delT.eq.0.0d0) Delt = 5.0d0 +! ! *** a reasonable number ? probably will want to change eventually ! Itime = 0 - AJ = Temp/Delt + AJ = Temp/delT J = AJ IF (J.LE.10) J = 10 Delt = Temp/Dfloat(J) + dopplerInfo%lealHwang%Delt = Delt ! *** adjust delt slightly so that "j" steps gets us exactly to Temp ! Dpdelt = (Delt*Xkb)/(4.0D0*Aaawww) @@ -70,22 +67,22 @@ module mdat7_M /,' xvmin, xvmax =', 23X, 3(1pg14.5)) ! ! - Kjjjjj = J - K2pls1 = J + J + 1 + dopplerInfo%lealHwang%Kjjjjj = J + dopplerInfo%wantBroaden = .true. + dopplerInfo%lealHwang%K2pls1 = J + J + 1 ! ! ! *** Coefgn generates coefficients Coef (which we put into Energb ! *** for now) for solving heat equation for performing Doppler -! *** broadening - call coefGrid%initialize() - CALL Coefgn (coefGrid, Kjjjjj, K2pls1, Mkkkkk, M2pls1, 0) - call reallocate_real_data(Energb, coefGrid%getLength()) +! *** broadening + CALL Coefgn (dopplerInfo%lealHwang%coefGrid, dopplerInfo%lealHwang%Kjjjjj, Mkkkkk, M2pls1) + call reallocate_real_data(Energb, dopplerInfo%lealHwang%coefGrid%getLength()) ! *** Mkkkkk is the number actually used, since the rest are ! *** effectively zero ! - WRITE (21,10002) Mkkkkk, Kjjjjj - WRITE ( 6,10002) Mkkkkk, Kjjjjj + WRITE (21,10002) Mkkkkk, dopplerInfo%lealHwang%Kjjjjj + WRITE ( 6,10002) Mkkkkk, dopplerInfo%lealHwang%Kjjjjj 10002 FORMAT (' New and actual values of J = ', 2I8) ! N = (Vmax-Vvmin)/Dpdelv @@ -96,7 +93,6 @@ module mdat7_M IF (Ndatb.GT.Kdatbm) STOP '[STOP in Llgrid in dat/mdat7.f]' ! ! Delvvv = Dpdelv -! Delttt = Dpdelt ! Gammmm = Dpdelt ! ! @@ -116,28 +112,25 @@ module mdat7_M ! IF (Ngtvv.NE.0) THEN DO I=1,Ngtvv - call coefGrid%addData(I, 1, -(Vvmin + Dpdelv*Dfloat(I)) **2) + call dopplerInfo%lealHwang%coefGrid%addData(I, 1, -(Vvmin + Dpdelv*Dfloat(I)) **2) END DO - call coefGrid%addData(Ngtvv+1, 1, Zero) + call dopplerInfo%lealHwang%coefGrid%addData(Ngtvv+1, 1, Zero) Ngtvv = Ngtvv + 1 Nnn = Ngtvv + 1 END IF END IF ! DO I=Nnn,Ndatb - call coefGrid%addData(I, 1, (Vvmin + Dpdelv*Dfloat(I)) **2) + call dopplerInfo%lealHwang%coefGrid%addData(I, 1, (Vvmin + Dpdelv*Dfloat(I)) **2) END DO - call reallocate_real_data(Energb, coefGrid%getLength()) - do i = 1, coefGrid%getLength() - Energb(i) = coefGrid%getData(i,1) + call reallocate_real_data(Energb, dopplerInfo%lealHwang%coefGrid%getLength()) + do i = 1, dopplerInfo%lealHwang%coefGrid%getLength() + Energb(i) = dopplerInfo%lealHwang%coefGrid%getData(i,1) end do - call coefGrid%destroy() - - ! - Nwd = K2pls1 + Nwd = dopplerInfo%lealHwang%K2pls1 Awid = Dpdelv*(2.0D0*DSQRT(Emid+Dpdelv)) RETURN ! diff --git a/sammy/src/dat/mdat9.f90 b/sammy/src/dat/mdat9.f90 index cc41467e6fd464443743f0cfc3af730d24b5b86a..b25c0231a981dcd99f38195a7935c580b6343313 100755 --- a/sammy/src/dat/mdat9.f90 +++ b/sammy/src/dat/mdat9.f90 @@ -115,16 +115,13 @@ module mdat9_m ! *** Purpose -- Locate position Nwhere, such that ! *** grid%getEnergy(Nwhere, expData) =< E < grid%getEnergy(Nwhere+1, expData), ! *** for Nn < 2**K points in En - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M DOUBLE PRECISION E type(SammyGridAccess)::grid N = istart - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) IF (E.GT.grid%getEnergy(istart, expData)) THEN diff --git a/sammy/src/dbd/HighEnergyFreeGas_m.f90 b/sammy/src/dbd/HighEnergyFreeGas_m.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c0378e5b342b174ac64200b9b48bf0f96aa14206 --- /dev/null +++ b/sammy/src/dbd/HighEnergyFreeGas_m.f90 @@ -0,0 +1,45 @@ +module HighEnergyFreeGas_m +use FortranExtDopplerBroadening_M +use DopplerBroadening_M +use DerivativeHandler_M +use GridData_M +use, intrinsic :: ISO_C_BINDING + + +implicit none + +type, extends(FortranExtDopplerBroadening) :: HighEnergyFreeGas +real(kind=8)::Dopple +contains +procedure, pass(this) :: initialize => HighEnergyFreeGas_initialize +procedure, pass(this) :: broaden => HighEnergyFreeGas_broaden +procedure, pass(this) :: destroy => HighEnergyFreeGas_destroy +end type HighEnergyFreeGas + +contains +subroutine HighEnergyFreeGas_initialize(this, hand, list, work) + implicit none + class(HighEnergyFreeGas) :: this + class(DerivativeHandler)::hand + class(GridDataList)::list + class(GridDataList)::work + call FortranExtDopplerBroadening_initialize(this, hand, list, work) +end subroutine + +subroutine HighEnergyFreeGas_destroy(this) + implicit none + class(HighEnergyFreeGas) :: this + call FortranExtDopplerBroadening_destroy(this) +end subroutine + + + +subroutine HighEnergyFreeGas_broaden(this) + class(HighEnergyFreeGas) :: this + + call FortranExtDopplerBroadening_broaden(this) + call this%setXoefWeights(2) + call this%nullifyWorkGrid(1) +end subroutine + +end module HighEnergyFreeGas_m diff --git a/sammy/src/dbd/mdbd0.f b/sammy/src/dbd/mdbd0.f deleted file mode 100644 index 69abf941628f60617ba65fb91438c060a402de59..0000000000000000000000000000000000000000 --- a/sammy/src/dbd/mdbd0.f +++ /dev/null @@ -1,83 +0,0 @@ -C -C - SUBROUTINE Samdbd_0 -C -C *** purpose -- perform High-Energy-Gaussian Approximation version of -c Doppler broadening -C - use fixedi_m, only : Jwwwww, K2reso, Kkkdex, Kkkrsl, Ndatd, - * Nudwhi, Numorr, Numorr, Numrpi - use ifwrit_m, only : Kplotu, Kvers7, Ndatb - use exploc_common_m - use array_sizes_common_m - use oopsch_common_m, only : Nowwww, Segmen - use brdd_common_m, only : Weights - use lbro_common_m, only : Debug, Yresol, Yssmsc - use AllocateFunctions_m - use rsl7_m - use mxct27_m - IMPLICIT None -C - real(kind=8),allocatable,dimension(:)::A_Iwts - integer::Nm, Kdatb -C - WRITE (6,99999) -99999 FORMAT (' *** SAMMY-DBD 15 Nov 07 ***') - Segmen(1) = 'D' - Segmen(2) = 'B' - Segmen(3) = 'D' - Nowwww = 0 -C - CALL Initix - IF (Kplotu.NE.0) Kplotu = 0 -C - Kdatb = Ndatd - IF (Kdatb.EQ.0) Kdatb = Ndatb -C -C -C *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR SAMDBD - CALL Estdbd (Kdatb) -C - Nm = Kdatb -C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -< -C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < -C *** Xcoef generates coefficients to be used in broadening - CALL Xcoef (Nm) -C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > -C - call allocate_real_data(A_Iwts, Kdatb) -C *** Dopplr PERFORMS DOPPLER BROADENING OPERATION (HEGA) - CALL Dopplr(A_Idpiso , I_Iflmsc , Weights , A_Iwts) -C - deallocate(A_Iwts) -C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -> -C - Jwwwww = 2 -C - CALL Write_Commons_Many - RETURN -C - END -C -C -C __________________________________________________________________ -C - SUBROUTINE Estdbd (Kdatb) -C -C *** purpose -- estimate array size for this segment -C - IMPLICIT none - integer::Kdatb - logical Need_Isotopes - integer::I, K, Idimen - external Idimen -C -cx CALL Figure_Kws_1 (Kone) -cx k = Kone + 2*Kdatb - K = 2*Kdatb - K = Idimen (K, 1, 'K, 1') - I = Idimen (K, -1, 'K, -1') - I = Idimen (0, 0, '0, 0') -C - RETURN - END diff --git a/sammy/src/dbd/mdbd0.f90 b/sammy/src/dbd/mdbd0.f90 new file mode 100644 index 0000000000000000000000000000000000000000..116c59225f0485e0ef0866c8dd4db115ae841ad5 --- /dev/null +++ b/sammy/src/dbd/mdbd0.f90 @@ -0,0 +1,46 @@ +module HighEnergyFreeGasImpl_m +use HighEnergyFreeGas_m +implicit none +type, extends(HighEnergyFreeGas) :: HighEnergyFreeGasImpl +contains +procedure, pass(this) :: initialize => HighEnergyFreeGasImpl_initialize +procedure, pass(this) :: broaden => HighEnergyFreeGasImpl_broaden +procedure, pass(this) :: destroy => HighEnergyFreeGasImpl_destroy +end type HighEnergyFreeGasImpl + +contains +subroutine HighEnergyFreeGasImpl_initialize(this, hand, list, work) + implicit none + class(HighEnergyFreeGasImpl) :: this + class(DerivativeHandler)::hand + class(GridDataList)::list + class(GridDataList)::work + call HighEnergyFreeGas_initialize(this, hand, list, work) +end subroutine + +subroutine HighEnergyFreeGasImpl_destroy(this) + implicit none + class(HighEnergyFreeGasImpl) :: this + call HighEnergyFreeGas_destroy(this) +end subroutine + +subroutine HighEnergyFreeGasImpl_broaden(this) +! + use Dopplr_m + IMPLICIT None +! + class(HighEnergyFreeGasImpl)::this +! + WRITE (6,99999) +99999 FORMAT (' *** SAMMY-DBD 15 Nov 07 ***') + +! + call HighEnergyFreeGas_broaden(this) +! +! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > +! +! *** Dopplr PERFORMS DOPPLER BROADENING OPERATION (HEGA) + CALL Dopplr_calc(this) + + END subroutine +end module HighEnergyFreeGasImpl_m diff --git a/sammy/src/dbd/mdbd1.f b/sammy/src/dbd/mdbd1.f deleted file mode 100644 index 0538f73101075910ef503f47c84872abf11bdc2c..0000000000000000000000000000000000000000 --- a/sammy/src/dbd/mdbd1.f +++ /dev/null @@ -1,430 +0,0 @@ -C -C -C -------------------------------------------------------------- -C - SUBROUTINE Dopplr (Dopwid, Iflmsc, Weight, Wts) -C -C *** PURPOSE -- FORM DOPPLER-BROADENED CROSS SECTION and derivatives -C - use fixedi_m, only : Ktruet, - * Ndats, numcro, numUsedPar - use ifwrit_m, only : ktzero, Kcros, Kdebug, Kfinit, Kvthck, - * Ndat, Nolowb, Nonu, Kvtemp - use fixedr_m, only : Elowbr, Emaxs, Emins, Thick - use broad_common_m, only : Brdlim, Dopple - use brdd_common_m, only : Ipnts, Iup, Kc - use lbro_common_m, only : Yresol, Yssmsc, Ytrans - use xct2_m - use mxct27_m - use broad_common_m - use EndfData_common_m, only : expData - use AuxGridHelper_M, only : setAuxGridOffset, - * setAuxGridRowMax, getNumAuxGridPoints - use SammyGridAccess_M - use array_sizes_common_m, only : calcData, calcDataSelf - use convert_to_transmission_m - use normalize_and_background - IMPLICIT none - logical Another_Process_will_Happen -C - type(SammyGridAccess)::grid, auxGrid - real(kind=8):: Weight(*), Wts(*), Dopwid(*) - integer::Iflmsc(*) - real(kind=8)::Two, val - real(kind=8)::Ddo, e1, eKdatb, Elow, EM, Eup - real(kind=8)::Vv, Wdop - integer::Iffy, Iso, Isox, J, Jwhich, nauxStart, Ipar, N - integer::Kkkdat, Kkkkkk, Kkkmin, Now, numEl, nauxMax,insig - integer(C_SIZE_T)::isoC - -C *** Brdlim is now set in segment DAT - DATA Two /2.0d0/ - - call grid%initialize() - call grid%setParameters(numcro, ktzero) - call grid%setToExpGrid(expData) - numEl = grid%getNumEnergies(expData) - call auxGrid%initialize() - call auxGrid%setParameters(numcro, ktzero) - call auxGrid%setToAuxGrid(expData) - call setAuxGridOffset(1) ! reset the auxillary grid starting point - -C -C -C *** FORM DOPPLER-BROADENED CROSS SECTION, STORE IN Wg.. -C *** ALSO DOPPLER-BROADEN THE PARTIAL DERIVATIVES. -C - Another_Process_will_Happen = Yresol.OR.Yssmsc - nauxMax = getNumAuxGridPoints() -C - call calcData%nullify() - call calcData%reserve(nauxMax*calcData%getNnnsig(), - * numUsedPar+1) - Now = 0 -C -C -C *** Do separately for each isotope (Nuclide), since Doppler-width is -C *** isotope-dependent - DO Iso=1,calcData%getUsedIsotopes() - Isox = Iso - isoC = iso - Isox = calcData%getRealIsotopeIndex(isoC) - if (Isox.lt.0) cycle ! this isotope is exclude from the calculation - Ddo = Dopwid(Isox) - Isox = iso -C - Iffy = 0 - Kc = 1 - Iup = 0 - Ddo = Dopple -C -C *** start of major loop over energy-points - Kkkkkk = 0 - Kkkmin = 0 - Kkkdat = 0 - nauxStart = 0 - DO 70 J=1,nauxMax - IF ((J/10000)*10000.EQ.J) WRITE (6,10000) J -10000 FORMAT (' *** on data point number', i10) -cq -cqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq -cq -cq November 9, 2001 -- the following are not right because Sigsin, Dasigs, -cq and Dbsigs are not defined here. Probably, they -cq should be (cf mfgm1.f sbrtine Dopfgm). -cq -cqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq -C - IF (Another_Process_will_Happen) THEN - EM = auxGrid%getEnergy(J, expData) - ELSE - IF (J.GT.Ndat) THEN - GO TO 80 - ELSE - Em = grid%getEnergy(J, expData) - END IF - END IF -C - IF (Em.LT.Emins) nauxStart = J - IF (Em.LT.Emins) GO TO 70 - IF (Em.GT.Emaxs) GO TO 80 - Kkkdat = Kkkdat + 1 - Vv = dSQRT(Em) -C - Wdop = Two*Ddo*Vv -C Wdop=DOPPLER WIDTH AT Energy EM -C - Eup = Em + Brdlim*Wdop - eKdatb = auxGrid%getEnergy(nauxMax, expData) - IF (Eup.GT.eKdatb) Eup = eKdatb - Elow = Em - Brdlim*Wdop - e1 = auxGrid%getEnergy(1, expData) - IF (Elow.LT.e1) Elow = e1 -C -C ********* find how many and which points are in integral for j - CALL Kountd_Dbd (Elow, Eup) - IF (Iup.GT.nauxMax) Iup = nauxMax -C - Kkkkkk = Kkkkkk + 1 - IF ((Nolowb.NE.0 .AND. Elowbr.GT.Em) .OR. Ipnts.le.5) THEN -C ********* IF (don't want low-E brdng, or) too few points, do not broaden - CALL Which_Dbd (Em, Ipnts, Jwhich, Kc) - Now = Now + 1 - do ipar = 0, numUsedPar - DO N=1, calcData%getNnnsig() - val = calcData%getDataNsOld(Jwhich, N, Ipar, Isox) - if ( val.eq.0.0d0) cycle - call calcData%addDataNs(Kkkkkk, N, Ipar, Isox, val) - end do - end do - IF (numUsedPar.gt.0.and.Kvtemp.GT.0) THEN - DO N=1, calcData%getNnnsig() - call calcData%addDataNs(Kkkkkk, N, Kvtemp, Isox, - * 0.0d0) - end do - END IF - ELSE -C ********* Doppler-broaden - CALL Xdoppl (auxGrid, Weight, Wts, - * Em, Wdop, Iffy, Isox, Kkkkkk) - - END IF -C -C - - IF (.NOT. Another_Process_will_Happen) THEN -C ********* eta? - IF (Kcros.EQ.6) CALL Nnneta (Iflmsc, calcData, Kkkkkk, 1) - END IF -C - 70 CONTINUE -C ****** end of energy do-loop -C - 80 CONTINUE - END DO -C *** End of do loop on nuclides -C - nauxStart = nauxStart + 1 - call setAuxGridRowMax(Kkkdat) - IF (Iffy.EQ.0) WRITE (21,99998) -99998 FORMAT (/,' ** NOTE -- NO DOPPLER BROADENING ACTUALLY OCCURED **') - IF (Now.NE.0) WRITE (21,99997) Now, - * Kkkdat*calcData%getUsedIsotopes() - IF (Now.NE.0 .AND. Kdebug.NE.0) WRITE (06,99997) Now, - * Kkkdat*calcData%getUsedIsotopes() -99997 FORMAT (' No Doppler broadening occured', I8, - * ' times of a possible', I8) - IF (Kkkdat.LT.Ndats-2) WRITE (6,10100) Kkkdat, Ndats -10100 FORMAT (' Kkkdat, ndats =', 2I10) -C - call grid%destroy() - call auxGrid%destroy() - call dopplerOption%highEnergyFreeGas%updateBroadenedOffset( - * nauxStart) - call dopplerOption%highEnergyFreeGas%setLength(Kkkdat) - call setAuxGridOffset(nauxStart) - RETURN - END -C -C -C -------------------------------------------------------------- -C - SUBROUTINE Xdoppl ( grid, Weight, Wts, - * EM, Wdop, Iffy, Isox, irow) -C -C *** Perform integration for Doppler-Broadening from point number -C *** Kc to point number Iup -C - use fixedi_m, only : numUsedPar - use ifwrit_m, only : Kdebug, Kvtemp - use fixedr_m, only : Temp - use brdd_common_m, only : Ipnts, Iup, Kc - use EndfData_common_m, only : expData - use SammyGridAccess_M - use, intrinsic :: ISO_C_BINDING - use array_sizes_common_m, only : calcData - IMPLICIT None - - type(SammyGridAccess)::grid -C - real(kind=8)::Weight(*), Wts(*) - real(kind=8)::Em, Wdop, val - integer::Iffy, Isox, Ipos, irow -C - real(kind=8)::Sigpls(100), Sigmns(100), Derdop(100) - real(kind=8)::Zero, One - real(kind=8)::Del, Derdp1, Derdp2, ewhich, Sigt, W - integer::I, Ikc, Ipar, Iso, Jwhich, K, KS, N, Iparx - logical(C_BOOL)::accu - DATA Zero /0.0d0/, One /1.0d0/ - IF (calcData%getNnnsig().GT.100) then - STOP '[STOP in Xdoppl in dbd/mdbd1.f]' - end if -C - - Iffy = Iffy + 1 - KS = 1 - Iso = Isox -C - Del = 0.02d0 - Derdop = 0d0 - IF (numUsedPar.gt.0 .AND. Kvtemp.GT.0) THEN - W = Wdop*(One+Del) - CALL Fundop (W, EM, grid, Weight, Wts, Sigpls, Isox) - W = Wdop*(One-Del) - CALL Fundop (W, EM, grid, Weight, Wts, Sigmns, Isox) - DO I=1,calcData%getNnnsig() - Derdop(I) = 0.5d0*(Sigpls(I)-Sigmns(I))/(Del*Wdop) - END DO - END IF -C -C *** Simpson rule -- figure Wts = 0.5 * gaussian * -C *** [ Energy(I+1)-Energy(I-1) ] - IF (Ipnts.LE.12) CALL Simpsn (EM, grid, Wts, Wdop) -C -C *** 4-point quadrature rule Wts = Weight * gaussian - IF (Ipnts.GT.12) CALL Dopbrd (EM, grid, Weight, Wts, Wdop) -C - accu = .true. - call calcData%setAccumulate(accu) - DO N=1,calcData%getNnnsig() - ! update cross section (ipar=0) as well as derivatives - Do Ipar = 0, numUsedPar - val = 0.0 - DO I=1,Ipnts - IF (Wts(I).eq.Zero) cycle - Ikc = I + Kc - 1 - val = val + - * calcData%getDataNsOld(Ikc,N, Ipar, Iso)*Wts(I) - end do - if (val.eq.0) cycle - call calcData%addDataNs(irow, N, Ipar, Iso, val) - END DO - END DO - accu = .false. - call calcData%setAccumulate(accu) -C - IF (Kvtemp.GT.0.and.numUsedPar.GT.0) THEN - DO N=1,calcData%getNnnsig() - val = Derdop(N)*Wdop*0.5d0/Temp - call calcData%addDataNs(irow, N, Kvtemp, Iso, val) - END DO - END IF -C - IF (Kdebug.EQ.0 .OR. Kvtemp.LE.0) RETURN - IF (numUsedPar.EQ.0) RETURN -C -C *** here for debug info only - Sigt = calcData%getDataNs(irow, 1, 0, Iso) - Derdp1 = (Sigpls(1)-Sigt)/(Del*Wdop) - Derdp2 = (Sigt-Sigmns(1))/(Del*Wdop) - IF (Derdop(1).EQ.Zero .AND. Derdp2.EQ.Zero) RETURN - IF (Derdop(1).EQ.Zero .AND. Derdp2.NE.Zero) GO TO 60 - IF (Derdop(1).NE.Zero .AND. Derdp2.EQ.Zero) GO TO 60 - IF (dABS(Derdp1/Derdop(1)-1.0d0).GT.0.05d0) GO TO 60 - IF (dABS(Derdp2/Derdop(1)-1.0d0).GT.0.05d0) GO TO 60 - IF (dABS(Derdp1/Derdp2 -1.0d0).GT.0.08d0) GO TO 60 - RETURN -C - 60 CONTINUE - Jwhich = (Kc+Iup)/2 - ewhich = grid%getEnergy(Jwhich, expData) - WRITE (6,99999) ewhich, Derdp1, Derdop(1), Derdp2 -99999 FORMAT (' ** WARNING ON Dopplr DERIV--E,D1,D,D2=', F8.1, - * 3(1PG11.3)) - RETURN - END -C -C -C -------------------------------------------------------------- -C - SUBROUTINE Dopbrd (Em, grid, Weight, Wts, Widgau) -C -C *** FORM THE GAUSSIAN DOPPLER WeightS AND NORMALIZE THEM -C - use brdd_common_m, only : Ipnts, Kc - use EndfData_common_m, only : expData - use SammyGridAccess_M - IMPLICIT None -C - real(kind=8)::Weight(*), Wts(*), Em, Widgau - type(SammyGridAccess)::grid ! this is possible in fixed form g77 as in same compile unit - real(kind=8)::e1, S, Y, Z - integer::I -C - Y = 85.0D0 - DO I=1,Ipnts - e1 = grid%getEnergy(I+Kc-1, expData) - Z = (e1-Em)/Widgau - Z = Z*Z - IF (Z.GT.Y) Z = Y - Z = dEXP(-Z) - Wts(I) = Weight(I+kc-1)*Z - END DO -C - S = 0.0D0 - DO I=1,Ipnts - S = S + Wts(I) - END DO - S = 1.0D0/S - DO I=1,Ipnts - Wts(I) = Wts(I)*S - END DO -C - RETURN - END -C -C -C -------------------------------------------------------------- -C - SUBROUTINE Simpsn (Em, grid, Wts, Widgau) -C -C *** Form the Gaussian Doppler Weights via Simpson's rule, and -C *** normalize them -C - use brdd_common_m, only : Ipnts, Kc - use EndfData_common_m, only : expData - use AuxGridHelper_M, only : getNumAuxGridPoints - use SammyGridAccess_M - IMPLICIT None -C - real(kind=8)::Wts(*) - real(kind=8)::Em, Widgau - type(SammyGridAccess)::grid ! this is possible in fixed form g77 as in same compile unit - - real(kind=8)::eval1, eval2, eval3, S, Y, Z - integer::I, J, nauxMax -C - J = Ipnts - nauxMax = getNumAuxGridPoints() - IF (Kc+Ipnts.GT.nauxMax) J = Ipnts - 1 - Ipnts = J -C - Y = 85.0D0 - I = 1 - eval1 = grid%getEnergy(I+Kc-1, expData) - Z = (eval1-Em)/Widgau - Z = Z*Z - IF (Z.GT.Y) Z = Y - Z = dEXP(-Z) - eval2 = grid%getEnergy(I+Kc, expData) - Wts(I) = (eval2-eval1)*Z -C *** note that we must treat i=1 case separately to avoid -C *** trying to use index at 0 - DO I=2,Ipnts - eval1 = grid%getEnergy(I+Kc-1, expData) - Z = (eval1-Em)/Widgau - Z = Z*Z - IF (Z.GT.Y) Z = Y - Z = dEXP(-Z) - eval2 = grid%getEnergy(I+Kc, expData) - eval3 = grid%getEnergy(I+Kc - 2, expData) - Wts(I) = (eval2-eval3)*Z -C ****** note there should be a 1/2 factor, but we'll normalize anyway - END DO -C - S = 0.0D0 - DO I=1,Ipnts - S = S + Wts(I) - END DO - S = 1.0D0/S - DO I=1,Ipnts - Wts(I) = Wts(I)*S - END DO -C - RETURN - END -C -C -C -------------------------------------------------------------- -C - SUBROUTINE Fundop (Wdop, Em, grid, Weight, Wts, Sum, - * Isox) -C - use brdd_common_m, only : Ipnts, Kc - use EndfData_common_m, only : expData - use SammyGridAccess_M - use array_sizes_common_m, only : calcData - IMPLICIT None - type(SammyGridAccess)::grid ! this is possible in fixed form g77 as in same compile unit - real(kind=8):: Wts(*), Sum(*), - * weight(*), Wdop, Em - integer::isox - real(kind=8)::Zero, val - integer::I, Ikc, N - DATA Zero /0.0d0/ -C - IF (Ipnts.LE.12) CALL Simpsn (Em, grid, Wts, Wdop) - IF (Ipnts.GT.12) CALL Dopbrd (Em, grid, Weight, Wts, Wdop) - CALL Zero_Array (Sum, calcData%getNnnsig()) - DO I=1,Ipnts - IF (Wts(I).NE.Zero) THEN - Ikc = I + Kc - 1 - DO N=1,calcData%getNnnsig() - val = calcData%getDataNsOld(Ikc, N, 0, Isox) - Sum(N) = Sum(N) + Wts(I)*val - END DO - END IF - END DO - RETURN - END diff --git a/sammy/src/dbd/mdbd1.f90 b/sammy/src/dbd/mdbd1.f90 new file mode 100644 index 0000000000000000000000000000000000000000..56f0b2a8ba72b265d8a3b3f4a81871168c2b5ab9 --- /dev/null +++ b/sammy/src/dbd/mdbd1.f90 @@ -0,0 +1,378 @@ +module Dopplr_m +use HighEnergyFreeGas_m +use DerivativeHandler_M +use ifwrit_m, only : Kvtemp, Nolowb +use fixedr_m, only : Emaxs, Emins +use exploc_common_m, only : A_Idpiso, I_Iflmsc +use, intrinsic :: ISO_C_BINDING +implicit none +public Dopplr_calc +contains + SUBROUTINE Dopplr_calc(calc) + class(HighEnergyFreeGas)::calc + call Dopplr(calc, A_Idpiso , I_Iflmsc) + end SUBROUTINE +! +! +! -------------------------------------------------------------- +! + SUBROUTINE Dopplr (calc, Dopwid, Iflmsc) +! +! *** PURPOSE -- FORM DOPPLER-BROADENED CROSS SECTION and derivatives +! +! + class(HighEnergyFreeGas)::calc + real(kind=8):: Dopwid(*) + integer::Iflmsc(*) + real(kind=8)::Two, val + real(kind=8)::Ddo, e1, eKdatb, Elow, EM, Eup + real(kind=8)::Vv, Wdop + integer::Iffy, Iso, Isox, J, Jwhich, nauxStart, Ipar, N, iposVel + integer::Kkkdat, Kkkkkk, Kkkmin, Now, numEl, nauxMax,insig + integer(C_SIZE_T)::isoC + type(DerivativeHandler) :: calcData + logical(C_BOOL)::oneExtra + integer::Ipnts, Kc, Ndats + +! *** Brdlim is now set in segment DAT + DATA Two /2.0d0/ + + oneExtra = .false. + numEl = calc%getNumEnergyBroadened() + nauxMax = calc%getNumEnergyUnbroadened() +! + call calc%getdata(calcData) + call calcData%nullify() + call calcData%reserve(nauxMax*calcData%getNnnsig(),calc%getNumParams()+1) + Now = 0 + +! +! +! *** Do separately for each isotope (Nuclide), since Doppler-width is +! *** isotope-dependent + DO Iso=1,calcData%getUsedIsotopes() + Isox = Iso + isoC = iso + Isox = calcData%getRealIsotopeIndex(isoC) + if (Isox.lt.0) cycle ! this isotope is exclude from the calculation + Ddo = Dopwid(Isox) + Isox = iso +! + Iffy = 0 + Ddo = calc%Dopple +! +! *** start of major loop over energy-points + Kkkkkk = 0 + Kkkmin = 0 + Kkkdat = 0 + nauxStart = 0 + DO 70 J=1,numEl + IF ((J/10000)*10000.EQ.J) WRITE (6,10000) J +10000 FORMAT (' *** on data point number', i10) +!q +!qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq +!q +!q November 9, 2001 -- the following are not right because Sigsin, Dasigs, +!q and Dbsigs are not defined here. Probably, they +!q should be (cf mfgm1.f sbrtine Dopfgm). +!q +!qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq +! + Em = calc%getEnergyBroadened(J) ! desired energy + iposVel = calc%getEmInUnbroadened(Em, iposVel) ! find position (iposVel) in un-broadened grid and get the velocity +! + IF (Em.LT.Emins) nauxStart = J + IF (Em.LT.Emins) GO TO 70 + IF (Em.GT.Emaxs) GO TO 80 + Kkkdat = Kkkdat + 1 + Vv = dSQRT(Em) +! + Wdop = Two*Ddo*Vv +! Wdop=DOPPLER WIDTH AT Energy EM +! + Eup = Em + calc%Brdlim*Wdop + eKdatb = calc%getEnergyUnbroadened(nauxMax) + IF (Eup.GT.eKdatb) Eup = eKdatb + Elow = Em - calc%Brdlim*Wdop + e1 = calc%getEnergyUnbroadened(1) + IF (Elow.LT.e1) Elow = e1 +! +! ********* find how many and which points are in integral for j + call calc%calcIntegralSpan(Elow, Eup, oneExtra) + Kc = calc%getIntegralStart() + Ipnts = calc%getIntegralSpan() +! + Kkkkkk = Kkkkkk + 1 + IF ((Nolowb.NE.0 .AND. calc%Elowbr.GT.Em) .OR. Ipnts.le.5) THEN +! ********* IF (don't want low-E brdng, or) too few points, do not broaden + Now = Now + 1 + do ipar = 0, calc%getNumParams() + DO N=1, calcData%getNnnsig() + val = calcData%getDataNsOld(iposVel, N, Ipar, Isox) + if ( Kvtemp.gt.0.and.Kvtemp.eq.ipar) cycle + if ( val.eq.0.0d0) cycle + call calcData%addDataNs(Kkkkkk, N, Ipar, Isox, val) + end do + end do + ELSE +! ********* Doppler-broaden + CALL Xdoppl (calc, Em, Wdop, Iffy, Isox, Kkkkkk) + + END IF +! +! +! + 70 CONTINUE +! ****** end of energy do-loop +! + 80 CONTINUE + END DO + + +! *** End of do loop on nuclides +! + nauxStart = nauxStart + 1 + IF (Iffy.EQ.0) WRITE (21,99998) +99998 FORMAT (/,' ** NOTE -- NO DOPPLER BROADENING ACTUALLY OCCURED **') + IF (Now.NE.0) WRITE (21,99997) Now, Kkkdat*calcData%getUsedIsotopes() + IF (Now.NE.0 .AND. calc%debugOutput) WRITE (06,99997) Now, Kkkdat*calcData%getUsedIsotopes() +99997 FORMAT (' No Doppler broadening occured', I8, ' times of a possible', I8) + Ndats = 1 + Ndats = calc%getEmInUnbroadened(Emins, Ndats) + IF (Kkkdat.LT.Ndats-2) WRITE (6,10100) Kkkdat, Ndats +10100 FORMAT (' Kkkdat, ndats =', 2I10) +! + call calc%updateBroadenedOffset(nauxStart) + call calc%setLength(Kkkdat) + RETURN + END +! +! +! -------------------------------------------------------------- +! + SUBROUTINE Xdoppl ( calc, EM, Wdop, Iffy, Isox, irow) +! +! *** Perform integration for Doppler-Broadening from point number +! *** Kc to point number Iup +! + + class(HighEnergyFreeGas)::calc + type(DerivativeHandler) :: calcData +! + real(kind=8)::Em, Wdop, val + integer::Iffy, Isox, Ipos, irow +! + real(kind=8)::Sigpls(100), Sigmns(100), Derdop(100) + real(kind=8)::Del, Derdp1, Derdp2, ewhich, Sigt, W + integer::I, Ikc, Ipar, Iso, Jwhich, K, KS, N, Iparx + real(kind=8),parameter::Zero=0.0d0, One=1.0d0 + integer::Kc, Ipnts + real(kind=8)::Wts + + call calc%getData(calcData) + IF (calcData%getNnnsig().GT.100) then + STOP '[STOP in Xdoppl in dbd/mdbd1.f]' + end if +! + + Iffy = Iffy + 1 + KS = 1 + Iso = Isox + Kc = calc%getIntegralStart() + Ipnts = calc%getIntegralSpan() +! + Del = 0.02d0 + Derdop = 0d0 + IF (calc%getNumParams().gt.0 .AND. Kvtemp.GT.0) THEN + W = Wdop*(One+Del) + CALL Fundop (calc, W, EM, Sigpls, Isox) + W = Wdop*(One-Del) + CALL Fundop (calc, W, EM, Sigmns, Isox) + DO I=1,calcData%getNnnsig() + Derdop(I) = 0.5d0*(Sigpls(I)-Sigmns(I))/(Del*Wdop) + END DO + END IF +! +! *** Simpson rule -- figure Wts = 0.5 * gaussian * +! *** [ Energy(I+1)-Energy(I-1) ] + IF (Ipnts.LE.12) CALL Simpsn (calc, EM, Wdop) +! +! *** 4-point quadrature rule Wts = Weight * gaussian + IF (Ipnts.GT.12) CALL Dopbrd (calc, EM, Wdop) +! + DO N=1,calcData%getNnnsig() + ! update cross section (ipar=0) as well as derivatives + Do Ipar = 0, calc%getNumParams() + val = 0.0 + DO I=1,Ipnts + Wts = calc%getWorkData(1, 1, I) + IF (Wts.eq.Zero) cycle + Ikc = I + Kc - 1 + val = val + calcData%getDataNsOld(Ikc,N, Ipar, Iso)*Wts + end do + if (Kvtemp.gt.0.and.Kvtemp.eq.Ipar) then + val = Derdop(N)*Wdop*0.5d0/calc%getTemperature() + end if + if (val.eq.0) cycle + call calcData%addDataNs(irow, N, Ipar, Iso, val) + END DO + END DO +! + IF (.not.calc%debugOutput.OR. Kvtemp.LE.0) RETURN + IF (calc%getNumParams().EQ.0) RETURN +! +! *** here for debug info only + Sigt = calcData%getDataNs(irow, 1, 0, Iso) + Derdp1 = (Sigpls(1)-Sigt)/(Del*Wdop) + Derdp2 = (Sigt-Sigmns(1))/(Del*Wdop) + IF (Derdop(1).EQ.Zero .AND. Derdp2.EQ.Zero) RETURN + IF (Derdop(1).EQ.Zero .AND. Derdp2.NE.Zero) GO TO 60 + IF (Derdop(1).NE.Zero .AND. Derdp2.EQ.Zero) GO TO 60 + IF (dABS(Derdp1/Derdop(1)-1.0d0).GT.0.05d0) GO TO 60 + IF (dABS(Derdp2/Derdop(1)-1.0d0).GT.0.05d0) GO TO 60 + IF (dABS(Derdp1/Derdp2 -1.0d0).GT.0.08d0) GO TO 60 + RETURN +! + 60 CONTINUE + ewhich = em + WRITE (6,99999) ewhich, Derdp1, Derdop(1), Derdp2 +99999 FORMAT (' ** WARNING ON Dopplr DERIV--E,D1,D,D2=', F8.1, & + 3(1PG11.3)) + RETURN + END +! +! +! -------------------------------------------------------------- +! + SUBROUTINE Dopbrd (calc, Em, Widgau) +! +! *** FORM THE GAUSSIAN DOPPLER WeightS AND NORMALIZE THEM +! + real(kind=8):: Em, Widgau + real(kind=8)::e1, S, Y, Z + integer::I + class(HighEnergyFreeGas)::calc + integer::Ipnts, Kc + real(kind=8)::Wts + +! + Y = 85.0D0 + Ipnts = calc%getIntegralSpan() + Kc = calc%getIntegralStart() + DO I=1,Ipnts + e1 = calc%getEnergyUnbroadened(I+Kc-1) + Z = (e1-Em)/Widgau + Z = Z*Z + IF (Z.GT.Y) Z = Y + Z = dEXP(-Z) + Wts = calc%getWorkData(2,1, I+kc-1)*Z + call calc%setWorkData(1, 1, I, Wts) + END DO +! + S = 0.0D0 + DO I=1,Ipnts + S = S + calc%getWorkData(1,1, I) + END DO + S = 1.0D0/S + DO I=1,Ipnts + Wts = calc%getWorkData(1,1, I)*S + call calc%setWorkData(1, 1, I, Wts) + END DO +! + RETURN + END +! +! +! -------------------------------------------------------------- +! + SUBROUTINE Simpsn (calc, Em, Widgau) +! +! *** Form the Gaussian Doppler Weights via Simpson's rule, and +! *** normalize them +! +! + real(kind=8)::Wts + real(kind=8)::Em, Widgau + class(HighEnergyFreeGas)::calc + + real(kind=8)::eval1, eval2, eval3, S, Y, Z + integer::I, J, nauxMax, Ipnts, Kc +! + Ipnts = calc%getIntegralSpan() + Kc = calc%getIntegralStart() + J = Ipnts + nauxMax = calc%getNumEnergyUnbroadened() + IF (Kc+Ipnts.GT.nauxMax) J = Ipnts - 1 + Ipnts = J +! + Y = 85.0D0 + I = 1 + eval1 = calc%getEnergyUnbroadened(I+Kc-1) + Z = (eval1-Em)/Widgau + Z = Z*Z + IF (Z.GT.Y) Z = Y + Z = dEXP(-Z) + eval2 = calc%getEnergyUnbroadened(I+Kc) + Wts = (eval2-eval1)*Z + call calc%setWorkData(1,1, I, Wts) +! *** note that we must treat i=1 case separately to avoid +! *** trying to use index at 0 + DO I=2,Ipnts + eval1 = calc%getEnergyUnbroadened(I+Kc-1) + Z = (eval1-Em)/Widgau + Z = Z*Z + IF (Z.GT.Y) Z = Y + Z = dEXP(-Z) + eval2 = calc%getEnergyUnbroadened(I+Kc) + eval3 = calc%getEnergyUnbroadened(I+Kc - 2) + Wts = (eval2-eval3)*Z + call calc%setWorkData(1,1, I, Wts) +! ****** note there should be a 1/2 factor, but we'll normalize anyway + END DO +! + S = 0.0D0 + DO I=1,Ipnts + S = S + calc%getWorkData(1,1,I) + END DO + S = 1.0D0/S + DO I=1,Ipnts + Wts = calc%getWorkData(1,1,I)*S + call calc%setWorkData(1,1, I, Wts) + END DO +! + RETURN + END +! +! +! -------------------------------------------------------------- +! + SUBROUTINE Fundop (calc, Wdop, Em, Sum, Isox) +! + type(DerivativeHandler) :: calcData + real(kind=8):: Sum(*), Wdop, Em + integer::isox + real(kind=8)::val + integer::I, Ikc, N, Ipnts, Kc + class(HighEnergyFreeGas)::calc + real(kind=8),parameter :: Zero = 0.0d0 + real(kind=8)::Wts +! + Ipnts = calc%getIntegralSpan() + Kc = calc%getIntegralStart() + call calc%getdata(calcData) + IF (Ipnts.LE.12) CALL Simpsn (calc, Em, Wdop) + IF (Ipnts.GT.12) CALL Dopbrd (calc, Em, Wdop) + Sum(1:calcData%getNnnsig()) = Zero + DO I=1,Ipnts + Wts = calc%getWorkData(1,1,I) + IF (Wts.NE.Zero) THEN + Ikc = I + Kc - 1 + DO N=1,calcData%getNnnsig() + val = calcData%getDataNsOld(Ikc, N, 0, Isox) + Sum(N) = Sum(N) + Wts*val + END DO + END IF + END DO + RETURN + END +end module Dopplr_m diff --git a/sammy/src/dbd/mdbd2.f b/sammy/src/dbd/mdbd2.f90 similarity index 57% rename from sammy/src/dbd/mdbd2.f rename to sammy/src/dbd/mdbd2.f90 index f37bd8cdaa65427d2fb714d2c996ad6f5b42fc45..b35eae64d9095e485002d27ddb37825943081608 100644 --- a/sammy/src/dbd/mdbd2.f +++ b/sammy/src/dbd/mdbd2.f90 @@ -1,34 +1,30 @@ -C -C -C -------------------------------------------------------------- -C +! +! -------------------------------------------------------------- +! SUBROUTINE Xcoef (Kdatb) -C -C *** PURPOSE -- GENERATE COEFFICIENTS FOR USE IN BROADENING -C - use ifwrit_m, only : ktzero +! +! *** PURPOSE -- GENERATE COEFFICIENTS FOR USE IN BROADENING +! use EndfData_common_m, only : expData - use fixedi_m, only : numcro use SammyGridAccess_M use brdd_common_m, only : Weights use AllocateFunctions_m IMPLICIT NONE -C +! type(SammyGridAccess)::grid real(kind=8),allocatable,dimension(:)::X1, X2, X21 integer::Kdatb real(kind=8)::e1, e2 integer::I, K, Nn, Nnp2 - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) Nn = Kdatb - 3 Nnp2 = Kdatb - 1 -C -C *** define X21 = Energy(2) - Energy(1) +! +! *** define X21 = Energy(2) - Energy(1) call allocate_real_data(X21, Kdatb) call allocate_real_data(X2, Kdatb) call allocate_real_data(X1, Kdatb) @@ -40,50 +36,50 @@ C *** define X21 = Energy(2) - Energy(1) end do -C -C *** define X2 = X21 ** 2 +! +! *** define X2 = X21 ** 2 CALL Vsq (X21(1), X2(1), Nnp2) -C -C *** define X1 = 1./X21 +! +! *** define X1 = 1./X21 CALL Vrecip (X21(1), X1(1), Nnp2) -C -C *** define Weight(I) = X2(I+2) - X2(I) +! +! *** define Weight(I) = X2(I+2) - X2(I) CALL Vsub (X2(1), X2(3), Weights(1), Nn) -C -C *** redefine X2(I) = Weights(I) / X21(I+1) = Weights(I) X1(I+1) +! +! *** redefine X2(I) = Weights(I) / X21(I+1) = Weights(I) X1(I+1) CALL Vmul (Weights(1), X1(2), X2(1), Nn) -C -C *** redefine X1 = 5 * X21 +! +! *** redefine X1 = 5 * X21 CALL Vsmul (X21(1), 5.0D0, X1(1), Nnp2) -C -C *** next set W(I) = X21(I-2) + X1(I-1) + X1(I) + X21(I+1) -C *** + X2(I-2) - X2(I-1) -C -C *** here Weights is reused to be Weighting factor +! +! *** next set W(I) = X21(I-2) + X1(I-1) + X1(I) + X21(I+1) +! *** + X2(I-2) - X2(I-1) +! +! *** here Weights is reused to be Weighting factor Weights(1) = X1(1) + X21(2) - Weights(2) = X1(1) + X1(2) + X21(3) - * - X2(1) + Weights(2) = X1(1) + X1(2) + X21(3) & + - X2(1) DO K=3,NN+1 - Weights(K) = X21(K-2) + X1(K-1) + X1(K) + X21(K+1) - * + X2(K-2) - X2(K-1) + Weights(K) = X21(K-2) + X1(K-1) + X1(K) + X21(K+1) & + + X2(K-2) - X2(K-1) END DO Weights(Nn+2) = X21(Nn) + X1(Nn+1) + X1(Nn+2) + X2(Nn) Weights(Kdatb)= X21(Nn+1) + X1(Nn+2) -C -C *** Note that value of Weights(I) is now 12 times the quantity -C *** given in Eq. (IV B 3.8) on page 80 of the SAMMY manual (R3) -C +! +! *** Note that value of Weights(I) is now 12 times the quantity +! *** given in Eq. (IV B 3.8) on page 80 of the SAMMY manual (R3) +! call grid%destroy() deallocate(X21) deallocate(X2) deallocate(X1) RETURN END -C -C -C -C -------------------------------------------------------------- -C +! +! +! +! -------------------------------------------------------------- +! SUBROUTINE Read_Cross_Sections( Npnts) use ifwrit_m, only : Kksave implicit none @@ -92,23 +88,23 @@ C IF (Kksave.NE.Npnts) THEN WRITE (21,10200) Kksave, Npnts WRITE (6,10200) Kksave, Npnts -10200 FORMAT (' Error in Read_Cross_Sections', /, - * ' Kksave should equal Npnts but =', 3I10) +10200 FORMAT (' Error in Read_Cross_Sections', /, & + ' Kksave should equal Npnts but =', 3I10) STOP '[Stop in Read_Cross_Sections in dbd/mdbd2.f #2]' END IF -C +! RETURN END -C -C -C -------------------------------------------------------------- -C - SUBROUTINE Trans_and_Norm (Parnbk, Iflnbk, Parbgf, Iflbgf, Kndbgf, - * Bgfmin, Bgfmax, Texbgf, Teabgf, - * Em, Kkkkkk) -C +! +! +! -------------------------------------------------------------- +! + SUBROUTINE Trans_and_Norm (Parnbk, Iflnbk, Parbgf, Iflbgf, Kndbgf, & + Bgfmin, Bgfmax, Texbgf, Teabgf, & + Em, Kkkkkk) +! use oops_common_m use fixedi_m use ifwrit_m @@ -119,31 +115,29 @@ C use normalize_and_background use convert_to_transmission_m IMPLICIT None -C - real(kind=8)::Parnbk(*), Parbgf(*), - * Bgfmin(*), Bgfmax(*), Texbgf(*),Teabgf(*) +! + real(kind=8)::Parnbk(*), Parbgf(*), Bgfmin(*), Bgfmax(*), Texbgf(*),Teabgf(*) integer:: Iflnbk(*), Iflbgf(*), Kndbgf(*) integer::Kkkkkk real(kind=8)::Em real(kind=8)::val -C - IF (Ynrmbk .OR. (Kfinit.EQ.0 .AND. Ytrans .AND. Ktruet.EQ.0) ) - * THEN -C *** transmission? +! + IF (Ynrmbk .OR. (Kfinit.EQ.0 .AND. Ytrans .AND. Ktruet.EQ.0) ) THEN +! *** transmission? IF (Kfinit.EQ.0 .AND. Ytrans .AND. Ktruet.EQ.0) THEN IF (Nonu.EQ.0) THEN - CALL Transm_sum (calcData, Kkkkkk, 1, - * numUsedPar, Kvthck, Thick) + CALL Transm_sum (calcData, Kkkkkk, 1, & + numUsedPar, Kvthck, Thick) ELSE CALL Ztrans (calcData, Kkkkkk, 1, -1, Kvthck) END IF END IF -C *** Normalize & add background - IF (Numnbk.GT.0) CALL Norm (Parnbk, Iflnbk, - * Em, Kkkkkk, calcData, numUsedPar) - IF (Numbgf.GT.0) CALL Bgfrpi (Parbgf, Iflbgf, Kndbgf, - * Bgfmin, Bgfmax, Texbgf, Teabgf, Em, - * calcData, Kkkkkk, numUsedPar.ne.0) +! *** Normalize & add background + IF (Numnbk.GT.0) CALL Norm (Parnbk, Iflnbk, & + Em, Kkkkkk, calcData, numUsedPar) + IF (Numbgf.GT.0) CALL Bgfrpi (Parbgf, Iflbgf, Kndbgf, & + Bgfmin, Bgfmax, Texbgf, Teabgf, Em, & + calcData, Kkkkkk, numUsedPar.ne.0) END IF RETURN END diff --git a/sammy/src/dbd/mdbd3.f b/sammy/src/dbd/mdbd3.f deleted file mode 100644 index 827413d7ff680d20d50e4a19e3f255f3314b6cd2..0000000000000000000000000000000000000000 --- a/sammy/src/dbd/mdbd3.f +++ /dev/null @@ -1,73 +0,0 @@ -C -C -C -------------------------------------------------------------- -C - SUBROUTINE Kountd_Dbd (Elow, Eup) -C -C *** Purpose -- FIND Kc AND Iup, ALSO Ipnts -C - use brdd_common_m, only : Ipnts, Iup, Kc - use EndfData_common_m, only : expData - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero - use SammyGridAccess_M - IMPLICIT none - type(SammyGridAccess)::grid - real(kind=8)::Elow, Eup - real(kind=8)::elowGrid, eupGrid - integer::Ilow - - call grid%initialize() - call grid%setParameters(numcro, ktzero) - call grid%setToAuxGrid(expData) - - Ilow = Kc - 1 - 10 Ilow = Ilow + 1 - elowGrid = grid%getEnergy(Ilow, expData) - IF (elowGrid.LE.Elow) GO TO 10 - 20 Iup = Iup + 1 - eupGrid = grid%getEnergy(Iup, expData) - IF (eupGrid.LT.Eup) GO TO 20 - Ilow = Ilow - 2 - IF (Ilow.LT.0) Ilow = 0 - Ipnts = Iup - Ilow - Kc = Ilow + 1 - Iup = Iup - 1 - call grid%destroy() - RETURN - END -C -C -C -------------------------------------------------------------- -C - SUBROUTINE Which_Dbd (EM, Ipnts, Jwhich, Kc) - use EndfData_common_m, only : expData - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero - use SammyGridAccess_M - IMPLICIT None - type(SammyGridAccess)::grid - integer::Ipnts, Jwhich, Kc - real(kind=8)::EM - real(kind=8)::A, Ddd, e1, e2 - integer::I - - call grid%initialize() - call grid%setParameters(numcro, ktzero) - call grid%setToAuxGrid(expData) -C - Jwhich = 0 - e1 = grid%getEnergy(Ipnts+Kc-1, expData) - e2 = grid%getEnergy(kc, expData) - Ddd = e1 - e2 - DO I=1,Ipnts - e1 = grid%getEnergy(I+Kc-1, expData) - A = dABS(e1-EM) - IF (A.LE.Ddd) Jwhich = I - IF (A.LE.Ddd) Ddd = A - END DO - IF (Jwhich.EQ.0) Jwhich = 1 - Jwhich = Kc + Jwhich - 1 - call grid%destroy() - RETURN - END diff --git a/sammy/src/dex/mdex0.f b/sammy/src/dex/mdex0.f index 8596313ef5f199dfc3572e9e09f859855b2edf29..85e23b1a8d268a742cb7f866df7e053d3c4ea627 100644 --- a/sammy/src/dex/mdex0.f +++ b/sammy/src/dex/mdex0.f @@ -3,10 +3,9 @@ C SUBROUTINE Samdex_0 C C use oops_common_m - use fixedi_m, only : Jwwwww, K2reso, + use fixedi_m, only : K2reso, * Numorr, Numrpi, * Nudwhi - use ifwrit_m, only : Jjjdop, Kplotu use exploc_common_m use array_sizes_common_m use oopsch_common_m, only : Nowwww, Segmen @@ -31,7 +30,6 @@ C Nowwww = 0 C CALL Initix - IF (Kplotu.NE.0) Kplotu = 0 C Kdatb = getNumAuxGridPoints() C @@ -56,9 +54,6 @@ C deallocate(A_Iwts) C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > C - Jwwwww = 4 -C - Jjjdop = 0 CALL Write_Commons_Many RETURN C diff --git a/sammy/src/dex/mdex1.f b/sammy/src/dex/mdex1.f index 02a3827cbf2f6dccc2333c4220c9a3ae392eaeec..c5a35e349965f33043ed219a83522737c59994d1 100644 --- a/sammy/src/dex/mdex1.f +++ b/sammy/src/dex/mdex1.f @@ -10,8 +10,8 @@ C *** function in energy between E and E-Dddeee) C *** [or between E+Dddeee/2 & E-Dddeee/2, if Ndexxx=1] C use fixedi_m, only : K2reso, ndexxx, numUsedPar, - * numcro, Numnbk, Numorr, Numrpi, Numbgf - use ifwrit_m, only : Kdebug, ktzero, Ndat + * Numnbk, Numorr, Numrpi, Numbgf + use ifwrit_m, only : Kdebug, Ndat use fixedr_m, only : Dddeee use brdd_common_m, only : Ipk, Iup use mxct27_m @@ -40,11 +40,9 @@ C CALL Read_Cross_Sections (nauxMax) call grid%initialize() - call grid%setParameters(numcro, ktzero) - call grid%setToExpGrid(expData) + call grid%setToExpGrid(expData) numEl = grid%getNumEnergies(expData) - call auxGrid%initialize() - call auxGrid%setParameters(numcro, ktzero) + call auxGrid%initialize() call auxGrid%setToAuxGrid(expData) C IF (K2reso.EQ.1 .AND. (Numorr.GT.0 .OR. Numrpi.GT.0) ) THEN diff --git a/sammy/src/dop/LealHwangBroadening_M.f90 b/sammy/src/dop/LealHwangBroadening_M.f90 new file mode 100644 index 0000000000000000000000000000000000000000..8fad7a99d01a0b93f61f2dc987bdf3dde3ddbeb2 --- /dev/null +++ b/sammy/src/dop/LealHwangBroadening_M.f90 @@ -0,0 +1,50 @@ +module LealHwangBroadening_M +use FortranExtDopplerBroadening_M +use DopplerBroadening_M +use DerivativeHandler_M +use GridData_M +use, intrinsic :: ISO_C_BINDING + + +implicit none +type, extends(FortranExtDopplerBroadening) :: LealHwangBroadening +type(GridData)::coefGrid +integer::Kjjjjj +integer::K2pls1 +real(kind=8)::delT +contains +procedure, pass(this) :: initialize => LealHwangBroadening_initialize +procedure, pass(this) :: broaden => LealHwangBroadening_broaden +procedure, pass(this) :: destroy => LealHwangBroadening_destroy +end type LealHwangBroadening + +contains +subroutine LealHwangBroadening_initialize(this, hand, list, work) + implicit none + class(LealHwangBroadening) :: this + class(DerivativeHandler)::hand + class(GridDataList)::list + class(GridDataList)::work + call FortranExtDopplerBroadening_initialize(this, hand, list, work) + call this%coefGrid%initialize() + this%Kjjjjj = 0 + this%K2pls1 = 0 + this%delT = 5.0d0 +end subroutine + +subroutine LealHwangBroadening_destroy(this) + implicit none + class(LealHwangBroadening) :: this + call FortranExtDopplerBroadening_destroy(this) + call this%coefGrid%destroy() +end subroutine + + +subroutine LealHwangBroadening_broaden(this) + class(LealHwangBroadening) :: this + + call FortranExtDopplerBroadening_broaden(this) + call this%coefGrid%nullify() +end subroutine + +end module LealHwangBroadening_M diff --git a/sammy/src/dop/mdop0.f90 b/sammy/src/dop/mdop0.f90 index d88f2235187006ff8a675c1786d0ef4ba06077bd..00b177716f61c86d3d2721c1bae4907c9901f32b 100644 --- a/sammy/src/dop/mdop0.f90 +++ b/sammy/src/dop/mdop0.f90 @@ -1,82 +1,59 @@ ! -module dop_m +module LealHwangBroadeningImpl_m + use LealHwangBroadening_M + implicit none + + type, extends(LealHwangBroadening) :: LealHwangBroadeningImpl contains -! - SUBROUTINE Samdop_0 -! - use over_common_m - use oops_common_m - use fixedi_m - use ifwrit_m - use exploc_common_m - use array_sizes_common_m - use oopsch_common_m - use cbro_common_m - use lbro_common_m - use EndfData_common_m - use GridData_M + procedure, pass(this) :: initialize => LealHwangBroadeningImpl_initialize + procedure, pass(this) :: broaden => LealHwangBroadeningImpl_broaden + procedure, pass(this) :: destroy => LealHwangBroadeningImpl_destroy + end type LealHwangBroadeningImpl + + contains + subroutine LealHwangBroadeningImpl_initialize(this, hand, list, work) + implicit none + class(LealHwangBroadeningImpl) :: this + class(DerivativeHandler)::hand + class(GridDataList)::list + class(GridDataList)::work + call LealHwangBroadening_initialize(this, hand, list, work) + end subroutine + + subroutine LealHwangBroadeningImpl_destroy(this) + implicit none + class(LealHwangBroadeningImpl) :: this + call LealHwangBroadening_destroy(this) + end subroutine + + subroutine LealHwangBroadeningImpl_broaden(this) + use exploc_common_m, only : I_Iflmsc use dop1_m use dop2_m - use AllocateFunctions_m - use rsl7_m - use mxct27_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) -! - type(GridData)::grid, auxGrid - type(GridData)::coefGrid - real(kind=8),allocatable,dimension(:)::A_Icoef + + class(LealHwangBroadeningImpl)::this + integer::I2pls1, Mmmmmm ! WRITE (6,99999) 99999 FORMAT (' *** SAMMY-DOPPL 8 Aug 07 ***') - Segmen(1) = 'D' - Segmen(2) = 'O' - Segmen(3) = 'P' - Nowwww = 0 -! -!x CALL Initix -! -! -! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < - N = K2pls1 + 1 - call coefGrid%initialize() + + + call LealHwangBroadening_broaden(this) + ! *** Coefgn generates Coefficients Coef for solving heat equation ! *** for performing Doppler broadening - CALL Coefgn (coefGrid, Kjjjjj, K2pls1, Mmmmmm, I2pls1, 0) + CALL Coefgn (this%coefGrid, this%Kjjjjj, Mmmmmm, I2pls1) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < - call allocate_real_data(A_Icoef, I2pls1) - do i = 1, I2pls1 - A_Icoef(i) = coefGrid%getData(i,1) - end do - call coefGrid%destroy() - I = Idimen (0, 0, '0, 0') -! -! - Nv = Ndatb - Left = Msize - Icoef - 2*I2pls1 - Ldatb = Ndatb - - ! ensure we have an auxillary energy grid - if ( expData%getLength().lt.2) then - write(0,*)" Missing auxillary grid" - stop - end if ! ! ! *** Dopplh performs Doppler broadening operation via Leal-Hwang method - CALL Dopplh(I_Iflmsc , A_Icoef , & - Mmmmmm , I2pls1 , Ngb , Nss, Ldatb, & - calcData, calcDataSelf) - deallocate(A_Icoef) + CALL Dopplh(this, I_Iflmsc , Mmmmmm , I2pls1) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > -! - Jwwwww = 2 -! - Jjjdop = 1 - CALL Write_Commons_Many + RETURN ! - END + END subroutine -end module dop_m +end module LealHwangBroadeningImpl_m diff --git a/sammy/src/dop/mdop1.f90 b/sammy/src/dop/mdop1.f90 index 783805da256743e47409fca4384e3bdb4960d31f..dfa925814446b17955dfcfdb33ae4edf739a70a9 100644 --- a/sammy/src/dop/mdop1.f90 +++ b/sammy/src/dop/mdop1.f90 @@ -1,65 +1,48 @@ ! -module dop1_m - use convert_to_transmission_m +module dop1_m + use LealHwangBroadening_M + use ifwrit_m, only : Kvtemp + use AuxGridHelper_M, only : setAuxGridOffset + use DerivativeHandler_M + IMPLICIT None + + public Dopplh contains ! ! ____________________________________________________________________ ! - SUBROUTINE Dopplh (Iflmsc, Coef , & - Mmmmmm, M2pls1, Ngb , Nss , Ldatb, & - derivs, derivsSelf) + SUBROUTINE Dopplh (calc, Iflmsc, Mmmmmm, M2pls1) ! ! *** Purpose -- Implement Doppler broadening ! - use oops_common_m - use fixedi_m - use ifwrit_m - use samxxx_common_m - use oopsch_common_m - use fixedr_m - use abro_common_m - use lbro_common_m - use hhhhhh_common_m - use xct2_m - use mxct27_m - use EndfData_common_m - use SammyGridAccess_M - use AuxGridHelper_M - use DerivativeHandler_M - use broad_common_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) - type(SammyGridAccess)::grid - LOGICAL Need_isotopes - LOGICAL Another_Process_will_Happen + class(LealHwangBroadening)::calc integer::nauxStart - type(DerivativeHandler)::derivs, derivsSelf -! - DIMENSION Iflmsc(*), Coef(*) -! DIMENSION Iflmsc(Nummsc), Coef(K2pls1) -! + type(DerivativeHandler)::derivs +! + integer::Iflmsc(*) + integer::Mmmmmm, M2pls1, Ldatb + real(kind=8)::Cc, Ebm, Coef + integer::I, Ii, Imax, Imin, Isox, K + integer::Kkkkkk, Kkkmin, Ldatb_M2, M, Mmax, Mmin, Mmm + integer::Newmin + +! DIMENSION Iflmsc(Nummsc) ! - Need_Isotopes = Yssmsc - Another_Process_will_Happen = Yresol.OR.Yssmsc.or.yaverg ! - call grid%initialize() - call grid%setParameters(numcro, ktzero) - call grid%setToAuxGrid(expData) - call setAuxGridOffset(1) ! reset auxiallary grid offset + call calc%getData(derivs) + call derivs%nullify() + Ldatb = calc%getNumEnergyUnbroadened() ! - K2pls1 = M2pls1 - Nnn = Ngb + calc%K2pls1 = M2pls1 Imin = 1 - Imax = Ldatb - K2pls1 + 1 + Imax = Ldatb - M2pls1 + 1 Mmin = 1 -! -! - Newkkk = Kksave + + ! Ldatb_M2 = Ldatb - Mmmmmm*2 - Iw = 0 - IF (Ksindi.NE.0) Iw = 1 - call derivsSelf%nullify() + if (calc%hasSelf) call calc%dataSelf%nullify() ! ! ! @@ -67,30 +50,31 @@ module dop1_m ! Mmax = Ldatb ! - CALL Set_Negative_E (derivs, derivsSelf) + CALL Set_Negative_E (calc) ! - DO Iso=1,derivs%getUsedIsotopes() - Isox = Iso + DO Isox=1,derivs%getUsedIsotopes() Mmm = Mmmmmm Kkkmin = 0 Kkkkkk = 0 nauxStart = 0 ! *** Loop over Energies + DO I=1,Imax Mmm = Mmm + 1 ! - call derivs%reserveColumnsNs(Kkkkkk+1, derivs%getNnnsig(),numUsedPar+1) - IF (Ksindi.NE.0) THEN - call derivsSelf%reserveColumnsNs(Kkkkkk+1, derivsSelf%getNnnsig(),numUsedPar+1) + call derivs%reserveColumnsNs(Kkkkkk+1, derivs%getNnnsig(),calc%getNumParams()+1) + IF (calc%hasSelf) THEN + call calc%dataSelf%reserveColumnsNs(Kkkkkk+1, calc%dataSelf%getNnnsig(),calc%getNumParams()+1) END IF ! Ii = I M = I ! *** Do the broadening integration - DO K=1,K2pls1 - IF (Coef(K).NE.0.0d0.and.m.le.Mmax) THEN - Cc = Coef(K) * grid%getEnergy(M, expData) - CALL Multiply_by_Coef (Kkkkkk+1, derivs, derivsSelf, Cc, M, Isox) + DO K=1,calc%K2pls1 + Coef = calc%coefGrid%getData(K,1) + IF (Coef.NE.0.0d0.and.m.le.Mmax) THEN + Cc = Coef * calc%getEnergyUnbroadened(M) + CALL Multiply_by_Coef (calc, Kkkkkk+1, Cc, M, Isox) END IF M = M + 1 IF (M.GT.Mmax) GO TO 195 @@ -98,12 +82,12 @@ module dop1_m ! ! IF (Kkkmin.EQ.0) Kkkmin = Mmm - Ebm = grid%getEnergy(Mmm, expData) + Ebm = calc%getEnergyUnbroadened(Mmm) Kkkkkk = Kkkkkk + 1 ! ****** transform back to cross section (from E*Sigma) - CALL Transform_to_Cross ( derivs, derivsSelf, Kkkkkk, Ebm, Isox) + CALL Transform_to_Cross ( calc, Kkkkkk, Ebm, Isox) END DO GO TO 196 @@ -111,19 +95,28 @@ module dop1_m Imax = I 196 CONTINUE ! - IF (Ksolve.NE.2 .AND. Kvtemp.GT.0) THEN + IF (calc%getNumParams().gt.0 .AND. Kvtemp.GT.0) THEN ! *** generate derivatives wrt temperature - CALL Temp_Deriv ( derivs, derivsSelf, Imax) + CALL Temp_Deriv ( calc, Imax) END IF ! END DO ! - call setAuxGridRowMax(Kkkkkk) nauxStart = Kkkmin - call dopplerOption%lealHwang%updateBroadenedOffset(nauxStart) - call dopplerOption%lealHwang%setLength(Kkkkkk) -! - call grid%destroy() + ! If the broadenened data are store on the experimental + ! grid, the function calc%updateBroadenedOffset + ! does not have any effect (as we alwayas make + ! sure that all experimental data are calcuated). + ! Broadened data are on the experimental + ! grid if there is no more broadening + call calc%updateBroadenedOffset(nauxStart) + call calc%setLength(Kkkkkk) +! + ! this function set the grid offset on the auxillary grid + ! regardless of whether the final broadened data + ! are on the experimental grid. + ! It is used if printing the interpolated cross section + ! in SAMMY output call setAuxGridOffset(nauxStart) RETURN ! @@ -132,34 +125,26 @@ module dop1_m ! ! ____________________________________________________________________ ! - SUBROUTINE Set_Negative_E (derivs, derivsSelf) + SUBROUTINE Set_Negative_E (calc) ! *** Purpose -- generate the data for negative-velocity points ! *** NOTE -- Integrand requires " sigma(E<0) times (sqrt(-E))**2 " for ! *** which "sigma(E<0)" is negative, and "(sqrt(-E))**2" is ! *** positive. Since we Store E as negative, we'll instead ! *** store "sigma(E<0)" as postive, and use "E" (which is -! *** negative) instead of "(sqrt(-E))**2" (which is positive). - use fixedi_m - use ifwrit_m - use EndfData_common_m - use DerivativeHandler_M - IMPLICIT DOUBLE PRECISION (a-h,o-z) - type(GridData)::grid +! *** negative) instead of "(sqrt(-E))**2" (which is positive). real(kind=8)::ee, val - integer::j1,j2,ii - type(DerivativeHandler)::derivs, derivsSelf -! - call expData%getGrid(grid, 2) ! we ensured that it exists - + class(LealHwangBroadening)::calc + type(DerivativeHandler)::derivs + integer::Ipar, Iso, Jj, Ll, N - ll = grid%getLength() - if (numcro.gt.1) ll = ll/numcro + ll = calc%getNumEnergyUnbroadened() + call calc%getData(derivs) DO Jj=1,ll - ee = grid%getData((Jj-1)*numcro+1, 1) + ee = calc%getEnergyUnbroadened(jj) if (ee.ge.0.0d0) exit DO Iso=1,derivs%getUsedIsotopes() ! set negative cross section to positive - DO Ipar=0,numUsedPar + DO Ipar=0,calc%getNumParams() do N=1, derivs%getNnnsig() val = derivs%getDataNsOld(Jj, N, Ipar, iso) if (val.ne.0.0d0) then @@ -168,11 +153,11 @@ module dop1_m end if end do - IF (Ksindi.NE.0.and.N.eq.1) THEN ! self indicated cross section only has 1 section - val = derivsSelf%getDataNsOld(Jj, 1, Ipar, iso) + IF (calc%hasSelf) THEN ! self indicated cross section only has 1 section + val = calc%dataSelf%getDataNsOld(Jj, 1, Ipar, iso) if (val.ne.0.0d0) then val = -1.0d0*val - call derivsSelf%addDataNsOld(Jj, 1, Ipar, iso, val) + call calc%dataSelf%addDataNsOld(Jj, 1, Ipar, iso, val) end if end if END DO @@ -185,35 +170,35 @@ module dop1_m ! ! ____________________________________________________________________ ! - SUBROUTINE Multiply_By_Coef (irow, derivs, derivsSelf, Cc, M, Isox) - use fixedi_m - use ifwrit_m - use DerivativeHandler_M - IMPLICIT DOUBLE PRECISION (a-h,o-z) - type(DerivativeHandler)::derivs, derivsSelf + SUBROUTINE Multiply_By_Coef (calc, irow, Cc, Mm, Isox) + class(LealHwangBroadening)::calc + type(DerivativeHandler)::derivs + real(kind=8)::Cc + integer::Mm, Isox integer::irow + integer::Ipar, N + real(kind=8)::val ! - Mm = M - Iso = Isox + call calc%getData(derivs) DO N=1,derivs%getNnnsig() ! update cross section (ipar=0) as well as derivatives - DO Ipar=0,numUsedPar - val = derivs%getDataNsOld(Mm, n, Ipar, Iso)*Cc - val = val + derivs%getDataNs(irow, N, Ipar, Iso) + DO Ipar=0,calc%getNumParams() + val = derivs%getDataNsOld(Mm, n, Ipar, Isox)*Cc + val = val + derivs%getDataNs(irow, N, Ipar, Isox) if (val.eq.0.0d0) cycle - call derivs%addDataNs(irow, n, Ipar, Iso, val) + call derivs%addDataNs(irow, n, Ipar, Isox, val) end do END DO ! - IF (Ksindi.NE.0) THEN + IF (calc%hasSelf) THEN ! update cross section (ipar=0) as well as derivatives - DO N=1,derivsSelf%getNnnsig() + DO N=1,calc%dataSelf%getNnnsig() ! update cross section (ipar=0) as well as derivatives - DO Ipar=0,numUsedPar - val = derivsSelf%getDataNsOld(Mm, n, Ipar, Iso)*Cc - val = val + derivsSelf%getDataNs(irow, N, Ipar, Iso) + DO Ipar=0,calc%getNumParams() + val = calc%dataSelf%getDataNsOld(Mm, n, Ipar, Isox)*Cc + val = val +calc%dataSelf%getDataNs(irow, N, Ipar, Isox) if (val.eq.0.0d0) cycle - call derivsSelf%addDataNs(irow, n, Ipar, Iso, val) + call calc%dataSelf%addDataNs(irow, n, Ipar, Isox, val) end do END DO END IF @@ -224,14 +209,9 @@ module dop1_m ! ! ____________________________________________________________________ ! - Subroutine Temp_Deriv ( derivs, derivsSelf, Imax) - use fixedi_m - use ifwrit_m - use abro_common_m - use DerivativeHandler_M - IMPLICIT None -! - type(DerivativeHandler)::derivs, derivsSelf + Subroutine Temp_Deriv ( calc, Imax) + class(LealHwangBroadening)::calc + type(DerivativeHandler)::derivs integer::Imax integer::Kvt real(kind=8)::val1, val2, val3, resVal, Sig0,delt6 @@ -239,7 +219,8 @@ module dop1_m Sig0 = 0.0d0 Kvt = Kvtemp - delt6 = delt * 6.0d0 + delt6 = calc%delT * 6.0d0 + call calc%getData(derivs) DO Iso=1,derivs%getUsedIsotopes() DO N=1,derivs%getNnnsig() val1 = derivs%getDataNs(1, 1, 0, iso) @@ -260,20 +241,20 @@ module dop1_m END DO END DO ! - IF (Ksindi.NE.0) THEN + IF (calc%hasSelf) THEN DO Iso=1,derivs%getUsedIsotopes() - val1 = derivsSelf%getData(1,0,Iso) - val2 = derivsSelf%getData(2,0,Iso) + val1 = calc%dataSelf%getData(1,0,Iso) + val2 = calc%dataSelf%getData(2,0,Iso) resVal = (Sig0 - val1*2.0d0 + val2) / Delt6 - call derivsSelf%addData(1, Kvt, Iso, resVal) + call calc%dataSelf%addData(1, Kvt, Iso, resVal) END DO DO I=2,Imax-1 DO Iso=1,derivs%getUsedIsotopes() - val1 = derivsSelf%getData(I-1, 0, Iso) - val2 = derivsSelf%getData(I, 0, Iso) - val3 = derivsSelf%getData(I+1, 0, Iso) + val1 = calc%dataSelf%getData(I-1, 0, Iso) + val2 = calc%dataSelf%getData(I, 0, Iso) + val3 = calc%dataSelf%getData(I+1, 0, Iso) resVal = (val1 - val2*2.0d0 + val3) / Delt6 - call derivsSelf%addData(1, Kvt, Iso, resVal) ! Todo: Is this right? This is what it was + call calc%dataSelf%addData(1, Kvt, Iso, resVal) ! Todo: Is this right? This is what it was END DO END DO END IF @@ -283,17 +264,17 @@ module dop1_m ! ! ____________________________________________________________________ ! - SUBROUTINE Transform_to_Cross ( derivs, derivsSelf, irow, Ebm, Isox) - use fixedi_m - use ifwrit_m - use DerivativeHandler_M - IMPLICIT DOUBLE PRECISION (a-h,o-z) - type(DerivativeHandler)::derivs, derivsSelf + SUBROUTINE Transform_to_Cross (calc, irow, Ebm, Isox) + class(LealHwangBroadening)::calc + type(DerivativeHandler)::derivs + integer::irow, Isox + real(kind=8)::Ebm real(kind=8)::val + integer::Ipar, Iso, N - Iso = Isox + call calc%getData(derivs) DO N=1,derivs%getNnnsig() - do ipar = 0, numUsedPar + do ipar = 0, calc%getNumParams() val = derivs%getDataNs(irow, N, Ipar, isox) if( val.eq.0.0d0) cycle val = val/Ebm @@ -301,13 +282,13 @@ module dop1_m end do END DO ! - IF (Ksindi.NE.0) THEN - DO N=1,derivsSelf%getNnnsig() - do ipar = 0, numUsedPar - val = derivsSelf%getDataNs(irow, N, Ipar, isox) + IF (calc%hasSelf) THEN + DO N=1,calc%dataSelf%getNnnsig() + do ipar = 0, calc%getNumParams() + val = calc%dataSelf%getDataNs(irow, N, Ipar, isox) if( val.eq.0.0d0) cycle val = val/Ebm - call derivsSelf%addDataNs(irow, N, Ipar, isox, val) + call calc%dataSelf%addDataNs(irow, N, Ipar, isox, val) end do END DO END IF diff --git a/sammy/src/dop/mdop2.f90 b/sammy/src/dop/mdop2.f90 index 290e00f2d4ef8807015e91bdc949ea2ebd32d718..9407a07f2aa59fbc7d463c2b7da48142f5b469ec 100755 --- a/sammy/src/dop/mdop2.f90 +++ b/sammy/src/dop/mdop2.f90 @@ -1,21 +1,28 @@ module dop2_m use GridData_M + implicit none + + public Coefgn contains ! ! ! __________________________________________________________________ ! - SUBROUTINE Coefgn (Coef, Jjjjjj, J2pls1, Mmmmmm, M2pls1, Kkkxxx) + SUBROUTINE Coefgn (Coef, Jjjjjj, Mmmmmm, M2pls1) ! ! *** revised extensively July 1996 to increase speed & accuracy ! - IMPLICIT DOUBLE PRECISION (A-H,O-Z) - type(GridData)::Coef - DATA Two /2.0d0/, Four /4.0D0/ + type(GridData)::Coef + integer:: Mmmmmm + integer::Jjjjjj, M2pls1 + real(kind=8),parameter::Two=2.0d0, Four=4.0D0 + real(kind=8)::Ans, C, Cay, Cay2, Fac + real(kind=8)::Ratio, Ratio2, tmp, X, Y + integer::I, Ii, Itimes, M, Max, Mj, Mm, Mstart, Mstmin, Mstop + integer::Mstopx, N, Nj, Np1, Mwhich ! N = Jjjjjj - J2pls1 = 2*N + 1 ! Cay = Four Cay2 = Cay + Two @@ -93,12 +100,7 @@ module dop2_m 70 CONTINUE Np1 = Mmmmmm + 1 M2pls1 = Np1 + Mmmmmm -! - IF (Kkkxxx.EQ.1) THEN - WRITE (06,10000) Jjjjjj, Mmmmmm, Mstmin, Mstopx -10000 FORMAT (' J, M, Mstart, Mstop =', 4I10) - RETURN - END IF + ! ! *** rearrange storage of Coef ... 1 to m+1 now goes to m+1 to 2m+1 C = Coef%getData(Np1, 1) @@ -134,9 +136,12 @@ module dop2_m ! *** method: directly if N < 128 ! *** via asymptotic expAnsion for ln(N) if N > 128 ! - IMPLICIT DOUBLE PRECISION (a-h,o-z) - DATA Dln2pi/1.8378770664125945d0/, One /1.0d0/ -! / ln ( 2 pi) + real(kind=8)::Cay, Cay2, Ratio, Ratio2, Ans + integer::N, J, M + real(kind=8),parameter::Dln2pi=1.8378770664125945d0, One=1.0d0 + ! / ln ( 2 pi) + integer::Jj, L, Mj, Mm, Nm, Nn + real(kind=8)::X,Y ! X = dFLOAT(N+3)**2 + 3.0d0*dFLOAT(J)**2 X = 2.0d0*dSQRT(X) - dFLOAT(N+3*J+9) diff --git a/sammy/src/end/msamvv.f b/sammy/src/end/msamvv.f index 1f3a0b1613d9cfe4cba812120f1f8937cc36b3e0..1c1030a81bce9f5a46ee8b33719cfd3f93be45a6 100644 --- a/sammy/src/end/msamvv.f +++ b/sammy/src/end/msamvv.f @@ -1,6 +1,3 @@ -C - use cbro_common_m - END C C C -------------------------------------------------------------- @@ -36,7 +33,6 @@ C C *** Note that this routine actually performs more useful functions C *** in file msamww.f, which is used for debugging. IMPLICIT DOUBLE PRECISION (a-h,o-z) - I = Idimen (0, 0, '0, 0') CALL Timer (0) RETURN END @@ -51,7 +47,6 @@ C *** in file msamzz.f, which is used for debugging. IMPLICIT DOUBLE PRECISION (a-h,o-z) Ngbinx = Ngbout Nsgbin = Nsgbou - I = Idimen (0, 0, '0, 0') CALL Timer (0) RETURN END diff --git a/sammy/src/end/msamxx.f b/sammy/src/end/msamxx.f index bfc06b4b1e575f7da2cc7d33e16e257a11454a63..c32d28afda0e2588ccdb4fce3fc528b4fea6550d 100755 --- a/sammy/src/end/msamxx.f +++ b/sammy/src/end/msamxx.f @@ -111,7 +111,7 @@ C ELSE IF (Ix.EQ.2) THEN C *** For call from end of SAMMAS, or from DOPUSHx or others Tabsol = Tiniti -C + ELSE C ELSE IF (Ix.GT.3 .OR. Ix.LT.0) STOP '[STOP in Timer in end/msamxx.f]' @@ -123,8 +123,8 @@ C IF (Ix.NE.3) THEN C cq WRITE (21,99999) (Segmen(I),I=1,3), Trel - WRITE ( line,99999) (Segmen(I),I=1,3), Trel -99999 FORMAT (40X, 'CPU for SAMMY-', 3A1, ' =', 0PF9.2, ' sec') + WRITE ( line,99999) Trel +99999 FORMAT (40X, 'CPU for this section is ', 0PF9.2, ' sec') call printStdoutData(line) C diff --git a/sammy/src/fgm/FreeGasDopplerBroadening_M.f90 b/sammy/src/fgm/FreeGasDopplerBroadening_M.f90 index f616b6e180e85a37cbf13ef4787d23345da11366..41b7e9b1e32ba459034f1111d7b9d79d6ab3f20b 100644 --- a/sammy/src/fgm/FreeGasDopplerBroadening_M.f90 +++ b/sammy/src/fgm/FreeGasDopplerBroadening_M.f90 @@ -1,24 +1,17 @@ module FreeGasDopplerBroadening_M use, intrinsic :: ISO_C_BINDING -use DopplerAndResolutionBroadener_M +use FortranExtDopplerBroadening_M +use DopplerBroadening_M use DerivativeHandler_M use GridData_M implicit none -type, extends(DopplerAndResolutionBroadener) :: FreeGasDopplerBroadening +type, extends(FortranExtDopplerBroadening) :: FreeGasDopplerBroadening real(kind=8),allocatable,dimension(:)::velocity -real(kind=8)::temp -integer::numPar -type(DerivativeHandler)::dataSelf -logical::hasSelf = .false. contains procedure, pass(this) :: initialize => FreeGasDopplerBroadening_initialize procedure, pass(this) :: broaden => FreeGasDopplerBroadening_broaden -procedure, pass(this) :: addSelfData => FreeGasDopplerBroadening_addSelfData -procedure, pass(this) :: transferUnbroadenedAll => FreeGasDopplerBroadening_transferUnbroadenedAll -procedure, pass(this) :: transferUnbroadened => FreeGasDopplerBroadening_transferUnbroadened -procedure, pass(this) :: transferUnbroadenedSelf => FreeGasDopplerBroadening_transferUnbroadenedSelf procedure, pass(this) :: destroy => FreeGasDopplerBroadening_destroy end type FreeGasDopplerBroadening @@ -29,104 +22,28 @@ subroutine FreeGasDopplerBroadening_initialize(this, hand, list, work) class(DerivativeHandler)::hand class(GridDataList)::list class(GridDataList)::work - call DopplerAndResolutionBroadener_initialize(this, hand, list, work) + call FortranExtDopplerBroadening_initialize(this, hand, list, work) end subroutine subroutine FreeGasDopplerBroadening_destroy(this) implicit none class(FreeGasDopplerBroadening) :: this - call DopplerAndResolutionBroadener_destroy(this) + call FortranExtDopplerBroadening_destroy(this) if( allocated(this%velocity)) deallocate(this%velocity) end subroutine -subroutine FreeGasDopplerBroadening_addSelfData(this, self, copyData, ipos) - class(FreeGasDopplerBroadening) :: this - type(DerivativeHandler)::self - type(DerivativeHandler)::data - logical::copyData - integer:: ipos - - integer::iso, jdat, Ii - real(kind=8)::val - - this%dataSelf%instance_ptr=self%instance_ptr - this%hasSelf = .true. - if( .not.copyData) return - - call this%getData(data) - - ! Note this is after the switch, ergo operate on old data - DO Iso=1,this%dataSelf%getUsedIsotopes() - do jdat = 1, this%getNumEnergyUnbroadened() - DO Ii=0,this%numPar - val = data%getDataNsOld(Jdat, ipos, Ii, Iso) - if (val.ne.0.0d0) then - call this%dataSelf%addDataNsOld(Jdat, 1, Ii, Iso, val) - else - if (this%dataSelf%getDataNsOld(Jdat, 1, Ii, Iso).ne.0.0d0) then - call this%dataSelf%addDataNsOld(Jdat, 1, Ii, Iso, val) - end if - end if - end do - end do - end do -end subroutine - -subroutine FreeGasDopplerBroadening_transferUnbroadened(this, ipos, iso, iflag) - class(FreeGasDopplerBroadening) :: this - integer::ipos, iso, iflag - - type(DerivativeHandler)::data - integer::ipar, n, inew - real(kind=8)::val - - inew = this%getCurrentPos() - call this%getData(data) - do ipar = 0, this%numPar - if (ipar.gt.0.and.iflag.eq.ipar) cycle - do n = 1, data%getNnnsig() - val = data%getDataNsOld(ipos, N, ipar, iso) - if (val.eq.0.0d0) cycle - call data%addDataNs(inew, N, ipar, Iso, val) - end do - end do -end subroutine -subroutine FreeGasDopplerBroadening_transferUnbroadenedSelf(this, ipos, iso, iflag) - class(FreeGasDopplerBroadening) :: this - integer::ipos, iso, iflag - - integer::ipar, n, inew - real(kind=8)::val - - inew = this%getCurrentPos() - if (this%hasSelf) then - do ipar = 0, this%numPar - if (ipar.gt.0.and.iflag.eq.ipar) cycle - do n = 1, this%dataSelf%getNnnsig() - val = this%dataSelf%getDataNsOld(ipos, N, ipar, iso) - if (val.eq.0.0d0) cycle - call this%dataSelf%addDataNs(inew, N, ipar, Iso, val) - end do - end do - end if -end subroutine -subroutine FreeGasDopplerBroadening_transferUnbroadenedAll(this, ipos, iso, iflag, iflagSelf) - class(FreeGasDopplerBroadening) :: this - integer::ipos, iso, iflag, iflagSelf - - call this%transferUnbroadened(ipos, iso, iflag) - call this%transferUnbroadenedSelf(ipos, iso, iflagSelf) -end subroutine subroutine FreeGasDopplerBroadening_broaden(this) use AllocateFunctions_m class(FreeGasDopplerBroadening) :: this - integer::ndatb, i + integer::ndatb, i,current1, current2 real(kind=8)::ener type(DerivativeHandler)::data + call FortranExtDopplerBroadening_broaden(this) + ndatb = this%getNumEnergyUnbroadened() call allocate_real_data(this%velocity, 2*ndatb) @@ -142,16 +59,7 @@ subroutine FreeGasDopplerBroadening_broaden(this) this%velocity(I) = dSQRT(ener) end if end do - - ! reserve the data - ndatb = this%getNumEnergyBroadened() - 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 FreeGasDopplerBroadening_M diff --git a/sammy/src/fgm/mfgm0.f90 b/sammy/src/fgm/mfgm0.f90 index 58e1c0a1bc1a93cfe9f6814d8bdc0f187c5f9f7e..3e03e28af1d6042fdcc44f4daa3463163243299c 100644 --- a/sammy/src/fgm/mfgm0.f90 +++ b/sammy/src/fgm/mfgm0.f90 @@ -1,105 +1,58 @@ -! -! - Subroutine Samfgm_0(broadener) -! +module FreeGasDopplerBroadeningImpl_m +use FreeGasDopplerBroadening_M +implicit none +type, extends(FreeGasDopplerBroadening) :: FreeGasDopplerBroadeningImpl +contains +procedure, pass(this) :: initialize => FreeGasDopplerBroadeningImpl_initialize +procedure, pass(this) :: broaden => FreeGasDopplerBroadeningImpl_broaden +procedure, pass(this) :: destroy => FreeGasDopplerBroadeningImpl_destroy +end type FreeGasDopplerBroadeningImpl + +contains +subroutine FreeGasDopplerBroadeningImpl_initialize(this, hand, list, work) + implicit none + class(FreeGasDopplerBroadeningImpl) :: this + class(DerivativeHandler)::hand + class(GridDataList)::list + class(GridDataList)::work + call FreeGasDopplerBroadening_initialize(this, hand, list, work) +end subroutine + +subroutine FreeGasDopplerBroadeningImpl_destroy(this) + implicit none + class(FreeGasDopplerBroadeningImpl) :: this + call FreeGasDopplerBroadening_destroy(this) +end subroutine + +subroutine FreeGasDopplerBroadeningImpl_broaden(this) + ! *** Purpose -- Calculate Doppler broadening using free-gas model with ! *** auxiliary energy- (velocity-) grid of varying spacing ! - use fixedi_m, only : Jwwwww, K2reso, Kkkdex, & - Kkkrsl, Ndatd, Nudwhi, & - Numorr, Numrpi, numcro, Lllmax, numUsedPar - use ifwrit_m, only : Kaverg, Kcros, Kplotu, Ksolve, Kvers7, & - Ndatb, Ntgrlq, ktzero, Ksitmp, Ksindi - use fixedr_m, only : temp - use exploc_common_m - use array_sizes_common_m - use oopsch_common_m, only : Nowwww, Segmen - use lbro_common_m, only : Debug, Yresol, Yssmsc - use AllocateFunctions_m - use rsl7_m - use mxct27_m + use exploc_common_m, only : A_Idpiso, I_Iflmsc use mfgm1_m - use SammyLptPrinting_m - use FreeGasDopplerBroadening_M - use EndfData_common_m, only : expData - use GridData_M + use SammyLptPrinting_m IMPLICIT None ! character(len=80)::line - type(FreeGasDopplerBroadening)::broadener - integer::N, Nn, Kdatb, ii + class(FreeGasDopplerBroadeningImpl) :: this ! ! WRITE (line,99999) 99999 FORMAT (' *** SAMMY-FGM 3 Oct 08 ***') call printStdoutData(line) - Segmen(1) = 'F' - Segmen(2) = 'G' - Segmen(3) = 'M' - Nowwww = 0 - - broadener%temp = temp - broadener%numPar = numUsedPar -! - CALL Initix - IF (Kplotu.NE.0 .AND. Kaverg.NE.2 .AND. Kaverg.NE.3) Kplotu = 0 -! - Kdatb = Ndatd - IF (Kdatb.EQ.0) Kdatb = Ndatb -! -! -! *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR SAMFGM - CALL Estfgm (Kdatb) ! ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! *** One *** - - if (Kcros.EQ.8) THEN - call broadener%addSelfData(calcDataSelf, Ksindi.le.0.and.Ksitmp.GT.0, Lllmax+1) - END IF -! - N = 1 - Nn = 1 - Jwwwww = 2 - IF (Kcros.EQ.8) THEN - Jwwwww = 6 - END IF ! - call broadener%broaden() + call FreeGasDopplerBroadening_broaden(this) ! ! ! *** Dopfgm PERFORMS DOPPLER BROADENING OPERATION - CALL Dopfgm( broadener, A_Idpiso , A_Idsiso , I_Iflmsc) -! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -! -! - CALL Write_Commons_Many - RETURN -! - END -! -! -! __________________________________________________________________ -! - SUBROUTINE Estfgm (Kdatb) -! -! *** purpose -- estimate array size for this segment + CALL Dopfgm( this, A_Idpiso , I_Iflmsc, this%Brdlim) ! +END subroutine +end module FreeGasDopplerBroadeningImpl_m - IMPLICIT none - integer::Kdatb - integer::I,k,Idimen - external Idimen -! -! *** One -!x CALL Figure_KWs_1 (Kone) -! -!x K = Kone + 2*Kdatb - K = 2*Kdatb - K = Idimen (K, 1, 'K, 1') - I = Idimen (K, -1, 'K, -1') - I = Idimen (0, 0, '0, 0') - RETURN - END diff --git a/sammy/src/fgm/mfgm1.f90 b/sammy/src/fgm/mfgm1.f90 index 70b0d3e45b09303c910d42abda394279e9f0681d..8b56b51ba88bccb828c47caea3bd64bd91810e5d 100644 --- a/sammy/src/fgm/mfgm1.f90 +++ b/sammy/src/fgm/mfgm1.f90 @@ -1,48 +1,35 @@ module mfgm1_m +use ifwrit_m, only : Ksitmp, Nolowb, Kvtemp +use fixedr_m, only : Emax, Emin, Emins, Sitemp, Emaxs +use EndfData_common_m, only : resparData +use mfgm4_m +use FreeGasDopplerBroadening_M +IMPLICIT none + +public Dopfgm + contains ! ! ! -------------------------------------------------------------- ! - SUBROUTINE Dopfgm ( broadener, Dopwid, Doswid, Iflmsc) + SUBROUTINE Dopfgm ( broadener, Dopwid, Iflmsc, Brdlim) ! ! *** PURPOSE -- FORM DOPPLER-BROADENED CROSS SECTION AND DERIVATIVES ! - use fixedi_m, only : Ktruet, Lllmax, numUsedPar, & - numcro - use ifwrit_m, only : Kcros, Kdebug, Ksindi, ktzero, Kvtemp, & - Kvthck, ndat, Nolowb, ndat, Nonu, & - Kfinit, Ksitmp - use fixedr_m, only : Elowbr, Emax, Emin, Emins, Sitemp, Temp, Thick, Emaxs - use broad_common_m, only : Brdlim - use brdd_common_m, only : Ipnts, Iup, Kc - use lbro_common_m, only : Yresol, Yssmsc, Ytrans - use EndfData_common_m, only : expData, resparData - use AuxGridHelper_M, only : setAuxGridOffset, setAuxGridRowMax - use array_sizes_common_m, only : calcData, calcDataSelf - use xct2_m - use mxct27_m - use SammyGridAccess_M - use mfgm4_m - use EndfData_common_m, only : resParData - use convert_to_transmission_m - use SumIsoAndConvertToTrans_M - use FreeGasDopplerBroadening_M - - IMPLICIT None - LOGICAL Need_isotopes - LOGICAL Another_Process_Will_Happen -! - type(FreeGasDopplerBroadening)::broadener + + class(FreeGasDopplerBroadening)::broadener + type(DerivativeHandler)::calcData + real(kind=8)::Brdlim real(kind=8)::ee - real(kind=8):: Dopwid(*), Doswid(*) + real(kind=8):: Dopwid(*) integer:: Iflmsc(*) real(kind=8)::Zero, A1, A2 real(kind=8)::Ddo, Ddosin, Ddox, Em, Vlimit, Vlow real(kind=8)::Vlowbr, Vup, Vv, Vslimi, Elow, Ehigh - integer::Iffy, Iso, Isomax, Iw, Jdat,iiso + integer::Iffy, Iso, Isomax, Iw, Jdat,iiso, Iup integer(C_SIZE_T)::IsoIndex - integer::Kkkkkk, Kkkmin, Ngtvx, Now,nauxStart + integer::Kkkkkk, Ngtvx, Now,nauxStart integer::nauxMax, insig, Iipar, ii,numEl, iposVel, IflmscKsitmp @@ -50,17 +37,12 @@ contains nauxMax = broadener%getNumEnergyUnbroadened() - numEl = broadener%getNumEnergyBroadened() + numEl = broadener%getNumEnergyBroadened() + call broadener%getData(calcData) ! ! ! *** FORM DOPPLER-BROADENED CROSS SECTION, STORE IN X5. ! *** ALSO DOPPLER-BROADEN THE PARTIAL DERIVATIVES. -! - Need_Isotopes = Yssmsc - Another_Process_Will_Happen = Yresol.OR.Yssmsc - - - ! ! Now = 0 ! number of un-broadened points @@ -69,7 +51,7 @@ contains IF (Isomax.EQ.0) STOP '[STOP in Dopfgm in fgm/mfgm1.f]' IflmscKsitmp = 0 - if( Kcros.eq.8) IflmscKsitmp = Iflmsc(Ksitmp) + if( broadener%hasSelf) IflmscKsitmp = Iflmsc(Ksitmp) ! ! *** Do separately for each isotope (nuclide), since Doppler-width is @@ -78,7 +60,7 @@ contains iiso = isoIndex ! convert c_size_t to fortran integer iso = IsoIndex if (isomax.gt.0) iso = calcData%getRealIsotopeIndex(IsoIndex) - if (Iso.le.0) GO TO 80 ! not included in the calculation + if (Iso.le.0) cycle ! not included in the calculation ! iso = index of isotope in resParData (or if summed the summed isotope ! iiso and IsoIndex, index of iso in calcData (potentially different if doing scattering with threshold reactions) @@ -94,7 +76,7 @@ contains END IF ! ------------------------------- Iffy = 0 - Kc = 1 + broadener%Kc = 1 Iup = 0 ! ! *** "Ddo" is the broadening width in sqrt(E)-space, so integration @@ -102,15 +84,17 @@ contains Ddo = Dopwid(Iso) Vlimit = Brdlim*Ddo IF (Ksitmp.GT.0) THEN - Ddosin = Doswid(Iso) + ! adjust factor for SiTemp + Ddosin = dSQRT(broadener%getTemperature()) + Ddosin = Dopwid(Iso)/Ddosin + Ddosin = Ddosin * dsqrt(broadener%SiTemp) Vslimi = Brdlim*Ddosin ELSE Ddosin = Zero Vslimi = Zero END IF - Vlowbr = dSQRT(Elowbr) + Vlowbr = dSQRT(broadener%Elowbr) ! - Kkkmin = 0 Kkkkkk = 0 nauxStart = 0 ! @@ -127,7 +111,7 @@ contains 10001 FORMAT (' *** on data point number', I10) ! Em = broadener%getEnergyBroadened(Jdat) ! desired energy - iposVel = broadener%getEmInUnbroadened(Em, iposVel) ! find position (iposVel) in un-broadened grid and get the velocity + ! convert Em to velocity if (Em.lt.0.0d0) then @@ -141,31 +125,36 @@ contains IF (Em.LT.Emins) THEN ! These points are the very low-energy limit, ! of very little interest, ergo copy as is + iposVel = broadener%getEmInUnbroadened(Em, iposVel) ! find position (iposVel) in un-broadened grid and get the velocity IF (broadener%getEnergyUnbroadened(iposVel+1).GE.Emin) THEN Now = Now + 1 - call broadener%transferUnbroadenedAll(iposVel, iiso, Kvtemp, IflmscKsitmp) - GO TO 40 + call broadener%transferUnbroadenedAll(iposVel, iiso, Kvtemp, IflmscKsitmp) + Kkkkkk = Kkkkkk + 1 + cycle ELSE nauxStart = iposVel - go to 70 + cycle END IF ELSE IF (Em.GT.Emaxs) THEN ! These points are the very high-energy limit, ! of very little interest, ergo copy as is ee = 0.0 + iposVel = broadener%getEmInUnbroadened(Em, iposVel) ! find position (iposVel) in un-broadened grid and get the velocity if (iposVel.gt.1) ee = broadener%getEnergyUnbroadened(iposVel-1) IF (ee.LE.Emax) THEN Now = Now + 1 - call broadener%transferUnbroadenedAll(iposVel, iiso, Kvtemp, IflmscKsitmp) - GO TO 40 + call broadener%transferUnbroadenedAll(iposVel, iiso, Kvtemp, IflmscKsitmp) + Kkkkkk = Kkkkkk + 1 + cycle ELSE - GO TO 80 + exit ! don't need to broaden at higher energies END IF END IF ! ! ! ! ********* regular Doppler for most cross sections + broadener%rowData = 0.0d0 Vup = Vv + Vlimit IF (Vup.GT.broadener%velocity(nauxMax)) Vup = broadener%velocity(nauxMax) Ehigh = Vup * Vup @@ -177,19 +166,22 @@ contains ! ! *** find how many and which points are in integral for Jdat call broadener%calcIntegralSpan(Elow, Ehigh) - Kc = broadener%getIntegralStart() - Ipnts = broadener%getIntegralSpan() -! - IF ((Nolowb.EQ.0 .OR. Vlowbr.LE.Vv) .AND. Ipnts.GT.2) THEN -! *** Doppler-broaden - CALL Xdofgm (broadener%velocity, calcData, & - broadener%velocity(nauxMax+1:2*nauxMax), Em, Vv, Ddo, & - Temp, Iffy, Kvtemp, iiso, Ngtvx, & + broadener%Kc = broadener%getIntegralStart() + broadener%Ipnts = broadener%getIntegralSpan() +! + IF ((Nolowb.EQ.0 .OR. Vlowbr.LE.Vv) .AND. broadener%Ipnts.GT.2) THEN +! *** Doppler-broaden + broadener%rowData = 0.0d0 + CALL Xdofgm (broadener, broadener%velocity, calcData, & + broadener%velocity(nauxMax+1:2*nauxMax), Em, Vv, Ddo, & + broadener%getTemperature(), Iffy, Kvtemp, iiso, Ngtvx, & Kkkkkk+1) + call broadener%copyRowData(calcData, iso) ELSE ! *** IF too few points, do not broaden Now = Now + 1 - call broadener%transferUnbroadened(iposVel, iiso, Kvtemp) + iposVel = broadener%getEmInUnbroadened(Em, iposVel) ! find position (iposVel) in un-broadened grid and get the velocity + call broadener%transferUnbroadenedBroad(calcData, iposVel, iiso, Kvtemp) END IF ! Ddox = Ddo @@ -206,47 +198,43 @@ contains Elow = Vlow * Vlow if (Vlow.lt.0.0d0) Elow = -1.0d0 * Elow call broadener%calcIntegralSpan(Elow, Ehigh) - Kc = broadener%getIntegralStart() - Ipnts = broadener%getIntegralSpan() + broadener%Kc = broadener%getIntegralStart() + broadener%Ipnts = broadener%getIntegralSpan() END IF ! ! ********* broaden self-indication transmission separately - IF (Kcros.EQ.8) THEN - IF ((Nolowb.EQ.0.OR.Vlowbr.LE.Vv) .AND. Ipnts.GT.2) THEN - CALL Xdofgm (broadener%velocity, calcDataSelf, & - broadener%velocity(nauxMax+1:2*nauxMax), Em, Vv, Ddox, & - Sitemp, Iffy, Iflmsc(Ksitmp), iiso, Ngtvx, & + IF (broadener%hasSelf) THEN + IF ((Nolowb.EQ.0.OR.Vlowbr.LE.Vv) .AND. broadener%Ipnts.GT.2) THEN + broadener%rowData = 0.0d0 + CALL Xdofgm (broadener, broadener%velocity, broadener%dataSelf, & + broadener%velocity(nauxMax+1:2*nauxMax), Em, Vv, Ddox, & + Sitemp, Iffy, Iflmsc(Ksitmp), iiso, Ngtvx, & Kkkkkk+1) - ELSE - call broadener%transferUnbroadenedSelf(iposVel, iiso, IflmscKsitmp) + call broadener%copyRowData(broadener%dataSelf, iso) + ELSE + iposVel = broadener%getEmInUnbroadened(Em, iposVel) ! find position (iposVel) in un-broadened grid and get the velocity + call broadener%transferUnbroadenedBroad(broadener%dataSelf, iposVel, iiso, IflmscKsitmp) END IF END IF -! - 40 CONTINUE + Kkkkkk = Kkkkkk + 1 - IF (Kkkmin.EQ.0) Kkkmin = Jdat + ! - 70 CONTINUE END DO ! end loop over data -! - 80 CONTINUE + END DO ! *** end of do-loop on isotopes (nuclides) ! ! nauxStart = nauxStart + 1 call broadener%updateBroadenedOffset(nauxStart) call broadener%setLength(Kkkkkk) - call setAuxGridRowMax(Kkkkkk) IF (Iffy.EQ.0) WRITE (21,99998) 99998 FORMAT (/' ** NOTE -- NO DOPPLER BROADENING ACTUALLY OCCURED **') IF (Now.NE.0) WRITE (21,99997) Now, Kkkkkk*Isomax - IF (Now.NE.0 .AND. Kdebug.NE.0) WRITE (06,99997) Now,Kkkkkk*Isomax + IF (Now.NE.0 .AND. broadener%debugOutput) WRITE (06,99997) Now,Kkkkkk*Isomax 99997 FORMAT (' No Doppler broadening occured', I8,' times of a possible', I8) -! - - call setAuxGridOffset(nauxStart) RETURN ! END diff --git a/sammy/src/fgm/mfgm2.f90 b/sammy/src/fgm/mfgm2.f90 index 24b497c3d2d44e69e4fad4ab40fcacbd68e3933e..1057b85a6cbba63dca0424e48e1052c82671c955 100644 --- a/sammy/src/fgm/mfgm2.f90 +++ b/sammy/src/fgm/mfgm2.f90 @@ -1,4 +1,7 @@ module fgm2_m + use FreeGasDopplerBroadening_M + use abcexp_m + use abcerf_m IMPLICIT None real(kind=8)::Xm1, X00, Y00, Em1, E00, Z, W integer::Im1, I00 @@ -19,16 +22,13 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Modsmp (Vv, Velcty, Wts, Ddo) + SUBROUTINE Modsmp (calc, Vv, Velcty, Wts, Ddo) ! ! *** Form the Gaussian Doppler weights via Simpson's rule, sort of, and ! *** normalize them +! ! - use brdd_common_m, only : Ipnts, Kc - use abcexp_m - use abcerf_m - use AuxGridHelper_M, only : getNumAuxGridPoints -! + class(FreeGasDopplerBroadening)::calc Real(kind=8):: Velcty(*), Wts(*) real(kind=8)::Vv, Ddo real(kind=8)::Xm1, X00, Y00, Em1, E00, Z, W @@ -36,18 +36,18 @@ module fgm2_m real(kind=8)::Qq, S integer::I, Itype, Kca, Kcmin, N, NN, nauxMax ! - nauxMax = getNumAuxGridPoints() - Kcmin = Kc - 1 + nauxMax = calc%getNumEnergyUnbroadened() + Kcmin = calc%Kc - 1 IF (Kcmin.LT.1) THEN Kcmin = 1 - WRITE (6,10000) Kcmin, Ipnts -10000 FORMAT ('Kcmin & Ipnts in Modsmp=',2i5) + WRITE (6,10000) Kcmin, calc%Ipnts +10000 FORMAT ('Kcmin & calc%Ipnts in Modsmp=',2i5) END IF Kca = Kcmin ! - I00 = Kca - Kc + 1 + I00 = Kca - calc%Kc + 1 IF (I00.LE.0) I00 = 1 - X00 = (Velcty(I00+Kc-1)-Vv)/Ddo + X00 = (Velcty(I00+calc%Kc-1)-Vv)/Ddo E00 = X00**2 IF (E00.GT.Expmax) THEN E00 = Zero @@ -55,24 +55,24 @@ module fgm2_m E00 = dEXP(-E00) END IF Wts(I00) = Zero - CALL Resets (Vv, Velcty, Ddo, Kc) + CALL Resets (calc, Vv, Velcty, Ddo, calc%Kc) ! ! Itype = 0 IF (X00.gt.Zero) Itype = 1 ! - IF (Im1+Kc.LE.1) THEN -! *** Here for [Im1+Kc] < 1 so only I00 contributes - CALL Resets (Vv, Velcty, Ddo, Kc) - IF (Im1.EQ.Ipnts) GO TO 20 - IF (I00+Kc-1.LE.nauxMax) GO TO 10 + IF (Im1+calc%Kc.LE.1) THEN +! *** Here for [Im1+calc%Kc] < 1 so only I00 contributes + CALL Resets (calc, Vv, Velcty, Ddo, calc%Kc) + IF (Im1.EQ.calc%Ipnts) GO TO 20 + IF (I00+calc%Kc-1.LE.nauxMax) GO TO 10 GO TO 20 END IF ! ! 10 CONTINUE -! *** Here for normal case, 0 < Im1+Kc-1 < I00+Kc-1 < nauxMax -! *** and 0 < Im1 < I00 < Ipnts+1 +! *** Here for normal case, 0 < Im1+calc%Kc-1 < I00+calc%Kc-1 < nauxMax +! *** and 0 < Im1 < I00 < calc%Ipnts+1 IF (X00.GT.Zero) Itype = 1 IF (Itype.EQ.0) THEN Qq = Abcerf (X00, Y00, A, B, C, N) @@ -87,19 +87,19 @@ module fgm2_m Wts(Im1) = Em1 * Y00 * (One + Two*X00*B + Bb) + Wts(Im1) Wts(I00) = Em1 * Y00 * (One - Two*Xm1*B - Bb) END IF - CALL Resets (Vv, Velcty, Ddo, Kc) - IF (Im1.EQ.Ipnts) GO TO 20 - IF (I00+Kc-1.LE.nauxMax) GO TO 10 + CALL Resets (calc, Vv, Velcty, Ddo, calc%Kc) + IF (Im1.EQ.calc%Ipnts) GO TO 20 + IF (I00+calc%Kc-1.LE.nauxMax) GO TO 10 ! ! 20 CONTINUE S = Zero - DO I=1,Ipnts + DO I=1,calc%Ipnts S = S + Wts(I) END DO S = One/S - DO I=1,Ipnts - Wts(I) = Wts(I)*S * Velcty(I+Kc-1)**2 + DO I=1,calc%Ipnts + Wts(I) = Wts(I)*S * Velcty(I+calc%Kc-1)**2 END DO ! RETURN @@ -108,7 +108,8 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Resets (Vv, Velcty, Ddo, Kc) + SUBROUTINE Resets (calc, Vv, Velcty, Ddo, Kc) + class(FreeGasDopplerBroadening)::calc real(kind=8)::Velcty(*), Vv, Ddo integer::Kc ! @@ -136,32 +137,31 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Modfpl (Vv, Velcty, Wts, Ddo) + SUBROUTINE Modfpl (calc, Vv, Velcty, Wts, Ddo) ! ! *** form the Doppler weights via modified four-point Legrange rule ! - use brdd_common_m, only : Ipnts, Kc - use AuxGridHelper_M, only : getNumAuxGridPoints -! + + class(FreeGasDopplerBroadening)::calc real(kind=8):: Velcty(*), Wts(*), Vv, Ddo integer::I,Iq, Iz, nauxMax real(kind=8)::S ! - CALL Zero_Array (Wts, Ipnts) - nauxMax = getNumAuxGridPoints() + CALL Zero_Array (Wts, calc%Ipnts) + nauxMax = calc%getNumEnergyUnbroadened() ! - IF (Kc.EQ.1) CALL Start1 (Vv, Velcty, Wts, Ddo) - IF (Kc.EQ.2) CALL Start2 (Vv, Velcty, Wts, Ddo) - IF (Kc.EQ.3) CALL Start3 (Vv, Velcty, Wts, Ddo) - IF (Kc.GE.4) CALL Start4 (Vv, Velcty, Wts, Ddo) + IF (calc%Kc.EQ.1) CALL Start1 (calc, Vv, Velcty, Wts, Ddo) + IF (calc%Kc.EQ.2) CALL Start2 (calc, Vv, Velcty, Wts, Ddo) + IF (calc%Kc.EQ.3) CALL Start3 (calc, Vv, Velcty, Wts, Ddo) + IF (calc%Kc.GE.4) CALL Start4 (calc, Vv, Velcty, Wts, Ddo) ! ! - IF (Ip1.LE.Ipnts) THEN + IF (Ip1.LE.calc%Ipnts) THEN 20 CONTINUE - CALL Wtabcd (Wts) - IF (Im1.LT.Ipnts) THEN - CALL Reset (Velcty, Vv, Ddo, Kc) - IF (Ip1.GT.Ipnts) GO TO 30 + CALL Wtabcd (calc, Wts) + IF (Im1.LT.calc%Ipnts) THEN + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) + IF (Ip1.GT.calc%Ipnts) GO TO 30 GO TO 20 END IF END IF @@ -169,39 +169,39 @@ module fgm2_m 30 CONTINUE ! IF (Em1.NE.Zero) THEN - Iq = Ipnts + Kc + 2 - IF (Iq.LE.nauxMax ) CALL Quit4 (Vv, Velcty, Wts, Ddo, Kc) - IF (Iq.EQ.nauxMax+1) CALL Quit3 (Vv, Velcty, Wts, Ddo, Kc) - IF (Iq.EQ.nauxMax+2) CALL Quit2 (Vv, Velcty, Wts, Ddo, Kc) - IF (Iq.EQ.nauxMax+3) CALL Quit1 (Wts) + Iq = calc%Ipnts + calc%Kc + 2 + IF (Iq.LE.nauxMax ) CALL Quit4 (calc, Vv, Velcty, Wts, Ddo, calc%Kc) + IF (Iq.EQ.nauxMax+1) CALL Quit3 (calc, Vv, Velcty, Wts, Ddo, calc%Kc) + IF (Iq.EQ.nauxMax+2) CALL Quit2 (calc, Vv, Velcty, Wts, Ddo, calc%Kc) + IF (Iq.EQ.nauxMax+3) CALL Quit1 (calc, Wts) END IF ! ! Iz = 0 S = Zero - DO I=1,Ipnts + DO I=1,calc%Ipnts S = S + Wts(I) IF (Wts(I).NE.Zero) Iz = 1 END DO IF (S.EQ.Zero) THEN IF (Iz.EQ.1) THEN - WRITE (6,10000) Ipnts, Kc, Im1, Ip1, Iq, nauxMax -10000 FORMAT (' Sum of weights is Zero! Ipnts,Kc=',10I5) - WRITE (6,10010) (Wts(I),I=1,Ipnts) + WRITE (6,10000) calc%Ipnts, calc%Kc, Im1, Ip1, Iq, nauxMax +10000 FORMAT (' Sum of weights is Zero! calc%Ipnts,Kc=',10I5) + WRITE (6,10010) (Wts(I),I=1,calc%Ipnts) 10010 FORMAT ('Wts=',7F10.6, /, (4x,7F10.6)) ELSE IF (Iz.EQ.0) THEN - WRITE (6,10020) Ipnts, Kc, Im1, Ip1, Iq, nauxMax -10020 FORMAT (' Weights are all Zero! Ipnts,Kc=',10I5) + WRITE (6,10020) calc%Ipnts, calc%Kc, Im1, Ip1, Iq, nauxMax +10020 FORMAT (' Weights are all Zero! calc%Ipnts,Kc=',10I5) END IF WRITE (6,10100) Ddo 10100 FORMAT ('Ddo =', 1p6g14.6) - WRITE (6,10200) (Velcty(I+Kc-1),I=1,Ipnts) + WRITE (6,10200) (Velcty(I+calc%Kc-1),I=1,calc%Ipnts) 10200 FORMAT ('Velcty=', 1p5g14.6) STOP '[STOP in Modfpl in fgm/mfgm2.f]' END IF S = One/S - DO I=1,Ipnts - Wts(I) = Wts(I)*S * Velcty(I+Kc-1)**2 + DO I=1,calc%Ipnts + Wts(I) = Wts(I)*S * Velcty(I+calc%Kc-1)**2 END DO ! RETURN @@ -210,7 +210,8 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Reset (Velcty, Vv, Ddo, Kc) + SUBROUTINE Reset (calc, Velcty, Vv, Ddo, Kc) + class(FreeGasDopplerBroadening)::calc real(kind=8)::Velcty(*), Vv, Ddo integer::Kc @@ -255,12 +256,10 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Wtxxxd (Wts) + SUBROUTINE Wtxxxd (calc, Wts) ! *** integral from (Im1 to I00) but Ip1=1 so only Ip1 contributes, ! *** even though Im2, Im1, and I00 are defined (Kc>3) - use abcexp_m - use abcerf_m - + class(FreeGasDopplerBroadening)::calc real(kind=8)::Wts(*) real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, Qq integer::N, Nn @@ -292,12 +291,10 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Wtxxcd (Wts) + SUBROUTINE Wtxxcd (calc, Wts) ! *** Integral from (Im1 to I00) but Ip1=2 so only I00 and Ip1 ! *** contribute, even though Im2 and Im1 are defined (Kc>2) - use abcexp_m - use abcerf_m - + class(FreeGasDopplerBroadening)::calc real(kind=8):: Wts(*) real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, E, Qq integer::N, Nn @@ -337,11 +334,10 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Wtxbcd (Wts) + SUBROUTINE Wtxbcd (calc, Wts) ! *** Integral from (Im1 to I00) but Ip1=3 so Im2 does not ! *** contribute, even though Im2 is defined (Kc>1) - use abcexp_m - use abcerf_m + class(FreeGasDopplerBroadening)::calc real(kind=8):: Wts(*) real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, E, Qq integer::N, Nn @@ -387,12 +383,10 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Wtabcd (Wts) + SUBROUTINE Wtabcd (calc, Wts) ! *** Integral from (Im1 to I00) where all terms contribute (Kc>3, -! *** Kc<Kdatb-2, Ip1=<Ipnts) - use abcexp_m - use abcerf_m - +! *** Kc<Kdatb-2, Ip1=<calc%Ipnts) + class(FreeGasDopplerBroadening)::calc real(kind=8)::Wts(*) real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, E, Qq integer::N, Nn @@ -442,13 +436,12 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Wtabcx (Wts) + SUBROUTINE Wtabcx (calc, Wts) ! *** Integral from (Im1 to I00) but Im2=Ipnts-2 so Ip1 does not ! *** contribute, even though Ip1=Ipnts+1 is defined ! *** (Kc+Ipnts < Kdatb) - use abcexp_m - use abcerf_m + class(FreeGasDopplerBroadening)::calc real(kind=8)::Wts(*) real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, E, Qq integer::N, Nn @@ -494,13 +487,11 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Wtabxx (Wts) + SUBROUTINE Wtabxx (calc, Wts) ! *** integral from (Im1 to I00) but Im2=Ipnts-1 so I00 & Ip1 DO not ! *** contribute, even though I00=Ipnts+1 & Ip1=Ipnts+2 are defined ! *** (Kc+Ipnts+1 < Kdatb) - use abcexp_m - use abcerf_m - + class(FreeGasDopplerBroadening)::calc real(kind=8)::Wts(*) real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, E, Qq integer::N, Nn @@ -539,13 +530,11 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Wtaxxx (Wts) + SUBROUTINE Wtaxxx (calc, Wts) ! *** Integral from (Im1 to I00) but Im2=Ipnts so only Im2 contributes ! *** even though Im1=Ipnts+1, I00=Ipnts+2, & Ip1=Ipnts+3 are defined ! *** (Kc+Ipnts+2 < Kdatb) - use abcexp_m - use abcerf_m - + class(FreeGasDopplerBroadening)::calc real(kind=8)::Wts(*) real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, E, Qq integer::N, Nn @@ -577,12 +566,11 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Start4 (Vv, Velcty, Wts, Ddo) + SUBROUTINE Start4 (calc, Vv, Velcty, Wts, Ddo) ! ! *** Kc-3 is defined (Kc>3) so can calculate all integrals ! - use brdd_common_m, only : Kc -! + class(FreeGasDopplerBroadening)::calc real(kind=8):: Velcty(*), Wts(*), Ddo, Vv ! @@ -591,10 +579,10 @@ module fgm2_m I00 = Im1 + 1 Ip1 = I00 + 1 ! - Xm2 = (Velcty(Im2+Kc-1)-Vv)/Ddo - Xm1 = (Velcty(Im1+Kc-1)-Vv)/Ddo - X00 = (Velcty(I00+Kc-1)-Vv)/Ddo - Xp1 = (Velcty(Ip1+Kc-1)-Vv)/Ddo + Xm2 = (Velcty(Im2+calc%Kc-1)-Vv)/Ddo + Xm1 = (Velcty(Im1+calc%Kc-1)-Vv)/Ddo + X00 = (Velcty(I00+calc%Kc-1)-Vv)/Ddo + Xp1 = (Velcty(Ip1+calc%Kc-1)-Vv)/Ddo ! Ym1 = Xm1 - Xm2 Y00 = X00 - Xm1 @@ -626,25 +614,24 @@ module fgm2_m ! Itype = 0 ! - CALL Wtxxxd (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) - CALL Wtxxcd (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) - CALL Wtxbcd (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) + CALL Wtxxxd (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) + CALL Wtxxcd (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) + CALL Wtxbcd (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) RETURN END SUBROUTINE Start4 ! ! ! -------------------------------------------------------------- ! - SUBROUTINE Start3 (Vv, Velcty, Wts, Ddo) + SUBROUTINE Start3 (calc, Vv, Velcty, Wts, Ddo) ! ! *** Kc-3 is not defined (Kc=3) so can calculate all integrals but ! *** need to treat first One differently ! - use brdd_common_m, only : Kc -! + class(FreeGasDopplerBroadening)::calc real(kind=8):: Velcty(*), Wts(*), Vv, Ddo ! @@ -653,9 +640,9 @@ module fgm2_m I00 = Im1 + 1 Ip1 = I00 + 1 ! - Xm1 = (Velcty(Im1+Kc-1)-Vv)/Ddo - X00 = (Velcty(I00+Kc-1)-Vv)/Ddo - Xp1 = (Velcty(Ip1+Kc-1)-Vv)/Ddo + Xm1 = (Velcty(Im1+calc%Kc-1)-Vv)/Ddo + X00 = (Velcty(I00+calc%Kc-1)-Vv)/Ddo + Xp1 = (Velcty(Ip1+calc%Kc-1)-Vv)/Ddo ! Y00 = X00 - Xm1 Yp1 = Xp1 - X00 @@ -684,25 +671,25 @@ module fgm2_m ! Itype = 0 ! - CALL WtZxxd (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) - CALL Wtxxcd (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) - CALL Wtxbcd (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) + CALL WtZxxd (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) + CALL Wtxxcd (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) + CALL Wtxbcd (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) RETURN END SUBROUTINE Start3 ! ! ! -------------------------------------------------------------- ! - SUBROUTINE Start2 (Vv, Velcty, Wts, Ddo) + SUBROUTINE Start2 (calc, Vv, Velcty, Wts, Ddo) ! ! *** Kc-2 is not defined (Kc=2) so cannot calculate the first integral; ! *** also, need to treat second integral differently ! - use brdd_common_m, only : Kc, Ipnts ! + class(FreeGasDopplerBroadening)::calc real(kind=8):: Velcty(*), Wts(*), Vv, Ddo ! Im2 = -2 @@ -710,8 +697,8 @@ module fgm2_m I00 = Im1 + 1 Ip1 = I00 + 1 ! - X00 = (Velcty(I00+Kc-1)-Vv)/Ddo - Xp1 = (Velcty(Ip1+Kc-1)-Vv)/Ddo + X00 = (Velcty(I00+calc%Kc-1)-Vv)/Ddo + Xp1 = (Velcty(Ip1+calc%Kc-1)-Vv)/Ddo ! Yp1 = Xp1 - X00 Rp1 = One + Two*Xp1*X00 @@ -724,24 +711,23 @@ module fgm2_m ! Itype = 0 ! - CALL Reset (Velcty, Vv, Ddo, Kc) - CALL WtZxcd (Wts, Ipnts) - CALL Reset (Velcty, Vv, Ddo, Kc) - CALL Wtxbcd (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) + CALL WtZxcd (calc, Wts, calc%Ipnts) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) + CALL Wtxbcd (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) RETURN END SUBROUTINE Start2 ! ! ! -------------------------------------------------------------- ! - SUBROUTINE Start1 (Vv, Velcty, Wts, Ddo) + SUBROUTINE Start1 (calc, Vv, Velcty, Wts, Ddo) ! ! *** Kc-2 is not defined (Kc=2) so cannot calculate the first or ! *** second integrals; also, need to treat third integral differently ! - use brdd_common_m, only : Kc, Ipnts -! + class(FreeGasDopplerBroadening)::calc real(kind=8):: Velcty(*), Wts(*), Vv, Ddo @@ -750,26 +736,24 @@ module fgm2_m I00 = Im1 + 1 Ip1 = I00 + 1 ! - Xp1 = (Velcty(Ip1+Kc-1)-Vv)/Ddo + Xp1 = (Velcty(Ip1+calc%Kc-1)-Vv)/Ddo Itype = 0 ! - CALL Reset (Velcty, Vv, Ddo, Kc) - CALL Reset (Velcty, Vv, Ddo, Kc) - CALL WtZbcd (Wts, Ipnts) - CALL Reset (Velcty, Vv, Ddo, Kc) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) + CALL WtZbcd (calc, Wts, calc%Ipnts) + CALL Reset (calc, Velcty, Vv, Ddo, calc%Kc) RETURN END SUBROUTINE Start1 ! ! ! -------------------------------------------------------------- ! - SUBROUTINE WtZxxd (Wts) + SUBROUTINE WtZxxd (calc, Wts) ! *** Integral from (Im1 to I00) but Ip1=1 so no other terms contribute; ! *** Also Im2 is not defined (Kc<4) - use abcexp_m - use abcerf_m - real(kind=8):: Wts(*) + class(FreeGasDopplerBroadening)::calc real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, Qq integer::N, Nn ! @@ -800,13 +784,11 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE WtZxcd (Wts, Ipnts) + SUBROUTINE WtZxcd (calc, Wts, Ipnts) ! *** Integral from (Im1 to I00) but Ip1=2 so Im2 & Im1 do not contribute; ! *** Also Im2 is not defined (Kc<4) - use abcexp_m - use abcerf_m - real(kind=8):: Wts(*) + class(FreeGasDopplerBroadening)::calc integer::Ipnts real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, E, Qq integer::N, Nn @@ -848,13 +830,12 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE WtZbcd (Wts, Ipnts) + SUBROUTINE WtZbcd (calc, Wts, Ipnts) ! *** integral from (Im1 to I00) but Ip1=3 so Im2 does not contribute; ! *** Also Im2 is not defined (Kc<4) - use abcexp_m - use abcerf_m real(kind=8):: Wts(*) + class(FreeGasDopplerBroadening)::calc integer::Ipnts real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, E, Qq integer::N, Nn @@ -901,14 +882,12 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE WtabcZ (Wts) + SUBROUTINE WtabcZ (calc, Wts) ! *** Integral from (Im1 to I00) but Im2=Ipnts-2 so Ip1 does not ! *** contribute, also Ip1=Ipnts+1 is not defined ! *** (Kc+[Ipnts+1]-1 = Kdatb+1) - use abcexp_m - use abcerf_m - real(kind=8):: Wts(*) + class(FreeGasDopplerBroadening)::calc real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, E, Qq integer::N, Nn @@ -949,14 +928,13 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE WtabxZ (Wts) + SUBROUTINE WtabxZ (calc, Wts) ! *** Integral from (Im1 to I00) but Im2=Ipnts-1 so Ip1 & I00 do not ! *** contribute, also Ip1=Ipnts+2 is not defined ! *** (Kc+[Ipnts+2]-1 = Kdatb+1) - use abcexp_m - use abcerf_m real(kind=8):: Wts(*) + class(FreeGasDopplerBroadening)::calc real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, E, Qq integer::N, Nn @@ -992,14 +970,12 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE WtaxxZ (Wts) + SUBROUTINE WtaxxZ (calc, Wts) ! *** Integral from (Im1 to I00) but Im2=Ipnts so Im1, Ip1, & I00 do not ! *** contribute, also Ip1=Ipnts+3 is not defined ! *** (Kc+[Ipnts+3]-1 = Kdatb+1) - use abcexp_m - use abcerf_m - real(kind=8):: Wts(*) + class(FreeGasDopplerBroadening)::calc real(kind=8)::A, Aa, B, Bb, C, Cc, D, Dd, E, Qq integer::N, Nn @@ -1030,21 +1006,22 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Quit4 (Vv, Velcty, Wts, Ddo, Kc) + SUBROUTINE Quit4 (calc, Vv, Velcty, Wts, Ddo, Kc) ! ! *** (Ipnts+3) is defined (Kc+Ipnts+2<Kdatb) so can calculate all ! *** integrals ! + class(FreeGasDopplerBroadening)::calc real(kind=8):: Velcty(*), Wts(*), Vv, Ddo integer::kc - CALL Wtabcx (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) + CALL Wtabcx (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, Kc) IF (Em1.NE.Zero) THEN - CALL Wtabxx (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) + CALL Wtabxx (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, Kc) IF (Em1.NE.Zero) THEN - CALL Wtaxxx (Wts) + CALL Wtaxxx (calc, Wts) END IF END IF RETURN @@ -1053,21 +1030,22 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Quit3 (Vv, Velcty, Wts, Ddo, Kc) + SUBROUTINE Quit3 (calc, Vv, Velcty, Wts, Ddo, Kc) ! ! *** (Ipnts+3) is not defined (Kc+Ipnts+2=Kdatb) but Ipnts+2 is, so can ! *** calculate all integrals but must do last one differently ! + class(FreeGasDopplerBroadening)::calc real(kind=8):: Velcty(*), Wts(*), Vv, Ddo integer::Kc - CALL Wtabcx (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) + CALL Wtabcx (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, Kc) IF (Em1.NE.Zero) THEN - CALL Wtabxx (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) + CALL Wtabxx (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, Kc) IF (Em1.NE.Zero) THEN - CALL WtaxxZ (Wts) + CALL WtaxxZ (calc, Wts) END IF END IF RETURN @@ -1076,19 +1054,20 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Quit2 (Vv, Velcty, Wts, Ddo, Kc) + SUBROUTINE Quit2 (calc, Vv, Velcty, Wts, Ddo, Kc) ! ! *** (Ipnts+2) is not defined (Kc+Ipnts+1=Kdatb) but Ipnts+1 is, so ! *** cannot calculate last integral and must do second-to-last one ! *** differently ! + class(FreeGasDopplerBroadening)::calc real(kind=8)::Velcty(*), Wts(*), Vv, Ddo integer::Kc - CALL Wtabcx (Wts) - CALL Reset (Velcty, Vv, Ddo, Kc) + CALL Wtabcx (calc, Wts) + CALL Reset (calc, Velcty, Vv, Ddo, Kc) IF (Em1.NE.Zero) THEN - CALL WtabxZ (Wts) + CALL WtabxZ (calc, Wts) END IF RETURN END SUBROUTINE Quit2 @@ -1096,15 +1075,15 @@ module fgm2_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Quit1 (Wts) + SUBROUTINE Quit1 (calc, Wts) ! ! *** (Ipnts+1) is not defined (Kc+Ipnts=Kdatb) but Ipnts is, so ! *** cannot calculate last two integrals and must do third-to-last ! *** differently ! - IMPLICIT None + class(FreeGasDopplerBroadening)::calc real(kind=8):: Wts(*) - CALL WtabcZ (Wts) + CALL WtabcZ (calc, Wts) RETURN END SUBROUTINE Quit1 end module fgm2_m diff --git a/sammy/src/fgm/mfgm3.f90 b/sammy/src/fgm/mfgm3.f90 deleted file mode 100644 index 820e769681a67b52690fb36d8e878d77ce36bdfc..0000000000000000000000000000000000000000 --- a/sammy/src/fgm/mfgm3.f90 +++ /dev/null @@ -1,63 +0,0 @@ -module mfgm3_m - implicit none - contains -! -! -! -------------------------------------------------------------- -! - SUBROUTINE Stetd (derivsOld, derivsNew, Irow, Now, & - Ktempx, Isox, Jdat, Locate) -! -! *** purpose -- COPY DATA AND DERIVATIVES, CUZ THERE ARE TOO FEW -! *** POINTS TO BROADEN -! - use fixedi_m, only : numUsedPar - use DerivativeHandler_M -! - integer:: Isox, Jdat, Locate, Ktempx, Now, irow - integer::Ii, N, nsigMax - type(DerivativeHandler)::derivsOld, derivsNew - real(kind=8)::Zero,val - DATA Zero /0.0d0/ -! - NOW = NOW + 1 - if (Locate.eq.0) then - if (derivsNew%getNnnsig().ne.derivsOld%getNnnsig()) then - Write (6,10000) Locate, & - derivsOld%getNnnsig(), & - derivsNew%getNnnsig() -10000 FORMAT (' Error in Stetd, Locate.ne.0 but na.ne.nb',3i6) - - end if - end if - IF (Locate.NE.0) THEN - ! update cross section (ipar=0) as well as derivatives - DO Ii=0,numUsedPar - val = derivsOld%getDataNsOld(Jdat, Locate, Ii, Isox) - if (val.eq.0.0d0) cycle - call derivsNew%addDataNs(irow, 1, Ii, Isox, val) - end do - else - DO N=1,derivsOld%getNnnsig() - ! update cross section (ipar=0) as well as derivatives - DO Ii=0,numUsedPar - val = derivsOld%getDataNsOld(Jdat, N, Ii, Isox) - if (val.eq.0.0d0) cycle - call derivsNew%addDataNs(irow, N, Ii, Isox, val) - End do - END DO - end if -! - IF (numUsedPar.gt.0 .and. Ktempx.gt.0) THEN - IF (Locate.NE.0) THEN - call derivsNew%addDataNs(irow, 1, Ktempx, Isox, 0.0d0) - ELSE - do N = 1, derivsOld%getNnnsig() - call derivsNew%addDataNs(irow, N, Ktempx, Isox, 0.0d0) - END DO - END IF - END IF -! - RETURN - END SUBROUTINE Stetd -end module mfgm3_m diff --git a/sammy/src/fgm/mfgm4.f90 b/sammy/src/fgm/mfgm4.f90 index a248f1376d4e27f80826127cb1db118747ea1c4f..dcc552064f1e24be61b0dea5151aec627dea0af8 100644 --- a/sammy/src/fgm/mfgm4.f90 +++ b/sammy/src/fgm/mfgm4.f90 @@ -1,34 +1,36 @@ module mfgm4_m + use fgm2_m + use DerivativeHandler_M + use FreeGasDopplerBroadening_M + use, intrinsic :: ISO_C_BINDING + IMPLICIT None + + + public Xdofgm contains ! ! ! -------------------------------------------------------------- ! - SUBROUTINE Xdofgm (Velcty, derivs, & + SUBROUTINE Xdofgm (calc, Velcty, derivs, & Wts, Em, Vv, Ddo, Tempx, Iffy, Ktempx, Isox, & Ngtvx, irow) ! ! *** PERFORM INTEGRATION FOR DOPPLER-BROADENING FROM POINT NUMBER -! *** Kc TO POINT NUMBER Iup -! - use fixedi_m, only : numUsedPar - use ifwrit_m, only : Kdebug - use brdd_common_m, only : Ipnts, Kc - use fgm2_m - use DerivativeHandler_M - use, intrinsic :: ISO_C_BINDING - IMPLICIT None +! *** calc%Kc TO POINT NUMBER Iup +! integer::Iffy, Ktempx, Isox, Ngtvx real(kind=8)::Velcty(*), Wts(*), Em, Vv, Ddo, Tempx type(DerivativeHandler)::derivs + class(FreeGasDopplerBroadening)::calc real(kind=8)::Sigpls(100), Sigmns(100), Derdop(100) real(kind=8)::Zero, One real(kind=8)::Del, Derdp1, Derdp2, Sigt, W, val real(kind=8)::Sigma integer::I, Ipar, Iso, Ix, K, Ks, N, Ikc, Ipos, irow - logical(C_BOOL)::accu + DATA Zero /0.0d0/, One /1.0d0/ IF (derivs%getNnnsig().GT.100) STOP '[STOP in Xdofgm in fgm/mfgm4.f]' ! @@ -37,11 +39,11 @@ module mfgm4_m Iso = Isox ! Del = 0.02D0 - IF (numUsedPar.gt.0.AND. Ktempx.GT.0 .AND. Em.NE.Zero) THEN + IF (calc%getNumParams().gt.0.AND. Ktempx.GT.0 .AND. Em.NE.Zero) THEN W = Ddo*(One+Del) - CALL Funfgm (W, Vv, Velcty, Wts, Sigpls, Isox, derivs) + CALL Funfgm (calc, W, Vv, Velcty, Wts, Sigpls, Isox, derivs) W = Ddo*(One-Del) - CALL Funfgm (W, Vv, Velcty, Wts, Sigmns, Isox, derivs) + CALL Funfgm (calc, W, Vv, Velcty, Wts, Sigmns, Isox, derivs) ! DO I=1,derivs%getNnnsig() Sigpls(I) = Sigpls(I)/dABS(Em) @@ -51,44 +53,40 @@ module mfgm4_m END IF ! ! - IF (Ipnts.LE.3) THEN + IF (calc%Ipnts.LE.3) THEN ! *** modified Simpson rule -- see manual for details - CALL Modsmp (Vv, Velcty, Wts, Ddo) - ELSE IF (Ipnts.GT.3) THEN + CALL Modsmp (calc, Vv, Velcty, Wts, Ddo) + ELSE IF (calc%Ipnts.GT.3) THEN ! *** modified 4-point Lagrange -- see manual for details - CALL Modfpl (Vv, Velcty, Wts, Ddo) + CALL Modfpl (calc, Vv, Velcty, Wts, Ddo) END IF ! ! - accu = .true. - call derivs%setAccumulate(accu) - DO Ipar=0,numUsedPar + + DO Ipar=0,calc%getNumParams() DO N=1,derivs%getNnnsig() val = 0.0d0 - DO I=1,Ipnts + DO I=1,calc%Ipnts IF (Wts(I).NE.Zero) THEN - Ikc = I + Kc - 1 + Ikc = I + calc%Kc - 1 ! update cross section (ipar=0) as well as derivatives val = val + Wts(I)*derivs%getDataNsOld(Ikc, N, Ipar, Iso) END if END Do - if (val.eq.0.0d0) cycle - call derivs%addDataNs(irow, N, Ipar, Iso, val) + calc%rowData(N, Ipar) = calc%rowData(N, Ipar) + val end do END DO - Sigt = derivs%getDataNs(irow, 1, 0, Iso) + Sigt = calc%rowData(1, 0) - accu = .false. - call derivs%setAccumulate(accu) - Sigma = derivs%getDataNs(irow, 1, 0, Iso) + Sigma = calc%rowData(1, 0) IF (Ngtvx.EQ.1 .AND. Sigma.LT.Zero) THEN IF (Sigma.GT.-1.E-15) THEN Sigma = Zero ELSE Ix = 0 - DO I=1,Ipnts-2 - Ikc = Kc + I - 1 + DO I=1,calc%Ipnts-2 + Ikc = calc%Kc + I - 1 IF (derivs%getDataNsOld(Ikc, 1, 0, Iso).GT.Zero) Ix = Ix + 1 END DO IF (Ix.EQ.0) THEN @@ -100,14 +98,14 @@ module mfgm4_m ' at Energy =', 0PF30.15) END IF END IF - call derivs%addDataNs(irow, 1, 0, Iso, Sigma) + calc%rowData(1, 0) = Sigma ELSE IF (Ngtvx.EQ.0 .AND. Sigma.GT.Zero) THEN IF (Sigma.LT.1.E-15) THEN Sigma = Zero ELSE Ix = 0 - DO I=1,Ipnts-2 - Ikc = Kc + I - 1 + DO I=1,calc%Ipnts-2 + Ikc = calc%Kc + I - 1 IF (derivs%getDataNsOld(Ikc-1, 1, 0, Iso).LT.Zero) Ix = Ix + 1 END DO IF (Ix.EQ.0) THEN @@ -119,12 +117,12 @@ module mfgm4_m 1PG14.6, ' at Energy =', 0PF30.15) END IF END IF - call derivs%addDataNs(irow, 1, 0, Iso, Sigma) + calc%rowData(1, 0) = Sigma END IF ! Do N=1, derivs%getNnnsig() - do Ipar = 0, numUsedPar - val = derivs%getDataNs(irow, N, Ipar, Iso) + do Ipar = 0, calc%getNumParams() + val = calc%rowData(N, Ipar) if(val.eq.0.0d0) cycle if (EM.LT.ZERO) then val = -val/Em @@ -133,22 +131,22 @@ module mfgm4_m else val = val/Em end if - call derivs%addDataNs(irow, N, Ipar, Iso, val) + calc%rowData(N, Ipar) = val end do END DO ! ! ! - IF (Ktempx.LE.0 .OR. numUsedPar.le.0) THEN + IF (Ktempx.LE.0 .OR. calc%getNumParams().le.0) THEN GO TO 200 ELSE K = Ktempx DO N=1,derivs%getNnnsig() val = Derdop(N)*Ddo*0.5d0/Tempx - call derivs%addDataNs(irow, N, K, Iso, val) + calc%rowData(N, K) = val ! Derdop already has 1/Em built in END DO - IF (Kdebug.EQ.0) RETURN + IF (.not.calc%debugOutput) RETURN IF (Em.EQ.Zero) RETURN ! ! *** Here for debug info only @@ -176,33 +174,30 @@ module mfgm4_m ! ! -------------------------------------------------------------- ! - SUBROUTINE Funfgm (Ddo, Vv, Velcty, Wts, Sum, Isox, derivs) + SUBROUTINE Funfgm (calc, Ddo, Vv, Velcty, Wts, Sum, Isox, derivs) ! - use brdd_common_m, only : Ipnts, Kc - use fgm2_m - use DerivativeHandler_M - IMPLICIT None real(kind=8)::Velcty(*), Wts(*), Sum(*) real(kind=8)::Ddo, Vv integer::Isox, Nb real(kind=8)::Zero integer::I, Ikc, N type(DerivativeHandler)::derivs + class(FreeGasDopplerBroadening)::calc DATA Zero /0.0d0/ ! ! *** modified Simpson rule -- see manual for details - IF (Ipnts.LE.3) CALL Modsmp (Vv, Velcty, Wts, Ddo) + IF (calc%Ipnts.LE.3) CALL Modsmp (calc, Vv, Velcty, Wts, Ddo) ! ! *** modified 4-point Lagrange -- see manual for details - IF (Ipnts.GT.3) CALL Modfpl (Vv, Velcty, Wts, Ddo) + IF (calc%Ipnts.GT.3) CALL Modfpl (calc, Vv, Velcty, Wts, Ddo) ! DO N=1,derivs%getNnnsig() Sum(N) = Zero END DO - DO I=1,Ipnts - Ikc = I + Kc - 1 + DO I=1,calc%Ipnts + Ikc = I + calc%Kc - 1 IF (Wts(I).NE.Zero) THEN DO N=1,derivs%getNnnsig() Sum(N) = Sum(N) + Wts(I)*derivs%getDataNsOld(Ikc, N, 0, Isox) diff --git a/sammy/src/fin/mfin0.f90 b/sammy/src/fin/mfin0.f90 index 94cf6c9fb8b518b47178f40a500ec31236d4237f..bab45d6e20340f49d1a9542ae2da81cc55d442de 100644 --- a/sammy/src/fin/mfin0.f90 +++ b/sammy/src/fin/mfin0.f90 @@ -60,7 +60,6 @@ module fin END IF ! ! - IF (Kplotu.NE.0) Kplotu = 0 IF (Kgodf .NE.0) THEN ! - - - - - - - - - - - - - - - - - - - - - - - - - - - < CALL Vodf @@ -98,7 +97,7 @@ module fin A_Itempy = 1.0d0 ! conversion factor from U to P, usually 1, except for resonance parameters CALL Convrt ( A_Iprbrd , I_Iflbrd , A_Isiabn , & A_Iechan , & - A_Idpiso , A_Idsiso , & + A_Idpiso , & A_Iprdet , I_Ifldet , & A_Ipolar , A_Iprmsc , I_Iflmsc , I_Irdmsc , A_Iprpmc , & I_Iflpmc , A_Iprorr , I_Iflorr , A_Iprrpi , I_Iflrpi , & diff --git a/sammy/src/fin/mfin1.f90 b/sammy/src/fin/mfin1.f90 index a38e246da141df323e75f89c0a44aa0229dc0b03..f69fd3c93fdbfa5d56002be905fed433dd319496 100644 --- a/sammy/src/fin/mfin1.f90 +++ b/sammy/src/fin/mfin1.f90 @@ -61,7 +61,7 @@ module fin1 ! -------------------------------------------------------------- ! SUBROUTINE Convrt ( Parbrd, Iflbrd, Siabnd, & - Echan , Dopwid, Doswid, & + Echan , Dopwid, & Pardet, Ifldet, & Polar , Parmsc, Iflmsc, Iradms, Parpmc, Iflpmc, & Parorr, Iflorr, Parrpi, Iflrpi, Parudr, Ifludr, & @@ -81,7 +81,7 @@ module fin1 ! DIMENSION Parbrd(*), Iflbrd(*), Siabnd(*), & Echan(Ntotc,*), & - Dopwid(*), Doswid(*), & + Dopwid(*), & Pardet(*), Ifldet(*), & Polar(2,*), Parmsc(*), Iflmsc(*), Iradms(*), & Parpmc(4,*), Iflpmc(4,*), & @@ -93,7 +93,7 @@ module fin1 ! ! DIMENSION Parbrd(Numbrd), Iflbrd(Numbrd), Ntot(Ngroup), ! * Echan(Ntotc,Ngroup), -! * Dopwid(Numiso), Doswid(Numiso), +! * Dopwid(Numiso), ! * Pardet(Numdet), Ifldet(Numdet), ! * Polar(2,Nres), Parmsc(Nummsc), Iflmsc(Nummsc), Iradms(Ngroup), ! * Parpmc(4,Numpmc), Iflpmc(4,Numpmc), @@ -151,8 +151,7 @@ module fin1 IF (Nvp.EQ.Nvpall) RETURN ! IF (Nvpmsc.NE.0) THEN - CALL Cnvmsc (Siabnd, Doswid, & - Parmsc, Iflmsc, Iradms, Tempy, Ipar) + CALL Cnvmsc (Siabnd, Parmsc, Iflmsc, Iradms, Tempy, Ipar) END IF CALL Update (Ipar, Kpar, Nvp, Nfpmsc, Nvpmsc) IF (Nvp.EQ.Nvpall) RETURN @@ -952,6 +951,10 @@ module fin1 Dopwid(1) = Dopple END IF Temp = val + if (associated(dopplerInfo%broadener)) then + call dopplerInfo%broadener%setTemperature(temp) + dopplerInfo%wantBroaden = .true. + end if ELSE IF (I.EQ.3) THEN Thick = val ELSE IF (I.EQ.4) THEN @@ -975,7 +978,7 @@ module fin1 ! ! -------------------------------------------------------------- ! - SUBROUTINE Cnvmsc (Siabnd, Doswid, & + SUBROUTINE Cnvmsc (Siabnd, & Parmsc, Iflmsc, Iradms,Tempy, Ipar) ! ! *** PURPOSE -- Convert from updated U-Parameters to updated P-Parameters @@ -993,13 +996,12 @@ module fin1 use RMatResonanceParam_M IMPLICIT DOUBLE PRECISION (a-h,o-z) ! - DIMENSION Siabnd(*), Doswid(*), & - Parmsc(*), Iflmsc(*), Iradms(*), Tempy(*) + DIMENSION Siabnd(*), Parmsc(*), Iflmsc(*), Iradms(*), Tempy(*) type(SammyResonanceInfo)::resInfo type(SammySpinGroupInfo)::spinInfo type(RMatResonance)::resonance, resonanceRed ! -! DIMENSION Siabnd(Numiso), Doswid(Numiso), +! DIMENSION Siabnd(Numiso), ! * Parmsc(Nummsc), Iflmsc(Nummsc), Iradms(Ngroup), ! * U(Nvpall), Tempy(Nvpall) DATA Zero /0.0d0/, One /1.0d0/ @@ -1063,17 +1065,8 @@ module fin1 Tzero = Parmsc(I) Elzero = Parmsc(I+1) Tttzzz = Sm2*Dist*Elzero - ELSE IF (Ksitmp.EQ.I) THEN - Aa = dSQRT(Parmsc(Ksitmp)/Sitemp) - Dosind = Dosind*Aa - Sitemp = Parmsc(Ksitmp) - IF (Numiso.NE.0) THEN - DO Iso=1,Numiso - Doswid(Iso) = Aa*Doswid(Iso) - END DO - ELSE - Doswid(1) = Dosind - END IF + ELSE IF (Ksitmp.EQ.I) THEN + Sitemp = Parmsc(Ksitmp) ELSE IF (Ksithc.EQ.I) THEN Sithck = Parmsc(Ksithc) ELSE IF (Ksindi.EQ.I) THEN diff --git a/sammy/src/grp/mgrp2.f b/sammy/src/grp/mgrp2.f index 57e62c80222bcab050b83fc1f04f62b0dae6ca39..b938effe6116a713960b12057023120b16d44fac 100755 --- a/sammy/src/grp/mgrp2.f +++ b/sammy/src/grp/mgrp2.f @@ -8,15 +8,12 @@ C *** Purpose -- Find highest Kmn such that Energy(Kmn).LE.Emn C *** lowest Kmx such that Energy(Kmx).GE.Emx C on auxillary grid C - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M IMPLICIT DOUBLE PRECISION (a-h,o-z) type(SammyGridAccess)::grid C call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) Ilow = Kc - 1 @@ -85,7 +82,6 @@ C DIMENSION Ebonda(*), Bondar(*), Fintgr(2,Ngbxxx,*) C call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) Kbonda = 0 diff --git a/sammy/src/grp/mgrp3.f b/sammy/src/grp/mgrp3.f index 61871a93938710d1105d6926dcada4e47eada921..018b34d8efe53e28b6a901bde7d1519d1d239fe4 100644 --- a/sammy/src/grp/mgrp3.f +++ b/sammy/src/grp/mgrp3.f @@ -45,7 +45,6 @@ C *** are within energy range specified. If not, testee C *** issues warning, and redefines limits (also redefines C *** Ndatq, if needed). call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) elow = grid%getEnergy(1, expData) ehigh = grid%getEnergy(Kdatb, expData) diff --git a/sammy/src/grp/mgrp4.f b/sammy/src/grp/mgrp4.f index da5a56c1ed2b9f99c673afdf7d074c55e8be71c5..940912cd63019d0a03288907c03ee7a44f7bfaeb 100755 --- a/sammy/src/grp/mgrp4.f +++ b/sammy/src/grp/mgrp4.f @@ -11,16 +11,13 @@ C *** Note -- Integral is from Emn to Emx, where C *** Energb(Jlow-1) < Emn =< Energb(Jlow ) and C *** Energb(Jup ) =< Emx < Energb(Jup+1) C - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M IMPLICIT DOUBLE PRECISION (a-h,o-z) type(SammyGridAccess)::grid DIMENSION Wts(*), Weight(*) C - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) CALL Zero_Array (Wts, Kdatb) J = Kmx - Kmn + 1 diff --git a/sammy/src/inp/minp01.f b/sammy/src/inp/minp01.f index 7a41d383518847e0da4b5254e2a386b4ea877d05..810b6fa56dc56c82522e22aa0151e1f8c6f989dd 100644 --- a/sammy/src/inp/minp01.f +++ b/sammy/src/inp/minp01.f @@ -272,11 +272,13 @@ C use ifwrit_m use exploc_common_m use broad_common_m - use EndfData_common_m + use EndfData_common_m use Qiso_m use par1_m + use GridData_M IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Nvp(15), Nfp(15) + type(GridData)::grid call resParData%cleanIsotopes() @@ -300,14 +302,21 @@ C C *** three Ncrsss = Ntotc + 1 N = (Ncrsss+1)/2 - call make_I_Ifcros(Ncrsss) + call make_I_Ifcros(Ncrsss) + if (expData%getLength().eq.0) then + call grid%initialize() + call expData%addGrid(grid) + if (Nangle.gt.0) then + call grid%setNumPerEnergy(Nangle) + end if + ! one point per energy is the default + + numcro = grid%getNumPerEnergy() + end if IF (Nangle.GT.0) THEN - N = Nangle - Numcro = N + N = Nangle call make_A_Iangle(N) call make_A_Idangl(N) - ELSE - Numcro = 1 END IF C C *** four @@ -337,7 +346,6 @@ C *** needed here, because Nnniso=1 is used if Numiso=0 call make_A_Ispiso(N) call make_I_Ixciso(N) call make_A_Idpiso(N) - call make_A_Idsiso(N) M = Ngroup DO J=1,N amass = 0.0d0 diff --git a/sammy/src/inp/minp04.F b/sammy/src/inp/minp04.F index 2e68ef8e7595d33ed16525aae7ab1a629d9b9bb3..f5e6ce80e8ece5a0c384a5d0acf53f8400cf6bd1 100644 --- a/sammy/src/inp/minp04.F +++ b/sammy/src/inp/minp04.F @@ -192,6 +192,7 @@ C use namfil_common_m use lbro_common_m use Observable_common_m + use broad_common_m, only : dopplerInfo IMPLICIT DOUBLE PRECISION (a-h,o-z) C #ifdef COMPILE_WITH_SAMINT @@ -480,6 +481,7 @@ C *** Leal-Hwang Doppler broadening (-213,214)(1) C *** Gaussian approx for Doppler (-215,216,217,218)(0) C *** Crystal lattice model of Dopp (-219,220)(3) Kkkdop = 2 + dopplerInfo%bType = 2 C C *** DO NOT BROADEN THE LOW-ENERGY DATA POINTS (-221) Nolowb = 0 diff --git a/sammy/src/inp/minp05.F b/sammy/src/inp/minp05.F index 0d359ec3a9cd35316c0c58b595aeefba1211b382..8f2f5464d8bfeb0fbbfa0d259b7dd2d482195757 100644 --- a/sammy/src/inp/minp05.F +++ b/sammy/src/inp/minp05.F @@ -16,7 +16,7 @@ C use lbro_common_m use misccc_common_m use Observable_common_m - + use broad_common_m, only : dopplerInfo use mdf5_m IMPLICIT DOUBLE PRECISION (a-h,o-z) C @@ -355,13 +355,17 @@ C ************************************************************ C ELSE IF (Number.EQ.211 .OR. Number.EQ.212) THEN Kkkdop = 2 + dopplerInfo%bType = 2 ELSE IF (Number.EQ.213 .OR. Number.EQ.214) THEN Kkkdop = 1 + dopplerInfo%bType = 1 ELSE IF (Number.EQ.215 .OR. Number.EQ.216 .OR. Number.EQ.217 * .OR. Number.EQ.218) THEN Kkkdop = 0 + dopplerInfo%bType = 0 ELSE IF (Number.EQ.219 .OR. Number.EQ.220) THEN Kkkdop = 3 + dopplerInfo%bType = 3 ELSE IF (Number.EQ.221) THEN Nolowb = 1 C diff --git a/sammy/src/inp/minp06.f b/sammy/src/inp/minp06.f index 0e9c8fcf3a4de82d79938a033dc3d515aee21012..9b2d716627b87ac2886813a2499f2bb23f371aa3 100644 --- a/sammy/src/inp/minp06.f +++ b/sammy/src/inp/minp06.f @@ -178,6 +178,91 @@ C *** CARD SET 2 C RETURN END + + subroutine setup_broadening + use broad_common_m + use FreeGasDopplerBroadening_M + use DopplerAndResolutionBroadener_M + use GridData_M + use EndfData_common_m, only : expData + use array_sizes_common_m, only : calcData, calcDataInit, + * calcDataSelf, calcDataSelfInit + implicit none + integer::bTypeOld + + ! make sure we delete the ones we don't need + bTypeOld = -1 + if (associated(dopplerInfo%highEnergyFreeGas)) then + bTypeOld = 0 + else if (associated(dopplerInfo%lealHwang)) then + bTypeOld = 1 + else if (associated(dopplerInfo%freeGas)) then + bTypeOld = 2 + else if(associated(dopplerInfo%crystalLattice)) then + bTypeOld = 3 + end if + if (bTypeOld.eq.dopplerInfo%bType) return ! all set + + if (bTypeOld.ne.-1) then + call dopplerInfo%broadener%destroy() + if (bTypeOld.eq.0) then + deallocate(dopplerInfo%highEnergyFreeGas) + else if (bTypeOld.eq.1) then + deallocate(dopplerInfo%lealHwang) + else if (bTypeOld.eq.2) then + deallocate(dopplerInfo%freeGas) + else if (bTypeOld.eq.3) then + deallocate(dopplerInfo%crystalLattice) + end if + end if + + ! and set up the correct broadening option + if (.not.calcDataInit) then + calcDataInit = .true. + call calcData%initialize() + end if + if (.not.calcDataSelfInit) then + calcDataSelfInit = .true. + call calcDataSelf%initialize() + end if + if (.not.workArrayInit) then + call workArray%initialize() + workArrayInit = .true. + end if + IF (dopplerInfo%bType.EQ.0) then + allocate(dopplerInfo%highEnergyFreeGas) + dopplerInfo%broadener => dopplerInfo%highEnergyFreeGas + call dopplerInfo%broadener%initialize(calcData, + * expData, workArray) + dopplerInfo%highEnergyFreeGas%dataSelf%instance_ptr = + * calcDataSelf%instance_ptr + dopplerInfo%highEnergyFreeGas%Brdlim = Brdlim + else IF (dopplerInfo%bType.EQ.1) then + allocate(dopplerInfo%lealHwang) + dopplerInfo%broadener => dopplerInfo%lealHwang + call dopplerInfo%broadener%initialize(calcData, + * expData, workArray) + dopplerInfo%lealHwang%dataSelf%instance_ptr = + * calcDataSelf%instance_ptr + else IF ( dopplerInfo%bType.EQ.2) then + allocate(dopplerInfo%freeGas) + dopplerInfo%broadener => dopplerInfo%freeGas + call dopplerInfo%broadener%initialize(calcData, + * expData, workArray) + dopplerInfo%freeGas%dataSelf%instance_ptr = + * calcDataSelf%instance_ptr + dopplerInfo%freeGas%Brdlim = Brdlim + else IF ( dopplerInfo%bType.EQ.3) then + allocate(dopplerInfo%crystalLattice) + dopplerInfo%broadener => dopplerInfo%crystalLattice + call dopplerInfo%broadener%initialize(calcData, + * expData, workArray) + dopplerInfo%crystalLattice%dataSelf%instance_ptr = + * calcDataSelf%instance_ptr + else + STOP 'Invalid doppler broadening option in inp/minp6.f' + end if + end subroutine C C C -------------------------------------------------------------- @@ -193,13 +278,23 @@ C use broad_common_m use constn_common_m use Wdsint_m - IMPLICIT DOUBLE PRECISION (a-h,o-z) + use broad_common_m + IMPLICIT None C C DIMENSION Parbrd(Numbrd), Iflbrd(Numbrd), Bcf(Ncf), Cf2(Ncf), Cf(Ncf) - DIMENSION Parbrd(*), Iflbrd(*), Bcf(*), Cf2(*) + real(kind=8)::Parbrd(*), Bcf(*), Cf2(*) + integer::Iflbrd(*) + real(kind=8)::Eeemin, Aw, Deltab real(kind=8),allocatable,dimension(:)::Cf + real(kind=8)::Elowbr, Delttt C - DATA Zero /0.0d0/ + real(kind=8),parameter::Zero=0.0d0 + real(kind=8)::A, B, Ao2x, Ax, Dist1, Do2x, E1, Gaussian, Xm + integer::I, Iwrong, Kz + + ! set up broadening + Brdlim = 5.0d0 + call setup_broadening C C C *** CARD SET 5 @@ -291,9 +386,11 @@ C Ao2 = Zero Bo2 = Zero Co2 = Zero + dopplerInfo%wantBroaden = .false. C IF (Temp.NE.Zero .AND. Aw.NE.Zero) THEN Dopple = dSQRT(Boltzm*Aneutr*Temp/Aw) + dopplerInfo%wantBroaden = .true. END IF C C @@ -339,12 +436,11 @@ C C *** Check Emin against 5*Doppler width E1 = Eeemin C - IF (Kkkdop.EQ.0) THEN + IF (dopplerInfo%bType.EQ.0) THEN C IF (using HEGA = High-Energy-Gaussian-Approximation to free gas C model) then cannot broaden low energy points - Xm = Zero - Brdlim = 5.0d0 -C *** changed from 4.0d0 June 1997 + Xm = Zero +C *** Brdlim changed from 4.0d0 to 5.0d0 June 1997 IF (Dopple.NE.Zero) Xm = (2.0d0*Brdlim*Dopple)**2 IF (Maxwel.NE.1 .AND. Nolowb.EQ.0 .AND. E1.LT.Xm) THEN WRITE (06,11100) Xm @@ -353,9 +449,24 @@ C *** changed from 4.0d0 June 1997 * 1X, 'using the Gaussian approximation.', /, * ' Therefore SAMMY will switch to the Free Gas Model.', * /, /, ' Min energy for DBD = ', 1p4e14.6) - Kkkdop = 2 + + if (dopplerInfo%bType.ne.2) then + Kkkdop = 2 + dopplerInfo%bType = 2 + call setup_broadening + end if END IF END IF + + if (dopplerInfo%bType.eq.0) then + dopplerInfo%highEnergyFreeGas%Elowbr = Elowbr + else if( dopplerInfo%bType.eq.2) then + dopplerInfo%freeGas%Elowbr = Elowbr + end if + call dopplerInfo%broadener%setTemperature(temp) + if (associated(dopplerInfo%lealHwang) ) then + dopplerInfo%lealHwang%delT = Delttt + end if C C SET STARTING VALUE FOR EST IN SHFTGE ROUTINE C @@ -398,6 +509,7 @@ C *** stuff on CARD SET 5 Co2 = Zero Do2 = Zero Dopple = Zero + dopplerInfo%wantBroaden = .false. Nobrd = 1 RETURN END diff --git a/sammy/src/int/mint0.f b/sammy/src/int/mint0.f index a913c86b17a711fadddcfd1ea3bd8bb5ec1f88bc..148df684ebb8d13f5ca2ce873ebd42947c9f7879 100644 --- a/sammy/src/int/mint0.f +++ b/sammy/src/int/mint0.f @@ -1,6 +1,6 @@ C C - SUBROUTINE Samint_0(debugOut, haveMultScatter) + SUBROUTINE Samint_0(debugOut, haveMultScatter, Jwwwww, Jjjdop) C C *** Purpose -- Print cross sections etc C @@ -20,6 +20,7 @@ C CHARACTER*10 Sss character(len=80)::line logical::debugOut, haveMultScatter + integer::Jwwwww, Jjjdop C C WRITE (line, 99999) @@ -34,17 +35,17 @@ C C C *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR SAMINT CALL Estint (Nblmax, Iv, debugOut, haveMultScatter) - I = Idimen (Istarting, -1, 'Istarting, -1') + I = Idimen (Istarting, -1, 'Istarting, -1') C C C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < IF (Jjjdop.EQ.1) THEN C (intermediate results, using Leal-Hwang Energy grid) - CALL Leal_Hwang (Nblmax, debugOut) + CALL Leal_Hwang (Nblmax, debugOut, Jwwwww) C ELSE IF (debugOut) THEN C (intermediate results, using regular auxiliary grid) - CALL Intermediate (Iv) + CALL Intermediate (Iv, Jwwwww) C ELSE C (final results, no more broadening or anything else needed) diff --git a/sammy/src/int/mint0a.f b/sammy/src/int/mint0a.f index e49d64d7955eea657eebbe759187e94979a001e7..46ff6dff88588b9671e445a48ae23250f6d6c97b 100644 --- a/sammy/src/int/mint0a.f +++ b/sammy/src/int/mint0a.f @@ -2,7 +2,7 @@ C C C -------------------------------------------------------------- C - SUBROUTINE Intermediate (Iv) + SUBROUTINE Intermediate (Iv, Jwwwww) use oops_common_m use fixedi_m use ifwrit_m @@ -22,6 +22,7 @@ C use AuxGridHelper_M IMPLICIT DOUBLE PRECISION (a-h,o-z) type(GridData)::grid + integer::Jwwwww type(SammyGridAccess)::gridAccess integer,allocatable,dimension(:)::I_Jjjder, I_Jjjpar real(kind=8),allocatable,dimension(:)::A_Idum @@ -34,7 +35,6 @@ C - - - - - - - - - - - - - > ! get SAMMY Aux grid. Reuse experimental grid if it doesn't exi call gridAccess%initialize() - call gridAccess%setParameters(numcro, ktzero) call gridAccess%setToAuxGrid(expData) C C *** Read the cross sections etc @@ -153,8 +153,7 @@ C C Nnn= Ndat N = Ndat - call gridAccess%initialize() - call gridAccess%setParameters(numcro, ktzero) + call gridAccess%initialize() call gridAccess%setToExpGrid(expData) IF (Ktheor.NE.0) CALL Outthr (7, gridAccess, diff --git a/sammy/src/int/mint1.f b/sammy/src/int/mint1.f index 1ec72cbf68190bd31a71faa0094327866be208bf..46ba0fb6e73eb68f4fa183bb455a80dbc4e186b1 100644 --- a/sammy/src/int/mint1.f +++ b/sammy/src/int/mint1.f @@ -26,11 +26,9 @@ C C Kkknew = Jgbmax - call auxGrid%initialize() - call auxGrid%setParameters(numcro, ktzero) + call auxGrid%initialize() call auxGrid%setToAuxGrid(expData) - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToExpGrid(expData) C IF (Kkknew.LT.1) THEN diff --git a/sammy/src/int/mint2.f90 b/sammy/src/int/mint2.f90 index fc4ec8f58630e77dbdb053ff7555c55ea6d87fda..323ef8fc236204cb7ca4887764d7c49a2f04afab 100644 --- a/sammy/src/int/mint2.f90 +++ b/sammy/src/int/mint2.f90 @@ -430,9 +430,7 @@ module mint2_m ! -------------------------------------------------------------- ! SUBROUTINE Wascii (derivs, Ndat) - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use DerivativeHandler_M use SammyGridAccess_m ! *** Write theoretical values into ascii file SAMTHE.DAT @@ -444,7 +442,6 @@ module mint2_m ! CALL Newopn (59, File, 0) call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToExpGrid(expData) DO J=1,Ndat WRITE (59,10000) grid%getEnergy(J, expData), & @@ -651,9 +648,7 @@ module mint2_m ! which we need to set the values for SammyGridAccess. ! use modf3_M - use EndfData_common_m - use ifwrit_m, only : ktzero - use fixedi_m, only : numcro + use EndfData_common_m use SammyGridAccess_M use DerivativeHandler_M @@ -672,7 +667,6 @@ module mint2_m integer::Ipos,iso, NumSect, ii, niso call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) niso = derivs%getUsedIsotopes() if( old) niso = derivs%getUsedIsotopesOld() diff --git a/sammy/src/int/mint3.f b/sammy/src/int/mint3.f index 07323c3a85907d5e485c30380e366c16d9a0a8d3..c87f92567ec8f2d80c73ef970be174ba9c856df0 100644 --- a/sammy/src/int/mint3.f +++ b/sammy/src/int/mint3.f @@ -25,13 +25,11 @@ C type(GridData)::grid type(SammyGridAccess)::gridAccess DIMENSION Dum(*), Block(*) -C DIMENSION Data(Ndat*Numcro) Data Zero /0.0d0/, One /1.0d0/ C Nsect = 0 Input = 0 call gridAccess%initialize() - call gridAccess%setParameters(numcro, ktzero) call gridAccess%setToExpGrid(expData) IF (Nblock.LT.Ndat) WRITE (6,10010) Nblock, Ndat 10010 FORMAT (' Possible problem with ODF file; Nblock,Ndat=', 2I8) @@ -255,8 +253,6 @@ C SUBROUTINE Undo (Data, Ndat) use fixedr_m use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero use SammyGridAccess_M IMPLICIT DOUBLE PRECISION (a-h,o-z) type(SammyGridAccess)::grid @@ -264,7 +260,6 @@ C Data Zero /0.0d0/, One /1.0d0/ C call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToExpGrid(expData) DO I=1,Ndat @@ -292,9 +287,7 @@ C Unfortunately this value can be different from the numcro set in fixedi_m, C which we need to set the values for SammyGridAccess. C use modf3_M - use EndfData_common_m - use ifwrit_m, only : ktzero - use fixedi_m, only : numcro + use EndfData_common_m use SammyGridAccess_M IMPLICIT DOUBLE PRECISION (a-h,o-z) DIMENSION Th(NumSect,Ndatb), Dum(*) @@ -302,8 +295,7 @@ C type(SammyGridAccess)::grid procedure (arrayFunc), pointer :: f_ptr => auxEArray - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) C cx Input = 0 diff --git a/sammy/src/int/mint6.f b/sammy/src/int/mint6.f index 168293743e542fe98f038d6d0a66157b299ce603..40754578ea55aaaefccacfaa802950003c830905 100644 --- a/sammy/src/int/mint6.f +++ b/sammy/src/int/mint6.f @@ -2,7 +2,7 @@ C C C -------------------------------------------------------------- C - SUBROUTINE Leal_Hwang (Nblmax, debugOutput) + SUBROUTINE Leal_Hwang (Nblmax, debugOutput, Jwwwww) use oops_common_m use fixedi_m use ifwrit_m @@ -24,14 +24,14 @@ C use SammyFlowControl_M, only : fitOption IMPLICIT DOUBLE PRECISION (a-h,o-z) logical::debugOutput + integer::Jwwwww type(SammyGridAccess)::gridAccess integer,allocatable,dimension(:)::I_Jjjder, I_Jjjpar integer::nauxStart real(kind=8),allocatable,dimension(:)::A_Idum, A_Iblock C C *** Here when using Leal-Hwang so need to interpolate to present results - call gridAccess%initialize() - call gridAccess%setParameters(numcro, ktzero) + call gridAccess%initialize() call gridAccess%setToExpGrid(expData) C C *** Read the cross sections etc diff --git a/sammy/src/mas/mmas1.f90 b/sammy/src/mas/mmas1.f90 index 2f0540913070ed703296136ea503d6926572bd98..b57a97f6229e330549f4443a8be23e0ea5fcba06 100644 --- a/sammy/src/mas/mmas1.f90 +++ b/sammy/src/mas/mmas1.f90 @@ -556,6 +556,7 @@ contains use misccc_common_m use ntyp_common_m use mdf5_m + use broad_common_m, only : dopplerInfo IMPLICIT DOUBLE PRECISION (a-h,o-z) CHARACTER*1 Kt, Kc, Ktotal, Ktran DATA Kt /'T'/, Kc /'C'/ @@ -588,6 +589,7 @@ contains Mxwrec = 0 Kaddcr = 0 Kkkdop = 2 + dopplerInfo%bType = 2 Kresol = 0 Ntgrlq = 0 Kidcxx = 0 @@ -613,7 +615,7 @@ contains use zzzzz_common_m use misccc_common_m use ntyp_common_m - + use broad_common_m, only : dopplerInfo use mdf5_m IMPLICIT DOUBLE PRECISION (a-h,o-z) ! @@ -787,6 +789,7 @@ contains ! ELSE IF (Number.EQ.219 .OR. Number.EQ.220) THEN Kkkdop = 3 + dopplerInfo%bType = 3 ! *** Use CLM for Doppler broadening ! ! diff --git a/sammy/src/mas/mmas4.f b/sammy/src/mas/mmas4.f index 732d7fdc174dbe0a44d2fbbfde52b3d60da68744..6984d66ac07a06ca60f7a07c10b401f4e20d2984 100644 --- a/sammy/src/mas/mmas4.f +++ b/sammy/src/mas/mmas4.f @@ -92,6 +92,7 @@ C use eees_common_m use namfil_common_m use mssccc_common_m + use broad_common_m, only : dopplerInfo IMPLICIT DOUBLE PRECISION (a-h,o-z) C Odfmul = 1.00d0 @@ -262,7 +263,7 @@ C *** # 14 (ENDF/B File 3) 70 CONTINUE END IF C - IF (Kkkdop.EQ.3) THEN + IF (dopplerInfo%bType.EQ.3) THEN C ************************************************************** File 13 WRITE (6,11600) 11600 FORMAT (' What is name of Crystal-Lattice Model file? ') diff --git a/sammy/src/mso/mmso0.f b/sammy/src/mso/mmso0.f index 48574d90bf0e61af0e06083cc11ef3b6019bac40..1fd1aed0c283e69f2146c275fd624fa26ae5b20d 100644 --- a/sammy/src/mso/mmso0.f +++ b/sammy/src/mso/mmso0.f @@ -9,11 +9,11 @@ C *** "Version 7.0.0 for multiple scattering" or "V7". C *** This version is faster but probably not as accurate C *** as subsequent versions. C - use fixedi_m, only : Jtheta, Jwwwww, K2reso, Kkkdex, + use fixedi_m, only : Jtheta, K2reso, Kkkdex, * Kkkrsl, Ktheta, - * Ntheta, Nudwhi, Numcro, Numrpi, Numorr, + * Ntheta, Nudwhi, Numrpi, Numorr, * Numder - use ifwrit_m, only : Jjjdop, Kssmsc + use ifwrit_m, only : Kssmsc use exploc_common_m use array_sizes_common_m use oopsch_common_m, only : Nowwww, Segmen @@ -216,8 +216,6 @@ C C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > C C - Jwwwww = 8 - Numcro = 1 Numder = 1 C call multScat%setNumThetaNearOne( jkn1 ) @@ -226,7 +224,6 @@ C Ktheta = jkn2 ! remove call multScat%setNumTheta(jkn3 ) Ntheta = jkn3 ! remove - Jjjdop = 0 CALL Write_Commons_Many RETURN END diff --git a/sammy/src/mso/mmso2.f b/sammy/src/mso/mmso2.f index 78c4aaf3abca41e71bff030570f0472f72227108..69defe1f6f5171912f252fe3b03df57630b31a2c 100644 --- a/sammy/src/mso/mmso2.f +++ b/sammy/src/mso/mmso2.f @@ -15,10 +15,10 @@ C *** Ssssds generates the [approximation to] the self-shielded, C *** single-scattered, and double(plus)-scattered capture yield. C use fixedi_m, only : Ntepnt, Nxtptv, Nxtptw, Jtheta, - * Kssmpr, Ntheta, Numbgf, numcro, + * Kssmpr, Ntheta, Numbgf, * Numiso, Numnbk, numUsedPar use ifwrit_m, only : Nnpar, Kbrd, Kksave, Ksindi, Ksitmp, - * Ksolve, Kssdbl, Kssmsc, ktzero, Kwssms, Ndat + * Ksolve, Kssdbl, Kssmsc, Kwssms, Ndat use samxxx_common_m, only : Sam15x use fixedr_m, only : Aaawww, Sensin use lbro_common_m, only : Debug, Yaverg, Yresol, Yselfi @@ -73,7 +73,6 @@ C DATA Zero /0.0d0/, One /1.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) niso = calcData%getUsedIsotopesOld() C diff --git a/sammy/src/mso/mmso4.f b/sammy/src/mso/mmso4.f index e0b8eb30eb5a5fd813876d6a55a4502fdaf74a8d..53b76a6b110906ac58a037256c367d862845561b 100755 --- a/sammy/src/mso/mmso4.f +++ b/sammy/src/mso/mmso4.f @@ -20,8 +20,7 @@ C type(SammyGridAccess)::grid DATA Zero /0.0d0/, One /1.0d0/ - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) C IF (Idone.EQ.3 .AND. Ientrp.EQ.0) RETURN @@ -155,8 +154,7 @@ C * Dy2ccc(Nx,*) DATA Zero /0.0d0/, One /1.0d0/ - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) C IF (Ientrp.NE.0) THEN diff --git a/sammy/src/mxw/mmxw5.f b/sammy/src/mxw/mmxw5.f index a9763475e8b7f2afbc9e4db9b5a4385d6b8932b5..766230df3f5e944ccbcb0adaf5cd4234b21f868b 100644 --- a/sammy/src/mxw/mmxw5.f +++ b/sammy/src/mxw/mmxw5.f @@ -39,7 +39,6 @@ C DATA Etherm /0.00253d0/, Zero /0.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) niso = calcData%getUsedIsotopes() C diff --git a/sammy/src/new/mnew0.f b/sammy/src/new/mnew0.f index 403e9a099f7be4124483f86fb87624d52f03e7f2..61aae11da9d5a53878035f1cebbec1943c38a3cf 100644 --- a/sammy/src/new/mnew0.f +++ b/sammy/src/new/mnew0.f @@ -48,7 +48,7 @@ C C *** Generate proper Zke, radii, Zeta CALL Fxradi ( * A_Idpiso , - * A_Idsiso , A_Izke , A_Izeta ) + * A_Izke , A_Izeta ) C call allocate_real_data(A_Iderpp, Nfpall) idum_size = Ntotc * resParData%getNumResonances() diff --git a/sammy/src/npv/mnpv7.f b/sammy/src/npv/mnpv7.f index fb51363fbc98cca65fd4a512ced4e3ac0de6e262..8507dae7237b975912aabd82abdbfefe2baab1c2 100644 --- a/sammy/src/npv/mnpv7.f +++ b/sammy/src/npv/mnpv7.f @@ -23,18 +23,15 @@ C RETURN END - real(kind=8) function getDerivative(idat, ncro, iipar - * ) result(gg) - use fixedi_m, only : Numcro, numUsedPar + real(kind=8) function getDerivative(idat, iipar) result(gg) + use fixedi_m, only : numUsedPar use array_sizes_common_m, only : calcData implicit none - integer::idat, ncro, iipar - integer::ipos + integer::idat, iipar gg = 0.0d0 - if (iipar.le.numUsedPar) then - ipos = (Idat-1)*Numcro + ncro - gg = calcData%getData(Ipos, iipar, 1) + if (iipar.le.numUsedPar) then + gg = calcData%getData(Idat, iipar, 1) end if end function getDerivative C @@ -54,21 +51,16 @@ C C integer::ipup integer:: Kdat - integer::Ipar, Ii, I, K, Iffy, keep + integer::Ipar, I, K, Iffy, keep integer::ipos real(kind=8)::gg, getDerivative - kdat = resultData%getLength() - if (Numcro.gt.1) kdat = kdat/Numcro + kdat = resultData%getLength() IF (Ksolve.NE.2) THEN DO Ipar=1,covData%getNumTotalParam() - Ii = 1 DO I=1,Kdat - DO K=1,Numcro - call resultData%addData(Ii, - * Ipar + derivStart, 0.0d0) - Ii = Ii + 1 - END Do + call resultData%addData(I, + * Ipar + derivStart, 0.0d0) End do End do @@ -76,22 +68,18 @@ C DO Ipar=1,covData%getNumTotalParam() IF (covData%contributes(Ipar))THEN keep = covData%getCovIndex(Ipar) - Ii = 0 DO I=1,Kdat - DO K=1,Numcro - Ii = Ii + 1 - gg = getDerivative(i, k, ipar) + gg = getDerivative(i, ipar) - ipos = 0 - IF (Keep.LE.Nvpthe) THEN ! derivatives start right after derivStart - ipos = keep + derivStart - else if (covData%isPupedParameter(ipar)) THEN - ipos = keep + derivStart + nimplgiven ! pup'ed derivatives start after implicit derivatives - end if - if (ipos.gt.0) then - call resultData%addData(Ii, ipos, gg) - end if - End do + ipos = 0 + IF (Keep.LE.Nvpthe) THEN ! derivatives start right after derivStart + ipos = keep + derivStart + else if (covData%isPupedParameter(ipar)) THEN + ipos = keep + derivStart + nimplgiven ! pup'ed derivatives start after implicit derivatives + end if + if (ipos.gt.0) then + call resultData%addData(I, ipos, gg) + end if End do END IF END DO @@ -103,15 +91,11 @@ C IF (Keep.LE.Nvpthe) THEN C These are not part of IDC so not needed at Ksolve=2 ELSE IF (covData%isPupedParameter(Ipar)) THEN - Ii = 0 DO I=1,Kdat - DO K=1,Numcro - Ii = Ii + 1 - gg = getDerivative(i, k, Ipar) + gg = getDerivative(i, Ipar) - ipos = keep + derivStart + nimplgiven ! pup'ed derivatives start after implicit derivatives - call resultData%addData(Ii, ipos, gg) - End do + ipos = keep + derivStart + nimplgiven ! pup'ed derivatives start after implicit derivatives + call resultData%addData(I, ipos, gg) End do END IF END IF diff --git a/sammy/src/npv/mnpv9.f b/sammy/src/npv/mnpv9.f index 13f87bf56415f493483b50d0dc3486e69be67b64..3c92e91b90076f3e584403b8a6f6c407a70e9fa5 100644 --- a/sammy/src/npv/mnpv9.f +++ b/sammy/src/npv/mnpv9.f @@ -8,7 +8,7 @@ C *** Purpose -- Create the arrays Th, G, X, in lowest possible storage C *** location so that other needed arrays will not wipe out C *** the storage C - use fixedi_m, only : Numcro, Nvpdtp + use fixedi_m, only : Nvpdtp use ifwrit_m, only : Ksolve, Ntgrlq use exploc_common_m use samxxx_common_m, only : Sam30x diff --git a/sammy/src/ntg/mntg0.f b/sammy/src/ntg/mntg0.f index fd6bf690580c5b3733b1eeba6782bd095eac7a4d..1c3780ac5f0a81b92c626be179c452f9023a6e0e 100644 --- a/sammy/src/ntg/mntg0.f +++ b/sammy/src/ntg/mntg0.f @@ -8,7 +8,7 @@ C *** factor, and resonance integral C use brdd_common_m, only : Weights use fixedi_m, only : Kywywy, Numiso, Nvpall - use ifwrit_m, only : Kplotu, Ksolve, Nfissl + use ifwrit_m, only : Ksolve, Nfissl use exploc_common_m use array_sizes_common_m use oopsch_common_m, only : Nowwww, Segmen @@ -49,7 +49,6 @@ C Nowwww = 0 C CALL Initix - IF (Kplotu.NE.0) Kplotu = 0 C Kdatb = getNumAuxGridPoints() Many = 5 diff --git a/sammy/src/ntg/mntg2.f b/sammy/src/ntg/mntg2.f index 6930c5eda8348b1cc39b6f68ce535f6457734165..8cdfe32297e24491409e8f200290d4656a5bc81d 100644 --- a/sammy/src/ntg/mntg2.f +++ b/sammy/src/ntg/mntg2.f @@ -63,11 +63,7 @@ C Iup = 1 CALL Read_Cross_Sections (Kdatb) C -C *** Plotun generates ODF & ASCII file of unaveraged cross sections IF (Kdatb.NE.Ipnts) STOP '[STOP in Genint in ntg/mntg2.f]' - IF (Kplotu.EQ.1) Then - CALL Plotun_d (calcData, Dum, Kdatb, 1, .true.) - end if C C *** initialize call calcData%nullify() diff --git a/sammy/src/ntg/mntg3.f b/sammy/src/ntg/mntg3.f index 06b781ab5cdbdac03bed080306a14395b4ffd2f2..ac82586efd4f522aac884bee199fc67591b3a9fb 100644 --- a/sammy/src/ntg/mntg3.f +++ b/sammy/src/ntg/mntg3.f @@ -4,8 +4,7 @@ C -------------------------------------------------------------- C SUBROUTINE Therml (Kdatb, Numntg, Iso, Kountr) use fixedi_m - use EndfData_common_m - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M use array_sizes_common_m, only : calcData IMPLICIT DOUBLE PRECISION (a-h,o-z) @@ -13,8 +12,7 @@ C real(kind=8)::val1, val2 DATA Etherm /0.0253d0/ - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) C C *** J = 1 thermal cross section diff --git a/sammy/src/ntg/mntg4.f b/sammy/src/ntg/mntg4.f index b75b70ecb765c871a10934bb87d7525cc1543e1b..f5b56f3c2242697dc8e6f5ede527ed860871b54c 100644 --- a/sammy/src/ntg/mntg4.f +++ b/sammy/src/ntg/mntg4.f @@ -33,7 +33,6 @@ C Aaold = Zero call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) C C *** figure which energy is just below E1=.00001 eV and E2=3 eV @@ -387,7 +386,6 @@ C end if call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) C C *** figure which energy is just below E1=.00001 eV and E2=3 eV diff --git a/sammy/src/ntg/mntg6.f b/sammy/src/ntg/mntg6.f index 2d18fd379e6a328d226b41e80a7bb0241c369ce6..f7b3e2758733c208f41c7f5b8574026bbb491b5c 100644 --- a/sammy/src/ntg/mntg6.f +++ b/sammy/src/ntg/mntg6.f @@ -29,7 +29,6 @@ C * Const(2,Numntg) C Ipnts = Kdatb call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) C C *** figure which energies are just below bEgin and Equit diff --git a/sammy/src/ntg/mntg7.f b/sammy/src/ntg/mntg7.f index f6cca137ebe7ef2e0b14aa62352d535febfd0ba8..6abded2b3ec14a927680463f3b3e5412b814350e 100644 --- a/sammy/src/ntg/mntg7.f +++ b/sammy/src/ntg/mntg7.f @@ -31,7 +31,6 @@ C C Ipnts = Kdatb call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) C C *** figure which energies are just below bEgin and Equit diff --git a/sammy/src/ntg/mntg8.f b/sammy/src/ntg/mntg8.f index d4c24fcd46ad83f1359f3bc8c15f5a0398c8168b..400034a01488dab675ceb6e67c7a4d3b33d465da 100644 --- a/sammy/src/ntg/mntg8.f +++ b/sammy/src/ntg/mntg8.f @@ -32,7 +32,6 @@ C Tosp = Two/Sqrtpi call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) C C *** figure which energy is just below bEgin=1e-5 eV diff --git a/sammy/src/ntg/mntga.f b/sammy/src/ntg/mntga.f index 437baa190c55e20dd8ceb8c1f346fe277c3c240d..5119c15e0f010c6e30e025b2e995afbddc051893 100644 --- a/sammy/src/ntg/mntga.f +++ b/sammy/src/ntg/mntga.f @@ -34,7 +34,6 @@ C CALL Findpr (Nflux, Kflux) call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) Ipnts = Kdatb diff --git a/sammy/src/odf/modf3.f90 b/sammy/src/odf/modf3.f90 index 7bd8851a2c251a94d9746cebf6b08545c259ccb6..f809916d3e075d945b8c4e585e41308fb850795e 100755 --- a/sammy/src/odf/modf3.f90 +++ b/sammy/src/odf/modf3.f90 @@ -449,15 +449,12 @@ contains !! real(kind=8) function auxEArray (i) result(data) use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero use SammyGridAccess_M implicit none type(SammyGridAccess)::grid integer, intent (in) :: i call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) data = grid%getEnergy(i, expData) diff --git a/sammy/src/old/mold0.f b/sammy/src/old/mold0.f index c6db795e65fc2483bfd4c0e3c21040c531b9b0ee..32a047c528b277f08380fefb81de820e446363a2 100644 --- a/sammy/src/old/mold0.f +++ b/sammy/src/old/mold0.f @@ -94,8 +94,7 @@ C *** Put quantum numbers into PARameter file END IF C *** Fix the miscellaneous parameters - IF (Nummsc.GT.0) CALL Fxxmsc (A_Isiabn , A_Idsiso , - * A_Iprmsc ) + IF (Nummsc.GT.0) CALL Fxxmsc (A_Isiabn , A_Iprmsc ) C C *** Multiply the initial uncertainty by an Energy (and spin-group)- C *** dependent multiplier, if applicable @@ -111,7 +110,7 @@ C C *** Generate proper Zke, Zkte, Zkfe, Zeta CALL Fxradi ( * A_Idpiso , - * A_Idsiso , A_Izke , A_Izeta ) + * A_Izke , A_Izeta ) C *** Generate associated flags CALL Ifxrad C diff --git a/sammy/src/old/mold1.f b/sammy/src/old/mold1.f index cfc7639be1f94bd50e3547f87b6c817d31e525c5..0674bd40c4d7c1c8376a7816239f6f1ffba705e3 100644 --- a/sammy/src/old/mold1.f +++ b/sammy/src/old/mold1.f @@ -2,7 +2,7 @@ C C C -------------------------------------------------------------- C - SUBROUTINE Fxradi (Dopwid,Doswid, Zke, Zeta) + SUBROUTINE Fxradi (Dopwid, Zke, Zeta) C C *** Purpose -- Fix the following parameters: C *** Zke , where k = Zke * sqrt(E) @@ -21,7 +21,7 @@ C IMPLICIT DOUBLE PRECISION (a-h,o-z) C DIMENSION - * Dopwid(*), Doswid(*), + * Dopwid(*), * Zke(Ntotc,*), Zeta(Ntotc,*) C type(SammySpinGroupInfo)::spinInfo @@ -70,21 +70,15 @@ C & dSQRT(Boltzm*A_Mass_Small*Temp/ & resParData%getMassForIsotope(Iso)) IF (Dopple.LT.Dopwid(Iso)) Dopple = Dopwid(Iso) - END DO - END IF - IF (Sitemp.NE.Zero) THEN - DO Iso=1,Numiso - Doswid(Iso) = - & dSQRT(Boltzm*Sitemp*A_Mass_Small/ - & resParData%getMassForIsotope(Iso)) - IF (Dosind.LT.Doswid(Iso)) Dosind = Doswid(Iso) + if (associated(dopplerInfo%broadener)) then + dopplerInfo%wantBroaden = .true. + end if END DO END IF C ELSE C *** here Numiso.EQ.0 Dopwid(1) = Dopple - Doswid(1) = Dosind DO Kgroup=1,resParData%getNumSpinGroups() call resParData%getSpinGroupInfo(spinInfo, Kgroup) Ntotnn = spinInfo%getNumChannels() diff --git a/sammy/src/old/mold2.f b/sammy/src/old/mold2.f index 99d43368aba9de782e0abe801caf2aba7ffeb244..f98d047dc0a0053bb4f1cbd243f8b126f877b317 100644 --- a/sammy/src/old/mold2.f +++ b/sammy/src/old/mold2.f @@ -835,7 +835,7 @@ C C C _____________________________________________________________ C - SUBROUTINE Fxxmsc (Siabnd, Doswid, Parmsc) + SUBROUTINE Fxxmsc (Siabnd, Parmsc) use fixedi_m use ifwrit_m use fixedr_m @@ -844,7 +844,7 @@ C use EndfData_common_m use SammySpinGroupInfo_M IMPLICIT DOUBLE PRECISION (a-h,o-z) - DIMENSION Siabnd(*), Doswid(*), Parmsc(*) + DIMENSION Siabnd(*), Parmsc(*) type(SammySpinGroupInfo)::spinInfo C DO 200 I=1,Nummsc @@ -864,17 +864,8 @@ C Tzero = Parmsc(I) Elzero = Parmsc(I+1) Tttzzz = Sm2*Dist*Elzero - ELSE IF (Ksitmp.EQ.I) THEN - Aa = dSQRT(Parmsc(Ksitmp)/Sitemp) - Dosind = Dosind*Aa - Sitemp = Parmsc(Ksitmp) - IF (Numiso.GT.0) THEN - DO Iso=1,Numiso - Doswid(Iso) = Doswid(Iso)*Aa - END DO - ELSE - Doswid(1) = Dosind - END IF + ELSE IF (Ksitmp.EQ.I) THEN + Sitemp = Parmsc(Ksitmp) ELSE IF (Ksithc.EQ.I) THEN Sithck = Parmsc(Ksithc) ELSE IF (Ksindi.EQ.I) THEN diff --git a/sammy/src/orr/morr0.f90 b/sammy/src/orr/morr0.f90 index b6b30253a801a03632513b421fadb05096c9ee93..46184e551863f49dcafce3695276144eda9904ab 100644 --- a/sammy/src/orr/morr0.f90 +++ b/sammy/src/orr/morr0.f90 @@ -7,8 +7,7 @@ module orr_m ! ! *** Purpose -- ORR resolution function calculation ! - use fixedi_m, only : Jwwwww, Numorr, numcro - use ifwrit_m, only : Jjjdop, Kplotu, ktzero + use fixedi_m, only : Numorr, numUsedPar use fixedr_m, only : Dist use EndfData_common_m, only : expData use DopplerAndResolutionBroadener_M @@ -27,6 +26,7 @@ module orr_m type(GridDataList)::work type(DopplerAndResolutionBroadener)::broadener integer::N, Idimen, nauxMax, ii + logical(C_BOOL)::moreBroadening external Idimen ! ! @@ -41,20 +41,10 @@ module orr_m call work%initialize() call broadener%initialize(calcData, expData, work) - call broadener%setNumPerEnergy(max(1,numcro)) - ii = 1 - if ( ktzero.ne.0) then - if (numcro.gt.1) then - ii = 3 - else - ii = 2 - end if - end if - call broadener%setUnbroadenedGrid(2, ii) - call broadener%setBroadenedGrid(1, ii) ! always finish on experinental grid + moreBroadening = .false. + call broadener%setupBroadener(moreBroadening, numUsedPar) ! always finish on experinental grid ! CALL Initix - IF (Kplotu.NE.0) Kplotu = 0 nauxMax = getNumAuxGridPoints() ! ! *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR SAMORR @@ -84,9 +74,6 @@ module orr_m call work%destroy() ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > ! - Jwwwww = 4 -! - Jjjdop = 0 CALL Write_Commons_Many RETURN ! diff --git a/sammy/src/orr/morr1.f90 b/sammy/src/orr/morr1.f90 index 9258a87adef1665608e8d6ff4ecc8b696db062ff..65248a400667b9bfdd09acc27201343b2e187717 100644 --- a/sammy/src/orr/morr1.f90 +++ b/sammy/src/orr/morr1.f90 @@ -11,7 +11,7 @@ module orr1_m ! *** Purpose -- Form Resolution-broadened cross section and derivatives ! use fixedi_m, only : Numbgf, Numnbk, Numorr, numUsedPar - use ifwrit_m, only : Jjjdop, Kdebug + use ifwrit_m, only : Kdebug use brdd_common_m, only : Ipk, Ipnts, Iup, Kc use DopplerAndResolutionBroadener_M use mxct27_m @@ -43,8 +43,6 @@ module orr1_m call allocate_real_data(Sigmns, Numorr) call allocate_real_data(Sigpls, Numorr) ! - call derivs%nullify() - call derivs%reserve(nexp*derivs%getNnnsig(), numUsedPar+1) ! ! *** initialize limits Kc = 2 @@ -72,7 +70,7 @@ module orr1_m IF (Ipnts.LE.5) THEN ! ! ********* no integration possible - IF (Jjjdop.NE.1) THEN + IF (dopplerInfo%bType.ne.1) THEN Now = Now + 1 do Ipar = 0, numUsedPar do ns = 1, derivs%getNnnsig() @@ -143,7 +141,6 @@ module orr1_m real(kind=8)::A, B, Ddeell, Der1, Der2, P, Sigt integer::Kwarn integer::I, Ii, Ipar, Ks, Ksol, N - logical(C_BOOL)::accu ! DATA Kwarn /0/, Zero /0.0d0/, One /1.0d0/ ! @@ -175,8 +172,6 @@ module orr1_m ! ! Sigt = Zero - accu = .true. - call derivs%setAccumulate(accu) DO N=1,derivs%getNnnsig() do ipar = 0,numUsedPar val = 0.0d0 @@ -189,8 +184,6 @@ module orr1_m call derivs%addDataNs(irow, N, Ipar, 1, val) END DO END DO - accu = .false. - call derivs%setAccumulate(accu) ! IF (numUsedPar.EQ.0) RETURN ! diff --git a/sammy/src/ort/mort.f b/sammy/src/ort/mort.f index a476439cb6b59ce3841fbc4f3fceeb99aa96f983..95214c7393966c5481173d4b25d4818e3ca2e7e7 100644 --- a/sammy/src/ort/mort.f +++ b/sammy/src/ort/mort.f @@ -35,8 +35,7 @@ C C use over_common_m, only : Kount, Nsize use oops_common_m, only : Jmsize, Kmsize, Kount_Initial, Msize - use fixedi_m, only : Iu32, Kwatta, Nmdets, Numorr, numcro - use ifwrit_m, only : ktzero + use fixedi_m, only : Iu32, Kwatta, Nmdets, Numorr, numUsedPar use fixedr_m, only : Dist use oopsch_common_m, only : Segmen use namfil_common_m, only : Dblank, Dignor, Dignor, Fblank, @@ -56,9 +55,10 @@ C real(kind=8),allocatable,dimension(:)::A_It, A_Iweigh, A_Iwts integer,allocatable,dimension(:)::I_Iflorr real(Kind=8)::Aw, Dt, Elow, Em, Eup - integer::I, Idimen, Itime, Kpnts, Min, Mndets, N, ii + integer::I, Idimen, Itime, Kpnts, Min, Mndets, N type(DopplerAndResolutionBroadener)::broadener type(GridDataList)::work + logical(C_BOOL)::moreBroadening external Idimen @@ -141,18 +141,9 @@ C call work%initialize() call broadener%initialize(calcData, expData, work) - call broadener%setNumPerEnergy(max(1,numcro)) - ii = 1 - if ( ktzero.ne.0) then - if (numcro.gt.1) then - ii = 3 - else - ii = 2 - end if - end if - call broadener%setUnbroadenedGrid(2, ii) - call broadener%setBroadenedGrid(1, ii) ! always finish on experimental grid - + moreBroadening = .false. + call broadener%setupBroadener(moreBroadening, numUsedPar) + CALL Orresb (broadener, A_Iweigh, A_Iwts, Dist) CALL Showwe (A_It , A_Iwts, Dt, Ipnts) CALL Showwt (A_It , A_Iwts, Dt, Kpnts) diff --git a/sammy/src/ort/mort1.f b/sammy/src/ort/mort1.f index 52ef439542028516d8c5c178e0c1366b6878aa45..6af6aacef4ea09dd58b3b34cb48faedbab691213 100755 --- a/sammy/src/ort/mort1.f +++ b/sammy/src/ort/mort1.f @@ -60,9 +60,7 @@ C -------------------------------------------------------------- C SUBROUTINE Showwe (Tt, Wts, Dt, Ipnts) use modf3_M - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M IMPLICIT DOUBLE PRECISION (a-h,o-z) CHARACTER*17 Xxxxxx, Xxxxxy @@ -80,8 +78,7 @@ C un-normalize ! Wts(I) = Wts(I)/Dt END DO - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) C Nsn = 3 diff --git a/sammy/src/par/mpar0.f90 b/sammy/src/par/mpar0.f90 index b60a3970ea1ee531c0dba1720d2cbfa59d80581e..9b3598e0b26b27a6021aa2bb5b8159908d0c470a 100644 --- a/sammy/src/par/mpar0.f90 +++ b/sammy/src/par/mpar0.f90 @@ -43,6 +43,7 @@ module par_m use par16_m use par17_m use par19_m + use broad_common_m, only : dopplerInfo IMPLICIT NONE integer,allocatable,dimension(:)::I_tmp real(kind=8),allocatable,dimension(:)::A_Ixtptw, A_Ixtplw, & @@ -279,7 +280,10 @@ module par_m ! !xxxxxxxxxxxxxxxxxxxxxxx Kenbbb = 0 - IF (Kkkdop.NE.2 .AND. Kkkdop.NE.3 .AND. Ksitmp.GT.0) Kkkdop = 2 + IF (dopplerInfo%bType.NE.2 .AND. dopplerInfo%bType.NE.3 .AND. Ksitmp.GT.0) then + Kkkdop = 2 + dopplerInfo%bType = 2 + end if CALL Write_Commons_Few RETURN END diff --git a/sammy/src/par/mpar04.f90 b/sammy/src/par/mpar04.f90 index 234c2ba4291280e226eb17444c11ad272a728e67..5532bed7e9d3dfc2a85f7d209db7f0fdf818c068 100644 --- a/sammy/src/par/mpar04.f90 +++ b/sammy/src/par/mpar04.f90 @@ -359,7 +359,9 @@ module par4_m Sitemp = A Sithck = C Dopple = dSQRT(Boltzm* Temp*Aneutr/Aaawww) - Dosind = dSQRT(Boltzm*Sitemp*Aneutr/Aaawww) + if (associated(dopplerInfo%broadener)) then + dopplerInfo%wantBroaden = .true. + end if N = N + 2 ! ELSE IF (Xx.EQ.Effici) THEN diff --git a/sammy/src/ref/mref0.f b/sammy/src/ref/mref0.f index b5b66c7e8b9d4a51b4b1cdc9759f24e8390319aa..0f71702eed6dcfa0cfe4ea7f86a2133a9bd5c92e 100644 --- a/sammy/src/ref/mref0.f +++ b/sammy/src/ref/mref0.f @@ -66,7 +66,6 @@ C *** read Energy from 50 & Data, Uncertainty from 44 C use EndfData_common_m use SammyGridAccess_M - use fixedi_m, only : numcro use ifwrit_m, only : Kdatv IMPLICIT NONE type(GridData)::grid diff --git a/sammy/src/ref/mref2.f b/sammy/src/ref/mref2.f index a184a0406f71d6494d6569c4435d7cea28f4832a..19d39c460327e085b2945d73c72d428f67d8a775 100644 --- a/sammy/src/ref/mref2.f +++ b/sammy/src/ref/mref2.f @@ -12,13 +12,11 @@ C use samxxx_common_m use fixedr_m use EndfData_common_m - use fixedi_m, only : numcro use SammyGridAccess_M IMPLICIT DOUBLE PRECISION (A-h,o-z) type(SammyGridAccess)::grid DIMENSION Data(*), dData(*) call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToExpGrid(expData) Jcros = Kcros Jtrans = Ktrans diff --git a/sammy/src/ref/mrfs2.f b/sammy/src/ref/mrfs2.f index 16ac0d71eafc6bf9e906fab088d39279dc305279..fbe40f02cb75af6d7793f4e54e8322d5adb719ec 100644 --- a/sammy/src/ref/mrfs2.f +++ b/sammy/src/ref/mrfs2.f @@ -91,8 +91,10 @@ C use exploc_common_m use broad_common_m use aaarfs_common_m - use EndfData_common_m, only : radFitFlags + use GridData_M + use EndfData_common_m, only : radFitFlags, expData IMPLICIT DOUBLE PRECISION (A-h,o-z) + type(GridData)::grid C call make_A_Iprbrd(Numbrd) call make_I_Iflbrd(Numbrd) @@ -107,9 +109,19 @@ C C *** three N = Nangle IF (N.EQ.0) N = 1 - Numcro = N call make_A_Iangle(N) call make_A_Idangl(N) + + if (expData%getLength().eq.0) then + call grid%initialize() + call expData%addGrid(grid) + if (Nangle.gt.0) then + call grid%setNumPerEnergy(Nangle) + end if + ! one point per energy is the default + + numcro = grid%getNumPerEnergy() + end if C C *** four N = Ncf diff --git a/sammy/src/ref/mrfs3.f b/sammy/src/ref/mrfs3.f index 9e38e3fd47999b9f0e4360ea66f4fc87f9034724..f7d10bb00060d71e6851933f812831801368073c 100644 --- a/sammy/src/ref/mrfs3.f +++ b/sammy/src/ref/mrfs3.f @@ -79,8 +79,6 @@ C *** CARD SET 5 Broadening information Deltal = 0.0d0 Deltae = 0.0d0 Delta6 = 0.0d0 - Delttt = 0.0d0 - Elowbr = 0.0d0 C C *** CARD SET 6 (IF IT'S PRESENT) Deltab = 1.0d0 diff --git a/sammy/src/ref/mwrt1.f b/sammy/src/ref/mwrt1.f index 65228f4db35bcc95d0127c017f18a119f9c73cee..8d55753221594499c8ab7d67b11f136db17d8d00 100644 --- a/sammy/src/ref/mwrt1.f +++ b/sammy/src/ref/mwrt1.f @@ -41,6 +41,7 @@ C type(RMatParticlePair)::pair type(RMatChannelParams)::channel type(SammyChannelInfo)::channelInfo + real(kind=8)::Elowbr, Delttt C OPEN (UNIT=11, FILE='SAMMY.INP', STATUS='unknown', * FORM='formatted') @@ -76,9 +77,22 @@ C *** Card Set 4.5 Energies at which to plot resolution fUnction 10450 FORMAT (8F10.3) C C *** CARD SET 5 Broadening information - IF (Ib.EQ.1) WRITE (11,10500) Temp, Dist, Deltal, Deltae, Deltag, + Delttt = 0.0d0 + IF (Ib.EQ.1) then + Elowbr = 0 + if (associated(dopplerInfo%freeGas)) then + Elowbr = dopplerInfo%freeGas%Elowbr + else if ( + * associated(dopplerInfo%highEnergyFreeGas)) then + Elowbr = dopplerInfo%highEnergyFreeGas%Elowbr + else if ( + * associated(dopplerInfo%lealHwang)) then + Delttt = dopplerInfo%lealHwang%DelT + end if + WRITE (11,10500) Temp, Dist, Deltal, Deltae, Deltag, * Delttt, Elowbr 10500 FORMAT (8F10.5) + end if C C *** CARD SET 6 (IF IT'S PRESENT) IF (Ncf.GT.0) THEN @@ -184,15 +198,12 @@ C C -------------------------------------------------------------- C SUBROUTINE Wrtdat (Data, Unc, Ndat) - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M IMPLICIT DOUBLE PRECISION (A-h,o-z) type(SammyGridAccess)::grid DIMENSION Data(*), Unc(*) call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToExpGrid(expData) OPEN (UNIT=10, FILE='SAMMY.DAT', STATUS='unknown', * FORM='formatted') diff --git a/sammy/src/rpi/mrpi0.f90 b/sammy/src/rpi/mrpi0.f90 index de14a75318b375e7ea9aed2213f9168fdd9a72e3..97692cc8e3695ce7fec2b38ace57bc5eceea13a9 100644 --- a/sammy/src/rpi/mrpi0.f90 +++ b/sammy/src/rpi/mrpi0.f90 @@ -6,8 +6,7 @@ module rpi_m ! SUBROUTINE Samrpi_0 ! - use fixedi_m, only : Jwwwww, Medrpi, Mmmrpi - use ifwrit_m, only : Jjjdop, Kplotu + use fixedi_m, only : Medrpi, Mmmrpi use exploc_common_m use array_sizes_common_m use oopsch_common_m, only : Nowwww, Segmen @@ -33,7 +32,6 @@ module rpi_m Nowwww = 0 ! CALL Initix - IF (Kplotu.NE.0) Kplotu = 0 ! nauxMax = getNumAuxGridPoints() ! @@ -80,9 +78,6 @@ module rpi_m deallocate(A_Ixxxrp) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > ! - Jwwwww = 4 -! - Jjjdop = 0 CALL Write_Commons_Many RETURN ! diff --git a/sammy/src/rpi/mrpi1.f90 b/sammy/src/rpi/mrpi1.f90 index aabe3b426350b0197f527991a84c9d24e89f2738..541cb85252d5ba7c850138bd9ad60a1c2914db44 100644 --- a/sammy/src/rpi/mrpi1.f90 +++ b/sammy/src/rpi/mrpi1.f90 @@ -11,8 +11,8 @@ module rpi1_m ! *** using RPI resolution function ! use fixedi_m, only : numUsedPar, & - Nfprpi, Nnnrpi, numcro, Numnbk, Numbgf - use ifwrit_m, only : Jjjdop, Kdebug, Ksolve, ktzero + Nfprpi, Nnnrpi, Numnbk, Numbgf + use ifwrit_m, only : Kdebug, Ksolve use brdd_common_m, only : Ipk, Ipnts, Iup, Kc use rpijnk_common_m use rpires_common_m @@ -43,7 +43,6 @@ module rpi1_m type(DerivativeHandler)::derivs call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToExpGrid(expData) numEl = grid%getNumEnergies(expData) @@ -85,7 +84,7 @@ module rpi1_m IF (Ipnts.LE.5) THEN ! ! ********* No integration possible - IF (Jjjdop.NE.1) THEN + IF (dopplerInfo%bType.ne.1) THEN Now = Now + 1 do Ipar = 0, numUsedPar do ns = 1, derivs%getNnnsig() diff --git a/sammy/src/rpi/mrpi5.f90 b/sammy/src/rpi/mrpi5.f90 index 639db56d55fa65746e0cf2a272506716e97d3bbe..9b24f35bcde60b5c1936def19390f39da87fa272 100644 --- a/sammy/src/rpi/mrpi5.f90 +++ b/sammy/src/rpi/mrpi5.f90 @@ -9,8 +9,6 @@ module rpi5_m ! ! *** PURPOSE -- form the resolution-broadening function ! - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m use rpires_common_m @@ -29,7 +27,6 @@ module rpi5_m logical debug call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) debug=.false. @@ -123,8 +120,8 @@ module rpi5_m ! *** November 16, 1999 -- Mods to fix subtle, obscure bug uncovered by ! *** Greg Leinweber in Troy, NY ! - use fixedi_m, only : numcro, Lother, Mmmrpi - use ifwrit_m, only : ktzero, Itdchi + use fixedi_m, only : Lother, Mmmrpi + use ifwrit_m, only : Itdchi use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -160,7 +157,6 @@ module rpi5_m CALL Zero_Array (Wts, Ipnts) call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Aw = Aaa/Www diff --git a/sammy/src/rpi/mrpi6.f90 b/sammy/src/rpi/mrpi6.f90 index 85a67cc9f31584b09eb2e05ecff2852125af24b1..f8771cffb47a5f503505676ccde892f52260f60b 100644 --- a/sammy/src/rpi/mrpi6.f90 +++ b/sammy/src/rpi/mrpi6.f90 @@ -11,8 +11,8 @@ module rpi6_m ! *** PURPOSE -- Form the weights for resolution broadening when ! *** only the RPI target-detector function is used ! - use fixedi_m, only : numcro, Lother - use ifwrit_m, only : ktzero, Itdchi + use fixedi_m, only : Lother + use ifwrit_m, only : Itdchi use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -35,7 +35,6 @@ module rpi6_m DATA Zero /0.0d0/, Half /0.5d0/, Two /2.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) Timeij_Old = 0.0d0 @@ -309,8 +308,6 @@ module rpi6_m ! *** PURPOSE -- Form the weights for resolution broadening when ! *** only the electron burst is included (Gaussian) ! - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -334,7 +331,6 @@ module rpi6_m CALL Zero_Array (Wts, Ipnts) call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Allmax = Zero @@ -374,9 +370,7 @@ module rpi6_m ! ! *** PURPOSE -- Form the weights for resolution broadening when ! *** only the channel widths contribute -! - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero +! use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -394,7 +388,6 @@ module rpi6_m DATA Zero /0.0d0/, Half /0.5d0/, One/ 1.0d0/, Two /2.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! @@ -471,8 +464,6 @@ module rpi6_m ! *** the (Gaussian) electron burst and the (square) channel ! *** widths are included ! - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -491,7 +482,6 @@ module rpi6_m ! DATA Zero /0.0d0/, Two /2.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! @@ -542,8 +532,8 @@ module rpi6_m ! *** the (Gaussian) electron burst and the (chi squared ! *** plus exponential) target-detector are included ! - use fixedi_m, only : numcro, Lother - use ifwrit_m, only : ktzero, Itdchi + use fixedi_m, only : Lother + use ifwrit_m, only : Itdchi use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -565,7 +555,6 @@ module rpi6_m DATA Zero /0.0d0/, Half /0.5d0/, Two /2.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! @@ -694,8 +683,8 @@ module rpi6_m ! *** the (square) channel width and the (chi squared ! *** plus exponential) target-detector are included ! - use fixedi_m, only : numcro, Lother - use ifwrit_m, only : ktzero, Itdchi + use fixedi_m, only : Lother + use ifwrit_m, only : Itdchi use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -717,7 +706,6 @@ module rpi6_m DATA Small /0.5d0/, Zero /0.0d0/, One/1.0d0/, Two /2.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! diff --git a/sammy/src/rpi/mrpi8.f90 b/sammy/src/rpi/mrpi8.f90 index a55807b0c6d276c9343a0bce6112c9d134f7ee51..eea10bb7b44f49a94888134f8fead5cb5f4d30bd 100644 --- a/sammy/src/rpi/mrpi8.f90 +++ b/sammy/src/rpi/mrpi8.f90 @@ -42,8 +42,8 @@ module rpi8_m ! *** broadening when using (Gaussian) burst, RPI resolution, ! *** and (square) channel width ! - use fixedi_m, only : numcro, Lother, Mmmrpi - use ifwrit_m, only : ktzero, Itdchi + use fixedi_m, only : Lother, Mmmrpi + use ifwrit_m, only : Itdchi use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -79,8 +79,7 @@ module rpi8_m END IF ! *** initialize - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) ! diff --git a/sammy/src/rpi/mrpi9.f90 b/sammy/src/rpi/mrpi9.f90 index 5324428eb74f219662704913fa6be21783f5a13a..0f635618ad07397841ed435106fb05706e98304d 100644 --- a/sammy/src/rpi/mrpi9.f90 +++ b/sammy/src/rpi/mrpi9.f90 @@ -11,8 +11,8 @@ module rpi9_m ! *** broadening parameters when only the RPI target-detector ! *** function is used ! - use fixedi_m, only : numcro, Lother, Mmmrpi - use ifwrit_m, only : ktzero, Itdchi + use fixedi_m, only : Lother, Mmmrpi + use ifwrit_m, only : Itdchi use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m, only : Time, Ac6x, A7x @@ -44,7 +44,6 @@ module rpi9_m IF (Kstop.EQ.0) STOP '[ STOP - Onlytd_Der is not yet working in mrpi9.f]' call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! *** initialize @@ -291,8 +290,6 @@ module rpi9_m ! *** PURPOSE -- Form the derivatives of the weights for resolution ! *** broadening when only the electron burst is included ! - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -312,7 +309,6 @@ module rpi9_m ! *** initialize CALL Zero_Array (Wtsx, Ipnts) call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Summax = Zero @@ -338,8 +334,6 @@ module rpi9_m ! *** PURPOSE -- Form the derivatives of the weights for resolution ! *** broadening when only the channel widths contribute ! - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -361,7 +355,6 @@ module rpi9_m IF (Kstop.EQ.0) STOP '[STOP -- Onlych_Der not yet ready in mrpi9.f]' call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! *** initialize @@ -436,8 +429,6 @@ module rpi9_m ! *** the (Gaussian) electron burst and the (square) channel ! *** widths are included ! - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -462,7 +453,6 @@ module rpi9_m ! CALL Zero_Array (Wtsx, Ipnts) call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) DO Ie=1,Ipnts eIe = grid%getEnergy(Ie+Kc-1, expData) @@ -514,8 +504,8 @@ module rpi9_m ! *** the (Gaussian) electron burst and the (chi squared ! *** plus exponential) target-detector are included ! - use fixedi_m, only : numcro, Lother - use ifwrit_m, only : ktzero, Itdchi + use fixedi_m, only : Lother + use ifwrit_m, only : Itdchi use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -541,8 +531,7 @@ module rpi9_m ! IF (Kstop.EQ.0) STOP '[Stop -- Ebantd_Der not yet ready rpi/mpri9.f]' - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) ! ! *** initialize @@ -669,8 +658,7 @@ module rpi9_m ! *** the (square) channel width and the (chi squared ! *** plus exponential) target-detector are included ! - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero, Itdchi + use ifwrit_m, only : Itdchi use fixedr_m, only : Ttoe use brdd_common_m, only : Ipnts, Kc use rpijnk_common_m @@ -695,7 +683,6 @@ module rpi9_m ! IF (Kstop.EQ.0) STOP '[Stop -- Chantd_Der not yet ready rpi/mrpi9.f]' call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! *** initialize diff --git a/sammy/src/rpt/mrpt1.f b/sammy/src/rpt/mrpt1.f index 5b687cfa829a3d1de9e033c4bd0c81f2cdd5ba47..4612a4af644fee20af063eb1d48a8975e8bc48f5 100644 --- a/sammy/src/rpt/mrpt1.f +++ b/sammy/src/rpt/mrpt1.f @@ -81,9 +81,7 @@ C use rpires_common_m use rpirrr_common_m use modf3_M - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M IMPLICIT DOUBLE PRECISION (a-h,o-z) C @@ -102,8 +100,7 @@ C un-normalize ! Wts(I) = Wts(I)*Wwnorm END DO - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) C C normalize for comparison to components of resolution function diff --git a/sammy/src/rsl/mrsl0.f90 b/sammy/src/rsl/mrsl0.f90 index 92a89a0a2f407df54dfe162f69369fc465a52b4b..eaca6b2f2944c2475797de77db07e13bb2269c76 100644 --- a/sammy/src/rsl/mrsl0.f90 +++ b/sammy/src/rsl/mrsl0.f90 @@ -5,9 +5,8 @@ module rsl_m ! SUBROUTINE Samrsl_0 ! - use fixedi_m, only : Jwwwww, K2reso, Kkkdex, Nudwhi, numcro, & + use fixedi_m, only : K2reso, Kkkdex, Nudwhi, & Numorr, Numrpi - use ifwrit_m, only : ktzero, Jjjdop, Kplotu use exploc_common_m use array_sizes_common_m use oopsch_common_m, only : Nowwww, Segmen @@ -36,7 +35,6 @@ module rsl_m Segmen(3) = 'L' Nowwww = 0 ! - IF (Kplotu.NE.0) Kplotu = 0 Kdatb = getNumAuxGridPoints() ! ! *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR SAMRSL @@ -44,11 +42,9 @@ module rsl_m ! ! - call eGrid%initialize() - call eGrid%setParameters(numcro, ktzero) + call eGrid%initialize() call eGrid%setToExpGrid(expData) - call auxGrid%initialize() - call auxGrid%setParameters(numcro, ktzero) + call auxGrid%initialize() call auxGrid%setToAuxGrid(expData) ! ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < @@ -72,9 +68,6 @@ module rsl_m deallocate(A_Iwts) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > ! - Jwwwww = 4 -! - Jjjdop = 0 CALL Write_Commons_Many call eGrid%destroy() diff --git a/sammy/src/rsl/mrsl1.f90 b/sammy/src/rsl/mrsl1.f90 index 3e86a34123320bdd31d43e936679e5e9a067d1f1..935ed0959deb7396d8480f04e928f63023b17e64 100644 --- a/sammy/src/rsl/mrsl1.f90 +++ b/sammy/src/rsl/mrsl1.f90 @@ -15,9 +15,9 @@ module rsl1_m ! *** derivatives ! use fixedi_m, only : K2reso,Numbgf, Numnbk, numUsedPar - use ifwrit_m, only : Jjjdop, Kdebug, Kjdele, Kjdell, Ksolve, Ndat + use ifwrit_m, only : Kdebug, Kjdele, Kjdell, Ksolve, Ndat use fixedr_m - use broad_common_m, only : Bo2, Co2, Dell00, Deltae,Dell00, Dele00, Dele11, Dele22, Dell11, deltal + use broad_common_m, only : Bo2, Co2, Dell00, Deltae,Dell00, Dele00, Dele11, Dele22, Dell11, deltal, dopplerInfo use brdd_common_m, only : Ipk, Ipnts, Iup, Kc use constn_common_m, only : Sm2 use Wdsint_m, only : Wdsint @@ -112,7 +112,7 @@ module rsl1_m ! IF (Ipnts.LE.5) THEN ! ********* No integration is possible - IF (Jjjdop.NE.1) THEN + IF (dopplerInfo%bType.ne.1) THEN Now = Now + 1 do Ipar = 0, numUsedPar do ns = 1, derivs%getNnnsig() diff --git a/sammy/src/rsl/mrsl3.f90 b/sammy/src/rsl/mrsl3.f90 index 0b35486a87f542183018fa6bc46ddbfcf0781d96..d087536522ace3a3457898f4ef50b6cc25645afc 100644 --- a/sammy/src/rsl/mrsl3.f90 +++ b/sammy/src/rsl/mrsl3.f90 @@ -9,8 +9,7 @@ module rsl3_m ! *** interpolate to get (un-resolution-broadened) result, when energy ! *** grid Energb is from Leal-Hwang evenly-spaced-in-velocity ! - use fixedi_m, only : numcro,numUsedPar - use ifwrit_m, only : ktzero + use fixedi_m, only : numUsedPar use abro_common_m, only : Delv use EndfData_common_m, only : expData use AuxGridHelper_M, only : getNumAuxGridPoints @@ -28,8 +27,7 @@ module rsl3_m integer::I1, I2, I3, Ipar, N, nauxMax DATA half /0.5d0/ ! - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) nauxMax = getNumAuxGridPoints() diff --git a/sammy/src/rsl/mrsl6.f90 b/sammy/src/rsl/mrsl6.f90 index ee9621e6342a20f5c49cded80ef0cb95252cb326..3f9fa630dfc3e4ba643e57b447411e6356cf9c60 100644 --- a/sammy/src/rsl/mrsl6.f90 +++ b/sammy/src/rsl/mrsl6.f90 @@ -11,9 +11,7 @@ module rsl6_m ! use brdd_common_m, only : Ipk, Ipke, Ipnts, Kc, Iup use EndfData_common_m, only : expData - use AuxGridHelper_M, only : getNumAuxGridPoints - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use AuxGridHelper_M, only : getNumAuxGridPoints use SammyGridAccess_M type(SammyGridAccess)::grid @@ -22,7 +20,6 @@ module rsl6_m integer::Ilow, nauxMax call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) nauxMax = getNumAuxGridPoints() diff --git a/sammy/src/rst/mrst0.f90 b/sammy/src/rst/mrst0.f90 index e1979ca2bef1cb8190cd0ed19def464681d8a856..4c367a4a8d91bf43062bedba1a057e1f5346372d 100644 --- a/sammy/src/rst/mrst0.f90 +++ b/sammy/src/rst/mrst0.f90 @@ -4,8 +4,7 @@ module rst_m ! SUBROUTINE Samrst_0 ! - use fixedi_m, only : Jwwwww - use ifwrit_m, only : Jjjdop, Kplotu, Ndatb + use ifwrit_m, only : Ndatb use exploc_common_m use oopsch_common_m, only : Nowwww, Segmen use rst1_m @@ -23,7 +22,6 @@ module rst_m Nowwww = 0 ! CALL Initil - IF (Kplotu.NE.0) Kplotu = 0 ! ! ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < @@ -40,8 +38,6 @@ module rst_m deallocate(A_IWts) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > ! - Jwwwww = 4 - Jjjdop = 0 CALL Write_Commons_Few RETURN ! diff --git a/sammy/src/rst/mrst1.f90 b/sammy/src/rst/mrst1.f90 index a62bf6f7ccaa2314ba3096bad3c30f31708eade3..c461794119086c3c63692268f41f0611fb853b34 100644 --- a/sammy/src/rst/mrst1.f90 +++ b/sammy/src/rst/mrst1.f90 @@ -108,8 +108,7 @@ module rst1_m ! *** GAUSSIAN+EXPONENTIAL resolution function, AND ! *** NORMALIZE THEM ! - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero, Kexpsh + use ifwrit_m, only : Kexpsh use broad_common_m, only : Iesopr use brdd_common_m, only : Ipnts, Ipke, Kc use EndfData_common_m, only : expData @@ -131,7 +130,6 @@ module rst1_m DATA Zero /0.0d0/, Half /0.5d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! diff --git a/sammy/src/salmon/DerivativeList.cpp b/sammy/src/salmon/DerivativeList.cpp index 55128e0734bace2492f102973c24983893f37066..2b8f467d0484dfdeb9cd4ecdd95beec2cffae8e8 100644 --- a/sammy/src/salmon/DerivativeList.cpp +++ b/sammy/src/salmon/DerivativeList.cpp @@ -200,9 +200,7 @@ namespace sammy { void DerivativeList::addSharedColumn(int col, int iso){ - if (isSharedColumn(col)) { - int ourCol = realColIndices[col]; - if (ourCol < 0) ourCol = -1*ourCol - 1; + if (isSharedColumn(col)) { // The function allows a reset because in legacy SAMMY the // isotope index was not always set to the correct isotope. // Therefore the C++ setup get's a chance to reset the diff --git a/sammy/src/salmon/GridData.cpp b/sammy/src/salmon/GridData.cpp index 9fb512cf35003c765ee5b9fdc822012fe1e0cf2a..299d2f81fd5e171f8a4fab8786fb8a6e9995cd37 100644 --- a/sammy/src/salmon/GridData.cpp +++ b/sammy/src/salmon/GridData.cpp @@ -7,7 +7,8 @@ namespace sammy{ rowOffset(orig.rowOffset), rowMax(orig.rowMax), notSetReturnsZero(orig.notSetReturnsZero), - accumulate(orig.accumulate){ + accumulate(orig.accumulate), + numPerEner(orig.numPerEner){ if (orig.implicitParCov != nullptr){ implicitParCov = std::make_unique<endf::ResonanceCovariance>(*(orig.implicitParCov)); diff --git a/sammy/src/salmon/GridData.h b/sammy/src/salmon/GridData.h index cc9ed05249742fb8a5bb4e7f4d2a833d4a99354b..f25064159532f5a387759165fa6e79a592591b16 100644 --- a/sammy/src/salmon/GridData.h +++ b/sammy/src/salmon/GridData.h @@ -31,7 +31,7 @@ namespace sammy{ */ class GridData { public: - GridData():dataIndex(-1), rowOffset(0), rowMax(0), notSetReturnsZero(false),accumulate(false){} + GridData():dataIndex(-1), rowOffset(0), rowMax(0), notSetReturnsZero(false),accumulate(false), numPerEner(1){} GridData(const GridData & orig); virtual ~GridData(){} @@ -170,6 +170,20 @@ namespace sammy{ */ void reserve(int maxRow, int maxCol); void reserveColumn(int row, int maxCol); + + /** + * Get the number of points per energy + * + * @return the points per energy + */ + int getNumPerEnergy() const{ return numPerEner;} + + /** + * Set the number of points per energy + * + * @param n the points per energy + */ + void setNumPerEnergy(int n) { numPerEner = n;} protected: std::vector< std::vector<double> > data; @@ -182,6 +196,8 @@ namespace sammy{ bool notSetReturnsZero; bool accumulate; + int numPerEner; + // arrays for the implicit data covariance // covariance for the implicit parameters diff --git a/sammy/src/salmon/SammyGridAccess.cpp b/sammy/src/salmon/SammyGridAccess.cpp index d60bb719edce92a8d5ef4281abbd9ff4a5777f6f..8063b925c817bb8e4c83c0cc5c63d3df17d02dc4 100644 --- a/sammy/src/salmon/SammyGridAccess.cpp +++ b/sammy/src/salmon/SammyGridAccess.cpp @@ -2,12 +2,6 @@ #include <exception> namespace sammy { - void SammyGridAccess::setParameters(int numcro, int ktzero){ - this->numcro = numcro; - this->ktzero = ktzero; - if (this->numcro == 0) this->numcro = 1; - } - void SammyGridAccess::setToExpGrid(const GridDataList & list){ gridIndex = list.getExpGridIndex(); @@ -32,6 +26,7 @@ namespace sammy { int SammyGridAccess::getNumEnergies(const GridDataList & list) const{ const std::unique_ptr<GridData> & grid = getGrid(list); + int numcro = grid->getNumPerEnergy(); int ll = grid->getLength(); ll /= numcro; @@ -47,14 +42,11 @@ namespace sammy { double SammyGridAccess::getEnergy(int index, const GridDataList & list) const{ const std::unique_ptr<GridData> & grid = getGrid(list); + int numcro = grid->getNumPerEnergy(); - int ipos = 0; - if (gridIndex == list.getExpGridIndex() || list.getLength() == 1){ - if (ktzero != 0){ - if( numcro > 1) ipos = 2; - else ipos = 1; - } - } + int ipos = grid->getDataColumn() - 1; + if (numcro > 1) ipos--; + if (ipos < 0) ipos = 0; int jj = index; if( useOffsets) jj += grid->getRowOffset(); @@ -69,6 +61,7 @@ namespace sammy { int jj = index; if( useOffsets) jj += grid->getRowOffset(); + int numcro = grid->getNumPerEnergy(); jj *= numcro; return grid->getData(jj, 0); diff --git a/sammy/src/salmon/SammyGridAccess.h b/sammy/src/salmon/SammyGridAccess.h index add19dcd97a67c93c4c22213d9ed6551ba556e46..dd384589406c95873c81623237a83d6da5e2908e 100644 --- a/sammy/src/salmon/SammyGridAccess.h +++ b/sammy/src/salmon/SammyGridAccess.h @@ -26,17 +26,10 @@ namespace sammy{ class SammyGridAccess { public: - SammyGridAccess():numcro(1),ktzero(0),gridIndex(0),useOffsets(true){} + SammyGridAccess():gridIndex(0),useOffsets(true){} + SammyGridAccess(const SammyGridAccess & orig) = delete; virtual ~SammyGridAccess(){} - /** - * Set the values for numcro and ktzero. - * See class description for more info. - * - * @param numcro number of angles on the angle grid for each energy - * @param ktzero do we have an energy calibration applied - */ - void setParameters(int numcro, int ktzero); /** * Indicate that this access is for the experimental grid @@ -87,10 +80,6 @@ namespace sammy{ private: const std::unique_ptr<GridData> & getGrid( const GridDataList & list) const; - int numcro; // number of angles - - int ktzero; // did we correct to time-of-flight - int gridIndex; bool useOffsets; diff --git a/sammy/src/salmon/interface/cix/GridData.cpp2f.xml b/sammy/src/salmon/interface/cix/GridData.cpp2f.xml index 8fbc81c4ce1bd4566942e8fa82a7d7cdc19ac673..1e484fa6512b485d03c506488e25da49c821fdc5 100644 --- a/sammy/src/salmon/interface/cix/GridData.cpp2f.xml +++ b/sammy/src/salmon/interface/cix/GridData.cpp2f.xml @@ -33,6 +33,11 @@ <param name="col" type="int"/> </method> + <method name="getNumPerEnergy" return_type="int"/> + <method name="setNumPerEnergy"> + <param name="n" type="int"/> + </method> + <method name="addImplicitDerivs"> <param name="grid" type="GridData*"/> </method> diff --git a/sammy/src/salmon/interface/cix/SammyGridAccess.cpp2f.xml b/sammy/src/salmon/interface/cix/SammyGridAccess.cpp2f.xml index e25c6e7a3edb4c19ec757d346f151075e9231538..3d4f8da2c848a0de9c05d5d4802158a691f84f1f 100644 --- a/sammy/src/salmon/interface/cix/SammyGridAccess.cpp2f.xml +++ b/sammy/src/salmon/interface/cix/SammyGridAccess.cpp2f.xml @@ -3,10 +3,6 @@ <using_namespace name="sammy"/> <class name="SammyGridAccess"> - <method name="setParameters"> - <param name="numcro" type="int"/> - <param name="ktzero" type="int"/> - </method> <method name="setToExpGrid"> <param name="list" type="GridDataList"/> </method> diff --git a/sammy/src/salmon/interface/cpp/GridDataInterface.cpp b/sammy/src/salmon/interface/cpp/GridDataInterface.cpp index 9877ebd19a84170f01bd91f70f02d9d753b8d241..389eaa5721de9f89c252cea3b0bfa9716e80b60b 100644 --- a/sammy/src/salmon/interface/cpp/GridDataInterface.cpp +++ b/sammy/src/salmon/interface/cpp/GridDataInterface.cpp @@ -69,6 +69,16 @@ void GridData_reserve(void * GridData_ptr,int * row,int * col) ((GridData*)GridData_ptr)->reserve(*row,*col); } +int GridData_getNumPerEnergy(void * GridData_ptr) +{ + return ((GridData*)GridData_ptr)->getNumPerEnergy(); +} + +void GridData_setNumPerEnergy(void * GridData_ptr,int * n) +{ + ((GridData*)GridData_ptr)->setNumPerEnergy(*n); +} + void GridData_addImplicitDerivs(void * GridData_ptr,GridData* grid) { std::unique_ptr<GridData> gridPtr(grid); diff --git a/sammy/src/salmon/interface/cpp/GridDataInterface.h b/sammy/src/salmon/interface/cpp/GridDataInterface.h index fb679a93e204f9b8b30b9f871441ea3d62e532d5..491caa7aa17aba9bca9ff56d9dffad9bcc2aebf0 100644 --- a/sammy/src/salmon/interface/cpp/GridDataInterface.h +++ b/sammy/src/salmon/interface/cpp/GridDataInterface.h @@ -26,6 +26,8 @@ void GridData_setRowMax(void * GridData_ptr,int * offset); void GridData_clearGrid(void * GridData_ptr); void GridData_nullify(void * GridData_ptr); void GridData_reserve(void * GridData_ptr,int * row,int * col); +int GridData_getNumPerEnergy(void * GridData_ptr); +void GridData_setNumPerEnergy(void * GridData_ptr,int * n); void GridData_addImplicitDerivs(void * GridData_ptr,GridData* grid); void* GridData_getImplicitDerivs(void * GridData_ptr); void GridData_addImplicitParCov(void * GridData_ptr,endf::ResonanceCovariance* cov); diff --git a/sammy/src/salmon/interface/cpp/SammyGridAccessInterface.cpp b/sammy/src/salmon/interface/cpp/SammyGridAccessInterface.cpp index a51df1dde85994b25fa17d091e011b35099f1088..0998a3ef5c982b16abab85661d147e9f066dc2ea 100644 --- a/sammy/src/salmon/interface/cpp/SammyGridAccessInterface.cpp +++ b/sammy/src/salmon/interface/cpp/SammyGridAccessInterface.cpp @@ -9,11 +9,6 @@ #include <string.h> #include "SammyGridAccessInterface.h" using namespace sammy; -void SammyGridAccess_setParameters(void * SammyGridAccess_ptr,int * numcro,int * ktzero) -{ - ((SammyGridAccess*)SammyGridAccess_ptr)->setParameters(*numcro,*ktzero); -} - void SammyGridAccess_setToExpGrid(void * SammyGridAccess_ptr,GridDataList * list) { ((SammyGridAccess*)SammyGridAccess_ptr)->setToExpGrid(*list); diff --git a/sammy/src/salmon/interface/cpp/SammyGridAccessInterface.h b/sammy/src/salmon/interface/cpp/SammyGridAccessInterface.h index ab7e97b3350cd00258151d8c5e4a36b432cc4f7a..7c00bfe95aa15901c1902eef0c655f6182d3913a 100644 --- a/sammy/src/salmon/interface/cpp/SammyGridAccessInterface.h +++ b/sammy/src/salmon/interface/cpp/SammyGridAccessInterface.h @@ -13,7 +13,6 @@ using namespace sammy; #ifdef __cplusplus extern "C" { #endif -void SammyGridAccess_setParameters(void * SammyGridAccess_ptr,int * numcro,int * ktzero); void SammyGridAccess_setToExpGrid(void * SammyGridAccess_ptr,GridDataList * list); void SammyGridAccess_setToAuxGrid(void * SammyGridAccess_ptr,GridDataList * list); double SammyGridAccess_getEnergy(void * SammyGridAccess_ptr,int * index,GridDataList * list); diff --git a/sammy/src/salmon/interface/fortran/GridData_I.f90 b/sammy/src/salmon/interface/fortran/GridData_I.f90 index 5630fa4a8b29e668574984734fb6fded66621d3d..0f8a1b98aab75b121f498b33f9a6b36ae0bc9a57 100644 --- a/sammy/src/salmon/interface/fortran/GridData_I.f90 +++ b/sammy/src/salmon/interface/fortran/GridData_I.f90 @@ -79,6 +79,18 @@ subroutine f_GridData_reserve(GridData_ptr, row,col ) BIND(C,name="GridData_rese integer(C_INT) :: row; integer(C_INT) :: col; end subroutine +integer(C_INT) function f_GridData_getNumPerEnergy(GridData_ptr ) BIND(C,name="GridData_getNumPerEnergy") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: GridData_ptr; +end function +subroutine f_GridData_setNumPerEnergy(GridData_ptr, n ) BIND(C,name="GridData_setNumPerEnergy") + use,intrinsic :: ISO_C_BINDING + implicit none + type(C_PTR), value :: GridData_ptr; + integer(C_INT) :: n; +end subroutine + subroutine f_GridData_addImplicitDerivs(GridData_ptr, grid ) BIND(C,name="GridData_addImplicitDerivs") use,intrinsic :: ISO_C_BINDING implicit none diff --git a/sammy/src/salmon/interface/fortran/GridData_M.f90 b/sammy/src/salmon/interface/fortran/GridData_M.f90 index ad964fe6613e4f877f960db3344c0b45e7c88a71..feb75c5de470f92e8ce80b67185858d0762c47ce 100644 --- a/sammy/src/salmon/interface/fortran/GridData_M.f90 +++ b/sammy/src/salmon/interface/fortran/GridData_M.f90 @@ -25,6 +25,8 @@ type GridData procedure, pass(this) :: clearGrid => GridData_clearGrid procedure, pass(this) :: nullify => GridData_nullify procedure, pass(this) :: reserve => GridData_reserve + procedure, pass(this) :: getNumPerEnergy => GridData_getNumPerEnergy + procedure, pass(this) :: setNumPerEnergy => GridData_setNumPerEnergy procedure, pass(this) :: addImplicitDerivs => GridData_addImplicitDerivs procedure, pass(this) :: getImplicitDerivs => GridData_getImplicitDerivs procedure, pass(this) :: addImplicitParCov => GridData_addImplicitParCov @@ -124,6 +126,18 @@ subroutine GridData_reserve(this, row, col) integer(C_INT)::col call f_GridData_reserve(this%instance_ptr, row,col) end subroutine +function GridData_getNumPerEnergy(this) result(result2Return) + implicit none + class(GridData)::this + integer(C_INT):: result2Return + result2Return=f_GridData_getNumPerEnergy(this%instance_ptr) +end function +subroutine GridData_setNumPerEnergy(this, n) + implicit none + class(GridData)::this + integer(C_INT)::n + call f_GridData_setNumPerEnergy(this%instance_ptr, n) +end subroutine subroutine GridData_addImplicitDerivs(this, grid) implicit none class(GridData)::this diff --git a/sammy/src/salmon/interface/fortran/SammyGridAccess_I.f90 b/sammy/src/salmon/interface/fortran/SammyGridAccess_I.f90 index 346c298f63468cf03ad2f7f46f813b4a21c487ec..ba50151750f9a67a7cf217d0e0ef3ae342555ea8 100644 --- a/sammy/src/salmon/interface/fortran/SammyGridAccess_I.f90 +++ b/sammy/src/salmon/interface/fortran/SammyGridAccess_I.f90 @@ -9,13 +9,6 @@ module SammyGridAccess_I use, intrinsic :: ISO_C_BINDING interface -subroutine f_SammyGridAccess_setParameters(SammyGridAccess_ptr, numcro,ktzero ) BIND(C,name="SammyGridAccess_setParameters") - use,intrinsic :: ISO_C_BINDING - implicit none - type(C_PTR), value :: SammyGridAccess_ptr; - integer(C_INT) :: numcro; - integer(C_INT) :: ktzero; -end subroutine subroutine f_SammyGridAccess_setToExpGrid(SammyGridAccess_ptr, list ) BIND(C,name="SammyGridAccess_setToExpGrid") use,intrinsic :: ISO_C_BINDING implicit none diff --git a/sammy/src/salmon/interface/fortran/SammyGridAccess_M.f90 b/sammy/src/salmon/interface/fortran/SammyGridAccess_M.f90 index 9b9ad4778f02fbf2ec546b6d97355476040aab37..8518ab3088633f096f65177ada8f5036790bd4da 100644 --- a/sammy/src/salmon/interface/fortran/SammyGridAccess_M.f90 +++ b/sammy/src/salmon/interface/fortran/SammyGridAccess_M.f90 @@ -13,7 +13,6 @@ use GridData_M type SammyGridAccess type(C_PTR) :: instance_ptr=C_NULL_PTR contains - procedure, pass(this) :: setParameters => SammyGridAccess_setParameters procedure, pass(this) :: setToExpGrid => SammyGridAccess_setToExpGrid procedure, pass(this) :: setToAuxGrid => SammyGridAccess_setToAuxGrid procedure, pass(this) :: getEnergy => SammyGridAccess_getEnergy @@ -24,13 +23,6 @@ type SammyGridAccess procedure, pass(this) :: destroy => SammyGridAccess_destroy end type SammyGridAccess contains -subroutine SammyGridAccess_setParameters(this, numcro, ktzero) - implicit none - class(SammyGridAccess)::this - integer(C_INT)::numcro - integer(C_INT)::ktzero - call f_SammyGridAccess_setParameters(this%instance_ptr, numcro,ktzero) -end subroutine subroutine SammyGridAccess_setToExpGrid(this, list) implicit none class(SammyGridAccess)::this diff --git a/sammy/src/salmon/tests/SammyGridAccessTest.cpp b/sammy/src/salmon/tests/SammyGridAccessTest.cpp index 3c5819684ab1bd95da751d5b0be2076eeb650f91..9f0809f287a7d1ecd6ec806f7de56a46e8f4a949 100644 --- a/sammy/src/salmon/tests/SammyGridAccessTest.cpp +++ b/sammy/src/salmon/tests/SammyGridAccessTest.cpp @@ -3,13 +3,23 @@ #include "../GridData.h" #include "../SammyGridAccess.h" -void addTestData(sammy::GridDataList & list, int numcro = 1, bool addSecond = true){ +void addTestData(sammy::GridDataList & list, int numcro = 1, int ktzero = 0, bool addSecond = true){ std::unique_ptr<sammy::GridData> grid = std::make_unique<sammy::GridData>(); int ipos = 0; + int idat; int nn = numcro; if (nn == 0) nn = 1; + grid->setNumPerEnergy(nn); + grid->setDataIndex(1); + if (ktzero > 0) { + grid->setDataIndex(2); + } + if ( numcro > 1){ + grid->setDataIndex( grid->getDataColumn()+1); + } + for (int i = 0; i < 10; i++){ double e = i + 1; for ( int j = 0; j < nn; j++){ @@ -17,23 +27,31 @@ void addTestData(sammy::GridDataList & list, int numcro = 1, bool addSecond = tr double data = e+ cro + 0.2; grid->addData(ipos,0, e); - if ( numcro > 1){ - grid->addData(ipos, 1 , cro + e); - grid->addData(ipos, 2 , e + 0.1); - grid->addData(ipos, 3 , data + e); + idat = 1; + + if (ktzero > 0) { + grid->addData(ipos, idat , e + 0.1); + idat++; } - else{ - grid->addData(ipos, 1 , e + 0.1); - grid->addData(ipos, 2 , data + e); + if ( numcro > 1){ + grid->addData(ipos, idat , cro + e); + idat++; } + grid->addData(ipos, idat , data + e); + ipos++; + } } list.addGrid(grid); if (!addSecond) return; - grid = std::make_unique<sammy::GridData>(); + grid = std::make_unique<sammy::GridData>(); + grid->setNumPerEnergy(nn); + grid->setDataIndex(1); + if (nn > 1) grid->setDataIndex(2); + ipos = 0; for (int i = 0; i < 20; i++){ double e = i + 10; @@ -43,12 +61,10 @@ void addTestData(sammy::GridDataList & list, int numcro = 1, bool addSecond = tr grid->addData(ipos,0, e); if ( numcro > 1){ grid->addData(ipos, 1 , cro + e); - grid->addData(ipos, 2 , e + 0.1); - grid->addData(ipos, 3 , data + e); + grid->addData(ipos, 2 , data + e); } else{ - grid->addData(ipos, 1 , e + 0.1); - grid->addData(ipos, 2 , data + e); + grid->addData(ipos, 1 , data + e); } ipos++; } @@ -56,7 +72,7 @@ void addTestData(sammy::GridDataList & list, int numcro = 1, bool addSecond = tr list.addGrid(grid); } -void testFirstGrid(sammy::SammyGridAccess & access, sammy::GridDataList & list, int ktzero){ +void testFirstGrid(sammy::SammyGridAccess & access, sammy::GridDataList & list, int ktzero){ ASSERT_EQ(10, access.getNumEnergies(list)); for (int i = 0; i < 10; i++){ double e = i + 1; @@ -71,17 +87,11 @@ void testFirstGrid(sammy::SammyGridAccess & access, sammy::GridDataList & list, } } -void testSecondGrid(sammy::SammyGridAccess & access, sammy::GridDataList & list, int ktzero){ - ASSERT_EQ(20, access.getNumEnergies(list)); +void testSecondGrid(sammy::SammyGridAccess & access, sammy::GridDataList & list){ + ASSERT_EQ(20, access.getNumEnergies(list)); for (int i = 0; i < 20; i++){ double e = i + 10; - if (ktzero == 0){ - ASSERT_NEAR(e, access.getEnergy(i, list), 1e-3); - } - else{ - ASSERT_NEAR(e + 0.1, access.getEnergy(i, list), 1e-3); - } - + ASSERT_NEAR(e, access.getEnergy(i, list), 1e-3); ASSERT_NEAR(e, access.getOrigEnergy(i, list), 1e-3); } } @@ -101,28 +111,23 @@ void testFirstGridOff(sammy::SammyGridAccess & access, sammy::GridDataList & lis } } -void testSecondGridOff(sammy::SammyGridAccess & access, sammy::GridDataList & list, int ktzero){ +void testSecondGridOff(sammy::SammyGridAccess & access, sammy::GridDataList & list){ ASSERT_EQ(10, access.getNumEnergies(list)); for (int i = 0; i < 10; i++){ double e = i + 20; - if (ktzero == 0){ - ASSERT_NEAR(e, access.getEnergy(i, list), 1e-3); - } - else{ - ASSERT_NEAR(e + 0.1, access.getEnergy(i, list), 1e-3); - } - + ASSERT_NEAR(e, access.getEnergy(i, list), 1e-3); ASSERT_NEAR(e, access.getOrigEnergy(i, list), 1e-3); } } TEST(GridAcccesTest, twoGridsNoOffsetLimits){ for ( int numcro = 0; numcro < 5; numcro++){ - sammy::GridDataList list; - addTestData(list, numcro); for (int ktzero = 0; ktzero <= 1; ktzero++){ + sammy::GridDataList list; + addTestData(list, numcro, ktzero); + list.setExpGridIndex(0); list.getGrid(0)->setRowOffset(2); list.getGrid(0)->setRowMax(4); @@ -130,75 +135,73 @@ TEST(GridAcccesTest, twoGridsNoOffsetLimits){ list.getGrid(1)->setRowOffset(3); list.getGrid(1)->setRowMax(12); - sammy::SammyGridAccess access; - access.setParameters(numcro, ktzero); + sammy::SammyGridAccess access; access.setToExpGrid(list); access.setUseOffset(false); testFirstGrid(access, list, ktzero); list.setExpGridIndex(1); access.setToExpGrid(list); - testSecondGrid(access, list, ktzero); + testSecondGrid(access, list); list.setExpGridIndex(0); list.setAuxGridIndex(1); access.setToAuxGrid(list); - testSecondGrid(access, list, 0); + testSecondGrid(access, list); list.setExpGridIndex(1); list.setAuxGridIndex(0); access.setToAuxGrid(list); - testFirstGrid(access, list, 0); + testFirstGrid(access, list, ktzero); } } } TEST(GridAcccesTest, twoGridsNoOffset){ for ( int numcro = 0; numcro < 5; numcro++){ - sammy::GridDataList list; - - addTestData(list, numcro); for (int ktzero = 0; ktzero <= 1; ktzero++){ + sammy::GridDataList list; + addTestData(list, numcro, ktzero); + list.setExpGridIndex(0); list.setAuxGridIndex(1); - sammy::SammyGridAccess access; - access.setParameters(numcro, ktzero); + sammy::SammyGridAccess access; access.setToExpGrid(list); testFirstGrid(access, list, ktzero); list.setExpGridIndex(1); access.setToExpGrid(list); - testSecondGrid(access, list, ktzero); + testSecondGrid(access, list); + list.setExpGridIndex(0); list.setAuxGridIndex(1); access.setToAuxGrid(list); - testSecondGrid(access, list, 0); + testSecondGrid(access, list); list.setExpGridIndex(1); list.setAuxGridIndex(0); access.setToAuxGrid(list); - testFirstGrid(access, list, 0); + testFirstGrid(access, list, ktzero); } } } TEST(GridAcccesTest, twoGridsOffset){ for ( int numcro = 0; numcro < 5; numcro++){ - sammy::GridDataList list; - - addTestData(list, numcro); - list.getGrid(0)->setRowOffset(5); - list.getGrid(1)->setRowOffset(10); for (int ktzero = 0; ktzero <= 1; ktzero++){ + sammy::GridDataList list; + addTestData(list, numcro, ktzero); + list.getGrid(0)->setRowOffset(5); + list.getGrid(1)->setRowOffset(10); + list.setExpGridIndex(0); list.setAuxGridIndex(1); sammy::SammyGridAccess access; - access.setParameters(numcro, ktzero); access.setToExpGrid(list); testFirstGridOff(access, list, ktzero); @@ -210,7 +213,7 @@ TEST(GridAcccesTest, twoGridsOffset){ list.setExpGridIndex(1); access.setToExpGrid(list); - testSecondGridOff(access, list, ktzero); + testSecondGridOff(access, list); list.getGrid(1)->setRowMax(15); ASSERT_EQ(6, access.getNumEnergies(list)); @@ -222,28 +225,26 @@ TEST(GridAcccesTest, twoGridsOffset){ list.setExpGridIndex(0); list.setAuxGridIndex(1); access.setToAuxGrid(list); - testSecondGridOff(access, list, 0); + testSecondGridOff(access, list); list.setExpGridIndex(1); list.setAuxGridIndex(0); access.setToAuxGrid(list); - testFirstGridOff(access, list, 0); + testFirstGridOff(access, list, ktzero); } } } TEST(GridAcccesTest, oneGridsNoOffset){ for ( int numcro = 0; numcro < 5; numcro++){ - sammy::GridDataList list; - - addTestData(list, numcro, false); - for (int ktzero = 0; ktzero <= 1; ktzero++){ + sammy::GridDataList list; + addTestData(list, numcro, ktzero, false); + list.setExpGridIndex(0); list.setAuxGridIndex(1); - sammy::SammyGridAccess access; - access.setParameters(numcro, ktzero); + sammy::SammyGridAccess access; access.setToExpGrid(list); testFirstGrid(access, list, ktzero); @@ -266,11 +267,12 @@ TEST(GridAcccesTest, oneGridsNoOffset){ TEST(GridAcccesTest, oneGridsNoOffsetLimits){ for ( int numcro = 0; numcro < 5; numcro++){ - sammy::GridDataList list; - - addTestData(list, numcro, false); for (int ktzero = 0; ktzero <= 1; ktzero++){ + sammy::GridDataList list; + + addTestData(list, numcro, ktzero, false); + list.setExpGridIndex(0); list.getGrid(0)->setRowOffset(2); list.getGrid(0)->setRowMax(4); @@ -278,7 +280,6 @@ TEST(GridAcccesTest, oneGridsNoOffsetLimits){ sammy::SammyGridAccess access; access.setUseOffset(false); - access.setParameters(numcro, ktzero); access.setToExpGrid(list); testFirstGrid(access, list, ktzero); @@ -301,17 +302,17 @@ TEST(GridAcccesTest, oneGridsNoOffsetLimits){ TEST(GridAcccesTest, oneGridsOffset){ for ( int numcro = 0; numcro < 5; numcro++){ - sammy::GridDataList list; - - addTestData(list, numcro, false); - list.getGrid(0)->setRowOffset(5); for (int ktzero = 0; ktzero <= 1; ktzero++){ + sammy::GridDataList list; + + addTestData(list, numcro, ktzero, false); + list.getGrid(0)->setRowOffset(5); + list.setExpGridIndex(0); list.setAuxGridIndex(1); - sammy::SammyGridAccess access; - access.setParameters(numcro, ktzero); + sammy::SammyGridAccess access; access.setToExpGrid(list); testFirstGridOff(access, list, ktzero); diff --git a/sammy/src/sammy/CMakeLists.txt b/sammy/src/sammy/CMakeLists.txt index 01e57b697d3383059ef9757e7219ee6c2ad698dc..bfb4d77a732b69e18e698c24434f6df2d5c6a54f 100644 --- a/sammy/src/sammy/CMakeLists.txt +++ b/sammy/src/sammy/CMakeLists.txt @@ -50,16 +50,17 @@ APPEND_SET(SAMMY_SOURCES ../clm/dopush3.f ../clm/dopush4.f - ../clm/mclm0.f - ../clm/mclm1.f - ../clm/mclm2.f - ../clm/mclm3.f - ../clm/mclm4.f - ../clm/mclm5.f - ../clm/mclm6.f - ../clm/mclm7.f - ../clm/mclm8.f + ../clm/mclm0.f90 + ../clm/mclm1.f90 + ../clm/mclm2.f90 + ../clm/mclm3.f90 + ../clm/mclm4.f90 + ../clm/mclm5.f90 + ../clm/mclm6.f90 + ../clm/mclm7.f90 + ../clm/mclm8.f90 ../clm/mclm8a.f90 + ../clm/CrystalLatticeBroadening_M.f90 ../clq/mclq0.f90 ../clq/ArtificalCross_M.f90 @@ -91,10 +92,10 @@ APPEND_SET(SAMMY_SOURCES ../dat/mdata.f90 ../dat/mdatb.f90 - ../dbd/mdbd0.f - ../dbd/mdbd1.f - ../dbd/mdbd2.f - ../dbd/mdbd3.f + ../dbd/mdbd0.f90 + ../dbd/mdbd1.f90 + ../dbd/mdbd2.f90 + ../dbd/HighEnergyFreeGas_m.f90 ../dex/mdex0.f ../dex/mdex1.f @@ -102,6 +103,7 @@ APPEND_SET(SAMMY_SOURCES ../dop/mdop0.f90 ../dop/mdop1.f90 ../dop/mdop2.f90 + ../dop/LealHwangBroadening_M.f90 ../end/mend0.f ../end/mend1.f @@ -139,7 +141,6 @@ APPEND_SET(SAMMY_SOURCES ../fgm/mfgm0.f90 ../fgm/mfgm1.f90 ../fgm/mfgm2.f90 - ../fgm/mfgm3.f90 ../fgm/mfgm4.f90 ../fgm/FreeGasDopplerBroadening_M.f90 @@ -547,7 +548,6 @@ APPEND_SET(SAMMY_SOURCES ../blk/Mssccc_common.f90 ../blk/Endfaa_common.f90 ../blk/Brdd_common.f90 - ../blk/Clm_common.f90 ../blk/Abro_common.f90 ../blk/Rpijnk_common.f90 ../blk/Rpires_common.f90 diff --git a/sammy/src/smc/msmc1.f b/sammy/src/smc/msmc1.f index 04ea8814f1f5f10b845765d56f831ab6fa634d64..ec126b5480a9ae0a937339cacdf1db56136bd301 100755 --- a/sammy/src/smc/msmc1.f +++ b/sammy/src/smc/msmc1.f @@ -4,9 +4,7 @@ C ------------------------------------------------------------------- C SUBROUTINE Sigmax_smc (Ee, Ec, Et, Amux, Yield, Y0, Total, * Captur, Ccclll, Poly, Dmu, Sssxxx, Sxxxxx, Xxxsss) - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M IMPLICIT DOUBLE PRECISION (A-H,O-Z) INCLUDE 'msmc3.f' @@ -23,8 +21,7 @@ C I3 = 1 I4 = 1 - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToExpGrid(expData) C C *** Initialize random-number-generators @@ -565,9 +562,7 @@ C C ------------------------------------------------------------------- C SUBROUTINE Output (Yield, Y0, Total, Captur) - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M IMPLICIT DOUBLE PRECISION (A-H,O-Z) CHARACTER*50 Filees, Filexs, Title @@ -577,7 +572,6 @@ C DIMENSION Yield(*), Y0(*), Total(*), Captur(*) call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToExpGrid(expData) C DO I=1,I2 diff --git a/sammy/src/ssm/mssm00.f90 b/sammy/src/ssm/mssm00.f90 index e4222a62f662e9a508dd6ebd0b6054100f6533e4..ea3aff41dc7eabbc55e1f765043996e4be9cf253 100644 --- a/sammy/src/ssm/mssm00.f90 +++ b/sammy/src/ssm/mssm00.f90 @@ -14,10 +14,9 @@ module ssm_m ! (tr039|tr119|tr085|tr066|tr171|tr160|tr060|tr118|tr057|tr064| ! tr090|tr052|tr078|tr076|tr095|tr188|tr046|tr099|tr189|tr045) ! - use fixedi_m, only : Jtheta, Jwwwww, K2reso, Kkkdex, Kkkrsl, & - Ktheta, Ntheta, Nudwhi, Numcro, & + use fixedi_m, only : Jtheta, K2reso, Kkkdex, Kkkrsl, & + Ktheta, Ntheta, Nudwhi, & Numder, Numorr, Numrpi - use ifwrit_m, only : Jjjdop use exploc_common_m, only : I_Ixciso use oopsch_common_m, only : Nowwww, Segmen use logic_ssm_common_m @@ -37,6 +36,7 @@ module ssm_m real(8):: Delthe integer(4):: Jthhhh, Kdatb, Kphi, Kthhhh, M1, M2, M3, M4, Maxx, Mx, Nd, & Ndbl, Nf, Ng, Nh, Nnx, Nthhhh, Nx + type(GridData)::grid ! ! WRITE (6,99999) @@ -114,9 +114,7 @@ module ssm_m ! ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > ! -! - Jwwwww = 8 - Numcro = 1 +! Numder = 1 call multScat%setNumTheta( Nthhhh ) @@ -125,7 +123,6 @@ module ssm_m Ktheta = Kthhhh ! remove call multScat%setNumThetaNearOne( Jthhhh ) Jtheta = Jthhhh ! remove - Jjjdop = 0 CALL Write_Commons_Many RETURN end subroutine Samssm_0 diff --git a/sammy/src/ssm/mssm01.f90 b/sammy/src/ssm/mssm01.f90 index fb21bed0f0a28a6123f59496c30fdd5504969174..cb6f5e776fdaa6d445b3ea1d0611524ee8df4204 100644 --- a/sammy/src/ssm/mssm01.f90 +++ b/sammy/src/ssm/mssm01.f90 @@ -274,7 +274,7 @@ module ssm_1_m ! ! *** Purpose -- Find next cross section, store values in appropriate places ! - use fixedi_m, only : numUsedPar, Lllmax, numcro + use fixedi_m, only : numUsedPar, Lllmax use ifwrit_m use EndfData_common_m use SammyGridAccess_M @@ -296,7 +296,6 @@ module ssm_1_m Istop = 0 call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) diff --git a/sammy/src/ssm/mssm03.f90 b/sammy/src/ssm/mssm03.f90 index 86f393a50d17697c38ff321935c6cf5bbc674917..882ef8e34233745d2abc5d9044e26af149c32de9 100644 --- a/sammy/src/ssm/mssm03.f90 +++ b/sammy/src/ssm/mssm03.f90 @@ -46,7 +46,6 @@ module ssm_3_m DATA Zero /0.0d0/, One /1.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Itimes = 1 @@ -183,7 +182,6 @@ module ssm_3_m DATA Zero /0.0d0/, One /1.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Itimes = 1 @@ -360,7 +358,6 @@ module ssm_3_m DATA Zero /0.0d0/, One /1.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! @@ -540,7 +537,6 @@ module ssm_3_m DATA Zero /0.0d0/, One /1.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Itimes = 1 @@ -724,7 +720,6 @@ module ssm_3_m DATA Zero /0.0d0/, One /1.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Itimes = 1 diff --git a/sammy/src/ssm/mssm04.f90 b/sammy/src/ssm/mssm04.f90 index c3b6da90d5b124ef26130a6a9a43f36e430396ca..85a718dfbf068da0ebd20ab3ce95047683363994 100644 --- a/sammy/src/ssm/mssm04.f90 +++ b/sammy/src/ssm/mssm04.f90 @@ -55,7 +55,6 @@ module ssm_4_m DATA Zero /0.0d0/, One /1.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Itimes = 1 @@ -252,7 +251,6 @@ module ssm_4_m DATA Zero /0.0d0/, One /1.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Itimes = 1 @@ -451,7 +449,6 @@ module ssm_4_m DATA Zero /0.0d0/, One /1.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Itimes = 1 @@ -653,7 +650,6 @@ module ssm_4_m DATA Zero /0.0d0/, One /1.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Itimes = 1 diff --git a/sammy/src/ssm/mssm05.f90 b/sammy/src/ssm/mssm05.f90 index c19742da2268eef678415f612eb39ced2baaa603..35f23444dc1e41b5600804361698efc73f0e84f2 100644 --- a/sammy/src/ssm/mssm05.f90 +++ b/sammy/src/ssm/mssm05.f90 @@ -67,7 +67,6 @@ module ssm_5_m srcfile = "mssm05.f" call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! @@ -385,7 +384,6 @@ module ssm_5_m srcfile = "mssm05.f" call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! diff --git a/sammy/src/ssm/mssm06.f90 b/sammy/src/ssm/mssm06.f90 index 4ae785d8a42391d2215f5440c2c040763da77c3c..f6c6d875529e95bc1515ac76d26bc4537672930d 100644 --- a/sammy/src/ssm/mssm06.f90 +++ b/sammy/src/ssm/mssm06.f90 @@ -70,7 +70,6 @@ module ssm_6_m srcfile = "mssm06.f" call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! @@ -379,7 +378,6 @@ module ssm_6_m srcfile = "mssm06.f" call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! diff --git a/sammy/src/ssm/mssm07.f90 b/sammy/src/ssm/mssm07.f90 index 5a7681cbd21c368d350f7e68d7adf3b59ededc3f..8779855e3b6264e5c4b56cb809c0232e1a58f17b 100644 --- a/sammy/src/ssm/mssm07.f90 +++ b/sammy/src/ssm/mssm07.f90 @@ -72,7 +72,6 @@ module ssm_7_m srcfile = "mssm07.f" call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) Not_Quad = 0 @@ -437,7 +436,6 @@ module ssm_7_m srcfile = "mssm07.f" call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! diff --git a/sammy/src/ssm/mssm08.f90 b/sammy/src/ssm/mssm08.f90 index 6835284089f12c7faee24a1a5201dab412410a24..d184f0f9ad883cb4bd9729d8624d34c3f89369ed 100644 --- a/sammy/src/ssm/mssm08.f90 +++ b/sammy/src/ssm/mssm08.f90 @@ -75,7 +75,6 @@ module ssm_8_m srcfile = "mssm08.f" call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) Non_Quad = 0 ! make sure it is initialized @@ -416,7 +415,6 @@ module ssm_8_m srcfile = "mssm08.f" call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! ! diff --git a/sammy/src/ssm/mssm09.f90 b/sammy/src/ssm/mssm09.f90 index 9a00d98b3da3b05aaa534a5b2dc8b374925a6640..05071700ca628e77f819cb5cff909636957eb797 100644 --- a/sammy/src/ssm/mssm09.f90 +++ b/sammy/src/ssm/mssm09.f90 @@ -12,9 +12,7 @@ module ssm_9_m ! *** I2=grid Number just below E2 ! use mdat9_m - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M IMPLICIT none @@ -30,7 +28,6 @@ module ssm_9_m DATA One /1.0d0/ ! call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) E = grid%getEnergy(Iie, expData) @@ -74,7 +71,6 @@ module ssm_9_m DATA Zero /0.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! IF (Ientrp.NE.0) THEN @@ -168,7 +164,6 @@ module ssm_9_m DATA Zero /0.0d0/, Half /0.5d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Not_Quad = 0 @@ -352,9 +347,7 @@ module ssm_9_m ! *** Purpose -- Choose the next value of E' to be included in the ! *** grid for integrating over mu ! - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M IMPLICIT none @@ -368,7 +361,6 @@ module ssm_9_m type(SammyGridAccess)::grid call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! J2 = 0 @@ -451,9 +443,7 @@ module ssm_9_m SUBROUTINE Talk (Kadd, Maxx, Em, Eb, Ea, Cosb, Cosa, Ggg, Gggnew, & J1, J3, Csx, Epx, Ggx, Emind, Emins, Eminr, Totsig, & Ns, Niniso, Nnpar, N, Iso, Kwhich) - use EndfData_common_m - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero + use EndfData_common_m use SammyGridAccess_M IMPLICIT none @@ -469,7 +459,6 @@ module ssm_9_m DIMENSION Csx(*), Epx(*), Ggx(*), Totsig(*) call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) WRITE (6,10100) Kadd, Maxx, Kwhich diff --git a/sammy/src/ssm/mssm18.f90 b/sammy/src/ssm/mssm18.f90 index 20e9f45d674977a4de7dec81fc4df4919e235e17..d366b380b4db16e8ffd76471da471698a473b995 100644 --- a/sammy/src/ssm/mssm18.f90 +++ b/sammy/src/ssm/mssm18.f90 @@ -189,7 +189,6 @@ module ssm_18_m DATA Zero /0.0d0/, One /1.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) ! Y2dddd = Zero @@ -298,7 +297,6 @@ module ssm_18_m SUBROUTINE Reorder_Energy (derivs,Kdatmn, Kdatmx, Kkkdat) use fixedi_m use EndfData_common_m - use ifwrit_m, only : ktzero use SammyGridAccess_M use DerivativeHandler_M implicit none @@ -310,11 +308,9 @@ module ssm_18_m DATA Thous /1000.0d0/ call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToExpGrid(expData) maxExp = grid%getNumEnergies(expData) call auxGrid%initialize() - call auxGrid%setParameters(numcro, ktzero) call auxGrid%setToAuxGrid(expData) Jj = 1 diff --git a/sammy/src/the/SumIsoAndConvertToTrans_M.f90 b/sammy/src/the/SumIsoAndConvertToTrans_M.f90 index c700e32bc7fbb8e4d6edc2037c0899441acbb1bc..bf13ae39b3b9b46d1a1680d6cd1fd196bb78c84e 100644 --- a/sammy/src/the/SumIsoAndConvertToTrans_M.f90 +++ b/sammy/src/the/SumIsoAndConvertToTrans_M.f90 @@ -14,6 +14,7 @@ module SumIsoAndConvertToTrans_M procedure, pass(this) :: destroy => SumIsoAndConvertToTrans_destroy procedure, pass(this) :: sumAndConvert => SumIsoAndConvertToTrans_sumAndConvert procedure, pass(this) :: normalize => SumIsoAndConvertToTrans_normalize + procedure, pass(this) :: angPostProcessing => SumIsoAndConvertToTrans_angPostProcessing end type contains subroutine SumIsoAndConvertToTrans_initialize(this, broad, datSelf, hasSelf) @@ -119,6 +120,7 @@ contains real(kind=8)::em length = this%broadener%getLength() + call this%broadener%getData(crossData) IF ( this%Another_Process_Will_Happen) THEN jj = 0 if (this%haveSelf) jj = 1 @@ -127,7 +129,6 @@ contains return END IF - call this%broadener%getData(crossData) Iwarn = 0 do Jj = 1, this%broadener%getNumEnergyBroadened() if (jj.gt.length) exit @@ -165,4 +166,31 @@ contains END IF end subroutine + subroutine SumIsoAndConvertToTrans_angPostProcessing(this, numPar) + use exploc_common_m, only : A_Iprnbk, I_Iflnbk + use mxct27_m, only : Write_Cross_Sections + use fixedi_m, only : Numnbk + use lbro_common_m, only : Ynrmbk + use normalize_and_background + use AuxGridHelper_M + class(SumIsoAndConvertToTrans)::this + integer::numPar + + integer::iso, Jdat, bStart + type(DerivativeHandler)::crossData + real(kind=8)::em + + call this%broadener%getData(crossData) + IF (.NOT. this%Another_Process_Will_Happen.or. & + .NOT. this%Need_Isotopes) THEN + call crossData%sumOverIsotopes(numPar+1) + END IF + + if (.not.this%Another_Process_Will_Happen.and.Numnbk.gt.0.and.Ynrmbk) then + do Jdat = 1, this%broadener%getNumEnergyBroadened() + em = this%broadener%getEnergyBroadened(Jdat) + CALL Norm (A_Iprnbk , I_Iflnbk, Em, Jdat, crossData, numPar) + end do + end if + end subroutine SumIsoAndConvertToTrans_angPostProcessing end module SumIsoAndConvertToTrans_M diff --git a/sammy/src/the/mthe0.f90 b/sammy/src/the/mthe0.f90 index c3fb39413df1ed0ae21d4e79f19df1abc0a8c621..238866a228386b753254912239997059d49ac5c5 100644 --- a/sammy/src/the/mthe0.f90 +++ b/sammy/src/the/mthe0.f90 @@ -7,11 +7,11 @@ module mthe0_M ! SUBROUTINE Samthe_0 ! - use fixedi_m, only : K2reso, Nangle, Nres, Numiso, numcro, jwwwww + use fixedi_m, only : K2reso, Nangle, Nres, Numiso use ifwrit_m, only : Kdata, Kdecpl, Kfake, Kkkclq, Krmatx, & Ksolve, Ndatb, Ndat, & Ilzero, Itzero, Kcros, Kssmsc, & - kwcoul, Kkkdop, Kpoten, ktzero, & + kwcoul, Kpoten, & Ksindi, Kfake, Ks_Res use exploc_common_m use oopsch_common_m, only : Nowwww, Segmen @@ -99,11 +99,9 @@ module mthe0_M call zeroKCalc%driver%calcData%setNnsig(nnnsig) ! set up the energy grid on which the data are calculated - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) - call userGrid%initialize() - call userGrid%setParameters(numcro, ktzero) + call userGrid%initialize() call userGrid%setToExpGrid(expData) call setAuxGridOffset(1) ! reset starting point for auxillary grid call setAuxGridRowMax(0) @@ -169,8 +167,7 @@ module mthe0_M call Odfpcs ( Ngroup, zeroKCalc%driver%crossPerSpin) end if call zeroKCalc%writeMCData() ! save data for MC and set some SAMMY globals - CALL Write_Commons_Many - IF (Ksindi.GT.0 .and. Kcros.EQ.8) jwwwww = 5 + CALL Write_Commons_Many call grid%destroy() call userGrid%destroy() RETURN @@ -189,10 +186,10 @@ module mthe0_M calcDataInit, calcDataSelfInit use fixedi_m, only : Numiso, Ktruet, Kaddcr,lllmax, Kshift, Kaptur, Kpolar use ifwrit_m, only : Ilzero, Itzero, Kcros, Knocor, Kpoten, Krmatx, Ksolve, & - Kssmsc, kwcoul, Maxwel, Knocor, Kkkdop, Kkclqx, Kkkclq, & + Kssmsc, kwcoul, Maxwel, Knocor, Kkclqx, Kkkclq, & Kartgd, Kpiece, Kfinit, Ksitmp, Ksindi, Kaverg, Krecon, Kkkfis use fixedr_m, only : emax - use lbro_common_m, only : Yangle, Yaverg, Ydoppr, Yresol, Yssmsc, Ytrans, debug + use lbro_common_m, only : Yaverg, Ydoppr, Yresol, Yssmsc, Ytrans, debug use namfil_common_m, only : Faddcr implicit none logical::wantDeriv, wantSelfIndicate, doResShift @@ -272,7 +269,7 @@ module mthe0_M end if ! do we need to do anything else after 0k reconstruction - zeroKCalc%moreCorrections = Ydoppr.OR.Yresol.OR.Yangle.OR.Yssmsc.OR.Yaverg.OR. Maxwel.EQ.1 .OR. Knocor.EQ.1 + zeroKCalc%moreCorrections = Ydoppr.OR.Yresol.OR.Kcros.eq.7.or.Kcros.eq.11.OR.Yssmsc.OR.Yaverg.OR. Maxwel.EQ.1 .OR. Knocor.EQ.1 ! artifical grid if (Kartgd.EQ.1) then diff --git a/sammy/src/the/mthe1.f90 b/sammy/src/the/mthe1.f90 index e94ccacaa4444418a86a33bc1d2e905ed9c60ebf..5977807a144cadcec02018527a3b8fc897795f2f 100644 --- a/sammy/src/the/mthe1.f90 +++ b/sammy/src/the/mthe1.f90 @@ -8,9 +8,8 @@ module mthe1_m ! ! *** PURPOSE -- GENERATE Nnpar, and Difmax ! - use fixedi_m, only : Numcro use fixedr_m, only : Emax, Emin - use ifwrit_m, only : Kdecpl, Kscut, Ksolve, ktzero, Ndat + use ifwrit_m, only : Kdecpl, Kscut, Ksolve, Ndat use broad_common_m, only : Dopple, Iesopr use EndfData_common_m use SammyResonanceInfo_M @@ -38,8 +37,7 @@ module mthe1_m DATA Zero /0.0d0/, One /1.0d0/, Two /2.0d0/, Three /3.0d0/ ! ! - call gridAccess%initialize() - call gridAccess%setParameters(numcro, ktzero) + call gridAccess%initialize() call gridAccess%setToExpGrid(expData) call covData%clearIrrelevant() @@ -477,12 +475,12 @@ module mthe1_m ! SUBROUTINE Setthe(Nnnsig, Nnniso) ! - use fixedi_m, only : Jcros, Kjjjjj, Lllmax, & + use fixedi_m, only : Jcros, Lllmax, & Numcro, Numder, Numiso, & Jtrans use ifwrit_m, only : Kaverg, Kdebug, Kfinit, Kkkclq, Kcros, & Krmatx, Ksolve, Kssmsc, Ktrans, MIKE, Nfissl - use broad_common_m, only : Dopple + use broad_common_m, only : dopplerInfo IMPLICIT None integer::Nnnsig, Nnniso real(kind=8)::zero @@ -529,7 +527,7 @@ module mthe1_m END IF ! IF (Nnnsig.EQ.1 .AND. (Kssmsc.EQ.-1 .OR. Kssmsc.EQ.0) .AND. & - Kaverg.NE.2 .AND. (Dopple.EQ.Zero .AND. Kjjjjj.EQ.0)) THEN + Kaverg.NE.2 .AND. .not.dopplerInfo%wantBroaden) THEN ! *** If we can add up isotopes in XCT rather than waiting for ANG or ! *** FGM or SSM... ! *** ie for anything other than self-shielding, multiple-scattering, @@ -551,7 +549,7 @@ module mthe1_m IF (Kssmsc.EQ.-2) THEN ! *** for self-shielding but not multiple-scattering (if no Doppler) Nnnsig = 2 - IF (Dopple.EQ.Zero .AND. Kjjjjj.EQ.0) Nnniso = 1 + IF (.not.dopplerInfo%wantBroaden) Nnniso = 1 END IF IF (Kaverg.EQ.2) THEN ! *** for Bondarenko group averages @@ -589,13 +587,13 @@ module mthe1_m ! SUBROUTINE Orgniz ! - use fixedi_m, only : Jcros, Jtrans, Kjjjjj, Kkkdex, Kkkrsl, & + use fixedi_m, only : Jcros, Jtrans, Kkkdex, Kkkrsl, & Ktruet, Nudwhi, Numbgf, Numnbk, Numorr, & Numrpi use ifwrit_m, only : Kaverg, Kdebug, Kssmsc, Ntgrlq use fixedr_m, only : Dddeee - use broad_common_m, only : Ao2, Bo2, Co2, Dopple, Ncf - use lbro_common_m, only : Debug, Yangle, Yaverg, Ydoppr, Ynrmbk, & + use broad_common_m, only : Ao2, Bo2, Co2, Ncf, dopplerInfo + use lbro_common_m, only : Debug, Yaverg, Ydoppr, Ynrmbk, & Yresol, Yselfi, Yssmsc, Ytotrs, Ytrans IMPLICIT None @@ -614,14 +612,12 @@ module mthe1_m Yresol = False Ytotrs = False Ynrmbk = False - Yangle = False Yssmsc = False Yselfi = False Yaverg = False ! -! *** IF (WANT DOPPLER BROADENING) ydoppr = True - IF (Dopple.NE.Zero) Ydoppr = True - IF (Kjjjjj.NE.0 ) Ydoppr = True +! *** IF (WANT DOPPLER BROADENING) ydoppr = True + IF (dopplerInfo%wantBroaden) Ydoppr = True ! ! *** if (this is transmission) ytrans = True IF (Jcros.EQ.1 .AND. Jtrans.EQ.1) Ytrans = True @@ -653,9 +649,6 @@ module mthe1_m IF (Jcros.EQ.1 .AND. Jtrans.NE.1 .AND. Yresol) Ytotrs = True END IF ! -! *** if (this is angle-differential cross section) Yangle = True - IF (Jcros.EQ.7 .OR. Jcros.EQ.11) Yangle = True -! ! *** if (normalization and/or background) Ynrmbk = True IF (Numnbk.GT.0) Ynrmbk = True IF (Numbgf.GT.0) Ynrmbk = True diff --git a/sammy/src/udr/mudr0.f b/sammy/src/udr/mudr0.f index d7498467c6277d3f89afd77ca8aa9df4930323c9..aa0e71d230cb60488ead1ba6ffb5ab34cd02df9a 100644 --- a/sammy/src/udr/mudr0.f +++ b/sammy/src/udr/mudr0.f @@ -5,9 +5,7 @@ C SUBROUTINE Samudr_0 C use oops_common_m, only : Msize - use fixedi_m, only : Jwwwww, - * Nudmax, Nudtim, Nudwhi, Numudr - use ifwrit_m, only : Jjjdop, Kplotu + use fixedi_m, only : Nudmax, Nudtim, Nudwhi, Numudr use exploc_common_m use array_sizes_common_m use oopsch_common_m, only : Nowwww, Segmen @@ -38,7 +36,6 @@ C Nowwww = 0 C CALL Initix - IF (Kplotu.NE.0) Kplotu = 0 Kdatb = getNumAuxGridPoints() C C *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR Samudr @@ -82,9 +79,6 @@ C C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > C - Jwwwww = 4 -C - Jjjdop = 0 CALL Write_Commons_Many RETURN END diff --git a/sammy/src/udr/mudr1.f b/sammy/src/udr/mudr1.f index 8fe30aaf5e4361440b0fd3d1b2fbedaa39ce11a4..68d3e784d55a1202180b9377de39a3f4ccfec52c 100644 --- a/sammy/src/udr/mudr1.f +++ b/sammy/src/udr/mudr1.f @@ -11,9 +11,9 @@ C *** AND DERIVATIVES C use fixedi_m, only : Nudeng, Nudtim, * Numbgf, Numbgf, - * Numnbk, Nudwhi, numcro, Ntepnt, + * Numnbk, Nudwhi, Ntepnt, * numUsedPar - use ifwrit_m, only : ktzero, Jjjdop, Kdebug + use ifwrit_m, only : Kdebug use brdd_common_m, only : Ipk, Ipnts, Kc, Iup use mxct27_m use rsl3_m @@ -38,8 +38,7 @@ C integer::I, Ienpk, Igbpk, Itime, J, Jcro, nauxMax integer::Jwhich, Minudr, Mndets, Now, numEl, Ipar, ns - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToExpGrid(expData) numEl = grid%getNumEnergies(expData) @@ -81,7 +80,7 @@ C cx call timer_debug('d',0) C C ********* no integration possible - IF (Jjjdop.NE.1) THEN + IF (dopplerInfo%bType.ne.1) THEN Now = Now + 1 do Ipar = 0, numUsedPar do ns = 1, calcData%getNnnsig() diff --git a/sammy/src/udr/mudr4.f b/sammy/src/udr/mudr4.f index bb5d491f7ba32ccbd4fd037bb77101d203bddf05..a45b273275311f6f56ee1bdb59dfe3bb5b7511d4 100644 --- a/sammy/src/udr/mudr4.f +++ b/sammy/src/udr/mudr4.f @@ -10,13 +10,12 @@ C *** grid plus all the grid-points of the C *** user-defined functions C *** Output -- Array UdT_x of Dimension NudT_x C - use fixedi_m, only : Nudtim, Nudmax, Nudwhi, numcro, Numudr + use fixedi_m, only : Nudtim, Nudmax, Nudwhi, Numudr use fixedr_m, only : Dist use brdd_common_m, only : Ipnts, Kc use constn_common_m, only : Sm2 use EndfData_common_m, only : expData use AuxGridHelper_M, only : getNumAuxGridPoints - use ifwrit_m, only : ktzero use SammyGridAccess_M use rsl6_m use Udreso_m, only : Ccc, Tlow, Tup, Www @@ -33,8 +32,7 @@ C DATA Zero /0.0d0/, Half /0.5d0/, Four /4.0d0/ C T0 = Sm2*Dist/Dsqrt(Em) - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToAuxGrid(expData) C *** First, find max & min t needed for broadening Tmin = T0 diff --git a/sammy/src/xct/mxct0.f90 b/sammy/src/xct/mxct0.f90 index e7011c0d1c97408a4430cc953fc6f97c3bb22ad1..3a007cb9a5e272686b731e9db5886ac48a8c7cb5 100644 --- a/sammy/src/xct/mxct0.f90 +++ b/sammy/src/xct/mxct0.f90 @@ -56,8 +56,6 @@ module xct_m ! -------------------------------------------------------------- ! SUBROUTINE Newdat (derivs) - use fixedi_m, only : numcro - use ifwrit_m, only : ktzero use SammyGridAccess_M use EndfData_common_m use DerivativeHandler_M @@ -69,7 +67,6 @@ module xct_m ! call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToAuxGrid(expData) numEl = grid%getNumEnergies(expData) X = 0.010 diff --git a/sammy/src/xct/mxct27.f90 b/sammy/src/xct/mxct27.f90 index 74bfab950d837142c909edbc4f7ef69c9c385503..e13a483822a2ca7bfa522213614de1b3384b8a03 100644 --- a/sammy/src/xct/mxct27.f90 +++ b/sammy/src/xct/mxct27.f90 @@ -36,8 +36,8 @@ module mxct27_m ! SUBROUTINE Write_Cross_Sections (derivs, & Kkkkkk, Kkkmin, If_W_Selfin, derivsSelf) - use fixedi_m, only : Montec, Ndasig, numcro, numUsedPar - use ifwrit_m, only : Kksave, Kmsave, ktzero + use fixedi_m, only : Montec, Ndasig, numUsedPar + use ifwrit_m, only : Kksave, Kmsave use cbro_common_m, only : Filein, Filout use SammyGridAccess_M use EndfData_common_m, only : expData @@ -51,8 +51,7 @@ module mxct27_m ! optional derivsSelf IF (Montec.EQ.1) THEN - call grid%initialize() - call grid%setParameters(numcro, ktzero) + call grid%initialize() call grid%setToExpGrid(expData) niso = derivs%getUsedIsotopes() ! *** Here to write files for use in Monte Carlo simulations diff --git a/sammy/src/xxx/mxxx4.f90 b/sammy/src/xxx/mxxx4.f90 index afbe4e24547fd6c4f5d7559d801a6ad0fb8746fd..1ee7e2694b766ed53b03bbe1a908f0b8e20c64fc 100644 --- a/sammy/src/xxx/mxxx4.f90 +++ b/sammy/src/xxx/mxxx4.f90 @@ -60,7 +60,6 @@ module xxx4 ! *** Pi90 = 28.647, Pi180=57.296 ! call grid%initialize() - call grid%setParameters(numcro, ktzero) call grid%setToExpGrid(expData) e1 = grid%getEnergy(1, expData) numEl = grid%getNumEnergies(expData)