Basilisk CFD
Adaptive Cartesian mesh PDE framework
Loading...
Searching...
No Matches
terrain.h
Go to the documentation of this file.
1/** @file terrain.h
2 */
3#include <stdarg.h>
4#include <kdt/kdt.h>
5#pragma autolink -L$BASILISK/kdt -lkdt
6
7#if _OPENMP
8# define NPROC omp_get_max_threads()
9# define PROC tid()
10#else
11# define NPROC 1
12# define PROC 0
13#endif
14
16 void ** kdt;
18}
19
21{
22 Delta_x /= 2.; Delta_y /= 2.;
23 return (rect[0].l >= x - Delta_x && rect[0].h <= x + Delta_x &&
24 rect[1].l >= y - Delta_y && rect[1].h <= y + Delta_y);
25}
26
27static int includes (KdtRect rect, Point * p)
28{
29 return includes_point (rect, *p);
30}
31
33{
34 Delta_x /= 2.; Delta_y /= 2.;
35 return (rect[0].l <= x + Delta_x && rect[0].h >= x - Delta_x &&
36 rect[1].l <= y + Delta_y && rect[1].h >= y - Delta_y);
37}
38
39static int intersects (KdtRect rect, Point * p)
40{
41 return intersects_point (rect, *p);
42}
43
44#if MULTIGRID
46{
47 KdtSum s;
48 kdt_sum_init (&s);
49 Delta_x /= 2.; Delta_y /= 2.;
50 KdtRect rect = {{x - Delta_x, x + Delta_x},
51 {y - Delta_y, y + Delta_y}};
52 for (Kdt ** kdt = (Kdt **) zb.kdt[PROC]; *kdt; kdt++)
56 rect, &s);
57 scalar n = zb.nt, dmin = zb.dmin, dmax = zb.dmax;
58 n[] = s.n;
59 if (s.w > 0.) {
60 zb[] = s.H0/s.w;
61 dmin[] = s.Hmin;
62 dmax[] = s.Hmax;
63 }
64 else {
65 /* not enough points in database, use bilinear interpolation
66 from coarser level instead */
67 if (level > 0)
68 zb[] = (9.*coarse(zb,0,0) +
69 3.*(coarse(zb,child.x,0) + coarse(zb,0,child.y)) +
70 coarse(zb,child.x,child.y))/16.;
71 else
72 zb[] = 0.; // no points at level 0!
73 dmin[] = nodata;
74 dmax[] = nodata;
75 }
76}
77
79{
80 for (int _c = 0; _c < 4; _c++) /* foreach_child */
82}
83#endif // MULTIGRID
84
86{
87 if (!zb.kdt)
88 return;
89 for (int i = 0; i < NPROC; i++) {
90 for (Kdt ** kdt = (Kdt **) zb.kdt[i]; *kdt; kdt++)
92 free (zb.kdt[i]);
93 }
94 free (zb.kdt);
95 zb.kdt = NULL;
96}
97
98@define CHARP char * // fixme: workaround for va_arg macro
99
100trace
101void terrain (scalar zb, ...)
102{
103 zb.kdt = qcalloc (NPROC, void *);
104 zb.delete = delete_terrain;
105
106 int nt = 0;
107 va_list ap;
108 va_start (ap, zb);
109 char * name;
110 while ((name = va_arg (ap, CHARP))) {
111 for (int i = 0; i < NPROC; i++) {
112 Kdt ** kdt = (Kdt **) zb.kdt[i];
113 zb.kdt[i] = qrealloc (kdt, nt + 2, Kdt *);
114 kdt[nt] = kdt_new();
115 kdt[nt + 1] = NULL;
116 char * fname = name;
117 if (name[0] == '~') {
118 char * home = getenv ("HOME");
119 if (home != NULL) {
120 fname = malloc(sizeof(char)*(strlen(home) + strlen(name)));
121 strcpy (fname, home);
122 strcat (fname, name + 1);
123 }
124 }
125 if (kdt_open (kdt[nt], fname)) {
126 fprintf (stderr, "terrain: could not open terrain database '%s'\n",
127 fname);
128 exit (1);
129 }
130 if (fname != name)
131 free (fname);
132 }
133 nt++;
134 }
135 va_end (ap);
136
137 scalar n = {0} /* new scalar */;
138 scalar dmin = {0} /* new scalar */;
139 scalar dmax = {0} /* new scalar */;
140 zb.nt = n;
141 zb.dmin = dmin;
142 zb.dmax = dmax;
143
144#if TREE
145 zb.refine = refine_terrain;
146 n.refine = no_restriction;
147 n.restriction = no_restriction;
148 dmin.refine = no_restriction;
149 dmin.restriction = no_restriction;
150 dmax.refine = no_restriction;
151 dmax.restriction = no_restriction;
152#endif
153
154 /* trash: zb */;
155#if MULTIGRID && !_GPU
156 for (int l = 0; l <= depth(); l++) {
157 for (int _l = 0; _l < l; _l++)
159 boundary_level ({zb}, l);
160 }
161#else
162 foreach (cpu) {
163 KdtSum s;
164 int niter = 8;
165 do {
166 kdt_sum_init (&s);
167 KdtRect rect = {{x - Delta_x/2., x + Delta_x/2.},
168 {y - Delta_y/2., y + Delta_y/2.}};
169 for (Kdt ** kdt = (Kdt **) zb.kdt[PROC]; *kdt; kdt++)
173 rect, &s);
174 Delta_x *= 2., Delta_y *= 2.;
175 } while (!s.w && niter--);
176 scalar n = zb.nt, dmin = zb.dmin, dmax = zb.dmax;
177 n[] = s.n;
178 if (s.w > 0.) {
179 zb[] = s.H0/s.w;
180 dmin[] = s.Hmin;
181 dmax[] = s.Hmax;
182 }
183 else {
184 zb[] = 0.;
185 dmin[] = nodata;
186 dmax[] = nodata;
187 }
188 }
189#endif
190#if !TREE
192#endif
193}
scalar zb[]
Definition atmosphere.h:6
scalar h[]
Definition atmosphere.h:6
void(* boundary_level)(scalar *, int l)
define l
free(list1)
int y
Definition common.h:76
#define define
int x
Definition common.h:76
#define nodata
Definition common.h:7
#define p
Definition tree.h:320
#define qcalloc(size, type)
Point point
Definition conserving.h:86
else return n
Definition curvature.h:101
scalar s
Definition embed-tree.h:56
scalar int i
Definition embed.h:74
static char * fname
Definition errors.c:753
#define depth()
Definition cartesian.h:14
void kdt_sum_init(KdtSum *s)
Definition kdt.c:1043
Kdt * kdt_new(void)
Definition kdt.c:632
long kdt_query_sum(const Kdt *kdt, KdtCheck includes, KdtCheck intersects, void *data, const KdtRect query, KdtSum *sum)
Definition kdt.c:1025
void kdt_destroy(Kdt *kdt)
Definition kdt.c:757
int kdt_open(Kdt *kdt, const char *name)
Definition kdt.c:723
int(* KdtCheck)(const KdtRect rect, void *data)
Definition kdt.h:98
KdtInterval KdtRect[2]
Definition kdt.h:40
static void no_restriction(Point point, scalar s)
int int int level
int cpu
Definition qcc.c:61
Definition kdt.h:77
Definition linear.h:21
Definition kdt.c:358
void delete_terrain(scalar zb)
Definition terrain.h:85
#define PROC
Definition terrain.h:12
static int intersects(KdtRect rect, Point *p)
Definition terrain.h:39
#define NPROC
Definition terrain.h:11
attribute
Definition terrain.h:15
scalar nt
Definition terrain.h:17
scalar dmin
Definition terrain.h:17
scalar dmax
Definition terrain.h:17
static int intersects_point(KdtRect rect, Point point)
Definition terrain.h:32
define CHARP char *trace void terrain(scalar zb,...)
Definition terrain.h:101
static int includes_point(KdtRect rect, Point point)
Definition terrain.h:20
static int includes(KdtRect rect, Point *p)
Definition terrain.h:27
define n n define coarse(a, k, p, n)((double *)(PARENT(k