aboutsummaryrefslogtreecommitdiff
path: root/Carpet/LoopControl/src/loopcontrol_fortran.h
blob: f0548b7c3fe76cbcee9783365331a886b880ba39 (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
/* -*-f90-*- */

#ifndef LOOPCONTROL_FORTRAN_H
#define LOOPCONTROL_FORTRAN_H

#include "cctk.h"




#define LC_COARSE_DECLARE(name, D)                              \
   CCTK_POINTER :: name/**/_cmin/**/D, name/**/_cmax/**/D,      \
                   name/**/_cstep/**/D, name/**/_cpos/**/D
#define LC_COARSE_OMP_PRIVATE(name, D)          \
   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, I, D)                             \
   CCTK_POINTER :: name/**/_fmin/**/D, name/**/_fmax/**/D,      \
                   name/**/_fstep/**/D, I
#define LC_FINE_OMP_PRIVATE(name, I, D)         \
   name/**/_fmin/**/D, name/**/_fmax/**/D,      \
   name/**/_fstep/**/D, I
#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, D)                                        \
   do I = name/**/_fmin/**/D, name/**/_fmax/**/D, name/**/_fstep/**/D



#define LC_DECLARE3(name, i,j,k)                                        \
   CCTK_POINTER :: name/**/_ash1, name/**/_ash2, name/**/_ash3          && \
   CCTK_POINTER :: name/**/_align1, name/**/_align2, name/**/_align3    && \
   CCTK_POINTER, save :: name/**/_stats = 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, i, 1)                                          && \
   LC_FINE_DECLARE(name, j, 2)                                          && \
   LC_FINE_DECLARE(name, k, 3)

#define LC_OMP_PRIVATE(name, i,j,k)                     \
   name/**/_ash1, name/**/_ash2, name/**/_ash3,         \
   name/**/_align1, name/**/_align2, name/**/_align3,   \
   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, 1),                     \
   LC_FINE_OMP_PRIVATE(name, j, 2),                     \
   LC_FINE_OMP_PRIVATE(name, k, 3)



#define LC_LOOP3STR(name, i,j,k, imin_,jmin_,kmin_, imax_,jmax_,kmax_,  \
                    iash_,jash_,kash_, di_)                             \
   name/**/_ash1 = (iash_)                                              && \
   name/**/_ash2 = (jash_)                                              && \
   name/**/_ash3 = (kash_)                                              && \
   name/**/_aligh1 = (di_)                                              && \
   name/**/_aligh2 = 1                                                  && \
   name/**/_aligh3 = 1                                                  && \
                                                                        && \
   call lc_stats_init(name/**/stats, #name)                             && \
   call lc_control_init(name/**/control, name/**/stats,                 \
                        (imin_), (jmin_), (kmin_),                      \
                        (imax_), (jmax_), (kmax_),                      \
                        name/**/ash1, name/**/ash2, name/**/ash3,       \
                        name/**/align1, name/**/align2, name/**/align3) && \
                                                                        && \
   /* Multithreading */                                                 && \
   call lc_thread_init(name/**/control)                                 && \
   do while (.not. lc_thread_done(name/**/control))                     && \
                                                                        && \
      /* Coarse loops */                                                && \
      LC_COARSE_SETUP(3)                                                && \
      LC_COARSE_SETUP(2)                                                && \
      LC_COARSE_SETUP(1)                                                && \
      LC_COARSE_LOOP(3)                                                 && \
      LC_COARSE_LOOP(2)                                                 && \
      LC_COARSE_LOOP(1)                                                 && \
                                                                        && \
         /* Fine loops */                                               && \
         LC_FINE_SETUP(3)                                               && \
         LC_FINE_SETUP(2)                                               && \
         LC_FINE_SETUP(1)                                               && \
         LC_FINE_LOOP(3)                                                && \
         LC_FINE_LOOP(2)                                                && \
         LC_FINE_LOOP(1)

#define LC_ENDLOOP3STR(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/**/stats)



#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 */
#undef CCTK_LOOP3_DECLARE
#undef CCTK_LOOP3_OMP_PRIVATE
#undef CCTK_LOOP3
#undef CCTK_ENDLOOP3
#define CCTK_LOOP3_DECLARE     LC_LOOP3_DECLARE
#define CCTK_LOOP3_OMP_PRIVATE LC_LOOP3_OMP_PRIVATE
#define CCTK_LOOP3             LC_LOOP3
#define CCTK_ENDLOOP3          LC_ENDLOOP3



#endif  /* #ifndef LOOPCONTROL_FORTRAN_H */