aboutsummaryrefslogtreecommitdiff
path: root/Carpet/LoopControl/src/loopcontrol_fortran.h
blob: 5e879641ca9b870208d33247b1c540bc6c92a996 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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
147
148
149
150
151
152
153
154
155
156
/* -*-f90-*- */

#ifndef LOOPCONTROL_FORTRAN_H
#define LOOPCONTROL_FORTRAN_H

#include "cctk.h"



#define LC_COARSE_DECLARE(name, D)                              \
   && integer :: name/**/_cmin/**/D, name/**/_cmax/**/D,        \
                 name/**/_cstep/**/D, name/**/_cpos/**/D
#define LC_COARSE_OMP_PRIVATE(name, D)                          \
   && !$omp private (name/**/_cmin/**/D, name/**/_cmax/**/D,    \
                     name/**/_cstep/**/D, name/**/_cpos/**/D)
#define LC_COARSE_SETUP(name, D)                                        \
   && name/**/_control%coarse%min%v(D) = name/**/_control%thread%pos%v(D) \
   && name/**/_control%coarse%max%v(D) =                                \
         min(name/**/_control%thread%max%v(D),                          \
             name/**/_control%coarse%min%v(D) +                         \
                name/**/_control%thread%step%v(D))                      \
   && name/**/_cmin/**/D = name/**/_control%coarse%min%v(D)             \
   && name/**/_cmax/**/D = name/**/_control%coarse%max%v(D)             \
   && name/**/_cstep/**/D = name/**/_control%coarse%step%v(D)
#define LC_COARSE_LOOP(name, D)                                         \
   && do name/**/_cpos/**/D = name/**/_cmin/**/D, name/**/_cmax/**/D,   \
                              name/**/_cstep/**/D

#define LC_FINE_DECLARE(name, D)                                \
   && integer :: name/**/_fmin/**/D, name/**/_fmax/**/D,        \
                 name/**/_fstep/**/D
#define LC_FINE_OMP_PRIVATE(name, I, NI, D)                     \
   && !$omp private (name/**/_fmin/**/D, name/**/_fmax/**/D,    \
                     name/**/_fstep/**/D, I, NI)
#define LC_FINE_SETUP(name, D)                                  \
   && name/**/_control%fine%min%v(D) = name/**/_cpos/**/D       \
   && name/**/_control%fine%max%v(D) =                          \
         min(name/**/_control%coarse%max%v(D),                  \
             name/**/_control%fine%min%v(D) +                   \
                name/**/_control%coarse%step%v(D))              \
   && name/**/_fmin/**/D = name/**/_control%fine%min%v(D)       \
   && name/**/_fmax/**/D = name/**/_control%fine%max%v(D)       \
   && name/**/_fstep/**/D = name/**/_control%fine%step%v(D)
#define LC_FINE_LOOP(name, I, NI, D)                                    \
   && do I = name/**/_fmin/**/D, name/**/_fmax/**/D,                    \
             name/**/_fstep/**/D                                        \
   &&    NI = 0                                                         \
   &&    if (name/**/_dir/**/D<0) NI = I                                \
   &&    if (name/**/_dir/**/D>0) NI = name/**/_control%loop%max%v(D)+1-I



#define LC_LOOP3STR_NORMAL_DECLARE(name)                                \
   && integer :: name/**/_dir1, name/**/_dir2, name/**/_dir3            \
   && integer :: name/**/_ash1, name/**/_ash2, name/**/_ash3            \
   && integer :: name/**/_str1                                          \
   && CCTK_POINTER, save :: name/**/_descr = 0                          \
   && type(lc_control_t) :: name/**/_control                            \
      LC_COARSE_DECLARE(name,1)                                         \
      LC_COARSE_DECLARE(name,2)                                         \
      LC_COARSE_DECLARE(name,3)                                         \
      LC_FINE_DECLARE(name,1)                                           \
      LC_FINE_DECLARE(name,2)                                           \
      LC_FINE_DECLARE(name,3)

#define LC_LOOP3STR_NORMAL_OMP_PRIVATE(name, i,j,k)     \
   && !$omp private (name/**/_control)                  \
      LC_COARSE_OMP_PRIVATE(name,1)                     \
      LC_COARSE_OMP_PRIVATE(name,2)                     \
      LC_COARSE_OMP_PRIVATE(name,3)                     \
      LC_FINE_OMP_PRIVATE(name, i, ni,1)                \
      LC_FINE_OMP_PRIVATE(name, j, nj,2)                \
      LC_FINE_OMP_PRIVATE(name, k, nk,3)



