EcaIndices.cc 57 KB
Newer Older
1
2
3
4
/*
  This file is part of CDO. CDO is a collection of Operators to
  manipulate and analyse Climate model Data.

Uwe Schulzweida's avatar
Uwe Schulzweida committed
5
  Copyright (C) 2006 Brockmann Consult
6
7
8
9
10
11
12
13
14
15
16
17
  See COPYING file for copying and redistribution conditions.

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; version 2 of the License.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
*/

18
// clang-format off
19
20
/*
      MODULE      OPERATOR     INDEX    DESCRIPTION
21

22
      EcaCfd      eca_cfd      CFD      maximum number of consecutive frost days
23
24
25
26
27
28
      EcaCsu      eca_csu      CSU      maximum number of consecutive summer days
      EcaCwdi     eca_cwdi     CWDI     cold wave duration index 
      EcaCwfi     eca_cwfi     CWFI     number of cold-spell days
      EcaEtr      eca_etr      ETR      intra-period extreme temperature range
      EcaFd       eca_fd       FD       number of frost days
      EcaGsl      eca_gsl      GSL      growing season length
29
30
31
32
33
      EcaHd       eca_hd       HD       heating degree days
      EcaHwdi     eca_hwdi     HWDI     heat wave duration index
      EcaHwfi     eca_hwfi     HWFI     number of warm-spell days
      EcaId       eca_id       ID       number of ice days
      EcaSu       eca_su       SU       number of summer days
34
35
36
37
38
39
40
      EcaTg10p    eca_tg10p    TG10p    percent of time TX < 10th percentile of daily mean temperature
      EcaTg90p    eca_tg90p    TG90p    percent of time TX > 90th percentile of daily mean temperature
      EcaTn10p    eca_tn10p    TN10p    percent of time TX < 10th percentile of daily minimum temperature
      EcaTn90p    eca_tn90p    TN90p    percent of time TX > 90th percentile of daily minimum temperature
      EcaTr       eca_tr       TR       number of tropical nights
      EcaTx10p    eca_tx10p    TX10p    percent of time TX < 10th percentile of daily maximum temperature
      EcaTx90p    eca_tx90p    TX90p    percent of time TX > 90th percentile of daily maximum temperature
41
42
43

      EcaCdd      eca_cdd      CDD      maximum number of consecutive dry days
      EcaCwd      eca_cwd      CWD      maximum number of consecutive wet days
44
45
46
47
48
49
50
51
52
53
54
55
      EcaR10mm    eca_r10mm    R10mm    number of days with precipitation >= 10 mm
      EcaR20mm    eca_r20mm    R20mm    number of days with precipitation >= 20 mm
      EcaR75p     eca_r75p     R75p     Percent of time RR > 75th percentile of daily precipitation amount
      EcaR75ptot  eca_r75ptot  R75pTOT  Percentage of annual total precipitation due to events with RR > 75th percentile of daily precipitation amount
      EcaR90p     eca_r90p     R90p     Percent of time RR > 90th percentile of daily precipitation amount
      EcaR90ptot  eca_r90ptot  R90pTOT  Percentage of annual total precipitation due to events with RR > 90th percentile of daily precipitation amount
      EcaR95p     eca_r95p     R95p     Percent of time RR > 95th percentile of daily precipitation amount
      EcaR95ptot  eca_r95ptot  R95pTOT  Percentage of annual total precipitation due to events with RR > 95th percentile of daily precipitation amount
      EcaR99p     eca_r99p     R99p     Percent of time RR > 75th percentile of daily precipitation amount
      EcaR99ptot  eca_r99ptot  R99pTOT  Percentage of annual total precipitation due to events with RR > 99th percentile of daily precipitation amount
      EcaRr1      eca_rr1      RR1      number of wet days
      EcaSdii     eca_sdii     SDII     simple daily intensity index
56
57

      Fdns        fdns                  frost days without surface snow
Uwe Schulzweida's avatar
Uwe Schulzweida committed
58

Uwe Schulzweida's avatar
Uwe Schulzweida committed
59
      Strwin      strwin                number of strong-wind days
60
61
62
      Strbre      strbre                number of strong-breeze days
      Strgal      strgal                number of strong-gale days
      Hurr        hurr                  number of hurricane days
63
*/
64
// clang-format on
65

66

67
#include "dmemory.h"
68
#include "process_int.h"
Oliver Heidmann's avatar
Oliver Heidmann committed
69
#include "cdo_options.h"
70
#include "param_conversion.h"
Uwe Schulzweida's avatar
Uwe Schulzweida committed
71
#include "ecacore.h"
72
#include "ecautil.h"
73
#include "util_date.h"
74

75
#define TO_DEG_CELSIUS(x) ((x) -273.15)
76
77
#define TO_KELVIN(x) ((x) + 273.15)

Uwe Schulzweida's avatar
Uwe Schulzweida committed
78
// clang-format off
79

Uwe Schulzweida's avatar
Uwe Schulzweida committed
80
81
static const char CFD_NAME[]         = "consecutive_frost_days_index_per_time_period";
static const char CFD_LONGNAME[]     = "Consecutive frost days index is the greatest number of consecutive frost days in a given time period. Frost days is the number of days where minimum of temperature is below 0 degree Celsius. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
82
//static const char CFD_UNITS[]        = "No.";
83
84
static const char CFD_NAME2[]        = "number_of_cfd_periods_with_more_than_%ddays_per_time_period";
static const char CFD_LONGNAME2[]    = "Number of cfd periods in given time period with more than %d days. The time period should be defined by the bounds of the time coordinate.";
85
static const char CFD_UNITS2[]       = "No.";
86

