!-------------------------------------------------------------------------------

!VERS

! This file is part of Code_Saturne, a general-purpose CFD tool.
!
! Copyright (C) 1998-2021 EDF S.A.
!
! This program is free software; you can redistribute it and/or modify it under
! the terms of the GNU General Public License as published by the Free Software
! Foundation; either version 2 of the License, or (at your option) any later
! version.
!
! This program is distributed in the hope that it will be useful, but WITHOUT
! ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
! FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
! details.
!
! You should have received a copy of the GNU General Public License along with
! this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
! Street, Fifth Floor, Boston, MA 02110-1301, USA.

!-------------------------------------------------------------------------------

!============================================!
!== Pinzo@15102024: Fortran module for ANN variables ==
module ANNvariables
    use, intrinsic :: iso_c_binding
    
    implicit none

    ! Scalar fields plus velocity for ANN input
    ! Dimension - > n_features, n_samples, n_snapshots
    double precision, dimension(:,:,:), pointer, save :: inputANN
    double precision, dimension(:,:,:), pointer, save :: inputANN_b

    ! Setting up output to the function
    double precision, dimension(:), pointer :: zANN_o
    ! Setting up constant parameter
    integer, parameter :: num_samples = 81897, num_features = 11, num_snapshots = 50
    integer, parameter :: num_features_out = 1, num_samples_b = 55708, num_features_b = 4

    ! Variables to collect ANN processing
    real (c_float), target :: output(num_samples)
    real (c_float), target :: input_1(num_features, num_samples)
    real (c_float), target :: input_0(num_features, num_samples)
    real (c_float), target :: input_2(num_features, num_samples)
    real (c_float), target :: input_3(num_features, num_samples)
    real (c_float), target :: input_4(num_features, num_samples)
    real (c_float), target :: input_5(num_features, num_samples)
    real (c_float), target :: input_6(num_features, num_samples)
    real (c_float), target :: input_7(num_features, num_samples)
    real (c_float), target :: input_8(num_features, num_samples)
    real (c_float), target :: input_9(num_features, num_samples)
    real (c_float), target :: input_10(num_features, num_samples)
    real (c_float), target :: input_11(num_features, num_samples)
    real (c_float), target :: input_12(num_features, num_samples)
    real (c_float), target :: input_13(num_features, num_samples)
    real (c_float), target :: input_14(num_features, num_samples)
    real (c_float), target :: input_15(num_features, num_samples)
    real (c_float), target :: input_16(num_features, num_samples)
    real (c_float), target :: input_17(num_features, num_samples)
    real (c_float), target :: input_18(num_features, num_samples)
    real (c_float), target :: input_19(num_features, num_samples)
    real (c_float), target :: input_20(num_features, num_samples)
    real (c_float), target :: input_21(num_features, num_samples)
    real (c_float), target :: input_22(num_features, num_samples)
    real (c_float), target :: input_23(num_features, num_samples)
    real (c_float), target :: input_24(num_features, num_samples)
    real (c_float), target :: input_25(num_features, num_samples)
    real (c_float), target :: input_26(num_features, num_samples)
    real (c_float), target :: input_27(num_features, num_samples)
    real (c_float), target :: input_28(num_features, num_samples)
    real (c_float), target :: input_29(num_features, num_samples)
    real (c_float), target :: input_30(num_features, num_samples)
    real (c_float), target :: input_31(num_features, num_samples)
    real (c_float), target :: input_32(num_features, num_samples)
    real (c_float), target :: input_33(num_features, num_samples)
    real (c_float), target :: input_40(num_features, num_samples)
    real (c_float), target :: input_41(num_features, num_samples)
    real (c_float), target :: input_42(num_features, num_samples)
    real (c_float), target :: input_43(num_features, num_samples)
    real (c_float), target :: input_44(num_features, num_samples)
    real (c_float), target :: input_45(num_features, num_samples)
    real (c_float), target :: input_46(num_features, num_samples)
    real (c_float), target :: input_47(num_features, num_samples)
    real (c_float), target :: input_48(num_features, num_samples)
    real (c_float), target :: input_49(num_features, num_samples)
    real (c_float), target :: input_1_b(num_features_b, num_samples)
    real (c_float), target :: input_0_b(num_features_b, num_samples)
    real (c_float), target :: input_2_b(num_features_b, num_samples)
    real (c_float), target :: input_3_b(num_features_b, num_samples)
    real (c_float), target :: input_4_b(num_features_b, num_samples)
    real (c_float), target :: input_5_b(num_features_b, num_samples)
    real (c_float), target :: input_6_b(num_features_b, num_samples)
    real (c_float), target :: input_7_b(num_features_b, num_samples)
    real (c_float), target :: input_8_b(num_features_b, num_samples)
    real (c_float), target :: input_9_b(num_features_b, num_samples)
    real (c_float), target :: input_10_b(num_features_b, num_samples)
    real (c_float), target :: input_11_b(num_features_b, num_samples)
    real (c_float), target :: input_12_b(num_features_b, num_samples)
    real (c_float), target :: input_13_b(num_features_b, num_samples)
    real (c_float), target :: input_14_b(num_features_b, num_samples)
    real (c_float), target :: input_15_b(num_features_b, num_samples)
    real (c_float), target :: input_16_b(num_features_b, num_samples)
    real (c_float), target :: input_17_b(num_features_b, num_samples)
    real (c_float), target :: input_18_b(num_features_b, num_samples)
    real (c_float), target :: input_19_b(num_features_b, num_samples)
    real (c_float), target :: input_20_b(num_features_b, num_samples)
    real (c_float), target :: input_21_b(num_features_b, num_samples)
    real (c_float), target :: input_22_b(num_features_b, num_samples)
    real (c_float), target :: input_23_b(num_features_b, num_samples)
    real (c_float), target :: input_24_b(num_features_b, num_samples)
    real (c_float), target :: input_25_b(num_features_b, num_samples)
    real (c_float), target :: input_26_b(num_features_b, num_samples)
    real (c_float), target :: input_27_b(num_features_b, num_samples)
    real (c_float), target :: input_28_b(num_features_b, num_samples)
    real (c_float), target :: input_29_b(num_features_b, num_samples)
    real (c_float), target :: input_30_b(num_features_b, num_samples)
    real (c_float), target :: input_31_b(num_features_b, num_samples)
    real (c_float), target :: input_32_b(num_features_b, num_samples)
    real (c_float), target :: input_33_b(num_features_b, num_samples)
    real (c_float), target :: input_40_b(num_features_b, num_samples)
    real (c_float), target :: input_41_b(num_features_b, num_samples)
    real (c_float), target :: input_42_b(num_features_b, num_samples)
    real (c_float), target :: input_43_b(num_features_b, num_samples)
    real (c_float), target :: input_44_b(num_features_b, num_samples)
    real (c_float), target :: input_45_b(num_features_b, num_samples)
    real (c_float), target :: input_46_b(num_features_b, num_samples)
    real (c_float), target :: input_47_b(num_features_b, num_samples)
    real (c_float), target :: input_48_b(num_features_b, num_samples)
    real (c_float), target :: input_49_b(num_features_b, num_samples)

    contains
    
    subroutine deallocate_var()

        deallocate(inputANN, inputANN_b)

    end subroutine

