47 n_x, n_y, n_z, nu, 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 integer,
intent(in),
dimension(n_nodes) :: ind_r, ind_s, ind_t, ind_e
52 real(kind=
rp),
dimension(n_nodes),
intent(in) :: n_x, n_y, n_z, h, nu
53 real(kind=
rp),
dimension(n_nodes),
intent(inout) :: tau_x, tau_y, tau_z
54 real(kind=
rp),
intent(in) :: kappa, b
56 real(kind=
rp) :: ui, vi, wi, magu, utau, normu, guess
60 ui = u(ind_r(i), ind_s(i), ind_t(i), ind_e(i))
61 vi = v(ind_r(i), ind_s(i), ind_t(i), ind_e(i))
62 wi = w(ind_r(i), ind_s(i), ind_t(i), ind_e(i))
65 normu = ui * n_x(i) + vi * n_y(i) + wi * n_z(i)
67 ui = ui - normu * n_x(i)
68 vi = vi - normu * n_y(i)
69 wi = wi - normu * n_z(i)
71 magu = sqrt(ui**2 + vi**2 + wi**2)
74 if (tstep .eq. 1)
then
75 guess = sqrt(magu * nu(i) / h(i))
77 guess = tau_x(i)**2 + tau_y(i)**2 + tau_z(i)**2
78 guess = sqrt(sqrt(guess))
81 utau =
solve_cpu(magu, h(i), guess, nu(i), kappa, b)
84 tau_x(i) = -utau**2 * ui / magu
85 tau_y(i) = -utau**2 * vi / magu
86 tau_z(i) = -utau**2 * wi / magu
98 function solve_cpu(u, y, guess, nu, kappa, B)
result(utau)
99 real(kind=
rp),
intent(in) :: u
100 real(kind=
rp),
intent(in) :: y
101 real(kind=
rp),
intent(in) :: guess
102 real(kind=
rp),
intent(in) :: nu, kappa, b
103 real(kind=
rp) :: yp, up, utau
104 real(kind=
rp) :: error, f, df, old
105 integer :: niter, k, maxiter
106 character(len=LOG_SIZE) :: log_msg
119 f = (up + exp(-kappa*b)* &
120 (exp(kappa*up) - 1.0_rp - kappa*up - 0.5_rp*(kappa*up)**2 - &
121 1.0_rp/6*(kappa*up)**3) - yp)
123 df = (-y / nu - u/utau**2 - kappa*up/utau*exp(-kappa*b) * &
124 (exp(kappa*up) - 1 - kappa*up - 0.5*(kappa*up)**2))
129 error = abs((old - utau)/old)
131 if (error < 1e-3)
then
137 if (niter .eq. maxiter)
then
138 write(log_msg, *)
"Newton not converged", error, f, utau, old, guess
real(kind=rp) function solve_cpu(u, y, guess, nu, kappa, b)
Newton solver for the algebraic equation defined by the law on cpu.
subroutine, public spalding_compute_cpu(u, v, w, ind_r, ind_s, ind_t, ind_e, n_x, n_y, n_z, nu, 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.