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