!+ ! Subroutine limit_calc (limited) ! ! Subroutine to limit the range of the quad k's due to hardware limitations ! Note: var%hit_limit will be set to True if past limit but is never set to False by this routine. !- subroutine limit_calc (limited) use cesrv_struct use cesrv_interface use super_universe_com implicit none type (universe_struct), pointer :: u type (var_struct), pointer :: v logical limited real(rp) merit0 integer i, k, cu_target character vname*32 ! return if no limiting wanted limited = .false. if (.not. logic%limit_on) return ! we only need to check universe #1 u => super%u_(1) call cu_target_calc (u%var, u, 1.0_rp) limited = .false. ! set true if an element went past a limit do i = 1, size(u%var) v => u%var(i) if (.not. v%good_opt .or. .not. v%good_var) cycle if (.not. v%do_limit_calc .or. v%dvar_dcu == 0) cycle if (v%cu_saved == 0 .and. v%cu_target == 0) cycle vname = trim(v%name) // ' ' // v%attrib_name if (v%target < v%low_target_lim) then print * if (v%v1%units == cu_units$) then if (v%dvar_dcu > 0) then print *, 'NOTE: PAST LOW LIMIT FOR ', trim(vname) else print *, 'NOTE: PAST HIGH LIMIT FOR ', trim(vname) endif print *, ' value wanted:', nint(v%target / v%dvar_dcu) print *, ' limit: ', nint(v%low_target_lim / v%dvar_dcu) else print *, 'NOTE: PAST LOW LIMIT FOR ', trim(vname) print *, ' value wanted:', v%target print *, ' low limit: ', v%low_target_lim endif print *, ' SETTING AT LIMIT AND VETOING FROM USE LIST' v%model = v%model - (v%low_target_lim - v%target) - abs(v%dvar_dcu) call var_bookkeeper (v, u%ring, u%orb) v%good_user = .false. v%hit_limit = .true. limited = .true. do k = 2, logic%u_num super%u_(k)%var(i)%model = v%model call var_bookkeeper (super%u_(k)%var(i), super%u_(k)%ring, super%u_(k)%orb) super%u_(k)%var(i)%good_user = .false. super%u_(k)%var(i)%hit_limit = .true. enddo endif if (v%target > v%high_target_lim) then print * if (v%v1%units == cu_units$) then if (v%dvar_dcu > 0) then print *, 'NOTE: PAST HIGH LIMIT FOR ', trim(vname) else print *, 'NOTE: PAST LOW LIMIT FOR ', trim(vname) endif print *, ' value wanted:', nint(v%target / v%dvar_dcu) print *, ' limit: ', nint(v%high_target_lim / v%dvar_dcu) else print *, 'NOTE: PAST HIGH LIMIT FOR ', trim(vname) print *, ' value wanted:', v%target print *, ' high limit: ', v%high_target_lim endif print *, ' SETTING AT LIMIT AND VETOING FROM USE LIST' v%model = v%model + (v%target - v%high_target_lim) + abs(v%dvar_dcu) call var_bookkeeper (v, u%ring, u%orb) v%good_user = .false. v%hit_limit = .true. limited = .true. do k = 2, logic%u_num super%u_(k)%var(i)%model = v%model call var_bookkeeper (super%u_(k)%var(i), super%u_(k)%ring, super%u_(k)%orb) super%u_(k)%var(i)%good_user = .false. super%u_(k)%var(i)%hit_limit = .true. enddo endif if (v%dvar_dcu == 0) cycle if (.not. v%useit) cycle cu_target = v%cu_target if (abs(cu_target) < v%cu_zero_lim) then print * print *, 'NOTE: NEAR ZERO FOR ', trim(vname) print *, ' PRESENT TARGET:', cu_target print *, ' SETTING AT LIMIT AND VETOING FROM USE LIST' if (cu_target < 0) then v%model = v%saved + v%design + (v%cu_zero_lim + 1) * v%dvar_dcu else v%model = v%saved + v%design - (v%cu_zero_lim + 1) * v%dvar_dcu endif call var_bookkeeper (v, u%ring, u%orb) v%good_user = .false. v%hit_limit = .true. limited = .true. do k = 2, logic%u_num super%u_(k)%var(i)%model = v%model call var_bookkeeper (super%u_(k)%var(i), super%u_(k)%ring, super%u_(k)%orb) super%u_(k)%var(i)%good_user = .false. super%u_(k)%var(i)%hit_limit = .true. enddo endif end do ! Bookkeeping if something had hit a limit. if (limited) then call set_var_useit (super%u_(1)) call cu_target_calc(u%var, u, 1.0_rp) do k = 1, logic%u_num call ring_calc (super%u_(k)) enddo call merit_calc(merit0) endif end subroutine