Uwe Schulzweida's avatar
Uwe Schulzweida committed
87
88
static const char CSU_NAME[]         = "consecutive_summer_days_index_per_time_period";
static const char CSU_LONGNAME[]     = "Consecutive summer days index is the greatest number of consecutive summer days in a given time period. Summer days is the number of days where maximum of temperature is above 25 degree Celsius. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
89
//static const char CSU_UNITS[]        = "No.";
90
91
static const char CSU_NAME2[]        = "number_of_csu_periods_with_more_than_%ddays_per_time_period";
static const char CSU_LONGNAME2[]    = "Number of csu periods in given time period with more than %d days. The time period should be defined by the bounds of the time coordinate.";
92
static const char CSU_UNITS2[]       = "No.";
93

Uwe Schulzweida's avatar
Uwe Schulzweida committed
94
95
96
97
98
99
static const char CWDI_NAME[]        = "cold_wave_duration_index_wrt_mean_of_reference_period";
static const char CWDI_LONGNAME[]    = "This is the number of days per time period where in intervals of at least %d consecutive days the daily minimum temperature is more than %1.0f degrees below a reference value. The reference value is calculated  as the mean of minimum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char CWDI_UNITS[]       = "No.";
static const char CWDI_NAME2[]       = "cold_waves_per_time_period";
static const char CWDI_LONGNAME2[]   = "Number of cold waves per time period. The time period should be defined by the bounds of the time coordinate.";
static const char CWDI_UNITS2[]      = "No.";
100

Uwe Schulzweida's avatar
Uwe Schulzweida committed
101
102
103
104
105
106
static const char CWFI_NAME[]        = "cold_spell_days_index_wrt_10th_percentile_of_reference_period";
static const char CWFI_LONGNAME[]    = "This is the number of days per time period where in intervals of at least %d consecutive days the daily mean temperature is below a reference value. The reference value is calculated  as the 10th percentile of daily mean temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char CWFI_UNITS[]       = "No.";
static const char CWFI_NAME2[]       = "cold_spell_periods_per_time_period";
static const char CWFI_LONGNAME2[]   = "Number of cold spell periods per time period. The time period should be defined by the bounds of the time coordinate.";
static const char CWFI_UNITS2[]      = "No.";
107
108

static const char ETR_NAME[]         = "intra_period_extreme_temperature_range";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
109
static const char ETR_LONGNAME[]     = "Difference between the absolute extreme temperatures in observation period. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
110
//static const char ETR_UNITS[]        = "K";
111

Uwe Schulzweida's avatar
Uwe Schulzweida committed
112
113
static const char FD_NAME[]          = "frost_days_index_per_time_period";
static const char FD_LONGNAME[]      = "Frost days index is the number of days where minimum of temperature is below 0 degree Celsius. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
114
//static const char FD_UNITS[]         = "No.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
115

116
static const char GSL_NAME[]         = "thermal_growing_season_length";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
static const char GSL_LONGNAME[]     = "Counted are the number of days per calendar year between the first occurrence of at least %d consecutive days where the daily mean temperature is above %1.0f degree Celsius and the first occurrence of at least %d consecutive days after 1st of July where the daily mean temperature is below %1.0f degree Celsius. The time period should be defined by the bounds of the time coordinate.";
static const char GSL_UNITS[]        = "No.";
static const char GSL_NAME2[]        = "day_of_year_of_growing_season_start";
static const char GSL_LONGNAME2[]    = "Day of year of growing season start. The time period should be defined by the bounds of the time coordinate.";
static const char GSL_UNITS2[]       = "No.";

static const char HD_NAME[]          = "heating_degree_days_per_time_period";
static const char HD_LONGNAME[]      = "Heating degree days relates the outside temperature with the room temperature during the heating period. It is the sum of the difference between room temperature X and daily mean temperature Y on days where Y is below a given constant A. X is 20 degree Celsius and A is 15 degree Celsius according to VDI guidelines. According to ECAD both X and A are 17 degree Celsius. The time period should be defined by the bounds of the time coordinate.";
static const char HD_UNITS[]         = "No.";

static const char HWDI_NAME[]        = "heat_wave_duration_index_wrt_mean_of_reference_period";
static const char HWDI_LONGNAME[]    = "This is the number of days per time period where in intervals of at least %d consecutive days the daily maximum temperature is more than %1.0f degrees above a reference value. The reference value is calculated  as the mean of maximum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char HWDI_UNITS[]       = "No.";
static const char HWDI_NAME2[]       = "heat_waves_per_time_period";
static const char HWDI_LONGNAME2[]   = "Number of heat waves per time period. The time period should be defined by the bounds of the time coordinate.";
static const char HWDI_UNITS2[]      = "No.";

static const char HWFI_NAME[]        = "warm_spell_days_index_wrt_90th_percentile_of_reference_period";
static const char HWFI_LONGNAME[]    = "This is the number of days per time period where in intervals of at least %d consecutive days the daily mean temperature is above a reference value. The reference value is calculated  as the 90th percentile of daily mean temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char HWFI_UNITS[]       = "No.";
static const char HWFI_NAME2[]       = "warm_spell_periods_per_time_period";
static const char HWFI_LONGNAME2[]   = "Number of warm spell periods per time period. The time period should be defined by the bounds of the time coordinate.";
static const char HWFI_UNITS2[]      = "No.";

static const char ID_NAME[]          = "ice_days_index_per_time_period";
static const char ID_LONGNAME[]      = "Ice days index is the number of days where maximum of temperature is below 0 degree Celsius. The time period should be defined by the bounds of the time coordinate.";
static const char ID_UNITS[]         = "No.";

static const char SU_NAME[]          = "summer_days_index_per_time_period";
static const char SU_LONGNAME[]      = "Summer days index is the number of days where maximum of temperature is above %1.0f degree Celsius. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
147
//static const char SU_UNITS[]         = "No.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177

static const char TG10P_NAME[]       = "cold_days_percent_wrt_10th_percentile_of_reference_period";
static const char TG10P_LONGNAME[]   = "This is the percent of time per time period where daily mean temperature is below a reference value. The reference value is calculated  as the 10th percentile of daily mean temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char TG10P_UNITS[]      = "Percent";

