127 integer,
intent(in) :: ixI^L, ixC^L, idims
128 double precision,
intent(in) :: dwC(ixI^S)
129 integer,
intent(in) :: typelim
131 double precision,
intent(out),
optional :: ldw(ixI^S)
133 double precision,
intent(out),
optional :: rdw(ixI^S)
135 double precision :: tmp(ixI^S), tmp2(ixI^S)
136 double precision,
parameter :: qsmall=1.
d-12, qsmall2=2.
d-12
137 double precision,
parameter :: eps = sqrt(epsilon(1.0d0))
140 double precision,
parameter :: c_mcbeta=1.4d0
142 double precision,
parameter :: cadalfa=0.5d0, cadbeta=2.0d0, cadgamma=1.6d0
144 double precision :: rdelinv
145 double precision :: ldwA(ixI^S),ldwB(ixI^S),tmpeta(ixI^S)
146 double precision,
parameter :: cadepsilon=1.
d-14, invcadepsilon=1.d14
147 integer :: ixO^L, hxO^L, ix^D, hx^D
151 ixomin^d=ixcmin^d+
kr(idims,^d); ixomax^d=ixcmax^d;
152 hxo^l=ixo^l-
kr(idims,^d);
165 select case (typelim)
168 tmp(ixo^s)=sign(one,dwc(ixo^s))
169 tmp(ixo^s)=tmp(ixo^s)* &
170 max(zero,min(abs(dwc(ixo^s)),tmp(ixo^s)*dwc(hxo^s)))
171 if (
present(ldw)) ldw(ixo^s) = tmp(ixo^s)
172 if (
present(rdw)) rdw(ixo^s) = tmp(ixo^s)
175 tmp(ixo^s)=sign(one,dwc(ixo^s))
176 tmp(ixo^s)=2*tmp(ixo^s)* &
177 max(zero,min(abs(dwc(ixo^s)),tmp(ixo^s)*dwc(hxo^s),&
178 tmp(ixo^s)*quarter*(dwc(hxo^s)+dwc(ixo^s))))
179 if (
present(ldw)) ldw(ixo^s) = tmp(ixo^s)
180 if (
present(rdw)) rdw(ixo^s) = tmp(ixo^s)
183 tmp(ixo^s)=sign(one,dwc(ixo^s))
184 tmp(ixo^s)=tmp(ixo^s)* &
185 max(zero,min(c_mcbeta*abs(dwc(ixo^s)),c_mcbeta*tmp(ixo^s)*dwc(hxo^s),&
186 tmp(ixo^s)*half*(dwc(hxo^s)+dwc(ixo^s))))
187 if (
present(ldw)) ldw(ixo^s) = tmp(ixo^s)
188 if (
present(rdw)) rdw(ixo^s) = tmp(ixo^s)
191 tmp(ixo^s)=sign(one,dwc(ixo^s))
192 tmp(ixo^s)=tmp(ixo^s)* &
193 max(zero,min(2*abs(dwc(ixo^s)),tmp(ixo^s)*dwc(hxo^s)),&
194 min(abs(dwc(ixo^s)),2*tmp(ixo^s)*dwc(hxo^s)))
195 if (
present(ldw)) ldw(ixo^s) = tmp(ixo^s)
196 if (
present(rdw)) rdw(ixo^s) = tmp(ixo^s)
199 tmp(ixo^s)=2*max(dwc(hxo^s)*dwc(ixo^s),zero) &
200 /(dwc(ixo^s)+dwc(hxo^s)+qsmall)
201 if (
present(ldw)) ldw(ixo^s) = tmp(ixo^s)
202 if (
present(rdw)) rdw(ixo^s) = tmp(ixo^s)
205 tmp(ixo^s)=(dwc(hxo^s)*(dwc(ixo^s)**2+qsmall)&
206 +dwc(ixo^s)*(dwc(hxo^s)**2+qsmall))&
207 /(dwc(ixo^s)**2+dwc(hxo^s)**2+qsmall2)
208 if (
present(ldw)) ldw(ixo^s) = tmp(ixo^s)
209 if (
present(rdw)) rdw(ixo^s) = tmp(ixo^s)
211 tmp(ixo^s)=sign(one,dwc(ixo^s))
212 tmp2(ixo^s)=min(2*abs(dwc(ixo^s)),2*tmp(ixo^s)*dwc(hxo^s))
213 if (
present(ldw))
then
214 ldw(ixo^s)=tmp(ixo^s)* &
215 max(zero,min(tmp2(ixo^s),&
216 (dwc(hxo^s)*tmp(ixo^s)+2*abs(dwc(ixo^s)))*third))
218 if (
present(rdw))
then
219 rdw(ixo^s)=tmp(ixo^s)* &
220 max(zero,min(tmp2(ixo^s),&
221 (2*dwc(hxo^s)*tmp(ixo^s)+abs(dwc(ixo^s)))*third))
226 if (
present(ldw))
then
229 tmp(ixo^s)=dwc(hxo^s)/(dwc(ixo^s) + sign(eps, dwc(ixo^s)))
230 tmp2(ixo^s)=(2+tmp(ixo^s))*third
231 ldw(ixo^s)= max(zero,min(tmp2(ixo^s), &
232 max(-cadalfa*tmp(ixo^s), &
233 min(cadbeta*tmp(ixo^s), tmp2(ixo^s), &
234 cadgamma)))) * dwc(ixo^s)
237 if (
present(rdw))
then
239 tmp(ixo^s)=dwc(ixo^s)/(dwc(hxo^s) + sign(eps, dwc(hxo^s)))
240 tmp2(ixo^s)=(2+tmp(ixo^s))*third
241 rdw(ixo^s)= max(zero,min(tmp2(ixo^s), &
242 max(-cadalfa*tmp(ixo^s), &
243 min(cadbeta*tmp(ixo^s), tmp2(ixo^s), &
244 cadgamma)))) * dwc(hxo^s)
249 do ix^db=ixomin^db,ixomax^db\}
250 tmpeta(ix^d)=(dwc(ix^d)**2+dwc(ix^d-hx^d)**2)*rdelinv
251 if (
present(ldw))
then
252 tmp(ix^d)=dwc(ix^d-hx^d)/(dwc(ix^d)+sign(eps,dwc(ix^d)))
253 ldwa(ix^d)=(two+tmp(ix^d))*third
254 if(tmpeta(ix^d)<=one-cadepsilon)
then
256 else if(tmpeta(ix^d)>=one+cadepsilon)
then
257 ldw(ix^d)=max(zero,min(ldwa(ix^d),max(-cadalfa*tmp(ix^d),&
258 min(cadbeta*tmp(ix^d),ldwa(ix^d),cadgamma))))
260 tmp2(ix^d)=(tmpeta(ix^d)-one)*invcadepsilon
261 ldw(ix^d)=half*((one-tmp2(ix^d))*ldwa(ix^d)+(one+tmp2(ix^d))*&
262 max(zero,min(ldwa(ix^d),max(-cadalfa*tmp(ix^d),&
263 min(cadbeta*tmp(ix^d),ldwa(ix^d),cadgamma)))))
265 ldw(ix^d)=ldw(ix^d)*dwc(ix^d)
267 if (
present(rdw))
then
268 tmp(ix^d)=dwc(ix^d)/(dwc(ix^d-hx^d)+sign(eps,dwc(ix^d-hx^d)))
269 ldwa(ix^d)=(two+tmp(ix^d))*third
270 if(tmpeta(ix^d)<=one-cadepsilon)
then
272 else if(tmpeta(ix^d)>=one+cadepsilon)
then
273 rdw(ix^d)=max(zero,min(ldwa(ix^d),max(-cadalfa*tmp(ix^d),&
274 min(cadbeta*tmp(ix^d),ldwa(ix^d),cadgamma))))
276 tmp2(ix^d)=(tmpeta(ix^d)-one)*invcadepsilon
277 rdw(ix^d)=half*((one-tmp2(ix^d))*ldwa(ix^d)+(one+tmp2(ix^d))*&
278 max(zero,min(ldwa(ix^d),max(-cadalfa*tmp(ix^d),&
279 min(cadbeta*tmp(ix^d),ldwa(ix^d),cadgamma)))))
281 rdw(ix^d)=rdw(ix^d)*dwc(ix^d-hx^d)
285 call mpistop(
"Error in dwLimiter: unknown limiter")