47 n_x, n_y, n_z, nu, rho_w, h, tau_x, tau_y, tau_z, n_nodes, lx, nelv, &
49 integer,
intent(in) :: n_nodes, lx, nelv, tstep
50 real(kind=
rp),
dimension(lx, lx, lx, nelv),
intent(in) :: u, v, w
51 real(kind=
rp),
dimension(n_nodes),
intent(in) :: rho_w
52 integer,
intent(in),
dimension(n_nodes) :: ind_r, ind_s, ind_t, ind_e
53 real(kind=
rp),
dimension(n_nodes),
intent(in) :: n_x, n_y, n_z, h, nu
54 real(kind=
rp),
dimension(n_nodes),
intent(inout) :: tau_x, tau_y, tau_z
55 real(kind=
rp),
intent(in) :: kappa, b
57 real(kind=
rp) :: ui, vi, wi, magu, utau, normu, guess, rho
61 ui = u(ind_r(i), ind_s(i), ind_t(i), ind_e(i))
62 vi = v(ind_r(i), ind_s(i), ind_t(i), ind_e(i))
63 wi = w(ind_r(i), ind_s(i), ind_t(i), ind_e(i))
67 normu = ui * n_x(i) + vi * n_y(i) + wi * n_z(i)
69 ui = ui - normu * n_x(i)
70 vi = vi - normu * n_y(i)
71 wi = wi - normu * n_z(i)
73 magu = sqrt(ui**2 + vi**2 + wi**2)
76 if (tstep .eq. 1)
then
77 guess = sqrt(magu * nu(i) / h(i))
79 guess = tau_x(i)**2 + tau_y(i)**2 + tau_z(i)**2
80 guess = sqrt(sqrt(guess))
83 utau =
solve_cpu(magu, h(i), guess, nu(i), kappa, b)
86 tau_x(i) = -rho*utau**2 * ui / magu
87 tau_y(i) = -rho*utau**2 * vi / magu
88 tau_z(i) = -rho*utau**2 * wi / magu
100 function solve_cpu(u, y, guess, nu, kappa, B)
result(utau)
101 real(kind=
rp),
intent(in) :: u
102 real(kind=
rp),
intent(in) :: y
103 real(kind=
rp),
intent(in) :: guess
104 real(kind=
rp),
intent(in) :: nu, kappa, b
105 real(kind=
rp) :: yp, up, utau
106 real(kind=
rp) :: error, f, df, old
107 integer :: niter, k, maxiter
108 character(len=LOG_SIZE) :: log_msg
121 f = (up + exp(-kappa*b)* &
122 (exp(kappa*up) - 1.0_rp - kappa*up - 0.5_rp*(kappa*up)**2 - &
123 1.0_rp/6*(kappa*up)**3) - yp)
125 df = (-y / nu - u/utau**2 - kappa*up/utau*exp(-kappa*b) * &
126 (exp(kappa*up) - 1 - kappa*up - 0.5*(kappa*up)**2))
131 error = abs((old - utau)/old)
133 if (error < 1e-3)
then
139 if (niter .eq. maxiter)
then
140 write(log_msg, *)
"Newton not converged", error, f, utau, old, guess
subroutine, public spalding_compute_cpu(u, v, w, ind_r, ind_s, ind_t, ind_e, n_x, n_y, n_z, nu, rho_w, h, tau_x, tau_y, tau_z, n_nodes, lx, nelv, kappa, b, tstep)
Compute the wall shear stress on cpu using Spalding's model.
real(kind=rp) function solve_cpu(u, y, guess, nu, kappa, b)
Newton solver for the algebraic equation defined by the law on cpu.