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

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

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


Revision 1.26 - (show annotations) (download)
Tue Aug 6 20:57:00 2013 UTC (10 years, 10 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint65j, checkpoint65h, checkpoint65i, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, checkpoint65, checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64m, checkpoint64o, checkpoint64n
Changes since 1.25: +4 -3 lines
- bug fix : dummy argument type

1 C $Header: /u/gcmpack/MITgcm/pkg/ctrl/ctrl_set_pack_xyz.F,v 1.25 2013/02/01 19:25:32 heimbach Exp $
2 C $Name: $
3
4 #include "CTRL_OPTIONS.h"
5
6 subroutine ctrl_set_pack_xyz(
7 & cunit, ivartype, fname, masktype, weighttype,
8 & weightfld, lxxadxx, mythid)
9
10 c ==================================================================
11 c SUBROUTINE ctrl_set_pack_xyz
12 c ==================================================================
13 c
14 c o Compress the control vector such that only ocean points are
15 c written to file.
16 c
17 c o Use a more precise nondimensionalization that depends on (x,y)
18 c Added weighttype to the argument list so that I can geographically
19 c vary the nondimensionalization.
20 c gebbie@mit.edu, 18-Mar-2003
21 c
22 c ==================================================================
23
24 implicit none
25
26 c == global variables ==
27
28 #include "EEPARAMS.h"
29 #include "SIZE.h"
30 #include "PARAMS.h"
31 #include "GRID.h"
32
33 #include "ctrl.h"
34 #include "optim.h"
35
36 c == routine arguments ==
37
38 integer cunit
39 integer ivartype
40 character*( 80) fname
41 character*( 9) masktype
42 character*( 80) weighttype
43 _RL weightfld( nr,nsx,nsy )
44 logical lxxadxx
45 integer mythid
46
47 #ifndef EXCLUDE_CTRL_PACK
48 # ifndef ALLOW_PACKUNPACK_METHOD2
49 c == local variables ==
50
51 integer bi,bj
52 integer ip,jp
53 integer i,j,k
54 integer ii
55 integer irec
56 integer itlo,ithi
57 integer jtlo,jthi
58 integer jmin,jmax
59 integer imin,imax
60
61 integer cbuffindex
62
63 _RL globmsk ( snx,nsx,npx,sny,nsy,npy,nr )
64 _RL globfld3d( snx,nsx,npx,sny,nsy,npy,nr )
65 #ifdef CTRL_PACK_PRECISE
66 integer il
67 character*(80) weightname
68 _RL weightfld3d( snx,nsx,npx,sny,nsy,npy,nr )
69 #endif
70 real*4 cbuff ( snx*nsx*npx*sny*nsy*npy )
71 real*4 globfldtmp2( snx,nsx,npx,sny,nsy,npy )
72 real*4 globfldtmp3( snx,nsx,npx,sny,nsy,npy )
73
74 _RL delZnorm
75 integer reclen, irectrue
76 integer cunit2, cunit3
77 character*(80) cfile2, cfile3
78
79 c == external ==
80
81 integer ilnblnk
82 external ilnblnk
83
84 c == end of interface ==
85
86 jtlo = 1
87 jthi = nsy
88 itlo = 1
89 ithi = nsx
90 jmin = 1
91 jmax = sny
92 imin = 1
93 imax = snx
94
95 #ifdef CTRL_DELZNORM
96 delZnorm = 0.
97 do k = 1, Nr
98 delZnorm = delZnorm + delR(k)/FLOAT(Nr)
99 enddo
100 #endif
101
102 c Initialise temporary file
103 do k = 1,nr
104 do jp = 1,nPy
105 do bj = jtlo,jthi
106 do j = jmin,jmax
107 do ip = 1,nPx
108 do bi = itlo,ithi
109 do i = imin,imax
110 globfld3d (i,bi,ip,j,bj,jp,k) = 0. _d 0
111 globmsk (i,bi,ip,j,bj,jp,k) = 0. _d 0
112 globfldtmp2(i,bi,ip,j,bj,jp) = 0. _d 0
113 globfldtmp3(i,bi,ip,j,bj,jp) = 0. _d 0
114 enddo
115 enddo
116 enddo
117 enddo
118 enddo
119 enddo
120 enddo
121
122 c-- Only the master thread will do I/O.
123 _BEGIN_MASTER( mythid )
124
125 if ( doPackDiag ) then
126 write(cfile2(1:80),'(80a)') ' '
127 write(cfile3(1:80),'(80a)') ' '
128 if ( lxxadxx ) then
129 write(cfile2(1:80),'(a,I3.3,a,I4.4,a)')
130 & 'diag_pack_nonout_ctrl_',
131 & ivartype, '_', optimcycle, '.bin'
132 write(cfile3(1:80),'(a,I3.3,a,I4.4,a)')
133 & 'diag_pack_dimout_ctrl_',
134 & ivartype, '_', optimcycle, '.bin'
135 else
136 write(cfile2(1:80),'(a,I3.3,a,I4.4,a)')
137 & 'diag_pack_nonout_grad_',
138 & ivartype, '_', optimcycle, '.bin'
139 write(cfile3(1:80),'(a,I3.3,a,I4.4,a)')
140 & 'diag_pack_dimout_grad_',
141 & ivartype, '_', optimcycle, '.bin'
142 endif
143
144 reclen = FLOAT(snx*nsx*npx*sny*nsy*npy*4)
145 call mdsfindunit( cunit2, mythid )
146 open( cunit2, file=cfile2, status='unknown',
147 & access='direct', recl=reclen )
148 call mdsfindunit( cunit3, mythid )
149 open( cunit3, file=cfile3, status='unknown',
150 & access='direct', recl=reclen )
151 endif
152
153 #ifdef CTRL_PACK_PRECISE
154 if (weighttype.NE.' ') then
155 il=ilnblnk( weighttype)
156 write(weightname(1:80),'(80a)') ' '
157 write(weightname(1:80),'(a)') weighttype(1:il)
158 call MDSREADFIELD_3D_GL(
159 & weightname, ctrlprec, 'RL',
160 & Nr, weightfld3d, 1, mythid)
161 else
162 do k = 1,nr
163 do jp = 1,nPy
164 do bj = jtlo,jthi
165 do j = jmin,jmax
166 do ip = 1,nPx
167 do bi = itlo,ithi
168 do i = imin,imax
169 weightfld3d(i,bi,ip,j,bj,jp,k) = 1. _d 0
170 enddo
171 enddo
172 enddo
173 enddo
174 enddo
175 enddo
176 enddo
177 endif
178 #endif
179
180 call MDSREADFIELD_3D_GL(
181 & masktype, ctrlprec, 'RL',
182 & Nr, globmsk, 1, mythid)
183
184 do irec = 1, ncvarrecs(ivartype)
185
186 call MDSREADFIELD_3D_GL( fname, ctrlprec, 'RL',
187 & Nr, globfld3d, irec, mythid)
188
189 #ifndef ALLOW_ADMTLM
190 write(cunit) ncvarindex(ivartype)
191 write(cunit) 1
192 write(cunit) 1
193 #endif
194 do k = 1, nr
195 irectrue = (irec-1)*nr + k
196 if ( doZscalePack ) then
197 delZnorm = (delR(1)/delR(k))**delZexp
198 else
199 delZnorm = 1. _d 0
200 endif
201 cbuffindex = 0
202 do jp = 1,nPy
203 do bj = jtlo,jthi
204 do j = jmin,jmax
205 do ip = 1,nPx
206 do bi = itlo,ithi
207 do i = imin,imax
208 if (globmsk(i,bi,ip,j,bj,jp,k) .ne. 0. ) then
209 cbuffindex = cbuffindex + 1
210 cph(
211 globfldtmp3(i,bi,ip,j,bj,jp) =
212 & globfld3d(i,bi,ip,j,bj,jp,k)
213 cph)
214 IF ( .NOT.ctrlSmoothCorrel3D ) THEN
215 #ifdef ALLOW_NONDIMENSIONAL_CONTROL_IO
216 if (lxxadxx) then
217 cbuff(cbuffindex) = 1/delZnorm
218 & * globfld3d(i,bi,ip,j,bj,jp,k)
219 # ifdef CTRL_PACK_PRECISE
220 & * sqrt(weightfld3d(i,bi,ip,j,bj,jp,k))
221 # else
222 & * sqrt(weightfld(k,bi,bj))
223 # endif
224 else
225 cbuff(cbuffindex) = delZnorm
226 & * globfld3d(i,bi,ip,j,bj,jp,k)
227 # ifdef CTRL_PACK_PRECISE
228 & / sqrt(weightfld3d(i,bi,ip,j,bj,jp,k))
229 # else
230 & / sqrt(weightfld(k,bi,bj))
231 # endif
232 endif
233 cph(
234 globfldtmp2(i,bi,ip,j,bj,jp) = cbuff(cbuffindex)
235 cph)
236 #else /* ALLOW_NONDIMENSIONAL_CONTROL_IO undef */
237 cbuff(cbuffindex) = globfld3d(i,bi,ip,j,bj,jp,k)
238 #endif /* ALLOW_NONDIMENSIONAL_CONTROL_IO */
239 ELSE !IF ( .NOT.ctrlSmoothCorrel3D ) THEN
240 cbuff(cbuffindex) = globfld3d(i,bi,ip,j,bj,jp,k)
241 ENDIF !IF ( .NOT.ctrlSmoothCorrel3D ) THEN
242 #ifdef ALLOW_ADMTLM
243 nveccount = nveccount + 1
244 phtmpadmtlm(nveccount) = cbuff(cbuffindex)
245 #endif
246 endif
247 enddo
248 enddo
249 enddo
250 enddo
251 enddo
252 enddo
253 c --> check cbuffindex.
254 if ( cbuffindex .gt. 0) then
255 #ifndef ALLOW_ADMTLM
256 write(cunit) cbuffindex
257 write(cunit) k
258 cph#endif
259 write(cunit) (cbuff(ii), ii=1,cbuffindex)
260 #endif
261 endif
262 c
263 if ( doPackDiag ) then
264 write(cunit2,rec=irectrue) globfldtmp2
265 write(cunit3,rec=irectrue) globfldtmp3
266 endif
267 c
268 enddo
269 c
270 c -- end of irec loop --
271 enddo
272
273 if ( doPackDiag ) then
274 close ( cunit2 )
275 close ( cunit3 )
276 endif
277
278 _END_MASTER( mythid )
279
280 # else
281 c == local variables ==
282
283 integer bi,bj
284 integer ip,jp
285 integer i,j,k
286 integer ii
287 integer il
288 integer irec
289 integer itlo,ithi
290 integer jtlo,jthi
291
292 integer cbuffindex
293
294 _RL msk3d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
295 real*8 msk2d_buf(sNx,sNy,nSx,nSy)
296 real*8 msk2d_buf_glo(Nx,Ny)
297
298 _RL fld3d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
299 real*8 fld2d_buf(sNx,sNy,nSx,nSy)
300 real*8 fld2d_buf_glo(Nx,Ny)
301
302 _RL fld3dDim(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
303 _RL fld3dNodim(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
304
305 #ifdef CTRL_PACK_PRECISE
306 _RL wei3d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
307 #endif
308
309 real*4 cbuff ( snx*nsx*npx*sny*nsy*npy )
310
311 character*(80) weightname
312 _RL delZnorm
313 character*(80) cfile2, cfile3
314 _RL dummy
315
316 c == external ==
317
318 integer ilnblnk
319 external ilnblnk
320
321 c == end of interface ==
322
323 c-- part 1: preliminary reads and definitions
324
325 #ifdef CTRL_PACK_PRECISE
326 call active_read_xyz(weighttype, wei3d, 1,
327 & .FALSE., .FALSE., 0 , mythid, dummy)
328 #endif
329
330 call active_read_xyz(masktype, msk3d, 1,
331 & .FALSE., .FALSE., 0 , mythid, dummy)
332
333 if ( doPackDiag ) then
334 write(cfile2(1:80),'(80a)') ' '
335 write(cfile3(1:80),'(80a)') ' '
336 il = ilnblnk( fname )
337 if ( lxxadxx ) then
338 write(cfile2(1:80),'(2a)') fname(1:il),'.pack_ctrl_adim'
339 write(cfile3(1:80),'(2a)') fname(1:il),'.pack_ctrl_dim'
340 else
341 write(cfile2(1:80),'(2a)') fname(1:il),'.pack_grad_adim'
342 write(cfile3(1:80),'(2a)') fname(1:il),'.pack_grad_dim'
343 endif
344 endif
345
346 c-- part 2: loop over records
347
348 do irec = 1, ncvarrecs(ivartype)
349
350 c-- 2.1:
351 call READ_REC_3D_RL( fname, ctrlprec,
352 & Nr, fld3dDim, irec, 0, mythid)
353
354 c-- 2.2: normalize field if needed
355 DO bj = myByLo(myThid), myByHi(myThid)
356 DO bi = myBxLo(myThid), myBxHi(myThid)
357 DO k=1,Nr
358 if ( doZscalePack ) then
359 delZnorm = (delR(1)/delR(k))**delZexp
360 else
361 delZnorm = 1. _d 0
362 endif
363 DO j=1,sNy
364 DO i=1,sNx
365 if (msk3d(i,j,k,bi,bj).EQ.0. _d 0) then
366 fld3dDim(i,j,k,bi,bj)=0. _d 0
367 fld3dNodim(i,j,k,bi,bj)=0. _d 0
368 else
369 IF ( ctrlSmoothCorrel3D ) THEN
370 fld3dNodim(i,j,k,bi,bj)=fld3dDim(i,j,k,bi,bj)
371 ELSE !IF ( ctrlSmoothCorrel3D ) THEN
372 # ifndef ALLOW_NONDIMENSIONAL_CONTROL_IO
373 fld3dNodim(i,j,k,bi,bj) = fld3dDim(i,j,k,bi,bj)
374 # else
375 if (lxxadxx) then
376 fld3dNodim(i,j,k,bi,bj) =
377 & fld3dDim(i,j,k,bi,bj) / delZnorm
378 # ifdef CTRL_PACK_PRECISE
379 & * sqrt(wei3d(i,j,k,bi,bj))
380 # else
381 & * sqrt(weightfld(k,bi,bj))
382 # endif
383 else
384 fld3dNodim(i,j,k,bi,bj) =
385 & fld3dDim(i,j,k,bi,bj) * delZnorm
386 # ifdef CTRL_PACK_PRECISE
387 & / sqrt(wei3d(i,j,k,bi,bj))
388 # else
389 & / sqrt(weightfld(k,bi,bj))
390 # endif
391 endif
392 # endif /* ALLOW_NONDIMENSIONAL_CONTROL_IO */
393 ENDIF !IF ( ctrlSmoothCorrel3D ) THEN
394 endif
395 ENDDO
396 ENDDO
397 ENDDO
398 ENDDO
399 ENDDO
400
401 c-- 2.3:
402 if ( doPackDiag ) then
403 c error: twice the same one
404 call WRITE_REC_3D_RL( cfile2, ctrlprec,
405 & Nr, fld3dNodim, irec, 0, mythid)
406 call WRITE_REC_3D_RL( cfile3, ctrlprec,
407 & Nr, fld3dDim, irec, 0, mythid)
408 endif
409
410 c-- 2.4: array -> buffer -> global buffer -> global file
411
412 #ifndef ALLOW_ADMTLM
413 _BEGIN_MASTER( mythid )
414 IF ( myProcId .eq. 0 ) THEN
415 write(cunit) ncvarindex(ivartype)
416 write(cunit) 1
417 write(cunit) 1
418 ENDIF
419 _END_MASTER( mythid )
420 _BARRIER
421 #endif
422
423 do k = 1, nr
424
425 CALL MDS_PASS_R8toRL( fld2d_buf, fld3dNodim,
426 & 0, 0, 1, k, Nr, 0, 0, .FALSE., myThid )
427 CALL BAR2( myThid )
428 CALL GATHER_2D_R8( fld2d_buf_glo, fld2d_buf,
429 & Nx,Ny,.FALSE.,.TRUE.,myThid)
430 CALL BAR2( myThid )
431
432 CALL MDS_PASS_R8toRL( msk2d_buf, msk3d,
433 & 0, 0, 1, k, Nr, 0, 0, .FALSE., myThid )
434 CALL BAR2( myThid )
435 CALL GATHER_2D_R8( msk2d_buf_glo, msk2d_buf,
436 & Nx,Ny,.FALSE.,.TRUE.,myThid)
437 CALL BAR2( myThid )
438
439 _BEGIN_MASTER( mythid )
440 cbuffindex = 0
441 IF ( myProcId .eq. 0 ) THEN
442
443 DO j=1,Ny
444 DO i=1,Nx
445 if (msk2d_buf_glo(i,j) .ne. 0. ) then
446 cbuffindex = cbuffindex + 1
447 cbuff(cbuffindex) = fld2d_buf_glo(i,j)
448 #ifdef ALLOW_ADMTLM
449 nveccount = nveccount + 1
450 phtmpadmtlm(nveccount) = cbuff(cbuffindex)
451 #endif
452 endif
453 ENDDO
454 ENDDO
455
456 #ifndef ALLOW_ADMTLM
457 if ( cbuffindex .gt. 0) then
458 write(cunit) cbuffindex
459 write(cunit) k
460 write(cunit) (cbuff(ii), ii=1,cbuffindex)
461 endif
462 #endif
463
464 ENDIF
465 _END_MASTER( mythid )
466 _BARRIER
467
468 enddo
469 enddo
470
471 # endif /* ALLOW_PACKUNPACK_METHOD2 */
472 # endif /* EXCLUDE_CTRL_PACK */
473
474 return
475 end

  ViewVC Help
Powered by ViewVC 1.1.22