YetAnotherCoupler 3.2.0_a
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 return 1.0;
41}
42
43double yac_test_gulfstream(double lon, double lat) {
44
45 // Analytical Gulf Stream
46 double gf_coef = 1.0; // Coefficient for Gulf Stream term (0.0 = no Gulf Stream)
47 double gf_ori_lon = -80.0 * YAC_RAD; // Origin of the Gulf Stream
48 double gf_ori_lat = 25.0 * YAC_RAD; // Origin of the Gulf Stream
49 double gf_end_lon = -1.8 * YAC_RAD; // End point of the Gulf Stream
50 double gf_end_lat = 50.0 * YAC_RAD; // End point of the Gulf Stream
51 double gf_dmp_lon = -25.5 * YAC_RAD; // Point of the Gulf Stream decrease
52 double gf_dmp_lat = 55.5 * YAC_RAD; // Point of the Gulf Stream decrease
53
54 double dr0 = sqrt(pow(gf_end_lon - gf_ori_lon, 2.0) +
55 pow(gf_end_lat - gf_ori_lat, 2.0));
56 double dr1 = sqrt(pow(gf_dmp_lon - gf_ori_lon, 2.0) +
57 pow(gf_dmp_lat - gf_ori_lat, 2.0));
58
59 if (lon > M_PI) lon -= 2.0 * M_PI;
60 if (lon < -M_PI) lon += 2.0 * M_PI;
61
62 double dx = lon - gf_ori_lon;
63 double dy = lat - gf_ori_lat;
64 double dr = sqrt(dx * dx + dy * dy);
65 double dth = atan2(dy, dx);
66 double dc = 1.3 * gf_coef;
67 if (dr > dr0) dc = 0.0;
68 if (dr > dr1) dc = dc * cos(M_PI*0.5*(dr-dr1)/(dr0-dr1));
69 return yac_test_ana_fcos(lon, lat) +
70 (MAX(1000.0 * sin(0.4 * (0.5*dr+dth) +
71 0.007*cos(50.0*dth) + 0.37*M_PI),999.0) - 999.0) * dc;
72}
73
74double yac_test_harmonic(double lon, double lat) {
75 return 2.0 + pow(sin(2.0 * lat), 16.0) * cos(16.0 * lon);
76}
77
78double yac_test_vortex(double lon, double lat) {
79 double dLon0 = 5.5;
80 double dLat0 = 0.2;
81 double dR0 = 3.0;
82 double dD = 5.0;
83 double dT = 6.0;
84
85 double dSinC = sin(dLat0);
86 double dCosC = cos(dLat0);
87
88 // Find the rotated longitude and latitude of a point on a sphere
89 // with pole at (dLon0, dLat0).
90 double dCosT = cos(lat);
91 double dSinT = sin(lat);
92
93 double dTrm = dCosT * cos(lon - dLon0);
94 double dX = dSinC * dTrm - dCosC * dSinT;
95 double dY = dCosT * sin(lon - dLon0);
96 double dZ = dSinC * dSinT + dCosC * dTrm;
97
98 double dlon = atan2(dY, dX);
99 if(dlon < 0.0) dlon = dlon + 2.0 * M_PI;
100 double dlat = asin(dZ);
101
102 double dRho = dR0 * cos(dlat);
103 double dVt = 3.0 * sqrt(3.0)/2.0/cosh(dRho)/cosh(dRho)*tanh(dRho);
104 double dOmega = (dRho == 0.0)?0.0:dVt/dRho;
105
106 return 2.0 * (1.0 + tanh(dRho / dD * sin(dlon - dOmega * dT)));
107}
108
109#endif // TEST_FUNCTION
110
#define YAC_RAD
Definition geometry.h:30
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)