File indexing completed on 2024-03-02 06:10:20 UTC
view on githubraw file Latest commit 5cf43646 on 2024-03-01 18:50:49 UTC
7bfe6112e8 Jean*0001 #include "CTRL_OPTIONS.h"
5d5c0b0d52 Patr*0002
0003 subroutine ctrl_set_pack_xy(
5cf4364659 Mart*0004 & cunit, ivar, precondScalar,
3145d51f22 Patr*0005 & fname, masktype, weighttype,
4d72283393 Mart*0006 & lxxadxx, myThid )
5d5c0b0d52 Patr*0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 implicit none
0018
0019
0020
0021 #include "EEPARAMS.h"
0022 #include "SIZE.h"
0023 #include "PARAMS.h"
0024 #include "GRID.h"
0025
5cf4364659 Mart*0026 #include "CTRL_SIZE.h"
4d72283393 Mart*0027 #include "CTRL.h"
65754df434 Mart*0028 #include "OPTIMCYCLE.h"
5d5c0b0d52 Patr*0029
0030
0031
0032 integer cunit
5cf4364659 Mart*0033 integer ivar
3145d51f22 Patr*0034 _RL precondScalar
de57a2ec4b Mart*0035 character*(MAX_LEN_FNAM) fname
45913d6a59 Patr*0036 character*( 9) masktype
de57a2ec4b Mart*0037 character*(MAX_LEN_FNAM) weighttype
5d5c0b0d52 Patr*0038 logical lxxadxx
4d72283393 Mart*0039 integer myThid
5d5c0b0d52 Patr*0040
dac57cef35 Patr*0041 #ifndef EXCLUDE_CTRL_PACK
9f5240b52a Jean*0042
0043 integer ilnblnk
0044 external ilnblnk
5d5c0b0d52 Patr*0045
9f5240b52a Jean*0046
5d5c0b0d52 Patr*0047 integer bi,bj
0048 integer i,j,k
9f5240b52a Jean*0049 integer ii, irec
0050 integer cbuffindex
0051 real*4 cbuff( sNx*nSx*nPx*sNy*nSy*nPy )
de57a2ec4b Mart*0052 character*(MAX_LEN_FNAM) cfile2, cfile3
9f5240b52a Jean*0053
0054 # ifndef ALLOW_PACKUNPACK_METHOD2
0055 integer ip,jp
0056 integer nrec_nl
5d5c0b0d52 Patr*0057 integer itlo,ithi
0058 integer jtlo,jthi
0059 integer jmin,jmax
0060 integer imin,imax
9f5240b52a Jean*0061 _RL globmsk ( sNx,nSx,nPx,sNy,nSy,nPy,Nr )
0062 _RL globfld3d( sNx,nSx,nPx,sNy,nSy,nPy,Nr )
0ba65c94ff Patr*0063 integer reclen, irectrue
0064 integer cunit2, cunit3
9f5240b52a Jean*0065 real*4 globfldtmp2( sNx,nSx,nPx,sNy,nSy,nPy )
0066 real*4 globfldtmp3( sNx,nSx,nPx,sNy,nSy,nPy )
0067 # else /* ALLOW_PACKUNPACK_METHOD2 */
0068 integer il
0069 _RL msk3d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0070 real*8 msk2d_buf (sNx,sNy,nSx,nSy)
0071 real*8 msk2d_buf_glo(Nx,Ny)
0072 real*8 fld2d_buf (sNx,sNy,nSx,nSy)
0073 real*8 fld2d_buf_glo(Nx,Ny)
0074 _RL fld2dDim (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0075 _RL fld2dNodim(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0076 _RL dummy
0077 # endif /* ALLOW_PACKUNPACK_METHOD2 */
5d5c0b0d52 Patr*0078
0079
9f5240b52a Jean*0080 # ifndef ALLOW_PACKUNPACK_METHOD2
5d5c0b0d52 Patr*0081 jtlo = 1
9f5240b52a Jean*0082 jthi = nSy
5d5c0b0d52 Patr*0083 itlo = 1
9f5240b52a Jean*0084 ithi = nSx
5d5c0b0d52 Patr*0085 jmin = 1
9f5240b52a Jean*0086 jmax = sNy
5d5c0b0d52 Patr*0087 imin = 1
9f5240b52a Jean*0088 imax = sNx
5d5c0b0d52 Patr*0089
8f0b59c61c Patr*0090 nbuffglobal = nbuffglobal + 1
0091
5d5c0b0d52 Patr*0092
9f5240b52a Jean*0093 do k = 1,Nr
3145d51f22 Patr*0094 do jp = 1,nPy
0095 do bj = jtlo,jthi
0096 do j = jmin,jmax
0097 do ip = 1,nPx
0098 do bi = itlo,ithi
0099 do i = imin,imax
0100 globfld3d (i,bi,ip,j,bj,jp,k) = 0. _d 0
0101 globmsk (i,bi,ip,j,bj,jp,k) = 0. _d 0
0102 globfldtmp2(i,bi,ip,j,bj,jp) = 0. _d 0
0103 globfldtmp3(i,bi,ip,j,bj,jp) = 0. _d 0
5d5c0b0d52 Patr*0104 enddo
3145d51f22 Patr*0105 enddo
0106 enddo
5d5c0b0d52 Patr*0107 enddo
3145d51f22 Patr*0108 enddo
0109 enddo
5d5c0b0d52 Patr*0110 enddo
0111
0112
4d72283393 Mart*0113 _BEGIN_MASTER( myThid )
5d5c0b0d52 Patr*0114
0ba65c94ff Patr*0115 if ( doPackDiag ) then
0116 if ( lxxadxx ) then
de57a2ec4b Mart*0117 write(cfile2,'(a,I3.3,a,I4.4,a)')
951926fb9b Jean*0118 & 'diag_pack_nonout_ctrl_',
5cf4364659 Mart*0119 & ivar, '_', optimcycle, '.bin'
de57a2ec4b Mart*0120 write(cfile3,'(a,I3.3,a,I4.4,a)')
951926fb9b Jean*0121 & 'diag_pack_dimout_ctrl_',
5cf4364659 Mart*0122 & ivar, '_', optimcycle, '.bin'
0ba65c94ff Patr*0123 else
de57a2ec4b Mart*0124 write(cfile2,'(a,I3.3,a,I4.4,a)')
951926fb9b Jean*0125 & 'diag_pack_nonout_grad_',
5cf4364659 Mart*0126 & ivar, '_', optimcycle, '.bin'
de57a2ec4b Mart*0127 write(cfile3,'(a,I3.3,a,I4.4,a)')
951926fb9b Jean*0128 & 'diag_pack_dimout_grad_',
5cf4364659 Mart*0129 & ivar, '_', optimcycle, '.bin'
0ba65c94ff Patr*0130 endif
0131
9f5240b52a Jean*0132 reclen = FLOAT(sNx*nSx*nPx*sNy*nSy*nPy*4)
4d72283393 Mart*0133 call mdsfindunit( cunit2, myThid )
0ba65c94ff Patr*0134 open( cunit2, file=cfile2, status='unknown',
0135 & access='direct', recl=reclen )
4d72283393 Mart*0136 call mdsfindunit( cunit3, myThid )
0ba65c94ff Patr*0137 open( cunit3, file=cfile3, status='unknown',
0138 & access='direct', recl=reclen )
0139 endif
0140
951926fb9b Jean*0141 call MDSREADFIELD_3D_GL(
5d5c0b0d52 Patr*0142 & masktype, ctrlprec, 'RL',
4d72283393 Mart*0143 & Nr, globmsk, 1, myThid)
5d5c0b0d52 Patr*0144
5cf4364659 Mart*0145 nrec_nl=int(ncvarrecs(ivar)/Nr)
7109a141b2 Patr*0146 do irec = 1, nrec_nl
0147
cf705a6c8e Mart*0148 call MDSREADFIELD_3D_GL( fname, ctrlprec, 'RL',
4d72283393 Mart*0149 & Nr, globfld3d, irec, myThid)
cf705a6c8e Mart*0150 do k = 1, Nr
0151 irectrue = (irec-1)*Nr + k
faf44775ba Patr*0152 #ifndef ALLOW_ADMTLM
5cf4364659 Mart*0153 write(cunit) ncvarindex(ivar)
cf705a6c8e Mart*0154 write(cunit) 1
0155 write(cunit) 1
faf44775ba Patr*0156 #endif
cf705a6c8e Mart*0157 cbuffindex = 0
0158 do jp = 1,nPy
0159 do bj = jtlo,jthi
0160 do j = jmin,jmax
0161 do ip = 1,nPx
0162 do bi = itlo,ithi
0163 do i = imin,imax
0164 if (globmsk(i,bi,ip,j,bj,jp,1) .ne. 0. ) then
0165 cbuffindex = cbuffindex + 1
0ba65c94ff Patr*0166
cf705a6c8e Mart*0167 globfldtmp3(i,bi,ip,j,bj,jp) =
0168 & globfld3d(i,bi,ip,j,bj,jp,k)
0ba65c94ff Patr*0169
cf705a6c8e Mart*0170 if (lxxadxx) then
0171 cbuff(cbuffindex) =
0172 & globfld3d(i,bi,ip,j,bj,jp,k)
0173 & / PrecondScalar
0174 else
0175 cbuff(cbuffindex) =
0176 & globfld3d(i,bi,ip,j,bj,jp,k)
0177 & * PrecondScalar
0178 endif
0ba65c94ff Patr*0179
cf705a6c8e Mart*0180 globfldtmp2(i,bi,ip,j,bj,jp) = cbuff(cbuffindex)
0ba65c94ff Patr*0181
faf44775ba Patr*0182 #ifdef ALLOW_ADMTLM
cf705a6c8e Mart*0183 nveccount = nveccount + 1
0184 phtmpadmtlm(nveccount) = cbuff(cbuffindex)
faf44775ba Patr*0185 #endif
cf705a6c8e Mart*0186 endif
7109a141b2 Patr*0187 enddo
0188 enddo
cf705a6c8e Mart*0189 enddo
0190 enddo
0191 enddo
0192 enddo
7109a141b2 Patr*0193
cf705a6c8e Mart*0194 if ( cbuffindex .gt. 0) then
faf44775ba Patr*0195 #ifndef ALLOW_ADMTLM
cf705a6c8e Mart*0196 write(cunit) cbuffindex
0197 write(cunit) 1
e324d8bc16 Patr*0198
cf705a6c8e Mart*0199 write(cunit) (cbuff(ii), ii=1,cbuffindex)
e324d8bc16 Patr*0200 #endif
cf705a6c8e Mart*0201 endif
0ba65c94ff Patr*0202
cf705a6c8e Mart*0203 if ( doPackDiag ) then
0204 write(cunit2,rec=irectrue) globfldtmp2
0205 write(cunit3,rec=irectrue) globfldtmp3
0206 endif
0ba65c94ff Patr*0207
cf705a6c8e Mart*0208 enddo
7109a141b2 Patr*0209
0210
0211 enddo
0212
5cf4364659 Mart*0213 do irec = nrec_nl*Nr+1, ncvarrecs(ivar)
5d5c0b0d52 Patr*0214
cf705a6c8e Mart*0215 call MDSREADFIELD_2D_GL( fname, ctrlprec, 'RL',
4d72283393 Mart*0216 & 1, globfld3d(1,1,1,1,1,1,1), irec, myThid)
5d5c0b0d52 Patr*0217
faf44775ba Patr*0218 #ifndef ALLOW_ADMTLM
5cf4364659 Mart*0219 write(cunit) ncvarindex(ivar)
cf705a6c8e Mart*0220 write(cunit) 1
0221 write(cunit) 1
faf44775ba Patr*0222 #endif
cf705a6c8e Mart*0223 do k = 1, 1
0224 irectrue = irec
0225 cbuffindex = 0
0226 do jp = 1,nPy
0227 do bj = jtlo,jthi
0228 do j = jmin,jmax
0229 do ip = 1,nPx
0230 do bi = itlo,ithi
0231 do i = imin,imax
0232 if (globmsk(i,bi,ip,j,bj,jp,k) .ne. 0. ) then
0233 cbuffindex = cbuffindex + 1
0ba65c94ff Patr*0234
cf705a6c8e Mart*0235 globfldtmp3(i,bi,ip,j,bj,jp) =
0236 & globfld3d(i,bi,ip,j,bj,jp,k)
0ba65c94ff Patr*0237
cf705a6c8e Mart*0238 if (lxxadxx) then
0239 cbuff(cbuffindex) =
0240 & globfld3d(i,bi,ip,j,bj,jp,k)
0241 & / PrecondScalar
0242 else
0243 cbuff(cbuffindex) =
0244 & globfld3d(i,bi,ip,j,bj,jp,k)
0245 & * PrecondScalar
0246 endif
0ba65c94ff Patr*0247
cf705a6c8e Mart*0248 globfldtmp2(i,bi,ip,j,bj,jp) = cbuff(cbuffindex)
0ba65c94ff Patr*0249
8f0b59c61c Patr*0250 #ifdef ALLOW_ADMTLM
cf705a6c8e Mart*0251 nveccount = nveccount + 1
0252 phtmpadmtlm(nveccount) = cbuff(cbuffindex)
8f0b59c61c Patr*0253 #endif
cf705a6c8e Mart*0254 endif
5d5c0b0d52 Patr*0255 enddo
0256 enddo
cf705a6c8e Mart*0257 enddo
0258 enddo
0259 enddo
0260 enddo
5d5c0b0d52 Patr*0261
0262 if ( cbuffindex .gt. 0) then
faf44775ba Patr*0263 #ifndef ALLOW_ADMTLM
5d5c0b0d52 Patr*0264 write(cunit) cbuffindex
0265 write(cunit) k
e324d8bc16 Patr*0266
5d5c0b0d52 Patr*0267 write(cunit) (cbuff(ii), ii=1,cbuffindex)
e324d8bc16 Patr*0268 #endif
5d5c0b0d52 Patr*0269 endif
0ba65c94ff Patr*0270
0271 if ( doPackDiag ) then
0272 write(cunit2,rec=irectrue) globfldtmp2
0273 write(cunit3,rec=irectrue) globfldtmp3
0274 endif
0275
5d5c0b0d52 Patr*0276 enddo
0277
0278
0279 enddo
0280
0ba65c94ff Patr*0281 if ( doPackDiag ) then
0282 close ( cunit2 )
0283 close ( cunit3 )
0284 endif
951926fb9b Jean*0285
4d72283393 Mart*0286 _END_MASTER( myThid )
5d5c0b0d52 Patr*0287
9f5240b52a Jean*0288 # else /* ALLOW_PACKUNPACK_METHOD2 */
23a37235f2 Gael*0289
0290
0291
1c8d09be4c Gael*0292 #ifdef ALLOW_AUTODIFF
cf2ce61250 Jean*0293 call active_read_xyz(masktype, msk3d, 1,
4d72283393 Mart*0294 & .FALSE., .FALSE., 0 , myThid, dummy)
1c8d09be4c Gael*0295 #else
0296 CALL READ_REC_XYZ_RL( masktype, msk3d, 1, 1, myThid )
0297 #endif
23a37235f2 Gael*0298
0299 if ( doPackDiag ) then
0300 il = ilnblnk( fname )
0301 if ( lxxadxx ) then
de57a2ec4b Mart*0302 write(cfile2,'(2a)') fname(1:il),'.pack_ctrl_adim'
0303 write(cfile3,'(2a)') fname(1:il),'.pack_ctrl_dim'
23a37235f2 Gael*0304 else
de57a2ec4b Mart*0305 write(cfile2,'(2a)') fname(1:il),'.pack_grad_adim'
0306 write(cfile3,'(2a)') fname(1:il),'.pack_grad_dim'
23a37235f2 Gael*0307 endif
0308 endif
0309
0310
0311
5cf4364659 Mart*0312 do irec = 1, ncvarrecs(ivar)
23a37235f2 Gael*0313
cf2ce61250 Jean*0314
0315 call READ_REC_3D_RL( fname, ctrlprec,
4d72283393 Mart*0316 & 1, fld2dDim, irec, 0, myThid)
23a37235f2 Gael*0317
0318
0319 DO bj = myByLo(myThid), myByHi(myThid)
0320 DO bi = myBxLo(myThid), myBxHi(myThid)
0321 DO j=1,sNy
0322 DO i=1,sNx
0323 if (msk3d(i,j,1,bi,bj).EQ.0. _d 0) then
0324 fld2dDim(i,j,bi,bj)=0. _d 0
0325 fld2dNodim(i,j,bi,bj)=0. _d 0
0326 else
0327 if (lxxadxx) then
cf705a6c8e Mart*0328 fld2dNodim(i,j,bi,bj) =
0329 & fld2dDim(i,j,bi,bj) / PrecondScalar
23a37235f2 Gael*0330 else
cf705a6c8e Mart*0331 fld2dNodim(i,j,bi,bj) =
3145d51f22 Patr*0332 & fld2dDim(i,j,bi,bj) * PrecondScalar
96c2862ec2 Gael*0333 endif
23a37235f2 Gael*0334 endif
0335 ENDDO
0336 ENDDO
0337 ENDDO
0338 ENDDO
0339
0340
0341 if ( doPackDiag ) then
0342 call WRITE_REC_3D_RL( cfile2, ctrlprec,
4d72283393 Mart*0343 & 1, fld2dNodim, irec, 0, myThid)
23a37235f2 Gael*0344 call WRITE_REC_3D_RL( cfile3, ctrlprec,
4d72283393 Mart*0345 & 1, fld2dDim, irec, 0, myThid)
23a37235f2 Gael*0346 endif
0347
0348
0349
0350 #ifndef ALLOW_ADMTLM
4d72283393 Mart*0351 _BEGIN_MASTER( myThid )
23a37235f2 Gael*0352 IF ( myProcId .eq. 0 ) THEN
5cf4364659 Mart*0353 write(cunit) ncvarindex(ivar)
23a37235f2 Gael*0354 write(cunit) 1
0355 write(cunit) 1
0356 ENDIF
4d72283393 Mart*0357 _END_MASTER( myThid )
23a37235f2 Gael*0358 _BARRIER
0359 #endif
0360
0361 do k = 1, 1
0362
0363 CALL MDS_PASS_R8toRL( fld2d_buf, fld2dNodim,
cf2ce61250 Jean*0364 & 0, 0, 1, k, 1, 0, 0, .FALSE., myThid )
23a37235f2 Gael*0365 CALL BAR2( myThid )
0366 CALL GATHER_2D_R8( fld2d_buf_glo, fld2d_buf,
0367 & Nx,Ny,.FALSE.,.TRUE.,myThid)
0368 CALL BAR2( myThid )
0369
0370 CALL MDS_PASS_R8toRL( msk2d_buf, msk3d,
cf2ce61250 Jean*0371 & 0, 0, 1, k, Nr, 0, 0, .FALSE., myThid )
23a37235f2 Gael*0372 CALL BAR2( myThid )
0373 CALL GATHER_2D_R8( msk2d_buf_glo, msk2d_buf,
0374 & Nx,Ny,.FALSE.,.TRUE.,myThid)
0375 CALL BAR2( myThid )
0376
4d72283393 Mart*0377 _BEGIN_MASTER( myThid )
23a37235f2 Gael*0378 cbuffindex = 0
0379 IF ( myProcId .eq. 0 ) THEN
0380
0381 DO j=1,Ny
0382 DO i=1,Nx
0383 if (msk2d_buf_glo(i,j) .ne. 0. ) then
0384 cbuffindex = cbuffindex + 1
0385 cbuff(cbuffindex) = fld2d_buf_glo(i,j)
0386 #ifdef ALLOW_ADMTLM
0387 nveccount = nveccount + 1
0388 phtmpadmtlm(nveccount) = cbuff(cbuffindex)
dac57cef35 Patr*0389 #endif
23a37235f2 Gael*0390 endif
0391 ENDDO
0392 ENDDO
0393
0394 #ifndef ALLOW_ADMTLM
0395 if ( cbuffindex .gt. 0) then
0396 write(cunit) cbuffindex
0397 write(cunit) k
0398 write(cunit) (cbuff(ii), ii=1,cbuffindex)
0399 endif
0400 #endif
0401
0402 ENDIF
4d72283393 Mart*0403 _END_MASTER( myThid )
23a37235f2 Gael*0404 _BARRIER
0405
0406 enddo
0407 enddo
dac57cef35 Patr*0408
cf2ce61250 Jean*0409 # endif /* ALLOW_PACKUNPACK_METHOD2 */
23a37235f2 Gael*0410 # endif /* EXCLUDE_CTRL_PACK */
cf2ce61250 Jean*0411
5d5c0b0d52 Patr*0412 return
0413 end