source: CIVL/examples/omp/shtns/sht_com.c

main
Last change on this file was ea777aa, checked in by Alex Wilton <awilton@…>, 3 years ago

Moved examples, include, build_default.properties, common.xml, and README out from dev.civl.com into the root of the repo.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5704 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 11.5 KB
Line 
1/*
2 * Copyright (c) 2010-2015 Centre National de la Recherche Scientifique.
3 * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France).
4 *
5 * nathanael.schaeffer@ujf-grenoble.fr
6 *
7 * This software is governed by the CeCILL license under French law and
8 * abiding by the rules of distribution of free software. You can use,
9 * modify and/or redistribute the software under the terms of the CeCILL
10 * license as circulated by CEA, CNRS and INRIA at the following URL
11 * "http://www.cecill.info".
12 *
13 * The fact that you are presently reading this means that you have had
14 * knowledge of the CeCILL license and that you accept its terms.
15 *
16 */
17
18
19// common sht functions and api calls
20
21/* regular transforms */
22
23void SH_to_spat(shtns_cfg shtns, cplx *Qlm, double *Vr) {
24 ((pf2l)shtns->ftable[SHT_STD][SHT_TYP_SSY])(shtns, Qlm, Vr, shtns->lmax);
25}
26
27void spat_to_SH(shtns_cfg shtns, double *Vr, cplx *Qlm) {
28 ((pf2l)shtns->ftable[SHT_STD][SHT_TYP_SAN])(shtns, Vr, Qlm, shtns->lmax);
29}
30
31void SHsphtor_to_spat(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp) {
32 ((pf4l)shtns->ftable[SHT_STD][SHT_TYP_VSY])(shtns, Slm, Tlm, Vt, Vp, shtns->lmax);
33}
34
35void spat_to_SHsphtor(shtns_cfg shtns, double *Vt, double *Vp, cplx *Slm, cplx *Tlm) {
36 ((pf4l)shtns->ftable[SHT_STD][SHT_TYP_VAN])(shtns, Vt, Vp, Slm, Tlm, shtns->lmax);
37}
38
39void SHqst_to_spat(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp) {
40 ((pf6l)shtns->ftable[SHT_STD][SHT_TYP_3SY])(shtns, Qlm, Slm, Tlm, Vr, Vt, Vp, shtns->lmax);
41}
42
43void spat_to_SHqst(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm) {
44 ((pf6l)shtns->ftable[SHT_STD][SHT_TYP_3AN])(shtns, Vr, Vt, Vp, Qlm, Slm, Tlm, shtns->lmax);
45}
46
47void SHtor_to_spat(shtns_cfg shtns, cplx *Tlm, double *Vt, double *Vp) {
48 ((pf3l)shtns->ftable[SHT_STD][SHT_TYP_GTO])(shtns, Tlm, Vt, Vp, shtns->lmax);
49}
50
51void SHsph_to_spat(shtns_cfg shtns, cplx *Slm, double *Vt, double *Vp) {
52 ((pf3l)shtns->ftable[SHT_STD][SHT_TYP_GSP])(shtns, Slm, Vt, Vp, shtns->lmax);
53}
54
55
56/* variable l-truncated transforms */
57
58void SH_to_spat_l(shtns_cfg shtns, cplx *Qlm, double *Vr, int ltr) {
59 ((pf2l)shtns->ftable[SHT_LTR][SHT_TYP_SSY])(shtns, Qlm, Vr, ltr);
60}
61
62void spat_to_SH_l(shtns_cfg shtns, double *Vr, cplx *Qlm, int ltr) {
63 ((pf2l)shtns->ftable[SHT_LTR][SHT_TYP_SAN])(shtns, Vr, Qlm, ltr);
64}
65
66void SHsphtor_to_spat_l(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, int ltr) {
67 ((pf4l)shtns->ftable[SHT_LTR][SHT_TYP_VSY])(shtns, Slm, Tlm, Vt, Vp, ltr);
68}
69
70void spat_to_SHsphtor_l(shtns_cfg shtns, double *Vt, double *Vp, cplx *Slm, cplx *Tlm, int ltr) {
71 ((pf4l)shtns->ftable[SHT_LTR][SHT_TYP_VAN])(shtns, Vt, Vp, Slm, Tlm, ltr);
72}
73
74void SHqst_to_spat_l(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, int ltr) {
75 ((pf6l)shtns->ftable[SHT_LTR][SHT_TYP_3SY])(shtns, Qlm, Slm, Tlm, Vr, Vt, Vp, ltr);
76}
77
78void spat_to_SHqst_l(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int ltr) {
79 ((pf6l)shtns->ftable[SHT_LTR][SHT_TYP_3AN])(shtns, Vr, Vt, Vp, Qlm, Slm, Tlm, ltr);
80}
81
82void SHtor_to_spat_l(shtns_cfg shtns, cplx *Tlm, double *Vt, double *Vp, int ltr) {
83 ((pf3l)shtns->ftable[SHT_LTR][SHT_TYP_GTO])(shtns, Tlm, Vt, Vp, ltr);
84}
85
86void SHsph_to_spat_l(shtns_cfg shtns, cplx *Slm, double *Vt, double *Vp, int ltr) {
87 ((pf3l)shtns->ftable[SHT_LTR][SHT_TYP_GSP])(shtns, Slm, Vt, Vp, ltr);
88}
89
90
91/* fixed m, variable l-truncated legendre transforms (no fft) */
92
93void SH_to_spat_ml(shtns_cfg shtns, int im, cplx *Qlm, cplx *Vr, int ltr) {
94 ((pf2ml)shtns->ftable[SHT_M][SHT_TYP_SSY])(shtns, im, Qlm, Vr, ltr);
95}
96
97void spat_to_SH_ml(shtns_cfg shtns, int im, cplx *Vr, cplx *Qlm, int ltr) {
98 ((pf2ml)shtns->ftable[SHT_M][SHT_TYP_SAN])(shtns, im, Vr, Qlm, ltr);
99}
100
101void SHsphtor_to_spat_ml(shtns_cfg shtns, int im, cplx *Slm, cplx *Tlm, cplx *Vt, cplx *Vp, int ltr) {
102 ((pf4ml)shtns->ftable[SHT_M][SHT_TYP_VSY])(shtns, im, Slm, Tlm, Vt, Vp, ltr);
103}
104
105void spat_to_SHsphtor_ml(shtns_cfg shtns, int im, cplx *Vt, cplx *Vp, cplx *Slm, cplx *Tlm, int ltr) {
106 ((pf4ml)shtns->ftable[SHT_M][SHT_TYP_VAN])(shtns, im, Vt, Vp, Slm, Tlm, ltr);
107}
108
109void SHqst_to_spat_ml(shtns_cfg shtns, int im, cplx *Qlm, cplx *Slm, cplx *Tlm, cplx *Vr, cplx *Vt, cplx *Vp, int ltr) {
110 ((pf6ml)shtns->ftable[SHT_M][SHT_TYP_3SY])(shtns, im, Qlm, Slm, Tlm, Vr, Vt, Vp, ltr);
111}
112
113void spat_to_SHqst_ml(shtns_cfg shtns, int im, cplx *Vr, cplx *Vt, cplx *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int ltr) {
114 ((pf6ml)shtns->ftable[SHT_M][SHT_TYP_3AN])(shtns, im, Vr, Vt, Vp, Qlm, Slm, Tlm, ltr);
115}
116
117void SHtor_to_spat_ml(shtns_cfg shtns, int im, cplx *Tlm, cplx *Vt, cplx *Vp, int ltr) {
118 ((pf3ml)shtns->ftable[SHT_M][SHT_TYP_GTO])(shtns, im, Tlm, Vt, Vp, ltr);
119}
120
121void SHsph_to_spat_ml(shtns_cfg shtns, int im, cplx *Slm, cplx *Vt, cplx *Vp, int ltr) {
122 ((pf3ml)shtns->ftable[SHT_M][SHT_TYP_GSP])(shtns, im, Slm, Vt, Vp, ltr);
123}
124
125
126/* successive scalar + vector for 3D transform (can be faster than simultaneous transform) */
127static
128void SHqst_to_spat_2(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp) {
129 const int ltr = shtns->lmax;
130 ((pf2l)shtns->ftable[SHT_STD][SHT_TYP_SSY])(shtns, Qlm, Vr, ltr);
131 ((pf4l)shtns->ftable[SHT_STD][SHT_TYP_VSY])(shtns, Slm, Tlm, Vt, Vp, ltr);
132}
133
134static
135void SHqst_to_spat_2l(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, int ltr) {
136 ((pf2l)shtns->ftable[SHT_LTR][SHT_TYP_SSY])(shtns, Qlm, Vr, ltr);
137 ((pf4l)shtns->ftable[SHT_LTR][SHT_TYP_VSY])(shtns, Slm, Tlm, Vt, Vp, ltr);
138}
139
140static
141void spat_to_SHqst_2(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm) {
142 const int ltr = shtns->lmax;
143 ((pf2l)shtns->ftable[SHT_STD][SHT_TYP_SAN])(shtns, Vr, Qlm, ltr);
144 ((pf4l)shtns->ftable[SHT_STD][SHT_TYP_VAN])(shtns, Vt, Vp, Slm, Tlm, ltr);
145}
146
147static
148void spat_to_SHqst_2l(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int ltr) {
149 ((pf2l)shtns->ftable[SHT_LTR][SHT_TYP_SAN])(shtns, Vr, Qlm, ltr);
150 ((pf4l)shtns->ftable[SHT_LTR][SHT_TYP_VAN])(shtns, Vt, Vp, Slm, Tlm, ltr);
151}
152
153static
154void SHqst_to_spat_2ml(shtns_cfg shtns, int im, cplx *Qlm, cplx *Slm, cplx *Tlm, cplx *Vr, cplx *Vt, cplx *Vp, int ltr) {
155 ((pf2ml)shtns->ftable[SHT_M][SHT_TYP_SSY])(shtns, im, Qlm, Vr, ltr);
156 ((pf4ml)shtns->ftable[SHT_M][SHT_TYP_VSY])(shtns, im, Slm, Tlm, Vt, Vp, ltr);
157}
158
159static
160void spat_to_SHqst_2ml(shtns_cfg shtns, int im, cplx *Vr, cplx *Vt, cplx *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int ltr) {
161 ((pf2ml)shtns->ftable[SHT_M][SHT_TYP_SAN])(shtns, im, Vr, Qlm, ltr);
162 ((pf4ml)shtns->ftable[SHT_M][SHT_TYP_VAN])(shtns, im, Vt, Vp, Slm, Tlm, ltr);
163}
164
165
166#if defined(SHT_F77_API)
167
168/* Fortran 77 api */
169
170extern shtns_cfg sht_data;
171
172// Fortran API : Call from fortran without the trailing '_'
173//@{
174
175 // regular
176/// \ingroup fortapi
177void shtns_sh_to_spat_(cplx *Qlm, double *Vr) {
178 ((pf2l)sht_data->ftable[SHT_STD][SHT_TYP_SSY])(sht_data, Qlm, Vr, sht_data->lmax);
179}
180
181/// \ingroup fortapi
182void shtns_spat_to_sh_(double *Vr, cplx *Qlm) {
183 ((pf2l)sht_data->ftable[SHT_STD][SHT_TYP_SAN])(sht_data, Vr, Qlm, sht_data->lmax);
184}
185
186/// \ingroup fortapi
187void shtns_sh_to_spat_cplx_(cplx *alm, cplx *z) {
188 SH_to_spat_cplx(sht_data, alm, z);
189}
190
191/// \ingroup fortapi
192void shtns_spat_cplx_to_sh_(cplx *z, cplx *alm) {
193 spat_cplx_to_SH(sht_data, z, alm);
194}
195
196/// \ingroup fortapi
197void shtns_sphtor_to_spat_(cplx *Slm, cplx *Tlm, double *Vt, double *Vp) {
198 ((pf4l)sht_data->ftable[SHT_STD][SHT_TYP_VSY])(sht_data, Slm, Tlm, Vt, Vp, sht_data->lmax);
199}
200
201/// \ingroup fortapi
202void shtns_spat_to_sphtor_(double *Vt, double *Vp, cplx *Slm, cplx *Tlm) {
203 ((pf4l)sht_data->ftable[SHT_STD][SHT_TYP_VAN])(sht_data, Vt, Vp, Slm, Tlm, sht_data->lmax);
204}
205
206/// \ingroup fortapi
207void shtns_qst_to_spat_(cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp) {
208 ((pf6l)sht_data->ftable[SHT_STD][SHT_TYP_3SY])(sht_data, Qlm, Slm, Tlm, Vr, Vt, Vp, sht_data->lmax);
209}
210
211/// \ingroup fortapi
212void shtns_spat_to_qst_(double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm) {
213 ((pf6l)sht_data->ftable[SHT_STD][SHT_TYP_3AN])(sht_data, Vr, Vt, Vp, Qlm, Slm, Tlm, sht_data->lmax);
214}
215
216/// \ingroup fortapi
217void shtns_sph_to_spat_(cplx *Slm, double *Vt, double *Vp) {
218 ((pf3l)sht_data->ftable[SHT_STD][SHT_TYP_GSP])(sht_data, Slm, Vt, Vp, sht_data->lmax);
219}
220
221/// \ingroup fortapi
222void shtns_tor_to_spat_(cplx *Tlm, double *Vt, double *Vp) {
223 ((pf3l)sht_data->ftable[SHT_STD][SHT_TYP_GTO])(sht_data, Tlm, Vt, Vp, sht_data->lmax);
224}
225
226
227 // variable l-truncation
228/// \ingroup fortapi
229void shtns_sh_to_spat_l_(cplx *Qlm, double *Vr, int* ltr) {
230 ((pf2l)sht_data->ftable[SHT_LTR][SHT_TYP_SSY])(sht_data, Qlm, Vr, *ltr);
231}
232
233/// \ingroup fortapi
234void shtns_spat_to_sh_l_(double *Vr, cplx *Qlm, int* ltr) {
235 ((pf2l)sht_data->ftable[SHT_LTR][SHT_TYP_SAN])(sht_data, Vr, Qlm, *ltr);
236}
237
238/// \ingroup fortapi
239void shtns_sphtor_to_spat_l_(cplx *Slm, cplx *Tlm, double *Vt, double *Vp, int* ltr) {
240 ((pf4l)sht_data->ftable[SHT_LTR][SHT_TYP_VSY])(sht_data, Slm, Tlm, Vt, Vp, *ltr);
241}
242
243/// \ingroup fortapi
244void shtns_spat_to_sphtor_l_(double *Vt, double *Vp, cplx *Slm, cplx *Tlm, int* ltr) {
245 ((pf4l)sht_data->ftable[SHT_LTR][SHT_TYP_VAN])(sht_data, Vt, Vp, Slm, Tlm, *ltr);
246}
247
248/// \ingroup fortapi
249void shtns_qst_to_spat_l_(cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, int* ltr) {
250 ((pf6l)sht_data->ftable[SHT_LTR][SHT_TYP_3SY])(sht_data, Qlm, Slm, Tlm, Vr, Vt, Vp, *ltr);
251}
252
253/// \ingroup fortapi
254void shtns_spat_to_qst_l_(double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int* ltr) {
255 ((pf6l)sht_data->ftable[SHT_LTR][SHT_TYP_3AN])(sht_data, Vr, Vt, Vp, Qlm, Slm, Tlm, *ltr);
256}
257
258/// \ingroup fortapi
259void shtns_sph_to_spat_l_(cplx *Slm, double *Vt, double *Vp, int* ltr) {
260 ((pf3l)sht_data->ftable[SHT_LTR][SHT_TYP_GSP])(sht_data, Slm, Vt, Vp, *ltr);
261}
262
263/// \ingroup fortapi
264void shtns_tor_to_spat_l_(cplx *Tlm, double *Vt, double *Vp, int* ltr) {
265 ((pf3l)sht_data->ftable[SHT_LTR][SHT_TYP_GTO])(sht_data, Tlm, Vt, Vp, *ltr);
266}
267
268
269 // fixed m, variable l-truncation (no fft, aka Legendre transform)
270/// \ingroup fortapi
271void shtns_sh_to_spat_ml_(int *im, cplx *Qlm, cplx *Vr, int *ltr) {
272 ((pf2ml)sht_data->ftable[SHT_M][SHT_TYP_SSY])(sht_data, *im, Qlm, Vr, *ltr);
273}
274
275/// \ingroup fortapi
276void shtns_spat_to_sh_ml_(int *im, cplx *Vr, cplx *Qlm, int *ltr) {
277 ((pf2ml)sht_data->ftable[SHT_M][SHT_TYP_SAN])(sht_data, *im, Vr, Qlm, *ltr);
278}
279
280/// \ingroup fortapi
281void shtns_sphtor_to_spat_ml_(int *im, cplx *Slm, cplx *Tlm, cplx *Vt, cplx *Vp, int *ltr) {
282 ((pf4ml)sht_data->ftable[SHT_M][SHT_TYP_VSY])(sht_data, *im, Slm, Tlm, Vt, Vp, *ltr);
283}
284
285/// \ingroup fortapi
286void shtns_spat_to_sphtor_ml_(int *im, cplx *Vt, cplx *Vp, cplx *Slm, cplx *Tlm, int *ltr) {
287 ((pf4ml)sht_data->ftable[SHT_M][SHT_TYP_VAN])(sht_data, *im, Vt, Vp, Slm, Tlm, *ltr);
288}
289
290/// \ingroup fortapi
291void shtns_qst_to_spat_ml_(int *im, cplx *Qlm, cplx *Slm, cplx *Tlm, cplx *Vr, cplx *Vt, cplx *Vp, int *ltr) {
292 ((pf6ml)sht_data->ftable[SHT_M][SHT_TYP_3SY])(sht_data, *im, Qlm, Slm, Tlm, Vr, Vt, Vp, *ltr);
293}
294
295/// \ingroup fortapi
296void shtns_spat_to_qst_ml_(int *im, cplx *Vr, cplx *Vt, cplx *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int *ltr) {
297 ((pf6ml)sht_data->ftable[SHT_M][SHT_TYP_3AN])(sht_data, *im, Vr, Vt, Vp, Qlm, Slm, Tlm, *ltr);
298}
299
300/// \ingroup fortapi
301void shtns_tor_to_spat_ml_(int *im, cplx *Tlm, cplx *Vt, cplx *Vp, int *ltr) {
302 ((pf3ml)sht_data->ftable[SHT_M][SHT_TYP_GTO])(sht_data, *im, Tlm, Vt, Vp, *ltr);
303}
304
305/// \ingroup fortapi
306void shtns_sph_to_spat_ml_(int *im, cplx *Slm, cplx *Vt, cplx *Vp, int *ltr) {
307 ((pf3ml)sht_data->ftable[SHT_M][SHT_TYP_GSP])(sht_data, *im, Slm, Vt, Vp, *ltr);
308}
309
310
311//@}
312#endif
Note: See TracBrowser for help on using the repository browser.