static const char TG90P_NAME[]       = "warm_days_percent_wrt_90th_percentile_of_reference_period";
static const char TG90P_LONGNAME[]   = "This is the percent of time per time period where daily mean  temperature is above a reference value. The reference value is calculated  as the 90th percentile of daily mean temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char TG90P_UNITS[]      = "Percent";

static const char TN10P_NAME[]       = "cold_nights_percent_wrt_10th_percentile_of_reference_period";
static const char TN10P_LONGNAME[]   = "This is the percent of time per time period where daily minimum  temperature is below a reference value. The reference value is calculated  as the 10th percentile of daily minimum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char TN10P_UNITS[]      = "Percent";

static const char TN90P_NAME[]       = "warm_nights_percent_wrt_90th_percentile_of_reference_period";
static const char TN90P_LONGNAME[]   = "This is the percent of time per time period where daily minimum  temperature is above a reference value. The reference value is calculated  as the 90th percentile of daily minimum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char TN90P_UNITS[]      = "Percent";

static const char TR_NAME[]          = "tropical_nights_index_per_time_period";
static const char TR_LONGNAME[]      = "Tropical nights index is the number of days where minimum of temperature is above %1.0f degree Celsius. The time period should be defined by the bounds of the time coordinate.";
static const char TR_UNITS[]         = "No.";

static const char TX10P_NAME[]       = "very_cold_days_percent_wrt_10th_percentile_of_reference_period";
static const char TX10P_LONGNAME[]   = "This is the percent of time per time period where daily maximum temperature is below a reference value. The reference value is calculated  as the 10th percentile of daily maximum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char TX10P_UNITS[]      = "Percent";

static const char TX90P_NAME[]       = "very_warm_days_percent_wrt_90th_percentile_of_reference_period";
static const char TX90P_LONGNAME[]   = "This is the percent of time per time period where daily maximum  temperature is above a reference value. The reference value is calculated  as the 90th percentile of daily maximum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char TX90P_UNITS[]      = "Percent";

static const char CDD_NAME[]         = "consecutive_dry_days_index_per_time_period";
178
static const char CDD_LONGNAME[]     = "Consecutive dry days is the greatest number of consecutive days per time period with daily precipitation amount  below %g mm. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
179
static const char CDD_UNITS[]        = "No.";
180
181
static const char CDD_NAME2[]        = "number_of_cdd_periods_with_more_than_%ddays_per_time_period";
static const char CDD_LONGNAME2[]    = "Number of cdd periods in given time period with more than %d days. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
182
183
184
static const char CDD_UNITS2[]       = "No.";

static const char CWD_NAME[]         = "consecutive_wet_days_index_per_time_period";
185
static const char CWD_LONGNAME[]     = "Consecutive wet days is the greatest number of consecutive days per time period with daily precipitation above %g mm. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
186
static const char CWD_UNITS[]        = "No.";
187
188
static const char CWD_NAME2[]        = "number_of_cwd_periods_with_more_than_%ddays_per_time_period";
static const char CWD_LONGNAME2[]    = "Number of cwd periods in given time period with more than %d days. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
189
190
static const char CWD_UNITS2[]       = "No.";

191
192
193
static const char PD_NAME[]          = "precipitation_days_index_per_time_period";
static const char PD_LONGNAME[]      = "precipitation days is the number of days per time period with daily precipitation sum exceeding %g mm. The time period should be defined by the bounds of the time coordinate.";
static const char PD_UNITS[]         = "No.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
194

Uwe Schulzweida's avatar
Uwe Schulzweida committed
195
196
197
198
199
200
201
static const char R10MM_NAME[]       = "heavy_precipitation_days_index_per_time_period";
static const char R10MM_LONGNAME[]   = "Heavy precipitation days is the number of days per time period with daily precipitation sum exceeding 10 mm. The time period should be defined by the bounds of the time coordinate.";
static const char R10MM_UNITS[]      = "No.";

static const char R20MM_NAME[]       = "very_heavy_precipitation_days_index_per_time_period";
static const char R20MM_LONGNAME[]   = "Very heavy precipitation days is the number of days with daily precipitation sum exceeding 20 mm. The time period should be defined by the bounds of the time coordinate.";
static const char R20MM_UNITS[]      = "No.";
202
203

static const char R75P_NAME[]        = "moderate_wet_days_wrt_75th_percentile_of_reference_period";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
204
205
static const char R75P_LONGNAME[]    = "This is the percent of time per time period of wet days (daily sum at least 1 mm / day) where daily precipitation amount of a wet day is above a reference value. The reference value is calculated  as the 75th percentile of all wet days of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char R75P_UNITS[]       = "Percent";
206

Uwe Schulzweida's avatar
Uwe Schulzweida committed
207
208
209
static const char R75PTOT_NAME[]     = "precipitation_percent_due_to_R75p_days";
static const char R75PTOT_LONGNAME[] = "Percentage of  total precipitation amount per time period due to moderate_wet_days_wrt_75th_percentile_of_reference_period. The time period should be defined by the bounds of the time coordinate.";
static const char R75PTOT_UNITS[]    = "Percent";
210

Uwe Schulzweida's avatar
Uwe Schulzweida committed
211
212
213
static const char R90P_NAME[]        = "wet_days_wrt_90th_percentile_of_reference_period";
static const char R90P_LONGNAME[]    = "This is the percent of time per time period of wet days (daily sum at least 1 mm / day) where daily precipitation amount of a wet day is above a reference value. The reference value is calculated  as the 90th percentile of all wet days of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char R90P_UNITS[]       = "Percent";
214

Uwe Schulzweida's avatar
Uwe Schulzweida committed
215
216
217
static const char R90PTOT_NAME[]     = "precipitation_percent_due_to_R90p_days";
static const char R90PTOT_LONGNAME[] = "Percentage of  total precipitation  amount per time period  due towet_days_wrt_90th_percentile_of_reference_period. The time period should be defined by the bounds of the time coordinate.";
static const char R90PTOT_UNITS[]    = "Percent";
218
219

