140       ulag, vlag, wlag, time_scheme, rho)
 
  142    type(
mesh_t), 
target, 
intent(inout) :: msh
 
  143    type(
coef_t), 
target, 
intent(inout) :: coef
 
  144    type(
gs_t), 
target, 
intent(inout) :: gs
 
  145    type(json_file), 
target, 
intent(inout) :: params
 
  146    type(
user_t), 
target, 
intent(in) :: user
 
  149    real(kind=
rp), 
intent(in) :: rho
 
  151    character(len=15), 
parameter :: scheme = 
'Modular (Pn/Pn)' 
  156    call this%scheme_init(msh, coef, gs, params, scheme, user, rho)
 
  159    call ax_helm_factory(this%ax, full_formulation = .false.)
 
  162    call scalar_residual_factory(this%res)
 
  165    call rhs_maker_ext_fctry(this%makeext)
 
  168    call rhs_maker_bdf_fctry(this%makebdf)
 
  171    call rhs_maker_oifs_fctry(this%makeoifs)
 
  174    associate(xh_lx => this%Xh%lx, xh_ly => this%Xh%ly, xh_lz => this%Xh%lz, &
 
  175         dm_xh => this%dm_Xh, nelv => this%msh%nelv)
 
  177      call this%s_res%init(dm_xh, 
"s_res")
 
  179      call this%abx1%init(dm_xh, 
"abx1")
 
  181      call this%abx2%init(dm_xh, 
"abx2")
 
  183      call this%advs%init(dm_xh, 
"advs")
 
  185      call this%ds%init(dm_xh, 
'ds')
 
  191    call this%bc_res%init_base(this%c_Xh)
 
  192    do i = 1, this%n_dir_bcs
 
  193       call this%bc_res%mark_facets(this%dir_bcs(i)%marked_facet)
 
  197    if (this%user_bc%msk(0) .gt. 0) 