end module ANNvariables

!============================================!
!== Pinzo@250902024: Fortran module for ANN prediction ==
module ANNtorch
    use, intrinsic :: iso_c_binding

    implicit none
    private
    interface

    ! Pinzo@25092024: Subroutine for ANN predict 
    subroutine ANNpredict(output, input_0, input_1, input_2, input_3, input_4,                      &
                          input_5, input_6, input_7, input_8, input_9, input_10,                    &
                          input_11, input_12, input_13, input_14, input_15, input_16,               &
                          input_17, input_18, input_19, input_20, input_21, input_22,               &
                          input_23, input_24, input_25, input_26, input_27, input_28,               &
                          input_29, input_30, input_31, input_32, input_33, input_34,               &
                          input_35, input_36, input_37, input_38, input_39, input_40,               &
                          input_41, input_42, input_43, input_44, input_45, input_46,               &
                          input_47, input_48, input_49,                                             &
                          input_0_b, input_1_b, input_2_b, input_3_b, input_4_b,                    &
                          input_5_b, input_6_b, input_7_b, input_8_b, input_9_b, input_10_b,        &
                          input_11_b, input_12_b, input_13_b, input_14_b, input_15_b, input_16_b,   &
                          input_17_b, input_18_b, input_19_b, input_20_b, input_21_b, input_22_b,   &
                          input_23_b, input_24_b, input_25_b, input_26_b, input_27_b, input_28_b,   &
                          input_29_b, input_30_b, input_31_b, input_32_b, input_33_b, input_34_b,   &
                          input_35_b, input_36_b, input_37_b, input_38_b, input_39_b, input_40_b,   &
                          input_41_b, input_42_b, input_43_b, input_44_b, input_45_b, input_46_b,   &
                          input_47_b, input_48_b, input_49_b) bind(C, name="ANNpredict")
        use, intrinsic :: iso_c_binding
        implicit none

        type(c_ptr), value :: output
        type(c_ptr), value :: input_0
        type(c_ptr), value :: input_1
        type(c_ptr), value :: input_2
        type(c_ptr), value :: input_3
        type(c_ptr), value :: input_4
        type(c_ptr), value :: input_5
        type(c_ptr), value :: input_6
        type(c_ptr), value :: input_7
        type(c_ptr), value :: input_8
        type(c_ptr), value :: input_9
        type(c_ptr), value :: input_10
        type(c_ptr), value :: input_11
        type(c_ptr), value :: input_12
        type(c_ptr), value :: input_13
        type(c_ptr), value :: input_14
        type(c_ptr), value :: input_15
        type(c_ptr), value :: input_16
        type(c_ptr), value :: input_17
        type(c_ptr), value :: input_18
        type(c_ptr), value :: input_19
        type(c_ptr), value :: input_20
        type(c_ptr), value :: input_21
        type(c_ptr), value :: input_22
        type(c_ptr), value :: input_23
        type(c_ptr), value :: input_24
        type(c_ptr), value :: input_25
        type(c_ptr), value :: input_26
        type(c_ptr), value :: input_27
        type(c_ptr), value :: input_28
        type(c_ptr), value :: input_29
        type(c_ptr), value :: input_30
        type(c_ptr), value :: input_31
        type(c_ptr), value :: input_32
        type(c_ptr), value :: input_33
        type(c_ptr), value :: input_34
        type(c_ptr), value :: input_35
        type(c_ptr), value :: input_36
        type(c_ptr), value :: input_37
        type(c_ptr), value :: input_38
        type(c_ptr), value :: input_39
        type(c_ptr), value :: input_40
        type(c_ptr), value :: input_41
        type(c_ptr), value :: input_42
        type(c_ptr), value :: input_43
        type(c_ptr), value :: input_44
        type(c_ptr), value :: input_45
        type(c_ptr), value :: input_46
        type(c_ptr), value :: input_47
        type(c_ptr), value :: input_48
        type(c_ptr), value :: input_49
        type(c_ptr), value :: input_0_b
        type(c_ptr), value :: input_1_b
        type(c_ptr), value :: input_2_b
        type(c_ptr), value :: input_3_b
        type(c_ptr), value :: input_4_b
        type(c_ptr), value :: input_5_b
        type(c_ptr), value :: input_6_b
        type(c_ptr), value :: input_7_b
        type(c_ptr), value :: input_8_b
        type(c_ptr), value :: input_9_b
        type(c_ptr), value :: input_10_b
        type(c_ptr), value :: input_11_b
        type(c_ptr), value :: input_12_b
        type(c_ptr), value :: input_13_b
        type(c_ptr), value :: input_14_b
        type(c_ptr), value :: input_15_b
        type(c_ptr), value :: input_16_b
        type(c_ptr), value :: input_17_b
        type(c_ptr), value :: input_18_b
        type(c_ptr), value :: input_19_b
        type(c_ptr), value :: input_20_b
        type(c_ptr), value :: input_21_b
        type(c_ptr), value :: input_22_b
        type(c_ptr), value :: input_23_b
        type(c_ptr), value :: input_24_b
        type(c_ptr), value :: input_25_b
        type(c_ptr), value :: input_26_b
        type(c_ptr), value :: input_27_b
        type(c_ptr), value :: input_28_b
        type(c_ptr), value :: input_29_b
        type(c_ptr), value :: input_30_b
        type(c_ptr), value :: input_31_b
        type(c_ptr), value :: input_32_b
        type(c_ptr), value :: input_33_b
        type(c_ptr), value :: input_34_b
        type(c_ptr), value :: input_35_b
        type(c_ptr), value :: input_36_b
        type(c_ptr), value :: input_37_b
        type(c_ptr), value :: input_38_b
        type(c_ptr), value :: input_39_b
        type(c_ptr), value :: input_40_b
        type(c_ptr), value :: input_41_b
        type(c_ptr), value :: input_42_b
        type(c_ptr), value :: input_43_b
        type(c_ptr), value :: input_44_b
        type(c_ptr), value :: input_45_b
        type(c_ptr), value :: input_46_b
        type(c_ptr), value :: input_47_b
        type(c_ptr), value :: input_48_b
        type(c_ptr), value :: input_49_b
    end subroutine ANNpredict

    end interface
    public :: ANNpredict

