-
Notifications
You must be signed in to change notification settings - Fork 237
/
ctrl_map_gentim2d.F
172 lines (152 loc) · 4.64 KB
/
ctrl_map_gentim2d.F
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include "CTRL_OPTIONS.h"
CBOP
C !ROUTINE: CTRL_MAP_GENTIM2D
C !INTERFACE:
SUBROUTINE CTRL_MAP_GENTIM2D(
I myTime, myIter, myThid )
C !DESCRIPTION: \bv
C *=============================================================*
C | S/R CTRL_MAP_GENTIM2D
C *=============================================================*
C !USES:
IMPLICIT NONE
C === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "FFIELDS.h"
#include "DYNVARS.h"
#include "GRID.h"
#include "CTRL_SIZE.h"
#include "CTRL.h"
#include "CTRL_GENARR.h"
#include "CTRL_DUMMY.h"
#include "OPTIMCYCLE.h"
#ifdef ALLOW_AUTODIFF
#include "AUTODIFF_MYFIELDS.h"
#endif
C !INPUT/OUTPUT PARAMETERS:
C === Routine arguments ===
C myIter :: iteration counter for this thread
C myTime :: time counter for this thread
C myThid :: thread number for this instance of the routine.
_RL myTime
INTEGER myIter
INTEGER myThid
C !LOCAL VARIABLES:
C == Local variables ==
integer bi,bj
integer i,j,k
integer itlo,ithi
integer jtlo,jthi
integer jmin,jmax
integer imin,imax
integer il
integer iarr
logical equal
logical doglobalread
logical ladinit
character*(MAX_LEN_FNAM) fnamebase
_RL fac
_RL xx_gentim2d_loc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
CHARACTER*(MAX_LEN_MBUF) msgBuf
_RL LOCsumTile(nSx,nSy), LOCsumGlob
c == external ==
integer ilnblnk
external ilnblnk
CEOP
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
#ifdef ALLOW_GENTIM2D_CONTROL
C-- An example of connecting specific fields
C-- to generic time-varying 2D control arrays
cph--->>>
cph--->>> COMPILE FAILURE IS DELIBERATE
cph--->>> BE SURE WHAT YOU ARE DOING AND CUSTOMIZE <<<---
cph--->>>
C-- generic - user-defined control vars
DO iarr = 1, maxCtrlTim2D
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
DO J = 1-Oly,sNy+Oly
DO I = 1-Olx,sNx+Olx
xx_gentim2d_loc(I,J,bi,bj) = 0. _d 0
ENDDO
ENDDO
ENDDO
ENDDO
C
fnamebase = xx_gentim2d_file(iarr)
CALL CTRL_GET_GEN (
I xx_gentim2d_file(iarr),
I xx_gentim2d_startdate(1,iarr),
I xx_gentim2d_period(iarr),
I maskC,
O xx_gentim2d_loc,
I xx_gentim2d0(1-Olx,1-Oly,1,1,iarr),
I xx_gentim2d1(1-Olx,1-Oly,1,1,iarr),
I xx_gentim2d_dummy(iarr),
I zeroRL, zeroRL,
I wgentim2d(1-Olx,1-Oly,1,1,iarr),
I mytime, myiter, mythid )
C
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
do j = 1,sNy
do i = 1,sNx
if (xx_gentim2d_cumsum(iarr)) then
xx_gentim2d(i,j,bi,bj,iarr)=xx_gentim2d(i,j,bi,bj,iarr)
& +xx_gentim2d_loc(i,j,bi,bj)
else
xx_gentim2d(i,j,bi,bj,iarr)=xx_gentim2d_loc(i,j,bi,bj)
endif
enddo
enddo
enddo
enddo
C
if (xx_gentim2d_glosum(iarr)) then
LOCsumGlob=0. _d 0
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
LOCsumTile(bi,bj)=0. _d 0
do j = 1,sNy
do i = 1,sNx
LOCsumTile(bi,bj)=LOCsumTile(bi,bj)+
& maskC(i,j,1,bi,bj)*rA(i,j,bi,bj)
& *xx_gentim2d(i,j,bi,bj,iarr)
enddo
enddo
enddo
enddo
CALL GLOBAL_SUM_TILE_RL( LOCsumTile, LOCsumGlob, myThid )
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
DO J = 1-Oly,sNy+Oly
DO I = 1-Olx,sNx+Olx
xx_gentim2d(I,J,bi,bj,iarr) =
& LOCsumGlob/globalArea*maskC(i,j,1,bi,bj)
ENDDO
ENDDO
ENDDO
ENDDO
WRITE(msgBuf,'(A,I6,A,I6,A,1PE21.14)') ' xx_gentim2d ',
& iarr,' : iter=', myiter, ' ; global sum = ', LOCsumGlob
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
endif
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
DO J = 1-Oly,sNy+Oly
DO I = 1-Olx,sNx+Olx
if (iarr.EQ.1) then
theta(I,J,1,bi,bj) = theta(I,J,1,bi,bj)
& + xx_gentim2d(I,J,bi,bj,iarr)
endif
ENDDO
ENDDO
ENDDO
ENDDO
ENDDO
#endif /* ALLOW_GENTIM2D_CONTROL */
RETURN
END