From b04d7cdb896adcd5b518d5cb5964e171c6793c05 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Tue, 5 Aug 2025 16:41:43 +0200 Subject: [PATCH 01/41] first try --- FST/src/FST-core/05_turbu.f90 | 8 +-- FST/src/FST-core/06_FST.f90 | 100 ++++++++++++++++++++++++++++++++-- 2 files changed, 98 insertions(+), 10 deletions(-) diff --git a/FST/src/FST-core/05_turbu.f90 b/FST/src/FST-core/05_turbu.f90 index 296e104..c66bbae 100644 --- a/FST/src/FST-core/05_turbu.f90 +++ b/FST/src/FST-core/05_turbu.f90 @@ -86,8 +86,8 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) we=0. ! Also write the modes if (write_files) open(file='fst_spectrum.csv',unit=13) - if (write_files) write(13,'(9(A, ","),A)') 'ShellNo','kx','ky','kz', & - 'u_amp','v_amp','w_amp','u_hat_pn1','u_hat_pn2', 'u_hat_pn3' + if (write_files) write(13,'(7(A, ","),A)') 'ShellNo','kx','ky','kz', & + 'amp','u_hat_pn1','u_hat_pn2', 'u_hat_pn3' do i=1,k_length shellno = shell(i) amp = shell_amp(shellno) @@ -98,8 +98,8 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) vamp = u_hat_pn(i,2)*amp wamp = u_hat_pn(i,3)*amp - if (write_files) write(13,'(9(g0, ","), g0)') shellno,k_num_all(i,1),k_num_all(i,2), & - k_num_all(i,3),uamp,vamp,wamp, u_hat_pn(i,1), u_hat_pn(i,2), u_hat_pn(i,3) + if (write_files) write(13,'(7(g0, ","), g0)') shellno,k_num_all(i,1),k_num_all(i,2), & + k_num_all(i,3),amp, u_hat_pn(i,1), u_hat_pn(i,2), u_hat_pn(i,3) ue = ue + ((uamp)**2)/2. ve = ve + ((vamp)**2)/2. diff --git a/FST/src/FST-core/06_FST.f90 b/FST/src/FST-core/06_FST.f90 index ef31d12..3098b92 100644 --- a/FST/src/FST-core/06_FST.f90 +++ b/FST/src/FST-core/06_FST.f90 @@ -6,14 +6,17 @@ module FST - use global_params + !use global_params use fst_operator, only: fst_bc_compute - use turbu + !use turbu use utils, only: neko_error + use field, only: field_t + use coef, only: coef_t + use logger, ony: neko_log, LOG_SIZE use point_zone, only: point_zone_t use math, only: masked_gather_copy use device_math, only: device_masked_gather_copy - + use num_types, only: rp, xp use device, only: device_map, device_memcpy, HOST_TO_DEVICE use, intrinsic :: iso_c_binding, only : c_ptr, C_NULL_PTR implicit none @@ -70,17 +73,23 @@ module FST real(kind=rp), allocatable :: random_vectors(:,:) ! u_hat_pn but reshaped type(c_ptr) :: random_vectors_d = C_NULL_PTR - type(c_ptr) :: u_hat_pn_d = C_NULL_PTR + integer, allocatable :: shell(:) type(c_ptr) :: shell_d = C_NULL_PTR + real(kind=rp), allocatable :: shell_amp(:) type(c_ptr) :: shell_amp_d = C_NULL_PTR + real(kind=rp), allocatable :: k_y(:) + real(kind=rp), allocatable :: k_z(:) real(kind=rp), allocatable :: k_x(:) type(c_ptr) :: k_x_d = C_NULL_PTR + real(kind=rp), allocatable :: phase_shifts(:) + contains ! ======== Init/Free procedures procedure, pass(this) :: init_common => FST_init_common procedure, pass(this) :: init_bc => FST_init_bc + procedure, pass(this) :: init_from_files => FSF_init_from_files procedure, pass(this) :: init_forcing => FST_init_forcing procedure, pass(this) :: free => FST_free_params ! ========================================================================= @@ -143,8 +152,80 @@ subroutine FST_init_common(this, & this%t_end = t_end this%t_start = t_start + + end subroutine FST_init_common + subroutine FST_init_from_files(this, Uinf, Tu, Il) + class(FST_t), intent(inout) :: this + real(kind=rp), intent(in) :: Uinf, Tu, Il + + integer :: unit, ios, num_columns, num_lines, n_modes_total + character(len=1) :: delimiter + delimiter = ',' + + ! 1. Read FST spectrum + open(file="fst_spectrum.csv", unit=unit, status="old", action="read", iostat=ios) + if (ios /= 0) then + call neko_error("Error opening fst_spectrum.csv") + end if + + num_columns = 1 + num_lines = 0 + + ! Read the file line by line + do + read(unit, '(A)', iostat=ios) line + if (ios /= 0) exit + + ! If it's the first line, count the columns + if (num_columns .eq. 1) then + + ! Count the number of delimiters in the line + do i = 1, len_trim(line) + if (line(i:i) == delimiter) then + num_columns = num_columns + 1 + end if + end do + + end if ! if num_columns .eq. 1 + + num_lines = num_lines + 1 + end do + close(unit) + + if (num_columns .ne. 8) call neko_error("fst_spectrum.csv should have 8 columns") + n_modes_total = num_lines - 1 ! Remove the header + print *, "N MODES", n_modes_total + + ! + ! Allocate all the relevant arrays: + ! shell, kx, ky, kz, amplitudes, u_hat_pn, v_hat_pn, w_hat_pn + allocate(this%shell(n_modes_total)) + allocate(this%kx(n_modes_total)) + allocate(this%ky(n_modes_total)) + allocate(this%kz(n_modes_total)) + allocate(this%shell_amp(n_modes_total)) + allocate(this%random_vectors(n_modes_total,3)) + + ! Now read through the file again and fill the arrays + open(file="fst_spectrum.csv", unit=unit, status="old", action="read", iostat=ios) + if (ios /= 0) then + call neko_error("Error opening fst_spectrum.csv") + end if + + ! Read the file line by line + do i = 1, num_lines + read(unit, '(7(g0,","),g0)', iostat=ios) this%shell(i), this%kx(i), & + this%ky(i), this%kz(i), this%shell_amp(i), this%random_vectors(i,1), & + this%random_vectors(i,2), this%random_vectors(i,3) + end do + close(unit) + + + + end subroutine FST_init_from_files + !> Initialize the FST to use with forcing. subroutine FST_init_forcing(this, & @@ -222,6 +303,12 @@ subroutine FST_free_params(this) if(allocated(this%fringe_space)) deallocate(this%fringe_space) if(allocated(this%phi_0)) deallocate(this%phi_0) + if(allocated(this%kx)) deallocate(this%kx) + if(allocated(this%ky)) deallocate(this%ky) + if(allocated(this%kz)) deallocate(this%kz) + if(allocated(this%shell)) deallocate(this%shell) + if(allocated(this%shell_amp)) deallocate(this%shell_amp) + if(allocated(this%phi_0)) deallocate(this%phi_0) if (allocated(this%u_baseflow)) deallocate(this%u_baseflow) if (allocated(this%v_baseflow)) deallocate(this%v_baseflow) @@ -370,7 +457,7 @@ subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w) integer :: ierr, i, idx, m, j ! Do the general generation - call this%generate_common(coef) + !call this%generate_common(coef) ! ! Apply baseflow in the bc zone @@ -407,7 +494,8 @@ subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w) y = coef%dof%y(bc_mask(j), 1,1,1) z = coef%dof%z(bc_mask(j), 1,1,1) do m = 1, k_length - this%phi_0(m,j) = k_num_all(m,1)*x + k_num_all(m,2)*y + k_num_all(m,3)*z + bb(m,1) ! bb is phase_shift + !this%phi_0(m,j) = k_num_all(m,1)*x + k_num_all(m,2)*y + k_num_all(m,3)*z + bb(m,1) ! bb is phase_shift + this%phi_0(m,j) = this%kx(m)*x + this%ky(m)*y + this%kz(m)*z + this%phase_shifts(m) ! bb is phase_shift end do end do From e1c961526a2b3cc213f68a1cd6714c0461e4c154 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Wed, 6 Aug 2025 21:18:31 +0200 Subject: [PATCH 02/41] try --- FST/src/FST-core/01_global_params.f90 | 2 +- FST/src/FST-core/05_turbu.f90 | 7 + FST/src/FST-core/06_FST.f90 | 407 +++++++++++++++----------- FST/src/drivers/01_fst_bc_driver.f90 | 7 +- 4 files changed, 255 insertions(+), 168 deletions(-) diff --git a/FST/src/FST-core/01_global_params.f90 b/FST/src/FST-core/01_global_params.f90 index 927fa3b..3751457 100644 --- a/FST/src/FST-core/01_global_params.f90 +++ b/FST/src/FST-core/01_global_params.f90 @@ -4,7 +4,7 @@ module global_params implicit none - real(kind=rp) :: glb_uinf = 6.0_rp + real(kind=rp) :: glb_uinf = 2.0_rp real(kind=rp) :: fst_ti = 3.7d-2 ! turbulence intensity real(kind=rp) :: fst_il = 11.53d-3 ! integral length scale diff --git a/FST/src/FST-core/05_turbu.f90 b/FST/src/FST-core/05_turbu.f90 index c66bbae..992ca9a 100644 --- a/FST/src/FST-core/05_turbu.f90 +++ b/FST/src/FST-core/05_turbu.f90 @@ -22,6 +22,13 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) real(kind=rp) :: u_hat(fst_modes, 3), u_hat_p(fst_modes, 3) character(len=LOG_SIZE) :: log_buf + call print_param("nshells", real(nshells, kind=rp)) + call print_param("Npmax", real(Npmax, kind=rp)) + call print_param("fst_ti", fst_ti) + call print_param("fst_il", fst_il) + call print_param("kstart", kstart) + call print_param("kend", kend) + dlx = glmax(coef%dof%x, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) - & glmin(coef%dof%x, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) diff --git a/FST/src/FST-core/06_FST.f90 b/FST/src/FST-core/06_FST.f90 index 3098b92..e683446 100644 --- a/FST/src/FST-core/06_FST.f90 +++ b/FST/src/FST-core/06_FST.f90 @@ -8,22 +8,27 @@ module FST !use global_params use fst_operator, only: fst_bc_compute - !use turbu + use turbu, only: make_turbu use utils, only: neko_error use field, only: field_t - use coef, only: coef_t - use logger, ony: neko_log, LOG_SIZE + use coefs, only: coef_t + use logger, only: neko_log, LOG_SIZE use point_zone, only: point_zone_t use math, only: masked_gather_copy use device_math, only: device_masked_gather_copy use num_types, only: rp, xp - use device, only: device_map, device_memcpy, HOST_TO_DEVICE + use comm, only: pe_rank, MPI_REAL_PRECISION, MPI_INTEGER, NEKO_COMM + use neko_config, only: NEKO_BCKND_DEVICE + use mpi_f08 + use device, only: device_map, device_memcpy, HOST_TO_DEVICE, device_get_ptr use, intrinsic :: iso_c_binding, only : c_ptr, C_NULL_PTR implicit none type, public :: FST_t + real(kind=rp) :: Uinf + ! periodic directions logical :: periodic_x logical :: periodic_y @@ -55,6 +60,9 @@ module FST logical :: is_forcing logical :: is_bc + integer :: nshells + integer :: n_modes_total ! = k_length + !> Fringe in space real(kind=rp), allocatable :: fringe_space(:) type(c_ptr) :: fringe_space_d = C_NULL_PTR @@ -89,7 +97,7 @@ module FST ! ======== Init/Free procedures procedure, pass(this) :: init_common => FST_init_common procedure, pass(this) :: init_bc => FST_init_bc - procedure, pass(this) :: init_from_files => FSF_init_from_files + procedure, pass(this) :: init_from_files => FST_init_from_files procedure, pass(this) :: init_forcing => FST_init_forcing procedure, pass(this) :: free => FST_free_params ! ========================================================================= @@ -156,73 +164,156 @@ subroutine FST_init_common(this, & end subroutine FST_init_common - subroutine FST_init_from_files(this, Uinf, Tu, Il) + !> Initialize all the stuff from files generated by the FST code: + !! - fst_spectrum.csv + !! - sphere.dat + !! - bb.txt + !! + !! NOTE: The structure of fst_spectrum.csv should be: + !! shellno, kx, ky, kz, amp, u_hat_pn(1), u_hat_pn(2), u_hat_pn(3) + subroutine FST_init_from_files(this, Uinf) class(FST_t), intent(inout) :: this - real(kind=rp), intent(in) :: Uinf, Tu, Il + real(kind=rp), intent(in) :: Uinf - integer :: unit, ios, num_columns, num_lines, n_modes_total + integer :: unit, ios, num_columns, num_lines, n_modes_total, i, np_eff, & + ierr, prev_shell, idx_shell_amp character(len=1) :: delimiter + character(len=1024) :: line + character(len=20) :: keyword + real(kind=rp) :: tmp delimiter = ',' - ! 1. Read FST spectrum - open(file="fst_spectrum.csv", unit=unit, status="old", action="read", iostat=ios) - if (ios /= 0) then - call neko_error("Error opening fst_spectrum.csv") - end if + this%Uinf = Uinf - num_columns = 1 - num_lines = 0 + if (pe_rank .eq. 0) then - ! Read the file line by line - do - read(unit, '(A)', iostat=ios) line - if (ios /= 0) exit + ! 1. Read sphere.dat to get number of spheres + open(file="sphere.dat", unit=unit, status="old", action="read", & + iostat=ios) + if (ios /= 0) then + call neko_error("Error opening sphere.dat") + end if - ! If it's the first line, count the columns - if (num_columns .eq. 1) then + write (*,*) "Reading sphere.dat" + read(unit,*) line + read(unit,*) keyword, this%nshells + print *, this%nshells - ! Count the number of delimiters in the line - do i = 1, len_trim(line) - if (line(i:i) == delimiter) then - num_columns = num_columns + 1 - end if - end do + close(unit) - end if ! if num_columns .eq. 1 + ! 1. Read FST spectrum + open(file="fst_spectrum.csv", unit=unit, status="old", action="read", & + iostat=ios) + write (*,*) "Reading fst_spectrum" + if (ios /= 0) then + call neko_error("Error opening fst_spectrum.csv") + end if - num_lines = num_lines + 1 - end do - close(unit) + num_columns = 1 + num_lines = 0 + + ! Read the file line by line + do + read(unit, '(A)', iostat=ios) line + if (ios /= 0) exit + + ! If it's the first line, count the columns + if (num_columns .eq. 1) then + + ! Count the number of delimiters in the line + do i = 1, len_trim(line) + if (line(i:i) == delimiter) then + num_columns = num_columns + 1 + end if + end do + + end if ! if num_columns .eq. 1 + + num_lines = num_lines + 1 + end do + close(unit) + + if (num_columns .ne. 8) call neko_error("fst_spectrum.csv should have 8 columns") + this%n_modes_total = num_lines - 1 ! Remove the header + np_eff = this%n_modes_total / this%nshells + print *, this%n_modes_total, np_eff + + end if + + call MPI_Bcast(this%n_modes_total, 1, MPI_INTEGER, 0, NEKO_COMM, ierr) + call MPI_Bcast(this%nshells, 1, MPI_INTEGER, 0, NEKO_COMM, ierr) - if (num_columns .ne. 8) call neko_error("fst_spectrum.csv should have 8 columns") - n_modes_total = num_lines - 1 ! Remove the header - print *, "N MODES", n_modes_total + call MPI_Barrier(NEKO_COMM, ierr) + print *, pe_rank, this%n_modes_total, this%nshells ! ! Allocate all the relevant arrays: ! shell, kx, ky, kz, amplitudes, u_hat_pn, v_hat_pn, w_hat_pn - allocate(this%shell(n_modes_total)) - allocate(this%kx(n_modes_total)) - allocate(this%ky(n_modes_total)) - allocate(this%kz(n_modes_total)) - allocate(this%shell_amp(n_modes_total)) - allocate(this%random_vectors(n_modes_total,3)) - - ! Now read through the file again and fill the arrays - open(file="fst_spectrum.csv", unit=unit, status="old", action="read", iostat=ios) - if (ios /= 0) then - call neko_error("Error opening fst_spectrum.csv") - end if + allocate(this%shell(this%n_modes_total)) + allocate(this%k_x(this%n_modes_total)) + allocate(this%k_y(this%n_modes_total)) + allocate(this%k_z(this%n_modes_total)) + allocate(this%shell_amp(this%nshells)) + allocate(this%random_vectors(this%n_modes_total,3)) + allocate(this%phase_shifts(this%n_modes_total)) + + if (pe_rank .eq. 0) then + ! Now read through the file again and fill the arrays + open(file="fst_spectrum.csv", unit=unit, status="old", action="read", & + iostat=ios) + if (ios /= 0) then + call neko_error("Error opening fst_spectrum.csv") + end if - ! Read the file line by line - do i = 1, num_lines - read(unit, '(7(g0,","),g0)', iostat=ios) this%shell(i), this%kx(i), & - this%ky(i), this%kz(i), this%shell_amp(i), this%random_vectors(i,1), & - this%random_vectors(i,2), this%random_vectors(i,3) - end do - close(unit) + read(unit,*) line! read the header + ! Read the file line by line + do i = 1, this%n_modes_total + !if (i//this%nshells .eq. 0) + read(unit,*) this%shell(i), this%k_x(i), & + this%k_y(i), this%k_z(i), this%shell_amp((i-1)/np_eff+1), & + this%random_vectors(i,1), this%random_vectors(i,2), & + this%random_vectors(i,3) + print *, "<<0>>",this%shell(i), this%k_x(i), this%k_y(i), this%k_z(i), this%shell_amp((i-1)/np_eff+1), & + this%random_vectors(i,1), this%random_vectors(i,2), this%random_vectors(i,3) + end do + close(unit) + + ! + ! 2. Now read the phase shifts + ! + open(file="bb.txt", unit=unit, status="old", action="read", iostat=ios) + do i = 1, this%n_modes_total + read(unit,*) this%phase_shifts(i), tmp + print *, this%phase_shifts(i) + end do + + end if + + call MPI_Bcast(this%k_x, this%n_modes_total, MPI_REAL_PRECISION, 0, & + NEKO_COMM, ierr) + call MPI_Bcast(this%k_y, this%n_modes_total, MPI_REAL_PRECISION, 0, & + NEKO_COMM, ierr) + call MPI_Bcast(this%k_z, this%n_modes_total, MPI_REAL_PRECISION, 0, & + NEKO_COMM, ierr) + call MPI_Bcast(this%shell, this%n_modes_total, MPI_INTEGER, 0, NEKO_COMM, & + ierr) + call MPI_Bcast(this%shell_amp, this%nshells, MPI_REAL_PRECISION, 0, & + NEKO_COMM, ierr) + call MPI_Bcast(this%random_vectors, this%n_modes_total*3, & + MPI_REAL_PRECISION, 0, NEKO_COMM, ierr) + call MPI_Bcast(this%phase_shifts, this%n_modes_total, MPI_REAL_PRECISION, & + 0, NEKO_COMM, ierr) + call MPI_Barrier(NEKO_COMM, ierr) + + if (pe_rank .eq. 1) then + do i = 1, this%n_modes_total + print *, "<<1>>", this%shell(i), this%k_x(i), this%k_y(i), this%k_z(i), & + this%shell_amp((i-1)/78 +1), & + this%random_vectors(i,1), this%random_vectors(i,2), this%random_vectors(i,3) + end do + end if end subroutine FST_init_from_files @@ -303,9 +394,9 @@ subroutine FST_free_params(this) if(allocated(this%fringe_space)) deallocate(this%fringe_space) if(allocated(this%phi_0)) deallocate(this%phi_0) - if(allocated(this%kx)) deallocate(this%kx) - if(allocated(this%ky)) deallocate(this%ky) - if(allocated(this%kz)) deallocate(this%kz) + if(allocated(this%k_x)) deallocate(this%k_x) + if(allocated(this%k_y)) deallocate(this%k_y) + if(allocated(this%k_z)) deallocate(this%k_z) if(allocated(this%shell)) deallocate(this%shell) if(allocated(this%shell_amp)) deallocate(this%shell_amp) if(allocated(this%phi_0)) deallocate(this%phi_0) @@ -319,23 +410,19 @@ end subroutine FST_free_params subroutine FST_print_params(this) class(FST_t) :: this - call print_param("nshells", real(nshells, kind=rp)) - call print_param("Npmax", real(Npmax, kind=rp)) - call print_param("fst_ti", fst_ti) - call print_param("fst_il", fst_il) - call print_param("kstart", kstart) - call print_param("kend", kend) - call print_param("xstart", this%xstart) - call print_param("xend", this%xend) - call print_param("ystart", this%ystart) - call print_param("yend", this%yend) - call print_param("fringe_max", this%fringe_max) - call print_param("x_delta_rise", this%x_delta_rise) - call print_param("x_delta_fall", this%x_delta_fall) - call print_param("y_delta_rise", this%y_delta_rise) - call print_param("y_delta_fall", this%y_delta_fall) - call print_param("t_start", this%t_start) - call print_param("t_end", this%t_end) + if (pe_rank .ne. 0) return + + write(*, *) "xstart", this%xstart + write(*, *) "xend", this%xend + write(*, *) "ystart", this%ystart + write(*, *) "yend", this%yend + write(*, *) "fringe_max", this%fringe_max + write(*, *) "x_delta_rise", this%x_delta_rise + write(*, *) "x_delta_fall", this%x_delta_fall + write(*, *) "y_delta_rise", this%y_delta_rise + write(*, *) "y_delta_fall", this%y_delta_fall + write(*, *) "t_start", this%t_start + write(*, *) "t_end", this%t_end end subroutine FST_print_params @@ -386,21 +473,6 @@ subroutine FST_generate_common(this, coef) call neko_log%section ('Generating FST') call make_turbu(coef, this%periodic_x, this%periodic_y, this%periodic_z) - call MPI_Bcast(k_length , 1 , & - MPI_INTEGER , 0, NEKO_COMM, ierr) - call MPI_Bcast(k_num_all, fst_modes*coef%msh%gdim, & - MPI_REAL_PRECISION, 0, NEKO_COMM, ierr) - call MPI_Bcast(k_num , fst_modes*coef%msh%gdim, & - MPI_REAL_PRECISION, 0, NEKO_COMM, ierr) - call MPI_Bcast(u_hat_pn , fst_modes*coef%msh%gdim, & - MPI_REAL_PRECISION, 0, NEKO_COMM, ierr) - call MPI_Bcast(bb , fst_modes*coef%msh%gdim, & - MPI_REAL_PRECISION, 0, NEKO_COMM, ierr) - call MPI_Bcast(shell , fst_modes , & - MPI_INTEGER , 0, NEKO_COMM, ierr) - call MPI_Bcast(shell_amp, nshells , & - MPI_REAL_PRECISION, 0, NEKO_COMM, ierr) - call neko_log%end_section('Done --> Generating FST') end subroutine FST_generate_common @@ -445,19 +517,24 @@ subroutine FST_generate_forcing(this, coef, zone, u, v, w) end subroutine FST_generate_forcing !> Do the generation for BC. - subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w) + subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen) class(FST_t), intent(inout) :: this type(coef_t), intent(in) :: coef integer, intent(in) :: bc_mask(0:n) integer, intent(in) :: n type(field_t), intent(in) :: u, v, w + logical, intent(in) :: regen character(len=LOG_SIZE) :: log_buf real(kind=rp) :: x, y, z integer :: ierr, i, idx, m, j - ! Do the general generation - !call this%generate_common(coef) + ! + ! Generate everything from scratch + ! + if (regen) call this%generate_common(coef) + + call this%init_from_files(2.0_rp) ! ! Apply baseflow in the bc zone @@ -487,62 +564,64 @@ subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w) ! ! Precompute time-independent term ! - allocate(this%phi_0(k_length, bc_mask(0))) + allocate(this%phi_0(this%n_modes_total, bc_mask(0))) do j = 1, bc_mask(0) x = coef%dof%x(bc_mask(j), 1,1,1) y = coef%dof%y(bc_mask(j), 1,1,1) z = coef%dof%z(bc_mask(j), 1,1,1) - do m = 1, k_length - !this%phi_0(m,j) = k_num_all(m,1)*x + k_num_all(m,2)*y + k_num_all(m,3)*z + bb(m,1) ! bb is phase_shift - this%phi_0(m,j) = this%kx(m)*x + this%ky(m)*y + this%kz(m)*z + this%phase_shifts(m) ! bb is phase_shift - end do + do m = 1, this%n_modes_total + this%phi_0(m,j) = this%k_x(m)*x + this%k_y(m)*y + this%k_z(m)*z + & + this%phase_shifts(m) + if (j == 1) print *, m, this%phi_0(m,j) + end do end do ! ! Copy the wavenumbers in x direction ! - allocate(this%k_x(fst_modes)) - - do m = 1, fst_modes - this%k_x(m) = k_num_all(m,1) - end do - +!!$ allocate(this%k_x(fst_modes)) +!!$ +!!$ do m = 1, fst_modes +!!$ this%k_x(m) = k_num_all(m,1) +!!$ end do +!!$ ! ! Copy a proper version of u_hat_pn with correct size ! - allocate(this%random_vectors(k_length, 3)) - - do m = 1, k_length - do j = 1, 3 - this%random_vectors(m,j) = u_hat_pn(m,j) - end do - end do - +!!$ allocate(this%random_vectors(this%n_modes_total, 3)) +!!$ +!!$ do m = 1, this%n_modes_total +!!$ do j = 1, 3 +!!$ this%random_vectors(m,j) = u_hat_pn(m,j) +!!$ end do +!!$ end do +!!$ ! Copy everything to device and map with relevant device array pointers if (NEKO_BCKND_DEVICE .eq. 1) then call device_map(this%fringe_space, this%fringe_space_d, bc_mask(0)) call device_memcpy(this%fringe_space, this%fringe_space_d, bc_mask(0), & HOST_TO_DEVICE, .false.) - call device_map(this%phi_0, this%phi_0_d, k_length*bc_mask(0)) - call device_memcpy(this%phi_0, this%phi_0_d, k_length*bc_mask(0), & - HOST_TO_DEVICE, .false.) + call device_map(this%phi_0, this%phi_0_d, this%n_modes_total*bc_mask(0)) + call device_memcpy(this%phi_0, this%phi_0_d, & + this%n_modes_total*bc_mask(0), HOST_TO_DEVICE, .false.) - call device_map(this%random_vectors, this%random_vectors_d, k_length*3) - call device_memcpy(this%random_vectors, this%random_vectors_d, k_length*3, & - HOST_TO_DEVICE, .false.) + call device_map(this%random_vectors, this%random_vectors_d, & + this%n_modes_total*3) + call device_memcpy(this%random_vectors, this%random_vectors_d, & + this%n_modes_total*3, HOST_TO_DEVICE, .false.) - call device_map(shell, this%shell_d, fst_modes) - call device_memcpy(shell, this%shell_d, fst_modes, & + call device_map(this%shell, this%shell_d, this%n_modes_total) + call device_memcpy(this%shell, this%shell_d, this%n_modes_total, & HOST_TO_DEVICE, .false.) - call device_map(shell_amp, this%shell_amp_d, nshells) - call device_memcpy(shell_amp, this%shell_amp_d, nshells, & + call device_map(this%shell_amp, this%shell_amp_d, this%nshells) + call device_memcpy(this%shell_amp, this%shell_amp_d, this%nshells, & HOST_TO_DEVICE, .false.) - call device_map(this%k_x, this%k_x_d, fst_modes) - call device_memcpy(this%k_x, this%k_x_d, fst_modes, & + call device_map(this%k_x, this%k_x_d, this%n_modes_total) + call device_memcpy(this%k_x, this%k_x_d, this%n_modes_total, & HOST_TO_DEVICE, .true.) end if @@ -568,43 +647,43 @@ subroutine FST_forcing_zone(this, zone, & real(kind=rp) :: rand_vec(gdim) real(kind=rp) :: fringe_time - fringe_time = time_ramp(t, this%t_end, this%t_start) - - ! Loop on all points in the point zone - do idx = 1, zone%size - i = zone%mask(idx) - - !> This vector will contain the sum of all Fourier modes - rand_vec = 0.0_rp - - ! Sum all sin modes for each gll point - do m = 1, k_length - phase_shft = bb(m,1) - - ! kx(x - U*t) + ky*y + kz*z - random_phase[-pi, pi] - ! = kx*x + ky*y + kz*z - kx*U*t - random_phase - phi = k_num_all(m,1) * (x(i,1,1,1) - glb_uinf*t) + & - k_num_all(m,2) * y(i,1,1,1) + & - k_num_all(m,3) * z(i,1,1,1) + & - phase_shft - - shellno = shell(m) - pert = shell_amp(shellno)*sin(phi) - - rand_vec(1) = rand_vec(1) + u_hat_pn(m,1)*pert - rand_vec(2) = rand_vec(2) + u_hat_pn(m,2)*pert - rand_vec(3) = rand_vec(3) + u_hat_pn(m,3)*pert - enddo - - fu(i,1,1,1) = fringe_time*this%fringe_space(idx)*( & - this%u_baseflow(idx) + rand_vec(1) - u(i,1,1,1)) - - fv(i,1,1,1) = fringe_time*this%fringe_space(idx)*( & - this%v_baseflow(idx) + rand_vec(2) - v(i,1,1,1)) - - fw(i,1,1,1) = fringe_time*this%fringe_space(idx)*( & - this%w_baseflow(idx) + rand_vec(3) - w(i,1,1,1)) - end do +!!$ fringe_time = time_ramp(t, this%t_end, this%t_start) +!!$ +!!$ ! Loop on all points in the point zone +!!$ do idx = 1, zone%size +!!$ i = zone%mask(idx) +!!$ +!!$ !> This vector will contain the sum of all Fourier modes +!!$ rand_vec = 0.0_rp +!!$ +!!$ ! Sum all sin modes for each gll point +!!$ do m = 1, this%n_modes_total +!!$ phase_shft = bb(m,1) +!!$ +!!$ ! k_x(x - U*t) + ky*y + kz*z - random_phase[-pi, pi] +!!$ ! = k_x*x + ky*y + kz*z - k_x*U*t - random_phase +!!$ phi = k_num_all(m,1) * (x(i,1,1,1) - glb_uinf*t) + & +!!$ k_num_all(m,2) * y(i,1,1,1) + & +!!$ k_num_all(m,3) * z(i,1,1,1) + & +!!$ phase_shft +!!$ +!!$ shellno = shell(m) +!!$ pert = shell_amp(shellno)*sin(phi) +!!$ +!!$ rand_vec(1) = rand_vec(1) + u_hat_pn(m,1)*pert +!!$ rand_vec(2) = rand_vec(2) + u_hat_pn(m,2)*pert +!!$ rand_vec(3) = rand_vec(3) + u_hat_pn(m,3)*pert +!!$ enddo +!!$ +!!$ fu(i,1,1,1) = fringe_time*this%fringe_space(idx)*( & +!!$ this%u_baseflow(idx) + rand_vec(1) - u(i,1,1,1)) +!!$ +!!$ fv(i,1,1,1) = fringe_time*this%fringe_space(idx)*( & +!!$ this%v_baseflow(idx) + rand_vec(2) - v(i,1,1,1)) +!!$ +!!$ fw(i,1,1,1) = fringe_time*this%fringe_space(idx)*( & +!!$ this%w_baseflow(idx) + rand_vec(3) - w(i,1,1,1)) +!!$ end do end subroutine FST_forcing_zone @@ -634,9 +713,9 @@ subroutine FST_apply_BC(this, bc_mask, n, & cosa = cos(angleXY) sina = sin(angleXY) - call fst_bc_compute(t, glb_uinf,u_bc, v_bc, w_bc, bc_mask, n, & + call fst_bc_compute(t, this%Uinf, u_bc, v_bc, w_bc, bc_mask, n, & this%u_baseflow, this%v_baseflow, this%w_baseflow, & - this%k_x, k_length, this%phi_0, shell, shell_amp, & + this%k_x, this%n_modes_total, this%phi_0, this%shell, this%shell_amp, & this%random_vectors, angleXY, fringe_time, this%fringe_space, on_host) !!$ phi_t = glb_uinf*t @@ -649,13 +728,13 @@ subroutine FST_apply_BC(this, bc_mask, n, & !!$ rand_vec = 0.0_rp !!$ !!$ ! Sum all sin modes for each gll point -!!$ do m = 1, k_length +!!$ do m = 1, this%n_modes_total !!$ !!$ ! Random phase shifts !!$ !phase_shft = bb(m,1) !!$ -!!$ ! kx(x - U*t) + ky*y + kz*z + phi -!!$ ! = kx*x + ky*y + kz*z - kx*U*t + phi +!!$ ! k_x(x - U*t) + ky*y + kz*z + phi +!!$ ! = k_x*x + ky*y + kz*z - k_x*U*t + phi !!$ !phi = k_num_all(m,1) * (x(i,1,1,1) - glb_uinf*t) + & !!$ ! k_num_all(m,2) * y(i,1,1,1) + & !!$ ! k_num_all(m,3) * z(i,1,1,1) + & diff --git a/FST/src/drivers/01_fst_bc_driver.f90 b/FST/src/drivers/01_fst_bc_driver.f90 index 84c9c99..a0b22f5 100644 --- a/FST/src/drivers/01_fst_bc_driver.f90 +++ b/FST/src/drivers/01_fst_bc_driver.f90 @@ -132,7 +132,8 @@ subroutine fst_bc_driver_initialize(t, u, v, w, p, coef, params) end subroutine fst_bc_driver_initialize - subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu) + subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu, & + regen) type(field_t), intent(inout) :: u type(field_t), intent(inout) :: v type(field_t), intent(inout) :: w @@ -141,7 +142,7 @@ subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu) real(kind=rp), intent(in) :: t integer, intent(in) :: tstep real(kind=rp), intent(in) :: angle - logical, intent(in), optional :: on_cpu + logical, intent(in) :: on_cpu, regen integer :: i, idx @@ -152,7 +153,7 @@ subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu) ! on the boundry mask! ! if (tstep .eq. 1) then - call FST_obj%generate_bc(coef, bc%msk, bc%msk(0), u=u, v=v, w=w) + call FST_obj%generate_bc(coef, bc%msk, bc%msk(0), u, v, w, regen) end if ! Then, apply the free stream turbulence that will add on From 43cd5af769f227612bf5f60f83659a9b6b0b42a2 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 7 Aug 2025 11:14:44 +0200 Subject: [PATCH 03/41] maeneko --- FST/src/makeneko_cpu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FST/src/makeneko_cpu b/FST/src/makeneko_cpu index 396056c..c0fa268 100755 --- a/FST/src/makeneko_cpu +++ b/FST/src/makeneko_cpu @@ -1,6 +1,6 @@ #!/bin/bash -backend="bcknd/cpu/*" +backend="bcknd/cpu/opr_fst_cpu.f90 bcknd/device/opr_fst_device.F90" interface="fst_operator.f90" fst_core="FST-core/0*" driver="drivers/0*" From 20101994edeff791582167a50fd82117fa35259d Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 7 Aug 2025 11:15:38 +0200 Subject: [PATCH 04/41] change example --- FST/src/user.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FST/src/user.f90 b/FST/src/user.f90 index 704e6f8..020d4d6 100644 --- a/FST/src/user.f90 +++ b/FST/src/user.f90 @@ -73,7 +73,7 @@ subroutine user_bc(field_bc_list, bc, coef, t, tstep) ! ! Apply FST ! - call fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, 0.0_rp, .false.) + call fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, 0.0_rp, .false., .true.) end associate From 0fb5441e78db319de73fb613dbe5a49c6ad62a3f Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 7 Aug 2025 11:16:09 +0200 Subject: [PATCH 05/41] gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f285980..f0dea17 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.mod +*.txt *.o *.smod From 681a3dbb1f7edb44eebc7cf616d67e96e23c0748 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 7 Aug 2025 11:16:40 +0200 Subject: [PATCH 06/41] gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f0dea17..ad7c425 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.mod *.txt +*.case *.o *.smod From 6e0247260d9cb3f41f0264f430a6e24432215e05 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 11 Aug 2025 21:16:42 +0200 Subject: [PATCH 07/41] xp --- FST/src/FST-core/06_FST.f90 | 80 ++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/FST/src/FST-core/06_FST.f90 b/FST/src/FST-core/06_FST.f90 index e683446..e76d008 100644 --- a/FST/src/FST-core/06_FST.f90 +++ b/FST/src/FST-core/06_FST.f90 @@ -35,27 +35,27 @@ module FST logical :: periodic_z ! x fringe - real(kind=rp) :: xmin - real(kind=rp) :: xmax - real(kind=rp) :: xstart - real(kind=rp) :: xend - real(kind=rp) :: x_delta_rise - real(kind=rp) :: x_delta_fall + real(kind=xp) :: xmin + real(kind=xp) :: xmax + real(kind=xp) :: xstart + real(kind=xp) :: xend + real(kind=xp) :: x_delta_rise + real(kind=xp) :: x_delta_fall ! y fringe - real(kind=rp) :: ymin - real(kind=rp) :: ymax - real(kind=rp) :: ystart - real(kind=rp) :: yend - real(kind=rp) :: y_delta_rise - real(kind=rp) :: y_delta_fall + real(kind=xp) :: ymin + real(kind=xp) :: ymax + real(kind=xp) :: ystart + real(kind=xp) :: yend + real(kind=xp) :: y_delta_rise + real(kind=xp) :: y_delta_fall !> Total fringe amplitude - real(kind=rp) :: fringe_max + real(kind=xp) :: fringe_max !> Final ramp time - real(kind=rp) :: t_end - real(kind=rp) :: t_start + real(kind=xp) :: t_end + real(kind=xp) :: t_start logical :: is_forcing logical :: is_bc @@ -64,33 +64,33 @@ module FST integer :: n_modes_total ! = k_length !> Fringe in space - real(kind=rp), allocatable :: fringe_space(:) + real(kind=xp), allocatable :: fringe_space(:) type(c_ptr) :: fringe_space_d = C_NULL_PTR !> Baseflows, if applying on a non-uniform inflow - real(kind=rp), allocatable :: u_baseflow(:) - real(kind=rp), allocatable :: v_baseflow(:) - real(kind=rp), allocatable :: w_baseflow(:) + real(kind=xp), allocatable :: u_baseflow(:) + real(kind=xp), allocatable :: v_baseflow(:) + real(kind=xp), allocatable :: w_baseflow(:) type(c_ptr) :: u_baseflow_d = C_NULL_PTR type(c_ptr) :: v_baseflow_d = C_NULL_PTR type(c_ptr) :: w_baseflow_d = C_NULL_PTR !> Variable that is precomputed to save some time - real(kind=rp), allocatable :: phi_0(:,:) + real(kind=xp), allocatable :: phi_0(:,:) type(c_ptr) :: phi_0_d = C_NULL_PTR - real(kind=rp), allocatable :: random_vectors(:,:) ! u_hat_pn but reshaped + real(kind=xp), allocatable :: random_vectors(:,:) ! u_hat_pn but reshaped type(c_ptr) :: random_vectors_d = C_NULL_PTR integer, allocatable :: shell(:) type(c_ptr) :: shell_d = C_NULL_PTR - real(kind=rp), allocatable :: shell_amp(:) + real(kind=xp), allocatable :: shell_amp(:) type(c_ptr) :: shell_amp_d = C_NULL_PTR - real(kind=rp), allocatable :: k_y(:) - real(kind=rp), allocatable :: k_z(:) - real(kind=rp), allocatable :: k_x(:) + real(kind=xp), allocatable :: k_y(:) + real(kind=xp), allocatable :: k_z(:) + real(kind=xp), allocatable :: k_x(:) type(c_ptr) :: k_x_d = C_NULL_PTR - real(kind=rp), allocatable :: phase_shifts(:) + real(kind=xp), allocatable :: phase_shifts(:) contains @@ -125,17 +125,17 @@ subroutine FST_init_common(this, & t_start, t_end, & periodic_x, periodic_y, periodic_z) class(FST_t), intent(inout) :: this - real(kind=rp), intent(in) :: xstart - real(kind=rp), intent(in) :: xend - real(kind=rp), intent(in) :: ystart - real(kind=rp), intent(in) :: yend - real(kind=rp), intent(in) :: x_delta_rise - real(kind=rp), intent(in) :: x_delta_fall - real(kind=rp), intent(in) :: y_delta_rise - real(kind=rp), intent(in) :: y_delta_fall - real(kind=rp), intent(in) :: fringe_max - real(kind=rp), intent(in) :: t_start - real(kind=rp), intent(in) :: t_end + real(kind=xp), intent(in) :: xstart + real(kind=xp), intent(in) :: xend + real(kind=xp), intent(in) :: ystart + real(kind=xp), intent(in) :: yend + real(kind=xp), intent(in) :: x_delta_rise + real(kind=xp), intent(in) :: x_delta_fall + real(kind=xp), intent(in) :: y_delta_rise + real(kind=xp), intent(in) :: y_delta_fall + real(kind=xp), intent(in) :: fringe_max + real(kind=xp), intent(in) :: t_start + real(kind=xp), intent(in) :: t_end logical, intent(in) :: periodic_x, periodic_y, periodic_z this%periodic_x = periodic_x @@ -781,7 +781,7 @@ end subroutine FST_apply_BC ! else if (x.ge.f%xend) then ! S=1 ! else - ! S=1/(1+erp(1/(x-f%xend)+1/(x-f%xstart))) + ! S=1/(1+exp(1/(x-f%xend)+1/(x-f%xstart))) ! endif ! y = f%fringe_max * (S*(x-f%xstart)/(f%delta_rise)-S*((x-f%xend)/f%delta_fall+1)) @@ -811,7 +811,7 @@ end function time_ramp ! Fringe function as described in Schlatter (2001), extended to take y bounds into account too ! ! Here is what the fringe looks like, except the ramp-up is not linear - ! but erponential (see function S below) + ! but exponential (see function S below) ! ! fringe_max ________ ! / \ @@ -840,7 +840,7 @@ function fringe(x, y, f) result(fr) end function fringe - ! Smooth step function, 0 if x <= 0, 1 if x >= 1, 1/erp(1/(x-1) + 1/x) between 0 and 1 + ! Smooth step function, 0 if x <= 0, 1 if x >= 1, 1/exp(1/(x-1) + 1/x) between 0 and 1 function S(x) result(y) real(kind=rp), intent(in) :: x real(kind=rp) :: y From b3104bf372ea69495a1338262b9e5284a3373517 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Fri, 15 Aug 2025 17:11:26 +0200 Subject: [PATCH 08/41] enable xp --- FST/src/FST-core/02_sphere.f90 | 1 - FST/src/FST-core/06_FST.f90 | 164 ++++++++++++------------ FST/src/bcknd/cpu/opr_fst_cpu.f90 | 5 +- FST/src/bcknd/device/cuda/opr_fst.cu | 18 +-- FST/src/bcknd/device/opr_fst_device.F90 | 15 ++- FST/src/drivers/01_fst_bc_driver.f90 | 14 +- FST/src/fst_operator.f90 | 9 +- 7 files changed, 112 insertions(+), 114 deletions(-) diff --git a/FST/src/FST-core/02_sphere.f90 b/FST/src/FST-core/02_sphere.f90 index 2e1d522..71be5cb 100644 --- a/FST/src/FST-core/02_sphere.f90 +++ b/FST/src/FST-core/02_sphere.f90 @@ -1,7 +1,6 @@ module sphere use neko use global_params - ! use global_params implicit none contains diff --git a/FST/src/FST-core/06_FST.f90 b/FST/src/FST-core/06_FST.f90 index 2c1fdbd..d0577e2 100644 --- a/FST/src/FST-core/06_FST.f90 +++ b/FST/src/FST-core/06_FST.f90 @@ -17,7 +17,7 @@ module FST use math, only: masked_gather_copy use device_math, only: device_masked_gather_copy use num_types, only: rp, xp - use comm, only: pe_rank, MPI_REAL_PRECISION, MPI_INTEGER, NEKO_COMM + use comm, only: pe_rank, MPI_EXTRA_PRECISION, NEKO_COMM use neko_config, only: NEKO_BCKND_DEVICE use mpi_f08 use device, only: device_map, device_memcpy, HOST_TO_DEVICE, device_get_ptr @@ -27,7 +27,7 @@ module FST type, public :: FST_t - real(kind=rp) :: Uinf + real(kind=xp) :: Uinf ! periodic directions logical :: periodic_x @@ -35,20 +35,20 @@ module FST logical :: periodic_z ! x fringe - real(kind=xp) :: xmin - real(kind=xp) :: xmax - real(kind=xp) :: xstart - real(kind=xp) :: xend - real(kind=xp) :: x_delta_rise - real(kind=xp) :: x_delta_fall + real(kind=rp) :: xmin + real(kind=rp) :: xmax + real(kind=rp) :: xstart + real(kind=rp) :: xend + real(kind=rp) :: x_delta_rise + real(kind=rp) :: x_delta_fall ! y fringe - real(kind=xp) :: ymin - real(kind=xp) :: ymax - real(kind=xp) :: ystart - real(kind=xp) :: yend - real(kind=xp) :: y_delta_rise - real(kind=xp) :: y_delta_fall + real(kind=rp) :: ymin + real(kind=rp) :: ymax + real(kind=rp) :: ystart + real(kind=rp) :: yend + real(kind=rp) :: y_delta_rise + real(kind=rp) :: y_delta_fall !> Total fringe amplitude real(kind=xp) :: fringe_max @@ -68,9 +68,9 @@ module FST type(c_ptr) :: fringe_space_d = C_NULL_PTR !> Baseflows, if applying on a non-uniform inflow - real(kind=xp), allocatable :: u_baseflow(:) - real(kind=xp), allocatable :: v_baseflow(:) - real(kind=xp), allocatable :: w_baseflow(:) + real(kind=rp), allocatable :: u_baseflow(:) + real(kind=rp), allocatable :: v_baseflow(:) + real(kind=rp), allocatable :: w_baseflow(:) type(c_ptr) :: u_baseflow_d = C_NULL_PTR type(c_ptr) :: v_baseflow_d = C_NULL_PTR type(c_ptr) :: w_baseflow_d = C_NULL_PTR @@ -125,14 +125,12 @@ subroutine FST_init_common(this, & t_start, t_end, & periodic_x, periodic_y, periodic_z) class(FST_t), intent(inout) :: this - real(kind=xp), intent(in) :: xstart - real(kind=xp), intent(in) :: xend - real(kind=xp), intent(in) :: ystart - real(kind=xp), intent(in) :: yend - real(kind=xp), intent(in) :: x_delta_rise - real(kind=xp), intent(in) :: x_delta_fall - real(kind=xp), intent(in) :: y_delta_rise - real(kind=xp), intent(in) :: y_delta_fall + real(kind=rp), intent(in) :: xstart, xend, xmin, xmax + real(kind=rp), intent(in) :: ystart, yend, ymin, ymax + real(kind=rp), intent(in) :: x_delta_rise + real(kind=rp), intent(in) :: x_delta_fall + real(kind=rp), intent(in) :: y_delta_rise + real(kind=rp), intent(in) :: y_delta_fall real(kind=xp), intent(in) :: fringe_max real(kind=xp), intent(in) :: t_start real(kind=xp), intent(in) :: t_end @@ -173,14 +171,14 @@ end subroutine FST_init_common !! shellno, kx, ky, kz, amp, u_hat_pn(1), u_hat_pn(2), u_hat_pn(3) subroutine FST_init_from_files(this, Uinf) class(FST_t), intent(inout) :: this - real(kind=rp), intent(in) :: Uinf + real(kind=xp), intent(in) :: Uinf integer :: unit, ios, num_columns, num_lines, n_modes_total, i, np_eff, & ierr, prev_shell, idx_shell_amp character(len=1) :: delimiter character(len=1024) :: line character(len=20) :: keyword - real(kind=rp) :: tmp + real(kind=xp) :: tmp delimiter = ',' this%Uinf = Uinf @@ -275,8 +273,8 @@ subroutine FST_init_from_files(this, Uinf) this%k_y(i), this%k_z(i), this%shell_amp((i-1)/np_eff+1), & this%random_vectors(i,1), this%random_vectors(i,2), & this%random_vectors(i,3) - print *, "<<0>>",this%shell(i), this%k_x(i), this%k_y(i), this%k_z(i), this%shell_amp((i-1)/np_eff+1), & - this%random_vectors(i,1), this%random_vectors(i,2), this%random_vectors(i,3) + !print *, "<<0>>",this%shell(i), this%k_x(i), this%k_y(i), this%k_z(i), this%shell_amp((i-1)/np_eff+1), & + ! this%random_vectors(i,1), this%random_vectors(i,2), this%random_vectors(i,3) end do close(unit) @@ -291,27 +289,27 @@ subroutine FST_init_from_files(this, Uinf) end if - call MPI_Bcast(this%k_x, this%n_modes_total, MPI_REAL_PRECISION, 0, & + call MPI_Bcast(this%k_x, this%n_modes_total, MPI_EXTRA_PRECISION, 0, & NEKO_COMM, ierr) - call MPI_Bcast(this%k_y, this%n_modes_total, MPI_REAL_PRECISION, 0, & + call MPI_Bcast(this%k_y, this%n_modes_total, MPI_EXTRA_PRECISION, 0, & NEKO_COMM, ierr) - call MPI_Bcast(this%k_z, this%n_modes_total, MPI_REAL_PRECISION, 0, & + call MPI_Bcast(this%k_z, this%n_modes_total, MPI_EXTRA_PRECISION, 0, & NEKO_COMM, ierr) call MPI_Bcast(this%shell, this%n_modes_total, MPI_INTEGER, 0, NEKO_COMM, & ierr) - call MPI_Bcast(this%shell_amp, this%nshells, MPI_REAL_PRECISION, 0, & + call MPI_Bcast(this%shell_amp, this%nshells, MPI_EXTRA_PRECISION, 0, & NEKO_COMM, ierr) call MPI_Bcast(this%random_vectors, this%n_modes_total*3, & - MPI_REAL_PRECISION, 0, NEKO_COMM, ierr) - call MPI_Bcast(this%phase_shifts, this%n_modes_total, MPI_REAL_PRECISION, & + MPI_EXTRA_PRECISION, 0, NEKO_COMM, ierr) + call MPI_Bcast(this%phase_shifts, this%n_modes_total, MPI_EXTRA_PRECISION, & 0, NEKO_COMM, ierr) call MPI_Barrier(NEKO_COMM, ierr) if (pe_rank .eq. 1) then do i = 1, this%n_modes_total - print *, "<<1>>", this%shell(i), this%k_x(i), this%k_y(i), this%k_z(i), & - this%shell_amp((i-1)/78 +1), & - this%random_vectors(i,1), this%random_vectors(i,2), this%random_vectors(i,3) + !print *, "<<1>>", this%shell(i), this%k_x(i), this%k_y(i), this%k_z(i), & + !this%shell_amp((i-1)/78 +1), & + ! this%random_vectors(i,1), this%random_vectors(i,2), this%random_vectors(i,3) end do end if @@ -335,9 +333,9 @@ subroutine FST_init_forcing(this, & real(kind=rp), intent(in) :: x_delta_fall real(kind=rp), intent(in) :: y_delta_rise real(kind=rp), intent(in) :: y_delta_fall - real(kind=rp), intent(in) :: fringe_max - real(kind=rp), intent(in) :: t_start - real(kind=rp), intent(in) :: t_end + real(kind=xp), intent(in) :: fringe_max + real(kind=xp), intent(in) :: t_start + real(kind=xp), intent(in) :: t_end logical, intent(in) :: periodic_x, periodic_y, periodic_z call neko_log%section('Initializing FST') @@ -368,15 +366,15 @@ subroutine FST_init_bc(this, & real(kind=rp), intent(in) :: x_delta_fall real(kind=rp), intent(in) :: y_delta_rise real(kind=rp), intent(in) :: y_delta_fall - real(kind=rp), intent(in) :: t_start - real(kind=rp), intent(in) :: t_end + real(kind=xp), intent(in) :: t_start + real(kind=xp), intent(in) :: t_end logical, intent(in) :: periodic_x, periodic_y, periodic_z call neko_log%section('Initializing FST') call this%init_common(xmin, xmax, xstart, xend, x_delta_rise, & x_delta_fall, ymin, ymax, ystart, yend, y_delta_rise, & - y_delta_fall, 1.0_rp, t_start, t_end, & + y_delta_fall, 1.0_xp, t_start, t_end, & periodic_x, periodic_y, periodic_z) call this%print() ! show parameters @@ -483,35 +481,35 @@ subroutine FST_generate_forcing(this, coef, zone, u, v, w) class(point_zone_t), intent(in) :: zone type(field_t), intent(in) :: u, v, w - real(kind=rp) :: x, y, z + real(kind=xp) :: x, y, z integer :: ierr, i, idx - ! Do the general generation - call this%generate_common(coef) + !! Do the general generation + !call this%generate_common(coef) - ! - ! Copy the baseflow in the zone - ! - call this%apply_baseflow(zone%mask, zone%size, u, v, w) + !! + !! Copy the baseflow in the zone + !! + !call this%apply_baseflow(zone%mask, zone%size, u, v, w) - ! Generate the fringe in space - allocate(this%fringe_space(zone%size)) + !! Generate the fringe in space + !allocate(this%fringe_space(zone%size)) - ! Initialize the fringe in space - do idx = 1, zone%size - i = zone%mask(idx) - x = coef%dof%x(i,1,1,1) - y = coef%dof%y(i,1,1,1) - z = coef%dof%z(i,1,1,1) + !! Initialize the fringe in space + !do idx = 1, zone%size + ! i = zone%mask(idx) + ! x = coef%dof%x(i,1,1,1) + ! y = coef%dof%y(i,1,1,1) + ! z = coef%dof%z(i,1,1,1) - if ( x .lt. this%xmin .or. x .gt. this%xmax .or. & - y .lt. this%ymin .or. y .gt. this%ymax ) then - this%fringe_space(idx) = 0.0_rp - else - this%fringe_space(idx) = fringe(x, y, this) - end if + ! if ( x .lt. this%xmin .or. x .gt. this%xmax .or. & + ! y .lt. this%ymin .or. y .gt. this%ymax ) then + ! this%fringe_space(idx) = 0.0_xp + ! else + ! this%fringe_space(idx) = fringe(x, y, this) + ! end if - end do + !end do end subroutine FST_generate_forcing @@ -533,7 +531,7 @@ subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen) ! if (regen) call this%generate_common(coef) - call this%init_from_files(2.0_rp) + call this%init_from_files(2.0_xp) ! ! Apply baseflow in the bc zone @@ -553,7 +551,7 @@ subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen) if ( z .lt. this%xmin .or. z .gt. this%xmax .or. & y .lt. this%ymin .or. y .gt. this%ymax ) then - this%fringe_space(idx) = 0.0_rp + this%fringe_space(idx) = 0.0_xp else this%fringe_space(idx) = fringe(z, y, this) end if @@ -572,7 +570,6 @@ subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen) do m = 1, this%n_modes_total this%phi_0(m,j) = this%k_x(m)*x + this%k_y(m)*y + this%k_z(m)*z + & this%phase_shifts(m) - if (j == 1) print *, m, this%phi_0(m,j) end do end do @@ -689,16 +686,15 @@ end subroutine FST_forcing_zone ! Apply FST as a boundary condition based on the bc mask ! Assumes that u,v,w have the same bc masks subroutine FST_apply_BC(this, bc_mask, n, & - x, y, z, t, & + t, & u_bc, v_bc, w_bc, angleXY, on_host) class(FST_t), intent(in) :: this integer, intent(in) :: n ! size of the bc mask integer, intent(in) :: bc_mask(0:n) - real(kind=rp), intent(in), dimension(:,:,:,:) :: x, y, z real(kind=rp), intent(in) :: t real(kind=rp), intent(inout), dimension(:,:,:,:) :: u_bc, v_bc, w_bc - real(kind=rp), intent(in) :: angleXY + real(kind=xp), intent(in) :: angleXY logical, intent(in) :: on_host !!$ integer :: idx, l, m, i, shellno @@ -706,7 +702,7 @@ subroutine FST_apply_BC(this, bc_mask, n, & !!$ real(kind=rp) :: phase_shft, phi, amp, pert, urand, vrand, wrand !!$ real(kind=rp) :: rand_vec(gdim), vel_mag, phi_t - real(kind=rp) :: fringe_time, cosa, sina + real(kind=xp) :: fringe_time, cosa, sina fringe_time = time_ramp(t, this%t_end, this%t_start) cosa = cos(angleXY) @@ -791,17 +787,17 @@ end subroutine FST_apply_BC ! Linear ramp in time function time_ramp(t, t_end, t_start) result(ramp) real(kind=rp), intent(in) :: t - real(kind=rp), intent(in) :: t_end - real(kind=rp), intent(in) :: t_start + real(kind=xp), intent(in) :: t_end + real(kind=xp), intent(in) :: t_start - real(kind=rp) :: ramp + real(kind=xp) :: ramp if (t .le. t_start) then - ramp = 0.0_rp + ramp = 0.0_xp else if (t .lt. t_end) then ramp = (t - t_start)/(t_end - t_start) else - ramp = 1.0_rp + ramp = 1.0_xp end if end function time_ramp @@ -827,7 +823,7 @@ function fringe(x, y, f) result(fr) real(kind=rp), intent(in) :: x real(kind=rp), intent(in), optional :: y type(FST_t), intent(in) :: f - real(kind=rp) :: fr + real(kind=xp) :: fr integer :: i character :: a @@ -844,12 +840,12 @@ function S(x) result(y) real(kind=rp), intent(in) :: x real(kind=rp) :: y - if ( x.le.0._rp ) then - y = 0._rp - else if ( x.ge.1._rp ) then - y = 1._rp + if ( x.le.0._xp ) then + y = 0._xp + else if ( x.ge.1._xp ) then + y = 1._xp else - y = 1._rp / (1._rp + exp( 1._rp/(x-1._rp) + 1._rp/x)) + y = 1._xp / (1._xp + exp( 1._xp/(x-1._xp) + 1._xp/x)) end if end function S diff --git a/FST/src/bcknd/cpu/opr_fst_cpu.f90 b/FST/src/bcknd/cpu/opr_fst_cpu.f90 index 7c241c2..12256d6 100644 --- a/FST/src/bcknd/cpu/opr_fst_cpu.f90 +++ b/FST/src/bcknd/cpu/opr_fst_cpu.f90 @@ -47,13 +47,14 @@ subroutine opr_fst_cpu_fst(t, Uinf, u,v,w, mask,n_mask, & random_vectors, cosa, sina, fringe_time, fringe_space) real(kind=rp), intent(inout), dimension(:,:,:,:) :: u, v, w + real(kind=rp), intent(in) :: t real(kind=rp), intent(in) :: u_baseflow(:), v_baseflow(:), w_baseflow(:) integer, intent(in) :: n_mask, n_total_modes integer, intent(in) :: mask(0:n_mask), shell(:) real(kind=xp), intent(in), dimension(:) :: wavenumbers_x, shell_amplitudes, & fringe_space real(kind=xp), intent(in), dimension(:,:) :: phi_0, random_vectors - real(kind=xp), intent(in) :: t, Uinf, fringe_time, sina, cosa + real(kind=xp), intent(in) :: Uinf, fringe_time, sina, cosa real(kind=xp) :: phi_t, f, rand_vec(3), pert, urand, vrand, wrand, phi @@ -65,7 +66,7 @@ subroutine opr_fst_cpu_fst(t, Uinf, u,v,w, mask,n_mask, & do idx = 1, mask(0) !> This vector will contain the sum of all Fourier modes - rand_vec = 0.0_rp + rand_vec = 0.0_xp ! Sum all sin modes for each gll point do m = 1, n_total_modes diff --git a/FST/src/bcknd/device/cuda/opr_fst.cu b/FST/src/bcknd/device/cuda/opr_fst.cu index a37e5ff..412afc9 100644 --- a/FST/src/bcknd/device/cuda/opr_fst.cu +++ b/FST/src/bcknd/device/cuda/opr_fst.cu @@ -46,7 +46,7 @@ */ template< typename T, typename U> __global__ void fst_kernel( - const U t, + const T t, const U Uinf, T * __restrict__ u, T * __restrict__ v, @@ -110,27 +110,27 @@ __global__ void fst_kernel( extern "C" { -void cuda_fst(real *t, real *Uinf, +void cuda_fst(real *t, real_xp *Uinf, void *u_d, void *v_d, void *w_d, int *mask_d, int *n_mask, void *ubf_d, void *vbf_d, void *wbf_d, void *k_x_d, int *n_total_modes, void *phi_0_d, int *shell_d, - void *shell_amp_d, void *randvec_d, real *cosa, real *sina, - real *fringe_time, void *fs_d) { + void *shell_amp_d, void *randvec_d, real_xp *cosa, real_xp *sina, + real_xp *fringe_time, void *fs_d) { const dim3 nthrds(1024, 1, 1); const dim3 nblcks(*n_mask, 1, 1); const cudaStream_t stream = (cudaStream_t) glb_cmd_queue; - fst_kernel + fst_kernel <<>>( *t, *Uinf, (real *) u_d, (real *) v_d, (real *) w_d, (int *) mask_d, *n_mask, (real *) ubf_d, (real *) vbf_d, (real *) wbf_d, - (real *) k_x_d, *n_total_modes, - (real *) phi_0_d, (int *) shell_d, (real *) shell_amp_d, - (real *) randvec_d, - *cosa, *sina, *fringe_time, (real *) fs_d + (real_xp *) k_x_d, *n_total_modes, + (real_xp *) phi_0_d, (int *) shell_d, (real_xp *) shell_amp_d, + (real_xp *) randvec_d, + *cosa, *sina, *fringe_time, (real_xp *) fs_d ); CUDA_CHECK(cudaGetLastError()); diff --git a/FST/src/bcknd/device/opr_fst_device.F90 b/FST/src/bcknd/device/opr_fst_device.F90 index 1e0aa61..953eb16 100644 --- a/FST/src/bcknd/device/opr_fst_device.F90 +++ b/FST/src/bcknd/device/opr_fst_device.F90 @@ -32,7 +32,7 @@ ! !> Operators accelerator backends module opr_fst_device - use num_types, only : rp, c_rp + use num_types, only : rp, xp, c_rp, c_xp use device, only : device_get_ptr use utils, only : neko_error use comm @@ -49,10 +49,11 @@ subroutine cuda_fst(t, Uinf, u_d,v_d,w_d, mask_d,n_mask, & shell_amp_d, randvec_d, cosa, sina, fringe_time, fs_d) & bind(c, name = 'cuda_fst') use, intrinsic :: iso_c_binding - import c_rp + import c_rp, c_xp type(c_ptr), value :: u_d,v_d,w_d,mask_d,ubf_d,vbf_d,wbf_d,& k_x_d, phi_0_d, shell_d, shell_amp_d, randvec_d, fs_d - real(kind=c_rp) :: t, Uinf, cosa, sina, fringe_time + real(kind=c_rp) :: t + real(kind=c_xp) :: Uinf, cosa, sina, fringe_time integer(c_int) :: n_mask, n_total_modes end subroutine cuda_fst end interface @@ -63,10 +64,11 @@ subroutine hip_fst(t, Uinf, u_d,v_d,w_d, mask_d,n_mask, & shell_amp_d, randvec_d, cosa, sina, fringe_time, fs_d) & bind(c, name = 'hip_fst') use, intrinsic :: iso_c_binding - import c_rp + import c_rp, c_xp type(c_ptr), value :: u_d,v_d,w_d,mask_d,ubf_d,vbf_d,wbf_d,& k_x_d, phi_0_d, shell_d, shell_amp_d, randvec_d, fs_d - real(c_rp) :: t, Uinf, cosa, sina, fringe_time + real(kind=c_rp) :: t + real(kind=c_xp) :: Uinf, cosa, sina, fringe_time integer(c_int) :: n_mask, n_total_modes end subroutine hip_fst end interface @@ -77,7 +79,8 @@ end subroutine hip_fst subroutine opr_fst_device_fst(t, Uinf,u_d,v_d,w_d, mask_d,n_mask, & ubf_d, vbf_d, wbf_d, k_x_d, n_total_modes, phi_0_d, shell_d, & shell_amp_d, randvec_d, cosa, sina, fringe_time, fs_d) - real(kind=rp) :: t, Uinf, cosa, sina, fringe_time + real(kind=c_rp) :: t + real(kind=c_xp) :: Uinf, cosa, sina, fringe_time integer :: n_mask, n_total_modes type(c_ptr) :: fs_d, ubf_d, vbf_d, wbf_d, phi_0_d, randvec_d, shell_d, & shell_amp_d, k_x_d, u_d, v_d, w_d, mask_d diff --git a/FST/src/drivers/01_fst_bc_driver.f90 b/FST/src/drivers/01_fst_bc_driver.f90 index 129751a..044471c 100644 --- a/FST/src/drivers/01_fst_bc_driver.f90 +++ b/FST/src/drivers/01_fst_bc_driver.f90 @@ -55,8 +55,8 @@ subroutine fst_bc_driver_initialize(t, u, v, w, p, coef, params) type(field_t), pointer :: fu,fv,fw character(len=:), allocatable :: read_str, fname logical :: px, py, pz - real(kind=xp) :: x, ymin, ymax, zmin, zmax, delta_y, delta_z, Ly, Lz - real(kind=xp) :: ystart, yend, zstart, zend + real(kind=rp) :: x, ymin, ymax, zmin, zmax, delta_y, delta_z, Ly, Lz + real(kind=rp) :: ystart, yend, zstart, zend integer :: i, idx, ierr, n real(kind=xp) :: alpha, beta, t_ramp, t_start, amp @@ -134,7 +134,7 @@ subroutine fst_bc_driver_initialize(t, u, v, w, p, coef, params) ! Read parameters for the FST fringe in time call json_get(params, "case.FST.t_ramp", t_ramp) - call json_get_or_default(params, "case.FST.t_start", t_start, 0.0_rp) + call json_get_or_default(params, "case.FST.t_start", t_start, 0.0_xp) ! Initialize the fst parameters call FST_OBJ%init_bc(zmin, zmax, zstart, zend, & @@ -155,7 +155,7 @@ subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu, & type(coef_t), intent(inout) :: coef real(kind=rp), intent(in) :: t integer, intent(in) :: tstep - real(kind=rp), intent(in) :: angle + real(kind=xp), intent(in) :: angle logical, intent(in) :: on_cpu, regen integer :: i, idx @@ -175,14 +175,12 @@ subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu, & ! NOTE: if on_cpu is true, memory is not copied to the GPU (you need ! to do it yourself) call FST_obj%apply_BC(bc%msk, bc%msk(0), & - u%dof%x, u%dof%y, u%dof%z, t, u%x, v%x, w%x, angle, on_cpu) + t, u%x, v%x, w%x, angle, on_cpu) end subroutine fst_bc_driver_apply ! Finalize user variables or external objects - subroutine fst_bc_driver_finalize(t, params) - real(kind=rp) :: t - type(json_file), intent(inout) :: params + subroutine fst_bc_driver_finalize() if (.not. ENABLED) return diff --git a/FST/src/fst_operator.f90 b/FST/src/fst_operator.f90 index 9e0cc88..a880739 100644 --- a/FST/src/fst_operator.f90 +++ b/FST/src/fst_operator.f90 @@ -54,17 +54,18 @@ subroutine fst_bc_compute(t, Uinf, u, v, w, mask, n_mask, & real(kind=rp), intent(in) :: u_baseflow(:), v_baseflow(:), w_baseflow(:) integer, intent(in) :: n_mask, n_total_modes integer, intent(in) :: mask(0:n_mask), shell(:) - real(kind=rp), intent(in), dimension(:) :: wavenumbers_x, shell_amplitudes, & + real(kind=xp), intent(in), dimension(:) :: wavenumbers_x, shell_amplitudes, & fringe_space - real(kind=rp), intent(in), dimension(:,:) :: phi_0, random_vectors - real(kind=rp), intent(in) :: t, Uinf, fringe_time, angleXY + real(kind=xp), intent(in), dimension(:,:) :: phi_0, random_vectors + real(kind=rp), intent(in) :: t + real(kind=xp), intent(in) :: Uinf, fringe_time, angleXY logical, intent(in) :: on_host type(c_ptr) :: fs_d, ubf_d, vbf_d, wbf_d, phi_0_d, randvec_d, shell_d, & shell_amp_d, k_x_d, u_d, v_d, w_d, mask_d integer :: i - real(kind=rp) :: sina, cosa + real(kind=xp) :: sina, cosa cosa = cos(angleXY) sina = sin(angleXY) From 962e78c60f7de93f972ece6eecf09f1ff52b6283 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 1 Sep 2025 16:40:19 +0200 Subject: [PATCH 09/41] HIP --- FST/src/bcknd/device/hip/opr_fst.hip | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/FST/src/bcknd/device/hip/opr_fst.hip b/FST/src/bcknd/device/hip/opr_fst.hip index 07bdbb7..fe125a8 100644 --- a/FST/src/bcknd/device/hip/opr_fst.hip +++ b/FST/src/bcknd/device/hip/opr_fst.hip @@ -43,7 +43,7 @@ */ template< typename T, typename U> __global__ void fst_kernel( - const U t, + const T t, const U Uinf, T * __restrict__ u, T * __restrict__ v, @@ -104,26 +104,26 @@ __global__ void fst_kernel( extern "C" { -void hip_fst(real *t, real *Uinf, +void hip_fst(real *t, real_xp *Uinf, void *u_d, void *v_d, void *w_d, int *mask_d, int *n_mask, void *ubf_d, void *vbf_d, void *wbf_d, void *k_x_d, int *n_total_modes, void *phi_0_d, int *shell_d, - void *shell_amp_d, void *randvec_d, real *cosa, real *sina, - real *fringe_time, void *fs_d) { + void *shell_amp_d, void *randvec_d, real_xp *cosa, real_xp *sina, + real_xp *fringe_time, void *fs_d) { const dim3 nthrds(1024, 1, 1); const dim3 nblcks(*n_mask, 1, 1); - hipLaunchKernelGGL(HIP_KERNEL_NAME(fst_kernel), + hipLaunchKernelGGL(HIP_KERNEL_NAME(fst_kernel), nblcks, nthrds, 0, (hipStream_t) glb_cmd_queue, *t, *Uinf, (real *) u_d, (real *) v_d, (real *) w_d, (int *) mask_d, *n_mask, (real *) ubf_d, (real *) vbf_d, (real *) wbf_d, - (real *) k_x_d, *n_total_modes, - (real *) phi_0_d, (int *) shell_d, (real *) shell_amp_d, - (real *) randvec_d, - *cosa, *sina, *fringe_time, (real *) fs_d + (real_xp *) k_x_d, *n_total_modes, + (real_xp *) phi_0_d, (int *) shell_d, (real_xp *) shell_amp_d, + (real_xp *) randvec_d, + *cosa, *sina, *fringe_time, (real_xp *) fs_d ); HIP_CHECK(hipGetLastError()); From 554828b497f5baccb9d121968015b5b524c0d078 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 15:05:52 +0100 Subject: [PATCH 10/41] some updates --- .gitignore | 2 - FST/example/run.case | 8 +- FST/example/user.f90 | 133 ++++++------ FST/src/FST-core/05_turbu.f90 | 9 +- FST/src/FST-core/06_FST.f90 | 295 +++++++++++++++++---------- FST/src/drivers/01_fst_bc_driver.f90 | 5 +- 6 files changed, 266 insertions(+), 186 deletions(-) diff --git a/.gitignore b/.gitignore index 288d059..524abe7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,6 @@ *.case *.o *.smod -example -example/* *.f0* *.nek5000 bb.txt diff --git a/FST/example/run.case b/FST/example/run.case index 8b95818..1a75d28 100644 --- a/FST/example/run.case +++ b/FST/example/run.case @@ -3,7 +3,7 @@ "case": { "mesh_file": "box.nmsh", - "output_directory": "results_gpu_1", + "output_directory": "results", "output_at_end": true, "output_checkpoints": true, "checkpoint_control": "simulationtime", @@ -12,7 +12,7 @@ "enabled": false }, "time": { - "end_time": 0.3, + "end_time": 0.1, "variable_timestep": false, "timestep": 1e-3, "max_timestep": 0.25e-2 @@ -28,7 +28,9 @@ "t_start": 0.00, "t_ramp": 0.001, "alpha": 0.15, // 15% distance to the y boundaries - "periodic_z": true + "periodic_z": true, + "ystart": -0.1, + "yend": 0.1 }, "fluid": { diff --git a/FST/example/user.f90 b/FST/example/user.f90 index 78e2480..f07d6cd 100644 --- a/FST/example/user.f90 +++ b/FST/example/user.f90 @@ -6,107 +6,110 @@ module user character(len=LOG_SIZE) :: log_buf contains - ! Register user defined functions (see user_intf.f90) +! Register user defined functions (see user_intf.f90) subroutine user_setup(u) type(user_t), intent(inout) :: u - u%user_init_modules => initialize ! Initialize parameters - u%user_finalize_modules => finalize ! Finalize - u%user_dirichlet_update => user_bc ! Update boundary conditions + u%initialize => initialize ! Initialize parameters + u%finalize => finalize ! Finalize + u%dirichlet_conditions => user_bc ! Update boundary conditions end subroutine user_setup - subroutine initialize(t, u, v, w, p, coef, params) - real(kind=rp) :: t - type(field_t), intent(inout) :: u - type(field_t), intent(inout) :: v - type(field_t), intent(inout) :: w - type(field_t), intent(inout) :: p - type(coef_t), intent(inout) :: coef - type(json_file), intent(inout) :: params + subroutine initialize(time) + type(time_state_t), intent(in) :: time - call fst_bc_driver_initialize(t,u,v,w,p,coef,params) + type(field_t) , pointer :: u + type(field_t) , pointer :: v + type(field_t) , pointer :: w + type(field_t) , pointer :: p + type(coef_t) , pointer :: coef - end subroutine initialize + u => neko_registry%get_field("u") + v => neko_registry%get_field("v") + w => neko_registry%get_field("w") + p => neko_registry%get_field("p") + + coef => neko_user_access%case%fluid%c_Xh + + call fst_bc_driver_initialize(time%t,u,v,w,p,coef,neko_user_access%case%params) - !> Set boundary conditions - subroutine user_bc(field_bc_list, bc, coef, t, tstep) - type(field_list_t), intent(inout) :: field_bc_list + end subroutine initialize + +!> Set boundary conditions + subroutine user_bc(fields, bc, time) + type(field_list_t), intent(inout) :: fields type(field_dirichlet_t), intent(in) :: bc - type(coef_t), intent(inout) :: coef - real(kind=rp), intent(in) :: t - integer, intent(in) :: tstep - + type(time_state_t), intent(in) :: time + type(field_t), pointer :: ui,vi,wi,pi + type(coef_t) , pointer :: coef + + ui => null() + vi => null() + wi => null() + pi => null() + coef => null() ! ! Velocity BC ! - if (trim(field_bc_list%items(1)%ptr%name) .eq. "u") then + if (trim(fields%items(1)%ptr%name) .eq. "u") then - associate(u => field_bc_list%items(1)%ptr, & - v => field_bc_list%items(2)%ptr, & - w => field_bc_list%items(3)%ptr) + associate(u => fields%items(1)%ptr, & + v => fields%items(2)%ptr, & + w => fields%items(3)%ptr) ! ! At the first time step, apply velocity BC by copying ! what has been applied in the initial condition ! - if (tstep .eq. 1) then - + if (time%tstep .eq. 1) then + ! Get solution fields (u,v,w) which contain the initial condition ! if we are at the first timestep - ui => neko_field_registry%get_field("u") - vi => neko_field_registry%get_field("v") - wi => neko_field_registry%get_field("w") + ui => neko_registry%get_field("u") + vi => neko_registry%get_field("v") + wi => neko_registry%get_field("w") ! Pressure can be handled directly on GPU if (neko_bcknd_device .eq. 1) then - call device_masked_copy(u%x_d, ui%x_d, bc%msk_d, u%dof%size(), bc%msk(0)) - call device_masked_copy(v%x_d, vi%x_d, bc%msk_d, v%dof%size(), bc%msk(0)) - call device_masked_copy(w%x_d, wi%x_d, bc%msk_d, w%dof%size(), bc%msk(0)) + call device_masked_copy_0(u%x_d, ui%x_d, bc%msk_d, u%dof%size(), bc%msk(0)) + call device_masked_copy_0(v%x_d, vi%x_d, bc%msk_d, v%dof%size(), bc%msk(0)) + call device_masked_copy_0(w%x_d, wi%x_d, bc%msk_d, w%dof%size(), bc%msk(0)) else - call masked_copy(u%x, ui%x, bc%msk, u%dof%size(), bc%msk(0)) - call masked_copy(v%x, vi%x, bc%msk, v%dof%size(), bc%msk(0)) - call masked_copy(w%x, wi%x, bc%msk, w%dof%size(), bc%msk(0)) + call masked_copy_0(u%x, ui%x, bc%msk, u%dof%size(), bc%msk(0)) + call masked_copy_0(v%x, vi%x, bc%msk, v%dof%size(), bc%msk(0)) + call masked_copy_0(w%x, wi%x, bc%msk, w%dof%size(), bc%msk(0)) end if - ! We need to do this on the CPU since the FST is applied - ! on the CPU on top of the baseflow given by u%x, v%x, w%x. -!!$ call masked_copy(u%x, ui%x, bc%msk, u%dof%size(), bc%msk(0)) -!!$ call masked_copy(v%x, vi%x, bc%msk, v%dof%size(), bc%msk(0)) -!!$ call masked_copy(w%x, wi%x, bc%msk, w%dof%size(), bc%msk(0)) end if + ! ! Apply FST ! - call fst_bc_driver_apply(u,v,w,bc,coef,t,tstep,angle=0.0_rp, memcpy=.false.) - - ! Synchronize to GPU -!!$ if (neko_bcknd_device .eq. 1) then -!!$ call device_memcpy(u%x, u%x_d, u%dof%size(), & -!!$ host_to_device, sync = .false.) -!!$ call device_memcpy(v%x, v%x_d, v%dof%size(), & -!!$ host_to_device, sync = .false.) -!!$ call device_memcpy(w%x, w%x_d, w%dof%size(), & -!!$ host_to_device, sync = .false.) -!!$ -!!$ end if + coef => neko_user_access%case%fluid%c_Xh + call fst_bc_driver_apply(u, v, w, bc, coef, time%t, time%tstep, & + 0.0_xp, & ! Angle in the x-y direction + NEKO_BCKND_DEVICE .ne. 1, & ! Wether to do FST on CPU + regen = .false., & ! Wether to regen FST files + Uinf = 2.0_xp) ! Uinf (only if regen = .true.) + end associate ! ! Pressure BC ! - else if (trim(field_bc_list%items(1)%ptr%name) .eq. "p") then + else if (trim(fields%items(1)%ptr%name) .eq. "p") then + + associate(p => fields%items(1)%ptr) + + if (time%tstep .eq. 1) then + pi => neko_registry%get_field("p") - associate(p => field_bc_list%items(1)%ptr) - - if (tstep .eq. 1) then - pi => neko_field_registry%get_field("p") - ! Pressure can be handled directly on GPU if (neko_bcknd_device .eq. 1) then - call device_masked_copy(p%x_d, pi%x_d, bc%msk_d, p%dof%size(), bc%msk(0)) + call device_masked_copy_0(p%x_d, pi%x_d, bc%msk_d, p%dof%size(), bc%msk(0)) else - call masked_copy(p%x, pi%x, bc%msk, p%dof%size(), bc%msk(0)) + call masked_copy_0(p%x, pi%x, bc%msk, p%dof%size(), bc%msk(0)) end if end if @@ -116,12 +119,12 @@ subroutine user_bc(field_bc_list, bc, coef, t, tstep) end subroutine user_bc + ! Free relevant objects - subroutine finalize(t, params) - real(kind=rp) :: t - type(json_file), intent(inout) :: params + subroutine finalize(time) + type(time_state_t), intent(in) :: time - call fst_bc_driver_finalize(t, params) + call fst_bc_driver_finalize() end subroutine finalize diff --git a/FST/src/FST-core/05_turbu.f90 b/FST/src/FST-core/05_turbu.f90 index 992ca9a..4902c42 100644 --- a/FST/src/FST-core/05_turbu.f90 +++ b/FST/src/FST-core/05_turbu.f90 @@ -29,6 +29,12 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) call print_param("kstart", kstart) call print_param("kend", kend) + + ! + ! Search for the domain dimensions. + ! WARNING: This should be restricted to the boundary only! Not the + ! whole domain! + ! dlx = glmax(coef%dof%x, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) - & glmin(coef%dof%x, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) @@ -39,7 +45,8 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) glmin(coef%dof%z, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) if ( pe_rank.eq.0 ) then - + + ! Hardcoded seed for random # generation.This way the FST generated is always the same. seed = -143 if (write_files) open(unit=137,form='formatted',file='bb.txt') diff --git a/FST/src/FST-core/06_FST.f90 b/FST/src/FST-core/06_FST.f90 index d0577e2..d697fb5 100644 --- a/FST/src/FST-core/06_FST.f90 +++ b/FST/src/FST-core/06_FST.f90 @@ -8,14 +8,14 @@ module FST !use global_params use fst_operator, only: fst_bc_compute - use turbu, only: make_turbu + use turbu, only: make_turbu, glb_uinf use utils, only: neko_error use field, only: field_t use coefs, only: coef_t use logger, only: neko_log, LOG_SIZE use point_zone, only: point_zone_t use math, only: masked_gather_copy - use device_math, only: device_masked_gather_copy + use device_math, only: device_masked_gather_copy_0 use num_types, only: rp, xp use comm, only: pe_rank, MPI_EXTRA_PRECISION, NEKO_COMM use neko_config, only: NEKO_BCKND_DEVICE @@ -97,7 +97,7 @@ module FST ! ======== Init/Free procedures procedure, pass(this) :: init_common => FST_init_common procedure, pass(this) :: init_bc => FST_init_bc - procedure, pass(this) :: init_from_files => FST_init_from_files + procedure, pass(this) :: read_from_files => FST_read_from_files procedure, pass(this) :: init_forcing => FST_init_forcing procedure, pass(this) :: free => FST_free_params ! ========================================================================= @@ -158,10 +158,78 @@ subroutine FST_init_common(this, & this%t_end = t_end this%t_start = t_start + call this%print() ! show parameters + + end subroutine FST_init_common - end subroutine FST_init_common + !> Initialize the FST to use with forcing. + subroutine FST_init_forcing(this, & + xstart, xend, x_delta_rise, x_delta_fall, & + ystart, yend, y_delta_rise, y_delta_fall, & + fringe_max, & + t_start, t_end, & + periodic_x, periodic_y, periodic_z) + + class(FST_t), intent(inout) :: this + real(kind=rp), intent(in) :: xstart + real(kind=rp), intent(in) :: xend + real(kind=rp), intent(in) :: ystart + real(kind=rp), intent(in) :: yend + real(kind=rp), intent(in) :: x_delta_rise + real(kind=rp), intent(in) :: x_delta_fall + real(kind=rp), intent(in) :: y_delta_rise + real(kind=rp), intent(in) :: y_delta_fall + real(kind=xp), intent(in) :: fringe_max + real(kind=xp), intent(in) :: t_start + real(kind=xp), intent(in) :: t_end + logical, intent(in) :: periodic_x, periodic_y, periodic_z + + call neko_log%section('Initializing FST (Forcing)') + + call this%init_common(xstart, xend,xstart,xend,x_delta_rise, x_delta_fall, ystart, & + yend, ystart, yend, y_delta_rise, y_delta_fall, fringe_max, t_start, t_end, & + periodic_x, periodic_y, periodic_z) + + call neko_log%end_section('') + + this%is_forcing = .true. + this%is_bc = .false. + + end subroutine FST_init_forcing + + !> Initialize the FST to use as a boundary condition + subroutine FST_init_bc(this, & + xmin, xmax, xstart, xend, x_delta_rise, x_delta_fall, & + ymin, ymax, ystart, yend, y_delta_rise, y_delta_fall, & + t_start, t_end, & + periodic_x, periodic_y, periodic_z) + class(FST_t), intent(inout) :: this + real(kind=rp), intent(in) :: xstart, xend, xmin, xmax + real(kind=rp), intent(in) :: ystart, yend, ymin, ymax + real(kind=rp), intent(in) :: x_delta_rise + real(kind=rp), intent(in) :: x_delta_fall + real(kind=rp), intent(in) :: y_delta_rise + real(kind=rp), intent(in) :: y_delta_fall + real(kind=xp), intent(in) :: t_start + real(kind=xp), intent(in) :: t_end + logical, intent(in) :: periodic_x, periodic_y, periodic_z + + call neko_log%section('Initializing FST (BC)') + + call this%init_common(xmin, xmax, xstart, xend, x_delta_rise, & + x_delta_fall, ymin, ymax, ystart, yend, y_delta_rise, & + y_delta_fall, 1.0_xp, t_start, t_end, & + periodic_x, periodic_y, periodic_z) + + call neko_log%end_section('') + + this%is_forcing = .false. + this%is_bc = .true. + + end subroutine FST_init_bc + !> Initialize all the stuff from files generated by the FST code: !! - fst_spectrum.csv !! - sphere.dat @@ -169,9 +237,8 @@ end subroutine FST_init_common !! !! NOTE: The structure of fst_spectrum.csv should be: !! shellno, kx, ky, kz, amp, u_hat_pn(1), u_hat_pn(2), u_hat_pn(3) - subroutine FST_init_from_files(this, Uinf) + subroutine FST_read_from_files(this) class(FST_t), intent(inout) :: this - real(kind=xp), intent(in) :: Uinf integer :: unit, ios, num_columns, num_lines, n_modes_total, i, np_eff, & ierr, prev_shell, idx_shell_amp @@ -179,27 +246,30 @@ subroutine FST_init_from_files(this, Uinf) character(len=1024) :: line character(len=20) :: keyword real(kind=xp) :: tmp - delimiter = ',' - this%Uinf = Uinf + delimiter = ',' if (pe_rank .eq. 0) then - ! 1. Read sphere.dat to get number of spheres + ! + ! Read sphere.dat to get number of spheres + ! + call neko_log%message("Reading sphere.dat") open(file="sphere.dat", unit=unit, status="old", action="read", & iostat=ios) if (ios /= 0) then call neko_error("Error opening sphere.dat") end if - write (*,*) "Reading sphere.dat" read(unit,*) line read(unit,*) keyword, this%nshells print *, this%nshells close(unit) - ! 1. Read FST spectrum + ! + ! Read FST spectrum, count # of lines to allocate all the arrays + ! open(file="fst_spectrum.csv", unit=unit, status="old", action="read", & iostat=ios) write (*,*) "Reading fst_spectrum" @@ -231,12 +301,24 @@ subroutine FST_init_from_files(this, Uinf) end do close(unit) - if (num_columns .ne. 8) call neko_error("fst_spectrum.csv should have 8 columns") + ! NOTE: this requirement on the number of columns is a bit hardcoded.. + ! AND different from the original implementation. Hence the + ! extra verbose error message. + if (num_columns .ne. 8) then + if (pe_rank .eq. 0) write (*,*) " ***ERROR READING fst_spectrum.csv***" + if (pe_rank .eq. 0) write (*,*) "fst_spectrum should have 8 cols." + if (pe_rank .eq. 0) write (*,*) "shell,kx,ky,kz,amp,u_hat_pn1,u_hat_pn2,u_hat_pn3" + call neko_error("fst_spectrum.csv should have 8 columns") + end if + + ! NOTE: The total number of modes in the file can sometimes be + ! different from the theoretical value 2*N_shells*N_points_per_shell. + ! This is because some modes are removed in the process. this%n_modes_total = num_lines - 1 ! Remove the header np_eff = this%n_modes_total / this%nshells print *, this%n_modes_total, np_eff - end if + end if ! pe_rank .eq. 0 call MPI_Bcast(this%n_modes_total, 1, MPI_INTEGER, 0, NEKO_COMM, ierr) call MPI_Bcast(this%nshells, 1, MPI_INTEGER, 0, NEKO_COMM, ierr) @@ -247,6 +329,7 @@ subroutine FST_init_from_files(this, Uinf) ! ! Allocate all the relevant arrays: ! shell, kx, ky, kz, amplitudes, u_hat_pn, v_hat_pn, w_hat_pn + ! allocate(this%shell(this%n_modes_total)) allocate(this%k_x(this%n_modes_total)) allocate(this%k_y(this%n_modes_total)) @@ -256,7 +339,10 @@ subroutine FST_init_from_files(this, Uinf) allocate(this%phase_shifts(this%n_modes_total)) if (pe_rank .eq. 0) then - ! Now read through the file again and fill the arrays + + ! + ! Now read fst_spectrum again and populate all the arrays + ! open(file="fst_spectrum.csv", unit=unit, status="old", action="read", & iostat=ios) if (ios /= 0) then @@ -279,15 +365,15 @@ subroutine FST_init_from_files(this, Uinf) close(unit) ! - ! 2. Now read the phase shifts + ! Read the phase shifts in bb.txt ! open(file="bb.txt", unit=unit, status="old", action="read", iostat=ios) do i = 1, this%n_modes_total read(unit,*) this%phase_shifts(i), tmp - print *, this%phase_shifts(i) + !print *, this%phase_shifts(i) end do - end if + end if ! pe_rank .eq. 0 call MPI_Bcast(this%k_x, this%n_modes_total, MPI_EXTRA_PRECISION, 0, & NEKO_COMM, ierr) @@ -305,86 +391,17 @@ subroutine FST_init_from_files(this, Uinf) 0, NEKO_COMM, ierr) call MPI_Barrier(NEKO_COMM, ierr) - if (pe_rank .eq. 1) then - do i = 1, this%n_modes_total - !print *, "<<1>>", this%shell(i), this%k_x(i), this%k_y(i), this%k_z(i), & - !this%shell_amp((i-1)/78 +1), & - ! this%random_vectors(i,1), this%random_vectors(i,2), this%random_vectors(i,3) - end do - end if + !if (pe_rank .eq. 1) then + ! do i = 1, this%n_modes_total + ! !print *, "<<1>>", this%shell(i), this%k_x(i), this%k_y(i), this%k_z(i), & + ! !this%shell_amp((i-1)/78 +1), & + ! ! this%random_vectors(i,1), this%random_vectors(i,2), this%random_vectors(i,3) + ! end do + !end if - end subroutine FST_init_from_files + end subroutine FST_read_from_files - !> Initialize the FST to use with forcing. - subroutine FST_init_forcing(this, & - xstart, xend, x_delta_rise, x_delta_fall, & - ystart, yend, y_delta_rise, y_delta_fall, & - fringe_max, & - t_start, t_end, & - periodic_x, periodic_y, periodic_z) - - class(FST_t), intent(inout) :: this - real(kind=rp), intent(in) :: xstart - real(kind=rp), intent(in) :: xend - real(kind=rp), intent(in) :: ystart - real(kind=rp), intent(in) :: yend - real(kind=rp), intent(in) :: x_delta_rise - real(kind=rp), intent(in) :: x_delta_fall - real(kind=rp), intent(in) :: y_delta_rise - real(kind=rp), intent(in) :: y_delta_fall - real(kind=xp), intent(in) :: fringe_max - real(kind=xp), intent(in) :: t_start - real(kind=xp), intent(in) :: t_end - logical, intent(in) :: periodic_x, periodic_y, periodic_z - - call neko_log%section('Initializing FST') - - call this%init_common(xstart, xend,xstart,xend,x_delta_rise, x_delta_fall, ystart, & - yend, ystart, yend, y_delta_rise, y_delta_fall, fringe_max, t_start, t_end, & - periodic_x, periodic_y, periodic_z) - - call this%print() ! show parameters - call neko_log%end_section('Done --> Intializing FST') - - this%is_forcing = .true. - this%is_bc = .false. - - end subroutine FST_init_forcing - - !> Initialize the FST to use as a boundary condition - subroutine FST_init_bc(this, & - xmin, xmax, xstart, xend, x_delta_rise, x_delta_fall, & - ymin, ymax, ystart, yend, y_delta_rise, y_delta_fall, & - t_start, t_end, & - periodic_x, periodic_y, periodic_z) - - class(FST_t), intent(inout) :: this - real(kind=rp), intent(in) :: xstart, xend, xmin, xmax - real(kind=rp), intent(in) :: ystart, yend, ymin, ymax - real(kind=rp), intent(in) :: x_delta_rise - real(kind=rp), intent(in) :: x_delta_fall - real(kind=rp), intent(in) :: y_delta_rise - real(kind=rp), intent(in) :: y_delta_fall - real(kind=xp), intent(in) :: t_start - real(kind=xp), intent(in) :: t_end - logical, intent(in) :: periodic_x, periodic_y, periodic_z - - call neko_log%section('Initializing FST') - - call this%init_common(xmin, xmax, xstart, xend, x_delta_rise, & - x_delta_fall, ymin, ymax, ystart, yend, y_delta_rise, & - y_delta_fall, 1.0_xp, t_start, t_end, & - periodic_x, periodic_y, periodic_z) - - call this%print() ! show parameters - call neko_log%end_section('Done --> Intializing FST') - - this%is_forcing = .false. - this%is_bc = .true. - - end subroutine FST_init_bc - !! Free parameters in global params subroutine FST_free_params(this) class(FST_t), intent(inout) :: this @@ -407,19 +424,40 @@ end subroutine FST_free_params subroutine FST_print_params(this) class(FST_t) :: this + character(len=LOG_SIZE) :: log_buf + if (pe_rank .ne. 0) return - write(*, *) "xstart", this%xstart - write(*, *) "xend", this%xend - write(*, *) "ystart", this%ystart - write(*, *) "yend", this%yend - write(*, *) "fringe_max", this%fringe_max - write(*, *) "x_delta_rise", this%x_delta_rise - write(*, *) "x_delta_fall", this%x_delta_fall - write(*, *) "y_delta_rise", this%y_delta_rise - write(*, *) "y_delta_fall", this%y_delta_fall - write(*, *) "t_start", this%t_start - write(*, *) "t_end", this%t_end + write(log_buf, '(A ,F15.7)') "xstart ", this%xstart + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "xend ", this%xend + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "xmin ", this%xmin + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "xmax ", this%xmax + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "ystart ", this%ystart + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "yend ", this%yend + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "ymin ", this%ymin + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "ymax ", this%ymax + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "fringe_max ", this%fringe_max + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "x_delta_rise", this%x_delta_rise + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "x_delta_fall", this%x_delta_fall + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "y_delta_rise", this%y_delta_rise + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "y_delta_fall", this%y_delta_fall + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "t_start ", this%t_start + call neko_log%message(log_buf) + write(log_buf, '(A ,F15.7)') "t_end ", this%t_end + call neko_log%message(log_buf) end subroutine FST_print_params @@ -449,9 +487,9 @@ subroutine FST_apply_baseflow(this, mask, n, u, v, w) mask_d = device_get_ptr(mask) - call device_masked_gather_copy(this%u_baseflow_d, u%x_d, mask_d, u%dof%size(), n) - call device_masked_gather_copy(this%v_baseflow_d, v%x_d, mask_d, u%dof%size(), n) - call device_masked_gather_copy(this%w_baseflow_d, w%x_d, mask_d, u%dof%size(), n) + call device_masked_gather_copy_0(this%u_baseflow_d, u%x_d, mask_d, u%dof%size(), n) + call device_masked_gather_copy_0(this%v_baseflow_d, v%x_d, mask_d, u%dof%size(), n) + call device_masked_gather_copy_0(this%w_baseflow_d, w%x_d, mask_d, u%dof%size(), n) else call masked_gather_copy(this%u_baseflow, u%x, mask, u%dof%size(), n) call masked_gather_copy(this%v_baseflow, v%x, mask, u%dof%size(), n) @@ -467,11 +505,16 @@ subroutine FST_generate_common(this, coef) integer :: ierr + ! + ! First, generate everything as usual + ! call neko_log%section ('Generating FST') call make_turbu(coef, this%periodic_x, this%periodic_y, this%periodic_z) - call neko_log%end_section('Done --> Generating FST') + ! + ! Next, use the arrays defined + end subroutine FST_generate_common !> Generate FST for forcing @@ -514,24 +557,50 @@ subroutine FST_generate_forcing(this, coef, zone, u, v, w) end subroutine FST_generate_forcing !> Do the generation for BC. - subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen) + subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen, Uinf) class(FST_t), intent(inout) :: this type(coef_t), intent(in) :: coef integer, intent(in) :: bc_mask(0:n) integer, intent(in) :: n type(field_t), intent(in) :: u, v, w logical, intent(in) :: regen + real(kind=xp), optional :: Uinf character(len=LOG_SIZE) :: log_buf real(kind=rp) :: x, y, z integer :: ierr, i, idx, m, j + + ! + ! Generate everything from scratch. This will create the files + ! bb.txt, sphere.dat and fst_spectrum.csv + ! + if (regen) then + + call this%generate_common(coef) + this%Uinf = glb_uinf + else + + if (.not. present(Uinf)) then + call neko_error("Provide a value for Uinf if you init from file!") + else + this%Uinf = Uinf + end if + + end if + + ! + ! Read data from files (will not use anything from global_params!) ! - ! Generate everything from scratch + call this%read_from_files() + ! - if (regen) call this%generate_common(coef) + ! Print some diagnostics just in case + ! + write (log_buf, '(A,F15.7)') "(FST) Uinf set to ", this%Uinf + call neko_log%message(log_buf) + - call this%init_from_files(2.0_xp) ! ! Apply baseflow in the bc zone diff --git a/FST/src/drivers/01_fst_bc_driver.f90 b/FST/src/drivers/01_fst_bc_driver.f90 index 044471c..3140ea9 100644 --- a/FST/src/drivers/01_fst_bc_driver.f90 +++ b/FST/src/drivers/01_fst_bc_driver.f90 @@ -147,7 +147,7 @@ subroutine fst_bc_driver_initialize(t, u, v, w, p, coef, params) end subroutine fst_bc_driver_initialize subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu, & - regen) + regen, Uinf) type(field_t), intent(inout) :: u type(field_t), intent(inout) :: v type(field_t), intent(inout) :: w @@ -157,6 +157,7 @@ subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu, & integer, intent(in) :: tstep real(kind=xp), intent(in) :: angle logical, intent(in) :: on_cpu, regen + real(kind=xp), optional :: Uinf integer :: i, idx @@ -167,7 +168,7 @@ subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu, & ! on the boundry mask! ! if (tstep .eq. 1) then - call FST_obj%generate_bc(coef, bc%msk, bc%msk(0), u, v, w, regen) + call FST_obj%generate_bc(coef, bc%msk, bc%msk(0), u, v, w, regen, Uinf) end if ! Then, apply the free stream turbulence that will add on From 10850cf009101afaae6bcebbf5dbd6bcf9f35000 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 15:10:45 +0100 Subject: [PATCH 11/41] fix device_config import --- FST/src/bcknd/device/cuda/opr_fst.cu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FST/src/bcknd/device/cuda/opr_fst.cu b/FST/src/bcknd/device/cuda/opr_fst.cu index 412afc9..6e81e76 100644 --- a/FST/src/bcknd/device/cuda/opr_fst.cu +++ b/FST/src/bcknd/device/cuda/opr_fst.cu @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include From 6fac1b9d87b5a8fa2615be81150a53e74ac0462b Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 15:58:26 +0100 Subject: [PATCH 12/41] user --- FST/example/user.f90 | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/FST/example/user.f90 b/FST/example/user.f90 index 096c914..fdd04e5 100644 --- a/FST/example/user.f90 +++ b/FST/example/user.f90 @@ -28,30 +28,16 @@ subroutine initialize(time) p => neko_registry%get_field("p") coef => neko_user_access%case%fluid%c_Xh -<<<<<<< HEAD call fst_bc_driver_initialize(time%t,u,v,w,p,coef,neko_user_access%case%params) end subroutine initialize !> Set boundary conditions -======= - - call fst_bc_driver_initialize(time%t,u,v,w,p,coef,neko_user_access%case%params) - - end subroutine initialize - - !> Set boundary conditions ->>>>>>> ae0a0d0374d29a063cb7f3121bda071f84d5dfe0 subroutine user_bc(fields, bc, time) type(field_list_t), intent(inout) :: fields type(field_dirichlet_t), intent(in) :: bc type(time_state_t), intent(in) :: time -<<<<<<< HEAD - -======= - ->>>>>>> ae0a0d0374d29a063cb7f3121bda071f84d5dfe0 type(field_t), pointer :: ui,vi,wi,pi type(coef_t) , pointer :: coef From 2c697dd97de62bb9d80fc96e6eef147c6a9b49d9 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 17:32:25 +0100 Subject: [PATCH 13/41] printing --- FST/src/FST-core/01_global_params.f90 | 4 ++-- FST/src/FST-core/04_spec.f90 | 22 +++++++++++----------- FST/src/FST-core/05_turbu.f90 | 14 +++++++------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/FST/src/FST-core/01_global_params.f90 b/FST/src/FST-core/01_global_params.f90 index 3751457..6a6b384 100644 --- a/FST/src/FST-core/01_global_params.f90 +++ b/FST/src/FST-core/01_global_params.f90 @@ -44,7 +44,7 @@ subroutine print_param(name, value) real(kind=rp), intent(in) :: value character(len=LOG_SIZE) :: log_buf - write(log_buf, *) name, ": ", value + write(log_buf, *) "[FST] ", name, ": ", value call neko_log%message(log_buf) end subroutine print_param @@ -57,7 +57,7 @@ subroutine print_int(name, value) integer, intent(in) :: value character(len=LOG_SIZE) :: log_buf - write(log_buf, *) name, ": ", value + write(log_buf, *) "[FST] ", name, ": ", value call neko_log%message(log_buf) end subroutine print_int diff --git a/FST/src/FST-core/04_spec.f90 b/FST/src/FST-core/04_spec.f90 index 99ef4a8..4cd63bf 100644 --- a/FST/src/FST-core/04_spec.f90 +++ b/FST/src/FST-core/04_spec.f90 @@ -87,7 +87,7 @@ subroutine spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z) tke_tot1 = tke_tot1 + ek(kstart + i*dkint, fst_il, 1._rp) end do tke_tot1 = tke_tot1*dkint - call print_param('FST - integrated energy in spectrum ',tke_tot1) + call print_param('integrated energy in spectrum ',tke_tot1) ! ------------------------------------------------------------------------ ! ----- integrate the energy spectrum with nshells points ---------------- @@ -97,7 +97,7 @@ subroutine spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z) tke_tot = tke_tot + ek(kstart + (i-1)*dkint,fst_il,1._rp) end do tke_tot = tke_tot*dkint - write (log_buf, *) 'FST - discretized on ', nshells, ' shells :' , tke_tot + write (log_buf, *) '[FST] discretized on ', nshells, ' shells :' , tke_tot call neko_log%message(log_buf) ! ------------------------------------------------------------------------- @@ -223,9 +223,9 @@ subroutine spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z) end do ! j=1,2*Np end do ! i=1,nshells ! write(6,*) 'FST - (0,0,0) wavenumber removed' - call neko_log%message('FST - (0,0,0) wavenumber removed') + call neko_log%message('[FST] (0,0,0) wavenumber removed') - write(log_buf, *) 'Saved ',z1,' of ',z1+z2, ' fst modes.' + write(log_buf, *) '[FST] Saved ',z1,' of ',z1+z2, ' fst modes.' call neko_log%message(log_buf) ! close(12) @@ -293,16 +293,16 @@ subroutine spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z) ! close(11) - write (log_buf, *) 'FST - ',k_length,'wavenumbers generated' + write (log_buf, *) '[FST]', k_length, 'wavenumbers generated' call neko_log%message(log_buf) ! 2012 format(A7,1x,i5,1x,A21) - call print_param('FST - Largest wavelength in x', 2.0*pi/kxmin) - call print_param('FST - Smallest wavelength in x', 2.0*pi/kxmax) - call print_param('FST - Largest wavelength in y', 2.0*pi/kymin) - call print_param('FST - Smallest wavelength in y', 2.0*pi/kymax) - call print_param('FST - Largest wavelength in z', 2.0*pi/kzmin) - call print_param('FST - Smallest wavelength in z', 2.0*pi/kzmax) + call print_param('Largest wavelength in x', 2.0*pi/kxmin) + call print_param('Smallest wavelength in x', 2.0*pi/kxmax) + call print_param('Largest wavelength in y', 2.0*pi/kymin) + call print_param('Smallest wavelength in y', 2.0*pi/kymax) + call print_param('Largest wavelength in z', 2.0*pi/kzmin) + call print_param('Smallest wavelength in z', 2.0*pi/kzmax) ! write(6,2015) 'FST - Largest wavelength in x', 2.0*pi/kxmin! ,kxmin ! write(6,2016) 'FST - Smallest wavelength in x', 2.0*pi/kxmax! ,kxmax diff --git a/FST/src/FST-core/05_turbu.f90 b/FST/src/FST-core/05_turbu.f90 index 4902c42..49f333f 100644 --- a/FST/src/FST-core/05_turbu.f90 +++ b/FST/src/FST-core/05_turbu.f90 @@ -65,7 +65,7 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) if (write_files) close(137) ! write(6,*) 'FST - Random amplitude generated' - call neko_log%message("FST - Random amplitude generated") + call neko_log%message("[FST] Random amplitude generated") ! make sure that continuity is enforced by ensuring u_vec.k_vec=(0 0 0) do i=1,k_length @@ -92,7 +92,7 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) enddo enddo - call neko_log%message('FST - Amplitudes projection done') + call neko_log%message('[FST] Amplitudes projection done') ! Check energy in individual modes ue=0. @@ -122,16 +122,16 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) if (write_files) close(13) - write(log_buf,'(A18,10x,E12.5E2)') 'FST - Energy in u',ue + write(log_buf,'(A18,10x,E12.5E2)') '[FST] Energy in u',ue call neko_log%message(log_buf) - write(log_buf,'(A18,10x,E12.5E2)') 'FST - Energy in v',ve + write(log_buf,'(A18,10x,E12.5E2)') '[FST] Energy in v',ve call neko_log%message(log_buf) - write(log_buf,'(A18,10x,E12.5E2)') 'FST - Energy in w',we + write(log_buf,'(A18,10x,E12.5E2)') '[FST] Energy in w',we call neko_log%message(log_buf) - write(log_buf,'(A20,8x,E12.5E2)') 'FST - Estimated tke', & + write(log_buf,'(A20,8x,E12.5E2)') '[FST] Estimated tke', & (ue+ve+we)/2. call neko_log%message(log_buf) - write(log_buf,'(A24,9x,E12.5E2)') 'FST - Estimated Tu*U_inf', & + write(log_buf,'(A24,9x,E12.5E2)') '[FST] Estimated Tu*U_inf', & sqrt((ue+ve+we)/3.) call neko_log%message(log_buf) From f6b36c1f77b0d3e2d48bb783520701aee83f1494 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 17:32:43 +0100 Subject: [PATCH 14/41] printing --- FST/src/FST-core/06_FST.f90 | 87 +++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/FST/src/FST-core/06_FST.f90 b/FST/src/FST-core/06_FST.f90 index eb6527e..9fe446e 100644 --- a/FST/src/FST-core/06_FST.f90 +++ b/FST/src/FST-core/06_FST.f90 @@ -186,7 +186,7 @@ subroutine FST_init_forcing(this, & real(kind=xp), intent(in) :: t_end logical, intent(in) :: periodic_x, periodic_y, periodic_z - call neko_log%section('Initializing FST (Forcing)') + call neko_log%section(' [FST] Initializing forcing') call this%init_common(xstart, xend,xstart,xend,x_delta_rise, x_delta_fall, ystart, & yend, ystart, yend, y_delta_rise, y_delta_fall, fringe_max, t_start, t_end, & @@ -217,7 +217,7 @@ subroutine FST_init_bc(this, & real(kind=xp), intent(in) :: t_end logical, intent(in) :: periodic_x, periodic_y, periodic_z - call neko_log%section('Initializing FST (BC)') + call neko_log%section(' [FST] Initializing BC') call this%init_common(xmin, xmax, xstart, xend, x_delta_rise, & x_delta_fall, ymin, ymax, ystart, yend, y_delta_rise, & @@ -247,6 +247,9 @@ subroutine FST_read_from_files(this) character(len=1024) :: line character(len=20) :: keyword real(kind=xp) :: tmp + character(len=LOG_SIZE) :: log_buf + + call neko_log%section(' [FST] Reading files') delimiter = ',' @@ -255,27 +258,28 @@ subroutine FST_read_from_files(this) ! ! Read sphere.dat to get number of spheres ! - call neko_log%message("Reading sphere.dat") + call neko_log%message("[FST] Reading sphere.dat") open(file="sphere.dat", unit=unit, status="old", action="read", & iostat=ios) if (ios /= 0) then - call neko_error("Error opening sphere.dat") + call neko_error("[FST] Error opening sphere.dat") end if read(unit,*) line read(unit,*) keyword, this%nshells - print *, this%nshells - close(unit) + + write (log_buf, '(A ,I4.4)') "[FST] # of shells:", this%nshells + call neko_log%message(log_buf) ! ! Read FST spectrum, count # of lines to allocate all the arrays ! open(file="fst_spectrum.csv", unit=unit, status="old", action="read", & iostat=ios) - write (*,*) "Reading fst_spectrum" + call neko_log%message("[FST] Reading fst_spectrum") if (ios /= 0) then - call neko_error("Error opening fst_spectrum.csv") + call neko_error("[FST] Error opening fst_spectrum.csv") end if num_columns = 1 @@ -306,10 +310,10 @@ subroutine FST_read_from_files(this) ! AND different from the original implementation. Hence the ! extra verbose error message. if (num_columns .ne. 8) then - if (pe_rank .eq. 0) write (*,*) " ***ERROR READING fst_spectrum.csv***" - if (pe_rank .eq. 0) write (*,*) "fst_spectrum should have 8 cols." - if (pe_rank .eq. 0) write (*,*) "shell,kx,ky,kz,amp,u_hat_pn1,u_hat_pn2,u_hat_pn3" - call neko_error("fst_spectrum.csv should have 8 columns") + call neko_log%message("[FST] ***ERROR READING fst_spectrum.csv***") + call neko_log%message("[FST] fst_spectrum should have 8 cols.") + call neko_log%message("[FST] shell,kx,ky,kz,amp,u_hat_pn1,u_hat_pn2,u_hat_pn3") + call neko_error("[FST] fst_spectrum.csv should have 8 columns") end if ! NOTE: The total number of modes in the file can sometimes be @@ -317,7 +321,10 @@ subroutine FST_read_from_files(this) ! This is because some modes are removed in the process. this%n_modes_total = num_lines - 1 ! Remove the header np_eff = this%n_modes_total / this%nshells - print *, this%n_modes_total, np_eff + write (log_buf, '(A ,I5.5)') "[FST] Total # of modes:", this%n_modes_total + call neko_log%message(log_buf) + write (log_buf, '(A ,I5.5)') "[FST] Eff. # of points:", np_eff + call neko_log%message(log_buf) end if ! pe_rank .eq. 0 @@ -325,7 +332,6 @@ subroutine FST_read_from_files(this) call MPI_Bcast(this%nshells, 1, MPI_INTEGER, 0, NEKO_COMM, ierr) call MPI_Barrier(NEKO_COMM, ierr) - print *, pe_rank, this%n_modes_total, this%nshells ! ! Allocate all the relevant arrays: @@ -347,7 +353,7 @@ subroutine FST_read_from_files(this) open(file="fst_spectrum.csv", unit=unit, status="old", action="read", & iostat=ios) if (ios /= 0) then - call neko_error("Error opening fst_spectrum.csv") + call neko_error("[FST] Error opening fst_spectrum.csv") end if read(unit,*) line! read the header @@ -369,9 +375,12 @@ subroutine FST_read_from_files(this) ! Read the phase shifts in bb.txt ! open(file="bb.txt", unit=unit, status="old", action="read", iostat=ios) + if (ios /= 0) then + call neko_error("[FST] Error opening bb.txt") + end if + do i = 1, this%n_modes_total read(unit,*) this%phase_shifts(i), tmp - !print *, this%phase_shifts(i) end do end if ! pe_rank .eq. 0 @@ -392,13 +401,7 @@ subroutine FST_read_from_files(this) 0, NEKO_COMM, ierr) call MPI_Barrier(NEKO_COMM, ierr) - !if (pe_rank .eq. 1) then - ! do i = 1, this%n_modes_total - ! !print *, "<<1>>", this%shell(i), this%k_x(i), this%k_y(i), this%k_z(i), & - ! !this%shell_amp((i-1)/78 +1), & - ! ! this%random_vectors(i,1), this%random_vectors(i,2), this%random_vectors(i,3) - ! end do - !end if + call neko_log%end_section('') end subroutine FST_read_from_files @@ -429,35 +432,35 @@ subroutine FST_print_params(this) if (pe_rank .ne. 0) return - write(log_buf, '(A ,F15.7)') "xstart ", this%xstart + write(log_buf, '(A ,F15.7)') "[FST] xstart ", this%xstart call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "xend ", this%xend + write(log_buf, '(A ,F15.7)') "[FST] xend ", this%xend call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "xmin ", this%xmin + write(log_buf, '(A ,F15.7)') "[FST] xmin ", this%xmin call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "xmax ", this%xmax + write(log_buf, '(A ,F15.7)') "[FST] xmax ", this%xmax call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "ystart ", this%ystart + write(log_buf, '(A ,F15.7)') "[FST] ystart ", this%ystart call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "yend ", this%yend + write(log_buf, '(A ,F15.7)') "[FST] yend ", this%yend call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "ymin ", this%ymin + write(log_buf, '(A ,F15.7)') "[FST] ymin ", this%ymin call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "ymax ", this%ymax + write(log_buf, '(A ,F15.7)') "[FST] ymax ", this%ymax call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "fringe_max ", this%fringe_max + write(log_buf, '(A ,F15.7)') "[FST] fringe_max ", this%fringe_max call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "x_delta_rise", this%x_delta_rise + write(log_buf, '(A ,F15.7)') "[FST] x_delta_rise", this%x_delta_rise call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "x_delta_fall", this%x_delta_fall + write(log_buf, '(A ,F15.7)') "[FST] x_delta_fall", this%x_delta_fall call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "y_delta_rise", this%y_delta_rise + write(log_buf, '(A ,F15.7)') "[FST] y_delta_rise", this%y_delta_rise call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "y_delta_fall", this%y_delta_fall + write(log_buf, '(A ,F15.7)') "[FST] y_delta_fall", this%y_delta_fall call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "t_start ", this%t_start + write(log_buf, '(A ,F15.7)') "[FST] t_start ", this%t_start call neko_log%message(log_buf) - write(log_buf, '(A ,F15.7)') "t_end ", this%t_end + write(log_buf, '(A ,F15.7)') "[FST] t_end ", this%t_end call neko_log%message(log_buf) end subroutine FST_print_params @@ -546,9 +549,9 @@ subroutine FST_generate_common(this, coef) ! ! First, generate everything as usual ! - call neko_log%section ('Generating FST') + call neko_log%section (' [FST] Generating') call make_turbu(coef, this%periodic_x, this%periodic_y, this%periodic_z) - call neko_log%end_section('Done --> Generating FST') + call neko_log%end_section('') ! ! Next, use the arrays defined @@ -620,7 +623,7 @@ subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen, Uinf) else if (.not. present(Uinf)) then - call neko_error("Provide a value for Uinf if you init from file!") + call neko_error("[FST] Provide a value for Uinf if you init from file!") else this%Uinf = Uinf end if @@ -635,7 +638,7 @@ subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen, Uinf) ! ! Print some diagnostics just in case ! - write (log_buf, '(A,F15.7)') "(FST) Uinf set to ", this%Uinf + write (log_buf, '(A,F15.7)') "[FST] Uinf set to ", this%Uinf call neko_log%message(log_buf) From 3309f28b6f631c3e3b2333e78f042128058029c1 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 17:32:59 +0100 Subject: [PATCH 15/41] make regen and uinf json parameters --- FST/src/drivers/01_fst_bc_driver.f90 | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/FST/src/drivers/01_fst_bc_driver.f90 b/FST/src/drivers/01_fst_bc_driver.f90 index 068c6d8..61f4f2e 100644 --- a/FST/src/drivers/01_fst_bc_driver.f90 +++ b/FST/src/drivers/01_fst_bc_driver.f90 @@ -18,8 +18,16 @@ module fst_bc_driver character(len=LOG_SIZE) :: LOG_BUF ! ============================================================================ + ! Whether or not FST is enabled logical :: ENABLED + ! Whether or not to generate the FST wavenumbers etc from scratch or to + ! read from the files bb.txt, sphere.dat, fst_spectrum.csv + logical :: REGEN + + ! Free-stream velocity (this is only populated if REGEN is true + real(kind=xp) :: UINF + ! ! For outputting the forcing as a field file ! @@ -136,6 +144,10 @@ subroutine fst_bc_driver_initialize(t, u, v, w, p, coef, params) call json_get(params, "case.FST.t_ramp", t_ramp) call json_get_or_default(params, "case.FST.t_start", t_start, 0.0_xp) + ! Read options for generating FST from scratch or not + call json_get(params, "case.FST.regen_files", REGEN) + if (.not. REGEN) call json_get(params, "case.FST.Uinf", UINF) + ! Initialize the fst parameters call FST_OBJ%init_bc(zmin, zmax, zstart, zend, & delta_z, delta_z, & @@ -146,8 +158,7 @@ subroutine fst_bc_driver_initialize(t, u, v, w, p, coef, params) end subroutine fst_bc_driver_initialize - subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu, & - regen, Uinf) + subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu) type(field_t), intent(inout) :: u type(field_t), intent(inout) :: v type(field_t), intent(inout) :: w @@ -156,8 +167,7 @@ subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu, & real(kind=rp), intent(in) :: t integer, intent(in) :: tstep real(kind=xp), intent(in) :: angle - logical, intent(in) :: on_cpu, regen - real(kind=xp), optional :: Uinf + logical, intent(in) :: on_cpu integer :: i, idx @@ -168,7 +178,7 @@ subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu, & ! on the boundry mask! ! if (tstep .eq. 1) then - call FST_obj%generate_bc(coef, bc%msk, bc%msk(0), u, v, w, regen, Uinf) + call FST_obj%generate_bc(coef, bc%msk, bc%msk(0), u, v, w, REGEN, UINF) end if ! Then, apply the free stream turbulence that will add on From 710cd5aa97486720cc103c16ed1741ea7f38dbd4 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 17:33:54 +0100 Subject: [PATCH 16/41] update example --- FST/example/run.case | 8 +++++--- FST/example/user.f90 | 6 ++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/FST/example/run.case b/FST/example/run.case index 7d333a4..a45d8dd 100644 --- a/FST/example/run.case +++ b/FST/example/run.case @@ -13,7 +13,7 @@ "enabled": false }, "time": { - "end_time": 0.1, + "end_time": 0.3, "variable_timestep": false, "timestep": 1e-3, "max_timestep": 0.25e-2 @@ -26,12 +26,14 @@ "FST": { "enabled": true, // !!! FST IS DISABLED !! - "t_start": 0.3, + "t_start": 0.1, "t_ramp": 0.001, "alpha": 0.15, // 15% distance to the y boundaries "periodic_z": true, "ystart": -0.1, - "yend": 0.1 + "yend": 0.1, + "regen_files": false, + "Uinf": 2.0 }, "fluid": { diff --git a/FST/example/user.f90 b/FST/example/user.f90 index fdd04e5..1617614 100644 --- a/FST/example/user.f90 +++ b/FST/example/user.f90 @@ -85,10 +85,8 @@ subroutine user_bc(fields, bc, time) ! coef => neko_user_access%case%fluid%c_Xh call fst_bc_driver_apply(u, v, w, bc, coef, time%t, time%tstep, & - 0.0_xp, & ! Angle in the x-y direction - NEKO_BCKND_DEVICE .ne. 1, & ! Wether to do FST on CPU - regen = .false., & ! Wether to regen FST files - Uinf = 2.0_xp) ! Uinf (only if regen = .true.) + 0.0_xp, & ! Angle in the x-y direction + .false.) ! Wether to do FST on CPU end associate From 01a08289e4c5622c3a5ea5f08572bb2958c554fb Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 17:35:50 +0100 Subject: [PATCH 17/41] fix device_config import --- FST/src/bcknd/device/cuda/opr_fst.cu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FST/src/bcknd/device/cuda/opr_fst.cu b/FST/src/bcknd/device/cuda/opr_fst.cu index a37e5ff..8e6c923 100644 --- a/FST/src/bcknd/device/cuda/opr_fst.cu +++ b/FST/src/bcknd/device/cuda/opr_fst.cu @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include From 0fef397aaf0996ebe90b41725cd3e4321d098898 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 17:43:20 +0100 Subject: [PATCH 18/41] adjust to 1.0 --- FST/src/FST-core/01_global_params.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FST/src/FST-core/01_global_params.f90 b/FST/src/FST-core/01_global_params.f90 index 6a6b384..97b463b 100644 --- a/FST/src/FST-core/01_global_params.f90 +++ b/FST/src/FST-core/01_global_params.f90 @@ -4,7 +4,7 @@ module global_params implicit none - real(kind=rp) :: glb_uinf = 2.0_rp + real(kind=rp) :: glb_uinf = 1.0_rp real(kind=rp) :: fst_ti = 3.7d-2 ! turbulence intensity real(kind=rp) :: fst_il = 11.53d-3 ! integral length scale From 565cdc6bb2a0ebf042d98722888d53b5084fea5f Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 17:48:33 +0100 Subject: [PATCH 19/41] change output fst_spectrum --- FST/src/FST-core/05_turbu.f90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/FST/src/FST-core/05_turbu.f90 b/FST/src/FST-core/05_turbu.f90 index 296e104..c66bbae 100644 --- a/FST/src/FST-core/05_turbu.f90 +++ b/FST/src/FST-core/05_turbu.f90 @@ -86,8 +86,8 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) we=0. ! Also write the modes if (write_files) open(file='fst_spectrum.csv',unit=13) - if (write_files) write(13,'(9(A, ","),A)') 'ShellNo','kx','ky','kz', & - 'u_amp','v_amp','w_amp','u_hat_pn1','u_hat_pn2', 'u_hat_pn3' + if (write_files) write(13,'(7(A, ","),A)') 'ShellNo','kx','ky','kz', & + 'amp','u_hat_pn1','u_hat_pn2', 'u_hat_pn3' do i=1,k_length shellno = shell(i) amp = shell_amp(shellno) @@ -98,8 +98,8 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) vamp = u_hat_pn(i,2)*amp wamp = u_hat_pn(i,3)*amp - if (write_files) write(13,'(9(g0, ","), g0)') shellno,k_num_all(i,1),k_num_all(i,2), & - k_num_all(i,3),uamp,vamp,wamp, u_hat_pn(i,1), u_hat_pn(i,2), u_hat_pn(i,3) + if (write_files) write(13,'(7(g0, ","), g0)') shellno,k_num_all(i,1),k_num_all(i,2), & + k_num_all(i,3),amp, u_hat_pn(i,1), u_hat_pn(i,2), u_hat_pn(i,3) ue = ue + ((uamp)**2)/2. ve = ve + ((vamp)**2)/2. From 8f647ccb6f7a500dad8a418908ec4137cbe4d680 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 17:48:54 +0100 Subject: [PATCH 20/41] run --- FST/example/run.case | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FST/example/run.case b/FST/example/run.case index b398f7e..c6dc459 100644 --- a/FST/example/run.case +++ b/FST/example/run.case @@ -13,7 +13,7 @@ "enabled": false }, "time": { - "end_time": 1.5, + "end_time": 0.3, "variable_timestep": true, "target_cfl": 0.5, "timestep": 1e-3, @@ -27,9 +27,9 @@ "FST": { "enabled": true, // !!! FST IS DISABLED !! - "t_start": 0.3, + "t_start": 0.05, "t_ramp": 0.001, - "alpha": 0.3, // 15% distance to the y boundaries + "alpha": 0.15, // 15% distance to the y boundaries "periodic_z": true }, From 30f7df3d192cd5e8ccfc900105ac5f43d68e746e Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 17:49:49 +0100 Subject: [PATCH 21/41] run.case --- FST/example/run.case | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FST/example/run.case b/FST/example/run.case index a45d8dd..73f9e56 100644 --- a/FST/example/run.case +++ b/FST/example/run.case @@ -26,14 +26,14 @@ "FST": { "enabled": true, // !!! FST IS DISABLED !! - "t_start": 0.1, + "t_start": 0.05, "t_ramp": 0.001, "alpha": 0.15, // 15% distance to the y boundaries "periodic_z": true, "ystart": -0.1, "yend": 0.1, "regen_files": false, - "Uinf": 2.0 + "Uinf": 1.0 }, "fluid": { From 552f0c67d23d7ace16505032b226d578ab4d6e72 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Thu, 15 Jan 2026 17:54:50 +0100 Subject: [PATCH 22/41] remove variable dt --- FST/example/run.case | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FST/example/run.case b/FST/example/run.case index c6dc459..90dba92 100644 --- a/FST/example/run.case +++ b/FST/example/run.case @@ -14,7 +14,7 @@ }, "time": { "end_time": 0.3, - "variable_timestep": true, + "variable_timestep": false, "target_cfl": 0.5, "timestep": 1e-3, "max_timestep": 0.25e-2 From c624a501015763cc98c150a85c9b276696c9b88c Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 19 Jan 2026 11:31:51 +0100 Subject: [PATCH 23/41] Update README.md --- FST/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/FST/README.md b/FST/README.md index 868ad1f..7cb98cf 100644 --- a/FST/README.md +++ b/FST/README.md @@ -15,12 +15,12 @@ The initialization, generation, application of the FST is driven by `07_fst_bc_d - `fst_bc_driver_apply()` - `fst_bc_driver_finalize()` -An example of usage is given in the user file `example.f90`. Note that to apply the boundary condition we use the `field_dirichlet_update` function which -requires the use of the `user_velocity` boundary condition on the desired boundary (see `example.case`). +An example of usage is given in the user file `example/user.f90`. Note that to apply the boundary condition we use the `field_dirichlet_update` function which +requires the use of the `user_velocity` boundary condition on the desired boundary (see `example/run.case`). ## Case file -The driver module uses some parameters that should be given in the case file. Below is the JSON object taken from `example.case` that shows which parameters to use: +The driver module uses some parameters that should be given in the case file. Below is the JSON object taken from `example/run.case` that shows which parameters to use: ```.json "FST": { @@ -28,15 +28,15 @@ The driver module uses some parameters that should be given in the case file. Be "t_start": 0.0001, // Time at which to start applying FST "t_ramp": 0.001, // Length of the linear ramp in time "alpha": 0.2, // see below for full explanation of what this is - "ystart": -0.01, // Lower bound for the fringe function - "yend": 0.01, // High bound for the fringe function + "ystart": -0.01, // Lower bound for the fringe function (Also exists for z, if y is periodic) + "yend": 0.01, // High bound for the fringe function (Also exists for z, if y is periodic) "periodic_z": true // Self-explanatory. If periodic in y add "periodic_y": true } ``` ### Spatial fringe parameters -A smooth fringe function is applied on the 2D inlet plane, which at the moment is assumed to be `(y,z)`. +A smoothing function in space is applied on the 2D inlet boundary. The shape of this fringe is the one used in SIMSON and by lots of other people: $$ @@ -51,7 +51,7 @@ $$ Note that $\lambda_u = 1$ if the direction `u` is set to be periodic. -`_start` and `_end` parameters need to be set by the user, which represent geometrical coordinates. +`_start` and `_end` parameters need to be set by the user. By default, and only if the direction is not periodic, `_start` will be set to the minimum coordinate on the boundary (in that direction). The same goes for `_end`, it will be by default set to the maximum value. The quantities $\delta_{u,*}$ are computed as a percentage $\alpha$ of the total boundary length From 23c930d06b985db5d98f0538eba4bcdbc8c608f6 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 19 Jan 2026 11:33:38 +0100 Subject: [PATCH 24/41] add image to readme --- FST/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/FST/README.md b/FST/README.md index 7cb98cf..d96edc8 100644 --- a/FST/README.md +++ b/FST/README.md @@ -49,6 +49,8 @@ $$ \lambda_u = S\left( \frac{u - u_{start}}{\delta_{u,rise}}\right) - S\left( \frac{u - u_{end}}{\delta_{u,fall}}+1\right) $$ +![An example of fringe functions with different alphas](fringe.png "Example of fringe function") + Note that $\lambda_u = 1$ if the direction `u` is set to be periodic. `_start` and `_end` parameters need to be set by the user. From 44d9972a55a42c02e58c0d925cba9320d1922df7 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 19 Jan 2026 11:34:02 +0100 Subject: [PATCH 25/41] add image --- FST/fringe.png | Bin 0 -> 46002 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 FST/fringe.png diff --git a/FST/fringe.png b/FST/fringe.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d2fbee824c23c5582e537218eb224c4db93e09 GIT binary patch literal 46002 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 Date: Mon, 19 Jan 2026 11:52:31 +0100 Subject: [PATCH 26/41] add fst example --- FST/README.md | 3 ++- FST/fst.png | Bin 0 -> 274131 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 FST/fst.png diff --git a/FST/README.md b/FST/README.md index d96edc8..20dcb07 100644 --- a/FST/README.md +++ b/FST/README.md @@ -49,7 +49,8 @@ $$ \lambda_u = S\left( \frac{u - u_{start}}{\delta_{u,rise}}\right) - S\left( \frac{u - u_{end}}{\delta_{u,fall}}+1\right) $$ -![An example of fringe functions with different alphas](fringe.png "Example of fringe function") +![An example of fringe function with different alphas](fringe.png "Example of fringe function") +![A practical example of an inlet boundary](fst.png "Example of z-component of FST on an inlet boundary") Note that $\lambda_u = 1$ if the direction `u` is set to be periodic. diff --git a/FST/fst.png b/FST/fst.png new file mode 100644 index 0000000000000000000000000000000000000000..26b9d213cd87c0ae5b8eb0edd9dd3162bc4c3934 GIT binary patch literal 274131 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

=mUZh*TtGYH)txaOwStjn! zQ%smAi~>RMwkiLv*Sas;t#@N!g@uxZd5Srj@y;Hj262^~$6UDhSwB`Np^cd4bWYb@ z;Zca(l?lreKHEMjJMMQdiA=w+;j;}jAveOZpOzSlR)U}3fvr6+6Y=lQ~t<(UJwJmB4M|7@hP1F6r#2 zS|z!`DSx^&O{EvbwXXiuTKhCnxN0_;_c=&}c^lv!)Ge48DS3EtzthhD_L49;2Gd0X zBgLI!eR*{o=Yns(`+ErF_O$AZn#ktCLDdhb&tDf7t@z%Dy|b+cg8klVPjJ56-(IvQ zol+HaNEZYq+&~32=a2gRo`W@KV{6YCo>t??{N12mnU;9QaHJ>#OgDegbGwW7Ot*Pw$B(fpg-@>~ zn)()t#=cdRt=XDG7}sfcKYHCLY1XkmzsSCg+b4+F%optWJy*z6}VFt61l&1SmpV z%ZeD*9RM7!F&-Xs$FHB(wx0e9)>pE0yK=5tye$Cpm}a6%n+74%HQB1EcX1S4K)*oo zE4bJiQ}V$H)e^wJoY-)CunQnsLUB&*8lw2zIhTs@4_J9fkY?7;xY>h`O+E#ZE**Kw zwi>MFzK>+Bu%b*+UFA5=EC^GSUF3uGzL6mQAGW5*F#+RDd74dEwMt4GbU9L+{q8e9 z1N}LN(prVb>{r7tup*UaJsVGGr~bLz?B2TyrBQbt!^PaqEbM`vrwv z)}W4Pv32XLPbM33sS+eep${L}mQW9NR1Qx7#5@H8GV3g}9EBsCP zz=U*O^@J(bRWZZu7-AHs2{xlgIQCC`f%2x5+}bfconL@?8vG!)c5sXVk9YK4o9(|- z+izU2jgdu! zHe@!cOUd?gYIHxXf6f+aBrnETlPMEyepR6#CqhQx9O2e*l_0!omoMaFDLKE72eswh z??6x|r{_(kZH*t_+~XSFGkLLf|5w@m_@cJkSoV8IAfHr_A%kC$=zhx{uq2hD4nJB^ zlpHjbdJ>R_x2k$1(r|sO78M|&266tSDG87J2&s<`*h5rdR!eskoG5G9ar&x`91SGt z-ZdL!c92(%kxQ8um2rKguAL-U1%K0fEb<2^^UB?B-Z&&`e_ZwZ+=R1(yH-}|XE9(4 zELn7LgO1WP-GWRC@1je#WYWW_hJnMP9^sa&*y8D)=nDp$*rK~|`A?b9E~$=us@33a zRxA7q6(BP4gIvn{eNy=FtGsgyd99MAPtHX9GT4iGdFl!`VcgR(>Biu}yzSS=nYvFUFBS}(!J@4A z%oeI8EcfobhP2rS!1_s=sL#Q^As~}t2e3mQl$nCoPR4Mqvcgy0b95*t9q|7C#~YMq z&KOc~wMm10YkXB}81^30s56MHX-M*vBL2AYRk+Bw46}Et1|e>1Z+T-@-8_IWvo|2i z7r(`<9pCG&v7z6PfSx|U%f)aNK1&x(&NoQQg<=kktbqkWNbgMeF-l00hPLI{Yf?2KP%f7m~XB>~896 z<|WXnY5RjU_ZsgS7WhZU*J`C^?6OAVFj)T1S5);p)PC_1{q(`x*vOT-(oe~QrNOqr zKHSbpEXHNSr2#R%7JsPwBx&_Kujwl}`0`SOi62w`h5XSQq+840cc7d}{YN^RrPS+H@zI~>{JM@p zWXi?#@Fr|L;%lL0U8=LhboF671Z5L7tHOouxPp^fzueWcT_diyM-}*CM5k;CG6fF3Y`pb!P>*Txq*Rk-^ z*=-SGX|LK0{RsMeXbxw+HHDGB>qOwBN7yj$g40TWq|DD}Rs@a}5x)?!a9RciQ#~Hj z>enBPh0}NsJI#~duK(o<;JD>1St}PGrAt14q&f0#Il zeTP5>>GsCj_47X9h*0SsSk+{GR59pSO#NVS$w?Agv+`D+eILCc!=vfQQ$KlrG5A2R zC+`zAD&MutLD0JggB`cRIF@p~AG};ye^ZBN`0P9dT$pe)*eT8kY1@`>O9eJ-SO z)Cb!Ocd@-TV6zW0ZlVf2;)dVCido8Lm0PuOUEMdxnb6)PxE^~EJD629y*@OAovB8y zXGMK5b!Cm}M=@9%*|p4Uy>Ee+@q2}(hoGRdJ&oi=TljsRP<;5->!nU4hq+Fn&;@&YV{u2B zL(2*isTR8QeWIdaO4x_c<{gxzub3iTt;2yEUZ9Jcm)A$Orxg}NKPzM26~(i`8SmEY z|8wIjkE>#K-j?Jq>R%5Xl%P7vk5Mx-ZnS*(D&o9{y&{2+O!Jr*WWAwyV#H)fuGH_d zZ-0}daHjntd2HxiKKtr;IKx>9uP)MHB9@B6`pF-u%d-B7 z^QePu;=VY{Mh?TIlGvA~nQS48&lRpw%?V=C$*f^rPL)}Siw@iKcsM??2Ufz%nQFSD8t?Zq%$x>yA710L>;0*Nx=gWrLEA-ytRXf;UjzG>+kCFM<|r|O*%3wJyX&JUCB2?h zMCF=?o0$>f+{UM>>mWdOrrb}LGP^LQrUr63czAG%!|Xg?&$CNj``;QS^xNS;cMOr% z0e4JqAj#G9DXH1QBw_wh4IEI4O9qJMcxB*wU3%#9Mp;6s_Sfe27r(mLd>OFz$i~Uh z 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