static const char R95P_NAME[]        = "very_wet_days_wrt_95th_percentile_of_reference_period";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
220
221
static const char R95P_LONGNAME[]    = "This is the percent of time per time period of wet days (daily sum at least 1 mm / day) where daily precipitation amount of a wet day is above a reference value. The reference value is calculated  as the 95th percentile of all wet days of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char R95P_UNITS[]       = "Percent";
222

Uwe Schulzweida's avatar
Uwe Schulzweida committed
223
224
225
static const char R95PTOT_NAME[]     = "precipitation_percent_due_to_R95p_days";
static const char R95PTOT_LONGNAME[] = "Percentage of  total  precipitation amount per time period  due to  very_wet_days_wrt_95th_percentile_of_reference_period. The time period should be defined by the bounds of the time coordinate.";
static const char R95PTOT_UNITS[]    = "Percent";
226
227

static const char R99P_NAME[]        = "extremely_wet_days_wrt_99th_percentile_of_reference_period";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
228
229
230
231
232
static const char R99P_LONGNAME[]    = "This is the percent of time per time period of wet days (daily sum at least 1 mm / day) where daily precipitation amount of a wet day is above a reference value. The reference value is calculated  as the 99th percentile of all wet days of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate.";
static const char R99P_UNITS[]       = "Percent";

static const char R99PTOT_NAME[]     = "precipitation_percent_due_to_R99p_days";
static const char R99PTOT_LONGNAME[] = "percentage of  total  precipitation amount per time period  due to  extremely_wet_days_wrt_99th_percentile_of_reference_period. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
233
//static const char R99PTOT_UNITS[]    = "Percent";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
234
235

static const char RR1_NAME[]         = "wet_days_index_per_time_period";
236
static const char RR1_LONGNAME[]     = "Wet days index is the number of days per time period with daily precipitation of at least %g mm.  The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
237
238
239
240
241
242
243
244
245
246
247
248
249
static const char RR1_UNITS[]        = "No.";

static const char RX1DAY_NAME[]      = "highest_one_day_precipitation_amount_per_time_period";
static const char RX1DAY_LONGNAME[]  = "Highest one  day precipitation  is the maximum of one day precipitation amount in a given time period. The time period should be defined by the bounds of the time coordinate.";
static const char RX1DAY_UNITS[]     = "mm per day";

static const char RX5DAY_NAME[]      = "highest_five_day_precipitation_amount_per_time_period";
static const char RX5DAY_LONGNAME[]  = "Highest precipitation amount  for five day interval (including the calendar day as the last day). The time period should be defined by the bounds of the time coordinate.";
static const char RX5DAY_UNITS[]     = "mm per 5 day";
static const char RX5DAY_NAME2[]     = "number_of_5day_heavy_precipitation_periods_per_time_period";
static const char RX5DAY_LONGNAME2[] = "Number of 5day periods in given time period with precipitation amount exceeding %1.0f mm / 5 days. The time period should be defined by the bounds of the time coordinate.";
static const char RX5DAY_UNITS2[]    = "No.";

250
static const char SDII_NAME[]        = "simple_daily_intensity_index_per_time_period";
251
static const char SDII_LONGNAME[]    = "Simple daily intensity index is the mean of precipitation amount on wet days. A wet day is a day with precipitation sum of at least %g mm. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
static const char SDII_UNITS[]       = "mm";

static const char FDNS_NAME[]        = "frost_days_where_no_snow_index_per_time_period";       
static const char FDNS_LONGNAME[]    = "Frost days where no snow index is the number of days without snowcover and where the minimum of temperature is below 0 degree Celsius. The time period should be defined by the bounds of the time coordinate.";       
static const char FDNS_UNITS[]       = "No.";

static const char STRWIN_NAME[]      = "strong_wind_days_index_per_time_period";
static const char STRWIN_LONGNAME[]  = "Strong wind days index is the number of days per time period where maximum wind speed is above %1.0f m/s. The time period should be defined by the bounds of the time coordinate.";
static const char STRWIN_UNITS[]     = "No.";
static const char STRWIN_NAME2[]     = "consecutive_strong_wind_days_index_per_time_period";
static const char STRWIN_LONGNAME2[] = "Greatest number of consecutive strong wind days per time period. The time period should be defined by the bounds of the time coordinate.";
static const char STRWIN_UNITS2[]    = "No.";

static const char STRBRE_NAME[]      = "strong_breeze_days_index_per_time_period";
static const char STRBRE_LONGNAME[]  = "Strong breeze days index is the number of days per time period where maximum wind speed is above 10.5 m/s. The time period should be defined by the bounds of the time coordinate.";
static const char STRBRE_NAME2[]     = "consecutive_strong_breeze_days_index_per_time_period";
static const char STRBRE_LONGNAME2[] = "Greatest number of consecutive strong breeze days per time period. The time period should be defined by the bounds of the time coordinate.";

Uwe Schulzweida's avatar
Uwe Schulzweida committed
270
271
272
273
//static const char STRGAL_NAME[]      = "strong_gale_days_index_per_time_period";
//static const char STRGAL_LONGNAME[]  = "Strong gale days index is the number of days per time period where maximum wind speed is above 20.5 m/s. The time period should be defined by the bounds of the time coordinate.";
//static const char STRGAL_NAME2[]     = "consecutive_strong_gale_days_index_per_time_period";
//static const char STRGAL_LONGNAME2[] = "Greatest number of consecutive strong gale days per time period. The time period should be defined by the bounds of the time coordinate.";
Uwe Schulzweida's avatar
Uwe Schulzweida committed
274
275
276
277
278