end module ANNtorch
!== (END)Pinzo@250902024: Fortran module for ANN prediction ==
!============================================!
module collect
    use pointe
    use numvar
    use ppincl
    use optcal
    use field
    use entsor
    use ANNvariables
    use, intrinsic :: iso_c_binding
    implicit none

    double precision, dimension(:,:), pointer :: cvar_vel, bpro_forbr
    double precision, dimension(:), pointer :: cpro_visct, cvar_pr, cpro_temp
    double precision, dimension(:), pointer :: bpro_normstress, cvar_z

    contains

    subroutine collect_data(inputANN, inputANN_b, alpha)

        double precision, dimension(:,:,:), pointer :: inputANN, inputANN_b

        integer :: iel, icg, alpha
        integer, parameter :: ncel = 81897, ncompvec = 3, ncel_boundary = 55708

        call field_get_val_s(ivarfl(ipr), cvar_pr)
        call field_get_val_s(ivarfl(isca(iscalt)), cpro_temp)
        call field_get_val_v(ivarfl(iu), cvar_vel)
        call field_get_val_s(ivisct, cpro_visct)
        call field_get_val_s_by_name("stress_normal", bpro_normstress)
        call field_get_val_s_by_name("Z", cvar_z)
        call field_get_val_v(iforbr, bpro_forbr)   ! boundary stress

        do iel = 1, ncel
            inputANN(1, iel, alpha) = cvar_pr(iel)
            inputANN(2, iel, alpha) = cpro_temp(iel)
            inputANN(3, iel, alpha) = cpro_visct(iel)
            inputANN(4, iel, alpha) = cvar_z(iel)
            do icg = 1, ncompvec
                inputANN(4+icg, iel, alpha) = cvar_vel(icg,iel)
            enddo
        enddo
        
        do iel  = 1, ncel_boundary
            inputANN_b(1, iel, alpha) = bpro_normstress(iel)
            do icg = 1, ncompvec
                inputANN_b(1+icg, iel, alpha) = bpro_forbr(icg, iel)
            enddo
        enddo

    end subroutine collect_data