R>cSW 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 literal 0 HcmV?d00001 From b7c2dcf5e782024dd27d558b4f529f50a9d46c28 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 19 Jan 2026 11:57:59 +0100 Subject: [PATCH 27/41] update readme --- FST/README.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/FST/README.md b/FST/README.md index 20dcb07..ed316a4 100644 --- a/FST/README.md +++ b/FST/README.md @@ -49,14 +49,22 @@ $$ \lambda_u = S\left( \frac{u - u_{start}}{\delta_{u,rise}}\right) - S\left( \frac{u - u_{end}}{\delta_{u,fall}}+1\right) $$ +Note that $\lambda_u = 1$ if the direction `u` is set to be periodic. + + +Below is an example of fringe function in 1 dimension. ![An example of fringe function with different alphas](fringe.png "Example of fringe function") + +And here is an example of how it looks like on an inlet boundary. In this case, we are showing +the z-component of velocity where the baseflow has 0 velocity. The z-direction is set to be +periodic and therefore there is no smoothing along the z-direction. The y-direction is not +periodic. We have exaggerated the extents of the fringe function to make it obvious, but +this will very much be case dependent. ![A practical example of an inlet boundary](fst.png "Example of z-component of FST on an inlet boundary") -Note that $\lambda_u = 1$ if the direction `u` is set to be periodic. +The `_start` and `_end` parameters can be set by the user. By default, and only if the direction is not +periodic, `_start`/`_end` will be set to the minimum/maximum coordinate on the boundary (in that direction). -`_start` and `_end` parameters need to be set by the user. -By default, and only if the direction is not periodic, `_start` will be set to the minimum coordinate on the boundary (in that direction). -The same goes for `_end`, it will be by default set to the maximum value. The quantities $\delta_{u,*}$ are computed as a percentage $\alpha$ of the total boundary length in the direction `u`: $\delta_{u,rise} = \delta_{u,fall} = \alpha * L_u$, where $L_u$ is the total domain length at the inlet in the direction u. From 164d1c39058e49af39e3f3703c76844ac00a15ea Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 19 Jan 2026 13:43:28 +0100 Subject: [PATCH 28/41] change slightly input params --- FST/src/drivers/01_fst_bc_driver.f90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/FST/src/drivers/01_fst_bc_driver.f90 b/FST/src/drivers/01_fst_bc_driver.f90 index 8b28708..8dba653 100644 --- a/FST/src/drivers/01_fst_bc_driver.f90 +++ b/FST/src/drivers/01_fst_bc_driver.f90 @@ -114,8 +114,8 @@ subroutine fst_bc_driver_initialize(t, u, v, w, p, coef, params) ystart = ymin + delta_y yend = ymax - delta_y else - call json_get_or_default(params, "case.FST.ystart", ystart, ymin) - call json_get_or_default(params, "case.FST.yend", yend, ymax) + call json_get_or_default(params, "case.FST.y_start", ystart, ymin) + call json_get_or_default(params, "case.FST.y_end", yend, ymax) delta_y = alpha*Ly end if @@ -127,8 +127,8 @@ subroutine fst_bc_driver_initialize(t, u, v, w, p, coef, params) zstart = zmin + delta_z zend = zmax - delta_z else - call json_get_or_default(params, "case.FST.zstart", zstart, zmin) - call json_get_or_default(params, "case.FST.zend", zend, zmax) + call json_get_or_default(params, "case.FST.z_start", zstart, zmin) + call json_get_or_default(params, "case.FST.z_end", zend, zmax) delta_z = alpha * Lz end if From ffac7749144508c934ea847836c7e7ec31d71c54 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 19 Jan 2026 13:58:10 +0100 Subject: [PATCH 29/41] update changes --- FST/README.md | 37 ++++++++++++++++++++++++++++++++++--- FST/example/run.case | 4 ++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/FST/README.md b/FST/README.md index ed316a4..239ea98 100644 --- a/FST/README.md +++ b/FST/README.md @@ -28,12 +28,43 @@ The driver module uses some parameters that should be given in the case file. Be "t_start": 0.0001, // Time at which to start applying FST "t_ramp": 0.001, // Length of the linear ramp in time "alpha": 0.2, // see below for full explanation of what this is - "ystart": -0.01, // Lower bound for the fringe function (Also exists for z, if y is periodic) - "yend": 0.01, // High bound for the fringe function (Also exists for z, if y is periodic) - "periodic_z": true // Self-explanatory. If periodic in y add "periodic_y": true + "ystart": -0.01, // Lower bound for the fringe function (Also exists for z, if y is periodic) + "yend": 0.01, // High bound for the fringe function (Also exists for z, if y is periodic) + "periodic_z": true, // Self-explanatory. If periodic in y add "periodic_y": true + "regen_files": true, // Set to true to generate wavenumbers etc. See below for further explanation + "Uinf": 1.0, // Free-stream velocity. Only read if "regen_files" is false. } ``` +### FST generation + +In the original implementation, FST wavenumbers and amplitudes are generated +on-the-fly at the beginning of the simulation. This is the default behavior in +the present implementation. Generating wavenumbers/amplitudes on-the-fly will +create three separate files: +- `bb.txt`, which contains the random phases, +- `fst_spectrum.csv`, which contains wavenumbers, amplitudes and the random, + unitary, divergence-free vectors, and +- `sphere.dat`, which contains information about # shells, points per shell, + and wavenumber discretization parameters. + +You also have the possibility to reuse previously generated files to keep +the same FST parameters across two simulations. To do that, use the parameter +`FST.regen_files` and set it to `false`. Be careful that the 3 files mentioned +above must be present in the same folder as your executable. + +The format of the fst_spectrum.csv file is a bit special and differs +from previous implementations. This version of the code requires it to have 8 +columns, which are as follows: + +```.csv +ShellNo,kx,ky,kz,amp,u_hat_pn1,u_hat_pn2,u_hat_pn3 +``` + +If `regen_files` is `false`, you must also specify the free-stream velocity +since nothing from `01_global_params.f90` will be used. This can be done via +the parameters `FST.Uinf`. + ### Spatial fringe parameters A smoothing function in space is applied on the 2D inlet boundary. diff --git a/FST/example/run.case b/FST/example/run.case index 73f9e56..d8bd7fe 100644 --- a/FST/example/run.case +++ b/FST/example/run.case @@ -30,8 +30,8 @@ "t_ramp": 0.001, "alpha": 0.15, // 15% distance to the y boundaries "periodic_z": true, - "ystart": -0.1, - "yend": 0.1, + "y_start": -0.1, + "y_end": 0.1, "regen_files": false, "Uinf": 1.0 }, From 8a0d9b77384488f3ff942bd0b305756a32c47efc Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Wed, 11 Mar 2026 11:05:57 +0100 Subject: [PATCH 30/41] remove seed from global params --- FST/src/FST-core/01_global_params.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FST/src/FST-core/01_global_params.f90 b/FST/src/FST-core/01_global_params.f90 index 97b463b..04cc753 100644 --- a/FST/src/FST-core/01_global_params.f90 +++ b/FST/src/FST-core/01_global_params.f90 @@ -25,7 +25,7 @@ module global_params integer :: k_length integer :: shell(fst_modes) - integer :: seed + !integer :: seed real(kind=rp) :: k_num(fst_modes, 3) real(kind=rp) :: k_num_all(fst_modes, 3) From 16bb31e83417bb00d287bbcca44a65e0b204beda Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Wed, 11 Mar 2026 11:10:41 +0100 Subject: [PATCH 31/41] add path and seed as external params --- FST/src/FST-core/04_spec.f90 | 15 ++-- FST/src/FST-core/05_turbu.f90 | 20 +++-- FST/src/FST-core/06_FST.f90 | 117 ++++++++++----------------- FST/src/drivers/01_fst_bc_driver.f90 | 10 ++- 4 files changed, 73 insertions(+), 89 deletions(-) diff --git a/FST/src/FST-core/04_spec.f90 b/FST/src/FST-core/04_spec.f90 index 4cd63bf..f2d42a4 100644 --- a/FST/src/FST-core/04_spec.f90 +++ b/FST/src/FST-core/04_spec.f90 @@ -14,9 +14,12 @@ module spec contains - subroutine spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z) + subroutine spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z, & + seed, write_file_path) real(kind=rp), intent(out) :: dlx, dly, dlz logical, intent(in) :: periodic_x, periodic_y, periodic_z + integer, intent(inout) :: seed + character(len=*), intent(in) :: write_file_path character(len=LOG_SIZE) :: log_buf @@ -103,7 +106,7 @@ subroutine spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z) ! Write wavenumbers to ffst_ile if (write_files) then - open(file='sphere.dat', unit=10) + open(file=trim(write_file_path) // '/sphere.dat', unit=10) write(10,*) 'energy shell parameters' write(10,'(a20,i18)') 'Nshells',nshells @@ -138,7 +141,7 @@ subroutine spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z) kk(i),Np,seed) call periodicity_chk(co(1,i,1),co(1,i,2),co(1,i,3), & - Np,kk(i),dlx,dly,dlz, periodic_x, periodic_y, periodic_z) + Np,kk(i),dlx,dly,dlz, periodic_x, periodic_y, periodic_z, seed) !write (*,*) "COCO", co(1,i,1) ! add second dodecaeder mirrored at (x)-axis @@ -223,7 +226,7 @@ subroutine spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z) end do ! j=1,2*Np end do ! i=1,nshells ! write(6,*) 'FST - (0,0,0) wavenumber removed' - call neko_log%message('[FST] (0,0,0) wavenumber removed') + call neko_log%message(' [FST] (0,0,0) wavenumber removed') write(log_buf, *) '[FST] Saved ',z1,' of ',z1+z2, ' fst modes.' call neko_log%message(log_buf) @@ -318,7 +321,7 @@ end subroutine spec_s !---------------------------------------------------------------------- - subroutine periodicity_chk(kx,ky,kz,np,kk,dlx,dly,dlz, ifxp, ifyp, ifzp) + subroutine periodicity_chk(kx,ky,kz,np,kk,dlx,dly,dlz, ifxp, ifyp, ifzp, seed) ! implicit none @@ -326,7 +329,7 @@ subroutine periodicity_chk(kx,ky,kz,np,kk,dlx,dly,dlz, ifxp, ifyp, ifzp) integer :: nmax,nmin,kn logical :: ifxp,ifyp,ifzp - !integer :: seed + integer :: seed integer :: np real(kind=rp) :: flip diff --git a/FST/src/FST-core/05_turbu.f90 b/FST/src/FST-core/05_turbu.f90 index 49f333f..1a27697 100644 --- a/FST/src/FST-core/05_turbu.f90 +++ b/FST/src/FST-core/05_turbu.f90 @@ -9,9 +9,14 @@ module turbu !---------------------------------------------------------------------- - subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) - type(coef_t), intent(in) :: coef + subroutine make_turbu(periodic_x, periodic_y, periodic_z, seed, & + write_file_path, dx, dy, dz, gdim, coef) logical, intent(in) :: periodic_x, periodic_y, periodic_z +integer, intent(inout) :: seed + character(len=*), intent(in) :: write_file_path + real(kind=rp), intent(in), optional :: dx, dy, dz + integer, intent(in), optional :: gdim + type(coef_t), intent(in), optional :: coef integer :: k,i,j integer :: shellno @@ -47,10 +52,13 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) if ( pe_rank.eq.0 ) then ! Hardcoded seed for random # generation.This way the FST generated is always the same. - seed = -143 + !seed = -143 - if (write_files) open(unit=137,form='formatted',file='bb.txt') - call spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z) ! get isotropically distributed wavenumbers in spheres + if (write_files) open(unit=137,form='formatted', & + file=trim(write_file_path) // '/bb.txt') + + call spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z, seed, & + write_file_path) ! get isotropically distributed wavenumbers in spheres do k=1,coef%msh%gdim do i=1,fst_modes @@ -99,7 +107,7 @@ subroutine make_turbu(coef, periodic_x, periodic_y, periodic_z) ve=0. we=0. ! Also write the modes - if (write_files) open(file='fst_spectrum.csv',unit=13) + if (write_files) open(file=trim(write_file_path) // '/fst_spectrum.csv', unit=13) if (write_files) write(13,'(7(A, ","),A)') 'ShellNo','kx','ky','kz', & 'amp','u_hat_pn1','u_hat_pn2', 'u_hat_pn3' do i=1,k_length diff --git a/FST/src/FST-core/06_FST.f90 b/FST/src/FST-core/06_FST.f90 index 9fe446e..a880540 100644 --- a/FST/src/FST-core/06_FST.f90 +++ b/FST/src/FST-core/06_FST.f90 @@ -92,6 +92,11 @@ module FST type(c_ptr) :: k_x_d = C_NULL_PTR real(kind=xp), allocatable :: phase_shifts(:) + !> Indicates whether the FST has been generated + logical :: is_generated = .false. + + integer :: seed !< Seed for random number generation + contains ! ======== Init/Free procedures @@ -124,7 +129,7 @@ subroutine FST_init_common(this, & ymin, ymax, ystart, yend, y_delta_rise, y_delta_fall, & fringe_max, & t_start, t_end, & - periodic_x, periodic_y, periodic_z) + periodic_x, periodic_y, periodic_z, seed) class(FST_t), intent(inout) :: this real(kind=rp), intent(in) :: xstart, xend, xmin, xmax real(kind=rp), intent(in) :: ystart, yend, ymin, ymax @@ -136,6 +141,10 @@ subroutine FST_init_common(this, & real(kind=xp), intent(in) :: t_start real(kind=xp), intent(in) :: t_end logical, intent(in) :: periodic_x, periodic_y, periodic_z + integer, intent(inout), optional :: seed + + integer :: seed_ = -143 + if (present(seed)) seed_ = seed this%periodic_x = periodic_x this%periodic_y = periodic_y @@ -238,13 +247,15 @@ end subroutine FST_init_bc !! !! NOTE: The structure of fst_spectrum.csv should be: !! shellno, kx, ky, kz, amp, u_hat_pn(1), u_hat_pn(2), u_hat_pn(3) - subroutine FST_read_from_files(this) + subroutine FST_read_from_files(this, path) class(FST_t), intent(inout) :: this + character(len=*), intent(in) :: path integer :: unit, ios, num_columns, num_lines, n_modes_total, i, np_eff, & ierr, prev_shell, idx_shell_amp character(len=1) :: delimiter character(len=1024) :: line + character(len=2048) :: fpath character(len=20) :: keyword real(kind=xp) :: tmp character(len=LOG_SIZE) :: log_buf @@ -258,11 +269,13 @@ subroutine FST_read_from_files(this) ! ! Read sphere.dat to get number of spheres ! - call neko_log%message("[FST] Reading sphere.dat") - open(file="sphere.dat", unit=unit, status="old", action="read", & - iostat=ios) + fpath = trim(path) // "/sphere.dat" + call neko_log%message("[FST] Reading " // trim(fpath)) + open(file = trim(fpath), unit = unit, status = "old", & + action="read", iostat=ios) + if (ios /= 0) then - call neko_error("[FST] Error opening sphere.dat") + call neko_error("[FST] Error opening " // trim(fpath)) end if read(unit,*) line @@ -275,11 +288,12 @@ subroutine FST_read_from_files(this) ! ! Read FST spectrum, count # of lines to allocate all the arrays ! - open(file="fst_spectrum.csv", unit=unit, status="old", action="read", & + fpath = trim(path) // "/fst_spectrum.csv" + open(file=trim(fpath), unit=unit, status="old", action="read", & iostat=ios) - call neko_log%message("[FST] Reading fst_spectrum") + call neko_log%message("[FST] Reading " // trim(fpath)) if (ios /= 0) then - call neko_error("[FST] Error opening fst_spectrum.csv") + call neko_error("[FST] Error opening " // trim(fpath)) end if num_columns = 1 @@ -350,10 +364,10 @@ subroutine FST_read_from_files(this) ! ! Now read fst_spectrum again and populate all the arrays ! - open(file="fst_spectrum.csv", unit=unit, status="old", action="read", & + open(file=trim(fpath), unit=unit, status="old", action="read", & iostat=ios) if (ios /= 0) then - call neko_error("[FST] Error opening fst_spectrum.csv") + call neko_error("[FST] Error opening " // trim(fpath)) end if read(unit,*) line! read the header @@ -374,9 +388,10 @@ subroutine FST_read_from_files(this) ! ! Read the phase shifts in bb.txt ! - open(file="bb.txt", unit=unit, status="old", action="read", iostat=ios) + fpath = trim(path) // "/bb.txt" + open(file=trim(fpath), unit=unit, status="old", action="read", iostat=ios) if (ios /= 0) then - call neko_error("[FST] Error opening bb.txt") + call neko_error("[FST] Error opening " // trim(fpath)) end if do i = 1, this%n_modes_total @@ -405,7 +420,6 @@ subroutine FST_read_from_files(this) end subroutine FST_read_from_files - !! Free parameters in global params subroutine FST_free_params(this) class(FST_t), intent(inout) :: this @@ -431,7 +445,6 @@ subroutine FST_print_params(this) character(len=LOG_SIZE) :: log_buf if (pe_rank .ne. 0) return - write(log_buf, '(A ,F15.7)') "[FST] xstart ", this%xstart call neko_log%message(log_buf) write(log_buf, '(A ,F15.7)') "[FST] xend ", this%xend @@ -462,7 +475,8 @@ subroutine FST_print_params(this) call neko_log%message(log_buf) write(log_buf, '(A ,F15.7)') "[FST] t_end ", this%t_end call neko_log%message(log_buf) - + write(log_buf, '(A ,I0)') "[FST] seed ", this%seed + call neko_log%message(log_buf) end subroutine FST_print_params !> Apply a specific baseflow in our region, from a boundary mask. @@ -540,9 +554,10 @@ subroutine FST_apply_baseflow(this, mask, n, u, v, w) end subroutine FST_apply_baseflow !> Common function for generation - subroutine FST_generate_common(this, coef) + subroutine FST_generate_common(this, coef, path) class(FST_t), intent(inout) :: this type(coef_t), intent(in) :: coef + character(len=*), intent(in) :: path integer :: ierr @@ -550,7 +565,8 @@ subroutine FST_generate_common(this, coef) ! First, generate everything as usual ! call neko_log%section (' [FST] Generating') - call make_turbu(coef, this%periodic_x, this%periodic_y, this%periodic_z) + call make_turbu(this%periodic_x, this%periodic_y, this%periodic_z, & + this%seed, path, coef=coef) call neko_log%end_section('') ! @@ -558,7 +574,7 @@ subroutine FST_generate_common(this, coef) end subroutine FST_generate_common - !> Generate FST for forcing + !> Generate FST for forcing (empty) subroutine FST_generate_forcing(this, coef, zone, u, v, w) class(FST_t), intent(inout) :: this type(coef_t), intent(in) :: coef @@ -598,26 +614,25 @@ subroutine FST_generate_forcing(this, coef, zone, u, v, w) end subroutine FST_generate_forcing !> Do the generation for BC. - subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen, Uinf) + subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen, Uinf, path) class(FST_t), intent(inout) :: this type(coef_t), intent(in) :: coef integer, intent(in) :: bc_mask(0:n) integer, intent(in) :: n type(field_t), intent(in) :: u, v, w logical, intent(in) :: regen - real(kind=xp), optional :: Uinf + character(len=*), intent(in) :: path + real(kind=xp), intent(in), optional :: Uinf character(len=LOG_SIZE) :: log_buf real(kind=rp) :: x, y, z integer :: ierr, i, idx, m, j - ! - ! Generate everything from scratch. This will create the files - ! bb.txt, sphere.dat and fst_spectrum.csv - ! if (regen) then - call this%generate_common(coef) + ! Generate everything from scratch. This will create the files + ! bb.txt, sphere.dat and fst_spectrum.csv + call this%generate_common(coef, path) this%Uinf = glb_uinf else @@ -633,7 +648,7 @@ subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen, Uinf) ! ! Read data from files (will not use anything from global_params!) ! - call this%read_from_files() + call this%read_from_files(path) ! ! Print some diagnostics just in case @@ -823,54 +838,6 @@ subroutine FST_apply_BC(this, bc_mask, n, & this%k_x, this%n_modes_total, this%phi_0, this%shell, this%shell_amp, & this%random_vectors, angleXY, fringe_time, this%fringe_space, on_host) -!!$ phi_t = glb_uinf*t -!!$ ! Loop on all points in the point zone -!!$ do idx = 1, bc_mask(0) -!!$ -!!$ i = bc_mask(idx) -!!$ -!!$ !> This vector will contain the sum of all Fourier modes -!!$ rand_vec = 0.0_rp -!!$ -!!$ ! Sum all sin modes for each gll point -!!$ do m = 1, this%n_modes_total -!!$ -!!$ ! Random phase shifts -!!$ !phase_shft = bb(m,1) -!!$ -!!$ ! k_x(x - U*t) + ky*y + kz*z + phi -!!$ ! = k_x*x + ky*y + kz*z - k_x*U*t + phi -!!$ !phi = k_num_all(m,1) * (x(i,1,1,1) - glb_uinf*t) + & -!!$ ! k_num_all(m,2) * y(i,1,1,1) + & -!!$ ! k_num_all(m,3) * z(i,1,1,1) + & -!!$ ! phase_shft -!!$ -!!$ phi = this%phi_0(m,idx) - this%k_x(m)*phi_t -!!$ -!!$ shellno = shell(m) -!!$ -!!$ pert = shell_amp(shellno)*sin(phi) -!!$ -!!$ rand_vec(1) = rand_vec(1) + u_hat_pn(m,1)*pert -!!$ rand_vec(2) = rand_vec(2) + u_hat_pn(m,2)*pert -!!$ rand_vec(3) = rand_vec(3) + u_hat_pn(m,3)*pert -!!$ -!!$ enddo -!!$ -!!$ ! Project the rand_vec if there is a rotation -!!$ urand = rand_vec(1)*cosa - rand_vec(2)*sina -!!$ vrand = rand_vec(1)*sina + rand_vec(2)*cosa -!!$ wrand = rand_vec(3) -!!$ -!!$ u_bc(i,1,1,1) = this%u_baseflow(idx) + & -!!$ fringe_time*this%fringe_space(idx)*urand -!!$ v_bc(i,1,1,1) = this%v_baseflow(idx) + & -!!$ fringe_time*this%fringe_space(idx)*vrand -!!$ w_bc(i,1,1,1) = this%w_baseflow(idx) + & -!!$ fringe_time*this%fringe_space(idx)*wrand -!!$ -!!$ end do - end subroutine FST_apply_BC ! ! Fringe function as defined in original FST. diff --git a/FST/src/drivers/01_fst_bc_driver.f90 b/FST/src/drivers/01_fst_bc_driver.f90 index 99520c6..96ff87a 100644 --- a/FST/src/drivers/01_fst_bc_driver.f90 +++ b/FST/src/drivers/01_fst_bc_driver.f90 @@ -41,6 +41,9 @@ module fst_bc_driver !! to use `masked_copy` (see later for clarifications). integer, allocatable :: STUPID_MASK(:) + !> Path to the fst files. + character(len=:), allocatable :: PATH + ! ============================================================================ public :: fst_bc_driver_initialize, fst_bc_driver_finalize, & @@ -148,6 +151,8 @@ subroutine fst_bc_driver_initialize(t, u, v, w, p, coef, params) call json_get(params, "case.FST.regen_files", REGEN) if (.not. REGEN) call json_get(params, "case.FST.Uinf", UINF) + call json_get_or_default(params, 'case.FST.read_path', PATH, ".") + ! Initialize the fst parameters call FST_OBJ%init_bc(zmin, zmax, zstart, zend, & delta_z, delta_z, & @@ -177,8 +182,9 @@ subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu) ! At the first timestep we generate the FST based ! on the boundry mask! ! - if (tstep .eq. 1) then - call FST_obj%generate_bc(coef, bc%msk, bc%msk(0), u, v, w, REGEN, UINF) + if (.not. FST_obj%is_generated) then + call FST_obj%generate_bc(coef, bc%msk, bc%msk(0), u, v, w, REGEN, & + UINF, PATH) end if ! Then, apply the free stream turbulence that will add on From 531c50412d686ebe174e6473859c5109b5296415 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Wed, 11 Mar 2026 11:11:10 +0100 Subject: [PATCH 32/41] change input to field --- FST/src/drivers/01_fst_bc_driver.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FST/src/drivers/01_fst_bc_driver.f90 b/FST/src/drivers/01_fst_bc_driver.f90 index 96ff87a..96de45f 100644 --- a/FST/src/drivers/01_fst_bc_driver.f90 +++ b/FST/src/drivers/01_fst_bc_driver.f90 @@ -192,7 +192,7 @@ subroutine fst_bc_driver_apply(u, v, w, bc, coef, t, tstep, angle, on_cpu) ! NOTE: if on_cpu is true, memory is not copied to the GPU (you need ! to do it yourself) call FST_obj%apply_BC(bc%msk, bc%msk(0), & - t, u%x, v%x, w%x, angle, on_cpu) + t, u, v, w, angle, on_cpu) ! If we compute on cpu, copy memory. This is slower! if (NEKO_BCKND_DEVICE .eq. 1 .and. on_cpu) then From 5b044d32d36ecb8151f8f9b46c56d629fb728753 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Wed, 11 Mar 2026 11:12:08 +0100 Subject: [PATCH 33/41] remove gdim --- FST/src/FST-core/05_turbu.f90 | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/FST/src/FST-core/05_turbu.f90 b/FST/src/FST-core/05_turbu.f90 index 1a27697..daec476 100644 --- a/FST/src/FST-core/05_turbu.f90 +++ b/FST/src/FST-core/05_turbu.f90 @@ -20,6 +20,7 @@ subroutine make_turbu(periodic_x, periodic_y, periodic_z, seed, & integer :: k,i,j integer :: shellno + integer :: gdim_ = 3 !integer :: seed real(kind=rp) :: ue,ve,we real(kind=rp) :: uamp,vamp,wamp @@ -27,6 +28,9 @@ subroutine make_turbu(periodic_x, periodic_y, periodic_z, seed, & real(kind=rp) :: u_hat(fst_modes, 3), u_hat_p(fst_modes, 3) character(len=LOG_SIZE) :: log_buf + if (present(gdim)) gdim_ = gdim + character(len=LOG_SIZE) :: log_buf + call print_param("nshells", real(nshells, kind=rp)) call print_param("Npmax", real(Npmax, kind=rp)) call print_param("fst_ti", fst_ti) @@ -60,7 +64,7 @@ subroutine make_turbu(periodic_x, periodic_y, periodic_z, seed, & call spec_s(dlx, dly, dlz, periodic_x, periodic_y, periodic_z, seed, & write_file_path) ! get isotropically distributed wavenumbers in spheres - do k=1,coef%msh%gdim + do k=1,gdim_ do i=1,fst_modes bb(i,k) = ran2(seed)*2.0*pi ! random phase shift @@ -77,11 +81,11 @@ subroutine make_turbu(periodic_x, periodic_y, periodic_z, seed, & ! make sure that continuity is enforced by ensuring u_vec.k_vec=(0 0 0) do i=1,k_length - do j= 1,coef%msh%gdim + do j= 1,gdim_ u_hat(i,j)=bb1(i,j) enddo - do j=1,coef%msh%gdim + do j=1,gdim_ u_hat_p(i,j) = u_hat(i,j) & - (u_hat(i,1)*k_num_all(i,1) & + u_hat(i,2)*k_num_all(i,2) & @@ -92,7 +96,7 @@ subroutine make_turbu(periodic_x, periodic_y, periodic_z, seed, & + k_num_all(i,3)**2) enddo - do j=1,coef%msh%gdim + do j=1,gdim_ u_hat_pn(i,j) = u_hat_p(i,j) & / sqrt(u_hat_p(i,1)**2 & + u_hat_p(i,2)**2 & From e8ef2309962ae5609cf41124ca8317c3d588e618 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Wed, 11 Mar 2026 11:12:45 +0100 Subject: [PATCH 34/41] add option to give dx,dy,dz and make coef optional --- FST/src/FST-core/05_turbu.f90 | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/FST/src/FST-core/05_turbu.f90 b/FST/src/FST-core/05_turbu.f90 index daec476..64011be 100644 --- a/FST/src/FST-core/05_turbu.f90 +++ b/FST/src/FST-core/05_turbu.f90 @@ -29,7 +29,6 @@ subroutine make_turbu(periodic_x, periodic_y, periodic_z, seed, & character(len=LOG_SIZE) :: log_buf if (present(gdim)) gdim_ = gdim - character(len=LOG_SIZE) :: log_buf call print_param("nshells", real(nshells, kind=rp)) call print_param("Npmax", real(Npmax, kind=rp)) @@ -38,20 +37,40 @@ subroutine make_turbu(periodic_x, periodic_y, periodic_z, seed, & call print_param("kstart", kstart) call print_param("kend", kend) + if (.not. present(coef)) then + if (.not. (present(dx) .and. present(dy) .and. present(dz))) then + call neko_error("Please specify either coef or dx,dy,dz") + end if + end if - ! - ! Search for the domain dimensions. - ! WARNING: This should be restricted to the boundary only! Not the - ! whole domain! - ! + if (present(dx)) then + dlx = dx + else dlx = glmax(coef%dof%x, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) - & glmin(coef%dof%x, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) + end if + if (present(dy)) then + dly = dy + else dly = glmax(coef%dof%y, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) - & glmin(coef%dof%y, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) + end if + if (present(dz)) then + dlz = dz + else dlz = glmax(coef%dof%z, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) - & glmin(coef%dof%z, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) + end if + + write (log_buf, *) "[FST] Length in x: ", dlx + call neko_log%message(log_buf) + write (log_buf, *) "[FST] Length in y: ", dly + call neko_log%message(log_buf) + write (log_buf, *) "[FST] Length in z: ", dlz + call neko_log%message(log_buf) + if ( pe_rank.eq.0 ) then From 4958f3aa56f57c0db04ce85f22900530be34932f Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Wed, 11 Mar 2026 11:13:11 +0100 Subject: [PATCH 35/41] whitespaces --- FST/src/FST-core/05_turbu.f90 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/FST/src/FST-core/05_turbu.f90 b/FST/src/FST-core/05_turbu.f90 index 64011be..7b44557 100644 --- a/FST/src/FST-core/05_turbu.f90 +++ b/FST/src/FST-core/05_turbu.f90 @@ -12,7 +12,7 @@ module turbu subroutine make_turbu(periodic_x, periodic_y, periodic_z, seed, & write_file_path, dx, dy, dz, gdim, coef) logical, intent(in) :: periodic_x, periodic_y, periodic_z -integer, intent(inout) :: seed + integer, intent(inout) :: seed character(len=*), intent(in) :: write_file_path real(kind=rp), intent(in), optional :: dx, dy, dz integer, intent(in), optional :: gdim @@ -46,22 +46,22 @@ subroutine make_turbu(periodic_x, periodic_y, periodic_z, seed, & if (present(dx)) then dlx = dx else - dlx = glmax(coef%dof%x, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) - & - glmin(coef%dof%x, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) + dlx = glmax(coef%dof%x, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) - & + glmin(coef%dof%x, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) end if if (present(dy)) then dly = dy else - dly = glmax(coef%dof%y, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) - & - glmin(coef%dof%y, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) + dly = glmax(coef%dof%y, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) - & + glmin(coef%dof%y, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) end if if (present(dz)) then dlz = dz else - dlz = glmax(coef%dof%z, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) - & - glmin(coef%dof%z, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) + dlz = glmax(coef%dof%z, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) - & + glmin(coef%dof%z, coef%Xh%lx * coef%Xh%ly * coef%Xh%lz * coef%msh%nelv) end if write (log_buf, *) "[FST] Length in x: ", dlx From 54553824a4d46761ccbc1ba43e4c4486dd70a895 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Wed, 11 Mar 2026 11:13:25 +0100 Subject: [PATCH 36/41] fix import masked_gather_copy_0 --- FST/src/FST-core/06_FST.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FST/src/FST-core/06_FST.f90 b/FST/src/FST-core/06_FST.f90 index a880540..ac428e4 100644 --- a/FST/src/FST-core/06_FST.f90 +++ b/FST/src/FST-core/06_FST.f90 @@ -14,7 +14,7 @@ module FST use coefs, only: coef_t use logger, only: neko_log, LOG_SIZE use point_zone, only: point_zone_t - use math, only: masked_gather_copy + use math, only: masked_gather_copy_0 use device_math, only: device_masked_gather_copy_0 use num_types, only: rp, xp use comm, only: pe_rank, MPI_EXTRA_PRECISION, NEKO_COMM From 65ce67b1438b07e27ee24cab7c2d1de36f5ecd7c Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Wed, 11 Mar 2026 11:13:57 +0100 Subject: [PATCH 37/41] misc cleanup and adapt to field input --- FST/src/FST-core/06_FST.f90 | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/FST/src/FST-core/06_FST.f90 b/FST/src/FST-core/06_FST.f90 index ac428e4..a03333c 100644 --- a/FST/src/FST-core/06_FST.f90 +++ b/FST/src/FST-core/06_FST.f90 @@ -91,7 +91,7 @@ module FST real(kind=xp), allocatable :: k_x(:) type(c_ptr) :: k_x_d = C_NULL_PTR real(kind=xp), allocatable :: phase_shifts(:) - + !> Indicates whether the FST has been generated logical :: is_generated = .false. @@ -197,8 +197,9 @@ subroutine FST_init_forcing(this, & call neko_log%section(' [FST] Initializing forcing') - call this%init_common(xstart, xend,xstart,xend,x_delta_rise, x_delta_fall, ystart, & - yend, ystart, yend, y_delta_rise, y_delta_fall, fringe_max, t_start, t_end, & + call this%init_common(xstart, xend, xstart, xend, x_delta_rise, & + x_delta_fall, ystart, yend, ystart, yend, y_delta_rise, & + y_delta_fall, fringe_max, t_start, t_end, & periodic_x, periodic_y, periodic_z) call neko_log%end_section('') @@ -629,7 +630,7 @@ subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen, Uinf, path) integer :: ierr, i, idx, m, j if (regen) then - + ! Generate everything from scratch. This will create the files ! bb.txt, sphere.dat and fst_spectrum.csv call this%generate_common(coef, path) @@ -746,6 +747,8 @@ subroutine FST_generate_bc(this, coef, bc_mask, n, u, v, w, regen, Uinf, path) HOST_TO_DEVICE, .true.) end if + this%is_generated = .true. + end subroutine FST_generate_bc ! Forcing to be performed on entire domain, on a local element ix @@ -818,22 +821,18 @@ subroutine FST_apply_BC(this, bc_mask, n, & integer, intent(in) :: n ! size of the bc mask integer, intent(in) :: bc_mask(0:n) real(kind=rp), intent(in) :: t - real(kind=rp), intent(inout), dimension(:,:,:,:) :: u_bc, v_bc, w_bc + !real(kind=rp), intent(inout), dimension(:,:,:,:) :: u_bc, v_bc, w_bc + type(field_t), intent(inout) :: u_bc, v_bc, w_bc real(kind=xp), intent(in) :: angleXY logical, intent(in) :: on_host -!!$ integer :: idx, l, m, i, shellno -!!$ integer, parameter :: gdim = 3 -!!$ real(kind=rp) :: phase_shft, phi, amp, pert, urand, vrand, wrand -!!$ real(kind=rp) :: rand_vec(gdim), vel_mag, phi_t - real(kind=xp) :: fringe_time, cosa, sina fringe_time = time_ramp(t, this%t_end, this%t_start) cosa = cos(angleXY) sina = sin(angleXY) - call fst_bc_compute(t, this%Uinf, u_bc, v_bc, w_bc, bc_mask, n, & + call fst_bc_compute(t, this%Uinf, u_bc%x, v_bc%x, w_bc%x, bc_mask, n, & this%u_baseflow, this%v_baseflow, this%w_baseflow, & this%k_x, this%n_modes_total, this%phi_0, this%shell, this%shell_amp, & this%random_vectors, angleXY, fringe_time, this%fringe_space, on_host) From 051764fbdc7cbb2615feb38a3d5942f187e5279f Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 20 Apr 2026 14:44:38 +0200 Subject: [PATCH 38/41] changes --- .gitignore | 4 ++ FST/example/makeneko_cpu | 29 ++++++++++++++ FST/example/makeneko_gpu | 79 +++++++++++++++++++++++++++++++++++++ FST/src/FST-core/06_FST.f90 | 1 + 4 files changed, 113 insertions(+) create mode 100755 FST/example/makeneko_cpu create mode 100755 FST/example/makeneko_gpu diff --git a/.gitignore b/.gitignore index 524abe7..c218d6c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,7 @@ fst_spectrum.dat *.chkp sphere.dat sphere.csv +FST/example/fort.0 +FST/example/neko +FST/example/usr_driver.f90 +tripping/neko diff --git a/FST/example/makeneko_cpu b/FST/example/makeneko_cpu new file mode 100755 index 0000000..f518025 --- /dev/null +++ b/FST/example/makeneko_cpu @@ -0,0 +1,29 @@ +#!/bin/bash + +usage() { + + echo "Usage" + echo "./makeneko_cpu " + echo "" + echo "Example" + echo "./makeneko_cpu swept-wing.f90 /cfs/klemming/scratch/y/ycl/Neko/neko ./src" + +} + +# Check if exactly 4 arguments are given +if [ "$#" -ne 3 ]; then + echo "Error: Exactly 4 arguments are required." + usage + exit +fi + +NEKO_INSTALL_PATH=${2} +src_path=${3} + +backend="${src_path}/bcknd/cpu/opr_fst_cpu.f90 ${src_path}/bcknd/device/opr_fst_device.F90" +interface="${src_path}/fst_operator.f90" +fst_core="${src_path}/FST-core/0*" +driver="${src_path}/drivers/0*" + +echo ${NEKO_INSTALL_PATH}/bin/makeneko $backend $interface $fst_core $driver $1 +${NEKO_INSTALL_PATH}/bin/makeneko $backend $interface $fst_core $driver $1 diff --git a/FST/example/makeneko_gpu b/FST/example/makeneko_gpu new file mode 100755 index 0000000..5d46d35 --- /dev/null +++ b/FST/example/makeneko_gpu @@ -0,0 +1,79 @@ +#!/bin/bash + +usage() { + + echo "Usage" + echo "./makeneko_gpu " + echo "" + echo "Example" + echo "./makeneko_gpu swept-wing.f90 /cfs/klemming/scratch/y/ycl/Neko/neko hip ./src" + +} + +NEKO_INSTALL_PATH=${2} +which_gpu=${3} +src_path=${4} + +# Check if exactly 4 arguments are given +if [ "$#" -ne 4 ]; then + echo "Error: Exactly 4 arguments are required." + usage + exit +fi + +# Check if $3 is 'cuda' or 'hip' +if [ "$3" != "cuda" ] && [ "$3" != "hip" ]; then + echo "Error: Argument 3 must be 'cuda' or 'hip'." + usage +fi + +echo "[INFO] Neko install path: $NEKO_INSTALL_PATH" +echo "[INFO] GPU backend : $which_gpu" +echo "[INFO] User source path : $src_path" +echo + +# First, copy makeneko to a dummy one +cp "${NEKO_INSTALL_PATH}/bin/makeneko" dummy_makeneko + +# Add relevant flag depending on CUDA or HIP +if [ "${which_gpu}" == "cuda" ]; then + HAVE_CUDA=$(grep "HAVE_CUDA_BCKND=" dummy_makeneko | cut -d'=' -f2) + ADD_CUSTOM_DEF="-DHAVE_CUDA=${HAVE_CUDA}" +else + HAVE_HIP=$(grep "HAVE_HIP_BCKND=" dummy_makeneko | cut -d'=' -f2) + ADD_CUSTOM_DEF="-DHAVE_HIP=${HAVE_HIP}" +fi + +# Modify the dummy makeneko and add the relevant variables HAVE_CUDA +# and HAVE_HIP to the FCFLAGS +FCFLAGS_CURRENT=$(grep "FCFLAGS=" dummy_makeneko | cut -d"'" -f2) +FCFLAGS_NEW="${FCFLAGS_CURRENT} ${ADD_CUSTOM_DEF}" + +sed -i "s|^FCFLAGS=.*|FCFLAGS='${FCFLAGS_NEW}'|g" dummy_makeneko + +# Set the correct files to compile +backend_path_gpu="${src_path}/bcknd/device" +backend_path_cpu="${src_path}/bcknd/cpu" + +backend_cpu="$backend_path_cpu/opr_fst_cpu.f90" + +if [ "${which_gpu}" == "cuda" ]; then + backend_device="$backend_path_gpu/cuda/opr_fst.cu" +else + backend_device="$backend_path_gpu/hip/opr_fst.hip" +fi + +backend_interface="$backend_path_gpu/opr_fst_device.F90" + +backend="$backend_device $backend_cpu $backend_interface" +interface="${src_path}/fst_operator.f90" +fst_core="${src_path}/FST-core/0*" +driver="${src_path}/drivers/0*" + +# Put here any extra files to compile +extras="${src_path}/extras/0*" + +echo $NEKO_INSTALL_PATH/bin/makeneko $backend $interface $fst_core $driver $extras $1 +./dummy_makeneko $backend $interface $fst_core $driver $extras $1 + +rm dummy_makeneko diff --git a/FST/src/FST-core/06_FST.f90 b/FST/src/FST-core/06_FST.f90 index a03333c..552fda8 100644 --- a/FST/src/FST-core/06_FST.f90 +++ b/FST/src/FST-core/06_FST.f90 @@ -145,6 +145,7 @@ subroutine FST_init_common(this, & integer :: seed_ = -143 if (present(seed)) seed_ = seed + this%seed = seed_ this%periodic_x = periodic_x this%periodic_y = periodic_y From e9cfdef9feb8db18e3634453f231802d9a2c49e0 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 20 Apr 2026 14:45:30 +0200 Subject: [PATCH 39/41] changes --- .gitignore | 1 + FST/src/makeneko_cpu | 32 ++++++++++++++++++++++++++ FST/src/test.py | 54 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100755 FST/src/makeneko_cpu create mode 100644 FST/src/test.py diff --git a/.gitignore b/.gitignore index c218d6c..3a9522e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ FST/example/fort.0 FST/example/neko FST/example/usr_driver.f90 tripping/neko +FST/src/generate_FST diff --git a/FST/src/makeneko_cpu b/FST/src/makeneko_cpu new file mode 100755 index 0000000..85f52f6 --- /dev/null +++ b/FST/src/makeneko_cpu @@ -0,0 +1,32 @@ +#!/bin/bash + +usage() { + + echo "Usage" + echo "./makeneko_cpu " + echo "" + echo "Example" + echo "./makeneko_cpu swept-wing.f90 /cfs/klemming/scratch/y/ycl/Neko/neko ./src" + +} + +# Check if exactly 4 arguments are given +if [ "$#" -ne 3 ]; then + echo "Error: Exactly 4 arguments are required." + usage + exit +fi + +NEKO_INSTALL_PATH=${2} +src_path=${3} + +backend="${src_path}/bcknd/cpu/opr_fst_cpu.f90 ${src_path}/bcknd/device/opr_fst_device.F90" +interface="${src_path}/fst_operator.f90" +fst_core="${src_path}/FST-core/0*" +driver="${src_path}/drivers/0*" + +#$MAKENEKO_PATH=$NEKO_INSTALL_PATH/bin +MAKENEKO_PATH="." + +echo $MAKENEKO_PATH/makeneko $backend $interface $fst_core $driver $1 +$MAKENEKO_PATH/makeneko $backend $interface $fst_core $driver $1 diff --git a/FST/src/test.py b/FST/src/test.py new file mode 100644 index 0000000..5cf05c5 --- /dev/null +++ b/FST/src/test.py @@ -0,0 +1,54 @@ +import numpy as np + +def S(x): + if (x <= 0.0): + return 0.0 + elif (x >= 1.0): + return 1.0 + else: + return 1.0 / ( 1.0 + np.exp( 1.0/(x-1.0) + 1.0/x )) + +def fringe(x, xs, xe, xmin, xmax, dr, df): + if (x < xmin): return 0.0 + elif (x > xmax): return 0.0 + else: + return S((x - xs)/dr) - S((x-xe)/df + 1.0) + +xmin =-0.1 +xmax = 0.1 +alpha= 0.15 + +#xs =-0.075 +xe = xmax +xs =xmin +#xe = 0.075 +dr = (xmax-xmin)*alpha +df = dr + +x = np.linspace(xmin, xmax, 501) +y = np.zeros_like(x) + +for i in range(len(x)): + y[i] = fringe(x[i], xs, xe, xmin, xmax, dr, df) + +import matplotlib.pyplot as plt + +def line(x): + plt.plot([x,x], [0.0, 1.2], "k--", alpha=0.5) + +plt.plot(x,y) +plt.xlim(xmin, xmax) +plt.ylim(0.0,1.1) +plt.xlabel("u") +plt.ylabel(r"$\lambda_u$") +plt.xticks([xmin, xs, xs+dr, xe-df, xe, xmax], [r"$u_{min}$", r"$u_{start}$", r"$u_{start}+\delta_{rise}$", r"$u_{end} - \delta_{fall}$", r"$u_{end}$", r"$u_{max}$"]) +line(xmin) +line(xmax) +line(xs) +line(xs+dr) +line(xe) +line(xe-df) +line(xmax) +plt.tight_layout() +plt.savefig("fringe.png") +plt.show() From a27768d650efd78f728702e9f7bf168347f4fd24 Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 20 Apr 2026 14:45:44 +0200 Subject: [PATCH 40/41] add a generate_FST test file --- FST/src/generate_FST.f90 | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 FST/src/generate_FST.f90 diff --git a/FST/src/generate_FST.f90 b/FST/src/generate_FST.f90 new file mode 100644 index 0000000..f044f8a --- /dev/null +++ b/FST/src/generate_FST.f90 @@ -0,0 +1,62 @@ +program generate_FST + use num_types, only: rp + use turbu, only: make_turbu + use global_params, only: kstart, kend, Npmax, Nshells + use utils, only: NEKO_FNAME_LEN, neko_error + use neko, only: neko_init, neko_finalize + implicit none + + integer :: seed, argc, stat + character(len=NEKO_FNAME_LEN) :: inputchar, output_dir + real(kind=rp) :: dx, dy, dz + + call neko_init + + ! + ! Read arguments + ! + argc = command_argument_count() + + if ((argc .lt. 2) .or. (argc .gt. 2)) then + write(*,*) 'Usage: ./generate_FST seed output_dir' + write(*,*) 'Example command: ./generate_FST -143 my/output/dir' + stop + end if + + call get_command_argument(1, inputchar) + read(inputchar, *) seed + call get_command_argument(2, output_dir) + !read(inputchar, *) output_dir + + ! + ! Build output directory + ! + + ! First stage: seed + ! write(output_dir,'(A)') "generated_fst_files/seed_" + ! if (seed < 0) write (output_dir, '(A,A)') trim(output_dir), 'm' + ! write (output_dir, '(A,I0)') trim(output_dir), abs(seed) + + ! ! Second stage: parameters + ! write(output_dir, '(A,A,g0,A,g0,A,I0,A,I0)') trim(output_dir), "_ks_", & + ! kstart, "_ke_", kend, "_Ns_", Nshells, "_Np_", Npmax + + write (*,*) "Output directory: ", trim(output_dir) + + ! Create output directory + call execute_command_line('mkdir -p ' // trim(output_dir), exitstat=stat) + if (stat /= 0) call neko_error("Failed to create directory" // & + trim(output_dir)) + + ! + ! Generate the FST + ! + dx = 0.79994602501392365_rp + dy = 0.40000000596046448_rp + dz = 0.15000000596046453_rp + call make_turbu(.false., .false., .true., seed, trim(output_dir), dx=dx, & + dy=dy, dz=dz) + + call neko_finalize + +end program generate_FST From ca5cf42868659aadcd9c5b552f31ee8da7c187fb Mon Sep 17 00:00:00 2001 From: Victor Baconnet Date: Mon, 20 Apr 2026 15:06:08 +0200 Subject: [PATCH 41/41] change path --- FST/README.md | 20 ++++++++++++++++++++ FST/src/drivers/01_fst_bc_driver.f90 | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/FST/README.md b/FST/README.md index 239ea98..5b02b93 100644 --- a/FST/README.md +++ b/FST/README.md @@ -22,6 +22,7 @@ requires the use of the `user_velocity` boundary condition on the desired bounda The driver module uses some parameters that should be given in the case file. Below is the JSON object taken from `example/run.case` that shows which parameters to use: +With file regeneration: ```.json "FST": { "enabled": true, // default is true @@ -32,10 +33,29 @@ The driver module uses some parameters that should be given in the case file. Be "yend": 0.01, // High bound for the fringe function (Also exists for z, if y is periodic) "periodic_z": true, // Self-explanatory. If periodic in y add "periodic_y": true "regen_files": true, // Set to true to generate wavenumbers etc. See below for further explanation + "Uinf": 1.0, // Free-stream velocity. Only read if "regen_files" is false. "fst_path": "src" // Path where the fst files should be written. +} +``` + +Without file regeneration (reuse previously written files) +```.json +"FST": { + "enabled": true, // default is true + "t_start": 0.0001, // Time at which to start applying FST + "t_ramp": 0.001, // Length of the linear ramp in time + "alpha": 0.2, // see below for full explanation of what this is + "ystart": -0.01, // Lower bound for the fringe function (Also exists for z, if y is periodic) + "yend": 0.01, // High bound for the fringe function (Also exists for z, if y is periodic) + "periodic_z": true, // Self-explanatory. If periodic in y add "periodic_y": true + "regen_files": false, // Set to true to generate wavenumbers etc. See below for further explanation "Uinf": 1.0, // Free-stream velocity. Only read if "regen_files" is false. + "fst_path": "src" // Path to the fst files from which to read. } ``` +@note That `fst_path` is interpreted differently based on the value of +`regen_files`. + ### FST generation In the original implementation, FST wavenumbers and amplitudes are generated diff --git a/FST/src/drivers/01_fst_bc_driver.f90 b/FST/src/drivers/01_fst_bc_driver.f90 index 96de45f..4706412 100644 --- a/FST/src/drivers/01_fst_bc_driver.f90 +++ b/FST/src/drivers/01_fst_bc_driver.f90 @@ -151,7 +151,7 @@ subroutine fst_bc_driver_initialize(t, u, v, w, p, coef, params) call json_get(params, "case.FST.regen_files", REGEN) if (.not. REGEN) call json_get(params, "case.FST.Uinf", UINF) - call json_get_or_default(params, 'case.FST.read_path', PATH, ".") + call json_get_or_default(params, 'case.FST.fst_path', PATH, ".") ! Initialize the fst parameters call FST_OBJ%init_bc(zmin, zmax, zstart, zend, &