static const char HURR_NAME[]        = "hurricane_days_index_per_time_period";
static const char HURR_LONGNAME[]    = "Hurricane days index is the number of days per time period where maximum wind speed is above 32.5 m/s. The time period should be defined by the bounds of the time coordinate.";
static const char HURR_NAME2[]       = "consecutive_hurricane_days_index_per_time_period";
static const char HURR_LONGNAME2[]   = "Greatest number of consecutive hurricane days per time period. The time period should be defined by the bounds of the time coordinate.";
279
280
281
282

/* ECA temperature indices */


283
void *EcaCfd(void *process)
284
285
{
  ECA_REQUEST_1 request;
286
287
288
  int ndays = 5;
  char cfd_longname2[1024];
  char cfd_name2[1024];
289
  
290
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
291
  cdoOperatorAdd("eca_cfd", 0, 31, nullptr);
292
  
293
  if ( operatorArgc() > 1 ) cdoAbort("Too many arguments!");
294
  if ( operatorArgc() > 0 ) ndays = parameter2int(cdoOperatorArgv(0));
295
296
297
298

  sprintf(cfd_longname2, CFD_LONGNAME2, ndays);
  sprintf(cfd_name2,     CFD_NAME2, ndays);

299
300
  request.var1.name     = CFD_NAME;
  request.var1.longname = CFD_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
301
  request.var1.units    = nullptr;
302
  request.var1.f1       = vfarselltc;
303
  request.var1.f1arg    = TO_KELVIN(0.0);
304
305
  request.var1.f2       = vfarnum2;
  request.var1.f3       = vfarmax;
306
307
  request.var1.mulc     = 0.0;
  request.var1.addc     = 0.0;
308
  request.var1.epilog   = ECA_NONE;
309
310
  request.var2.name     = cfd_name2;
  request.var2.longname = cfd_longname2;
311
  request.var2.units    = CFD_UNITS2;
312
  request.var2.h1       = vfarseleqc;
313
  request.var2.h1arg    = ndays+1;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
314
  request.var2.h2       = nullptr;
315
  request.var2.h3       = vfarnum;
316
317
318
319
   
  eca1(&request);
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
320
  return 0;
321
322
323
}


324
void *EcaCsu(void *process)
325
326
{
  ECA_REQUEST_1 request;
327
328
329
330
  double argT = 25.0;
  int ndays = 5;
  char csu_longname2[1024];
  char csu_name2[1024];
331
  
332
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
333
  cdoOperatorAdd("eca_csu", 0, 31, nullptr);
334

335
336
337
  if ( operatorArgc() > 2 ) cdoAbort("Too many arguments!");
  else if ( operatorArgc() > 0 ) 
    {
338
339
      argT = parameter2double(cdoOperatorArgv(0));
      if ( operatorArgc() == 2 ) ndays = parameter2int(cdoOperatorArgv(1));
340
341
342
343
    }
  
  sprintf(csu_longname2, CSU_LONGNAME2, ndays);
  sprintf(csu_name2,     CSU_NAME2, ndays);
344
345

  request.var1.name     = CSU_NAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
346
  request.var1.longname = CSU_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
347
  request.var1.units    = nullptr;
348
  request.var1.f1       = vfarselgtc;
349
  request.var1.f1arg    = TO_KELVIN(argT);
350
351
  request.var1.f2       = vfarnum2;
  request.var1.f3       = vfarmax;
352
353
  request.var1.mulc     = 0.0;
  request.var1.addc     = 0.0;
354
  request.var1.epilog   = ECA_NONE;
355
356
  request.var2.name     = csu_name2;
  request.var2.longname = csu_longname2;
357
  request.var2.units    = CSU_UNITS2;
358
  request.var2.h1       = vfarseleqc;
359
  request.var2.h1arg    = ndays+1;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
360
  request.var2.h2       = nullptr;
361
  request.var2.h3       = vfarnum;
362
363
  
  eca1(&request);
364
  
365
366
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
367
  return 0;
368
369
370
}


371
void *EcaCwdi(void *process)
372
373
374
375
376
377
{
  char *longname;
  int argN = 6;
  double argT = 5.0;
  ECA_REQUEST_2 request;
  
378
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
379
  cdoOperatorAdd("eca_cwdi", 0, 31, nullptr);
380

381
382
  if ( operatorArgc() > 0 ) argN = parameter2int(cdoOperatorArgv(0));
  if ( operatorArgc() > 1 ) argT = parameter2double(cdoOperatorArgv(1));
383
  
384
  longname = (char*) Malloc(strlen(CWDI_LONGNAME) + 80);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
385
  sprintf(longname, CWDI_LONGNAME, argN, argT);
386
387
388

  request.var1.name     = CWDI_NAME;
  request.var1.longname = longname;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
389
  request.var1.units    = CWDI_UNITS;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
390
  request.var1.f1       = nullptr;
391
  request.var1.f2       = vfarcsub;
392
  request.var1.f2arg    = argT;
393
394
395
  request.var1.f3       = vfarsellt;
  request.var1.f4       = vfarnum2;
  request.var1.f5       = vfarnum3;
396
  request.var1.f5arg    = argN;
397
  request.var1.epilog   = ECA_NONE;
398
399
  request.var2.name     = CWDI_NAME2;
  request.var2.longname = CWDI_LONGNAME2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
400
  request.var2.units    = CWDI_UNITS2;
401
  request.var2.h1       = vfarseleqc;
402
  request.var2.h1arg    = argN;
403
  request.var2.h2       = vfarnum;
404
405
406
   
  eca2(&request);
  
407
  Free(longname);
408
409
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
410
  return 0;
411
412
413
}