end module collect
!============================================!
!== Pinzo@26092024: Camille's code ==

subroutine cs_f_user_extra_operations &
    ( nvar   , nscal  ,                                              &
    dt     )
        use paramx
        use cstphy
        use cstnum
        use parall
        use period
        use ppppar
        use ppthch
        use mesh
        use lagran
        use cs_c_bindings
        use coincl
        use radiat
        use dimens, only: ndimfb
        use field_operator
        use ANNtorch
        use collect

        implicit none
    
        integer          :: nvar, nscal, icg, iel, i
        double precision :: dt(ncelet)

        ! reading csv
        character(len=1000) :: row_csv
        integer :: j, ios
        real(c_float) :: data_cs(num_samples, 10)
        character(len=100) :: filename
        character(len=100), dimension(1) :: filename_list

        integer counterANN
        data    counterANN /0/    
        save    counterANN

        integer time_step
        data    time_step /0/    
        save    time_step
    
        integer alpha
        data    alpha /0/
        save    alpha

        ! Pinzo@26092024: Initialize variable for ANN activation
        double precision, dimension(:), pointer :: activeANN
        logical ANNactivated

        ! clock variables
        real :: start, end, elapsed_time

        call cpu_time(start)

        call field_get_val_s_by_name("activeANN", activeANN)
        ANNactivated = .FALSE.

        ! update for print purposes
        time_step = time_step + 1

        if (counterANN.eq.0) allocate(inputANN(num_samples, num_features, num_snapshots),  &
                                   inputANN_b(num_samples_b, num_features_b, num_snapshots))
        if (time_step.ge.0) then

            ! Pinzo@15102024: Adding data collection (every 1E-5 s)
            if (mod(counterANN, 10) == 0) then
                write(nfecra, *) ' Pinzo cs_user_physical_properties.f90: Collecting data at ', time_step+3000, &
                'with counter', counterANN

                ! t0
                if (counterANN.lt.10) then
                    write(nfecra, *) '  *t', 0
                    alpha = alpha + 1
                    call collect_data(inputANN, inputANN_b, alpha)

                ! t1 -> t49
                else if (counterANN.eq.alpha*10) then
                    write(nfecra, *) '  *t', alpha
                    alpha = alpha + 1
                    call collect_data(inputANN, inputANN_b, alpha)

                    if (alpha.eq.50) activeANN(:) = 1
                    

                endif
            endif

            ! update counter
            counterANN = counterANN + 1

        endif

        ! activating ANN in all cells
        if (activeANN(1).ge.1) ANNactivated = .TRUE.
        
        ! Pinzo@21102024: Overwriting cs variables at time step following ANN update
        if (counterANN.ge.502) then
            do iel = 1, ncel
                ! reset ANN
                activeANN(iel) = 0
            enddo

            ! reset iteration
            ANNactivated = .false.
            counterANN = -1   ! for debug 

        endif

        if (ANNactivated) then
            write(nfecra,*) ' Pinzo cs_user_physical_properties.f90: ANN upload'

            !call to ANNpredict
            call ANNpredict(c_loc(output), c_loc(inputANN(:,:,1)), c_loc(inputANN(:,:,2)),                                        &
                            c_loc(inputANN(:,:,3)), c_loc(inputANN(:,:,4)), c_loc(inputANN(:,:,5)), c_loc(inputANN(:,:,6)),       &
                            c_loc(inputANN(:,:,7)), c_loc(inputANN(:,:,8)), c_loc(inputANN(:,:,9)), c_loc(inputANN(:,:,10)),      &
                            c_loc(inputANN(:,:,11)), c_loc(inputANN(:,:,12)), c_loc(inputANN(:,:,13)), c_loc(inputANN(:,:,14)),   &
                            c_loc(inputANN(:,:,15)), c_loc(inputANN(:,:,16)), c_loc(inputANN(:,:,17)), c_loc(inputANN(:,:,18)),   &
                            c_loc(inputANN(:,:,19)), c_loc(inputANN(:,:,20)), c_loc(inputANN(:,:,21)), c_loc(inputANN(:,:,22)),   &
                            c_loc(inputANN(:,:,23)), c_loc(inputANN(:,:,24)), c_loc(inputANN(:,:,25)), c_loc(inputANN(:,:,26)),   &
                            c_loc(inputANN(:,:,27)), c_loc(inputANN(:,:,28)), c_loc(inputANN(:,:,29)), c_loc(inputANN(:,:,30)),   &
                            c_loc(inputANN(:,:,31)), c_loc(inputANN(:,:,32)), c_loc(inputANN(:,:,33)), c_loc(inputANN(:,:,34)),   &
                            c_loc(inputANN(:,:,35)), c_loc(inputANN(:,:,36)), c_loc(inputANN(:,:,37)), c_loc(inputANN(:,:,38)),   &
                            c_loc(inputANN(:,:,39)), c_loc(inputANN(:,:,40)), c_loc(inputANN(:,:,41)), c_loc(inputANN(:,:,42)),   &
                            c_loc(inputANN(:,:,43)), c_loc(inputANN(:,:,44)), c_loc(inputANN(:,:,45)), c_loc(inputANN(:,:,46)),   &
                            c_loc(inputANN(:,:,47)), c_loc(inputANN(:,:,48)), c_loc(inputANN(:,:,49)), c_loc(inputANN(:,:,50)),   &
                            c_loc(inputANN_b(:,:,1)), c_loc(inputANN_b(:,:,2)),                                                   &
                            c_loc(inputANN_b(:,:,3)), c_loc(inputANN_b(:,:,4)), c_loc(inputANN_b(:,:,5)),                         & 
                            c_loc(inputANN_b(:,:,6)), c_loc(inputANN_b(:,:,7)), c_loc(inputANN_b(:,:,8)),                         &
                            c_loc(inputANN_b(:,:,9)), c_loc(inputANN_b(:,:,10)), c_loc(inputANN_b(:,:,11)),                       &
                            c_loc(inputANN_b(:,:,12)), c_loc(inputANN_b(:,:,13)), c_loc(inputANN_b(:,:,14)),                      &
                            c_loc(inputANN_b(:,:,15)), c_loc(inputANN_b(:,:,16)), c_loc(inputANN_b(:,:,17)),                      &
                            c_loc(inputANN_b(:,:,18)), c_loc(inputANN_b(:,:,19)), c_loc(inputANN_b(:,:,20)),                      &
                            c_loc(inputANN_b(:,:,21)), c_loc(inputANN_b(:,:,22)), c_loc(inputANN_b(:,:,23)),                      &
                            c_loc(inputANN_b(:,:,24)), c_loc(inputANN_b(:,:,25)), c_loc(inputANN_b(:,:,26)),                      &
                            c_loc(inputANN_b(:,:,27)), c_loc(inputANN_b(:,:,28)), c_loc(inputANN_b(:,:,29)),                      & 
                            c_loc(inputANN_b(:,:,30)), c_loc(inputANN_b(:,:,31)), c_loc(inputANN_b(:,:,32)),                      &
                            c_loc(inputANN_b(:,:,33)), c_loc(inputANN_b(:,:,34)), c_loc(inputANN_b(:,:,35)),                      & 
                            c_loc(inputANN_b(:,:,36)), c_loc(inputANN_b(:,:,37)), c_loc(inputANN_b(:,:,38)),                      & 
                            c_loc(inputANN_b(:,:,39)), c_loc(inputANN_b(:,:,40)), c_loc(inputANN_b(:,:,41)),                      &
                            c_loc(inputANN_b(:,:,42)), c_loc(inputANN_b(:,:,43)), c_loc(inputANN_b(:,:,44)),                      &
                            c_loc(inputANN_b(:,:,45)), c_loc(inputANN_b(:,:,46)), c_loc(inputANN_b(:,:,47)),                      & 
                            c_loc(inputANN_b(:,:,48)), c_loc(inputANN_b(:,:,49)), c_loc(inputANN_b(:,:,50)))


            ! ! Debug: calling fields from standard simulation
            ! if (time_step.ge.141) then

            !     if (time_step.lt.150) then
            !         filename_list(1) = "/home/cenvinzf@coria.fr/Desktop/test_cs_coupling/t15.csv"
            !     else if (time_step.ge.150.and.time_step.lt.300) then
            !         filename_list(1) = "/home/cenvinzf@coria.fr/Desktop/test_cs_coupling/t30.csv"
            !     else if (time_step.ge.300.and.time_step.lt.450) then
            !         filename_list(1) = "/home/cenvinzf@coria.fr/Desktop/test_cs_coupling/t45.csv"
            !         ! debug
            !         activeANN(:) = 0
            !     endif

            !     ! open file (reading only)
            !     open(unit=10, file=filename_list(1), status="old", action="read", iostat=ios)
            !     if (ios /= 0) then
            !         print *, "Errore nell'apertura del file."
            !         stop
            !     end if

            !     do i = 1, num_samples
            !         read(10, '(A)', iostat=ios) row_csv
            !         if (ios /= 0) then
            !             print *, "Errore nella lettura della riga ", i
            !             exit
            !         end if

            !         read(row_csv, *) (data_cs(i, j), j=1,10)
                    
            !     end do
            !     close(10)
            !     ! (END) open file

               

            ! endif
            
            ! Pinzo@21102024: Commented because overwrite of variables moved in d3pint.f90
            ! Overwriting cs arrays
            
            ! ! debug
            ! output(:,:) = time_step
            ! activeANN(:) = 0

            call field_get_val_s_by_name("zANN_o", zANN_o)
            zANN_o(:) = output(:)

        endif

        call cpu_time(end)
        elapsed_time = end - start
        write(nfecra,*)  ' Pinzo cs_user_physical_properties.f90: Time elapsed in routine:', elapsed_time

    return

    end subroutine cs_f_user_extra_operations

