MFIX  2016-1
solve_k_epsilon_eq.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2 ! C
3 ! Subroutine: SOLVE_K_Epsilon_EQ C
4 ! Purpose: Solve K & Epsilon equations for a turbulent flow C
5 ! C
6 ! C
7 ! Author: S. Benyahia Date: MAY-13-04 C
8 ! C
9 ! C
10 ! Literature/Document References: C
11 ! C
12 ! C
13 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
14  SUBROUTINE solve_k_epsilon_eq(IER)
15 
16 ! Modules
17 !---------------------------------------------------------------------//
18  use ambm, only: a_m, b_m, lock_ambm, unlock_ambm
19  use bc, only: bc_k_turb_g, bc_e_turb_g
20  use compar, only: ijkstart3, ijkend3
21  use constant, only: to_si
22  use fldvar, only: rop_g, ep_g, u_g, v_g, w_g
23  use fldvar, only: k_turb_g, k_turb_go
24  use fldvar, only: e_turb_g, e_turb_go
25  use functions, only: fluid_at, zmax
26  use indices, only: i_of, j_of, k_of
27  use geometry, only: vol, ijkmax2
29  use mflux, only: flux_ge, flux_gn, flux_gt
30  use mflux, only: flux_gse, flux_gsn, flux_gst
31  use param, only: dimension_bc, dimension_3
32  use param1, only: zero
33  use residual, only: resid, max_resid, ijk_resid
34  use residual, only: num_resid, den_resid
35  use residual, only: resid_ke
36  use run, only: discretize, k_epsilon, added_mass, odt
37  use rxns, only: sum_r_g
38  use toleranc, only: zero_ep_s
41  use ur_facs, only: ur_fac
43  use usr_src, only: k_epsilon_e, k_epsilon_k
44  IMPLICIT NONE
45 
46 ! Dummy arguments
47 !---------------------------------------------------------------------//
48 ! Error index
49  INTEGER, INTENT(INOUT) :: IER
50 
51 ! Local variables
52 !---------------------------------------------------------------------//
53 ! phase index
54  INTEGER :: M
55 ! indices
56  INTEGER :: IJK, I, J, K
57 ! loop counter
58  INTEGER :: LC
59 !
60  DOUBLE PRECISION :: apo
61 ! linear equation solver method and iterations
62  INTEGER :: LEQM, LEQI
63 ! temporary variables in residual computation
64  DOUBLE PRECISION :: res1, mres1, num_res, den_res
65  INTEGER :: ires1
66 ! A default zero flux will be defined for both K & Epsilon at walls
67  DOUBLE PRECISION :: BC_hw_K_Turb_G (dimension_bc)
68  DOUBLE PRECISION :: BC_hw_E_Turb_G (dimension_bc)
69  DOUBLE PRECISION :: BC_K_Turb_GW (dimension_bc)
70  DOUBLE PRECISION :: BC_E_Turb_GW (dimension_bc)
71  DOUBLE PRECISION :: BC_C_K_Turb_G (dimension_bc)
72  DOUBLE PRECISION :: BC_C_E_Turb_G (dimension_bc)
73 
74 ! small value of K or E, 1 cm2/s2 = 1e-4 m2/s2 = 1e-4 m2/s3
75  DOUBLE PRECISION smallTheta
76 
77 ! source vector: coefficient of dependent variable
78 ! becomes part of a_m matrix; must be positive
79  DOUBLE PRECISION :: S_P(dimension_3)
80 ! source vector: constant part becomes part of b_m vector
81  DOUBLE PRECISION :: S_C(dimension_3)
82 !
83  character(LEN=8) :: Vname
84 !---------------------------------------------------------------------//
85 
86  IF( .NOT. k_epsilon) RETURN
87 
88  call lock_ambm
89 
90  smalltheta = (to_si)**4 * zero_ep_s
91  resid(resid_ke,0) = zero
92  num_resid(resid_ke,0) = zero
93  den_resid(resid_ke,0) = zero
94  max_resid(resid_ke,0) = zero
95  ijk_resid(resid_ke,0) = 0
96 
97 ! Setting default zero flux for K & Epsilon since we use wall functions.
98 ! If an expert user want to use Low Re K-Epilon model and needs to set
99 ! the turbulence quantities to zero at walls, then set the hw's to UNDEFINE will
100 ! do it. All the variables below can be changed in the same way as in the
101 ! MFIX data file in the boundary conditions section.
102  DO lc = 1, dimension_bc
103  bc_hw_k_turb_g(lc) = zero
104  bc_k_turb_gw(lc) = zero
105  bc_c_k_turb_g(lc) = zero
106  bc_hw_e_turb_g(lc) = zero
107  bc_e_turb_gw(lc) = zero
108  bc_c_e_turb_g(lc) = zero
109  ENDDO
110 ! End of setting default zero flux for K & Epsilon wall boundary conditions
111 
112 ! Equations solved for gas phase, thus M = 0
113  m = 0
114  CALL init_ab_m (a_m, b_m, ijkmax2, m)
115 
116 ! Solve the K_Turb_G equation first
117 ! ---------------------------------------------------------------->>>
118  DO ijk = ijkstart3, ijkend3
119  IF (fluid_at(ijk)) THEN
120  apo = rop_g(ijk)*vol(ijk)*odt
121  s_p(ijk) = apo + (zmax(sum_r_g(ijk)) + k_turb_g_p(ijk))*&
122  vol(ijk)
123  s_c(ijk) = apo*k_turb_go(ijk) + &
124  k_turb_g(ijk)*zmax((-sum_r_g(ijk)))*vol(ijk) + &
125  k_turb_g_c(ijk)*vol(ijk)
126  ELSE
127  s_p(ijk) = zero
128  s_c(ijk) = zero
129  ENDIF
130  ENDDO
131 
132  IF(.NOT.added_mass) THEN
133  CALL conv_dif_phi (k_turb_g, dif_k_turb_g, discretize(9), &
134  u_g, v_g, w_g, flux_ge, flux_gn, flux_gt, &
135  m, a_m, b_m)
136  ELSE
137  CALL conv_dif_phi (k_turb_g, dif_k_turb_g, discretize(9), &
138  u_g, v_g, w_g, flux_gse, flux_gsn, flux_gst, &
139  m, a_m, b_m)
140  ENDIF
141 
142  CALL bc_phi (k_turb_g, bc_k_turb_g, bc_k_turb_gw, bc_hw_k_turb_g, &
143  bc_c_k_turb_g, m, a_m, b_m)
144  CALL source_phi (s_p, s_c, ep_g, k_turb_g, m, a_m, b_m)
145 
146 ! calculate any usr source terms
147  IF (call_usr_source(9)) CALL calc_usr_source(k_epsilon_k,&
148  a_m, b_m, lm=0)
149 
150  CALL calc_resid_s (k_turb_g, a_m, b_m, m, num_res, den_res, res1, &
151  mres1, ires1, zero)
152 
153  resid(resid_ke,0) = resid(resid_ke,0)+res1
154  num_resid(resid_ke,0) = num_resid(resid_ke,0)+num_res
155  den_resid(resid_ke,0) = den_resid(resid_ke,0)+den_res
156  if(mres1 .gt. max_resid(resid_ke,0)) then
157  max_resid(resid_ke,0) = mres1
158  ijk_resid(resid_ke,0) = ires1
159  endif
160 
161  CALL under_relax_s (k_turb_g, a_m, b_m, m, ur_fac(9))
162 
163 ! call check_ab_m(a_m, b_m, m, .false., ier)
164 ! call write_ab_m(a_m, b_m, ijkmax2, m, ier)
165 ! write(*,*) res1, mres1, ires1
166 ! call test_lin_eq(ijkmax2, ijmax2, imax2, a_m(1, -3, 0), 1, &
167 ! DO_K, ier)
168 
169  CALL adjust_leq (resid(resid_ke,0), leq_it(9), leq_method(9), &
170  leqi, leqm)
171 
172  write(vname, '(A,I2)')'K_Turb_G'
173  CALL solve_lin_eq (vname, 9, k_turb_g, a_m, b_m, m, leqi, leqm, &
174  leq_sweep(9), leq_tol(9), leq_pc(9), ier)
175 
176 ! call out_array(K_Turb_G, Vname)
177 
178 ! remove small negative K values generated by linear solver
179 ! same as adjust_theta.f
180  DO ijk = ijkstart3, ijkend3
181  IF (fluid_at(ijk)) THEN
182  IF(k_turb_g(ijk) < smalltheta) k_turb_g(ijk) = smalltheta
183  ENDIF
184  ENDDO
185 
186 
187 ! Now solve the E_Turb_G (dissipation) equation.
188 ! ---------------------------------------------------------------->>>
189 ! Initiate (again) the Am Bm matrix.
190 ! This has to be done for every scalar equation.
191  CALL init_ab_m (a_m, b_m, ijkmax2, m)
192 
193  DO ijk = ijkstart3, ijkend3
194  i = i_of(ijk)
195  j = j_of(ijk)
196  k = k_of(ijk)
197  IF (fluid_at(ijk)) THEN
198  apo = rop_g(ijk)*vol(ijk)*odt
199  s_p(ijk) = apo + (zmax(sum_r_g(ijk)) + e_turb_g_p(ijk))*&
200  vol(ijk)
201  s_c(ijk) = apo*e_turb_go(ijk) + &
202  e_turb_g(ijk)*zmax((-sum_r_g(ijk)))*vol(ijk) + &
203  e_turb_g_c(ijk)*vol(ijk)
204  ELSE
205  s_p(ijk) = zero
206  s_c(ijk) = zero
207  ENDIF
208  ENDDO
209 
210  IF(.NOT.added_mass) THEN
212  u_g, v_g, w_g, flux_ge, flux_gn, flux_gt, &
213  m, a_m, b_m)
214  ELSE
216  u_g, v_g, w_g, flux_gse, flux_gsn, flux_gst, &
217  m, a_m, b_m)
218  ENDIF
219 
220  CALL bc_phi (e_turb_g, bc_e_turb_g, bc_e_turb_gw, bc_hw_e_turb_g, &
221  bc_c_e_turb_g, m, a_m, b_m)
222 
223  CALL source_phi (s_p, s_c, ep_g, e_turb_g, m, a_m, b_m)
224 
225 ! calculate any usr source terms
226  IF (call_usr_source(9)) CALL calc_usr_source(k_epsilon_e,&
227  a_m, b_m, lm=0)
228 
229 ! set epsilon in fluid cells adjacent to wall cells
230  CALL source_k_epsilon_bc(a_m, b_m, m)
231 
232  CALL calc_resid_s (e_turb_g, a_m, b_m, m, num_res, den_res, res1, &
233  mres1, ires1, zero)
234 
235  resid(resid_ke,0) = resid(resid_ke,0)+res1
236  num_resid(resid_ke,0) = num_resid(resid_ke,0)+num_res
237  den_resid(resid_ke,0) = den_resid(resid_ke,0)+den_res
238  if(mres1 .gt. max_resid(resid_ke,0))then
239  max_resid(resid_ke,0) = mres1
240  ijk_resid(resid_ke,0) = ires1
241  endif
242 
243  CALL under_relax_s (e_turb_g, a_m, b_m, m, ur_fac(9))
244 
245 ! call check_ab_m(a_m, b_m, m, .false., ier)
246 ! call write_ab_m(a_m, b_m, ijkmax2, m, ier)
247 ! write(*,*) res1, mres1, ires1
248 ! call test_lin_eq(ijkmax2, ijmax2, imax2, a_m(1, -3, 0), 1, &
249 ! DO_K, ier)
250 
251  CALL adjust_leq (resid(resid_ke,0), leq_it(9), leq_method(9), &
252  leqi, leqm)
253 
254  write(vname, '(A,I2)')'E_Turb_G'
255  CALL solve_lin_eq (vname, 9, e_turb_g, a_m, b_m, m, leqi, leqm, &
256  leq_sweep(9), leq_tol(9), leq_pc(9), ier)
257 
258 ! call out_array(E_Turb_G, Vname)
259 
260 ! remove small negative Epsilon values generated by linear solver
261 ! same as adjust_theta.f
262  DO ijk = ijkstart3, ijkend3
263  IF (fluid_at(ijk)) THEN
264  IF(e_turb_g(ijk) < smalltheta) e_turb_g(ijk) = smalltheta
265  ENDIF
266  ENDDO
267 
268  call unlock_ambm
269 
270  RETURN
271  END SUBROUTINE solve_k_epsilon_eq
272 
273 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
274 ! C
275 ! Subroutine: SOURCE_K_EPSILON_BC C
276 ! Purpose: When implementing the wall functions, the epsilon C
277 ! (dissipation) value at the fluid cell near the walls needs to be C
278 ! set. C
279 ! C
280 ! C
281 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
282  SUBROUTINE source_k_epsilon_bc(A_M, B_M, M)
284 ! Modules
285 !---------------------------------------------------------------------//
286  use compar, only: ijkstart3, ijkend3
287  use cutcell, only: cut_cell_at, delh_scalar
288  use fldvar, only: k_turb_g, e_turb_g
289  use functions, only: fluid_at, wall_at
290  use functions, only: im_of, jm_of, km_of
291  use functions, only: ip_of, jp_of, kp_of
292  use geometry, only: dy, odz, ox, dx, cylindrical
293  use indices, only: i_of, j_of, k_of
294  use param, only: dimension_3, dimension_m
295  use param1, only: zero, one
296  IMPLICIT NONE
297 
298 ! Dummy Arguments
299 !---------------------------------------------------------------------//
300 ! Septadiagonal matrix A_m
301  DOUBLE PRECISION, INTENT(INOUT) :: A_m(dimension_3, -3:3, 0:dimension_m)
302 ! Vector b_m
303  DOUBLE PRECISION, INTENT(INOUT) :: B_m(dimension_3, 0:dimension_m)
304 ! phase index
305  INTEGER, INTENT(IN) :: M
306 ! Local variables
307 !---------------------------------------------------------------------//
308  INTEGER :: IJK, I, J, K
309 !---------------------------------------------------------------------//
310 
311  DO ijk = ijkstart3, ijkend3
312  i = i_of(ijk)
313  j = j_of(ijk)
314  k = k_of(ijk)
315  IF (fluid_at(ijk)) THEN
316  IF(wall_at(jp_of(ijk)).OR.wall_at(jm_of(ijk))) THEN
317  a_m(ijk,1,m) = zero
318  a_m(ijk,-1,m) = zero
319  a_m(ijk,2,m) = zero
320  a_m(ijk,-2,m) = zero
321  a_m(ijk,3,m) = zero
322  a_m(ijk,-3,m) = zero
323  a_m(ijk,0,m) = -one
324  b_m(ijk,m) =-((0.09d+0)**0.75*k_turb_g(ijk)**1.5)/dy(j) &
325  *2.0d+0/0.42d+0
326  ELSEIF(wall_at(kp_of(ijk)).OR.wall_at(km_of(ijk))) THEN
327  a_m(ijk,1,m) = zero
328  a_m(ijk,-1,m) = zero
329  a_m(ijk,2,m) = zero
330  a_m(ijk,-2,m) = zero
331  a_m(ijk,3,m) = zero
332  a_m(ijk,-3,m) = zero
333  a_m(ijk,0,m) = -one
334  b_m(ijk,m) =-((0.09d+0)**0.75*k_turb_g(ijk)**1.5)* &
335  (odz(k)*ox(i)*2.0d+0)/0.42d+0
336  ENDIF !for identifying wall cells in J or K direction
337 
338  IF(cylindrical) THEN
339  IF (wall_at(ip_of(ijk))) THEN
340  a_m(ijk,1,m) = zero
341  a_m(ijk,-1,m) = zero
342  a_m(ijk,2,m) = zero
343  a_m(ijk,-2,m) = zero
344  a_m(ijk,3,m) = zero
345  a_m(ijk,-3,m) = zero
346  a_m(ijk,0,m) = -one
347  b_m(ijk,m) =-((0.09d+0)**0.75*k_turb_g(ijk)**1.5)/&
348  dx(i)*2.0d+0/0.42d+0
349 
350  ENDif! for wall cells in I direction
351  ELSEIF (wall_at(ip_of(ijk)).OR.wall_at(im_of(ijk))) THEN
352  a_m(ijk,1,m) = zero
353  a_m(ijk,-1,m) = zero
354  a_m(ijk,2,m) = zero
355  a_m(ijk,-2,m) = zero
356  a_m(ijk,3,m) = zero
357  a_m(ijk,-3,m) = zero
358  a_m(ijk,0,m) = -one
359  b_m(ijk,m) =-((0.09d+0)**0.75*k_turb_g(ijk)**1.5)/dx(i) &
360  *2.0d+0/0.42d+0
361  ENDIF ! for cylindrical
362 
363  IF(cut_cell_at(ijk)) THEN
364  a_m(ijk,1,m) = zero
365  a_m(ijk,-1,m) = zero
366  a_m(ijk,2,m) = zero
367  a_m(ijk,-2,m) = zero
368  a_m(ijk,3,m) = zero
369  a_m(ijk,-3,m) = zero
370  a_m(ijk,0,m) = -one
371  b_m(ijk,m) =-((0.09d+0)**0.75*k_turb_g(ijk)**1.5)/&
372  (0.42d+0*delh_scalar(ijk))
373  ENDIF
374  ENDIF !for fluid at ijk
375  ENDDO ! enddo ijk
376  RETURN
377  END SUBROUTINE source_k_epsilon_bc
double precision, dimension(:,:,:), allocatable a_m
Definition: ambm_mod.f:27
double precision, dimension(:), allocatable flux_ge
Definition: mflux_mod.f:13
subroutine source_k_epsilon_bc(A_M, B_M, M)
double precision to_si
Definition: constant_mod.f:146
double precision, dimension(dim_eqs) ur_fac
Definition: ur_facs_mod.f:6
double precision, dimension(:), allocatable e_turb_go
Definition: fldvar_mod.f:166
integer, dimension(:), allocatable i_of
Definition: indices_mod.f:45
integer ijkend3
Definition: compar_mod.f:80
double precision, dimension(:), allocatable ep_g
Definition: fldvar_mod.f:15
double precision, dimension(:), allocatable flux_gst
Definition: mflux_mod.f:32
double precision, dimension(:), allocatable k_turb_g
Definition: fldvar_mod.f:161
subroutine calc_usr_source(lEQ_NO, A_M, B_M, lB_MMAX, lM, lN)
Definition: usr_src_mod.f:32
double precision, parameter one
Definition: param1_mod.f:29
integer dimension_3
Definition: param_mod.f:11
double precision, dimension(:), allocatable e_turb_g_c
Definition: turb_mod.f:8
integer ijkmax2
Definition: geometry_mod.f:80
subroutine init_ab_m(A_M, B_M, IJKMAX2A, M)
Definition: init_ab_m.f:21
logical added_mass
Definition: run_mod.f:91
double precision, dimension(:,:), allocatable den_resid
Definition: residual_mod.f:52
Definition: rxns_mod.f:1
subroutine under_relax_s(VAR, A_M, B_M, M, UR)
Definition: under_relax.f:21
double precision, dimension(:), allocatable k_turb_go
Definition: fldvar_mod.f:165
double precision, dimension(:), allocatable dif_e_turb_g
Definition: turb_mod.f:13
double precision, dimension(0:dim_j) dy
Definition: geometry_mod.f:70
double precision, dimension(:), allocatable sum_r_g
Definition: rxns_mod.f:28
integer, parameter dimension_bc
Definition: param_mod.f:61
subroutine calc_resid_s(VAR, A_M, B_M, M, NUM, DEN, RESID, MAX_RESID, IJK_RESID, TOL)
Definition: calc_resid.f:197
double precision, dimension(:,:), allocatable num_resid
Definition: residual_mod.f:49
Definition: ambm_mod.f:16
character(len=4), dimension(dim_eqs) leq_sweep
Definition: leqsol_mod.f:20
Definition: turb_mod.f:2
integer, dimension(:), allocatable k_of
Definition: indices_mod.f:47
double precision, dimension(:), allocatable flux_gse
Definition: mflux_mod.f:28
double precision, dimension(:,:), allocatable max_resid
Definition: residual_mod.f:40
integer, dimension(dim_eqs) leq_it
Definition: leqsol_mod.f:11
integer, dimension(:), allocatable j_of
Definition: indices_mod.f:46
double precision, dimension(:), allocatable flux_gn
Definition: mflux_mod.f:15
double precision, dimension(:), allocatable ox
Definition: geometry_mod.f:140
double precision, parameter zero_ep_s
Definition: toleranc_mod.f:15
subroutine lock_ambm
Definition: ambm_mod.f:38
double precision odt
Definition: run_mod.f:54
subroutine bc_phi(VAR, BC_PHIF, BC_PHIW, BC_HW_PHI, BC_C_PHI, M, A_M, B_M)
Definition: bc_phi.f:13
double precision, dimension(:), allocatable dif_k_turb_g
Definition: turb_mod.f:12
double precision, dimension(:), allocatable v_g
Definition: fldvar_mod.f:99
double precision, dimension(0:dim_i) dx
Definition: geometry_mod.f:68
subroutine adjust_leq(RESID, LEQ_ITL, LEQ_METHODL, LEQI, LEQM)
Definition: adjust_leq.f:21
double precision, dimension(:), allocatable w_g
Definition: fldvar_mod.f:111
double precision, dimension(dim_eqs) leq_tol
Definition: leqsol_mod.f:23
Definition: run_mod.f:13
Definition: param_mod.f:2
double precision, dimension(:), allocatable flux_gt
Definition: mflux_mod.f:17
double precision, dimension(:), allocatable delh_scalar
Definition: cutcell_mod.f:196
integer, dimension(:,:), allocatable ijk_resid
Definition: residual_mod.f:46
double precision, dimension(:), allocatable k_turb_g_p
Definition: turb_mod.f:7
logical, dimension(:), allocatable cut_cell_at
Definition: cutcell_mod.f:355
logical k_epsilon
Definition: run_mod.f:97
subroutine conv_dif_phi(PHI, DIF, DISC, UF, VF, WF, Flux_E, Flux_N, Flux_T, M, A_M, B_M)
Definition: conv_dif_phi.f:23
double precision, dimension(:), allocatable odz
Definition: geometry_mod.f:118
logical cylindrical
Definition: geometry_mod.f:168
integer ijkstart3
Definition: compar_mod.f:80
double precision, dimension(dimension_bc) bc_e_turb_g
Definition: bc_mod.f:404
double precision, dimension(:), allocatable u_g
Definition: fldvar_mod.f:87
integer, dimension(dim_eqs) discretize
Definition: run_mod.f:67
double precision, dimension(dimension_bc) bc_k_turb_g
Definition: bc_mod.f:403
integer, parameter resid_ke
Definition: residual_mod.f:19
integer, dimension(dim_eqs) leq_method
Definition: leqsol_mod.f:14
double precision, dimension(:), allocatable e_turb_g_p
Definition: turb_mod.f:9
double precision, dimension(:), allocatable flux_gsn
Definition: mflux_mod.f:30
subroutine source_phi(S_P, S_C, EP, PHI, M, A_M, B_M)
Definition: source_phi.f:26
logical, dimension(dim_eqs) call_usr_source
Definition: usr_src_mod.f:7
double precision, dimension(:,:), allocatable resid
Definition: residual_mod.f:37
double precision, dimension(:,:), allocatable b_m
Definition: ambm_mod.f:28
double precision, dimension(:), allocatable e_turb_g
Definition: fldvar_mod.f:162
double precision, dimension(:), allocatable vol
Definition: geometry_mod.f:212
integer dimension_m
Definition: param_mod.f:18
double precision, dimension(:), allocatable rop_g
Definition: fldvar_mod.f:38
double precision, dimension(:), allocatable k_turb_g_c
Definition: turb_mod.f:6
subroutine solve_k_epsilon_eq(IER)
double precision, parameter zero
Definition: param1_mod.f:27
subroutine unlock_ambm
Definition: ambm_mod.f:52
Definition: bc_mod.f:23
subroutine solve_lin_eq(VNAME, Vno, VAR, A_M, B_M, M, ITMAX, METHOD, SWEEP, TOL1, PC, IER)
Definition: solve_lin_eq.f:19
character(len=4), dimension(dim_eqs) leq_pc
Definition: leqsol_mod.f:26