YAC 3.7.1
Yet Another Coupler
Loading...
Searching...
No Matches
test_function.c
Go to the documentation of this file.
1// Copyright (c) 2024 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#ifndef TEST_FUNCTION
6#define TEST_FUNCTION
7#include <math.h>
8#include "test_function.h"
9#include "geometry.h"
10
11double yac_test_func(double lon, double lat) {
12
13 double tmp = sin(lon * 2.0);
14 return tmp * cos(lat * 3.0);
15}
16
17double yac_test_func_deg(double lon, double lat) {
18
19 return yac_test_func(lon * YAC_RAD, lat * YAC_RAD);
20}
21
22double yac_test_ana_fcos(double lon, double lat) {
23
24 double dp_length = 1.2 * M_PI;
25 double coef = 2.0;
26 double coefmult = 1.0;
27 return coefmult * (coef - cos(M_PI * acos(cos(lon)*cos(lat) )/dp_length));
28}
29
30double yac_test_ana_fcossin(double lon, double lat) {
31
32 double dp_length = 1.0 * M_PI;
33 double coef = 21.0;
34 double coefmult = 3.846 * 20.0;
35 return coefmult * (coef - cos(M_PI*(acos(cos(lon)*cos(lat))/dp_length)) *
36 sin(M_PI*(asin(sin(lon)*sin(lat))/dp_length)));
37}
38
39double yac_test_one(double lon, double lat) {
40 UNUSED(lon);
41 UNUSED(lat);
42 return 1.0;
43}
44
45double yac_test_gulfstream(double lon, double lat) {
46
47 // Analytical Gulf Stream
48 double gf_coef = 1.0; // Coefficient for Gulf Stream term (0.0 = no Gulf Stream)
49 double gf_ori_lon = -80.0 * YAC_RAD; // Origin of the Gulf Stream
50 double gf_ori_lat = 25.0 * YAC_RAD; // Origin of the Gulf Stream
51 double gf_end_lon = -1.8 * YAC_RAD; // End point of the Gulf Stream
52 double gf_end_lat = 50.0 * YAC_RAD; // End point of the Gulf Stream
53 double gf_dmp_lon = -25.5 * YAC_RAD; // Point of the Gulf Stream decrease
54 double gf_dmp_lat = 55.5 * YAC_RAD; // Point of the Gulf Stream decrease
55
56 double dr0 = sqrt(pow(gf_end_lon - gf_ori_lon, 2.0) +
57 pow(gf_end_lat - gf_ori_lat, 2.0));
58 double dr1 = sqrt(pow(gf_dmp_lon - gf_ori_lon, 2.0) +
59 pow(gf_dmp_lat - gf_ori_lat, 2.0));
60
61 if (lon > M_PI) lon -= 2.0 * M_PI;
62 if (lon < -M_PI) lon += 2.0 * M_PI;
63
64 double dx = lon - gf_ori_lon;
65 double dy = lat - gf_ori_lat;
66 double dr = sqrt(dx * dx + dy * dy);
67 double dth = atan2(dy, dx);
68 double dc = 1.3 * gf_coef;
69 if (dr > dr0) dc = 0.0;
70 if (dr > dr1) dc = dc * cos(M_PI*0.5*(dr-dr1)/(dr0-dr1));
71 return yac_test_ana_fcos(lon, lat) +
72 (MAX(1000.0 * sin(0.4 * (0.5*dr+dth) +
73 0.007*cos(50.0*dth) + 0.37*M_PI),999.0) - 999.0) * dc;
74}
75
76double yac_test_harmonic(double lon, double lat) {
77 return 2.0 + pow(sin(2.0 * lat), 16.0) * cos(16.0 * lon);
78}
79
80double yac_test_vortex(double lon, double lat) {
81 double dLon0 = 5.5;
82 double dLat0 = 0.2;
83 double dR0 = 3.0;
84 double dD = 5.0;
85 double dT = 6.0;
86
87 double dSinC = sin(dLat0);
88 double dCosC = cos(dLat0);
89
90 // Find the rotated longitude and latitude of a point on a sphere
91 // with pole at (dLon0, dLat0).
92 double dCosT = cos(lat);
93 double dSinT = sin(lat);
94
95 double dTrm = dCosT * cos(lon - dLon0);
96 double dX = dSinC * dTrm - dCosC * dSinT;
97 double dY = dCosT * sin(lon - dLon0);
98 double dZ = dSinC * dSinT + dCosC * dTrm;
99
100 double dlon = atan2(dY, dX);
101 if(dlon < 0.0) dlon = dlon + 2.0 * M_PI;
102 double dlat = asin(dZ);
103
104 double dRho = dR0 * cos(dlat);
105 double dVt = 3.0 * sqrt(3.0)/2.0/cosh(dRho)/cosh(dRho)*tanh(dRho);
106 double dOmega = (dRho == 0.0)?0.0:dVt/dRho;
107
108 return 2.0 * (1.0 + tanh(dRho / dD * sin(dlon - dOmega * dT)));
109}
110
111#endif // TEST_FUNCTION
112
#define UNUSED(x)
Definition core.h:73
#define YAC_RAD
double yac_test_one(double lon, double lat)
double yac_test_ana_fcos(double lon, double lat)
double yac_test_func_deg(double lon, double lat)
double yac_test_harmonic(double lon, double lat)
double yac_test_vortex(double lon, double lat)
double yac_test_func(double lon, double lat)
double yac_test_ana_fcossin(double lon, double lat)
double yac_test_gulfstream(double lon, double lat)
#define MAX(a, b)