37 . diffusion, ipm, pm, iparg, elbuf_tab, nercvois, nesdvois, lercvois, lesdvois,
47#include "implicit_f.inc"
62 type(multi_fvm_struct),
intent(inout) :: multi_fvm
63 my_real,
intent(in) :: time_step
65 type(t_ebcs_tab),
intent(inout),
target :: ebcs_tab
66 integer,
intent(in) :: ipm(npropmi, *)
67 my_real,
intent(in) :: pm(npropm, *)
68 integer,
intent(in) :: iparg(nparg, *)
69 integer,
intent(in) :: nercvois(*), nesdvois(
70integer,
intent(in) :: ixs(nixs, numels)
71 my_real,
intent(in) :: func_value(*)
72 type(elbuf_struct_),
target,
dimension(ngroup),
intent(inout) ::
76 integer :: i, ii, jj, kk, ng, iebcs, typ, nelem, ielem
77 my_real :: mass, surf, ux, uy, uz, nu, dist, xk(3), xl(3), xf(3)
78 double precision,
dimension(:),
pointer :: sol
80 integer :: mtn, nel, nft, , submatlaw, , lencom, ifunc
81 type(g_bufel_),
pointer :: gbuf
82 integer :: mat_nz, glob_dim, ierr, max_id, icount1, icount2
83 class(t_ebcs),
pointer :: ebcs
88 diffusion%nu(:) = zero
89 if (multi_fvm%nbmat == 1)
then
95 submatid = ipm(20 + 1, ixs(1, 1 + nft))
96 submatlaw = ipm(2, submatid)
97 if (submatlaw == 6)
then
100 diffusion%nu(i) = pm(24, submatid) * multi_fvm%rho(i)
111 do imat = 1, multi_fvm%nbmat
112 submatid = ipm(20 + imat, ixs(1, 1 + nft))
113 submatlaw = ipm(2, submatid)
114 if (submatlaw == 6)
then
117 diffusion%nu(i) = diffusion%nu(i) + multi_fvm%phase_alpha(imat, i) *
118 . pm(24, submatid) * multi_fvm%phase_rho(imat, i)
127 lencom = nercvois(nspmd + 1) + nesdvois(nspmd + 1)
129 . nercvois, nesdvois, lercvois, lesdvois, lencom)
134 if (ebcs_tab%nebcs_fvm > 0)
then
138 if (.not. diffusion%outlet_flagged)
then
139 do iebcs = 1, ebcs_tab%nebcs_fvm
140 typ = ebcs_tab%tab(iebcs)%poly%type
141 nelem = ebcs_tab%tab(iebcs)%poly%nb_elem
142 ebcs => ebcs_tab%tab(iebcs)%poly
144 type is (t_ebcs_inlet)
147 ii = ebcs_tab%tab(iebcs)%poly%ielem(ielem)
148 jj = ebcs_tab%tab(iebcs)%poly%iface(ielem)
149 diffusion%flag_outlet(6 * (ii - 1) + jj) = iebcs
151 type is (t_ebcs_fluxout)
154 ii = ebcs_tab%tab(iebcs)%poly%ielem(ielem)
155 jj = ebcs_tab%tab(iebcs)%poly%iface(ielem)
156 diffusion%flag_outlet(6 * (ii - 1) + jj) = -1
160 diffusion%outlet_flagged = .true.
164 diffusion%rhs%val(1:3 * numels) = zero
169 iad = ale_connect%ee_connect%iad_connect(ii)
170 lgth = ale_connect%ee_connect%iad_connect(ii+1) - iad
171 icount1 = icount1 + 1
172 diffusion%mat%irow(icount1) = ale_connect%idglob%id(ii)
173 diffusion%mat%jcol(icount1) = ale_connect%idglob%id(ii)
174 xk(1:3) = multi_fvm%elem_data%centroid(1:3, ii)
175 mass = multi_fvm%vol(ii) * multi_fvm%rho(ii)
176 diffusion%mat%val(icount1) = mass
179 kk = ale_connect%ee_connect%connected(iad + jj - 1)
181 surf = multi_fvm%face_data%surf(jj, ii)
182 xl(1:3) = multi_fvm%elem_data%centroid(1:3, kk)
183 dist = sqrt((xk(1) - xl(1))**2 + (xk(2) - xl(2))**2 + (xk(3) - xl(3))**2)
184 nu = 0.5 * (diffusion%nu(ii) + diffusion%nu(kk))
185 diffusion%mat%val(icount1) = diffusion%mat%val(icount1) + time_step * surf * nu / dist
186 else if (diffusion%flag_outlet(6 * (ii - 1) + jj) == -1)
then
188 else if (diffusion%flag_outlet(6 * (ii - 1) + jj) >= 0)
then
190 if (diffusion%flag_outlet(6 * (ii - 1) + jj) == 0)
then
193 iebcs = diffusion%flag_outlet(6 * (ii - 1) + jj)
194 ebcs => ebcs_tab%tab(iebcs
195 nx = multi_fvm%face_data%normal(1, jj, ii)
196 ny = multi_fvm%face_data%normal(2, jj, ii)
197 nz = multi_fvm%face_data%normal(3, jj, ii)
199 type is (t_ebcs_inlet)
200 if (ebcs%fvm_inlet_data%vector_velocity == 0)
then
201! normal velocity imposed
202 ifunc = ebcs%fvm_inlet_data%func_vel(1)
204 vel(1) = -ebcs%fvm_inlet_data%val_vel(1) * func_value
205 vel(2) = -ebcs%fvm_inlet_data%val_vel(2) * func_value(ifunc) * ny
206 vel(3) = -ebcs%fvm_inlet_data%val_vel(3) * func_value(ifunc) * nz
208 vel(1) = -ebcs%fvm_inlet_data%val_vel(1) * nx
209 vel(2) = -ebcs%fvm_inlet_data%val_vel(2) * ny
210 vel(3) = -ebcs%fvm_inlet_data%val_vel(3) * nz
213! all components of velocity are imposed
214 ifunc = ebcs%fvm_inlet_data%func_vel
216 vel(1) = ebcs%fvm_inlet_data%val_vel(1) * func_value(ifunc)
218 vel(1) = ebcs%fvm_inlet_data%val_vel(1)
220 ifunc = ebcs%fvm_inlet_data%func_vel(2)
222 vel(2) = ebcs%fvm_inlet_data%val_vel(2) * func_value(ifunc)
224 vel(2) = ebcs%fvm_inlet_data%val_vel(2)
226 ifunc = ebcs%fvm_inlet_data%func_vel(3)
228 vel(3) = ebcs%fvm_inlet_data%val_vel(3) * func_value(ifunc)
230 vel(3) = ebcs%fvm_inlet_data%val_vel(3)
235 surf = multi_fvm%face_data%surf(jj, ii)
236 xf(1:3) = multi_fvm%face_data%centroid(1:3, jj, ii
237 xl(1:3) = two * xf(1:3) - xk(1:3)
238 dist = sqrt((xk(1) - xl(1))**2 + (xk(2) - xl(2))**2 + (xk(3) - xl(3))**2)
239 nu = diffusion%nu(ii)
240 diffusion%mat%val(icount1) = diffusion%mat%val(icount1) + time_step * surf * nu / dist
241 diffusion%rhs%val(ii + (1 - 1) * numels) = diffusion%rhs%val(ii + (1 - 1) * numels) +
242 . time_step * surf * nu * vel(1) / dist
243 diffusion%rhs%val(ii + (2 - 1) * numels) = diffusion%rhs%val(ii + (2 - 1) * numels) +
244 . time_step * surf * nu * vel(2) / dist
245 diffusion%rhs%val(ii + (3 - 1) * numels) = diffusion%rhs%val(ii + (3 - 1) * numels) +
246 . time_step * surf * nu * vel(3) / dist
251 kk = ale_connect%ee_connect%connected(iad + jj - 1)
253 icount2 = icount2 + 1
254 diffusion%mat%irow(icount2) = ale_connect%idglob%id(ii)
255 diffusion%mat%jcol(icount2) = ale_connect%idglob%id(kk)
256 surf = multi_fvm%face_data%surf(jj, ii)
257 xl(1:3) = multi_fvm%elem_data%centroid(1:3, kk)
258 dist = sqrt((xk(1) - xl(1))**2 + (xk(2) - xl(2))**2 + (xk(3) - xl(3))**2)
259 nu = 0.5 * (diffusion%nu(ii) + diffusion%nu(kk))
260 diffusion%mat%val(icount2) = - time_step * surf * nu / dist
268 ux = multi_fvm%vel(1, ii)
269 uy = multi_fvm%vel(2, ii)
270 uz = multi_fvm%vel(3, ii)
271 mass = multi_fvm%vol(ii) * multi_fvm%rho(ii)
272 icount1 = icount1 + 1
273 diffusion%rhs%irow(icount1) = ale_connect%idglob%id(ii)
274 diffusion%rhs%val(ii + (1 - 1) * numels) = diffusion%rhs%val(ii + (1 - 1) * numels) + mass * ux
275 diffusion%rhs%val(ii + (2 - 1) * numels) = diffusion%rhs%val(ii + (2 - 1) * numels) + mass * uy
276 diffusion%rhs%val(ii + (3 - 1) * numels
280 call diffusion%solve_diffusion()
281 call diffusion%get_solution(sol, glob_dim)
283 if (
associated(sol))
then
285 ux = multi_fvm%vel(1, ii)
286 uy = multi_fvm%vel(2, ii)
287 uz = multi_fvm%vel(3, ii)
288 multi_fvm%eint(ii) = multi_fvm%eint(ii) + 0.5 * multi_fvm%rho(ii) * (ux**2 + uy**2 + uz**2)
289 ux = diffusion%sol(ale_connect%idglob%id(ii) + 0 * glob_dim)
290 uy = diffusion%sol(ale_connect%idglob%id(ii) + 1 * glob_dim)
291 uz = diffusion%sol(ale_connect%idglob%id(ii) + 2 * glob_dim)
292 multi_fvm%vel(1, ii) = ux
293 multi_fvm%vel(2, ii) = uy
294 multi_fvm%vel(3, ii) = uz
295 multi_fvm%eint(ii) = multi_fvm%eint(ii) - 0.5 * multi_fvm%rho