414
void *EcaCwfi(void *process)
415
416
417
418
{
  int argN = 6;
  ECA_REQUEST_2 request;
  
419
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
420
  cdoOperatorAdd("eca_cwfi", 0, 31, nullptr);
421

422
  if ( operatorArgc() > 0 ) argN = parameter2int(cdoOperatorArgv(0));
423

424
  char *longname = (char*) Malloc(strlen(CWFI_LONGNAME) + 40);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
425
426
  sprintf(longname, CWFI_LONGNAME, argN);

427
  request.var1.name     = CWFI_NAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
428
429
  request.var1.longname = longname;
  request.var1.units    = CWFI_UNITS;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
430
431
  request.var1.f1       = nullptr;
  request.var1.f2       = nullptr;
432
433
434
  request.var1.f3       = vfarsellt;
  request.var1.f4       = vfarnum2;
  request.var1.f5       = vfarnum3;
435
  request.var1.f5arg    = argN;
436
  request.var1.epilog   = ECA_NONE;
437
438
  request.var2.name     = CWFI_NAME2;
  request.var2.longname = CWFI_LONGNAME2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
439
  request.var2.units    = CWFI_UNITS2;
440
  request.var2.h1       = vfarseleqc;
441
  request.var2.h1arg    = argN;
442
  request.var2.h2       = vfarnum;
443
444
   
  eca2(&request);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
445
  
446
  Free(longname);
447
448
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
449
  return 0;
450
451
452
}


453
void *EcaEtr(void *process)
454
455
456
{
  ECA_REQUEST_3 request;
  
457
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
458
  cdoOperatorAdd("eca_etr", 0, 31, nullptr);
459
460
461
  
  request.name     = ETR_NAME;
  request.longname = ETR_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
462
  request.units    = nullptr;
463
464
465
  request.f1       = vfarmax; 
  request.f2       = vfarmin;
  request.f3       = vfarsub;
466
467
468
469
   
  eca3(&request);
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
470
  return 0;
471
472
473
}


474
void *EcaFd(void *process)
475
476
477
{
  ECA_REQUEST_1 request;
  
478
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
479
  cdoOperatorAdd("eca_fd", 0, 31, nullptr);
480
481
482
  
  request.var1.name     = FD_NAME;
  request.var1.longname = FD_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
483
  request.var1.units    = nullptr;
484
  request.var1.f1       = vfarselltc; 
485
  request.var1.f1arg    = TO_KELVIN(0.0);
486
  request.var1.f2       = vfarnum;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
487
  request.var1.f3       = nullptr;
488
489
  request.var1.mulc     = 0.0;    
  request.var1.addc     = 0.0;
490
  request.var1.epilog   = ECA_NONE;    
Uwe Schulzweida's avatar
Uwe Schulzweida committed
491
492
  request.var2.h2       = nullptr; 
  request.var2.h3       = nullptr; 
493
494
495
496
   
  eca1(&request);
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
497
  return 0;
498
499
500
}


Uwe Schulzweida's avatar
Uwe Schulzweida committed
501
/*
502
503
504
505
 * Definition of GSL: (Thermal) Growing Season Length start at the first span
 * of at least 6 (argN) days with T > 5.0°C (argT) in first half of the year
 * and ends at the first span of ar least 6 (argN) days with T < 5.0°C (argT)
 * in the second half.
Uwe Schulzweida's avatar
Uwe Schulzweida committed
506
507
 * ATTENTION: Year of the northern hemisphere starts in january to
 * december, whereas for the southern hemisphere is goes from july to june!
508
509
 * Hence, at least 18 Month of data is needed for computing the gsl of the
 * whole earth.
Uwe Schulzweida's avatar
Uwe Schulzweida committed
510
*/
511
void *EcaGsl(void *process)
512
{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
513
  int argN = 6; 
514
  double argT = 5.0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
515
  double minLandFraction = 0.5;
516
517
  ECA_REQUEST_4 request;
  
518
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
519
  cdoOperatorAdd("eca_gsl", 0, 10, nullptr);
520
  
521
522
523
  if ( operatorArgc() > 0 ) argN = parameter2int(cdoOperatorArgv(0));
  if ( operatorArgc() > 1 ) argT = parameter2double(cdoOperatorArgv(1));
  if ( operatorArgc() > 2 ) minLandFraction = parameter2double(cdoOperatorArgv(2));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
524

525
  char *longname = (char*) Malloc(strlen(GSL_LONGNAME) + 160);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
526
  sprintf(longname, GSL_LONGNAME, argN, argT, argN, argT);
527

528
  request.name      = GSL_NAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
529
530
  request.longname  = longname;
  request.units     = GSL_UNITS;
531
532
  request.name2     = GSL_NAME2;
  request.longname2 = GSL_LONGNAME2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
533
  request.units2    = GSL_UNITS2;
534
  request.s1        = vfarselgtc; 
535
  request.s1arg     = TO_KELVIN(argT);
536
  request.s2        = vfarselltc;
537
  request.s2arg     = TO_KELVIN(argT);
538
  request.s3        = vfarselgec;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
539
  request.s3arg     = minLandFraction;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
540
  request.consecutiveDays = argN;    
541
542
   
  eca4(&request);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
543
  
544
  Free(longname);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
545

546
547
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
548
  return 0;
549
550
551
}


552
void *EcaHd(void *process)
553
{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
554
555
  double argX = 17.0;
  double argA = 17.0;
556
557
  ECA_REQUEST_1 request;
  
558
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
559
  cdoOperatorAdd("eca_hd", 0, 31, nullptr);
560
561
562

  if ( operatorArgc() > 0 ) 
    {
563
      argX = parameter2double(cdoOperatorArgv(0));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
564
      argA = argX;
565
566
    }
  if ( operatorArgc() > 1 ) 
567
    argA = parameter2double(cdoOperatorArgv(1));
568
569
570
  
  request.var1.name     = HD_NAME;
  request.var1.longname = HD_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
571
  request.var1.units    = HD_UNITS;
572
  request.var1.f1       = vfarselltc; 
Uwe Schulzweida's avatar
Uwe Schulzweida committed
573
  request.var1.f1arg    = TO_KELVIN(argA);
574
  request.var1.f2       = vfarsum;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
575
  request.var1.f3       = nullptr;
576
  request.var1.mulc     = -1.0;    
Uwe Schulzweida's avatar
Uwe Schulzweida committed
577
  request.var1.addc     = TO_KELVIN(argX);
578
  request.var1.epilog   = ECA_NONE;    
Uwe Schulzweida's avatar
Uwe Schulzweida committed
579
580
  request.var2.h2       = nullptr; 
  request.var2.h3       = nullptr; 
581
582
   
  eca1(&request);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
583

584
585
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
586
  return 0;
587
588
589
}


