C $Header: /u/gcmpack/MITgcm/pkg/bling/bling_fields_load.F,v 1.5 2017/02/23 20:48:56 jmc Exp $ C $Name: $ #include "BLING_OPTIONS.h" #ifdef ALLOW_EXF # include "EXF_OPTIONS.h" #endif CBOP SUBROUTINE BLING_FIELDS_LOAD ( I myIter,myTime,myThid) C *========================================================* C | subroutine bling_fields_load C | o Read in fields needed for CO2, O2 flux terms, silica C | for pH calculation C *========================================================* implicit none C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #ifdef ALLOW_EXF # include "EXF_PARAM.h" # include "EXF_FIELDS.h" #endif #include "BLING_VARS.h" #include "BLING_LOAD.h" #ifdef ALLOW_THSICE # include "THSICE_VARS.h" #endif #ifdef ALLOW_SEAICE # include "SEAICE_SIZE.h" # include "SEAICE.h" #endif C !INPUT PARAMETERS: =================================================== C myThid :: thread number C myIter :: current timestep C myTime :: current time INTEGER myIter _RL myTime INTEGER myThid #ifdef ALLOW_BLING C !LOCAL VARIABLES: =================================================== INTEGER bi, bj, i, j INTEGER intimeP, intime0, intime1 _RL aWght,bWght CEOP IF ( BLING_forcingCycle.gt.0. _d 0 ) THEN C-- Now calculate whether it is time to update the forcing arrays CALL GET_PERIODIC_INTERVAL( O intimeP, intime0, intime1, bWght, aWght, I BLING_forcingCycle, BLING_forcingPeriod, I deltaTClock, myTime, myThid ) bi = myBxLo(myThid) bj = myByLo(myThid) #ifdef ALLOW_DEBUG IF ( debugLevel.GE.debLevB ) THEN _BEGIN_MASTER(myThid) WRITE(standardMessageUnit,'(A,I10,A,4I5,A,2F14.10)') & ' BLING_FIELDS_LOAD,', myIter, & ' : iP,iLd,i0,i1=', intimeP,BLING_ldRec(bi,bj), intime0, & intime1, & ' ; Wght=', bWght, aWght _END_MASTER(myThid) ENDIF #endif /* ALLOW_DEBUG */ #ifdef ALLOW_AUTODIFF C- assuming that we call S/R BLING_FIELDS_LOAD at each time-step and C with increasing time, this will catch when we need to load new records; C But with Adjoint run, this is not always the case => might end-up using C the wrong time-records IF ( intime0.NE.intimeP .OR. myIter.EQ.nIter0 ) THEN #else /* ALLOW_AUTODIFF */ C- Make no assumption on sequence of calls to BLING_FIELDS_LOAD ; C This is the correct formulation (works in Adjoint run). C Unfortunatly, produces many recomputations <== not used until it is fixed IF ( intime1.NE.BLING_ldRec(bi,bj) ) THEN #endif /* ALLOW_AUTODIFF */ C-- If the above condition is met then we need to read in C data for the period ahead and the period behind myTime. IF ( debugLevel.GE.debLevZero ) THEN _BEGIN_MASTER(myThid) WRITE(standardMessageUnit,'(A,I10,A,2(2I5,A))') & ' BLING_FIELDS_LOAD, it=', myIter, & ' : Reading new data, i0,i1=', intime0, intime1, & ' (prev=', intimeP, BLING_ldRec(bi,bj), ' )' _END_MASTER(myThid) ENDIF _BARRIER IF ( BLING_windFile .NE. ' ' ) THEN CALL READ_REC_XY_RS( BLING_windFile,dicwind0,intime0, & myIter,myThid ) CALL READ_REC_XY_RS( BLING_windFile,dicwind1,intime1, & myIter,myThid ) ENDIF IF ( BLING_atmospFile .NE. ' ' ) THEN CALL READ_REC_XY_RS( BLING_atmospFile,atmosp0,intime0, & myIter,myThid ) CALL READ_REC_XY_RS( BLING_atmospFile,atmosp1,intime1, & myIter,myThid ) ENDIF IF ( BLING_silicaFile .NE. ' ' ) THEN CALL READ_REC_XY_RS( BLING_silicaFile,silica0,intime0, & myIter,myThid ) CALL READ_REC_XY_RS( BLING_silicaFile,silica1,intime1, & myIter,myThid ) ENDIF IF ( BLING_iceFile .NE. ' ' ) THEN CALL READ_REC_XY_RS( BLING_iceFile,ice0,intime0, & myIter,myThid ) CALL READ_REC_XY_RS( BLING_iceFile,ice1,intime1, & myIter,myThid ) ENDIF IF ( BLING_ironFile .NE. ' ' ) THEN CALL READ_REC_XY_RS( BLING_ironFile,feinput0,intime0, & myIter,myThid ) CALL READ_REC_XY_RS( BLING_ironFile,feinput1,intime1, & myIter,myThid ) ENDIF C-- fill-in overlap after loading temp arrays: _EXCH_XY_RS(dicwind0, myThid ) _EXCH_XY_RS(dicwind1, myThid ) _EXCH_XY_RS(atmosp0, myThid ) _EXCH_XY_RS(atmosp1, myThid ) _EXCH_XY_RS(silica0, myThid ) _EXCH_XY_RS(silica1, myThid ) _EXCH_XY_RS(ice0, myThid ) _EXCH_XY_RS(ice1, myThid ) _EXCH_XY_RS(feinput0, myThid ) _EXCH_XY_RS(feinput1, myThid ) C- save newly loaded time-record DO bj = myByLo(myThid), myByHi(myThid) DO bi = myBxLo(myThid), myBxHi(myThid) BLING_ldRec(bi,bj) = intime1 ENDDO ENDDO C- end if-bloc (time to load new fields) ENDIF DO bj = myByLo(myThid), myByHi(myThid) DO bi = myBxLo(myThid), myBxHi(myThid) IF ( BLING_windFile .NE. ' ' ) THEN DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx WIND(i,j,bi,bj) = bWght*dicwind0(i,j,bi,bj) & + aWght*dicwind1(i,j,bi,bj) ENDDO ENDDO ENDIF #ifndef USE_PLOAD IF ( BLING_atmospFile .NE. ' ' ) THEN DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx AtmosP(i,j,bi,bj) = bWght*atmosp0(i,j,bi,bj) & + aWght*atmosp1(i,j,bi,bj) ENDDO ENDDO ENDIF #endif IF ( BLING_silicaFile .NE. ' ' ) THEN DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx SILICA(i,j,bi,bj) = bWght*silica0(i,j,bi,bj) & + aWght*silica1(i,j,bi,bj) ENDDO ENDDO ENDIF IF ( BLING_iceFile .NE. ' ' ) THEN DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx FIce(i,j,bi,bj) = bWght*ice0(i,j,bi,bj) & + aWght*ice1(i,j,bi,bj) ENDDO ENDDO ENDIF IF ( BLING_ironFile .NE. ' ' ) THEN DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx InputFe(i,j,bi,bj) = bWght*feinput0(i,j,bi,bj) & + aWght*feinput1(i,j,bi,bj) ENDDO ENDDO ENDIF ENDDO ENDDO C endif for BLING_forcingCycle ENDIF DO bj = myByLo(myThid), myByHi(myThid) DO bi = myBxLo(myThid), myBxHi(myThid) #ifdef ALLOW_SEAICE IF ( useSEAICE ) THEN DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx FIce(i,j,bi,bj) = AREA(i,j,bi,bj) ENDDO ENDDO ENDIF #endif #ifdef ALLOW_THSICE IF ( useThSIce ) THEN DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx FIce(i,j,bi,bj) = iceMask(i,j,bi,bj) ENDDO ENDDO ENDIF #endif ENDDO ENDDO C----------------------------------------------------------- C Get Atmospheric carbon dioxide concentration from PKG/EXF #ifdef USE_EXFCO2 C Atmospheric carbon dioxide concentration CALL EXF_SET_FLD( I 'apco2', apco2file, apco2mask, I apco2StartTime, apco2period, apco2RepCycle, I exf_inscal_apco2, I apco2_exfremo_intercept, apco2_exfremo_slope, U apco2, apco20, apco21, # ifdef USE_EXF_INTERPOLATION I apco2_lon0, apco2_lon_inc, apco2_lat0, apco2_lat_inc, I apco2_nlon, apco2_nlat, xC, yC, apco2_interpMethod, # endif I myTime, myIter, myThid ) #endif /* USE_EXFCO2 */ #endif /* ALLOW_BLING */ RETURN END