/[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.27 - (show annotations) (download)
Mon Mar 23 21:07:37 2015 UTC (9 years, 2 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint65k, checkpoint65l, checkpoint65m
Changes since 1.26: +9 -1 lines
- if autodiff is not compiled then use
  READ_REC_XY_RL/READ_REC_XYZ_RL instead
  of active read/write

1 C $Header: /u/gcmpack/MITgcm/pkg/ctrl/ctrl_set_pack_xyz.F,v 1.26 2013/08/06 20:57:00 gforget 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 #ifdef ALLOW_AUTODIFF
327 call active_read_xyz(weighttype, wei3d, 1,
328 & .FALSE., .FALSE., 0 , mythid, dummy)
329 #else
330 CALL READ_REC_XYZ_RL( weighttype, wei3d, 1, 1, myThid )
331 #endif
332 #endif
333
334 #ifdef ALLOW_AUTODIFF
335 call active_read_xyz(masktype, msk3d, 1,
336 & .FALSE., .FALSE., 0 , mythid, dummy)
337 #else
338 CALL READ_REC_XYZ_RL( masktype, msk3d, 1, 1, myThid )
339 #endif
340
341 if ( doPackDiag ) then
342 write(cfile2(1:80),'(80a)') ' '
343 write(cfile3(1:80),'(80a)') ' '
344 il = ilnblnk( fname )
345 if ( lxxadxx ) then
346 write(cfile2(1:80),'(2a)') fname(1:il),'.pack_ctrl_adim'
347 write(cfile3(1:80),'(2a)') fname(1:il),'.pack_ctrl_dim'
348 else
349 write(cfile2(1:80),'(2a)') fname(1:il),'.pack_grad_adim'
350 write(cfile3(1:80),'(2a)') fname(1:il),'.pack_grad_dim'
351 endif
352 endif
353
354 c-- part 2: loop over records
355
356 do irec = 1, ncvarrecs(ivartype)
357
358 c-- 2.1:
359 call READ_REC_3D_RL( fname, ctrlprec,
360 & Nr, fld3dDim, irec, 0, mythid)
361
362 c-- 2.2: normalize field if needed
363 DO bj = myByLo(myThid), myByHi(myThid)
364 DO bi = myBxLo(myThid), myBxHi(myThid)
365 DO k=1,Nr
366 if ( doZscalePack ) then
367 delZnorm = (delR(1)/delR(k))**delZexp
368 else
369 delZnorm = 1. _d 0
370 endif
371 DO j=1,sNy
372 DO i=1,sNx
373 if (msk3d(i,j,k,bi,bj).EQ.0. _d 0) then
374 fld3dDim(i,j,k,bi,bj)=0. _d 0
375 fld3dNodim(i,j,k,bi,bj)=0. _d 0
376 else
377 IF ( ctrlSmoothCorrel3D ) THEN
378 fld3dNodim(i,j,k,bi,bj)=fld3dDim(i,j,k,bi,bj)
379 ELSE !IF ( ctrlSmoothCorrel3D ) THEN
380 # ifndef ALLOW_NONDIMENSIONAL_CONTROL_IO
381 fld3dNodim(i,j,k,bi,bj) = fld3dDim(i,j,k,bi,bj)
382 # else
383 if (lxxadxx) then
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 else
392 fld3dNodim(i,j,k,bi,bj) =
393 & fld3dDim(i,j,k,bi,bj) * delZnorm
394 # ifdef CTRL_PACK_PRECISE
395 & / sqrt(wei3d(i,j,k,bi,bj))
396 # else
397 & / sqrt(weightfld(k,bi,bj))
398 # endif
399 endif
400 # endif /* ALLOW_NONDIMENSIONAL_CONTROL_IO */
401 ENDIF !IF ( ctrlSmoothCorrel3D ) THEN
402 endif
403 ENDDO
404 ENDDO
405 ENDDO
406 ENDDO
407 ENDDO
408
409 c-- 2.3:
410 if ( doPackDiag ) then
411 c error: twice the same one
412 call WRITE_REC_3D_RL( cfile2, ctrlprec,
413 & Nr, fld3dNodim, irec, 0, mythid)
414 call WRITE_REC_3D_RL( cfile3, ctrlprec,
415 & Nr, fld3dDim, irec, 0, mythid)
416 endif
417
418 c-- 2.4: array -> buffer -> global buffer -> global file
419
420 #ifndef ALLOW_ADMTLM
421 _BEGIN_MASTER( mythid )
422 IF ( myProcId .eq. 0 ) THEN
423 write(cunit) ncvarindex(ivartype)
424 write(cunit) 1
425 write(cunit) 1
426 ENDIF
427 _END_MASTER( mythid )
428 _BARRIER
429 #endif
430
431 do k = 1, nr
432
433 CALL MDS_PASS_R8toRL( fld2d_buf, fld3dNodim,
434 & 0, 0, 1, k, Nr, 0, 0, .FALSE., myThid )
435 CALL BAR2( myThid )
436 CALL GATHER_2D_R8( fld2d_buf_glo, fld2d_buf,
437 & Nx,Ny,.FALSE.,.TRUE.,myThid)
438 CALL BAR2( myThid )
439
440 CALL MDS_PASS_R8toRL( msk2d_buf, msk3d,
441 & 0, 0, 1, k, Nr, 0, 0, .FALSE., myThid )
442 CALL BAR2( myThid )
443 CALL GATHER_2D_R8( msk2d_buf_glo, msk2d_buf,
444 & Nx,Ny,.FALSE.,.TRUE.,myThid)
445 CALL BAR2( myThid )
446
447 _BEGIN_MASTER( mythid )
448 cbuffindex = 0
449 IF ( myProcId .eq. 0 ) THEN
450
451 DO j=1,Ny
452 DO i=1,Nx
453 if (msk2d_buf_glo(i,j) .ne. 0. ) then
454 cbuffindex = cbuffindex + 1
455 cbuff(cbuffindex) = fld2d_buf_glo(i,j)
456 #ifdef ALLOW_ADMTLM
457 nveccount = nveccount + 1
458 phtmpadmtlm(nveccount) = cbuff(cbuffindex)
459 #endif
460 endif
461 ENDDO
462 ENDDO
463
464 #ifndef ALLOW_ADMTLM
465 if ( cbuffindex .gt. 0) then
466 write(cunit) cbuffindex
467 write(cunit) k
468 write(cunit) (cbuff(ii), ii=1,cbuffindex)
469 endif
470 #endif
471
472 ENDIF
473 _END_MASTER( mythid )
474 _BARRIER
475
476 enddo
477 enddo
478
479 # endif /* ALLOW_PACKUNPACK_METHOD2 */
480 # endif /* EXCLUDE_CTRL_PACK */
481
482 return
483 end

  ViewVC Help
Powered by ViewVC 1.1.22