5 use iso_fortran_env,
only: int64
27 integer(int64) :: events = 0_int64, next_report = 10_int64
28 integer :: details = 0
38 character(len=*),
intent(in) :: label
39 integer(int64),
intent(in) :: events, edges
40 integer,
intent(in) :: iw
41 double precision,
intent(in) :: xfirst(:), before, after
44 if(events<=0_int64)
return
47 state%events=state%events+min(events,huge(state%events)-state%events)
49 if(state%next_report>0_int64)
then
50 milestone=state%events>=state%next_report
51 do while(state%events>=state%next_report)
52 if(state%next_report>huge(state%next_report)/10_int64)
then
53 state%next_report=0_int64
56 state%next_report=state%next_report*10_int64
59 if(state%details<3)
then
60 state%details=state%details+1
61 write(*,*)
'WARNING ',label,
': rank=',
mype,
' it=',
it, &
62 ' events=',events,
' edges=',edges,
' cumulative_events=',state%events
63 write(*,*)
' first: variable=',iw,
' x=',xfirst,
' before=',before,
' after=',after
64 if(state%details==3)
write(*,*)
' Further detailed reports suppressed; cumulative milestones only.'
65 else if(milestone)
then
66 write(*,*)
'WARNING ',label,
': rank=',
mype,
' it=',
it,
' cumulative_events=',state%events
74 integer,
intent(in) :: ixi^
l, ixo^
l
75 double precision,
intent(in) :: wprim(ixi^s, 1:nw)
76 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
77 logical,
intent(in) :: w_flag(ixi^s,1:nw)
78 character(len=*),
intent(in) :: subname
80 double precision :: x^
d
81 integer :: iw,iiw,ix^
d
85 {
do ix^db= ixo^lim^db\}
86 if(w_flag(ix^
d,iw))
then
87 write(*,*)
"Error: small value of ", trim(prim_wnames(iw)),wprim(ix^
d,iw),&
88 " encountered when call ", subname
90 write(*,*)
"Location: ", x(ix^
d,:)
99 x1=x(ix^
d,1)*cos(x(ix^
d,2))
100 x2=x(ix^
d,1)*sin(x(ix^
d,2))
106 x1=x(ix^d,1)*cos(x(ix^d,phi_))
107 x2=x(ix^d,1)*sin(x(ix^d,phi_))
109 write(*,*)
"Cartesian location: ", x^d
111 x1=x(ix^d,1){^nooned*sin(x(ix^d,2))}{^ifthreed*cos(x(ix^d,3))}
113 x2=x(ix^d,1)*cos(x(ix^d,2))}
115 x2=x(ix^d,1)*sin(x(ix^d,2))*sin(x(ix^d,3))
116 x3=x(ix^d,1)*cos(x(ix^d,2))}
117 write(*,*)
"Cartesian location: ", x^d
119 write(*,*)
"No converter for coordinate=",coordinate
121 write(*,*)
"Cell number: ", ix^d
123 write(*,*) trim(prim_wnames(iiw)),
": ",wprim(ix^d,iiw)
127 write(*,*)
"Saving status at the previous time step"
137 integer,
intent(in) :: ixi^
l, ixo^
l
138 logical,
intent(in) :: w_flag(ixi^s,1:nw)
139 double precision,
intent(inout) :: w(ixi^s, 1:nw)
140 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
141 integer,
optional,
intent(in) :: windex
142 integer :: iw, kxo^
l, ix^
d, i, nwstart, nwend
145 integer(int64) :: fallback_events
147 double precision :: first_x(
ndim), first_before, first_after
149 fallback_events=0_int64
150 if(
present(windex))
then
158 do iw = nwstart, nwend
159 {
do ix^db= ixo^lim^db\}
161 if (w_flag(ix^
d,iw))
then
165 {kxomin^
d= max(ix^
d-i, iximin^
d);
166 kxomax^
d= min(ix^
d+i, iximax^
d);\}
169 if(any(w_flag(kxo^s,iw) .eqv. .false.))
exit
172 if(any(w_flag(kxo^s,iw) .eqv. .false.))
then
178 w(ix^
d, iw) = sum(w(kxo^s, iw), w_flag(kxo^s,iw) .eqv. .false.)&
179 / count(w_flag(kxo^s,iw) .eqv. .false.)
182 fallback_events=fallback_events+1_int64
183 if(fallback_events==1_int64)
then
185 first_x=x(ix^
d,1:
ndim)
186 first_before=w(ix^
d,iw)
190 if(fallback_events==1_int64) first_after=w(ix^
d,iw)
197 'small_values_average: no valid neighbours',fallback_events,0_int64, &
198 first_iw,first_x,first_before,first_after)
Module with geometry-related routines (e.g., divergence, curl).
integer, parameter cartesian
integer, parameter cylindrical
integer, parameter cartesian_expansion
integer, parameter cartesian_stretched
This module contains definitions of global parameters and variables and some generic functions/subrou...
double precision small_pressure
double precision global_time
The global simulation time.
integer it
Number of time steps taken.
integer, parameter ndim
Number of spatial dimensions for grid variables.
integer mype
The rank of the current MPI task.
double precision, dimension(:), allocatable, parameter d
logical crash
Save a snapshot before crash a run met unphysical values.
double precision small_density
Module for handling problematic values in simulations, such as negative pressures.
subroutine, public small_values_average(ixil, ixol, w, x, w_flag, windex)
subroutine, public report_repair_warning(state, label, events, edges, iw, xfirst, before, after)
integer, public small_values_daverage
Average over this many cells in each direction.
logical, public trace_small_values
trace small values in the source file using traceback flag of compiler
subroutine, public small_values_error(wprim, x, ixil, ixol, w_flag, subname)
logical, dimension(:), allocatable, public small_values_fix_iw
Whether to apply small value fixes to certain variables.
character(len=20), public small_values_method
How to handle small values.