Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add col/s throughput metric in performance reports, add vector_length(NPROMA) to gang loops #42

Merged
merged 6 commits into from
Feb 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions .github/scripts/run-targets.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,7 @@ then
skipped_targets+=(dwarf-cloudsc-gpu-scc-cuf dwarf-cloudsc-loki-scc-cuf-hoist dwarf-cloudsc-loki-scc-cuf-parametrise)

# Skip C target if built with nvhpc, segfaults for unknown reasons
skipped_targets+=(dwarf-cloudsc-c)

# Skip Loki-C target if built with nvhpc, fails with SIGFPE for unknown reasons
skipped_targets+=(dwarf-cloudsc-loki-c)
skipped_targets+=(dwarf-cloudsc-c dwarf-cloudsc-loki-c)
fi

exit_code=0
Expand Down
78 changes: 39 additions & 39 deletions benchmark/include/include_patternset.yml
Original file line number Diff line number Diff line change
Expand Up @@ -158,45 +158,45 @@ patternset:

- name: timing_pattern
pattern:
- {name: thr_time, type: int, _: '(?:$jube_pat_nint\s+){6}:\s+$jube_pat_int\s+$jube_pat_nint\s+@\s+(?:rank#$jube_pat_nint:)?core#'} #$jube_pat_nint'} # C-version doesn't print core number?
- {name: thr_mflops, type: int, _: '(?:$jube_pat_nint\s+){6}:\s+$jube_pat_nint\s+$jube_pat_int\s+@\s+(?:rank#$jube_pat_nint:)?core#'} #$jube_pat_nint'}
- {name: rnk_time, type: int, _: '(?:$jube_pat_nint\s+){6}:\s+$jube_pat_int\s+$jube_pat_nint\s+:\s+TOTAL\s@\srank#$jube_pat_nint'}
- {name: rnk_mflops, type: int, _: '(?:$jube_pat_nint\s+){6}:\s+$jube_pat_nint\s+$jube_pat_int\s+:\s+TOTAL\s@\srank#$jube_pat_nint'}
- {name: tot_time, type: int, _: '(?:$jube_pat_nint\s*x\s*)?(?:$jube_pat_nint\s+){6}:\s+$jube_pat_int\s+$jube_pat_nint\s+(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_mflops, type: int, _: '(?:$jube_pat_nint\s*x\s*)?(?:$jube_pat_nint\s+){6}:\s+$jube_pat_nint\s+$jube_pat_int\s+(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_nproc, type: int, _: '$jube_pat_int\s*x\s*(?:$jube_pat_nint\s+){6}:\s+(?:$jube_pat_nint\s+){2}(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_numomp, type: int, _: '(?:$jube_pat_nint\s*x\s*)?$jube_pat_int\s+(?:$jube_pat_nint\s+){5}:\s+(?:$jube_pat_nint\s+){2}(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_ngptot, type: int, _: '(?:$jube_pat_nint\s*x\s*)?$jube_pat_nint\s+$jube_pat_int\s+(?:$jube_pat_nint\s+){4}:\s+(?:$jube_pat_nint\s+){2}(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_ngpblks,type: int, _: '(?:$jube_pat_nint\s*x\s*)?(?:$jube_pat_nint\s+){3}$jube_pat_int\s+(?:$jube_pat_nint\s+){2}:\s+(?:$jube_pat_nint\s+){2}(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_nproma, type: int, _: '(?:$jube_pat_nint\s*x\s*)?(?:$jube_pat_nint\s+){4}$jube_pat_int\s+$jube_pat_nint\s+:\s+(?:$jube_pat_nint\s+){2}(?::\s+)?TOTAL(?!\s@)'}
- {name: thr_time, type: int, _: '(?:$jube_pat_nint\s+){6}:\s+$jube_pat_int\s+(?:$jube_pat_nint\s+){2}@\s+(?:rank#$jube_pat_nint:)?core#'} #$jube_pat_nint'} # C-version doesn't print core number?
- {name: thr_mflops, type: int, _: '(?:$jube_pat_nint\s+){6}:\s+$jube_pat_nint\s+$jube_pat_int\s+$jube_pat_nint\s+@\s+(?:rank#$jube_pat_nint:)?core#'} #$jube_pat_nint'}
- {name: rnk_time, type: int, _: '(?:$jube_pat_nint\s+){6}:\s+$jube_pat_int\s+(?:$jube_pat_nint\s+){2}:\s+TOTAL\s@\srank#$jube_pat_nint'}
- {name: rnk_mflops, type: int, _: '(?:$jube_pat_nint\s+){6}:\s+$jube_pat_nint\s+$jube_pat_int\s+$jube_pat_nint\s+:\s+TOTAL\s@\srank#$jube_pat_nint'}
- {name: tot_time, type: int, _: '(?:$jube_pat_nint\s*x\s*)?(?:$jube_pat_nint\s+){6}:\s+$jube_pat_int\s+(?:$jube_pat_nint\s+){2}(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_mflops, type: int, _: '(?:$jube_pat_nint\s*x\s*)?(?:$jube_pat_nint\s+){6}:\s+$jube_pat_nint\s+$jube_pat_int\s+$jube_pat_nint\s+(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_nproc, type: int, _: '$jube_pat_int\s*x\s*(?:$jube_pat_nint\s+){6}:\s+(?:$jube_pat_nint\s+){3}(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_numomp, type: int, _: '(?:$jube_pat_nint\s*x\s*)?$jube_pat_int\s+(?:$jube_pat_nint\s+){5}:\s+(?:$jube_pat_nint\s+){3}(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_ngptot, type: int, _: '(?:$jube_pat_nint\s*x\s*)?$jube_pat_nint\s+$jube_pat_int\s+(?:$jube_pat_nint\s+){4}:\s+(?:$jube_pat_nint\s+){3}(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_ngpblks,type: int, _: '(?:$jube_pat_nint\s*x\s*)?(?:$jube_pat_nint\s+){3}$jube_pat_int\s+(?:$jube_pat_nint\s+){2}:\s+(?:$jube_pat_nint\s+){3}(?::\s+)?TOTAL(?!\s@)'}
- {name: tot_nproma, type: int, _: '(?:$jube_pat_nint\s*x\s*)?(?:$jube_pat_nint\s+){4}$jube_pat_int\s+$jube_pat_nint\s+:\s+(?:$jube_pat_nint\s+){3}(?::\s+)?TOTAL(?!\s@)'}

# NUMOMP NGPTOT #GP-cols #BLKS NPROMA tid# : Time(msec) MFlops/s
# 8 16384 2048 128 16 0 : 295 866 @ core#22
# 8 16384 2048 128 16 1 : 284 899 @ core#4
# 8 16384 2048 128 16 2 : 282 905 @ core#16
# 8 16384 2048 128 16 3 : 239 1067 @ core#1
# 8 16384 2048 128 16 4 : 261 975 @ core#2
# 8 16384 2048 128 16 5 : 266 959 @ core#3
# 8 16384 2048 128 16 6 : 267 955 @ core#21
# 8 16384 2048 128 16 7 : 273 934 @ core#23
# 8 16384 16384 1024 16 -1 : 295 6931 : TOTAL
# NUMOMP NGPTOT #GP-cols #BLKS NPROMA tid# : Time(msec) MFlops/s col/s
# 8 16384 2048 128 16 0 : 295 866 1320 @ core#22
# 8 16384 2048 128 16 1 : 284 899 1320 @ core#4
# 8 16384 2048 128 16 2 : 282 905 1320 @ core#16
# 8 16384 2048 128 16 3 : 239 1067 1320 @ core#1
# 8 16384 2048 128 16 4 : 261 975 1320 @ core#2
# 8 16384 2048 128 16 5 : 266 959 1320 @ core#3
# 8 16384 2048 128 16 6 : 267 955 1320 @ core#21
# 8 16384 2048 128 16 7 : 273 934 1320 @ core#23
# 8 16384 16384 1024 16 -1 : 295 6931 1320 : TOTAL

# NUMPROC=8, NUMOMP=1, NGPTOTG=16384, NPROMA=16, NGPBLKS=128
# NUMOMP NGPTOT #GP-cols #BLKS NPROMA tid# : Time(msec) MFlops/s
# 1 2048 2048 128 16 0 : 237 1075 @ rank#0:core#20
# 1 2048 2048 128 16 -1 : 237 1075 : TOTAL @ rank#0
# 1 2048 2048 128 16 0 : 230 1109 @ rank#1:core#11
# 1 2048 2048 128 16 -1 : 230 1109 : TOTAL @ rank#1
# 1 2048 2048 128 16 0 : 281 906 @ rank#2:core#6
# 1 2048 2048 128 16 -1 : 281 906 : TOTAL @ rank#2
# 1 2048 2048 128 16 0 : 254 1002 @ rank#3:core#24
# 1 2048 2048 128 16 -1 : 254 1002 : TOTAL @ rank#3
# 1 2048 2048 128 16 0 : 271 940 @ rank#4:core#3
# 1 2048 2048 128 16 -1 : 271 940 : TOTAL @ rank#4
# 1 2048 2048 128 16 0 : 249 1025 @ rank#5:core#25
# 1 2048 2048 128 16 -1 : 249 1025 : TOTAL @ rank#5
# 1 2048 2048 128 16 0 : 235 1086 @ rank#6:core#1
# 1 2048 2048 128 16 -1 : 235 1086 : TOTAL @ rank#6
# 1 2048 2048 128 16 0 : 243 1050 @ rank#7:core#15
# 1 2048 2048 128 16 -1 : 243 1050 : TOTAL @ rank#7
# 8 x 1 16384 16384 1024 16 -1 : 281 8193 : TOTAL
# NUMOMP NGPTOT #GP-cols #BLKS NPROMA tid# : Time(msec) MFlops/s col/s
# 1 2048 2048 128 16 0 : 237 1075 1320 @ rank#0:core#20
# 1 2048 2048 128 16 -1 : 237 1075 1320 : TOTAL @ rank#0
# 1 2048 2048 128 16 0 : 230 1109 1320 @ rank#1:core#11
# 1 2048 2048 128 16 -1 : 230 1109 1320 : TOTAL @ rank#1
# 1 2048 2048 128 16 0 : 281 906 1320 @ rank#2:core#6
# 1 2048 2048 128 16 -1 : 281 906 1320 : TOTAL @ rank#2
# 1 2048 2048 128 16 0 : 254 1002 1320 @ rank#3:core#24
# 1 2048 2048 128 16 -1 : 254 1002 1320 : TOTAL @ rank#3
# 1 2048 2048 128 16 0 : 271 940 1320 @ rank#4:core#3
# 1 2048 2048 128 16 -1 : 271 940 1320 : TOTAL @ rank#4
# 1 2048 2048 128 16 0 : 249 1025 1320 @ rank#5:core#25
# 1 2048 2048 128 16 -1 : 249 1025 1320 : TOTAL @ rank#5
# 1 2048 2048 128 16 0 : 235 1086 1320 @ rank#6:core#1
# 1 2048 2048 128 16 -1 : 235 1086 1320 : TOTAL @ rank#6
# 1 2048 2048 128 16 0 : 243 1050 1320 @ rank#7:core#15
# 1 2048 2048 128 16 -1 : 243 1050 1320 : TOTAL @ rank#7
# 8 x 1 16384 16384 1024 16 -1 : 281 8193 1320 : TOTAL
8 changes: 7 additions & 1 deletion src/cloudsc_c/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@ if( HAVE_CLOUDSC_C )
INSTALL_HEADERS LISTED
SOURCES
cloudsc/yoecldp_c.h
cloudsc/yoecldp_c.c
cloudsc/yoethf_c.h
cloudsc/yoethf_c.c
cloudsc/yomcst_c.h
cloudsc/yomcst_c.c
cloudsc/load_state.h
cloudsc/load_state.c
cloudsc/cloudsc_c.h
Expand Down Expand Up @@ -64,7 +67,10 @@ if( HAVE_CLOUDSC_C )
COMMAND bin/dwarf-cloudsc-c
ARGS 4 100 16
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../../..
OMP 4
# The OpenMP C runtime for some reason doesn't appreciate setting the number of threads
# in the application when OMP_NUM_THREADS is set, therefore we disable this here
# OMP 4
ENVIRONMENT OMP_STACKSIZE=1G
CONDITION HAVE_OMP
)

Expand Down
5 changes: 5 additions & 0 deletions src/cloudsc_c/cloudsc/cloudsc_c.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
* nor does it submit to any jurisdiction.
*/

#ifndef CLOUDSC_C_H
#define CLOUDSC_C_H

#include "yomcst_c.h"
#include "yoethf_c.h"
#include "yoecldp_c.h"
Expand All @@ -24,3 +27,5 @@ int cloudsc_c(int kidia, int kfdia, int klon, int klev, double ptsphy, double *
double * restrict v_pfsqif, double * restrict v_pfcqnng, double * restrict v_pfcqlng, double * restrict v_pfsqrf, double * restrict v_pfsqsf, double * restrict v_pfcqrng,
double * restrict v_pfcqsng, double * restrict v_pfsqltur, double * restrict v_pfsqitur, double * restrict v_pfplsl, double * restrict v_pfplsn, double * restrict v_pfhpsl,
double * restrict v_pfhpsn);

#endif
27 changes: 15 additions & 12 deletions src/cloudsc_c/cloudsc/cloudsc_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,10 @@ void cloudsc_driver(int numthreads, int numcols, int nproma) {
double *pvervel; //! Vertical velocity
double *pap; //! Pressure on full levels
double *paph; //! Pressure on half levels
double *plsm; //! Land fraction (0-1)
double *plsm; //! Land fraction (0-1)
int *ktype; //! Convection type 0,1,2
double *plu; //! Conv. condensate
double *plude; //! Conv. detrained water
double *plude; //! Conv. detrained water
double *plude_tmp;
double *psnde; //! Conv. detrained snow
double *pmfu; //! Conv. mass flux up
Expand Down Expand Up @@ -231,9 +231,10 @@ void cloudsc_driver(int numthreads, int numcols, int nproma) {
double t2 = omp_get_wtime();

printf(" NUMOMP=%d, NGPTOT=%d, NPROMA=%d, NGPBLKS=%d\n", numthreads, numcols, nproma, nblocks);
printf(" %+10s%+10s%+10s%+10s%+10s %+4s : %+10s%+10s\n",
"NUMOMP", "NGPTOT", "#GP-cols", "#BLKS", "NPROMA", "tid#", "Time(msec)", "MFlops/s");
double zfrac, zmflops;
printf(" Reference MFLOP count for 100 columns : %12.8f\n", 1.0e-06 * zhpm);
printf(" %+10s%+10s%+10s%+10s%+10s %+4s : %+10s%+10s%+10s\n",
"NUMOMP", "NGPTOT", "#GP-cols", "#BLKS", "NPROMA", "tid#", "Time(msec)", "MFlops/s", "col/s");
double zfrac, zmflops, zthrput;
for (int t = 0; t < numthreads; t++) {
const double tloc = zinfo[0][t];
const int coreid = (int) zinfo[1][t];
Expand All @@ -242,11 +243,13 @@ void cloudsc_driver(int numthreads, int numcols, int nproma) {
zfrac = (double)igpc / (double)numcols;
if (tloc > 0.0) {
zmflops = 1.0e-06 * zfrac * zhpm * ((double)numcols / 100.) / tloc;
zthrput = (double)numcols / tloc;
} else {
zmflops = 0.;
zthrput = 0.;
}
printf(" %10d%10d%10d%10d%10d %4d : %10d%10d @ core#\n",
numthreads, numcols, igpc, icalls, nproma, t, (int)(tloc * 1000.), (int)zmflops);
printf(" %10d%10d%10d%10d%10d %4d : %10d%10d%10d @ core#\n",
numthreads, numcols, igpc, icalls, nproma, t, (int)(tloc * 1000.), (int)zmflops, (int)zthrput);
}
double tdiff = t2 - t1;
zfrac = 1.0;
Expand All @@ -255,18 +258,18 @@ void cloudsc_driver(int numthreads, int numcols, int nproma) {
} else {
zmflops = 0.0;
}
printf(" %10d%10d%10d%10d%10d %4d : %10d%10d TOTAL\n",
numthreads, numcols, numcols, nblocks, nproma, -1, (int)(tdiff * 1000.), (int)zmflops);
printf(" %10d%10d%10d%10d%10d %4d : %10d%10d%10d TOTAL\n",
numthreads, numcols, numcols, nblocks, nproma, -1, (int)(tdiff * 1000.), (int)zmflops, (int)zthrput);

cloudsc_validate(klon, nlev, nclv, numcols, nproma,
plude, pcovptot, prainfrac_toprfz, pfsqlf, pfsqif,
pfcqlng, pfcqnng, pfsqrf, pfsqsf, pfcqrng, pfcqsng,
pfsqltur, pfsqitur, pfplsl, pfplsn, pfhpsl, pfhpsn,
tend_loc_a, tend_loc_q, tend_loc_t, tend_loc_cld);

free(plcrit_aer); // ALLOCATE(PLCRIT_AER(KLON,KLEV))
free(picrit_aer); // ALLOCATE(PICRIT_AER(KLON,KLEV))
free(pre_ice); // ALLOCATE(PRE_ICE(KLON,KLEV))
free(plcrit_aer); // ALLOCATE(PLCRIT_AER(KLON,KLEV))
free(picrit_aer); // ALLOCATE(PICRIT_AER(KLON,KLEV))
free(pre_ice); // ALLOCATE(PRE_ICE(KLON,KLEV))
free(pccn);
free(pnice);
free(pt);
Expand Down
5 changes: 5 additions & 0 deletions src/cloudsc_c/cloudsc/cloudsc_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
* nor does it submit to any jurisdiction.
*/

#ifndef CLOUDSC_DRIVER_H
#define CLOUDSC_DRIVER_H

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
Expand All @@ -22,3 +25,5 @@
#include "cloudsc_validate.h"

void cloudsc_driver(int numthreads, int numcols, int nproma);

#endif
5 changes: 5 additions & 0 deletions src/cloudsc_c/cloudsc/cloudsc_validate.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,15 @@
* nor does it submit to any jurisdiction.
*/

#ifndef CLOUDSC_VALIDATE_H
#define CLOUDSC_VALIDATE_H

#include "load_state.h"

int cloudsc_validate(const int nlon, const int nlev, const int nclv, const int ngptot, const int nproma,
double *plude, double *pcovptot, double *prainfrac_toprfz, double *pfsqlf, double *pfsqif,
double *pfcqlng, double *pfcqnng, double *pfsqrf, double *pfsqsf, double *pfcqrng, double *pfcqsng,
double *pfsqltur, double *pfsqitur, double *pfplsl, double *pfplsn, double *pfhpsl, double *pfhpsn,
double *tend_loc_a, double *tend_loc_q, double *tend_loc_t, double *tend_loc_cld);

#endif
9 changes: 7 additions & 2 deletions src/cloudsc_c/cloudsc/load_state.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
* nor does it submit to any jurisdiction.
*/

#ifndef LOAD_STATE_H
#define LOAD_STATE_H

#include <stdio.h>
#include <stdlib.h>

Expand All @@ -20,10 +23,10 @@ void query_state(int *klon, int *klev);

void load_state(const int nlon, const int nlev, const int nclv, const int ngptot, const int nproma,
double* ptsphy, double* plcrit_aer, double* picrit_aer,
double* pre_ice, double* pccn, double* pnice, double* pt, double* pq,
double* pre_ice, double* pccn, double* pnice, double* pt, double* pq,
double* tend_cml_t, double* tend_cml_q, double* tend_cml_a, double* tend_cml_cld,
double* tend_tmp_t, double* tend_tmp_q, double* tend_tmp_a, double* tend_tmp_cld,
double* pvfa, double* pvfl, double* pvfi, double* pdyna, double* pdynl, double* pdyni,
double* pvfa, double* pvfl, double* pvfi, double* pdyna, double* pdynl, double* pdyni,
double* phrsw, double* phrlw, double* pvervel, double* pap, double* paph, double* plsm,
int* ktype, double* plu, double* plude, double* psnde, double* pmfu,
double* pmfd, double* pa, double* pclv, double* psupsat);
Expand All @@ -34,3 +37,5 @@ void load_reference(const int nlon, const int nlev, const int nclv, const int ng
double *pfcqlng, double *pfcqnng, double *pfsqrf, double *pfsqsf, double *pfcqrng, double *pfcqsng,
double *pfsqltur, double *pfsqitur, double *pfplsl, double *pfplsn, double *pfhpsl, double *pfhpsn,
double *tend_loc_a, double *tend_loc_q, double *tend_loc_t, double *tend_loc_cld);

#endif
5 changes: 5 additions & 0 deletions src/cloudsc_c/cloudsc/mycpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,9 @@
* nor does it submit to any jurisdiction.
*/

#ifndef MYCPU_H
#define MYCPU_H

int mycpu ();

#endif
20 changes: 20 additions & 0 deletions src/cloudsc_c/cloudsc/yoecldp_c.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* (C) Copyright 1988- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
* In applying this licence, ECMWF does not waive the privileges and immunities
* granted to it by virtue of its status as an intergovernmental organisation
* nor does it submit to any jurisdiction.
*/

#include "yoecldp_c.h"

int nclv; // number of microphysics variables
int ncldql; // liquid cloud water
int ncldqi; // ice cloud water
int ncldqr; // rain water
int ncldqs; // snow
int ncldqv; // vapour

struct TECLDP *yrecldp;
14 changes: 7 additions & 7 deletions src/cloudsc_c/cloudsc/yoecldp_c.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@
#ifndef YOECLDP_H
#define YOECLDP_H

int nclv; // number of microphysics variables
int ncldql; // liquid cloud water
int ncldqi; // ice cloud water
int ncldqr; // rain water
int ncldqs; // snow
int ncldqv; // vapour
extern int nclv; // number of microphysics variables
extern int ncldql; // liquid cloud water
extern int ncldqi; // ice cloud water
extern int ncldqr; // rain water
extern int ncldqs; // snow
extern int ncldqv; // vapour

struct TECLDP {
double ramid;
Expand Down Expand Up @@ -140,6 +140,6 @@ struct TECLDP {
double rbetap1[0][100];
} ;

struct TECLDP *yrecldp;
extern struct TECLDP *yrecldp;

#endif
35 changes: 35 additions & 0 deletions src/cloudsc_c/cloudsc/yoethf_c.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* (C) Copyright 1988- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
* In applying this licence, ECMWF does not waive the privileges and immunities
* granted to it by virtue of its status as an intergovernmental organisation
* nor does it submit to any jurisdiction.
*/

#include "yoethf_c.h"

double r2es;
double r3les;
double r3ies;
double r4les;
double r4ies;
double r5les;
double r5ies;
double rvtmp2;
double rhoh2o;
double r5alvcp;
double r5alscp;
double ralvdcp;
double ralsdcp;
double ralfdcp;
double rtwat;
double rtber;
double rtbercu;
double rtice;
double rticecu;
double rtwat_rtice_r;
double rtwat_rticecu_r;
double rkoop1;
double rkoop2;
Loading