New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 6200 for branches/UKMO/dev_r5518_med_test/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90 – NEMO

Ignore:
Timestamp:
2016-01-04T11:49:32+01:00 (8 years ago)
Author:
frrh
Message:

Merge in branches/UKMO/dev_r5518_coupling_GSI7_GSI8_landice@5797
and MY medusa interface, resolve conflicts in sbccpl and, mysteriously
in sbcice_cice.F90 which frankly should not occur since I am doing nothing in
here!

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_med_test/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90

    r6199 r6200  
    5252   USE limthd_dh       ! for CALL lim_thd_snwblow 
    5353#endif 
     54#if defined key_medusa 
     55! RSRH Temporarily commented out until we get MEDUSA code   USE trc 
     56#endif 
     57 
     58 
     59 
    5460 
    5561   IMPLICIT NONE 
     
    105111   INTEGER, PARAMETER ::   jpr_e3t1st = 41            ! first T level thickness  
    106112   INTEGER, PARAMETER ::   jpr_fraqsr = 42            ! fraction of solar net radiation absorbed in the first ocean level 
    107    INTEGER, PARAMETER ::   jprcv      = 42            ! total number of fields received 
     113   INTEGER, PARAMETER ::   jpr_ts_ice = 43            ! skin temperature of sea-ice (used for melt-ponds) 
     114   INTEGER, PARAMETER ::   jpr_grnm   = 44            ! Greenland ice mass 
     115   INTEGER, PARAMETER ::   jpr_antm   = 45            ! Antarctic ice mass 
     116   INTEGER, PARAMETER ::   jpr_atm_pco2 = 46          ! Incoming atm CO2 flux 
     117   INTEGER, PARAMETER ::   jpr_atm_dust = 47          ! Incoming atm aggregate dust  
     118   INTEGER, PARAMETER ::   jprcv      = 47            ! total number of fields received 
    108119 
    109120   INTEGER, PARAMETER ::   jps_fice   =  1            ! ice fraction sent to the atmosphere 
     
    135146   INTEGER, PARAMETER ::   jps_e3t1st = 27            ! first level depth (vvl) 
    136147   INTEGER, PARAMETER ::   jps_fraqsr = 28            ! fraction of solar net radiation absorbed in the first ocean level 
    137    INTEGER, PARAMETER ::   jpsnd      = 28            ! total number of fields sended 
     148   INTEGER, PARAMETER ::   jps_bio_co2 = 29           ! MEDUSA air-sea CO2 flux in 
     149   INTEGER, PARAMETER ::   jps_bio_dms = 30           ! MEDUSA DMS surface concentration in 
     150   INTEGER, PARAMETER ::   jpsnd      = 30            ! total number of fields sent 
     151 
     152   REAL(wp), PARAMETER :: dms_unit_conv = 1.0e+6      ! Coversion factor to get outgong DMS in standard units for coupling 
     153                                                 ! i.e. specifically nmol/L (= umol/m3) 
    138154 
    139155   !                                                         !!** namelist namsbc_cpl ** 
     
    146162   END TYPE FLD_C 
    147163   ! Send to the atmosphere                           ! 
    148    TYPE(FLD_C) ::   sn_snd_temp, sn_snd_alb, sn_snd_thick, sn_snd_crt, sn_snd_co2                         
     164   TYPE(FLD_C) ::   sn_snd_temp, sn_snd_alb, sn_snd_thick, sn_snd_crt, sn_snd_co2, sn_snd_cond, sn_snd_mpnd, sn_snd_sstfrz, sn_snd_thick1 
     165   TYPE(FLD_C) ::   sn_snd_bio_co2, sn_snd_bio_dms                        
    149166   ! Received from the atmosphere                     ! 
    150167   TYPE(FLD_C) ::   sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_dqnsdt, sn_rcv_qsr, sn_rcv_qns, sn_rcv_emp, sn_rcv_rnf 
    151    TYPE(FLD_C) ::   sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2                         
     168   TYPE(FLD_C) ::   sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2, sn_rcv_ts_ice, sn_rcv_grnm, sn_rcv_antm 
     169   TYPE(FLD_C) ::   sn_rcv_atm_pco2, sn_rcv_atm_dust                          
    152170   ! Other namelist parameters                        ! 
    153171   INTEGER     ::   nn_cplmodel            ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 
     
    163181 
    164182   INTEGER , ALLOCATABLE, SAVE, DIMENSION(    :) ::   nrcvinfo           ! OASIS info argument 
     183 
    165184 
    166185   !! Substitution 
     
    216235      REAL(wp), POINTER, DIMENSION(:,:) ::   zacs, zaos 
    217236      !! 
    218       NAMELIST/namsbc_cpl/  sn_snd_temp, sn_snd_alb   , sn_snd_thick, sn_snd_crt   , sn_snd_co2,      & 
    219          &                  sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau  , sn_rcv_dqnsdt, sn_rcv_qsr,      & 
    220          &                  sn_rcv_qns , sn_rcv_emp   , sn_rcv_rnf  , sn_rcv_cal   , sn_rcv_iceflx,   & 
    221          &                  sn_rcv_co2 , nn_cplmodel  , ln_usecplmask 
     237      NAMELIST/namsbc_cpl/  sn_snd_temp, sn_snd_alb   , sn_snd_thick , sn_snd_crt   , sn_snd_co2,     & 
     238         &                  sn_snd_bio_co2, sn_snd_bio_dms,                                           & 
     239         &                  sn_snd_cond, sn_snd_mpnd  , sn_snd_sstfrz, sn_snd_thick1,                 & 
     240         &                  sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau   , sn_rcv_dqnsdt, sn_rcv_qsr,     & 
     241         &                  sn_rcv_qns , sn_rcv_emp   , sn_rcv_rnf   , sn_rcv_cal   , sn_rcv_iceflx,  & 
     242         &                  sn_rcv_atm_pco2, sn_rcv_atm_dust,                                         & 
     243         &                  sn_rcv_co2 , sn_rcv_grnm  , sn_rcv_antm  , sn_rcv_ts_ice, nn_cplmodel  ,  & 
     244         &                  ln_usecplmask, ln_coupled_iceshelf_fluxes, rn_greenland_calving_fraction, & 
     245         &                  rn_antarctica_calving_fraction, rn_iceshelf_fluxes_tolerance 
     246 
    222247      !!--------------------------------------------------------------------- 
    223248      ! 
     
    245270      ENDIF 
    246271      IF( lwp .AND. ln_cpl ) THEN                        ! control print 
    247          WRITE(numout,*)'  received fields (mutiple ice categogies)' 
     272         WRITE(numout,*)'  received fields (mutiple ice categories)' 
    248273         WRITE(numout,*)'      10m wind module                 = ', TRIM(sn_rcv_w10m%cldes  ), ' (', TRIM(sn_rcv_w10m%clcat  ), ')' 
    249274         WRITE(numout,*)'      stress module                   = ', TRIM(sn_rcv_taumod%cldes), ' (', TRIM(sn_rcv_taumod%clcat), ')' 
     
    260285         WRITE(numout,*)'      sea ice heat fluxes             = ', TRIM(sn_rcv_iceflx%cldes), ' (', TRIM(sn_rcv_iceflx%clcat), ')' 
    261286         WRITE(numout,*)'      atm co2                         = ', TRIM(sn_rcv_co2%cldes   ), ' (', TRIM(sn_rcv_co2%clcat   ), ')' 
     287         WRITE(numout,*)'      atm pco2                        = ', TRIM(sn_rcv_atm_pco2%cldes), ' (', TRIM(sn_rcv_atm_pco2%clcat), ')' 
     288         WRITE(numout,*)'      atm dust                        = ', TRIM(sn_rcv_atm_dust%cldes), ' (', TRIM(sn_rcv_atm_dust%clcat), ')' 
    262289         WRITE(numout,*)'  sent fields (multiple ice categories)' 
    263290         WRITE(numout,*)'      surface temperature             = ', TRIM(sn_snd_temp%cldes  ), ' (', TRIM(sn_snd_temp%clcat  ), ')' 
     
    269296         WRITE(numout,*)'                      - mesh          = ', sn_snd_crt%clvgrd 
    270297         WRITE(numout,*)'      oce co2 flux                    = ', TRIM(sn_snd_co2%cldes   ), ' (', TRIM(sn_snd_co2%clcat   ), ')' 
     298         WRITE(numout,*)'      bio co2 flux                    = ', TRIM(sn_snd_bio_co2%cldes), ' (', TRIM(sn_snd_bio_co2%clcat), ')' 
     299         WRITE(numout,*)'      bio dms flux                    = ', TRIM(sn_snd_bio_dms%cldes), ' (', TRIM(sn_snd_bio_dms%clcat), ')' 
    271300         WRITE(numout,*)'  nn_cplmodel                         = ', nn_cplmodel 
    272301         WRITE(numout,*)'  ln_usecplmask                       = ', ln_usecplmask 
     302         WRITE(numout,*)'  ln_coupled_iceshelf_fluxes          = ', ln_coupled_iceshelf_fluxes 
     303         WRITE(numout,*)'  rn_greenland_calving_fraction       = ', rn_greenland_calving_fraction 
     304         WRITE(numout,*)'  rn_antarctica_calving_fraction      = ', rn_antarctica_calving_fraction 
     305         WRITE(numout,*)'  rn_iceshelf_fluxes_tolerance        = ', rn_iceshelf_fluxes_tolerance 
    273306      ENDIF 
    274307 
     
    474507      !                                                      ! ------------------------- ! 
    475508      srcv(jpr_co2 )%clname = 'O_AtmCO2'   ;   IF( TRIM(sn_rcv_co2%cldes   ) == 'coupled' )    srcv(jpr_co2 )%laction = .TRUE. 
     509 
     510 
     511      !                                                      ! --------------------------------------- !     
     512      !                                                      ! Incoming CO2 and DUST fluxes for MEDUSA ! 
     513      !                                                      ! --------------------------------------- !   
     514      srcv(jpr_atm_pco2)%clname = 'OATMPCO2' 
     515 
     516      IF (TRIM(sn_rcv_atm_pco2%cldes) == 'coupled') THEN 
     517        srcv(jpr_atm_pco2)%laction = .TRUE. 
     518      END IF 
     519                
     520      srcv(jpr_atm_dust)%clname = 'OATMDUST'    
     521      IF (TRIM(sn_rcv_atm_dust%cldes) == 'coupled')  THEN 
     522        srcv(jpr_atm_dust)%laction = .TRUE. 
     523      END IF 
     524     
    476525      !                                                      ! ------------------------- ! 
    477526      !                                                      !   topmelt and botmelt     !    
     
    789838      ncpl_qsr_freq = 86400 / ncpl_qsr_freq 
    790839 
     840      IF( ln_coupled_iceshelf_fluxes ) THEN 
     841          ! Crude masks to separate the Antarctic and Greenland icesheets. Obviously something 
     842          ! more complicated could be done if required. 
     843          greenland_icesheet_mask = 0.0 
     844          WHERE( gphit >= 0.0 ) greenland_icesheet_mask = 1.0 
     845          antarctica_icesheet_mask = 0.0 
     846          WHERE( gphit < 0.0 ) antarctica_icesheet_mask = 1.0 
     847 
     848          ! initialise other variables 
     849          greenland_icesheet_mass_array(:,:) = 0.0 
     850          antarctica_icesheet_mass_array(:,:) = 0.0 
     851 
     852          IF( .not. ln_rstart ) THEN 
     853             greenland_icesheet_mass = 0.0  
     854             greenland_icesheet_mass_rate_of_change = 0.0  
     855             greenland_icesheet_timelapsed = 0.0 
     856             antarctica_icesheet_mass = 0.0  
     857             antarctica_icesheet_mass_rate_of_change = 0.0  
     858             antarctica_icesheet_timelapsed = 0.0 
     859          ENDIF 
     860 
     861      ENDIF 
     862 
    791863      CALL wrk_dealloc( jpi,jpj, zacs, zaos ) 
    792864      ! 
     
    851923      INTEGER  ::   ikchoix 
    852924      REAL(wp) ::   zcumulneg, zcumulpos   ! temporary scalars      
     925      REAL(wp) ::   zgreenland_icesheet_mass_in, zantarctica_icesheet_mass_in 
     926      REAL(wp) ::   zgreenland_icesheet_mass_b, zantarctica_icesheet_mass_b 
     927      REAL(wp) ::   zmask_sum, zepsilon       
    853928      REAL(wp) ::   zcoef                  ! temporary scalar 
    854929      REAL(wp) ::   zrhoa  = 1.22          ! Air density kg/m3 
     
    857932      REAL(wp), POINTER, DIMENSION(:,:) ::   ztx, zty, zmsk, zemp, zqns, zqsr, ztx2, zty2 
    858933      !!---------------------------------------------------------------------- 
     934 
     935      ! RSRH temporary arrays for testing, just to recieve incoming MEDUSA related fields 
     936      ! until we know where they need to go. 
     937      REAL(wp), ALLOCATABLE :: atm_pco2(:,:) 
     938      REAL(wp), ALLOCATABLE :: atm_dust(:,:) 
     939 
    859940      ! 
    860941      IF( nn_timing == 1 )  CALL timing_start('sbc_cpl_rcv') 
     
    10241105#endif 
    10251106 
     1107#if defined key_medusa 
     1108      ! RSRH Allocate temporary arrays to receive incoming fields during testing 
     1109      ALLOCATE(atm_pco2(jpi,jpj)) 
     1110      ALLOCATE(atm_dust(jpi,jpj)) 
     1111 
     1112      IF( srcv(jpr_atm_pco2)%laction) atm_pco2(:,:) = frcv(jpr_atm_pco2)%z3(:,:,1) 
     1113      IF( srcv(jpr_atm_dust)%laction) atm_dust(:,:) = frcv(jpr_atm_dust)%z3(:,:,1) 
     1114      
     1115      ! RSRH Deallocate temporary arrays. 
     1116      DEALLOCATE(atm_pco2) 
     1117      DEALLOCATE(atm_dust) 
     1118#endif 
     1119 
     1120 
     1121 
     1122 
    10261123      !  Fields received by SAS when OASIS coupling 
    10271124      !  (arrays no more filled at sbcssm stage) 
     
    11371234 
    11381235      ENDIF 
     1236       
     1237      !                                                        ! land ice masses : Greenland 
     1238      zepsilon = rn_iceshelf_fluxes_tolerance 
     1239 
     1240      IF( srcv(jpr_grnm)%laction ) THEN 
     1241         greenland_icesheet_mass_array(:,:) = frcv(jpr_grnm)%z3(:,:,1) 
     1242         ! take average over ocean points of input array to avoid cumulative error over time 
     1243         zgreenland_icesheet_mass_in = SUM( greenland_icesheet_mass_array(:,:) * tmask(:,:,1) ) 
     1244         IF(lk_mpp) CALL mpp_sum( zgreenland_icesheet_mass_in ) 
     1245         zmask_sum = SUM( tmask(:,:,1) ) 
     1246         IF(lk_mpp) CALL mpp_sum( zmask_sum )  
     1247         zgreenland_icesheet_mass_in = zgreenland_icesheet_mass_in / zmask_sum 
     1248         greenland_icesheet_timelapsed = greenland_icesheet_timelapsed + rdt          
     1249         IF( ABS( zgreenland_icesheet_mass_in - greenland_icesheet_mass ) > zepsilon ) THEN 
     1250            zgreenland_icesheet_mass_b = greenland_icesheet_mass 
     1251             
     1252            ! Only update the mass if it has increased 
     1253            IF ( (zgreenland_icesheet_mass_in - greenland_icesheet_mass) > 0.0 ) THEN 
     1254               greenland_icesheet_mass = zgreenland_icesheet_mass_in 
     1255            ENDIF 
     1256             
     1257            IF( zgreenland_icesheet_mass_b /= 0.0 ) & 
     1258           &     greenland_icesheet_mass_rate_of_change = ( greenland_icesheet_mass - zgreenland_icesheet_mass_b ) / greenland_icesheet_timelapsed  
     1259            greenland_icesheet_timelapsed = 0.0_wp        
     1260         ENDIF 
     1261         IF(lwp) WRITE(numout,*) 'Greenland icesheet mass (kg) read in is ', zgreenland_icesheet_mass_in 
     1262         IF(lwp) WRITE(numout,*) 'Greenland icesheet mass (kg) used is    ', greenland_icesheet_mass 
     1263         IF(lwp) WRITE(numout,*) 'Greenland icesheet mass rate of change (kg/s) is ', greenland_icesheet_mass_rate_of_change 
     1264         IF(lwp) WRITE(numout,*) 'Greenland icesheet seconds lapsed since last change is ', greenland_icesheet_timelapsed 
     1265      ENDIF 
     1266 
     1267      !                                                        ! land ice masses : Antarctica 
     1268      IF( srcv(jpr_antm)%laction ) THEN 
     1269         antarctica_icesheet_mass_array(:,:) = frcv(jpr_antm)%z3(:,:,1) 
     1270         ! take average over ocean points of input array to avoid cumulative error from rounding errors over time 
     1271         zantarctica_icesheet_mass_in = SUM( antarctica_icesheet_mass_array(:,:) * tmask(:,:,1) ) 
     1272         IF(lk_mpp) CALL mpp_sum( zantarctica_icesheet_mass_in ) 
     1273         zmask_sum = SUM( tmask(:,:,1) ) 
     1274         IF(lk_mpp) CALL mpp_sum( zmask_sum )  
     1275         zantarctica_icesheet_mass_in = zantarctica_icesheet_mass_in / zmask_sum 
     1276         antarctica_icesheet_timelapsed = antarctica_icesheet_timelapsed + rdt          
     1277         IF( ABS( zantarctica_icesheet_mass_in - antarctica_icesheet_mass ) > zepsilon ) THEN 
     1278            zantarctica_icesheet_mass_b = antarctica_icesheet_mass 
     1279             
     1280            ! Only update the mass if it has increased 
     1281            IF ( (zantarctica_icesheet_mass_in - antarctica_icesheet_mass) > 0.0 ) THEN 
     1282               antarctica_icesheet_mass = zantarctica_icesheet_mass_in 
     1283            END IF 
     1284             
     1285            IF( zantarctica_icesheet_mass_b /= 0.0 ) & 
     1286          &      antarctica_icesheet_mass_rate_of_change = ( antarctica_icesheet_mass - zantarctica_icesheet_mass_b ) / antarctica_icesheet_timelapsed  
     1287            antarctica_icesheet_timelapsed = 0.0_wp        
     1288         ENDIF 
     1289         IF(lwp) WRITE(numout,*) 'Antarctica icesheet mass (kg) read in is ', zantarctica_icesheet_mass_in 
     1290         IF(lwp) WRITE(numout,*) 'Antarctica icesheet mass (kg) used is    ', antarctica_icesheet_mass 
     1291         IF(lwp) WRITE(numout,*) 'Antarctica icesheet mass rate of change (kg/s) is ', antarctica_icesheet_mass_rate_of_change 
     1292         IF(lwp) WRITE(numout,*) 'Antarctica icesheet seconds lapsed since last change is ', antarctica_icesheet_timelapsed 
     1293      ENDIF 
     1294 
    11391295      ! 
    11401296      CALL wrk_dealloc( jpi,jpj, ztx, zty, zmsk, zemp, zqns, zqsr, ztx2, zty2 ) 
     
    17381894      REAL(wp), POINTER, DIMENSION(:,:)   ::   zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1 
    17391895      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmp3, ztmp4    
     1896 
     1897#if defined key_medusa 
     1898! RSRH Temporarily definitition of array used in medusa coupling until we actually have the medusa code included in the build 
     1899   REAL(wp)  ::  TRC2D_TEST(jpi,jpj) 
     1900#endif 
     1901 
    17401902      !!---------------------------------------------------------------------- 
    17411903      ! 
     
    18792041      IF( ssnd(jps_co2)%laction )   CALL cpl_snd( jps_co2, isec, RESHAPE ( oce_co2, (/jpi,jpj,1/) ) , info ) 
    18802042      ! 
     2043#endif 
     2044 
     2045 
     2046!! JPALM : 03-feb-2015 coupling MEDUSA-UKCA 
     2047!! add soing exactely the same that CO2 fluxes 
     2048!! of PISCES 
     2049!! add CO2-MEDUSA 
     2050!! add DMS-MEDUSA 
     2051!! May add also a coupling MED-UKCA key 
     2052 
     2053 
     2054#if defined key_medusa 
     2055      ! RSRH. We don't want to use magic numbers in the code (i.e. 98 and 221). 
     2056      ! These need moving to a parameter statement (as part of MEDUSA code) or even specifying in a namelist 
     2057      ! so the following code MUST NOT be viewed as anything more than temporary. 
     2058!      IF( ssnd(jps_bio_co2)%laction )   CALL cpl_prism_snd( jps_bio_co2, isec, trc2d(:,:,98:98), info ) 
     2059      TRC2D_TEST(:,:) = 0.0 
     2060      IF( ssnd(jps_bio_co2)%laction )   CALL cpl_prism_snd( jps_bio_co2, isec, trc2d_TEST(:,:), info ) 
     2061 
     2062      IF( ssnd(jps_bio_dms)%laction )  THEN 
     2063          ! We need to multiply DMS by a conversion factor to get values in the standard units expected in 
     2064          ! the coupling space. 
     2065!         ztmp1(:,: ) = trc2d(:,:,221) * dms_unit_conv 
     2066         ztmp1(:,: ) = trc2d_TEST(:,:) * dms_unit_conv 
     2067         CALL cpl_prism_snd( jps_bio_dms, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
     2068      ENDIF 
    18812069#endif 
    18822070      !                                                      ! ------------------------- ! 
     
    19812169                                &         + 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
    19822170                                &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1983                         END DO 
     2171                       END DO 
    19842172                     END DO 
    19852173#if defined key_cice 
Note: See TracChangeset for help on using the changeset viewer.