38 . diffusion, ipm, pm, iparg, elbuf_tab, nercvois, nesdvois, lercvois, lesdvois,
45 use element_mod ,
only : nixs
49#include "implicit_f.inc"
64 type(multi_fvm_struct),
intent(inout) :: multi_fvm
65 my_real,
intent(in) :: time_step
67 type(t_ebcs_tab),
intent(inout),
target :: ebcs_tab
68 integer,
intent(in) :: ipm(npropmi, *)
69 my_real,
intent(in) :: pm(npropm, *)
70 integer,
intent(in) :: iparg(nparg, *)
71 integer,
intent(in) :: nercvois(*), nesdvois(*), lercvois(*), lesdvois(*)
72 integer,
intent(in) :: ixs(nixs, numels)
73 my_real,
intent(in) :: func_value(*)
74 type(elbuf_struct_),
target,
dimension(ngroup),
intent(inout) :: elbuf_tab
78 integer :: i, ii, jj, kk, ng, iebcs, typ, nelem, ielem
79 my_real :: mass, surf, ux, uy, uz, nu, dist, xk(3), xl(3), xf(3)
80 double precision,
dimension(:),
pointer :: sol
81 my_real :: vel(3), nx, ny, nz
82 integer :: mtn, nel, nft, imat, submatlaw, submatid, lencom, ifunc
83 type(g_bufel_),
pointer :: gbuf
84 integer :: mat_nz, glob_dim, ierr, max_id, icount1, icount2
85 class(t_ebcs),
pointer :: ebcs
90 diffusion%nu(:) = zero
91 if (multi_fvm%nbmat == 1)
then
97 submatid = ipm(20 + 1, ixs(1, 1 + nft))
98 submatlaw = ipm(2, submatid)
99 if (submatlaw == 6)
then
102 diffusion%nu(i) = pm(24, submatid) * multi_fvm%rho(i)
113 do imat = 1, multi_fvm%nbmat
114 submatid = ipm(20 + imat, ixs(1, 1 + nft))
115 submatlaw = ipm(2, submatid)
116 if (submatlaw == 6)
then
119 diffusion%nu(i) = diffusion%nu(i) + multi_fvm%phase_alpha(imat, i) *
120 . pm(24, submatid) * multi_fvm%phase_rho(imat, i)
129 lencom = nercvois(nspmd + 1) + nesdvois(nspmd + 1)
131 . nercvois, nesdvois, lercvois, lesdvois, lencom)
136 if (ebcs_tab%nebcs_fvm > 0)
then
140 if (.not. diffusion%outlet_flagged)
then
141 do iebcs = 1, ebcs_tab%nebcs_fvm
142 typ = ebcs_tab%tab(iebcs)%poly%type
143 nelem = ebcs_tab%tab(iebcs)%poly%nb_elem
144 ebcs => ebcs_tab%tab(iebcs)%poly
146 type is (t_ebcs_inlet)
149 ii = ebcs_tab%tab(iebcs)%poly%ielem(ielem)
150 jj = ebcs_tab%tab(iebcs)%poly%iface(ielem)
151 diffusion%flag_outlet(6 * (ii - 1) + jj) = iebcs
153 type is (t_ebcs_fluxout)
156 ii = ebcs_tab%tab(iebcs)%poly%ielem(ielem)
157 jj = ebcs_tab%tab(iebcs)%poly%iface(ielem)
158 diffusion%flag_outlet(6 * (ii - 1) + jj) = -1
162 diffusion%outlet_flagged = .true.
166 diffusion%rhs%val(1:3 * numels) = zero
171 iad = ale_connect%ee_connect%iad_connect(ii)
172 lgth = ale_connect%ee_connect%iad_connect(ii+1) - iad
173 icount1 = icount1 + 1
174 diffusion%mat%irow(icount1) = ale_connect%idglob%id(ii)
175 diffusion%mat%jcol(icount1) = ale_connect%idglob%id(ii
176 xk(1:3) = multi_fvm%elem_data%centroid(1:3, ii)
177 mass = multi_fvm%vol(ii) * multi_fvm%rho(ii)
178 diffusion%mat%val(icount1) = mass
181 kk = ale_connect%ee_connect%connected(iad + jj - 1)
183 surf = multi_fvm%face_data%surf(jj, ii)
184 xl(1:3) = multi_fvm%elem_data%centroid(1:3, kk)
185 dist = sqrt((xk(1) - xl(1))**2 + (xk(2) - xl(2))**2 + (xk(3) - xl(3))**2)
186 nu = 0.5 * (diffusion%nu(ii) + diffusion%nu(kk))
187 diffusion%mat%val(icount1) = diffusion%mat%val(icount1) + time_step * surf
188 else if (diffusion%flag_outlet(6 * (ii - 1) + jj) == -1)
then
190 else if (diffusion%flag_outlet(6 * (ii - 1) + jj) >= 0)
then
192 if (diffusion%flag_outlet(6 * (ii - 1) + jj) == 0)
then
195 iebcs = diffusion%flag_outlet(6 * (ii - 1) + jj)
196 ebcs => ebcs_tab%tab(iebcs)%poly
197 nx = multi_fvm%face_data%normal(1, jj, ii)
198 ny = multi_fvm%face_data%normal(2, jj, ii)
199 nz = multi_fvm%face_data%normal(3, jj, ii)
201 type is (t_ebcs_inlet)
202 if (ebcs%fvm_inlet_data%vector_velocity == 0)
then
204 ifunc = ebcs%fvm_inlet_data%func_vel(1)
206 vel(1) = -ebcs%fvm_inlet_data%val_vel(1) * func_value
207 vel(2) = -ebcs%fvm_inlet_data%val_vel(2) * func_value(ifunc) * ny
208 vel(3) = -ebcs%fvm_inlet_data%val_vel(3) * func_value(ifunc) * nz
210 vel(1) = -ebcs%fvm_inlet_data%val_vel(1) * nx
211 vel(2) = -ebcs%fvm_inlet_data%val_vel(2) * ny
212 vel(3) = -ebcs%fvm_inlet_data%val_vel(3) * nz
216 ifunc = ebcs%fvm_inlet_data%func_vel(1)
218 vel(1) = ebcs%fvm_inlet_data%val_vel(1) * func_value(ifunc)
220 vel(1) = ebcs%fvm_inlet_data%val_vel(1)
222 ifunc = ebcs%fvm_inlet_data%func_vel(2)
224 vel(2) = ebcs%fvm_inlet_data%val_vel(2) * func_value(ifunc)
226 vel(2) = ebcs%fvm_inlet_data%val_vel(2)
228 ifunc = ebcs%fvm_inlet_data%func_vel(3)
230 vel(3) = ebcs%fvm_inlet_data%val_vel(3) * func_value(ifunc
232 vel(3) = ebcs%fvm_inlet_data%val_vel(3)
237 surf = multi_fvm%face_data%surf(jj, ii)
238 xf(1:3) = multi_fvm%face_data%centroid(1:3, jj, ii)
239 xl(1:3) = two * xf(1:3) - xk(1:3)
240 dist = sqrt((xk(1) - xl(1))**2 + (xk(2) - xl(2))**2 + (xk(3) - xl(3))**2)
241 nu = diffusion%nu(ii)
242 diffusion%mat%val(icount1) = diffusion%mat%val(icount1) + time_step * surf * nu
243 diffusion%rhs%val(ii + (1 - 1) * numels) = diffusion%rhs%val(ii + (1 - 1) * numels) +
244 . time_step * surf * nu * vel(1) / dist
245 diffusion%rhs%val(ii + (2 - 1) * numels) = diffusion%rhs%val(ii + (2 -
246 . time_step * surf * nu * vel(2) / dist
247 diffusion%rhs%val(ii + (3 - 1) * numels) = diffusion%rhs%val(ii + (3 - 1) * numels) +
248 . time_step * surf * nu * vel(3) / dist
253 kk = ale_connect%ee_connect%connected(iad + jj - 1)
255 icount2 = icount2 + 1
256 diffusion%mat%irow(icount2) = ale_connect%idglob%id(ii)
257 diffusion%mat%jcol(icount2) = ale_connect%idglob%id(kk)
258 surf = multi_fvm%face_data%surf(jj, ii)
259 xl(1:3) = multi_fvm%elem_data%centroid(1:3, kk)
260 dist = sqrt((xk(1) - xl(1))**2 + (xk(2) - xl(2))**2 + (xk(3) - xl(3))**2)
261 nu = 0.5 * (diffusion%nu(ii) + diffusion%nu(kk))
262 diffusion%mat%val(icount2) = - time_step * surf * nu / dist
270 ux = multi_fvm%vel(1, ii)
271 uy = multi_fvm%vel(2, ii)
272 uz = multi_fvm%vel(3, ii)
273 mass = multi_fvm%vol(ii) * multi_fvm%rho(ii)
274 icount1 = icount1 + 1
275 diffusion%rhs%irow(icount1) = ale_connect%idglob%id(ii)
276 diffusion%rhs%val(ii + (1 - 1) * numels) = diffusion%rhs%val(ii + (1 - 1) * numels) + mass
277 diffusion%rhs%val(ii + (2 - 1) * numels) = diffusion%rhs%val(ii + (2 - 1) * numels) + mass * uy
278 diffusion%rhs%val(ii + (3 - 1) * numels) = diffusion%rhs%val(ii + (3 - 1) * numels) + mass * uz
282 call diffusion%solve_diffusion()
283 call diffusion%get_solution(sol, glob_dim)
285 if (
associated(sol))
then
287 ux = multi_fvm%vel(1, ii)
288 uy = multi_fvm%vel(2, ii)
289 uz = multi_fvm%vel(3, ii)
290 multi_fvm%eint(ii) = multi_fvm%eint(ii) + 0.5 * multi_fvm%rho(ii) * (ux**2 + uy**2 + uz**2)
291 ux = diffusion%sol(ale_connect%idglob%id(ii) + 0 * glob_dim)
292 uy = diffusion%sol(ale_connect%idglob%id(ii) + 1 * glob_dim)
293 uz = diffusion%sol(ale_connect%idglob%id(ii) + 2 * glob_dim)
294 multi_fvm%vel(1, ii) = ux
295 multi_fvm%vel(2, ii) = uy
296 multi_fvm%vel(3, ii) = uz
297 multi_fvm%eint(ii) = multi_fvm%eint(ii) - 0.5 * multi_fvm%rho(ii) * (ux**2 + uy**2 + uz**2)