!===============================================================================
!> \brief Modify turbulent viscosity
!>
!> This subroutine is called at beginning of each time step
!> after the computation of the turbulent viscosity
!> (physical quantities have already been computed in \ref usphyv).
!>
!> Turbulent viscosity \f$ \mu_T \f$ (kg/(m s)) can be modified.
!>
!> A modification of the turbulent viscosity can lead to very
!> significant differences between solutions and even give wrong
!> results.
!>
!> This subroutine is therefore reserved to expert users.
!
!-------------------------------------------------------------------------------

!-------------------------------------------------------------------------------
! Arguments
!______________________________________________________________________________.
!  mode           name          role                                           !
!______________________________________________________________________________!
!> \param[in]     nvar          total number of variables
!> \param[in]     nscal         total number of scalars
!> \param[in]     ncepdp        number of cells with head loss
!> \param[in]     ncesmp        number of cells with mass source term
!> \param[in]     icepdc        head loss cell numbering
!> \param[in]     icetsm        numbering of cells with mass source term
!> \param[in]     itypsm        kind of mass source for each variable
!> \param[in]     dt            time step (per cell)
!> \param[in]     ckupdc        work array for head loss terms
!> \param[in]     smacel        values of variables related to mass source
!>                              term. If ivar=ipr, smacel=mass flux
!_______________________________________________________________________________

subroutine usvist &
    ( nvar   , nscal  , ncepdp , ncesmp ,                            &
      icepdc , icetsm , itypsm ,                                     &
      dt     ,                                                       &
      ckupdc , smacel )
   
   !===============================================================================
   
   !===============================================================================
   ! Module files
   !===============================================================================
   
   use paramx
   use numvar
   use optcal
   use cstphy
   use entsor
   use parall
   use period
   use mesh
   use field
   use field_operator
   
   !===============================================================================
   
   implicit none
   
   ! Arguments
   
   integer          nvar   , nscal
   integer          ncepdp , ncesmp
   
   integer          icepdc(ncepdp)
   integer          icetsm(ncesmp), itypsm(ncesmp,nvar)
   
   double precision dt(ncelet)
   double precision ckupdc(6,ncepdp), smacel(ncesmp,nvar)
   
   !===============================================================================
   
   !--------
   ! Formats
   !--------
   
   !----
   ! End
   !----
   
   return
   end subroutine usvist
   