#define LC_LOOP3STR_NORMAL(name, i,j,k, ni,nj,nk,                       \
                           idir_,jdir_,kdir_,                           \
                           imin_,jmin_,kmin_,                           \
                           imax_,jmax_,kmax_,                           \
                           iash_,jash_,kash_,                           \
                           vec_imin,vec_imax, istr_)                    \
   && name/**/_dir1 = (idir_)                                           \
   && name/**/_dir2 = (jdir_)                                           \
   && name/**/_dir3 = (kdir_)                                           \
   && name/**/_ash1 = (iash_)                                           \
   && name/**/_ash2 = (jash_)                                           \
   && name/**/_ash3 = (kash_)                                           \
   && name/**/_str1 = (istr_)                                           \
                                                                        \
   && call lc_descr_init(name/**/_descr, __LINE__, __FILE__, "name")    \
   && call lc_control_init(name/**/_control, name/**/_descr,            \
                           (imin_), (jmin_), (kmin_),                   \
                           (imax_), (jmax_), (kmax_),                   \
                           name/**/_ash1, name/**/_ash2, name/**/_ash3, \
                           name/**/_str1)                               \
                                                                        \
      /* Multithreading */                                              \
   && call lc_thread_init(name/**/_control)                             \
   && do while (lc_thread_done(name/**/_control) == 0)                  \
                                                                        \
         /* Coarse loops */                                             \
         LC_COARSE_SETUP(name,3)                                        \
         LC_COARSE_SETUP(name,2)                                        \
         LC_COARSE_SETUP(name,1)                                        \
         LC_COARSE_LOOP(name,3)                                         \
         LC_COARSE_LOOP(name,2)                                         \
         LC_COARSE_LOOP(name,1)                                         \
                                                                        \
            /* Fine loops */                                            \
            LC_FINE_SETUP(name,3)                                       \
            LC_FINE_SETUP(name,2)                                       \
            LC_FINE_SETUP(name,1)                                       \
            LC_FINE_LOOP(name, k, nk,3)                                 \
            LC_FINE_LOOP(name, j, nj,2)                                 \
            LC_FINE_LOOP(name, i, ni,1)

#define LC_ENDLOOP3STR_NORMAL(name)                             \
   &&       end do                                              \
   &&       end do                                              \
   &&       end do                                              \
   &&    end do                                                 \
   &&    end do                                                 \
   &&    end do                                                 \
   &&    call lc_thread_step(name/**/_control)                  \
   && end do                                                    \
   && call lc_control_finish(name/**/_control, name/**/_descr)



#define LC_LOOP3(name, i,j,k, imin,jmin,kmin, imax,jmax,kmax, iash,jash,kash) \
   LC_LOOP3STR(name, i,j,k, imin,jmin,kmin, imax,jmax,kmax, iash,jash,kash, 1)
#define LC_ENDLOOP3(name)                       \
   LC_ENDLOOP3STR(name)



/* Replace CCTK_LOOP macros */
#if (!defined CCTK_LOOP3STR_NORMAL_DECLARE ||           \
     !defined CCTK_LOOP3STR_NORMAL_OMP_PRIVATE ||       \
     !defined CCTK_LOOP3STR_NORMAL ||                   \
     !defined CCTK_ENDLOOP3STR_NORMAL)
#  error "internal error"
#endif
#undef CCTK_LOOP3STR_NORMAL_DECLARE
#undef CCTK_LOOP3STR_NORMAL_OMP_PRIVATE
#undef CCTK_LOOP3STR_NORMAL
#undef CCTK_ENDLOOP3STR_NORMAL
#define CCTK_LOOP3STR_NORMAL_DECLARE     LC_LOOP3STR_NORMAL_DECLARE
#define CCTK_LOOP3STR_NORMAL_OMP_PRIVATE LC_LOOP3STR_NORMAL_OMP_PRIVATE
#define CCTK_LOOP3STR_NORMAL             LC_LOOP3STR_NORMAL
#define CCTK_ENDLOOP3STR_NORMAL          LC_ENDLOOP3STR_NORMAL



#endif  /* #ifndef LOOPCONTROL_FORTRAN_H */