Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
limiter.py
1import sys
2
3import numpy as np
4from scipy.optimize import minimize_scalar
5
6from .reconstruction_g import *
7
8
9def minval_approx_g(nbins, kpol, massgrid, massbins, gij):
10 """
11 Function to compute the minimum value of the approximation of g in each bin
12
13 only for DG scheme k>0, piecewise polynomial approximation
14
15 Parameters
16 ----------
17 nbins : scalar, type -> integer
18 number of dust bins
19 kpol : scalar, type -> integer
20 degree of polynomials for approximation
21 massgrid : 1D array (dim = nbins+1), type -> float
22 grid of masses given borders value of mass bins
23 massbins : 1D array (dim = nbins), type -> float
24 arithmetic mean value of massgrid for each mass bins
25 gij : 2D array (dim = (nbins,kpol+1)), type -> float
26 components of g on the polynomial basis
27
28
29 Returns
30 -------
31 tab_minval_recons_g : 1D array (dim = nbins), type -> float
32 minimum value of the approximation of in each bin
33
34 """
35
36 tab_minval_recons_g = np.zeros(nbins)
37
38 if kpol == 1:
39 for j in range(nbins):
40 # print("j=",j,", recons_g(massgrid[j])=",recons_g(massgrid,massbins,kpol,gij,j,massgrid[j]))
41 tab_minval_recons_g[j] = min(
42 recons_g(massgrid, massbins, kpol, gij, j, massgrid[j]),
43 recons_g(massgrid, massbins, kpol, gij, j, massgrid[j + 1]),
44 )
45
46 else:
47 for j in range(nbins):
48
49 def func_pol(x):
50 return recons_g(massgrid, massbins, kpol, gij, j, x)
51
52 xjgridl = massgrid[j]
53 xjgridr = massgrid[j + 1]
54
55 # brute force
56 # xgrid = np.linspace(xjgridl,xjgridr,num=100)
57 # tab_minval_recons_g[j] = np.min(func_pol(xgrid))
58
59 # scipy algorithm
60 res = minimize_scalar(func_pol, bounds=(xjgridl, xjgridr), method="bounded")
61 tab_minval_recons_g[j] = np.min(
62 [res.fun, func_pol(xjgridl), func_pol(xjgridr)]
63 ) # Accurate minimum value
64
65 return tab_minval_recons_g
66
67
68def gammafunction(eps, nbins, kpol, massgrid, massbins, gij):
69 """
70 Function to compute the limiter coefficient to ensure positivity of the numerical solution (Zhang and Shu 2010)
71
72 only for DG scheme k>0, piecewise polynomial approximation
73
74 Parameters
75 ----------
76 eps : scalar, type -> float
77 minimum value for mass distribution approximation gij
78 nbins : scalar, type -> integer
79 number of dust bins
80 kpol : scalar, type -> integer
81 degree of polynomials for approximation
82 massgrid : 1D array (dim = nbins+1), type -> float
83 grid of masses given borders value of mass bins
84 massbins : 1D array (dim = nbins), type -> float
85 arithmetic mean value of massgrid for each mass bins
86 gij : 2D array (dim = (nbins,kpol+1)), type -> float
87 components of g on the polynomial basis
88
89
90 Returns
91 -------
92 tab_gamma : 1D array (dim = nbins), type -> float
93 limiter coefficient in each bin
94
95 """
96
97 # Liu et al.2019
98 min_approx_g = minval_approx_g(nbins, kpol, massgrid, massbins, gij)
99
100 # print("min_approx_g=",min_approx_g)
101
102 tab_gamma = np.asarray(
103 [
104 np.min([1.0, np.abs((eps - gij[j, 0]) / (gij[j, 0] - min_approx_g[j]))])
105 if gij[j, 0] != min_approx_g[j]
106 else 1.0
107 for j in range(nbins)
108 ]
109 )
110
111 return tab_gamma