Changeset 11482
- Timestamp:
- 2019-08-29T13:15:12+02:00 (5 years ago)
- Location:
- NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DOM/dtatsd.F90
r10213 r11482 22 22 USE in_out_manager ! I/O manager 23 23 USE lib_mpp ! MPP library 24 USE iom, ONLY : iom_swap, iom_setkt, iom_context_finalize 25 USE lbclnk ! lateal boundary condition / mpp exchanges 24 26 25 27 IMPLICIT NONE … … 28 30 PUBLIC dta_tsd_init ! called by opa.F90 29 31 PUBLIC dta_tsd ! called by istate.F90 and tradmp.90 32 PUBLIC iom_dta_tsd_init 30 33 31 34 ! !!* namtsd namelist : Temperature & Salinity Data * 32 35 LOGICAL , PUBLIC :: ln_tsd_init !: T & S data flag 33 36 LOGICAL , PUBLIC :: ln_tsd_dmp !: internal damping toward input data flag 37 LOGICAL , PRIVATE:: ln_tsd_xios 34 38 35 39 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_tsd ! structure of input SST (file informations, fields read) 40 CHARACTER(lc), PUBLIC :: cinit_context !: context name used in xios 36 41 37 42 !!---------------------------------------------------------------------- … … 59 64 TYPE(FLD_N) :: sn_tem, sn_sal 60 65 !! 61 NAMELIST/namtsd/ ln_tsd_init, ln_tsd_dmp, cn_dir, sn_tem, sn_sal 66 NAMELIST/namtsd/ ln_tsd_init, ln_tsd_dmp, cn_dir, sn_tem, sn_sal, ln_tsd_xios 62 67 !!---------------------------------------------------------------------- 63 68 ! … … 114 119 slf_i(jp_tem) = sn_tem ; slf_i(jp_sal) = sn_sal 115 120 CALL fld_fill( sf_tsd, slf_i, cn_dir, 'dta_tsd', 'Temperature & Salinity data', 'namtsd', no_print ) 121 cinit_context = 'dta_tsd_init' 122 IF( ln_tsd_xios) CALL iom_dta_tsd_init( cinit_context ) 116 123 ! 117 124 ENDIF … … 121 128 122 129 SUBROUTINE dta_tsd( kt, ptsd ) 130 #if defined key_iomput 131 use xios, ONLY : xios_recv_field 132 #endif 123 133 !!---------------------------------------------------------------------- 124 134 !! *** ROUTINE dta_tsd *** … … 144 154 !!---------------------------------------------------------------------- 145 155 ! 146 CALL fld_read( kt, 1, sf_tsd ) !== read T & S data at kt time step ==! 156 IF(ln_tsd_xios) CALL iom_swap(cinit_context) 157 CALL fld_read( kt, 1, sf_tsd, ldxios = ln_tsd_xios) !== read T & S data at kt time step ==! 158 IF(kt == nitend .OR. (.NOT.ln_tsd_dmp) .AND. ln_tsd_xios) CALL iom_context_finalize( cinit_context ) 159 CALL iom_swap( cxios_context ) 147 160 ! 148 161 ! … … 253 266 END SUBROUTINE dta_tsd 254 267 268 SUBROUTINE iom_dta_tsd_init( cdname, ld_tmppatch ) 269 #if defined key_iomput 270 use xios 271 #endif 272 !!---------------------------------------------------------------------- 273 !! *** ROUTINE *** 274 !! 275 !! ** Purpose : initialize context for reading T & S input data 276 !! to replace fld_ intrerface with XIOS to read initial 277 !! conditions. Have it separated from other conditions 278 !! because initialization happens before model starts 279 !! time stepping. 280 !! 281 !!---------------------------------------------------------------------- 282 CHARACTER(len=*), INTENT(in) :: cdname 283 LOGICAL , OPTIONAL, INTENT(in) :: ld_tmppatch 284 #if defined key_iomput 285 ! 286 CHARACTER(len=lc) :: clname 287 INTEGER, PARAMETER :: lstr = 256 !: length of the string set to 256 288 INTEGER :: ji, jkmin 289 LOGICAL :: ll_tmppatch = .TRUE. !: seb: patch before we remove periodicity 290 INTEGER :: nldi_save, nlei_save !: and close boundaries in output files 291 INTEGER :: nldj_save, nlej_save !: 292 LOGICAL :: ll_global = .FALSE. !: do we have variable on model grid 293 CHARACTER(len=lc), DIMENSION( jpts) :: cg_name(jpts) 294 CHARACTER(len=1), DIMENSION( 5) :: cname 295 CHARACTER(len=lstr) :: cfname ! file name without .nc 296 TYPE(xios_duration) :: dtime = xios_duration(0, 0, 0, 0, 0, 0), & 297 outp_frq = xios_duration(0, 0, 0, 0, 0, 0) 298 TYPE(xios_domaingroup) :: domaingroup_hdl 299 TYPE(xios_domain) :: domain_hdl 300 TYPE(xios_axisgroup) :: axisgroup_hdl 301 TYPE(xios_axis) :: axis_hdl 302 TYPE(xios_scalar) :: scalar_hdl 303 TYPE(xios_scalargroup) :: scalargroup_hdl 304 TYPE(xios_file) :: file_hdl 305 TYPE(xios_filegroup) :: filegroup_hdl 306 TYPE(xios_field) :: field_hdl 307 INTEGER :: jf, ni, nj, ipos 308 309 cname(1)='a' 310 cname(2)='b' 311 cname(3)='c' 312 cname(4)='d' 313 cname(5)='e' 314 !!---------------------------------------------------------------------- 315 ! 316 ! seb: patch before we remove periodicity and close boundaries in output files 317 IF ( ll_tmppatch ) THEN 318 nldi_save = nldi ; nlei_save = nlei 319 nldj_save = nldj ; nlej_save = nlej 320 IF( nimpp == 1 ) nldi = 1 321 IF( nimpp + jpi - 1 == jpiglo ) nlei = jpi 322 IF( njmpp == 1 ) nldj = 1 323 IF( njmpp + jpj - 1 == jpjglo ) nlej = jpj 324 ENDIF 325 ! 326 clname = cdname 327 IF( TRIM(Agrif_CFixed()) /= '0' ) clname = TRIM(Agrif_CFixed())//"_"//TRIM(cdname) 328 CALL xios_context_initialize(TRIM(clname), mpi_comm_oce) 329 CALL iom_swap( cdname ) 330 ! Calendar type is now defined in xml file 331 SELECT CASE ( nleapy ) ! Choose calendar for IOIPSL 332 CASE ( 1) ; CALL xios_define_calendar( TYPE = "Gregorian", time_origin = xios_date(1976,01,01,00,00,00), & 333 & start_date = xios_date(1976,02,15,00,00,00) ) 334 CASE ( 0) ; CALL xios_define_calendar( TYPE = "NoLeap" , time_origin = xios_date(1976,01,01,00,00,00), & 335 & start_date = xios_date(1976,02,15,00,00,00) ) 336 CASE (30) ; CALL xios_define_calendar( TYPE = "D360" , time_origin = xios_date(1976,01,01,00,00,00), & 337 & start_date = xios_date(nyear, nmonth, nday, 00, 00, 00) ) 338 END SELECT 339 340 DO jf = 1, SIZE(sf_tsd) 341 IF( LEN( TRIM(sf_tsd(jf)%wgtname) ) > 0) THEN 342 STOP 'IMPLEMENTATION NOT FINISHED' 343 ELSE 344 IF(.NOT. ll_global) THEN 345 CALL xios_get_handle("domain_definition",domaingroup_hdl) 346 CALL xios_add_child(domaingroup_hdl, domain_hdl, "grid_global") 347 ni = nlei-nldi+1 348 nj = nlej-nldj+1 349 CALL xios_set_domain_attr("grid_global", ni_glo=jpiglo, nj_glo=jpjglo, ibegin=nimpp+nldi-2, jbegin=njmpp+nldj-2, ni=ni, nj=nj) 350 CALL xios_set_domain_attr("grid_global", data_dim=2, data_ibegin = 1-nldi, data_ni = jpi, data_jbegin = 1-nldj, data_nj = jpj) 351 CALL xios_set_domain_attr("grid_global", type='curvilinear') 352 ll_global = .TRUE. 353 ENDIF 354 ENDIF 355 ENDDO 356 357 CALL xios_get_handle("axis_definition",axisgroup_hdl) 358 CALL xios_add_child(axisgroup_hdl, axis_hdl, "depth") 359 CALL xios_set_axis_attr ("depth" , n_glo= jpk) 360 361 362 CALL xios_get_handle("file_definition", filegroup_hdl ) 363 364 DO jf = 1, SIZE(sf_tsd) 365 366 IF(sf_tsd(jf)%nfreqh < 0 ) THEN 367 outp_frq%month = -sf_tsd(jf)%nfreqh 368 ELSE 369 outp_frq%hour = sf_tsd(jf)%nfreqh 370 ENDIF 371 CALL xios_add_child(filegroup_hdl, file_hdl, cname(jf)) 372 ipos = index(sf_tsd(jf)%clrootname,'.nc') 373 cfname(1:lstr) = " " 374 IF(ipos > 0) THEN 375 cfname(1:ipos-1) = sf_tsd(jf)%clrootname(1:ipos-1) 376 ELSE 377 cfname(1:lstr) = sf_tsd(jf)%clrootname(1:lstr) 378 ENDIF 379 CALL xios_set_file_attr( cname(jf), name=TRIM(cfname), & 380 type="one_file", time_counter_name="time", & 381 par_access="collective", enabled=.TRUE., mode="read", & 382 output_freq=outp_frq, time_units = "days") 383 CALL xios_add_child(file_hdl, field_hdl, TRIM(sf_tsd(jf)%clvar)) 384 CALL xios_set_attr (field_hdl, enabled = .TRUE., & 385 name = TRIM(sf_tsd(jf)%clvar), domain_ref="grid_global", & 386 axis_ref="depth", operation = "instant") 387 ENDDO 388 389 dtime%month = 1 390 CALL xios_set_timestep( dtime ) 391 CALL xios_close_context_definition() 392 CALL xios_update_calendar( 0 ) 393 394 IF ( ll_tmppatch ) THEN 395 nldi = nldi_save ; nlei = nlei_save 396 nldj = nldj_save ; nlej = nlej_save 397 ENDIF 398 #endif 399 ! 400 END SUBROUTINE iom_dta_tsd_init 401 402 255 403 !!====================================================================== 256 404 END MODULE dtatsd -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/IOM/iom.F90
r11405 r11482 1305 1305 ELSE ! read using XIOS. Only if KEY_IOMPUT is defined 1306 1306 #if defined key_iomput 1307 IF( PRESENT(ktime) ) THEN 1308 if(lwp) write(numout, *) 'XIOS BDRY READ itime = ', ktime 1309 CALL xios_update_calendar( ktime - 1 ) 1310 ENDIF 1307 1311 IF( PRESENT(pv_r3d) ) THEN 1308 1312 pv_r3d(:, :, :) = 0. -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/SBC/fldread.F90
r11405 r11482 129 129 CONTAINS 130 130 131 SUBROUTINE fld_read( kt, kn_fsbc, sd, map, kit, kt_offset, jpk_bdy, fvl )131 SUBROUTINE fld_read( kt, kn_fsbc, sd, map, kit, kt_offset, jpk_bdy, fvl, ldxios ) 132 132 !!--------------------------------------------------------------------- 133 133 !! *** ROUTINE fld_read *** … … 152 152 INTEGER , INTENT(in ), OPTIONAL :: jpk_bdy ! number of vertical levels in the BDY data 153 153 LOGICAL , INTENT(in ), OPTIONAL :: fvl ! number of vertical levels in the BDY data 154 LOGICAL , INTENT(in ), OPTIONAL :: ldxios ! use xios to read data 154 155 !! 155 156 INTEGER :: itmp ! local variable … … 167 168 CHARACTER(LEN=1000) :: clfmt ! write format 168 169 TYPE(MAP_POINTER) :: imap ! global-to-local mapping indices 169 !!--------------------------------------------------------------------- 170 LOGICAL :: luxios ! temporary variable to hold ldxios 171 !!--------------------------------------------------------------------- 172 173 luxios = .FALSE. 174 IF( PRESENT(ldxios) ) luxios = ldxios 175 170 176 ll_firstcall = kt == nit000 171 177 IF( PRESENT(kit) ) ll_firstcall = ll_firstcall .and. kit == 1 … … 190 196 IF( PRESENT(map) ) imap = map(jf) 191 197 IF( PRESENT(jpk_bdy) ) THEN 192 CALL fld_init( kn_fsbc, sd(jf), imap, jpk_bdy, fvl 198 CALL fld_init( kn_fsbc, sd(jf), imap, jpk_bdy, fvl, ldxios = luxios) ! read each before field (put them in after as they will be swapped) 193 199 ELSE 194 CALL fld_init( kn_fsbc, sd(jf), imap 200 CALL fld_init( kn_fsbc, sd(jf), imap, ldxios = luxios) ! read each before field (put them in after as they will be swapped) 195 201 ENDIF 196 202 END DO … … 211 217 IF( sd(jf)%ln_tint ) sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2) ! swap before record field 212 218 213 CALL fld_rec( kn_fsbc, sd(jf), kt_offset = it_offset, kit = kit 219 CALL fld_rec( kn_fsbc, sd(jf), kt_offset = it_offset, kit = kit) ! update after record informations 214 220 215 221 ! if kn_fsbc*rdt is larger than nfreqh (which is kind of odd), … … 222 228 itmp = sd(jf)%nrec_a(1) ! temporary storage 223 229 sd(jf)%nrec_a(1) = sd(jf)%nreclast ! read the last record of the file currently opened 224 CALL fld_get( sd(jf), imap )! read after data230 CALL fld_get( sd(jf), imap, ldxios = luxios) ! read after data 225 231 sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2) ! re-swap before record field 226 232 sd(jf)%nrec_b(1) = sd(jf)%nrec_a(1) ! update before record informations … … 240 246 & .AND. sd(jf)%nrec_b(1) /= sd(jf)%nrec_a(1) - 1 ) THEN 241 247 sd(jf)%nrec_a(1) = sd(jf)%nrec_a(1) - 1 ! move back to before record 242 CALL fld_get( sd(jf), imap )! read after data248 CALL fld_get( sd(jf), imap, ldxios = luxios) ! read after data 243 249 sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2) ! re-swap before record field 244 250 sd(jf)%nrec_b(1) = sd(jf)%nrec_a(1) ! update before record informations … … 286 292 ! read after data 287 293 IF( PRESENT(jpk_bdy) ) THEN 288 CALL fld_get( sd(jf), imap, jpk_bdy, fvl )294 CALL fld_get( sd(jf), imap, jpk_bdy, fvl, ldxios = luxios) 289 295 ELSE 290 CALL fld_get( sd(jf), imap )296 CALL fld_get( sd(jf), imap, ldxios = luxios ) 291 297 ENDIF 292 298 ENDIF ! read new data? … … 327 333 328 334 329 SUBROUTINE fld_init( kn_fsbc, sdjf, map , jpk_bdy, fvl )335 SUBROUTINE fld_init( kn_fsbc, sdjf, map , jpk_bdy, fvl, ldxios) 330 336 !!--------------------------------------------------------------------- 331 337 !! *** ROUTINE fld_init *** … … 339 345 INTEGER , INTENT(in), OPTIONAL :: jpk_bdy ! number of vertical levels in the BDY data 340 346 LOGICAL , INTENT(in), OPTIONAL :: fvl ! number of vertical levels in the BDY data 347 LOGICAL , OPTIONAL :: ldxios ! use xios for I/O 341 348 !! 342 349 LOGICAL :: llprevyr ! are we reading previous year file? … … 350 357 INTEGER :: isec_week ! number of seconds since start of the weekly file 351 358 CHARACTER(LEN=1000) :: clfmt ! write format 359 LOGICAL :: luxios ! local variable to keep ldxios info 352 360 !!--------------------------------------------------------------------- 353 361 llprevyr = .FALSE. … … 356 364 llprevday = .FALSE. 357 365 isec_week = 0 366 luxios = .FALSE. 367 IF( PRESENT(ldxios)) luxios = ldxios 368 358 369 ! 359 370 ! define record informations … … 365 376 ! 366 377 IF( sdjf%nrec_a(1) == 0 ) THEN ! we redefine record sdjf%nrec_a(1) with the last record of previous year file 378 IF(luxios) THEN 379 IF(lwp) write(numout, *) 'Can not use XIOS to read data. Switching to old functionality' 380 luxios = .FALSE. ! we can not use XIOS in this case 381 ENDIF 367 382 IF ( sdjf%nfreqh == -12 ) THEN ! yearly mean 368 383 IF( sdjf%cltype == 'yearly' ) THEN ! yearly file … … 436 451 CALL fld_get( sdjf, map, jpk_bdy, fvl ) 437 452 ELSE 438 CALL fld_get( sdjf, map 453 CALL fld_get( sdjf, map, ldxios = luxios) 439 454 ENDIF 440 455 ! … … 613 628 614 629 615 SUBROUTINE fld_get( sdjf, map, jpk_bdy, fvl 630 SUBROUTINE fld_get( sdjf, map, jpk_bdy, fvl, ldxios) 616 631 !!--------------------------------------------------------------------- 617 632 !! *** ROUTINE fld_get *** … … 623 638 INTEGER , INTENT(in), OPTIONAL :: jpk_bdy ! number of vertical levels in the bdy data 624 639 LOGICAL , INTENT(in), OPTIONAL :: fvl ! number of vertical levels in the bdy data 640 LOGICAL , OPTIONAL :: ldxios ! xios I/O 625 641 ! 626 642 INTEGER :: ipk ! number of vertical levels of sdjf%fdta ( 2D: ipk=1 ; 3D: ipk=jpk ) … … 630 646 INTEGER :: idmspc ! number of spatial dimensions 631 647 LOGICAL :: lmoor ! C1D case: point data 632 !!--------------------------------------------------------------------- 633 ! 648 LOGICAL :: luxios ! local variable for ldxios 649 REAL(wp):: amaxval, aminval 650 !!--------------------------------------------------------------------- 651 ! 652 653 luxios = .FALSE. 654 IF( PRESENT(ldxios) ) luxios = ldxios 634 655 ipk = SIZE( sdjf%fnow, 3 ) 635 656 ! … … 668 689 IF( lk_c1d .AND. lmoor ) THEN 669 690 IF( sdjf%ln_tint ) THEN 670 CALL iom_get( sdjf%num, sdjf%clvar, sdjf%fdta(2,2,1,2), sdjf%nrec_a(1) )691 CALL iom_get( sdjf%num, sdjf%clvar, sdjf%fdta(2,2,1,2), sdjf%nrec_a(1), ldxios = luxios ) 671 692 CALL lbc_lnk( 'fldread', sdjf%fdta(:,:,1,2),'Z',1. ) 672 693 ELSE 673 CALL iom_get( sdjf%num, sdjf%clvar, sdjf%fnow(2,2,1 ), sdjf%nrec_a(1) )694 CALL iom_get( sdjf%num, sdjf%clvar, sdjf%fnow(2,2,1 ), sdjf%nrec_a(1), ldxios = luxios ) 674 695 CALL lbc_lnk( 'fldread', sdjf%fnow(:,:,1 ),'Z',1. ) 675 696 ENDIF 676 697 ELSE 677 IF( sdjf%ln_tint ) THEN ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,1,2), sdjf%nrec_a(1) )678 ELSE ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,1 ), sdjf%nrec_a(1) )698 IF( sdjf%ln_tint ) THEN ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,1,2), sdjf%nrec_a(1), ldxios = luxios ) 699 ELSE ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,1 ), sdjf%nrec_a(1), ldxios = luxios ) 679 700 ENDIF 680 701 ENDIF … … 682 703 IF (lk_c1d .AND. lmoor ) THEN 683 704 IF( sdjf%ln_tint ) THEN 684 CALL iom_get( sdjf%num, jpdom_unknown, sdjf%clvar, sdjf%fdta(2,2,:,2), sdjf%nrec_a(1) 705 CALL iom_get( sdjf%num, jpdom_unknown, sdjf%clvar, sdjf%fdta(2,2,:,2), sdjf%nrec_a(1), ldxios = luxios) 685 706 CALL lbc_lnk( 'fldread', sdjf%fdta(:,:,:,2),'Z',1. ) 686 707 ELSE 687 CALL iom_get( sdjf%num, jpdom_unknown, sdjf%clvar, sdjf%fnow(2,2,: ), sdjf%nrec_a(1) 708 CALL iom_get( sdjf%num, jpdom_unknown, sdjf%clvar, sdjf%fnow(2,2,: ), sdjf%nrec_a(1), ldxios = luxios) 688 709 CALL lbc_lnk( 'fldread', sdjf%fnow(:,:,: ),'Z',1. ) 689 710 ENDIF 690 711 ELSE 691 IF( sdjf%ln_tint ) THEN ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1) )692 ELSE ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,: ), sdjf%nrec_a(1) )712 IF( sdjf%ln_tint ) THEN ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), ldxios = luxios ) 713 ELSE ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,: ), sdjf%nrec_a(1), ldxios = luxios ) 693 714 ENDIF 694 715 ENDIF -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/SBC/sbcblk.F90
r11405 r11482 827 827 name = TRIM(aname), domain_ref="grid_global", & 828 828 operation = "instant") 829 WRITE(aname,'(a3,i2.2)') 'dst',jn 829 830 CALL xios_add_child(file_hdl, field_hdl, TRIM(aname)//TRIM(sf(jf)%wgtname)) 830 831 CALL xios_set_attr (field_hdl, enabled = .TRUE., & 831 832 name = TRIM(aname), domain_ref="grid_global", & 832 operation = "instant") 833 operation = "instant") 834 WRITE(aname,'(a3,i2.2)') 'wgt',jn 835 CALL xios_add_child(file_hdl, field_hdl, TRIM(aname)//TRIM(sf(jf)%wgtname)) 836 CALL xios_set_attr (field_hdl, enabled = .TRUE., & 837 name = TRIM(aname), domain_ref="grid_global", & 838 operation = "instant") 833 839 ENDDO 834 840 ENDDO
Note: See TracChangeset
for help on using the changeset viewer.