/[MITgcm]/MITgcm/pkg/ctrl/ctrl_set_unpack_xyz.F
ViewVC logotype

Contents of /MITgcm/pkg/ctrl/ctrl_set_unpack_xyz.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.18 - (show annotations) (download)
Tue Jun 19 03:42:30 2007 UTC (16 years, 11 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint59e, checkpoint59d, checkpoint59g, checkpoint59f, checkpoint59h
Changes since 1.17: +2 -0 lines
pkg/smooth application to control vector

1
2 #include "CTRL_CPPOPTIONS.h"
3
4 subroutine ctrl_set_unpack_xyz(
5 & lxxadxx, cunit, ivartype, fname, masktype, weighttype,
6 & weightfld, nwetglobal, mythid)
7
8 c ==================================================================
9 c SUBROUTINE ctrl_set_unpack_xyz
10 c ==================================================================
11 c
12 c o Unpack the control vector such that land points are filled in.
13 c
14 c o Use a more precise nondimensionalization that depends on (x,y)
15 c Added weighttype to the argument list so that I can geographically
16 c vary the nondimensionalization.
17 c gebbie@mit.edu, 18-Mar-2003
18 c
19 c ==================================================================
20
21 implicit none
22
23 c == global variables ==
24
25 #include "EEPARAMS.h"
26 #include "SIZE.h"
27 #include "PARAMS.h"
28 #include "GRID.h"
29
30 #include "ctrl.h"
31 #include "optim.h"
32
33 c == routine arguments ==
34
35 logical lxxadxx
36 integer cunit
37 integer ivartype
38 character*( 80) fname
39 character*( 9) masktype
40 character*( 80) weighttype
41 _RL weightfld( nr,nsx,nsy )
42 integer nwetglobal(nr)
43 integer mythid
44
45 #ifndef EXCLUDE_CTRL_PACK
46 c == local variables ==
47
48 integer bi,bj
49 integer ip,jp
50 integer i,j,k
51 integer ii
52 integer il
53 integer irec
54 integer itlo,ithi
55 integer jtlo,jthi
56 integer jmin,jmax
57 integer imin,imax
58
59 integer cbuffindex
60
61 _RL globmsk ( snx,nsx,npx,sny,nsy,npy,nr )
62 _RL globfld3d( snx,nsx,npx,sny,nsy,npy,nr )
63 #ifdef CTRL_UNPACK_PRECISE
64 _RL weightfld3d( snx,nsx,npx,sny,nsy,npy,nr )
65 #endif
66 real*4 cbuff ( snx*nsx*npx*sny*nsy*npy )
67 real*4 globfldtmp2( snx,nsx,npx,sny,nsy,npy )
68 real*4 globfldtmp3( snx,nsx,npx,sny,nsy,npy )
69
70 character*(128) cfile
71 character*(80) weightname
72
73 _RL delZnorm
74 integer reclen, irectrue
75 integer cunit2, cunit3
76 character*(80) cfile2, cfile3
77
78 c == external ==
79
80 integer ilnblnk
81 external ilnblnk
82
83 cc == end of interface ==
84
85 jtlo = 1
86 jthi = nsy
87 itlo = 1
88 ithi = nsx
89 jmin = 1
90 jmax = sny
91 imin = 1
92 imax = snx
93
94 #ifdef CTRL_DELZNORM
95 delZnorm = 0.
96 do k = 1, Nr
97 delZnorm = delZnorm + delR(k)/FLOAT(Nr)
98 enddo
99 #endif
100
101 c Initialise temporary file
102 do k = 1,nr
103 do jp = 1,nPy
104 do bj = jtlo,jthi
105 do j = jmin,jmax
106 do ip = 1,nPx
107 do bi = itlo,ithi
108 do i = imin,imax
109 globfld3d (i,bi,ip,j,bj,jp,k) = 0. _d 0
110 globmsk (i,bi,ip,j,bj,jp,k) = 0. _d 0
111 globfldtmp2(i,bi,ip,j,bj,jp) = 0.
112 globfldtmp3(i,bi,ip,j,bj,jp) = 0.
113 enddo
114 enddo
115 enddo
116 enddo
117 enddo
118 enddo
119 enddo
120
121 c-- Only the master thread will do I/O.
122 _BEGIN_MASTER( mythid )
123
124 #ifdef CTRL_DELZNORM
125 do k = 1, nr
126 print *, 'ph-delznorm ', k, delZnorm, delR(k)
127 print *, 'ph-weight ', weightfld(k,1,1)
128 enddo
129 #endif
130
131 if ( doPackDiag ) then
132 write(cfile2(1:80),'(80a)') ' '
133 write(cfile3(1:80),'(80a)') ' '
134 if ( lxxadxx ) then
135 write(cfile2(1:80),'(a,I2.2,a,I4.4,a)')
136 & 'diag_unpack_nondim_ctrl_',
137 & ivartype, '_', optimcycle, '.bin'
138 write(cfile3(1:80),'(a,I2.2,a,I4.4,a)')
139 & 'diag_unpack_dimens_ctrl_',
140 & ivartype, '_', optimcycle, '.bin'
141 else
142 write(cfile2(1:80),'(a,I2.2,a,I4.4,a)')
143 & 'diag_unpack_nondim_grad_',
144 & ivartype, '_', optimcycle, '.bin'
145 write(cfile3(1:80),'(a,I2.2,a,I4.4,a)')
146 & 'diag_unpack_dimens_grad_',
147 & ivartype, '_', optimcycle, '.bin'
148 endif
149
150 reclen = FLOAT(snx*nsx*npx*sny*nsy*npy*4)
151 call mdsfindunit( cunit2, mythid )
152 open( cunit2, file=cfile2, status='unknown',
153 & access='direct', recl=reclen )
154 call mdsfindunit( cunit3, mythid )
155 open( cunit3, file=cfile3, status='unknown',
156 & access='direct', recl=reclen )
157 endif
158
159 #ifdef CTRL_UNPACK_PRECISE
160 il=ilnblnk( weighttype)
161 write(weightname(1:80),'(80a)') ' '
162 write(weightname(1:80),'(a)') weighttype(1:il)
163
164 call MDSREADFIELD_3D_GL(
165 & weightname, ctrlprec, 'RL',
166 & Nr, weightfld3d, 1, mythid)
167 #endif
168
169 call MDSREADFIELD_3D_GL(
170 & masktype, ctrlprec, 'RL',
171 & Nr, globmsk, 1, mythid)
172
173 do irec = 1, ncvarrecs(ivartype)
174 #ifndef ALLOW_ADMTLM
175 read(cunit) filencvarindex(ivartype)
176 if (filencvarindex(ivartype) .NE. ncvarindex(ivartype))
177 & then
178 print *, 'ctrl_set_unpack_xyz:WARNING: wrong ncvarindex ',
179 & filencvarindex(ivartype), ncvarindex(ivartype)
180 STOP 'in S/R ctrl_unpack'
181 endif
182 read(cunit) filej
183 read(cunit) filei
184 #endif /* ALLOW_ADMTLM */
185 do k = 1, Nr
186 irectrue = (irec-1)*nr + k
187 if ( doZscaleUnpack ) then
188 delZnorm = (delR(1)/delR(k))**delZexp
189 else
190 delZnorm = 1. _d 0
191 endif
192 cbuffindex = nwetglobal(k)
193 if ( cbuffindex .gt. 0 ) then
194 #ifndef ALLOW_ADMTLM
195 read(cunit) filencbuffindex
196 if (filencbuffindex .NE. cbuffindex) then
197 print *, 'WARNING: wrong cbuffindex ',
198 & filencbuffindex, cbuffindex
199 STOP 'in S/R ctrl_unpack'
200 endif
201 read(cunit) filek
202 if (filek .NE. k) then
203 print *, 'WARNING: wrong k ',
204 & filek, k
205 STOP 'in S/R ctrl_unpack'
206 endif
207 cph#endif /* ALLOW_ADMTLM */
208 read(cunit) (cbuff(ii), ii=1,cbuffindex)
209 #endif /* ALLOW_ADMTLM */
210 endif
211 c
212 cbuffindex = 0
213 do jp = 1,nPy
214 do bj = jtlo,jthi
215 do j = jmin,jmax
216 do ip = 1,nPx
217 do bi = itlo,ithi
218 do i = imin,imax
219 if ( globmsk(i,bi,ip,j,bj,jp,k) .ne. 0. ) then
220 cbuffindex = cbuffindex + 1
221 globfld3d(i,bi,ip,j,bj,jp,k) = cbuff(cbuffindex)
222 cph(
223 globfldtmp2(i,bi,ip,j,bj,jp) = cbuff(cbuffindex)
224 cph)
225 #ifdef ALLOW_ADMTLM
226 nveccount = nveccount + 1
227 globfld3d(i,bi,ip,j,bj,jp,k) =
228 & phtmpadmtlm(nveccount)
229 cph(
230 globfldtmp2(i,bi,ip,j,bj,jp) =
231 & phtmpadmtlm(nveccount)
232 cph)
233 #endif
234 #ifndef ALLOW_SMOOTH_CORREL3D
235 #ifdef ALLOW_NONDIMENSIONAL_CONTROL_IO
236 if ( lxxadxx ) then
237 globfld3d(i,bi,ip,j,bj,jp,k) = delZnorm
238 & * globfld3d(i,bi,ip,j,bj,jp,k)
239 # ifdef CTRL_UNPACK_PRECISE
240 & / sqrt(weightfld3d(i,bi,ip,j,bj,jp,k))
241 # else
242 & / sqrt(weightfld(k,bi,bj))
243 # endif
244 else
245 globfld3d(i,bi,ip,j,bj,jp,k) = delZnorm
246 & * globfld3d(i,bi,ip,j,bj,jp,k)
247 # ifdef CTRL_UNPACK_PRECISE
248 & * sqrt(weightfld3d(i,bi,ip,j,bj,jp,k))
249 # else
250 & * sqrt(weightfld(k,bi,bj))
251 # endif
252 endif
253 #endif /* ALLOW_NONDIMENSIONAL_CONTROL_IO */
254 #endif / * ALLOW_SMOOTH_CORREL3D * /
255 else
256 globfld3d(i,bi,ip,j,bj,jp,k) = 0. _d 0
257 endif
258 cph(
259 globfldtmp3(i,bi,ip,j,bj,jp) =
260 & globfld3d(i,bi,ip,j,bj,jp,k)
261 cph)
262 enddo
263 enddo
264 enddo
265 enddo
266 enddo
267 enddo
268 c
269 if ( doPackDiag ) then
270 write(cunit2,rec=irectrue) globfldtmp2
271 write(cunit3,rec=irectrue) globfldtmp3
272 endif
273 c
274 enddo
275
276 call MDSWRITEFIELD_3D_GL( fname, ctrlprec, 'RL',
277 & Nr, globfld3d,
278 & irec, optimcycle, mythid)
279
280 enddo
281
282 if ( doPackDiag ) then
283 close ( cunit2 )
284 close ( cunit3 )
285 endif
286
287 _END_MASTER( mythid )
288
289 #endif
290
291 return
292 end
293

  ViewVC Help
Powered by ViewVC 1.1.22