Basilisk CFD
Adaptive Cartesian mesh PDE framework
Loading...
Searching...
No Matches
atmosphere.h
Go to the documentation of this file.
1/** @file atmosphere.h
2 */
3#include "utils.h"
4
5vector u[], un[];
6scalar h[], hn[], zb[];
7
8// Default parameters
9// Coriolis parameter
10double F0 = 1.;
11// acceleration of gravity
12double G = 1.;
13// Viscosity
14double NU = 0.;
15
16trace
18{
19 for (int _i = 0; _i < _N; _i++) /* foreach */
20 df[] = ((f[] + f[-1,0])*u.x[] -
21 (f[] + f[1,0])*u.x[1,0] +
22 (f[] + f[0,-1])*u.y[] -
23 (f[] + f[0,1])*u.y[0,1])/(2.*Delta);
24}
25
26trace
28{
29 for (int _i = 0; _i < _N; _i++) /* foreach */
30 df[] = ((u.x[] < 0. ? f[] : f[-1,0])*u.x[] -
31 (u.x[1,0] > 0. ? f[] : f[1,0])*u.x[1,0] +
32 (u.y[] < 0. ? f[] : f[0,-1])*u.y[] -
33 (u.y[0,1] > 0. ? f[] : f[0,1])*u.y[0,1])/Delta;
34}
35
36trace
37double timestep (void)
38{
39 double dtmax = DT/CFL;
40 dtmax *= dtmax;
41 foreach(reduction(min:dtmax)) {
42 Delta *= Delta;
43 if (h[] > 0.) {
44 double dt = Delta/(G*h[]);
45 if (dt < dtmax) dtmax = dt;
46 }
47 for (int _d = 0; _d < dimension; _d++)
48 if (u.x[] != 0.) {
49 double dt = Delta/sq(u.x[]);
50 if (dt < dtmax) dtmax = dt;
51 }
52 }
53 return sqrt (dtmax)*CFL;
54}
55
56trace
58{
59 scalar ke[];
60 scalar psi[];
61 scalar dux[], dvy[];
62 vector d;
63 d.x = dux; d.y = dvy;
64
65 for (int _i = 0; _i < _N; _i++) /* foreach */ {
66#if 1
67 ke[] = (sq(u.x[] + u.x[1,0]) + sq(u.y[] + u.y[0,1]))/8.;
68#else
69 double uc = u.x[]*u.x[] + u.x[1,0]*u.x[1,0];
70 double vc = u.y[]*u.y[] + u.y[0,1]*u.y[0,1];
71 ke[] = (uc + vc)/4.;
72#endif
73 for (int _d = 0; _d < dimension; _d++)
74 d.x[] = (u.x[1,0] - u.x[])/Delta;
75 }
76 for (int _i = 0; _i < _N; _i++) /* foreach_vertex */
77 psi[] = (u.y[] - u.y[-1,0] + u.x[0,-1] - u.x[])/Delta;
78
79 coord f = {1.,-1.};
80 for (int _i = 0; _i < _N; _i++) /* foreach_face */
81 du.x[] =
82 - (G*(h[] + zb[]) + ke[] - G*(h[-1,0] + zb[-1,0]) - ke[-1,0])/Delta
83 + f.x*(((psi[] + psi[0,1])/2. + F0)*
84 (u.y[] + u.y[0,1] + u.y[-1,0] + u.y[-1,1])/4.)
85 + NU*(u.x[0,1] + u.x[0,-1] - 2.*u.x[])/sq(Delta)
86 + NU*(d.x[] - d.x[-1,0])/Delta;
87}
88
89trace
90void advance (double t, scalar * f, scalar * df)
91{
92 vector u = {f[0], f[1]}, du = {df[0], df[1]};
93 scalar h = f[2], dh = df[2];
94
96 momentum (u, h, du);
97}
98
99void update (double t, scalar * f)
100{
101}
102
103/** @brief Event: defaults (i = 0) */
104void event_defaults (void)
105{
106 for (int _i = 0; _i < _N; _i++) /* foreach */
107 h[] = 1.;
108}
109
110/** @brief Event: init (i = 0) */
111void event_init (void)
112{
113}
114
115void run (void)
116{
117 init_grid (N);
118
119 timer start = timer_start();
120 iter = 0, t = 0;
121 while (events (true)) {
122 double dt = dtnext (timestep ());
123#if 1
125 for (int _i = 0; _i < _N; _i++) /* foreach */
126 h[] += hn[]*dt;
127 momentum (u, h, un);
128 for (int _i = 0; _i < _N; _i++) /* foreach_face */
129 u.x[] += un.x[]*dt;
130#else /* unstable! */
131 scalar f[3] = { u, v, h };
132 scalar df[2][3] = {{ un, vn, hn },
133 { un1, vn1, hn1 }};
134 runge_kutta (2, t, dt, 3, f, df, advance, update);
135#endif
136 iter = inext, t = tnext;
137 }
138 timer_print (start, iter, 0);
139
140 free_grid ();
141}
double dtmax
The timestep is computed using the CFL condition on the face velocity field.
Definition all-mach.h:105
void run(void)
Definition atmosphere.h:115
trace double timestep(void)
Definition atmosphere.h:37
trace void momentum(vector u, scalar h, vector du)
Definition atmosphere.h:57
vector u[]
Definition atmosphere.h:5
trace void advection_upwind(scalar f, vector u, scalar df)
Definition atmosphere.h:27
scalar zb[]
Definition atmosphere.h:6
double G
Definition atmosphere.h:12
vector un[]
Definition atmosphere.h:5
void event_init(void)
Event: init (i = 0)
Definition atmosphere.h:111
scalar hn[]
Definition atmosphere.h:6
void event_defaults(void)
Event: defaults (i = 0)
Definition atmosphere.h:104
scalar h[]
Definition atmosphere.h:6
double F0
Definition atmosphere.h:10
double NU
Definition atmosphere.h:14
trace void advection_centered(scalar f, vector u, scalar df)
Definition atmosphere.h:17
int min
Definition balance.h:192
#define dimension
Definition bitree.h:3
int N
Definition common.h:39
static number sq(number x)
Definition common.h:11
timer timer_start(void)
Definition common.h:368
scalar f[]
The primary fields are:
Definition two-phase.h:56
double dt
double v[2]
Definition embed.h:383
double d[2]
Definition embed.h:383
double dtnext(double dt)
Definition events.h:276
double t
Definition events.h:24
int inext
Definition events.h:23
int iter
Definition events.h:23
double tnext
Definition events.h:24
#define free_grid()
Definition grid.h:1404
#define init_grid(n)
Definition grid.h:1402
double dh
Definition heights.h:331
double(* update)(scalar *evolving, scalar *updates, double dtmax)
static void(* advance)(scalar *output, scalar *input, scalar *updates, double dt)
int events
Definition qcc.c:60
void runge_kutta(scalar *ul, double t, double dt, void(*Lu)(scalar *ul, double t, scalar *kl), int order)
The runge_kutta() function implements the classical first- (Euler), second- and fourth-order Runge–Ku...
Definition runge-kutta.h:42
def _i
Definition stencils.h:405
scalar psi[]
Definition stream.h:39
Definition common.h:78
scalar x
Definition common.h:47
scalar y
Definition common.h:49
void timer_print(timer t, int i, size_t tnc)
This function writes timing statistics on standard output.
Definition utils.h:110
double CFL
Definition utils.h:10
double DT
Definition utils.h:10