590
void *EcaHwdi(void *process)
591
592
593
594
595
{
  int argN = 6;
  double argT = 5.0;
  ECA_REQUEST_2 request;
  
596
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
597
  cdoOperatorAdd("eca_hwdi", 0, 31, nullptr);
598

599
600
  if ( operatorArgc() > 0 ) argN = parameter2int(cdoOperatorArgv(0));
  if ( operatorArgc() > 1 ) argT = parameter2double(cdoOperatorArgv(1));
601
  
602
  char *longname = (char*) Malloc(strlen(HWDI_LONGNAME) + 80);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
603
  sprintf(longname, HWDI_LONGNAME, argN, argT);
604
605
606
  
  request.var1.name     = HWDI_NAME;
  request.var1.longname = longname;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
607
  request.var1.units    = HWDI_UNITS;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
608
  request.var1.f1       = nullptr;
609
  request.var1.f2       = vfarcadd;
610
  request.var1.f2arg    = argT;
611
612
613
  request.var1.f3       = vfarselgt;
  request.var1.f4       = vfarnum2;
  request.var1.f5       = vfarnum3;
614
  request.var1.f5arg    = argN;
615
  request.var1.epilog   = ECA_NONE;
616
617
  request.var2.name     = HWDI_NAME2;
  request.var2.longname = HWDI_LONGNAME2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
618
  request.var2.units    = HWDI_UNITS2;
619
  request.var2.h1       = vfarseleqc;
620
  request.var2.h1arg    = argN;
621
  request.var2.h2       = vfarnum;
622
623
624
   
  eca2(&request);
  
625
  Free(longname);
626
627
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
628
  return 0;
629
630
631
}


632
void *EcaHwfi(void *process)
633
634
635
636
{
  int argN = 6;
  ECA_REQUEST_2 request;
  
637
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
638
  cdoOperatorAdd("eca_hwfi", 0, 31, nullptr);
639

640
  if ( operatorArgc() > 0 ) argN = parameter2int(cdoOperatorArgv(0));
641

642
  char *longname = (char*) Malloc(strlen(HWFI_LONGNAME) + 40);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
643
644
  sprintf(longname, HWFI_LONGNAME, argN);

645
  request.var1.name     = HWFI_NAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
646
647
  request.var1.longname = longname;
  request.var1.units    = HWFI_UNITS;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
648
649
  request.var1.f1       = nullptr;
  request.var1.f2       = nullptr;
650
651
652
  request.var1.f3       = vfarselgt;
  request.var1.f4       = vfarnum2;
  request.var1.f5       = vfarnum3;
653
  request.var1.f5arg    = argN;
654
  request.var1.epilog   = ECA_NONE;
655
656
  request.var2.name     = HWFI_NAME2;
  request.var2.longname = HWFI_LONGNAME2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
657
  request.var2.units    = HWFI_UNITS2;
658
  request.var2.h1       = vfarseleqc;
659
  request.var2.h1arg    = argN;
660
  request.var2.h2       = vfarnum;
661
662
   
  eca2(&request);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
663
  
664
  Free(longname);
665
666
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
667
  return 0;
668
669
670
}


671
void *EcaId(void *process)
672
673
674
{
  ECA_REQUEST_1 request;
  
675
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
676
  cdoOperatorAdd("eca_id", 0, 31, nullptr);
677
678
679

  request.var1.name     = ID_NAME;
  request.var1.longname = ID_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
680
  request.var1.units    = ID_UNITS;
681
  request.var1.f1       = vfarselltc;
682
  request.var1.f1arg    = TO_KELVIN(0.0);
683
  request.var1.f2       = vfarnum;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
684
  request.var1.f3       = nullptr;
685
686
  request.var1.mulc     = 0.0;    
  request.var1.addc     = 0.0;   
687
  request.var1.epilog   = ECA_NONE; 
Uwe Schulzweida's avatar
Uwe Schulzweida committed
688
689
  request.var2.h2       = nullptr; 
  request.var2.h3       = nullptr; 
690
691
692
693
    
  eca1(&request);
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
694
  return 0;
695
696
697
}


698
void *EcaSu(void *process)
699
700
701
702
{
  double argT = 25.0;
  ECA_REQUEST_1 request;
  
703
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
704
  cdoOperatorAdd("eca_su", 0, 31, nullptr);
705

706
  if ( operatorArgc() > 0 ) argT = parameter2double(cdoOperatorArgv(0));
707
  char *longname = (char*) Malloc(strlen(SU_LONGNAME) + 40);
708
709
710
711
  sprintf(longname, SU_LONGNAME, argT);

  request.var1.name     = SU_NAME;
  request.var1.longname = longname;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
712
  request.var1.units    = nullptr;
713
  request.var1.f1       = vfarselgtc;
714
  request.var1.f1arg    = TO_KELVIN(argT);
715
  request.var1.f2       = vfarnum;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
716
  request.var1.f3       = nullptr;
717
718
  request.var1.mulc     = 0.0;    
  request.var1.addc     = 0.0;    
719
  request.var1.epilog   = ECA_NONE; 
Uwe Schulzweida's avatar
Uwe Schulzweida committed
720
721
  request.var2.h2       = nullptr; 
  request.var2.h3       = nullptr; 
722
723
724
 
  eca1(&request);
  
725
  Free(longname);
726
727
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
728
  return 0;
729
730
731
}


