!!---------------------------------------------------------------------- !! *** flx_bulk_daily *** !!---------------------------------------------------------------------- !!---------------------------------------------------------------------- !! bulk : reading !!---------------------------------------------------------------------- !! * Modules used C A U T I O N already defined in flxmod.F90 !! * Module variables INTEGER :: & numfl1, numfl2, & ! logical units for surface fluxes data numfl3, & ! nflx1, nflx2, & ! first and second record used nflx11, nflx12 , & ! ??? ndayflx REAL(wp), DIMENSION(jpi,jpj,2,7) :: & flxdta ! 2 consecutive set of CLIO/CMAP monthly fluxes !!---------------------------------------------------------------------- !! OPA 9.0 , LODYC-IPSL (2003) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE flx( kt ) !!--------------------------------------------------------------------- !! *** ROUTINE flx *** !! !! ** Purpose : provide the thermohaline fluxes (heat and freshwater) !! to the ocean at each time step. !! !! ** Method : !! ORCA FORCED VERSION WITH : !! Daily climatological NCEP temperature !! monthly climatological CLIO winds, humidity and clouds !! monthly climatological CMAP precipitation !! Read several AGCM daily and monthly fluxes file !! temperature at 2m tatm (K) !! relative humidite hatm (%) !! wind speed vatm (m/s) !! monthly precip watm (kg/m2/day) from Xie/Arkin !! clouds catm (%) !! !! caution : now, in the opa global model, the net upward water flux is !! ------- with mm/day unit. !! !! History : !! ! 91-03 (O. Marti and Ph Dandin) Original code !! ! 92-07 (M. Imbard) !! ! 96-11 (E. Guilyardi) Daily AGCM input files !! ! 99-11 (M. Imbard) NetCDF FORMAT with ioipsl !! ! 00-05 (K. Rodgers) Daily Netcdf !! 8.5 ! 02-09 (C. Ethe and G. Madec) F90: Free form and MODULE !!---------------------------------------------------------------------- !! * modules used USE ioipsl ! NetCDF IPSL library USE blk_oce ! bulk variable USE bulk ! bulk module !! * arguments INTEGER, INTENT( in ) :: kt ! ocean time step !! * Local declarations INTEGER , PARAMETER :: jpday = 365, jpmois = 12 INTEGER :: ji,jj INTEGER :: i15,iday, idy INTEGER , DIMENSION(jpday) :: istep_n INTEGER , DIMENSION(jpmois):: istep_c, istep_x INTEGER :: itime REAL(wp) :: zdate0 REAL(wp), DIMENSION(jpi,jpj) :: & zsst, & ! ??? zlon , & ! ??? zlat ! ??? REAL(wp), DIMENSION(jpk) :: & zlev ! ??? REAL(wp) :: zxy INTEGER :: ipi,ipj,ipk INTEGER :: iman,imois,imois2 CHARACTER(len=45) :: & clname_n = 'NCEP_1d_0101_0112_tair.nc', & clname_c = 'CLIO_1m_0101_0112_flx.nc' , & clname_x = 'CMAP_1m_0101_0112_rain.nc' !!--------------------------------------------------------------------- ! Initialization ! -------------- i15 = INT(2*FLOAT(nday)/(FLOAT(nobis(nmonth))+0.5)) itime = jpday ipi = jpiglo ipj = jpjglo ipk = jpk idy = 365 IF(nleapy == 1) idy = 366 iman = 12 imois = nmonth + i15 - 1 IF (imois == 0) imois = iman imois2 = nmonth ! 1. first call kt = nit000 ! ----------------------- IF( kt == nit000 ) THEN nflx1 = 0 nflx11 = 0 IF(lwp) THEN WRITE(numout,*) ' ' WRITE(numout,*) ' **** Routine flx.forced.ncep_clio_xie.h90' WRITE(numout,*) ' **** global NCEP flx daily fields ' WRITE(numout,*) ' **** global CLIO flx monthly fields ' WRITE(numout,*) ' **** global XIE flx monthly fields ' WRITE(numout,*) ' --------------------------------' WRITE(numout,*) ' NetCDF FORMAT' WRITE(numout,*) ' ' ENDIF ! open NCEP file CALL flinopen(clname_n,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj & ,ipk,zlon,zlat,zlev,itime,istep_n,zdate0,rdt,numfl1) IF( itime /= jpday .AND. itime /= jpday+1 ) THEN IF(lwp) THEN WRITE(numout,*) ' ' WRITE(numout,*) 'problem with time coordinates ' WRITE(numout,*) ' itime ',itime,' jpday ',jpday WRITE(numout,*) ' Check in file', clname_n ENDIF STOP 'flx.forced.ncep_clio_xie.h' ENDIF IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN IF(lwp) THEN WRITE(numout,*) ' ' WRITE(numout,*) 'problem with dimensions' WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta WRITE(numout,*) ' ipk ',ipk,' =? 1' WRITE(numout,*) ' Check in file', clname_n ENDIF STOP 'flx.forced.ncep_clio_xie.h' ENDIF ! open CLIO file CALL flinopen(clname_c,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj & ,ipk,zlon,zlat,zlev,itime,istep_c,zdate0,rdt,numfl2) IF( itime /= jpmois ) THEN IF(lwp) THEN WRITE(numout,*) ' ' WRITE(numout,*) 'problem with time coordinates ' WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois WRITE(numout,*) ' Check in file', clname_c ENDIF STOP 'flx.forced.ncep_clio_xie.h' ENDIF IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN IF(lwp) THEN WRITE(numout,*) ' ' WRITE(numout,*) 'problem with dimensions' WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta WRITE(numout,*) ' ipk ',ipk,' =? 1' WRITE(numout,*) ' Check in file', clname_c ENDIF STOP 'flx.forced.ncep_clio_xie.h' ENDIF ! open CMAP FILE CALL flinopen(clname_x,mig(1),nlci,mjg(1),nlcj,.FALSE.,ipi,ipj & ,ipk,zlon,zlat,zlev,itime,istep_x,zdate0,rdt,numfl3) IF( itime /= jpmois ) THEN IF(lwp) THEN WRITE(numout,*) ' ' WRITE(numout,*) 'problem with time coordinates ' WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois WRITE(numout,*) ' Check in file', clname_x ENDIF STOP 'flx.forced.ncep_clio_xie.h' ENDIF IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= 1 ) THEN IF(lwp) THEN WRITE(numout,*) ' ' WRITE(numout,*) 'problem with dimensions' WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta WRITE(numout,*) ' ipk ',ipk,' =? 1' WRITE(numout,*) ' Check in file', clname_x ENDIF STOP 'flx.forced.ncep_clio_xie.h' ENDIF ENDIF ! 2. Read daily DATA Temperature from NCEP ! --------------------------------------- IF( ndayflx /= nday ) THEN ndayflx = nday iday = nday_year ! read T 2m (Caution in K) CALL flinget(numfl1,'air',jpidta,jpjdta,1,jpday,iday, & iday,mig(1),nlci,mjg(1),nlcj,tatm(1:nlci,1:nlcj)) IF(lwp) WRITE (numout,*)' Lecture daily flx record OK :',iday IF(lwp) WRITE (numout,*)' ' ! conversion of temperature Kelvin --> Celsius [rt0=273.15] tatm(:,:) = ( tatm(:,:) - rt0 ) ENDIF ! 3. Read monthly data from CLIO and From Xie ! ------------------------------------------- IF( kt == nit000 .OR. imois /= nflx1 ) THEN ! calendar computation ! nflx1 number of the first file record used in the simulation ! flx2 number of the last file record nflx1 = imois nflx2 = nflx1+1 nflx1 = MOD(nflx1,iman) IF ( nflx1 == 0 ) nflx1 = iman nflx2 = MOD(nflx2,iman) IF ( nflx2 == 0 ) nflx2 = iman IF(lwp)WRITE(numout,*) 'first record file used nflx1 ',nflx1 IF(lwp)WRITE(numout,*) 'last record file used nflx2 ',nflx2 ! Read monthly fluxes data Esbensen Kushnir ! humidity CALL flinget(numfl2,'socliohu',jpidta,jpjdta,jpk,jpmois,nflx1, & nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,1)) CALL flinget(numfl2,'socliohu',jpidta,jpjdta,jpk,jpmois,nflx2, & nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,1)) ! wind CALL flinget(numfl2,'socliowi',jpidta,jpjdta,jpk,jpmois,nflx1, & nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,2)) CALL flinget(numfl2,'socliowi',jpidta,jpjdta,jpk,jpmois,nflx2, & nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,2)) ! clouds CALL flinget(numfl2,'socliocl',jpidta,jpjdta,jpk,jpmois,nflx1, & nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,3)) CALL flinget(numfl2,'socliocl',jpidta,jpjdta,jpk,jpmois,nflx2, & nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,3)) ! Read monthly precipitations ds flxdta(:,:,1 ou 2,4) CALL flinget(numfl3,'rain',jpidta,jpjdta,jpk,jpmois,nflx1, & nflx1,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,1,4)) CALL flinget(numfl3,'rain',jpidta,jpjdta,jpk,jpmois,nflx2, & nflx2,mig(1),nlci,mjg(1),nlcj,flxdta(1:nlci,1:nlcj,2,4)) ENDIF ! 3. at every time step linear interpolation of precipitation fluxes ! ----------------------------------------------------------- zxy = FLOAT(nday) / FLOAT(nobis(nflx1)) + 0.5 - i15 hatm(:,:) = ( (1.-zxy) * flxdta(:,:,1,1) + zxy * flxdta(:,:,2,1) ) vatm(:,:) = ( (1.-zxy) * flxdta(:,:,1,2) + zxy * flxdta(:,:,2,2) ) catm(:,:) = ( (1.-zxy )* flxdta(:,:,1,3) + zxy * flxdta(:,:,2,3) ) watm(:,:) = ( (1.-zxy) * flxdta(:,:,1,4) + zxy * flxdta(:,:,2,4) ) ! 4. Closing all files ! -------------------- IF( kt == nitend ) THEN CALL flinclo(numfl1) CALL flinclo(numfl2) CALL flinclo(numfl3) ENDIF CALL blk(kt) CALL FLUSH(numout) END SUBROUTINE flx