From bd64005ae7c8dce7403741224de7a0a554f5d894 Mon Sep 17 00:00:00 2001 From: Ilham Variansyah Date: Sat, 17 Aug 2024 17:25:10 +0700 Subject: [PATCH 1/2] remove dsm temporarily --- mcdc/__init__.py | 1 - mcdc/card.py | 7 - mcdc/global_.py | 3 - mcdc/input_.py | 73 +---- mcdc/kernel.py | 429 ++------------------------ mcdc/loop.py | 10 - mcdc/main.py | 8 +- mcdc/type_.py | 58 +--- test/regression/dsm_azurv1/answer.h5 | Bin 265800 -> 0 bytes test/regression/dsm_azurv1/input.py | 37 --- test/regression/dsm_lattice/answer.h5 | Bin 205048 -> 0 bytes test/regression/dsm_lattice/c5g7.h5 | Bin 49104 -> 0 bytes test/regression/dsm_lattice/input.py | 49 --- 13 files changed, 37 insertions(+), 638 deletions(-) delete mode 100644 test/regression/dsm_azurv1/answer.h5 delete mode 100644 test/regression/dsm_azurv1/input.py delete mode 100644 test/regression/dsm_lattice/answer.h5 delete mode 100644 test/regression/dsm_lattice/c5g7.h5 delete mode 100644 test/regression/dsm_lattice/input.py diff --git a/mcdc/__init__.py b/mcdc/__init__.py index c902b276..c36bea2c 100644 --- a/mcdc/__init__.py +++ b/mcdc/__init__.py @@ -18,7 +18,6 @@ iQMC, weight_roulette, IC_generator, - dsm, uq, reset, domain_decomposition, diff --git a/mcdc/card.py b/mcdc/card.py index fa53a1fa..3a989e55 100644 --- a/mcdc/card.py +++ b/mcdc/card.py @@ -54,9 +54,6 @@ def __init__(self, G=1, J=0): self.chi_s = np.zeros([G, G]) self.chi_p = np.zeros([G, G]) self.chi_d = np.zeros([J, G]) - self.sensitivity = False - self.sensitivity_ID = 0 - self.dsm_Np = 1.0 self.uq = False self.flags = [] self.distribution = "" @@ -85,7 +82,6 @@ def __init__(self, N_nuclide, G=1, J=0): self.nu_f = np.zeros(G) self.chi_s = np.zeros([G, G]) self.chi_p = np.zeros([G, G]) - self.sensitivity = False self.uq = False self.flags = [] self.distribution = "" @@ -167,9 +163,6 @@ def __init__(self): self.nx = 0.0 self.ny = 0.0 self.nz = 0.0 - self.sensitivity = False - self.sensitivity_ID = 0 - self.dsm_Np = 1.0 def _create_halfspace(self, positive): region = RegionCard("halfspace") diff --git a/mcdc/global_.py b/mcdc/global_.py index 7de89fbb..8df838f7 100644 --- a/mcdc/global_.py +++ b/mcdc/global_.py @@ -78,8 +78,6 @@ def reset(self): # Below are parameters not copied to mcdc.setting "bank_active_buff": 100, "bank_census_buff": 1.0, - # TODO: Move to technique - "N_sensitivity": 0, } self.technique = { @@ -158,7 +156,6 @@ def reset(self): "IC_precursor_density_max": 0.0, "IC_cycle_stretch": 1.0, "branchless_collision": False, - "dsm_order": 1, "uq": False, } diff --git a/mcdc/input_.py b/mcdc/input_.py index 02c14c77..b40e92f3 100644 --- a/mcdc/input_.py +++ b/mcdc/input_.py @@ -52,8 +52,6 @@ def nuclide( chi_d=None, speed=None, decay=None, - sensitivity=False, - dsm_Np=1.0, ): """ Create a nuclide @@ -80,11 +78,6 @@ def nuclide( Energy group speed [cm/s]. decay : numpy.ndarray (1D), optional Precursor group decay constant [/s]. - sensitivity : bool, optional - Set to `True` to calculate sensitivities to the nuclide. - dsm_Np : float - Average number of derivative particles produced at each - sensitivity nuclide collision. Returns ------- @@ -208,20 +201,6 @@ def nuclide( if np.sum(card.chi_d[dg, :]) > 0.0: card.chi_d[dg, :] /= np.sum(card.chi_d[dg, :]) - # Sensitivity setup - if sensitivity: - # Set flag - card.sensitivity = True - global_.input_deck.technique["sensitivity"] = True - global_.input_deck.technique["weighted_emission"] = False - - # Set ID - global_.input_deck.setting["N_sensitivity"] += 1 - card.sensitivity_ID = global_.input_deck.setting["N_sensitivity"] - - # Set dsm_Np - card.dsm_Np = dsm_Np - # Add to deck global_.input_deck.nuclides.append(card) @@ -240,8 +219,6 @@ def material( chi_d=None, speed=None, decay=None, - sensitivity=False, - dsm_Np=1.0, ): """ Create a material @@ -273,12 +250,6 @@ def material( Energy group speed [cm/s]. decay : numpy.ndarray (1D), optional Precursor group decay constant [/s]. - sensitivity : bool, optional - Set to `True` to calculate sensitivities to the material - (only relevant for single-nuclide material). - dsm_Np : float - Average number of derivative particles produced at each - sensitivity material collision (only relevant for single_nuclide material). Returns ------- @@ -303,8 +274,6 @@ def material( chi_d, speed, decay, - sensitivity, - dsm_Np, ) nuclides = [[card_nuclide, 1.0]] @@ -379,7 +348,7 @@ def material( # Set ID card.ID = len(global_.input_deck.materials) - # Calculate basic XS and determine sensitivity flag + # Calculate basic XS for i in range(N_nuclide): nuc = nuclides[i][0] density = nuclides[i][1] @@ -390,8 +359,6 @@ def material( card.scatter += nuc.scatter * density card.fission += nuc.fission * density card.total += nuc.total * density - card.sensitivity += nuc.sensitivity * density - card.sensitivity = bool(card.sensitivity) # Calculate effective speed # Current approach: weighted by nuclide macroscopic total cross section @@ -450,7 +417,7 @@ def material( return card -def surface(type_, bc="interface", sensitivity=False, dsm_Np=1.0, **kw): +def surface(type_, bc="interface", **kw): """ Create a surface to define the region of a cell. @@ -461,11 +428,6 @@ def surface(type_, bc="interface", sensitivity=False, dsm_Np=1.0, **kw): Surface type. bc : {"interface", "vacuum", "reflective"} Surface boundary condition. - sensitivity : bool, optional - Set to `True` to calculate sensitivities to the surface position. - dsm_Np : int - Average number of derivative particles produced at each - sensitivity surface crossing. Other Parameters ---------------- @@ -538,20 +500,6 @@ def surface(type_, bc="interface", sensitivity=False, dsm_Np=1.0, **kw): ) card.boundary_type = bc - # Sensitivity - if sensitivity: - # Set flag - card.sensitivity = True - global_.input_deck.technique["sensitivity"] = True - global_.input_deck.technique["weighted_emission"] = False - - # Set ID - global_.input_deck.setting["N_sensitivity"] += 1 - card.sensitivity_ID = global_.input_deck.setting["N_sensitivity"] - - # Set dsm_Np - card.dsm_Np = dsm_Np - # ========================================================================== # Surface attributes # ========================================================================== @@ -1776,22 +1724,6 @@ def IC_generator( card_setting["N_active"] = N_cycle -def dsm(order=1): - """ - Direct sensitivity method - - Parameters - ---------- - order : int, optional - order of the sensitivity to probe, by default 1 - """ - - card = global_.input_deck.technique - if order > 2: - print_error("DSM currently only supports up to second-order sensitivities") - card["dsm_order"] = order - - def uq(**kw): """ Activate uncertainty quantification. @@ -1950,7 +1882,6 @@ def make_particle_bank(size): ("g", np.uint64), ("E", np.float64), ("w", np.float64), - ("sensitivity_ID", np.int64), ("rng_seed", np.uint64), ] iqmc_struct = [("w", np.float64, (1,))] diff --git a/mcdc/kernel.py b/mcdc/kernel.py index a02f321f..8992beb0 100644 --- a/mcdc/kernel.py +++ b/mcdc/kernel.py @@ -654,7 +654,6 @@ def source_particle_dd(seed, mcdc): P["uz"] = uz P["g"] = g P["w"] = 1 - P["sensitivity_ID"] = 0 return P @@ -909,8 +908,6 @@ def source_particle(seed, mcdc): P["E"] = E P["w"] = 1.0 - P["sensitivity_ID"] = 0 - return P @@ -987,7 +984,6 @@ def get_particle(P, bank, mcdc): P["iqmc"]["w"] = P_rec["iqmc"]["w"] P["alive"] = True - P["sensitivity_ID"] = P_rec["sensitivity_ID"] # Set default IDs and event P["material_ID"] = -1 @@ -1644,7 +1640,6 @@ def copy_recordlike(P_new, P): P_new["E"] = P["E"] P_new["w"] = P["w"] P_new["rng_seed"] = P["rng_seed"] - P_new["sensitivity_ID"] = P["sensitivity_ID"] P_new["iqmc"]["w"] = P["iqmc"]["w"] copy_track_data(P_new, P) @@ -1687,7 +1682,6 @@ def copy_particle(P_new, P): P_new["surface_ID"] = P["surface_ID"] P_new["translation"] = P["translation"] P_new["event"] = P["event"] - P_new["sensitivity_ID"] = P["sensitivity_ID"] P_new["rng_seed"] = P["rng_seed"] P_new["iqmc"]["w"] = P["iqmc"]["w"] copy_track_data(P_new, P) @@ -2175,7 +2169,6 @@ def score_tracklength(P, distance, mcdc): material = mcdc["materials"][P["material_ID"]] # Get indices - s = P["sensitivity_ID"] t, x, y, z, outside = mesh_get_index(P, tally["mesh"]) mu, azi = mesh_get_angular_index(P, tally["mesh"]) g, outside_energy = mesh_get_energy_index(P, tally["mesh"], mcdc) @@ -2187,20 +2180,20 @@ def score_tracklength(P, distance, mcdc): # Score flux = distance * P["w"] if tally["flux"]: - score_flux(s, g, t, x, y, z, mu, azi, flux, tally["score"]["flux"]) + score_flux(g, t, x, y, z, mu, azi, flux, tally["score"]["flux"]) if tally["density"]: flux /= get_particle_speed(P, mcdc) - score_flux(s, g, t, x, y, z, mu, azi, flux, tally["score"]["density"]) + score_flux(g, t, x, y, z, mu, azi, flux, tally["score"]["density"]) if tally["fission"]: flux *= get_MacroXS(XS_FISSION, material, P, mcdc) - score_flux(s, g, t, x, y, z, mu, azi, flux, tally["score"]["fission"]) + score_flux(g, t, x, y, z, mu, azi, flux, tally["score"]["fission"]) if tally["total"]: flux *= get_MacroXS(XS_TOTAL, material, P, mcdc) - score_flux(s, g, t, x, y, z, mu, azi, flux, tally["score"]["total"]) + score_flux(g, t, x, y, z, mu, azi, flux, tally["score"]["total"]) if tally["current"]: - score_current(s, g, t, x, y, z, flux, P, tally["score"]["current"]) + score_current(g, t, x, y, z, flux, P, tally["score"]["current"]) if tally["eddington"]: - score_eddington(s, g, t, x, y, z, flux, P, tally["score"]["eddington"]) + score_eddington(g, t, x, y, z, flux, P, tally["score"]["eddington"]) @njit @@ -2208,7 +2201,6 @@ def score_exit(P, x, mcdc): tally = mcdc["tally"] material = mcdc["materials"][P["material_ID"]] - s = P["sensitivity_ID"] mu, azi = mesh_get_angular_index(P, tally["mesh"]) g, outside_energy = mesh_get_energy_index(P, tally["mesh"], mcdc) @@ -2218,27 +2210,27 @@ def score_exit(P, x, mcdc): # Score flux = P["w"] / abs(P["ux"]) - score_flux(s, g, 0, x, 0, 0, mu, azi, flux, tally["score"]["exit"]) + score_flux(g, 0, x, 0, 0, mu, azi, flux, tally["score"]["exit"]) @njit -def score_flux(s, g, t, x, y, z, mu, azi, flux, score): +def score_flux(g, t, x, y, z, mu, azi, flux, score): # score["bin"][s, g, t, x, y, z, mu, azi] += flux - adapt.global_add(score["bin"], (s, g, t, x, y, z, mu, azi), flux) + adapt.global_add(score["bin"], (g, t, x, y, z, mu, azi), flux) @njit -def score_current(s, g, t, x, y, z, flux, P, score): +def score_current(g, t, x, y, z, flux, P, score): # score["bin"][s, g, t, x, y, z, 0] += flux * P["ux"] # score["bin"][s, g, t, x, y, z, 1] += flux * P["uy"] # score["bin"][s, g, t, x, y, z, 2] += flux * P["uz"] - adapt.global_add(score["bin"], (s, g, t, x, y, z, 0), flux * P["ux"]) - adapt.global_add(score["bin"], (s, g, t, x, y, z, 1), flux * P["uy"]) - adapt.global_add(score["bin"], (s, g, t, x, y, z, 2), flux * P["uz"]) + adapt.global_add(score["bin"], (g, t, x, y, z, 0), flux * P["ux"]) + adapt.global_add(score["bin"], (g, t, x, y, z, 1), flux * P["uy"]) + adapt.global_add(score["bin"], (g, t, x, y, z, 2), flux * P["uz"]) @njit -def score_eddington(s, g, t, x, y, z, flux, P, score): +def score_eddington(g, t, x, y, z, flux, P, score): ux = P["ux"] uy = P["uy"] uz = P["uz"] @@ -2248,12 +2240,12 @@ def score_eddington(s, g, t, x, y, z, flux, P, score): # score["bin"][s, g, t, x, y, z, 3] += flux * uy * uy # score["bin"][s, g, t, x, y, z, 4] += flux * uy * uz # score["bin"][s, g, t, x, y, z, 5] += flux * uz * uz - adapt.global_add(score["bin"], (s, g, t, x, y, z, 0), flux * ux * ux) - adapt.global_add(score["bin"], (s, g, t, x, y, z, 1), flux * ux * uy) - adapt.global_add(score["bin"], (s, g, t, x, y, z, 2), flux * ux * uz) - adapt.global_add(score["bin"], (s, g, t, x, y, z, 3), flux * uy * uy) - adapt.global_add(score["bin"], (s, g, t, x, y, z, 4), flux * uy * uz) - adapt.global_add(score["bin"], (s, g, t, x, y, z, 5), flux * uz * uz) + adapt.global_add(score["bin"], (g, t, x, y, z, 0), flux * ux * ux) + adapt.global_add(score["bin"], (g, t, x, y, z, 1), flux * ux * uy) + adapt.global_add(score["bin"], (g, t, x, y, z, 2), flux * ux * uz) + adapt.global_add(score["bin"], (g, t, x, y, z, 3), flux * uy * uy) + adapt.global_add(score["bin"], (g, t, x, y, z, 4), flux * uy * uz) + adapt.global_add(score["bin"], (g, t, x, y, z, 5), flux * uz * uz) @njit @@ -2800,9 +2792,6 @@ def surface_crossing(P, prog): # Small shift to ensure crossing surface_shift(P, surface, trans, mcdc) - # Record old material for sensitivity quantification - material_ID_old = P["material_ID"] - # Tally particle exit if mcdc["tally"]["exit"] and not P["alive"]: # Reflectance if P["surface_ID"] == 0, else transmittance @@ -2818,17 +2807,6 @@ def surface_crossing(P, prog): trans = trans_struct["values"] P["cell_ID"] = get_particle_cell(P, UNIVERSE_ROOT, trans, mcdc) - # Sensitivity quantification for surface? - if surface["sensitivity"] and ( - P["sensitivity_ID"] == 0 - or mcdc["technique"]["dsm_order"] == 2 - and P["sensitivity_ID"] <= mcdc["setting"]["N_sensitivity"] - ): - material_ID_new = get_particle_material(P, mcdc) - if material_ID_old != material_ID_new: - # Sample derivative source particles - sensitivity_surface(P, surface, material_ID_old, material_ID_new, prog) - # ============================================================================= # Collision @@ -2940,7 +2918,6 @@ def sample_phasespace_scattering(P, material, P_new, mcdc): P_new["y"] = P["y"] P_new["z"] = P["z"] P_new["t"] = P["t"] - P_new["sensitivity_ID"] = P["sensitivity_ID"] if mcdc["setting"]["mode_MG"]: scattering_MG(P, material, P_new) @@ -2955,7 +2932,6 @@ def sample_phasespace_scattering_nuclide(P, nuclide, P_new, mcdc): P_new["y"] = P["y"] P_new["z"] = P["z"] P_new["t"] = P["t"] - P_new["sensitivity_ID"] = P["sensitivity_ID"] scattering_MG(P, nuclide, P_new) @@ -3230,7 +3206,6 @@ def sample_phasespace_fission(P, material, P_new, mcdc): P_new["y"] = P["y"] P_new["z"] = P["z"] P_new["t"] = P["t"] - P_new["sensitivity_ID"] = P["sensitivity_ID"] # Sample isotropic direction P_new["ux"], P_new["uy"], P_new["uz"] = sample_isotropic_direction(P_new) @@ -3291,7 +3266,6 @@ def sample_phasespace_fission_nuclide(P, nuclide, P_new, mcdc): P_new["y"] = P["y"] P_new["z"] = P["z"] P_new["t"] = P["t"] - P_new["sensitivity_ID"] = P["sensitivity_ID"] # Sample isotropic direction P_new["ux"], P_new["uy"], P_new["uz"] = sample_isotropic_direction(P_new) @@ -3516,346 +3490,6 @@ def weight_roulette(P, mcdc): P["alive"] = False -# ============================================================================== -# Sensitivity quantification (Derivative Source Method) -# ============================================================================= - - -@njit -def sensitivity_surface(P, surface, material_ID_old, material_ID_new, prog): - - mcdc = adapt.device(prog) - - # Sample number of derivative sources - xi = surface["dsm_Np"] - if xi != 1.0: - Np = int(math.floor(xi + rng(P))) - else: - Np = 1 - - # Terminate and put the current particle into the secondary bank - P["alive"] = False - adapt.add_active(copy_record(P), prog) - - # Get sensitivity ID - ID = surface["sensitivity_ID"] - if mcdc["technique"]["dsm_order"] == 2: - ID1 = min(P["sensitivity_ID"], ID) - ID2 = max(P["sensitivity_ID"], ID) - ID = get_DSM_ID(ID1, ID2, mcdc["setting"]["N_sensitivity"]) - - # Get materials - material_old = mcdc["materials"][material_ID_old] - material_new = mcdc["materials"][material_ID_new] - - # Determine the plus and minus components and then their weight signs - trans = P["translation"] - sign_origin = surface_normal_component(P, surface, trans) - if sign_origin > 0.0: - # New is +, old is - - sign_new = -1.0 - sign_old = 1.0 - else: - sign_new = 1.0 - sign_old = -1.0 - - # Get XS - g = P["g"] - SigmaT_old = material_old["total"][g] - SigmaT_new = material_new["total"][g] - SigmaS_old = material_old["scatter"][g] - SigmaS_new = material_new["scatter"][g] - SigmaF_old = material_old["fission"][g] - SigmaF_new = material_new["fission"][g] - nu_s_old = material_old["nu_s"][g] - nu_s_new = material_new["nu_s"][g] - nu_old = material_old["nu_f"][g] - nu_new = material_new["nu_f"][g] - nuSigmaS_old = nu_s_old * SigmaS_old - nuSigmaS_new = nu_s_new * SigmaS_new - nuSigmaF_old = nu_old * SigmaF_old - nuSigmaF_new = nu_new * SigmaF_new - - # Get source type probabilities - delta = -(SigmaT_old * sign_old + SigmaT_new * sign_new) - scatter = nuSigmaS_old * sign_old + nuSigmaS_new * sign_new - fission = nuSigmaF_old * sign_old + nuSigmaF_new * sign_new - p_delta = abs(delta) - p_scatter = abs(scatter) - p_fission = abs(fission) - p_total = p_delta + p_scatter + p_fission - - # Get inducing flux - # Apply constant flux approximation for tangent direction - # [Dupree 2002, Eq. (7.39)] - mu = abs(sign_origin) - epsilon = 0.01 - if mu < epsilon: - mu = epsilon / 2 - flux = P["w"] / mu - - # Base weight - w_hat = p_total * flux / xi - - # Sample the derivative sources - for n in range(Np): - # Create new particle - P_new = split_particle(P) - - # Sample source type - xi = rng(P) * p_total - tot = p_delta - if tot > xi: - # Delta source - sign_delta = delta / p_delta - P_new["w"] = w_hat * sign_delta - else: - tot += p_scatter - if tot > xi: - # Scattering source - total_scatter = nuSigmaS_old + nuSigmaS_new - w_s = w_hat * total_scatter / p_scatter - - # Sample if it is from + or - component - if nuSigmaS_old > rng(P) * total_scatter: - sample_phasespace_scattering(P, material_old, P_new, mcdc) - P_new["w"] = w_s * sign_old - else: - sample_phasespace_scattering(P, material_new, P_new, mcdc) - P_new["w"] = w_s * sign_new - else: - # Fission source - total_fission = nuSigmaF_old + nuSigmaF_new - w_f = w_hat * total_fission / p_fission - - # Sample if it is from + or - component - if nuSigmaF_old > rng(P) * total_fission: - sample_phasespace_fission(P, material_old, P_new, mcdc) - P_new["w"] = w_f * sign_old - else: - sample_phasespace_fission(P, material_new, P_new, mcdc) - P_new["w"] = w_f * sign_new - - # Assign sensitivity_ID - P_new["sensitivity_ID"] = ID - - # Shift back if needed to ensure crossing - sign = surface_normal_component(P_new, surface, trans) - if sign_origin * sign > 0.0: - # Get surface normal - nx, ny, nz = surface_normal(P_new, surface, trans) - - # The shift - if sign > 0.0: - P_new["x"] -= nx * 2 * SHIFT - P_new["y"] -= ny * 2 * SHIFT - P_new["z"] -= nz * 2 * SHIFT - else: - P_new["x"] += nx * 2 * SHIFT - P_new["y"] += ny * 2 * SHIFT - P_new["z"] += nz * 2 * SHIFT - - # Put the current particle into the secondary bank - adapt.add_active(P_new, prog) - - # Sample potential second-order sensitivity particles? - if mcdc["technique"]["dsm_order"] < 2 or P["sensitivity_ID"] > 0: - return - - # Get total probability - p_total = 0.0 - for material in [material_new, material_old]: - if material["sensitivity"]: - N_nuclide = material["N_nuclide"] - for i in range(N_nuclide): - nuclide = mcdc["nuclides"][material["nuclide_IDs"][i]] - if nuclide["sensitivity"]: - sigmaT = nuclide["total"][g] - sigmaS = nuclide["scatter"][g] - sigmaF = nuclide["fission"][g] - nu_s = nuclide["nu_s"][g] - nu = nuclide["nu_f"][g] - nusigmaS = nu_s * sigmaS - nusigmaF = nu * sigmaF - total = sigmaT + nusigmaS + nusigmaF - p_total += total - - # Base weight - w = p_total * flux / surface["dsm_Np"] - - # Sample source - for n in range(Np): - source_obtained = False - - # Create new particle - P_new = split_particle(P) - - # Sample term - xi = rng(P_new) * p_total - tot = 0.0 - - for idx in range(2): - - if idx == 0: - material_ID = material_ID_old - sign = sign_old - else: - material_ID = material_ID_new - sign = sign_new - - material = mcdc["materials"][material_ID] - if material["sensitivity"]: - N_nuclide = material["N_nuclide"] - for i in range(N_nuclide): - nuclide = mcdc["nuclides"][material["nuclide_IDs"][i]] - if nuclide["sensitivity"]: - # Source ID - ID1 = min(nuclide["sensitivity_ID"], surface["sensitivity_ID"]) - ID2 = max(nuclide["sensitivity_ID"], surface["sensitivity_ID"]) - ID_source = get_DSM_ID( - ID1, ID2, mcdc["setting"]["N_sensitivity"] - ) - - sigmaT = nuclide["total"][g] - sigmaS = nuclide["scatter"][g] - sigmaF = nuclide["fission"][g] - nu_s = nuclide["nu_s"][g] - nu = nuclide["nu_f"][g] - nusigmaS = nu_s * sigmaS - nusigmaF = nu * sigmaF - - tot += sigmaT - if tot > xi: - # Delta source - P_new["w"] = -w * sign - P_new["sensitivity_ID"] = ID_source - adapt.add_active(P_new, prog) - source_obtained = True - else: - P_new["w"] = w * sign - - tot += nusigmaS - if tot > xi: - # Scattering source - sample_phasespace_scattering_nuclide( - P, nuclide, P_new, mcdc - ) - P_new["sensitivity_ID"] = ID_source - adapt.add_active(P_new, prog) - source_obtained = True - else: - tot += nusigmaF - if tot > xi: - # Fission source - sample_phasespace_fission_nuclide( - P, nuclide, P_new, mcdc - ) - P_new["sensitivity_ID"] = ID_source - adapt.add_active(P_new, prog) - source_obtained = True - if source_obtained: - break - if source_obtained: - break - - -@njit -def sensitivity_material(P, prog): - - mcdc = adapt.device(prog) - - # The incident particle is already terminated - - # Get material - material = mcdc["materials"][P["material_ID"]] - - # Check if sensitivity nuclide is sampled - g = P["g"] - SigmaT = material["total"][g] - N_nuclide = material["N_nuclide"] - if N_nuclide == 1: - nuclide = mcdc["nuclides"][material["nuclide_IDs"][0]] - else: - xi = rng(P) * SigmaT - tot = 0.0 - for i in range(N_nuclide): - nuclide = mcdc["nuclides"][material["nuclide_IDs"][i]] - density = material["nuclide_densities"][i] - tot += density * nuclide["total"][g] - if xi < tot: - break - if not nuclide["sensitivity"]: - return - - # Sample number of derivative sources - xi = nuclide["dsm_Np"] - if xi != 1.0: - Np = int(math.floor(xi + rng(P))) - else: - Np = 1 - - # Get sensitivity ID - ID = nuclide["sensitivity_ID"] - double = False - if mcdc["technique"]["dsm_order"] == 2: - ID1 = min(P["sensitivity_ID"], ID) - ID2 = max(P["sensitivity_ID"], ID) - ID = get_DSM_ID(ID1, ID2, mcdc["setting"]["N_sensitivity"]) - if ID1 == ID2: - double = True - - # Undo implicit capture - if mcdc["technique"]["implicit_capture"]: - SigmaC = material["capture"][g] - P["w"] *= SigmaT / (SigmaT - SigmaC) - - # Get XS - g = P["g"] - sigmaT = nuclide["total"][g] - sigmaS = nuclide["scatter"][g] - sigmaF = nuclide["fission"][g] - nu_s = nuclide["nu_s"][g] - nu = nuclide["nu_f"][g] - nusigmaS = nu_s * sigmaS - nusigmaF = nu * sigmaF - - # Base weight - total = sigmaT + nusigmaS + nusigmaF - w = total * P["w"] / sigmaT / xi - - # Double if it's self-second-order - if double: - w *= 2 - - # Sample the derivative sources - for n in range(Np): - # Create new particle - P_new = split_particle(P) - - # Sample source type - xi = rng(P_new) * total - tot = sigmaT - if tot > xi: - # Delta source - P_new["w"] = -w - else: - P_new["w"] = w - - tot += nusigmaS - if tot > xi: - # Scattering source - sample_phasespace_scattering_nuclide(P, nuclide, P_new, mcdc) - else: - # Fission source - sample_phasespace_fission_nuclide(P, nuclide, P_new, mcdc) - - # Assign sensitivity_ID - P_new["sensitivity_ID"] = ID - - # Put the current particle into the secondary bank - adapt.add_active(P_new, prog) - - # ============================================================================== # Particle tracker # ============================================================================== @@ -3890,29 +3524,6 @@ def allocate_pid(P, mcdc): P["track_pid"] = adapt.global_add(mcdc["particle_track_particle_ID"], 0, 1) -# ============================================================================== -# Derivative Source Method (DSM) -# ============================================================================== - - -@njit -def get_DSM_ID(ID1, ID2, Np): - # First-order sensitivity - if ID1 == 0: - return ID2 - - # Self second-order - if ID1 == ID2: - return Np + ID1 - - # Cross second-order - ID1 -= 1 - ID2 -= 1 - return int( - 2 * Np + (Np * (Np - 1) / 2) - (Np - ID1) * ((Np - ID1) - 1) / 2 + ID2 - ID1 - ) - - # ============================================================================= # Continuous Energy Physics # ============================================================================= diff --git a/mcdc/loop.py b/mcdc/loop.py index a614bc19..a3d9b04b 100644 --- a/mcdc/loop.py +++ b/mcdc/loop.py @@ -498,15 +498,6 @@ def step_particle(P, prog): elif event == EVENT_FISSION: kernel.fission(P, prog) - # Sensitivity quantification for nuclide? - material = mcdc["materials"][P["material_ID"]] - if material["sensitivity"] and ( - P["sensitivity_ID"] == 0 - or mcdc["technique"]["dsm_order"] == 2 - and P["sensitivity_ID"] <= mcdc["setting"]["N_sensitivity"] - ): - kernel.sensitivity_material(P, prog) - # Surface crossing if event & EVENT_SURFACE: kernel.surface_crossing(P, prog) @@ -565,7 +556,6 @@ def generate_precursor_particle(DNP, particle_idx, seed_work, prog): P_new["rng_seed"] = part_seed P_new["alive"] = True P_new["w"] = 1.0 - P_new["sensitivity_ID"] = 0 # Set position P_new["x"] = DNP["x"] diff --git a/mcdc/main.py b/mcdc/main.py index d47f7e91..06b9a0c8 100644 --- a/mcdc/main.py +++ b/mcdc/main.py @@ -428,7 +428,7 @@ def prepare(): N_nuclide = len(input_deck.nuclides) for i in range(N_nuclide): # General data - for name in ["ID", "fissionable", "sensitivity", "sensitivity_ID", "dsm_Np"]: + for name in ["ID", "fissionable"]: copy_field(mcdc["nuclides"][i], input_deck.nuclides[i], name) # MG data @@ -765,12 +765,6 @@ def prepare(): mcdc["technique"]["iqmc"]["score"][name] = value # minimum particle weight iqmc["w_min"] = 1e-13 - # ========================================================================= - # Derivative Source Method - # ========================================================================= - - # Threshold - mcdc["technique"]["dsm_order"] = input_deck.technique["dsm_order"] # ========================================================================= # Variance Deconvolution - UQ diff --git a/mcdc/type_.py b/mcdc/type_.py index 43b0e333..72592ca3 100644 --- a/mcdc/type_.py +++ b/mcdc/type_.py @@ -184,7 +184,6 @@ def make_type_particle(input_deck): ("surface_ID", int64), ("translation", float64, (3,)), ("event", int64), - ("sensitivity_ID", int64), ("rng_seed", uint64), ] @@ -223,7 +222,6 @@ def make_type_particle_record(input_deck): ("g", uint64), ("E", float64), ("w", float64), - ("sensitivity_ID", int64), ("rng_seed", uint64), ] @@ -348,9 +346,6 @@ def make_type_nuclide(input_deck): struct = [ ("ID", int64), ("fissionable", bool_), - ("sensitivity", bool_), - ("sensitivity_ID", int64), - ("dsm_Np", float64), ("uq", bool_), ] @@ -446,7 +441,6 @@ def make_type_material(input_deck): struct = [ ("ID", int64), ("N_nuclide", int64), - ("sensitivity", bool_), ("nuclide_IDs", int64, (Nmax_nuclide,)), ("nuclide_densities", float64, (Nmax_nuclide,)), ("uq", bool_), @@ -506,9 +500,6 @@ def make_type_surface(input_deck): ("nx", float64), ("ny", float64), ("nz", float64), - ("sensitivity", bool_), - ("sensitivity_ID", int64), - ("dsm_Np", float64), ] ) @@ -659,14 +650,6 @@ def make_type_source(input_deck): def make_type_tally(input_deck): global tally - # Number of sensitivitys parameters - N_sensitivity = input_deck.setting["N_sensitivity"] - - # Number of tally scores - Ns = 1 + N_sensitivity - if input_deck.technique["dsm_order"] == 2: - Ns = 1 + 2 * N_sensitivity + int(0.5 * N_sensitivity * (N_sensitivity - 1)) - # Get card card = input_deck.tally @@ -688,13 +671,13 @@ def make_type_score(shape): # Scores and shapes scores_shapes = [ - ["flux", (Ns, Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], - ["density", (Ns, Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], - ["fission", (Ns, Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], - ["total", (Ns, Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], - ["current", (Ns, Ng, Nt, Nx, Ny, Nz, 3)], - ["eddington", (Ns, Ng, Nt, Nx, Ny, Nz, 6)], - ["exit", (Ns, Ng, Nt, 2, Ny, Nz, Nmu, N_azi)], + ["flux", (Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], + ["density", (Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], + ["fission", (Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], + ["total", (Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], + ["current", (Ng, Nt, Nx, Ny, Nz, 3)], + ["eddington", (Ng, Nt, Nx, Ny, Nz, 6)], + ["exit", (Ng, Nt, 2, Ny, Nz, Nmu, N_azi)], ] # Add score flags to structure @@ -760,8 +743,6 @@ def make_type_setting(deck): ("IC_file", bool_), ("IC_file_name", str_), ("N_precursor", uint64), - # TODO: Move to technique - ("N_sensitivity", uint64), ] # Finalize setting type @@ -990,14 +971,6 @@ def make_type_technique(input_deck): ("IC_fission", float64), ] - # ========================================================================= - # Derivative Source Method - # ========================================================================= - - struct += [ - ("dsm_order", int64), - ] - # ========================================================================= # Variance Deconvolution # ========================================================================= @@ -1022,9 +995,6 @@ def make_type_uq_score(shape): # Tally estimator flags struct = [] - # Number of tally scores - Ns = 1 + input_deck.setting["N_sensitivity"] - # Tally card tally_card = input_deck.tally @@ -1033,13 +1003,13 @@ def make_type_uq_score(shape): # Scores and shapes scores_shapes = [ - ["flux", (Ns, Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], - ["density", (Ns, Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], - ["fission", (Ns, Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], - ["total", (Ns, Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], - ["current", (Ns, Ng, Nt, Nx, Ny, Nz, 3)], - ["eddington", (Ns, Ng, Nt, Nx, Ny, Nz, 6)], - ["exit", (Ns, Ng, Nt, 2, Ny, Nz, Nmu, N_azi)], + ["flux", (Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], + ["density", (Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], + ["fission", (Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], + ["total", (Ng, Nt, Nx, Ny, Nz, Nmu, N_azi)], + ["current", (Ng, Nt, Nx, Ny, Nz, 3)], + ["eddington", (Ng, Nt, Nx, Ny, Nz, 6)], + ["exit", (Ng, Nt, 2, Ny, Nz, Nmu, N_azi)], ] # Add score flags to structure diff --git a/test/regression/dsm_azurv1/answer.h5 b/test/regression/dsm_azurv1/answer.h5 deleted file mode 100644 index 0c1afb236da165f4c7919f3ecea2eca2c3c3ecb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265800 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 z 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 a+Up{BJH)du{++uWMyNBcaJS=k?f(J8mg=1V diff --git a/test/regression/dsm_lattice/input.py b/test/regression/dsm_lattice/input.py deleted file mode 100644 index 7fc70b08..00000000 --- a/test/regression/dsm_lattice/input.py +++ /dev/null @@ -1,49 +0,0 @@ -import numpy as np -import h5py - -import mcdc - - -# ========================================================================= -# Set model and run -# ========================================================================= - -lib = h5py.File("c5g7.h5", "r") - - -def set_mat(mat): - return mcdc.material( - capture=mat["capture"][:], - scatter=mat["scatter"][:], - fission=mat["fission"][:], - nu_p=mat["nu_p"][:], - nu_d=mat["nu_d"][:], - chi_p=mat["chi_p"][:], - chi_d=mat["chi_d"][:], - speed=mat["speed"], - decay=mat["decay"], - sensitivity=True, - ) - - -mat_uo2 = set_mat(lib["uo2"]) # Fuel: UO2 -mat_mod = set_mat(lib["mod"]) # Moderator -mat_cr = set_mat(lib["cr"]) # Control rod - -s1 = mcdc.surface("plane-x", x=0.0, bc="reflective") -s2 = mcdc.surface("plane-x", x=0.5, sensitivity=True) -s3 = mcdc.surface("plane-x", x=1.5, sensitivity=True) -s4 = mcdc.surface("plane-x", x=2.0, bc="reflective") - -mcdc.cell(+s1 & -s2, mat_uo2) -mcdc.cell(+s2 & -s3, mat_mod) -mcdc.cell(+s3 & -s4, mat_cr) - -mcdc.source(point=[1.0, 0.0, 0.0], energy=[1, 0, 0, 0, 0, 0, 0], isotropic=True) - -scores = ["flux"] -mcdc.tally(scores=scores, x=np.linspace(0.0, 2.0, 11), g="all") - -mcdc.setting(N_particle=3, active_bank_buff=1000) - -mcdc.run() From 2be8ac8e83cfd4b83145e542c055d586c8002892 Mon Sep 17 00:00:00 2001 From: Ilham Variansyah Date: Sat, 17 Aug 2024 20:35:56 +0700 Subject: [PATCH 2/2] fix unit test --- test/unit/test_input_.py | 81 +--------------------------------------- 1 file changed, 1 insertion(+), 80 deletions(-) diff --git a/test/unit/test_input_.py b/test/unit/test_input_.py index 59158962..b7c8660e 100644 --- a/test/unit/test_input_.py +++ b/test/unit/test_input_.py @@ -50,7 +50,6 @@ def test_nuclide_basic(): ), speed=np.array([1.0, 2.0, 3.0, 4.0]), decay=np.array([1.0, 2.0, 3.0]), - sensitivity=True, ) assert n1.tag == "Nuclide" @@ -80,8 +79,6 @@ def test_nuclide_basic(): assert (n1.chi_s == np.ones([4, 4]) * 0.25).all() assert (n1.chi_p == np.ones([4, 4]) * 0.25).all() assert (n1.chi_d == np.ones([3, 4]) * 0.25).all() - assert n1.sensitivity == True - assert n1.sensitivity_ID == 1 def test_nuclide_default(): @@ -109,8 +106,6 @@ def test_nuclide_default(): assert (n1.chi_s == np.zeros((5, 5))).all() assert (n1.chi_p == np.zeros((5, 5))).all() assert (n1.chi_d == np.zeros((0, 5))).all() - assert n1.sensitivity == False - assert n1.sensitivity_ID == 0 assert (n2.capture == np.zeros(5)).all() assert (n2.scatter == np.ones(5) * 5.0).all() @@ -122,8 +117,6 @@ def test_nuclide_default(): assert (n2.chi_s == np.ones((5, 5)) * 0.2).all() assert (n2.chi_p == np.zeros((5, 5))).all() assert (n2.chi_d == np.zeros((0, 5))).all() - assert n2.sensitivity == False - assert n2.sensitivity_ID == 0 assert (n3.capture == np.zeros(5)).all() assert (n3.scatter == np.zeros(5)).all() @@ -135,45 +128,6 @@ def test_nuclide_default(): assert (n3.chi_s == np.zeros((5, 5))).all() assert (n3.chi_p == np.ones((5, 5)) * 0.2).all() assert (n3.chi_d == np.zeros((0, 5))).all() - assert n3.sensitivity == False - assert n3.sensitivity_ID == 0 - - -def test_nuclide_IDs_sensitivity(): - # Start fresh - mcdc.reset() - - # Create nuclides with various sensitivity tags - n1 = mcdc.nuclide(capture=np.array([1.0]), sensitivity=True) - n2 = mcdc.nuclide(capture=np.array([1.0])) - n3 = mcdc.nuclide(capture=np.array([1.0]), sensitivity=True) - n4 = mcdc.nuclide(capture=np.array([1.0]), sensitivity=True) - n5 = mcdc.nuclide(capture=np.array([1.0])) - n6 = mcdc.nuclide(capture=np.array([1.0])) - n7 = mcdc.nuclide(capture=np.array([1.0]), sensitivity=True) - - # Checks - assert n1.ID == 0 - assert n2.ID == 1 - assert n3.ID == 2 - assert n4.ID == 3 - assert n5.ID == 4 - assert n6.ID == 5 - assert n7.ID == 6 - assert n1.sensitivity - assert not n2.sensitivity - assert n3.sensitivity - assert n4.sensitivity - assert not n5.sensitivity - assert not n6.sensitivity - assert n7.sensitivity - assert n1.sensitivity_ID == 1 - assert n2.sensitivity_ID == 0 - assert n3.sensitivity_ID == 2 - assert n4.sensitivity_ID == 3 - assert n5.sensitivity_ID == 0 - assert n6.sensitivity_ID == 0 - assert n7.sensitivity_ID == 4 # ====================================================================================== @@ -224,7 +178,6 @@ def test_material_single(): ), speed=np.array([1.0, 2.0, 3.0, 4.0]), decay=np.array([1.0, 2.0, 3.0]), - sensitivity=True, ) # Checks @@ -256,7 +209,6 @@ def test_material_single(): assert (m1.nu_f == np.array([4.0, 8.0, 12.0, 16.0])).all() assert (m1.chi_s == np.ones([4, 4]) * 0.25).all() assert (m1.chi_p == np.ones([4, 4]) * 0.25).all() - assert m1.sensitivity == True # Check if the nuclide was registered n2 = mcdc.nuclide(capture=np.ones(5)) @@ -269,7 +221,7 @@ def test_material_multi(): # Create a multi-nuclide material n1 = mcdc.nuclide(capture=np.ones(5), speed=np.ones(5) * 1) - n2 = mcdc.nuclide(scatter=np.ones((5, 5)), speed=np.ones(5) * 2, sensitivity=True) + n2 = mcdc.nuclide(scatter=np.ones((5, 5)), speed=np.ones(5) * 2) n3 = mcdc.nuclide( fission=np.ones(5), nu_p=np.ones(5), chi_p=np.ones((5, 5)), speed=np.ones(5) * 3 ) @@ -285,37 +237,6 @@ def test_material_multi(): assert m1.J == 0 assert (m1.total == np.ones(5) * 14).all() assert (m1.speed == np.ones(5) * 30 / 14).all() - assert m1.sensitivity == True - - -def test_material_IDs_sensitivity(): - # Start fresh - mcdc.reset() - - # Create materials with various sensitivity tags - m1 = mcdc.material(capture=np.array([1.0]), sensitivity=True) - m2 = mcdc.material(capture=np.array([1.0])) - m3 = mcdc.material(capture=np.array([1.0]), sensitivity=True) - m4 = mcdc.material(capture=np.array([1.0]), sensitivity=True) - m5 = mcdc.material(capture=np.array([1.0])) - m6 = mcdc.material(capture=np.array([1.0])) - m7 = mcdc.material(capture=np.array([1.0]), sensitivity=True) - - # Checks - assert m1.ID == 0 - assert m2.ID == 1 - assert m3.ID == 2 - assert m4.ID == 3 - assert m5.ID == 4 - assert m6.ID == 5 - assert m7.ID == 6 - assert m1.sensitivity - assert not m2.sensitivity - assert m3.sensitivity - assert m4.sensitivity - assert not m5.sensitivity - assert not m6.sensitivity - assert m7.sensitivity # ======================================================================================