-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcornerflow.c
More file actions
140 lines (128 loc) · 4.19 KB
/
Copy pathcornerflow.c
File metadata and controls
140 lines (128 loc) · 4.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "fstrack.h"
#include <math.h>
/*
refer to McKenzie (GJRAS, 58, 689, 1979) Table 1 for the
definitions of the parameters
we refer to vr or vx as vel, and modes 0,1,2,3 refer
to BC types (a), (b), (c), (d)
by default, mode=0, vel=1, alpha=90
typos have been corrected
$Id: cornerflow.c,v 1.3 2010/12/31 18:59:17 becker Exp $
*/
//
// obtain constants
//
//
void calc_cornerflow_constants(int mode, COMP_PRECISION vel,
COMP_PRECISION alpha, /* radians */
COMP_PRECISION *a, COMP_PRECISION *b,
COMP_PRECISION *c, COMP_PRECISION *d,
char **argv)
{
COMP_PRECISION cosa,sina;
sincos(alpha,&sina,&cosa);
switch(mode){
//
// listed are the BCs for boundary one and two as in Table 1
// NOTE: the D coefficient for (c) should be -vr..., there's a typo
// in the original Table which has been corrected below
//
case 0:// s_rt = 0; v = vx
*a = (2.0 * vel * cosa*cosa)/ (2.0 * alpha - sin(2.0*alpha));
*b = 0.0;
*c = 0.0;
*d= -(2.0 * vel)/ (2.0 * alpha - sin(2.0*alpha));
break;
case 1:// s_rt = 0; v = vr;
*a = (2.0 * vel * alpha * cosa)/(2.0 * alpha - sin(2.0*alpha));
*b = 0.0;
*c = 0.0;
*d= -(2.0 * vel )/ (2.0 * alpha - sin(2.0*alpha));
break;
case 2:// v = 0; v = vr;
*a = (vel * alpha * sina)/(alpha*alpha - sina*sina);
*b = 0.0;
*c = (vel*(alpha * cosa - sina))/(alpha * alpha - sina * sina);
*d = (vel * alpha * sina) / (alpha * alpha - sina * sina);
break;
case 3:// v = vr; v = -vr;
*a = (vel * alpha)/(alpha + sina);
*b = 0.0;
*c = (-vel*(1.0+ cosa))/(alpha + sina);
*d = (vel * sina) /(alpha + sina);
break;
default:
fprintf(stderr,"%s: cornerflow: error: mode %i undefined\n",argv[0],mode);
exit(-1);
break;
}
}
COMP_PRECISION corner_theta(COMP_PRECISION theta,
COMP_PRECISION a, COMP_PRECISION b,
COMP_PRECISION c, COMP_PRECISION d,
COMP_PRECISION sint, COMP_PRECISION cost)
{
return a * sint + b * cost + c * theta * sint + d * theta * cost;
}
COMP_PRECISION corner_theta_dt(COMP_PRECISION theta,
COMP_PRECISION a, COMP_PRECISION b,
COMP_PRECISION c, COMP_PRECISION d,
COMP_PRECISION sint, COMP_PRECISION cost)
{
return a * cost - b * sint + c * (sint + theta * cost) + d * (cost - theta*sint);
}
//
// obtain stream function at xcyl given a,b,c,d
COMP_PRECISION stream(COMP_PRECISION *xcyl,
COMP_PRECISION a, COMP_PRECISION b, COMP_PRECISION c,
COMP_PRECISION d)
{
COMP_PRECISION sint,cost,theta;
theta = xcyl[FSTRACK_THETA];
sincos(theta,&sint,&cost);
return xcyl[FSTRACK_R] * corner_theta(theta,a,b,c,d,sint,cost);
}
//
// obtain velocity at cylidrical coordinates xcyl given constants a,b,c,d
// returns veccyl
//
void cylvel(COMP_PRECISION *xcyl, COMP_PRECISION *veccyl,
COMP_PRECISION a,COMP_PRECISION b, COMP_PRECISION c,
COMP_PRECISION d)
{
COMP_PRECISION cost,sint,theta;
theta = xcyl[FSTRACK_THETA];
sincos(theta,&sint,&cost);
veccyl[FSTRACK_R] = corner_theta_dt(theta,a,b,c,d,sint,cost);
veccyl[FSTRACK_THETA] = -corner_theta( theta,a,b,c,d,sint,cost);
}
// convert from cylindrical to cartesian coordiates
void cyl2cart(COMP_PRECISION *xcyl, COMP_PRECISION *xcart)
{
COMP_PRECISION cost,sint,theta;
theta = xcyl[FSTRACK_THETA];
sincos(theta,&sint,&cost);
xcart[FSTRACK_X] = sint * xcyl[FSTRACK_R];
xcart[FSTRACK_Y] = -cost * xcyl[FSTRACK_R];
}
// convert from cartesian to cylindrical coordinates
void cart2cyl(COMP_PRECISION *xcart, COMP_PRECISION *xcyl)
{
xcyl[FSTRACK_THETA] = atan2(xcart[FSTRACK_X],-xcart[FSTRACK_Y]);
xcyl[FSTRACK_R] = hypot(xcart[FSTRACK_X],xcart[FSTRACK_Y]);
}
// convert from cylindrical vector vcyl at cylindrical coords xcyl to
// cartesian vector
void cylvec2cartvec(COMP_PRECISION *xcyl, COMP_PRECISION *vcyl,
COMP_PRECISION *vcart)
{
COMP_PRECISION sint,cost,theta;
theta = xcyl[FSTRACK_THETA];
sincos(theta,&sint,&cost);
/*
e_r = {sin(theta), -cos(theta)}
e_theta = {cos(theta), sin(theta)}
*/
vcart[FSTRACK_X] = sint * vcyl[FSTRACK_R] + cost * vcyl[FSTRACK_THETA];
vcart[FSTRACK_Y] = -cost * vcyl[FSTRACK_R] + sint * vcyl[FSTRACK_THETA];
}