-
Notifications
You must be signed in to change notification settings - Fork 237
/
ctrl_cost_driver.F
154 lines (123 loc) · 3.91 KB
/
ctrl_cost_driver.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
#include "CTRL_OPTIONS.h"
subroutine ctrl_cost_driver( myThid )
c ==================================================================
c SUBROUTINE ctrl_cost_driver
c ==================================================================
implicit none
c == global variables ==
#include "EEPARAMS.h"
#include "SIZE.h"
#include "PARAMS.h"
#include "GRID.h"
#ifdef ALLOW_CTRL
# include "CTRL_SIZE.h"
# include "CTRL.h"
# include "CTRL_DUMMY.h"
# include "CTRL_GENARR.h"
#endif
c == routine arguments ==
integer myThid
c == local variables ==
#ifdef ALLOW_CTRL
integer ivar
#ifdef ALLOW_GENTIM2D_CONTROL
integer startrec
integer endrec
#endif
#if ( defined ALLOW_GENTIM2D_CONTROL \
|| defined ALLOW_GENARR2D_CONTROL \
|| defined ALLOW_GENARR3D_CONTROL )
integer iarr
logical dodimensionalcost
integer k2
#endif
#if ( defined ALLOW_GENTIM2D_CONTROL \
|| defined ALLOW_GENARR2D_CONTROL )
_RS mask2D(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
#endif
#ifdef ALLOW_GENARR3D_CONTROL
_RS mask3D(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
#endif
c == end of interface ==
c-- Evaluate the individual cost function contributions.
do ivar = 1, maxcvars
#ifdef ALLOW_GENTIM2D_CONTROL
if ( ncvartype(ivar) .EQ. 'Tim2D' ) then
iarr = ncvarindex(ivar)
dodimensionalcost=.FALSE.
do k2 = 1, maxCtrlProc
if (xx_gentim2d_preproc(k2,iarr).EQ.'noscaling') then
dodimensionalcost=.TRUE.
endif
enddo
if (xx_gentim2d_weight(iarr).NE.' ') then
startrec = ncvarrecstart(ivar)
endrec = ncvarrecsend(ivar)
do k2 = 1, maxCtrlProc
if (xx_gentim2d_preproc(k2,iarr).EQ.'replicate') then
if (xx_gentim2d_preproc_i(k2,iarr).NE.0) then
endrec=min(endrec,xx_gentim2d_preproc_i(k2,iarr))
endif
endif
enddo
C --- Get appropriate mask for field
call ctrl_get_mask2D(xx_gentim2d_file(iarr),mask2D,myThid)
call ctrl_cost_gen2d (
& startrec, endrec,
& xx_gentim2d_file(iarr),xx_gentim2d_dummy(iarr),
& xx_gentim2d_period(iarr),
& wgentim2d(1-OLx,1-OLy,1,1,iarr),
& dodimensionalcost,
& num_gentim2d(1,1,iarr),
& objf_gentim2d(1,1,iarr),
& mask2D, myThid )
endif
endif
#endif
#ifdef ALLOW_GENARR2D_CONTROL
if ( ncvartype(ivar) .EQ. 'Arr2D' ) then
iarr = ncvarindex(ivar)
dodimensionalcost=.FALSE.
do k2 = 1, maxCtrlProc
if (xx_genarr2d_preproc(k2,iarr).EQ.'noscaling') then
dodimensionalcost=.TRUE.
endif
enddo
C --- Get appropriate mask for field
call ctrl_get_mask2D(xx_genarr2d_file(iarr),mask2D,myThid)
if (xx_genarr2d_weight(iarr).NE.' ') then
call ctrl_cost_gen2d (
& 1,1,
& xx_genarr2d_file(iarr),xx_genarr2d_dummy(iarr),
& zeroRL, wgenarr2d(1-OLx,1-OLy,1,1,iarr),
& dodimensionalcost,
& num_genarr2d(1,1,iarr), objf_genarr2d(1,1,iarr),
& mask2D, myThid )
endif
endif
#endif
#ifdef ALLOW_GENARR3D_CONTROL
if ( ncvartype(ivar) .EQ. 'Arr3D' ) then
iarr = ncvarindex(ivar)
dodimensionalcost=.FALSE.
do k2 = 1, maxCtrlProc
if (xx_genarr3d_preproc(k2,iarr).EQ.'noscaling') then
dodimensionalcost=.TRUE.
endif
enddo
C --- Get appropriate mask for field
call ctrl_get_mask3D(xx_genarr3d_file(iarr),mask3D,myThid)
if (xx_genarr3d_weight(iarr).NE.' ') then
call ctrl_cost_gen3d (
& xx_genarr3d_file(iarr),xx_genarr3d_dummy(iarr),
& wgenarr3d(1-OLx,1-OLy,1,1,1,iarr),
& dodimensionalcost,
& num_genarr3d(1,1,iarr), objf_genarr3d(1,1,iarr),
& mask3D, myThid )
endif
endif
#endif
enddo
#endif /* ALLOW_CTRL */
return
end