then 
  198       call this%bc_res%mark_facets(this%user_bc%marked_facet)
 
  201    call this%bc_res%mark_zones_from_list(msh%labeled_zones, 
'd_s', &
 
  203    call this%bc_res%finalize()
 
  204    call this%bc_res%set_g(0.0_rp)
 
  211    call this%proj_s%init(this%dm_Xh%size(), this%projection_dim,  &
 
  212                            this%projection_activ_step)
 
  222    call advection_factory(this%adv, params, this%c_Xh, &
 
  223                           ulag, vlag, wlag, this%chkp%dtlag, &
 
 
  230    real(kind=rp) :: dtlag(10), tlag(10)
 
  234    n = this%s%dof%size()
 
  236    call col2(this%s%x, this%c_Xh%mult, n)
 
  237    call col2(this%slag%lf(1)%x, this%c_Xh%mult, n)
 
  238    call col2(this%slag%lf(2)%x, this%c_Xh%mult, n)
 
  239    if (neko_bcknd_device .eq. 1) 
then 
  240       call device_memcpy(this%s%x, this%s%x_d, &
 
  241                          n, host_to_device, sync = .false.)
 
  242       call device_memcpy(this%slag%lf(1)%x, this%slag%lf(1)%x_d, &
 
  243                          n, host_to_device, sync = .false.)
 
  244       call device_memcpy(this%slag%lf(2)%x, this%slag%lf(2)%x_d, &
 
  245                          n, host_to_device, sync = .false.)
 
  246       call device_memcpy(this%abx1%x, this%abx1%x_d, &
 
  247                          n, host_to_device, sync = .false.)
 
  248       call device_memcpy(this%abx2%x, this%abx2%x_d, &
 
  249                          n, host_to_device, sync = .false.)
 
  250       call device_memcpy(this%advs%x, this%advs%x_d, &
 
  251                          n, host_to_device, sync = .false.)
 
  254    call this%gs_Xh%op(this%s, gs_op_add)
 
  255    call this%gs_Xh%op(this%slag%lf(1), gs_op_add)
 
  256    call this%gs_Xh%op(this%slag%lf(2), gs_op_add)
 
 
  302    real(kind=rp), 
intent(inout) :: t
 
  303    integer, 
intent(inout) :: tstep
 
  304    real(kind=rp), 
intent(in) :: dt
 
  305    type(time_scheme_controller_t), 
intent(inout) :: ext_bdf
 
  306    type(time_step_controller_t), 
intent(in) :: dt_controller
 
  310    type(ksp_monitor_t) :: ksp_results(1)
 
  311    character(len=LOG_SIZE) :: log_buf
 
  313    n = this%dm_Xh%size()
 
  315    call profiler_start_region(
'Scalar', 2)
 
  316    associate(u => this%u, v => this%v, w => this%w, s => this%s, &
 
  317         cp => this%cp, rho => this%rho, &
 
  319         s_res => this%s_res, &
 
  320         ax => this%Ax, f_xh => this%f_Xh, xh => this%Xh, &
 
  321         c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
 
  322         slag => this%slag, oifs => this%oifs, &
 
  323         lambda_field => this%lambda_field, &
 
  324         projection_dim => this%projection_dim, &
 
  325         msh => this%msh, res => this%res, makeoifs => this%makeoifs, &
 
  326         makeext => this%makeext, makebdf => this%makebdf, &
 
  327         if_variable_dt => dt_controller%if_variable_dt, &
 
  328         dt_last_change => dt_controller%dt_last_change)
 
  330      if (neko_log%level_ .ge. neko_log_debug) 
then 
  331         write(log_buf, 
'(A,A,E15.7,A,E15.7,A,E15.7)') 
'Scalar debug', &
 
  332              ' l2norm s', glsc2(this%s%x, this%s%x, n), &
 
  333              ' slag1', glsc2(this%slag%lf(1)%x, this%slag%lf(1)%x, n), &
 
  334              ' slag2', glsc2(this%slag%lf(2)%x, this%slag%lf(2)%x, n)
 
  335         call neko_log%message(log_buf)
 
  336         write(log_buf, 
'(A,A,E15.7,A,E15.7)') 
'Scalar debug2', &
 
  337              ' l2norm abx1', glsc2(this%abx1%x, this%abx1%x, n), &
 
  338              ' abx2', glsc2(this%abx2%x, this%abx2%x, n)
 
  339         call neko_log%message(log_buf)
 
  343      call this%source_term%compute(t, tstep)
 
  346      if (this%if_gradient_jump_penalty .eqv. .true.) 
then 
  347         call this%gradient_jump_penalty%compute(u, v, w, s)
 
  348         call this%gradient_jump_penalty%perform(f_xh)
 
  352      call bc_list_apply_scalar(this%bclst_neumann, this%f_Xh%x, dm_xh%size())
 
  356         call this%adv%compute_scalar(u, v, w, s, this%advs, &
 
  357                                   xh, this%c_Xh, dm_xh%size())
 
  359         call makeext%compute_scalar(this%abx1, this%abx2, f_xh%x, rho, &
 
  360                                     ext_bdf%advection_coeffs, n)
 
  362         call makeoifs%compute_scalar(this%advs%x, f_xh%x, rho, dt, n)
 
  365         call this%adv%compute_scalar(u, v, w, s, f_xh, &
 
  366                                      xh, this%c_Xh, dm_xh%size())
 
  372         call makeext%compute_scalar(this%abx1, this%abx2, f_xh%x, rho, &
 
  373                                     ext_bdf%advection_coeffs, n)
 
  376         call makebdf%compute_scalar(slag, f_xh%x, s, c_xh%B, rho, dt, &
 
  377              ext_bdf%diffusion_coeffs, ext_bdf%ndiff, n)
 
  385      call this%field_dir_bc%update(this%field_dir_bc%field_list, &
 
  386           this%field_dirichlet_bcs, this%c_Xh, t, tstep, 
"scalar")
 
  387      call bc_list_apply_scalar(this%bclst_dirichlet, &
 
  388           this%s%x, this%dm_Xh%size())
 
  392      call this%update_material_properties()
 
  395      call profiler_start_region(
'Scalar_residual', 20)
 
  396      call res%compute(ax, s,  s_res, f_xh, c_xh, msh, xh, lambda_field, &
 
  397           rho*cp, ext_bdf%diffusion_coeffs(1), dt, dm_xh%size())
 
  399      call gs_xh%op(s_res, gs_op_add)
 
  402      call bc_list_apply_scalar(this%bclst_ds, s_res%x, dm_xh%size())
 
  404      call profiler_end_region(
'Scalar_residual', 20)
 
  406      call this%proj_s%pre_solving(s_res%x, tstep, c_xh, n, dt_controller)
 
  408      call this%pc%update()
 
  409      call profiler_start_region(
'Scalar_solve', 21)
 
  410      ksp_results(1) = this%ksp%solve(ax, ds, s_res%x, n, &
 
  411           c_xh, this%bclst_ds, gs_xh)
 
  412      call profiler_end_region(
'Scalar_solve', 21)
 
  414     call this%proj_s%post_solving(ds%x, ax, c_xh, &
 
  415                                 this%bclst_ds, gs_xh, n, tstep, dt_controller)
 
  418      if (neko_bcknd_device .eq. 1) 
then 
  419         call device_add2s2(s%x_d, ds%x_d, 1.0_rp, n)
 
  421         call add2s2(s%x, ds%x, 1.0_rp, n)
 
  424      call scalar_step_info(tstep, t, dt, ksp_results)
 
  427    call profiler_end_region(
'Scalar', 2)