6 #include "petsc/finclude/petsc.h" 14 dt, re, list_mode, pp_mesh, vv_mesh, pn_m1, pn, un_m1, un, hn_p2, bn_p2, tempn, &
15 density_m1, density, density_p1, visco_dyn, level_set_p1, visc_entro_level)
40 REAL(KIND=8) :: time, dt, Re
41 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
42 TYPE(
mesh_type),
INTENT(IN) :: pp_mesh, vv_mesh
45 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(INOUT) :: pn_m1, pn
46 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(INOUT) :: un_m1, un
47 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: tempn
48 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: Hn_p2, Bn_p2
49 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: density_m1, density, density_p1
50 REAL(KIND=8),
DIMENSION(:,:,:,:),
INTENT(IN) :: level_set_p1
51 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: visco_dyn
52 REAL(KIND=8),
DIMENSION(:,:),
INTENT(OUT) :: visc_entro_level
53 REAL(KIND=8),
DIMENSION(vv_mesh%np,6,SIZE(list_mode)) :: Hn_p2_aux
55 INTEGER,
SAVE :: m_max_c
56 TYPE(
dyn_real_line),
DIMENSION(:),
ALLOCATABLE,
SAVE :: pp_global_D
57 TYPE(
dyn_int_line),
DIMENSION(:),
POINTER,
SAVE :: pp_mode_global_js_D
59 TYPE(
dyn_int_line),
DIMENSION(:),
POINTER,
SAVE :: vv_mode_global_js_D
60 TYPE(
dyn_real_line),
DIMENSION(:),
ALLOCATABLE,
SAVE :: vel_global_D
61 LOGICAL,
SAVE :: once = .true.
62 INTEGER,
SAVE :: my_petscworld_rank
63 REAL(KIND=8),
SAVE :: nu_bar
64 REAL(KIND=8),
SAVE :: stab_bar
65 REAL(KIND=8),
DIMENSION(:,:,:),
ALLOCATABLE,
SAVE :: momentum, momentum_m1, momentum_m2
66 INTEGER,
SAVE :: bloc_size, m_max_pad, nb_procs
67 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:,:,:),
SAVE :: visc_grad_vel_m1
68 REAL(KIND=8),
ALLOCATABLE,
DIMENSION(:,:,:,:),
SAVE :: tensor_m1_gauss
69 REAL(KIND=8),
DIMENSION(:,:),
ALLOCATABLE,
SAVE :: visc_entro_real
73 INTEGER,
POINTER,
DIMENSION(:) :: pp_1_ifrom, vv_3_ifrom
75 INTEGER :: i, k, m, n, n1, n2, n3, n123, nb_inter
76 INTEGER :: code, nu_mat, mode
77 REAL(KIND=8) :: moyenne
79 REAL(KIND=8),
DIMENSION(pp_mesh%np, 2, SIZE(list_mode)) :: div
80 REAL(KIND=8),
DIMENSION(pp_mesh%np, 2, SIZE(list_mode)) :: visco_dyn_P1, visc_div
81 REAL(KIND=8),
DIMENSION(pp_mesh%np, 2) :: pn_p1
82 REAL(KIND=8),
DIMENSION(vv_mesh%np, 6) :: un_p1
83 REAL(KIND=8),
DIMENSION(vv_mesh%gauss%l_G*vv_mesh%dom_me,6,SIZE(list_mode)) :: rotb_b, rotb_b_aux
84 REAL(KIND=8),
DIMENSION(3,vv_mesh%gauss%l_G*vv_mesh%dom_me,6,SIZE(list_mode)) :: visc_grad_vel
85 REAL(KIND=8),
DIMENSION(3,vv_mesh%gauss%l_G*vv_mesh%dom_me,6,SIZE(list_mode)) :: stab_grad_mom
86 REAL(KIND=8),
DIMENSION(3,vv_mesh%gauss%l_G*vv_mesh%dom_me,6,SIZE(list_mode)) :: visc_entro_grad_mom
87 REAL(KIND=8),
DIMENSION(vv_mesh%gauss%l_G*vv_mesh%dom_me,2,SIZE(list_mode)) :: stab_div_vel
88 REAL(KIND=8),
DIMENSION(3,vv_mesh%gauss%l_G*vv_mesh%dom_me,6,SIZE(list_mode)) :: tensor_surface_gauss
89 REAL(KIND=8),
DIMENSION(3,vv_mesh%gauss%l_G*vv_mesh%dom_me,6,SIZE(list_mode)) :: tensor_gauss
90 REAL(KIND=8),
DIMENSION(3,vv_mesh%np,6,SIZE(list_mode)) :: tensor
91 REAL(KIND=8),
DIMENSION(vv_mesh%gauss%l_G*vv_mesh%dom_me,6,SIZE(list_mode)) :: rhs_gauss
92 REAL(KIND=8),
DIMENSION(3,vv_mesh%gauss%l_G*vv_mesh%dom_me,6) :: visc_grad_vel_ext
93 REAL(KIND=8),
DIMENSION(3,vv_mesh%gauss%l_G*vv_mesh%dom_me,6) :: tensor_gauss_ext
94 REAL(KIND=8),
DIMENSION(vv_mesh%np,6,SIZE(list_mode)) :: uext, momentumext, momentum_exact, momentumext_div
95 REAL(KIND=8),
DIMENSION(inputs%nb_fluid-1, vv_mesh%np, 2, SIZE(list_mode)) :: level_set_FEM_P2
97 REAL(KIND=8),
DIMENSION(vv_mesh%np) :: vel_loc, vel_tot
98 REAL(KIND=8) :: coeff, vloc, cfl, cfl_max, norm
99 INTEGER :: nb_procs_LES, bloc_size_LES, m_max_pad_LES, bloc_size_P1
101 REAL(KIND=8) :: one, zero, three
102 DATA zero, one, three/0.d0,1.d0,3.d0/
105 petscerrorcode :: ierr
106 mpi_comm,
DIMENSION(:),
POINTER :: comm_one_d
107 mat,
DIMENSION(:),
POINTER,
SAVE :: vel_mat
108 mat,
SAVE :: mass_mat, mass_mat0
109 vec,
SAVE :: vb_3_145, vb_3_236, vx_3, vx_3_ghost
110 vec,
SAVE :: pb_1, pb_2, px_1, px_1_ghost
111 ksp,
DIMENSION(:),
POINTER,
SAVE :: vel_ksp
112 ksp,
SAVE :: mass_ksp, mass_ksp0
117 CALL mpi_comm_rank(petsc_comm_world,my_petscworld_rank,code)
122 CALL veccreateghost(comm_one_d(1), n, &
123 petsc_determine,
SIZE(vv_3_ifrom), vv_3_ifrom, vx_3, ierr)
124 CALL vecghostgetlocalform(vx_3, vx_3_ghost, ierr)
125 CALL vecduplicate(vx_3, vb_3_145, ierr)
126 CALL vecduplicate(vx_3, vb_3_236, ierr)
130 CALL veccreateghost(comm_one_d(1), n, &
131 petsc_determine,
SIZE(pp_1_ifrom), pp_1_ifrom, px_1, ierr)
132 CALL vecghostgetlocalform(px_1, px_1_ghost, ierr)
133 CALL vecduplicate(px_1, pb_1, ierr)
134 CALL vecduplicate(px_1, pb_2, ierr)
138 m_max_c =
SIZE(list_mode)
142 ALLOCATE(momentum(
SIZE(un,1),
SIZE(un,2),
SIZE(un,3)),&
143 momentum_m1(
SIZE(un,1),
SIZE(un,2),
SIZE(un,3)), &
144 momentum_m2(
SIZE(un,1),
SIZE(un,2),
SIZE(un,3)))
145 CALL mpi_comm_size(comm_one_d(2), nb_procs, code)
146 bloc_size =
SIZE(un,1)/nb_procs+1
147 m_max_pad = 3*
SIZE(list_mode)*nb_procs/2
149 IF (
inputs%if_level_set)
THEN 151 bloc_size, m_max_pad)
153 bloc_size, m_max_pad)
161 ALLOCATE(tensor_m1_gauss(3,vv_mesh%gauss%l_G*vv_mesh%dom_me,6,
SIZE(list_mode)))
163 nb_procs, bloc_size, m_max_pad, tensor, tensor_m1_gauss)
165 ALLOCATE(visc_grad_vel_m1(3,vv_mesh%gauss%l_G*vv_mesh%dom_me,6,
SIZE(list_mode)))
167 visco_dyn/re, un_m1, visc_grad_vel_m1)
171 CALL mpi_comm_size(comm_one_d(2), nb_procs_les, code)
172 bloc_size_les = vv_mesh%gauss%l_G*vv_mesh%dom_me/nb_procs_les+1
173 bloc_size_les = vv_mesh%gauss%l_G*(bloc_size_les/vv_mesh%gauss%l_G)+vv_mesh%gauss%l_G
174 m_max_pad_les = 3*
SIZE(list_mode)*nb_procs_les/2
175 ALLOCATE(visc_entro_real(2*m_max_pad_les-1,bloc_size_les))
176 visc_entro_real = 0.d0
184 ALLOCATE(pp_global_d(m_max_c))
186 ALLOCATE(pp_global_d(i)%DRL(
SIZE(pp_mode_global_js_d(i)%DIL)))
192 vv_js_d, vv_mode_global_js_d)
194 ALLOCATE(vel_global_d(m_max_c))
196 ALLOCATE(vel_global_d(i)%DRL(
SIZE(vv_mode_global_js_d(i)%DIL)))
204 IF (list_mode(i)==0) cycle
210 IF (minval(list_mode)==0)
THEN 214 IF (list_mode(i).NE.0) cycle
223 ALLOCATE(vel_mat(2*m_max_c),vel_ksp(2*m_max_c))
226 IF (
inputs%if_level_set)
THEN 230 nu_bar = max(nu_bar,
inputs%dyna_visc_fluid(n)/
inputs%density_fluid(n))
231 stab_bar = max(stab_bar,1.d0/
inputs%density_fluid(n))
235 stab_bar = 1.1d0*stab_bar
246 IF (
inputs%if_moment_bdf2)
THEN 249 i, mode, vel_mat(nu_mat))
253 i, mode, vel_mat(nu_mat))
255 IF (
inputs%my_periodic%nb_periodic_pairs/=0)
THEN 257 vel_mat(nu_mat), vv_3_la)
260 CALL init_solver(
inputs%my_par_vv,vel_ksp(nu_mat),vel_mat(nu_mat),comm_one_d(1),&
264 IF (
inputs%if_moment_bdf2)
THEN 267 i, mode, vel_mat(nu_mat))
271 i, mode, vel_mat(nu_mat))
273 IF (
inputs%my_periodic%nb_periodic_pairs/=0)
THEN 275 vel_mat(nu_mat), vv_3_la)
278 CALL init_solver(
inputs%my_par_vv,vel_ksp(nu_mat),vel_mat(nu_mat),comm_one_d(1),&
288 IF (
inputs%if_moment_bdf2)
THEN 290 IF (
inputs%if_level_set)
THEN 293 bloc_size, m_max_pad)
295 momentumext = 2*momentum - momentum_m1
298 IF (
inputs%if_level_set)
THEN 301 bloc_size, m_max_pad)
303 momentumext_div = momentum
308 IF (
inputs%if_level_set)
THEN 311 bloc_size, m_max_pad)
313 momentumext = momentum
315 momentumext_div=momentumext
320 IF (
inputs%precession)
THEN 321 CALL error_petsc(
'for momentum ns: precession should be in condlim')
325 IF (
inputs%type_pb==
'mhd')
THEN 327 IF (
inputs%if_quasi_static_approx)
THEN 330 hn_p2_aux(:,:,i) = h_b_quasi_static(
'H', vv_mesh%rr, mode)
335 hn_p2_aux(:,:,i) = h_b_quasi_static(
'B', vv_mesh%rr, mode)
338 rotb_b = rotb_b + rotb_b_aux
348 IF (
inputs%if_level_set)
THEN 351 visco_dyn/re, nu_bar/re, un, momentumext, visc_grad_vel, stab_grad_mom)
356 stab_div_vel=
inputs%penal_coeff_art_comp*stab_div_vel
359 IF (
inputs%if_surface_tension)
THEN 361 IF (
inputs%if_level_set_P2)
THEN 363 level_set_p1, tensor_surface_gauss)
365 DO nb_inter = 1,
inputs%nb_fluid-1
366 DO i = 1,
SIZE(list_mode)
368 CALL inject_p1_p2(pp_mesh%jj, vv_mesh%jj, level_set_p1(nb_inter,:,k,i), &
369 level_set_fem_p2(nb_inter,:,k,i))
374 level_set_fem_p2, tensor_surface_gauss)
377 tensor_surface_gauss = 0.d0
383 tensor_surface_gauss = 0.d0
390 visc_entro_real, momentumext, visc_entro_grad_mom)
392 visc_entro_grad_mom=0.d0
398 nb_procs, bloc_size, m_max_pad, tensor, tensor_gauss)
402 CALL momentum_dirichlet(comm_one_d(2), vv_mesh, list_mode, time, nb_procs, density_p1, &
403 momentum_exact, vv_js_d)
409 IF (
inputs%if_moment_bdf2)
THEN 411 (4*momentum-momentum_m1)/(2*
inputs%dt), pn, -rotb_b, rhs_gauss, tempn, density_p1)
414 (momentum)/(
inputs%dt), pn, -rotb_b, rhs_gauss, tempn, density_p1)
423 IF (
inputs%if_moment_bdf2)
THEN 426 tensor_gauss_ext = 2*tensor_gauss(:,:,:,i) - tensor_m1_gauss(:,:,:,i)
427 visc_grad_vel_ext = 2*visc_grad_vel(:,:,:,i) - visc_grad_vel_m1(:,:,:,i)
429 tensor_m1_gauss(:,:,:,i) = tensor_gauss(:,:,:,i)
430 visc_grad_vel_m1(:,:,:,i) = visc_grad_vel(:,:,:,i)
432 CALL rhs_3x3_art_comp(vv_mesh, vv_3_la, mode, rhs_gauss(:,:,i), vb_3_145, vb_3_236, &
433 opt_tensor=tensor_gauss_ext+tensor_surface_gauss(:,:,:,i) &
434 -visc_grad_vel_ext+stab_grad_mom(:,:,:,i)-visc_entro_grad_mom(:,:,:,i), &
435 opt_grad_div=-stab_div_vel(:,:,i))
437 CALL rhs_3x3_art_comp(vv_mesh, vv_3_la, mode, rhs_gauss(:,:,i), vb_3_145, vb_3_236, &
438 opt_tensor=tensor_gauss(:,:,:,i)+tensor_surface_gauss(:,:,:,i) &
439 -visc_grad_vel(:,:,:,i)+stab_grad_mom(:,:,:,i)-visc_entro_grad_mom(:,:,:,i), &
440 opt_grad_div=-stab_div_vel(:,:,i))
444 IF (
inputs%my_periodic%nb_periodic_pairs/=0)
THEN 445 CALL periodic_rhs_petsc(vvz_per%n_bord, vvz_per%list, vvz_per%perlist, vb_3_236, vv_3_la)
446 CALL periodic_rhs_petsc(vvz_per%n_bord, vvz_per%list, vvz_per%perlist, vb_3_145, vv_3_la)
450 n1 =
SIZE(vv_js_d(1)%DIL)
451 n2 =
SIZE(vv_js_d(2)%DIL)
452 n3 =
SIZE(vv_js_d(3)%DIL)
454 vel_global_d(i)%DRL(1:n1) = momentum_exact(vv_js_d(1)%DIL,1,i)
455 vel_global_d(i)%DRL(n1+1:n1+n2) = momentum_exact(vv_js_d(2)%DIL,4,i)
456 vel_global_d(i)%DRL(n1+n2+1:n123)= momentum_exact(vv_js_d(3)%DIL,5,i)
457 vel_global_d(i)%DRL(n123+1:) = 0.d0
458 CALL dirichlet_rhs(vv_mode_global_js_d(i)%DIL-1,vel_global_d(i)%DRL,vb_3_145)
459 vel_global_d(i)%DRL(1:n1) = momentum_exact(vv_js_d(1)%DIL,2,i)
460 vel_global_d(i)%DRL(n1+1:n1+n2) = momentum_exact(vv_js_d(2)%DIL,3,i)
461 vel_global_d(i)%DRL(n1+n2+1:n123)= momentum_exact(vv_js_d(3)%DIL,6,i)
462 CALL dirichlet_rhs(vv_mode_global_js_d(i)%DIL-1,vel_global_d(i)%DRL,vb_3_236)
469 CALL vecghostupdatebegin(vx_3,insert_values,scatter_forward,ierr)
470 CALL vecghostupdateend(vx_3,insert_values,scatter_forward,ierr)
471 CALL extract(vx_3_ghost,1,1,vv_3_la,un_p1(:,1))
472 CALL extract(vx_3_ghost,2,2,vv_3_la,un_p1(:,4))
473 CALL extract(vx_3_ghost,3,3,vv_3_la,un_p1(:,5))
477 CALL vecghostupdatebegin(vx_3,insert_values,scatter_forward,ierr)
478 CALL vecghostupdateend(vx_3,insert_values,scatter_forward,ierr)
479 CALL extract(vx_3_ghost,1,1,vv_3_la,un_p1(:,2))
480 CALL extract(vx_3_ghost,2,2,vv_3_la,un_p1(:,3))
481 CALL extract(vx_3_ghost,3,3,vv_3_la,un_p1(:,6))
493 momentum_m2(:,:,i) = momentum_m1(:,:,i)
494 momentum_m1(:,:,i) = momentum(:,:,i)
495 momentum(:,:,i) = un_p1
502 IF (
inputs%if_level_set)
THEN 504 bloc_size, m_max_pad)
518 IF (
inputs%my_periodic%nb_periodic_pairs/=0)
THEN 525 pp_global_d(i)%DRL = 0.d0
526 CALL dirichlet_rhs(pp_mode_global_js_d(i)%DIL-1,pp_global_d(i)%DRL,pb_1)
527 CALL dirichlet_rhs(pp_mode_global_js_d(i)%DIL-1,pp_global_d(i)%DRL,pb_2)
536 CALL vecghostupdatebegin(px_1,insert_values,scatter_forward,ierr)
537 CALL vecghostupdateend(px_1,insert_values,scatter_forward,ierr)
538 CALL extract(px_1_ghost,1,1,pp_1_la,div(:,1,i))
544 CALL vecghostupdatebegin(px_1,insert_values,scatter_forward,ierr)
545 CALL vecghostupdateend(px_1,insert_values,scatter_forward,ierr)
546 CALL extract(px_1_ghost,1,1,pp_1_la,div(:,2,i))
554 CALL project_p2_p1(vv_mesh%jj, pp_mesh%jj, visco_dyn(:,k,i), visco_dyn_p1(:,k,i))
557 bloc_size_p1 =
SIZE(div,1)/nb_procs+1
558 CALL fft_par_prod_dcl(comm_one_d(2), visco_dyn_p1, div, visc_div, nb_procs, bloc_size_p1, m_max_pad)
565 pn_p1(:,:) = pn(:,:,i)
567 pn_p1(:,k) = pn_p1(:,k) -
inputs%penal_coeff_art_comp*div(:,k,i)
573 CALL moy(comm_one_d(1),pp_mesh, pn_p1(:,1),moyenne)
574 pn_p1(:,1) = pn_p1(:,1)-moyenne
585 pn_m1(:,:,i) = pn(:,:,i)
592 IF (
inputs%verbose_divergence)
THEN 593 norm =
norm_sf(comm_one_d,
'H1', vv_mesh, list_mode, un)
600 IF (
inputs%verbose_CFL)
THEN 603 IF (list_mode(i)==0)
THEN 608 vel_loc = vel_loc + coeff*(un(:,1,i)**2+un(:,2,i)**2+un(:,3,i)**2 &
609 +un(:,4,i)**2+un(:,5,i)**2+un(:,6,i)**2)
611 CALL mpi_comm_size(comm_one_d(2),nb_procs,code)
612 CALL mpi_allreduce(vel_loc,vel_tot,vv_mesh%np,mpi_double_precision, mpi_sum, comm_one_d(2), code)
613 vel_tot = sqrt(vel_tot)
615 DO m = 1, vv_mesh%dom_me
616 vloc = maxval(vel_tot(vv_mesh%jj(:,m)))
617 cfl = max(vloc*dt/min(vv_mesh%hloc(m),maxval(vv_mesh%hm)),cfl)
619 CALL mpi_allreduce(cfl,cfl_max,1,mpi_double_precision, mpi_max, comm_one_d(1), code)
626 IF (
inputs%if_level_set)
THEN 629 momentum, momentum_m1, momentum_m2, pn_m1, un_m1, tensor, visc_grad_vel, tensor_surface_gauss, &
630 rotb_b, visco_dyn, density_m1, density, density_p1, tempn, visc_entro_real, visc_entro_level)
632 visc_entro_real = 0.d0
633 visc_entro_level= 0.d0
636 IF (
inputs%if_LES_in_momentum)
THEN 638 momentum, momentum_m1, momentum_m2, pn_m1, un_m1, tensor, rotb_b, tempn, visc_entro_real)
657 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
658 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: V_in, W_in
659 REAL(KIND=8),
DIMENSION(:,:,:) :: V_out
660 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%me,6,SIZE(list_mode)) :: RotV, V, W
661 INTEGER,
DIMENSION(mesh%gauss%n_w) :: j_loc
662 REAL(KIND=8),
DIMENSION(mesh%gauss%k_d,mesh%gauss%n_w) :: dw_loc
663 INTEGER :: m, l , i, mode, index, k
664 REAL(KIND=8),
DIMENSION(mesh%gauss%n_w,6) :: Vs, Ws
667 REAL(KIND=8),
DIMENSION(3) :: temps
669 INTEGER :: nb_procs, bloc_size, m_max_pad, code
670 mpi_comm :: communicator
673 DO i = 1,
SIZE(list_mode)
679 vs(:,k) = v_in(j_loc,k,i)
680 ws(:,k) = w_in(j_loc,k,i)
683 DO l = 1, mesh%gauss%l_G
685 dw_loc = mesh%gauss%dw(:,:,l,m)
688 ray = sum(mesh%rr(1,j_loc)*mesh%gauss%ww(:,l))
691 w(index,1,i) = sum(ws(:,1)*mesh%gauss%ww(:,l))
692 w(index,3,i) = sum(ws(:,3)*mesh%gauss%ww(:,l))
693 w(index,5,i) = sum(ws(:,5)*mesh%gauss%ww(:,l))
695 w(index,2,i) = sum(ws(:,2)*mesh%gauss%ww(:,l))
696 w(index,4,i) = sum(ws(:,4)*mesh%gauss%ww(:,l))
697 w(index,6,i) = sum(ws(:,6)*mesh%gauss%ww(:,l))
698 v(index,1,i) = sum(vs(:,1)*mesh%gauss%ww(:,l))
699 v(index,3,i) = sum(vs(:,3)*mesh%gauss%ww(:,l))
700 v(index,5,i) = sum(vs(:,5)*mesh%gauss%ww(:,l))
702 v(index,2,i) = sum(vs(:,2)*mesh%gauss%ww(:,l))
703 v(index,4,i) = sum(vs(:,4)*mesh%gauss%ww(:,l))
704 v(index,6,i) = sum(vs(:,6)*mesh%gauss%ww(:,l))
707 rotv(index,1,i) = mode/ray*v(index,6,i) &
708 -sum(vs(:,3)*dw_loc(2,:))
709 rotv(index,4,i) = sum(vs(:,2)*dw_loc(2,:)) &
710 -sum(vs(:,6)*dw_loc(1,:))
711 rotv(index,5,i) = 1/ray*v(index,3,i) &
712 +sum(vs(:,3)*dw_loc(1,:)) &
713 -mode/ray*v(index,2,i)
715 rotv(index,2,i) =-mode/ray*v(index,5,i) &
716 -sum(vs(:,4)*dw_loc(2,:))
717 rotv(index,3,i) = sum(vs(:,1)*dw_loc(2,:)) &
718 -sum(vs(:,5)*dw_loc(1,:))
719 rotv(index,6,i) = 1/ray*v(index,4,i) &
720 +sum(vs(:,4)*dw_loc(1,:))&
721 +mode/ray*v(index,1,i)
727 CALL mpi_comm_size(communicator, nb_procs, code)
728 bloc_size =
SIZE(rotv,1)/nb_procs+1
729 m_max_pad = 3*
SIZE(list_mode)*nb_procs/2
737 vel, mom, v_out, v2_out)
745 INTEGER,
INTENT(IN) :: nb_procs
746 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
747 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: visc_dyn
748 REAL(KIND=8) :: stab_mom
749 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: vel
750 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: mom
751 REAL(KIND=8),
DIMENSION(3,mesh%gauss%l_G*mesh%dom_me,6,SIZE(list_mode)),
INTENT(OUT) :: V_out
752 REAL(KIND=8),
DIMENSION(3,mesh%gauss%l_G*mesh%dom_me,6,SIZE(list_mode)),
INTENT(OUT) :: V2_out
753 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%dom_me,6,SIZE(list_mode)) :: grad1_vel, grad2_vel, grad3_vel
754 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%dom_me,6,SIZE(list_mode)) :: gradT1_vel, gradT2_vel, gradT3_vel
755 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%dom_me,6,SIZE(list_mode)) :: grad1_mom, grad2_mom, grad3_mom
756 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%dom_me,6,SIZE(list_mode)) :: gradT1_mom, gradT2_mom, gradT3_mom
757 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%dom_me,6,SIZE(list_mode)) :: part_tensor_1, part_tensor_2
758 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%dom_me,6,SIZE(list_mode)) :: part_visc_sym_grad_1
759 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%dom_me,6,SIZE(list_mode)) :: part_visc_sym_grad_2
760 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%dom_me,2,SIZE(list_mode)) :: visc_dyn_gauss
761 INTEGER,
DIMENSION(mesh%gauss%n_w) :: j_loc
762 REAL(KIND=8),
DIMENSION(mesh%gauss%k_d,mesh%gauss%n_w) :: dw_loc
763 REAL(KIND=8),
DIMENSION(mesh%gauss%n_w,6) :: vel_loc, mom_loc
765 INTEGER :: m, l , i, mode, index, k
766 INTEGER :: m_max_pad, bloc_size
767 mpi_comm :: communicator
771 DO i = 1,
SIZE(list_mode)
774 DO m = 1, mesh%dom_me
777 vel_loc(:,k) = vel(j_loc,k,i)
778 mom_loc(:,k) = mom(j_loc,k,i)
785 ray = sum(mesh%rr(1,j_loc)*
ww(:,l))
788 visc_dyn_gauss(index,1,i) = sum(visc_dyn(j_loc,1,i)*
ww(:,l))
789 visc_dyn_gauss(index,2,i) = sum(visc_dyn(j_loc,2,i)*
ww(:,l))
792 grad1_vel(index,1,i) = sum(vel_loc(:,1)*dw_loc(1,:))
793 grad1_vel(index,2,i) = sum(vel_loc(:,2)*dw_loc(1,:))
794 grad1_vel(index,3,i) = (mode*sum(vel_loc(:,2)*
ww(:,l)) - sum(vel_loc(:,3)*
ww(:,l)))/ray
795 grad1_vel(index,4,i) = (-mode*sum(vel_loc(:,1)*
ww(:,l)) - sum(vel_loc(:,4)*
ww(:,l)))/ray
796 grad1_vel(index,5,i) = sum(vel_loc(:,1)*dw_loc(2,:))
797 grad1_vel(index,6,i) = sum(vel_loc(:,2)*dw_loc(2,:))
799 grad1_mom(index,1,i) = stab_mom*sum(mom_loc(:,1)*dw_loc(1,:))
800 grad1_mom(index,2,i) = stab_mom*sum(mom_loc(:,2)*dw_loc(1,:))
801 grad1_mom(index,3,i) = stab_mom*(mode*sum(mom_loc(:,2)*
ww(:,l)) - sum(mom_loc(:,3)*
ww(:,l)))/ray
802 grad1_mom(index,4,i) = stab_mom*(-mode*sum(mom_loc(:,1)*
ww(:,l)) - sum(mom_loc(:,4)*
ww(:,l)))/ray
803 grad1_mom(index,5,i) = stab_mom*sum(mom_loc(:,1)*dw_loc(2,:))
804 grad1_mom(index,6,i) = stab_mom*sum(mom_loc(:,2)*dw_loc(2,:))
807 grad2_vel(index,1,i) = sum(vel_loc(:,3)*dw_loc(1,:))
808 grad2_vel(index,2,i) = sum(vel_loc(:,4)*dw_loc(1,:))
809 grad2_vel(index,3,i) = (mode*sum(vel_loc(:,4)*
ww(:,l)) + sum(vel_loc(:,1)*
ww(:,l)))/ray
810 grad2_vel(index,4,i) = (-mode*sum(vel_loc(:,3)*
ww(:,l)) + sum(vel_loc(:,2)*
ww(:,l)))/ray
811 grad2_vel(index,5,i) = sum(vel_loc(:,3)*dw_loc(2,:))
812 grad2_vel(index,6,i) = sum(vel_loc(:,4)*dw_loc(2,:))
814 grad2_mom(index,1,i) = stab_mom*sum(mom_loc(:,3)*dw_loc(1,:))
815 grad2_mom(index,2,i) = stab_mom*sum(mom_loc(:,4)*dw_loc(1,:))
816 grad2_mom(index,3,i) = stab_mom*(mode*sum(mom_loc(:,4)*
ww(:,l)) + sum(mom_loc(:,1)*
ww(:,l)))/ray
817 grad2_mom(index,4,i) = stab_mom*(-mode*sum(mom_loc(:,3)*
ww(:,l)) + sum(mom_loc(:,2)*
ww(:,l)))/ray
818 grad2_mom(index,5,i) = stab_mom*sum(mom_loc(:,3)*dw_loc(2,:))
819 grad2_mom(index,6,i) = stab_mom*sum(mom_loc(:,4)*dw_loc(2,:))
823 grad3_vel(index,1,i) = sum(vel_loc(:,5)*dw_loc(1,:))
824 grad3_vel(index,2,i) = sum(vel_loc(:,6)*dw_loc(1,:))
825 grad3_vel(index,3,i) = mode*sum(vel_loc(:,6)*
ww(:,l))/ray
826 grad3_vel(index,4,i) = -mode*sum(vel_loc(:,5)*
ww(:,l))/ray
827 grad3_vel(index,5,i) = sum(vel_loc(:,5)*dw_loc(2,:))
828 grad3_vel(index,6,i) = sum(vel_loc(:,6)*dw_loc(2,:))
830 grad3_mom(index,1,i) = stab_mom*sum(mom_loc(:,5)*dw_loc(1,:))
831 grad3_mom(index,2,i) = stab_mom*sum(mom_loc(:,6)*dw_loc(1,:))
832 grad3_mom(index,3,i) = stab_mom*mode*sum(mom_loc(:,6)*
ww(:,l))/ray
833 grad3_mom(index,4,i) = stab_mom*(-mode*sum(mom_loc(:,5)*
ww(:,l)))/ray
834 grad3_mom(index,5,i) = stab_mom*sum(mom_loc(:,5)*dw_loc(2,:))
835 grad3_mom(index,6,i) = stab_mom*sum(mom_loc(:,6)*dw_loc(2,:))
841 gradt1_vel(:,1,:) = grad1_vel(:,1,:)
842 gradt1_vel(:,2,:) = grad1_vel(:,2,:)
843 gradt1_vel(:,3,:) = grad2_vel(:,1,:)
844 gradt1_vel(:,4,:) = grad2_vel(:,2,:)
845 gradt1_vel(:,5,:) = grad3_vel(:,1,:)
846 gradt1_vel(:,6,:) = grad3_vel(:,2,:)
848 gradt1_mom(:,1,:) = grad1_mom(:,1,:)
849 gradt1_mom(:,2,:) = grad1_mom(:,2,:)
850 gradt1_mom(:,3,:) = grad2_mom(:,1,:)
851 gradt1_mom(:,4,:) = grad2_mom(:,2,:)
852 gradt1_mom(:,5,:) = grad3_mom(:,1,:)
853 gradt1_mom(:,6,:) = grad3_mom(:,2,:)
856 gradt2_vel(:,1,:) = grad1_vel(:,3,:)
857 gradt2_vel(:,2,:) = grad1_vel(:,4,:)
858 gradt2_vel(:,3,:) = grad2_vel(:,3,:)
859 gradt2_vel(:,4,:) = grad2_vel(:,4,:)
860 gradt2_vel(:,5,:) = grad3_vel(:,3,:)
861 gradt2_vel(:,6,:) = grad3_vel(:,4,:)
863 gradt2_mom(:,1,:) = grad1_mom(:,3,:)
864 gradt2_mom(:,2,:) = grad1_mom(:,4,:)
865 gradt2_mom(:,3,:) = grad2_mom(:,3,:)
866 gradt2_mom(:,4,:) = grad2_mom(:,4,:)
867 gradt2_mom(:,5,:) = grad3_mom(:,3,:)
868 gradt2_mom(:,6,:) = grad3_mom(:,4,:)
871 gradt3_vel(:,1,:) = grad1_vel(:,5,:)
872 gradt3_vel(:,2,:) = grad1_vel(:,6,:)
873 gradt3_vel(:,3,:) = grad2_vel(:,5,:)
874 gradt3_vel(:,4,:) = grad2_vel(:,6,:)
875 gradt3_vel(:,5,:) = grad3_vel(:,5,:)
876 gradt3_vel(:,6,:) = grad3_vel(:,6,:)
878 gradt3_mom(:,1,:) = grad1_mom(:,5,:)
879 gradt3_mom(:,2,:) = grad1_mom(:,6,:)
880 gradt3_mom(:,3,:) = grad2_mom(:,5,:)
881 gradt3_mom(:,4,:) = grad2_mom(:,6,:)
882 gradt3_mom(:,5,:) = grad3_mom(:,5,:)
883 gradt3_mom(:,6,:) = grad3_mom(:,6,:)
886 grad1_vel = grad1_vel + gradt1_vel
887 grad2_vel = grad2_vel + gradt2_vel
888 grad3_vel = grad3_vel + gradt3_vel
890 grad1_mom = grad1_mom + gradt1_mom
891 grad2_mom = grad2_mom + gradt2_mom
892 grad3_mom = grad3_mom + gradt3_mom
895 part_tensor_1 = grad1_vel(:,:,:)
896 part_tensor_2(:,1:4,:) = grad2_vel(:,3:6,:)
897 part_tensor_2(:,5:6,:) = grad3_vel(:,5:6,:)
898 m_max_pad = 3*
SIZE(list_mode)*nb_procs/2
899 bloc_size =
SIZE(grad1_vel,1)/nb_procs+1
901 part_visc_sym_grad_1, part_visc_sym_grad_2, nb_procs, bloc_size, m_max_pad)
904 v_out(1,:,:,:) = part_visc_sym_grad_1
905 v_out(2,:,1:2,:) = part_visc_sym_grad_1(:,3:4,:)
906 v_out(2,:,3:6,:) = part_visc_sym_grad_2(:,1:4,:)
907 v_out(3,:,1:2,:) = part_visc_sym_grad_1(:,5:6,:)
908 v_out(3,:,3:4,:) = part_visc_sym_grad_2(:,3:4,:)
909 v_out(3,:,5:6,:) = part_visc_sym_grad_2(:,5:6,:)
912 v2_out(1,:,:,:) = grad1_mom
913 v2_out(2,:,:,:) = grad2_mom
914 v2_out(3,:,:,:) = grad3_mom
926 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
927 REAL(KIND=8),
INTENT(IN) :: stab
928 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: vel
929 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: mom
930 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%dom_me,2,SIZE(list_mode)),
INTENT(OUT) :: c_out
931 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%dom_me,2,SIZE(list_mode)) :: div_vel
932 REAL(KIND=8),
DIMENSION(mesh%gauss%l_G*mesh%dom_me,2,SIZE(list_mode)) :: div_mom
933 INTEGER,
DIMENSION(mesh%gauss%n_w) :: j_loc
934 REAL(KIND=8),
DIMENSION(mesh%gauss%k_d,mesh%gauss%n_w) :: dw_loc
935 REAL(KIND=8),
DIMENSION(mesh%gauss%n_w,6) :: vel_loc
936 REAL(KIND=8),
DIMENSION(mesh%gauss%n_w,6) :: mom_loc
938 INTEGER :: m, l , i, mode, index, k
939 petscerrorcode :: ierr
941 mpi_comm :: communicator
942 CALL mpi_comm_rank(communicator,rank,ierr)
945 DO i = 1,
SIZE(list_mode)
948 DO m = 1, mesh%dom_me
951 vel_loc(:,k) = vel(j_loc,k,i)
952 mom_loc(:,k) = mom(j_loc,k,i)
959 ray = sum(mesh%rr(1,j_loc)*
ww(:,l))
962 div_vel(index,1,i) = sum(vel_loc(:,1)*dw_loc(1,:)) &
963 + sum(vel_loc(:,1)*
ww(:,l))/ray &
964 + mode*sum(vel_loc(:,4)*
ww(:,l))/ray &
965 + sum(vel_loc(:,5)*dw_loc(2,:))
966 div_vel(index,2,i) = sum(vel_loc(:,2)*dw_loc(1,:)) &
967 + sum(vel_loc(:,2)*
ww(:,l))/ray &
968 - mode*sum(vel_loc(:,3)*
ww(:,l))/ray &
969 + sum(vel_loc(:,6)*dw_loc(2,:))
972 div_mom(index,1,i) = sum(mom_loc(:,1)*dw_loc(1,:)) &
973 + sum(mom_loc(:,1)*
ww(:,l))/ray &
974 + mode*sum(mom_loc(:,4)*
ww(:,l))/ray &
975 + sum(mom_loc(:,5)*dw_loc(2,:))
976 div_mom(index,2,i) = sum(mom_loc(:,2)*dw_loc(1,:)) &
977 + sum(mom_loc(:,2)*
ww(:,l))/ray &
978 - mode*sum(mom_loc(:,3)*
ww(:,l))/ray &
979 + sum(mom_loc(:,6)*dw_loc(2,:))
985 c_out = div_vel - stab*div_mom
1075 bloc_size, m_max_pad, tensor, tensor_gauss)
1083 INTEGER,
INTENT(IN) :: nb_procs
1084 INTEGER,
INTENT(IN) :: bloc_size
1085 INTEGER,
INTENT(IN) :: m_max_pad
1086 INTEGER,
DIMENSION(:),
INTENT(IN) :: list_mode
1087 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: vel
1088 REAL(KIND=8),
DIMENSION(:,:,:),
INTENT(IN) :: mom
1089 REAL(KIND=8),
DIMENSION(3,mesh%gauss%l_G*mesh%dom_me,6,SIZE(list_mode)),
INTENT(OUT) :: tensor_gauss
1090 REAL(KIND=8),
DIMENSION(3,mesh%np,6,SIZE(list_mode)) ,
INTENT(OUT) :: tensor
1091 INTEGER,
DIMENSION(mesh%gauss%n_w) :: j_loc
1092 REAL(KIND=8),
DIMENSION(mesh%gauss%n_w,6) :: tensor_loc
1093 INTEGER :: m, l , i, mode, index, k, n
1094 mpi_comm :: communicator
1098 CALL fft_tensor_dcl(communicator, mom, vel, tensor, nb_procs, bloc_size, m_max_pad)
1101 DO i = 1,
SIZE(list_mode)
1104 DO m = 1, mesh%dom_me
1105 j_loc = mesh%jj(:,m)
1107 tensor_loc(:,k) = tensor(n,j_loc,k,i)
1112 tensor_gauss(n,index,1,i) = sum(tensor_loc(:,1)*
ww(:,l))
1113 tensor_gauss(n,index,2,i) = sum(tensor_loc(:,2)*
ww(:,l))
1114 tensor_gauss(n,index,3,i) = sum(tensor_loc(:,3)*
ww(:,l))
1115 tensor_gauss(n,index,4,i) = sum(tensor_loc(:,4)*
ww(:,l))
1116 tensor_gauss(n,index,5,i) = sum(tensor_loc(:,5)*
ww(:,l))
1117 tensor_gauss(n,index,6,i) = sum(tensor_loc(:,6)*
ww(:,l))
1125 SUBROUTINE moy(communicator,mesh,p,RESLT)
1131 REAL(KIND=8),
DIMENSION(:) ,
INTENT(IN) :: p
1132 REAL(KIND=8) ,
INTENT(OUT) :: RESLT
1133 REAL(KIND=8) :: vol_loc, vol_out, r_loc, r_out
1134 INTEGER :: m, l , i , ni, code
1135 INTEGER,
DIMENSION(mesh%gauss%n_w) :: j_loc
1137 mpi_comm :: communicator
1141 DO m = 1, mesh%dom_me
1142 j_loc = mesh%jj(:,m)
1143 DO l = 1, mesh%gauss%l_G
1145 DO ni = 1, mesh%gauss%n_w; i = j_loc(ni)
1146 ray = ray + mesh%rr(1,i)*mesh%gauss%ww(ni,l)
1149 r_loc = r_loc + sum(p(j_loc(:))*mesh%gauss%ww(:,l))*ray*mesh%gauss%rj(l,m)
1150 vol_loc = vol_loc + ray*mesh%gauss%rj(l,m)
1155 CALL mpi_allreduce(r_loc,r_out,1,mpi_double_precision, mpi_sum, communicator, code)
1156 CALL mpi_allreduce(vol_loc,vol_out,1,mpi_double_precision, mpi_sum, communicator, code)
1157 reslt = r_out / vol_out
subroutine solver(my_ksp, b, x, reinit, verbose)
subroutine, public rhs_ns_gauss_3x3_art_comp_mom(vv_mesh, pp_mesh, communicator, list_mode, time, V1m, pn, rotv_v, rhs_gauss, tempn, density)
subroutine, public bdf1_art_comp_with_m(comm_one_d, time, vv_3_LA, pp_1_LA, vvz_per, pp_per, dt, Re, list_mode, pp_mesh, vv_mesh, pn_m1, pn, un_m1, un, Hn_p2, Bn_p2, tempn, density_m1, density, density_p1, visco_dyn, level_set_p1, visc_entro_level)
subroutine, public extract(xghost, ks, ke, LA, phi)
subroutine, public create_my_ghost(mesh, LA, ifrom)
subroutine, public smb_surface_tension(communicator, mesh, list_mode, nb_procs, level_set, tensor_surface_gauss)
subroutine, public fft_tensor_dcl(communicator, V1_in, V2_in, V_out, nb_procs, bloc_size, m_max_pad, temps, opt_tension)
subroutine qs_01_div_hybrid_2006(vv_mesh, pp_mesh, pp_LA, mode, gg, pb_1, pb_2)
subroutine, public smb_compute_tensor_gauss(communicator, mesh, list_mode, vel, mom, nb_procs, bloc_size, m_max_pad, tensor, tensor_gauss)
subroutine, public project_p2_p1(jj_P2, jj_P1, pp_P2, pp_P1)
subroutine, public compute_entropy_viscosity_mom(comm_one_d, vv_3_LA, vv_mesh, pp_mesh, time, list_mode, momentum, momentum_m1, momentum_m2, pn_m1, un_m1, tensor_m1, visc_grad_vel_m1, tensor_surface_gauss, rotb_b_m1, visco_dyn_m1, density_m2, density_m1, density, tempn, visc_entro_real, visc_entro_level_real)
subroutine create_local_petsc_matrix(communicator, LA, matrix, clean)
subroutine error_petsc(string)
real(kind=8) function user_time()
subroutine, public fft_par_cross_prod_dcl(communicator, V1_in, V2_in, V_out, nb_procs, bloc_size, m_max_pad, temps)
subroutine smb_explicit_diffu_correction(communicator, mesh, list_mode, nb_procs, visc_dyn, stab_mom, vel, mom, V_out, V2_out)
subroutine, public smb_explicit_diffu_sym(communicator, mesh, list_mode, nb_procs, visc_dyn, vel, V_out)
subroutine qs_diff_mass_scal_m(mesh, LA, visco, mass, stab, mode, matrix)
subroutine, public fft_compute_diffu_mom(communicator, V1_in, V2_in, V3_in, V1_out, V2_out, nb_procs, bloc_size, m_max_pad, temps)
subroutine, public fft_par_prod_dcl(communicator, c1_in, c2_in, c_out, nb_procs, bloc_size, m_max_pad, temps)
subroutine init_solver(my_par, my_ksp, matrix, communicator, solver, precond, opt_re_init)
subroutine dirichlet_rhs(js_D, bs_D, b)
subroutine rhs_3x3_art_comp(mesh, vv_3_LA, mode, rhs_in, vb_145, vb_236, opt_tensor, opt_grad_div)
subroutine vector_glob_js_d(vv_mesh, list_mode, vv_3_LA, vv_list_dirichlet_sides, vv_js_D, vv_mode_global_js_D)
subroutine, public compute_entropy_viscosity_mom_no_level_set(comm_one_d, vv_3_LA, vv_mesh, pp_mesh, time, list_mode, momentum, momentum_m1, momentum_m2, pn_m1, un_m1, tensor_m1, rotb_b_m1, tempn, visc_entro_real)
subroutine, public periodic_matrix_petsc(n_bord, list, perlist, matrix, LA)
subroutine smb_explicit_div_correction(communicator, mesh, list_mode, stab, vel, mom, c_out)
subroutine, public momentum_dirichlet(communicator, mesh, list_mode, t, nb_procs, density, momentum_exact, vv_js_D)
subroutine dirichlet_m_parallel(matrix, glob_js_D)
type(my_verbose), public talk_to_me
real(kind=8) function norm_sf(communicator, norm_type, mesh, list_mode, v)
subroutine, public fft_scalar_vect_dcl(communicator, V1_in, V2_in, V_out, pb, nb_procs, bloc_size, m_max_pad, temps)
subroutine qs_diff_mass_vect_3x3_divpenal_art_comp(type_op, LA, mesh, visco, mass, stab, stab_bdy_ns, stab_art_comp, i_mode, mode, matrix)
subroutine, public smb_explicit_les(communicator, mesh, list_mode, nb_procs, visc_entro_real, mom, V_out)
subroutine, public inject_p1_p2(jj_c, jj_f, pp_c, pp_f)
subroutine moy(communicator, mesh, p, RESLT)
real(kind=8), dimension(:,:,:,:), pointer dw
real(kind=8), dimension(:,:), pointer ww
subroutine, public periodic_rhs_petsc(n_bord, list, perlist, v_rhs, LA)
subroutine smb_curlh_cross_b_gauss_sft_par(communicator, mesh, list_mode, V_in, W_in, V_out)
subroutine scalar_without_glob_js_d(pp_mesh, list_mode, pp_1_LA, pp_mode_global_js_D)