@@ -109,18 +109,21 @@ void FlatSourceDomain::update_single_neutron_source(SourceRegionHandle& srh)
109109
110110 // Add scattering + fission source
111111 int material = srh.material ();
112+ double density_mult = srh.density_mult ();
112113 if (material != MATERIAL_VOID) {
113114 double inverse_k_eff = 1.0 / k_eff_;
114115 for (int g_out = 0 ; g_out < negroups_; g_out++) {
115- double sigma_t = sigma_t_[material * negroups_ + g_out];
116+ double sigma_t = sigma_t_[material * negroups_ + g_out] * density_mult ;
116117 double scatter_source = 0.0 ;
117118 double fission_source = 0.0 ;
118119
119120 for (int g_in = 0 ; g_in < negroups_; g_in++) {
120121 double scalar_flux = srh.scalar_flux_old (g_in);
121- double sigma_s =
122- sigma_s_[material * negroups_ * negroups_ + g_out * negroups_ + g_in];
123- double nu_sigma_f = nu_sigma_f_[material * negroups_ + g_in];
122+ double sigma_s = sigma_s_[material * negroups_ * negroups_ +
123+ g_out * negroups_ + g_in] *
124+ density_mult;
125+ double nu_sigma_f =
126+ nu_sigma_f_[material * negroups_ + g_in] * density_mult;
124127 double chi = chi_[material * negroups_ + g_out];
125128
126129 scatter_source += sigma_s * scalar_flux;
@@ -198,7 +201,8 @@ void FlatSourceDomain::set_flux_to_flux_plus_source(
198201 source_regions_.volume_sq (sr);
199202 }
200203 } else {
201- double sigma_t = sigma_t_[source_regions_.material (sr) * negroups_ + g];
204+ double sigma_t = sigma_t_[source_regions_.material (sr) * negroups_ + g] *
205+ source_regions_.density_mult (sr);
202206 source_regions_.scalar_flux_new (sr, g) /= (sigma_t * volume);
203207 source_regions_.scalar_flux_new (sr, g) += source_regions_.source (sr, g);
204208 }
@@ -332,7 +336,8 @@ void FlatSourceDomain::compute_k_eff()
332336 double sr_fission_source_new = 0 ;
333337
334338 for (int g = 0 ; g < negroups_; g++) {
335- double nu_sigma_f = nu_sigma_f_[material * negroups_ + g];
339+ double nu_sigma_f = nu_sigma_f_[material * negroups_ + g] *
340+ source_regions_.density_mult (sr);
336341 sr_fission_source_old +=
337342 nu_sigma_f * source_regions_.scalar_flux_old (sr, g);
338343 sr_fission_source_new +=
@@ -562,7 +567,8 @@ double FlatSourceDomain::compute_fixed_source_normalization_factor() const
562567 // to get the total source strength in the expected units.
563568 double sigma_t = 1.0 ;
564569 if (material != MATERIAL_VOID) {
565- sigma_t = sigma_t_[material * negroups_ + g];
570+ sigma_t =
571+ sigma_t_[material * negroups_ + g] * source_regions_.density_mult (sr);
566572 }
567573 simulation_external_source_strength +=
568574 source_regions_.external_source (sr, g) * sigma_t * volume;
@@ -618,7 +624,9 @@ void FlatSourceDomain::random_ray_tally()
618624 // source strength.
619625 double volume = source_regions_.volume (sr) * simulation_volume_;
620626
621- double material = source_regions_.material (sr);
627+ int material = source_regions_.material (sr);
628+ double density_mult = source_regions_.density_mult (sr);
629+
622630 for (int g = 0 ; g < negroups_; g++) {
623631 double flux =
624632 source_regions_.scalar_flux_new (sr, g) * source_normalization_factor;
@@ -634,19 +642,22 @@ void FlatSourceDomain::random_ray_tally()
634642
635643 case SCORE_TOTAL:
636644 if (material != MATERIAL_VOID) {
637- score = flux * volume * sigma_t_[material * negroups_ + g];
645+ score =
646+ flux * volume * sigma_t_[material * negroups_ + g] * density_mult;
638647 }
639648 break ;
640649
641650 case SCORE_FISSION:
642651 if (material != MATERIAL_VOID) {
643- score = flux * volume * sigma_f_[material * negroups_ + g];
652+ score =
653+ flux * volume * sigma_f_[material * negroups_ + g] * density_mult;
644654 }
645655 break ;
646656
647657 case SCORE_NU_FISSION:
648658 if (material != MATERIAL_VOID) {
649- score = flux * volume * nu_sigma_f_[material * negroups_ + g];
659+ score = flux * volume * nu_sigma_f_[material * negroups_ + g] *
660+ density_mult;
650661 }
651662 break ;
652663
@@ -913,7 +924,8 @@ void FlatSourceDomain::output_to_vtk() const
913924 for (int g = 0 ; g < negroups_; g++) {
914925 int64_t source_element = fsr * negroups_ + g;
915926 float flux = evaluate_flux_at_point (voxel_positions[i], fsr, g);
916- double sigma_f = sigma_f_[mat * negroups_ + g];
927+ double sigma_f = sigma_f_[mat * negroups_ + g] *
928+ source_regions_.density_mult (fsr);
917929 total_fission += sigma_f * flux;
918930 }
919931 }
@@ -934,7 +946,8 @@ void FlatSourceDomain::output_to_vtk() const
934946 // multiply it back to get the true external source.
935947 double sigma_t = 1.0 ;
936948 if (mat != MATERIAL_VOID) {
937- sigma_t = sigma_t_[mat * negroups_ + g];
949+ sigma_t = sigma_t_[mat * negroups_ + g] *
950+ source_regions_.density_mult (fsr);
938951 }
939952 total_external += source_regions_.external_source (fsr, g) * sigma_t ;
940953 }
@@ -1244,7 +1257,8 @@ void FlatSourceDomain::set_adjoint_sources()
12441257 continue ;
12451258 }
12461259 for (int g = 0 ; g < negroups_; g++) {
1247- double sigma_t = sigma_t_[material * negroups_ + g];
1260+ double sigma_t =
1261+ sigma_t_[material * negroups_ + g] * source_regions_.density_mult (sr);
12481262 source_regions_.external_source (sr, g) /= sigma_t ;
12491263 }
12501264 }
@@ -1495,6 +1509,8 @@ SourceRegionHandle FlatSourceDomain::get_subdivided_source_region_handle(
14951509
14961510 handle.material () = material;
14971511
1512+ handle.density_mult () = cell.density_mult (gs.cell_instance ());
1513+
14981514 // Store the mesh index (if any) assigned to this source region
14991515 handle.mesh () = mesh_idx;
15001516
@@ -1523,7 +1539,8 @@ SourceRegionHandle FlatSourceDomain::get_subdivided_source_region_handle(
15231539 // Divide external source term by sigma_t
15241540 if (material != C_NONE) {
15251541 for (int g = 0 ; g < negroups_; g++) {
1526- double sigma_t = sigma_t_[material * negroups_ + g];
1542+ double sigma_t =
1543+ sigma_t_[material * negroups_ + g] * handle.density_mult ();
15271544 handle.external_source (g) /= sigma_t ;
15281545 }
15291546 }
@@ -1598,16 +1615,18 @@ void FlatSourceDomain::apply_transport_stabilization()
15981615#pragma omp parallel for
15991616 for (int64_t sr = 0 ; sr < n_source_regions (); sr++) {
16001617 int material = source_regions_.material (sr);
1618+ double density_mult = source_regions_.density_mult (sr);
16011619 if (material == MATERIAL_VOID) {
16021620 continue ;
16031621 }
16041622 for (int g = 0 ; g < negroups_; g++) {
16051623 // Only apply stabilization if the diagonal (in-group) scattering XS is
16061624 // negative
16071625 double sigma_s =
1608- sigma_s_[material * negroups_ * negroups_ + g * negroups_ + g];
1626+ sigma_s_[material * negroups_ * negroups_ + g * negroups_ + g] *
1627+ density_mult;
16091628 if (sigma_s < 0.0 ) {
1610- double sigma_t = sigma_t_[material * negroups_ + g];
1629+ double sigma_t = sigma_t_[material * negroups_ + g] * density_mult ;
16111630 double phi_new = source_regions_.scalar_flux_new (sr, g);
16121631 double phi_old = source_regions_.scalar_flux_old (sr, g);
16131632
0 commit comments