732
void *EcaTg10p(void *process)
733
734
735
{
  ECA_REQUEST_2 request;
  
736
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
737
  cdoOperatorAdd("eca_tg10p", 0, 31, nullptr);
738
739
740

  request.var1.name     = TG10P_NAME;
  request.var1.longname = TG10P_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
741
  request.var1.units    = TG10P_UNITS;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
742
743
  request.var1.f1       = nullptr;
  request.var1.f2       = nullptr;
744
745
  request.var1.f3       = vfarsellt;
  request.var1.f4       = vfarnum;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
746
  request.var1.f5       = nullptr;
747
  request.var1.epilog   = PERCENT_OF_TIME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
748
  request.var2.h2       = nullptr;
749
750
751
752
    
  eca2(&request);
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
753
  return 0;
754
755
756
}


757
void *EcaTg90p(void *process)
758
759
760
{
  ECA_REQUEST_2 request;
  
761
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
762
  cdoOperatorAdd("eca_tg90p", 0, 31, nullptr);
763
764
765

  request.var1.name     = TG90P_NAME;
  request.var1.longname = TG90P_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
766
  request.var1.units    = TG90P_UNITS;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
767
768
  request.var1.f1       = nullptr;
  request.var1.f2       = nullptr;
769
770
  request.var1.f3       = vfarselgt;
  request.var1.f4       = vfarnum;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
771
  request.var1.f5       = nullptr;
772
  request.var1.epilog   = PERCENT_OF_TIME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
773
  request.var2.h2       = nullptr;
774
775
776
777
  
  eca2(&request);
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
778
  return 0;
779
780
781
}


782
void *EcaTn10p(void *process)
783
784
785
{
  ECA_REQUEST_2 request;
  
786
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
787
  cdoOperatorAdd("eca_tn10p", 0, 31, nullptr);
788
789
790

  request.var1.name     = TN10P_NAME;
  request.var1.longname = TN10P_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
791
  request.var1.units    = TN10P_UNITS;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
792
793
  request.var1.f1       = nullptr;
  request.var1.f2       = nullptr;
794
795
  request.var1.f3       = vfarsellt;
  request.var1.f4       = vfarnum;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
796
  request.var1.f5       = nullptr;
797
  request.var1.epilog   = PERCENT_OF_TIME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
798
  request.var2.h2       = nullptr;
799
800
801
802
    
  eca2(&request);
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
803
  return 0;
804
805
806
}


807
void *EcaTn90p(void *process)
808
809
810
{
  ECA_REQUEST_2 request;
  
811
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
812
  cdoOperatorAdd("eca_tn90p", 0, 31, nullptr);
813
814
815

  request.var1.name     = TN90P_NAME;
  request.var1.longname = TN90P_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
816
  request.var1.units    = TN90P_UNITS;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
817
818
  request.var1.f1       = nullptr;
  request.var1.f2       = nullptr;
819
820
  request.var1.f3       = vfarselgt;
  request.var1.f4       = vfarnum;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
821
  request.var1.f5       = nullptr;
822
  request.var1.epilog   = PERCENT_OF_TIME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
823
  request.var2.h2       = nullptr;
824
825
826
827
    
  eca2(&request);
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
828
  return 0;
829
830
831
}


832
void *EcaTr(void *process)
833
834
{
  ECA_REQUEST_1 request;
835
836
  double argT = 20.0;
  char tr_longname[1024];
837
  
838
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
839
  cdoOperatorAdd("eca_tr", 0, 31, nullptr);
840

841
  if ( operatorArgc() > 0 ) argT = parameter2double(cdoOperatorArgv(0));
842
843

  sprintf(tr_longname, TR_LONGNAME, argT);
844
845
 
  request.var1.name     = TR_NAME;
846
  request.var1.longname = tr_longname;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
847
  request.var1.units    = TR_UNITS;
848
  request.var1.f1       = vfarselgtc;
849
  request.var1.f1arg    = TO_KELVIN(argT);
850
  request.var1.f2       = vfarnum;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
851
  request.var1.f3       = nullptr;
852
853
  request.var1.mulc     = 0.0;    
  request.var1.addc     = 0.0;    
854
  request.var1.epilog   = ECA_NONE; 
Uwe Schulzweida's avatar
Uwe Schulzweida committed
855
856
  request.var2.h2       = nullptr; 
  request.var2.h3       = nullptr; 
857
858
859
860
861
   
  eca1(&request);
  
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
862
  return 0;
863
864
865
}


866
void *EcaTx10p(void *process)
867
868
869
{
  ECA_REQUEST_2 request;
  
870
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
871
  cdoOperatorAdd("eca_tx10p", 0, 31, nullptr);
872
873
874

  request.var1.name     = TX10P_NAME;
  request.var1.longname = TX10P_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
875
  request.var1.units    = TX10P_UNITS;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
876
877
  request.var1.f1       = nullptr;
  request.var1.f2       = nullptr;
878
879
  request.var1.f3       = vfarsellt;
  request.var1.f4       = vfarnum;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
880
  request.var1.f5       = nullptr;
881
  request.var1.epilog   = PERCENT_OF_TIME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
882
  request.var2.h2       = nullptr;
883
884
885
886
    
  eca2(&request);
  cdoFinish();
  
Uwe Schulzweida's avatar
Uwe Schulzweida committed
887
  return 0;
888
889
890
}


891
void *EcaTx90p(void *process)
892
893
894
{
  ECA_REQUEST_2 request;
  
895
  cdoInitialize(process);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
896
  cdoOperatorAdd("eca_tx90p", 0, 31, nullptr);
897
898
899
 
  request.var1.name     = TX90P_NAME;
  request.var1.longname = TX90P_LONGNAME;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
900
  request.var1.units    = TX90P_UNITS;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
901
902
  request.var1.f1       = nullptr;
  request.var1.f2       = nullptr;