Changeset 6736
- Timestamp:
- 2016-06-24T09:50:27+02:00 (8 years ago)
- Location:
- branches/NERC/dev_r3874_FASTNEt/NEMOGCM
- Files:
-
- 6 added
- 142 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/CONFIG/cfg.txt
r3769 r6736 9 9 ORCA2_LIM_CFC_C14b OPA_SRC LIM_SRC_2 NST_SRC TOP_SRC 10 10 ORCA2_LIM OPA_SRC LIM_SRC_2 NST_SRC 11 NNA_R12 OPA_SRC LIM_SRC_2 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/ice_2.F90
r3625 r6736 19 19 PUBLIC ice_alloc_2 ! Called in iceini_2.F90 20 20 21 INTEGER , PUBLIC :: numit 22 REAL(wp), PUBLIC :: rdt_ice 21 INTEGER , PUBLIC :: numit !: ice iteration index 22 REAL(wp), PUBLIC :: rdt_ice !: ice time step 23 23 24 24 ! !!* namicerun read in iceini * … … 27 27 LOGICAL , PUBLIC :: ln_limdyn = .TRUE. !: flag for ice dynamics (T) or not (F) 28 28 LOGICAL , PUBLIC :: ln_limdmp = .FALSE. !: Ice damping 29 LOGICAL , PUBLIC :: ln_vp2evp = .FALSE. !: restart from a vp file in an evp run 29 30 LOGICAL , PUBLIC :: ln_nicep = .TRUE. !: flag grid points output (T) or not (F) 30 31 REAL(wp) , PUBLIC :: hsndif = 0._wp !: snow temp. computation (0) or not (9999) … … 98 99 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qstoif !: Energy stored in the brine pockets 99 100 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fbif !: Heat flux at the ice base 100 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdm_snw !: Variation of snow mass over 1 time step [Kg/m2] 101 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdq_snw !: Heat content associated with rdm_snw [J/m2] 102 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdm_ice !: Variation of ice mass over 1 time step [Kg/m2] 103 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdq_ice !: Heat content associated with rdm_ice [J/m2] 101 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdmsnif !: Variation of snow mass 102 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdmicif !: Variation of ice mass 104 103 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qldif !: heat balance of the lead (or of the open ocean) 105 104 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qcmif !: Energy needed to freeze the ocean surface layer … … 155 154 156 155 ALLOCATE(phicif(jpi,jpj) , pfrld (jpi,jpj) , qstoif (jpi,jpj) , & 157 & fbif (jpi,jpj) , rdm_snw(jpi,jpj) , rdq_snw(jpi,jpj) , & 158 & rdm_ice(jpi,jpj) , rdq_ice(jpi,jpj) , & 156 & fbif (jpi,jpj) , rdmsnif(jpi,jpj) , rdmicif(jpi,jpj) , & 159 157 & qldif (jpi,jpj) , qcmif (jpi,jpj) , fdtcn (jpi,jpj) , & 160 158 & qdtcn (jpi,jpj) , thcm (jpi,jpj) , STAT=ierr(4) ) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/iceini_2.F90
r3625 r6736 13 13 !! 'key_lim2' : LIM 2.0 sea-ice model 14 14 !!---------------------------------------------------------------------- 15 !! ice_init_2 : sea-ice model initialization16 !! ice_run_2 : Definition some run parameter for ice model15 !! ice_init_2 : sea-ice model initialization 16 !! ice_run_2 : Definition some run parameter for ice model 17 17 !!---------------------------------------------------------------------- 18 USE phycst ! physical constants 19 USE dom_oce ! ocean domain 20 USE sbc_oce ! surface boundary condition: ocean 21 USE sbc_ice ! LIM2 surface boundary condition 22 USE dom_ice_2 ! LIM2 ice domain 23 USE par_ice_2 ! LIM2 parameters 24 USE thd_ice_2 ! LIM2 thermodynamical variables 25 USE ice_2 ! LIM2 ice variable 26 USE limmsh_2 ! LIM2 mesh 27 USE limistate_2 ! LIM2 initial state 28 USE limrst_2 ! LIM2 restart 29 USE limsbc_2 ! LIM2 surface boundary condition 30 USE in_out_manager ! I/O manager 31 USE lib_mpp ! MPP library 32 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 18 USE phycst ! physical constants 19 USE dom_oce ! ocean domain 20 USE sbc_oce ! surface boundary condition: ocean 21 USE sbc_ice ! LIM2 surface boundary condition 22 USE dom_ice_2 ! LIM2 ice domain 23 USE par_ice_2 ! LIM2 parameters 24 USE thd_ice_2 ! LIM2 thermodynamical variables 25 USE ice_2 ! LIM2 ice variable 26 USE limmsh_2 ! LIM2 mesh 27 USE limistate_2 ! LIM2 initial state 28 USE limrst_2 ! LIM2 restart 29 USE limsbc_2 ! LIM2 surface boundary condition 30 USE in_out_manager ! I/O manager 31 USE lib_mpp ! MPP library 33 32 34 33 IMPLICIT NONE … … 110 109 !! ** input : Namelist namicerun 111 110 !!------------------------------------------------------------------- 112 NAMELIST/namicerun/ cn_icerst_in, cn_icerst_out, ln_limdyn, ln_limdmp, acrit, hsndif, hicdif 111 NAMELIST/namicerun/ cn_icerst_in, cn_icerst_out, ln_limdyn, ln_limdmp, acrit, hsndif, hicdif, ln_vp2evp 113 112 !!------------------------------------------------------------------- 114 113 ! … … 125 124 WRITE(numout,*) ' computation of temp. in snow (=0) or not (=9999) hsndif = ', hsndif 126 125 WRITE(numout,*) ' computation of temp. in ice (=0) or not (=9999) hicdif = ', hicdif 126 WRITE(numout,*) ' Restart EVP run from VP restart file (set stresses to 0)= ', ln_vp2evp 127 127 ENDIF 128 128 ! -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limadv_2.F90
r3625 r6736 14 14 !! 'key_lim2' LIM 2.0 sea-ice model 15 15 !!---------------------------------------------------------------------- 16 !! lim_adv_x_2 17 !! lim_adv_y_2 16 !! lim_adv_x_2 : advection of sea ice on x axis 17 !! lim_adv_y_2 : advection of sea ice on y axis 18 18 !!---------------------------------------------------------------------- 19 19 USE dom_oce … … 21 21 USE ice_2 22 22 USE lbclnk 23 USE in_out_manager ! I/O manager 24 USE lib_mpp ! MPP library 25 USE wrk_nemo ! work arrays 26 USE prtctl ! Print control 27 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 23 USE in_out_manager ! I/O manager 24 USE lib_mpp ! MPP library 25 USE wrk_nemo ! work arrays 26 USE prtctl ! Print control 27 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 28 28 29 29 30 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limdia_2.F90
r3625 r6736 24 24 USE in_out_manager ! I/O manager 25 25 USE lib_mpp ! MPP library 26 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)27 26 28 27 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limdmp_2.F90
r3635 r6736 19 19 USE in_out_manager ! I/O manager 20 20 USE lib_mpp ! MPP library 21 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)22 21 23 22 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limdyn_2.F90
r3625 r6736 31 31 USE in_out_manager ! I/O manager 32 32 USE prtctl ! Print control 33 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)34 33 35 34 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limhdf_2.F90
r3625 r6736 21 21 USE prtctl ! Print control 22 22 USE in_out_manager ! I/O manager 23 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)24 23 25 24 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limistate_2.F90
r3625 r6736 27 27 USE iom 28 28 USE in_out_manager 29 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)30 29 31 30 IMPLICIT NONE … … 193 192 IF(lwp) WRITE(numout,*) ' ice state initialization with : Ice_initialization.nc' 194 193 194 #if defined key_lim2_initcd_alt1 195 CALL iom_get( inum_ice, jpdom_data, 'hicif', hicif ) 196 CALL iom_get( inum_ice, jpdom_data, 'hsnif', hsnif ) 197 CALL iom_get( inum_ice, jpdom_data, 'frld' , frld ) 198 CALL iom_get( inum_ice, jpdom_data, 'tbif1' , tbif(:,:,1) ) 199 CALL iom_get( inum_ice, jpdom_data, 'tbif2' , tbif(:,:,2) ) 200 CALL iom_get( inum_ice, jpdom_data, 'tbif3' , tbif(:,:,3) ) 201 CALL iom_get( inum_ice, jpdom_data, 'sist' , sist ) 202 #elif defined key_lim2_initcd_alt2 203 CALL iom_get( inum_ice, jpdom_data, 'iicethic', hicif ) 204 CALL iom_get( inum_ice, jpdom_data, 'isnowthi', hsnif ) 205 CALL iom_get( inum_ice, jpdom_data, 'ileadfra' , frld ) 206 CALL iom_get( inum_ice, jpdom_data, 'isstempe' , sist ) 207 CALL iom_get( inum_ice, jpdom_unknown, 'iicetemp', tbif(1:nlci,1:nlcj,:), & 208 & kstart = (/ mig(1),mjg(1),1 /), kcount = (/ nlci,nlcj,jplayersp1 /) ) 209 #else 195 210 CALL iom_get( inum_ice, jpdom_data, 'hicif', hicif ) 196 211 CALL iom_get( inum_ice, jpdom_data, 'hsnif', hsnif ) … … 199 214 CALL iom_get( inum_ice, jpdom_unknown, 'tbif', tbif(1:nlci,1:nlcj,:), & 200 215 & kstart = (/ mig(1),mjg(1),1 /), kcount = (/ nlci,nlcj,jplayersp1 /) ) 216 #endif 201 217 ! put some values in the extra-halo... 202 218 DO jj = nlcj+1, jpj ; tbif(1:nlci,jj,:) = tbif(1:nlci,nlej,:) ; END DO -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limmsh_2.F90
r3625 r6736 23 23 USE wrk_nemo ! work arrays 24 24 #endif 25 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)26 25 27 26 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limrhg_2.F90
r3680 r6736 30 30 USE in_out_manager ! I/O manager 31 31 USE prtctl ! Print control 32 USE oce , ONLY : snwice_mass, snwice_mass_b 33 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 34 #if defined key_agrif 35 USE agrif_lim2_interp ! nesting 36 #endif 32 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 37 33 38 34 IMPLICIT NONE … … 85 81 REAL(wp) :: zs21_11, zs21_12, zs21_21, zs21_22 86 82 REAL(wp) :: zs22_11, zs22_12, zs22_21, zs22_22 87 REAL(wp) :: zintb, zintn88 83 REAL(wp), POINTER, DIMENSION(:,:) :: zfrld, zmass, zcorl 89 84 REAL(wp), POINTER, DIMENSION(:,:) :: za1ct, za2ct, zresr 90 85 REAL(wp), POINTER, DIMENSION(:,:) :: zc1u, zc1v, zc2u, zc2v 91 REAL(wp), POINTER, DIMENSION(:,:) :: zsang , zpice86 REAL(wp), POINTER, DIMENSION(:,:) :: zsang 92 87 REAL(wp), POINTER, DIMENSION(:,:) :: zu0, zv0 93 88 REAL(wp), POINTER, DIMENSION(:,:) :: zu_n, zv_n … … 99 94 100 95 CALL wrk_alloc( jpi,jpj, zfrld, zmass, zcorl, za1ct, za2ct, zresr ) 101 CALL wrk_alloc( jpi,jpj, zc1u , zc1v , zc2u , zc2v , zsang , zpice)96 CALL wrk_alloc( jpi,jpj, zc1u , zc1v , zc2u , zc2v , zsang ) 102 97 CALL wrk_alloc( jpi,jpj+2, zu0, zv0, zu_n, zv_n, zu_a, zv_a, zviszeta, zviseta, kjstart = 0 ) 103 98 CALL wrk_alloc( jpi,jpj+2, zzfrld, zztms, zi1, zi2, zmasst, zpresh, kjstart = 0 ) … … 135 130 !i zviszeta(:,jpj+1) = 0._wp ; zviseta(:,jpj+1) = 0._wp 136 131 137 IF( nn_ice_embd == 2 ) THEN !== embedded sea ice: compute representative ice top surface ==!138 !139 ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[n/nn_fsbc], n=0,nn_fsbc-1}140 ! = (1/nn_fsbc)^2 * {SUM[n], n=0,nn_fsbc-1}141 zintn = REAL( nn_fsbc - 1 ) / REAL( nn_fsbc ) * 0.5_wp142 !143 ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1}144 ! = (1/nn_fsbc)^2 * (nn_fsbc^2 - {SUM[n], n=0,nn_fsbc-1})145 zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp146 !147 zpice(:,:) = ssh_m(:,:) + ( zintn * snwice_mass(:,:) + zintb * snwice_mass_b(:,:) ) * r1_rau0148 !149 !150 ELSE !== non-embedded sea ice: use ocean surface for slope calculation ==!151 zpice(:,:) = ssh_m(:,:)152 ENDIF153 #if defined key_agrif154 ! load the boundary value of velocity in special array zuive and zvice155 CALL agrif_rhg_lim2_load156 #endif157 132 158 133 ! Ice mass, ice strength, and wind stress at the center | … … 222 197 223 198 ! Gradient of the sea surface height 224 zgsshx = ( ( zpice(ji ,jj ) - zpice(ji-1,jj ))/e1u(ji-1,jj ) &225 & + ( zpice(ji ,jj-1) - zpice(ji-1,jj-1))/e1u(ji-1,jj-1) ) * 0.5_wp226 zgsshy = ( ( zpice(ji ,jj ) - zpice(ji ,jj-1))/e2v(ji ,jj-1) &227 & + ( zpice(ji-1,jj ) - zpice(ji-1,jj-1))/e2v(ji-1,jj-1) ) * 0.5_wp199 zgsshx = ( (ssh_m(ji ,jj ) - ssh_m(ji-1,jj ))/e1u(ji-1,jj ) & 200 & + (ssh_m(ji ,jj-1) - ssh_m(ji-1,jj-1))/e1u(ji-1,jj-1) ) * 0.5_wp 201 zgsshy = ( (ssh_m(ji ,jj ) - ssh_m(ji ,jj-1))/e2v(ji ,jj-1) & 202 & + (ssh_m(ji-1,jj ) - ssh_m(ji-1,jj-1))/e2v(ji-1,jj-1) ) * 0.5_wp 228 203 229 204 ! Computation of the velocity field taking into account the ice-ice interaction. … … 559 534 CALL lbc_lnk( zv_n(:,1:jpj), 'I', -1. ) 560 535 561 #if defined key_agrif562 ! copy the boundary value from u_ice_nst and v_ice_nst to u_ice and v_ice563 ! before next interations564 CALL agrif_rhg_lim2(zu_n,zv_n)565 #endif566 567 536 ! Test of Convergence 568 537 DO jj = k_j1+1 , k_jpj-1 … … 607 576 608 577 CALL wrk_dealloc( jpi,jpj, zfrld, zmass, zcorl, za1ct, za2ct, zresr ) 609 CALL wrk_dealloc( jpi,jpj, zc1u , zc1v , zc2u , zc2v , zsang , zpice)578 CALL wrk_dealloc( jpi,jpj, zc1u , zc1v , zc2u , zc2v , zsang ) 610 579 CALL wrk_dealloc( jpi,jpj+2, zu0, zv0, zu_n, zv_n, zu_a, zv_a, zviszeta, zviseta, kjstart = 0 ) 611 580 CALL wrk_dealloc( jpi,jpj+2, zzfrld, zztms, zi1, zi2, zmasst, zpresh, kjstart = 0 ) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limrst_2.F90
r2528 r6736 225 225 CALL iom_get( numrir, jpdom_autoglo, 'fsbbq' , fsbbq ) 226 226 #if ! defined key_lim2_vp 227 IF ( ln_vp2evp ) THEN 228 stress1_i (:,:) = 0._wp ! EVP rheology 229 stress2_i (:,:) = 0._wp 230 stress12_i(:,:) = 0._wp 231 ELSE 227 232 CALL iom_get( numrir, jpdom_autoglo, 'stress1_i' , stress1_i ) 228 233 CALL iom_get( numrir, jpdom_autoglo, 'stress2_i' , stress2_i ) 229 234 CALL iom_get( numrir, jpdom_autoglo, 'stress12_i' , stress12_i ) 235 ENDIF 230 236 #endif 231 237 CALL iom_get( numrir, jpdom_autoglo, 'sxice' , sxice ) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limsbc_2.F90
r3625 r6736 9 9 !! 3.3 ! 2009-05 (G. Garric, C. Bricaud) addition of the lim2_evp case 10 10 !! - ! 2010-11 (G. Madec) ice-ocean stress computed at each ocean time-step 11 !! 3.3.1 ! 2011-01 (A. R. Porter, STFC Daresbury) dynamical allocation 12 !! 3.5 ! 2012-11 ((G. Madec, Y. Aksenov, A. Coward) salt and heat fluxes associated with e-p 11 !! 4.0 ! 2011-01 (A. R. Porter, STFC Daresbury) dynamical allocation 13 12 !!---------------------------------------------------------------------- 14 13 #if defined key_lim2 … … 29 28 USE sbc_oce ! surface boundary condition: ocean 30 29 USE sbccpl 31 USE cpl_oasis3, ONLY : lk_cpl 32 USE oce , ONLY : sshn, sshb, snwice_mass, snwice_mass_b, snwice_fmass 30 33 31 USE albedo ! albedo parameters 34 32 USE lbclnk ! ocean lateral boundary condition - MPP exchanges … … 39 37 USE iom ! I/O library 40 38 USE prtctl ! Print control 41 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 39 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 40 USE cpl_oasis3, ONLY : lk_cpl 42 41 43 42 IMPLICIT NONE … … 90 89 !! - Update the fluxes provided to the ocean 91 90 !! 92 !! ** Outputs : - qsr : sea heat flux :solar93 !! - qns : sea heat flux : non solar (including heat content of the mass flux)94 !! - emp : freshwater budget: massflux95 !! - sfx : freshwater budget: salt flux due to Freezing/Melting91 !! ** Outputs : - qsr : sea heat flux: solar 92 !! - qns : sea heat flux: non solar 93 !! - emp : freshwater budget: volume flux 94 !! - emps : freshwater budget: concentration/dillution 96 95 !! - utau : sea surface i-stress (ocean referential) 97 96 !! - vtau : sea surface j-stress (ocean referential) … … 109 108 INTEGER :: ifvt, i1mfr, idfr, iflt ! - - 110 109 INTEGER :: ial, iadv, ifral, ifrdv ! - - 111 REAL(wp) :: zqsr, zqns, zfmm ! local scalars 112 REAL(wp) :: zinda, zfsalt, zemp ! - - 113 REAL(wp) :: zemp_snw, zqhc, zcd ! - - 114 REAL(wp) :: zswitch ! - - 110 REAL(wp) :: zqsr, zqns, zfm ! local scalars 111 REAL(wp) :: zinda, zfons, zemp ! - - 115 112 REAL(wp), POINTER, DIMENSION(:,:) :: zqnsoce ! 2D workspace 116 113 REAL(wp), POINTER, DIMENSION(:,:,:) :: zalb, zalbp ! 2D/3D workspace … … 119 116 CALL wrk_alloc( jpi, jpj, zqnsoce ) 120 117 CALL wrk_alloc( jpi, jpj, 1, zalb, zalbp ) 121 122 SELECT CASE( nn_ice_embd ) ! levitating or embedded sea-ice option123 CASE( 0 ) ; zswitch = 1 ! (0) standard levitating sea-ice : salt exchange only124 CASE( 1, 2 ) ; zswitch = 0 ! (1) levitating sea-ice: salt and volume exchange but no pressure effect125 ! (2) embedded sea-ice : salt and volume fluxes and pressure126 END SELECT !127 118 128 119 !------------------------------------------! … … 143 134 ifrdv = ( 1 - ifral * ( 1 - ial ) ) * iadv 144 135 145 !!$ attempt to explain the tricky flags set above....146 !!$ zinda = 1.0 - AINT( pfrld(ji,jj) ) ! = 0. if ice-free ocean else 1. (after ice adv, but before ice thermo)147 !!$ i1mfr = 1.0 - AINT( frld(ji,jj) ) ! = 0. if ice-free ocean else 1. (after ice thermo)148 !!$ 149 !!$ IF( phicif(ji,jj) <= 0. ) THEN ; ifvt = zinda ! = zinda if previous thermodynamic step overmelted the ice???150 !!$ ELSE ; ifvt = 0. !136 !!$ zinda = 1.0 - AINT( pfrld(ji,jj) ) ! = 0. if pure ocean else 1. (at previous time) 137 !!$ 138 !!$ i1mfr = 1.0 - AINT( frld(ji,jj) ) ! = 0. if pure ocean else 1. (at current time) 139 !!$ 140 !!$ IF( phicif(ji,jj) <= 0. ) THEN ; ifvt = zinda ! = 1. if (snow and no ice at previous time) else 0. ??? 141 !!$ ELSE ; ifvt = 0. 151 142 !!$ ENDIF 152 143 !!$ 153 !!$ IF( frld(ji,jj) >= pfrld(ji,jj) ) THEN ; idfr = 0. ! = 0. if lead fraction increases due to ice thermodynamics144 !!$ IF( frld(ji,jj) >= pfrld(ji,jj) ) THEN ; idfr = 0. ! = 0. if lead fraction increases from previous to current 154 145 !!$ ELSE ; idfr = 1. 155 146 !!$ ENDIF 156 147 !!$ 157 !!$ iflt = zinda * (1 - i1mfr) * (1 - ifvt ) ! = 1. if ice (not only snow) at previous time and ice-free ocean currently148 !!$ iflt = zinda * (1 - i1mfr) * (1 - ifvt ) ! = 1. if ice (not only snow) at previous and pure ocean at current 158 149 !!$ 159 150 !!$ ial = ifvt * i1mfr + ( 1 - ifvt ) * idfr 160 !!$ = i1mfr if ifvt = 1 i.e.161 !!$ = idfr if ifvt = 0162 151 !!$! snow no ice ice ice or nothing lead fraction increases 163 152 !!$! at previous now at previous 164 !!$! -> ice a rea increases ??? -> ice area decreases ???153 !!$! -> ice aera increases ??? -> ice aera decreases ??? 165 154 !!$ 166 155 !!$ iadv = ( 1 - i1mfr ) * zinda … … 186 175 #endif 187 176 ! computation the non solar heat flux at ocean surface 188 zqns = - ( 1. - thcm(ji,jj) ) * zqsr & ! part of the solar energy used in leads 189 & + iflt * ( fscmbq(ji,jj) + ffltbif(ji,jj) ) & 190 & + ifral * ( ial * qcmif(ji,jj) + (1 - ial) * qldif(ji,jj) ) * r1_rdtice & 191 & + ifrdv * ( qfvbq(ji,jj) + qdtcn(ji,jj) ) * r1_rdtice 192 193 fsbbq(ji,jj) = ( 1.0 - ( ifvt + iflt ) ) * fscmbq(ji,jj) ! store residual heat flux (to put into the ocean at the next time-step) 194 zqhc = ( rdq_snw(ji,jj) & 195 & + rdq_ice(ji,jj) * ( 1.- zswitch) ) * r1_rdtice ! heat flux due to snow ( & ice heat content, 196 ! ! if ice/ocean mass exchange active) 177 zqns = - ( 1. - thcm(ji,jj) ) * zqsr & ! part of the solar energy used in leads 178 & + iflt * ( fscmbq(ji,jj) + ffltbif(ji,jj) ) & 179 & + ifral * ( ial * qcmif(ji,jj) + (1 - ial) * qldif(ji,jj) ) * r1_rdtice & 180 & + ifrdv * ( qfvbq(ji,jj) + qdtcn(ji,jj) ) * r1_rdtice 181 182 fsbbq(ji,jj) = ( 1.0 - ( ifvt + iflt ) ) * fscmbq(ji,jj) ! ??? 183 ! 197 184 qsr (ji,jj) = zqsr ! solar heat flux 198 qns (ji,jj) = zqns - fdtcn(ji,jj) + zqhc ! non solar heat flux 199 ! 200 ! !------------------------------------------! 201 ! ! mass and salt flux at the ocean surface ! 202 ! !------------------------------------------! 203 ! 204 ! mass flux at the ocean-atmosphere interface (open ocean fraction = leads area) 205 #if defined key_coupled 206 ! ! coupled mode: 207 zemp = + emp_tot(ji,jj) & ! net mass flux over the grid cell (ice+ocean area) 208 & - emp_ice(ji,jj) * ( 1. - pfrld(ji,jj) ) ! minus the mass flux intercepted by sea-ice 209 #else 210 ! ! forced mode: 211 zemp = + emp(ji,jj) * frld(ji,jj) & ! mass flux over open ocean fraction 212 & - tprecip(ji,jj) * ( 1. - frld(ji,jj) ) & ! liquid precip. over ice reaches directly the ocean 213 & + sprecip(ji,jj) * ( 1. - pfrld(ji,jj) ) ! snow is intercepted by sea-ice (previous frld) 214 #endif 215 ! 216 ! mass flux at the ocean/ice interface (sea ice fraction) 217 zemp_snw = rdm_snw(ji,jj) * r1_rdtice ! snow melting = pure water that enters the ocean 218 zfmm = rdm_ice(ji,jj) * r1_rdtice ! Freezing minus Melting (F-M) 219 220 ! salt flux at the ice/ocean interface (sea ice fraction) [PSU*kg/m2/s] 221 zfsalt = - sice_0(ji,jj) * zfmm ! F-M salt exchange 222 zcd = soce_0(ji,jj) * zfmm ! concentration/dilution term due to F-M 223 ! 224 ! salt flux only : add concentration dilution term in salt flux and no F-M term in volume flux 225 ! salt and mass fluxes : non concentration dilution term in salt flux and add F-M term in volume flux 226 sfx (ji,jj) = zfsalt + zswitch * zcd ! salt flux (+ C/D if no ice/ocean mass exchange) 227 emp (ji,jj) = zemp + zemp_snw + ( 1.- zswitch) * zfmm ! mass flux (+ F/M mass flux if ice/ocean mass exchange) 228 ! 185 qns (ji,jj) = zqns - fdtcn(ji,jj) ! non solar heat flux 229 186 END DO 230 187 END DO 231 ! !------------------------------------------!232 ! ! mass of snow and ice per unit area !233 ! !------------------------------------------!234 IF( nn_ice_embd /= 0 ) THEN ! embedded sea-ice (mass required)235 snwice_mass_b(:,:) = snwice_mass(:,:) ! save mass from the previous ice time step236 ! ! new mass per unit area237 snwice_mass (:,:) = tms(:,:) * ( rhosn * hsnif(:,:) + rhoic * hicif(:,:) ) * ( 1.0 - frld(:,:) )238 ! ! time evolution of snow+ice mass239 snwice_fmass (:,:) = ( snwice_mass(:,:) - snwice_mass_b(:,:) ) / rdt_ice240 ENDIF241 188 242 189 CALL iom_put( 'hflx_ice_cea', - fdtcn(:,:) ) … … 244 191 CALL iom_put( 'qsr_io_cea', fstric(:,:) * (1.e0 - pfrld(:,:)) ) 245 192 193 !------------------------------------------! 194 ! mass flux at the ocean surface ! 195 !------------------------------------------! 196 DO jj = 1, jpj 197 DO ji = 1, jpi 198 ! 199 #if defined key_coupled 200 ! freshwater exchanges at the ice-atmosphere / ocean interface (coupled mode) 201 zemp = emp_tot(ji,jj) - emp_ice(ji,jj) * ( 1. - pfrld(ji,jj) ) & ! 202 & + rdmsnif(ji,jj) * r1_rdtice ! freshwaterflux due to snow melting 203 #else 204 ! computing freshwater exchanges at the ice/ocean interface 205 zemp = + emp(ji,jj) * frld(ji,jj) & ! e-p budget over open ocean fraction 206 & - tprecip(ji,jj) * ( 1. - frld(ji,jj) ) & ! liquid precipitation reaches directly the ocean 207 & + sprecip(ji,jj) * ( 1. - pfrld(ji,jj) ) & ! change in ice cover within the time step 208 & + rdmsnif(ji,jj) * r1_rdtice ! freshwater flux due to snow melting 209 #endif 210 ! 211 ! computing salt exchanges at the ice/ocean interface 212 zfons = ( soce_0(ji,jj) - sice_0(ji,jj) ) * ( rdmicif(ji,jj) * r1_rdtice ) 213 ! 214 ! converting the salt flux from ice to a freshwater flux from ocean 215 zfm = zfons / ( sss_m(ji,jj) + epsi16 ) 216 ! 217 emps(ji,jj) = zemp + zfm ! surface ocean concentration/dilution effect (use on SSS evolution) 218 emp (ji,jj) = zemp ! surface ocean volume flux (use on sea-surface height evolution) 219 ! 220 END DO 221 END DO 222 246 223 IF( lk_diaar5 ) THEN ! AR5 diagnostics 247 CALL iom_put( 'isnwmlt_cea' , rdm _snw(:,:) * r1_rdtice )248 CALL iom_put( 'fsal_virt_cea', soce_0(:,:) * rdm _ice(:,:) * r1_rdtice )249 CALL iom_put( 'fsal_real_cea', - sice_0(:,:) * rdm _ice(:,:) * r1_rdtice )224 CALL iom_put( 'isnwmlt_cea' , rdmsnif(:,:) * r1_rdtice ) 225 CALL iom_put( 'fsal_virt_cea', soce_0(:,:) * rdmicif(:,:) * r1_rdtice ) 226 CALL iom_put( 'fsal_real_cea', - sice_0(:,:) * rdmicif(:,:) * r1_rdtice ) 250 227 ENDIF 251 228 … … 267 244 IF(ln_ctl) THEN ! control print 268 245 CALL prt_ctl(tab2d_1=qsr , clinfo1=' lim_sbc: qsr : ', tab2d_2=qns , clinfo2=' qns : ') 269 CALL prt_ctl(tab2d_1=emp , clinfo1=' lim_sbc: emp : ', tab2d_2= sfx , clinfo2=' sfx: ')246 CALL prt_ctl(tab2d_1=emp , clinfo1=' lim_sbc: emp : ', tab2d_2=emps , clinfo2=' emps : ') 270 247 CALL prt_ctl(tab2d_1=utau , clinfo1=' lim_sbc: utau : ', mask1=umask, & 271 248 & tab2d_2=vtau , clinfo2=' vtau : ' , mask2=vmask ) … … 463 440 END WHERE 464 441 ENDIF 465 ! ! embedded sea ice466 IF( nn_ice_embd /= 0 ) THEN ! mass exchanges between ice and ocean (case 1 or 2) set the snow+ice mass467 snwice_mass (:,:) = tms(:,:) * ( rhosn * hsnif(:,:) + rhoic * hicif(:,:) ) * ( 1.0 - frld(:,:) )468 snwice_mass_b(:,:) = snwice_mass(:,:)469 ELSE470 snwice_mass (:,:) = 0.e0 ! no mass exchanges471 snwice_mass_b(:,:) = 0.e0 ! no mass exchanges472 ENDIF473 IF( nn_ice_embd == 2 .AND. & ! full embedment (case 2) & no restart :474 & .NOT.ln_rstart ) THEN ! deplete the initial ssh below sea-ice area475 sshn(:,:) = sshn(:,:) - snwice_mass(:,:) * r1_rau0476 sshb(:,:) = sshb(:,:) - snwice_mass(:,:) * r1_rau0477 ENDIF478 442 ! 479 443 END SUBROUTINE lim_sbc_init_2 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limthd_2.F90
r3625 r6736 13 13 !! 'key_lim2' : LIM 2.0 sea-ice model 14 14 !!---------------------------------------------------------------------- 15 !! lim_thd_2 16 !! lim_thd_init_2 15 !! lim_thd_2 : thermodynamic of sea ice 16 !! lim_thd_init_2 : initialisation of sea-ice thermodynamic 17 17 !!---------------------------------------------------------------------- 18 USE phycst 19 USE dom_oce 18 USE phycst ! physical constants 19 USE dom_oce ! ocean space and time domain variables 20 20 USE domvvl 21 21 USE lbclnk 22 USE in_out_manager 22 USE in_out_manager ! I/O manager 23 23 USE lib_mpp 24 USE wrk_nemo 25 USE iom 26 USE ice_2 27 USE sbc_oce 28 USE sbc_ice 29 USE thd_ice_2 30 USE dom_ice_2 24 USE wrk_nemo ! work arrays 25 USE iom ! IOM library 26 USE ice_2 ! LIM sea-ice variables 27 USE sbc_oce ! 28 USE sbc_ice ! 29 USE thd_ice_2 ! LIM thermodynamic sea-ice variables 30 USE dom_ice_2 ! LIM sea-ice domain 31 31 USE limthd_zdf_2 32 32 USE limthd_lac_2 33 33 USE limtab_2 34 USE prtctl 35 USE cpl_oasis3, ONLY : lk_cpl36 USE diaar5 , ONLY : lk_diaar537 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)38 34 USE prtctl ! Print control 35 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 36 USE cpl_oasis3, ONLY : lk_cpl 37 USE diaar5, ONLY : lk_diaar5 38 39 39 IMPLICIT NONE 40 40 PRIVATE … … 56 56 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 57 57 !!---------------------------------------------------------------------- 58 58 59 CONTAINS 59 60 … … 89 90 REAL(wp) :: za , zh, zthsnice ! 90 91 REAL(wp) :: zfric_u ! friction velocity 92 REAL(wp) :: zfnsol ! total non solar heat 93 REAL(wp) :: zfontn ! heat flux from snow thickness 91 94 REAL(wp) :: zfntlat, zpareff ! test. the val. of lead heat budget 92 95 … … 127 130 zdvolif(:,:) = 0.e0 ! total variation of ice volume 128 131 zdvonif(:,:) = 0.e0 ! transformation of snow to sea-ice volume 132 ! zdvonif(:,:) = 0.e0 ! lateral variation of ice volume 129 133 zlicegr(:,:) = 0.e0 ! lateral variation of ice volume 130 134 zdvomif(:,:) = 0.e0 ! variation of ice volume at bottom due to melting only … … 134 138 ffltbif(:,:) = 0.e0 ! linked with fstric 135 139 qfvbq (:,:) = 0.e0 ! linked with fstric 136 rdm_snw(:,:) = 0.e0 ! variation of snow mass over 1 time step 137 rdq_snw(:,:) = 0.e0 ! heat content associated with rdm_snw 138 rdm_ice(:,:) = 0.e0 ! variation of ice mass over 1 time step 139 rdq_ice(:,:) = 0.e0 ! heat content associated with rdm_ice 140 rdmsnif(:,:) = 0.e0 ! variation of snow mass per unit area 141 rdmicif(:,:) = 0.e0 ! variation of ice mass per unit area 140 142 zmsk (:,:,:) = 0.e0 141 143 … … 198 200 !-------------------------------------------------------------------------- 199 201 200 !CDIR NOVERRCHK 201 DO jj = 1, jpj 202 !CDIR NOVERRCHK 202 sst_m(:,:) = sst_m(:,:) + rt0 203 204 !CDIR NOVERRCHK 205 DO jj = 1, jpj 206 !CDIR NOVERRCHK 203 207 DO ji = 1, jpi 204 208 zthsnice = hsnif(ji,jj) + hicif(ji,jj) … … 214 218 ! temperature and turbulent mixing (McPhee, 1992) 215 219 zfric_u = MAX ( MIN( SQRT( ust2s(ji,jj) ) , zfric_umax ) , zfric_umin ) ! friction velocity 216 fdtcn(ji,jj) = zindb * rau0 * rcp * 0.006 * zfric_u * ( sst_m(ji,jj) + rt0- tfu(ji,jj) )220 fdtcn(ji,jj) = zindb * rau0 * rcp * 0.006 * zfric_u * ( sst_m(ji,jj) - tfu(ji,jj) ) 217 221 qdtcn(ji,jj) = zindb * fdtcn(ji,jj) * frld(ji,jj) * rdt_ice 218 222 219 223 ! partial computation of the lead energy budget (qldif) 220 224 #if defined key_coupled 221 qldif(ji,jj) = tms(ji,jj) * rdt_ice 225 qldif(ji,jj) = tms(ji,jj) * rdt_ice & 222 226 & * ( ( qsr_tot(ji,jj) - qsr_ice(ji,jj,1) * zfricp ) * ( 1.0 - thcm(ji,jj) ) & 223 227 & + ( qns_tot(ji,jj) - qns_ice(ji,jj,1) * zfricp ) & 224 228 & + frld(ji,jj) * ( fdtcn(ji,jj) + ( 1.0 - zindb ) * fsbbq(ji,jj) ) ) 225 229 #else 226 qldif(ji,jj) = tms(ji,jj) * rdt_ice * frld(ji,jj) & 227 & * ( qsr(ji,jj) * ( 1.0 - thcm(ji,jj) ) & 228 & + qns(ji,jj) + fdtcn(ji,jj) & 229 & + ( 1.0 - zindb ) * fsbbq(ji,jj) ) 230 zfontn = ( sprecip(ji,jj) / rhosn ) * xlsn ! energy for melting solid precipitation 231 zfnsol = qns(ji,jj) ! total non solar flux over the ocean 232 qldif(ji,jj) = tms(ji,jj) * ( qsr(ji,jj) * ( 1.0 - thcm(ji,jj) ) & 233 & + zfnsol + fdtcn(ji,jj) - zfontn & 234 & + ( 1.0 - zindb ) * fsbbq(ji,jj) ) & 235 & * frld(ji,jj) * rdt_ice 236 !!$ qldif(ji,jj) = tms(ji,jj) * rdt_ice * frld(ji,jj) 237 !!$ & * ( qsr(ji,jj) * ( 1.0 - thcm(ji,jj) ) & 238 !!$ & + qns(ji,jj) + fdtcn(ji,jj) - zfontn & 239 !!$ & + ( 1.0 - zindb ) * fsbbq(ji,jj) ) & 230 240 #endif 231 241 ! parlat : percentage of energy used for lateral ablation (0.0) … … 237 247 238 248 ! energy needed to bring ocean surface layer until its freezing 239 qcmif (ji,jj) = rau0 * rcp * fse3t_m(ji,jj,1) * ( tfu(ji,jj) - sst_m(ji,jj) - rt0 ) * ( 1 - zinda ) 249 qcmif (ji,jj) = rau0 * rcp * fse3t_m(ji,jj,1) & 250 & * ( tfu(ji,jj) - sst_m(ji,jj) ) * ( 1 - zinda ) 240 251 241 252 ! calculate oceanic heat flux. … … 247 258 END DO 248 259 260 sst_m(:,:) = sst_m(:,:) - rt0 261 249 262 ! Select icy points and fulfill arrays for the vectorial grid. 250 263 !---------------------------------------------------------------------- … … 300 313 CALL tab_2d_1d_2( nbpb, qldif_1d (1:nbpb) , qldif , jpi, jpj, npb(1:nbpb) ) 301 314 CALL tab_2d_1d_2( nbpb, qstbif_1d (1:nbpb) , qstoif , jpi, jpj, npb(1:nbpb) ) 302 CALL tab_2d_1d_2( nbpb, rdm_ice_1d (1:nbpb) , rdm_ice , jpi, jpj, npb(1:nbpb) ) 303 CALL tab_2d_1d_2( nbpb, rdq_ice_1d (1:nbpb) , rdq_ice , jpi, jpj, npb(1:nbpb) ) 315 CALL tab_2d_1d_2( nbpb, rdmicif_1d (1:nbpb) , rdmicif , jpi, jpj, npb(1:nbpb) ) 304 316 CALL tab_2d_1d_2( nbpb, dmgwi_1d (1:nbpb) , dmgwi , jpi, jpj, npb(1:nbpb) ) 305 CALL tab_2d_1d_2( nbpb, rdm_snw_1d (1:nbpb) , rdm_snw , jpi, jpj, npb(1:nbpb) )306 CALL tab_2d_1d_2( nbpb, rdq_snw_1d (1:nbpb) , rdq_snw , jpi, jpj, npb(1:nbpb) )307 317 CALL tab_2d_1d_2( nbpb, qlbbq_1d (1:nbpb) , zqlbsbq , jpi, jpj, npb(1:nbpb) ) 308 318 ! … … 323 333 CALL tab_1d_2d_2( nbpb, qfvbq , npb, qfvbq_1d (1:nbpb) , jpi, jpj ) 324 334 CALL tab_1d_2d_2( nbpb, qstoif , npb, qstbif_1d (1:nbpb) , jpi, jpj ) 325 CALL tab_1d_2d_2( nbpb, rdm_ice , npb, rdm_ice_1d(1:nbpb) , jpi, jpj ) 326 CALL tab_1d_2d_2( nbpb, rdq_ice , npb, rdq_ice_1d(1:nbpb) , jpi, jpj ) 335 CALL tab_1d_2d_2( nbpb, rdmicif , npb, rdmicif_1d(1:nbpb) , jpi, jpj ) 327 336 CALL tab_1d_2d_2( nbpb, dmgwi , npb, dmgwi_1d (1:nbpb) , jpi, jpj ) 328 CALL tab_1d_2d_2( nbpb, rdm_snw , npb, rdm_snw_1d(1:nbpb) , jpi, jpj ) 329 CALL tab_1d_2d_2( nbpb, rdq_snw , npb, rdq_snw_1d(1:nbpb) , jpi, jpj ) 337 CALL tab_1d_2d_2( nbpb, rdmsnif , npb, rdmsnif_1d(1:nbpb) , jpi, jpj ) 330 338 CALL tab_1d_2d_2( nbpb, zdvosif , npb, dvsbq_1d (1:nbpb) , jpi, jpj ) 331 339 CALL tab_1d_2d_2( nbpb, zdvobif , npb, dvbbq_1d (1:nbpb) , jpi, jpj ) … … 386 394 IF( nbpac > 0 ) THEN 387 395 ! 388 zlicegr(:,:) = rdm _ice(:,:) ! to output the lateral sea-ice growth396 zlicegr(:,:) = rdmicif(:,:) ! to output the lateral sea-ice growth 389 397 !...Put the variable in a 1-D array for lateral accretion 390 398 CALL tab_2d_1d_2( nbpac, frld_1d (1:nbpac) , frld , jpi, jpj, npac(1:nbpac) ) … … 397 405 CALL tab_2d_1d_2( nbpac, qcmif_1d (1:nbpac) , qcmif , jpi, jpj, npac(1:nbpac) ) 398 406 CALL tab_2d_1d_2( nbpac, qstbif_1d (1:nbpac) , qstoif , jpi, jpj, npac(1:nbpac) ) 399 CALL tab_2d_1d_2( nbpac, rdm_ice_1d(1:nbpac) , rdm_ice , jpi, jpj, npac(1:nbpac) ) 400 CALL tab_2d_1d_2( nbpac, rdq_ice_1d(1:nbpac) , rdq_ice , jpi, jpj, npac(1:nbpac) ) 407 CALL tab_2d_1d_2( nbpac, rdmicif_1d(1:nbpac) , rdmicif , jpi, jpj, npac(1:nbpac) ) 401 408 CALL tab_2d_1d_2( nbpac, dvlbq_1d (1:nbpac) , zdvolif , jpi, jpj, npac(1:nbpac) ) 402 409 CALL tab_2d_1d_2( nbpac, tfu_1d (1:nbpac) , tfu , jpi, jpj, npac(1:nbpac) ) … … 412 419 CALL tab_1d_2d_2( nbpac, tbif(:,:,3), npac(1:nbpac), tbif_1d (1:nbpac , 3 ), jpi, jpj ) 413 420 CALL tab_1d_2d_2( nbpac, qstoif , npac(1:nbpac), qstbif_1d (1:nbpac) , jpi, jpj ) 414 CALL tab_1d_2d_2( nbpac, rdm_ice , npac(1:nbpac), rdm_ice_1d(1:nbpac) , jpi, jpj ) 415 CALL tab_1d_2d_2( nbpac, rdq_ice , npac(1:nbpac), rdq_ice_1d(1:nbpac) , jpi, jpj ) 421 CALL tab_1d_2d_2( nbpac, rdmicif , npac(1:nbpac), rdmicif_1d(1:nbpac) , jpi, jpj ) 416 422 CALL tab_1d_2d_2( nbpac, zdvolif , npac(1:nbpac), dvlbq_1d (1:nbpac) , jpi, jpj ) 417 423 ! … … 444 450 CALL iom_put( 'iceprod_cea' , hicifp (:,:) * zztmp ) ! Ice produced [m/s] 445 451 IF( lk_diaar5 ) THEN 446 CALL iom_put( 'snowmel_cea' , rdm _snw(:,:) * zztmp ) ! Snow melt [kg/m2/s]452 CALL iom_put( 'snowmel_cea' , rdmsnif(:,:) * zztmp ) ! Snow melt [kg/m2/s] 447 453 zztmp = rhoic / rdt_ice 448 454 CALL iom_put( 'sntoice_cea' , zdvonif(:,:) * zztmp ) ! Snow to Ice transformation [kg/m2/s] 449 455 CALL iom_put( 'ticemel_cea' , zdvosif(:,:) * zztmp ) ! Melt at Sea Ice top [kg/m2/s] 450 456 CALL iom_put( 'bicemel_cea' , zdvomif(:,:) * zztmp ) ! Melt at Sea Ice bottom [kg/m2/s] 451 zlicegr(:,:) = MAX( 0.e0, rdm _ice(:,:)-zlicegr(:,:) )452 CALL iom_put( 'licepro_cea' , zlicegr(:,:) * zztmp ) ! Later al sea ice growth[kg/m2/s]457 zlicegr(:,:) = MAX( 0.e0, rdmicif(:,:)-zlicegr(:,:) ) 458 CALL iom_put( 'licepro_cea' , zlicegr(:,:) * zztmp ) ! Latereal sea ice growth [kg/m2/s] 453 459 ENDIF 454 460 ! -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limthd_lac_2.F90
r3625 r6736 7 7 8 8 !!---------------------------------------------------------------------- 9 !! lim_lat_acr_2 : lateral accretion of ice10 !!---------------------------------------------------------------------- 11 USE par_oce ! ocean parameters9 !! lim_lat_acr_2 : lateral accretion of ice 10 !!---------------------------------------------------------------------- 11 USE par_oce ! ocean parameters 12 12 USE phycst 13 13 USE thd_ice_2 14 14 USE ice_2 15 15 USE limistate_2 16 USE lib_mpp ! MPP library17 USE wrk_nemo ! work arrays18 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 16 USE lib_mpp ! MPP library 17 USE wrk_nemo ! work arrays 18 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 19 19 20 20 IMPLICIT NONE … … 146 146 frld_1d (ji) = MAX( zfrlnew , zfrlmin(ji) ) 147 147 !--computation of the remaining part of ice thickness which has been already used 148 zdhicbot(ji) = ( frld_1d(ji) - zfrlnew ) * zhice0(ji) / ( 1.0 - zfrlmin(ji) ) 149 &- ( ( 1.0 - zfrrate ) / ( 1.0 - frld_1d(ji) ) ) * ( zqbgow(ji) / xlic )148 zdhicbot(ji) = ( frld_1d(ji) - zfrlnew ) * zhice0(ji) / ( 1.0 - zfrlmin(ji) ) & 149 - ( ( 1.0 - zfrrate ) / ( 1.0 - frld_1d(ji) ) ) * ( zqbgow(ji) / xlic ) 150 150 END DO 151 151 … … 197 197 & ) / zah 198 198 199 tbif_1d(ji,3) = ( iiceform * ( zhnews2 - zdh3 )* zta1 &199 tbif_1d(ji,3) = ( iiceform * ( zhnews2 - zdh3 ) * zta1 & 200 200 & + ( iiceform * zdh3 + ( 1 - iiceform ) * zdh1 ) * zta2 & 201 201 & + ( iiceform * ( zhnews2 - zdh5 ) + ( 1 - iiceform ) * ( zhnews2 - zdh1 ) ) * zta3 & … … 218 218 DO ji = kideb , kiut 219 219 dvlbq_1d (ji) = ( 1. - frld_1d(ji) ) * h_ice_1d(ji) - ( 1. - zfrl_old(ji) ) * zhice_old(ji) 220 rdm_ice_1d(ji) = rdm_ice_1d(ji) + rhoic * dvlbq_1d(ji) 221 rdq_ice_1d(ji) = rdq_ice_1d(ji) + rcpic * dvlbq_1d(ji) * ( tfu_1d(ji) - rt0 ) ! heat content relative to rt0 220 rdmicif_1d(ji) = rdmicif_1d(ji) + rhoic * dvlbq_1d(ji) 222 221 END DO 223 222 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limthd_zdf_2.F90
r3625 r6736 18 18 USE ice_2 19 19 USE limistate_2 20 USE cpl_oasis3, ONLY : lk_cpl21 20 USE in_out_manager 22 21 USE lib_mpp ! MPP library 23 22 USE wrk_nemo ! work arrays 24 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 25 23 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 24 USE cpl_oasis3, ONLY : lk_cpl 25 26 26 IMPLICIT NONE 27 27 PRIVATE … … 87 87 REAL(wp), POINTER, DIMENSION(:) :: zrcpdt ! h_su*rho_su*cp_su/dt(h_su being the thick. of surf. layer) 88 88 REAL(wp), POINTER, DIMENSION(:) :: zts_old ! previous surface temperature 89 REAL(wp), POINTER, DIMENSION(:) :: zidsn , z1midsn , zidsnic ! tempor ary variables89 REAL(wp), POINTER, DIMENSION(:) :: zidsn , z1midsn , zidsnic ! tempory variables 90 90 REAL(wp), POINTER, DIMENSION(:) :: zfnet ! net heat flux at the top surface( incl. conductive heat flux) 91 91 REAL(wp), POINTER, DIMENSION(:) :: zsprecip ! snow accumulation … … 99 99 REAL(wp), POINTER, DIMENSION(:) :: zep ! internal temperature of the 2nd layer of the snow/ice system 100 100 REAL(wp), DIMENSION(3) :: & 101 101 zplediag & ! principle diagonal, subdiag. and supdiag. of the 102 102 , zsubdiag & ! tri-diagonal matrix coming from the computation 103 103 , zsupdiag & ! of the temperatures inside the snow-ice system 104 104 , zsmbr ! second member 105 REAL(wp) :: & 106 zhsu & ! thickness of surface layer 107 , zhe & ! effective thickness for compu. of equ. thermal conductivity 108 , zheshth & ! = zhe / thth 109 , zghe & ! correction factor of the thermal conductivity 110 , zumsb & ! parameter for numerical method to solve heat-diffusion eq. 111 , zkhsn & ! conductivity at the snow layer 112 , zkhic & ! conductivity at the ice layers 113 , zkint & ! equivalent conductivity at the snow-ice interface 114 , zkhsnint & ! = zkint*dt / (hsn*rhosn*cpsn) 115 , zkhicint & ! = 2*zkint*dt / (hic*rhoic*cpic) 116 , zpiv1, zpiv2 & ! temporary scalars used to solve the tri-diagonal system 117 , zb2, zd2 & ! temporary scalars used to solve the tri-diagonal system 118 , zb3, zd3 & ! temporary scalars used to solve the tri-diagonal system 105 REAL(wp) :: & 106 zhsu & ! thickness of surface layer 107 , zhe & ! effective thickness for compu. of equ. thermal conductivity 108 , zheshth & ! = zhe / thth 109 , zghe & ! correction factor of the thermal conductivity 110 , zumsb & ! parameter for numerical method to solve heat-diffusion eq. 111 , zkhsn & ! conductivity at the snow layer 112 , zkhic & ! conductivity at the ice layers 113 , zkint & ! equivalent conductivity at the snow-ice interface 114 , zkhsnint & ! = zkint*dt / (hsn*rhosn*cpsn) 115 , zkhicint & ! = 2*zkint*dt / (hic*rhoic*cpic) 116 , zpiv1 , zpiv2 & ! tempory scalars used to solve the tri-diagonal system 117 , zb2 , zd2 , zb3 , zd3 & 119 118 , ztint ! equivalent temperature at the snow-ice interface 120 REAL(wp) :: 121 zexp &! exponential function of the ice thickness122 , zfsab & ! part of solar radiation stored in brine pockets123 , zfts & ! value of energy balance function when the temp. equal surf. temp.124 , zdfts & ! value of derivative of ztfs when the temp. equal surf. temp.125 , zdts & ! surface temperature increment126 , zqsnw_mlt & ! energy needed to melt snow127 , zdhsmlt & ! change in snow thickness due to melt128 , zhsn & ! snow thickness (previous+accumulation-melt)129 , zqsn_mlt_rem & ! remaining heat coming from snow melting130 , zqice_top_mlt & ! energy used to melt ice at top surface131 , zdhssub &! change in snow thick. due to sublimation or evaporation132 , zdhisub &! change in ice thick. due to sublimation or evaporation133 , zdhsn &! snow ice thickness increment134 , zdtsn &! snow internal temp. increment135 , zdtic &! ice internal temp. increment119 REAL(wp) :: & 120 zexp & ! exponential function of the ice thickness 121 , zfsab & ! part of solar radiation stored in brine pockets 122 , zfts & ! value of energy balance function when the temp. equal surf. temp. 123 , zdfts & ! value of derivative of ztfs when the temp. equal surf. temp. 124 , zdts & ! surface temperature increment 125 , zqsnw_mlt & ! energy needed to melt snow 126 , zdhsmlt & ! change in snow thickness due to melt 127 , zhsn & ! snow thickness (previous+accumulation-melt) 128 , zqsn_mlt_rem & ! remaining heat coming from snow melting 129 , zqice_top_mlt & ! energy used to melt ice at top surface 130 , zdhssub & ! change in snow thick. due to sublimation or evaporation 131 , zdhisub & ! change in ice thick. due to sublimation or evaporation 132 , zdhsn & ! snow ice thickness increment 133 , zdtsn & ! snow internal temp. increment 134 , zdtic & ! ice internal temp. increment 136 135 , zqnes ! conductive energy due to ice melting in the first ice layer 137 REAL(wp) :: & 138 ztbot & ! temperature at the bottom surface 139 , zfcbot & ! conductive heat flux at bottom surface 140 , zqice_bot & ! energy used for bottom melting/growing 141 , zqice_bot_mlt &! energy used for bottom melting 142 , zqstbif_bot & ! part of energy stored in brine pockets used for bottom melting 143 , zqstbif_old & ! temporary var. for zqstbif_bot 144 , zdhicmlt & ! change in ice thickness due to bottom melting 145 , zdhicm & ! change in ice thickness var. 146 , zdhsnm & ! change in snow thickness var. 147 , zhsnfi & ! snow thickness var. 148 , zc1, zpc1 & ! temporary variables 149 , zc2, zpc2 & ! temporary variables 150 , zp1, zp2 & ! temporary variables 151 , ztb2, ztb3 ! temporary variables 152 REAL(wp) :: & 153 zdrmh & ! change in snow/ice thick. after snow-ice formation 154 , zhicnew & ! new ice thickness 155 , zhsnnew & ! new snow thickness 156 , zquot & 157 , ztneq & ! temporary temp. variables 158 , zqice & 159 , zqicetot & ! total heat inside the snow/ice system 160 , zdfrl & ! change in ice concentration 161 , zdvsnvol & ! change in snow volume 162 , zdrfrl1, zdrfrl2, zihsn, zidhb, zihic & ! temporary scalars 163 , zihe, zihq, ziexp, ziqf, zihnf & ! temporary scalars 164 , zibmlt, ziqr, zihgnew, zind, ztmp ! temporary scalars 136 REAL(wp) :: & 137 ztbot & ! temperature at the bottom surface 138 , zfcbot & ! conductive heat flux at bottom surface 139 , zqice_bot & ! energy used for bottom melting/growing 140 , zqice_bot_mlt & ! energy used for bottom melting 141 , zqstbif_bot & ! part of energy stored in brine pockets used for bottom melting 142 , zqstbif_old & ! tempory var. for zqstbif_bot 143 , zdhicmlt & ! change in ice thickness due to bottom melting 144 , zdhicm & ! change in ice thickness var. 145 , zdhsnm & ! change in snow thickness var. 146 , zhsnfi & ! snow thickness var. 147 , zc1, zpc1, zc2, zpc2, zp1, zp2 & ! tempory variables 148 , ztb2, ztb3 149 REAL(wp) :: & 150 zdrmh & ! change in snow/ice thick. after snow-ice formation 151 , zhicnew & ! new ice thickness 152 , zhsnnew & ! new snow thickness 153 , zquot , ztneq & ! tempory temp. variables 154 , zqice, zqicetot & ! total heat inside the snow/ice system 155 , zdfrl & ! change in ice concentration 156 , zdvsnvol & ! change in snow volume 157 , zdrfrl1, zdrfrl2 & ! tempory scalars 158 , zihsn, zidhb, zihic, zihe, zihq, ziexp, ziqf, zihnf, zibmlt, ziqr, zihgnew, zind 165 159 !!---------------------------------------------------------------------- 166 160 CALL wrk_alloc( jpij, ztsmlt, ztbif , zksn , zkic , zksndh , zfcsu , zfcsudt , zi0 , z1mi0 , zqmax ) … … 176 170 177 171 DO ji = kideb , kiut 178 ! do nothing if the snow (ice) thickness falls below its minimum thickness179 172 zihsn = MAX( zzero , SIGN( zone , hsndif - h_snow_1d(ji) ) ) 180 173 zihic = MAX( zzero , SIGN( zone , hicdif - h_ice_1d(ji) ) ) 181 !--energy required to bring snow to its melting point (rt0_snow) 182 zqcmlts(ji) = ( MAX ( zzero , rcpsn * h_snow_1d(ji) * ( tbif_1d(ji,1) - rt0_snow ) ) ) * ( 1.0 - zihsn ) 183 !--energy required to bring ice to its melting point (rt0_ice) 184 zqcmltb(ji) = ( MAX( zzero , rcpic * ( tbif_1d(ji,2) - rt0_ice ) * ( h_ice_1d(ji) / 2. ) ) & 185 & + MAX( zzero , rcpic * ( tbif_1d(ji,3) - rt0_ice ) * ( h_ice_1d(ji) / 2. ) ) & 186 & ) * ( 1.0 - zihic ) 187 !--limitation of snow/ice system internal temperature 174 !--computation of energy due to surface melting 175 zqcmlts(ji) = ( MAX ( zzero , & 176 & rcpsn * h_snow_1d(ji) * ( tbif_1d(ji,1) - rt0_snow ) ) ) * ( 1.0 - zihsn ) 177 !--computation of energy due to bottom melting 178 zqcmltb(ji) = ( MAX( zzero , & 179 & rcpic * ( tbif_1d(ji,2) - rt0_ice ) * ( h_ice_1d(ji) / 2. ) ) & 180 & + MAX( zzero , & 181 & rcpic * ( tbif_1d(ji,3) - rt0_ice ) * ( h_ice_1d(ji) / 2. ) ) & 182 & ) * ( 1.0 - zihic ) 183 !--limitation of snow/ice system internal temperature 188 184 tbif_1d(ji,1) = MIN( rt0_snow, tbif_1d(ji,1) ) 189 185 tbif_1d(ji,2) = MIN( rt0_ice , tbif_1d(ji,2) ) … … 485 481 dvsbq_1d(ji) = ( 1.0 - frld_1d(ji) ) * ( h_snow_1d(ji) - zhsnw_old(ji) - zsprecip(ji) ) 486 482 dvsbq_1d(ji) = MIN( zzero , dvsbq_1d(ji) ) 487 ztmp = rhosn * dvsbq_1d(ji) 488 rdm_snw_1d(ji) = ztmp 489 !--heat content of the water provided to the ocean (referenced to rt0) 490 rdq_snw_1d(ji) = cpic * ztmp * ( rt0_snow - rt0 ) 483 rdmsnif_1d(ji) = rhosn * dvsbq_1d(ji) 491 484 !-- If the snow is completely melted the remaining heat is used to melt ice 492 485 zqsn_mlt_rem = MAX( zzero , -zhsn ) * xlsn … … 631 624 !---updating new ice thickness and computing the newly formed ice mass 632 625 zhicnew = zihgnew * zhicnew 633 ztmp = ( 1.0 - frld_1d(ji) ) * ( zhicnew - h_ice_1d(ji) ) * rhoic 634 rdm_ice_1d(ji) = rdm_ice_1d(ji) + ztmp 635 !---heat content of the water provided to the ocean (referenced to rt0) 636 ! use of rt0_ice is OK for melting ice; in the case of freezing, tfu_1d should be used. 637 ! This is done in 9.5 section (see below) 638 rdq_ice_1d(ji) = cpic * ztmp * ( rt0_ice - rt0 ) 626 rdmicif_1d(ji) = rdmicif_1d(ji) + ( 1.0 - frld_1d(ji) ) * ( zhicnew - h_ice_1d(ji) ) * rhoic 639 627 !---updating new snow thickness and computing the newly formed snow mass 640 628 zhsnfi = zhsn + zdhsnm 641 629 h_snow_1d(ji) = MAX( zzero , zhsnfi ) 642 ztmp = ( 1.0 - frld_1d(ji) ) * ( h_snow_1d(ji) - zhsn ) * rhosn 643 rdm_snw_1d(ji) = rdm_snw_1d(ji) + ztmp 644 !---updating the heat content of the water provided to the ocean (referenced to rt0) 645 rdq_snw_1d(ji) = rdq_snw_1d(ji) + cpic * ztmp * ( rt0_snow - rt0 ) 630 rdmsnif_1d(ji) = rdmsnif_1d(ji) + ( 1.0 - frld_1d(ji) ) * ( h_snow_1d(ji) - zhsn ) * rhosn 646 631 !--remaining energy in case of total ablation 647 632 zqocea(ji) = - ( zihsn * xlic * zdhicm + xlsn * ( zhsnfi - h_snow_1d(ji) ) ) * ( 1.0 - frld_1d(ji) ) … … 675 660 tbif_1d(ji,3) = zihgnew * ztb3 + ( 1.0 - zihgnew ) * tfu_1d(ji) 676 661 h_ice_1d(ji) = zhicnew 677 ! update the ice heat content given to the ocean in freezing case678 ! (part due to difference between rt0_ice and tfu_1d)679 ztmp = ( 1. - zidhb ) * rhoic * dvbbq_1d(ji)680 rdq_ice_1d(ji) = rdq_ice_1d(ji) + cpic * ztmp * ( tfu_1d(ji) - rt0_ice )681 662 END DO 682 663 … … 720 701 dmgwi_1d(ji) = dmgwi_1d(ji) + ( 1.0 -frld_1d(ji) ) * ( h_snow_1d(ji) - zhsnnew ) * rhosn 721 702 !--- volume change of ice and snow (used for ocean-ice freshwater flux computation) 722 ztmp = ( 1.0 - frld_1d(ji) ) * ( zhicnew - h_ice_1d (ji) ) * rhoic 723 rdm_ice_1d(ji) = rdm_ice_1d(ji) + ztmp 724 rdq_ice_1d(ji) = rdq_ice_1d(ji) + cpic * ztmp * ( tfu_1d(ji) - rt0 ) 725 !!gm BUG ?? snow ==> only needed for nn_ice_embd == 0 (standard levitating sea-ice) 726 ztmp = ( 1.0 - frld_1d(ji) ) * ( zhsnnew - h_snow_1d(ji) ) * rhosn 727 rdm_snw_1d(ji) = rdm_snw_1d(ji) + ztmp 728 rdq_snw_1d(ji) = rdq_snw_1d(ji) + cpic * ztmp * ( rt0_snow - rt0 ) 703 rdmicif_1d(ji) = rdmicif_1d(ji) + ( 1.0 - frld_1d(ji) ) * ( zhicnew - h_ice_1d (ji) ) * rhoic 704 rdmsnif_1d(ji) = rdmsnif_1d(ji) + ( 1.0 - frld_1d(ji) ) * ( zhsnnew - h_snow_1d(ji) ) * rhosn 729 705 730 706 !--- Actualize new snow and ice thickness. … … 773 749 !--variation of ice volume and ice mass 774 750 dvlbq_1d(ji) = zihic * ( zfrl_old(ji) - frld_1d(ji) ) * h_ice_1d(ji) 775 ztmp = dvlbq_1d(ji) * rhoic 776 rdm_ice_1d(ji) = rdm_ice_1d(ji) + ztmp 777 !!gm 778 !!gm This should be split in two parts: 779 !!gm 1- heat required to bring sea-ice to tfu : this part should be added to the heat flux taken from the ocean 780 !!gm cpic * ztmp * 0.5 * ( tbif_1d(ji,2) + tbif_1d(ji,3) - 2.* rt0_ice ) 781 !!gm 2- heat content of lateral ablation referenced to rt0 : this part only put in rdq_ice_1d 782 !!gm cpic * ztmp * ( rt0_ice - rt0 ) 783 !!gm Currently we put all the heat in rdq_ice_1d 784 rdq_ice_1d(ji) = rdq_ice_1d(ji) + cpic * ztmp * 0.5 * ( tbif_1d(ji,2) + tbif_1d(ji,3) - 2.* rt0 ) 785 ! 751 rdmicif_1d(ji) = rdmicif_1d(ji) + dvlbq_1d(ji) * rhoic 786 752 !--variation of snow volume and snow mass 787 zdvsnvol = zihsn * ( zfrl_old(ji) - frld_1d(ji) ) * h_snow_1d(ji) 788 ztmp = zdvsnvol * rhosn 789 rdm_snw_1d(ji) = rdm_snw_1d(ji) + ztmp 790 !!gm 791 !!gm This should be split in two parts: 792 !!gm 1- heat required to bring snow to tfu : this part should be added to the heat flux taken from the ocean 793 !!gm cpic * ztmp * ( tbif_1d(ji,1) - rt0_snow ) 794 !!gm 2- heat content of lateral ablation referenced to rt0 : this part only put in rdq_snw_1d 795 !!gm cpic * ztmp * ( rt0_snow - rt0 ) 796 !!gm Currently we put all the heat in rdq_snw_1d 797 rdq_snw_1d(ji) = rdq_snw_1d(ji) + cpic * ztmp * ( tbif_1d(ji,1) - rt0 ) 798 753 zdvsnvol = zihsn * ( zfrl_old(ji) - frld_1d(ji) ) * h_snow_1d(ji) 754 rdmsnif_1d(ji) = rdmsnif_1d(ji) + zdvsnvol * rhosn 799 755 h_snow_1d(ji) = ziqf * h_snow_1d(ji) 800 756 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limtrp_2.F90
r3764 r6736 28 28 USE lib_mpp ! MPP library 29 29 USE wrk_nemo ! work arrays 30 # if defined key_agrif31 USE agrif_lim2_interp ! nesting32 # endif33 30 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 34 31 … … 84 81 85 82 IF( kt == nit000 ) CALL lim_trp_init_2 ! Initialization (first time-step only) 86 87 # if defined key_agrif88 CALL agrif_trp_lim2_load ! First interpolation89 # endif90 83 91 84 zsm(:,:) = area(:,:) … … 277 270 ENDIF 278 271 ! 279 # if defined key_agrif280 CALL agrif_trp_lim2 ! Fill boundaries of the fine grid281 # endif282 !283 272 CALL wrk_dealloc( jpi, jpj, zui_u , zvi_v , zsm, zs0ice, zs0sn , zs0a, zs0c0 , zs0c1 , zs0c2 , zs0st ) 284 273 ! -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limwri_2.F90
r3764 r6736 13 13 !!---------------------------------------------------------------------- 14 14 !!---------------------------------------------------------------------- 15 !! lim_wri_2 16 !! lim_wri_init_2 15 !! lim_wri_2 : write of the diagnostics variables in ouput file 16 !! lim_wri_init_2 : initialization and namelist read 17 17 !! lim_wri_state_2 : write for initial state or/and abandon: 18 18 !! > output.init.nc (if ninist = 1 in namelist) … … 26 26 USE ice_2 27 27 28 USE dianam 28 USE dianam ! build name of file (routine) 29 29 USE lbclnk 30 30 USE in_out_manager 31 USE lib_mpp 32 USE wrk_nemo 31 USE lib_mpp ! MPP library 32 USE wrk_nemo ! work arrays 33 33 USE iom 34 34 USE ioipsl 35 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)36 35 37 36 IMPLICIT NONE … … 185 184 zcmo(ji,jj,13) = qns(ji,jj) 186 185 ! See thersf for the coefficient 187 zcmo(ji,jj,14) = - sfx(ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce !!gm ???186 zcmo(ji,jj,14) = - emps(ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce !!gm ??? 188 187 zcmo(ji,jj,15) = utau_ice(ji,jj) 189 188 zcmo(ji,jj,16) = vtau_ice(ji,jj) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limwri_dimg_2.h90
r3764 r6736 125 125 zcmo(ji,jj,13) = qns(ji,jj) 126 126 ! See thersf for the coefficient 127 zcmo(ji,jj,14) = - sfx(ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce127 zcmo(ji,jj,14) = - emps(ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce 128 128 zcmo(ji,jj,15) = utau_ice(ji,jj) 129 129 zcmo(ji,jj,16) = vtau_ice(ji,jj) … … 173 173 rcmoy(ji,jj,13) = qns(ji,jj) 174 174 ! See thersf for the coefficient 175 rcmoy(ji,jj,14) = - sfx(ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce175 rcmoy(ji,jj,14) = - emps(ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce 176 176 rcmoy(ji,jj,15) = utau_ice(ji,jj) 177 177 rcmoy(ji,jj,16) = vtau_ice(ji,jj) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/thd_ice_2.F90
r3625 r6736 68 68 qstbif_1d , & !: " " qstoif 69 69 fbif_1d , & !: " " fbif 70 rdm_ice_1d , & !: " " rdm_ice 71 rdq_ice_1d , & !: " " rdq_ice 72 rdm_snw_1d , & !: " " rdm_snw 73 rdq_snw_1d , & !: " " rdq_snw 70 rdmicif_1d , & !: " " rdmicif 71 rdmsnif_1d , & !: " " rdmsnif 74 72 qlbbq_1d , & !: " " qlbsbq 75 73 dmgwi_1d , & !: " " dmgwi … … 110 108 & qstbif_1d(jpij), fbif_1d(jpij), Stat=ierr(2)) 111 109 ! 112 ALLOCATE( rdm_ice_1d(jpij), rdq_ice_1d(jpij) , & 113 & rdm_snw_1d(jpij), rdq_snw_1d(jpij), qlbbq_1d(jpij) , & 110 ALLOCATE( rdmicif_1d(jpij), rdmsnif_1d(jpij), qlbbq_1d(jpij), & 114 111 & dmgwi_1d(jpij) , dvsbq_1d(jpij) , rdvomif_1d(jpij), & 115 112 & dvbbq_1d(jpij) , dvlbq_1d(jpij) , dvnbq_1d(jpij) , & -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_3/limrhg.F90
r3791 r6736 8 8 !! - ! 2008-11 (M. Vancoppenolle, S. Bouillon, Y. Aksenov) add surface tilt in ice rheolohy 9 9 !! 3.3 ! 2009-05 (G.Garric) addition of the lim2_evp cas 10 !! 3.4 ! 2011-01 (A. Porter) dynamical allocation 11 !! 3.5 ! 2012-08 (R. Benshila) AGRIF 10 !! 3.4 ! 2011-01 (A Porter) dynamical allocation 12 11 !!---------------------------------------------------------------------- 13 12 #if defined key_lim3 || ( defined key_lim2 && ! defined key_lim2_vp ) … … 16 15 !! 'key_lim2' AND NOT 'key_lim2_vp' EVP LIM-2 sea-ice model 17 16 !!---------------------------------------------------------------------- 18 !! lim_rhg 17 !! lim_rhg : computes ice velocities 19 18 !!---------------------------------------------------------------------- 20 USE phycst ! Physical constant 21 USE oce , ONLY : snwice_mass, snwice_mass_b 22 USE par_oce ! Ocean parameters 23 USE dom_oce ! Ocean domain 24 USE sbc_oce ! Surface boundary condition: ocean fields 25 USE sbc_ice ! Surface boundary condition: ice fields 19 USE phycst ! Physical constant 20 USE par_oce ! Ocean parameters 21 USE dom_oce ! Ocean domain 22 USE sbc_oce ! Surface boundary condition: ocean fields 23 USE sbc_ice ! Surface boundary condition: ice fields 24 USE lbclnk ! Lateral Boundary Condition / MPP link 25 USE lib_mpp ! MPP library 26 USE wrk_nemo ! work arrays 27 USE in_out_manager ! I/O manager 28 USE prtctl ! Print control 29 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 26 30 #if defined key_lim3 27 USE ice ! LIM-3: ice variables28 USE dom_ice ! LIM-3: ice domain29 USE limitd_me ! LIM-3:31 USE ice ! LIM-3: ice variables 32 USE dom_ice ! LIM-3: ice domain 33 USE limitd_me ! LIM-3: 30 34 #else 31 USE ice_2 ! LIM-2: ice variables 32 USE dom_ice_2 ! LIM-2: ice domain 33 #endif 34 USE lbclnk ! Lateral Boundary Condition / MPP link 35 USE lib_mpp ! MPP library 36 USE wrk_nemo ! work arrays 37 USE in_out_manager ! I/O manager 38 USE prtctl ! Print control 39 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 40 #if defined key_agrif && defined key_lim2 41 USE agrif_lim2_interp 35 USE ice_2 ! LIM2: ice variables 36 USE dom_ice_2 ! LIM2: ice domain 42 37 #endif 43 38 … … 130 125 REAL(wp) :: zindb ! ice (1) or not (0) 131 126 REAL(wp) :: zdummy ! dummy argument 132 REAL(wp) :: zintb, zintn ! dummy argument133 127 134 128 REAL(wp), POINTER, DIMENSION(:,:) :: zpresh ! temporary array for ice strength … … 152 146 REAL(wp), POINTER, DIMENSION(:,:) :: zs12 ! Non-diagonal stress tensor component zs12 153 147 REAL(wp), POINTER, DIMENSION(:,:) :: zu_ice, zv_ice, zresr ! Local error on velocity 154 REAL(wp), POINTER, DIMENSION(:,:) :: zpice ! array used for the calculation of ice surface slope:155 ! ocean surface (ssh_m) if ice is not embedded156 ! ice top surface if ice is embedded157 148 !!------------------------------------------------------------------- 158 149 … … 160 151 CALL wrk_alloc( jpi,jpj, zc1 , u_oce1, u_oce2, u_ice2, zusw , v_oce1 , v_oce2, v_ice1 ) 161 152 CALL wrk_alloc( jpi,jpj, zf1 , deltat, zu_ice, zf2 , deltac, zv_ice , zdd , zdt , zds , zdst ) 162 CALL wrk_alloc( jpi,jpj, zdd , zdt , zds , zs1 , zs2 , zs12 , zresr , zpice)153 CALL wrk_alloc( jpi,jpj, zdd , zdt , zds , zs1 , zs2 , zs12 , zresr ) 163 154 164 155 #if defined key_lim2 && ! defined key_lim2_vp … … 171 162 # endif 172 163 at_i(:,:) = 1. - frld(:,:) 173 #endif174 #if defined key_agrif && defined key_lim2175 CALL agrif_rhg_lim2_load ! First interpolation of coarse values176 164 #endif 177 165 ! … … 244 232 ! v_oce2: ocean v component on v points 245 233 246 IF( nn_ice_embd == 2 ) THEN !== embedded sea ice: compute representative ice top surface ==!247 !248 ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[n/nn_fsbc], n=0,nn_fsbc-1}249 ! = (1/nn_fsbc)^2 * {SUM[n], n=0,nn_fsbc-1}250 zintn = REAL( nn_fsbc - 1 ) / REAL( nn_fsbc ) * 0.5_wp251 !252 ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1}253 ! = (1/nn_fsbc)^2 * (nn_fsbc^2 - {SUM[n], n=0,nn_fsbc-1})254 zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp255 !256 zpice(:,:) = ssh_m(:,:) + ( zintn * snwice_mass(:,:) + zintb * snwice_mass_b(:,:) ) * r1_rau0257 !258 ELSE !== non-embedded sea ice: use ocean surface for slope calculation ==!259 zpice(:,:) = ssh_m(:,:)260 ENDIF261 262 234 DO jj = k_j1+1, k_jpj-1 263 235 DO ji = fs_2, fs_jpim1 … … 302 274 ! include it later 303 275 304 zdsshx = ( zpice(ji+1,jj) - zpice(ji,jj) ) / e1u(ji,jj)305 zdsshy = ( zpice(ji,jj+1) - zpice(ji,jj) ) / e2v(ji,jj)276 zdsshx = ( ssh_m(ji+1,jj) - ssh_m(ji,jj) ) / e1u(ji,jj) 277 zdsshy = ( ssh_m(ji,jj+1) - ssh_m(ji,jj) ) / e2v(ji,jj) 306 278 307 279 za1ct(ji,jj) = ztagnx - zmass1(ji,jj) * grav * zdsshx … … 520 492 521 493 CALL lbc_lnk( u_ice(:,:), 'U', -1. ) 522 #if defined key_agrif523 CALL agrif_rhg_lim2( jter, nevp, 'U' )524 #endif525 494 526 495 !CDIR NOVERRCHK … … 548 517 549 518 CALL lbc_lnk( v_ice(:,:), 'V', -1. ) 550 #if defined key_agrif551 CALL agrif_rhg_lim2( jter, nevp, 'V' )552 #endif553 519 554 520 ELSE … … 577 543 578 544 CALL lbc_lnk( v_ice(:,:), 'V', -1. ) 579 #if defined key_agrif580 CALL agrif_rhg_lim2( jter, nevp , 'V' )581 #endif582 545 583 546 !CDIR NOVERRCHK … … 608 571 609 572 CALL lbc_lnk( u_ice(:,:), 'U', -1. ) 610 #if defined key_agrif611 CALL agrif_rhg_lim2( jter, nevp, 'U' )612 #endif613 573 614 574 ENDIF … … 651 611 CALL lbc_lnk( u_ice(:,:), 'U', -1. ) 652 612 CALL lbc_lnk( v_ice(:,:), 'V', -1. ) 653 #if defined key_agrif654 CALL agrif_rhg_lim2( nevp , nevp, 'U' )655 CALL agrif_rhg_lim2( nevp , nevp, 'V' )656 #endif657 613 658 614 DO jj = k_j1+1, k_jpj-1 … … 790 746 CALL wrk_dealloc( jpi,jpj, zc1 , u_oce1, u_oce2, u_ice2, zusw , v_oce1 , v_oce2, v_ice1 ) 791 747 CALL wrk_dealloc( jpi,jpj, zf1 , deltat, zu_ice, zf2 , deltac, zv_ice , zdd , zdt , zds , zdst ) 792 CALL wrk_dealloc( jpi,jpj, zdd , zdt , zds , zs1 , zs2 , zs12 , zresr , zpice)748 CALL wrk_dealloc( jpi,jpj, zdd , zdt , zds , zs1 , zs2 , zs12 , zresr ) 793 749 794 750 END SUBROUTINE lim_rhg -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ASM/asminc.F90
r3785 r6736 14 14 15 15 !!---------------------------------------------------------------------- 16 !! 'key_asminc' 16 !! 'key_asminc' : Switch on the assimilation increment interface 17 17 !!---------------------------------------------------------------------- 18 !! asm_inc_init 19 !! calc_date 20 !! tra_asm_inc 21 !! dyn_asm_inc 22 !! ssh_asm_inc 23 !! seaice_asm_inc : Apply the seaice increment18 !! asm_inc_init : Initialize the increment arrays and IAU weights 19 !! calc_date : Compute the calendar date YYYYMMDD on a given step 20 !! tra_asm_inc : Apply the tracer (T and S) increments 21 !! dyn_asm_inc : Apply the dynamic (u and v) increments 22 !! ssh_asm_inc : Apply the SSH increment 23 !! seaice_asm_inc : Apply the seaice increment 24 24 !!---------------------------------------------------------------------- 25 25 USE wrk_nemo ! Memory Allocation 26 26 USE par_oce ! Ocean space and time domain variables 27 27 USE dom_oce ! Ocean space and time domain 28 USE domvvl ! domain: variable volume level29 28 USE oce ! Dynamics and active tracers defined in memory 30 29 USE ldfdyn_oce ! ocean dynamics: lateral physics … … 40 39 #endif 41 40 USE sbc_oce ! Surface boundary condition variables. 41 USE domvvl 42 42 43 43 IMPLICIT NONE … … 92 92 # include "ldfdyn_substitute.h90" 93 93 # include "vectopt_loop_substitute.h90" 94 94 95 !!---------------------------------------------------------------------- 95 96 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 109 110 !! ** Action : 110 111 !!---------------------------------------------------------------------- 111 INTEGER :: ji, jj, jk 112 !! 113 !! 114 INTEGER :: ji,jj,jk 112 115 INTEGER :: jt 113 116 INTEGER :: imid … … 939 942 ! Update before fields 940 943 sshb(:,:) = sshn(:,:) 941 944 #if ! defined key_jth_fix 942 945 IF( lk_vvl ) THEN 943 946 DO jk = 1, jpk … … 945 948 END DO 946 949 ENDIF 947 950 #endif 948 951 DEALLOCATE( ssh_bkg ) 949 952 DEALLOCATE( ssh_bkginc ) … … 955 958 END SUBROUTINE ssh_asm_inc 956 959 957 958 960 SUBROUTINE seaice_asm_inc( kt, kindic ) 959 961 !!---------------------------------------------------------------------- … … 966 968 !! ** Action : 967 969 !! 968 !!---------------------------------------------------------------------- 970 !! History : 971 !! ! 07-2011 (D. Lea) Initial version based on ssh_asm_inc 972 !!---------------------------------------------------------------------- 973 969 974 IMPLICIT NONE 970 ! 971 INTEGER, INTENT(in) :: kt ! Current time step 972 INTEGER, INTENT(in), OPTIONAL :: kindic ! flag for disabling the deallocation 973 ! 974 INTEGER :: it 975 REAL(wp) :: zincwgt ! IAU weight for current time step 975 976 !! * Arguments 977 INTEGER, INTENT(IN) :: kt ! Current time step 978 INTEGER, OPTIONAL, INTENT(IN) :: kindic ! flag for disabling the deallocation 979 980 !! * Local declarations 981 INTEGER :: it 982 REAL(wp) :: zincwgt ! IAU weight for current time step 983 976 984 #if defined key_lim2 977 REAL(wp), DIMENSION(jpi,jpj) :: zofrld, zohicif, zseaicendg, zhicifinc ! LIM 978 REAL(wp) :: zhicifmin = 0.5_wp ! ice minimum depth in metres 979 #endif 980 !!---------------------------------------------------------------------- 985 REAL(wp), DIMENSION(jpi,jpj) :: zofrld, zohicif, zseaicendg, zhicifinc ! LIM 986 REAL(wp) :: zhicifmin=0.5_wp ! ice minimum depth in metres 987 988 #endif 989 981 990 982 991 IF ( ln_asmiau ) THEN … … 999 1008 ENDIF 1000 1009 1001 ! Sea-ice : LIM-3 case (to add)1002 1003 1010 #if defined key_lim2 1004 ! Sea-ice : LIM-2 case 1005 zofrld (:,:) =frld(:,:)1006 zohicif(:,:) =hicif(:,:)1007 ! 1008 frld = MIN( MAX( frld(:,:) - seaice_bkginc(:,:) * zincwgt, 0.0_wp), 1.0_wp)1011 1012 zofrld(:,:)=frld(:,:) 1013 zohicif(:,:)=hicif(:,:) 1014 1015 frld = MIN( MAX( frld(:,:) - seaice_bkginc(:,:) * zincwgt, 0.0_wp), 1.0_wp) 1009 1016 pfrld = MIN( MAX( pfrld(:,:) - seaice_bkginc(:,:) * zincwgt, 0.0_wp), 1.0_wp) 1010 1017 fr_i(:,:) = 1.0_wp - frld(:,:) ! adjust ice fraction 1011 ! 1012 zseaicendg(:,:) = zofrld(:,:) - frld(:,:)! find out actual sea ice nudge applied1013 ! 1018 1019 zseaicendg(:,:)=zofrld(:,:) - frld(:,:) ! find out actual sea ice nudge applied 1020 1014 1021 ! Nudge sea ice depth to bring it up to a required minimum depth 1022 1015 1023 WHERE( zseaicendg(:,:) > 0.0_wp .AND. hicif(:,:) < zhicifmin ) 1016 1024 zhicifinc(:,:) = (zhicifmin - hicif(:,:)) * zincwgt … … 1018 1026 zhicifinc(:,:) = 0.0_wp 1019 1027 END WHERE 1020 ! 1021 ! nudge ice depth 1022 hicif (:,:) = hicif (:,:) + zhicifinc(:,:) 1023 phicif(:,:) = phicif(:,:) + zhicifinc(:,:) 1024 ! 1025 ! seaice salinity balancing (to add) 1028 1029 ! nudge ice depth 1030 hicif(:,:)=hicif(:,:) + zhicifinc(:,:) 1031 phicif(:,:)=phicif(:,:) + zhicifinc(:,:) 1032 1033 ! seaice salinity balancing (to add) 1034 1026 1035 #endif 1027 1036 1028 1037 #if defined key_cice 1029 ! Sea-ice : CICE case. Pass ice increment tendency into CICE 1038 1039 ! Pass ice increment tendency into CICE 1030 1040 ndaice_da(:,:) = seaice_bkginc(:,:) * zincwgt / rdt 1041 1031 1042 #endif 1032 1043 … … 1038 1049 1039 1050 #if defined key_cice 1040 ! Sea-ice : CICE case. Zero ice increment tendency into CICE 1051 1052 ! Zero ice increment tendency into CICE 1041 1053 ndaice_da(:,:) = 0.0_wp 1054 1042 1055 #endif 1043 1056 … … 1054 1067 neuler = 0 ! Force Euler forward step 1055 1068 1056 ! Sea-ice : LIM-3 case (to add)1057 1058 1069 #if defined key_lim2 1059 ! Sea-ice : LIM-2 case. 1070 1060 1071 zofrld(:,:)=frld(:,:) 1061 1072 zohicif(:,:)=hicif(:,:) 1062 !1073 1063 1074 ! Initialize the now fields the background + increment 1064 frld (:,:) = MIN( MAX( frld(:,:) - seaice_bkginc(:,:), 0.0_wp), 1.0_wp) 1075 1076 frld(:,:) = MIN( MAX( frld(:,:) - seaice_bkginc(:,:), 0.0_wp), 1.0_wp) 1065 1077 pfrld(:,:) = frld(:,:) 1066 fr_i (:,:) = 1.0_wp - frld(:,:) ! adjust ice fraction 1067 zseaicendg(:,:) = zofrld(:,:) - frld(:,:) ! find out actual sea ice nudge applied 1068 ! 1078 fr_i(:,:) = 1.0_wp - frld(:,:) ! adjust ice fraction 1079 1080 zseaicendg(:,:)=zofrld(:,:) - frld(:,:) ! find out actual sea ice nudge applied 1081 1069 1082 ! Nudge sea ice depth to bring it up to a required minimum depth 1083 1070 1084 WHERE( zseaicendg(:,:) > 0.0_wp .AND. hicif(:,:) < zhicifmin ) 1071 1085 zhicifinc(:,:) = (zhicifmin - hicif(:,:)) * zincwgt … … 1073 1087 zhicifinc(:,:) = 0.0_wp 1074 1088 END WHERE 1075 ! 1076 ! nudge ice depth 1077 hicif (:,:) = hicif (:,:) + zhicifinc(:,:) 1078 phicif(:,:) = phicif(:,:) 1079 ! 1080 ! seaice salinity balancing (to add) 1089 1090 ! nudge ice depth 1091 hicif(:,:)=hicif(:,:) + zhicifinc(:,:) 1092 phicif(:,:)=phicif(:,:) 1093 1094 ! seaice salinity balancing (to add) 1095 1081 1096 #endif 1082 1097 1083 1098 #if defined key_cice 1084 ! Sea-ice : CICE case. Pass ice increment tendency into CICE - is this correct? 1099 1100 ! Pass ice increment tendency into CICE - is this correct? 1085 1101 ndaice_da(:,:) = seaice_bkginc(:,:) / rdt 1102 1086 1103 #endif 1087 1104 IF ( .NOT. PRESENT(kindic) ) THEN … … 1092 1109 1093 1110 #if defined key_cice 1094 ! Sea-ice : CICE case. Zero ice increment tendency into CICE 1111 1112 ! Zero ice increment tendency into CICE 1095 1113 ndaice_da(:,:) = 0.0_wp 1114 1096 1115 #endif 1097 1116 1098 1117 ENDIF 1099 1118 1100 !#if defined definedkey_lim2 || defined key_cice1119 !#if defined key_lim2 || defined key_cice 1101 1120 ! 1102 1121 ! IF (ln_seaicebal ) THEN … … 1173 1192 !#endif 1174 1193 1194 1175 1195 ENDIF 1176 1196 1177 1197 END SUBROUTINE seaice_asm_inc 1178 1179 1198 !!====================================================================== 1180 1199 END MODULE asminc -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdy_oce.F90
r3651 r6736 28 28 INTEGER, POINTER, DIMENSION(:,:) :: nbmap 29 29 REAL , POINTER, DIMENSION(:,:) :: nbw 30 REAL , POINTER, DIMENSION(:,: ) :: nbd30 REAL , POINTER, DIMENSION(:,:,:) :: nbz 31 31 REAL , POINTER, DIMENSION(:) :: flagu 32 32 REAL , POINTER, DIMENSION(:) :: flagv … … 46 46 REAL, POINTER, DIMENSION(:) :: hsnif 47 47 #endif 48 END TYPE OBC_DATA 48 END TYPE OBC_DATA 49 49 50 50 !!---------------------------------------------------------------------- … … 74 74 INTEGER, DIMENSION(jp_bdy) :: nn_tra_dta !: = 0 use the initial state as bdy dta ; 75 75 !: = 1 read it in a NetCDF file 76 LOGICAL, DIMENSION(jp_bdy) :: ln_tra_dmp !: =T Tracer damping 77 LOGICAL, DIMENSION(jp_bdy) :: ln_dyn3d_dmp !: =T Baroclinic velocity damping 78 REAL, DIMENSION(jp_bdy) :: rn_time_dmp !: Damping time scale in days 79 76 INTEGER :: nb_jpk ! Number of levels in the bdy data (set < 0 if consistent with planned run) 80 77 #if defined key_lim2 81 78 INTEGER, DIMENSION(jp_bdy) :: nn_ice_lim2 ! Choice of boundary condition for sea ice variables … … 106 103 INTEGER, DIMENSION(jp_bdy) :: nn_dta !: =0 => *all* data is set to initial conditions 107 104 !: =1 => some data to be read in from data files 108 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET :: dta_global !: workspace for reading in global data arrays (unstr. bdy) 109 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET :: dta_global2 !: workspace for reading in global data arrays (struct. bdy) 105 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET :: dta_global !: workspace for reading in global data arrays 106 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET :: dta_global_1 !: workspace for reading in global data arrays 107 REAL(wp), ALLOCATABLE, DIMENSION(:,: ), TARGET :: dta_global_2 !: workspace for reading in global data arrays 110 108 TYPE(OBC_INDEX), DIMENSION(jp_bdy), TARGET :: idx_bdy !: bdy indices (local process) 111 109 TYPE(OBC_DATA) , DIMENSION(jp_bdy) :: dta_bdy !: bdy external data (local process) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90
r3851 r6736 11 11 !! 3.3 ! 2010-09 (D.Storkey) add ice boundary conditions 12 12 !! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge 13 !! 3.4 ! 2013-04 (J. Harle) add in option to read bdy data with 14 !! different vertical coordinates 13 15 !!---------------------------------------------------------------------- 14 16 #if defined key_bdy … … 32 34 USE ice_2 33 35 #endif 34 USE sbcapr35 36 36 37 IMPLICIT NONE … … 109 110 110 111 IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .eq. 0 ) THEN 111 ilen1(:) = nblen(:) 112 IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 113 ilen1(:) = nblen(:) 114 ELSE 115 ilen1(:) = nblenrim(:) 116 ENDIF 112 117 igrd = 1 113 118 DO ib = 1, ilen1(igrd) … … 131 136 132 137 IF( nn_dyn3d(ib_bdy) .gt. 0 .and. nn_dyn3d_dta(ib_bdy) .eq. 0 ) THEN 133 ilen1(:) = nblen(:) 138 IF( nn_dyn3d(ib_bdy) .eq. jp_frs ) THEN 139 ilen1(:) = nblen(:) 140 ELSE 141 ilen1(:) = nblenrim(:) 142 ENDIF 134 143 igrd = 2 135 144 DO ib = 1, ilen1(igrd) … … 151 160 152 161 IF( nn_tra(ib_bdy) .gt. 0 .and. nn_tra_dta(ib_bdy) .eq. 0 ) THEN 153 ilen1(:) = nblen(:) 162 IF( nn_tra(ib_bdy) .eq. jp_frs ) THEN 163 ilen1(:) = nblen(:) 164 ELSE 165 ilen1(:) = nblenrim(:) 166 ENDIF 154 167 igrd = 1 ! Everything is at T-points here 155 168 DO ib = 1, ilen1(igrd) … … 165 178 #if defined key_lim2 166 179 IF( nn_ice_lim2(ib_bdy) .gt. 0 .and. nn_ice_lim2_dta(ib_bdy) .eq. 0 ) THEN 167 ilen1(:) = nblen(:) 180 IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 181 ilen1(:) = nblen(:) 182 ELSE 183 ilen1(:) = nblenrim(:) 184 ENDIF 168 185 igrd = 1 ! Everything is at T-points here 169 186 DO ib = 1, ilen1(igrd) … … 192 209 IF( PRESENT(jit) ) THEN 193 210 ! Update barotropic boundary conditions only 194 ! jit is optional argument for fld_read and bdytide_update211 ! jit is optional argument for fld_read and tide_update 195 212 IF( nn_dyn2d(ib_bdy) .gt. 0 ) THEN 196 213 IF( nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays … … 199 216 dta_bdy(ib_bdy)%v2d(:) = 0.0 200 217 ENDIF 201 IF (nn_tra(ib_bdy).ne.4) THEN 202 IF( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ. 3 .OR. & 203 & (ln_full_vel_array(ib_bdy) .AND. nn_dyn3d_dta(ib_bdy).eq.1) )THEN 204 205 ! For the runoff case, no need to update the forcing (already done in the baroclinic part) 206 jend = nb_bdy_fld(ib_bdy) 207 IF ( nn_tra(ib_bdy) .GT. 0 .AND. nn_tra_dta(ib_bdy) .GE. 1 ) jend = jend - 2 208 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend), & 209 & kit=jit, kt_offset=time_offset ) 210 IF ( nn_tra(ib_bdy) .GT. 0 .AND. nn_tra_dta(ib_bdy) .GE. 1 ) jend = jend + 2 211 212 ! If full velocities in boundary data then split into barotropic and baroclinic data 213 IF( ln_full_vel_array(ib_bdy) .AND. & 214 & ( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ. 3 .OR. & 215 & nn_dyn3d_dta(ib_bdy) .EQ. 1 ) )THEN 216 217 igrd = 2 ! zonal velocity 218 dta_bdy(ib_bdy)%u2d(:) = 0.0 219 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 220 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 221 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 222 DO ik = 1, jpkm1 223 dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) & 224 & + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta_bdy(ib_bdy)%u3d(ib,ik) 225 END DO 226 dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) * hur(ii,ij) 227 DO ik = 1, jpkm1 228 dta_bdy(ib_bdy)%u3d(ib,ik) = dta_bdy(ib_bdy)%u3d(ib,ik) - dta_bdy(ib_bdy)%u2d(ib) 229 END DO 230 END DO 231 igrd = 3 ! meridional velocity 232 dta_bdy(ib_bdy)%v2d(:) = 0.0 233 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 234 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 235 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 236 DO ik = 1, jpkm1 237 dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) & 238 & + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta_bdy(ib_bdy)%v3d(ib,ik) 239 END DO 240 dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) * hvr(ii,ij) 241 DO ik = 1, jpkm1 242 dta_bdy(ib_bdy)%v3d(ib,ik) = dta_bdy(ib_bdy)%v3d(ib,ik) - dta_bdy(ib_bdy)%v2d(ib) 243 END DO 244 END DO 245 ENDIF 246 ENDIF 247 IF( nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 248 CALL bdytide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy), td=tides(ib_bdy), & 249 & jit=jit, time_offset=time_offset ) 250 ENDIF 218 IF( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) THEN ! update external data 219 jend = jstart + 2 220 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend), & 221 & jit=jit, time_offset=time_offset ) 251 222 ENDIF 223 IF( nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 224 CALL tide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy), td=tides(ib_bdy), & 225 & jit=jit, time_offset=time_offset ) 226 ENDIF 252 227 ENDIF 253 228 ELSE 254 IF (nn_tra(ib_bdy).eq.4) then ! runoff condition 255 jend = nb_bdy_fld(ib_bdy) 256 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), & 257 & map=nbmap_ptr(jstart:jend), kt_offset=time_offset ) 258 ! 259 igrd = 2 ! zonal velocity 260 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 261 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 262 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 263 dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) ) 229 IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 230 dta_bdy(ib_bdy)%ssh(:) = 0.0 231 dta_bdy(ib_bdy)%u2d(:) = 0.0 232 dta_bdy(ib_bdy)%v2d(:) = 0.0 233 ENDIF 234 IF( nb_bdy_fld(ib_bdy) .gt. 0 ) THEN ! update external data 235 jend = jstart + nb_bdy_fld(ib_bdy) - 1 236 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend), time_offset=time_offset,& 237 & jpk_1=nb_jpk ) 238 ENDIF 239 IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 240 CALL tide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy), td=tides(ib_bdy), time_offset=time_offset ) 241 ENDIF 242 ENDIF 243 jstart = jend+1 244 245 ! If full velocities in boundary data then split into barotropic and baroclinic data 246 ! (Note that we have already made sure that you can't use ln_full_vel = .true. at the same 247 ! time as the dynspg_ts option). 248 249 IF( ln_full_vel_array(ib_bdy) .and. & 250 & ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 .or. nn_dyn3d_dta(ib_bdy) .eq. 1 ) ) THEN 251 252 igrd = 2 ! zonal velocity 253 dta_bdy(ib_bdy)%u2d(:) = 0.0 254 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 255 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 256 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 257 DO ik = 1, jpkm1 258 dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) & 259 & + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta_bdy(ib_bdy)%u3d(ib,ik) 264 260 END DO 265 ! 266 igrd = 3 ! meridional velocity 267 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 268 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 269 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 270 dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) ) 261 dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) * hur(ii,ij) 262 DO ik = 1, jpkm1 263 dta_bdy(ib_bdy)%u3d(ib,ik) = dta_bdy(ib_bdy)%u3d(ib,ik) - dta_bdy(ib_bdy)%u2d(ib) 271 264 END DO 272 ELSE 273 IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 274 dta_bdy(ib_bdy)%ssh(:) = 0.0 275 dta_bdy(ib_bdy)%u2d(:) = 0.0 276 dta_bdy(ib_bdy)%v2d(:) = 0.0 277 ENDIF 278 IF( nb_bdy_fld(ib_bdy) .gt. 0 ) THEN ! update external data 279 jend = nb_bdy_fld(ib_bdy) 280 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), & 281 & map=nbmap_ptr(jstart:jend), kt_offset=time_offset ) 282 ENDIF 283 ! If full velocities in boundary data then split into barotropic and baroclinic data 284 IF( ln_full_vel_array(ib_bdy) .and. & 285 & ( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ. 3 .OR. & 286 & nn_dyn3d_dta(ib_bdy) .EQ. 1 ) ) THEN 287 igrd = 2 ! zonal velocity 288 dta_bdy(ib_bdy)%u2d(:) = 0.0 289 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 290 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 291 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 292 DO ik = 1, jpkm1 293 dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) & 294 & + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta_bdy(ib_bdy)%u3d(ib,ik) 295 END DO 296 dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) * hur(ii,ij) 297 DO ik = 1, jpkm1 298 dta_bdy(ib_bdy)%u3d(ib,ik) = dta_bdy(ib_bdy)%u3d(ib,ik) - dta_bdy(ib_bdy)%u2d(ib) 299 END DO 300 END DO 301 igrd = 3 ! meridional velocity 302 dta_bdy(ib_bdy)%v2d(:) = 0.0 303 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 304 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 305 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 306 DO ik = 1, jpkm1 307 dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) & 308 & + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta_bdy(ib_bdy)%v3d(ib,ik) 309 END DO 310 dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) * hvr(ii,ij) 311 DO ik = 1, jpkm1 312 dta_bdy(ib_bdy)%v3d(ib,ik) = dta_bdy(ib_bdy)%v3d(ib,ik) - dta_bdy(ib_bdy)%v2d(ib) 313 END DO 314 END DO 315 ENDIF 316 IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 317 CALL bdytide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy), & 318 & td=tides(ib_bdy), time_offset=time_offset ) 319 ENDIF 320 ENDIF 321 ENDIF 322 jstart = jend+1 265 END DO 266 267 igrd = 3 ! meridional velocity 268 dta_bdy(ib_bdy)%v2d(:) = 0.0 269 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 270 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 271 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 272 DO ik = 1, jpkm1 273 dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) & 274 & + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta_bdy(ib_bdy)%v3d(ib,ik) 275 END DO 276 dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) * hvr(ii,ij) 277 DO ik = 1, jpkm1 278 dta_bdy(ib_bdy)%v3d(ib,ik) = dta_bdy(ib_bdy)%v3d(ib,ik) - dta_bdy(ib_bdy)%v2d(ib) 279 END DO 280 END DO 281 282 ENDIF 283 323 284 END IF ! nn_dta(ib_bdy) = 1 324 285 END DO ! ib_bdy 325 326 IF ( ln_apr_obc ) THEN327 DO ib_bdy = 1, nb_bdy328 IF (nn_tra(ib_bdy).NE.4)THEN329 igrd = 1 ! meridional velocity330 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd)331 ii = idx_bdy(ib_bdy)%nbi(ib,igrd)332 ij = idx_bdy(ib_bdy)%nbj(ib,igrd)333 dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + ssh_ib(ii,ij)334 ENDDO335 ENDIF336 ENDDO337 ENDIF338 286 339 287 IF( nn_timing == 1 ) CALL timing_stop('bdy_dta') … … 381 329 IF( nn_timing == 1 ) CALL timing_start('bdy_dta_init') 382 330 383 IF(lwp) WRITE(numout,*)384 IF(lwp) WRITE(numout,*) 'bdy_dta_ini : initialization of data at the open boundaries'385 IF(lwp) WRITE(numout,*) '~~~~~~~~~~'386 IF(lwp) WRITE(numout,*) ''387 388 331 ! Set nn_dta 389 332 DO ib_bdy = 1, nb_bdy … … 417 360 ENDIF 418 361 #endif 419 IF(lwp) WRITE(numout,*) 'Maximum number of files to open =',nb_bdy_fld(ib_bdy)420 362 ENDDO 421 363 … … 469 411 ln_full_vel_array(ib_bdy) = ln_full_vel 470 412 413 IF( ln_full_vel_array(ib_bdy) .and. lk_dynspg_ts ) THEN 414 CALL ctl_stop( 'bdy_dta_init: ERROR, cannot specify full velocities in boundary data',& 415 & 'with dynspg_ts option' ) ; RETURN 416 ENDIF 417 471 418 nblen => idx_bdy(ib_bdy)%nblen 472 419 nblenrim => idx_bdy(ib_bdy)%nblenrim … … 476 423 IF( nn_dyn2d(ib_bdy) .gt. 0 .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) THEN 477 424 478 IF( nn_ tra(ib_bdy) .ne. 4 ) THEN ! runoff condition : no ssh reading425 IF( nn_dyn2d(ib_bdy) .ne. jp_frs ) THEN 479 426 jfld = jfld + 1 480 427 blf_i(jfld) = bn_ssh 481 428 ibdy(jfld) = ib_bdy 482 429 igrid(jfld) = 1 483 ilen1(jfld) = nblen (igrid(jfld))430 ilen1(jfld) = nblenrim(igrid(jfld)) 484 431 ilen3(jfld) = 1 485 432 ENDIF 486 433 487 434 IF( .not. ln_full_vel_array(ib_bdy) ) THEN 435 488 436 jfld = jfld + 1 489 437 blf_i(jfld) = bn_u2d 490 438 ibdy(jfld) = ib_bdy 491 439 igrid(jfld) = 2 492 ilen1(jfld) = nblen(igrid(jfld)) 440 IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 441 ilen1(jfld) = nblen(igrid(jfld)) 442 ELSE 443 ilen1(jfld) = nblenrim(igrid(jfld)) 444 ENDIF 493 445 ilen3(jfld) = 1 494 446 … … 497 449 ibdy(jfld) = ib_bdy 498 450 igrid(jfld) = 3 499 ilen1(jfld) = nblen(igrid(jfld)) 451 IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 452 ilen1(jfld) = nblen(igrid(jfld)) 453 ELSE 454 ilen1(jfld) = nblenrim(igrid(jfld)) 455 ENDIF 500 456 ilen3(jfld) = 1 457 501 458 ENDIF 502 459 … … 512 469 ibdy(jfld) = ib_bdy 513 470 igrid(jfld) = 2 514 ilen1(jfld) = nblen(igrid(jfld)) 471 IF( nn_dyn3d(ib_bdy) .eq. jp_frs ) THEN 472 ilen1(jfld) = nblen(igrid(jfld)) 473 ELSE 474 ilen1(jfld) = nblenrim(igrid(jfld)) 475 ENDIF 515 476 ilen3(jfld) = jpk 516 477 … … 519 480 ibdy(jfld) = ib_bdy 520 481 igrid(jfld) = 3 521 ilen1(jfld) = nblen(igrid(jfld)) 482 IF( nn_dyn3d(ib_bdy) .eq. jp_frs ) THEN 483 ilen1(jfld) = nblen(igrid(jfld)) 484 ELSE 485 ilen1(jfld) = nblenrim(igrid(jfld)) 486 ENDIF 522 487 ilen3(jfld) = jpk 523 488 … … 531 496 ibdy(jfld) = ib_bdy 532 497 igrid(jfld) = 1 533 ilen1(jfld) = nblen(igrid(jfld)) 498 IF( nn_tra(ib_bdy) .eq. jp_frs ) THEN 499 ilen1(jfld) = nblen(igrid(jfld)) 500 ELSE 501 ilen1(jfld) = nblenrim(igrid(jfld)) 502 ENDIF 534 503 ilen3(jfld) = jpk 535 504 … … 538 507 ibdy(jfld) = ib_bdy 539 508 igrid(jfld) = 1 540 ilen1(jfld) = nblen(igrid(jfld)) 509 IF( nn_tra(ib_bdy) .eq. jp_frs ) THEN 510 ilen1(jfld) = nblen(igrid(jfld)) 511 ELSE 512 ilen1(jfld) = nblenrim(igrid(jfld)) 513 ENDIF 541 514 ilen3(jfld) = jpk 542 515 … … 551 524 ibdy(jfld) = ib_bdy 552 525 igrid(jfld) = 1 553 ilen1(jfld) = nblen(igrid(jfld)) 526 IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 527 ilen1(jfld) = nblen(igrid(jfld)) 528 ELSE 529 ilen1(jfld) = nblenrim(igrid(jfld)) 530 ENDIF 554 531 ilen3(jfld) = 1 555 532 … … 558 535 ibdy(jfld) = ib_bdy 559 536 igrid(jfld) = 1 560 ilen1(jfld) = nblen(igrid(jfld)) 537 IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 538 ilen1(jfld) = nblen(igrid(jfld)) 539 ELSE 540 ilen1(jfld) = nblenrim(igrid(jfld)) 541 ENDIF 561 542 ilen3(jfld) = 1 562 543 … … 565 546 ibdy(jfld) = ib_bdy 566 547 igrid(jfld) = 1 567 ilen1(jfld) = nblen(igrid(jfld)) 548 IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 549 ilen1(jfld) = nblen(igrid(jfld)) 550 ELSE 551 ilen1(jfld) = nblenrim(igrid(jfld)) 552 ENDIF 568 553 ilen3(jfld) = 1 569 554 … … 584 569 ENDDO ! ib_bdy 585 570 571 586 572 DO jfld = 1, nb_bdy_fld_sum 587 573 ALLOCATE( bf(jfld)%fnow(ilen1(jfld),1,ilen3(jfld)) ) … … 594 580 jstart = 1 595 581 DO ib_bdy = 1, nb_bdy 596 jend = nb_bdy_fld(ib_bdy)582 jend = jstart + nb_bdy_fld(ib_bdy) - 1 597 583 CALL fld_fill( bf(jstart:jend), blf_i(jstart:jend), cn_dir_array(ib_bdy), 'bdy_dta', & 598 584 & 'open boundary conditions', 'nambdy_dta' ) … … 613 599 IF (nn_dyn2d(ib_bdy) .gt. 0) THEN 614 600 IF( nn_dyn2d_dta(ib_bdy) .eq. 0 .or. nn_dyn2d_dta(ib_bdy) .eq. 2 .or. ln_full_vel_array(ib_bdy) ) THEN 615 ilen0(1:3) = nblen(1:3) 601 IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 602 ilen0(1:3) = nblen(1:3) 603 ELSE 604 ilen0(1:3) = nblenrim(1:3) 605 ENDIF 606 ALLOCATE( dta_bdy(ib_bdy)%ssh(ilen0(1)) ) 616 607 ALLOCATE( dta_bdy(ib_bdy)%u2d(ilen0(2)) ) 617 608 ALLOCATE( dta_bdy(ib_bdy)%v2d(ilen0(3)) ) 618 IF (nn_dyn2d_dta(ib_bdy).eq.1.or.nn_dyn2d_dta(ib_bdy).eq.3) THEN619 jfld = jfld + 1620 dta_bdy(ib_bdy)%ssh => bf(jfld)%fnow(:,1,1)621 ELSE622 ALLOCATE( dta_bdy(ib_bdy)%ssh(nblen(1)) )623 ENDIF624 609 ELSE 625 610 IF( nn_dyn2d(ib_bdy) .ne. jp_frs ) THEN … … 635 620 636 621 IF ( nn_dyn3d(ib_bdy) .gt. 0 .and. nn_dyn3d_dta(ib_bdy) .eq. 0 ) THEN 637 ilen0(1:3) = nblen(1:3) 622 IF( nn_dyn3d(ib_bdy) .eq. jp_frs ) THEN 623 ilen0(1:3) = nblen(1:3) 624 ELSE 625 ilen0(1:3) = nblenrim(1:3) 626 ENDIF 638 627 ALLOCATE( dta_bdy(ib_bdy)%u3d(ilen0(2),jpk) ) 639 628 ALLOCATE( dta_bdy(ib_bdy)%v3d(ilen0(3),jpk) ) … … 650 639 IF (nn_tra(ib_bdy) .gt. 0) THEN 651 640 IF( nn_tra_dta(ib_bdy) .eq. 0 ) THEN 652 ilen0(1:3) = nblen(1:3) 641 IF( nn_tra(ib_bdy) .eq. jp_frs ) THEN 642 ilen0(1:3) = nblen(1:3) 643 ELSE 644 ilen0(1:3) = nblenrim(1:3) 645 ENDIF 653 646 ALLOCATE( dta_bdy(ib_bdy)%tem(ilen0(1),jpk) ) 654 647 ALLOCATE( dta_bdy(ib_bdy)%sal(ilen0(1),jpk) ) … … 664 657 IF (nn_ice_lim2(ib_bdy) .gt. 0) THEN 665 658 IF( nn_ice_lim2_dta(ib_bdy) .eq. 0 ) THEN 666 ilen0(1:3) = nblen(1:3) 659 IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 660 ilen0(1:3) = nblen(1:3) 661 ELSE 662 ilen0(1:3) = nblenrim(1:3) 663 ENDIF 667 664 ALLOCATE( dta_bdy(ib_bdy)%frld(ilen0(1)) ) 668 665 ALLOCATE( dta_bdy(ib_bdy)%hicif(ilen0(1)) ) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90
r3680 r6736 5 5 !!====================================================================== 6 6 !! History : 3.4 ! 2011 (D. Storkey) new module as part of BDY rewrite 7 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Optimization of BDY communications8 7 !!---------------------------------------------------------------------- 9 8 #if defined key_bdy … … 52 51 CYCLE 53 52 CASE(jp_frs) 54 CALL bdy_dyn2d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy) , ib_bdy)53 CALL bdy_dyn2d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy) ) 55 54 CASE(jp_flather) 56 CALL bdy_dyn2d_fla( idx_bdy(ib_bdy), dta_bdy(ib_bdy) , ib_bdy)55 CALL bdy_dyn2d_fla( idx_bdy(ib_bdy), dta_bdy(ib_bdy) ) 57 56 CASE DEFAULT 58 57 CALL ctl_stop( 'bdy_dyn2d : unrecognised option for open boundaries for barotropic variables' ) … … 62 61 END SUBROUTINE bdy_dyn2d 63 62 64 SUBROUTINE bdy_dyn2d_frs( idx, dta , ib_bdy)63 SUBROUTINE bdy_dyn2d_frs( idx, dta ) 65 64 !!---------------------------------------------------------------------- 66 65 !! *** SUBROUTINE bdy_dyn2d_frs *** … … 75 74 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 76 75 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 77 INTEGER, INTENT(in) :: ib_bdy ! BDY set index78 76 !! 79 77 INTEGER :: jb, jk ! dummy loop indices … … 99 97 pv2d(ii,ij) = ( pv2d(ii,ij) + zwgt * ( dta%v2d(jb) - pv2d(ii,ij) ) ) * vmask(ii,ij,1) 100 98 END DO 101 CALL lbc_ bdy_lnk( pu2d, 'U', -1., ib_bdy)102 CALL lbc_ bdy_lnk( pv2d, 'V', -1., ib_bdy) ! Boundary points should be updated99 CALL lbc_lnk( pu2d, 'U', -1. ) 100 CALL lbc_lnk( pv2d, 'V', -1. ) ! Boundary points should be updated 103 101 ! 104 102 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_frs') … … 108 106 109 107 110 SUBROUTINE bdy_dyn2d_fla( idx, dta , ib_bdy)108 SUBROUTINE bdy_dyn2d_fla( idx, dta ) 111 109 !!---------------------------------------------------------------------- 112 110 !! *** SUBROUTINE bdy_dyn2d_fla *** … … 129 127 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 130 128 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 131 INTEGER, INTENT(in) :: ib_bdy ! BDY set index132 129 133 130 INTEGER :: jb, igrd ! dummy loop indices … … 180 177 pv2d(ii,ij) = zforc + zcorr * vmask(ii,ij,1) 181 178 END DO 182 CALL lbc_ bdy_lnk( pu2d, 'U', -1., ib_bdy) ! Boundary points should be updated183 CALL lbc_ bdy_lnk( pv2d, 'V', -1., ib_bdy) !179 CALL lbc_lnk( pu2d, 'U', -1. ) ! Boundary points should be updated 180 CALL lbc_lnk( pv2d, 'V', -1. ) ! 184 181 ! 185 182 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_fla') -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn3d.F90
r3703 r6736 5 5 !!====================================================================== 6 6 !! History : 3.4 ! 2011 (D. Storkey) new module as part of BDY rewrite 7 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Optimization of BDY communications8 7 !!---------------------------------------------------------------------- 9 8 #if defined key_bdy … … 15 14 !!---------------------------------------------------------------------- 16 15 USE timing ! Timing 17 USE wrk_nemo ! Memory Allocation18 16 USE oce ! ocean dynamics and tracers 19 17 USE dom_oce ! ocean space and time domain … … 21 19 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 22 20 USE in_out_manager ! 23 Use phycst24 21 25 22 IMPLICIT NONE … … 27 24 28 25 PUBLIC bdy_dyn3d ! routine called by bdy_dyn 29 PUBLIC bdy_dyn3d_dmp ! routine called by step30 26 31 !! * Substitutions32 # include "domzgr_substitute.h90"33 27 !!---------------------------------------------------------------------- 34 28 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 60 54 CYCLE 61 55 CASE(jp_frs) 62 CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 63 CASE(2) 64 CALL bdy_dyn3d_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 65 CASE(3) 66 CALL bdy_dyn3d_zro( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 56 CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 67 57 CASE DEFAULT 68 58 CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) … … 72 62 END SUBROUTINE bdy_dyn3d 73 63 74 SUBROUTINE bdy_dyn3d_spe( idx, dta, kt , ib_bdy ) 75 !!---------------------------------------------------------------------- 76 !! *** SUBROUTINE bdy_dyn3d_spe *** 77 !! 78 !! ** Purpose : - Apply a specified value for baroclinic velocities 79 !! at open boundaries. 80 !! 81 !!---------------------------------------------------------------------- 82 INTEGER :: kt 83 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 84 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 85 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 86 !! 87 INTEGER :: jb, jk ! dummy loop indices 88 INTEGER :: ii, ij, igrd ! local integers 89 REAL(wp) :: zwgt ! boundary weight 90 !!---------------------------------------------------------------------- 91 ! 92 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_spe') 93 ! 94 igrd = 2 ! Relaxation of zonal velocity 95 DO jb = 1, idx%nblenrim(igrd) 96 DO jk = 1, jpkm1 97 ii = idx%nbi(jb,igrd) 98 ij = idx%nbj(jb,igrd) 99 ua(ii,ij,jk) = dta%u3d(jb,jk) * umask(ii,ij,jk) 100 END DO 101 END DO 102 ! 103 igrd = 3 ! Relaxation of meridional velocity 104 DO jb = 1, idx%nblenrim(igrd) 105 DO jk = 1, jpkm1 106 ii = idx%nbi(jb,igrd) 107 ij = idx%nbj(jb,igrd) 108 va(ii,ij,jk) = dta%v3d(jb,jk) * vmask(ii,ij,jk) 109 END DO 110 END DO 111 CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy ) ; CALL lbc_bdy_lnk( va, 'V', -1.,ib_bdy ) ! Boundary points should be updated 112 ! 113 IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 114 115 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_spe') 116 117 END SUBROUTINE bdy_dyn3d_spe 118 119 SUBROUTINE bdy_dyn3d_zro( idx, dta, kt, ib_bdy ) 120 !!---------------------------------------------------------------------- 121 !! *** SUBROUTINE bdy_dyn3d_zro *** 122 !! 123 !! ** Purpose : - baroclinic velocities = 0. at open boundaries. 124 !! 125 !!---------------------------------------------------------------------- 126 INTEGER :: kt 127 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 128 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 129 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 130 !! 131 INTEGER :: ib, ik ! dummy loop indices 132 INTEGER :: ii, ij, igrd, zcoef ! local integers 133 REAL(wp) :: zwgt ! boundary weight 134 !!---------------------------------------------------------------------- 135 ! 136 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_zro') 137 ! 138 igrd = 2 ! Everything is at T-points here 139 DO ib = 1, idx%nblenrim(igrd) 140 ii = idx%nbi(ib,igrd) 141 ij = idx%nbj(ib,igrd) 142 DO ik = 1, jpkm1 143 ua(ii,ij,ik) = 0._wp 144 END DO 145 END DO 146 147 igrd = 3 ! Everything is at T-points here 148 DO ib = 1, idx%nblenrim(igrd) 149 ii = idx%nbi(ib,igrd) 150 ij = idx%nbj(ib,igrd) 151 DO ik = 1, jpkm1 152 va(ii,ij,ik) = 0._wp 153 END DO 154 END DO 155 ! 156 CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy ) ; CALL lbc_bdy_lnk( va, 'V', -1.,ib_bdy ) ! Boundary points should be updated 157 ! 158 IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 159 160 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_zro') 161 162 END SUBROUTINE bdy_dyn3d_zro 163 164 SUBROUTINE bdy_dyn3d_frs( idx, dta, kt, ib_bdy ) 64 SUBROUTINE bdy_dyn3d_frs( idx, dta, kt ) 165 65 !!---------------------------------------------------------------------- 166 66 !! *** SUBROUTINE bdy_dyn3d_frs *** … … 176 76 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 177 77 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 178 INTEGER, INTENT(in) :: ib_bdy ! BDY set index179 78 !! 180 79 INTEGER :: jb, jk ! dummy loop indices … … 204 103 END DO 205 104 END DO 206 CALL lbc_ bdy_lnk( ua, 'U', -1., ib_bdy ) ; CALL lbc_bdy_lnk( va, 'V', -1.,ib_bdy) ! Boundary points should be updated105 CALL lbc_lnk( ua, 'U', -1. ) ; CALL lbc_lnk( va, 'V', -1. ) ! Boundary points should be updated 207 106 ! 208 107 IF( kt .eq. nit000 ) CLOSE( unit = 102 ) … … 212 111 END SUBROUTINE bdy_dyn3d_frs 213 112 214 SUBROUTINE bdy_dyn3d_dmp( kt )215 !!----------------------------------------------------------------------216 !! *** SUBROUTINE bdy_dyn3d_dmp ***217 !!218 !! ** Purpose : Apply damping for baroclinic velocities at open boundaries.219 !!220 !!----------------------------------------------------------------------221 INTEGER :: kt222 !!223 INTEGER :: jb, jk ! dummy loop indices224 INTEGER :: ii, ij, igrd ! local integers225 REAL(wp) :: zwgt ! boundary weight226 INTEGER :: ib_bdy ! loop index227 !!----------------------------------------------------------------------228 !229 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_dmp')230 !231 !-------------------------------------------------------232 ! Remove barotropic part from before velocity233 !-------------------------------------------------------234 CALL wrk_alloc(jpi,jpj,pu2d,pv2d)235 236 pu2d(:,:) = 0.e0237 pv2d(:,:) = 0.e0238 239 DO jk = 1, jpkm1240 #if defined key_vvl241 pu2d(:,:) = pu2d(:,:) + fse3u_b(:,:,jk)* ub(:,:,jk) *umask(:,:,jk)242 pv2d(:,:) = pv2d(:,:) + fse3v_b(:,:,jk)* vb(:,:,jk) *vmask(:,:,jk)243 #else244 pu2d(:,:) = pu2d(:,:) + fse3u_0(:,:,jk) * ub(:,:,jk) * umask(:,:,jk)245 pv2d(:,:) = pv2d(:,:) + fse3v_0(:,:,jk) * vb(:,:,jk) * vmask(:,:,jk)246 #endif247 END DO248 249 IF( lk_vvl ) THEN250 pu2d(:,:) = pu2d(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1._wp - umask(:,:,1) )251 pv2d(:,:) = pv2d(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1._wp - vmask(:,:,1) )252 ELSE253 pu2d(:,:) = pv2d(:,:) * hur(:,:)254 pv2d(:,:) = pu2d(:,:) * hvr(:,:)255 ENDIF256 257 DO ib_bdy=1, nb_bdy258 IF ( ln_dyn3d_dmp(ib_bdy).and.nn_dyn3d(ib_bdy).gt.0 ) THEN259 igrd = 2 ! Relaxation of zonal velocity260 DO jb = 1, idx_bdy(ib_bdy)%nblen(igrd)261 ii = idx_bdy(ib_bdy)%nbi(jb,igrd)262 ij = idx_bdy(ib_bdy)%nbj(jb,igrd)263 zwgt = idx_bdy(ib_bdy)%nbd(jb,igrd)264 DO jk = 1, jpkm1265 ua(ii,ij,jk) = ( ua(ii,ij,jk) + zwgt * ( dta_bdy(ib_bdy)%u3d(jb,jk) - &266 ub(ii,ij,jk) + pu2d(ii,ij)) ) * umask(ii,ij,jk)267 END DO268 END DO269 !270 igrd = 3 ! Relaxation of meridional velocity271 DO jb = 1, idx_bdy(ib_bdy)%nblen(igrd)272 ii = idx_bdy(ib_bdy)%nbi(jb,igrd)273 ij = idx_bdy(ib_bdy)%nbj(jb,igrd)274 zwgt = idx_bdy(ib_bdy)%nbd(jb,igrd)275 DO jk = 1, jpkm1276 va(ii,ij,jk) = ( va(ii,ij,jk) + zwgt * ( dta_bdy(ib_bdy)%v3d(jb,jk) - &277 vb(ii,ij,jk) + pv2d(ii,ij)) ) * vmask(ii,ij,jk)278 END DO279 END DO280 ENDIF281 ENDDO282 !283 CALL wrk_dealloc(jpi,jpj,pu2d,pv2d)284 !285 CALL lbc_lnk( ua, 'U', -1. ) ; CALL lbc_lnk( va, 'V', -1. ) ! Boundary points should be updated286 !287 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_dmp')288 289 END SUBROUTINE bdy_dyn3d_dmp290 113 291 114 #else … … 295 118 CONTAINS 296 119 SUBROUTINE bdy_dyn3d( kt ) ! Empty routine 297 WRITE(*,*) 'bdy_dyn 3d: You should not have seen this print! error?', kt120 WRITE(*,*) 'bdy_dyn_frs: You should not have seen this print! error?', kt 298 121 END SUBROUTINE bdy_dyn3d 299 300 SUBROUTINE bdy_dyn3d_dmp( kt ) ! Empty routine301 WRITE(*,*) 'bdy_dyn3d_dmp: You should not have seen this print! error?', kt302 END SUBROUTINE bdy_dyn3d_dmp303 304 122 #endif 305 123 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdyice_lim2.F90
r3680 r6736 6 6 !! History : 3.3 ! 2010-09 (D. Storkey) Original code 7 7 !! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge 8 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Optimization of BDY communications9 8 !!---------------------------------------------------------------------- 10 9 #if defined key_bdy && defined key_lim2 … … 54 53 CYCLE 55 54 CASE(jp_frs) 56 CALL bdy_ice_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy) , ib_bdy)55 CALL bdy_ice_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy) ) 57 56 CASE DEFAULT 58 57 CALL ctl_stop( 'bdy_ice_lim_2 : unrecognised option for open boundaries for ice fields' ) … … 62 61 END SUBROUTINE bdy_ice_lim_2 63 62 64 SUBROUTINE bdy_ice_frs( idx, dta , ib_bdy)63 SUBROUTINE bdy_ice_frs( idx, dta ) 65 64 !!------------------------------------------------------------------------------ 66 65 !! *** SUBROUTINE bdy_ice_frs *** … … 74 73 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 75 74 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 76 INTEGER, INTENT(in) :: ib_bdy ! BDY set index77 75 !! 78 INTEGER :: jb, j k, jgrd ! dummy loop indices76 INTEGER :: jb, jgrd ! dummy loop indices 79 77 INTEGER :: ii, ij ! local scalar 80 78 REAL(wp) :: zwgt, zwgt1 ! local scalar … … 86 84 ! 87 85 DO jb = 1, idx%nblen(jgrd) 88 DO jk = 1, jpkm189 86 ii = idx%nbi(jb,jgrd) 90 87 ij = idx%nbj(jb,jgrd) 91 88 zwgt = idx%nbw(jb,jgrd) 92 89 zwgt1 = 1.e0 - idx%nbw(jb,jgrd) 90 #if defined key_lim2_iceconc 91 frld (ii,ij) = ( frld (ii,ij) * zwgt1 + ( 1._wp - dta%frld (jb) ) * zwgt ) * tmask(ii,ij,1) ! Leads fraction from ice fraction 92 #else 93 93 frld (ii,ij) = ( frld (ii,ij) * zwgt1 + dta%frld (jb) * zwgt ) * tmask(ii,ij,1) ! Leads fraction 94 #endif 94 95 hicif(ii,ij) = ( hicif(ii,ij) * zwgt1 + dta%hicif(jb) * zwgt ) * tmask(ii,ij,1) ! Ice depth 95 96 hsnif(ii,ij) = ( hsnif(ii,ij) * zwgt1 + dta%hsnif(jb) * zwgt ) * tmask(ii,ij,1) ! Snow depth 96 END DO97 97 END DO 98 CALL lbc_ bdy_lnk( frld, 'T', 1., ib_bdy) ! lateral boundary conditions99 CALL lbc_ bdy_lnk( hicif, 'T', 1., ib_bdy ) ; CALL lbc_bdy_lnk( hsnif, 'T', 1., ib_bdy)98 CALL lbc_lnk( frld, 'T', 1. ) ! lateral boundary conditions 99 CALL lbc_lnk( hicif, 'T', 1. ) ; CALL lbc_lnk( hsnif, 'T', 1. ) 100 100 ! 101 101 IF( nn_timing == 1 ) CALL timing_stop('bdy_ice_frs') -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90
r3703 r6736 11 11 !! 3.3 ! 2010-09 (D.Storkey) add ice boundary conditions 12 12 !! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge 13 !! 3.4 ! 2012 (J. Chanut) straight open boundary case update14 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Updates for the15 !! optimization of BDY communications16 13 !!---------------------------------------------------------------------- 17 14 #if defined key_bdy … … 29 26 USE lib_mpp ! for mpp_sum 30 27 USE iom ! I/O 31 USE sbctide, ONLY: lk_tide ! Tidal forcing or not 32 USE phycst, ONLY: rday 33 34 IMPLICIT NONE 28 29 IMPLICIT NONE 35 30 PRIVATE 36 31 37 32 PUBLIC bdy_init ! routine called in nemo_init 38 33 39 INTEGER, PARAMETER :: jp_nseg = 10040 INTEGER, PARAMETER :: nrimmax = 20 ! maximum rimwidth in structured41 ! open boundary data files42 ! Straight open boundary segment parameters:43 INTEGER :: nbdysege, nbdysegw, nbdysegn, nbdysegs44 INTEGER, DIMENSION(jp_nseg) :: jpieob, jpjedt, jpjeft, npckge45 INTEGER, DIMENSION(jp_nseg) :: jpiwob, jpjwdt, jpjwft, npckgw46 INTEGER, DIMENSION(jp_nseg) :: jpjnob, jpindt, jpinft, npckgn47 INTEGER, DIMENSION(jp_nseg) :: jpjsob, jpisdt, jpisft, npckgs48 34 !!---------------------------------------------------------------------- 49 35 !! NEMO/OPA 4.0 , NEMO Consortium (2011) … … 67 53 ! namelist variables 68 54 !------------------- 69 CHARACTER(LEN=80),DIMENSION(jpbgrd) :: clfile 70 CHARACTER(LEN=1) :: ctypebdy 71 INTEGER :: nbdyind, nbdybeg, nbdyend 55 INTEGER, PARAMETER :: jp_nseg = 100 56 INTEGER :: nbdysege, nbdysegw, nbdysegn, nbdysegs 57 INTEGER, DIMENSION(jp_nseg) :: jpieob, jpjedt, jpjeft 58 INTEGER, DIMENSION(jp_nseg) :: jpiwob, jpjwdt, jpjwft 59 INTEGER, DIMENSION(jp_nseg) :: jpjnob, jpindt, jpinft 60 INTEGER, DIMENSION(jp_nseg) :: jpjsob, jpisdt, jpisft 72 61 73 62 ! local variables … … 77 66 INTEGER :: iw, ie, is, in, inum, id_dummy ! - - 78 67 INTEGER :: igrd_start, igrd_end, jpbdta ! - - 79 INTEGER :: jpbdtau, jpbdtas ! - -80 INTEGER :: ib_bdy1, ib_bdy2, ib1, ib2 ! - -81 68 INTEGER, POINTER :: nbi, nbj, nbr ! short cuts 82 69 REAL , POINTER :: flagu, flagv ! - - 83 70 REAL(wp) :: zefl, zwfl, znfl, zsfl ! local scalars 84 INTEGER, DIMENSION (2) 71 INTEGER, DIMENSION (2) :: kdimsz 85 72 INTEGER, DIMENSION(jpbgrd,jp_bdy) :: nblendta ! Length of index arrays 86 73 INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: nbidta, nbjdta ! Index arrays: i and j indices of bdy dta 87 74 INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: nbrdta ! Discrete distance from rim points 88 CHARACTER(LEN=1),DIMENSION(jpbgrd) :: cgrid 89 INTEGER :: com_east, com_west, com_south, com_north ! Flags for boundaries sending 90 INTEGER :: com_east_b, com_west_b, com_south_b, com_north_b ! Flags for boundaries receiving 91 INTEGER :: iw_b(4), ie_b(4), is_b(4), in_b(4) ! Arrays for neighbours coordinates 92 75 CHARACTER(LEN=80),DIMENSION(jpbgrd) :: clfile 76 CHARACTER(LEN=1),DIMENSION(jpbgrd) :: cgrid 93 77 !! 94 78 NAMELIST/nambdy/ nb_bdy, ln_coords_file, cn_coords_file, & 95 79 & ln_mask_file, cn_mask_file, nn_dyn2d, nn_dyn2d_dta, & 96 & nn_dyn3d, nn_dyn3d_dta, nn_tra, nn_tra_dta, & 97 & ln_tra_dmp, ln_dyn3d_dmp, rn_time_dmp, & 80 & nn_dyn3d, nn_dyn3d_dta, nn_tra, nn_tra_dta, nb_jpk, & 98 81 #if defined key_lim2 99 82 & nn_ice_lim2, nn_ice_lim2_dta, & … … 101 84 & ln_vol, nn_volctl, nn_rimwidth 102 85 !! 103 NAMELIST/nambdy_index/ ctypebdy, nbdyind, nbdybeg, nbdyend 86 NAMELIST/nambdy_index/ nbdysege, jpieob, jpjedt, jpjeft, & 87 nbdysegw, jpiwob, jpjwdt, jpjwft, & 88 nbdysegn, jpjnob, jpindt, jpinft, & 89 nbdysegs, jpjsob, jpisdt, jpisft 104 90 105 91 !!---------------------------------------------------------------------- … … 118 104 119 105 cgrid= (/'t','u','v'/) 120 106 121 107 ! ----------------------------------------- 122 108 ! Initialise and read namelist parameters … … 134 120 nn_tra(:) = 0 135 121 nn_tra_dta(:) = -1 ! uninitialised flag 136 ln_tra_dmp(:) = .false. 137 ln_dyn3d_dmp(:) = .false. 138 rn_time_dmp(:) = 1. 122 nb_jpk = -1 139 123 #if defined key_lim2 140 124 nn_ice_lim2(:) = 0 … … 151 135 ! Check and write out namelist parameters 152 136 ! ----------------------------------------- 137 153 138 ! ! control prints 154 139 IF(lwp) WRITE(numout,*) ' nambdy' … … 173 158 IF(lwp) WRITE(numout,*) 'Boundary conditions for barotropic solution: ' 174 159 SELECT CASE( nn_dyn2d(ib_bdy) ) 175 CASE( jp_none); IF(lwp) WRITE(numout,*) ' no open boundary condition'176 CASE( jp_frs); IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme'177 CASE( jp_flather) ; IF(lwp) WRITE(numout,*) ' Flather radiation condition'160 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 161 CASE( 1 ) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 162 CASE( 2 ) ; IF(lwp) WRITE(numout,*) ' Flather radiation condition' 178 163 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for nn_dyn2d' ) 179 164 END SELECT … … 186 171 CASE DEFAULT ; CALL ctl_stop( 'nn_dyn2d_dta must be between 0 and 3' ) 187 172 END SELECT 188 IF (( nn_dyn2d_dta(ib_bdy) .ge. 2 ).AND.(.NOT.lk_tide)) THEN189 CALL ctl_stop( 'You must activate key_tide to add tidal forcing at open boundaries' )190 ENDIF191 173 ENDIF 192 174 IF(lwp) WRITE(numout,*) … … 194 176 IF(lwp) WRITE(numout,*) 'Boundary conditions for baroclinic velocities: ' 195 177 SELECT CASE( nn_dyn3d(ib_bdy) ) 196 CASE(jp_none) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 197 CASE(jp_frs) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 198 CASE( 2 ) ; IF(lwp) WRITE(numout,*) ' Specified value' 199 CASE( 3 ) ; IF(lwp) WRITE(numout,*) ' Zero baroclinic velocities (runoff case)' 178 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 179 CASE( 1 ) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 200 180 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for nn_dyn3d' ) 201 181 END SELECT … … 207 187 END SELECT 208 188 ENDIF 209 210 IF ( ln_dyn3d_dmp(ib_bdy) ) THEN211 IF ( nn_dyn3d(ib_bdy).EQ.0 ) THEN212 IF(lwp) WRITE(numout,*) 'No open boundary condition for baroclinic velocities: ln_dyn3d_dmp is set to .false.'213 ln_dyn3d_dmp(ib_bdy)=.false.214 ELSEIF ( nn_dyn3d(ib_bdy).EQ.1 ) THEN215 CALL ctl_stop( 'Use FRS OR relaxation' )216 ELSE217 IF(lwp) WRITE(numout,*) ' + baroclinic velocities relaxation zone'218 IF(lwp) WRITE(numout,*) ' Damping time scale: ',rn_time_dmp(ib_bdy),' days'219 IF((lwp).AND.rn_time_dmp(ib_bdy)<0) CALL ctl_stop( 'Time scale must be positive' )220 ENDIF221 ELSE222 IF(lwp) WRITE(numout,*) ' NO relaxation on baroclinic velocities'223 ENDIF224 189 IF(lwp) WRITE(numout,*) 225 190 226 191 IF(lwp) WRITE(numout,*) 'Boundary conditions for temperature and salinity: ' 227 192 SELECT CASE( nn_tra(ib_bdy) ) 228 CASE(jp_none) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 229 CASE(jp_frs) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 230 CASE( 2 ) ; IF(lwp) WRITE(numout,*) ' Specified value' 231 CASE( 3 ) ; IF(lwp) WRITE(numout,*) ' Neumann conditions' 232 CASE( 4 ) ; IF(lwp) WRITE(numout,*) ' Runoff conditions : Neumann for T and specified to 0.1 for salinity' 193 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 194 CASE( 1 ) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 233 195 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for nn_tra' ) 234 196 END SELECT … … 239 201 CASE DEFAULT ; CALL ctl_stop( 'nn_tra_dta must be 0 or 1' ) 240 202 END SELECT 241 ENDIF242 243 IF ( ln_tra_dmp(ib_bdy) ) THEN244 IF ( nn_tra(ib_bdy).EQ.0 ) THEN245 IF(lwp) WRITE(numout,*) 'No open boundary condition for tracers: ln_tra_dmp is set to .false.'246 ln_tra_dmp(ib_bdy)=.false.247 ELSEIF ( nn_tra(ib_bdy).EQ.1 ) THEN248 CALL ctl_stop( 'Use FRS OR relaxation' )249 ELSE250 IF(lwp) WRITE(numout,*) ' + T/S relaxation zone'251 IF(lwp) WRITE(numout,*) ' Damping time scale: ',rn_time_dmp(ib_bdy),' days'252 IF((lwp).AND.rn_time_dmp(ib_bdy)<0) CALL ctl_stop( 'Time scale must be positive' )253 ENDIF254 ELSE255 IF(lwp) WRITE(numout,*) ' NO T/S relaxation'256 203 ENDIF 257 204 IF(lwp) WRITE(numout,*) … … 274 221 #endif 275 222 276 IF(lwp) WRITE(numout,*) ' Width of relaxation zone = ', nn_rimwidth(ib_bdy)223 IF(lwp) WRITE(numout,*) 'Boundary rim width for the FRS scheme = ', nn_rimwidth(ib_bdy) 277 224 IF(lwp) WRITE(numout,*) 278 225 279 226 ENDDO 280 227 281 IF (nb_bdy .gt. 0) THEN 282 IF( ln_vol ) THEN ! check volume conservation (nn_volctl value) 283 IF(lwp) WRITE(numout,*) 'Volume correction applied at open boundaries' 284 IF(lwp) WRITE(numout,*) 285 SELECT CASE ( nn_volctl ) 286 CASE( 1 ) ; IF(lwp) WRITE(numout,*) ' The total volume will be constant' 287 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' The total volume will vary according to the surface E-P flux' 288 CASE DEFAULT ; CALL ctl_stop( 'nn_volctl must be 0 or 1' ) 289 END SELECT 290 IF(lwp) WRITE(numout,*) 291 ELSE 292 IF(lwp) WRITE(numout,*) 'No volume correction applied at open boundaries' 293 IF(lwp) WRITE(numout,*) 294 ENDIF 228 IF( ln_vol ) THEN ! check volume conservation (nn_volctl value) 229 IF(lwp) WRITE(numout,*) 'Volume correction applied at open boundaries' 230 IF(lwp) WRITE(numout,*) 231 SELECT CASE ( nn_volctl ) 232 CASE( 1 ) ; IF(lwp) WRITE(numout,*) ' The total volume will be constant' 233 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' The total volume will vary according to the surface E-P flux' 234 CASE DEFAULT ; CALL ctl_stop( 'nn_volctl must be 0 or 1' ) 235 END SELECT 236 IF(lwp) WRITE(numout,*) 237 ELSE 238 IF(lwp) WRITE(numout,*) 'No volume correction applied at open boundaries' 239 IF(lwp) WRITE(numout,*) 295 240 ENDIF 296 241 … … 302 247 ! --------------------------------------------- 303 248 REWIND( numnam ) 304 305 nblendta(:,:) = 0306 nbdysege = 0307 nbdysegw = 0308 nbdysegn = 0309 nbdysegs = 0310 icount = 0 ! count user defined segments311 ! Dimensions below are used to allocate arrays to read external data312 jpbdtas = 1 ! Maximum size of boundary data (structured case)313 jpbdtau = 1 ! Maximum size of boundary data (unstructured case)314 315 249 DO ib_bdy = 1, nb_bdy 316 250 251 jpbdta = 1 317 252 IF( .NOT. ln_coords_file(ib_bdy) ) THEN ! Work out size of global arrays from namelist parameters 318 253 319 icount = icount + 1320 254 ! No REWIND here because may need to read more than one nambdy_index namelist. 321 255 READ ( numnam, nambdy_index ) 322 256 323 SELECT CASE ( TRIM(ctypebdy) ) 324 CASE( 'N' ) 325 IF( nbdyind == -1 ) THEN ! Automatic boundary definition: if nbdysegX = -1 326 nbdyind = jpjglo - 2 ! set boundary to whole side of model domain. 327 nbdybeg = 2 328 nbdyend = jpiglo - 1 329 ENDIF 330 nbdysegn = nbdysegn + 1 331 npckgn(nbdysegn) = ib_bdy ! Save bdy package number 332 jpjnob(nbdysegn) = nbdyind 333 jpindt(nbdysegn) = nbdybeg 334 jpinft(nbdysegn) = nbdyend 335 ! 336 CASE( 'S' ) 337 IF( nbdyind == -1 ) THEN ! Automatic boundary definition: if nbdysegX = -1 338 nbdyind = 2 ! set boundary to whole side of model domain. 339 nbdybeg = 2 340 nbdyend = jpiglo - 1 341 ENDIF 342 nbdysegs = nbdysegs + 1 343 npckgs(nbdysegs) = ib_bdy ! Save bdy package number 344 jpjsob(nbdysegs) = nbdyind 345 jpisdt(nbdysegs) = nbdybeg 346 jpisft(nbdysegs) = nbdyend 347 ! 348 CASE( 'E' ) 349 IF( nbdyind == -1 ) THEN ! Automatic boundary definition: if nbdysegX = -1 350 nbdyind = jpiglo - 2 ! set boundary to whole side of model domain. 351 nbdybeg = 2 352 nbdyend = jpjglo - 1 353 ENDIF 354 nbdysege = nbdysege + 1 355 npckge(nbdysege) = ib_bdy ! Save bdy package number 356 jpieob(nbdysege) = nbdyind 357 jpjedt(nbdysege) = nbdybeg 358 jpjeft(nbdysege) = nbdyend 359 ! 360 CASE( 'W' ) 361 IF( nbdyind == -1 ) THEN ! Automatic boundary definition: if nbdysegX = -1 362 nbdyind = 2 ! set boundary to whole side of model domain. 363 nbdybeg = 2 364 nbdyend = jpjglo - 1 365 ENDIF 366 nbdysegw = nbdysegw + 1 367 npckgw(nbdysegw) = ib_bdy ! Save bdy package number 368 jpiwob(nbdysegw) = nbdyind 369 jpjwdt(nbdysegw) = nbdybeg 370 jpjwft(nbdysegw) = nbdyend 371 ! 372 CASE DEFAULT ; CALL ctl_stop( 'ctypebdy must be N, S, E or W' ) 373 END SELECT 374 375 ! For simplicity we assume that in case of straight bdy, arrays have the same length 376 ! (even if it is true that last tangential velocity points 377 ! are useless). This simplifies a little bit boundary data format (and agrees with format 378 ! used so far in obc package) 379 380 nblendta(1:jpbgrd,ib_bdy) = (nbdyend - nbdybeg + 1) * nn_rimwidth(ib_bdy) 381 jpbdtas = MAX(jpbdtas, (nbdyend - nbdybeg + 1)) 382 IF (lwp.and.(nn_rimwidth(ib_bdy)>nrimmax)) & 383 & CALL ctl_stop( 'rimwidth must be lower than nrimmax' ) 257 ! Automatic boundary definition: if nbdysegX = -1 258 ! set boundary to whole side of model domain. 259 IF( nbdysege == -1 ) THEN 260 nbdysege = 1 261 jpieob(1) = jpiglo - 1 262 jpjedt(1) = 2 263 jpjeft(1) = jpjglo - 1 264 ENDIF 265 IF( nbdysegw == -1 ) THEN 266 nbdysegw = 1 267 jpiwob(1) = 2 268 jpjwdt(1) = 2 269 jpjwft(1) = jpjglo - 1 270 ENDIF 271 IF( nbdysegn == -1 ) THEN 272 nbdysegn = 1 273 jpjnob(1) = jpjglo - 1 274 jpindt(1) = 2 275 jpinft(1) = jpiglo - 1 276 ENDIF 277 IF( nbdysegs == -1 ) THEN 278 nbdysegs = 1 279 jpjsob(1) = 2 280 jpisdt(1) = 2 281 jpisft(1) = jpiglo - 1 282 ENDIF 283 284 nblendta(:,ib_bdy) = 0 285 DO iseg = 1, nbdysege 286 igrd = 1 287 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjeft(iseg) - jpjedt(iseg) + 1 288 igrd = 2 289 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjeft(iseg) - jpjedt(iseg) + 1 290 igrd = 3 291 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjeft(iseg) - jpjedt(iseg) 292 ENDDO 293 DO iseg = 1, nbdysegw 294 igrd = 1 295 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjwft(iseg) - jpjwdt(iseg) + 1 296 igrd = 2 297 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjwft(iseg) - jpjwdt(iseg) + 1 298 igrd = 3 299 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjwft(iseg) - jpjwdt(iseg) 300 ENDDO 301 DO iseg = 1, nbdysegn 302 igrd = 1 303 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpinft(iseg) - jpindt(iseg) + 1 304 igrd = 2 305 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpinft(iseg) - jpindt(iseg) 306 igrd = 3 307 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpinft(iseg) - jpindt(iseg) + 1 308 ENDDO 309 DO iseg = 1, nbdysegs 310 igrd = 1 311 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpisft(iseg) - jpisdt(iseg) + 1 312 igrd = 2 313 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpisft(iseg) - jpisdt(iseg) 314 igrd = 3 315 nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpisft(iseg) - jpisdt(iseg) + 1 316 ENDDO 317 318 nblendta(:,ib_bdy) = nblendta(:,ib_bdy) * nn_rimwidth(ib_bdy) 319 jpbdta = MAXVAL(nblendta(:,ib_bdy)) 320 384 321 385 322 ELSE ! Read size of arrays in boundary coordinates file. 323 324 386 325 CALL iom_open( cn_coords_file(ib_bdy), inum ) 326 jpbdta = 1 387 327 DO igrd = 1, jpbgrd 388 328 id_dummy = iom_varid( inum, 'nbi'//cgrid(igrd), kdimsz=kdimsz ) 389 329 nblendta(igrd,ib_bdy) = kdimsz(1) 390 jpbdtau = MAX(jpbdtau, kdimsz(1)) 391 ENDDO 392 CALL iom_close( inum ) 330 jpbdta = MAX(jpbdta, kdimsz(1)) 331 ENDDO 393 332 394 333 ENDIF … … 396 335 ENDDO ! ib_bdy 397 336 398 IF (nb_bdy>0) THEN 399 jpbdta = MAXVAL(nblendta(1:jpbgrd,1:nb_bdy)) 400 401 ! Allocate arrays 402 !--------------- 403 ALLOCATE( nbidta(jpbdta, jpbgrd, nb_bdy), nbjdta(jpbdta, jpbgrd, nb_bdy), & 404 & nbrdta(jpbdta, jpbgrd, nb_bdy) ) 405 406 ALLOCATE( dta_global(jpbdtau, 1, jpk) ) 407 IF ( icount>0 ) ALLOCATE( dta_global2(jpbdtas, nrimmax, jpk) ) 408 ! 409 ENDIF 410 411 ! Now look for crossings in user (namelist) defined open boundary segments: 412 !-------------------------------------------------------------------------- 413 IF ( icount>0 ) CALL bdy_ctl_seg 337 ! Allocate arrays 338 !--------------- 339 ALLOCATE( nbidta(jpbdta, jpbgrd, nb_bdy), nbjdta(jpbdta, jpbgrd, nb_bdy), & 340 & nbrdta(jpbdta, jpbgrd, nb_bdy) ) 341 342 ALLOCATE( dta_global(jpbdta, 1, jpk) ) 343 ALLOCATE( dta_global_1(jpbdta, 1, jpk) ) 344 ALLOCATE( dta_global_2(jpbdta, jpk) ) 414 345 415 346 ! Calculate global boundary index arrays or read in from file 416 !------------------------------------------------------------ 417 ! 1. Read global index arrays from boundary coordinates file.347 !------------------------------------------------------------ 348 REWIND( numnam ) 418 349 DO ib_bdy = 1, nb_bdy 419 350 420 IF( ln_coords_file(ib_bdy) ) THEN 421 422 CALL iom_open( cn_coords_file(ib_bdy), inum ) 351 IF( .NOT. ln_coords_file(ib_bdy) ) THEN ! Calculate global index arrays from namelist parameters 352 353 ! No REWIND here because may need to read more than one nambdy_index namelist. 354 READ ( numnam, nambdy_index ) 355 356 ! Automatic boundary definition: if nbdysegX = -1 357 ! set boundary to whole side of model domain. 358 IF( nbdysege == -1 ) THEN 359 nbdysege = 1 360 jpieob(1) = jpiglo - 1 361 jpjedt(1) = 2 362 jpjeft(1) = jpjglo - 1 363 ENDIF 364 IF( nbdysegw == -1 ) THEN 365 nbdysegw = 1 366 jpiwob(1) = 2 367 jpjwdt(1) = 2 368 jpjwft(1) = jpjglo - 1 369 ENDIF 370 IF( nbdysegn == -1 ) THEN 371 nbdysegn = 1 372 jpjnob(1) = jpjglo - 1 373 jpindt(1) = 2 374 jpinft(1) = jpiglo - 1 375 ENDIF 376 IF( nbdysegs == -1 ) THEN 377 nbdysegs = 1 378 jpjsob(1) = 2 379 jpisdt(1) = 2 380 jpisft(1) = jpiglo - 1 381 ENDIF 382 383 ! ------------ T points ------------- 384 igrd = 1 385 icount = 0 386 DO ir = 1, nn_rimwidth(ib_bdy) 387 ! east 388 DO iseg = 1, nbdysege 389 DO ij = jpjedt(iseg), jpjeft(iseg) 390 icount = icount + 1 391 nbidta(icount, igrd, ib_bdy) = jpieob(iseg) - ir + 1 392 nbjdta(icount, igrd, ib_bdy) = ij 393 nbrdta(icount, igrd, ib_bdy) = ir 394 ENDDO 395 ENDDO 396 ! west 397 DO iseg = 1, nbdysegw 398 DO ij = jpjwdt(iseg), jpjwft(iseg) 399 icount = icount + 1 400 nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 401 nbjdta(icount, igrd, ib_bdy) = ij 402 nbrdta(icount, igrd, ib_bdy) = ir 403 ENDDO 404 ENDDO 405 ! north 406 DO iseg = 1, nbdysegn 407 DO ii = jpindt(iseg), jpinft(iseg) 408 icount = icount + 1 409 nbidta(icount, igrd, ib_bdy) = ii 410 nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) - ir + 1 411 nbrdta(icount, igrd, ib_bdy) = ir 412 ENDDO 413 ENDDO 414 ! south 415 DO iseg = 1, nbdysegs 416 DO ii = jpisdt(iseg), jpisft(iseg) 417 icount = icount + 1 418 nbidta(icount, igrd, ib_bdy) = ii 419 nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 420 nbrdta(icount, igrd, ib_bdy) = ir 421 ENDDO 422 ENDDO 423 ENDDO 424 425 ! ------------ U points ------------- 426 igrd = 2 427 icount = 0 428 DO ir = 1, nn_rimwidth(ib_bdy) 429 ! east 430 DO iseg = 1, nbdysege 431 DO ij = jpjedt(iseg), jpjeft(iseg) 432 icount = icount + 1 433 nbidta(icount, igrd, ib_bdy) = jpieob(iseg) - ir 434 nbjdta(icount, igrd, ib_bdy) = ij 435 nbrdta(icount, igrd, ib_bdy) = ir 436 ENDDO 437 ENDDO 438 ! west 439 DO iseg = 1, nbdysegw 440 DO ij = jpjwdt(iseg), jpjwft(iseg) 441 icount = icount + 1 442 nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 443 nbjdta(icount, igrd, ib_bdy) = ij 444 nbrdta(icount, igrd, ib_bdy) = ir 445 ENDDO 446 ENDDO 447 ! north 448 DO iseg = 1, nbdysegn 449 DO ii = jpindt(iseg), jpinft(iseg) - 1 450 icount = icount + 1 451 nbidta(icount, igrd, ib_bdy) = ii 452 nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) - ir + 1 453 nbrdta(icount, igrd, ib_bdy) = ir 454 ENDDO 455 ENDDO 456 ! south 457 DO iseg = 1, nbdysegs 458 DO ii = jpisdt(iseg), jpisft(iseg) - 1 459 icount = icount + 1 460 nbidta(icount, igrd, ib_bdy) = ii 461 nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 462 nbrdta(icount, igrd, ib_bdy) = ir 463 ENDDO 464 ENDDO 465 ENDDO 466 467 ! ------------ V points ------------- 468 igrd = 3 469 icount = 0 470 DO ir = 1, nn_rimwidth(ib_bdy) 471 ! east 472 DO iseg = 1, nbdysege 473 DO ij = jpjedt(iseg), jpjeft(iseg) - 1 474 icount = icount + 1 475 nbidta(icount, igrd, ib_bdy) = jpieob(iseg) - ir + 1 476 nbjdta(icount, igrd, ib_bdy) = ij 477 nbrdta(icount, igrd, ib_bdy) = ir 478 ENDDO 479 ENDDO 480 ! west 481 DO iseg = 1, nbdysegw 482 DO ij = jpjwdt(iseg), jpjwft(iseg) - 1 483 icount = icount + 1 484 nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 485 nbjdta(icount, igrd, ib_bdy) = ij 486 nbrdta(icount, igrd, ib_bdy) = ir 487 ENDDO 488 ENDDO 489 ! north 490 DO iseg = 1, nbdysegn 491 DO ii = jpindt(iseg), jpinft(iseg) 492 icount = icount + 1 493 nbidta(icount, igrd, ib_bdy) = ii 494 nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) - ir 495 nbrdta(icount, igrd, ib_bdy) = ir 496 ENDDO 497 ENDDO 498 ! south 499 DO iseg = 1, nbdysegs 500 DO ii = jpisdt(iseg), jpisft(iseg) 501 icount = icount + 1 502 nbidta(icount, igrd, ib_bdy) = ii 503 nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 504 nbrdta(icount, igrd, ib_bdy) = ir 505 ENDDO 506 ENDDO 507 ENDDO 508 509 ELSE ! Read global index arrays from boundary coordinates file. 510 423 511 DO igrd = 1, jpbgrd 424 512 CALL iom_get( inum, jpdom_unknown, 'nbi'//cgrid(igrd), dta_global(1:nblendta(igrd,ib_bdy),:,1) ) … … 441 529 IF (ibr_max < nn_rimwidth(ib_bdy)) & 442 530 CALL ctl_stop( 'nn_rimwidth is larger than maximum rimwidth in file',cn_coords_file(ib_bdy) ) 531 443 532 END DO 444 533 CALL iom_close( inum ) … … 446 535 ENDIF 447 536 448 ENDDO 449 450 ! 2. Now fill indices corresponding to straight open boundary arrays: 451 ! East 452 !----- 453 DO iseg = 1, nbdysege 454 ib_bdy = npckge(iseg) 455 ! 456 ! ------------ T points ------------- 457 igrd=1 458 icount=0 459 DO ir = 1, nn_rimwidth(ib_bdy) 460 DO ij = jpjedt(iseg), jpjeft(iseg) 461 icount = icount + 1 462 nbidta(icount, igrd, ib_bdy) = jpieob(iseg) + 2 - ir 463 nbjdta(icount, igrd, ib_bdy) = ij 464 nbrdta(icount, igrd, ib_bdy) = ir 465 ENDDO 466 ENDDO 467 ! 468 ! ------------ U points ------------- 469 igrd=2 470 icount=0 471 DO ir = 1, nn_rimwidth(ib_bdy) 472 DO ij = jpjedt(iseg), jpjeft(iseg) 473 icount = icount + 1 474 nbidta(icount, igrd, ib_bdy) = jpieob(iseg) + 1 - ir 475 nbjdta(icount, igrd, ib_bdy) = ij 476 nbrdta(icount, igrd, ib_bdy) = ir 477 ENDDO 478 ENDDO 479 ! 480 ! ------------ V points ------------- 481 igrd=3 482 icount=0 483 DO ir = 1, nn_rimwidth(ib_bdy) 484 ! DO ij = jpjedt(iseg), jpjeft(iseg) - 1 485 DO ij = jpjedt(iseg), jpjeft(iseg) 486 icount = icount + 1 487 nbidta(icount, igrd, ib_bdy) = jpieob(iseg) + 2 - ir 488 nbjdta(icount, igrd, ib_bdy) = ij 489 nbrdta(icount, igrd, ib_bdy) = ir 490 ENDDO 491 nbidta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 492 nbjdta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 493 ENDDO 494 ENDDO 495 ! 496 ! West 497 !----- 498 DO iseg = 1, nbdysegw 499 ib_bdy = npckgw(iseg) 500 ! 501 ! ------------ T points ------------- 502 igrd=1 503 icount=0 504 DO ir = 1, nn_rimwidth(ib_bdy) 505 DO ij = jpjwdt(iseg), jpjwft(iseg) 506 icount = icount + 1 507 nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 508 nbjdta(icount, igrd, ib_bdy) = ij 509 nbrdta(icount, igrd, ib_bdy) = ir 510 ENDDO 511 ENDDO 512 ! 513 ! ------------ U points ------------- 514 igrd=2 515 icount=0 516 DO ir = 1, nn_rimwidth(ib_bdy) 517 DO ij = jpjwdt(iseg), jpjwft(iseg) 518 icount = icount + 1 519 nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 520 nbjdta(icount, igrd, ib_bdy) = ij 521 nbrdta(icount, igrd, ib_bdy) = ir 522 ENDDO 523 ENDDO 524 ! 525 ! ------------ V points ------------- 526 igrd=3 527 icount=0 528 DO ir = 1, nn_rimwidth(ib_bdy) 529 ! DO ij = jpjwdt(iseg), jpjwft(iseg) - 1 530 DO ij = jpjwdt(iseg), jpjwft(iseg) 531 icount = icount + 1 532 nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 533 nbjdta(icount, igrd, ib_bdy) = ij 534 nbrdta(icount, igrd, ib_bdy) = ir 535 ENDDO 536 nbidta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 537 nbjdta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 538 ENDDO 539 ENDDO 540 ! 541 ! North 542 !----- 543 DO iseg = 1, nbdysegn 544 ib_bdy = npckgn(iseg) 545 ! 546 ! ------------ T points ------------- 547 igrd=1 548 icount=0 549 DO ir = 1, nn_rimwidth(ib_bdy) 550 DO ii = jpindt(iseg), jpinft(iseg) 551 icount = icount + 1 552 nbidta(icount, igrd, ib_bdy) = ii 553 nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) + 2 - ir 554 nbrdta(icount, igrd, ib_bdy) = ir 555 ENDDO 556 ENDDO 557 ! 558 ! ------------ U points ------------- 559 igrd=2 560 icount=0 561 DO ir = 1, nn_rimwidth(ib_bdy) 562 ! DO ii = jpindt(iseg), jpinft(iseg) - 1 563 DO ii = jpindt(iseg), jpinft(iseg) 564 icount = icount + 1 565 nbidta(icount, igrd, ib_bdy) = ii 566 nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) + 2 - ir 567 nbrdta(icount, igrd, ib_bdy) = ir 568 ENDDO 569 nbidta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 570 nbjdta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 571 ENDDO 572 ! 573 ! ------------ V points ------------- 574 igrd=3 575 icount=0 576 DO ir = 1, nn_rimwidth(ib_bdy) 577 DO ii = jpindt(iseg), jpinft(iseg) 578 icount = icount + 1 579 nbidta(icount, igrd, ib_bdy) = ii 580 nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) + 1 - ir 581 nbrdta(icount, igrd, ib_bdy) = ir 582 ENDDO 583 ENDDO 584 ENDDO 585 ! 586 ! South 587 !----- 588 DO iseg = 1, nbdysegs 589 ib_bdy = npckgs(iseg) 590 ! 591 ! ------------ T points ------------- 592 igrd=1 593 icount=0 594 DO ir = 1, nn_rimwidth(ib_bdy) 595 DO ii = jpisdt(iseg), jpisft(iseg) 596 icount = icount + 1 597 nbidta(icount, igrd, ib_bdy) = ii 598 nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 599 nbrdta(icount, igrd, ib_bdy) = ir 600 ENDDO 601 ENDDO 602 ! 603 ! ------------ U points ------------- 604 igrd=2 605 icount=0 606 DO ir = 1, nn_rimwidth(ib_bdy) 607 ! DO ii = jpisdt(iseg), jpisft(iseg) - 1 608 DO ii = jpisdt(iseg), jpisft(iseg) 609 icount = icount + 1 610 nbidta(icount, igrd, ib_bdy) = ii 611 nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 612 nbrdta(icount, igrd, ib_bdy) = ir 613 ENDDO 614 nbidta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 615 nbjdta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 616 ENDDO 617 ! 618 ! ------------ V points ------------- 619 igrd=3 620 icount=0 621 DO ir = 1, nn_rimwidth(ib_bdy) 622 DO ii = jpisdt(iseg), jpisft(iseg) 623 icount = icount + 1 624 nbidta(icount, igrd, ib_bdy) = ii 625 nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 626 nbrdta(icount, igrd, ib_bdy) = ir 627 ENDDO 628 ENDDO 629 ENDDO 630 631 ! Deal with duplicated points 632 !----------------------------- 633 ! We assign negative indices to duplicated points (to remove them from bdy points to be updated) 634 ! if their distance to the bdy is greater than the other 635 ! If their distance are the same, just keep only one to avoid updating a point twice 636 DO igrd = 1, jpbgrd 637 DO ib_bdy1 = 1, nb_bdy 638 DO ib_bdy2 = 1, nb_bdy 639 IF (ib_bdy1/=ib_bdy2) THEN 640 DO ib1 = 1, nblendta(igrd,ib_bdy1) 641 DO ib2 = 1, nblendta(igrd,ib_bdy2) 642 IF ((nbidta(ib1, igrd, ib_bdy1)==nbidta(ib2, igrd, ib_bdy2)).AND. & 643 & (nbjdta(ib1, igrd, ib_bdy1)==nbjdta(ib2, igrd, ib_bdy2))) THEN 644 ! IF ((lwp).AND.(igrd==1)) WRITE(numout,*) ' found coincident point ji, jj:', & 645 ! & nbidta(ib1, igrd, ib_bdy1), & 646 ! & nbjdta(ib2, igrd, ib_bdy2) 647 ! keep only points with the lowest distance to boundary: 648 IF (nbrdta(ib1, igrd, ib_bdy1)<nbrdta(ib2, igrd, ib_bdy2)) THEN 649 nbidta(ib2, igrd, ib_bdy2) =-ib_bdy2 650 nbjdta(ib2, igrd, ib_bdy2) =-ib_bdy2 651 ELSEIF (nbrdta(ib1, igrd, ib_bdy1)>nbrdta(ib2, igrd, ib_bdy2)) THEN 652 nbidta(ib1, igrd, ib_bdy1) =-ib_bdy1 653 nbjdta(ib1, igrd, ib_bdy1) =-ib_bdy1 654 ! Arbitrary choice if distances are the same: 655 ELSE 656 nbidta(ib1, igrd, ib_bdy1) =-ib_bdy1 657 nbjdta(ib1, igrd, ib_bdy1) =-ib_bdy1 658 ENDIF 659 END IF 660 END DO 661 END DO 662 ENDIF 663 END DO 664 END DO 665 END DO 537 ENDDO 666 538 667 539 ! Work out dimensions of boundary data on each processor 668 540 ! ------------------------------------------------------ 669 670 ! Rather assume that boundary data indices are given on global domain 671 ! TO BE DISCUSSED ? 672 ! iw = mig(1) + 1 ! if monotasking and no zoom, iw=2 673 ! ie = mig(1) + nlci-1 - 1 ! if monotasking and no zoom, ie=jpim1 674 ! is = mjg(1) + 1 ! if monotasking and no zoom, is=2 675 ! in = mjg(1) + nlcj-1 - 1 ! if monotasking and no zoom, in=jpjm1 676 iw = mig(1) - jpizoom + 2 ! if monotasking and no zoom, iw=2 677 ie = mig(1) + nlci - jpizoom - 1 ! if monotasking and no zoom, ie=jpim1 678 is = mjg(1) - jpjzoom + 2 ! if monotasking and no zoom, is=2 679 in = mjg(1) + nlcj - jpjzoom - 1 ! if monotasking and no zoom, in=jpjm1 680 681 ALLOCATE( nbondi_bdy(nb_bdy)) 682 ALLOCATE( nbondj_bdy(nb_bdy)) 683 nbondi_bdy(:)=2 684 nbondj_bdy(:)=2 685 ALLOCATE( nbondi_bdy_b(nb_bdy)) 686 ALLOCATE( nbondj_bdy_b(nb_bdy)) 687 nbondi_bdy_b(:)=2 688 nbondj_bdy_b(:)=2 689 690 ! Work out dimensions of boundary data on each neighbour process 691 IF(nbondi .eq. 0) THEN 692 iw_b(1) = jpizoom + nimppt(nowe+1) 693 ie_b(1) = jpizoom + nimppt(nowe+1)+nlcit(nowe+1)-3 694 is_b(1) = jpjzoom + njmppt(nowe+1) 695 in_b(1) = jpjzoom + njmppt(nowe+1)+nlcjt(nowe+1)-3 696 697 iw_b(2) = jpizoom + nimppt(noea+1) 698 ie_b(2) = jpizoom + nimppt(noea+1)+nlcit(noea+1)-3 699 is_b(2) = jpjzoom + njmppt(noea+1) 700 in_b(2) = jpjzoom + njmppt(noea+1)+nlcjt(noea+1)-3 701 ELSEIF(nbondi .eq. 1) THEN 702 iw_b(1) = jpizoom + nimppt(nowe+1) 703 ie_b(1) = jpizoom + nimppt(nowe+1)+nlcit(nowe+1)-3 704 is_b(1) = jpjzoom + njmppt(nowe+1) 705 in_b(1) = jpjzoom + njmppt(nowe+1)+nlcjt(nowe+1)-3 706 ELSEIF(nbondi .eq. -1) THEN 707 iw_b(2) = jpizoom + nimppt(noea+1) 708 ie_b(2) = jpizoom + nimppt(noea+1)+nlcit(noea+1)-3 709 is_b(2) = jpjzoom + njmppt(noea+1) 710 in_b(2) = jpjzoom + njmppt(noea+1)+nlcjt(noea+1)-3 711 ENDIF 712 713 IF(nbondj .eq. 0) THEN 714 iw_b(3) = jpizoom + nimppt(noso+1) 715 ie_b(3) = jpizoom + nimppt(noso+1)+nlcit(noso+1)-3 716 is_b(3) = jpjzoom + njmppt(noso+1) 717 in_b(3) = jpjzoom + njmppt(noso+1)+nlcjt(noso+1)-3 718 719 iw_b(4) = jpizoom + nimppt(nono+1) 720 ie_b(4) = jpizoom + nimppt(nono+1)+nlcit(nono+1)-3 721 is_b(4) = jpjzoom + njmppt(nono+1) 722 in_b(4) = jpjzoom + njmppt(nono+1)+nlcjt(nono+1)-3 723 ELSEIF(nbondj .eq. 1) THEN 724 iw_b(3) = jpizoom + nimppt(noso+1) 725 ie_b(3) = jpizoom + nimppt(noso+1)+nlcit(noso+1)-3 726 is_b(3) = jpjzoom + njmppt(noso+1) 727 in_b(3) = jpjzoom + njmppt(noso+1)+nlcjt(noso+1)-3 728 ELSEIF(nbondj .eq. -1) THEN 729 iw_b(4) = jpizoom + nimppt(nono+1) 730 ie_b(4) = jpizoom + nimppt(nono+1)+nlcit(nono+1)-3 731 is_b(4) = jpjzoom + njmppt(nono+1) 732 in_b(4) = jpjzoom + njmppt(nono+1)+nlcjt(nono+1)-3 733 ENDIF 541 542 iw = mig(1) + 1 ! if monotasking and no zoom, iw=2 543 ie = mig(1) + nlci-1 - 1 ! if monotasking and no zoom, ie=jpim1 544 is = mjg(1) + 1 ! if monotasking and no zoom, is=2 545 in = mjg(1) + nlcj-1 - 1 ! if monotasking and no zoom, in=jpjm1 734 546 735 547 DO ib_bdy = 1, nb_bdy … … 744 556 IF(lwp) THEN ! Since all procs read global data only need to do this check on one proc... 745 557 IF( nbrdta(ib,igrd,ib_bdy) < nbrdta(ibm1,igrd,ib_bdy) ) THEN 746 CALL ctl_stop('bdy_init : ERROR : boundary data in file & 747 must be defined in order of distance from edge nbr.', & 748 'A utility for re-ordering boundary coordinates and data & 749 files exists in the TOOLS/OBC directory') 558 CALL ctl_stop('bdy_init : ERROR : boundary data in file must be defined in order of distance from edge nbr.', & 559 'A utility for re-ordering boundary coordinates and data files exists in the TOOLS/OBC directory') 750 560 ENDIF 751 561 ENDIF … … 769 579 ALLOCATE( idx_bdy(ib_bdy)%nbj(ilen1,jpbgrd) ) 770 580 ALLOCATE( idx_bdy(ib_bdy)%nbr(ilen1,jpbgrd) ) 771 ALLOCATE( idx_bdy(ib_bdy)%nb d(ilen1,jpbgrd) )581 ALLOCATE( idx_bdy(ib_bdy)%nbz(ilen1,jpbgrd,jpk) ) ! jdha addition TODO use this instead of calculating in fldread? 772 582 ALLOCATE( idx_bdy(ib_bdy)%nbmap(ilen1,jpbgrd) ) 773 583 ALLOCATE( idx_bdy(ib_bdy)%nbw(ilen1,jpbgrd) ) … … 778 588 ! ----------------------------------------------------------------- 779 589 780 com_east = 0781 com_west = 0782 com_south = 0783 com_north = 0784 785 com_east_b = 0786 com_west_b = 0787 com_south_b = 0788 com_north_b = 0789 590 DO igrd = 1, jpbgrd 790 591 icount = 0 … … 798 599 ! 799 600 icount = icount + 1 800 801 ! Rather assume that boundary data indices are given on global domain 802 ! TO BE DISCUSSED ? 803 ! idx_bdy(ib_bdy)%nbi(icount,igrd) = nbidta(ib,igrd,ib_bdy)- mig(1)+1 804 ! idx_bdy(ib_bdy)%nbj(icount,igrd) = nbjdta(ib,igrd,ib_bdy)- mjg(1)+1 805 idx_bdy(ib_bdy)%nbi(icount,igrd) = nbidta(ib,igrd,ib_bdy)- mig(1)+jpizoom 806 idx_bdy(ib_bdy)%nbj(icount,igrd) = nbjdta(ib,igrd,ib_bdy)- mjg(1)+jpjzoom 807 ! check if point has to be sent 808 ii = idx_bdy(ib_bdy)%nbi(icount,igrd) 809 ij = idx_bdy(ib_bdy)%nbj(icount,igrd) 810 if((com_east .ne. 1) .and. (ii .eq. (nlci-1)) .and. (nbondi .le. 0)) then 811 com_east = 1 812 elseif((com_west .ne. 1) .and. (ii .eq. 2) .and. (nbondi .ge. 0) .and. (nbondi .ne. 2)) then 813 com_west = 1 814 endif 815 if((com_south .ne. 1) .and. (ij .eq. 2) .and. (nbondj .ge. 0) .and. (nbondj .ne. 2)) then 816 com_south = 1 817 elseif((com_north .ne. 1) .and. (ij .eq. (nlcj-1)) .and. (nbondj .le. 0)) then 818 com_north = 1 819 endif 601 idx_bdy(ib_bdy)%nbi(icount,igrd) = nbidta(ib,igrd,ib_bdy)- mig(1)+1 602 idx_bdy(ib_bdy)%nbj(icount,igrd) = nbjdta(ib,igrd,ib_bdy)- mjg(1)+1 820 603 idx_bdy(ib_bdy)%nbr(icount,igrd) = nbrdta(ib,igrd,ib_bdy) 604 DO ik = 1,jpk 605 idx_bdy(ib_bdy)%nbz(icount,igrd,ik) = & 606 & gdept_1(idx_bdy(ib_bdy)%nbi(icount,igrd),idx_bdy(ib_bdy)%nbj(icount,igrd),ik) ! if using in step could use fsdept? 607 ENDDO 821 608 idx_bdy(ib_bdy)%nbmap(icount,igrd) = ib 822 609 ENDIF 823 ! check if point has to be received from a neighbour824 IF(nbondi .eq. 0) THEN825 IF( nbidta(ib,igrd,ib_bdy) >= iw_b(1) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(1) .AND. &826 & nbjdta(ib,igrd,ib_bdy) >= is_b(1) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(1) .AND. &827 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN828 ii = nbidta(ib,igrd,ib_bdy)- iw_b(1)+2829 if((com_west_b .ne. 1) .and. (ii .eq. (nlcit(nowe+1)-1))) then830 ij = nbjdta(ib,igrd,ib_bdy) - is_b(1)+2831 if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then832 com_south = 1833 elseif((ij .eq. nlcjt(nowe+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then834 com_north = 1835 endif836 com_west_b = 1837 endif838 ENDIF839 IF( nbidta(ib,igrd,ib_bdy) >= iw_b(2) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(2) .AND. &840 & nbjdta(ib,igrd,ib_bdy) >= is_b(2) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(2) .AND. &841 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN842 ii = nbidta(ib,igrd,ib_bdy)- iw_b(2)+2843 if((com_east_b .ne. 1) .and. (ii .eq. 2)) then844 ij = nbjdta(ib,igrd,ib_bdy) - is_b(2)+2845 if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then846 com_south = 1847 elseif((ij .eq. nlcjt(noea+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then848 com_north = 1849 endif850 com_east_b = 1851 endif852 ENDIF853 ELSEIF(nbondi .eq. 1) THEN854 IF( nbidta(ib,igrd,ib_bdy) >= iw_b(1) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(1) .AND. &855 & nbjdta(ib,igrd,ib_bdy) >= is_b(1) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(1) .AND. &856 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN857 ii = nbidta(ib,igrd,ib_bdy)- iw_b(1)+2858 if((com_west_b .ne. 1) .and. (ii .eq. (nlcit(nowe+1)-1))) then859 ij = nbjdta(ib,igrd,ib_bdy) - is_b(1)+2860 if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then861 com_south = 1862 elseif((ij .eq. nlcjt(nowe+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then863 com_north = 1864 endif865 com_west_b = 1866 endif867 ENDIF868 ELSEIF(nbondi .eq. -1) THEN869 IF( nbidta(ib,igrd,ib_bdy) >= iw_b(2) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(2) .AND. &870 & nbjdta(ib,igrd,ib_bdy) >= is_b(2) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(2) .AND. &871 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN872 ii = nbidta(ib,igrd,ib_bdy)- iw_b(2)+2873 if((com_east_b .ne. 1) .and. (ii .eq. 2)) then874 ij = nbjdta(ib,igrd,ib_bdy) - is_b(2)+2875 if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then876 com_south = 1877 elseif((ij .eq. nlcjt(noea+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then878 com_north = 1879 endif880 com_east_b = 1881 endif882 ENDIF883 ENDIF884 IF(nbondj .eq. 0) THEN885 IF(com_north_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(4)-1 &886 & .OR. nbidta(ib,igrd,ib_bdy) == ie_b(4)+1) .AND. &887 & nbjdta(ib,igrd,ib_bdy) == is_b(4) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN888 com_north_b = 1889 ENDIF890 IF(com_south_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(3)-1 &891 &.OR. nbidta(ib,igrd,ib_bdy) == ie_b(3)+1) .AND. &892 & nbjdta(ib,igrd,ib_bdy) == in_b(3) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN893 com_south_b = 1894 ENDIF895 IF( nbidta(ib,igrd,ib_bdy) >= iw_b(3) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(3) .AND. &896 & nbjdta(ib,igrd,ib_bdy) >= is_b(3) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(3) .AND. &897 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN898 ij = nbjdta(ib,igrd,ib_bdy)- is_b(3)+2899 if((com_south_b .ne. 1) .and. (ij .eq. (nlcjt(noso+1)-1))) then900 com_south_b = 1901 endif902 ENDIF903 IF( nbidta(ib,igrd,ib_bdy) >= iw_b(4) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(4) .AND. &904 & nbjdta(ib,igrd,ib_bdy) >= is_b(4) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(4) .AND. &905 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN906 ij = nbjdta(ib,igrd,ib_bdy)- is_b(4)+2907 if((com_north_b .ne. 1) .and. (ij .eq. 2)) then908 com_north_b = 1909 endif910 ENDIF911 ELSEIF(nbondj .eq. 1) THEN912 IF( com_south_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(3)-1 .OR. &913 & nbidta(ib,igrd,ib_bdy) == ie_b(3)+1) .AND. &914 & nbjdta(ib,igrd,ib_bdy) == in_b(3) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN915 com_south_b = 1916 ENDIF917 IF( nbidta(ib,igrd,ib_bdy) >= iw_b(3) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(3) .AND. &918 & nbjdta(ib,igrd,ib_bdy) >= is_b(3) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(3) .AND. &919 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN920 ij = nbjdta(ib,igrd,ib_bdy)- is_b(3)+2921 if((com_south_b .ne. 1) .and. (ij .eq. (nlcjt(noso+1)-1))) then922 com_south_b = 1923 endif924 ENDIF925 ELSEIF(nbondj .eq. -1) THEN926 IF(com_north_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(4)-1 &927 & .OR. nbidta(ib,igrd,ib_bdy) == ie_b(4)+1) .AND. &928 & nbjdta(ib,igrd,ib_bdy) == is_b(4) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN929 com_north_b = 1930 ENDIF931 IF( nbidta(ib,igrd,ib_bdy) >= iw_b(4) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(4) .AND. &932 & nbjdta(ib,igrd,ib_bdy) >= is_b(4) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(4) .AND. &933 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN934 ij = nbjdta(ib,igrd,ib_bdy)- is_b(4)+2935 if((com_north_b .ne. 1) .and. (ij .eq. 2)) then936 com_north_b = 1937 endif938 ENDIF939 ENDIF940 610 ENDDO 941 611 ENDDO 942 612 ENDDO 943 ! definition of the i- and j- direction local boundaries arrays944 ! used for sending the boudaries945 IF((com_east .eq. 1) .and. (com_west .eq. 1)) THEN946 nbondi_bdy(ib_bdy) = 0947 ELSEIF ((com_east .eq. 1) .and. (com_west .eq. 0)) THEN948 nbondi_bdy(ib_bdy) = -1949 ELSEIF ((com_east .eq. 0) .and. (com_west .eq. 1)) THEN950 nbondi_bdy(ib_bdy) = 1951 ENDIF952 953 IF((com_north .eq. 1) .and. (com_south .eq. 1)) THEN954 nbondj_bdy(ib_bdy) = 0955 ELSEIF ((com_north .eq. 1) .and. (com_south .eq. 0)) THEN956 nbondj_bdy(ib_bdy) = -1957 ELSEIF ((com_north .eq. 0) .and. (com_south .eq. 1)) THEN958 nbondj_bdy(ib_bdy) = 1959 ENDIF960 961 ! definition of the i- and j- direction local boundaries arrays962 ! used for receiving the boudaries963 IF((com_east_b .eq. 1) .and. (com_west_b .eq. 1)) THEN964 nbondi_bdy_b(ib_bdy) = 0965 ELSEIF ((com_east_b .eq. 1) .and. (com_west_b .eq. 0)) THEN966 nbondi_bdy_b(ib_bdy) = -1967 ELSEIF ((com_east_b .eq. 0) .and. (com_west_b .eq. 1)) THEN968 nbondi_bdy_b(ib_bdy) = 1969 ENDIF970 971 IF((com_north_b .eq. 1) .and. (com_south_b .eq. 1)) THEN972 nbondj_bdy_b(ib_bdy) = 0973 ELSEIF ((com_north_b .eq. 1) .and. (com_south_b .eq. 0)) THEN974 nbondj_bdy_b(ib_bdy) = -1975 ELSEIF ((com_north_b .eq. 0) .and. (com_south_b .eq. 1)) THEN976 nbondj_bdy_b(ib_bdy) = 1977 ENDIF978 613 979 614 ! Compute rim weights for FRS scheme … … 983 618 nbr => idx_bdy(ib_bdy)%nbr(ib,igrd) 984 619 idx_bdy(ib_bdy)%nbw(ib,igrd) = 1.- TANH( FLOAT( nbr - 1 ) *0.5 ) ! tanh formulation 985 ! idx_bdy(ib_bdy)%nbw(ib,igrd) = (FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy)))**2. ! quadratic 986 ! idx_bdy(ib_bdy)%nbw(ib,igrd) = FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy)) ! linear 987 END DO 988 END DO 989 990 ! Compute damping coefficients 991 ! ---------------------------- 992 DO igrd = 1, jpbgrd 993 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 994 nbr => idx_bdy(ib_bdy)%nbr(ib,igrd) 995 idx_bdy(ib_bdy)%nbd(ib,igrd) = 1. / ( rn_time_dmp(ib_bdy) * rday ) & 996 & *(FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy)))**2. ! quadratic 620 ! idx_bdy(ib_bdy)%nbw(ib,igrd) = (FLOAT(nn_rimwidth+1-nbr)/FLOAT(nn_rimwidth))**2 ! quadratic 621 ! idx_bdy(ib_bdy)%nbw(ib,igrd) = FLOAT(nn_rimwidth+1-nbr)/FLOAT(nn_rimwidth) ! linear 997 622 END DO 998 623 END DO … … 1014 639 CALL iom_close( inum ) 1015 640 641 IF(lwp) WRITE(numout,*) 'get bdytmask', bdytmask 1016 642 ! Derive mask on U and V grid from mask on T grid 1017 643 bdyumask(:,:) = 0.e0 … … 1053 679 1054 680 bdytmask(:,:) = tmask(:,:,1) 681 IF( .not. ln_mask_file ) THEN 682 ! If .not. ln_mask_file then we need to derive mask on U and V grid 683 ! from mask on T grid here. 684 bdyumask(:,:) = 0.e0 685 bdyvmask(:,:) = 0.e0 686 DO ij=1, jpjm1 687 DO ii=1, jpim1 688 bdyumask(ii,ij)=bdytmask(ii,ij)*bdytmask(ii+1, ij ) 689 bdyvmask(ii,ij)=bdytmask(ii,ij)*bdytmask(ii ,ij+1) 690 END DO 691 END DO 692 CALL lbc_lnk( bdyumask(:,:), 'U', 1. ) ; CALL lbc_lnk( bdyvmask(:,:), 'V', 1. ) ! Lateral boundary cond. 693 ENDIF 1055 694 1056 695 ! bdy masks and bmask are now set to zero on boundary points: … … 1126 765 END IF 1127 766 END DO 1128 767 1129 768 IF( icount /= 0 ) THEN 1130 769 IF(lwp) WRITE(numout,*) … … 1140 779 ! Compute total lateral surface for volume correction: 1141 780 ! ---------------------------------------------------- 1142 ! JC: this must be done at each time step with key_vvl1143 781 bdysurftot = 0.e0 1144 782 IF( ln_vol ) THEN … … 1174 812 ! Tidy up 1175 813 !-------- 1176 IF (nb_bdy>0) THEN 1177 DEALLOCATE(nbidta, nbjdta, nbrdta) 1178 ENDIF 814 DEALLOCATE(nbidta, nbjdta, nbrdta) 1179 815 1180 816 IF( nn_timing == 1 ) CALL timing_stop('bdy_init') 1181 817 1182 818 END SUBROUTINE bdy_init 1183 1184 SUBROUTINE bdy_ctl_seg1185 !!----------------------------------------------------------------------1186 !! *** ROUTINE bdy_ctl_seg ***1187 !!1188 !! ** Purpose : Check straight open boundary segments location1189 !!1190 !! ** Method : - Look for open boundary corners1191 !! - Check that segments start or end on land1192 !!----------------------------------------------------------------------1193 INTEGER :: ib, ib1, ib2, ji ,jj, itest1194 INTEGER, DIMENSION(jp_nseg,2) :: icorne, icornw, icornn, icorns1195 REAL(wp), DIMENSION(2) :: ztestmask1196 !!----------------------------------------------------------------------1197 !1198 IF (lwp) WRITE(numout,*) ' '1199 IF (lwp) WRITE(numout,*) 'bdy_ctl_seg: Check analytical segments'1200 IF (lwp) WRITE(numout,*) '~~~~~~~~~~~~'1201 !1202 IF(lwp) WRITE(numout,*) 'Number of east segments : ', nbdysege1203 IF(lwp) WRITE(numout,*) 'Number of west segments : ', nbdysegw1204 IF(lwp) WRITE(numout,*) 'Number of north segments : ', nbdysegn1205 IF(lwp) WRITE(numout,*) 'Number of south segments : ', nbdysegs1206 ! 1. Check bounds1207 !----------------1208 DO ib = 1, nbdysegn1209 IF (lwp) WRITE(numout,*) '**check north seg bounds pckg: ', npckgn(ib)1210 IF ((jpjnob(ib).ge.jpjglo-1).or.&1211 &(jpjnob(ib).le.1)) CALL ctl_stop( 'nbdyind out of domain' )1212 IF (jpindt(ib).ge.jpinft(ib)) CALL ctl_stop( 'Bdy start index is greater than end index' )1213 IF (jpindt(ib).le.1 ) CALL ctl_stop( 'Start index out of domain' )1214 IF (jpinft(ib).ge.jpiglo) CALL ctl_stop( 'End index out of domain' )1215 END DO1216 !1217 DO ib = 1, nbdysegs1218 IF (lwp) WRITE(numout,*) '**check south seg bounds pckg: ', npckgs(ib)1219 IF ((jpjsob(ib).ge.jpjglo-1).or.&1220 &(jpjsob(ib).le.1)) CALL ctl_stop( 'nbdyind out of domain' )1221 IF (jpisdt(ib).ge.jpisft(ib)) CALL ctl_stop( 'Bdy start index is greater than end index' )1222 IF (jpisdt(ib).le.1 ) CALL ctl_stop( 'Start index out of domain' )1223 IF (jpisft(ib).ge.jpiglo) CALL ctl_stop( 'End index out of domain' )1224 END DO1225 !1226 DO ib = 1, nbdysege1227 IF (lwp) WRITE(numout,*) '**check east seg bounds pckg: ', npckge(ib)1228 IF ((jpieob(ib).ge.jpiglo-1).or.&1229 &(jpieob(ib).le.1)) CALL ctl_stop( 'nbdyind out of domain' )1230 IF (jpjedt(ib).ge.jpjeft(ib)) CALL ctl_stop( 'Bdy start index is greater than end index' )1231 IF (jpjedt(ib).le.1 ) CALL ctl_stop( 'Start index out of domain' )1232 IF (jpjeft(ib).ge.jpjglo) CALL ctl_stop( 'End index out of domain' )1233 END DO1234 !1235 DO ib = 1, nbdysegw1236 IF (lwp) WRITE(numout,*) '**check west seg bounds pckg: ', npckgw(ib)1237 IF ((jpiwob(ib).ge.jpiglo-1).or.&1238 &(jpiwob(ib).le.1)) CALL ctl_stop( 'nbdyind out of domain' )1239 IF (jpjwdt(ib).ge.jpjwft(ib)) CALL ctl_stop( 'Bdy start index is greater than end index' )1240 IF (jpjwdt(ib).le.1 ) CALL ctl_stop( 'Start index out of domain' )1241 IF (jpjwft(ib).ge.jpjglo) CALL ctl_stop( 'End index out of domain' )1242 ENDDO1243 !1244 !1245 ! 2. Look for segment crossings1246 !------------------------------1247 IF (lwp) WRITE(numout,*) '**Look for segments corners :'1248 !1249 itest = 0 ! corner number1250 !1251 ! flag to detect if start or end of open boundary belongs to a corner1252 ! if not (=0), it must be on land.1253 ! if a corner is detected, save bdy package number for further tests1254 icorne(:,:)=0. ; icornw(:,:)=0. ; icornn(:,:)=0. ; icorns(:,:)=0.1255 ! South/West crossings1256 IF ((nbdysegw > 0).AND.(nbdysegs > 0)) THEN1257 DO ib1 = 1, nbdysegw1258 DO ib2 = 1, nbdysegs1259 IF (( jpisdt(ib2)<=jpiwob(ib1)).AND. &1260 & ( jpisft(ib2)>=jpiwob(ib1)).AND. &1261 & ( jpjwdt(ib1)<=jpjsob(ib2)).AND. &1262 & ( jpjwft(ib1)>=jpjsob(ib2))) THEN1263 IF ((jpjwdt(ib1)==jpjsob(ib2)).AND.(jpisdt(ib2)==jpiwob(ib1))) THEN1264 ! We have a possible South-West corner1265 ! WRITE(numout,*) ' Found a South-West corner at (i,j): ', jpisdt(ib2), jpjwdt(ib1)1266 ! WRITE(numout,*) ' between segments: ', npckgw(ib1), npckgs(ib2)1267 icornw(ib1,1) = npckgs(ib2)1268 icorns(ib2,1) = npckgw(ib1)1269 ELSEIF ((jpisft(ib2)==jpiwob(ib1)).AND.(jpjwft(ib1)==jpjsob(ib2))) THEN1270 IF(lwp) WRITE(numout,*)1271 IF(lwp) WRITE(numout,*) ' E R R O R : Found an acute open boundary corner at point (i,j)= ', &1272 & jpisft(ib2), jpjwft(ib1)1273 IF(lwp) WRITE(numout,*) ' ========== Not allowed yet'1274 IF(lwp) WRITE(numout,*) ' Crossing problem with West segment: ',npckgw(ib1), &1275 & ' and South segment: ',npckgs(ib2)1276 IF(lwp) WRITE(numout,*)1277 nstop = nstop + 11278 ELSE1279 IF(lwp) WRITE(numout,*)1280 IF(lwp) WRITE(numout,*) ' E R R O R : Check South and West Open boundary indices'1281 IF(lwp) WRITE(numout,*) ' ========== Crossing problem with West segment: ',npckgw(ib1) , &1282 & ' and South segment: ',npckgs(ib2)1283 IF(lwp) WRITE(numout,*)1284 nstop = nstop+11285 END IF1286 END IF1287 END DO1288 END DO1289 END IF1290 !1291 ! South/East crossings1292 IF ((nbdysege > 0).AND.(nbdysegs > 0)) THEN1293 DO ib1 = 1, nbdysege1294 DO ib2 = 1, nbdysegs1295 IF (( jpisdt(ib2)<=jpieob(ib1)+1).AND. &1296 & ( jpisft(ib2)>=jpieob(ib1)+1).AND. &1297 & ( jpjedt(ib1)<=jpjsob(ib2) ).AND. &1298 & ( jpjeft(ib1)>=jpjsob(ib2) )) THEN1299 IF ((jpjedt(ib1)==jpjsob(ib2)).AND.(jpisft(ib2)==jpieob(ib1)+1)) THEN1300 ! We have a possible South-East corner1301 ! WRITE(numout,*) ' Found a South-East corner at (i,j): ', jpisft(ib2), jpjedt(ib1)1302 ! WRITE(numout,*) ' between segments: ', npckge(ib1), npckgs(ib2)1303 icorne(ib1,1) = npckgs(ib2)1304 icorns(ib2,2) = npckge(ib1)1305 ELSEIF ((jpjeft(ib1)==jpjsob(ib2)).AND.(jpisdt(ib2)==jpieob(ib1)+1)) THEN1306 IF(lwp) WRITE(numout,*)1307 IF(lwp) WRITE(numout,*) ' E R R O R : Found an acute open boundary corner at point (i,j)= ', &1308 & jpisdt(ib2), jpjeft(ib1)1309 IF(lwp) WRITE(numout,*) ' ========== Not allowed yet'1310 IF(lwp) WRITE(numout,*) ' Crossing problem with East segment: ',npckge(ib1), &1311 & ' and South segment: ',npckgs(ib2)1312 IF(lwp) WRITE(numout,*)1313 nstop = nstop + 11314 ELSE1315 IF(lwp) WRITE(numout,*)1316 IF(lwp) WRITE(numout,*) ' E R R O R : Check South and East Open boundary indices'1317 IF(lwp) WRITE(numout,*) ' ========== Crossing problem with East segment: ',npckge(ib1), &1318 & ' and South segment: ',npckgs(ib2)1319 IF(lwp) WRITE(numout,*)1320 nstop = nstop + 11321 END IF1322 END IF1323 END DO1324 END DO1325 END IF1326 !1327 ! North/West crossings1328 IF ((nbdysegn > 0).AND.(nbdysegw > 0)) THEN1329 DO ib1 = 1, nbdysegw1330 DO ib2 = 1, nbdysegn1331 IF (( jpindt(ib2)<=jpiwob(ib1) ).AND. &1332 & ( jpinft(ib2)>=jpiwob(ib1) ).AND. &1333 & ( jpjwdt(ib1)<=jpjnob(ib2)+1).AND. &1334 & ( jpjwft(ib1)>=jpjnob(ib2)+1)) THEN1335 IF ((jpjwft(ib1)==jpjnob(ib2)+1).AND.(jpindt(ib2)==jpiwob(ib1))) THEN1336 ! We have a possible North-West corner1337 ! WRITE(numout,*) ' Found a North-West corner at (i,j): ', jpindt(ib2), jpjwft(ib1)1338 ! WRITE(numout,*) ' between segments: ', npckgw(ib1), npckgn(ib2)1339 icornw(ib1,2) = npckgn(ib2)1340 icornn(ib2,1) = npckgw(ib1)1341 ELSEIF ((jpjwdt(ib1)==jpjnob(ib2)+1).AND.(jpinft(ib2)==jpiwob(ib1))) THEN1342 IF(lwp) WRITE(numout,*)1343 IF(lwp) WRITE(numout,*) ' E R R O R : Found an acute open boundary corner at point (i,j)= ', &1344 & jpinft(ib2), jpjwdt(ib1)1345 IF(lwp) WRITE(numout,*) ' ========== Not allowed yet'1346 IF(lwp) WRITE(numout,*) ' Crossing problem with West segment: ',npckgw(ib1), &1347 & ' and North segment: ',npckgn(ib2)1348 IF(lwp) WRITE(numout,*)1349 nstop = nstop + 11350 ELSE1351 IF(lwp) WRITE(numout,*)1352 IF(lwp) WRITE(numout,*) ' E R R O R : Check North and West Open boundary indices'1353 IF(lwp) WRITE(numout,*) ' ========== Crossing problem with West segment: ',npckgw(ib1), &1354 & ' and North segment: ',npckgn(ib2)1355 IF(lwp) WRITE(numout,*)1356 nstop = nstop + 11357 END IF1358 END IF1359 END DO1360 END DO1361 END IF1362 !1363 ! North/East crossings1364 IF ((nbdysegn > 0).AND.(nbdysege > 0)) THEN1365 DO ib1 = 1, nbdysege1366 DO ib2 = 1, nbdysegn1367 IF (( jpindt(ib2)<=jpieob(ib1)+1).AND. &1368 & ( jpinft(ib2)>=jpieob(ib1)+1).AND. &1369 & ( jpjedt(ib1)<=jpjnob(ib2)+1).AND. &1370 & ( jpjeft(ib1)>=jpjnob(ib2)+1)) THEN1371 IF ((jpjeft(ib1)==jpjnob(ib2)+1).AND.(jpinft(ib2)==jpieob(ib1)+1)) THEN1372 ! We have a possible North-East corner1373 ! WRITE(numout,*) ' Found a North-East corner at (i,j): ', jpinft(ib2), jpjeft(ib1)1374 ! WRITE(numout,*) ' between segments: ', npckge(ib1), npckgn(ib2)1375 icorne(ib1,2) = npckgn(ib2)1376 icornn(ib2,2) = npckge(ib1)1377 ELSEIF ((jpjedt(ib1)==jpjnob(ib2)+1).AND.(jpindt(ib2)==jpieob(ib1)+1)) THEN1378 IF(lwp) WRITE(numout,*)1379 IF(lwp) WRITE(numout,*) ' E R R O R : Found an acute open boundary corner at point (i,j)= ', &1380 & jpindt(ib2), jpjedt(ib1)1381 IF(lwp) WRITE(numout,*) ' ========== Not allowed yet'1382 IF(lwp) WRITE(numout,*) ' Crossing problem with East segment: ',npckge(ib1), &1383 & ' and North segment: ',npckgn(ib2)1384 IF(lwp) WRITE(numout,*)1385 nstop = nstop + 11386 ELSE1387 IF(lwp) WRITE(numout,*)1388 IF(lwp) WRITE(numout,*) ' E R R O R : Check North and East Open boundary indices'1389 IF(lwp) WRITE(numout,*) ' ========== Crossing problem with East segment: ',npckge(ib1), &1390 & ' and North segment: ',npckgn(ib2)1391 IF(lwp) WRITE(numout,*)1392 nstop = nstop + 11393 END IF1394 END IF1395 END DO1396 END DO1397 END IF1398 !1399 ! 3. Check if segment extremities are on land1400 !--------------------------------------------1401 !1402 ! West segments1403 DO ib = 1, nbdysegw1404 ! get mask at boundary extremities:1405 ztestmask(1:2)=0.1406 DO ji = 1, jpi1407 DO jj = 1, jpj1408 IF (((ji + nimpp - 1) == jpiwob(ib)).AND. &1409 & ((jj + njmpp - 1) == jpjwdt(ib))) ztestmask(1)=tmask(ji,jj,1)1410 IF (((ji + nimpp - 1) == jpiwob(ib)).AND. &1411 & ((jj + njmpp - 1) == jpjwft(ib))) ztestmask(2)=tmask(ji,jj,1)1412 END DO1413 END DO1414 IF( lk_mpp ) CALL mpp_sum( ztestmask, 2 ) ! sum over the global domain1415 1416 IF (ztestmask(1)==1) THEN1417 IF (icornw(ib,1)==0) THEN1418 IF(lwp) WRITE(numout,*)1419 IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgw(ib)1420 IF(lwp) WRITE(numout,*) ' ========== does not start on land or on a corner'1421 IF(lwp) WRITE(numout,*)1422 nstop = nstop + 11423 ELSE1424 ! This is a corner1425 WRITE(numout,*) 'Found a South-West corner at (i,j): ', jpiwob(ib), jpjwdt(ib)1426 CALL bdy_ctl_corn(npckgw(ib), icornw(ib,1))1427 itest=itest+11428 ENDIF1429 ENDIF1430 IF (ztestmask(2)==1) THEN1431 IF (icornw(ib,2)==0) THEN1432 IF(lwp) WRITE(numout,*)1433 IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgw(ib)1434 IF(lwp) WRITE(numout,*) ' ========== does not end on land or on a corner'1435 IF(lwp) WRITE(numout,*)1436 nstop = nstop + 11437 ELSE1438 ! This is a corner1439 WRITE(numout,*) 'Found a North-West corner at (i,j): ', jpiwob(ib), jpjwft(ib)1440 CALL bdy_ctl_corn(npckgw(ib), icornw(ib,2))1441 itest=itest+11442 ENDIF1443 ENDIF1444 END DO1445 !1446 ! East segments1447 DO ib = 1, nbdysege1448 ! get mask at boundary extremities:1449 ztestmask(1:2)=0.1450 DO ji = 1, jpi1451 DO jj = 1, jpj1452 IF (((ji + nimpp - 1) == jpieob(ib)+1).AND. &1453 & ((jj + njmpp - 1) == jpjedt(ib))) ztestmask(1)=tmask(ji,jj,1)1454 IF (((ji + nimpp - 1) == jpieob(ib)+1).AND. &1455 & ((jj + njmpp - 1) == jpjeft(ib))) ztestmask(2)=tmask(ji,jj,1)1456 END DO1457 END DO1458 IF( lk_mpp ) CALL mpp_sum( ztestmask, 2 ) ! sum over the global domain1459 1460 IF (ztestmask(1)==1) THEN1461 IF (icorne(ib,1)==0) THEN1462 IF(lwp) WRITE(numout,*)1463 IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckge(ib)1464 IF(lwp) WRITE(numout,*) ' ========== does not start on land or on a corner'1465 IF(lwp) WRITE(numout,*)1466 nstop = nstop + 11467 ELSE1468 ! This is a corner1469 WRITE(numout,*) 'Found a South-East corner at (i,j): ', jpieob(ib)+1, jpjedt(ib)1470 CALL bdy_ctl_corn(npckge(ib), icorne(ib,1))1471 itest=itest+11472 ENDIF1473 ENDIF1474 IF (ztestmask(2)==1) THEN1475 IF (icorne(ib,2)==0) THEN1476 IF(lwp) WRITE(numout,*)1477 IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckge(ib)1478 IF(lwp) WRITE(numout,*) ' ========== does not end on land or on a corner'1479 IF(lwp) WRITE(numout,*)1480 nstop = nstop + 11481 ELSE1482 ! This is a corner1483 WRITE(numout,*) 'Found a North-East corner at (i,j): ', jpieob(ib)+1, jpjeft(ib)1484 CALL bdy_ctl_corn(npckge(ib), icorne(ib,2))1485 itest=itest+11486 ENDIF1487 ENDIF1488 END DO1489 !1490 ! South segments1491 DO ib = 1, nbdysegs1492 ! get mask at boundary extremities:1493 ztestmask(1:2)=0.1494 DO ji = 1, jpi1495 DO jj = 1, jpj1496 IF (((jj + njmpp - 1) == jpjsob(ib)).AND. &1497 & ((ji + nimpp - 1) == jpisdt(ib))) ztestmask(1)=tmask(ji,jj,1)1498 IF (((jj + njmpp - 1) == jpjsob(ib)).AND. &1499 & ((ji + nimpp - 1) == jpisft(ib))) ztestmask(2)=tmask(ji,jj,1)1500 END DO1501 END DO1502 IF( lk_mpp ) CALL mpp_sum( ztestmask, 2 ) ! sum over the global domain1503 1504 IF ((ztestmask(1)==1).AND.(icorns(ib,1)==0)) THEN1505 IF(lwp) WRITE(numout,*)1506 IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgs(ib)1507 IF(lwp) WRITE(numout,*) ' ========== does not start on land or on a corner'1508 IF(lwp) WRITE(numout,*)1509 nstop = nstop + 11510 ENDIF1511 IF ((ztestmask(2)==1).AND.(icorns(ib,2)==0)) THEN1512 IF(lwp) WRITE(numout,*)1513 IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgs(ib)1514 IF(lwp) WRITE(numout,*) ' ========== does not end on land or on a corner'1515 IF(lwp) WRITE(numout,*)1516 nstop = nstop + 11517 ENDIF1518 END DO1519 !1520 ! North segments1521 DO ib = 1, nbdysegn1522 ! get mask at boundary extremities:1523 ztestmask(1:2)=0.1524 DO ji = 1, jpi1525 DO jj = 1, jpj1526 IF (((jj + njmpp - 1) == jpjnob(ib)+1).AND. &1527 & ((ji + nimpp - 1) == jpindt(ib))) ztestmask(1)=tmask(ji,jj,1)1528 IF (((jj + njmpp - 1) == jpjnob(ib)+1).AND. &1529 & ((ji + nimpp - 1) == jpinft(ib))) ztestmask(2)=tmask(ji,jj,1)1530 END DO1531 END DO1532 IF( lk_mpp ) CALL mpp_sum( ztestmask, 2 ) ! sum over the global domain1533 1534 IF ((ztestmask(1)==1).AND.(icornn(ib,1)==0)) THEN1535 IF(lwp) WRITE(numout,*)1536 IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgn(ib)1537 IF(lwp) WRITE(numout,*) ' ========== does not start on land'1538 IF(lwp) WRITE(numout,*)1539 nstop = nstop + 11540 ENDIF1541 IF ((ztestmask(2)==1).AND.(icornn(ib,2)==0)) THEN1542 IF(lwp) WRITE(numout,*)1543 IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgn(ib)1544 IF(lwp) WRITE(numout,*) ' ========== does not end on land'1545 IF(lwp) WRITE(numout,*)1546 nstop = nstop + 11547 ENDIF1548 END DO1549 !1550 IF ((itest==0).AND.(lwp)) WRITE(numout,*) 'NO open boundary corner found'1551 !1552 ! Other tests TBD:1553 ! segments completly on land1554 ! optimized open boundary array length according to landmask1555 ! Nudging layers that overlap with interior domain1556 !1557 END SUBROUTINE bdy_ctl_seg1558 1559 SUBROUTINE bdy_ctl_corn( ib1, ib2 )1560 !!----------------------------------------------------------------------1561 !! *** ROUTINE bdy_ctl_corn ***1562 !!1563 !! ** Purpose : Check numerical schemes consistency between1564 !! segments having a common corner1565 !!1566 !! ** Method :1567 !!----------------------------------------------------------------------1568 INTEGER, INTENT(in) :: ib1, ib21569 INTEGER :: itest1570 !!----------------------------------------------------------------------1571 itest = 01572 1573 IF (nn_dyn2d(ib1)/=nn_dyn2d(ib2)) itest = itest + 11574 IF (nn_dyn3d(ib1)/=nn_dyn3d(ib2)) itest = itest + 11575 IF (nn_tra(ib1)/=nn_tra(ib2)) itest = itest + 11576 !1577 IF (nn_dyn2d_dta(ib1)/=nn_dyn2d_dta(ib2)) itest = itest + 11578 IF (nn_dyn3d_dta(ib1)/=nn_dyn3d_dta(ib2)) itest = itest + 11579 IF (nn_tra_dta(ib1)/=nn_tra_dta(ib2)) itest = itest + 11580 !1581 IF (nn_rimwidth(ib1)/=nn_rimwidth(ib2)) itest = itest + 11582 !1583 IF ( itest>0 ) THEN1584 IF(lwp) WRITE(numout,*) ' E R R O R : Segments ', ib1, 'and ', ib21585 IF(lwp) WRITE(numout,*) ' ========== have different open bdy schemes'1586 IF(lwp) WRITE(numout,*)1587 nstop = nstop + 11588 ENDIF1589 !1590 END SUBROUTINE bdy_ctl_corn1591 819 1592 820 #else -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdytides.F90
r3651 r6736 8 8 !! 3.0 ! 2008-04 (NEMO team) add in the reference version 9 9 !! 3.3 ! 2010-09 (D.Storkey and E.O'Dea) bug fixes 10 !! 3.4 ! 2012-09 (G. Reffray and J. Chanut) New inputs + mods 10 !! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge 11 !! 3.4 ! 2013 (J. Harle) rewite to used tide_mod for phase and nodal 12 !! corrections every day 11 13 !!---------------------------------------------------------------------- 12 14 #if defined key_bdy … … 15 17 !!---------------------------------------------------------------------- 16 18 !! PUBLIC 17 !! bdytide_init : read of namelist and initialisation of tidal harmonics data19 !! tide_init : read of namelist and initialisation of tidal harmonics data 18 20 !! tide_update : calculation of tidal forcing at each timestep 19 21 !!---------------------------------------------------------------------- … … 27 29 USE bdy_par ! Unstructured boundary parameters 28 30 USE bdy_oce ! ocean open boundary conditions 31 USE fldread, ONLY: fld_map 29 32 USE daymod ! calendar 30 USE wrk_nemo ! Memory allocation 31 USE tideini 32 ! USE tide_mod ! Useless ?? 33 USE fldread, ONLY: fld_map 33 USE tide_mod 34 USE ioipsl, ONLY : ymds2ju ! for calendar 34 35 35 36 IMPLICIT NONE 36 37 PRIVATE 37 38 38 PUBLIC bdytide_init ! routine called in bdy_init39 PUBLIC bdytide_update ! routine called in bdy_dta39 PUBLIC tide_init ! routine called in nemo_init 40 PUBLIC tide_update ! routine called in bdydyn 40 41 41 42 TYPE, PUBLIC :: TIDES_DATA !: Storage for external tidal harmonics data 42 REAL(wp), POINTER, DIMENSION(:,:,:) :: ssh0 !: Tidal constituents : SSH0 (read in file) 43 REAL(wp), POINTER, DIMENSION(:,:,:) :: u0 !: Tidal constituents : U0 (read in file) 44 REAL(wp), POINTER, DIMENSION(:,:,:) :: v0 !: Tidal constituents : V0 (read in file) 45 REAL(wp), POINTER, DIMENSION(:,:,:) :: ssh !: Tidal constituents : SSH (after nodal cor.) 46 REAL(wp), POINTER, DIMENSION(:,:,:) :: u !: Tidal constituents : U (after nodal cor.) 47 REAL(wp), POINTER, DIMENSION(:,:,:) :: v !: Tidal constituents : V (after nodal cor.) 43 INTEGER :: ncpt !: Actual number of tidal components 44 REAL(wp), POINTER, DIMENSION(:) :: speed !: Phase speed of tidal constituent (deg/hr) 45 REAL(wp), POINTER, DIMENSION(:,:,:) :: ssh !: Tidal constituents : SSH 46 REAL(wp), POINTER, DIMENSION(:,:,:) :: u !: Tidal constituents : U 47 REAL(wp), POINTER, DIMENSION(:,:,:) :: v !: Tidal constituents : V 48 REAL(wp), POINTER, DIMENSION(:,:,:) :: sshr !: Tidal constituents : SSH (reference) 49 REAL(wp), POINTER, DIMENSION(:,:,:) :: ur !: Tidal constituents : U (reference) 50 REAL(wp), POINTER, DIMENSION(:,:,:) :: vr !: Tidal constituents : V (reference) 48 51 END TYPE TIDES_DATA 49 52 50 TYPE(TIDES_DATA), PUBLIC, DIMENSION(jp_bdy), TARGET :: tides !: External tidal harmonics data 51 53 TYPE(TIDES_DATA), PUBLIC, DIMENSION(jp_bdy), TARGET :: tides !: External tidal harmonics data 54 55 INTEGER, ALLOCATABLE, DIMENSION(:) :: bdy_ntide 56 REAL(wp), ALLOCATABLE, DIMENSION(:) :: bdy_omega_tide 57 REAL(wp), ALLOCATABLE, DIMENSION(:) :: bdy_v0tide, & 58 bdy_blank, & 59 bdy_utide, & 60 bdy_ftide, & 61 rbdy_ftide 62 LOGICAL :: ln_tide_date !: =T correct tide phases and amplitude for model start date 63 LOGICAL :: ln_tide_v0 !: =T correct tide phases and amplitude for model start date 64 INTEGER :: nn_tide_date !: yyyymmdd reference date of tidal data 65 INTEGER :: bdy_nn_tide 66 INTEGER :: bdy_kt_tide ! Main tide timestep counter 67 INTEGER :: bdy_tide_offset ! Main tide timestep counter 68 52 69 !!---------------------------------------------------------------------- 53 70 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 57 74 CONTAINS 58 75 59 SUBROUTINE bdytide_init60 !!---------------------------------------------------------------------- 61 !! *** SUBROUTINE bdytide_init ***76 SUBROUTINE tide_init 77 !!---------------------------------------------------------------------- 78 !! *** SUBROUTINE tide_init *** 62 79 !! 63 80 !! ** Purpose : - Read in namelist for tides and initialise external … … 67 84 !! namelist variables 68 85 !!------------------- 69 CHARACTER(len=80) :: filtide !: Filename root for tidal input files 70 LOGICAL :: ln_bdytide_2ddta !: If true, read 2d harmonic data 71 LOGICAL :: ln_bdytide_conj !: If true, assume complex conjugate tidal data 86 CHARACTER(len=80) :: filtide !: Filename root for tidal input files 87 CHARACTER(len= 4), DIMENSION(jpmax_harmo) :: tide_cpt !: Names of tidal components used. 72 88 !! 73 INTEGER :: ib_bdy, itide, ib !: dummy loop indices 74 INTEGER :: ii, ij !: dummy loop indices 89 INTEGER :: ib_bdy, itide, ib, ji !: dummy loop indices 75 90 INTEGER :: inum, igrd 76 INTEGER , DIMENSION(3) :: ilen0 !: length of boundary data (from OBC arrays)77 INTEGER, POINTER, DIMENSION(:) :: nblen, nblenrim ! short cuts78 CHARACTER(len=80) :: clfile !: full file name for tidal input file79 REAL(wp) ,ALLOCATABLE, DIMENSION(:,:,:) :: dta_read !: work space to read in tidal harmonics data80 REAL(wp), POINTER, DIMENSION(:,:) :: ztr, zti !: " " " " " " " "91 INTEGER :: lcl_ryear, lcl_rmonth, lcl_rday 92 INTEGER, DIMENSION(3) :: ilen0 !: length of boundary data (from OBC arrays) 93 CHARACTER(len=80) :: clfile !: full file name for tidal input file 94 REAL(wp) :: z_arg, z_atde, z_btde, z1t, z2t, fdayn, fdayr 95 REAL(wp),ALLOCATABLE, DIMENSION(:,:,:) :: dta_read !: work space to read in tidal harmonics data 81 96 !! 82 TYPE(TIDES_DATA), POINTER :: td 97 TYPE(TIDES_DATA), POINTER :: td !: local short cut 83 98 !! 84 NAMELIST/nambdy_tide/filtide, ln_bdytide_2ddta, ln_bdytide_conj 85 !!---------------------------------------------------------------------- 86 87 IF( nn_timing == 1 ) CALL timing_start('bdytide_init') 88 89 IF (nb_bdy>0) THEN 90 IF(lwp) WRITE(numout,*) 91 IF(lwp) WRITE(numout,*) 'bdytide_init : initialization of tidal harmonic forcing at open boundaries' 92 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 93 ENDIF 94 95 ln_bdytide_2ddta = .FALSE. 96 ln_bdytide_conj = .FALSE. 99 NAMELIST/nambdy_tide/filtide, tide_cpt, ln_tide_date, nn_tide_date, ln_tide_v0 100 !!---------------------------------------------------------------------- 101 102 IF( nn_timing == 1 ) CALL timing_start('tide_init') 103 104 IF(lwp) WRITE(numout,*) 105 IF(lwp) WRITE(numout,*) 'tide_init : initialization of tidal harmonic forcing at open boundaries' 106 IF(lwp) WRITE(numout,*) '~~~~~~~~~' 97 107 98 108 REWIND(numnam) … … 101 111 102 112 td => tides(ib_bdy) 103 nblen => idx_bdy(ib_bdy)%nblen104 nblenrim => idx_bdy(ib_bdy)%nblenrim105 113 106 114 ! Namelist nambdy_tide : tidal harmonic forcing at open boundaries 115 ln_tide_date = .false. 116 ln_tide_v0 = .false. 107 117 filtide(:) = '' 118 tide_cpt(:) = '' 119 120 ! Initialise bdy_ky_tide: updated in tide_update if using time correction otherwise defaults to 1 121 bdy_kt_tide=1 108 122 109 123 ! Don't REWIND here - may need to read more than one of these namelists. 110 124 READ ( numnam, nambdy_tide ) 125 ! ! Count number of components specified 126 td%ncpt = 0 127 DO itide = 1, jpmax_harmo 128 IF( tide_cpt(itide) /= '' ) THEN 129 td%ncpt = td%ncpt + 1 130 ENDIF 131 END DO 132 133 CALL tide_init_Wave 134 135 ! Find constituents in standard list 136 ALLOCATE(bdy_ntide (td%ncpt)) 137 138 DO itide=1,td%ncpt 139 bdy_ntide(itide)=0 140 DO ji=1,jpmax_harmo 141 IF ( TRIM( tide_cpt(itide) ) .eq. Wave(ji)%cname_tide) THEN 142 bdy_ntide(itide) = ji 143 EXIT 144 END IF 145 END DO 146 IF (bdy_ntide(itide).eq.0) THEN 147 CALL ctl_stop( 'BDYTIDE tidal components do not match up with tide.h90' ) 148 ENDIF 149 END DO 150 151 ! Fill in phase speeds from tide_pulse 152 ALLOCATE(bdy_omega_tide(td%ncpt)) 153 CALL tide_pulse( bdy_omega_tide, bdy_ntide ,td%ncpt) 154 155 ALLOCATE( td%speed(td%ncpt) ) 156 td%speed = bdy_omega_tide(1:td%ncpt) 157 111 158 ! ! Parameter control and print 112 IF(lwp) WRITE(numout,*) ' ' 113 IF(lwp) WRITE(numout,*) ' Namelist nambdy_tide : tidal harmonic forcing at open boundaries' 114 IF(lwp) WRITE(numout,*) ' read tidal data in 2d files: ', ln_bdytide_2ddta 115 IF(lwp) WRITE(numout,*) ' assume complex conjugate : ', ln_bdytide_conj 116 IF(lwp) WRITE(numout,*) ' Number of tidal components to read: ', nb_harmo 117 IF(lwp) THEN 118 WRITE(numout,*) ' Tidal cpt name - Phase speed (deg/hr)' 119 DO itide = 1, nb_harmo 120 WRITE(numout,*) ' ', Wave(ntide(itide))%cname_tide, omega_tide(itide) 121 END DO 122 ENDIF 123 IF(lwp) WRITE(numout,*) ' ' 124 125 ! Allocate space for tidal harmonics data - get size from OBC data arrays 126 ! ----------------------------------------------------------------------- 127 128 ! JC: If FRS scheme is used, we assume that tidal is needed over the whole 129 ! relaxation area 130 IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 131 ilen0(:)=nblen(:) 159 IF( td%ncpt < 1 ) THEN 160 CALL ctl_stop( ' Did not find any tidal components in namelist nambdy_tide' ) 132 161 ELSE 133 ilen0(:)=nblenrim(:) 162 IF(lwp) WRITE(numout,*) ' Namelist nambdy_tide : tidal harmonic forcing at open boundaries' 163 IF(lwp) WRITE(numout,*) ' tidal components specified ', td%ncpt 164 IF(lwp) WRITE(numout,*) ' ', tide_cpt(1:td%ncpt) 165 IF(lwp) WRITE(numout,*) ' associated phase speeds (deg/hr) : ' 166 IF(lwp) WRITE(numout,*) ' ', td%speed(1:td%ncpt) 134 167 ENDIF 135 168 136 ALLOCATE( td%ssh0( ilen0(1), nb_harmo, 2 ) ) 137 ALLOCATE( td%ssh ( ilen0(1), nb_harmo, 2 ) ) 138 139 ALLOCATE( td%u0( ilen0(2), nb_harmo, 2 ) ) 140 ALLOCATE( td%u ( ilen0(2), nb_harmo, 2 ) ) 141 142 ALLOCATE( td%v0( ilen0(3), nb_harmo, 2 ) ) 143 ALLOCATE( td%v ( ilen0(3), nb_harmo, 2 ) ) 144 145 td%ssh0(:,:,:) = 0.e0 146 td%ssh(:,:,:) = 0.e0 147 td%u0(:,:,:) = 0.e0 148 td%u(:,:,:) = 0.e0 149 td%v0(:,:,:) = 0.e0 150 td%v(:,:,:) = 0.e0 151 152 IF (ln_bdytide_2ddta) THEN 153 ! It is assumed that each data file contains all complex harmonic amplitudes 154 ! given on the data domain (ie global, jpidta x jpjdta) 155 ! 156 CALL wrk_alloc( jpi, jpj, zti, ztr ) 157 ! 158 ! SSH fields 159 clfile = TRIM(filtide)//'_grid_T.nc' 160 CALL iom_open (clfile , inum ) 161 igrd = 1 ! Everything is at T-points here 162 DO itide = 1, nb_harmo 163 CALL iom_get ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_z1', ztr(:,:) ) 164 CALL iom_get ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_z2', zti(:,:) ) 165 DO ib = 1, ilen0(igrd) 166 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 167 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 168 td%ssh0(ib,itide,1) = ztr(ii,ij) 169 td%ssh0(ib,itide,2) = zti(ii,ij) 170 END DO 171 END DO 169 ! Allocate space for tidal harmonics data - 170 ! get size from OBC data arrays 171 ! --------------------------------------- 172 173 ilen0(1) = SIZE( dta_bdy(ib_bdy)%ssh ) 174 ALLOCATE( td%ssh( ilen0(1), td%ncpt, 2 ) ) 175 ALLOCATE( td%sshr( ilen0(1), td%ncpt, 2 ) ) 176 177 ilen0(2) = SIZE( dta_bdy(ib_bdy)%u2d ) 178 ALLOCATE( td%u( ilen0(2), td%ncpt, 2 ) ) 179 ALLOCATE( td%ur( ilen0(2), td%ncpt, 2 ) ) 180 181 ilen0(3) = SIZE( dta_bdy(ib_bdy)%v2d ) 182 ALLOCATE( td%v( ilen0(3), td%ncpt, 2 ) ) 183 ALLOCATE( td%vr( ilen0(3), td%ncpt, 2 ) ) 184 185 ALLOCATE( dta_read( MAXVAL(ilen0), 1, 1 ) ) 186 187 ! Set day length in timesteps for use if making phase and nodal corrections 188 bdy_nn_tide=NINT(rday/rdt) 189 190 191 ALLOCATE(bdy_v0tide (td%ncpt)) 192 ALLOCATE(bdy_blank (td%ncpt)) 193 ALLOCATE(bdy_utide (td%ncpt)) 194 ALLOCATE(bdy_ftide (td%ncpt)) 195 ALLOCATE(rbdy_ftide (td%ncpt)) 196 197 ! Open files and read in tidal forcing data 198 ! ----------------------------------------- 199 200 DO itide = 1, td%ncpt 201 ! ! SSH fields 202 clfile = TRIM(filtide)//TRIM(tide_cpt(itide))//'_grid_T.nc' 203 IF(lwp) WRITE(numout,*) 'Reading data from file ', clfile 204 CALL iom_open( clfile, inum ) 205 CALL fld_map( inum, 'z1' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 206 td%ssh(:,itide,1) = dta_read(1:ilen0(1),1,1) 207 CALL fld_map( inum, 'z2' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 208 td%ssh(:,itide,2) = dta_read(1:ilen0(1),1,1) 209 CALL iom_close( inum ) 210 ! ! U fields 211 clfile = TRIM(filtide)//TRIM(tide_cpt(itide))//'_grid_U.nc' 212 IF(lwp) WRITE(numout,*) 'Reading data from file ', clfile 213 CALL iom_open( clfile, inum ) 214 CALL fld_map( inum, 'u1' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 215 td%u(:,itide,1) = dta_read(1:ilen0(2),1,1) 216 CALL fld_map( inum, 'u2' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 217 td%u(:,itide,2) = dta_read(1:ilen0(2),1,1) 218 CALL iom_close( inum ) 219 ! ! V fields 220 clfile = TRIM(filtide)//TRIM(tide_cpt(itide))//'_grid_V.nc' 221 IF(lwp) WRITE(numout,*) 'Reading data from file ', clfile 222 CALL iom_open( clfile, inum ) 223 CALL fld_map( inum, 'v1' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 224 td%v(:,itide,1) = dta_read(1:ilen0(3),1,1) 225 CALL fld_map( inum, 'v2' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 226 td%v(:,itide,2) = dta_read(1:ilen0(3),1,1) 172 227 CALL iom_close( inum ) 173 228 ! 174 ! U fields 175 clfile = TRIM(filtide)//'_grid_U.nc' 176 CALL iom_open (clfile , inum ) 177 igrd = 2 ! Everything is at U-points here 178 DO itide = 1, nb_harmo 179 CALL iom_get ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_u1', ztr(:,:) ) 180 CALL iom_get ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_u2', zti(:,:) ) 181 DO ib = 1, ilen0(igrd) 182 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 183 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 184 td%u0(ib,itide,1) = ztr(ii,ij) 185 td%u0(ib,itide,2) = zti(ii,ij) 186 END DO 187 END DO 188 CALL iom_close( inum ) 189 ! 190 ! V fields 191 clfile = TRIM(filtide)//'_grid_V.nc' 192 CALL iom_open (clfile , inum ) 193 igrd = 3 ! Everything is at V-points here 194 DO itide = 1, nb_harmo 195 CALL iom_get ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_v1', ztr(:,:) ) 196 CALL iom_get ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_v2', zti(:,:) ) 197 DO ib = 1, ilen0(igrd) 198 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 199 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 200 td%v0(ib,itide,1) = ztr(ii,ij) 201 td%v0(ib,itide,2) = zti(ii,ij) 202 END DO 203 END DO 204 CALL iom_close( inum ) 205 ! 206 CALL wrk_dealloc( jpi, jpj, ztr, zti ) 207 ! 208 ELSE 209 ! 210 ! Read tidal data only on bdy segments 211 ! 212 ALLOCATE( dta_read( MAXVAL(ilen0(1:3)), 1, 1 ) ) 213 214 ! Open files and read in tidal forcing data 215 ! ----------------------------------------- 216 217 DO itide = 1, nb_harmo 218 ! ! SSH fields 219 clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_T.nc' 220 CALL iom_open( clfile, inum ) 221 CALL fld_map( inum, 'z1' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 222 td%ssh0(:,itide,1) = dta_read(1:ilen0(1),1,1) 223 CALL fld_map( inum, 'z2' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 224 td%ssh0(:,itide,2) = dta_read(1:ilen0(1),1,1) 225 CALL iom_close( inum ) 226 ! ! U fields 227 clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_U.nc' 228 CALL iom_open( clfile, inum ) 229 CALL fld_map( inum, 'u1' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 230 td%u0(:,itide,1) = dta_read(1:ilen0(2),1,1) 231 CALL fld_map( inum, 'u2' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 232 td%u0(:,itide,2) = dta_read(1:ilen0(2),1,1) 233 CALL iom_close( inum ) 234 ! ! V fields 235 clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_V.nc' 236 CALL iom_open( clfile, inum ) 237 CALL fld_map( inum, 'v1' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 238 td%v0(:,itide,1) = dta_read(1:ilen0(3),1,1) 239 CALL fld_map( inum, 'v2' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 240 td%v0(:,itide,2) = dta_read(1:ilen0(3),1,1) 241 CALL iom_close( inum ) 242 ! 243 END DO ! end loop on tidal components 244 ! 245 DEALLOCATE( dta_read ) 246 ENDIF ! ln_bdytide_2ddta=.true. 247 ! 248 IF ( ln_bdytide_conj ) THEN ! assume complex conjugate in data files 249 td%ssh0(:,:,2) = - td%ssh0(:,:,2) 250 td%u0 (:,:,2) = - td%u0 (:,:,2) 251 td%v0 (:,:,2) = - td%v0 (:,:,2) 229 END DO ! end loop on tidal components 230 231 IF( ln_tide_date .and. ln_tide_v0 ) THEN ! correct for date factors: gather v0 232 CALL tide_harmo(bdy_omega_tide, bdy_v0tide, bdy_utide, bdy_ftide, bdy_ntide, td%ncpt, nn_tide_date) 233 234 lcl_ryear = INT(nn_tide_date / 10000 ) 235 lcl_rmonth = INT((nn_tide_date - lcl_ryear * 10000 ) / 100 ) 236 lcl_rday = INT(nn_tide_date - lcl_ryear * 10000 - lcl_rmonth * 100) 237 nyear = int(ndate0 / 10000 ) ! initial year 238 nmonth = int((ndate0 - nyear * 10000 ) / 100 ) ! initial month 239 nday = int(ndate0 - nyear * 10000 - nmonth * 100) 240 CALL ymds2ju( nyear, nmonth, nday, 0._wp, fdayn ) 241 CALL ymds2ju( lcl_ryear, lcl_rmonth, lcl_rday, 0._wp, fdayr ) 242 bdy_tide_offset = NINT( fdayn - fdayr ) * 86400 243 IF(lwp) WRITE(numout,*) ' BDYTIDE offset ' 244 IF(lwp) WRITE(numout,*) ' ', lcl_ryear, lcl_rmonth, lcl_rday 245 IF(lwp) WRITE(numout,*) ' ', nyear, nmonth, nday 246 IF(lwp) WRITE(numout,*) ' ', fdayn, fdayr, bdy_tide_offset 247 ELSE 248 bdy_v0tide(:)=0 249 bdy_utide(:)=0 250 bdy_ftide(:)=1 251 bdy_tide_offset = 0 252 IF(lwp) WRITE(numout,*) ' BDYTIDE offset ', bdy_tide_offset 252 253 ENDIF 254 255 ! Pass tidal forcing data to reference arrays for date correction to tidal harmonics 256 257 DO itide = 1, td%ncpt ! loop on tidal components 258 ! ! elevation 259 igrd = 1 260 DO ib = 1, ilen0(igrd) 261 td%sshr(ib,itide,1) = td%ssh(ib,itide,1) 262 td%sshr(ib,itide,2) = td%ssh(ib,itide,2) 263 END DO 264 ! ! u 265 igrd = 2 266 DO ib = 1, ilen0(igrd) 267 td%ur(ib,itide,1) = td%u(ib,itide,1) 268 td%ur(ib,itide,2) = td%u(ib,itide,2) 269 END DO 270 ! ! v 271 igrd = 3 272 DO ib = 1, ilen0(igrd) 273 td%vr(ib,itide,1) = td%v(ib,itide,1) 274 td%vr(ib,itide,2) = td%v(ib,itide,2) 275 ENDDO 276 ENDDO ! loop on tidal components 277 278 IF(lwp) WRITE(numout,*) 'BDYTIDE: summary of mappings' 279 DO itide = 1, td%ncpt ! loop on tidal components 280 IF(lwp) WRITE(numout,'(2i3,x,a)') itide, bdy_ntide(itide), tide_cpt(itide) 281 ENDDO 282 253 283 ! 254 284 ENDIF ! nn_dyn2d_dta(ib_bdy) .ge. 2 … … 256 286 END DO ! loop on ib_bdy 257 287 258 IF( nn_timing == 1 ) CALL timing_stop('bdytide_init') 259 260 END SUBROUTINE bdytide_init 261 262 SUBROUTINE bdytide_update ( kt, idx, dta, td, jit, time_offset ) 263 !!---------------------------------------------------------------------- 264 !! *** SUBROUTINE bdytide_update *** 288 IF( nn_timing == 1 ) CALL timing_stop('tide_init') 289 290 END SUBROUTINE tide_init 291 292 293 SUBROUTINE tide_update ( kt, idx, dta, td, jit, time_offset ) 294 !!---------------------------------------------------------------------- 295 !! *** SUBROUTINE tide_update *** 265 296 !! 266 297 !! ** Purpose : - Add tidal forcing to ssh, u2d and v2d OBC data arrays. 267 298 !! 268 299 !!---------------------------------------------------------------------- 269 INTEGER, INTENT( in ) :: kt ! Main timestep counter 270 TYPE(OBC_INDEX), INTENT( in ) :: idx ! OBC indices 271 TYPE(OBC_DATA), INTENT(inout) :: dta ! OBC external data 272 TYPE(TIDES_DATA),INTENT( inout ) :: td ! tidal harmonics data 273 INTEGER,INTENT(in),OPTIONAL :: jit ! Barotropic timestep counter (for timesplitting option) 274 INTEGER,INTENT( in ), OPTIONAL :: time_offset ! time offset in units of timesteps. NB. if jit 275 ! is present then units = subcycle timesteps. 276 ! time_offset = 0 => get data at "now" time level 277 ! time_offset = -1 => get data at "before" time level 278 ! time_offset = +1 => get data at "after" time level 279 ! etc. 300 INTEGER, INTENT( in ) :: kt ! Main timestep counter 301 !!gm doctor jit ==> kit 302 TYPE(OBC_INDEX), INTENT( in ) :: idx ! OBC indices 303 TYPE(OBC_DATA), INTENT(inout) :: dta ! OBC external data 304 TYPE(TIDES_DATA),INTENT(inout) :: td ! tidal harmonics data 305 INTEGER,INTENT(in),OPTIONAL :: jit ! Barotropic timestep counter (for timesplitting option) 306 INTEGER,INTENT( in ), OPTIONAL :: time_offset ! time offset in units of timesteps. NB. if jit 307 ! is present then units = subcycle timesteps. 308 ! time_offset = 0 => get data at "now" time level 309 ! time_offset = -1 => get data at "before" time level 310 ! time_offset = +1 => get data at "after" time level 311 ! etc. 280 312 !! 281 INTEGER, DIMENSION(3) :: ilen0 !: length of boundary data (from OBC arrays) 282 INTEGER :: itide, igrd, ib ! dummy loop indices 283 INTEGER :: time_add ! time offset in units of timesteps 284 REAL(wp) :: z_arg, z_sarg, zflag, zramp 313 INTEGER :: itide, igrd, ib ! dummy loop indices 314 INTEGER :: time_add ! time offset in units of timesteps 315 INTEGER :: sub_step ! dummy for jit (probably not required as 316 ! timesplitting always used?) 317 REAL(wp) :: z_arg, z_sarg 285 318 REAL(wp), DIMENSION(jpmax_harmo) :: z_sist, z_cost 286 !!---------------------------------------------------------------------- 287 288 IF( nn_timing == 1 ) CALL timing_start('bdytide_update') 289 290 ilen0(1) = SIZE(td%ssh(:,1,1)) 291 ilen0(2) = SIZE(td%u(:,1,1)) 292 ilen0(3) = SIZE(td%v(:,1,1)) 293 294 zflag=1 295 IF ( PRESENT(jit) ) THEN 296 IF ( jit /= 1 ) zflag=0 297 ENDIF 298 299 IF ( nsec_day == NINT(0.5 * rdttra(1)) .AND. zflag==1 ) THEN 300 ! 301 kt_tide = kt 302 ! 303 IF(lwp) THEN 304 WRITE(numout,*) 305 WRITE(numout,*) 'bdytide_update : (re)Initialization of the tidal bdy forcing at kt=',kt 306 WRITE(numout,*) '~~~~~~~~~~~~~~ ' 307 ENDIF 308 ! 309 CALL tide_init_elevation ( idx, td ) 310 CALL tide_init_velocities( idx, td ) 311 ! 312 ENDIF 319 REAL(wp) :: z_atde, z_btde 320 REAL(wp) :: z1t, z2t 321 !!---------------------------------------------------------------------- 322 323 IF( nn_timing == 1 ) CALL timing_start('tide_update') 313 324 314 325 time_add = 0 … … 316 327 time_add = time_offset 317 328 ENDIF 318 329 330 ! Phase corrections for the current day 331 332 sub_step = 1 319 333 IF( PRESENT(jit) ) THEN 320 z_arg = ( ((kt-kt_tide)-1) * rdt + (jit+time_add) * rdt / REAL(nn_baro,wp) ) 334 sub_step = jit 335 ENDIF 336 337 IF( ln_tide_date ) THEN ! correct for date factors 338 339 IF ( ( MOD( kt - 1, bdy_nn_tide ) == 0 ) .and. (sub_step==1) ) THEN 340 IF ( ln_tide_v0 ) THEN 341 bdy_kt_tide = 1 342 CALL tide_harmo(bdy_omega_tide, bdy_blank, bdy_utide, bdy_ftide, bdy_ntide, td%ncpt, ndastp) 343 ELSE 344 bdy_kt_tide = kt 345 CALL tide_harmo(bdy_omega_tide, bdy_v0tide, bdy_utide, bdy_ftide, bdy_ntide, td%ncpt, ndastp) 346 ENDIF 347 348 DO itide = 1, td%ncpt ! loop on tidal components 349 IF(lwp) WRITE(numout,*) 'BDYTIDE CORR:', itide, bdy_omega_tide(itide), bdy_v0tide(itide), & 350 & bdy_utide(itide), bdy_ftide(itide) 351 ENDDO 352 353 ! Make adjustment for reference date in tidal harmonic data 354 IF(lwp) WRITE(numout,*) 'BDYTIDE: nodal and phase correction at the start of day ', & 355 & (kt-1)*rdt/rday + 1 356 357 DO itide = 1, td%ncpt ! loop on tidal components 358 z_arg = bdy_utide(itide)+bdy_v0tide(itide) 359 z_atde= bdy_ftide(itide)* cos(z_arg) 360 z_btde= bdy_ftide(itide)* sin(z_arg) 361 ! ! elevation 362 igrd = 1 363 DO ib = 1, idx%nblenrim(igrd) 364 z1t = z_atde * td%sshr(ib,itide,1) + z_btde * td%sshr(ib,itide,2) 365 z2t = z_atde * td%sshr(ib,itide,2) - z_btde * td%sshr(ib,itide,1) 366 td%ssh(ib,itide,1) = z1t 367 td%ssh(ib,itide,2) = z2t 368 END DO 369 ! ! u 370 igrd = 2 371 DO ib = 1, idx%nblenrim(igrd) 372 z1t = z_atde * td%ur(ib,itide,1) + z_btde * td%ur(ib,itide,2) 373 z2t = z_atde * td%ur(ib,itide,2) - z_btde * td%ur(ib,itide,1) 374 td%u(ib,itide,1) = z1t 375 td%u(ib,itide,2) = z2t 376 END DO 377 ! ! v 378 igrd = 3 379 DO ib = 1, idx%nblenrim(igrd) 380 z1t = z_atde * td%vr(ib,itide,1) + z_btde * td%vr(ib,itide,2) 381 z2t = z_atde * td%vr(ib,itide,2) - z_btde * td%vr(ib,itide,1) 382 td%v(ib,itide,1) = z1t 383 td%v(ib,itide,2) = z2t 384 ENDDO 385 ENDDO ! loop on tidal components 386 387 ENDIF 388 389 ENDIF ! correct for date factors 390 391 IF( PRESENT(jit) ) THEN 392 IF( ln_tide_date ) THEN ! correct for date factors 393 z_arg = ( (kt-bdy_kt_tide) * rdt + bdy_tide_offset + (jit+time_add) * rdt / REAL(nn_baro,wp) ) 394 ELSE 395 z_arg = ( (kt-1) * rdt + (jit+time_add) * rdt / REAL(nn_baro,wp) ) 396 ENDIF 321 397 ELSE 322 z_arg = ((kt-kt_tide)+time_add) * rdt 323 ENDIF 324 325 ! Linear ramp on tidal component at open boundaries 326 zramp = 1. 327 IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg + (kt_tide-nit000)*rdt)/(rdttideramp*rday),0.),1.) 328 329 DO itide = 1, nb_harmo 330 z_sarg = z_arg * omega_tide(itide) 398 IF(lwp) WRITE(numout,*) 'BDYTIDE: should I be in here?' 399 IF( ln_tide_date ) THEN ! correct for date factors 400 z_arg = (kt+time_add-bdy_kt_tide+1) * rdt + bdy_tide_offset 401 ELSE 402 z_arg = (kt+time_add) * rdt 403 ENDIF 404 ENDIF 405 406 DO itide = 1, td%ncpt 407 z_sarg = z_arg * td%speed(itide) 331 408 z_cost(itide) = COS( z_sarg ) 332 409 z_sist(itide) = SIN( z_sarg ) 333 410 END DO 334 411 335 DO itide = 1, nb_harmo 336 igrd=1 ! SSH on tracer grid 337 DO ib = 1, ilen0(igrd) 338 dta%ssh(ib) = dta%ssh(ib) + zramp*(td%ssh(ib,itide,1)*z_cost(itide) + td%ssh(ib,itide,2)*z_sist(itide)) 412 DO itide = 1, td%ncpt 413 igrd=1 ! SSH on tracer grid. 414 DO ib = 1, idx%nblenrim(igrd) 415 dta%ssh(ib) = dta%ssh(ib) + td%ssh(ib,itide,1)*z_cost(itide) + td%ssh(ib,itide,2)*z_sist(itide) 416 IF ( (idx%nbmap(ib,igrd) == 100 .and. (itide==10)) .and. (sub_step==1) ) THEN 417 write(numout,*) 'z', ib, idx%nbmap(ib,igrd), idx%nbi(ib,igrd), idx%nbj(ib,igrd), & 418 & itide, (td%ssh(ib,itide,1)*z_cost(itide) + td%ssh(ib,itide,2)*z_sist(itide)) 419 ENDIF 420 ! IF ( (idx%nbmap(ib,igrd) == 100 .and. (itide==10)) ) THEN 421 ! write(numout,*) 'z', ib, idx%nbmap(ib,igrd), idx%nbi(ib,igrd), idx%nbj(ib,igrd), & 422 ! & itide, (td%ssh(ib,itide,1)*z_cost(itide) - td%ssh(ib,itide,2)*z_sist(itide)) 423 ! ENDIF 339 424 END DO 340 425 igrd=2 ! U grid 341 DO ib = 1, ilen0(igrd) 342 dta%u2d(ib) = dta%u2d(ib) + zramp*(td%u (ib,itide,1)*z_cost(itide) + td%u (ib,itide,2)*z_sist(itide)) 426 DO ib=1, idx%nblenrim(igrd) 427 dta%u2d(ib) = dta%u2d(ib) + td%u(ib,itide,1)*z_cost(itide) + td%u(ib,itide,2)*z_sist(itide) 428 ! if(lwp) write(numout,*) 'u',ib,itide,utide(ib), td%u(ib,itide,1),td%u(ib,itide,2) 343 429 END DO 344 430 igrd=3 ! V grid 345 DO ib = 1, ilen0(igrd) 346 dta%v2d(ib) = dta%v2d(ib) + zramp*(td%v (ib,itide,1)*z_cost(itide) + td%v (ib,itide,2)*z_sist(itide)) 431 DO ib=1, idx%nblenrim(igrd) 432 dta%v2d(ib) = dta%v2d(ib) + td%v(ib,itide,1)*z_cost(itide) + td%v(ib,itide,2)*z_sist(itide) 433 ! if(lwp) write(numout,*) 'v',ib,itide,vtide(ib), td%v(ib,itide,1),td%v(ib,itide,2) 347 434 END DO 348 435 END DO 349 436 ! 350 IF( nn_timing == 1 ) CALL timing_stop(' bdytide_update')437 IF( nn_timing == 1 ) CALL timing_stop('tide_update') 351 438 ! 352 END SUBROUTINE bdytide_update 353 354 SUBROUTINE tide_init_elevation( idx, td ) 355 !!---------------------------------------------------------------------- 356 !! *** ROUTINE tide_init_elevation *** 357 !!---------------------------------------------------------------------- 358 TYPE(OBC_INDEX), INTENT( in ) :: idx ! OBC indices 359 TYPE(TIDES_DATA),INTENT( inout ) :: td ! tidal harmonics data 360 !! * Local declarations 361 INTEGER, DIMENSION(1) :: ilen0 !: length of boundary data (from OBC arrays) 362 REAL(wp),ALLOCATABLE, DIMENSION(:) :: mod_tide, phi_tide 363 INTEGER :: itide, igrd, ib ! dummy loop indices 364 365 igrd=1 366 ! SSH on tracer grid. 367 368 ilen0(1) = SIZE(td%ssh0(:,1,1)) 369 370 ALLOCATE(mod_tide(ilen0(igrd)),phi_tide(ilen0(igrd))) 371 372 DO itide = 1, nb_harmo 373 DO ib = 1, ilen0(igrd) 374 mod_tide(ib)=SQRT(td%ssh0(ib,itide,1)**2.+td%ssh0(ib,itide,2)**2.) 375 phi_tide(ib)=ATAN2(-td%ssh0(ib,itide,2),td%ssh0(ib,itide,1)) 376 END DO 377 DO ib = 1 , ilen0(igrd) 378 mod_tide(ib)=mod_tide(ib)*ftide(itide) 379 phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 380 ENDDO 381 DO ib = 1 , ilen0(igrd) 382 td%ssh(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 383 td%ssh(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 384 ENDDO 385 END DO 386 387 DEALLOCATE(mod_tide,phi_tide) 388 389 END SUBROUTINE tide_init_elevation 390 391 SUBROUTINE tide_init_velocities( idx, td ) 392 !!---------------------------------------------------------------------- 393 !! *** ROUTINE tide_init_elevation *** 394 !!---------------------------------------------------------------------- 395 TYPE(OBC_INDEX), INTENT( in ) :: idx ! OBC indices 396 TYPE(TIDES_DATA),INTENT( inout ) :: td ! tidal harmonics data 397 !! * Local declarations 398 INTEGER, DIMENSION(3) :: ilen0 !: length of boundary data (from OBC arrays) 399 REAL(wp),ALLOCATABLE, DIMENSION(:) :: mod_tide, phi_tide 400 INTEGER :: itide, igrd, ib ! dummy loop indices 401 402 ilen0(2) = SIZE(td%u0(:,1,1)) 403 ilen0(3) = SIZE(td%v0(:,1,1)) 404 405 igrd=2 ! U grid. 406 407 ALLOCATE(mod_tide(ilen0(igrd)),phi_tide(ilen0(igrd))) 408 409 DO itide = 1, nb_harmo 410 DO ib = 1, ilen0(igrd) 411 mod_tide(ib)=SQRT(td%u0(ib,itide,1)**2.+td%u0(ib,itide,2)**2.) 412 phi_tide(ib)=ATAN2(-td%u0(ib,itide,2),td%u0(ib,itide,1)) 413 END DO 414 DO ib = 1, ilen0(igrd) 415 mod_tide(ib)=mod_tide(ib)*ftide(itide) 416 phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 417 ENDDO 418 DO ib = 1, ilen0(igrd) 419 td%u(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 420 td%u(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 421 ENDDO 422 END DO 423 424 DEALLOCATE(mod_tide,phi_tide) 425 426 igrd=3 ! V grid. 427 428 ALLOCATE(mod_tide(ilen0(igrd)),phi_tide(ilen0(igrd))) 429 430 DO itide = 1, nb_harmo 431 DO ib = 1, ilen0(igrd) 432 mod_tide(ib)=SQRT(td%v0(ib,itide,1)**2.+td%v0(ib,itide,2)**2.) 433 phi_tide(ib)=ATAN2(-td%v0(ib,itide,2),td%v0(ib,itide,1)) 434 END DO 435 DO ib = 1, ilen0(igrd) 436 mod_tide(ib)=mod_tide(ib)*ftide(itide) 437 phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 438 ENDDO 439 DO ib = 1, ilen0(igrd) 440 td%v(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 441 td%v(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 442 ENDDO 443 END DO 444 445 DEALLOCATE(mod_tide,phi_tide) 446 447 END SUBROUTINE tide_init_velocities 439 END SUBROUTINE tide_update 440 448 441 #else 449 442 !!---------------------------------------------------------------------- 450 443 !! Dummy module NO Unstruct Open Boundary Conditions for tides 451 444 !!---------------------------------------------------------------------- 445 !!gm are you sure we need to define filtide and tide_cpt ? 446 CHARACTER(len=80), PUBLIC :: filtide !: Filename root for tidal input files 447 CHARACTER(len=4 ), PUBLIC, DIMENSION(1) :: tide_cpt !: Names of tidal components used. 448 452 449 CONTAINS 453 SUBROUTINE bdytide_init ! Empty routine 454 WRITE(*,*) 'bdytide_init: You should not have seen this print! error?' 455 END SUBROUTINE bdytide_init 456 SUBROUTINE bdytide_update( kt, jit ) ! Empty routine 457 WRITE(*,*) 'bdytide_update: You should not have seen this print! error?', kt, jit 458 END SUBROUTINE bdytide_update 450 SUBROUTINE tide_init ! Empty routine 451 END SUBROUTINE tide_init 452 SUBROUTINE tide_data ! Empty routine 453 END SUBROUTINE tide_data 454 SUBROUTINE tide_update( kt, kit ) ! Empty routine 455 WRITE(*,*) 'tide_update: You should not have seen this print! error?', kt, kit 456 END SUBROUTINE tide_update 459 457 #endif 460 458 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdytra.F90
r3777 r6736 7 7 !! 3.0 ! 2008-04 (NEMO team) add in the reference version 8 8 !! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge 9 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Optimization of BDY communications10 9 !!---------------------------------------------------------------------- 11 10 #if defined key_bdy … … 24 23 USE in_out_manager ! I/O manager 25 24 26 27 25 IMPLICIT NONE 28 26 PRIVATE 29 27 30 28 PUBLIC bdy_tra ! routine called in tranxt.F90 31 PUBLIC bdy_tra_dmp ! routine called in step.F9032 29 33 30 !!---------------------------------------------------------------------- … … 56 53 CASE(jp_frs) 57 54 CALL bdy_tra_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 58 CASE(2)59 CALL bdy_tra_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt )60 CASE(3)61 CALL bdy_tra_nmn( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt )62 CASE(4)63 CALL bdy_tra_rnf( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt )64 55 CASE DEFAULT 65 56 CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) 66 57 END SELECT 67 ! Boundary points should be updated68 CALL lbc_bdy_lnk( tsa(:,:,:,jp_tem), 'T', 1., ib_bdy )69 CALL lbc_bdy_lnk( tsa(:,:,:,jp_sal), 'T', 1., ib_bdy )70 58 ENDDO 71 !72 59 73 60 END SUBROUTINE bdy_tra … … 103 90 END DO 104 91 ! 92 CALL lbc_lnk( tsa(:,:,:,jp_tem), 'T', 1. ) ; CALL lbc_lnk( tsa(:,:,:,jp_sal), 'T', 1. ) ! Boundary points should be updated 93 ! 105 94 IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 106 95 ! … … 108 97 ! 109 98 END SUBROUTINE bdy_tra_frs 110 111 SUBROUTINE bdy_tra_spe( idx, dta, kt ) 112 !!---------------------------------------------------------------------- 113 !! *** SUBROUTINE bdy_tra_frs *** 114 !! 115 !! ** Purpose : Apply a specified value for tracers at open boundaries. 116 !! 117 !!---------------------------------------------------------------------- 118 INTEGER, INTENT(in) :: kt 119 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 120 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 121 !! 122 REAL(wp) :: zwgt ! boundary weight 123 INTEGER :: ib, ik, igrd ! dummy loop indices 124 INTEGER :: ii, ij ! 2D addresses 125 !!---------------------------------------------------------------------- 126 ! 127 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_spe') 128 ! 129 igrd = 1 ! Everything is at T-points here 130 DO ib = 1, idx%nblenrim(igrd) 131 ii = idx%nbi(ib,igrd) 132 ij = idx%nbj(ib,igrd) 133 DO ik = 1, jpkm1 134 tsa(ii,ij,ik,jp_tem) = dta%tem(ib,ik) * tmask(ii,ij,ik) 135 tsa(ii,ij,ik,jp_sal) = dta%sal(ib,ik) * tmask(ii,ij,ik) 136 END DO 137 END DO 138 ! 139 IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 140 ! 141 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_spe') 142 ! 143 END SUBROUTINE bdy_tra_spe 144 145 SUBROUTINE bdy_tra_nmn( idx, dta, kt ) 146 !!---------------------------------------------------------------------- 147 !! *** SUBROUTINE bdy_tra_nmn *** 148 !! 149 !! ** Purpose : Duplicate the value for tracers at open boundaries. 150 !! 151 !!---------------------------------------------------------------------- 152 INTEGER, INTENT(in) :: kt 153 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 154 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 155 !! 156 REAL(wp) :: zwgt ! boundary weight 157 INTEGER :: ib, ik, igrd ! dummy loop indices 158 INTEGER :: ii, ij,zcoef, zcoef1,zcoef2, ip, jp ! 2D addresses 159 !!---------------------------------------------------------------------- 160 ! 161 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_nmn') 162 ! 163 igrd = 1 ! Everything is at T-points here 164 DO ib = 1, idx%nblenrim(igrd) 165 ii = idx%nbi(ib,igrd) 166 ij = idx%nbj(ib,igrd) 167 DO ik = 1, jpkm1 168 ! search the sense of the gradient 169 zcoef1 = bdytmask(ii-1,ij ) + bdytmask(ii+1,ij ) 170 zcoef2 = bdytmask(ii ,ij-1) + bdytmask(ii ,ij+1) 171 IF ( zcoef1+zcoef2 == 0) THEN 172 ! corner 173 zcoef = tmask(ii-1,ij,ik) + tmask(ii+1,ij,ik) + tmask(ii,ij-1,ik) + tmask(ii,ij+1,ik) 174 tsa(ii,ij,ik,jp_tem) = tsa(ii-1,ij ,ik,jp_tem) * tmask(ii-1,ij ,ik) + & 175 & tsa(ii+1,ij ,ik,jp_tem) * tmask(ii+1,ij ,ik) + & 176 & tsa(ii ,ij-1,ik,jp_tem) * tmask(ii ,ij-1,ik) + & 177 & tsa(ii ,ij+1,ik,jp_tem) * tmask(ii ,ij+1,ik) 178 tsa(ii,ij,ik,jp_tem) = ( tsa(ii,ij,ik,jp_tem) / MAX( 1, zcoef) ) * tmask(ii,ij,ik) 179 tsa(ii,ij,ik,jp_sal) = tsa(ii-1,ij ,ik,jp_sal) * tmask(ii-1,ij ,ik) + & 180 & tsa(ii+1,ij ,ik,jp_sal) * tmask(ii+1,ij ,ik) + & 181 & tsa(ii ,ij-1,ik,jp_sal) * tmask(ii ,ij-1,ik) + & 182 & tsa(ii ,ij+1,ik,jp_sal) * tmask(ii ,ij+1,ik) 183 tsa(ii,ij,ik,jp_sal) = ( tsa(ii,ij,ik,jp_sal) / MAX( 1, zcoef) ) * tmask(ii,ij,ik) 184 ELSE 185 ip = bdytmask(ii+1,ij ) - bdytmask(ii-1,ij ) 186 jp = bdytmask(ii ,ij+1) - bdytmask(ii ,ij-1) 187 tsa(ii,ij,ik,jp_tem) = tsa(ii+ip,ij+jp,ik,jp_tem) * tmask(ii+ip,ij+jp,ik) 188 tsa(ii,ij,ik,jp_sal) = tsa(ii+ip,ij+jp,ik,jp_sal) * tmask(ii+ip,ij+jp,ik) 189 ENDIF 190 END DO 191 END DO 192 ! 193 IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 194 ! 195 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_nmn') 196 ! 197 END SUBROUTINE bdy_tra_nmn 198 199 SUBROUTINE bdy_tra_rnf( idx, dta, kt ) 200 !!---------------------------------------------------------------------- 201 !! *** SUBROUTINE bdy_tra_rnf *** 202 !! 203 !! ** Purpose : Apply the runoff values for tracers at open boundaries: 204 !! - specified to 0.1 PSU for the salinity 205 !! - duplicate the value for the temperature 206 !! 207 !!---------------------------------------------------------------------- 208 INTEGER, INTENT(in) :: kt 209 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 210 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 211 !! 212 REAL(wp) :: zwgt ! boundary weight 213 INTEGER :: ib, ik, igrd ! dummy loop indices 214 INTEGER :: ii, ij, ip, jp ! 2D addresses 215 !!---------------------------------------------------------------------- 216 ! 217 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_rnf') 218 ! 219 igrd = 1 ! Everything is at T-points here 220 DO ib = 1, idx%nblenrim(igrd) 221 ii = idx%nbi(ib,igrd) 222 ij = idx%nbj(ib,igrd) 223 DO ik = 1, jpkm1 224 ip = bdytmask(ii+1,ij ) - bdytmask(ii-1,ij ) 225 jp = bdytmask(ii ,ij+1) - bdytmask(ii ,ij-1) 226 tsa(ii,ij,ik,jp_tem) = tsa(ii+ip,ij+jp,ik,jp_tem) * tmask(ii,ij,ik) 227 tsa(ii,ij,ik,jp_sal) = 0.1 * tmask(ii,ij,ik) 228 END DO 229 END DO 230 ! 231 IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 232 ! 233 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_rnf') 234 ! 235 END SUBROUTINE bdy_tra_rnf 236 237 SUBROUTINE bdy_tra_dmp( kt ) 238 !!---------------------------------------------------------------------- 239 !! *** SUBROUTINE bdy_tra_dmp *** 240 !! 241 !! ** Purpose : Apply damping for tracers at open boundaries. 242 !! 243 !!---------------------------------------------------------------------- 244 INTEGER, INTENT(in) :: kt 245 !! 246 REAL(wp) :: zwgt ! boundary weight 247 REAL(wp) :: zta, zsa, ztime 248 INTEGER :: ib, ik, igrd ! dummy loop indices 249 INTEGER :: ii, ij ! 2D addresses 250 INTEGER :: ib_bdy ! Loop index 251 !!---------------------------------------------------------------------- 252 ! 253 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_dmp') 254 ! 255 DO ib_bdy=1, nb_bdy 256 IF ( ln_tra_dmp(ib_bdy) ) THEN 257 igrd = 1 ! Everything is at T-points here 258 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 259 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 260 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 261 zwgt = idx_bdy(ib_bdy)%nbd(ib,igrd) 262 DO ik = 1, jpkm1 263 zta = zwgt * ( dta_bdy(ib_bdy)%tem(ib,ik) - tsb(ii,ij,ik,jp_tem) ) * tmask(ii,ij,ik) 264 zsa = zwgt * ( dta_bdy(ib_bdy)%sal(ib,ik) - tsb(ii,ij,ik,jp_sal) ) * tmask(ii,ij,ik) 265 tsa(ii,ij,ik,jp_tem) = tsa(ii,ij,ik,jp_tem) + zta 266 tsa(ii,ij,ik,jp_sal) = tsa(ii,ij,ik,jp_sal) + zsa 267 END DO 268 END DO 269 ENDIF 270 ENDDO 271 ! 272 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_dmp') 273 ! 274 END SUBROUTINE bdy_tra_dmp 275 99 276 100 #else 277 101 !!---------------------------------------------------------------------- … … 282 106 WRITE(*,*) 'bdy_tra: You should not have seen this print! error?', kt 283 107 END SUBROUTINE bdy_tra 284 285 SUBROUTINE bdy_tra_dmp(kt) ! Empty routine286 WRITE(*,*) 'bdy_tra_dmp: You should not have seen this print! error?', kt287 END SUBROUTINE bdy_tra_dmp288 289 108 #endif 290 109 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/C1D/step_c1d.F90
r3680 r6736 19 19 USE dyncor_c1d ! Coriolis term (c1d case) (dyn_cor_1d ) 20 20 USE dynnxt_c1d ! time-stepping (dyn_nxt routine) 21 USE restart ! restart22 21 23 22 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diaar5.F90
r3294 r6736 31 31 LOGICAL, PUBLIC, PARAMETER :: lk_diaar5 = .TRUE. ! coupled flag 32 32 33 34 35 33 ! REAL(wp) :: vol0 ! ocean volume (interior domain) 34 ! REAL(wp) :: area_tot ! total ocean surface (interior domain) 35 ! REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,: ) :: area ! cell surface (interior domain) 36 36 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,: ) :: thick0 ! ocean thickness (interior domain) 37 37 ! REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sn0 ! initial salinity 38 38 39 39 !! * Substitutions … … 53 53 !!---------------------------------------------------------------------- 54 54 ! 55 ALLOCATE( area(jpi,jpj), thick0(jpi,jpj) , sn0(jpi,jpj,jpk) , STAT=dia_ar5_alloc ) 55 ! ALLOCATE( area(jpi,jpj), thick0(jpi,jpj) , sn0(jpi,jpj,jpk) , STAT=dia_ar5_alloc ) 56 ALLOCATE( thick0(jpi,jpj) , STAT=dia_ar5_alloc ) 56 57 ! 57 58 IF( lk_mpp ) CALL mpp_sum ( dia_ar5_alloc ) … … 73 74 REAL(wp) :: zvolssh, zvol, zssh_steric, zztmp, zarho, ztemp, zsal, zmass 74 75 ! 75 REAL(wp), POINTER, DIMENSION(:,:) :: zarea_ssh , zbotpres ! 2D workspace 76 REAL(wp), POINTER, DIMENSION(:,:) :: zbotpres, zbotpresi ! 2D workspace 77 ! INTEGER, POINTER, DIMENSION(:,:) :: zbotpresi ! 2D workspace 76 78 REAL(wp), POINTER, DIMENSION(:,:,:) :: zrhd , zrhop ! 3D workspace 77 79 ! REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztsn ! 4D workspace 78 80 !!-------------------------------------------------------------------- 79 81 IF( nn_timing == 1 ) CALL timing_start('dia_ar5') 80 82 81 CALL wrk_alloc( jpi , jpj , z area_ssh , zbotpres)83 CALL wrk_alloc( jpi , jpj , zbotpres, zbotpresi ) 82 84 CALL wrk_alloc( jpi , jpj , jpk , zrhd , zrhop ) 83 84 85 86 87 85 ! CALL wrk_alloc( jpi , jpj , jpk , jpts , ztsn ) 86 87 ! CALL iom_put( 'cellthc', fse3t(:,:,:) ) 88 89 ! zarea_ssh(:,:) = area(:,:) * sshn(:,:) 88 90 89 91 ! ! total volume of liquid seawater 90 91 92 93 94 95 92 ! zvolssh = SUM( zarea_ssh(:,:) ) 93 ! IF( lk_mpp ) CALL mpp_sum( zvolssh ) 94 ! zvol = vol0 + zvolssh 95 96 ! CALL iom_put( 'voltot', zvol ) 97 ! CALL iom_put( 'sshtot', zvolssh / area_tot ) 96 98 97 99 ! 98 99 100 101 ! 102 103 104 105 106 100 ! ztsn(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) ! thermosteric ssh 101 ! ztsn(:,:,:,jp_sal) = sn0(:,:,:) 102 ! CALL eos( ztsn, zrhd ) ! now in situ density using initial salinity 103 ! 104 ! zbotpres(:,:) = 0._wp ! no atmospheric surface pressure, levitating sea-ice 105 ! DO jk = 1, jpkm1 106 ! zbotpres(:,:) = zbotpres(:,:) + fse3t(:,:,jk) * zrhd(:,:,jk) 107 ! END DO 108 ! IF( .NOT.lk_vvl ) zbotpres(:,:) = zbotpres(:,:) + sshn(:,:) * zrhd(:,:,1) 107 109 ! 108 109 110 111 110 ! zarho = SUM( area(:,:) * zbotpres(:,:) ) 111 ! IF( lk_mpp ) CALL mpp_sum( zarho ) 112 ! zssh_steric = - zarho / area_tot 113 ! CALL iom_put( 'sshthster', zssh_steric ) 112 114 113 115 ! ! steric sea surface height 114 116 CALL eos( tsn, zrhd, zrhop ) ! now in situ and potential density 115 116 117 ! zrhop(:,:,jpk) = 0._wp 118 ! CALL iom_put( 'rhop', zrhop ) 117 119 ! 118 120 zbotpres(:,:) = 0._wp ! no atmospheric surface pressure, levitating sea-ice … … 122 124 IF( .NOT.lk_vvl ) zbotpres(:,:) = zbotpres(:,:) + sshn(:,:) * zrhd(:,:,1) 123 125 ! 124 125 126 127 126 ! zarho = SUM( area(:,:) * zbotpres(:,:) ) 127 ! IF( lk_mpp ) CALL mpp_sum( zarho ) 128 ! zssh_steric = - zarho / area_tot 129 ! CALL iom_put( 'sshsteric', zssh_steric ) 128 130 129 131 ! ! ocean bottom pressure 130 132 zztmp = rau0 * grav * 1.e-4_wp ! recover pressure from pressure anomaly and cover to dbar = 1.e4 Pa 131 133 zbotpres(:,:) = zztmp * ( zbotpres(:,:) + sshn(:,:) + thick0(:,:) ) 132 CALL iom_put( 'botpres', zbotpres ) 134 zbotpresi(:,:)= REAL(INT(zbotpres(:,:))) 135 CALL iom_put( 'botpres', zbotpres(:,:) - zbotpresi(:,:) ) 136 CALL iom_put( 'botpresi', zbotpresi(:,:) ) 133 137 134 138 ! ! Mean density anomalie, temperature and salinity 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 ! 155 156 157 158 ! 159 160 161 162 ! 163 CALL wrk_dealloc( jpi , jpj , z area_ssh , zbotpres)139 ! ztemp = 0._wp 140 ! zsal = 0._wp 141 ! DO jk = 1, jpkm1 142 ! DO jj = 1, jpj 143 ! DO ji = 1, jpi 144 ! zztmp = area(ji,jj) * fse3t(ji,jj,jk) 145 ! ztemp = ztemp + zztmp * tsn(ji,jj,jk,jp_tem) 146 ! zsal = zsal + zztmp * tsn(ji,jj,jk,jp_sal) 147 ! END DO 148 ! END DO 149 ! END DO 150 ! IF( .NOT.lk_vvl ) THEN 151 ! ztemp = ztemp + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_tem) ) 152 ! zsal = zsal + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_sal) ) 153 ! ENDIF 154 ! IF( lk_mpp ) THEN 155 ! CALL mpp_sum( ztemp ) 156 ! CALL mpp_sum( zsal ) 157 ! END IF 158 ! 159 ! zmass = rau0 * ( zarho + zvol ) ! total mass of liquid seawater 160 ! ztemp = ztemp / zvol ! potential temperature in liquid seawater 161 ! zsal = zsal / zvol ! Salinity of liquid seawater 162 ! 163 ! CALL iom_put( 'masstot', zmass ) 164 ! CALL iom_put( 'temptot', ztemp ) 165 ! CALL iom_put( 'saltot' , zsal ) 166 ! 167 CALL wrk_dealloc( jpi , jpj , zbotpres, zbotpresi ) 164 168 CALL wrk_dealloc( jpi , jpj , jpk , zrhd , zrhop ) 165 169 ! CALL wrk_dealloc( jpi , jpj , jpk , jpts , ztsn ) 166 170 ! 167 171 IF( nn_timing == 1 ) CALL timing_stop('dia_ar5') … … 180 184 INTEGER :: ji, jj, jk ! dummy loop indices 181 185 REAL(wp) :: zztmp 182 186 ! REAL(wp), POINTER, DIMENSION(:,:,:,:) :: zsaldta ! Jan/Dec levitus salinity 183 187 !!---------------------------------------------------------------------- 184 188 ! 185 189 IF( nn_timing == 1 ) CALL timing_start('dia_ar5_init') 186 190 ! 187 191 ! CALL wrk_alloc( jpi , jpj , jpk, jpts, zsaldta ) 188 192 ! ! allocate dia_ar5 arrays 189 193 IF( dia_ar5_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'dia_ar5_init : unable to allocate arrays' ) 190 194 191 192 193 194 195 195 ! area(:,:) = e1t(:,:) * e2t(:,:) * tmask_i(:,:) 196 197 ! area_tot = SUM( area(:,:) ) ; IF( lk_mpp ) CALL mpp_sum( area_tot ) 198 199 ! vol0 = 0._wp 196 200 thick0(:,:) = 0._wp 197 201 DO jk = 1, jpkm1 198 202 ! vol0 = vol0 + SUM( area (:,:) * tmask(:,:,jk) * fse3t_0(:,:,jk) ) 199 203 thick0(:,:) = thick0(:,:) + tmask_i(:,:) * tmask(:,:,jk) * fse3t_0(:,:,jk) 200 204 END DO 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 ! 221 205 ! IF( lk_mpp ) CALL mpp_sum( vol0 ) 206 207 ! CALL iom_open ( 'data_1m_salinity_nomask', inum ) 208 ! CALL iom_get ( inum, jpdom_data, 'vosaline', zsaldta(:,:,:,1), 1 ) 209 ! CALL iom_get ( inum, jpdom_data, 'vosaline', zsaldta(:,:,:,2), 12 ) 210 ! CALL iom_close( inum ) 211 ! sn0(:,:,:) = 0.5_wp * ( zsaldta(:,:,:,1) + zsaldta(:,:,:,2) ) 212 ! sn0(:,:,:) = sn0(:,:,:) * tmask(:,:,:) 213 ! IF( ln_zps ) THEN ! z-coord. partial steps 214 ! DO jj = 1, jpj ! interpolation of salinity at the last ocean level (i.e. the partial step) 215 ! DO ji = 1, jpi 216 ! ik = mbkt(ji,jj) 217 ! IF( ik > 1 ) THEN 218 ! zztmp = ( gdept_0(ik) - fsdept_0(ji,jj,ik) ) / ( gdept_0(ik) - gdept_0(ik-1) ) 219 ! sn0(ji,jj,ik) = ( 1._wp - zztmp ) * sn0(ji,jj,ik) + zztmp * sn0(ji,jj,ik-1) 220 ! ENDIF 221 ! END DO 222 ! END DO 223 ! ENDIF 224 ! 225 ! CALL wrk_dealloc( jpi , jpj , jpk, jpts, zsaldta ) 222 226 ! 223 227 IF( nn_timing == 1 ) CALL timing_stop('dia_ar5_init') -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diadct.F90
r3680 r6736 21 21 !!---------------------------------------------------------------------- 22 22 !!---------------------------------------------------------------------- 23 !! dia_dct : Compute the transport through a sec.24 !! dia_dct_init : Read namelist.25 !! readsec : Read sections description and pathway26 !! removepoints : Remove points which are common to 2 procs23 !! dia_dct : compute the transport through a sec. 24 !! dia_dct_init : read namelist. 25 !! readsec : read sections description and pathway 26 !! removepoints : remove points which are common to 2 procs 27 27 !! transport : Compute transport for each sections 28 !! dia_dct_wri : Write tranports results in ascii files29 !! interp : Compute temperature/salinity/density atU-point or V-point28 !! dia_dct_wri : write tranports results in ascii files 29 !! interp : compute Temperature/Salinity/density on U-point or V-point 30 30 !! 31 31 !!---------------------------------------------------------------------- … … 52 52 53 53 !! * Routine accessibility 54 PUBLIC dia_dct ! routine called by step.F90 55 PUBLIC dia_dct_init ! routine called by opa.F90 56 PUBLIC diadct_alloc ! routine called by nemo_init in nemogcm.F90 54 PUBLIC dia_dct ! routine called by step.F90 55 PUBLIC dia_dct_init! routine called by opa.F90 57 56 PRIVATE readsec 58 57 PRIVATE removepoints … … 73 72 INTEGER, PARAMETER :: nb_sec_max = 150 74 73 INTEGER, PARAMETER :: nb_point_max = 2000 75 INTEGER, PARAMETER :: nb_type_class = 10 76 INTEGER, PARAMETER :: nb_3d_vars = 3 77 INTEGER, PARAMETER :: nb_2d_vars = 2 74 INTEGER, PARAMETER :: nb_type_class = 14 78 75 INTEGER :: nb_sec 79 76 … … 95 92 INTEGER :: nb_class ! number of boundaries for density classes 96 93 INTEGER, DIMENSION(nb_point_max) :: direction ! vector direction of the point in the section 97 CHARACTER(len=40),DIMENSION(nb_class_max) :: classname ! c haracteristics of the class94 CHARACTER(len=40),DIMENSION(nb_class_max) :: classname ! caracteristics of the class 98 95 REAL(wp), DIMENSION(nb_class_max) :: zsigi ,&! in-situ density classes (99 if you don't want) 99 96 zsigp ,&! potential density classes (99 if you don't want) … … 109 106 TYPE(SECTION),DIMENSION(nb_sec_max) :: secs ! Array of sections 110 107 111 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: transports_3d 112 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: transports_2d 113 108 114 109 CONTAINS 115 116 117 INTEGER FUNCTION diadct_alloc()118 !!----------------------------------------------------------------------119 !! *** FUNCTION diadct_alloc ***120 !!----------------------------------------------------------------------121 INTEGER :: ierr(2)122 !!----------------------------------------------------------------------123 124 ALLOCATE(transports_3d(nb_3d_vars,nb_sec_max,nb_point_max,jpk), STAT=ierr(1) )125 ALLOCATE(transports_2d(nb_2d_vars,nb_sec_max,nb_point_max) , STAT=ierr(2) )126 127 diadct_alloc = MAXVAL( ierr )128 IF( diadct_alloc /= 0 ) CALL ctl_warn('diadct_alloc: failed to allocate arrays')129 130 END FUNCTION diadct_alloc131 110 132 111 SUBROUTINE dia_dct_init … … 134 113 !! *** ROUTINE diadct *** 135 114 !! 136 !! ** Purpose: Read the namelist paramet ers115 !! ** Purpose: Read the namelist parametres 137 116 !! Open output files 138 117 !! … … 175 154 ENDIF 176 155 177 ! Initialise arrays to zero178 transports_3d(:,:,:,:)=0.0179 transports_2d(:,:,:) =0.0180 181 156 IF( nn_timing == 1 ) CALL timing_stop('dia_dct_init') 182 157 ! … … 188 163 !! *** ROUTINE diadct *** 189 164 !! 190 !! Purpose :: Compute section transports and write it in numdct files 191 !! 192 !! Method :: All arrays initialised to zero in dct_init 193 !! Each nn_dct time step call subroutine 'transports' for 194 !! each section to sum the transports over each grid cell. 195 !! Each nn_dctwri time step: 196 !! Divide the arrays by the number of summations to gain 197 !! an average value 198 !! Call dia_dct_sum to sum relevant grid boxes to obtain 199 !! totals for each class (density, depth, temp or sal) 200 !! Call dia_dct_wri to write the transports into file 201 !! Reinitialise all relevant arrays to zero 165 !! ** Purpose: Compute sections tranport and write it in numdct file 202 166 !!--------------------------------------------------------------------- 203 167 !! * Arguments … … 206 170 !! * Local variables 207 171 INTEGER :: jsec, &! loop on sections 172 iost, &! error for opening fileout 208 173 itotal ! nb_sec_max*nb_type_class*nb_class_max 209 174 LOGICAL :: lldebug =.FALSE. ! debug a section 175 CHARACTER(len=160) :: clfileout ! fileout name 176 210 177 211 178 INTEGER , DIMENSION(1) :: ish ! tmp array for mpp_sum … … 223 190 ENDIF 224 191 225 ! Initialise arrays226 zwork(:) = 0.0227 zsum(:,:,:) = 0.0228 229 192 IF( lwp .AND. kt==nit000+nn_dct-1 ) THEN 230 193 WRITE(numout,*) " " … … 245 208 246 209 !Compute transport through section 247 CALL transport(secs(jsec),lldebug ,jsec)210 CALL transport(secs(jsec),lldebug) 248 211 249 212 ENDDO … … 251 214 IF( MOD(kt,nn_dctwri)==0 )THEN 252 215 253 IF( lwp .AND. kt==nit000+nn_dctwri-1 )WRITE(numout,*)" diadct: average transports andwrite at kt = ",kt216 IF( lwp .AND. kt==nit000+nn_dctwri-1 )WRITE(numout,*)" diadct: write at kt = ",kt 254 217 255 !! divide arrays by nn_dctwri/nn_dct to obtain average256 transports_3d(:,:,:,:)=transports_3d(:,:,:,:)/(nn_dctwri/nn_dct)257 transports_2d(:,:,:) =transports_2d(:,:,:) /(nn_dctwri/nn_dct)258 259 ! Sum over each class260 DO jsec=1,nb_sec261 CALL dia_dct_sum(secs(jsec),jsec)262 ENDDO263 264 218 !Sum on all procs 265 219 IF( lk_mpp )THEN … … 279 233 280 234 !nullify transports values after writing 281 transports_3d(:,jsec,:,:)=0.282 transports_2d(:,jsec,: )=0.283 235 secs(jsec)%transport(:,:)=0. 284 236 … … 313 265 INTEGER :: isec, iiglo, ijglo, iiloc, ijloc,iost,i1 ,i2 ! temporary integer 314 266 INTEGER :: jsec, jpt ! dummy loop indices 267 ! heat/salt tranport is actived 315 268 316 269 INTEGER, DIMENSION(2) :: icoord … … 504 457 !! *** function removepoints 505 458 !! 506 !! ** Purpose :: Remove points which are common to 2 procs 459 !! ** Purpose :: 460 !! remove points which are common to 2 procs 461 !! 507 462 !! 508 463 !---------------------------------------------------------------------------- … … 580 535 END SUBROUTINE removepoints 581 536 582 SUBROUTINE transport(sec,ld_debug ,jsec)537 SUBROUTINE transport(sec,ld_debug) 583 538 !!------------------------------------------------------------------------------------------- 584 539 !! *** ROUTINE transport *** 585 540 !! 586 !! Purpose :: Compute the transport for each point in a section 541 !! ** Purpose : Compute the transport through a section 542 !! 543 !! ** Method :Transport through a given section is equal to the sum of transports 544 !! computed on each proc. 545 !! On each proc,transport is equal to the sum of transport computed through 546 !! segments linking each point of sec%listPoint with the next one. 547 !! 548 !! !BE carefull : 549 !! one section is a sum of segments 550 !! one segment is defined by 2 consectuve points in sec%listPoint 551 !! all points of sec%listPoint are positioned on the F-point of the cell. 587 552 !! 588 !! Method :: Loop over each segment, and each vertical level and add the transport 589 !! Be aware : 590 !! One section is a sum of segments 591 !! One segment is defined by 2 consecutive points in sec%listPoint 592 !! All points of sec%listPoint are positioned on the F-point of the cell 593 !! 594 !! There are two loops: 595 !! loop on the segment between 2 nodes 596 !! loop on the level jk !! 597 !! 598 !! Output :: Arrays containing the volume,density,heat,salt transports for each i 599 !! point in a section, summed over each nn_dct. 553 !! There are several loops: 554 !! loop on the density/temperature/salinity/level classes 555 !! loop on the segment between 2 nodes 556 !! loop on the level jk 557 !! test on the density/temperature/salinity/level 558 !! 559 !! ** Output: sec%transport: volume/mass/ice/heat/salt transport in the 2 directions 560 !! 600 561 !! 601 562 !!------------------------------------------------------------------------------------------- … … 603 564 TYPE(SECTION),INTENT(INOUT) :: sec 604 565 LOGICAL ,INTENT(IN) :: ld_debug 605 INTEGER ,INTENT(IN) :: jsec ! numeric identifier of section606 566 607 567 !! * Local variables 608 INTEGER :: jk, jseg, jclass, &!loop on level/segment/classes 609 isgnu, isgnv ! 610 REAL(wp) :: zumid, zvmid, &!U/V velocity on a cell segment 611 zumid_ice, zvmid_ice, &!U/V ice velocity 612 zTnorm !transport of velocity through one cell's sides 613 REAL(wp) :: ztn, zsn, zrhoi, zrhop, zsshn, zfsdep !temperature/salinity/potential density/ssh/depth at u/v point 568 INTEGER :: jk,jseg,jclass, &!loop on level/segment/classes 569 isgnu , isgnv ! 570 INTEGER :: ii, ij ! local integer 571 REAL(wp):: zumid , zvmid ,&!U/V velocity on a cell segment 572 zumid_ice , zvmid_ice ,&!U/V ice velocity 573 zTnorm ,&!transport of velocity through one cell's sides 574 ztransp1 , ztransp2 ,&!total transport in directions 1 and 2 575 ztemp1 , ztemp2 ,&!temperature transport " 576 zrhoi1 , zrhoi2 ,&!mass transport " 577 zrhop1 , zrhop2 ,&!mass transport " 578 zsal1 , zsal2 ,&!salinity transport " 579 zice_vol_pos , zice_vol_neg ,&!volume ice transport " 580 zice_surf_pos, zice_surf_neg !surface ice transport " 581 REAL(wp):: ztn, zsn, zrhoi, zrhop, zsshn, zfsdep ! temperature/salinity/ssh/potential density /depth at u/v point 614 582 615 583 TYPE(POINT_SECTION) :: k 584 REAL(wp), POINTER, DIMENSION(:,:):: zsum ! 2D work array 616 585 !!-------------------------------------------------------- 586 CALL wrk_alloc( nb_type_class , nb_class_max , zsum ) 617 587 618 588 IF( ld_debug )WRITE(numout,*)' Compute transport' 589 590 !----------------! 591 ! INITIALIZATION ! 592 !----------------! 593 zsum = 0._wp 594 zice_surf_neg = 0._wp ; zice_surf_pos = 0._wp 595 zice_vol_pos = 0._wp ; zice_vol_neg = 0._wp 619 596 620 597 !---------------------------! … … 693 670 END SELECT 694 671 695 !---------------------------| 696 ! LOOP ON THE LEVEL | 697 !---------------------------| 698 !Sum of the transport on the vertical 699 DO jk=1,mbathy(k%I,k%J) 700 701 ! compute temperature, salinity, insitu & potential density, ssh and depth at U/V point 702 SELECT CASE( sec%direction(jseg) ) 703 CASE(0,1) 704 ztn = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_tem) ) 705 zsn = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_sal) ) 706 zrhop = interp(k%I,k%J,jk,'V',rhop) 707 zrhoi = interp(k%I,k%J,jk,'V',rhd*rau0+rau0) 708 zsshn = 0.5*( sshn(k%I,k%J) + sshn(k%I,k%J+1) ) * vmask(k%I,k%J,1) 709 CASE(2,3) 710 ztn = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_tem) ) 711 zsn = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_sal) ) 712 zrhop = interp(k%I,k%J,jk,'U',rhop) 713 zrhoi = interp(k%I,k%J,jk,'U',rhd*rau0+rau0) 714 zsshn = 0.5*( sshn(k%I,k%J) + sshn(k%I+1,k%J) ) * umask(k%I,k%J,1) 715 END SELECT 716 717 zfsdep= gdept(k%I,k%J,jk) 718 719 !compute velocity with the correct direction 720 SELECT CASE( sec%direction(jseg) ) 721 CASE(0,1) 722 zumid=0. 723 zvmid=isgnv*vn(k%I,k%J,jk)*vmask(k%I,k%J,jk) 724 CASE(2,3) 725 zumid=isgnu*un(k%I,k%J,jk)*umask(k%I,k%J,jk) 726 zvmid=0. 727 END SELECT 728 729 !zTnorm=transport through one cell; 730 !velocity* cell's length * cell's thickness 731 zTnorm=zumid*e2u(k%I,k%J)* fse3u(k%I,k%J,jk)+ & 732 zvmid*e1v(k%I,k%J)* fse3v(k%I,k%J,jk) 672 !------------------------------- 673 ! LOOP ON THE DENSITY CLASSES | 674 !------------------------------- 675 !The computation is made for each density class 676 DO jclass=1,MAX(1,sec%nb_class-1) 677 678 ztransp1=0._wp ; zrhoi1=0._wp ; zrhop1=0._wp ; ztemp1=0._wp ;zsal1=0._wp 679 ztransp2=0._wp ; zrhoi2=0._wp ; zrhop2=0._wp ; ztemp2=0._wp ;zsal2=0._wp 680 681 !---------------------------| 682 ! LOOP ON THE LEVEL | 683 !---------------------------| 684 !Sum of the transport on the vertical 685 DO jk=1,jpk 686 687 688 ! compute temparature, salinity, insitu & potential density, ssh and depth at U/V point 689 SELECT CASE( sec%direction(jseg) ) 690 CASE(0,1) 691 ztn = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_tem) ) 692 zsn = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_sal) ) 693 zrhop = interp(k%I,k%J,jk,'V',rhop) 694 zrhoi = interp(k%I,k%J,jk,'V',rhd*rau0+rau0) 695 zsshn = 0.5*( sshn(k%I,k%J) + sshn(k%I,k%J+1) ) * vmask(k%I,k%J,1) 696 CASE(2,3) 697 ztn = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_tem) ) 698 zsn = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_sal) ) 699 zrhop = interp(k%I,k%J,jk,'U',rhop) 700 zrhoi = interp(k%I,k%J,jk,'U',rhd*rau0+rau0) 701 zsshn = 0.5*( sshn(k%I,k%J) + sshn(k%I+1,k%J) ) * umask(k%I,k%J,1) 702 END SELECT 703 704 zfsdep= gdept(k%I,k%J,jk) 705 706 !----------------------------------------------! 707 !TEST ON THE DENSITY/SALINITY/TEMPERATURE/LEVEL! 708 !----------------------------------------------! 709 710 IF ( ( ((( zrhop .GE. (sec%zsigp(jclass)+1000. )) .AND. & 711 ( zrhop .LE. (sec%zsigp(jclass+1)+1000. ))) .OR. & 712 ( sec%zsigp(jclass) .EQ. 99.)) .AND. & 713 ((( zrhoi .GE. (sec%zsigi(jclass) + 1000. )) .AND. & 714 ( zrhoi .LE. (sec%zsigi(jclass+1)+1000. ))) .OR. & 715 ( sec%zsigi(jclass) .EQ. 99.)) .AND. & 716 ((( zsn .GT. sec%zsal(jclass)) .AND. & 717 ( zsn .LE. sec%zsal(jclass+1))) .OR. & 718 ( sec%zsal(jclass) .EQ. 99.)) .AND. & 719 ((( ztn .GE. sec%ztem(jclass)) .AND. & 720 ( ztn .LE. sec%ztem(jclass+1))) .OR. & 721 ( sec%ztem(jclass) .EQ.99.)) .AND. & 722 ((( zfsdep .GE. sec%zlay(jclass)) .AND. & 723 ( zfsdep .LE. sec%zlay(jclass+1))) .OR. & 724 ( sec%zlay(jclass) .EQ. 99. )))) THEN 725 726 727 !compute velocity with the correct direction 728 SELECT CASE( sec%direction(jseg) ) 729 CASE(0,1) 730 zumid=0. 731 zvmid=isgnv*vn(k%I,k%J,jk)*vmask(k%I,k%J,jk) 732 CASE(2,3) 733 zumid=isgnu*un(k%I,k%J,jk)*umask(k%I,k%J,jk) 734 zvmid=0. 735 END SELECT 736 737 !velocity* cell's length * cell's thickness 738 zTnorm=zumid*e2u(k%I,k%J)* fse3u(k%I,k%J,jk)+ & 739 zvmid*e1v(k%I,k%J)* fse3v(k%I,k%J,jk) 733 740 734 741 #if ! defined key_vvl 735 !add transport due to free surface736 IF( jk==1 )THEN737 zTnorm = zTnorm + zumid* e2u(k%I,k%J) * zsshn * umask(k%I,k%J,jk) + &738 zvmid* e1v(k%I,k%J) * zsshn * vmask(k%I,k%J,jk)739 ENDIF742 !add transport due to free surface 743 IF( jk==1 )THEN 744 zTnorm = zTnorm + zumid* e2u(k%I,k%J) * zsshn * umask(k%I,k%J,jk) + & 745 zvmid* e1v(k%I,k%J) * zsshn * vmask(k%I,k%J,jk) 746 ENDIF 740 747 #endif 741 !COMPUTE TRANSPORT 742 743 transports_3d(1,jsec,jseg,jk) = transports_3d(1,jsec,jseg,jk) + zTnorm 744 745 IF ( sec%llstrpond ) THEN 746 transports_3d(2,jsec,jseg,jk) = transports_3d(2,jsec,jseg,jk) + zTnorm * ztn * zrhop * rcp 747 transports_3d(3,jsec,jseg,jk) = transports_3d(3,jsec,jseg,jk) + zTnorm * zsn * zrhop * 0.001 748 !COMPUTE TRANSPORT 749 !zTnorm=transport through one cell for one class 750 !ztransp1 or ztransp2=transport through one cell i 751 ! for one class for one direction 752 IF( zTnorm .GE. 0 )THEN 753 754 ztransp1=zTnorm+ztransp1 755 756 IF ( sec%llstrpond ) THEN 757 ztemp1 = ztemp1 + zTnorm * ztn 758 zsal1 = zsal1 + zTnorm * zsn 759 zrhoi1 = zrhoi1 + zTnorm * zrhoi 760 zrhop1 = zrhop1 + zTnorm * zrhop 761 ENDIF 762 763 ELSE 764 765 ztransp2=(zTnorm)+ztransp2 766 767 IF ( sec%llstrpond ) THEN 768 ztemp2 = ztemp2 + zTnorm * ztn 769 zsal2 = zsal2 + zTnorm * zsn 770 zrhoi2 = zrhoi2 + zTnorm * zrhoi 771 zrhop2 = zrhop2 + zTnorm * zrhop 772 ENDIF 773 ENDIF 774 775 776 ENDIF ! end of density test 777 ENDDO!end of loop on the level 778 779 !ZSUM=TRANSPORT FOR EACH CLASSES FOR THE DIRECTIONS 780 !--------------------------------------------------- 781 zsum(1,jclass) = zsum(1,jclass)+ztransp1 782 zsum(2,jclass) = zsum(2,jclass)+ztransp2 783 IF( sec%llstrpond )THEN 784 zsum(3 ,jclass) = zsum( 3,jclass)+zrhoi1 785 zsum(4 ,jclass) = zsum( 4,jclass)+zrhoi2 786 zsum(5 ,jclass) = zsum( 5,jclass)+zrhop1 787 zsum(6 ,jclass) = zsum( 6,jclass)+zrhop2 788 zsum(7 ,jclass) = zsum( 7,jclass)+ztemp1 789 zsum(8 ,jclass) = zsum( 8,jclass)+ztemp2 790 zsum(9 ,jclass) = zsum( 9,jclass)+zsal1 791 zsum(10,jclass) = zsum(10,jclass)+zsal2 748 792 ENDIF 749 793 750 ENDDO !end of loop on the level794 ENDDO !end of loop on the density classes 751 795 752 796 #if defined key_lim2 || defined key_lim3 … … 772 816 zTnorm=zumid_ice*e2u(k%I,k%J)+zvmid_ice*e1v(k%I,k%J) 773 817 774 transports_2d(1,jsec,jseg) = transports_2d(1,jsec,jseg) + (zTnorm)* & 775 (1.0 - frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) & 776 *(hsnif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J) + & 777 hicif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) 778 transports_2d(2,jsec,jseg) = transports_2d(2,jsec,jseg) + (zTnorm)* & 779 (1.0 - frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) 818 IF( zTnorm .GE. 0)THEN 819 zice_vol_pos = (zTnorm)* & 820 (1.0 - frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) & 821 *(hsnif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J) + & 822 hicif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) & 823 +zice_vol_pos 824 zice_surf_pos = (zTnorm)* & 825 (1.0 - frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) & 826 +zice_surf_pos 827 ELSE 828 zice_vol_neg=(zTnorm)* & 829 (1.0 - frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) & 830 *(hsnif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J) + & 831 hicif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) & 832 +zice_vol_neg 833 zice_surf_neg=(zTnorm)* & 834 (1.0 - frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) & 835 +zice_surf_neg 836 ENDIF 837 838 zsum(11,1) = zsum(11,1)+zice_vol_pos 839 zsum(12,1) = zsum(12,1)+zice_vol_neg 840 zsum(13,1) = zsum(13,1)+zice_surf_pos 841 zsum(14,1) = zsum(14,1)+zice_surf_neg 780 842 781 843 ENDIF !end of ice case … … 784 846 ENDDO !end of loop on the segment 785 847 786 ENDIF !end of sec%nb_point =0 case 848 849 ELSE !if sec%nb_point =0 850 zsum(1:2,:)=0. 851 IF (sec%llstrpond) zsum(3:10,:)=0. 852 zsum( 11:14,:)=0. 853 ENDIF !end of sec%nb_point =0 case 854 855 !-------------------------------| 856 !FINISH COMPUTING TRANSPORTS | 857 !-------------------------------| 858 DO jclass=1,MAX(1,sec%nb_class-1) 859 sec%transport(1,jclass)=sec%transport(1,jclass)+zsum(1,jclass)*1.E-6 860 sec%transport(2,jclass)=sec%transport(2,jclass)+zsum(2,jclass)*1.E-6 861 IF( sec%llstrpond ) THEN 862 IF( zsum(1,jclass) .NE. 0._wp ) THEN 863 sec%transport( 3,jclass) = sec%transport( 3,jclass) + zsum( 3,jclass)/zsum(1,jclass) 864 sec%transport( 5,jclass) = sec%transport( 5,jclass) + zsum( 5,jclass)/zsum(1,jclass) 865 sec%transport( 7,jclass) = sec%transport( 7,jclass) + zsum( 7,jclass) 866 sec%transport( 9,jclass) = sec%transport( 9,jclass) + zsum( 9,jclass) 867 ENDIF 868 IF( zsum(2,jclass) .NE. 0._wp )THEN 869 sec%transport( 4,jclass) = sec%transport( 4,jclass) + zsum( 4,jclass)/zsum(2,jclass) 870 sec%transport( 6,jclass) = sec%transport( 6,jclass) + zsum( 6,jclass)/zsum(2,jclass) 871 sec%transport( 8,jclass) = sec%transport( 8,jclass) + zsum( 8,jclass) 872 sec%transport(10,jclass) = sec%transport(10,jclass) + zsum(10,jclass) 873 ENDIF 874 ELSE 875 sec%transport( 3,jclass) = 0._wp 876 sec%transport( 4,jclass) = 0._wp 877 sec%transport( 5,jclass) = 0._wp 878 sec%transport( 6,jclass) = 0._wp 879 sec%transport( 7,jclass) = 0._wp 880 sec%transport( 8,jclass) = 0._wp 881 sec%transport(10,jclass) = 0._wp 882 ENDIF 883 ENDDO 884 885 IF( sec%ll_ice_section ) THEN 886 sec%transport( 9,1)=sec%transport( 9,1)+zsum( 9,1)*1.E-6 887 sec%transport(10,1)=sec%transport(10,1)+zsum(10,1)*1.E-6 888 sec%transport(11,1)=sec%transport(11,1)+zsum(11,1)*1.E-6 889 sec%transport(12,1)=sec%transport(12,1)+zsum(12,1)*1.E-6 890 ENDIF 891 892 CALL wrk_dealloc( nb_type_class , nb_class_max , zsum ) 787 893 ! 788 894 END SUBROUTINE transport 789 790 SUBROUTINE dia_dct_sum(sec,jsec)791 !!-------------------------------------------------------------792 !! Purpose: Average the transport over nn_dctwri time steps793 !! and sum over the density/salinity/temperature/depth classes794 !!795 !! Method: Sum over relevant grid cells to obtain values796 !! for each class797 !! There are several loops:798 !! loop on the segment between 2 nodes799 !! loop on the level jk800 !! loop on the density/temperature/salinity/level classes801 !! test on the density/temperature/salinity/level802 !!803 !! Note: Transport through a given section is equal to the sum of transports804 !! computed on each proc.805 !! On each proc,transport is equal to the sum of transport computed through806 !! segments linking each point of sec%listPoint with the next one.807 !!808 !!-------------------------------------------------------------809 !! * arguments810 TYPE(SECTION),INTENT(INOUT) :: sec811 INTEGER ,INTENT(IN) :: jsec ! numeric identifier of section812 813 TYPE(POINT_SECTION) :: k814 INTEGER :: jk,jseg,jclass ! dummy variables for looping on level/segment/classes815 REAL(wp) :: ztn, zsn, zrhoi, zrhop, zsshn, zfsdep ! temperature/salinity/ssh/potential density /depth at u/v point816 !!-------------------------------------------------------------817 818 !! Sum the relevant segments to obtain values for each class819 IF(sec%nb_point .NE. 0)THEN820 821 !--------------------------------------!822 ! LOOP ON THE SEGMENT BETWEEN 2 NODES !823 !--------------------------------------!824 DO jseg=1,MAX(sec%nb_point-1,0)825 826 !-------------------------------------------------------------------------------------------827 ! Select the appropriate coordinate for computing the velocity of the segment828 !829 ! CASE(0) Case (2)830 ! ------- --------831 ! listPoint(jseg) listPoint(jseg+1) listPoint(jseg) F(i,j)832 ! F(i,j)----------V(i+1,j)-------F(i+1,j) |833 ! |834 ! |835 ! |836 ! Case (3) U(i,j)837 ! -------- |838 ! |839 ! listPoint(jseg+1) F(i,j+1) |840 ! | |841 ! | |842 ! | listPoint(jseg+1) F(i,j-1)843 ! |844 ! |845 ! U(i,j+1)846 ! | Case(1)847 ! | ------848 ! |849 ! | listPoint(jseg+1) listPoint(jseg)850 ! | F(i-1,j)-----------V(i,j) -------f(jseg)851 ! listPoint(jseg) F(i,j)852 !853 !-------------------------------------------------------------------------------------------854 855 SELECT CASE( sec%direction(jseg) )856 CASE(0) ; k = sec%listPoint(jseg)857 CASE(1) ; k = POINT_SECTION(sec%listPoint(jseg)%I+1,sec%listPoint(jseg)%J)858 CASE(2) ; k = sec%listPoint(jseg)859 CASE(3) ; k = POINT_SECTION(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J+1)860 END SELECT861 862 !---------------------------|863 ! LOOP ON THE LEVEL |864 !---------------------------|865 !Sum of the transport on the vertical866 DO jk=1,mbathy(k%I,k%J)867 868 ! compute temperature, salinity, insitu & potential density, ssh and depth at U/V point869 SELECT CASE( sec%direction(jseg) )870 CASE(0,1)871 ztn = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_tem) )872 zsn = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_sal) )873 zrhop = interp(k%I,k%J,jk,'V',rhop)874 zrhoi = interp(k%I,k%J,jk,'V',rhd*rau0+rau0)875 876 CASE(2,3)877 ztn = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_tem) )878 zsn = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_sal) )879 zrhop = interp(k%I,k%J,jk,'U',rhop)880 zrhoi = interp(k%I,k%J,jk,'U',rhd*rau0+rau0)881 zsshn = 0.5*( sshn(k%I,k%J) + sshn(k%I+1,k%J) ) * umask(k%I,k%J,1)882 END SELECT883 884 zfsdep= gdept(k%I,k%J,jk)885 886 !-------------------------------887 ! LOOP ON THE DENSITY CLASSES |888 !-------------------------------889 !The computation is made for each density/temperature/salinity/depth class890 DO jclass=1,MAX(1,sec%nb_class-1)891 892 !----------------------------------------------!893 !TEST ON THE DENSITY/SALINITY/TEMPERATURE/LEVEL!894 !----------------------------------------------!895 896 IF ( ( &897 ((( zrhop .GE. (sec%zsigp(jclass)+1000. )) .AND. &898 ( zrhop .LE. (sec%zsigp(jclass+1)+1000. ))) .OR. &899 ( sec%zsigp(jclass) .EQ. 99.)) .AND. &900 901 ((( zrhoi .GE. (sec%zsigi(jclass) + 1000. )) .AND. &902 ( zrhoi .LE. (sec%zsigi(jclass+1)+1000. ))) .OR. &903 ( sec%zsigi(jclass) .EQ. 99.)) .AND. &904 905 ((( zsn .GT. sec%zsal(jclass)) .AND. &906 ( zsn .LE. sec%zsal(jclass+1))) .OR. &907 ( sec%zsal(jclass) .EQ. 99.)) .AND. &908 909 ((( ztn .GE. sec%ztem(jclass)) .AND. &910 ( ztn .LE. sec%ztem(jclass+1))) .OR. &911 ( sec%ztem(jclass) .EQ.99.)) .AND. &912 913 ((( zfsdep .GE. sec%zlay(jclass)) .AND. &914 ( zfsdep .LE. sec%zlay(jclass+1))) .OR. &915 ( sec%zlay(jclass) .EQ. 99. )) &916 )) THEN917 918 !SUM THE TRANSPORTS FOR EACH CLASSES FOR THE POSITIVE AND NEGATIVE DIRECTIONS919 !----------------------------------------------------------------------------920 IF (transports_3d(1,jsec,jseg,jk) .GE. 0.0) THEN921 sec%transport(1,jclass) = sec%transport(1,jclass)+transports_3d(1,jsec,jseg,jk)*1.E-6922 ELSE923 sec%transport(2,jclass) = sec%transport(2,jclass)+transports_3d(1,jsec,jseg,jk)*1.E-6924 ENDIF925 IF( sec%llstrpond )THEN926 927 IF ( transports_3d(2,jsec,jseg,jk) .GE. 0.0 ) THEN928 sec%transport(3,jclass) = sec%transport(3,jclass)+transports_3d(2,jsec,jseg,jk)929 ELSE930 sec%transport(4,jclass) = sec%transport(4,jclass)+transports_3d(2,jsec,jseg,jk)931 ENDIF932 933 IF ( transports_3d(3,jsec,jseg,jk) .GE. 0.0 ) THEN934 sec%transport(5,jclass) = sec%transport(5,jclass)+transports_3d(3,jsec,jseg,jk)935 ELSE936 sec%transport(6,jclass) = sec%transport(6,jclass)+transports_3d(3,jsec,jseg,jk)937 ENDIF938 939 ELSE940 sec%transport( 3,jclass) = 0._wp941 sec%transport( 4,jclass) = 0._wp942 sec%transport( 5,jclass) = 0._wp943 sec%transport( 6,jclass) = 0._wp944 ENDIF945 946 ENDIF ! end of test if point is in class947 948 ENDDO ! end of loop on the classes949 950 ENDDO ! loop over jk951 952 #if defined key_lim2 || defined key_lim3953 954 !ICE CASE955 IF( sec%ll_ice_section )THEN956 957 IF ( transports_2d(1,jsec,jseg) .GE. 0.0 ) THEN958 sec%transport( 7,1) = sec%transport( 7,1)+transports_2d(1,jsec,jseg)*1.E-6959 ELSE960 sec%transport( 8,1) = sec%transport( 8,1)+transports_2d(1,jsec,jseg)*1.E-6961 ENDIF962 963 IF ( transports_2d(3,jsec,jseg) .GE. 0.0 ) THEN964 sec%transport( 9,1) = sec%transport( 9,1)+transports_2d(2,jsec,jseg)*1.E-6965 ELSE966 sec%transport(10,1) = sec%transport(10,1)+transports_2d(2,jsec,jseg)*1.E-6967 ENDIF968 969 ENDIF !end of ice case970 #endif971 972 ENDDO !end of loop on the segment973 974 ELSE !if sec%nb_point =0975 sec%transport(1:2,:)=0.976 IF (sec%llstrpond) sec%transport(3:6,:)=0.977 IF (sec%ll_ice_section) sec%transport(7:10,:)=0.978 ENDIF !end of sec%nb_point =0 case979 980 END SUBROUTINE dia_dct_sum981 895 982 896 SUBROUTINE dia_dct_wri(kt,ksec,sec) … … 991 905 !! 992 906 !! 2. Write heat transports in "heat_transport" 993 !! Unit: Peta W : area * Velocity * T * rh op * Cp * 1.e-15907 !! Unit: Peta W : area * Velocity * T * rhau * Cp / 1.e15 994 908 !! 995 909 !! 3. Write salt transports in "salt_transport" 996 !! Unit: 10^9 Kg/m^2/s : area * Velocity * S * rhop * 1.e-9910 !! Unit: 10^9 g m^3 / s : area * Velocity * S / 1.e6 997 911 !! 998 912 !!------------------------------------------------------------- … … 1003 917 1004 918 !!local declarations 1005 INTEGER :: jcl ass! Dummy loop919 INTEGER :: jcl,ji ! Dummy loop 1006 920 CHARACTER(len=2) :: classe ! Classname 1007 921 REAL(wp) :: zbnd1,zbnd2 ! Class bounds 1008 922 REAL(wp) :: zslope ! section's slope coeff 1009 923 ! 1010 REAL(wp), POINTER, DIMENSION(:):: zsumclass es! 1D workspace924 REAL(wp), POINTER, DIMENSION(:):: zsumclass ! 1D workspace 1011 925 !!------------------------------------------------------------- 1012 CALL wrk_alloc(nb_type_class , zsumclass es)1013 1014 zsumclass es(:)=0._wp926 CALL wrk_alloc(nb_type_class , zsumclass ) 927 928 zsumclass(:)=0._wp 1015 929 zslope = sec%slopeSection 1016 930 1017 931 1018 DO jclass=1,MAX(1,sec%nb_class-1) 1019 932 DO jcl=1,MAX(1,sec%nb_class-1) 933 934 ! Mean computation 935 sec%transport(:,jcl)=sec%transport(:,jcl)/(nn_dctwri/nn_dct) 1020 936 classe = 'N ' 1021 937 zbnd1 = 0._wp 1022 938 zbnd2 = 0._wp 1023 zsumclass es(1:nb_type_class)=zsumclasses(1:nb_type_class)+sec%transport(1:nb_type_class,jclass)939 zsumclass(1:nb_type_class)=zsumclass(1:nb_type_class)+sec%transport(1:nb_type_class,jcl) 1024 940 1025 941 1026 942 !insitu density classes transports 1027 IF( ( sec%zsigi(jcl ass) .NE. 99._wp ) .AND. &1028 ( sec%zsigi(jcl ass+1) .NE. 99._wp ) )THEN943 IF( ( sec%zsigi(jcl) .NE. 99._wp ) .AND. & 944 ( sec%zsigi(jcl+1) .NE. 99._wp ) )THEN 1029 945 classe = 'DI ' 1030 zbnd1 = sec%zsigi(jcl ass)1031 zbnd2 = sec%zsigi(jcl ass+1)946 zbnd1 = sec%zsigi(jcl) 947 zbnd2 = sec%zsigi(jcl+1) 1032 948 ENDIF 1033 949 !potential density classes transports 1034 IF( ( sec%zsigp(jcl ass) .NE. 99._wp ) .AND. &1035 ( sec%zsigp(jcl ass+1) .NE. 99._wp ) )THEN950 IF( ( sec%zsigp(jcl) .NE. 99._wp ) .AND. & 951 ( sec%zsigp(jcl+1) .NE. 99._wp ) )THEN 1036 952 classe = 'DP ' 1037 zbnd1 = sec%zsigp(jcl ass)1038 zbnd2 = sec%zsigp(jcl ass+1)953 zbnd1 = sec%zsigp(jcl) 954 zbnd2 = sec%zsigp(jcl+1) 1039 955 ENDIF 1040 956 !depth classes transports 1041 IF( ( sec%zlay(jcl ass) .NE. 99._wp ) .AND. &1042 ( sec%zlay(jcl ass+1) .NE. 99._wp ) )THEN957 IF( ( sec%zlay(jcl) .NE. 99._wp ) .AND. & 958 ( sec%zlay(jcl+1) .NE. 99._wp ) )THEN 1043 959 classe = 'Z ' 1044 zbnd1 = sec%zlay(jcl ass)1045 zbnd2 = sec%zlay(jcl ass+1)960 zbnd1 = sec%zlay(jcl) 961 zbnd2 = sec%zlay(jcl+1) 1046 962 ENDIF 1047 963 !salinity classes transports 1048 IF( ( sec%zsal(jcl ass) .NE. 99._wp ) .AND. &1049 ( sec%zsal(jcl ass+1) .NE. 99._wp ) )THEN964 IF( ( sec%zsal(jcl) .NE. 99._wp ) .AND. & 965 ( sec%zsal(jcl+1) .NE. 99._wp ) )THEN 1050 966 classe = 'S ' 1051 zbnd1 = sec%zsal(jcl ass)1052 zbnd2 = sec%zsal(jcl ass+1)967 zbnd1 = sec%zsal(jcl) 968 zbnd2 = sec%zsal(jcl+1) 1053 969 ENDIF 1054 970 !temperature classes transports 1055 IF( ( sec%ztem(jcl ass) .NE. 99._wp ) .AND. &1056 ( sec%ztem(jcl ass+1) .NE. 99._wp ) ) THEN971 IF( ( sec%ztem(jcl) .NE. 99._wp ) .AND. & 972 ( sec%ztem(jcl+1) .NE. 99._wp ) ) THEN 1057 973 classe = 'T ' 1058 zbnd1 = sec%ztem(jcl ass)1059 zbnd2 = sec%ztem(jcl ass+1)974 zbnd1 = sec%ztem(jcl) 975 zbnd2 = sec%ztem(jcl+1) 1060 976 ENDIF 1061 977 1062 978 !write volume transport per class 1063 979 WRITE(numdct_vol,118) ndastp,kt,ksec,sec%name,zslope, & 1064 jcl ass,classe,zbnd1,zbnd2,&1065 sec%transport(1,jcl ass),sec%transport(2,jclass), &1066 sec%transport(1,jcl ass)+sec%transport(2,jclass)980 jcl,classe,zbnd1,zbnd2,& 981 sec%transport(1,jcl),sec%transport(2,jcl), & 982 sec%transport(1,jcl)+sec%transport(2,jcl) 1067 983 1068 984 IF( sec%llstrpond )THEN … … 1070 986 !write heat transport per class: 1071 987 WRITE(numdct_heat,119) ndastp,kt,ksec,sec%name,zslope, & 1072 jcl ass,classe,zbnd1,zbnd2,&1073 sec%transport( 3,jclass)*1.e-15,sec%transport(4,jclass)*1.e-15, &1074 ( sec%transport( 3,jclass)+sec%transport(4,jclass) )*1.e-15988 jcl,classe,zbnd1,zbnd2,& 989 sec%transport(7,jcl)*1000._wp*rcp/1.e15,sec%transport(8,jcl)*1000._wp*rcp/1.e15, & 990 ( sec%transport(7,jcl)+sec%transport(8,jcl) )*1000._wp*rcp/1.e15 1075 991 !write salt transport per class 1076 992 WRITE(numdct_salt,119) ndastp,kt,ksec,sec%name,zslope, & 1077 jcl ass,classe,zbnd1,zbnd2,&1078 sec%transport( 5,jclass)*1.e-9,sec%transport(6,jclass)*1.e-9,&1079 (sec%transport( 5,jclass)+sec%transport(6,jclass))*1.e-9993 jcl,classe,zbnd1,zbnd2,& 994 sec%transport(9,jcl)*1000._wp/1.e9,sec%transport(10,jcl)*1000._wp/1.e9,& 995 (sec%transport(9,jcl)+sec%transport(10,jcl))*1000._wp/1.e9 1080 996 ENDIF 1081 997 … … 1084 1000 zbnd1 = 0._wp 1085 1001 zbnd2 = 0._wp 1086 jcl ass=01002 jcl=0 1087 1003 1088 1004 !write total volume transport 1089 1005 WRITE(numdct_vol,118) ndastp,kt,ksec,sec%name,zslope, & 1090 jcl ass,"total",zbnd1,zbnd2,&1091 zsumclass es(1),zsumclasses(2),zsumclasses(1)+zsumclasses(2)1006 jcl,"total",zbnd1,zbnd2,& 1007 zsumclass(1),zsumclass(2),zsumclass(1)+zsumclass(2) 1092 1008 1093 1009 IF( sec%llstrpond )THEN … … 1095 1011 !write total heat transport 1096 1012 WRITE(numdct_heat,119) ndastp,kt,ksec,sec%name,zslope, & 1097 jcl ass,"total",zbnd1,zbnd2,&1098 zsumclass es(3)*1.e-15,zsumclasses(4)*1.e-15,&1099 (zsumclass es(3)+zsumclasses(4) )*1.e-151013 jcl,"total",zbnd1,zbnd2,& 1014 zsumclass(7)* 1000._wp*rcp/1.e15,zsumclass(8)* 1000._wp*rcp/1.e15,& 1015 (zsumclass(7)+zsumclass(8) )* 1000._wp*rcp/1.e15 1100 1016 !write total salt transport 1101 1017 WRITE(numdct_salt,119) ndastp,kt,ksec,sec%name,zslope, & 1102 jcl ass,"total",zbnd1,zbnd2,&1103 zsumclass es(5)*1.e-9,zsumclasses(6)*1.e-9,&1104 (zsumclass es(5)+zsumclasses(6))*1.e-91018 jcl,"total",zbnd1,zbnd2,& 1019 zsumclass(9)*1000._wp/1.e9,zsumclass(10)*1000._wp/1.e9,& 1020 (zsumclass(9)+zsumclass(10))*1000._wp/1.e9 1105 1021 ENDIF 1106 1022 … … 1109 1025 !write total ice volume transport 1110 1026 WRITE(numdct_vol,118) ndastp,kt,ksec,sec%name,zslope,& 1111 jcl ass,"ice_vol",zbnd1,zbnd2,&1112 sec%transport( 7,1),sec%transport(8,1),&1113 sec%transport( 7,1)+sec%transport(8,1)1027 jcl,"ice_vol",zbnd1,zbnd2,& 1028 sec%transport(9,1),sec%transport(10,1),& 1029 sec%transport(9,1)+sec%transport(10,1) 1114 1030 !write total ice surface transport 1115 1031 WRITE(numdct_vol,118) ndastp,kt,ksec,sec%name,zslope,& 1116 jcl ass,"ice_surf",zbnd1,zbnd2,&1117 sec%transport( 9,1),sec%transport(10,1), &1118 sec%transport( 9,1)+sec%transport(10,1)1032 jcl,"ice_surf",zbnd1,zbnd2,& 1033 sec%transport(11,1),sec%transport(12,1), & 1034 sec%transport(11,1)+sec%transport(12,1) 1119 1035 ENDIF 1120 1036 … … 1122 1038 119 FORMAT(I8,1X,I8,1X,I4,1X,A30,1X,f9.2,1X,I4,3X,A8,1X,2F12.4,5X,3E15.6) 1123 1039 1124 CALL wrk_dealloc(nb_type_class , zsumclass es)1040 CALL wrk_dealloc(nb_type_class , zsumclass ) 1125 1041 END SUBROUTINE dia_dct_wri 1126 1042 … … 1128 1044 !!---------------------------------------------------------------------- 1129 1045 !! 1130 !! Purpose: compute temperature/salinity/density at U-point or V-point1046 !! Purpose: compute Temperature/Salinity/density at U-point or V-point 1131 1047 !! -------- 1132 1048 !! … … 1137 1053 !! 1138 1054 !! 1139 !! | I | I+1 | Z= temperature/salinity/density at U-poinT1055 !! | I | I+1 | Z=Temperature/Salinity/density at U-poinT 1140 1056 !! | | | 1141 !! ---------------------------------------- 1. Veritcal interpolation: compute zbis1057 !! ---------------------------------------- 1. Veritcale interpolation: compute zbis 1142 1058 !! | | | interpolation between ptab(I,J,K) and ptab(I,J,K+1) 1143 1059 !! | | | zbis = … … 1220 1136 zdep2 = fsdept(ii2,ij2,kk) - zdepu 1221 1137 1222 ! 1138 !weights 1223 1139 zwgt1 = SQRT( ( 0.5 * zet1 ) * ( 0.5 * zet1 ) + ( zdep1 * zdep1 ) ) 1224 1140 zwgt2 = SQRT( ( 0.5 * zet2 ) * ( 0.5 * zet2 ) + ( zdep2 * zdep2 ) ) … … 1247 1163 1248 1164 IF( ze3t >= 0. )THEN 1249 ! 1165 !zbis 1250 1166 zbis = ptab(ii2,ij2,kk) + zwgt1 * ( ptab(ii2,ij2,kk-1) - ptab(ii2,ij2,kk) ) 1251 1167 ! result 1252 1168 interp = umask(ii1,ij1,kk) * ( zet2 * ptab(ii1,ij1,kk) + zet1 * zbis )/( zet1 + zet2 ) 1253 1169 ELSE 1254 ! 1170 !zbis 1255 1171 zbis = ptab(ii1,ij1,kk) + zwgt2 * ( ptab(ii1,ij1,kk-1) - ptab(ii1,ij2,kk) ) 1256 1172 ! result … … 1279 1195 END SUBROUTINE dia_dct_init 1280 1196 1281 SUBROUTINE dia_dct( kt ) ! Dummy routine1282 INTEGER, INTENT( in ) :: kt! ocean time-step index1197 SUBROUTINE dia_dct( kt ) ! Dummy routine 1198 INTEGER, INTENT( in ) :: kt ! ocean time-step index 1283 1199 WRITE(*,*) 'dia_dct: You should not have seen this print! error?', kt 1284 1200 END SUBROUTINE dia_dct -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diaharm.F90
r3294 r6736 468 468 #else 469 469 DO jh = 1, nb_ana 470 CALL iom_put( TRIM(tname(jh))//'x_v', out_ u(:,:,jh) )471 CALL iom_put( TRIM(tname(jh))//'y_v', out_ u(:,:,nb_ana+jh) )470 CALL iom_put( TRIM(tname(jh))//'x_v', out_v(:,:,jh) ) 471 CALL iom_put( TRIM(tname(jh))//'y_v', out_v(:,:,nb_ana+jh) ) 472 472 END DO 473 473 #endif -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diahsb.F90
r3625 r6736 83 83 z_frc_trd_s = SUM( sbc_tsc(:,:,jp_sal) * surf(:,:) ) ! salt fluxes 84 84 ! Add penetrative solar radiation 85 IF( ln_traqsr ) z_frc_trd_t = z_frc_trd_t + r 1_rau0_rcp* SUM( qsr (:,:) * surf(:,:) )85 IF( ln_traqsr ) z_frc_trd_t = z_frc_trd_t + ro0cpr * SUM( qsr (:,:) * surf(:,:) ) 86 86 ! Add geothermal heat flux 87 IF( ln_trabbc ) z_frc_trd_t = z_frc_trd_t + r 1_rau0_rcp* SUM( qgh_trd0(:,:) * surf(:,:) )87 IF( ln_trabbc ) z_frc_trd_t = z_frc_trd_t + ro0cpr * SUM( qgh_trd0(:,:) * surf(:,:) ) 88 88 IF( lk_mpp ) THEN 89 89 CALL mpp_sum( z_frc_trd_v ) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diawri.F90
r3704 r6736 32 32 USE sbc_oce ! Surface boundary condition: ocean fields 33 33 USE sbc_ice ! Surface boundary condition: ice fields 34 USE icb_oce ! Icebergs35 USE icbdia ! Iceberg budgets36 34 USE sbcssr ! restoring term toward SST/SSS climatology 37 35 USE phycst ! physical constants … … 61 59 62 60 INTEGER :: nid_T, nz_T, nh_T, ndim_T, ndim_hT ! grid_T file 63 INTEGER :: nb_T , ndim_bT ! grid_T file64 61 INTEGER :: nid_U, nz_U, nh_U, ndim_U, ndim_hU ! grid_U file 65 62 INTEGER :: nid_V, nz_V, nh_V, ndim_V, ndim_hV ! grid_V file … … 68 65 INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_hT, ndex_hU, ndex_hV 69 66 INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_T, ndex_U, ndex_V 70 INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_bT71 67 72 68 !! * Substitutions … … 149 145 CALL iom_put( "sss2" , tsn(:,:,1,jp_sal) * tsn(:,:,1,jp_sal) ) ! square of sea surface salinity 150 146 CALL iom_put( "uoce" , un ) ! i-current 151 CALL iom_put( "suoce" , un(:,:,1) ) ! surface i-current152 147 CALL iom_put( "voce" , vn ) ! j-current 153 CALL iom_put( "svoce" , vn(:,:,1) ) ! surface j-current 154 148 155 149 CALL iom_put( "avt" , avt ) ! T vert. eddy diff. coef. 156 150 CALL iom_put( "avm" , avmu ) ! T vert. eddy visc. coef. … … 240 234 INTEGER :: ierr ! error code return from allocation 241 235 INTEGER :: iimi, iima, ipk, it, itmod, ijmi, ijma ! local integers 242 INTEGER :: jn, ierror ! local integers243 236 REAL(wp) :: zsto, zout, zmax, zjulian, zdt ! local scalars 244 237 !! … … 327 320 CALL wheneq( jpi*jpj*ipk, tmask, 1, 1., ndex_T , ndim_T ) ! volume 328 321 CALL wheneq( jpi*jpj , tmask, 1, 1., ndex_hT, ndim_hT ) ! surface 329 !330 IF( ln_icebergs ) THEN331 !332 !! allocation cant go in dia_wri_alloc because ln_icebergs is only set after333 !! that routine is called from nemogcm, so do it here immediately before its needed334 ALLOCATE( ndex_bT(jpi*jpj*nclasses), STAT=ierror )335 IF( lk_mpp ) CALL mpp_sum( ierror )336 IF( ierror /= 0 ) THEN337 CALL ctl_stop('dia_wri: failed to allocate iceberg diagnostic array')338 RETURN339 ENDIF340 !341 !! iceberg vertical coordinate is class number342 CALL histvert( nid_T, "class", "Iceberg class", & ! Vertical grid: class343 & "number", nclasses, class_num, nb_T )344 !345 !! each class just needs the surface index pattern346 ndim_bT = 3347 DO jn = 1,nclasses348 ndex_bT((jn-1)*jpi*jpj+1:jn*jpi*jpj) = ndex_hT(1:jpi*jpj)349 ENDDO350 !351 ENDIF352 322 353 323 ! Define the U grid FILE ( nid_U ) … … 402 372 CALL histdef( nid_T, "sossheig", "Sea Surface Height" , "m" , & ! ssh 403 373 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 374 !!$#if defined key_lim3 || defined key_lim2 375 !!$ ! sowaflup = sowaflep + sorunoff + sowafldp + a term associated to 376 !!$ ! internal damping to Levitus that can be diagnosed from others 377 !!$ ! sowaflcd = sowaflep + sorunoff + sowafldp + iowaflup 378 !!$ CALL histdef( nid_T, "iowaflup", "Ice=>ocean net freshwater" , "kg/m2/s", & ! fsalt 379 !!$ & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 380 !!$ CALL histdef( nid_T, "sowaflep", "atmos=>ocean net freshwater" , "kg/m2/s", & ! fmass 381 !!$ & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 382 !!$#endif 404 383 CALL histdef( nid_T, "sowaflup", "Net Upward Water Flux" , "Kg/m2/s", & ! (emp-rnf) 405 384 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 406 CALL histdef( nid_T, "sosfldow", "downward salt flux" , "PSU/m2/s", & ! sfx 407 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 408 #if ! defined key_vvl 409 CALL histdef( nid_T, "sosst_cd", "Concentration/Dilution term on temperature" & ! emp * tsn(:,:,1,jp_tem) 410 & , "KgC/m2/s", & ! sosst_cd 411 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 412 CALL histdef( nid_T, "sosss_cd", "Concentration/Dilution term on salinity" & ! emp * tsn(:,:,1,jp_sal) 413 & , "KgPSU/m2/s",& ! sosss_cd 414 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 415 #endif 385 !!$ CALL histdef( nid_T, "sorunoff", "Runoffs" , "Kg/m2/s", & ! runoffs 386 !!$ & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 387 CALL histdef( nid_T, "sowaflcd", "concentration/dilution water flux" , "kg/m2/s", & ! (emps-rnf) 388 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 389 CALL histdef( nid_T, "sosalflx", "Surface Salt Flux" , "Kg/m2/s", & ! (emps-rnf) * sn 390 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 416 391 CALL histdef( nid_T, "sohefldo", "Net Downward Heat Flux" , "W/m2" , & ! qns + qsr 417 392 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) … … 426 401 CALL histdef( nid_T, "sowindsp", "wind speed at 10m" , "m/s" , & ! wndm 427 402 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 428 ! 429 IF( ln_icebergs ) THEN 430 CALL histdef( nid_T, "calving" , "calving mass input" , "kg/s" , & 431 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 432 CALL histdef( nid_T, "calving_heat" , "calving heat flux" , "XXXX" , & 433 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 434 CALL histdef( nid_T, "berg_floating_melt" , "Melt rate of icebergs + bits" , "kg/m2/s", & 435 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 436 CALL histdef( nid_T, "berg_stored_ice" , "Accumulated ice mass by class" , "kg" , & 437 & jpi, jpj, nh_T, nclasses , 1, nclasses , nb_T , 32, clop, zsto, zout ) 438 IF( ln_bergdia ) THEN 439 CALL histdef( nid_T, "berg_melt" , "Melt rate of icebergs" , "kg/m2/s", & 403 IF( ln_ssr ) THEN 404 IF( nn_sstr /= 0 ) THEN 405 CALL histdef( nid_T, "sohefldp", "Surface Heat Flux: Damping", "W/m2" , & ! qrp 440 406 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 441 CALL histdef( nid_T, "berg_buoy_melt" , "Buoyancy component of iceberg melt rate" , "kg/m2/s", & 407 ENDIF 408 IF( nn_sssr /= 0 ) THEN 409 CALL histdef( nid_T, "sowafldp", "Surface Water Flux: Damping" , "Kg/m2/s", & ! erp 442 410 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 443 CALL histdef( nid_T, " berg_eros_melt" , "Erosion component of iceberg melt rate" , "kg/m2/s", &411 CALL histdef( nid_T, "sosafldp", "Surface salt flux: damping" , "Kg/m2/s", & ! erp * sn 444 412 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 445 CALL histdef( nid_T, "berg_conv_melt" , "Convective component of iceberg melt rate", "kg/m2/s", &446 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )447 CALL histdef( nid_T, "berg_virtual_area" , "Virtual coverage by icebergs" , "m2" , &448 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )449 CALL histdef( nid_T, "bits_src" , "Mass source of bergy bits" , "kg/m2/s", &450 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )451 CALL histdef( nid_T, "bits_melt" , "Melt rate of bergy bits" , "kg/m2/s", &452 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )453 CALL histdef( nid_T, "bits_mass" , "Bergy bit density field" , "kg/m2" , &454 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )455 CALL histdef( nid_T, "berg_mass" , "Iceberg density field" , "kg/m2" , &456 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )457 CALL histdef( nid_T, "berg_real_calving" , "Calving into iceberg class" , "kg/s" , &458 & jpi, jpj, nh_T, nclasses , 1, nclasses , nb_T , 32, clop, zsto, zout )459 413 ENDIF 460 414 ENDIF 461 462 #if ! defined key_coupled463 CALL histdef( nid_T, "sohefldp", "Surface Heat Flux: Damping" , "W/m2" , & ! qrp464 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )465 CALL histdef( nid_T, "sowafldp", "Surface Water Flux: Damping" , "Kg/m2/s", & ! erp466 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )467 CALL histdef( nid_T, "sosafldp", "Surface salt flux: damping" , "Kg/m2/s", & ! erp * sn468 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )469 #endif470 471 472 473 #if ( defined key_coupled && ! defined key_lim3 && ! defined key_lim2 )474 CALL histdef( nid_T, "sohefldp", "Surface Heat Flux: Damping" , "W/m2" , & ! qrp475 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )476 CALL histdef( nid_T, "sowafldp", "Surface Water Flux: Damping" , "Kg/m2/s", & ! erp477 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )478 CALL histdef( nid_T, "sosafldp", "Surface salt flux: Damping" , "Kg/m2/s", & ! erp * sn479 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout )480 #endif481 415 clmx ="l_max(only(x))" ! max index on a period 482 416 CALL histdef( nid_T, "sobowlin", "Bowl Index" , "W-point", & ! bowl INDEX 483 417 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clmx, zsto, zout ) 484 418 #if defined key_diahth 485 CALL histdef( nid_T, "sothedep", "Thermocline Depth" , "m" , & ! hth486 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 487 CALL histdef( nid_T, "so20chgt", "Depth of 20C isotherm" , "m" , & ! hd20488 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 489 CALL histdef( nid_T, "so28chgt", "Depth of 28C isotherm" , "m" , & ! hd28490 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 491 CALL histdef( nid_T, "sohtc300", "Heat content 300 m" , "W" , & ! htc3419 CALL histdef( nid_T, "sothedep", "Thermocline Depth" , "m" , & ! hth 420 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 421 CALL histdef( nid_T, "so20chgt", "Depth of 20C isotherm" , "m" , & ! hd20 422 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 423 CALL histdef( nid_T, "so28chgt", "Depth of 28C isotherm" , "m" , & ! hd28 424 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 425 CALL histdef( nid_T, "sohtc300", "Heat content 300 m" , "W" , & ! htc3 492 426 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 493 427 #endif … … 496 430 # if defined key_lim3 497 431 Must be adapted to LIM3 498 # endif 499 # if defined key_lim2 432 # else 500 433 CALL histdef( nid_T,"soicetem" , "Ice Surface Temperature" , "K" , & ! tn_ice 501 434 & jpi, jpj, nh_T, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) … … 600 533 CALL histwrite( nid_T, "sosaline", it, tsn(:,:,1,jp_sal), ndim_hT, ndex_hT ) ! sea surface salinity 601 534 CALL histwrite( nid_T, "sossheig", it, sshn , ndim_hT, ndex_hT ) ! sea surface height 535 !!$#if defined key_lim3 || defined key_lim2 536 !!$ CALL histwrite( nid_T, "iowaflup", it, fsalt(:,:) , ndim_hT, ndex_hT ) ! ice=>ocean water flux 537 !!$ CALL histwrite( nid_T, "sowaflep", it, fmass(:,:) , ndim_hT, ndex_hT ) ! atmos=>ocean water flux 538 !!$#endif 602 539 CALL histwrite( nid_T, "sowaflup", it, ( emp-rnf ) , ndim_hT, ndex_hT ) ! upward water flux 603 CALL histwrite( nid_T, "sosfldow", it, sfx , ndim_hT, ndex_hT ) ! downward salt flux 604 ! (includes virtual salt flux beneath ice 605 ! in linear free surface case) 606 #if ! defined key_vvl 607 zw2d(:,:) = emp (:,:) * tsn(:,:,1,jp_tem) 608 CALL histwrite( nid_T, "sosst_cd", it, zw2d, ndim_hT, ndex_hT ) ! c/d term on sst 609 zw2d(:,:) = emp (:,:) * tsn(:,:,1,jp_sal) 610 CALL histwrite( nid_T, "sosss_cd", it, zw2d, ndim_hT, ndex_hT ) ! c/d term on sss 611 #endif 540 !!$ CALL histwrite( nid_T, "sorunoff", it, runoff , ndim_hT, ndex_hT ) ! runoff 541 CALL histwrite( nid_T, "sowaflcd", it, ( emps-rnf ) , ndim_hT, ndex_hT ) ! c/d water flux 542 zw2d(:,:) = ( emps(:,:) - rnf(:,:) ) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 543 CALL histwrite( nid_T, "sosalflx", it, zw2d , ndim_hT, ndex_hT ) ! c/d salt flux 612 544 CALL histwrite( nid_T, "sohefldo", it, qns + qsr , ndim_hT, ndex_hT ) ! total heat flux 613 545 CALL histwrite( nid_T, "soshfldo", it, qsr , ndim_hT, ndex_hT ) ! solar heat flux … … 616 548 CALL histwrite( nid_T, "soicecov", it, fr_i , ndim_hT, ndex_hT ) ! ice fraction 617 549 CALL histwrite( nid_T, "sowindsp", it, wndm , ndim_hT, ndex_hT ) ! wind speed 618 ! 619 IF( ln_icebergs ) THEN 620 ! 621 CALL histwrite( nid_T, "calving" , it, berg_grid%calving , ndim_hT, ndex_hT ) 622 CALL histwrite( nid_T, "calving_heat" , it, berg_grid%calving_hflx , ndim_hT, ndex_hT ) 623 CALL histwrite( nid_T, "berg_floating_melt" , it, berg_grid%floating_melt, ndim_hT, ndex_hT ) 624 ! 625 CALL histwrite( nid_T, "berg_stored_ice" , it, berg_grid%stored_ice , ndim_bT, ndex_bT ) 626 ! 627 IF( ln_bergdia ) THEN 628 CALL histwrite( nid_T, "berg_melt" , it, berg_melt , ndim_hT, ndex_hT ) 629 CALL histwrite( nid_T, "berg_buoy_melt" , it, buoy_melt , ndim_hT, ndex_hT ) 630 CALL histwrite( nid_T, "berg_eros_melt" , it, eros_melt , ndim_hT, ndex_hT ) 631 CALL histwrite( nid_T, "berg_conv_melt" , it, conv_melt , ndim_hT, ndex_hT ) 632 CALL histwrite( nid_T, "berg_virtual_area" , it, virtual_area , ndim_hT, ndex_hT ) 633 CALL histwrite( nid_T, "bits_src" , it, bits_src , ndim_hT, ndex_hT ) 634 CALL histwrite( nid_T, "bits_melt" , it, bits_melt , ndim_hT, ndex_hT ) 635 CALL histwrite( nid_T, "bits_mass" , it, bits_mass , ndim_hT, ndex_hT ) 636 CALL histwrite( nid_T, "berg_mass" , it, berg_mass , ndim_hT, ndex_hT ) 637 ! 638 CALL histwrite( nid_T, "berg_real_calving" , it, real_calving , ndim_bT, ndex_bT ) 550 IF( ln_ssr ) THEN 551 IF( nn_sstr /= 0 ) THEN 552 CALL histwrite( nid_T, "sohefldp", it, qrp , ndim_hT, ndex_hT ) ! heat flux damping 639 553 ENDIF 640 ENDIF 641 642 #if ! defined key_coupled 643 CALL histwrite( nid_T, "sohefldp", it, qrp , ndim_hT, ndex_hT ) ! heat flux damping 644 CALL histwrite( nid_T, "sowafldp", it, erp , ndim_hT, ndex_hT ) ! freshwater flux damping 645 IF( ln_ssr ) zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 646 CALL histwrite( nid_T, "sosafldp", it, zw2d , ndim_hT, ndex_hT ) ! salt flux damping 647 #endif 648 #if ( defined key_coupled && ! defined key_lim3 && ! defined key_lim2 ) 649 CALL histwrite( nid_T, "sohefldp", it, qrp , ndim_hT, ndex_hT ) ! heat flux damping 650 CALL histwrite( nid_T, "sowafldp", it, erp , ndim_hT, ndex_hT ) ! freshwater flux damping 651 IF( ln_ssr ) zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 652 CALL histwrite( nid_T, "sosafldp", it, zw2d , ndim_hT, ndex_hT ) ! salt flux damping 653 #endif 554 IF( nn_sssr /= 0 ) THEN 555 CALL histwrite( nid_T, "sowafldp", it, erp , ndim_hT, ndex_hT ) ! freshwater flux damping 556 zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 557 CALL histwrite( nid_T, "sosafldp", it, zw2d , ndim_hT, ndex_hT ) ! salt flux damping 558 ENDIF 559 ENDIF 654 560 zw2d(:,:) = FLOAT( nmln(:,:) ) * tmask(:,:,1) 655 561 CALL histwrite( nid_T, "sobowlin", it, zw2d , ndim_hT, ndex_hT ) ! ??? … … 667 573 CALL histwrite( nid_T, "soicetem", it, tn_ice , ndim_hT, ndex_hT ) ! surf. ice temperature 668 574 CALL histwrite( nid_T, "soicealb", it, alb_ice , ndim_hT, ndex_hT ) ! ice albedo 669 # endif 670 # if defined key_lim2 575 # else 671 576 CALL histwrite( nid_T, "soicetem", it, tn_ice(:,:,1) , ndim_hT, ndex_hT ) ! surf. ice temperature 672 577 CALL histwrite( nid_T, "soicealb", it, alb_ice(:,:,1), ndim_hT, ndex_hT ) ! ice albedo … … 782 687 !!---------------------------------------------------------------------- 783 688 ! 784 ! IF( nn_timing == 1 ) CALL timing_start('dia_wri_state') ! not sure this works for routines not called in first timestep785 786 689 ! 0. Initialisation 787 690 ! ----------------- … … 878 781 ENDIF 879 782 #endif 880 881 ! IF( nn_timing == 1 ) CALL timing_stop('dia_wri_state') ! not sure this works for routines not called in first timestep882 783 ! 883 784 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diawri_dimg.h90
r3764 r6736 54 54 !! level 14: qct(:,:) equivalent flux due to treshold SST 55 55 !! level 15: fbt(:,:) feedback term . 56 !! level 16: ( emp * sss ) concentration/dilution term on salinity 57 !! level 17: ( emp * sst ) concentration/dilution term on temperature 56 !! level 16: ( emps(:,:) - rnf(:,:) ) concentration/dilution water flux 58 57 !! level 17: fsalt(:,:) Ice=>ocean net freshwater 59 58 !! level 18: gps(:,:) the surface pressure (m). … … 108 107 109 108 110 inbsel = 1 8109 inbsel = 17 111 110 112 111 IF( inbsel > jpk ) THEN … … 175 174 ! fsel(:,:,14) = fsel(:,:,14) + qct(:,:) 176 175 ! fsel(:,:,15) = fsel(:,:,15) + fbt(:,:) 177 fsel(:,:,16) = fsel(:,:,16) + ( emp(:,:)*tsn(:,:,1,jp_sal) ) 178 fsel(:,:,17) = fsel(:,:,17) + ( emp(:,:)*tsn(:,:,1,jp_tem) ) 176 fsel(:,:,16) = fsel(:,:,16) + ( emps(:,:)-rnf(:,:) ) 179 177 ! 180 178 ! Output of dynamics and tracer fields and selected fields … … 246 244 ! fsel(:,:,14) = qct(:,:) 247 245 ! fsel(:,:,15) = fbt(:,:) 248 fsel(:,:,16) = ( emp(:,:)-tsn(:,:,1,jp_sal) ) * tmask(:,:,1) 249 fsel(:,:,17) = ( emp(:,:)-tsn(:,:,1,jp_tem) ) * tmask(:,:,1) 246 fsel(:,:,16) = ( emps(:,:)-rnf(:,:) ) * tmask(:,:,1) 250 247 ! 251 248 ! qct(:,:) = 0._wp -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/closea.F90
r3632 r6736 19 19 USE oce ! dynamics and tracers 20 20 USE dom_oce ! ocean space and time domain 21 USE phycst ! physical constants22 21 USE in_out_manager ! I/O manager 23 22 USE sbc_oce ! ocean surface boundary conditions … … 185 184 !! put as run-off in open ocean. 186 185 !! 187 !! ** Action : emp updated surface freshwater fluxes and associated heat contentat kt186 !! ** Action : emp, emps updated surface freshwater fluxes at kt 188 187 !!---------------------------------------------------------------------- 189 188 INTEGER, INTENT(in) :: kt ! ocean model time step … … 192 191 REAL(wp), PARAMETER :: rsmall = 1.e-20_wp ! Closed sea correction epsilon 193 192 REAL(wp) :: zze2, ztmp, zcorr ! 194 REAL(wp) :: zcoef, zcoef1 !195 193 COMPLEX(wp) :: ctmp 196 194 REAL(wp), DIMENSION(jpncs) :: zfwf ! 1D workspace … … 245 243 ENDIF 246 244 ! !--------------------! 247 ! ! update emp 245 ! ! update emp, emps ! 248 246 zfwf = 0.e0_wp !--------------------! 249 247 IF( lk_mpp_rep ) THEN ! MPP reproductible calculation … … 284 282 ! 285 283 IF( ncstt(jc) == 0 ) THEN ! water/evap excess is shared by all open ocean 286 zcoef = zfwf(jc) / surf(jpncs+1) 287 zcoef1 = rcp * zcoef 288 emp(:,:) = emp(:,:) + zcoef 289 qns(:,:) = qns(:,:) - zcoef1 * sst_m(:,:) 284 emp (:,:) = emp (:,:) + zfwf(jc) / surf(jpncs+1) 285 emps(:,:) = emps(:,:) + zfwf(jc) / surf(jpncs+1) 290 286 ! accumulate closed seas correction 291 zcorr = zcorr + zcoef287 zcorr = zcorr + zfwf(jc) / surf(jpncs+1) 292 288 ! 293 289 ELSEIF( ncstt(jc) == 1 ) THEN ! Excess water in open sea, at outflow location, excess evap shared … … 298 294 IF ( ji > 1 .AND. ji < jpi & 299 295 .AND. jj > 1 .AND. jj < jpj ) THEN 300 zcoef = zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 301 zcoef1 = rcp * zcoef 302 emp(ji,jj) = emp(ji,jj) + zcoef 303 qns(ji,jj) = qns(ji,jj) - zcoef1 * sst_m(ji,jj) 296 emp (ji,jj) = emp (ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 297 emps(ji,jj) = emps(ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 304 298 ENDIF 305 299 END DO 306 300 ELSE 307 zcoef = zfwf(jc) / surf(jpncs+1) 308 zcoef1 = rcp * zcoef 309 emp(:,:) = emp(:,:) + zcoef 310 qns(:,:) = qns(:,:) - zcoef1 * sst_m(:,:) 301 emp (:,:) = emp (:,:) + zfwf(jc) / surf(jpncs+1) 302 emps(:,:) = emps(:,:) + zfwf(jc) / surf(jpncs+1) 311 303 ! accumulate closed seas correction 312 zcorr = zcorr + zcoef304 zcorr = zcorr + zfwf(jc) / surf(jpncs+1) 313 305 ENDIF 314 306 ELSEIF( ncstt(jc) == 2 ) THEN ! Excess e-p-r (either sign) goes to open ocean, at outflow location … … 318 310 IF( ji > 1 .AND. ji < jpi & 319 311 .AND. jj > 1 .AND. jj < jpj ) THEN 320 zcoef = zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 321 zcoef1 = rcp * zcoef 322 emp(ji,jj) = emp(ji,jj) + zcoef 323 qns(ji,jj) = qns(ji,jj) - zcoef1 * sst_m(ji,jj) 312 emp (ji,jj) = emp (ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 313 emps(ji,jj) = emps(ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 324 314 ENDIF 325 315 END DO … … 328 318 DO jj = ncsj1(jc), ncsj2(jc) 329 319 DO ji = ncsi1(jc), ncsi2(jc) 330 zcoef = zfwf(jc) / surf(jc) 331 zcoef1 = rcp * zcoef 332 emp(ji,jj) = emp(ji,jj) - zcoef 333 qns(ji,jj) = qns(ji,jj) + zcoef1 * sst_m(ji,jj) 320 emp (ji,jj) = emp (ji,jj) - zfwf(jc) / surf(jc) 321 emps(ji,jj) = emps(ji,jj) - zfwf(jc) / surf(jc) 334 322 END DO 335 323 END DO … … 342 330 DO jj = ncsj1(jc), ncsj2(jc) 343 331 DO ji = ncsi1(jc), ncsi2(jc) 344 emp (ji,jj) = emp(ji,jj) - zcorr345 qns(ji,jj) = qns(ji,jj) + rcp * zcorr * sst_m(ji,jj)332 emp (ji,jj) = emp (ji,jj) - zcorr 333 emps(ji,jj) = emps(ji,jj) - zcorr 346 334 END DO 347 335 END DO … … 350 338 ! 351 339 emp (:,:) = emp (:,:) * tmask(:,:,1) 340 emps(:,:) = emps(:,:) * tmask(:,:,1) 352 341 ! 353 342 CALL lbc_lnk( emp , 'T', 1._wp ) 343 CALL lbc_lnk( emps, 'T', 1._wp ) 354 344 ! 355 345 IF( nn_timing == 1 ) CALL timing_stop('sbc_clo') -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/daymod.F90
r3851 r6736 32 32 USE ioipsl, ONLY : ymds2ju ! for calendar 33 33 USE prtctl ! Print control 34 USE restart ! 34 35 USE trc_oce, ONLY : lk_offline ! offline flag 35 36 USE timing ! Timing 36 USE restart ! restart37 37 38 38 IMPLICIT NONE … … 153 153 IF ( nleapy == 1 ) THEN ! we are using calandar with leap years 154 154 IF ( MOD(nyear-1, 4) == 0 .AND. ( MOD(nyear-1, 400) == 0 .OR. MOD(nyear-1, 100) /= 0 ) ) THEN 155 nyear_len(0) 156 ENDIF 157 IF ( MOD(nyear , 4) == 0 .AND. ( MOD(nyear , 400) == 0 .OR. MOD(nyear, 100) /= 0 ) ) THEN155 nyear_len(0) = 366 156 ENDIF 157 IF ( MOD(nyear, 4) == 0 .AND. ( MOD(nyear, 400) == 0 .OR. MOD(nyear, 100) /= 0 ) ) THEN 158 158 nmonth_len(2) = 29 159 nyear_len(1) = 366 160 ENDIF 161 IF ( MOD(nyear+1, 4) == 0 .AND. ( MOD(nyear+1, 400) == 0 .OR. MOD(nyear+1, 100) /= 0 ) ) THEN 162 nyear_len(2) = 366 159 nyear_len(1) = 366 163 160 ENDIF 164 161 ENDIF -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/dom_oce.F90
r3851 r6736 8 8 !! 3.3 ! 2010-11 (G. Madec) add mbk. arrays associated to the deepest ocean level 9 9 !! 4.0 ! 2011-01 (A. R. Porter, STFC Daresbury) dynamical allocation 10 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Add arrays associated11 !! to the optimization of BDY communications12 10 !!---------------------------------------------------------------------- 13 11 … … 82 80 INTEGER, PUBLIC :: narea !: number for local area 83 81 INTEGER, PUBLIC :: nbondi, nbondj !: mark of i- and j-direction local boundaries 84 INTEGER, ALLOCATABLE, PUBLIC :: nbondi_bdy(:) !: mark i-direction local boundaries for BDY open boundaries85 INTEGER, ALLOCATABLE, PUBLIC :: nbondj_bdy(:) !: mark j-direction local boundaries for BDY open boundaries86 INTEGER, ALLOCATABLE, PUBLIC :: nbondi_bdy_b(:) !: mark i-direction of neighbours local boundaries for BDY open boundaries87 INTEGER, ALLOCATABLE, PUBLIC :: nbondj_bdy_b(:) !: mark j-direction of neighbours local boundaries for BDY open boundaries88 89 82 INTEGER, PUBLIC :: npolj !: north fold mark (0, 3 or 4) 90 83 INTEGER, PUBLIC :: nlci, nldi, nlei !: i-dimensions of the local subdomain and its first and last indoor indices … … 131 124 LOGICAL, PUBLIC :: ln_zps = .FALSE. !: z-coordinate - partial step 132 125 LOGICAL, PUBLIC :: ln_sco = .FALSE. !: s-coordinate or hybrid z-s coordinate 133 126 LOGICAL, PUBLIC :: ln_s_sigma = .FALSE. ! use hybrid s-sigma -coordinate & stretching function 127 LOGICAL, PUBLIC :: ln_hyb = .FALSE. !: MANE1 s-coordinate or hybrid z-s coordinate 134 128 !! All coordinates 135 129 !! --------------- … … 172 166 !! =----------------======--------------- 173 167 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: gsigt, gsigw !: model level depth coefficient at t-, w-levels (analytic) 168 #if defined key_smsh 169 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gsigt3, gsigw3 !: model level depth coefficient for sigma_s levels 170 #endif 174 171 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: gsi3w !: model level depth coefficient at w-level (sum of gsigw) 172 #if defined key_smsh 173 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gsi3w3 !: model level depth coefficient for sigma_s levels 174 #endif 175 175 176 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: esigt, esigw !: vertical scale factor coef. at t-, w-levels 176 177 178 #if defined key_smsh 179 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: esigt3, esigw3 !: vertical scale factor coef. for sigma_S levels 180 #endif 177 181 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hbatv , hbatf !: ocean depth at the vertical of V--F 178 182 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hbatt , hbatu !: T--U points (m) … … 181 185 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hifv , hiff !: interface depth between stretching at V--F 182 186 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hift , hifu !: and quasi-uniform spacing T--U points (m) 183 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rx1 !: Maximum grid stiffness ratio184 187 185 188 !!---------------------------------------------------------------------- … … 218 221 REAL(wp), PUBLIC :: adatrj !: number of elapsed days since the begining of the whole simulation 219 222 ! !: (cumulative duration of previous runs that may have used different time-step size) 220 INTEGER , PUBLIC, DIMENSION(0: 2) :: nyear_len !: length in days of the previous/current/next year223 INTEGER , PUBLIC, DIMENSION(0: 1) :: nyear_len !: length in days of the previous/current year 221 224 INTEGER , PUBLIC, DIMENSION(0:13) :: nmonth_len !: length in days of the months of the current year 222 225 INTEGER , PUBLIC, DIMENSION(0:13) :: nmonth_half !: second since Jan 1st 0h of the current year and the half of the months … … 293 296 & hv(jpi,jpj) , hvr(jpi,jpj) , hv_0(jpi,jpj) , STAT=ierr(6) ) 294 297 ! 295 ALLOCATE( gdept_0(jpk) , gdepw_0(jpk) , & 296 & e3t_0 (jpk) , e3w_0 (jpk) , e3tp (jpi,jpj), e3wp(jpi,jpj) , & 297 & gsigt (jpk) , gsigw (jpk) , gsi3w(jpk) , & 298 & esigt (jpk) , esigw (jpk) , STAT=ierr(7) ) 298 ALLOCATE( gdept_0(jpk) , gdepw_0(jpk) , & 299 & e3t_0 (jpk) , e3w_0 (jpk) , e3tp (jpi,jpj), e3wp(jpi,jpj) , & 300 & gsigt (jpk) , gsigw (jpk) , gsi3w(jpk) , & 301 #if defined key_smsh 302 & gsigt3 (jpi,jpj,jpk) , gsigw3 (jpi,jpj,jpk) , & 303 & esigt3 (jpi,jpj,jpk) , esigw3 (jpi,jpj,jpk) , & 304 & gsi3w3 (jpi,jpj,jpk) , & 305 #endif 306 & esigt (jpk) , esigw (jpk) , STAT=ierr(7) ) 299 307 ! 300 308 ALLOCATE( hbatv (jpi,jpj) , hbatf (jpi,jpj) , & … … 302 310 & scosrf(jpi,jpj) , scobot(jpi,jpj) , & 303 311 & hifv (jpi,jpj) , hiff (jpi,jpj) , & 304 & hift (jpi,jpj) , hifu (jpi,jpj) , rx1 (jpi,jpj) ,STAT=ierr(8) )312 & hift (jpi,jpj) , hifu (jpi,jpj) , STAT=ierr(8) ) 305 313 306 314 ALLOCATE( mbathy(jpi,jpj) , bathy(jpi,jpj) , & -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domain.F90
r3764 r6736 36 36 USE dyncor_c1d ! Coriolis term (c1d case) (cor_c1d routine) 37 37 USE timing ! Timing 38 USE lbclnk ! ocean lateral boundary condition (or mpp link)39 38 40 39 IMPLICIT NONE … … 85 84 CALL dom_zgr ! Vertical mesh and bathymetry 86 85 CALL dom_msk ! Masks 87 IF( ln_sco ) CALL dom_stiff ! Maximum stiffness ratio/hydrostatic consistency88 86 IF( lk_vvl ) CALL dom_vvl ! Vertical variable mesh 89 87 ! … … 123 121 NAMELIST/namrun/ nn_no , cn_exp , cn_ocerst_in, cn_ocerst_out, ln_rstart , nn_rstctl, & 124 122 & nn_it000, nn_itend , nn_date0 , nn_leapy , nn_istate , nn_stock , & 125 & nn_write, ln_dimgnnn, ln_mskland , ln_clobber , nn_chunksz 123 & nn_write, ln_dimgnnn, ln_mskland , ln_clobber , nn_chunksz, ln_fse3t_b 126 124 NAMELIST/namdom/ nn_bathy , rn_e3zps_min, rn_e3zps_rat, nn_msh , rn_hmin, & 127 125 & nn_acc , rn_atfp , rn_rdt , rn_rdtmin , & … … 156 154 WRITE(numout,*) ' overwrite an existing file ln_clobber = ', ln_clobber 157 155 WRITE(numout,*) ' NetCDF chunksize (bytes) nn_chunksz = ', nn_chunksz 156 WRITE(numout,*) ' fse3t_b in restart? ln_fse3t_b = ', ln_fse3t_b 158 157 ENDIF 159 158 … … 320 319 END SUBROUTINE dom_ctl 321 320 322 SUBROUTINE dom_stiff323 !!----------------------------------------------------------------------324 !! *** ROUTINE dom_stiff ***325 !!326 !! ** Purpose : Diagnose maximum grid stiffness/hydrostatic consistency327 !!328 !! ** Method : Compute Haney (1991) hydrostatic condition ratio329 !! Save the maximum in the vertical direction330 !! (this number is only relevant in s-coordinates)331 !!332 !! Haney, R. L., 1991: On the pressure gradient force333 !! over steep topography in sigma coordinate ocean models.334 !! J. Phys. Oceanogr., 21, 610???619.335 !!----------------------------------------------------------------------336 INTEGER :: ji, jj, jk337 REAL(wp) :: zrxmax338 REAL(wp), DIMENSION(4) :: zr1339 !!----------------------------------------------------------------------340 rx1(:,:) = 0.e0341 zrxmax = 0.e0342 zr1(:) = 0.e0343 344 DO ji = 2, jpim1345 DO jj = 2, jpjm1346 DO jk = 1, jpkm1347 zr1(1) = umask(ji-1,jj ,jk) *abs( (gdepw(ji ,jj ,jk )-gdepw(ji-1,jj ,jk ) &348 & +gdepw(ji ,jj ,jk+1)-gdepw(ji-1,jj ,jk+1)) &349 & /(gdepw(ji ,jj ,jk )+gdepw(ji-1,jj ,jk ) &350 & -gdepw(ji ,jj ,jk+1)-gdepw(ji-1,jj ,jk+1) + rsmall) )351 zr1(2) = umask(ji ,jj ,jk) *abs( (gdepw(ji+1,jj ,jk )-gdepw(ji ,jj ,jk ) &352 & +gdepw(ji+1,jj ,jk+1)-gdepw(ji ,jj ,jk+1)) &353 & /(gdepw(ji+1,jj ,jk )+gdepw(ji ,jj ,jk ) &354 & -gdepw(ji+1,jj ,jk+1)-gdepw(ji ,jj ,jk+1) + rsmall) )355 zr1(3) = vmask(ji ,jj ,jk) *abs( (gdepw(ji ,jj+1,jk )-gdepw(ji ,jj ,jk ) &356 & +gdepw(ji ,jj+1,jk+1)-gdepw(ji ,jj ,jk+1)) &357 & /(gdepw(ji ,jj+1,jk )+gdepw(ji ,jj ,jk ) &358 & -gdepw(ji ,jj+1,jk+1)-gdepw(ji ,jj ,jk+1) + rsmall) )359 zr1(4) = vmask(ji ,jj-1,jk) *abs( (gdepw(ji ,jj ,jk )-gdepw(ji ,jj-1,jk ) &360 & +gdepw(ji ,jj ,jk+1)-gdepw(ji ,jj-1,jk+1)) &361 & /(gdepw(ji ,jj ,jk )+gdepw(ji ,jj-1,jk ) &362 & -gdepw(ji, jj ,jk+1)-gdepw(ji ,jj-1,jk+1) + rsmall) )363 zrxmax = MAXVAL(zr1(1:4))364 rx1(ji,jj) = MAX(rx1(ji,jj), zrxmax)365 END DO366 END DO367 END DO368 369 CALL lbc_lnk( rx1, 'T', 1. )370 371 zrxmax = MAXVAL(rx1)372 373 IF( lk_mpp ) CALL mpp_max( zrxmax ) ! max over the global domain374 375 IF(lwp) THEN376 WRITE(numout,*)377 WRITE(numout,*) 'dom_stiff : maximum grid stiffness ratio: ', zrxmax378 WRITE(numout,*) '~~~~~~~~~'379 ENDIF380 381 END SUBROUTINE dom_stiff382 383 384 385 321 !!====================================================================== 386 322 END MODULE domain -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domhgr.F90
r3294 r6736 26 26 USE lib_mpp ! MPP library 27 27 USE timing ! Timing 28 28 !! test - delete this line 29 29 IMPLICIT NONE 30 30 PRIVATE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90
r3294 r6736 443 443 ! End of individual corrections to scale factors 444 444 445 #if ! defined key_melange 445 446 IF( ln_zps ) THEN ! minimum of the e3t at partial cell level 447 #endif 446 448 DO jj = 2, jpjm1 447 449 DO ji = fs_2, fs_jpim1 448 450 iku = mbku(ji,jj) 451 #if defined key_melange 452 IF(iku>39) THEN 453 #endif 454 pe3u_b(ji,jj,iku) = MIN( fse3t_b(ji,jj,iku), fse3t_b(ji+1,jj ,iku) ) 455 #if defined key_melange 456 ENDIF 457 #endif 449 458 ikv = mbkv(ji,jj) 450 pe3u_b(ji,jj,iku) = MIN( fse3t_b(ji,jj,iku), fse3t_b(ji+1,jj ,iku) ) 459 #if defined key_melange 460 IF(ikv>39) THEN 461 #endif 451 462 pe3v_b(ji,jj,ikv) = MIN( fse3t_b(ji,jj,ikv), fse3t_b(ji ,jj+1,ikv) ) 452 END DO 453 END DO 454 ENDIF 463 #if defined key_melange 464 ENDIF 465 #endif 466 END DO 467 END DO 468 #if ! defined key_melange 469 ENDIF 470 #endif 455 471 456 472 pe3u_b(:,:,:) = pe3u_b(:,:,:) - fse3u_0(:,:,:) ! anomaly to avoid zero along closed boundary/extra halos -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domwri.F90
r3680 r6736 172 172 173 173 IF( ln_sco ) THEN ! s-coordinate 174 CALL iom_rstput( 0, 0, inum4, 'hbatt', hbatt ) 175 CALL iom_rstput( 0, 0, inum4, 'hbatu', hbatu ) 174 CALL iom_rstput( 0, 0, inum4, 'hbatt', hbatt ) ! ! depth 175 CALL iom_rstput( 0, 0, inum4, 'hbatu', hbatu ) 176 176 CALL iom_rstput( 0, 0, inum4, 'hbatv', hbatv ) 177 177 CALL iom_rstput( 0, 0, inum4, 'hbatf', hbatf ) 178 178 ! 179 CALL iom_rstput( 0, 0, inum4, 'gsigt', gsigt ) ! ! scaling coef. 180 CALL iom_rstput( 0, 0, inum4, 'gsigw', gsigw ) 181 CALL iom_rstput( 0, 0, inum4, 'gsi3w', gsi3w ) 182 CALL iom_rstput( 0, 0, inum4, 'esigt', esigt ) 183 CALL iom_rstput( 0, 0, inum4, 'esigw', esigw ) 179 #if defined key_smsh 180 CALL iom_rstput( 0, 0, inum4, 'gsigt', gsigt3 ) ! ! scaling coef. 181 CALL iom_rstput( 0, 0, inum4, 'gsigw', gsigw3 ) 182 CALL iom_rstput( 0, 0, inum4, 'gsi3w', gsi3w3 ) 183 CALL iom_rstput( 0, 0, inum4, 'esigt', esigt3 ) 184 CALL iom_rstput( 0, 0, inum4, 'esigw', esigw3 ) 185 #else 186 CALL iom_rstput( 0, 0, inum4, 'gsigt', gsigt ) ! ! scaling coef. 187 CALL iom_rstput( 0, 0, inum4, 'gsigw', gsigw ) 188 CALL iom_rstput( 0, 0, inum4, 'gsi3w', gsi3w ) 189 CALL iom_rstput( 0, 0, inum4, 'esigt', esigt ) 190 CALL iom_rstput( 0, 0, inum4, 'esigw', esigw ) 191 #endif 192 184 193 ! 185 194 CALL iom_rstput( 0, 0, inum4, 'e3t', e3t ) ! ! scale factors … … 187 196 CALL iom_rstput( 0, 0, inum4, 'e3v', e3v ) 188 197 CALL iom_rstput( 0, 0, inum4, 'e3w', e3w ) 189 CALL iom_rstput( 0, 0, inum4, 'rx1', rx1 ) ! ! Max. grid stiffness ratio 190 ! 191 CALL iom_rstput( 0, 0, inum4, 'gdept' , gdept ) ! ! stretched system 192 CALL iom_rstput( 0, 0, inum4, 'gdepw' , gdepw ) 198 ! 199 #if defined key_smsh 200 CALL iom_rstput( 0, 0, inum4, 'gdept', gdept, ktype = jp_r4 ) 201 DO jk = 1,jpk 202 DO jj = 1, jpjm1 203 DO ji = 1, fs_jpim1 ! vector opt. 204 zdepu(ji,jj,jk) = MIN( gdept(ji,jj,jk) , gdept(ji+1,jj ,jk) ) 205 zdepv(ji,jj,jk) = MIN( gdept(ji,jj,jk) , gdept(ji ,jj+1,jk) ) 206 END DO 207 END DO 208 END DO 209 CALL lbc_lnk( zdepu, 'U', 1. ) ; CALL lbc_lnk( zdepv, 'V', 1. ) 210 CALL iom_rstput( 0, 0, inum4, 'gdepu', zdepu, ktype = jp_r4 ) 211 CALL iom_rstput( 0, 0, inum4, 'gdepv', zdepv, ktype = jp_r4 ) 212 CALL iom_rstput( 0, 0, inum4, 'gdepw', gdepw, ktype = jp_r4 ) 213 DO jj = 1,jpj 214 DO ji = 1,jpi 215 zprt(ji,jj) = gdept(ji,jj,mbkt(ji,jj) ) * tmask(ji,jj,1) 216 zprw(ji,jj) = gdepw(ji,jj,mbkt(ji,jj)+1) * tmask(ji,jj,1) 217 END DO 218 END DO 219 CALL iom_rstput( 0, 0, inum4, 'hdept', zprt, ktype = jp_r4 ) 220 CALL iom_rstput( 0, 0, inum4, 'hdepw', zprw, ktype = jp_r4 ) 221 #endif 222 CALL iom_rstput( 0, 0, inum4, 'gdept_0' , gdept_0 ) ! ! stretched system 223 CALL iom_rstput( 0, 0, inum4, 'gdepw_0' , gdepw_0 ) 193 224 ENDIF 194 225 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90
r3764 r6736 15 15 !! 3.2 ! 2009-07 (R. Benshila) Suppression of rigid-lid option 16 16 !! 3.3 ! 2010-11 (G. Madec) add mbk. arrays associated to the deepest ocean level 17 !! 3.4 ! 2012-08 (J. Siddorn) added Siddorn and Furner stretching function18 17 !! 3.4 ! 2012-12 (R. Bourdalle-Badie and G. Reffray) modify C1D case 19 18 !!---------------------------------------------------------------------- 20 19 21 20 !!---------------------------------------------------------------------- … … 29 28 !! zgr_zps : z-coordinate with partial steps 30 29 !! zgr_sco : s-coordinate 31 !! fssig : tanh stretch function 32 !! fssig1 : Song and Haidvogel 1994 stretch function 33 !! fgamma : Siddorn and Furner 2012 stretching function 30 !! fssig : sigma coordinate non-dimensional function 31 !! dfssig : derivative of the sigma coordinate function !!gm (currently missing!) 34 32 !!--------------------------------------------------------------------- 35 33 USE oce ! ocean variables … … 50 48 51 49 ! !!* Namelist namzgr_sco * 52 LOGICAL :: ln_s_sh94 = .false. ! use hybrid s-sig Song and Haidvogel 1994 stretching function fssig1 (ln_sco=T)53 LOGICAL :: ln_s_sf12 = .true. ! use hybrid s-z-sig Siddorn and Furner 2012 stretching function fgamma (ln_sco=T)54 !55 50 REAL(wp) :: rn_sbot_min = 300._wp ! minimum depth of s-bottom surface (>0) (m) 56 51 REAL(wp) :: rn_sbot_max = 5250._wp ! maximum depth of s-bottom surface (= ocean depth) (>0) (m) 57 REAL(wp) :: rn_rmax = 0.15_wp ! maximum cut-off r-value allowed (0<rn_rmax<1)58 REAL(wp) :: rn_hc = 150._wp ! Critical depth for transition from sigma to stretched coordinates59 ! Song and Haidvogel 1994 stretching parameters60 52 REAL(wp) :: rn_theta = 6.00_wp ! surface control parameter (0<=rn_theta<=20) 61 53 REAL(wp) :: rn_thetb = 0.75_wp ! bottom control parameter (0<=rn_thetb<= 1) 62 REAL(wp) :: rn_bb = 0.80_wp ! stretching parameter 54 REAL(wp) :: rn_rmax = 0.15_wp ! maximum cut-off r-value allowed (0<rn_rmax<1) 55 ! LOGICAL :: ln_s_sigma = .false. ! use hybrid s-sigma -coordinate & stretching function fssig1 (ln_sco=T) 56 REAL(wp) :: rn_bb = 0.80_wp ! stretching parameter for song and haidvogel stretching 63 57 ! ! ( rn_bb=0; top only, rn_bb =1; top and bottom) 64 ! Siddorn and Furner stretching parameters 65 LOGICAL :: ln_sigcrit = .false. ! use sigma coordinates below critical depth (T) or Z coordinates (F) for Siddorn & Furner stretch 66 REAL(wp) :: rn_alpha = 4.4_wp ! control parameter ( > 1 stretch towards surface, < 1 towards seabed) 67 REAL(wp) :: rn_efold = 0.0_wp ! efold length scale for transition to stretched coord 68 REAL(wp) :: rn_zs = 1.0_wp ! depth of surface grid box 69 ! bottom cell depth (Zb) is a linear function of water depth Zb = H*a + b 70 REAL(wp) :: rn_zb_a = 0.024_wp ! bathymetry scaling factor for calculating Zb 71 REAL(wp) :: rn_zb_b = -0.2_wp ! offset for calculating Zb 58 REAL(wp) :: rn_hc = 150._wp ! Critical depth for s-sigma coordinates 59 REAL(wp) :: rn_zsigma = 300._wp ! Maximum depth for s-sigma layer 60 INTEGER :: nn_sig_lev = 10 ! Maximum number of levels of s-sigma layer 61 REAL(wp) :: rn_kth = 15._wp ! Approximate layer number, beyond which streching will be maximum 62 REAL(wp) :: rn_acr = 9.00_wp ! 72 63 73 64 !! * Substitutions … … 100 91 INTEGER :: ioptio, ibat ! local integer 101 92 ! 102 NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco 93 NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco , ln_hyb 103 94 !!---------------------------------------------------------------------- 104 95 ! … … 116 107 WRITE(numout,*) ' z-coordinate - partial steps ln_zps = ', ln_zps 117 108 WRITE(numout,*) ' s- or hybrid z-s-coordinate ln_sco = ', ln_sco 109 WRITE(numout,*) ' hybrid s-z-coordinates,s at shelf ln_hyb = ', ln_hyb 110 118 111 ENDIF 119 112 … … 131 124 IF( ln_zco ) CALL zgr_zco ! z-coordinate 132 125 IF( ln_zps ) CALL zgr_zps ! Partial step z-coordinate 133 IF( ln_sco ) CALL zgr_sco ! s-coordinate or hybrid z-s coordinate 126 IF( ln_sco.AND. .NOT. ln_hyb ) CALL zgr_sco ! s-coordinate or hybrid z-s coordinate (z at upper levels ) 127 IF( ln_sco .AND. ln_hyb ) CALL zgr_hyb ! hybrid s-sigma z ( s- at shel 134 128 ! 135 129 ! final adjustment of mbathy & check … … 520 514 ENDIF 521 515 ! 516 ! 522 517 CALL wrk_dealloc( jpidta, jpjdta, idta ) 523 518 CALL wrk_dealloc( jpidta, jpjdta, zdta ) … … 639 634 END DO 640 635 END DO 636 IF( lk_mpp ) CALL mpp_sum( icompt ) 641 637 IF( icompt == 0 ) THEN 642 638 IF(lwp) WRITE(numout,*)' no isolated ocean grid points' … … 1053 1049 END SUBROUTINE zgr_zps 1054 1050 1051 1052 FUNCTION fssig( pk ) RESULT( pf ) 1053 !!---------------------------------------------------------------------- 1054 !! *** ROUTINE eos_init *** 1055 !! 1056 !! ** Purpose : provide the analytical function in s-coordinate 1057 !! 1058 !! ** Method : the function provide the non-dimensional position of 1059 !! T and W (i.e. between 0 and 1) 1060 !! T-points at integer values (between 1 and jpk) 1061 !! W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 1062 !!---------------------------------------------------------------------- 1063 REAL(wp), INTENT(in) :: pk ! continuous "k" coordinate 1064 REAL(wp) :: pf ! sigma value 1065 !!---------------------------------------------------------------------- 1066 ! 1067 pf = ( TANH( rn_theta * ( -(pk-0.5_wp) / REAL(jpkm1) + rn_thetb ) ) & 1068 & - TANH( rn_thetb * rn_theta ) ) & 1069 & * ( COSH( rn_theta ) & 1070 & + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) ) ) & 1071 & / ( 2._wp * SINH( rn_theta ) ) 1072 ! 1073 END FUNCTION fssig 1074 1075 1076 FUNCTION fssig1( pk1, pbb ) RESULT( pf1 ) 1077 !!---------------------------------------------------------------------- 1078 !! *** ROUTINE eos_init *** 1079 !! 1080 !! ** Purpose : provide the Song and Haidvogel version of the analytical function in s-coordinate 1081 !! 1082 !! ** Method : the function provides the non-dimensional position of 1083 !! T and W (i.e. between 0 and 1) 1084 !! T-points at integer values (between 1 and jpk) 1085 !! W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 1086 !!---------------------------------------------------------------------- 1087 REAL(wp), INTENT(in) :: pk1 ! continuous "k" coordinate 1088 REAL(wp), INTENT(in) :: pbb ! Stretching coefficient 1089 REAL(wp) :: pf1 ! sigma value 1090 !!---------------------------------------------------------------------- 1091 ! 1092 IF ( rn_theta == 0._wp ) then ! uniform sigma 1093 pf1 = - ( pk1 - 0.5_wp ) / REAL( jpkm1 ) 1094 ELSE ! stretched sigma 1095 pf1 = ( 1._wp - pbb ) * ( SINH( rn_theta*(-(pk1-0.5_wp)/REAL(jpkm1)) ) ) / SINH( rn_theta ) & 1096 & + pbb * ( (TANH( rn_theta*( (-(pk1-0.5_wp)/REAL(jpkm1)) + 0.5_wp) ) - TANH( 0.5_wp * rn_theta ) ) & 1097 & / ( 2._wp * TANH( 0.5_wp * rn_theta ) ) ) 1098 ENDIF 1099 ! 1100 END FUNCTION fssig1 1101 FUNCTION fssig2 ( pk, kmax ) RESULT( pf2 ) 1102 !!---------------------------------------------------------------------- 1103 !! *** ROUTINE eos_init *** 1104 !! 1105 !! ** Purpose : provide the analytical function in s-coordinate 1106 !! 1107 !! ** Method : the function provide the non-dimensional position of 1108 !! T and W (i.e. between 0 and 1) 1109 !! T-points at integer values (between 1 and kmax ) 1110 !! W-points at integer values - 1/2 (between 0.5 and kmax-0.5) 1111 !! 1112 !! Reference : ??? 1113 !!---------------------------------------------------------------------- 1114 REAL(wp), INTENT(in ) :: pk ! continuous "k" coordinate 1115 REAL(wp) :: pf2 ! sigma value 1116 INTEGER, INTENT (in) :: kmax ! max of sigma)level 1117 !!---------------------------------------------------------------------- 1118 ! 1119 pf2 = ( TANH( rn_theta * ( -(pk-0.5) / REAL(kmax-1,wp) + rn_thetb ) ) & 1120 & - TANH( rn_thetb * rn_theta ) ) & 1121 & * ( COSH( rn_theta ) & 1122 & + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) ) ) & 1123 & / ( 2._wp * SINH( rn_theta ) ) 1124 ! 1125 END FUNCTION fssig2 1126 1127 FUNCTION fssig3( pk1, pbb ,kmax ) RESULT( pf3 ) 1128 !!---------------------------------------------------------------------- 1129 !! *** ROUTINE eos_init *** 1130 !! 1131 !! ** Purpose : provide the Song and Haidvogel version of the analytical function in s-coordinate 1132 !! 1133 !! ** Method : the function provides the non-dimensional position of 1134 !! T and W (i.e. between 0 and 1) 1135 !! T-points at integer values (between 1 and jpk) 1136 !! W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 1137 !! 1138 !! Reference : ??? 1139 !!---------------------------------------------------------------------- 1140 REAL(wp), INTENT(in ) :: pk1 ! continuous "k" coordinate 1141 REAL(wp), INTENT(in ) :: pbb ! Stretching coefficient 1142 REAL(wp) :: pf3 ! sigma value 1143 INTEGER, INTENT (in) :: kmax ! max number of s-sigma levels 1144 !!---------------------------------------------------------------------- 1145 ! 1146 IF ( rn_theta == 0 ) then ! uniform sigma 1147 pf3 = -(pk1-0.5_wp) / REAL( kmax-1,wp ) 1148 ELSE ! stretched sigma 1149 pf3 = (1.0-pbb) * (sinh( rn_theta*(-(pk1-0.5_wp)/REAL(kmax-1,wp)) ) ) / sinh(rn_theta) + & 1150 & pbb * ( (tanh( rn_theta*( (-(pk1-0.5_wp)/REAL(kmax-1,wp)) + 0.5_wp) ) - tanh(0.5*rn_theta) ) / & 1151 & (2._wp*tanh(0.5_wp*rn_theta) ) ) 1152 ENDIF 1153 END FUNCTION fssig3 1154 1155 SUBROUTINE fszref (zkth, zdzmin, zacr, zhmax,jpup,zhsigm ) 1156 INTEGER :: jk ! dummy loop indices 1157 REAL(wp) :: zt, zw ! temporary scalars 1158 REAL(wp) :: zsur, za0, za1, zkth ! Values set from parameters in 1159 REAL(wp) :: zacr, zdzmin, zhmax, zhmax_r ! read from namelist or par_XXX.h90 1160 REAL(wp) :: zhsigm ! depth of sigma layer 1161 INTEGER :: jpup, jpkmax ! the last sigma level and number of z-levels 1162 !!---------------------------------------------------------------------- 1163 ! compute reference depth leveles 1164 ! Set variables from parameters 1165 ! ------------------------------ 1166 ! zkth = rn_kth ; zacr = rn_acr 1167 ! zdzmin = rn_dzmin ; zhmax_r = rn_hmax 1168 1169 ! za0, za1, zsur are computed from zdzmin , zhmax, zkth, zacr 1170 ! 1171 jpkmax= jpk - jpup 1172 zhmax_r = zhmax - zhsigm 1173 1174 za1 = ( zdzmin - zhmax_r / REAL(jpkmax,wp) ) & 1175 & / ( TANH((1-zkth)/zacr) - zacr/REAL(jpkmax,wp) * ( LOG( COSH( (jpkmax + 1 - zkth) / zacr) ) & 1176 & - LOG( COSH( ( 1 - zkth) / zacr) ) ) ) 1177 za0 = zdzmin - za1 * TANH( (1-zkth) / zacr ) 1178 zsur = - za0 - za1 * zacr * LOG( COSH( (1-zkth) / zacr ) ) 1179 ! Reference z-coordinate (depth - scale factor at T- and W-points) 1180 ! ====================== 1181 IF( zkth == 0.e0 ) THEN ! uniform vertical grid 1182 za1 = zhmax_r / REAL(jpkmax-1,wp) 1183 DO jk = 1, jpkmax+1 1184 zw = REAL( jk,wp ) 1185 zt = REAL( jk,wp ) + 0.5_wp 1186 gdepw_0(jk+jpup-1 ) = ( zw - 1 ) * za1 + zhsigm 1187 gdept_0(jk+jpup-1 ) = ( zt - 1 ) * za1 + zhsigm 1188 e3w_0 (jk+jpup-1 ) = za1 1189 e3t_0 (jk+jpup-1 ) = za1 1190 1191 END DO 1192 ELSE ! Madec & Imbard 1996 function 1193 DO jk = 1, jpkmax+1 1194 zw = REAL( jk,wp) 1195 zt = REAL( jk,wp ) + 0.5_wp 1196 gdepw_0(jk+jpup-1) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth) / zacr ) ) )+zhsigm 1197 gdept_0(jk+jpup-1) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth) / zacr ) ) )+zhsigm 1198 e3w_0 (jk+jpup-1) = za0 + za1 * TANH( (zw-zkth) / zacr ) 1199 e3t_0 (jk+jpup-1) = za0 + za1 * TANH( (zt-zkth) / zacr ) 1200 1201 END DO 1202 gdepw_0(jpup) = zhsigm ! force first w-level to be exactly at zhsigm 1203 ENDIF 1204 IF(lwp) WRITE (numout,*) " max and min z-vertical level",jpkmax+1,jpup 1205 1206 END SUBROUTINE fszref 1207 1208 1055 1209 SUBROUTINE zgr_sco 1056 1210 !!---------------------------------------------------------------------- … … 1071 1225 !! hbatv = mj( hbatt ) 1072 1226 !! hbatf = mi( mj( hbatt ) ) 1073 !! - Compute z_gsigt, z_gsigw, z_esigt, z_esigw from an analytical1227 !! - Compute gsigt, gsigw, esigt, esigw from an analytical 1074 1228 !! function and its derivative given as function. 1075 !! z_gsigt(k) = fssig (k )1076 !! z_gsigw(k) = fssig (k-0.5)1077 !! z_esigt(k) = fsdsig(k )1078 !! z_esigw(k) = fsdsig(k-0.5)1079 !! Th ree options for stretching are give, and they canbe modified1080 !! following the user s requirements. Nevertheless, the output as1229 !! gsigt(k) = fssig (k ) 1230 !! gsigw(k) = fssig (k-0.5) 1231 !! esigt(k) = fsdsig(k ) 1232 !! esigw(k) = fsdsig(k-0.5) 1233 !! This routine is given as an example, it must be modified 1234 !! following the user s desiderata. nevertheless, the output as 1081 1235 !! well as the way to compute the model levels and scale factors 1082 !! must be respected in order to insure second order a ccuracy1236 !! must be respected in order to insure second order a!!uracy 1083 1237 !! schemes. 1084 1238 !! 1085 !! The three methods for stretching available are: 1086 !! 1087 !! s_sh94 (Song and Haidvogel 1994) 1088 !! a sinh/tanh function that allows sigma and stretched sigma 1089 !! 1090 !! s_sf12 (Siddorn and Furner 2012?) 1091 !! allows the maintenance of fixed surface and or 1092 !! bottom cell resolutions (cf. geopotential coordinates) 1093 !! within an analytically derived stretched S-coordinate framework. 1094 !! 1095 !! s_tanh (Madec et al 1996) 1096 !! a cosh/tanh function that gives stretched coordinates 1097 !! 1239 !! Reference : Madec, Lott, Delecluse and Crepon, 1996. JPO, 26, 1393-1408. 1098 1240 !!---------------------------------------------------------------------- 1099 1241 ! 1100 1242 INTEGER :: ji, jj, jk, jl ! dummy loop argument 1101 INTEGER :: iip1, ijp1, iim1, ijm1 ! temporary integers 1102 REAL(wp) :: zrmax, ztaper ! temporary scalars 1103 ! 1104 REAL(wp), POINTER, DIMENSION(:,: ) :: zenv, ztmp, zmsk, zri, zrj, zhbat 1105 1106 NAMELIST/namzgr_sco/ln_s_sh94, ln_s_sf12, ln_sigcrit, rn_sbot_min, rn_sbot_max, rn_hc, rn_rmax,rn_theta, & 1107 rn_thetb, rn_bb, rn_alpha, rn_efold, rn_zs, rn_zb_a, rn_zb_b 1108 !!---------------------------------------------------------------------- 1243 INTEGER :: inum ! temporary logical unit 1244 INTEGER :: iip1, ijp1, iim1, ijm1, kdep ! temporary integers 1245 REAL(wp) :: zcoeft, zcoefw, zrmax, ztaper, maxzenv ! temporary scalars 1246 #if defined key_melange 1247 REAL(wp) :: rn_hc_bak ! temporary scalars 1248 #endif 1249 REAL(wp) :: zrfact ! temporary scalars 1250 REAL(wp), POINTER, DIMENSION(:,: ) :: ztmpi1, ztmpi2, ztmpj1, ztmpj2 1251 ! 1252 #if defined key_fudge 1253 REAL(wp), POINTER, DIMENSION(:,: ) :: zenv, zri, zrj, zhbat, fenv 1254 #else 1255 REAL(wp), POINTER, DIMENSION(:,: ) :: zenv, zri, zrj, zhbat 1256 #endif 1257 #if defined key_smsh 1258 REAL(wp), POINTER, DIMENSION(:,:,:) :: esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 1259 #else 1260 REAL(wp), POINTER, DIMENSION(:,:,:) :: gsigw3, gsigt3, gsi3w3 1261 REAL(wp), POINTER, DIMENSION(:,:,:) :: esigt3, esigw3, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 1262 #endif 1263 NAMELIST/namzgr_sco/ rn_sbot_max, rn_sbot_min, rn_theta, rn_thetb, rn_rmax, ln_s_sigma, rn_bb, rn_hc 1264 #if defined key_melange 1265 NAMELIST/namzgr_sco/ rn_sbot_max, rn_sbot_min, rn_theta, rn_thetb, rn_rmax, ln_s_sigma, rn_bb, rn_hc, nn_sig_lev 1266 #endif 1267 !!---------------------------------------------------------------------- 1109 1268 ! 1110 1269 IF( nn_timing == 1 ) CALL timing_start('zgr_sco') 1111 1270 ! 1112 CALL wrk_alloc( jpi, jpj, zenv, ztmp, zmsk, zri, zrj, zhbat ) 1113 ! 1271 CALL wrk_alloc( jpi, jpj, ztmpi1, ztmpi2, ztmpj1, ztmpj2 ) 1272 #if defined key_fudge 1273 CALL wrk_alloc( jpi, jpj, zenv, zri, zrj, zhbat, fenv ) 1274 #else 1275 CALL wrk_alloc( jpi, jpj, zenv, zri, zrj, zhbat ) 1276 #endif 1277 #if defined key_smsh 1278 CALL wrk_alloc( jpi, jpj, jpk, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 1279 #else 1280 CALL wrk_alloc( jpi, jpj, jpk, gsigw3, gsigt3, gsi3w3 ) 1281 CALL wrk_alloc( jpi, jpj, jpk, esigt3, esigw3, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 1282 #endif 1114 1283 REWIND( numnam ) ! Read Namelist namzgr_sco : sigma-stretching parameters 1115 1284 READ ( numnam, namzgr_sco ) … … 1120 1289 WRITE(numout,*) '~~~~~~~~~~~' 1121 1290 WRITE(numout,*) ' Namelist namzgr_sco' 1122 WRITE(numout,*) ' stretching coeffs ' 1123 WRITE(numout,*) ' maximum depth of s-bottom surface (>0) rn_sbot_max = ',rn_sbot_max 1124 WRITE(numout,*) ' minimum depth of s-bottom surface (>0) rn_sbot_min = ',rn_sbot_min 1125 WRITE(numout,*) ' Critical depth rn_hc = ',rn_hc 1126 WRITE(numout,*) ' maximum cut-off r-value allowed rn_rmax = ',rn_rmax 1127 WRITE(numout,*) ' Song and Haidvogel 1994 stretching ln_s_sh94 = ',ln_s_sh94 1128 WRITE(numout,*) ' Song and Haidvogel 1994 stretching coefficients' 1129 WRITE(numout,*) ' surface control parameter (0<=rn_theta<=20) rn_theta = ',rn_theta 1130 WRITE(numout,*) ' bottom control parameter (0<=rn_thetb<= 1) rn_thetb = ',rn_thetb 1131 WRITE(numout,*) ' stretching parameter (song and haidvogel) rn_bb = ',rn_bb 1132 WRITE(numout,*) ' Siddorn and Furner 2012 stretching ln_s_sf12 = ',ln_s_sf12 1133 WRITE(numout,*) ' switching to sigma (T) or Z (F) at H<Hc ln_sigcrit = ',ln_sigcrit 1134 WRITE(numout,*) ' Siddorn and Furner 2012 stretching coefficients' 1135 WRITE(numout,*) ' stretchin parameter ( >1 surface; <1 bottom) rn_alpha = ',rn_alpha 1136 WRITE(numout,*) ' e-fold length scale for transition region rn_efold = ',rn_efold 1137 WRITE(numout,*) ' Surface cell depth (Zs) (m) rn_zs = ',rn_zs 1138 WRITE(numout,*) ' Bathymetry multiplier for Zb rn_zb_a = ',rn_zb_a 1139 WRITE(numout,*) ' Offset for Zb rn_zb_b = ',rn_zb_b 1140 WRITE(numout,*) ' Bottom cell (Zb) (m) = H*rn_zb_a + rn_zb_b' 1141 ENDIF 1291 WRITE(numout,*) ' sigma-stretching coeffs ' 1292 WRITE(numout,*) ' maximum depth of s-bottom surface (>0) rn_sbot_max = ' ,rn_sbot_max 1293 WRITE(numout,*) ' minimum depth of s-bottom surface (>0) rn_sbot_min = ' ,rn_sbot_min 1294 WRITE(numout,*) ' surface control parameter (0<=rn_theta<=20) rn_theta = ', rn_theta 1295 WRITE(numout,*) ' bottom control parameter (0<=rn_thetb<= 1) rn_thetb = ', rn_thetb 1296 WRITE(numout,*) ' maximum cut-off r-value allowed rn_rmax = ', rn_rmax 1297 WRITE(numout,*) ' Hybrid s-sigma-coordinate ln_s_sigma = ', ln_s_sigma 1298 WRITE(numout,*) ' stretching parameter (song and haidvogel) rn_bb = ', rn_bb 1299 WRITE(numout,*) ' Critical depth rn_hc = ', rn_hc 1300 ENDIF 1301 1302 #if defined key_melange 1303 CALL zgr_zps ! Partial step z-coordinate 1304 ! Scale factors and depth at U-, V-, UW and VW-points 1305 DO jk = 1, nn_sig_lev ! initialisation to z-scale factors above ln_s_sigma to remove any zps 1306 e3u (:,:,jk) = e3t_0(jk) 1307 e3v (:,:,jk) = e3t_0(jk) 1308 e3uw(:,:,jk) = e3w_0(jk) 1309 e3vw(:,:,jk) = e3w_0(jk) 1310 END DO 1311 #endif 1312 1313 gsigw3 = 0._wp ; gsigt3 = 0._wp ; gsi3w3 = 0._wp 1314 esigt3 = 0._wp ; esigw3 = 0._wp 1315 esigtu3 = 0._wp ; esigtv3 = 0._wp ; esigtf3 = 0._wp 1316 esigwu3 = 0._wp ; esigwv3 = 0._wp 1142 1317 1143 1318 hift(:,:) = rn_sbot_min ! set the minimum depth for the s-coordinate … … 1158 1333 ! ! ============================= 1159 1334 ! use r-value to create hybrid coordinates 1335 zenv(:,:) = bathy(:,:) 1336 #if defined key_melange 1337 DO jj = 1, jpj 1338 DO ji = 1, jpi 1339 zenv(ji,jj) = MIN( bathy(ji,jj), gdepw_0(nn_sig_lev + 1) ) 1340 ENDDO 1341 ENDDO 1342 #endif 1343 #if defined key_fudge 1344 CALL iom_open ( 'fudge.nc', inum ) 1345 CALL iom_get ( inum, jpdom_data, 'zenv', fenv ) 1346 CALL iom_close( inum ) 1347 DO jj = 1, jpj 1348 DO ji = 1, jpi 1349 zenv(ji,jj) = MAX( zenv(ji,jj), fenv(ji,jj) ) 1350 ENDDO 1351 ENDDO 1352 #endif 1353 ! 1354 ! set first land point adjacent to a wet cell to sbot_min as this needs to be included in smoothing 1355 DO jj = 1, jpj 1356 DO ji = 1, jpi 1357 IF( bathy(ji,jj) == 0._wp ) THEN 1358 iip1 = MIN( ji+1, jpi ) 1359 ijp1 = MIN( jj+1, jpj ) 1360 iim1 = MAX( ji-1, 1 ) 1361 ijm1 = MAX( jj-1, 1 ) 1362 IF( (bathy(iip1,jj) + bathy(iim1,jj) + bathy(ji,ijp1) + bathy(ji,ijm1) + & 1363 & bathy(iip1,ijp1) + bathy(iim1,ijm1) + bathy(iip1,ijp1) + bathy(iim1,ijm1)) > 0._wp ) THEN 1364 zenv(ji,jj) = rn_sbot_min 1365 ENDIF 1366 ENDIF 1367 END DO 1368 END DO 1369 ! apply lateral boundary condition CAUTION: keep the value when the lbc field is zero 1370 CALL lbc_lnk( zenv, 'T', 1._wp, 'no0' ) 1371 ! 1372 ! smooth the bathymetry (if required) 1373 scosrf(:,:) = 0._wp ! ocean surface depth (here zero: no under ice-shelf sea) 1374 scobot(:,:) = bathy(:,:) ! ocean bottom depth 1375 ! 1376 jl = 0 1377 zrmax = 1._wp 1378 ! 1379 ! set scaling factor used in reducing vertical gradients 1380 zrfact = ( 1._wp - rn_rmax ) / ( 1._wp + rn_rmax ) 1381 ! 1382 ! initialise temporary evelope depth arrays 1383 ztmpi1(:,:) = zenv(:,:) 1384 ztmpi2(:,:) = zenv(:,:) 1385 ztmpj1(:,:) = zenv(:,:) 1386 ztmpj2(:,:) = zenv(:,:) 1387 ! 1388 ! initialise temporary r-value arrays 1389 zri(:,:) = 1._wp 1390 zrj(:,:) = 1._wp 1391 ! ! ================ ! 1392 DO WHILE( jl <= 10000 .AND. ( zrmax - rn_rmax ) > 1.e-8_wp ) ! Iterative loop ! 1393 ! ! ================ ! 1394 jl = jl + 1 1395 zrmax = 0._wp 1396 ! we set zrmax from previous r-values (zri and zrj) first 1397 ! if set after current r-value calculation (as previously) 1398 ! we could exit DO WHILE prematurely before checking r-value 1399 ! of current zenv 1400 DO jj = 1, nlcj 1401 DO ji = 1, nlci 1402 zrmax = MAX( zrmax, ABS(zri(ji,jj)), ABS(zrj(ji,jj)) ) 1403 END DO 1404 END DO 1405 zri(:,:) = 0._wp 1406 zrj(:,:) = 0._wp 1407 DO jj = 1, nlcj 1408 DO ji = 1, nlci 1409 iip1 = MIN( ji+1, nlci ) ! force zri = 0 on last line (ji=ncli+1 to jpi) 1410 ijp1 = MIN( jj+1, nlcj ) ! force zrj = 0 on last raw (jj=nclj+1 to jpj) 1411 IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(iip1,jj) > 0._wp)) THEN 1412 zri(ji,jj) = ( zenv(iip1,jj ) - zenv(ji,jj) ) / ( zenv(iip1,jj ) + zenv(ji,jj) ) 1413 END IF 1414 IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(ji,ijp1) > 0._wp)) THEN 1415 zrj(ji,jj) = ( zenv(ji ,ijp1) - zenv(ji,jj) ) / ( zenv(ji ,ijp1) + zenv(ji,jj) ) 1416 END IF 1417 IF( zri(ji,jj) > rn_rmax ) ztmpi1(ji ,jj ) = zenv(iip1,jj ) * zrfact 1418 IF( zri(ji,jj) < -rn_rmax ) ztmpi2(iip1,jj ) = zenv(ji ,jj ) * zrfact 1419 IF( zrj(ji,jj) > rn_rmax ) ztmpj1(ji ,jj ) = zenv(ji ,ijp1) * zrfact 1420 IF( zrj(ji,jj) < -rn_rmax ) ztmpj2(ji ,ijp1) = zenv(ji ,jj ) * zrfact 1421 END DO 1422 END DO 1423 IF( lk_mpp ) CALL mpp_max( zrmax ) ! max over the global domain 1424 ! 1425 IF(lwp)WRITE(numout,*) 'zgr_sco : iter= ',jl, ' rmax= ', zrmax 1426 ! 1427 DO jj = 1, nlcj 1428 DO ji = 1, nlci 1429 zenv(ji,jj) = MAX(zenv(ji,jj), ztmpi1(ji,jj), ztmpi2(ji,jj), ztmpj1(ji,jj), ztmpj2(ji,jj) ) 1430 END DO 1431 END DO 1432 ! apply lateral boundary condition CAUTION: keep the value when the lbc field is zero 1433 CALL lbc_lnk( zenv, 'T', 1._wp, 'no0' ) 1434 ! ! ================ ! 1435 END DO ! End loop ! 1436 ! ! ================ ! 1437 DO jj = 1, jpj 1438 DO ji = 1, jpi 1439 zenv(ji,jj) = MAX( zenv(ji,jj), rn_sbot_min ) ! set all points to avoid undefined scale value warnings 1440 END DO 1441 END DO 1442 ! 1443 ! Envelope bathymetry saved in hbatt 1444 hbatt(:,:) = zenv(:,:) 1445 1446 IF( MINVAL( gphit(:,:) ) * MAXVAL( gphit(:,:) ) <= 0._wp ) THEN 1447 CALL ctl_warn( ' s-coordinates are tapered in vicinity of the Equator' ) 1448 DO jj = 1, jpj 1449 DO ji = 1, jpi 1450 ztaper = EXP( -(gphit(ji,jj)/8._wp)**2._wp ) 1451 hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * ( 1._wp - ztaper ) 1452 END DO 1453 END DO 1454 ENDIF 1455 ! 1456 IF(lwp) THEN ! Control print 1457 WRITE(numout,*) 1458 WRITE(numout,*) ' domzgr: hbatt field; ocean depth in meters' 1459 WRITE(numout,*) 1460 CALL prihre( hbatt(1,1), jpi, jpj, 1, jpi, 1, 1, jpj, 1, 0._wp, numout ) 1461 IF( nprint == 1 ) THEN 1462 WRITE(numout,*) ' bathy MAX ', MAXVAL( bathy(:,:) ), ' MIN ', MINVAL( bathy(:,:) ) 1463 WRITE(numout,*) ' hbatt MAX ', MAXVAL( hbatt(:,:) ), ' MIN ', MINVAL( hbatt(:,:) ) 1464 ENDIF 1465 ENDIF 1466 1467 ! ! ============================== 1468 ! ! hbatu, hbatv, hbatf fields 1469 ! ! ============================== 1470 IF(lwp) THEN 1471 WRITE(numout,*) 1472 WRITE(numout,*) ' zgr_sco: minimum depth of the envelop topography set to : ', rn_sbot_min 1473 ENDIF 1474 hbatu(:,:) = rn_sbot_min 1475 hbatv(:,:) = rn_sbot_min 1476 hbatf(:,:) = rn_sbot_min 1477 DO jj = 1, jpjm1 1478 DO ji = 1, jpim1 ! NO vector opt. 1479 hbatu(ji,jj) = 0.50_wp * ( hbatt(ji ,jj) + hbatt(ji+1,jj ) ) 1480 hbatv(ji,jj) = 0.50_wp * ( hbatt(ji ,jj) + hbatt(ji ,jj+1) ) 1481 hbatf(ji,jj) = 0.25_wp * ( hbatt(ji ,jj) + hbatt(ji ,jj+1) & 1482 & + hbatt(ji+1,jj) + hbatt(ji+1,jj+1) ) 1483 END DO 1484 END DO 1485 ! 1486 ! Apply lateral boundary condition 1487 !!gm ! CAUTION: retain non zero value in the initial file this should be OK for orca cfg, not for EEL 1488 zhbat(:,:) = hbatu(:,:) ; CALL lbc_lnk( hbatu, 'U', 1._wp ) 1489 DO jj = 1, jpj 1490 DO ji = 1, jpi 1491 IF( hbatu(ji,jj) == 0._wp ) THEN 1492 IF( zhbat(ji,jj) == 0._wp ) hbatu(ji,jj) = rn_sbot_min 1493 IF( zhbat(ji,jj) /= 0._wp ) hbatu(ji,jj) = zhbat(ji,jj) 1494 ENDIF 1495 END DO 1496 END DO 1497 zhbat(:,:) = hbatv(:,:) ; CALL lbc_lnk( hbatv, 'V', 1._wp ) 1498 DO jj = 1, jpj 1499 DO ji = 1, jpi 1500 IF( hbatv(ji,jj) == 0._wp ) THEN 1501 IF( zhbat(ji,jj) == 0._wp ) hbatv(ji,jj) = rn_sbot_min 1502 IF( zhbat(ji,jj) /= 0._wp ) hbatv(ji,jj) = zhbat(ji,jj) 1503 ENDIF 1504 END DO 1505 END DO 1506 zhbat(:,:) = hbatf(:,:) ; CALL lbc_lnk( hbatf, 'F', 1._wp ) 1507 DO jj = 1, jpj 1508 DO ji = 1, jpi 1509 IF( hbatf(ji,jj) == 0._wp ) THEN 1510 IF( zhbat(ji,jj) == 0._wp ) hbatf(ji,jj) = rn_sbot_min 1511 IF( zhbat(ji,jj) /= 0._wp ) hbatf(ji,jj) = zhbat(ji,jj) 1512 ENDIF 1513 END DO 1514 END DO 1515 1516 !!bug: key_helsinki a verifer 1517 hift(:,:) = MIN( hift(:,:), hbatt(:,:) ) 1518 hifu(:,:) = MIN( hifu(:,:), hbatu(:,:) ) 1519 hifv(:,:) = MIN( hifv(:,:), hbatv(:,:) ) 1520 hiff(:,:) = MIN( hiff(:,:), hbatf(:,:) ) 1521 1522 IF( nprint == 1 .AND. lwp ) THEN 1523 WRITE(numout,*) ' MAX val hif t ', MAXVAL( hift (:,:) ), ' f ', MAXVAL( hiff (:,:) ), & 1524 & ' u ', MAXVAL( hifu (:,:) ), ' v ', MAXVAL( hifv (:,:) ) 1525 WRITE(numout,*) ' MIN val hif t ', MINVAL( hift (:,:) ), ' f ', MINVAL( hiff (:,:) ), & 1526 & ' u ', MINVAL( hifu (:,:) ), ' v ', MINVAL( hifv (:,:) ) 1527 WRITE(numout,*) ' MAX val hbat t ', MAXVAL( hbatt(:,:) ), ' f ', MAXVAL( hbatf(:,:) ), & 1528 & ' u ', MAXVAL( hbatu(:,:) ), ' v ', MAXVAL( hbatv(:,:) ) 1529 WRITE(numout,*) ' MIN val hbat t ', MINVAL( hbatt(:,:) ), ' f ', MINVAL( hbatf(:,:) ), & 1530 & ' u ', MINVAL( hbatu(:,:) ), ' v ', MINVAL( hbatv(:,:) ) 1531 ENDIF 1532 !! helsinki 1533 1534 ! ! ======================= 1535 ! ! s-ccordinate fields (gdep., e3.) 1536 ! ! ======================= 1537 ! 1538 ! non-dimensional "sigma" for model level depth at w- and t-levels 1539 1540 IF( ln_s_sigma ) THEN ! Song and Haidvogel style stretched sigma for depths 1541 ! ! below rn_hc, with uniform sigma in shallower waters 1542 DO ji = 1, jpi 1543 DO jj = 1, jpj 1544 1545 IF( hbatt(ji,jj) > rn_hc ) THEN !deep water, stretched sigma 1546 DO jk = 1, jpk 1547 #if defined key_melange 1548 gsigw3(ji,jj,jk) = gdepw_0(jk)/gdepw_0(nn_sig_lev + 1) 1549 gsigt3(ji,jj,jk) = gdept_0(jk)/gdepw_0(nn_sig_lev + 1) 1550 #else 1551 gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, rn_bb ) 1552 gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp) , rn_bb ) 1553 #endif 1554 END DO 1555 ELSE ! shallow water, uniform sigma 1556 DO jk = 1, jpk 1557 #if defined key_melange 1558 gsigw3(ji,jj,jk) = REAL(jk-1,wp) / REAL(nn_sig_lev,wp) 1559 gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(nn_sig_lev,wp) 1560 #else 1561 gsigw3(ji,jj,jk) = REAL(jk-1,wp) / REAL(jpk-1,wp) 1562 gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(jpk-1,wp) 1563 #endif 1564 END DO 1565 ENDIF 1566 IF( nprint == 1 .AND. lwp ) WRITE(numout,*) 'gsigw3 1 jpk ', gsigw3(ji,jj,1), gsigw3(ji,jj,jpk) 1567 ! 1568 DO jk = 1, jpkm1 1569 esigt3(ji,jj,jk ) = gsigw3(ji,jj,jk+1) - gsigw3(ji,jj,jk) 1570 esigw3(ji,jj,jk+1) = gsigt3(ji,jj,jk+1) - gsigt3(ji,jj,jk) 1571 END DO 1572 esigw3(ji,jj,1 ) = 2._wp * ( gsigt3(ji,jj,1 ) - gsigw3(ji,jj,1 ) ) 1573 esigt3(ji,jj,jpk) = 2._wp * ( gsigt3(ji,jj,jpk) - gsigw3(ji,jj,jpk) ) 1574 ! 1575 ! Coefficients for vertical depth as the sum of e3w scale factors 1576 gsi3w3(ji,jj,1) = 0.5_wp * esigw3(ji,jj,1) 1577 DO jk = 2, jpk 1578 gsi3w3(ji,jj,jk) = gsi3w3(ji,jj,jk-1) + esigw3(ji,jj,jk) 1579 END DO 1580 ! 1581 #if defined key_melange 1582 DO jk = 1, nn_sig_lev+1 1583 ! DO jk = 1, jpk 1584 IF( bathy(ji,jj) < gdepw_0(nn_sig_lev + 1) ) THEN ! should this be bathy or hbatt? 1585 #else 1586 DO jk = 1, jpk 1587 #endif 1588 #if defined key_melange 1589 zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(nn_sig_lev,wp) 1590 zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(nn_sig_lev,wp) 1591 ! zcoeft = ( REAL(MIN(jk,nn_sig_lev),wp) - 0.5_wp ) / REAL(nn_sig_lev-1,wp) 1592 ! zcoefw = ( REAL(MIN(jk,nn_sig_lev),wp) - 1.0_wp ) / REAL(nn_sig_lev-1,wp) 1593 #else 1594 zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 1595 zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 1596 #endif 1597 #if defined key_melange 1598 rn_hc_bak = rn_hc 1599 rn_hc = MIN( MAX ( & 1600 & (hbatt(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc)) & 1601 & ,0._wp) ,rn_hc) 1602 #endif 1603 gdept (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsigt3(ji,jj,jk)+rn_hc*zcoeft ) 1604 gdepw (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsigw3(ji,jj,jk)+rn_hc*zcoefw ) 1605 gdep3w(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsi3w3(ji,jj,jk)+rn_hc*zcoeft ) 1606 #if defined key_melange 1607 rn_hc = rn_hc_bak 1608 #endif 1609 IF( gdepw(ji,jj,jk) < 0._wp ) THEN 1610 WRITE(*,*) 'zgr_sco : gdepw at point (i,j,k)= ', ji, jj, jk, (gsigw3(ji,jj,jk)*10000._wp-zcoefw*10000._wp) 1611 ENDIF 1612 #if defined key_melange 1613 ENDIF 1614 #endif 1615 END DO 1616 ! 1617 END DO ! for all jj's 1618 END DO ! for all ji's 1619 1620 DO ji = 1, jpim1 1621 DO jj = 1, jpjm1 1622 #if defined key_melange 1623 IF( bathy(ji,jj) < gdepw_0(nn_sig_lev + 1) ) THEN ! should this be bathy or hbatt? 1624 DO jk = 1, nn_sig_lev+1 ! scale factors should be the same in both zps and sco when H > Hcrit?? 1625 ! DO jk = 1, jpk 1626 #else 1627 DO jk = 1, jpk 1628 #endif 1629 esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk) ) & 1630 & / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 1631 esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji,jj+1)*esigt3(ji,jj+1,jk) ) & 1632 & / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 1633 esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk) & 1634 & + hbatt(ji,jj+1)*esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*esigt3(ji+1,jj+1,jk) ) & 1635 & / ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 1636 esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji+1,jj)*esigw3(ji+1,jj,jk) ) & 1637 & / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 1638 esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji,jj+1)*esigw3(ji,jj+1,jk) ) & 1639 & / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 1640 ! 1641 #if defined key_melange 1642 rn_hc_bak = rn_hc 1643 rn_hc = MIN( MAX( & 1644 & (hbatt(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc)) & 1645 & ,0._wp) ,rn_hc) 1646 ! e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigt3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 1647 ! e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigw3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 1648 e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigt3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 1649 e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigw3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 1650 #else 1651 e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigt3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1652 e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigw3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1653 #endif 1654 #if defined key_melange 1655 rn_hc = MIN( MAX( & 1656 & (hbatu(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc_bak)) & 1657 & ,0._wp) ,rn_hc_bak) 1658 ! e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 1659 ! e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 1660 e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 1661 e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 1662 #else 1663 e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1664 e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1665 #endif 1666 #if defined key_melange 1667 rn_hc = MIN( MAX( & 1668 & (hbatv(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc_bak)) & 1669 & ,0._wp) ,rn_hc_bak) 1670 ! e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 1671 ! e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 1672 e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 1673 e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 1674 #else 1675 e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1676 e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1677 #endif 1678 #if defined key_melange 1679 rn_hc = MIN( MAX( & 1680 & (hbatf(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc_bak)) & 1681 & ,0._wp), rn_hc_bak) 1682 ! e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 1683 e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 1684 #else 1685 e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp)) 1686 #endif 1687 ! 1688 #if defined key_melange 1689 rn_hc = rn_hc_bak 1690 #endif 1691 END DO 1692 #if defined key_melange 1693 ENDIF 1694 #endif 1695 END DO 1696 END DO 1697 1698 CALL lbc_lnk( e3t , 'T', 1._wp ) 1699 CALL lbc_lnk( e3u , 'U', 1._wp ) 1700 CALL lbc_lnk( e3v , 'V', 1._wp ) 1701 CALL lbc_lnk( e3f , 'F', 1._wp ) 1702 CALL lbc_lnk( e3w , 'W', 1._wp ) 1703 CALL lbc_lnk( e3uw, 'U', 1._wp ) 1704 CALL lbc_lnk( e3vw, 'V', 1._wp ) 1705 1706 ! 1707 ELSE ! not ln_s_sigma 1708 ! 1709 DO jk = 1, jpk 1710 gsigw(jk) = -fssig( REAL(jk,wp)-0.5_wp ) 1711 gsigt(jk) = -fssig( REAL(jk,wp) ) 1712 END DO 1713 IF( nprint == 1 .AND. lwp ) WRITE(numout,*) 'gsigw 1 jpk ', gsigw(1), gsigw(jpk) 1714 ! 1715 ! Coefficients for vertical scale factors at w-, t- levels 1716 !!gm bug : define it from analytical function, not like juste bellow.... 1717 !!gm or betteroffer the 2 possibilities.... 1718 DO jk = 1, jpkm1 1719 esigt(jk ) = gsigw(jk+1) - gsigw(jk) 1720 esigw(jk+1) = gsigt(jk+1) - gsigt(jk) 1721 END DO 1722 esigw( 1 ) = 2._wp * ( gsigt(1 ) - gsigw(1 ) ) 1723 esigt(jpk) = 2._wp * ( gsigt(jpk) - gsigw(jpk) ) 1724 1725 !!gm original form 1726 !!org DO jk = 1, jpk 1727 !!org esigt(jk)=fsdsig( FLOAT(jk) ) 1728 !!org esigw(jk)=fsdsig( FLOAT(jk)-0.5 ) 1729 !!org END DO 1730 !!gm 1731 ! 1732 ! Coefficients for vertical depth as the sum of e3w scale factors 1733 gsi3w(1) = 0.5_wp * esigw(1) 1734 DO jk = 2, jpk 1735 gsi3w(jk) = gsi3w(jk-1) + esigw(jk) 1736 END DO 1737 !!gm: depuw, depvw can be suppressed (modif in ldfslp) and depw=dep3w can be set (save 3 3D arrays) 1738 DO jk = 1, jpk 1739 zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 1740 zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 1741 gdept (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsigt(jk) + hift(:,:)*zcoeft ) 1742 gdepw (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsigw(jk) + hift(:,:)*zcoefw ) 1743 gdep3w(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsi3w(jk) + hift(:,:)*zcoeft ) 1744 END DO 1745 !!gm: e3uw, e3vw can be suppressed (modif in dynzdf, dynzdf_iso, zdfbfr) (save 2 3D arrays) 1746 DO jj = 1, jpj 1747 DO ji = 1, jpi 1748 DO jk = 1, jpk 1749 e3t(ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*esigt(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 1750 e3u(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*esigt(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 1751 e3v(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*esigt(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 1752 e3f(ji,jj,jk) = ( (hbatf(ji,jj)-hiff(ji,jj))*esigt(jk) + hiff(ji,jj)/REAL(jpkm1,wp) ) 1753 ! 1754 e3w (ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*esigw(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 1755 e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*esigw(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 1756 e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*esigw(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 1757 END DO 1758 END DO 1759 END DO 1760 ! 1761 ENDIF ! ln_s_sigma 1762 1763 where (e3t (:,:,:).eq.0._wp) e3t(:,:,:) = 1._wp 1764 where (e3u (:,:,:).eq.0._wp) e3u(:,:,:) = 1._wp 1765 where (e3v (:,:,:).eq.0._wp) e3v(:,:,:) = 1._wp 1766 where (e3f (:,:,:).eq.0._wp) e3f(:,:,:) = 1._wp 1767 where (e3w (:,:,:).eq.0._wp) e3w(:,:,:) = 1._wp 1768 where (e3uw (:,:,:).eq.0._wp) e3uw(:,:,:) = 1._wp 1769 where (e3vw (:,:,:).eq.0._wp) e3vw(:,:,:) = 1._wp 1770 1771 1772 fsdept(:,:,:) = gdept (:,:,:) 1773 fsdepw(:,:,:) = gdepw (:,:,:) 1774 fsde3w(:,:,:) = gdep3w(:,:,:) 1775 fse3t (:,:,:) = e3t (:,:,:) 1776 fse3u (:,:,:) = e3u (:,:,:) 1777 fse3v (:,:,:) = e3v (:,:,:) 1778 fse3f (:,:,:) = e3f (:,:,:) 1779 fse3w (:,:,:) = e3w (:,:,:) 1780 fse3uw(:,:,:) = e3uw (:,:,:) 1781 fse3vw(:,:,:) = e3vw (:,:,:) 1782 !! 1783 ! HYBRID : 1784 DO jj = 1, jpj 1785 DO ji = 1, jpi 1786 #if defined key_melange 1787 IF( bathy(ji,jj) < gdepw_0(nn_sig_lev + 1) ) THEN ! should this be hbatt or bathy 1788 DO jk = 1, nn_sig_lev 1789 ! DO jk = 1, jpkm1 1790 #else 1791 DO jk = 1, jpkm1 1792 #endif 1793 IF( scobot(ji,jj) >= fsdept(ji,jj,jk) ) mbathy(ji,jj) = MAX( 2, jk ) 1794 END DO 1795 #if defined key_melange 1796 ENDIF 1797 #endif 1798 IF( scobot(ji,jj) == 0._wp ) mbathy(ji,jj) = 0 1799 END DO 1800 END DO 1801 IF( nprint == 1 .AND. lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ), & 1802 & ' MAX ', MAXVAL( mbathy(:,:) ) 1803 1804 ! ! ============= 1805 IF(lwp) THEN ! Control print 1806 ! ! ============= 1807 WRITE(numout,*) 1808 WRITE(numout,*) ' domzgr: vertical coefficients for model level' 1809 WRITE(numout, "(9x,' level gsigt gsigw esigt esigw gsi3w')" ) 1810 WRITE(numout, "(10x,i4,5f11.4)" ) ( jk, gsigt(jk), gsigw(jk), esigt(jk), esigw(jk), gsi3w(jk), jk=1,jpk ) 1811 ENDIF 1812 IF( nprint == 1 .AND. lwp ) THEN ! min max values over the local domain 1813 WRITE(numout,*) ' MIN val mbathy ', MINVAL( mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 1814 WRITE(numout,*) ' MIN val depth t ', MINVAL( fsdept(:,:,:) ), & 1815 & ' w ', MINVAL( fsdepw(:,:,:) ), '3w ' , MINVAL( fsde3w(:,:,:) ) 1816 WRITE(numout,*) ' MIN val e3 t ', MINVAL( fse3t (:,:,:) ), ' f ' , MINVAL( fse3f (:,:,:) ), & 1817 & ' u ', MINVAL( fse3u (:,:,:) ), ' u ' , MINVAL( fse3v (:,:,:) ), & 1818 & ' uw', MINVAL( fse3uw(:,:,:) ), ' vw' , MINVAL( fse3vw(:,:,:) ), & 1819 & ' w ', MINVAL( fse3w (:,:,:) ) 1820 1821 WRITE(numout,*) ' MAX val depth t ', MAXVAL( fsdept(:,:,:) ), & 1822 & ' w ', MAXVAL( fsdepw(:,:,:) ), '3w ' , MAXVAL( fsde3w(:,:,:) ) 1823 WRITE(numout,*) ' MAX val e3 t ', MAXVAL( fse3t (:,:,:) ), ' f ' , MAXVAL( fse3f (:,:,:) ), & 1824 & ' u ', MAXVAL( fse3u (:,:,:) ), ' u ' , MAXVAL( fse3v (:,:,:) ), & 1825 & ' uw', MAXVAL( fse3uw(:,:,:) ), ' vw' , MAXVAL( fse3vw(:,:,:) ), & 1826 & ' w ', MAXVAL( fse3w (:,:,:) ) 1827 ENDIF 1828 ! 1829 IF(lwp) THEN ! selected vertical profiles 1830 WRITE(numout,*) 1831 WRITE(numout,*) ' domzgr: vertical coordinates : point (1,1,k) bathy = ', bathy(1,1), hbatt(1,1) 1832 WRITE(numout,*) ' ~~~~~~ --------------------' 1833 WRITE(numout,"(9x,' level gdept gdepw gde3w e3t e3w ')") 1834 WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(1,1,jk), fsdepw(1,1,jk), & 1835 & fse3t (1,1,jk), fse3w (1,1,jk), jk=1,jpk ) 1836 DO jj = mj0(20), mj1(20) 1837 DO ji = mi0(20), mi1(20) 1838 WRITE(numout,*) 1839 WRITE(numout,*) ' domzgr: vertical coordinates : point (20,20,k) bathy = ', bathy(ji,jj), hbatt(ji,jj) 1840 WRITE(numout,*) ' ~~~~~~ --------------------' 1841 WRITE(numout,"(9x,' level gdept gdepw gde3w e3t e3w ')") 1842 WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk), & 1843 & fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 1844 END DO 1845 END DO 1846 DO jj = mj0(74), mj1(74) 1847 DO ji = mi0(100), mi1(100) 1848 WRITE(numout,*) 1849 WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k) bathy = ', bathy(ji,jj), hbatt(ji,jj) 1850 WRITE(numout,*) ' ~~~~~~ --------------------' 1851 WRITE(numout,"(9x,' level gdept gdepw gde3w e3t e3w ')") 1852 WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk), & 1853 & fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 1854 END DO 1855 END DO 1856 ENDIF 1857 1858 !!gm bug? no more necessary? if ! defined key_helsinki 1859 DO jk = 1, jpk 1860 DO jj = 1, jpj 1861 DO ji = 1, jpi 1862 IF( fse3w(ji,jj,jk) <= 0._wp .OR. fse3t(ji,jj,jk) <= 0._wp ) THEN 1863 WRITE(*,*) 'zgr_sco : e3w or e3t =< 0 at point (i,j,k)= ', ji, jj, jk, fse3w(ji,jj,jk), fse3t(ji,jj,jk) 1864 ! WRITE(ctmp1,*) 'zgr_sco : e3w or e3t =< 0 at point (i,j,k)= ', ji, jj, jk 1865 ! CALL ctl_stop( ctmp1 ) 1866 ENDIF 1867 IF( fsdepw(ji,jj,jk) < 0._wp .OR. fsdept(ji,jj,jk) < 0._wp ) THEN 1868 WRITE(*,*) 'zgr_sco : gdepw or gdept =< 0 at point (i,j,k)= ', ji, jj, jk, fsdepw(ji,jj,jk), fsdept(ji,jj,jk) 1869 ! WRITE(ctmp1,*) 'zgr_sco : gdepw or gdept =< 0 at point (i,j,k)= ', ji, jj, jk 1870 ! CALL ctl_stop( ctmp1 ) 1871 ENDIF 1872 END DO 1873 END DO 1874 END DO 1875 !!gm bug #endif 1876 ! 1877 1878 CALL wrk_dealloc( jpi, jpj, zenv, ztmpi1, ztmpi2, ztmpj1, ztmpj2, zri, zrj, zhbat ) 1879 1880 #if defined key_smsh 1881 CALL wrk_dealloc( jpi, jpj, jpk, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 1882 #else 1883 CALL wrk_dealloc( jpi, jpj, jpk, gsigw3, gsigt3, gsi3w3 ) 1884 CALL wrk_dealloc( jpi, jpj, jpk, esigt3, esigw3, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 1885 #endif 1886 ! 1887 IF( nn_timing == 1 ) CALL timing_stop('zgr_sco') 1888 ! 1889 END SUBROUTINE zgr_sco 1890 SUBROUTINE zgr_hyb 1891 !!---------------------------------------------------------------------- 1892 !! *** ROUTINE zgr_sco *** 1893 !! Combination of zgr_sco in upper layers ( shelf ) and zgr_zps in abyss !! 1894 !! ** Purpose : define the s-z coordinate system 1895 !! 1896 !! ** Method : s-coordinate in upper layers and z-coordinates below 1897 !! The depth of model levels is defined as the product of an 1898 !! analytical function by the local bathymetry, while the vertical 1899 !! scale factors are defined as the product of the first derivative 1900 !! of the analytical function by the bathymetry. 1901 !! (this solution save memory as depth and scale factors are not 1902 !! 3d fields) 1903 !! - Read bathymetry (in meters) at t-point and compute the 1904 !! bathymetry at u-, v-, and f-points. 1905 !! hbatu = mi( hbatt ) 1906 !! hbatv = mj( hbatt ) 1907 !! hbatf = mi( mj( hbatt ) ) 1908 !! - Compute gsigt, gsigw, esigt, esigw from an analytical 1909 !! function 1910 !! gsigt(k) = fssig (k ) 1911 !! gsigw(k) = fssig (k-0.5) 1912 !! This routine is given as an example, it must be modified 1913 !! following the user s desiderata. nevertheless, the output as 1914 !! well as the way to compute the model levels and scale factors 1915 !! must be respected in order to insure second order a!!uracy 1916 !! schemes. 1917 !! 1918 1919 !!====================================================================== 1920 INTEGER :: ji, jj, jk, jl, ik ! dummy loop argument 1921 INTEGER :: iip1, ijp1, iim1, ijm1 ! temporary integers 1922 INTEGER :: jpksigm ! temporary integer for maxnumber of s-levels 1923 REAL(wp) :: zcoeft, zcoefw, zrmax, ztaper,zrmin,e3t_t,e3w_t ! temporary scalars 1924 REAL(wp) :: ze3tp , ze3wp ! Last ocean level thickness at T- and W-points 1925 REAL(wp) :: zdepwp, zdepth ! Ajusted ocean depth to avoid too small e3t 1926 REAL(wp) :: zmax, zmin ,zsigma ! Maximum and minimum depth and depth of sigma layer 1927 REAL(wp) :: zacr , zkth ,za1 ! parameters for z- layer (as ppacr , ppzkth ) 1928 1929 1930 ! 1931 REAL(wp), POINTER, DIMENSION(:,: ) :: zenv, ztmp, zmsk, zri, zrj, zhbat ,zrpt 1932 1933 NAMELIST/namzgr_hyb/ rn_sbot_max, rn_sbot_min, rn_theta, rn_thetb, rn_rmax, & 1934 ln_s_sigma, rn_bb, rn_hc,rn_zsigma , nn_sig_lev , rn_kth , rn_acr 1935 1936 1937 !!---------------------------------------------------------------------- 1938 ! 1939 IF( nn_timing == 1 ) CALL timing_start('zgr_hyb') 1940 ! 1941 CALL wrk_alloc( jpi, jpj, zenv, ztmp, zmsk, zri, zrj, zhbat ) 1942 1943 ! CALL wrk_alloc( jpi, jpj, jpk, gsigw3, gsigt3 ) 1944 ! 1945 REWIND( numnam ) ! Read Namelist namzgr_sco : sigma-stretching parameters 1946 READ ( numnam, namzgr_hyb ) 1947 IF(lwp) THEN ! control print 1948 WRITE(numout,*) 1949 WRITE(numout,*) 'dom:zgr_hyb : s-coordinate or hybrid z-s-coordinate' 1950 WRITE(numout,*) '~~~~~~~~~~~' 1951 WRITE(numout,*) ' Namelist namzgr_hyb' 1952 WRITE(numout,*) ' sigma-stretching coeffs ' 1953 WRITE(numout,*) ' maximum depth of s-bottom surface (>0) rn_sbot_max = ' ,rn_sbot_max 1954 WRITE(numout,*) ' minimum depth of s-bottom surface (>0) rn_sbot_min = ' ,rn_sbot_min 1955 WRITE(numout,*) ' surface control parameter (0<=rn_theta<=20) rn_theta = ', rn_theta 1956 WRITE(numout,*) ' bottom control parameter (0<=rn_thetb<= 1) rn_thetb = ', rn_thetb 1957 WRITE(numout,*) ' maximum cut-off r-value allowed rn_rmax = ', rn_rmax 1958 WRITE(numout,*) ' Hybrid s-sigma-coordinate ln_s_sigma = ', ln_s_sigma 1959 WRITE(numout,*) ' stretching parameter (song and haidvogel) rn_bb = ', rn_bb 1960 WRITE(numout,*) ' Critical depth rn_hc = ', rn_hc 1961 WRITE(numout,*) ' Sigma depth rn_zsigma = ', rn_zsigma 1962 WRITE(numout,*) ' The same as pp_arc rn_arc = ', rn_acr 1963 WRITE(numout,*) ' Number of sigma levels rn_arc = ', nn_sig_lev 1964 WRITE(numout,*) ' Number of levels for stretching z-coord rn_kth = ', rn_kth 1965 1966 1967 ENDIF 1968 zsigma = rn_zsigma 1969 jpksigm = nn_sig_lev 1970 zmax = rn_sbot_max 1971 zacr = rn_acr 1972 zkth = rn_kth 1973 e3t(:,:,:) = 1._wp 1974 e3w(:,:,:) = 1._wp 1975 e3u(:,:,:) = 1._wp 1976 e3v(:,:,:) = 1._wp 1977 e3f(:,:,:) = 1._wp 1978 e3uw(:,:,:)= 1._wp 1979 e3vw(:,:,:)= 1._wp 1980 1981 1982 1983 1984 1985 DO jj = 1, jpj 1986 DO ji= 1, jpi 1987 IF( bathy(ji,jj) <= 0._wp ) THEN ; bathy(ji,jj) = 0.e0_wp 1988 ELSE ; bathy(ji,jj) = MIN( rn_sbot_max, MAX( bathy(ji,jj),rn_sbot_min ) ) 1989 ENDIF 1990 END DO 1991 END DO 1992 1993 ! create bathymetry for enveloping 1160 1994 DO jj = 1, jpj 1161 1995 DO ji = 1, jpi 1162 1996 zenv(ji,jj) = MAX( bathy(ji,jj), rn_sbot_min ) 1163 END DO1164 END DO1165 !1166 ! Smooth the bathymetry (if required)1997 zenv(ji,jj) = MIN (zenv(ji,jj), zsigma ) 1998 hbatt(ji,jj) = zenv(ji,jj) 1999 END DO 2000 END DO 1167 2001 scosrf(:,:) = 0._wp ! ocean surface depth (here zero: no under ice-shelf sea) 1168 2002 scobot(:,:) = bathy(:,:) ! ocean bottom depth 1169 !1170 2003 jl = 0 1171 2004 zrmax = 1._wp … … 1197 2030 END DO 1198 2031 END DO 1199 ! 1200 IF(lwp)WRITE(numout,*) 'zgr_sco : iter= ',jl, ' rmax= ', zrmax, ' nb of pt= ', INT( SUM(zmsk(:,:) ) ) 2032 IF(lwp)WRITE(numout,*) 'zgr_hyb : iter= ',jl, ' rmax= ', zrmax, ' nb of pt= ', INT( SUM(zmsk(:,:) ) ) 1201 2033 ! 1202 2034 DO jj = 1, nlcj … … 1222 2054 DO jj = 1, nlcj 1223 2055 DO ji = 1, nlci 1224 IF( zmsk(ji,jj) == 1._wp ) zenv(ji,jj) = MAX( ztmp(ji,jj), bathy(ji,jj) )2056 IF( zmsk(ji,jj) == 1._wp ) zenv(ji,jj) = MAX( ztmp(ji,jj), hbatt(ji,jj) ) 1225 2057 END DO 1226 2058 END DO 1227 2059 ! 1228 ! Apply lateral boundary condition CAUTION: ke epthe value when the lbc field is zero2060 ! Apply lateral boundary condition CAUTION: kept the value when the lbc field is zero 1229 2061 ztmp(:,:) = zenv(:,:) ; CALL lbc_lnk( zenv, 'T', 1._wp ) 1230 2062 DO jj = 1, nlcj … … 1237 2069 ! ! ================ ! 1238 2070 ! 1239 ! Fill ghost rows with appropriate values to avoid undefined e3 values with some mpp decompositions 1240 DO ji = nlci+1, jpi 1241 zenv(ji,1:nlcj) = zenv(nlci,1:nlcj) 1242 END DO 1243 ! 1244 DO jj = nlcj+1, jpj 1245 zenv(:,jj) = zenv(:,nlcj) 1246 END DO 1247 ! 1248 ! Envelope bathymetry saved in hbatt 2071 ! ! envelop bathymetry saved in hbatt 1249 2072 hbatt(:,:) = zenv(:,:) 1250 IF( MINVAL( gphit(:,:) ) * MAXVAL( gphit(:,:) ) <= 0._wp ) THEN 1251 CALL ctl_warn( ' s-coordinates are tapered in vicinity of the Equator' ) 1252 DO jj = 1, jpj 1253 DO ji = 1, jpi 1254 ztaper = EXP( -(gphit(ji,jj)/8._wp)**2 ) 1255 hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * ( 1._wp - ztaper ) 1256 END DO 1257 END DO 1258 ENDIF 1259 ! 1260 IF(lwp) THEN ! Control print 2073 IF( lk_mpp ) CALL mpp_max( nstop ) 2074 IF (lwp) write(numout,*)"after envelope", nstop 2075 2076 ! define new reference levels 2077 ! for s- levels, allows stretching at surface and bottom layer 2078 IF( jpksigm > 1 )THEN 2079 IF(ln_s_sigma)THEN 2080 DO jk = 1, jpksigm 2081 gsigw(jk) = -fssig3( REAL(jk,wp)-0.5_wp , rn_bb,jpksigm ) 2082 gsigt(jk) = -fssig3( REAL(jk,wp) , rn_bb,jpksigm ) 2083 END DO 2084 ELSE 2085 DO jk = 1, jpksigm 2086 gsigw(jk) = -fssig2( REAL(jk,wp)-0.5_wp ,jpksigm ) 2087 gsigt(jk) = -fssig2( REAL(jk,wp) ,jpksigm ) 2088 2089 END DO 2090 ENDIF 2091 gsigw(1)=0._wp ! set gsigw exactly to zero 2092 IF( lk_mpp ) CALL mpp_max( nstop ) 2093 IF (lwp) THEN 2094 write(numout,*)"after fssig", nstop,"gsigw,gsigt=" 2095 do jk=1,jpksigm 2096 write(numout,*)jk,gsigw(jk),gsigt(jk) 2097 enddo 2098 ENDIF 2099 2100 DO jk=1,jpksigm 2101 DO jj=1,jpj 2102 DO ji=1,jpi 2103 zrmin= min( hbatt(ji,jj), zsigma ) 2104 IF(hbatt(ji,jj).lt.rn_hc)THEN 2105 zcoefw=REAL(jk-1,wp) / REAL(jpksigm-1,wp) 2106 zcoeft=(REAL(jk-1,wp)+0.5)/ REAL(jpksigm-1,wp) 2107 ELSE 2108 zcoefw=gsigw(jk) 2109 zcoeft=gsigt(jk) 2110 2111 ENDIF 2112 2113 gdept(ji,jj,jk)=scosrf(ji,jj)+(zrmin-rn_hc)*zcoeft & 2114 +rn_hc* (REAL(jk,wp)- 0.5_wp) / REAL(jpksigm-1,wp) 2115 gdepw(ji,jj,jk)=scosrf(ji,jj)+(zrmin-rn_hc)*zcoefw & 2116 +rn_hc*( REAL(jk,wp)- 1.0_wp ) / REAL(jpksigm-1,wp) 2117 2118 ENDDO 2119 ENDDO 2120 ENDDO 2121 gdepw(:,:,1)= scosrf(:,:) 2122 ! redefine gdept_0, gdepw_0 which will be used in diawri.F90 2123 DO jk=1,jpksigm 2124 IF(zsigma.lt.rn_hc)THEN 2125 zcoefw=REAL(jk-1,wp) / REAL(jpksigm-1,wp) 2126 zcoeft=(REAL(jk-1,wp)+0.5)/ REAL(jpksigm-1,wp) 2127 ELSE 2128 zcoefw=gsigw(jk) 2129 zcoeft=gsigt(jk) 2130 ENDIF 2131 2132 gdept_0(jk)= zcoeft * (zsigma-rn_hc)+rn_hc* (REAL(jk,wp)- 0.5_wp )/REAL(jpksigm-1,wp) 2133 gdepw_0(jk)= zcoefw * (zsigma-rn_hc)+rn_hc* (REAL(jk,wp)- 1.0_wp )/REAL(jpksigm-1,wp) 2134 ENDDO 2135 2136 DO jk=1,jpksigm-1 2137 e3t_0(jk) = gdepw_0(jk+1)-gdepw_0(jk) 2138 e3w_0(jk+1)= gdept_0(jk+1)-gdept_0(jk) 2139 ENDDO 2140 e3w_0(1) = 2._wp * ( gdept_0(1 ) - gdepw_0(1 ) ) 2141 2142 2143 ! now for lower z-levels : 2144 zmin = e3t_0 (jpksigm -1 ) ! min layer width in z- zone is the same as lowest in s- layer 2145 ELSE 2146 zsigma = 0._wp 2147 hbatt(:,:) = zsigma 2148 zmin = 5._wp 2149 ENDIF 2150 IF(lwp) write(numout,*) ": last vertical level of sigma-coordinates",zmin 2151 CALL fszref ( zkth, zmin, zacr, zmax, jpksigm , zsigma ) 2152 2153 2154 DO jk=jpksigm,jpkm1 2155 2156 e3t_0(jk) = gdepw_0(jk+1)-gdepw_0(jk) 2157 e3w_0(jk+1)= gdept_0(jk+1)-gdept_0(jk) 2158 ENDDO 2159 e3w_0(1) = 2._wp * ( gdept_0(1 ) - gdepw_0(1 ) ) 2160 e3t_0(jpk) = 2._wp * ( gdept_0(jpk) - gdepw_0(jpk) ) 2161 2162 IF( lk_mpp ) CALL mpp_max( nstop ) 2163 IF (lwp) write(numout,*)"e3t0" ,nstop 2164 2165 IF(lwp) THEN ! control print 1261 2166 WRITE(numout,*) 1262 WRITE(numout,*) ' domzgr: hbatt field; ocean depth in meters' 2167 WRITE(numout,*) ' zhyb Reference z-coordinate depth and scale factors:' 2168 WRITE(numout, "(9x,' level gdept gdepw e3t e3w ')" ) 2169 WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, gdept_0(jk), gdepw_0(jk), e3t_0(jk), e3w_0(jk), jk = 1, jpk ) 2170 open(333,file='zmesh.dat') 2171 WRITE(333,*)'initial zsigma =', zsigma, jpk 2172 WRITE(333,*)'initial jpksigm =', jpksigm 2173 WRITE(333,*)'rn_bb =', rn_bb,'rn_theta=',rn_theta 2174 do jk=1,jpk 2175 WRITE(333,'(i4,1x,4(1x,e13.6))') jk, gdept_0(jk), gdepw_0(jk), e3t_0(jk),e3w_0(jk) 2176 enddo 2177 close(333) 2178 ENDIF 2179 2180 DO jk=jpksigm,jpk 2181 DO jj=1,jpj 2182 DO ji=1,jpi 2183 IF(jpksigm>1)THEN 2184 gdept(ji,jj,jk)=scosrf(ji,jj) + gdept_0(jk) *hbatt(ji,jj)/zsigma ! differ from gdept0+scorf only at land 2185 gdepw(ji,jj,jk)=scosrf(ji,jj) + gdepw_0(jk) *hbatt(ji,jj)/zsigma ! as hbatt=zsigma over deep part of basin 2186 ELSE 2187 gdept(ji,jj,jk)=scosrf(ji,jj) + gdept_0(jk) 2188 gdepw(ji,jj,jk)=scosrf(ji,jj) + gdepw_0(jk) 2189 2190 ENDIF 2191 ENDDO 2192 ENDDO 2193 ENDDO 2194 2195 ! define e3t, e3w for general levels 2196 DO jk=1,jpkm1 2197 e3t(:,:,jk) = gdepw(:,:,jk+1)-gdepw(:,:,jk) 2198 e3w(:,:,jk+1)= gdept(:,:,jk+1)-gdept(:,:,jk) 2199 ENDDO 2200 e3w(:,:,1) = 2._wp * ( gdept(:,:,1 ) - gdepw(:,:,1 ) ) 2201 e3t(:,:,jpk) = 2._wp * ( gdept(:,:,jpk) - gdepw(:,:,jpk) ) 2202 2203 ! and surface : 2204 ! ! HYBRID mbathy : 2205 2206 IF(lwp) THEN ! control print 1263 2207 WRITE(numout,*) 1264 CALL prihre( hbatt(1,1), jpi, jpj, 1, jpi, 1, 1, jpj, 1, 0._wp, numout ) 1265 IF( nprint == 1 ) THEN 1266 WRITE(numout,*) ' bathy MAX ', MAXVAL( bathy(:,:) ), ' MIN ', MINVAL( bathy(:,:) ) 1267 WRITE(numout,*) ' hbatt MAX ', MAXVAL( hbatt(:,:) ), ' MIN ', MINVAL( hbatt(:,:) ) 1268 ENDIF 1269 ENDIF 1270 1271 ! ! ============================== 1272 ! ! hbatu, hbatv, hbatf fields 1273 ! ! ============================== 1274 IF(lwp) THEN 1275 WRITE(numout,*) 1276 WRITE(numout,*) ' zgr_sco: minimum depth of the envelop topography set to : ', rn_sbot_min 1277 ENDIF 1278 hbatu(:,:) = rn_sbot_min 1279 hbatv(:,:) = rn_sbot_min 1280 hbatf(:,:) = rn_sbot_min 1281 DO jj = 1, jpjm1 1282 DO ji = 1, jpim1 ! NO vector opt. 1283 hbatu(ji,jj) = 0.50_wp * ( hbatt(ji ,jj) + hbatt(ji+1,jj ) ) 1284 hbatv(ji,jj) = 0.50_wp * ( hbatt(ji ,jj) + hbatt(ji ,jj+1) ) 1285 hbatf(ji,jj) = 0.25_wp * ( hbatt(ji ,jj) + hbatt(ji ,jj+1) & 1286 & + hbatt(ji+1,jj) + hbatt(ji+1,jj+1) ) 1287 END DO 1288 END DO 1289 ! 1290 ! Apply lateral boundary condition 1291 !!gm ! CAUTION: retain non zero value in the initial file this should be OK for orca cfg, not for EEL 1292 zhbat(:,:) = hbatu(:,:) ; CALL lbc_lnk( hbatu, 'U', 1._wp ) 2208 WRITE(numout,*) ' zhyb centre of basin s-z-coordinate depth and scale factors:' 2209 WRITE(numout, "(9x,' level gdept gdepw e3t e3w ')" ) 2210 write(numout,*)"bathy" ,"min e3t" 2211 do jk=1,jpk 2212 WRITE(numout, "(10x, i4, 4f9.2)" ) jk, gdept(20,20,jk), gdepw(20,20,jk), & 2213 & e3t(20,20,jk), e3w(20,20,jk) 2214 enddo 2215 ENDIF 2216 2217 mbathy(:,:)=0 2218 ! WHERE( 0._wp < bathy(:,:)) mbathy(:,:)=jpkm1 1293 2219 DO jj = 1, jpj 1294 2220 DO ji = 1, jpi 1295 IF( hbatu(ji,jj) == 0._wp ) THEN 1296 IF( zhbat(ji,jj) == 0._wp ) hbatu(ji,jj) = rn_sbot_min 1297 IF( zhbat(ji,jj) /= 0._wp ) hbatu(ji,jj) = zhbat(ji,jj) 2221 DO jk = 1, jpkm1 2222 IF( bathy(ji,jj) >= gdept(ji,jj,jk) ) mbathy(ji,jj) = MAX( 2, jk ) 2223 2224 END DO 2225 END DO 2226 END DO 2227 2228 ! DO jk = jpkm1, jpksigm+1, -1 2229 ! zdepth = gdepw_0(jk) + MIN( e3zps_min, e3t_0(jk)*e3zps_rat ) 2230 ! WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth ) mbathy(:,:) = jk-1 2231 ! END DO 2232 2233 2234 2235 ! z-partial steps :goto 20 2236 DO jj = 1, jpj 2237 DO ji = 1, jpi 2238 ik = mbathy(ji,jj) 2239 IF( ik > jpksigm ) THEN ! ocean point only 2240 ! max ocean level case 2241 IF( ik == jpkm1 ) THEN 2242 zdepwp = bathy(ji,jj) 2243 ze3tp = bathy(ji,jj) - gdepw_0(ik) 2244 ze3wp = 0.5_wp * e3w_0(ik) * ( 1._wp + ( ze3tp/e3t_0(ik) ) ) 2245 e3t(ji,jj,ik ) = ze3tp 2246 e3t(ji,jj,ik+1) = ze3tp 2247 e3w(ji,jj,ik ) = ze3wp 2248 e3w(ji,jj,ik+1) = ze3tp 2249 gdepw(ji,jj,ik+1) = zdepwp 2250 gdept(ji,jj,ik ) = gdept_0(ik-1) + ze3wp 2251 gdept(ji,jj,ik+1) = gdept(ji,jj,ik) + ze3tp 2252 ! 2253 ELSE ! standard case 2254 IF( bathy(ji,jj) <= gdepw_0(ik+1) ) THEN ; gdepw(ji,jj,ik+1) = bathy(ji,jj) 2255 ELSE ; gdepw(ji,jj,ik+1) = gdepw_0(ik+1) 2256 ENDIF 2257 !gm Bug? check the gdepw_0 2258 ! ... on ik 2259 gdept(ji,jj,ik) = gdepw_0(ik) + ( gdepw (ji,jj,ik+1) - gdepw_0(ik) ) & 2260 & * ((gdept_0( ik ) - gdepw_0(ik) ) & 2261 & / ( gdepw_0( ik+1) - gdepw_0(ik) )) 2262 e3t (ji,jj,ik) = e3t_0 (ik) * ( gdepw (ji,jj,ik+1) - gdepw_0(ik) ) & 2263 & / ( gdepw_0( ik+1) - gdepw_0(ik) ) 2264 e3w (ji,jj,ik) = 0.5_wp * ( gdepw(ji,jj,ik+1) + gdepw_0(ik+1) - 2._wp * gdepw_0(ik) ) & 2265 & * ( e3w_0(ik) / ( gdepw_0(ik+1) - gdepw_0(ik) ) ) 2266 ! ... on ik+1 2267 e3w (ji,jj,ik+1) = e3t (ji,jj,ik) 2268 e3t (ji,jj,ik+1) = e3t (ji,jj,ik) 2269 gdept(ji,jj,ik+1) = gdept(ji,jj,ik) + e3t(ji,jj,ik) 2270 ENDIF 1298 2271 ENDIF 1299 2272 END DO 1300 2273 END DO 1301 zhbat(:,:) = hbatv(:,:) ; CALL lbc_lnk( hbatv, 'V', 1._wp ) 2274 ! 2275 jl = 0 1302 2276 DO jj = 1, jpj 1303 2277 DO ji = 1, jpi 1304 IF( hbatv(ji,jj) == 0._wp ) THEN 1305 IF( zhbat(ji,jj) == 0._wp ) hbatv(ji,jj) = rn_sbot_min 1306 IF( zhbat(ji,jj) /= 0._wp ) hbatv(ji,jj) = zhbat(ji,jj) 2278 ik = mbathy(ji,jj) 2279 IF( ik > jpksigm ) THEN ! ocean point only 2280 e3tp (ji,jj) = e3t(ji,jj,ik ) 2281 e3wp (ji,jj) = e3w(ji,jj,ik ) 2282 ! test 2283 zmin= gdepw(ji,jj,ik+1) - gdept(ji,jj,ik ) 2284 IF( zmin <= 0._wp .AND. lwp ) THEN 2285 jl = jl + 1 2286 WRITE(numout,*) ' it = ', jl, ' ik = ', ik, ' (i,j) = ', ji, jj 2287 WRITE(numout,*) ' bathy = ', bathy(ji,jj) 2288 WRITE(numout,*) ' gdept = ', gdept(ji,jj,ik), ' gdepw = ', gdepw(ji,jj,ik+1), ' zdiff = ', zmin 2289 WRITE(numout,*) ' e3tp = ', e3t (ji,jj,ik), ' e3wp = ', e3w (ji,jj,ik ) 2290 ENDIF 1307 2291 ENDIF 1308 2292 END DO 1309 2293 END DO 1310 zhbat(:,:) = hbatf(:,:) ; CALL lbc_lnk( hbatf, 'F', 1._wp ) 1311 DO jj = 1, jpj 1312 DO ji = 1, jpi 1313 IF( hbatf(ji,jj) == 0._wp ) THEN 1314 IF( zhbat(ji,jj) == 0._wp ) hbatf(ji,jj) = rn_sbot_min 1315 IF( zhbat(ji,jj) /= 0._wp ) hbatf(ji,jj) = zhbat(ji,jj) 1316 ENDIF 1317 END DO 1318 END DO 1319 1320 !!bug: key_helsinki a verifer 1321 hift(:,:) = MIN( hift(:,:), hbatt(:,:) ) 1322 hifu(:,:) = MIN( hifu(:,:), hbatu(:,:) ) 1323 hifv(:,:) = MIN( hifv(:,:), hbatv(:,:) ) 1324 hiff(:,:) = MIN( hiff(:,:), hbatf(:,:) ) 1325 1326 IF( nprint == 1 .AND. lwp ) THEN 1327 WRITE(numout,*) ' MAX val hif t ', MAXVAL( hift (:,:) ), ' f ', MAXVAL( hiff (:,:) ), & 1328 & ' u ', MAXVAL( hifu (:,:) ), ' v ', MAXVAL( hifv (:,:) ) 1329 WRITE(numout,*) ' MIN val hif t ', MINVAL( hift (:,:) ), ' f ', MINVAL( hiff (:,:) ), & 1330 & ' u ', MINVAL( hifu (:,:) ), ' v ', MINVAL( hifv (:,:) ) 1331 WRITE(numout,*) ' MAX val hbat t ', MAXVAL( hbatt(:,:) ), ' f ', MAXVAL( hbatf(:,:) ), & 1332 & ' u ', MAXVAL( hbatu(:,:) ), ' v ', MAXVAL( hbatv(:,:) ) 1333 WRITE(numout,*) ' MIN val hbat t ', MINVAL( hbatt(:,:) ), ' f ', MINVAL( hbatf(:,:) ), & 1334 & ' u ', MINVAL( hbatu(:,:) ), ' v ', MINVAL( hbatv(:,:) ) 1335 ENDIF 1336 !! helsinki 1337 1338 ! ! ======================= 1339 ! ! s-ccordinate fields (gdep., e3.) 1340 ! ! ======================= 1341 ! 1342 ! non-dimensional "sigma" for model level depth at w- and t-levels 1343 1344 1345 !======================================================================== 1346 ! Song and Haidvogel 1994 (ln_s_sh94=T) 1347 ! Siddorn and Furner 2012 (ln_sf12=T) 1348 ! or tanh function (both false) 1349 !======================================================================== 1350 IF ( ln_s_sh94 ) THEN 1351 CALL s_sh94() 1352 ELSE IF ( ln_s_sf12 ) THEN 1353 CALL s_sf12() 1354 ELSE 1355 CALL s_tanh() 1356 ENDIF 1357 1358 CALL lbc_lnk( e3t , 'T', 1._wp ) 1359 CALL lbc_lnk( e3u , 'U', 1._wp ) 1360 CALL lbc_lnk( e3v , 'V', 1._wp ) 1361 CALL lbc_lnk( e3f , 'F', 1._wp ) 1362 CALL lbc_lnk( e3w , 'W', 1._wp ) 1363 CALL lbc_lnk( e3uw, 'U', 1._wp ) 1364 CALL lbc_lnk( e3vw, 'V', 1._wp ) 1365 1366 fsdepw(:,:,:) = gdepw (:,:,:) 1367 fsde3w(:,:,:) = gdep3w(:,:,:) 1368 ! 1369 where (e3t (:,:,:).eq.0.0) e3t(:,:,:) = 1.0 1370 where (e3u (:,:,:).eq.0.0) e3u(:,:,:) = 1.0 1371 where (e3v (:,:,:).eq.0.0) e3v(:,:,:) = 1.0 1372 where (e3f (:,:,:).eq.0.0) e3f(:,:,:) = 1.0 1373 where (e3w (:,:,:).eq.0.0) e3w(:,:,:) = 1.0 1374 where (e3uw (:,:,:).eq.0.0) e3uw(:,:,:) = 1.0 1375 where (e3vw (:,:,:).eq.0.0) e3vw(:,:,:) = 1.0 1376 1377 1378 fsdept(:,:,:) = gdept (:,:,:) 1379 fsdepw(:,:,:) = gdepw (:,:,:) 1380 fsde3w(:,:,:) = gdep3w(:,:,:) 1381 fse3t (:,:,:) = e3t (:,:,:) 1382 fse3u (:,:,:) = e3u (:,:,:) 1383 fse3v (:,:,:) = e3v (:,:,:) 1384 fse3f (:,:,:) = e3f (:,:,:) 1385 fse3w (:,:,:) = e3w (:,:,:) 1386 fse3uw(:,:,:) = e3uw (:,:,:) 1387 fse3vw(:,:,:) = e3vw (:,:,:) 1388 !! 1389 ! HYBRID : 1390 DO jj = 1, jpj 1391 DO ji = 1, jpi 1392 DO jk = 1, jpkm1 1393 IF( scobot(ji,jj) >= fsdept(ji,jj,jk) ) mbathy(ji,jj) = MAX( 2, jk ) 1394 IF( scobot(ji,jj) == 0._wp ) mbathy(ji,jj) = 0 2294 2295 ! Scale factors and depth at U-, V-, UW and VW-points 2296 DO jk = 1, jpk ! initialisation to z-scale factors 2297 e3u (:,:,jk) = e3t(:,:,jk) 2298 e3v (:,:,jk) = e3t(:,:,jk) 2299 e3uw(:,:,jk) = e3w(:,:,jk) 2300 e3vw(:,:,jk) = e3w(:,:,jk) 2301 e3f (:,:,jk) = e3t(:,:,jk) 2302 END DO 2303 DO jk = 1, jpksigm-1 2304 DO jj = 1, jpjm1 2305 DO ji = 1, fs_jpim1 2306 e3u(ji,jj,jk)=( REAL(MIN(1,mbathy(ji,jj)),wp)* e3t(ji,jj,jk) + & 2307 REAL(MIN(1,mbathy(ji+1,jj)),wp)*e3t(ji+1,jj,jk) ) & 2308 /MAX( 1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji+1,jj)) ) 2309 2310 e3uw(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3w(ji,jj,jk) + & 2311 REAL(MIN(1,mbathy(ji+1,jj)),wp)*e3w(ji+1,jj,jk) ) & 2312 /REAL(MAX( 1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji+1,jj))),wp) 2313 2314 e3v(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3t(ji,jj,jk) + & 2315 REAL(MIN(1,mbathy(ji,jj+1)),wp)*e3t(ji,jj+1,jk) ) & 2316 /REAL (MAX( 1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji,jj+1))),wp) 2317 2318 e3vw(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3w(ji,jj,jk) + & 2319 REAL(MIN(1,mbathy(ji,jj+1)),wp)*e3w(ji,jj+1,jk) ) & 2320 /REAL(MAX( 1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji,jj+1))),wp) 2321 2322 e3f(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3t(ji,jj,jk) + & 2323 REAL(MIN(1,mbathy(ji+1,jj)),wp)*e3t(ji+1,jj,jk) + & 2324 REAL(MIN(1,mbathy(ji+1,jj+1)),wp)* e3t(ji+1,jj+1,jk)+ & 2325 REAL(MIN(1,mbathy(ji,jj+1)),wp)*e3t(ji,jj+1,jk) ) & 2326 /REAL(MAX( 1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji,jj+1)) & 2327 + MIN(1,mbathy(ji+1,jj))+MIN(1,mbathy(ji+1,jj+1))),wp) 2328 2329 ENDDO 1395 2330 END DO 1396 2331 END DO 1397 END DO 1398 IF( nprint == 1 .AND. lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ), & 1399 & ' MAX ', MAXVAL( mbathy(:,:) ) 1400 1401 IF( nprint == 1 .AND. lwp ) THEN ! min max values over the local domain 1402 WRITE(numout,*) ' MIN val mbathy ', MINVAL( mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 1403 WRITE(numout,*) ' MIN val depth t ', MINVAL( fsdept(:,:,:) ), & 1404 & ' w ', MINVAL( fsdepw(:,:,:) ), '3w ' , MINVAL( fsde3w(:,:,:) ) 1405 WRITE(numout,*) ' MIN val e3 t ', MINVAL( fse3t (:,:,:) ), ' f ' , MINVAL( fse3f (:,:,:) ), & 1406 & ' u ', MINVAL( fse3u (:,:,:) ), ' u ' , MINVAL( fse3v (:,:,:) ), & 1407 & ' uw', MINVAL( fse3uw(:,:,:) ), ' vw' , MINVAL( fse3vw(:,:,:) ), & 1408 & ' w ', MINVAL( fse3w (:,:,:) ) 1409 1410 WRITE(numout,*) ' MAX val depth t ', MAXVAL( fsdept(:,:,:) ), & 1411 & ' w ', MAXVAL( fsdepw(:,:,:) ), '3w ' , MAXVAL( fsde3w(:,:,:) ) 1412 WRITE(numout,*) ' MAX val e3 t ', MAXVAL( fse3t (:,:,:) ), ' f ' , MAXVAL( fse3f (:,:,:) ), & 1413 & ' u ', MAXVAL( fse3u (:,:,:) ), ' u ' , MAXVAL( fse3v (:,:,:) ), & 1414 & ' uw', MAXVAL( fse3uw(:,:,:) ), ' vw' , MAXVAL( fse3vw(:,:,:) ), & 1415 & ' w ', MAXVAL( fse3w (:,:,:) ) 1416 ENDIF 1417 ! END DO 1418 IF(lwp) THEN ! selected vertical profiles 1419 WRITE(numout,*) 1420 WRITE(numout,*) ' domzgr: vertical coordinates : point (1,1,k) bathy = ', bathy(1,1), hbatt(1,1) 1421 WRITE(numout,*) ' ~~~~~~ --------------------' 1422 WRITE(numout,"(9x,' level gdept gdepw gde3w e3t e3w ')") 1423 WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(1,1,jk), fsdepw(1,1,jk), & 1424 & fse3t (1,1,jk), fse3w (1,1,jk), jk=1,jpk ) 1425 DO jj = mj0(20), mj1(20) 1426 DO ji = mi0(20), mi1(20) 1427 WRITE(numout,*) 1428 WRITE(numout,*) ' domzgr: vertical coordinates : point (20,20,k) bathy = ', bathy(ji,jj), hbatt(ji,jj) 1429 WRITE(numout,*) ' ~~~~~~ --------------------' 1430 WRITE(numout,"(9x,' level gdept gdepw gde3w e3t e3w ')") 1431 WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk), & 1432 & fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 2332 2333 DO jk = jpksigm,jpk ! Computed as the minimum of neighbooring scale factors 2334 DO jj = 1, jpjm1 2335 DO ji = 1, fs_jpim1 ! vector opt. 2336 e3u (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji+1,jj,jk) ) 2337 e3v (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji,jj+1,jk) ) 2338 e3uw(ji,jj,jk) = MIN( e3w(ji,jj,jk), e3w(ji+1,jj,jk) ) 2339 e3vw(ji,jj,jk) = MIN( e3w(ji,jj,jk), e3w(ji,jj+1,jk) ) 1433 2340 END DO 1434 2341 END DO 1435 DO jj = mj0(74), mj1(74) 1436 DO ji = mi0(100), mi1(100) 1437 WRITE(numout,*) 1438 WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k) bathy = ', bathy(ji,jj), hbatt(ji,jj) 1439 WRITE(numout,*) ' ~~~~~~ --------------------' 1440 WRITE(numout,"(9x,' level gdept gdepw gde3w e3t e3w ')") 1441 WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk), & 1442 & fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 2342 END DO 2343 2344 CALL lbc_lnk( e3u , 'U', 1._wp ) ; CALL lbc_lnk( e3uw, 'U', 1._wp ) ! lateral boundary conditions 2345 CALL lbc_lnk( e3v , 'V', 1._wp ) ; CALL lbc_lnk( e3vw, 'V', 1._wp ) 2346 ! 2347 DO jk = 1, jpk ! set to z-scale factor if zero (i.e. along closed boundaries) 2348 WHERE( e3u (:,:,jk) == 0._wp ) e3u (:,:,jk) = e3t_0(jk) 2349 WHERE( e3v (:,:,jk) == 0._wp ) e3v (:,:,jk) = e3t_0(jk) 2350 WHERE( e3uw(:,:,jk) == 0._wp ) e3uw(:,:,jk) = e3w_0(jk) 2351 WHERE( e3vw(:,:,jk) == 0._wp ) e3vw(:,:,jk) = e3w_0(jk) 2352 END DO 2353 2354 DO jk = jpksigm, jpk ! Computed as the minimum of neighbooring V-scale factors 2355 DO jj = 1, jpjm1 2356 DO ji = 1, fs_jpim1 ! vector opt. 2357 e3f(ji,jj,jk) = MIN( e3v(ji,jj,jk), e3v(ji+1,jj,jk) ) 1443 2358 END DO 1444 2359 END DO 1445 ENDIF 1446 1447 !================================================================================ 1448 ! check the coordinate makes sense 1449 !================================================================================ 1450 DO ji = 1, jpi 1451 DO jj = 1, jpj 1452 1453 IF( hbatt(ji,jj) > 0._wp) THEN 1454 DO jk = 1, mbathy(ji,jj) 1455 ! check coordinate is monotonically increasing 1456 IF (fse3w(ji,jj,jk) <= 0._wp .OR. fse3t(ji,jj,jk) <= 0._wp ) THEN 1457 WRITE(ctmp1,*) 'ERROR zgr_sco : e3w or e3t =< 0 at point (i,j,k)= ', ji, jj, jk 1458 WRITE(numout,*) 'ERROR zgr_sco : e3w or e3t =< 0 at point (i,j,k)= ', ji, jj, jk 1459 WRITE(numout,*) 'e3w',fse3w(ji,jj,:) 1460 WRITE(numout,*) 'e3t',fse3t(ji,jj,:) 1461 CALL ctl_stop( ctmp1 ) 1462 ENDIF 1463 ! and check it has never gone negative 1464 IF( fsdepw(ji,jj,jk) < 0._wp .OR. fsdept(ji,jj,jk) < 0._wp ) THEN 1465 WRITE(ctmp1,*) 'ERROR zgr_sco : gdepw or gdept =< 0 at point (i,j,k)= ', ji, jj, jk 1466 WRITE(numout,*) 'ERROR zgr_sco : gdepw or gdept =< 0 at point (i,j,k)= ', ji, jj, jk 1467 WRITE(numout,*) 'gdepw',fsdepw(ji,jj,:) 1468 WRITE(numout,*) 'gdept',fsdept(ji,jj,:) 1469 CALL ctl_stop( ctmp1 ) 1470 ENDIF 1471 ! and check it never exceeds the total depth 1472 IF( fsdepw(ji,jj,jk) > hbatt(ji,jj) ) THEN 1473 WRITE(ctmp1,*) 'ERROR zgr_sco : gdepw > hbatt at point (i,j,k)= ', ji, jj, jk 1474 WRITE(numout,*) 'ERROR zgr_sco : gdepw > hbatt at point (i,j,k)= ', ji, jj, jk 1475 WRITE(numout,*) 'gdepw',fsdepw(ji,jj,:) 1476 CALL ctl_stop( ctmp1 ) 1477 ENDIF 1478 END DO 1479 1480 DO jk = 1, mbathy(ji,jj)-1 1481 ! and check it never exceeds the total depth 1482 IF( fsdept(ji,jj,jk) > hbatt(ji,jj) ) THEN 1483 WRITE(ctmp1,*) 'ERROR zgr_sco : gdept > hbatt at point (i,j,k)= ', ji, jj, jk 1484 WRITE(numout,*) 'ERROR zgr_sco : gdept > hbatt at point (i,j,k)= ', ji, jj, jk 1485 WRITE(numout,*) 'gdept',fsdept(ji,jj,:) 1486 CALL ctl_stop( ctmp1 ) 1487 ENDIF 1488 END DO 1489 1490 ENDIF 1491 1492 END DO 1493 END DO 1494 ! 1495 CALL wrk_dealloc( jpi, jpj, zenv, ztmp, zmsk, zri, zrj, zhbat ) 1496 ! 1497 IF( nn_timing == 1 ) CALL timing_stop('zgr_sco') 1498 ! 1499 END SUBROUTINE zgr_sco 1500 1501 !!====================================================================== 1502 SUBROUTINE s_sh94() 1503 1504 !!---------------------------------------------------------------------- 1505 !! *** ROUTINE s_sh94 *** 1506 !! 1507 !! ** Purpose : stretch the s-coordinate system 1508 !! 1509 !! ** Method : s-coordinate stretch using the Song and Haidvogel 1994 1510 !! mixed S/sigma coordinate 1511 !! 1512 !! Reference : Song and Haidvogel 1994. 1513 !!---------------------------------------------------------------------- 1514 ! 1515 INTEGER :: ji, jj, jk ! dummy loop argument 1516 REAL(wp) :: zcoeft, zcoefw ! temporary scalars 1517 ! 1518 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3, z_gsi3w3 1519 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 1520 1521 CALL wrk_alloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3 ) 1522 CALL wrk_alloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 1523 1524 z_gsigw3 = 0._wp ; z_gsigt3 = 0._wp ; z_gsi3w3 = 0._wp 1525 z_esigt3 = 0._wp ; z_esigw3 = 0._wp 1526 z_esigtu3 = 0._wp ; z_esigtv3 = 0._wp ; z_esigtf3 = 0._wp 1527 z_esigwu3 = 0._wp ; z_esigwv3 = 0._wp 1528 1529 DO ji = 1, jpi 1530 DO jj = 1, jpj 1531 1532 IF( hbatt(ji,jj) > rn_hc ) THEN !deep water, stretched sigma 1533 DO jk = 1, jpk 1534 z_gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, rn_bb ) 1535 z_gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp) , rn_bb ) 1536 END DO 1537 ELSE ! shallow water, uniform sigma 1538 DO jk = 1, jpk 1539 z_gsigw3(ji,jj,jk) = REAL(jk-1,wp) / REAL(jpk-1,wp) 1540 z_gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(jpk-1,wp) 1541 END DO 1542 ENDIF 1543 ! 1544 DO jk = 1, jpkm1 1545 z_esigt3(ji,jj,jk ) = z_gsigw3(ji,jj,jk+1) - z_gsigw3(ji,jj,jk) 1546 z_esigw3(ji,jj,jk+1) = z_gsigt3(ji,jj,jk+1) - z_gsigt3(ji,jj,jk) 1547 END DO 1548 z_esigw3(ji,jj,1 ) = 2._wp * ( z_gsigt3(ji,jj,1 ) - z_gsigw3(ji,jj,1 ) ) 1549 z_esigt3(ji,jj,jpk) = 2._wp * ( z_gsigt3(ji,jj,jpk) - z_gsigw3(ji,jj,jpk) ) 1550 ! 1551 ! Coefficients for vertical depth as the sum of e3w scale factors 1552 z_gsi3w3(ji,jj,1) = 0.5_wp * z_esigw3(ji,jj,1) 1553 DO jk = 2, jpk 1554 z_gsi3w3(ji,jj,jk) = z_gsi3w3(ji,jj,jk-1) + z_esigw3(ji,jj,jk) 1555 END DO 1556 ! 1557 DO jk = 1, jpk 1558 zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 1559 zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 1560 gdept (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsigt3(ji,jj,jk)+rn_hc*zcoeft ) 1561 gdepw (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsigw3(ji,jj,jk)+rn_hc*zcoefw ) 1562 gdep3w(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsi3w3(ji,jj,jk)+rn_hc*zcoeft ) 1563 END DO 1564 ! 1565 END DO ! for all jj's 1566 END DO ! for all ji's 1567 1568 DO ji = 1, jpim1 1569 DO jj = 1, jpjm1 1570 DO jk = 1, jpk 1571 z_esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) ) & 1572 & / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 1573 z_esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk) ) & 1574 & / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 1575 z_esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) & 1576 & + hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*z_esigt3(ji+1,jj+1,jk) ) & 1577 & / ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 1578 z_esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigw3(ji+1,jj,jk) ) & 1579 & / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 1580 z_esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigw3(ji,jj+1,jk) ) & 1581 & / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 1582 ! 1583 e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*z_esigt3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1584 e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*z_esigtu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1585 e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*z_esigtv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1586 e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*z_esigtf3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1587 ! 1588 e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*z_esigw3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1589 e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*z_esigwu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1590 e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*z_esigwv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 1591 END DO 1592 END DO 1593 END DO 1594 1595 CALL wrk_dealloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3 ) 1596 CALL wrk_dealloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 1597 1598 END SUBROUTINE s_sh94 1599 1600 SUBROUTINE s_sf12 1601 1602 !!---------------------------------------------------------------------- 1603 !! *** ROUTINE s_sf12 *** 1604 !! 1605 !! ** Purpose : stretch the s-coordinate system 1606 !! 1607 !! ** Method : s-coordinate stretch using the Siddorn and Furner 2012? 1608 !! mixed S/sigma/Z coordinate 1609 !! 1610 !! This method allows the maintenance of fixed surface and or 1611 !! bottom cell resolutions (cf. geopotential coordinates) 1612 !! within an analytically derived stretched S-coordinate framework. 1613 !! 1614 !! 1615 !! Reference : Siddorn and Furner 2012 (submitted Ocean modelling). 1616 !!---------------------------------------------------------------------- 1617 ! 1618 INTEGER :: ji, jj, jk ! dummy loop argument 1619 REAL(wp) :: zsmth ! smoothing around critical depth 1620 REAL(wp) :: zzs, zzb ! Surface and bottom cell thickness in sigma space 1621 ! 1622 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3, z_gsi3w3 1623 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 1624 1625 ! 1626 CALL wrk_alloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3 ) 1627 CALL wrk_alloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 1628 1629 z_gsigw3 = 0._wp ; z_gsigt3 = 0._wp ; z_gsi3w3 = 0._wp 1630 z_esigt3 = 0._wp ; z_esigw3 = 0._wp 1631 z_esigtu3 = 0._wp ; z_esigtv3 = 0._wp ; z_esigtf3 = 0._wp 1632 z_esigwu3 = 0._wp ; z_esigwv3 = 0._wp 1633 1634 DO ji = 1, jpi 1635 DO jj = 1, jpj 1636 1637 IF (hbatt(ji,jj)>rn_hc) THEN !deep water, stretched sigma 1638 1639 zzb = hbatt(ji,jj)*rn_zb_a + rn_zb_b ! this forces a linear bottom cell depth relationship with H,. 1640 ! could be changed by users but care must be taken to do so carefully 1641 zzb = 1.0_wp-(zzb/hbatt(ji,jj)) 1642 1643 zzs = rn_zs / hbatt(ji,jj) 1644 1645 IF (rn_efold /= 0.0_wp) THEN 1646 zsmth = tanh( (hbatt(ji,jj)- rn_hc ) / rn_efold ) 1647 ELSE 1648 zsmth = 1.0_wp 1649 ENDIF 1650 1651 DO jk = 1, jpk 1652 z_gsigw3(ji,jj,jk) = REAL(jk-1,wp) /REAL(jpk-1,wp) 1653 z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5_wp)/REAL(jpk-1,wp) 1654 ENDDO 1655 z_gsigw3(ji,jj,:) = fgamma( z_gsigw3(ji,jj,:), zzb, zzs, zsmth ) 1656 z_gsigt3(ji,jj,:) = fgamma( z_gsigt3(ji,jj,:), zzb, zzs, zsmth ) 1657 1658 ELSE IF (ln_sigcrit) THEN ! shallow water, uniform sigma 1659 1660 DO jk = 1, jpk 1661 z_gsigw3(ji,jj,jk) = REAL(jk-1,wp) /REAL(jpk-1,wp) 1662 z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5)/REAL(jpk-1,wp) 1663 END DO 1664 1665 ELSE ! shallow water, z coordinates 1666 1667 DO jk = 1, jpk 1668 z_gsigw3(ji,jj,jk) = REAL(jk-1,wp) /REAL(jpk-1,wp)*(rn_hc/hbatt(ji,jj)) 1669 z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5_wp)/REAL(jpk-1,wp)*(rn_hc/hbatt(ji,jj)) 1670 END DO 1671 1672 ENDIF 1673 1674 DO jk = 1, jpkm1 1675 z_esigt3(ji,jj,jk) = z_gsigw3(ji,jj,jk+1) - z_gsigw3(ji,jj,jk) 1676 z_esigw3(ji,jj,jk+1) = z_gsigt3(ji,jj,jk+1) - z_gsigt3(ji,jj,jk) 1677 END DO 1678 z_esigw3(ji,jj,1 ) = 2.0_wp * (z_gsigt3(ji,jj,1 ) - z_gsigw3(ji,jj,1 )) 1679 z_esigt3(ji,jj,jpk) = 2.0_wp * (z_gsigt3(ji,jj,jpk) - z_gsigw3(ji,jj,jpk)) 1680 1681 ! Coefficients for vertical depth as the sum of e3w scale factors 1682 z_gsi3w3(ji,jj,1) = 0.5 * z_esigw3(ji,jj,1) 1683 DO jk = 2, jpk 1684 z_gsi3w3(ji,jj,jk) = z_gsi3w3(ji,jj,jk-1) + z_esigw3(ji,jj,jk) 1685 END DO 1686 1687 DO jk = 1, jpk 1688 gdept (ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsigt3(ji,jj,jk) 1689 gdepw (ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsigw3(ji,jj,jk) 1690 gdep3w(ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsi3w3(ji,jj,jk) 1691 END DO 1692 1693 ENDDO ! for all jj's 1694 ENDDO ! for all ji's 1695 1696 DO ji=1,jpi-1 1697 DO jj=1,jpj-1 1698 1699 DO jk = 1, jpk 1700 z_esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) ) / & 1701 ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 1702 z_esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk) ) / & 1703 ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 1704 z_esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) + & 1705 hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*z_esigt3(ji+1,jj+1,jk) ) / & 1706 ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 1707 z_esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigw3(ji+1,jj,jk) ) / & 1708 ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 1709 z_esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigw3(ji,jj+1,jk) ) / & 1710 ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 1711 1712 e3t(ji,jj,jk)=(scosrf(ji,jj)+hbatt(ji,jj))*z_esigt3(ji,jj,jk) 1713 e3u(ji,jj,jk)=(scosrf(ji,jj)+hbatu(ji,jj))*z_esigtu3(ji,jj,jk) 1714 e3v(ji,jj,jk)=(scosrf(ji,jj)+hbatv(ji,jj))*z_esigtv3(ji,jj,jk) 1715 e3f(ji,jj,jk)=(scosrf(ji,jj)+hbatf(ji,jj))*z_esigtf3(ji,jj,jk) 1716 ! 1717 e3w(ji,jj,jk)=hbatt(ji,jj)*z_esigw3(ji,jj,jk) 1718 e3uw(ji,jj,jk)=hbatu(ji,jj)*z_esigwu3(ji,jj,jk) 1719 e3vw(ji,jj,jk)=hbatv(ji,jj)*z_esigwv3(ji,jj,jk) 1720 END DO 1721 1722 ENDDO 1723 ENDDO 1724 ! 1725 CALL lbc_lnk(e3t ,'T',1.) ; CALL lbc_lnk(e3u ,'T',1.) 1726 CALL lbc_lnk(e3v ,'T',1.) ; CALL lbc_lnk(e3f ,'T',1.) 1727 CALL lbc_lnk(e3w ,'T',1.) 1728 CALL lbc_lnk(e3uw,'T',1.) ; CALL lbc_lnk(e3vw,'T',1.) 1729 ! 1730 ! ! ============= 1731 1732 CALL wrk_dealloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3 ) 1733 CALL wrk_dealloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 1734 1735 END SUBROUTINE s_sf12 1736 1737 SUBROUTINE s_tanh() 1738 1739 !!---------------------------------------------------------------------- 1740 !! *** ROUTINE s_tanh*** 1741 !! 1742 !! ** Purpose : stretch the s-coordinate system 1743 !! 1744 !! ** Method : s-coordinate stretch 1745 !! 1746 !! Reference : Madec, Lott, Delecluse and Crepon, 1996. JPO, 26, 1393-1408. 1747 !!---------------------------------------------------------------------- 1748 1749 INTEGER :: ji, jj, jk ! dummy loop argument 1750 REAL(wp) :: zcoeft, zcoefw ! temporary scalars 1751 1752 REAL(wp), POINTER, DIMENSION(:) :: z_gsigw, z_gsigt, z_gsi3w 1753 REAL(wp), POINTER, DIMENSION(:) :: z_esigt, z_esigw 1754 1755 CALL wrk_alloc( jpk, z_gsigw, z_gsigt, z_gsi3w ) 1756 CALL wrk_alloc( jpk, z_esigt, z_esigw ) 1757 1758 z_gsigw = 0._wp ; z_gsigt = 0._wp ; z_gsi3w = 0._wp 1759 z_esigt = 0._wp ; z_esigw = 0._wp 1760 1761 DO jk = 1, jpk 1762 z_gsigw(jk) = -fssig( REAL(jk,wp)-0.5_wp ) 1763 z_gsigt(jk) = -fssig( REAL(jk,wp) ) 1764 END DO 1765 IF( nprint == 1 .AND. lwp ) WRITE(numout,*) 'z_gsigw 1 jpk ', z_gsigw(1), z_gsigw(jpk) 1766 ! 1767 ! Coefficients for vertical scale factors at w-, t- levels 1768 !!gm bug : define it from analytical function, not like juste bellow.... 1769 !!gm or betteroffer the 2 possibilities.... 1770 DO jk = 1, jpkm1 1771 z_esigt(jk ) = z_gsigw(jk+1) - z_gsigw(jk) 1772 z_esigw(jk+1) = z_gsigt(jk+1) - z_gsigt(jk) 1773 END DO 1774 z_esigw( 1 ) = 2._wp * ( z_gsigt(1 ) - z_gsigw(1 ) ) 1775 z_esigt(jpk) = 2._wp * ( z_gsigt(jpk) - z_gsigw(jpk) ) 1776 ! 1777 ! Coefficients for vertical depth as the sum of e3w scale factors 1778 z_gsi3w(1) = 0.5_wp * z_esigw(1) 2360 END DO 2361 CALL lbc_lnk( e3f, 'F', 1._wp ) ! Lateral boundary conditions 2362 ! 2363 DO jk = 1, jpk ! set to z-scale factor if zero (i.e. along closed boundaries) 2364 WHERE( e3f(:,:,jk) == 0._wp ) e3f(:,:,jk) = e3t_0(jk) 2365 END DO 2366 !!gm bug ? : must be a do loop with mj0,mj1 2367 ! 2368 e3t(:,mj0(1),:) = e3t(:,mj0(2),:) ! we duplicate factor scales for jj = 1 and jj = 2 2369 e3w(:,mj0(1),:) = e3w(:,mj0(2),:) 2370 e3u(:,mj0(1),:) = e3u(:,mj0(2),:) 2371 e3v(:,mj0(1),:) = e3v(:,mj0(2),:) 2372 e3f(:,mj0(1),:) = e3f(:,mj0(2),:) 2373 2374 ! Control of the sign 2375 Do jk=1,jpk 2376 do jj=1,jpj 2377 do ji=1,jpi 2378 IF( ( e3t (ji,jj,jk) ) <= 0._wp )then 2379 write(numout,*)' zgr_hyb : e r r o r e3t <= 0',ji,jj,jk,e3t (ji,jj,jk); endif 2380 IF( ( e3w (ji,jj,jk) ) <= 0._wp )then 2381 write(numout,*)' zgr_hyb : e r r o r e3t <= 0',ji,jj,jk,e3w (ji,jj,jk); endif 2382 2383 2384 IF( ( gdept(ji,jj,jk) ) < 0._wp )THEN 2385 write (numout,*)' zgr_hyb : e r r o r gdept < 0',ji,jj,jk ,gdept(ji,jj,jj); endif 2386 IF( ( gdepw(ji,jj,jk) ) < 0._wp )then 2387 write (numout,*)' zgr_hyb : e r r o r gdepw < 0',ji,jj,jk , gdepw(ji,jj,jj); endif 2388 enddo 2389 enddo 2390 enddo 2391 2392 ! Compute gdep3w (vertical sum of e3w) 2393 gdep3w(:,:,1) = 0.5_wp * e3w(:,:,1) 1779 2394 DO jk = 2, jpk 1780 z_gsi3w(jk) = z_gsi3w(jk-1) + z_esigw(jk) 1781 END DO 1782 !!gm: depuw, depvw can be suppressed (modif in ldfslp) and depw=dep3w can be set (save 3 3D arrays) 1783 DO jk = 1, jpk 1784 zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 1785 zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 1786 gdept (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsigt(jk) + hift(:,:)*zcoeft ) 1787 gdepw (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsigw(jk) + hift(:,:)*zcoefw ) 1788 gdep3w(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsi3w(jk) + hift(:,:)*zcoeft ) 1789 END DO 1790 !!gm: e3uw, e3vw can be suppressed (modif in dynzdf, dynzdf_iso, zdfbfr) (save 2 3D arrays) 1791 DO jj = 1, jpj 1792 DO ji = 1, jpi 1793 DO jk = 1, jpk 1794 e3t(ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*z_esigt(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 1795 e3u(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*z_esigt(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 1796 e3v(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*z_esigt(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 1797 e3f(ji,jj,jk) = ( (hbatf(ji,jj)-hiff(ji,jj))*z_esigt(jk) + hiff(ji,jj)/REAL(jpkm1,wp) ) 1798 ! 1799 e3w (ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*z_esigw(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 1800 e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*z_esigw(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 1801 e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*z_esigw(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 1802 END DO 1803 END DO 1804 END DO 1805 1806 CALL wrk_dealloc( jpk, z_gsigw, z_gsigt, z_gsi3w ) 1807 CALL wrk_dealloc( jpk, z_esigt, z_esigw ) 1808 1809 END SUBROUTINE s_tanh 1810 1811 FUNCTION fssig( pk ) RESULT( pf ) 1812 !!---------------------------------------------------------------------- 1813 !! *** ROUTINE fssig *** 1814 !! 1815 !! ** Purpose : provide the analytical function in s-coordinate 1816 !! 1817 !! ** Method : the function provide the non-dimensional position of 1818 !! T and W (i.e. between 0 and 1) 1819 !! T-points at integer values (between 1 and jpk) 1820 !! W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 1821 !!---------------------------------------------------------------------- 1822 REAL(wp), INTENT(in) :: pk ! continuous "k" coordinate 1823 REAL(wp) :: pf ! sigma value 1824 !!---------------------------------------------------------------------- 1825 ! 1826 pf = ( TANH( rn_theta * ( -(pk-0.5_wp) / REAL(jpkm1) + rn_thetb ) ) & 1827 & - TANH( rn_thetb * rn_theta ) ) & 1828 & * ( COSH( rn_theta ) & 1829 & + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) ) ) & 1830 & / ( 2._wp * SINH( rn_theta ) ) 1831 ! 1832 END FUNCTION fssig 1833 1834 1835 FUNCTION fssig1( pk1, pbb ) RESULT( pf1 ) 1836 !!---------------------------------------------------------------------- 1837 !! *** ROUTINE fssig1 *** 1838 !! 1839 !! ** Purpose : provide the Song and Haidvogel version of the analytical function in s-coordinate 1840 !! 1841 !! ** Method : the function provides the non-dimensional position of 1842 !! T and W (i.e. between 0 and 1) 1843 !! T-points at integer values (between 1 and jpk) 1844 !! W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 1845 !!---------------------------------------------------------------------- 1846 REAL(wp), INTENT(in) :: pk1 ! continuous "k" coordinate 1847 REAL(wp), INTENT(in) :: pbb ! Stretching coefficient 1848 REAL(wp) :: pf1 ! sigma value 1849 !!---------------------------------------------------------------------- 1850 ! 1851 IF ( rn_theta == 0 ) then ! uniform sigma 1852 pf1 = - ( pk1 - 0.5_wp ) / REAL( jpkm1 ) 1853 ELSE ! stretched sigma 1854 pf1 = ( 1._wp - pbb ) * ( SINH( rn_theta*(-(pk1-0.5_wp)/REAL(jpkm1)) ) ) / SINH( rn_theta ) & 1855 & + pbb * ( (TANH( rn_theta*( (-(pk1-0.5_wp)/REAL(jpkm1)) + 0.5_wp) ) - TANH( 0.5_wp * rn_theta ) ) & 1856 & / ( 2._wp * TANH( 0.5_wp * rn_theta ) ) ) 1857 ENDIF 1858 ! 1859 END FUNCTION fssig1 1860 1861 1862 FUNCTION fgamma( pk1, pzb, pzs, psmth) RESULT( p_gamma ) 1863 !!---------------------------------------------------------------------- 1864 !! *** ROUTINE fgamma *** 1865 !! 1866 !! ** Purpose : provide analytical function for the s-coordinate 1867 !! 1868 !! ** Method : the function provides the non-dimensional position of 1869 !! T and W (i.e. between 0 and 1) 1870 !! T-points at integer values (between 1 and jpk) 1871 !! W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 1872 !! 1873 !! This method allows the maintenance of fixed surface and or 1874 !! bottom cell resolutions (cf. geopotential coordinates) 1875 !! within an analytically derived stretched S-coordinate framework. 1876 !! 1877 !! Reference : Siddorn and Furner, in prep 1878 !!---------------------------------------------------------------------- 1879 REAL(wp), INTENT(in ) :: pk1(jpk) ! continuous "k" coordinate 1880 REAL(wp) :: p_gamma(jpk) ! stretched coordinate 1881 REAL(wp), INTENT(in ) :: pzb ! Bottom box depth 1882 REAL(wp), INTENT(in ) :: pzs ! surface box depth 1883 REAL(wp), INTENT(in ) :: psmth ! Smoothing parameter 1884 REAL(wp) :: za1,za2,za3 ! local variables 1885 REAL(wp) :: zn1,zn2 ! local variables 1886 REAL(wp) :: za,zb,zx ! local variables 1887 integer :: jk 1888 !!---------------------------------------------------------------------- 1889 ! 1890 1891 zn1 = 1./(jpk-1.) 1892 zn2 = 1. - zn1 1893 1894 za1 = (rn_alpha+2.0_wp)*zn1**(rn_alpha+1.0_wp)-(rn_alpha+1.0_wp)*zn1**(rn_alpha+2.0_wp) 1895 za2 = (rn_alpha+2.0_wp)*zn2**(rn_alpha+1.0_wp)-(rn_alpha+1.0_wp)*zn2**(rn_alpha+2.0_wp) 1896 za3 = (zn2**3.0_wp - za2)/( zn1**3.0_wp - za1) 2395 gdep3w(:,:,jk) = gdep3w(:,:,jk-1) + e3w(:,:,jk) 2396 END DO 2397 2398 2399 IF( lk_mpp ) CALL mpp_max( nstop ) 2400 IF (lwp) write(numout,*)"zpartial" ,nstop 2401 2402 2403 2404 CALL lbc_lnk( e3f, 'F', 1._wp ) ! Lateral boundary conditions 2405 1897 2406 1898 za = pzb - za3*(pzs-za1)-za2 1899 za = za/( zn2-0.5_wp*(za2+zn2**2.0_wp) - za3*(zn1-0.5_wp*(za1+zn1**2.0_wp) ) ) 1900 zb = (pzs - za1 - za*( zn1-0.5_wp*(za1+zn1**2.0_wp ) ) ) / (zn1**3.0_wp - za1) 1901 zx = 1.0_wp-za/2.0_wp-zb 1902 1903 DO jk = 1, jpk 1904 p_gamma(jk) = za*(pk1(jk)*(1.0_wp-pk1(jk)/2.0_wp))+zb*pk1(jk)**3.0_wp + & 1905 & zx*( (rn_alpha+2.0_wp)*pk1(jk)**(rn_alpha+1.0_wp)- & 1906 & (rn_alpha+1.0_wp)*pk1(jk)**(rn_alpha+2.0_wp) ) 1907 p_gamma(jk) = p_gamma(jk)*psmth+pk1(jk)*(1.0_wp-psmth) 1908 ENDDO 1909 1910 ! 1911 END FUNCTION fgamma 2407 2408 2409 CALL wrk_dealloc( jpi, jpj, zenv, ztmp, zmsk, zri, zrj, zhbat ) 2410 ! 2411 IF( nn_timing == 1 ) CALL timing_stop('zgr_hyb') 2412 2413 END SUBROUTINE zgr_hyb 2414 1912 2415 1913 2416 !!====================================================================== -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr_substitute.h90
r2528 r6736 32 32 # define fse3vw(i,j,k) e3vw_1(i,j,k) 33 33 34 #if defined key_jth_fix 35 # define fsdept_b(i,j,k) (fsdept_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 36 # define fsdepw_b(i,j,k) (fsdepw_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 37 # define fsde3w_b(i,j,k) (fsde3w_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))-sshb(i,j)) 38 # define fse3t_b(i,j,k) (fse3t_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 39 # define fse3u_b(i,j,k) (fse3u_0(i,j,k)*(1.+sshu_b(i,j)*muu(i,j,k))) 40 # define fse3v_b(i,j,k) (fse3v_0(i,j,k)*(1.+sshv_b(i,j)*muv(i,j,k))) 41 # define fse3f_b(i,j,k) (fse3f_0(i,j,k)*(1.+sshf_b(i,j)*muf(i,j,k))) 42 # define fse3w_b(i,j,k) (fse3w_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 43 # define fse3uw_b(i,j,k) (fse3uw_0(i,j,k)*(1.+sshu_b(i,j)*muu(i,j,k))) 44 # define fse3vw_b(i,j,k) (fse3vw_0(i,j,k)*(1.+sshv_b(i,j)*muv(i,j,k))) 45 #else 34 46 # define fse3t_b(i,j,k) e3t_b(i,j,k) 35 47 # define fse3u_b(i,j,k) e3u_b(i,j,k) … … 37 49 # define fse3uw_b(i,j,k) (fse3uw_0(i,j,k)*(1.+sshu_b(i,j)*muu(i,j,k))) 38 50 # define fse3vw_b(i,j,k) (fse3vw_0(i,j,k)*(1.+sshv_b(i,j)*muv(i,j,k))) 51 #endif 39 52 40 53 # define fsdept_n(i,j,k) (fsdept_0(i,j,k)*(1.+sshn(i,j)*mut(i,j,k))) … … 51 64 # define fse3t_m(i,j,k) (fse3t_0(i,j,k)*(1.+ssh_m(i,j)*mut(i,j,k))) 52 65 66 #if defined key_jth_fix 67 # define fsdept_a(i,j,k) (fsdept_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 68 # define fsdepw_a(i,j,k) (fsdepw_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 69 # define fsde3w_a(i,j,k) (fsde3w_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))-ssha(i,j)) 70 #endif 53 71 # define fse3t_a(i,j,k) (fse3t_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 54 72 # define fse3u_a(i,j,k) (fse3u_0(i,j,k)*(1.+sshu_a(i,j)*muu(i,j,k))) 55 73 # define fse3v_a(i,j,k) (fse3v_0(i,j,k)*(1.+sshv_a(i,j)*muv(i,j,k))) 74 #if defined key_jth_fix 75 # define fse3f_a(i,j,k) (fse3f_0(i,j,k)*(1.+sshf_a(i,j)*muf(i,j,k))) 76 # define fse3w_a(i,j,k) (fse3w_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 77 # define fse3uw_a(i,j,k) (fse3uw_0(i,j,k)*(1.+sshu_a(i,j)*muu(i,j,k))) 78 # define fse3vw_a(i,j,k) (fse3vw_0(i,j,k)*(1.+sshv_a(i,j)*muv(i,j,k))) 79 #endif 56 80 57 81 #else … … 68 92 # define fse3vw(i,j,k) fse3vw_0(i,j,k) 69 93 94 #if defined key_jth_fix 95 # define fsdept_b(i,j,k) fsdept_0(i,j,k) 96 # define fsdepw_b(i,j,k) fsdepw_0(i,j,k) 97 # define fsde3w_b(i,j,k) fsde3w_0(i,j,k) 98 #endif 70 99 # define fse3t_b(i,j,k) fse3t_0(i,j,k) 71 100 # define fse3u_b(i,j,k) fse3u_0(i,j,k) 72 101 # define fse3v_b(i,j,k) fse3v_0(i,j,k) 102 #if defined key_jth_fix 103 # define fse3f_b(i,j,k) fse3f_0(i,j,k) 104 # define fse3w_b(i,j,k) fse3w_0(i,j,k) 105 #endif 73 106 # define fse3uw_b(i,j,k) fse3uw_0(i,j,k) 74 107 # define fse3vw_b(i,j,k) fse3vw_0(i,j,k) … … 87 120 # define fse3t_m(i,j,k) fse3t_0(i,j,k) 88 121 122 #if defined key_jth_fix 123 # define fsdept_a(i,j,k) fsdept_0(i,j,k) 124 # define fsdepw_a(i,j,k) fsdepw_0(i,j,k) 125 # define fsde3w_a(i,j,k) fsde3w_0(i,j,k) 126 #endif 89 127 # define fse3t_a(i,j,k) fse3t_0(i,j,k) 90 128 # define fse3u_a(i,j,k) fse3u_0(i,j,k) 91 129 # define fse3v_a(i,j,k) fse3v_0(i,j,k) 130 #if defined key_jth_fix 131 # define fse3f_a(i,j,k) fse3f_0(i,j,k) 132 # define fse3w_a(i,j,k) fse3w_0(i,j,k) 133 # define fse3uw_a(i,j,k) fse3uw_0(i,j,k) 134 # define fse3vw_a(i,j,k) fse3vw_0(i,j,k) 135 #endif 92 136 #endif 93 137 !!---------------------------------------------------------------------- -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/dtatsd.F90
r3294 r6736 18 18 USE dom_oce ! ocean space and time domain 19 19 USE fldread ! read input fields 20 USE in_out_manager ! I/O manager21 20 USE phycst ! physical constants 22 21 USE lib_mpp ! MPP library 23 22 USE wrk_nemo ! Memory allocation 24 23 USE timing ! Timing 24 USE in_out_manager ! I/O manager 25 USE iom 25 26 26 27 IMPLICIT NONE … … 34 35 35 36 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_tsd ! structure of input SST (file informations, fields read) 37 #if defined key_jdha_init 38 REAL(wp), ALLOCATABLE, DIMENSION(:,:,: ) :: gdept_init 39 #endif 36 40 37 41 !! * Substitutions … … 146 150 INTEGER , INTENT(in ) :: kt ! ocean time-step 147 151 REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT( out) :: ptsd ! T & S data 152 ! REAL(wp), DIMENSION(jpi,jpj,jpk) :: gdept_init ! T & S data 148 153 ! 149 154 INTEGER :: ji, jj, jk, jl, jkk ! dummy loop indicies … … 156 161 ! 157 162 CALL fld_read( kt, 1, sf_tsd ) !== read T & S data at kt time step ==! 163 164 #if defined key_jdha_init 165 ALLOCATE( gdept_init(jpi,jpj,jpk) ) 166 CALL iom_open ( sf_tsd(jp_tem)%clname, sf_tsd(jp_tem)%num ) 167 CALL iom_get ( sf_tsd(jp_tem)%num, jpdom_data, 'deptht', gdept_init,1) 168 CALL iom_close( sf_tsd(jp_tem)%num ) ! Close the input file 169 #endif 158 170 ! 159 171 ! … … 223 235 DO jk = 1, jpk ! determines the intepolated T-S profiles at each (i,j) points 224 236 zl = fsdept_0(ji,jj,jk) 237 #if defined key_jdha_init 238 IF( zl < gdept_init(ji,jj,1 ) ) THEN ! above the first level of data 239 #else 225 240 IF( zl < gdept_0(1 ) ) THEN ! above the first level of data 241 #endif 226 242 ztp(jk) = ptsd(ji,jj,1 ,jp_tem) 227 243 zsp(jk) = ptsd(ji,jj,1 ,jp_sal) 244 #if defined key_jdha_init 245 ELSEIF( zl > gdept_init(ji,jj,jpk) ) THEN ! below the last level of data 246 #else 228 247 ELSEIF( zl > gdept_0(jpk) ) THEN ! below the last level of data 248 #endif 229 249 ztp(jk) = ptsd(ji,jj,jpkm1,jp_tem) 230 250 zsp(jk) = ptsd(ji,jj,jpkm1,jp_sal) 231 251 ELSE ! inbetween : vertical interpolation between jkk & jkk+1 232 252 DO jkk = 1, jpkm1 ! when gdept(jkk) < zl < gdept(jkk+1) 253 #if defined key_jdha_init 254 IF( (zl-gdept_init(ji,jj,jkk)) * (zl-gdept_init(ji,jj,jkk+1)) <= 0._wp ) THEN 255 zi = ( zl - gdept_init(ji,jj,jkk) ) / (gdept_init(ji,jj,jkk+1)-gdept_init(ji,jj,jkk)) 256 #else 233 257 IF( (zl-gdept_0(jkk)) * (zl-gdept_0(jkk+1)) <= 0._wp ) THEN 234 258 zi = ( zl - gdept_0(jkk) ) / (gdept_0(jkk+1)-gdept_0(jkk)) 259 #endif 235 260 ztp(jk) = ptsd(ji,jj,jkk,jp_tem) + ( ptsd(ji,jj,jkk+1,jp_tem) - ptsd(ji,jj,jkk,jp_tem) ) * zi 236 261 zsp(jk) = ptsd(ji,jj,jkk,jp_sal) + ( ptsd(ji,jj,jkk+1,jp_sal) - ptsd(ji,jj,jkk,jp_sal) ) * zi … … 299 324 IF( sf_tsd(jp_sal)%ln_tint ) DEALLOCATE( sf_tsd(jp_sal)%fdta ) 300 325 DEALLOCATE( sf_tsd ) ! the structure itself 326 #if defined key_jdha_init 327 DEALLOCATE( gdept_init ) 328 #endif 301 329 ENDIF 302 330 ! -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/istate.F90
r3764 r6736 32 32 USE phycst ! physical constants 33 33 USE dtatsd ! data temperature and salinity (dta_tsd routine) 34 USE restart ! ocean restart (rst_read routine) 34 35 USE in_out_manager ! I/O manager 35 36 USE iom ! I/O library … … 43 44 USE sol_oce ! ocean solver variables 44 45 USE lib_mpp ! MPP library 45 USE restart ! restart46 46 USE wrk_nemo ! Memory allocation 47 47 USE timing ! Timing … … 70 70 ! - ML - needed for initialization of e3t_b 71 71 INTEGER :: jk ! dummy loop indice 72 INTEGER :: inum ! temporary logical unit 72 73 !!---------------------------------------------------------------------- 73 74 ! … … 91 92 CALL rst_read ! Read the restart file 92 93 ! ! define e3u_b, e3v_b from e3t_b read in restart file 94 #if ! defined key_jth_fix 93 95 CALL dom_vvl_2( nit000, fse3u_b(:,:,:), fse3v_b(:,:,:) ) 96 #endif 94 97 CALL day_init ! model calendar (using both namelist and restart infos) 95 98 ELSE … … 114 117 CALL dta_tsd( nit000, tsb ) ! read 3D T and S data at nit000 115 118 tsn(:,:,:,:) = tsb(:,:,:,:) 119 #if defined key_jdha_ssh_init 120 CALL iom_open ( 'initcd_ssh.nc', inum ) 121 CALL iom_get ( inum, jpdom_data, 'sossheig', sshb(:,:)) 122 CALL iom_close( inum ) ! Close the input file 123 sshn(:,:) = sshb(:,:) 124 #endif 116 125 ! 117 126 ELSE ! Initial T-S fields defined analytically … … 126 135 ! 127 136 ! - ML - sshn could be modified by istate_eel, so that initialization of fse3t_b is done here 137 #if ! defined key_jth_fix 128 138 IF( lk_vvl ) THEN 129 139 DO jk = 1, jpk … … 133 143 ! ! define e3u_b, e3v_b from e3t_b initialized in domzgr 134 144 CALL dom_vvl_2( nit000, fse3u_b(:,:,:), fse3v_b(:,:,:) ) 145 #endif 135 146 ! 136 147 ENDIF … … 164 175 INTEGER :: ji, jj, jk 165 176 REAL(wp) :: zsal = 35.50 177 #if defined key_istate_fixed 178 REAL(wp) :: ztem = 25.50 179 #endif 166 180 !!---------------------------------------------------------------------- 167 181 ! … … 170 184 IF(lwp) WRITE(numout,*) '~~~~~~~~~~ and constant salinity (',zsal,' psu)' 171 185 ! 186 #if ! defined key_istate_fixed 172 187 DO jk = 1, jpk 173 188 tsn(:,:,jk,jp_tem) = ( ( ( 7.5 - 0. * ABS( gphit(:,:) )/30. ) * ( 1.-TANH((fsdept(:,:,jk)-80.)/30.) ) & … … 175 190 tsb(:,:,jk,jp_tem) = tsn(:,:,jk,jp_tem) 176 191 END DO 192 #else 193 tsn(:,:,:,jp_tem) = ztem * tmask(:,:,:) 194 tsb(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) 195 #endif 177 196 tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 178 197 tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/phycst.F90
r3625 r6736 27 27 REAL(wp), PUBLIC :: rsmall = 0.5 * EPSILON( 1.e0 ) !: smallest real computer value 28 28 29 REAL(wp), PUBLIC :: rday = 24.*60.*60. !: day [s] 30 REAL(wp), PUBLIC :: rsiyea !: sideral year [s] 31 REAL(wp), PUBLIC :: rsiday !: sideral day [s] 32 REAL(wp), PUBLIC :: raamo = 12._wp !: number of months in one year 33 REAL(wp), PUBLIC :: rjjhh = 24._wp !: number of hours in one day 34 REAL(wp), PUBLIC :: rhhmm = 60._wp !: number of minutes in one hour 35 REAL(wp), PUBLIC :: rmmss = 60._wp !: number of seconds in one minute 36 REAL(wp), PUBLIC :: omega !: earth rotation parameter [s-1] 37 REAL(wp), PUBLIC :: ra = 6371229._wp !: earth radius [m] 38 REAL(wp), PUBLIC :: grav = 9.80665_wp !: gravity [m/s2] 29 REAL(wp), PUBLIC :: rday = 24.*60.*60. !: day (s) 30 REAL(wp), PUBLIC :: rsiyea !: sideral year (s) 31 REAL(wp), PUBLIC :: rsiday !: sideral day (s) 32 REAL(wp), PUBLIC :: raamo = 12._wp !: number of months in one year 33 REAL(wp), PUBLIC :: rjjhh = 24._wp !: number of hours in one day 34 REAL(wp), PUBLIC :: rhhmm = 60._wp !: number of minutes in one hour 35 REAL(wp), PUBLIC :: rmmss = 60._wp !: number of seconds in one minute 36 !! REAL(wp), PUBLIC :: omega = 7.292115083046061e-5_wp , & !: change the last digit! 37 REAL(wp), PUBLIC :: omega !: earth rotation parameter 38 REAL(wp), PUBLIC :: ra = 6371229._wp !: earth radius (meter) 39 REAL(wp), PUBLIC :: grav = 9.80665_wp !: gravity (m/s2) 39 40 40 REAL(wp), PUBLIC :: rtt = 273.16_wp !: triple point of temperature [Kelvin]41 REAL(wp), PUBLIC :: rt0 = 273.15_wp !: freezing point of fresh water [Kelvin]41 REAL(wp), PUBLIC :: rtt = 273.16_wp !: triple point of temperature (Kelvin) 42 REAL(wp), PUBLIC :: rt0 = 273.15_wp !: freezing point of water (Kelvin) 42 43 #if defined key_lim3 43 REAL(wp), PUBLIC :: rt0_snow = 273.16_wp !: melting point of snow [Kelvin]44 REAL(wp), PUBLIC :: rt0_ice = 273.16_wp !: melting point of ice [Kelvin]44 REAL(wp), PUBLIC :: rt0_snow = 273.16_wp !: melting point of snow (Kelvin) 45 REAL(wp), PUBLIC :: rt0_ice = 273.16_wp !: melting point of ice (Kelvin) 45 46 #else 46 REAL(wp), PUBLIC :: rt0_snow = 273.15_wp !: melting point of snow [Kelvin]47 REAL(wp), PUBLIC :: rt0_ice = 273.05_wp !: melting point of ice [Kelvin]47 REAL(wp), PUBLIC :: rt0_snow = 273.15_wp !: melting point of snow (Kelvin) 48 REAL(wp), PUBLIC :: rt0_ice = 273.05_wp !: melting point of ice (Kelvin) 48 49 #endif 50 49 51 #if defined key_cice 50 REAL(wp), PUBLIC :: rau0 = 1026._wp !: volumic mass of reference [kg/m3]52 REAL(wp), PUBLIC :: rau0 = 1026._wp !: reference volumic mass (density) (kg/m3) 51 53 #else 52 REAL(wp), PUBLIC :: rau0 = 1035._wp !: volumic mass of reference [kg/m3]54 REAL(wp), PUBLIC :: rau0 = 1035._wp !: reference volumic mass (density) (kg/m3) 53 55 #endif 54 REAL(wp), PUBLIC :: r1_rau0 !: = 1. / rau0 [m3/kg] 55 REAL(wp), PUBLIC :: rauw = 1000._wp !: volumic mass of pure water [m3/kg] 56 REAL(wp), PUBLIC :: rcp = 4.e3_wp !: ocean specific heat [J/Kelvin] 57 REAL(wp), PUBLIC :: r1_rcp !: = 1. / rcp [Kelvin/J] 58 REAL(wp), PUBLIC :: r1_rau0_rcp !: = 1. / ( rau0 * rcp ) 59 60 REAL(wp), PUBLIC :: rhosn = 330._wp !: volumic mass of snow [kg/m3] 61 REAL(wp), PUBLIC :: emic = 0.97_wp !: emissivity of snow or ice 62 REAL(wp), PUBLIC :: sice = 6.0_wp !: salinity of ice [psu] 63 REAL(wp), PUBLIC :: soce = 34.7_wp !: salinity of sea [psu] 64 REAL(wp), PUBLIC :: cevap = 2.5e+6_wp !: latent heat of evaporation (water) 65 REAL(wp), PUBLIC :: srgamma = 0.9_wp !: correction factor for solar radiation (Oberhuber, 1974) 66 REAL(wp), PUBLIC :: vkarmn = 0.4_wp !: von Karman constant 67 REAL(wp), PUBLIC :: stefan = 5.67e-8_wp !: Stefan-Boltzmann constant 56 REAL(wp), PUBLIC :: rau0r !: reference specific volume (m3/kg) 57 REAL(wp), PUBLIC :: rcp = 4.e+3_wp !: ocean specific heat 58 REAL(wp), PUBLIC :: ro0cpr !: = 1. / ( rau0 * rcp ) 68 59 69 60 #if defined key_lim3 || defined key_cice 70 REAL(wp), PUBLIC :: rhoic = 917._wp !: volumic mass of sea ice [kg/m3] 71 REAL(wp), PUBLIC :: rcdic = 2.034396_wp !: thermal conductivity of fresh ice 72 REAL(wp), PUBLIC :: rcdsn = 0.31_wp !: thermal conductivity of snow 73 REAL(wp), PUBLIC :: cpic = 2067.0_wp !: specific heat for ice 74 REAL(wp), PUBLIC :: lsub = 2.834e+6_wp !: pure ice latent heat of sublimation [J/kg] 75 REAL(wp), PUBLIC :: lfus = 0.334e+6_wp !: latent heat of fusion of fresh ice [J/kg] 76 REAL(wp), PUBLIC :: tmut = 0.054_wp !: decrease of seawater meltpoint with salinity 77 REAL(wp), PUBLIC :: xlsn !: = lfus*rhosn (volumetric latent heat fusion of snow) [J/m3] 61 REAL(wp), PUBLIC :: rcdsn = 0.31_wp !: thermal conductivity of snow 62 REAL(wp), PUBLIC :: rcdic = 2.034396_wp !: thermal conductivity of fresh ice 63 REAL(wp), PUBLIC :: cpic = 2067.0 !: specific heat of sea ice 64 REAL(wp), PUBLIC :: lsub = 2.834e+6 !: pure ice latent heat of sublimation (J.kg-1) 65 REAL(wp), PUBLIC :: lfus = 0.334e+6 !: latent heat of fusion of fresh ice (J.kg-1) 66 REAL(wp), PUBLIC :: rhoic = 917._wp !: volumic mass of sea ice (kg/m3) 67 REAL(wp), PUBLIC :: tmut = 0.054 !: decrease of seawater meltpoint with salinity 78 68 #else 79 REAL(wp), PUBLIC :: rhoic = 900._wp !: volumic mass of sea ice [kg/m3] 80 REAL(wp), PUBLIC :: rcdic = 2.034396_wp !: conductivity of the ice [W/m/K] 81 REAL(wp), PUBLIC :: rcpic = 1.8837e+6_wp !: volumetric specific heat for ice [J/m3/K] 82 REAL(wp), PUBLIC :: cpic !: = rcpic / rhoic (specific heat for ice) [J/Kg/K] 83 REAL(wp), PUBLIC :: rcdsn = 0.22_wp !: conductivity of the snow [W/m/K] 84 REAL(wp), PUBLIC :: rcpsn = 6.9069e+5_wp !: volumetric specific heat for snow [J/m3/K] 85 REAL(wp), PUBLIC :: xlsn = 110.121e+6_wp !: volumetric latent heat fusion of snow [J/m3] 86 REAL(wp), PUBLIC :: lfus !: = xlsn / rhosn (latent heat of fusion of fresh ice) [J/Kg] 87 REAL(wp), PUBLIC :: xlic = 300.33e+6_wp !: volumetric latent heat fusion of ice [J/m3] 88 REAL(wp), PUBLIC :: xsn = 2.8e+6_wp !: volumetric latent heat of sublimation of snow [J/m3] 69 REAL(wp), PUBLIC :: rcdsn = 0.22_wp !: conductivity of the snow 70 REAL(wp), PUBLIC :: rcdic = 2.034396_wp !: conductivity of the ice 71 REAL(wp), PUBLIC :: rcpsn = 6.9069e+5_wp !: density times specific heat for snow 72 REAL(wp), PUBLIC :: rcpic = 1.8837e+6_wp !: volumetric latent heat fusion of sea ice 73 REAL(wp), PUBLIC :: lfus = 0.3337e+6 !: latent heat of fusion of fresh ice (J.kg-1) 74 REAL(wp), PUBLIC :: xlsn = 110.121e+6_wp !: volumetric latent heat fusion of snow 75 REAL(wp), PUBLIC :: xlic = 300.33e+6_wp !: volumetric latent heat fusion of ice 76 REAL(wp), PUBLIC :: xsn = 2.8e+6 !: latent heat of sublimation of snow 77 REAL(wp), PUBLIC :: rhoic = 900._wp !: volumic mass of sea ice (kg/m3) 89 78 #endif 79 REAL(wp), PUBLIC :: rhosn = 330._wp !: volumic mass of snow (kg/m3) 80 REAL(wp), PUBLIC :: emic = 0.97_wp !: emissivity of snow or ice 81 REAL(wp), PUBLIC :: sice = 6.0_wp !: reference salinity of ice (psu) 82 REAL(wp), PUBLIC :: soce = 34.7_wp !: reference salinity of sea (psu) 83 REAL(wp), PUBLIC :: cevap = 2.5e+6_wp !: latent heat of evaporation (water) 84 REAL(wp), PUBLIC :: srgamma = 0.9_wp !: correction factor for solar radiation (Oberhuber, 1974) 85 REAL(wp), PUBLIC :: vkarmn = 0.4_wp !: von Karman constant 86 REAL(wp), PUBLIC :: stefan = 5.67e-8_wp !: Stefan-Boltzmann constant 90 87 !!---------------------------------------------------------------------- 91 88 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 105 102 !!---------------------------------------------------------------------- 106 103 107 IF(lwp) WRITE(numout,*) 108 IF(lwp) WRITE(numout,*) ' phy_cst : initialization of ocean parameters and constants' 109 IF(lwp) WRITE(numout,*) ' ~~~~~~~' 104 ! ! Define additional parameters 105 rsiyea = 365.25 * rday * 2. * rpi / 6.283076 106 rsiday = rday / ( 1. + rday / rsiyea ) 107 #if defined key_cice 108 omega = 7.292116e-05 109 #else 110 omega = 2. * rpi / rsiday 111 #endif 110 112 111 ! Ocean Parameters 112 ! ---------------- 113 IF(lwp) THEN 113 rau0r = 1. / rau0 114 ro0cpr = 1. / ( rau0 * rcp ) 115 116 117 IF(lwp) THEN ! control print 118 WRITE(numout,*) 119 WRITE(numout,*) ' phy_cst : initialization of ocean parameters and constants' 120 WRITE(numout,*) ' ~~~~~~~' 114 121 WRITE(numout,*) ' Domain info' 115 122 WRITE(numout,*) ' dimension of model' … … 124 131 WRITE(numout,*) ' jpnij : ', jpnij 125 132 WRITE(numout,*) ' lateral domain boundary condition type : jperio = ', jperio 126 ENDIF 127 128 ! Define constants 129 ! ---------------- 130 IF(lwp) WRITE(numout,*) 131 IF(lwp) WRITE(numout,*) ' Constants' 132 133 IF(lwp) WRITE(numout,*) 134 IF(lwp) WRITE(numout,*) ' mathematical constant rpi = ', rpi 135 136 rsiyea = 365.25_wp * rday * 2._wp * rpi / 6.283076_wp 137 rsiday = rday / ( 1._wp + rday / rsiyea ) 138 #if defined key_cice 139 omega = 7.292116e-05 140 #else 141 omega = 2._wp * rpi / rsiday 142 #endif 143 IF(lwp) WRITE(numout,*) 144 IF(lwp) WRITE(numout,*) ' day rday = ', rday, ' s' 145 IF(lwp) WRITE(numout,*) ' sideral year rsiyea = ', rsiyea, ' s' 146 IF(lwp) WRITE(numout,*) ' sideral day rsiday = ', rsiday, ' s' 147 IF(lwp) WRITE(numout,*) ' omega omega = ', omega, ' s^-1' 148 149 IF(lwp) WRITE(numout,*) 150 IF(lwp) WRITE(numout,*) ' nb of months per year raamo = ', raamo, ' months' 151 IF(lwp) WRITE(numout,*) ' nb of hours per day rjjhh = ', rjjhh, ' hours' 152 IF(lwp) WRITE(numout,*) ' nb of minutes per hour rhhmm = ', rhhmm, ' mn' 153 IF(lwp) WRITE(numout,*) ' nb of seconds per minute rmmss = ', rmmss, ' s' 154 155 IF(lwp) WRITE(numout,*) 156 IF(lwp) WRITE(numout,*) ' earth radius ra = ', ra, ' m' 157 IF(lwp) WRITE(numout,*) ' gravity grav = ', grav , ' m/s^2' 158 159 IF(lwp) WRITE(numout,*) 160 IF(lwp) WRITE(numout,*) ' triple point of temperature rtt = ', rtt , ' K' 161 IF(lwp) WRITE(numout,*) ' freezing point of water rt0 = ', rt0 , ' K' 162 IF(lwp) WRITE(numout,*) ' melting point of snow rt0_snow = ', rt0_snow, ' K' 163 IF(lwp) WRITE(numout,*) ' melting point of ice rt0_ice = ', rt0_ice , ' K' 164 165 r1_rau0 = 1._wp / rau0 166 r1_rcp = 1._wp / rcp 167 r1_rau0_rcp = 1._wp / ( rau0 * rcp ) 168 IF(lwp) WRITE(numout,*) 169 IF(lwp) WRITE(numout,*) ' volumic mass of pure water rauw = ', rauw , ' kg/m^3' 170 IF(lwp) WRITE(numout,*) ' volumic mass of reference rau0 = ', rau0 , ' kg/m^3' 171 IF(lwp) WRITE(numout,*) ' 1. / rau0 r1_rau0 = ', r1_rau0, ' m^3/kg' 172 IF(lwp) WRITE(numout,*) ' ocean specific heat rcp = ', rcp , ' J/Kelvin' 173 IF(lwp) WRITE(numout,*) ' 1. / ( rau0 * rcp ) r1_rau0_rcp = ', r1_rau0_rcp 174 175 176 #if defined key_lim3 || defined key_cice 177 xlsn = lfus * rhosn ! volumetric latent heat fusion of snow [J/m3] 178 #else 179 cpic = rcpic / rhoic ! specific heat for ice [J/Kg/K] 180 lfus = xlsn / rhosn ! latent heat of fusion of fresh ice 181 #endif 182 183 IF(lwp) THEN 133 WRITE(numout,*) 134 WRITE(numout,*) ' Constants' 135 WRITE(numout,*) 136 WRITE(numout,*) ' mathematical constant rpi = ', rpi 137 WRITE(numout,*) ' day rday = ', rday, ' s' 138 WRITE(numout,*) ' sideral year rsiyea = ', rsiyea, ' s' 139 WRITE(numout,*) ' sideral day rsiday = ', rsiday, ' s' 140 WRITE(numout,*) ' omega omega = ', omega, ' s-1' 141 WRITE(numout,*) 142 WRITE(numout,*) ' nb of months per year raamo = ', raamo, ' months' 143 WRITE(numout,*) ' nb of hours per day rjjhh = ', rjjhh, ' hours' 144 WRITE(numout,*) ' nb of minutes per hour rhhmm = ', rhhmm, ' mn' 145 WRITE(numout,*) ' nb of seconds per minute rmmss = ', rmmss, ' s' 146 WRITE(numout,*) 147 WRITE(numout,*) ' earth radius ra = ', ra, ' m' 148 WRITE(numout,*) ' gravity grav = ', grav , ' m/s^2' 149 WRITE(numout,*) 150 WRITE(numout,*) ' triple point of temperature rtt = ', rtt , ' K' 151 WRITE(numout,*) ' freezing point of water rt0 = ', rt0 , ' K' 152 WRITE(numout,*) ' melting point of snow rt0_snow = ', rt0_snow, ' K' 153 WRITE(numout,*) ' melting point of ice rt0_ice = ', rt0_ice , ' K' 154 WRITE(numout,*) 155 WRITE(numout,*) ' ocean reference volumic mass rau0 = ', rau0 , ' kg/m^3' 156 WRITE(numout,*) ' ocean reference specific volume rau0r = ', rau0r, ' m^3/Kg' 157 WRITE(numout,*) ' ocean specific heat rcp = ', rcp 158 WRITE(numout,*) ' 1. / ( rau0 * rcp ) = ro0cpr = ', ro0cpr 184 159 WRITE(numout,*) 185 160 WRITE(numout,*) ' thermal conductivity of the snow = ', rcdsn , ' J/s/m/K' 186 161 WRITE(numout,*) ' thermal conductivity of the ice = ', rcdic , ' J/s/m/K' 162 #if defined key_lim3 187 163 WRITE(numout,*) ' fresh ice specific heat = ', cpic , ' J/kg/K' 188 164 WRITE(numout,*) ' latent heat of fusion of fresh ice / snow = ', lfus , ' J/kg' 189 #if defined key_lim3 || defined key_cice190 165 WRITE(numout,*) ' latent heat of subl. of fresh ice / snow = ', lsub , ' J/kg' 166 #elif defined key_cice 167 WRITE(numout,*) ' latent heat of fusion of fresh ice / snow = ', lfus , ' J/kg' 191 168 #else 192 169 WRITE(numout,*) ' density times specific heat for snow = ', rcpsn , ' J/m^3/K' 193 170 WRITE(numout,*) ' density times specific heat for ice = ', rcpic , ' J/m^3/K' 194 171 WRITE(numout,*) ' volumetric latent heat fusion of sea ice = ', xlic , ' J/m' 172 WRITE(numout,*) ' volumetric latent heat fusion of snow = ', xlsn , ' J/m' 195 173 WRITE(numout,*) ' latent heat of sublimation of snow = ', xsn , ' J/kg' 196 174 #endif 197 WRITE(numout,*) ' volumetric latent heat fusion of snow = ', xlsn , ' J/m^3'198 175 WRITE(numout,*) ' density of sea ice = ', rhoic , ' kg/m^3' 199 176 WRITE(numout,*) ' density of snow = ', rhosn , ' kg/m^3' -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_bilap.F90
r3634 r6736 144 144 145 145 ! Multiply by the eddy viscosity coef. (at u- and v-points) 146 zlu(:,:,jk) = zlu(:,:,jk) * ( fsahmu(:,:,jk) * (1-nkahm_smag) + nkahm_smag) 147 148 zlv(:,:,jk) = zlv(:,:,jk) * ( fsahmv(:,:,jk) * (1-nkahm_smag) + nkahm_smag) 146 zlu(:,:,jk) = zlu(:,:,jk) * fsahmu(:,:,jk) 147 zlv(:,:,jk) = zlv(:,:,jk) * fsahmv(:,:,jk) 149 148 150 149 ! Contravariant "laplacian" … … 201 200 & + ( zut(ji,jj+1,jk) - zut(ji ,jj,jk) ) / e2v(ji,jj) 202 201 ! add it to the general momentum trends 203 ua(ji,jj,jk) = ua(ji,jj,jk) + zua * ( fsahmu(ji,jj,jk)*nkahm_smag +(1 -nkahm_smag ))204 va(ji,jj,jk) = va(ji,jj,jk) + zva * ( fsahmv(ji,jj,jk)*nkahm_smag +(1 -nkahm_smag ))202 ua(ji,jj,jk) = ua(ji,jj,jk) + zua 203 va(ji,jj,jk) = va(ji,jj,jk) + zva 205 204 END DO 206 205 END DO -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_bilapg.F90
r3634 r6736 414 414 ! II.3 Divergence of vertical fluxes added to the horizontal divergence 415 415 ! --------------------------------------------------------------------- 416 IF( (kahm -nkahm_smag) ==1 ) THEN 416 417 IF( kahm == 1 ) THEN 417 418 ! multiply the laplacian by the eddy viscosity coefficient 418 419 DO jk = 1, jpkm1 … … 429 430 END DO 430 431 END DO 431 ELSEIF( (kahm +nkahm_smag )== 2 ) THEN432 ELSEIF( kahm == 2 ) THEN 432 433 ! second call, no multiplication 433 434 DO jk = 1, jpkm1 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynnxt.F90
r3764 r6736 215 215 ! ! ================! 216 216 ! 217 #if ! defined key_jth_fix 217 218 DO jk = 1, jpkm1 ! Before scale factor at t-points 218 219 fse3t_b(:,:,jk) = fse3t_n(:,:,jk) & … … 220 221 & - 2._wp * fse3t_n(:,:,jk) ) 221 222 END DO 223 #endif 222 224 zec = atfp * rdt / rau0 ! Add filter correction only at the 1st level of t-point scale factors 225 #if ! defined key_jth_fix 223 226 fse3t_b(:,:,1) = fse3t_b(:,:,1) - zec * ( emp_b(:,:) - emp(:,:) ) * tmask(:,:,1) 227 #endif 224 228 ! 225 229 IF( ln_dynadv_vec ) THEN ! vector invariant form (no thickness weighted calulation) 226 230 ! 227 231 ! ! before scale factors at u- & v-pts (computed from fse3t_b) 232 #if ! defined key_jth_fix 228 233 CALL dom_vvl_2( kt, fse3u_b(:,:,:), fse3v_b(:,:,:) ) 234 #endif 229 235 ! 230 236 DO jk = 1, jpkm1 ! Leap-Frog - Asselin filter and swap: applied on velocity … … 244 250 ELSE ! flux form (thickness weighted calulation) 245 251 ! 252 #if ! defined key_jth_fix 246 253 CALL dom_vvl_2( kt, ze3u_f, ze3v_f ) ! before scale factors at u- & v-pts (computed from fse3t_b) 254 #endif 247 255 ! 248 256 DO jk = 1, jpkm1 ! Leap-Frog - Asselin filter and swap: … … 266 274 END DO 267 275 END DO 276 #if ! defined key_jth_fix 268 277 fse3u_b(:,:,1:jpkm1) = ze3u_f(:,:,1:jpkm1) ! e3u_b <-- filtered scale factor 269 278 fse3v_b(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1) 279 #endif 280 CALL lbc_lnk( ub, 'U', -1. ) ! lateral boundary conditions 281 CALL lbc_lnk( vb, 'V', -1. ) 270 282 ENDIF 271 283 ! -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg.F90
r3625 r6736 81 81 ! 82 82 INTEGER :: ji, jj, jk ! dummy loop indices 83 REAL(wp) :: z2dt, zg_2 , zintp, zgrau0r! temporary scalar83 REAL(wp) :: z2dt, zg_2 ! temporary scalar 84 84 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 85 REAL(wp), POINTER, DIMENSION(:,:) :: zpice86 85 !!---------------------------------------------------------------------- 87 86 ! … … 118 117 END DO 119 118 END DO 120 ENDIF121 122 IF( nn_ice_embd == 2 ) THEN !== embedded sea ice: Pressure gradient due to snow-ice mass ==!123 CALL wrk_alloc( jpi, jpj, zpice )124 !125 zintp = REAL( MOD( kt-1, nn_fsbc ) ) / REAL( nn_fsbc )126 zgrau0r = - grav * r1_rau0127 zpice(:,:) = ( zintp * snwice_mass(:,:) + ( 1.- zintp ) * snwice_mass_b(:,:) ) * zgrau0r128 DO jj = 2, jpjm1129 DO ji = fs_2, fs_jpim1 ! vector opt.130 spgu(ji,jj) = ( zpice(ji+1,jj) - zpice(ji,jj) ) / e1u(ji,jj)131 spgv(ji,jj) = ( zpice(ji,jj+1) - zpice(ji,jj) ) / e2v(ji,jj)132 END DO133 END DO134 DO jk = 1, jpkm1 ! Add the surface pressure trend to the general trend135 DO jj = 2, jpjm1136 DO ji = fs_2, fs_jpim1 ! vector opt.137 ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj)138 va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj)139 END DO140 END DO141 END DO142 !143 CALL wrk_dealloc( jpi, jpj, zpice )144 119 ENDIF 145 120 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_exp.F90
r3680 r6736 27 27 USE prtctl ! Print control 28 28 USE iom ! I/O library 29 USE restart ! only for lrst_oce 29 30 USE timing ! Timing 30 31 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_flt.F90
r3765 r6736 45 45 USE prtctl ! Print control 46 46 USE iom 47 USE restart ! only for lrst_oce 47 48 USE lib_fortran 48 49 #if defined key_agrif … … 188 189 #if defined key_obc 189 190 IF( lk_obc ) CALL obc_dyn( kt ) ! Update velocities on each open boundary with the radiation algorithm 190 IF( lk_obc )CALL obc_vol( kt ) ! Correction of the barotropic componant velocity to control the volume of the system191 IF( lk_obc) CALL obc_vol( kt ) ! Correction of the barotropic componant velocity to control the volume of the system 191 192 #endif 192 193 #if defined key_bdy … … 255 256 END DO 256 257 ! applied the lateral boundary conditions 257 IF( nn_solv == 2 .AND. MAX( jpr2di, jpr2dj ) > 0 ) CALL lbc_lnk_e( gcb, c_solver_pt, 1. , jpr2di, jpr2dj)258 IF( nn_solv == 2 .AND. MAX( jpr2di, jpr2dj ) > 0 ) CALL lbc_lnk_e( gcb, c_solver_pt, 1. ) 258 259 259 260 #if defined key_agrif … … 307 308 ! multiplied by z2dt 308 309 #if defined key_obc 309 IF(lk_obc) THEN310 310 ! caution : grad D = 0 along open boundaries 311 311 ! Remark: The filtering force could be reduced here in the FRS zone 312 312 ! by multiplying spgu/spgv by (1-alpha) ?? 313 spgu(ji,jj) = z2dt * ztdgu * obcumask(ji,jj) 314 spgv(ji,jj) = z2dt * ztdgv * obcvmask(ji,jj) 315 ELSE 316 spgu(ji,jj) = z2dt * ztdgu 317 spgv(ji,jj) = z2dt * ztdgv 318 ENDIF 313 spgu(ji,jj) = z2dt * ztdgu * obcumask(ji,jj) 314 spgv(ji,jj) = z2dt * ztdgv * obcvmask(ji,jj) 319 315 #elif defined key_bdy 320 IF(lk_bdy) THEN321 316 ! caution : grad D = 0 along open boundaries 322 spgu(ji,jj) = z2dt * ztdgu * bdyumask(ji,jj) 323 spgv(ji,jj) = z2dt * ztdgv * bdyvmask(ji,jj) 324 ELSE 325 spgu(ji,jj) = z2dt * ztdgu 326 spgv(ji,jj) = z2dt * ztdgv 327 ENDIF 317 spgu(ji,jj) = z2dt * ztdgu * bdyumask(ji,jj) 318 spgv(ji,jj) = z2dt * ztdgv * bdyvmask(ji,jj) 328 319 #else 329 320 spgu(ji,jj) = z2dt * ztdgu -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90
r3680 r6736 41 41 USE in_out_manager ! I/O manager 42 42 USE iom ! IOM library 43 USE restart ! only for lrst_oce 43 44 USE zdf_oce ! Vertical diffusion 44 45 USE wrk_nemo ! Memory Allocation … … 402 403 IF( lk_obc ) CALL obc_dta_bt ( kt, jn ) 403 404 IF( lk_bdy ) CALL bdy_dta ( kt, jit=jn, time_offset=+1 ) 404 IF ( ln_tide_pot .AND. lk_tide) CALL upd_tide( kt, jn )405 IF ( ln_tide_pot ) CALL upd_tide( kt, jn ) 405 406 406 407 ! !* after ssh_e … … 452 453 ENDIF 453 454 ! add tidal astronomical forcing 454 IF ( ln_tide_pot .AND. lk_tide) THEN455 IF ( ln_tide_pot ) THEN 455 456 zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj) 456 457 zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj) … … 502 503 ENDIF 503 504 ! add tidal astronomical forcing 504 IF ( ln_tide_pot .AND. lk_tide) THEN505 IF ( ln_tide_pot ) THEN 505 506 zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj) 506 507 zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj) … … 549 550 ENDIF 550 551 ! add tidal astronomical forcing 551 IF ( ln_tide_pot .AND. lk_tide) THEN552 IF ( ln_tide_pot ) THEN 552 553 zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj) 553 554 zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_exp.F90
r3625 r6736 61 61 ! 62 62 INTEGER :: ji, jj, jk, jl ! dummy loop indices 63 REAL(wp) :: z lavmr, zua, zva ! local scalars63 REAL(wp) :: zrau0r, zlavmr, zua, zva ! local scalars 64 64 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwx, zwy, zwz, zww 65 65 !!---------------------------------------------------------------------- … … 75 75 ENDIF 76 76 77 zrau0r = 1. / rau0 ! Local constant initialization 77 78 zlavmr = 1. / REAL( nn_zdfexp ) 78 79 … … 80 81 DO jj = 2, jpjm1 ! Surface boundary condition 81 82 DO ji = 2, jpim1 82 zwy(ji,jj,1) = ( utau_b(ji,jj) + utau(ji,jj) ) * r1_rau083 zww(ji,jj,1) = ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_rau083 zwy(ji,jj,1) = ( utau_b(ji,jj) + utau(ji,jj) ) * zrau0r 84 zww(ji,jj,1) = ( vtau_b(ji,jj) + vtau(ji,jj) ) * zrau0r 84 85 END DO 85 86 END DO -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90
r3625 r6736 161 161 DO ji = fs_2, fs_jpim1 ! vector opt. 162 162 ua(ji,jj,1) = ub(ji,jj,1) + p2dt * ( ua(ji,jj,1) + 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) ) & 163 & * r1_rau0 / fse3u(ji,jj,1))163 & / ( fse3u(ji,jj,1) * rau0 ) ) 164 164 END DO 165 165 END DO … … 247 247 DO ji = fs_2, fs_jpim1 ! vector opt. 248 248 va(ji,jj,1) = vb(ji,jj,1) + p2dt * ( va(ji,jj,1) + 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) ) & 249 & * r1_rau0 / fse3v(ji,jj,1))249 & / ( fse3v(ji,jj,1) * rau0 ) ) 250 250 END DO 251 251 END DO -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/sshwzv.F90
r3764 r6736 20 20 USE divcur ! hor. divergence and curl (div & cur routines) 21 21 USE iom ! I/O library 22 USE restart ! only for lrst_oce 22 23 USE in_out_manager ! I/O manager 23 24 USE prtctl ! Print control -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/in_out_manager.F90
r3680 r6736 41 41 LOGICAL :: ln_clobber = .FALSE. !: clobber (overwrite) an existing file 42 42 INTEGER :: nn_chunksz = 0 !: chunksize (bytes) for NetCDF file (works only with iom_nf90 routines) 43 LOGICAL :: ln_fse3t_b = .TRUE. !: restart contains fse3t_b 43 44 #if defined key_netcdf4 44 45 !!---------------------------------------------------------------------- … … 80 81 !! was in restart but moved here because of the OFF line... better solution should be found... 81 82 !!---------------------------------------------------------------------- 82 INTEGER :: nitrst !: time step at which restart file should be written 83 LOGICAL :: lrst_oce !: logical to control the oce restart write 84 INTEGER :: numror, numrow !: logical unit for cean restart (read and write) 83 INTEGER :: nitrst !: time step at which restart file should be written 85 84 86 85 !!---------------------------------------------------------------------- -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/iom.F90
r3771 r6736 7 7 !! 2.0 ! 2006-02 (S. Masson) Adaptation to NEMO 8 8 !! 3.0 ! 2007-07 (D. Storkey) Changes to iom_gettime 9 !! 3.4 ! 2012-12 (R. Bourdalle-Badie and G. Reffray) add C1D case 9 !! 3.4 ! 2012-12 (R. Bourdalle-Badie and G. Reffray) add C1D case 10 !! 3.4 ! 2013-04 (J. Harle) added real attribute case 10 11 !!-------------------------------------------------------------------- 11 12 … … 30 31 #if defined key_iomput 31 32 USE sbc_oce, ONLY : nn_fsbc ! ocean space and time domain 32 USE trc_oce, ONLY : nn_dttrc ! !: frequency of step on passive tracers33 33 USE domngb ! ocean space and time domain 34 34 USE phycst ! physical constants 35 35 USE dianam ! build name of file 36 USE xios 36 USE mod_event_client 37 USE mod_attribut 37 38 # endif 38 39 … … 52 53 PRIVATE iom_p1d, iom_p2d, iom_p3d 53 54 #if defined key_iomput 54 PRIVATE iom_set_domain_attr, iom_set_axis_attr, iom_set_field_attr, iom_set_file_attr, iom_set_grid_attr 55 PRIVATE set_grid, set_scalar, set_xmlatt, set_mooring 55 PRIVATE set_grid 56 56 # endif 57 57 … … 60 60 END INTERFACE 61 61 INTERFACE iom_getatt 62 MODULE PROCEDURE iom_g0d_intatt 62 MODULE PROCEDURE iom_g0d_intatt, iom_g0d_ratt 63 63 END INTERFACE 64 64 INTERFACE iom_rstput … … 70 70 #if defined key_iomput 71 71 INTERFACE iom_setkt 72 MODULE PROCEDURE xios_update_calendar72 MODULE PROCEDURE event__set_timestep 73 73 END INTERFACE 74 74 # endif … … 90 90 !!---------------------------------------------------------------------- 91 91 #if defined key_iomput 92 TYPE(xios_time) :: dtime = xios_time(0, 0, 0, 0, 0, 0) 93 CHARACTER(len=19) :: cldate 94 CHARACTER(len=10) :: clname 95 INTEGER :: ji 96 !!---------------------------------------------------------------------- 97 98 clname = "nemo" 99 IF( TRIM(Agrif_CFixed()) /= '0' ) clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname) 100 CALL xios_context_initialize(TRIM(clname), mpi_comm_opa) 92 REAL(wp) :: ztmp 93 !!---------------------------------------------------------------------- 94 !if defined key_adam 95 ! REAL(wp) ,DIMENSION( 2833) :: zlon 96 ! REAL(wp) ,DIMENSION( 2833) :: zlat 97 ! include "NA_lons.h90" 98 ! include "NA_lats.h90" 99 !endif 100 ! read the xml file 101 IF( Agrif_Root() ) CALL event__parse_xml_file( 'iodef.xml' ) ! <- to get from the nameliste (namrun)... 101 102 CALL iom_swap 102 103 103 104 ! calendar parameters 104 105 SELECT CASE ( nleapy ) ! Choose calendar for IOIPSL 105 CASE ( 1) ; CALL xios_set_context_attr(TRIM(clname), calendar_type= "Gregorian")106 CASE ( 0) ; CALL xios_set_context_attr(TRIM(clname), calendar_type= "NoLeap")107 CASE (30) ; CALL xios_set_context_attr(TRIM(clname), calendar_type= "D360")106 CASE ( 1) ; CALL event__set_calendar('gregorian') 107 CASE ( 0) ; CALL event__set_calendar('noleap' ) 108 CASE (30) ; CALL event__set_calendar('360d' ) 108 109 END SELECT 109 WRITE(cldate,"(i4.4,'-',i2.2,'-',i2.2,' 00:00:00')") nyear,nmonth,nday 110 CALL xios_set_context_attr(TRIM(clname), start_date=cldate ) 110 ztmp = fjulday - adatrj 111 IF( ABS(ztmp - REAL(NINT(ztmp),wp)) < 0.1 / rday ) ztmp = REAL(NINT(ztmp),wp) ! avoid truncation error 112 CALL event__set_time_parameters( nit000 - 1, ztmp, rdt ) 111 113 112 114 ! horizontal grid definition 113 115 CALL set_scalar 114 CALL set_grid( "T", glamt, gphit ) 115 CALL set_grid( "U", glamu, gphiu ) 116 CALL set_grid( "V", glamv, gphiv ) 117 CALL set_grid( "W", glamt, gphit ) 116 #if defined key_adam 117 ! CALL set_grid( "grid_A", zlon, zlat ) 118 WRITE(*,*) 'A0' 119 CALL set_adam_mooring 120 WRITE(*,*) 'A1' 121 #endif 122 CALL set_grid( "grid_T", glamt, gphit ) 123 CALL set_grid( "grid_U", glamu, gphiu ) 124 CALL set_grid( "grid_V", glamv, gphiv ) 125 CALL set_grid( "grid_W", glamt, gphit ) 118 126 119 127 ! vertical grid definition 120 CALL iom_set_axis_attr( "deptht", gdept_0 )121 CALL iom_set_axis_attr( "depthu", gdept_0 )122 CALL iom_set_axis_attr( "depthv", gdept_0 )123 CALL iom_set_axis_attr( "depthw", gdepw_0 )128 CALL event__set_vert_axis( "deptht", gdept_0 ) 129 CALL event__set_vert_axis( "depthu", gdept_0 ) 130 CALL event__set_vert_axis( "depthv", gdept_0 ) 131 CALL event__set_vert_axis( "depthw", gdepw_0 ) 124 132 # if defined key_floats 125 CALL iom_set_axis_attr( "nfloat", (ji, ji=1,nfloat))133 CALL event__set_vert_axis( "nfloat", REAL(nfloat,wp) ) 126 134 # endif 127 135 … … 130 138 131 139 ! end file definition 132 dtime%second=rdt 133 CALL xios_set_timestep(dtime) 134 CALL xios_close_context_definition() 135 136 CALL xios_update_calendar(0) 140 CALL event__close_io_definition 137 141 #endif 138 142 … … 147 151 !!--------------------------------------------------------------------- 148 152 #if defined key_iomput 149 TYPE(xios_context) :: nemo_hdl150 153 151 154 IF( TRIM(Agrif_CFixed()) == '0' ) THEN 152 CALL xios_get_handle("nemo",nemo_hdl)155 CALL event__swap_context("nemo") 153 156 ELSE 154 CALL xios_get_handle(TRIM(Agrif_CFixed())//"_nemo",nemo_hdl)157 CALL event__swap_context(TRIM(Agrif_CFixed())//"_nemo") 155 158 ENDIF 156 CALL xios_set_current_context(nemo_hdl)157 159 158 160 #endif … … 360 362 i_s = 1 361 363 i_e = jpmax_files 364 #if defined key_iomput 365 CALL event__stop_ioserver 366 #endif 362 367 ENDIF 363 368 … … 855 860 !! INTERFACE iom_getatt 856 861 !!---------------------------------------------------------------------- 857 SUBROUTINE iom_g0d_intatt( kiomid, cdatt, pvar )862 SUBROUTINE iom_g0d_intatt( kiomid, cdatt, pvar, cdvar ) 858 863 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 859 864 CHARACTER(len=*), INTENT(in ) :: cdatt ! Name of the attribute 860 INTEGER , INTENT( out) :: pvar ! read field 865 INTEGER , INTENT( out) :: pvar ! written field 866 CHARACTER(len=*), INTENT(in ), OPTIONAL :: cdvar ! Name of the variable 861 867 ! 862 868 IF( kiomid > 0 ) THEN … … 864 870 SELECT CASE (iom_file(kiomid)%iolib) 865 871 CASE (jpioipsl ) ; CALL ctl_stop('iom_getatt: only nf90 available') 866 CASE (jpnf90 ) ; CALL iom_nf90_getatt( kiomid, cdatt, pv ar )872 CASE (jpnf90 ) ; CALL iom_nf90_getatt( kiomid, cdatt, pv_i0d=pvar ) 867 873 CASE (jprstdimg) ; CALL ctl_stop('iom_getatt: only nf90 available') 868 874 CASE DEFAULT … … 873 879 END SUBROUTINE iom_g0d_intatt 874 880 881 SUBROUTINE iom_g0d_ratt( kiomid, cdatt, pvar, cdvar ) 882 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 883 CHARACTER(len=*), INTENT(in ) :: cdatt ! Name of the attribute 884 REAL(wp) , INTENT( out) :: pvar ! written field 885 CHARACTER(len=*), INTENT(in ), OPTIONAL :: cdvar ! Name of the variable 886 ! 887 IF( kiomid > 0 ) THEN 888 IF( iom_file(kiomid)%nfid > 0 ) THEN 889 SELECT CASE (iom_file(kiomid)%iolib) 890 CASE (jpioipsl ) ; CALL ctl_stop('iom_getatt: only nf90 available') 891 CASE (jpnf90 ) ; IF( PRESENT(cdvar) ) THEN 892 CALL iom_nf90_getatt( kiomid, cdatt, pv_r0d=pvar, cdvar=cdvar ) 893 ELSE 894 CALL iom_nf90_getatt( kiomid, cdatt, pv_r0d=pvar ) 895 ENDIF 896 CASE (jprstdimg) ; CALL ctl_stop('iom_getatt: only nf90 available') 897 CASE DEFAULT 898 CALL ctl_stop( 'iom_g0d_att: accepted IO library are only jpioipsl, jpnf90 and jprstdimg' ) 899 END SELECT 900 ENDIF 901 ENDIF 902 END SUBROUTINE iom_g0d_ratt 875 903 876 904 !!---------------------------------------------------------------------- … … 973 1001 REAL(wp) , INTENT(in) :: pfield0d 974 1002 #if defined key_iomput 975 CALL xios_send_field(cdname, (/pfield0d/))1003 CALL event__write_field2D( cdname, RESHAPE( (/pfield0d/), (/1,1/) ) ) 976 1004 #else 977 1005 IF( .FALSE. ) WRITE(numout,*) cdname, pfield0d ! useless test to avoid compilation warnings … … 982 1010 CHARACTER(LEN=*) , INTENT(in) :: cdname 983 1011 REAL(wp), DIMENSION(:), INTENT(in) :: pfield1d 1012 INTEGER :: jpz 984 1013 #if defined key_iomput 985 CALL xios_send_field( cdname, RESHAPE( (/pfield1d/), (/1,1,SIZE(pfield1d)/) ) ) 1014 jpz=SIZE(pfield1d) 1015 CALL event__write_field3D( cdname, RESHAPE( (/pfield1d/), (/1,1,jpz/) ) ) 986 1016 #else 987 1017 IF( .FALSE. ) WRITE(numout,*) cdname, pfield1d ! useless test to avoid compilation warnings … … 993 1023 REAL(wp), DIMENSION(:,:), INTENT(in) :: pfield2d 994 1024 #if defined key_iomput 995 CALL xios_send_field(cdname, pfield2d)1025 CALL event__write_field2D( cdname, pfield2d(nldi:nlei, nldj:nlej) ) 996 1026 #else 997 1027 IF( .FALSE. ) WRITE(numout,*) cdname, pfield2d ! useless test to avoid compilation warnings … … 1003 1033 REAL(wp), DIMENSION(:,:,:), INTENT(in) :: pfield3d 1004 1034 #if defined key_iomput 1005 CALL xios_send_field(cdname, pfield3d)1035 CALL event__write_field3D( cdname, pfield3d(nldi:nlei, nldj:nlej, :) ) 1006 1036 #else 1007 1037 IF( .FALSE. ) WRITE(numout,*) cdname, pfield3d ! useless test to avoid compilation warnings … … 1013 1043 #if defined key_iomput 1014 1044 1015 SUBROUTINE iom_set_domain_attr( cdname, ni_glo, nj_glo, ibegin, jbegin, ni, nj, zoom_ibegin, zoom_jbegin, zoom_ni, zoom_nj, & 1016 & data_dim, data_ibegin, data_ni, data_jbegin, data_nj, lonvalue, latvalue, mask ) 1017 CHARACTER(LEN=*) , INTENT(in) :: cdname 1018 INTEGER , OPTIONAL, INTENT(in) :: ni_glo, nj_glo, ibegin, jbegin, ni, nj 1019 INTEGER , OPTIONAL, INTENT(in) :: data_dim, data_ibegin, data_ni, data_jbegin, data_nj 1020 INTEGER , OPTIONAL, INTENT(in) :: zoom_ibegin, zoom_jbegin, zoom_ni, zoom_nj 1021 REAL(wp), DIMENSION(:) , OPTIONAL, INTENT(in) :: lonvalue, latvalue 1022 LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(in) :: mask 1023 1024 IF ( xios_is_valid_domain (cdname) ) THEN 1025 CALL xios_set_domain_attr ( cdname, ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, jbegin=jbegin, ni=ni, nj=nj, & 1026 & data_dim=data_dim, data_ibegin=data_ibegin, data_ni=data_ni, data_jbegin=data_jbegin, data_nj=data_nj , & 1027 & zoom_ibegin=zoom_ibegin, zoom_jbegin=zoom_jbegin, zoom_ni=zoom_ni, zoom_nj=zoom_nj, & 1028 & lonvalue=lonvalue, latvalue=latvalue,mask=mask ) 1029 ENDIF 1030 1031 IF ( xios_is_valid_domaingroup(cdname) ) THEN 1032 CALL xios_set_domaingroup_attr( cdname, ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, jbegin=jbegin, ni=ni, nj=nj, & 1033 & data_dim=data_dim, data_ibegin=data_ibegin, data_ni=data_ni, data_jbegin=data_jbegin, data_nj=data_nj , & 1034 & zoom_ibegin=zoom_ibegin, zoom_jbegin=zoom_jbegin, zoom_ni=zoom_ni, zoom_nj=zoom_nj, & 1035 & lonvalue=lonvalue, latvalue=latvalue,mask=mask ) 1036 ENDIF 1037 1038 END SUBROUTINE iom_set_domain_attr 1039 1040 1041 SUBROUTINE iom_set_axis_attr( cdname, paxis ) 1042 CHARACTER(LEN=*) , INTENT(in) :: cdname 1043 REAL(wp), DIMENSION(:), INTENT(in) :: paxis 1044 IF ( xios_is_valid_axis (cdname) ) CALL xios_set_axis_attr ( cdname, size=size(paxis),value=paxis ) 1045 IF ( xios_is_valid_axisgroup(cdname) ) CALL xios_set_axisgroup_attr( cdname, size=size(paxis),value=paxis ) 1046 END SUBROUTINE iom_set_axis_attr 1047 1048 1049 SUBROUTINE iom_set_field_attr( cdname, freq_op) 1050 CHARACTER(LEN=*) , INTENT(in) :: cdname 1051 CHARACTER(LEN=*),OPTIONAL , INTENT(in) :: freq_op 1052 IF ( xios_is_valid_field (cdname) ) CALL xios_set_field_attr ( cdname, freq_op=freq_op ) 1053 IF ( xios_is_valid_fieldgroup(cdname) ) CALL xios_set_fieldgroup_attr( cdname, freq_op=freq_op ) 1054 END SUBROUTINE iom_set_field_attr 1055 1056 1057 SUBROUTINE iom_set_file_attr( cdname, name, name_suffix ) 1058 CHARACTER(LEN=*) , INTENT(in) :: cdname 1059 CHARACTER(LEN=*),OPTIONAL , INTENT(in) :: name, name_suffix 1060 IF ( xios_is_valid_file (cdname) ) CALL xios_set_file_attr ( cdname, name=name, name_suffix=name_suffix ) 1061 IF ( xios_is_valid_filegroup(cdname) ) CALL xios_set_filegroup_attr( cdname, name=name, name_suffix=name_suffix ) 1062 END SUBROUTINE iom_set_file_attr 1063 1064 1065 SUBROUTINE iom_set_grid_attr( cdname, mask ) 1066 CHARACTER(LEN=*) , INTENT(in) :: cdname 1067 LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(in) :: mask 1068 IF ( xios_is_valid_grid (cdname) ) CALL xios_set_grid_attr ( cdname, mask=mask ) 1069 IF ( xios_is_valid_gridgroup(cdname) ) CALL xios_set_gridgroup_attr( cdname, mask=mask ) 1070 END SUBROUTINE iom_set_grid_attr 1071 1072 1073 SUBROUTINE set_grid( cdgrd, plon, plat ) 1045 SUBROUTINE set_grid( cdname, plon, plat ) 1074 1046 !!---------------------------------------------------------------------- 1075 1047 !! *** ROUTINE *** … … 1078 1050 !! 1079 1051 !!---------------------------------------------------------------------- 1080 CHARACTER(LEN= 1) , INTENT(in) :: cdgrd1052 CHARACTER(LEN=*) , INTENT(in) :: cdname 1081 1053 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: plon 1082 1054 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: plat 1083 ! 1084 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmask 1085 INTEGER :: ni,nj 1086 1087 ni=nlei-nldi+1 ; nj=nlej-nldj+1 1088 1089 CALL iom_set_domain_attr("grid_"//cdgrd, ni_glo=jpiglo, nj_glo=jpjglo, ibegin=nimpp+nldi-1, jbegin=njmpp+nldj-1, ni=ni, nj=nj) 1090 CALL iom_set_domain_attr("grid_"//cdgrd, data_dim=2, data_ibegin = 1-nldi, data_ni = jpi, data_jbegin = 1-nldj, data_nj = jpj) 1091 CALL iom_set_domain_attr("grid_"//cdgrd, lonvalue = RESHAPE(plon(nldi:nlei, nldj:nlej),(/ ni*nj /)), & 1092 & latvalue = RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /))) 1093 1094 IF ( ln_mskland ) THEN 1095 ! mask land points, keep values on coast line -> specific mask for U, V and W points 1096 SELECT CASE ( cdgrd ) 1097 CASE('T') ; zmask(:,:,:) = tmask(:,:,:) 1098 CASE('U') ; zmask(2:jpim1,:,:) = tmask(2:jpim1,:,:) + tmask(3:jpi,:,:) ; CALL lbc_lnk( zmask, 'U', 1. ) 1099 CASE('V') ; zmask(:,2:jpjm1,:) = tmask(:,2:jpjm1,:) + tmask(:,3:jpi,:) ; CALL lbc_lnk( zmask, 'V', 1. ) 1100 CASE('W') ; zmask(:,:,2:jpk ) = tmask(:,:,1:jpkm1) + tmask(:,:,2:jpk) ; zmask(:,:,1) = tmask(:,:,1) 1101 END SELECT 1102 ! 1103 CALL iom_set_domain_attr( "grid_"//cdgrd , mask = zmask(:,:,1) /= 0. ) 1104 CALL iom_set_grid_attr ( "grid_"//cdgrd//"_3D", mask = zmask(:,:,:) /= 0. ) 1105 ENDIF 1106 1055 1056 CALL event__set_grid_dimension( cdname, jpiglo, jpjglo) 1057 CALL event__set_grid_domain( cdname, nlei-nldi+1, nlej-nldj+1, nimpp+nldi-1, njmpp+nldj-1, & 1058 & plon(nldi:nlei, nldj:nlej), plat(nldi:nlei, nldj:nlej) ) 1059 CALL event__set_grid_type_nemo( cdname ) 1060 1107 1061 END SUBROUTINE set_grid 1108 1062 … … 1117 1071 REAL(wp), DIMENSION(1,1) :: zz = 1. 1118 1072 !!---------------------------------------------------------------------- 1119 CALL iom_set_domain_attr('scalarpoint', ni_glo=jpnij, nj_glo=1, ibegin=narea, jbegin=1, ni=1, nj=1)1120 CALL iom_set_domain_attr('scalarpoint', data_dim=1)1121 CALL iom_set_domain_attr('scalarpoint', lonvalue=(/ zz /), latvalue=(/ zz /))1073 CALL event__set_grid_dimension( 'scalarpoint', jpnij, 1) 1074 CALL event__set_grid_domain ( 'scalarpoint', 1, 1, narea, 1, zz, zz ) 1075 CALL event__set_grid_type_nemo( 'scalarpoint' ) 1122 1076 1123 1077 END SUBROUTINE set_scalar 1124 1078 1079 #if defined key_adam 1080 1081 SUBROUTINE set_adam_mooring 1082 !!---------------------------------------------------------------------- 1083 !! *** ROUTINE *** 1084 !! 1085 !! ** Purpose : define fake grids for adam's mooring data 1086 !! 1087 !!---------------------------------------------------------------------- 1088 REAL(wp) ,DIMENSION( 2833,1) :: zlon 1089 REAL(wp) ,DIMENSION( 2833,1) :: zlat 1090 INTEGER ,DIMENSION( 2833,1) :: ix 1091 INTEGER ,DIMENSION( 2833,1) :: iy 1092 INTEGER :: ji 1093 !!---------------------------------------------------------------------- 1094 # include "NA_lons.h90" 1095 # include "NA_lats.h90" 1096 DO ji = 1, 2833 1097 CALL dom_ngb( zlon(ji), zlat(ji), ix(ji), iy(ji), 'T' ) 1098 ENDDO 1099 ! WRITE(*,*) 'CLOSEST', narea, ix(1), iy(1), zlon(1), zlat(1) 1100 WRITE(*,*) 'a0' 1101 ! CALL event__set_grid_dimension( 'grid_A', 1, 1) 1102 CALL event__set_grid_dimension( 'grid_A', 2833, 1) 1103 ! CALL event__set_grid_dimension( 'scalarpointX', jpnij, 1) 1104 WRITE(*,*) 'a1' 1105 ! CALL event__set_grid_domain ( 'grid_A', 1, 1, ix(1), iy(1), zlon(1), zlat(1) ) 1106 CALL event__set_grid_domain ( 'grid_A', 2833, 1, 1, 1, zlon, zlat ) 1107 ! CALL event__set_grid_domain ( 'scalarpointX', 1, 1, narea, 1, 1, 1 ) 1108 WRITE(*,*) 'a2' 1109 CALL event__set_grid_type_nemo( 'grid_A' ) 1110 ! CALL event__set_grid_type_nemo( 'scalarpointX' ) 1111 WRITE(*,*) 'a3' 1112 1113 END SUBROUTINE set_adam_mooring 1114 1115 #endif 1125 1116 1126 1117 SUBROUTINE set_xmlatt … … 1131 1122 !! 1132 1123 !!---------------------------------------------------------------------- 1124 #if defined key_adam 1125 CHARACTER(len=6),DIMENSION( 9) :: clsuff ! suffix name 1126 #else 1133 1127 CHARACTER(len=6),DIMENSION( 8) :: clsuff ! suffix name 1128 #endif 1134 1129 CHARACTER(len=1),DIMENSION( 3) :: clgrd ! suffix name 1135 1130 CHARACTER(len=50) :: clname ! file name 1136 1131 CHARACTER(len=1) :: cl1 ! 1 character 1137 1132 CHARACTER(len=2) :: cl2 ! 1 character 1138 CHARACTER(len=255) :: tfo1139 1133 INTEGER :: idt ! time-step in seconds 1140 1134 INTEGER :: iddss, ihhss ! number of seconds in 1 day, 1 hour and 1 year … … 1156 1150 1157 1151 ! frequency of the call of iom_put (attribut: freq_op) 1158 tfo = TRIM(i2str(idt))//'s' 1159 CALL iom_set_field_attr('field_definition', freq_op=tfo) 1160 CALL iom_set_field_attr('SBC' , freq_op=TRIM(i2str(idt* nn_fsbc ))//'s') 1161 CALL iom_set_field_attr('ptrc_T', freq_op=TRIM(i2str(idt* nn_dttrc))//'s') 1162 CALL iom_set_field_attr('diad_T', freq_op=TRIM(i2str(idt* nn_dttrc))//'s') 1163 1152 CALL event__set_attribut( 'field_definition', attr( field__freq_op, idt ) ) ! model time-step 1153 CALL event__set_attribut( 'SBC' , attr( field__freq_op, idt * nn_fsbc ) ) ! SBC time-step 1154 1164 1155 ! output file names (attribut: name) 1156 #if defined key_adam 1157 clsuff(:) = (/ 'grid_A', 'grid_T', 'grid_U', 'grid_V', 'grid_W', 'icemod', 'ptrc_T', 'diad_T', 'scalar' /) 1158 #else 1165 1159 clsuff(:) = (/ 'grid_T', 'grid_U', 'grid_V', 'grid_W', 'icemod', 'ptrc_T', 'diad_T', 'scalar' /) 1160 #endif 1161 WRITE(*,*) 'set adam2' 1166 1162 DO jg = 1, SIZE(clsuff) ! grid type 1167 DO jh = 1, 24 ! 1-24 hours 1168 WRITE(cl2,'(i2)') jh 1169 CALL dia_nam( clname, jh * ihhss, clsuff(jg), ldfsec = .TRUE. ) 1170 CALL iom_set_file_attr(TRIM(ADJUSTL(cl2))//'h_'//clsuff(jg), name=TRIM(clname)) 1163 DO jh = 1, 12 ! 1, 2, 3, 4, 6, 12 hours 1164 IF( MOD(12,jh) == 0 ) THEN 1165 WRITE(cl2,'(i2)') jh 1166 CALL dia_nam( clname, jh * ihhss, clsuff(jg), ldfsec = .TRUE. ) 1167 CALL event__set_attribut( TRIM(ADJUSTL(cl2))//'h_'//clsuff(jg), attr( file__name, TRIM(clname) ) ) 1168 ENDIF 1171 1169 END DO 1172 DO jd = 1, 30 ! 1-30days1170 DO jd = 1, 5, 2 ! 1, 3, 5 days 1173 1171 WRITE(cl1,'(i1)') jd 1174 1172 CALL dia_nam( clname, jd * iddss, clsuff(jg), ldfsec = .TRUE. ) 1175 CALL iom_set_file_attr(cl1//'d_'//clsuff(jg), name=TRIM(clname))1173 CALL event__set_attribut( cl1//'d_'//clsuff(jg), attr( file__name, TRIM(clname) ) ) 1176 1174 END DO 1177 DO jm = 1, 11 ! 1-11 months 1178 WRITE(cl1,'(i1)') jm 1179 CALL dia_nam( clname, -jm, clsuff(jg) ) 1180 CALL iom_set_file_attr(cl1//'m_'//clsuff(jg), name=TRIM(clname)) 1175 DO jm = 1, 6 ! 1, 2, 3, 4, 6 months 1176 IF( MOD(6,jm) == 0 ) THEN 1177 WRITE(cl1,'(i1)') jm 1178 CALL dia_nam( clname, -jm, clsuff(jg) ) 1179 CALL event__set_attribut( cl1//'m_'//clsuff(jg), attr( file__name, TRIM(clname) ) ) 1180 ENDIF 1181 1181 END DO 1182 DO jy = 1, 50 ! 1-50 years 1183 WRITE(cl2,'(i2)') jy 1184 CALL dia_nam( clname, -jy * iyymo, clsuff(jg) ) 1185 CALL iom_set_file_attr(TRIM(ADJUSTL(cl2))//'y_'//clsuff(jg), name=TRIM(clname)) 1182 DO jy = 1, 10 ! 1, 2, 5, 10 years 1183 IF( MOD(10,jy) == 0 ) THEN 1184 WRITE(cl2,'(i2)') jy 1185 CALL dia_nam( clname, -jy * iyymo, clsuff(jg) ) 1186 CALL event__set_attribut( TRIM(ADJUSTL(cl2))//'y_'//clsuff(jg), attr( file__name, TRIM(clname) ) ) 1187 ENDIF 1186 1188 END DO 1187 1189 END DO … … 1193 1195 ! Equatorial section (attributs: jbegin, ni, name_suffix) 1194 1196 CALL dom_ngb( 0., 0., ix, iy, cl1 ) 1195 CALL iom_set_domain_attr('Eq'//cl1, zoom_jbegin=iy, zoom_ni=jpiglo) 1196 CALL iom_set_file_attr('Eq'//cl1, name_suffix= '_Eq') 1197 CALL event__set_attribut( 'Eq'//cl1, attr( zoom__jbegin , iy ) ) 1198 CALL event__set_attribut( 'Eq'//cl1, attr( zoom__ni , jpiglo ) ) 1199 CALL event__set_attribut( 'Eq'//cl1, attr( file__name_suffix, '_Eq' ) ) 1197 1200 END DO 1198 1201 ! TAO moorings (attributs: ibegin, jbegin, name_suffix) … … 1209 1212 CALL set_mooring( zlonpira, zlatpira ) 1210 1213 1214 WRITE(*,*) 'set adam3' 1211 1215 END SUBROUTINE set_xmlatt 1212 1216 … … 1269 1273 ENDIF 1270 1274 clname = TRIM(ADJUSTL(clat))//TRIM(ADJUSTL(clon)) 1271 CALL iom_set_domain_attr(TRIM(clname)//cl1, zoom_ibegin= ix, zoom_jbegin= iy) 1272 CALL iom_set_file_attr(TRIM(clname)//cl1, name_suffix= '_'//TRIM(clname)) 1275 CALL event__set_attribut( TRIM(clname)//cl1, attr( zoom__ibegin , ix ) ) 1276 CALL event__set_attribut( TRIM(clname)//cl1, attr( zoom__jbegin , iy ) ) 1277 CALL event__set_attribut( TRIM(clname)//cl1, attr( file__name_suffix, '_'//TRIM(clname) ) ) 1273 1278 END DO 1274 1279 END DO … … 1286 1291 #endif 1287 1292 1288 FUNCTION i2str(int) 1289 IMPLICIT NONE 1290 INTEGER, INTENT(IN) :: int 1291 CHARACTER(LEN=255) :: i2str 1292 1293 WRITE(i2str,*) int 1294 1295 END FUNCTION i2str 1296 1293 1297 1294 !!====================================================================== 1298 1295 END MODULE iom -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/iom_def.F90
r3680 r6736 43 43 INTEGER, PARAMETER, PUBLIC :: jp_i1 = 204 !: write INTEGER(1) 44 44 45 INTEGER, PARAMETER, PUBLIC :: jpmax_files = 100 !: maximum number of simultaneously opened file45 INTEGER, PARAMETER, PUBLIC :: jpmax_files = 50 !: maximum number of simultaneously opened file 46 46 INTEGER, PARAMETER, PUBLIC :: jpmax_vars = 360 !: maximum number of variables in one file 47 47 INTEGER, PARAMETER, PUBLIC :: jpmax_dims = 4 !: maximum number of dimensions for one variable -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/iom_nf90.F90
r2715 r6736 7 7 !! 9.0 ! 06 02 (S. Masson) Adaptation to NEMO 8 8 !! " ! 07 07 (D. Storkey) Changes to iom_nf90_gettime 9 !! ! 13 04 (J. Harle) Additions to iom_nf90_getatt 9 10 !!-------------------------------------------------------------------- 10 11 !!gm caution add !DIR nec: improved performance to be checked as well as no result changes … … 35 36 END INTERFACE 36 37 INTERFACE iom_nf90_getatt 37 MODULE PROCEDURE iom_nf90_ intatt38 MODULE PROCEDURE iom_nf90_att 38 39 END INTERFACE 39 40 INTERFACE iom_nf90_rstput … … 308 309 309 310 310 SUBROUTINE iom_nf90_ intatt( kiomid, cdatt, pvar)311 !!----------------------------------------------------------------------- 312 !! *** ROUTINE iom_nf90_ intatt ***311 SUBROUTINE iom_nf90_att( kiomid, cdatt, pv_i0d, pv_r0d, cdvar) 312 !!----------------------------------------------------------------------- 313 !! *** ROUTINE iom_nf90_att *** 313 314 !! 314 315 !! ** Purpose : read an integer attribute with NF90 … … 316 317 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 317 318 CHARACTER(len=*), INTENT(in ) :: cdatt ! attribute name 318 INTEGER , INTENT( out) :: pvar ! read field 319 INTEGER , INTENT( out), OPTIONAL :: pv_i0d ! read field 320 REAL(wp), INTENT( out), OPTIONAL :: pv_r0d ! read field 321 CHARACTER(len=*), INTENT(in ), OPTIONAL :: cdvar ! name of the variable 319 322 ! 320 323 INTEGER :: if90id ! temporary integer 324 INTEGER :: ivarid ! NetCDF variable Id 321 325 LOGICAL :: llok ! temporary logical 322 326 CHARACTER(LEN=100) :: clinfo ! info character … … 324 328 ! 325 329 if90id = iom_file(kiomid)%nfid 326 llok = NF90_Inquire_attribute(if90id, NF90_GLOBAL, cdatt) == nf90_noerr 330 IF( PRESENT(cdvar) ) THEN 331 llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr ! does the variable exist in the file 332 IF( llok ) THEN 333 llok = NF90_Inquire_attribute(if90id, ivarid, cdatt) == nf90_noerr 334 ELSE 335 CALL ctl_warn('iom_nf90_getatt: no variable '//cdvar//' found') 336 ENDIF 337 ELSE 338 llok = NF90_Inquire_attribute(if90id, NF90_GLOBAL, cdatt) == nf90_noerr 339 ENDIF 340 ! 327 341 IF( llok) THEN 328 342 clinfo = 'iom_nf90_getatt, file: '//TRIM(iom_file(kiomid)%name)//', att: '//TRIM(cdatt) 329 CALL iom_nf90_check(NF90_GET_ATT(if90id, NF90_GLOBAL, cdatt, values=pvar), clinfo) 343 IF( PRESENT(pv_r0d) ) THEN 344 IF( PRESENT(cdvar) ) THEN 345 CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values=pv_r0d), clinfo) 346 ELSE 347 CALL iom_nf90_check(NF90_GET_ATT(if90id, NF90_GLOBAL, cdatt, values=pv_r0d), clinfo) 348 ENDIF 349 ELSE 350 IF( PRESENT(cdvar) ) THEN 351 CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values=pv_i0d), clinfo) 352 ELSE 353 CALL iom_nf90_check(NF90_GET_ATT(if90id, NF90_GLOBAL, cdatt, values=pv_i0d), clinfo) 354 ENDIF 355 ENDIF 330 356 ELSE 331 357 CALL ctl_warn('iom_nf90_getatt: no attribute '//cdatt//' found') 332 pvar = -999 358 IF( PRESENT(pv_r0d) ) THEN 359 pv_r0d = -999._wp 360 ELSE 361 pv_i0d = -999 362 ENDIF 333 363 ENDIF 334 364 ! 335 END SUBROUTINE iom_nf90_ intatt365 END SUBROUTINE iom_nf90_att 336 366 337 367 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/prtctl.F90
r3680 r6736 8 8 !!---------------------------------------------------------------------- 9 9 USE dom_oce ! ocean space and time domain variables 10 #if defined key_nemocice_decomp11 USE ice_domain_size, only: nx_global, ny_global12 #endif13 10 USE in_out_manager ! I/O manager 14 11 USE lib_mpp ! distributed memory computing … … 33 30 PUBLIC prt_ctl_info ! called by all subroutines 34 31 PUBLIC prt_ctl_init ! called by opa.F90 35 PUBLIC sub_dom ! called by opa.F9036 32 37 33 !!---------------------------------------------------------------------- … … 423 419 nrecil, nrecjl, nldil, nleil, nldjl, nlejl 424 420 425 INTEGER, POINTER, DIMENSION(:,:):: iimpptl, ijmpptl, ilcitl, ilcjtl ! workspace421 INTEGER, DIMENSION(:,:), ALLOCATABLE :: iimpptl, ijmpptl, ilcitl, ilcjtl ! workspace 426 422 REAL(wp) :: zidom, zjdom ! temporary scalars 427 423 !!---------------------------------------------------------------------- 428 424 429 !430 CALL wrk_alloc( isplt, jsplt, ilcitl, ilcjtl, iimpptl, ijmpptl )431 !432 425 ! 1. Dimension arrays for subdomains 433 426 ! ----------------------------------- … … 438 431 ! array (cf. par_oce.F90). 439 432 433 ijpi = ( jpiglo-2*jpreci + (isplt-1) ) / isplt + 2*jpreci 440 434 #if defined key_nemocice_decomp 441 ijpi = ( nx_global+2-2*jpreci + (isplt-1) ) / isplt + 2*jpreci 442 ijpj = ( ny_global+2-2*jprecj + (jsplt-1) ) / jsplt + 2*jprecj 435 ijpj = ( jpjglo+1-2*jprecj + (jsplt-1) ) / jsplt + 2*jprecj 443 436 #else 444 ijpi = ( jpiglo-2*jpreci + (isplt-1) ) / isplt + 2*jpreci445 437 ijpj = ( jpjglo-2*jprecj + (jsplt-1) ) / jsplt + 2*jprecj 446 438 #endif 447 439 440 ALLOCATE(ilcitl (isplt,jsplt)) 441 ALLOCATE(ilcjtl (isplt,jsplt)) 448 442 449 443 nrecil = 2 * jpreci … … 518 512 ! ------------------------------- 519 513 514 ALLOCATE(iimpptl(isplt,jsplt)) 515 ALLOCATE(ijmpptl(isplt,jsplt)) 516 520 517 iimpptl(:,:) = 1 521 518 ijmpptl(:,:) = 1 … … 575 572 END DO 576 573 ! 577 ! 578 CALL wrk_dealloc( isplt, jsplt, ilcitl, ilcjtl, iimpptl, ijmpptl ) 579 ! 574 DEALLOCATE( iimpptl, ijmpptl, ilcitl, ilcjtl ) 580 575 ! 581 576 END SUBROUTINE sub_dom -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/restart.F90
r3680 r6736 24 24 USE trdmld_oce ! ocean active mixed layer tracers trends variables 25 25 USE domvvl ! variable volume 26 USE divcur ! hor. divergence and curl (div & cur routines)27 26 28 27 IMPLICIT NONE … … 32 31 PUBLIC rst_write ! routine called by step module 33 32 PUBLIC rst_read ! routine called by opa module 33 34 LOGICAL, PUBLIC :: lrst_oce = .FALSE. !: logical to control the oce restart write 35 INTEGER, PUBLIC :: numror, numrow !: logical unit for cean restart (read and write) 34 36 35 37 !! * Substitutions … … 119 121 CALL iom_rstput( kt, nitrst, numrow, 'hdivb' , hdivb ) 120 122 CALL iom_rstput( kt, nitrst, numrow, 'sshb' , sshb ) 121 IF( lk_vvl ) CALL iom_rstput( kt, nitrst, numrow, 'fse3t_b', fse3t_b(:,:,:) ) 123 #if ! defined key_jth_fix 124 IF( lk_vvl ) CALL iom_rstput( kt, nitrst, numrow, 'fse3t_b', fse3t_b(:,:,:) ) 125 #endif 122 126 ! 123 127 CALL iom_rstput( kt, nitrst, numrow, 'un' , un ) ! now fields … … 181 185 ENDIF 182 186 ! 183 IF( iom_varid( numror, 'ub', ldstop = .FALSE. ) > 0 ) THEN 184 CALL iom_get( numror, jpdom_autoglo, 'ub' , ub ) ! before fields 185 CALL iom_get( numror, jpdom_autoglo, 'vb' , vb ) 186 CALL iom_get( numror, jpdom_autoglo, 'tb' , tsb(:,:,:,jp_tem) ) 187 CALL iom_get( numror, jpdom_autoglo, 'sb' , tsb(:,:,:,jp_sal) ) 188 CALL iom_get( numror, jpdom_autoglo, 'rotb' , rotb ) 189 CALL iom_get( numror, jpdom_autoglo, 'hdivb' , hdivb ) 190 CALL iom_get( numror, jpdom_autoglo, 'sshb' , sshb ) 191 IF( lk_vvl ) CALL iom_get( numror, jpdom_autoglo, 'fse3t_b', fse3t_b(:,:,:) ) 192 ELSE 193 neuler = 0 194 ENDIF 195 ! 196 CALL iom_get( numror, jpdom_autoglo, 'un' , un ) ! now fields 197 CALL iom_get( numror, jpdom_autoglo, 'vn' , vn ) 198 CALL iom_get( numror, jpdom_autoglo, 'tn' , tsn(:,:,:,jp_tem) ) 199 CALL iom_get( numror, jpdom_autoglo, 'sn' , tsn(:,:,:,jp_sal) ) 200 CALL iom_get( numror, jpdom_autoglo, 'sshn' , sshn ) 201 IF( iom_varid( numror, 'rotn', ldstop = .FALSE. ) > 0 ) THEN 202 CALL iom_get( numror, jpdom_autoglo, 'rotn' , rotn ) 203 CALL iom_get( numror, jpdom_autoglo, 'hdivn' , hdivn ) 204 ELSE 205 CALL div_cur( 0 ) ! Horizontal divergence & Relative vorticity 206 ENDIF 207 IF( iom_varid( numror, 'rhop', ldstop = .FALSE. ) > 0 ) THEN 208 CALL iom_get( numror, jpdom_autoglo, 'rhop' , rhop ) ! now potential density 209 ELSE 210 CALL eos ( tsn, rhd, rhop ) 211 ENDIF 187 CALL iom_get( numror, jpdom_autoglo, 'ub' , ub ) ! before fields 188 CALL iom_get( numror, jpdom_autoglo, 'vb' , vb ) 189 CALL iom_get( numror, jpdom_autoglo, 'tb' , tsb(:,:,:,jp_tem) ) 190 CALL iom_get( numror, jpdom_autoglo, 'sb' , tsb(:,:,:,jp_sal) ) 191 CALL iom_get( numror, jpdom_autoglo, 'rotb' , rotb ) 192 CALL iom_get( numror, jpdom_autoglo, 'hdivb' , hdivb ) 193 CALL iom_get( numror, jpdom_autoglo, 'sshb' , sshb ) 194 #if ! defined key_jth_fix 195 IF( lk_vvl ) THEN 196 DO jk = 1, jpk 197 fse3t_b(:,:,jk) = fse3t_n(:,:,jk) 198 END DO 199 ENDIF 200 IF( lk_vvl .AND. ln_fse3t_b ) CALL iom_get( numror, jpdom_autoglo, 'fse3t_b', fse3t_b(:,:,:) ) 201 #endif 202 ! 203 CALL iom_get( numror, jpdom_autoglo, 'un' , un ) ! now fields 204 CALL iom_get( numror, jpdom_autoglo, 'vn' , vn ) 205 CALL iom_get( numror, jpdom_autoglo, 'tn' , tsn(:,:,:,jp_tem) ) 206 CALL iom_get( numror, jpdom_autoglo, 'sn' , tsn(:,:,:,jp_sal) ) 207 CALL iom_get( numror, jpdom_autoglo, 'rotn' , rotn ) 208 CALL iom_get( numror, jpdom_autoglo, 'hdivn' , hdivn ) 209 CALL iom_get( numror, jpdom_autoglo, 'sshn' , sshn ) 210 CALL iom_get( numror, jpdom_autoglo, 'rhop' , rhop ) ! now potential density 212 211 #if defined key_zdfkpp 213 212 IF( iom_varid( numror, 'rhd', ldstop = .FALSE. ) > 0 ) THEN 214 CALL iom_get( numror, jpdom_autoglo, 'rhd' , rhd ) ! now in situ density anomaly213 CALL iom_get( numror, jpdom_autoglo, 'rhd' , rhd ) ! now in situ density anomaly 215 214 ELSE 216 CALL eos( tsn, rhd ) ! compute rhd215 CALL eos( tsn, rhd ) ! compute rhd 217 216 ENDIF 218 217 #endif … … 225 224 hdivb(:,:,:) = hdivn(:,:,:) 226 225 sshb (:,:) = sshn (:,:) 226 #if ! defined key_jth_fix 227 227 IF( lk_vvl ) THEN 228 228 DO jk = 1, jpk … … 230 230 END DO 231 231 ENDIF 232 #endif 232 233 ENDIF 233 234 ! -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LBC/lbclnk.F90
r3768 r6736 7 7 !! NEMO 1.0 ! 2002-09 (G. Madec) F90: Free form and module 8 8 !! 3.2 ! 2009-03 (R. Benshila) External north fold treatment 9 !! 3.5 ! 2012 (S.Mocavero, I. Epicoco) Add 'lbc_bdy_lnk'10 !! and lbc_obc_lnk' routine to optimize11 !! the BDY/OBC communications12 9 !! 3.4 ! 2012-12 (R. Bourdalle-Badie and G. Reffray) add a C1D case 13 10 !!---------------------------------------------------------------------- … … 18 15 !! lbc_lnk : generic interface for mpp_lnk_3d and mpp_lnk_2d routines defined in lib_mpp 19 16 !! lbc_lnk_e : generic interface for mpp_lnk_2d_e routine defined in lib_mpp 20 !! lbc_bdy_lnk : generic interface for mpp_lnk_bdy_2d and mpp_lnk_bdy_3d routines defined in lib_mpp21 !! lbc_obc_lnk : generic interface for mpp_lnk_obc_2d and mpp_lnk_obc_3d routines defined in lib_mpp22 17 !!---------------------------------------------------------------------- 23 18 USE lib_mpp ! distributed memory computing library … … 27 22 END INTERFACE 28 23 29 INTERFACE lbc_bdy_lnk30 MODULE PROCEDURE mpp_lnk_bdy_2d, mpp_lnk_bdy_3d31 END INTERFACE32 INTERFACE lbc_obc_lnk33 MODULE PROCEDURE mpp_lnk_obc_2d, mpp_lnk_obc_3d34 END INTERFACE35 36 24 INTERFACE lbc_lnk_e 37 25 MODULE PROCEDURE mpp_lnk_2d_e … … 40 28 PUBLIC lbc_lnk ! ocean lateral boundary conditions 41 29 PUBLIC lbc_lnk_e 42 PUBLIC lbc_bdy_lnk ! ocean lateral BDY boundary conditions43 PUBLIC lbc_obc_lnk ! ocean lateral BDY boundary conditions44 30 45 31 !!---------------------------------------------------------------------- … … 56 42 !! lbc_lnk_3d : set the lateral boundary condition on a 3D variable on ocean mesh 57 43 !! lbc_lnk_2d : set the lateral boundary condition on a 2D variable on ocean mesh 58 !! lbc_bdy_lnk : set the lateral BDY boundary condition59 !! lbc_obc_lnk : set the lateral OBC boundary condition60 44 !!---------------------------------------------------------------------- 61 45 USE oce ! ocean dynamics and tracers … … 72 56 73 57 INTERFACE lbc_lnk_e 74 MODULE PROCEDURE lbc_lnk_2d_e 75 END INTERFACE 76 77 INTERFACE lbc_bdy_lnk 78 MODULE PROCEDURE lbc_bdy_lnk_2d, lbc_bdy_lnk_3d 79 END INTERFACE 80 INTERFACE lbc_obc_lnk 81 MODULE PROCEDURE lbc_lnk_2d, lbc_lnk_3d 58 MODULE PROCEDURE lbc_lnk_2d 82 59 END INTERFACE 83 60 84 61 PUBLIC lbc_lnk ! ocean/ice lateral boundary conditions 85 62 PUBLIC lbc_lnk_e 86 PUBLIC lbc_bdy_lnk ! ocean lateral BDY boundary conditions87 PUBLIC lbc_obc_lnk ! ocean lateral OBC boundary conditions88 63 89 64 !!---------------------------------------------------------------------- … … 283 258 END SUBROUTINE lbc_lnk_3d 284 259 285 SUBROUTINE lbc_bdy_lnk_3d( pt3d, cd_type, psgn, ib_bdy )286 !!---------------------------------------------------------------------287 !! *** ROUTINE lbc_bdy_lnk ***288 !!289 !! ** Purpose : wrapper rountine to 'lbc_lnk_3d'. This wrapper is used290 !! to maintain the same interface with regards to the mpp case291 !!292 !!----------------------------------------------------------------------293 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points294 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pt3d ! 3D array on which the lbc is applied295 REAL(wp) , INTENT(in ) :: psgn ! control of the sign296 INTEGER :: ib_bdy ! BDY boundary set297 !!298 CALL lbc_lnk_3d( pt3d, cd_type, psgn)299 300 END SUBROUTINE lbc_bdy_lnk_3d301 302 SUBROUTINE lbc_bdy_lnk_2d( pt2d, cd_type, psgn, ib_bdy )303 !!---------------------------------------------------------------------304 !! *** ROUTINE lbc_bdy_lnk ***305 !!306 !! ** Purpose : wrapper rountine to 'lbc_lnk_3d'. This wrapper is used307 !! to maintain the same interface with regards to the mpp case308 !!309 !!----------------------------------------------------------------------310 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points311 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pt2d ! 3D array on which the lbc is applied312 REAL(wp) , INTENT(in ) :: psgn ! control of the sign313 INTEGER :: ib_bdy ! BDY boundary set314 !!315 CALL lbc_lnk_2d( pt2d, cd_type, psgn)316 317 END SUBROUTINE lbc_bdy_lnk_2d318 260 319 261 SUBROUTINE lbc_lnk_2d( pt2d, cd_type, psgn, cd_mpp, pval ) … … 406 348 END SUBROUTINE lbc_lnk_2d 407 349 408 SUBROUTINE lbc_lnk_2d_e( pt2d, cd_type, psgn, jpri, jprj )409 !!---------------------------------------------------------------------410 !! *** ROUTINE lbc_lnk_2d ***411 !!412 !! ** Purpose : set lateral boundary conditions on a 2D array (non mpp case)413 !! special dummy routine to allow for use of halo indexing in mpp case414 !!415 !! ** Method : psign = -1 : change the sign across the north fold416 !! = 1 : no change of the sign across the north fold417 !! = 0 : no change of the sign across the north fold and418 !! strict positivity preserved: use inner row/column419 !! for closed boundaries.420 !!----------------------------------------------------------------------421 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points422 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pt2d ! 2D array on which the lbc is applied423 REAL(wp) , INTENT(in ) :: psgn ! control of the sign424 INTEGER , INTENT(in ) :: jpri ! size of extra halo (not needed in non-mpp)425 INTEGER , INTENT(in ) :: jprj ! size of extra halo (not needed in non-mpp)426 !!----------------------------------------------------------------------427 428 CALL lbc_lnk_2d( pt2d, cd_type, psgn )429 !430 END SUBROUTINE lbc_lnk_2d_e431 432 350 # endif 433 351 #endif -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LBC/lib_mpp.F90
r3799 r6736 19 19 !! 3.2 ! 2009 (O. Marti) add mpp_ini_znl 20 20 !! 4.0 ! 2011 (G. Madec) move ctl_ routines from in_out_manager 21 !! 3.5 ! 2012 (S.Mocavero, I. Epicoco) Add 'mpp_lnk_bdy_3d', 'mpp_lnk_obc_3d',22 !! 'mpp_lnk_bdy_2d' and 'mpp_lnk_obc_2d' routines and update23 !! the mppobc routine to optimize the BDY and OBC communications24 21 !!---------------------------------------------------------------------- 25 22 … … 70 67 PUBLIC mppobc, mpp_ini_ice, mpp_ini_znl 71 68 PUBLIC mppsize 72 PUBLIC mppsend, mpprecv ! needed by TAM and ICB routines 73 PUBLIC lib_mpp_alloc ! Called in nemogcm.F90 74 PUBLIC mpp_lnk_bdy_2d, mpp_lnk_bdy_3d 75 PUBLIC mpp_lnk_obc_2d, mpp_lnk_obc_3d 69 PUBLIC lib_mpp_alloc ! Called in nemogcm.F90 70 PUBLIC mppsend, mpprecv ! (PUBLIC for TAM) 76 71 77 72 !! * Interfaces … … 160 155 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE, SAVE :: t2ew, t2we ! 2d for east-west & west-east 161 156 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE, SAVE :: t2p1, t2p2 ! 2d for north fold 157 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE, SAVE :: tr2ns, tr2sn ! 2d for north-south & south-north + extra outer halo 158 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE, SAVE :: tr2ew, tr2we ! 2d for east-west & west-east + extra outer halo 162 159 163 160 ! Arrays used in mpp_lbc_north_3d() … … 206 203 & t2ew(jpj,jpreci ,2) , t2we(jpj,jpreci ,2) , & 207 204 & t2p1(jpi,jprecj ,2) , t2p2(jpi,jprecj ,2) , & 205 ! 206 & tr2ns(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) , & 207 & tr2sn(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) , & 208 & tr2ew(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2) , & 209 & tr2we(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2) , & 208 210 ! 209 211 & ztab(jpiglo,4,jpk) , znorthloc(jpi,4,jpk) , znorthgloio(jpi,4,jpk,jpni) , & … … 353 355 END FUNCTION mynode 354 356 355 SUBROUTINE mpp_lnk_obc_3d( ptab, cd_type, psgn ) 356 !!---------------------------------------------------------------------- 357 !! *** routine mpp_lnk_obc_3d *** 357 358 SUBROUTINE mpp_lnk_3d( ptab, cd_type, psgn, cd_mpp, pval ) 359 !!---------------------------------------------------------------------- 360 !! *** routine mpp_lnk_3d *** 358 361 !! 359 362 !! ** Purpose : Message passing manadgement 360 363 !! 361 !! ** Method : Use mppsend and mpprecv function for passing OBC boundaries364 !! ** Method : Use mppsend and mpprecv function for passing mask 362 365 !! between processors following neighboring subdomains. 363 366 !! domain parameters … … 366 369 !! nbondi : mark for "east-west local boundary" 367 370 !! nbondj : mark for "north-south local boundary" 368 !! noea : number for local neighboring processors 371 !! noea : number for local neighboring processors 369 372 !! nowe : number for local neighboring processors 370 373 !! noso : number for local neighboring processors … … 379 382 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary 380 383 ! ! = 1. , the sign is kept 384 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp ! fill the overlap area only 385 REAL(wp) , OPTIONAL , INTENT(in ) :: pval ! background value (used at closed boundaries) 381 386 !! 382 387 INTEGER :: ji, jj, jk, jl ! dummy loop indices … … 387 392 !!---------------------------------------------------------------------- 388 393 389 zland = 0.e0 ! zero by default 394 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value 395 ELSE ; zland = 0.e0 ! zero by default 396 ENDIF 390 397 391 398 ! 1. standard boundary treatment 392 399 ! ------------------------------ 393 IF( nbondi == 2) THEN 394 IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN 395 ptab( 1 ,:,:) = ptab(jpim1,:,:) 396 ptab(jpi,:,:) = ptab( 2 ,:,:) 397 ELSE 398 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point 399 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north 400 ENDIF 401 ELSEIF(nbondi == -1) THEN 402 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point 403 ELSEIF(nbondi == 1) THEN 404 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north 405 ENDIF !* closed 406 407 IF (nbondj == 2 .OR. nbondj == -1) THEN 408 IF( .NOT. cd_type == 'F' ) ptab(:, 1 :jprecj,:) = zland ! south except F-point 409 ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN 410 ptab(:,nlcj-jprecj+1:jpj ,:) = zland ! north 400 IF( PRESENT( cd_mpp ) ) THEN ! only fill added line/raw with existing values 401 ! 402 ! WARNING ptab is defined only between nld and nle 403 DO jk = 1, jpk 404 DO jj = nlcj+1, jpj ! added line(s) (inner only) 405 ptab(nldi :nlei , jj ,jk) = ptab(nldi:nlei, nlej,jk) 406 ptab(1 :nldi-1, jj ,jk) = ptab(nldi , nlej,jk) 407 ptab(nlei+1:nlci , jj ,jk) = ptab( nlei, nlej,jk) 408 END DO 409 DO ji = nlci+1, jpi ! added column(s) (full) 410 ptab(ji ,nldj :nlej ,jk) = ptab( nlei,nldj:nlej,jk) 411 ptab(ji ,1 :nldj-1,jk) = ptab( nlei,nldj ,jk) 412 ptab(ji ,nlej+1:jpj ,jk) = ptab( nlei, nlej,jk) 413 END DO 414 END DO 415 ! 416 ELSE ! standard close or cyclic treatment 417 ! 418 ! ! East-West boundaries 419 ! !* Cyclic east-west 420 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 421 ptab( 1 ,:,:) = ptab(jpim1,:,:) 422 ptab(jpi,:,:) = ptab( 2 ,:,:) 423 ELSE !* closed 424 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point 425 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north 426 ENDIF 427 ! ! North-South boundaries (always closed) 428 IF( .NOT. cd_type == 'F' ) ptab(:, 1 :jprecj,:) = zland ! south except F-point 429 ptab(:,nlcj-jprecj+1:jpj ,:) = zland ! north 430 ! 411 431 ENDIF 412 432 413 433 ! 2. East and west directions exchange 414 434 ! ------------------------------------ 415 ! we play with the neigbours AND the row number because of the periodicity 416 ! 417 IF(nbondj .ne. 0) THEN 435 ! we play with the neigbours AND the row number because of the periodicity 436 ! 418 437 SELECT CASE ( nbondi ) ! Read Dirichlet lateral conditions 419 438 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case) … … 423 442 t3we(:,jl,:,1) = ptab(iihom +jl,:,:) 424 443 END DO 425 END SELECT 444 END SELECT 426 445 ! 427 446 ! ! Migrations 428 447 imigr = jpreci * jpj * jpk 429 448 ! 430 SELECT CASE ( nbondi ) 449 SELECT CASE ( nbondi ) 431 450 CASE ( -1 ) 432 451 CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req1 ) … … 464 483 END DO 465 484 END SELECT 466 ENDIF467 485 468 486 … … 471 489 ! always closed : we play only with the neigbours 472 490 ! 473 IF(nbondi .ne. 0) THEN474 491 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions 475 492 ijhom = nlcj-nrecj … … 483 500 imigr = jprecj * jpi * jpk 484 501 ! 485 SELECT CASE ( nbondj ) 502 SELECT CASE ( nbondj ) 486 503 CASE ( -1 ) 487 504 CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req1 ) … … 495 512 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 496 513 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 497 CASE ( 1 ) 514 CASE ( 1 ) 498 515 CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 499 516 CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) … … 519 536 END DO 520 537 END SELECT 521 ENDIF522 538 523 539 … … 525 541 ! ----------------------- 526 542 ! 527 IF( npolj /= 0 ) THEN543 IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 528 544 ! 529 545 SELECT CASE ( jpni ) … … 534 550 ENDIF 535 551 ! 536 END SUBROUTINE mpp_lnk_ obc_3d537 538 539 SUBROUTINE mpp_lnk_ obc_2d( pt2d, cd_type, psgn)540 !!---------------------------------------------------------------------- 541 !! *** routine mpp_lnk_ obc_2d ***542 !! 552 END SUBROUTINE mpp_lnk_3d 553 554 555 SUBROUTINE mpp_lnk_2d( pt2d, cd_type, psgn, cd_mpp, pval ) 556 !!---------------------------------------------------------------------- 557 !! *** routine mpp_lnk_2d *** 558 !! 543 559 !! ** Purpose : Message passing manadgement for 2d array 544 560 !! 545 !! ** Method : Use mppsend and mpprecv function for passing OBC boundaries561 !! ** Method : Use mppsend and mpprecv function for passing mask 546 562 !! between processors following neighboring subdomains. 547 563 !! domain parameters … … 550 566 !! nbondi : mark for "east-west local boundary" 551 567 !! nbondj : mark for "north-south local boundary" 552 !! noea : number for local neighboring processors 568 !! noea : number for local neighboring processors 553 569 !! nowe : number for local neighboring processors 554 570 !! noso : number for local neighboring processors … … 561 577 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary 562 578 ! ! = 1. , the sign is kept 579 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp ! fill the overlap area only 580 REAL(wp) , OPTIONAL , INTENT(in ) :: pval ! background value (used at closed boundaries) 563 581 !! 564 582 INTEGER :: ji, jj, jl ! dummy loop indices … … 569 587 !!---------------------------------------------------------------------- 570 588 571 zland = 0.e0 ! zero by default 589 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value 590 ELSE ; zland = 0.e0 ! zero by default 591 ENDIF 572 592 573 593 ! 1. standard boundary treatment 574 594 ! ------------------------------ 575 595 ! 576 IF( nbondi == 2) THEN 577 IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN 578 pt2d( 1 ,:) = pt2d(jpim1,:) 579 pt2d(jpi,:) = pt2d( 2 ,:) 580 ELSE 581 IF( .NOT. cd_type == 'F' ) pt2d( 1 :jpreci,:) = zland ! south except F-point 582 pt2d(nlci-jpreci+1:jpi ,:) = zland ! north 583 ENDIF 584 ELSEIF(nbondi == -1) THEN 585 IF( .NOT. cd_type == 'F' ) pt2d( 1 :jpreci,:) = zland ! south except F-point 586 ELSEIF(nbondi == 1) THEN 587 pt2d(nlci-jpreci+1:jpi ,:) = zland ! north 588 ENDIF !* closed 589 590 IF (nbondj == 2 .OR. nbondj == -1) THEN 591 IF( .NOT. cd_type == 'F' ) pt2d(:, 1 :jprecj) = zland ! south except F-point 592 ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN 593 pt2d(:,nlcj-jprecj+1:jpj) = zland ! north 596 IF( PRESENT( cd_mpp ) ) THEN ! only fill added line/raw with existing values 597 ! 598 ! WARNING pt2d is defined only between nld and nle 599 DO jj = nlcj+1, jpj ! added line(s) (inner only) 600 pt2d(nldi :nlei , jj ) = pt2d(nldi:nlei, nlej) 601 pt2d(1 :nldi-1, jj ) = pt2d(nldi , nlej) 602 pt2d(nlei+1:nlci , jj ) = pt2d( nlei, nlej) 603 END DO 604 DO ji = nlci+1, jpi ! added column(s) (full) 605 pt2d(ji ,nldj :nlej ) = pt2d( nlei,nldj:nlej) 606 pt2d(ji ,1 :nldj-1) = pt2d( nlei,nldj ) 607 pt2d(ji ,nlej+1:jpj ) = pt2d( nlei, nlej) 608 END DO 609 ! 610 ELSE ! standard close or cyclic treatment 611 ! 612 ! ! East-West boundaries 613 IF( nbondi == 2 .AND. & ! Cyclic east-west 614 & (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 615 pt2d( 1 ,:) = pt2d(jpim1,:) ! west 616 pt2d(jpi,:) = pt2d( 2 ,:) ! east 617 ELSE ! closed 618 IF( .NOT. cd_type == 'F' ) pt2d( 1 :jpreci,:) = zland ! south except F-point 619 pt2d(nlci-jpreci+1:jpi ,:) = zland ! north 620 ENDIF 621 ! ! North-South boundaries (always closed) 622 IF( .NOT. cd_type == 'F' ) pt2d(:, 1 :jprecj) = zland !south except F-point 623 pt2d(:,nlcj-jprecj+1:jpj ) = zland ! north 624 ! 594 625 ENDIF 595 626 596 627 ! 2. East and west directions exchange 597 628 ! ------------------------------------ 598 ! we play with the neigbours AND the row number because of the periodicity 629 ! we play with the neigbours AND the row number because of the periodicity 599 630 ! 600 631 SELECT CASE ( nbondi ) ! Read Dirichlet lateral conditions … … 694 725 pt2d(:,ijhom+jl) = t2ns(:,jl,2) 695 726 END DO 696 CASE ( 1 )697 DO jl = 1, jprecj698 pt2d(:,jl ) = t2sn(:,jl,2)699 END DO700 END SELECT701 702 703 ! 4. north fold treatment704 ! -----------------------705 !706 IF( npolj /= 0 ) THEN707 !708 SELECT CASE ( jpni )709 CASE ( 1 ) ; CALL lbc_nfd ( pt2d, cd_type, psgn ) ! only 1 northern proc, no mpp710 CASE DEFAULT ; CALL mpp_lbc_north( pt2d, cd_type, psgn ) ! for all northern procs.711 END SELECT712 !713 ENDIF714 !715 END SUBROUTINE mpp_lnk_obc_2d716 717 SUBROUTINE mpp_lnk_3d( ptab, cd_type, psgn, cd_mpp, pval )718 !!----------------------------------------------------------------------719 !! *** routine mpp_lnk_3d ***720 !!721 !! ** Purpose : Message passing manadgement722 !!723 !! ** Method : Use mppsend and mpprecv function for passing mask724 !! between processors following neighboring subdomains.725 !! domain parameters726 !! nlci : first dimension of the local subdomain727 !! nlcj : second dimension of the local subdomain728 !! nbondi : mark for "east-west local boundary"729 !! nbondj : mark for "north-south local boundary"730 !! noea : number for local neighboring processors731 !! nowe : number for local neighboring processors732 !! noso : number for local neighboring processors733 !! nono : number for local neighboring processors734 !!735 !! ** Action : ptab with update value at its periphery736 !!737 !!----------------------------------------------------------------------738 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: ptab ! 3D array on which the boundary condition is applied739 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points740 ! ! = T , U , V , F , W points741 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary742 ! ! = 1. , the sign is kept743 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp ! fill the overlap area only744 REAL(wp) , OPTIONAL , INTENT(in ) :: pval ! background value (used at closed boundaries)745 !!746 INTEGER :: ji, jj, jk, jl ! dummy loop indices747 INTEGER :: imigr, iihom, ijhom ! temporary integers748 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend749 REAL(wp) :: zland750 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend751 !!----------------------------------------------------------------------752 753 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value754 ELSE ; zland = 0.e0 ! zero by default755 ENDIF756 757 ! 1. standard boundary treatment758 ! ------------------------------759 IF( PRESENT( cd_mpp ) ) THEN ! only fill added line/raw with existing values760 !761 ! WARNING ptab is defined only between nld and nle762 DO jk = 1, jpk763 DO jj = nlcj+1, jpj ! added line(s) (inner only)764 ptab(nldi :nlei , jj ,jk) = ptab(nldi:nlei, nlej,jk)765 ptab(1 :nldi-1, jj ,jk) = ptab(nldi , nlej,jk)766 ptab(nlei+1:nlci , jj ,jk) = ptab( nlei, nlej,jk)767 END DO768 DO ji = nlci+1, jpi ! added column(s) (full)769 ptab(ji ,nldj :nlej ,jk) = ptab( nlei,nldj:nlej,jk)770 ptab(ji ,1 :nldj-1,jk) = ptab( nlei,nldj ,jk)771 ptab(ji ,nlej+1:jpj ,jk) = ptab( nlei, nlej,jk)772 END DO773 END DO774 !775 ELSE ! standard close or cyclic treatment776 !777 ! ! East-West boundaries778 ! !* Cyclic east-west779 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN780 ptab( 1 ,:,:) = ptab(jpim1,:,:)781 ptab(jpi,:,:) = ptab( 2 ,:,:)782 ELSE !* closed783 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point784 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north785 ENDIF786 ! ! North-South boundaries (always closed)787 IF( .NOT. cd_type == 'F' ) ptab(:, 1 :jprecj,:) = zland ! south except F-point788 ptab(:,nlcj-jprecj+1:jpj ,:) = zland ! north789 !790 ENDIF791 792 ! 2. East and west directions exchange793 ! ------------------------------------794 ! we play with the neigbours AND the row number because of the periodicity795 !796 SELECT CASE ( nbondi ) ! Read Dirichlet lateral conditions797 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case)798 iihom = nlci-nreci799 DO jl = 1, jpreci800 t3ew(:,jl,:,1) = ptab(jpreci+jl,:,:)801 t3we(:,jl,:,1) = ptab(iihom +jl,:,:)802 END DO803 END SELECT804 !805 ! ! Migrations806 imigr = jpreci * jpj * jpk807 !808 SELECT CASE ( nbondi )809 CASE ( -1 )810 CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req1 )811 CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea )812 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)813 CASE ( 0 )814 CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 )815 CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req2 )816 CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea )817 CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe )818 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)819 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err)820 CASE ( 1 )821 CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 )822 CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe )823 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)824 END SELECT825 !826 ! ! Write Dirichlet lateral conditions827 iihom = nlci-jpreci828 !829 SELECT CASE ( nbondi )830 CASE ( -1 )831 DO jl = 1, jpreci832 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2)833 END DO834 CASE ( 0 )835 DO jl = 1, jpreci836 ptab(jl ,:,:) = t3we(:,jl,:,2)837 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2)838 END DO839 CASE ( 1 )840 DO jl = 1, jpreci841 ptab(jl ,:,:) = t3we(:,jl,:,2)842 END DO843 END SELECT844 845 846 ! 3. North and south directions847 ! -----------------------------848 ! always closed : we play only with the neigbours849 !850 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions851 ijhom = nlcj-nrecj852 DO jl = 1, jprecj853 t3sn(:,jl,:,1) = ptab(:,ijhom +jl,:)854 t3ns(:,jl,:,1) = ptab(:,jprecj+jl,:)855 END DO856 ENDIF857 !858 ! ! Migrations859 imigr = jprecj * jpi * jpk860 !861 SELECT CASE ( nbondj )862 CASE ( -1 )863 CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req1 )864 CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono )865 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)866 CASE ( 0 )867 CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 )868 CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req2 )869 CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono )870 CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso )871 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)872 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err)873 CASE ( 1 )874 CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 )875 CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso )876 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)877 END SELECT878 !879 ! ! Write Dirichlet lateral conditions880 ijhom = nlcj-jprecj881 !882 SELECT CASE ( nbondj )883 CASE ( -1 )884 DO jl = 1, jprecj885 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2)886 END DO887 CASE ( 0 )888 DO jl = 1, jprecj889 ptab(:,jl ,:) = t3sn(:,jl,:,2)890 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2)891 END DO892 CASE ( 1 )893 DO jl = 1, jprecj894 ptab(:,jl,:) = t3sn(:,jl,:,2)895 END DO896 END SELECT897 898 899 ! 4. north fold treatment900 ! -----------------------901 !902 IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN903 !904 SELECT CASE ( jpni )905 CASE ( 1 ) ; CALL lbc_nfd ( ptab, cd_type, psgn ) ! only 1 northern proc, no mpp906 CASE DEFAULT ; CALL mpp_lbc_north( ptab, cd_type, psgn ) ! for all northern procs.907 END SELECT908 !909 ENDIF910 !911 END SUBROUTINE mpp_lnk_3d912 913 914 SUBROUTINE mpp_lnk_2d( pt2d, cd_type, psgn, cd_mpp, pval )915 !!----------------------------------------------------------------------916 !! *** routine mpp_lnk_2d ***917 !!918 !! ** Purpose : Message passing manadgement for 2d array919 !!920 !! ** Method : Use mppsend and mpprecv function for passing mask921 !! between processors following neighboring subdomains.922 !! domain parameters923 !! nlci : first dimension of the local subdomain924 !! nlcj : second dimension of the local subdomain925 !! nbondi : mark for "east-west local boundary"926 !! nbondj : mark for "north-south local boundary"927 !! noea : number for local neighboring processors928 !! nowe : number for local neighboring processors929 !! noso : number for local neighboring processors930 !! nono : number for local neighboring processors931 !!932 !!----------------------------------------------------------------------933 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pt2d ! 2D array on which the boundary condition is applied934 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points935 ! ! = T , U , V , F , W and I points936 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary937 ! ! = 1. , the sign is kept938 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp ! fill the overlap area only939 REAL(wp) , OPTIONAL , INTENT(in ) :: pval ! background value (used at closed boundaries)940 !!941 INTEGER :: ji, jj, jl ! dummy loop indices942 INTEGER :: imigr, iihom, ijhom ! temporary integers943 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend944 REAL(wp) :: zland945 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend946 !!----------------------------------------------------------------------947 948 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value949 ELSE ; zland = 0.e0 ! zero by default950 ENDIF951 952 ! 1. standard boundary treatment953 ! ------------------------------954 !955 IF( PRESENT( cd_mpp ) ) THEN ! only fill added line/raw with existing values956 !957 ! WARNING pt2d is defined only between nld and nle958 DO jj = nlcj+1, jpj ! added line(s) (inner only)959 pt2d(nldi :nlei , jj ) = pt2d(nldi:nlei, nlej)960 pt2d(1 :nldi-1, jj ) = pt2d(nldi , nlej)961 pt2d(nlei+1:nlci , jj ) = pt2d( nlei, nlej)962 END DO963 DO ji = nlci+1, jpi ! added column(s) (full)964 pt2d(ji ,nldj :nlej ) = pt2d( nlei,nldj:nlej)965 pt2d(ji ,1 :nldj-1) = pt2d( nlei,nldj )966 pt2d(ji ,nlej+1:jpj ) = pt2d( nlei, nlej)967 END DO968 !969 ELSE ! standard close or cyclic treatment970 !971 ! ! East-West boundaries972 IF( nbondi == 2 .AND. & ! Cyclic east-west973 & (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN974 pt2d( 1 ,:) = pt2d(jpim1,:) ! west975 pt2d(jpi,:) = pt2d( 2 ,:) ! east976 ELSE ! closed977 IF( .NOT. cd_type == 'F' ) pt2d( 1 :jpreci,:) = zland ! south except F-point978 pt2d(nlci-jpreci+1:jpi ,:) = zland ! north979 ENDIF980 ! ! North-South boundaries (always closed)981 IF( .NOT. cd_type == 'F' ) pt2d(:, 1 :jprecj) = zland !south except F-point982 pt2d(:,nlcj-jprecj+1:jpj ) = zland ! north983 !984 ENDIF985 986 ! 2. East and west directions exchange987 ! ------------------------------------988 ! we play with the neigbours AND the row number because of the periodicity989 !990 SELECT CASE ( nbondi ) ! Read Dirichlet lateral conditions991 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case)992 iihom = nlci-nreci993 DO jl = 1, jpreci994 t2ew(:,jl,1) = pt2d(jpreci+jl,:)995 t2we(:,jl,1) = pt2d(iihom +jl,:)996 END DO997 END SELECT998 !999 ! ! Migrations1000 imigr = jpreci * jpj1001 !1002 SELECT CASE ( nbondi )1003 CASE ( -1 )1004 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req1 )1005 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea )1006 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)1007 CASE ( 0 )1008 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 )1009 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req2 )1010 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea )1011 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe )1012 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)1013 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err)1014 CASE ( 1 )1015 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 )1016 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe )1017 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)1018 END SELECT1019 !1020 ! ! Write Dirichlet lateral conditions1021 iihom = nlci - jpreci1022 !1023 SELECT CASE ( nbondi )1024 CASE ( -1 )1025 DO jl = 1, jpreci1026 pt2d(iihom+jl,:) = t2ew(:,jl,2)1027 END DO1028 CASE ( 0 )1029 DO jl = 1, jpreci1030 pt2d(jl ,:) = t2we(:,jl,2)1031 pt2d(iihom+jl,:) = t2ew(:,jl,2)1032 END DO1033 CASE ( 1 )1034 DO jl = 1, jpreci1035 pt2d(jl ,:) = t2we(:,jl,2)1036 END DO1037 END SELECT1038 1039 1040 ! 3. North and south directions1041 ! -----------------------------1042 ! always closed : we play only with the neigbours1043 !1044 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions1045 ijhom = nlcj-nrecj1046 DO jl = 1, jprecj1047 t2sn(:,jl,1) = pt2d(:,ijhom +jl)1048 t2ns(:,jl,1) = pt2d(:,jprecj+jl)1049 END DO1050 ENDIF1051 !1052 ! ! Migrations1053 imigr = jprecj * jpi1054 !1055 SELECT CASE ( nbondj )1056 CASE ( -1 )1057 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req1 )1058 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono )1059 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)1060 CASE ( 0 )1061 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 )1062 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req2 )1063 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono )1064 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso )1065 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)1066 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err)1067 CASE ( 1 )1068 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 )1069 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso )1070 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)1071 END SELECT1072 !1073 ! ! Write Dirichlet lateral conditions1074 ijhom = nlcj - jprecj1075 !1076 SELECT CASE ( nbondj )1077 CASE ( -1 )1078 DO jl = 1, jprecj1079 pt2d(:,ijhom+jl) = t2ns(:,jl,2)1080 END DO1081 CASE ( 0 )1082 DO jl = 1, jprecj1083 pt2d(:,jl ) = t2sn(:,jl,2)1084 pt2d(:,ijhom+jl) = t2ns(:,jl,2)1085 END DO1086 727 CASE ( 1 ) 1087 728 DO jl = 1, jprecj … … 1300 941 1301 942 1302 SUBROUTINE mpp_lnk_2d_e( pt2d, cd_type, psgn , jpri, jprj)943 SUBROUTINE mpp_lnk_2d_e( pt2d, cd_type, psgn ) 1303 944 !!---------------------------------------------------------------------- 1304 945 !! *** routine mpp_lnk_2d_e *** … … 1311 952 !! nlci : first dimension of the local subdomain 1312 953 !! nlcj : second dimension of the local subdomain 1313 !! jpr i: number of rows for extra outer halo1314 !! jpr j: number of columns for extra outer halo954 !! jpr2di : number of rows for extra outer halo 955 !! jpr2dj : number of columns for extra outer halo 1315 956 !! nbondi : mark for "east-west local boundary" 1316 957 !! nbondj : mark for "north-south local boundary" … … 1321 962 !! 1322 963 !!---------------------------------------------------------------------- 1323 INTEGER , INTENT(in ) :: jpri 1324 INTEGER , INTENT(in ) :: jprj 1325 REAL(wp), DIMENSION(1-jpri:jpi+jpri,1-jprj:jpj+jprj), INTENT(inout) :: pt2d ! 2D array with extra halo 1326 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of ptab array grid-points 1327 ! ! = T , U , V , F , W and I points 1328 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the 1329 !! ! north boundary, = 1. otherwise 964 REAL(wp), DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj), INTENT(inout) :: pt2d ! 2D array with extra halo 965 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of ptab array grid-points 966 ! ! = T , U , V , F , W and I points 967 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the 968 !! ! north boundary, = 1. otherwise 1330 969 INTEGER :: jl ! dummy loop indices 1331 970 INTEGER :: imigr, iihom, ijhom ! temporary integers … … 1333 972 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend 1334 973 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend 1335 !! 1336 REAL(wp), DIMENSION(1-jpri:jpi+jpri,jprecj+jprj,2) :: r2dns 1337 REAL(wp), DIMENSION(1-jpri:jpi+jpri,jprecj+jprj,2) :: r2dsn 1338 REAL(wp), DIMENSION(1-jprj:jpj+jprj,jpreci+jpri,2) :: r2dwe 1339 REAL(wp), DIMENSION(1-jprj:jpj+jprj,jpreci+jpri,2) :: r2dew 1340 !!---------------------------------------------------------------------- 1341 1342 ipreci = jpreci + jpri ! take into account outer extra 2D overlap area 1343 iprecj = jprecj + jprj 974 !!---------------------------------------------------------------------- 975 976 ipreci = jpreci + jpr2di ! take into account outer extra 2D overlap area 977 iprecj = jprecj + jpr2dj 1344 978 1345 979 … … 1349 983 ! 1350 984 ! !* North-South boundaries (always colsed) 1351 IF( .NOT. cd_type == 'F' ) pt2d(:, 1-jpr j : jprecj ) = 0.e0 ! south except at F-point1352 pt2d(:,nlcj-jprecj+1:jpj+jpr j) = 0.e0 ! north985 IF( .NOT. cd_type == 'F' ) pt2d(:, 1-jpr2dj : jprecj ) = 0.e0 ! south except at F-point 986 pt2d(:,nlcj-jprecj+1:jpj+jpr2dj) = 0.e0 ! north 1353 987 1354 988 ! ! East-West boundaries 1355 989 ! !* Cyclic east-west 1356 990 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 1357 pt2d(1-jpr i: 1 ,:) = pt2d(jpim1-jpri: jpim1 ,:) ! east1358 pt2d( jpi :jpi+jpr i,:) = pt2d( 2 :2+jpri,:) ! west991 pt2d(1-jpr2di: 1 ,:) = pt2d(jpim1-jpr2di: jpim1 ,:) ! east 992 pt2d( jpi :jpi+jpr2di,:) = pt2d( 2 :2+jpr2di,:) ! west 1359 993 ! 1360 994 ELSE !* closed 1361 IF( .NOT. cd_type == 'F' ) pt2d( 1-jpr i :jpreci ,:) = 0.e0 ! south except at F-point1362 pt2d(nlci-jpreci+1:jpi+jpr i,:) = 0.e0 ! north995 IF( .NOT. cd_type == 'F' ) pt2d( 1-jpr2di :jpreci ,:) = 0.e0 ! south except at F-point 996 pt2d(nlci-jpreci+1:jpi+jpr2di,:) = 0.e0 ! north 1363 997 ENDIF 1364 998 ! … … 1369 1003 ! 1370 1004 SELECT CASE ( jpni ) 1371 CASE ( 1 ) ; CALL lbc_nfd ( pt2d(1:jpi,1:jpj+jpr j), cd_type, psgn, pr2dj=jprj )1005 CASE ( 1 ) ; CALL lbc_nfd ( pt2d(1:jpi,1:jpj+jpr2dj), cd_type, psgn, pr2dj=jpr2dj ) 1372 1006 CASE DEFAULT ; CALL mpp_lbc_north_e( pt2d , cd_type, psgn ) 1373 1007 END SELECT … … 1381 1015 SELECT CASE ( nbondi ) ! Read Dirichlet lateral conditions 1382 1016 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case) 1383 iihom = nlci-nreci-jpr i1017 iihom = nlci-nreci-jpr2di 1384 1018 DO jl = 1, ipreci 1385 r2dew(:,jl,1) = pt2d(jpreci+jl,:)1386 r2dwe(:,jl,1) = pt2d(iihom +jl,:)1019 tr2ew(:,jl,1) = pt2d(jpreci+jl,:) 1020 tr2we(:,jl,1) = pt2d(iihom +jl,:) 1387 1021 END DO 1388 1022 END SELECT 1389 1023 ! 1390 1024 ! ! Migrations 1391 imigr = ipreci * ( jpj + 2*jpr j)1025 imigr = ipreci * ( jpj + 2*jpr2dj) 1392 1026 ! 1393 1027 SELECT CASE ( nbondi ) 1394 1028 CASE ( -1 ) 1395 CALL mppsend( 2, r2dwe(1-jprj,1,1), imigr, noea, ml_req1 )1396 CALL mpprecv( 1, r2dew(1-jprj,1,2), imigr, noea )1029 CALL mppsend( 2, tr2we(1-jpr2dj,1,1), imigr, noea, ml_req1 ) 1030 CALL mpprecv( 1, tr2ew(1-jpr2dj,1,2), imigr, noea ) 1397 1031 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1398 1032 CASE ( 0 ) 1399 CALL mppsend( 1, r2dew(1-jprj,1,1), imigr, nowe, ml_req1 )1400 CALL mppsend( 2, r2dwe(1-jprj,1,1), imigr, noea, ml_req2 )1401 CALL mpprecv( 1, r2dew(1-jprj,1,2), imigr, noea )1402 CALL mpprecv( 2, r2dwe(1-jprj,1,2), imigr, nowe )1033 CALL mppsend( 1, tr2ew(1-jpr2dj,1,1), imigr, nowe, ml_req1 ) 1034 CALL mppsend( 2, tr2we(1-jpr2dj,1,1), imigr, noea, ml_req2 ) 1035 CALL mpprecv( 1, tr2ew(1-jpr2dj,1,2), imigr, noea ) 1036 CALL mpprecv( 2, tr2we(1-jpr2dj,1,2), imigr, nowe ) 1403 1037 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1404 1038 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 1405 1039 CASE ( 1 ) 1406 CALL mppsend( 1, r2dew(1-jprj,1,1), imigr, nowe, ml_req1 )1407 CALL mpprecv( 2, r2dwe(1-jprj,1,2), imigr, nowe )1040 CALL mppsend( 1, tr2ew(1-jpr2dj,1,1), imigr, nowe, ml_req1 ) 1041 CALL mpprecv( 2, tr2we(1-jpr2dj,1,2), imigr, nowe ) 1408 1042 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1409 1043 END SELECT … … 1415 1049 CASE ( -1 ) 1416 1050 DO jl = 1, ipreci 1417 pt2d(iihom+jl,:) = r2dew(:,jl,2)1051 pt2d(iihom+jl,:) = tr2ew(:,jl,2) 1418 1052 END DO 1419 1053 CASE ( 0 ) 1420 1054 DO jl = 1, ipreci 1421 pt2d(jl-jpr i,:) = r2dwe(:,jl,2)1422 pt2d( iihom+jl,:) = r2dew(:,jl,2)1055 pt2d(jl-jpr2di,:) = tr2we(:,jl,2) 1056 pt2d( iihom+jl,:) = tr2ew(:,jl,2) 1423 1057 END DO 1424 1058 CASE ( 1 ) 1425 1059 DO jl = 1, ipreci 1426 pt2d(jl-jpr i,:) = r2dwe(:,jl,2)1060 pt2d(jl-jpr2di,:) = tr2we(:,jl,2) 1427 1061 END DO 1428 1062 END SELECT … … 1434 1068 ! 1435 1069 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions 1436 ijhom = nlcj-nrecj-jpr j1070 ijhom = nlcj-nrecj-jpr2dj 1437 1071 DO jl = 1, iprecj 1438 r2dsn(:,jl,1) = pt2d(:,ijhom +jl)1439 r2dns(:,jl,1) = pt2d(:,jprecj+jl)1072 tr2sn(:,jl,1) = pt2d(:,ijhom +jl) 1073 tr2ns(:,jl,1) = pt2d(:,jprecj+jl) 1440 1074 END DO 1441 1075 ENDIF 1442 1076 ! 1443 1077 ! ! Migrations 1444 imigr = iprecj * ( jpi + 2*jpr i )1078 imigr = iprecj * ( jpi + 2*jpr2di ) 1445 1079 ! 1446 1080 SELECT CASE ( nbondj ) 1447 1081 CASE ( -1 ) 1448 CALL mppsend( 4, r2dsn(1-jpri,1,1), imigr, nono, ml_req1 )1449 CALL mpprecv( 3, r2dns(1-jpri,1,2), imigr, nono )1082 CALL mppsend( 4, tr2sn(1-jpr2di,1,1), imigr, nono, ml_req1 ) 1083 CALL mpprecv( 3, tr2ns(1-jpr2di,1,2), imigr, nono ) 1450 1084 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1451 1085 CASE ( 0 ) 1452 CALL mppsend( 3, r2dns(1-jpri,1,1), imigr, noso, ml_req1 )1453 CALL mppsend( 4, r2dsn(1-jpri,1,1), imigr, nono, ml_req2 )1454 CALL mpprecv( 3, r2dns(1-jpri,1,2), imigr, nono )1455 CALL mpprecv( 4, r2dsn(1-jpri,1,2), imigr, noso )1086 CALL mppsend( 3, tr2ns(1-jpr2di,1,1), imigr, noso, ml_req1 ) 1087 CALL mppsend( 4, tr2sn(1-jpr2di,1,1), imigr, nono, ml_req2 ) 1088 CALL mpprecv( 3, tr2ns(1-jpr2di,1,2), imigr, nono ) 1089 CALL mpprecv( 4, tr2sn(1-jpr2di,1,2), imigr, noso ) 1456 1090 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1457 1091 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 1458 1092 CASE ( 1 ) 1459 CALL mppsend( 3, r2dns(1-jpri,1,1), imigr, noso, ml_req1 )1460 CALL mpprecv( 4, r2dsn(1-jpri,1,2), imigr, noso )1093 CALL mppsend( 3, tr2ns(1-jpr2di,1,1), imigr, noso, ml_req1 ) 1094 CALL mpprecv( 4, tr2sn(1-jpr2di,1,2), imigr, noso ) 1461 1095 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1462 1096 END SELECT … … 1468 1102 CASE ( -1 ) 1469 1103 DO jl = 1, iprecj 1470 pt2d(:,ijhom+jl) = r2dns(:,jl,2)1104 pt2d(:,ijhom+jl) = tr2ns(:,jl,2) 1471 1105 END DO 1472 1106 CASE ( 0 ) 1473 1107 DO jl = 1, iprecj 1474 pt2d(:,jl-jpr j) = r2dsn(:,jl,2)1475 pt2d(:,ijhom+jl ) = r2dns(:,jl,2)1108 pt2d(:,jl-jpr2dj) = tr2sn(:,jl,2) 1109 pt2d(:,ijhom+jl ) = tr2ns(:,jl,2) 1476 1110 END DO 1477 1111 CASE ( 1 ) 1478 1112 DO jl = 1, iprecj 1479 pt2d(:,jl-jpr j) = r2dsn(:,jl,2)1113 pt2d(:,jl-jpr2dj) = tr2sn(:,jl,2) 1480 1114 END DO 1481 1115 END SELECT … … 2148 1782 INTEGER :: ml_stat(MPI_STATUS_SIZE) ! for key_mpi_isend 2149 1783 REAL(wp), POINTER, DIMENSION(:,:) :: ztab ! temporary workspace 2150 LOGICAL :: lmigr ! is true for those processors that have to migrate the OB2151 1784 !!---------------------------------------------------------------------- 2152 1785 … … 2179 1812 !!gm Remark : this is very time consumming!!! 2180 1813 ! ! ------------------------ ! 2181 IF( ijpt0 > ijpt1 .OR. iipt0 > iipt1 ) THEN2182 ! there is nothing to be migrated2183 lmigr = .FALSE.2184 ELSE2185 lmigr = .TRUE.2186 ENDIF2187 2188 IF( lmigr ) THEN2189 2190 1814 DO jk = 1, kk ! Loop over the levels ! 2191 1815 ! ! ------------------------ ! … … 2209 1833 ! --------------------------- 2210 1834 ! 2211 IF( ktype == 1 ) THEN2212 2213 1835 IF( nbondi /= 2 ) THEN ! Read Dirichlet lateral conditions 2214 1836 iihom = nlci-nreci 2215 t2ew(1:jpreci,1,1) = ztab(jpreci+1:nreci, ijpt0) 2216 t2we(1:jpreci,1,1) = ztab(iihom+1:iihom+jpreci, ijpt0) 1837 DO jl = 1, jpreci 1838 t2ew(:,jl,1) = ztab(jpreci+jl,:) 1839 t2we(:,jl,1) = ztab(iihom +jl,:) 1840 END DO 2217 1841 ENDIF 2218 1842 ! 2219 1843 ! ! Migrations 2220 imigr = jpreci1844 imigr=jpreci*jpj 2221 1845 ! 2222 1846 IF( nbondi == -1 ) THEN … … 2241 1865 ! 2242 1866 IF( nbondi == 0 .OR. nbondi == 1 ) THEN 2243 ztab(1:jpreci, ijpt0) = t2we(1:jpreci,1,2) 1867 DO jl = 1, jpreci 1868 ztab(jl,:) = t2we(:,jl,2) 1869 END DO 2244 1870 ENDIF 2245 1871 IF( nbondi == -1 .OR. nbondi == 0 ) THEN 2246 ztab(iihom+1:iihom+jpreci, ijpt0) = t2ew(1:jpreci,1,2) 1872 DO jl = 1, jpreci 1873 ztab(iihom+jl,:) = t2ew(:,jl,2) 1874 END DO 2247 1875 ENDIF 2248 ENDIF ! (ktype == 1) 1876 2249 1877 2250 1878 ! 2. North and south directions 2251 1879 ! ----------------------------- 2252 1880 ! 2253 IF(ktype == 2 ) THEN2254 1881 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions 2255 1882 ijhom = nlcj-nrecj 2256 t2sn(1:jprecj,1,1) = ztab(iipt0, ijhom+1:ijhom+jprecj) 2257 t2ns(1:jprecj,1,1) = ztab(iipt0, jprecj+1:nrecj) 1883 DO jl = 1, jprecj 1884 t2sn(:,jl,1) = ztab(:,ijhom +jl) 1885 t2ns(:,jl,1) = ztab(:,jprecj+jl) 1886 END DO 2258 1887 ENDIF 2259 1888 ! 2260 1889 ! ! Migrations 2261 imigr = jprecj 1890 imigr = jprecj * jpi 2262 1891 ! 2263 1892 IF( nbondj == -1 ) THEN … … 2281 1910 ijhom = nlcj - jprecj 2282 1911 IF( nbondj == 0 .OR. nbondj == 1 ) THEN 2283 ztab(iipt0,1:jprecj) = t2sn(1:jprecj,1,2) 1912 DO jl = 1, jprecj 1913 ztab(:,jl) = t2sn(:,jl,2) 1914 END DO 2284 1915 ENDIF 2285 1916 IF( nbondj == 0 .OR. nbondj == -1 ) THEN 2286 ztab(iipt0, ijhom+1:ijhom+jprecj) = t2ns(1:jprecj,1,2) 1917 DO jl = 1, jprecj 1918 ztab(:,ijhom+jl) = t2ns(:,jl,2) 1919 END DO 2287 1920 ENDIF 2288 ENDIF ! (ktype == 2)2289 1921 IF( ktype==1 .AND. kd1 <= jpi+nimpp-1 .AND. nimpp <= kd2 ) THEN 2290 1922 DO jj = ijpt0, ijpt1 ! north/south boundaries … … 2303 1935 END DO 2304 1936 ! 2305 ENDIF ! ( lmigr )2306 1937 CALL wrk_dealloc( jpi,jpj, ztab ) 2307 1938 ! … … 2903 2534 END SUBROUTINE mpp_lbc_north_e 2904 2535 2905 SUBROUTINE mpp_lnk_bdy_3d( ptab, cd_type, psgn, ib_bdy )2906 !!----------------------------------------------------------------------2907 !! *** routine mpp_lnk_bdy_3d ***2908 !!2909 !! ** Purpose : Message passing management2910 !!2911 !! ** Method : Use mppsend and mpprecv function for passing BDY boundaries2912 !! between processors following neighboring subdomains.2913 !! domain parameters2914 !! nlci : first dimension of the local subdomain2915 !! nlcj : second dimension of the local subdomain2916 !! nbondi_bdy : mark for "east-west local boundary"2917 !! nbondj_bdy : mark for "north-south local boundary"2918 !! noea : number for local neighboring processors2919 !! nowe : number for local neighboring processors2920 !! noso : number for local neighboring processors2921 !! nono : number for local neighboring processors2922 !!2923 !! ** Action : ptab with update value at its periphery2924 !!2925 !!----------------------------------------------------------------------2926 2927 USE lbcnfd ! north fold2928 2929 INCLUDE 'mpif.h'2930 2931 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: ptab ! 3D array on which the boundary condition is applied2932 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points2933 ! ! = T , U , V , F , W points2934 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary2935 ! ! = 1. , the sign is kept2936 INTEGER , INTENT(in ) :: ib_bdy ! BDY boundary set2937 INTEGER :: ji, jj, jk, jl ! dummy loop indices2938 INTEGER :: imigr, iihom, ijhom ! temporary integers2939 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend2940 REAL(wp) :: zland2941 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend2942 !!----------------------------------------------------------------------2943 2944 zland = 0.e02945 2946 ! 1. standard boundary treatment2947 ! ------------------------------2948 2949 ! ! East-West boundaries2950 ! !* Cyclic east-west2951 2952 IF( nbondi == 2) THEN2953 IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN2954 ptab( 1 ,:,:) = ptab(jpim1,:,:)2955 ptab(jpi,:,:) = ptab( 2 ,:,:)2956 ELSE2957 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point2958 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north2959 ENDIF2960 ELSEIF(nbondi == -1) THEN2961 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point2962 ELSEIF(nbondi == 1) THEN2963 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north2964 ENDIF !* closed2965 2966 IF (nbondj == 2 .OR. nbondj == -1) THEN2967 IF( .NOT. cd_type == 'F' ) ptab(:, 1 :jprecj,:) = zland ! south except F-point2968 ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN2969 ptab(:,nlcj-jprecj+1:jpj ,:) = zland ! north2970 ENDIF2971 2972 !2973 2974 ! 2. East and west directions exchange2975 ! ------------------------------------2976 ! we play with the neigbours AND the row number because of the periodicity2977 !2978 SELECT CASE ( nbondi_bdy(ib_bdy) ) ! Read Dirichlet lateral conditions2979 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case)2980 iihom = nlci-nreci2981 DO jl = 1, jpreci2982 t3ew(:,jl,:,1) = ptab(jpreci+jl,:,:)2983 t3we(:,jl,:,1) = ptab(iihom +jl,:,:)2984 END DO2985 END SELECT2986 !2987 ! ! Migrations2988 imigr = jpreci * jpj * jpk2989 !2990 SELECT CASE ( nbondi_bdy(ib_bdy) )2991 CASE ( -1 )2992 CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req1 )2993 CASE ( 0 )2994 CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 )2995 CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req2 )2996 CASE ( 1 )2997 CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 )2998 END SELECT2999 !3000 SELECT CASE ( nbondi_bdy_b(ib_bdy) )3001 CASE ( -1 )3002 CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea )3003 CASE ( 0 )3004 CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea )3005 CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe )3006 CASE ( 1 )3007 CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe )3008 END SELECT3009 !3010 SELECT CASE ( nbondi_bdy(ib_bdy) )3011 CASE ( -1 )3012 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3013 CASE ( 0 )3014 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3015 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err)3016 CASE ( 1 )3017 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3018 END SELECT3019 !3020 ! ! Write Dirichlet lateral conditions3021 iihom = nlci-jpreci3022 !3023 SELECT CASE ( nbondi_bdy_b(ib_bdy) )3024 CASE ( -1 )3025 DO jl = 1, jpreci3026 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2)3027 END DO3028 CASE ( 0 )3029 DO jl = 1, jpreci3030 ptab(jl ,:,:) = t3we(:,jl,:,2)3031 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2)3032 END DO3033 CASE ( 1 )3034 DO jl = 1, jpreci3035 ptab(jl ,:,:) = t3we(:,jl,:,2)3036 END DO3037 END SELECT3038 3039 3040 ! 3. North and south directions3041 ! -----------------------------3042 ! always closed : we play only with the neigbours3043 !3044 IF( nbondj_bdy(ib_bdy) /= 2 ) THEN ! Read Dirichlet lateral conditions3045 ijhom = nlcj-nrecj3046 DO jl = 1, jprecj3047 t3sn(:,jl,:,1) = ptab(:,ijhom +jl,:)3048 t3ns(:,jl,:,1) = ptab(:,jprecj+jl,:)3049 END DO3050 ENDIF3051 !3052 ! ! Migrations3053 imigr = jprecj * jpi * jpk3054 !3055 SELECT CASE ( nbondj_bdy(ib_bdy) )3056 CASE ( -1 )3057 CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req1 )3058 CASE ( 0 )3059 CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 )3060 CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req2 )3061 CASE ( 1 )3062 CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 )3063 END SELECT3064 !3065 SELECT CASE ( nbondj_bdy_b(ib_bdy) )3066 CASE ( -1 )3067 CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono )3068 CASE ( 0 )3069 CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono )3070 CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso )3071 CASE ( 1 )3072 CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso )3073 END SELECT3074 !3075 SELECT CASE ( nbondj_bdy(ib_bdy) )3076 CASE ( -1 )3077 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3078 CASE ( 0 )3079 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3080 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err)3081 CASE ( 1 )3082 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3083 END SELECT3084 !3085 ! ! Write Dirichlet lateral conditions3086 ijhom = nlcj-jprecj3087 !3088 SELECT CASE ( nbondj_bdy_b(ib_bdy) )3089 CASE ( -1 )3090 DO jl = 1, jprecj3091 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2)3092 END DO3093 CASE ( 0 )3094 DO jl = 1, jprecj3095 ptab(:,jl ,:) = t3sn(:,jl,:,2)3096 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2)3097 END DO3098 CASE ( 1 )3099 DO jl = 1, jprecj3100 ptab(:,jl,:) = t3sn(:,jl,:,2)3101 END DO3102 END SELECT3103 3104 3105 ! 4. north fold treatment3106 ! -----------------------3107 !3108 IF( npolj /= 0) THEN3109 !3110 SELECT CASE ( jpni )3111 CASE ( 1 ) ; CALL lbc_nfd ( ptab, cd_type, psgn ) ! only 1 northern proc, no mpp3112 CASE DEFAULT ; CALL mpp_lbc_north( ptab, cd_type, psgn ) ! for all northern procs.3113 END SELECT3114 !3115 ENDIF3116 !3117 END SUBROUTINE mpp_lnk_bdy_3d3118 3119 SUBROUTINE mpp_lnk_bdy_2d( ptab, cd_type, psgn, ib_bdy )3120 !!----------------------------------------------------------------------3121 !! *** routine mpp_lnk_bdy_2d ***3122 !!3123 !! ** Purpose : Message passing management3124 !!3125 !! ** Method : Use mppsend and mpprecv function for passing BDY boundaries3126 !! between processors following neighboring subdomains.3127 !! domain parameters3128 !! nlci : first dimension of the local subdomain3129 !! nlcj : second dimension of the local subdomain3130 !! nbondi_bdy : mark for "east-west local boundary"3131 !! nbondj_bdy : mark for "north-south local boundary"3132 !! noea : number for local neighboring processors3133 !! nowe : number for local neighboring processors3134 !! noso : number for local neighboring processors3135 !! nono : number for local neighboring processors3136 !!3137 !! ** Action : ptab with update value at its periphery3138 !!3139 !!----------------------------------------------------------------------3140 3141 USE lbcnfd ! north fold3142 3143 INCLUDE 'mpif.h'3144 3145 REAL(wp), DIMENSION(jpi,jpj) , INTENT(inout) :: ptab ! 3D array on which the boundary condition is applied3146 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points3147 ! ! = T , U , V , F , W points3148 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary3149 ! ! = 1. , the sign is kept3150 INTEGER , INTENT(in ) :: ib_bdy ! BDY boundary set3151 INTEGER :: ji, jj, jl ! dummy loop indices3152 INTEGER :: imigr, iihom, ijhom ! temporary integers3153 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend3154 REAL(wp) :: zland3155 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend3156 !!----------------------------------------------------------------------3157 3158 zland = 0.e03159 3160 ! 1. standard boundary treatment3161 ! ------------------------------3162 3163 ! ! East-West boundaries3164 ! !* Cyclic east-west3165 3166 IF( nbondi == 2) THEN3167 IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN3168 ptab( 1 ,:) = ptab(jpim1,:)3169 ptab(jpi,:) = ptab( 2 ,:)3170 ELSE3171 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:) = zland ! south except F-point3172 ptab(nlci-jpreci+1:jpi ,:) = zland ! north3173 ENDIF3174 ELSEIF(nbondi == -1) THEN3175 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:) = zland ! south except F-point3176 ELSEIF(nbondi == 1) THEN3177 ptab(nlci-jpreci+1:jpi ,:) = zland ! north3178 ENDIF !* closed3179 3180 IF (nbondj == 2 .OR. nbondj == -1) THEN3181 IF( .NOT. cd_type == 'F' ) ptab(:, 1 :jprecj) = zland ! south except F-point3182 ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN3183 ptab(:,nlcj-jprecj+1:jpj) = zland ! north3184 ENDIF3185 3186 !3187 3188 ! 2. East and west directions exchange3189 ! ------------------------------------3190 ! we play with the neigbours AND the row number because of the periodicity3191 !3192 SELECT CASE ( nbondi_bdy(ib_bdy) ) ! Read Dirichlet lateral conditions3193 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case)3194 iihom = nlci-nreci3195 DO jl = 1, jpreci3196 t2ew(:,jl,1) = ptab(jpreci+jl,:)3197 t2we(:,jl,1) = ptab(iihom +jl,:)3198 END DO3199 END SELECT3200 !3201 ! ! Migrations3202 imigr = jpreci * jpj3203 !3204 SELECT CASE ( nbondi_bdy(ib_bdy) )3205 CASE ( -1 )3206 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req1 )3207 CASE ( 0 )3208 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 )3209 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req2 )3210 CASE ( 1 )3211 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 )3212 END SELECT3213 !3214 SELECT CASE ( nbondi_bdy_b(ib_bdy) )3215 CASE ( -1 )3216 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea )3217 CASE ( 0 )3218 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea )3219 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe )3220 CASE ( 1 )3221 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe )3222 END SELECT3223 !3224 SELECT CASE ( nbondi_bdy(ib_bdy) )3225 CASE ( -1 )3226 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3227 CASE ( 0 )3228 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3229 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err)3230 CASE ( 1 )3231 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3232 END SELECT3233 !3234 ! ! Write Dirichlet lateral conditions3235 iihom = nlci-jpreci3236 !3237 SELECT CASE ( nbondi_bdy_b(ib_bdy) )3238 CASE ( -1 )3239 DO jl = 1, jpreci3240 ptab(iihom+jl,:) = t2ew(:,jl,2)3241 END DO3242 CASE ( 0 )3243 DO jl = 1, jpreci3244 ptab(jl ,:) = t2we(:,jl,2)3245 ptab(iihom+jl,:) = t2ew(:,jl,2)3246 END DO3247 CASE ( 1 )3248 DO jl = 1, jpreci3249 ptab(jl ,:) = t2we(:,jl,2)3250 END DO3251 END SELECT3252 3253 3254 ! 3. North and south directions3255 ! -----------------------------3256 ! always closed : we play only with the neigbours3257 !3258 IF( nbondj_bdy(ib_bdy) /= 2 ) THEN ! Read Dirichlet lateral conditions3259 ijhom = nlcj-nrecj3260 DO jl = 1, jprecj3261 t2sn(:,jl,1) = ptab(:,ijhom +jl)3262 t2ns(:,jl,1) = ptab(:,jprecj+jl)3263 END DO3264 ENDIF3265 !3266 ! ! Migrations3267 imigr = jprecj * jpi3268 !3269 SELECT CASE ( nbondj_bdy(ib_bdy) )3270 CASE ( -1 )3271 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req1 )3272 CASE ( 0 )3273 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 )3274 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req2 )3275 CASE ( 1 )3276 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 )3277 END SELECT3278 !3279 SELECT CASE ( nbondj_bdy_b(ib_bdy) )3280 CASE ( -1 )3281 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono )3282 CASE ( 0 )3283 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono )3284 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso )3285 CASE ( 1 )3286 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso )3287 END SELECT3288 !3289 SELECT CASE ( nbondj_bdy(ib_bdy) )3290 CASE ( -1 )3291 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3292 CASE ( 0 )3293 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3294 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err)3295 CASE ( 1 )3296 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)3297 END SELECT3298 !3299 ! ! Write Dirichlet lateral conditions3300 ijhom = nlcj-jprecj3301 !3302 SELECT CASE ( nbondj_bdy_b(ib_bdy) )3303 CASE ( -1 )3304 DO jl = 1, jprecj3305 ptab(:,ijhom+jl) = t2ns(:,jl,2)3306 END DO3307 CASE ( 0 )3308 DO jl = 1, jprecj3309 ptab(:,jl ) = t2sn(:,jl,2)3310 ptab(:,ijhom+jl) = t2ns(:,jl,2)3311 END DO3312 CASE ( 1 )3313 DO jl = 1, jprecj3314 ptab(:,jl) = t2sn(:,jl,2)3315 END DO3316 END SELECT3317 3318 3319 ! 4. north fold treatment3320 ! -----------------------3321 !3322 IF( npolj /= 0) THEN3323 !3324 SELECT CASE ( jpni )3325 CASE ( 1 ) ; CALL lbc_nfd ( ptab, cd_type, psgn ) ! only 1 northern proc, no mpp3326 CASE DEFAULT ; CALL mpp_lbc_north( ptab, cd_type, psgn ) ! for all northern procs.3327 END SELECT3328 !3329 ENDIF3330 !3331 END SUBROUTINE mpp_lnk_bdy_2d3332 2536 3333 2537 SUBROUTINE mpi_init_opa( ldtxt, ksft, code ) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LBC/mppini.F90
r3294 r6736 13 13 !! * Modules used 14 14 USE dom_oce ! ocean space and time domain 15 USE bdy_oce ! ocean space and time domain 15 16 USE in_out_manager ! I/O Manager 16 17 USE lib_mpp ! distribued memory computing library -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LBC/mppini_2.h90
r3818 r6736 41 41 USE in_out_manager ! I/O Manager 42 42 USE iom 43 USE bdy_oce 43 44 !! 44 45 INTEGER :: ji, jj, jn, jproc, jarea ! dummy loop indices … … 70 71 71 72 ! read namelist for ln_zco 72 NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco 73 NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco, ln_hyb 73 74 74 75 !!---------------------------------------------------------------------- … … 107 108 imask(:,:)=1 108 109 WHERE ( zdta(:,:) <= 0. ) imask = 0 110 #if defined key_bdy 111 ! Adjust imask with bdy_msk if exists 112 113 NAMELIST/nambdy/ nb_bdy, ln_coords_file, cn_coords_file, & 114 & ln_mask_file, cn_mask_file, nn_dyn2d, nn_dyn2d_dta, & 115 & nn_dyn3d, nn_dyn3d_dta, nn_tra, nn_tra_dta, nb_jpk, & 116 #if defined key_lim2 117 & nn_ice_lim2, nn_ice_lim2_dta, & 118 #endif 119 & ln_vol, nn_volctl, nn_rimwidth 120 121 REWIND ( numnam ) ! Read Namelist namzgr : vertical coordinate' 122 READ ( numnam, nambdy ) 123 124 IF( ln_mask_file ) THEN 125 CALL iom_open( cn_mask_file, inum ) 126 CALL iom_get ( inum, jpdom_unknown, 'bdy_msk', zdta(:,:) ) 127 CALL iom_close( inum ) 128 WHERE ( zdta(:,:) <= 0. ) imask = 0 129 ENDIF 130 #endif 109 131 110 132 ! 1. Dimension arrays for subdomains -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LDF/ldfdyn.F90
r3634 r6736 67 67 NAMELIST/namdyn_ldf/ ln_dynldf_lap , ln_dynldf_bilap, & 68 68 & ln_dynldf_level, ln_dynldf_hor , ln_dynldf_iso, & 69 & rn_ahm_0_lap , rn_ahmb_0 , rn_ahm_0_blp , & 70 & rn_cmsmag_1 , rn_cmsmag_2 , rn_cmsh, & 71 & rn_ahm_m_lap , rn_ahm_m_blp 72 73 !!---------------------------------------------------------------------- 69 & rn_ahm_0_lap , rn_ahmb_0 , rn_ahm_0_blp 70 !!---------------------------------------------------------------------- 74 71 75 72 REWIND( numnam ) ! Read Namelist namdyn_ldf : Lateral physics … … 89 86 WRITE(numout,*) ' background viscosity rn_ahmb_0 = ', rn_ahmb_0 90 87 WRITE(numout,*) ' horizontal bilaplacian eddy viscosity rn_ahm_0_blp = ', rn_ahm_0_blp 91 WRITE(numout,*) ' upper limit for laplacian eddy visc rn_ahm_m_lap = ', rn_ahm_m_lap92 WRITE(numout,*) ' upper limit for bilap eddy viscosity rn_ahm_m_blp = ', rn_ahm_m_blp93 94 88 ENDIF 95 89 … … 148 142 IF(lwp) WRITE(numout,*) ' ahm1 = ahm2 = ahm0 = ',ahm0 149 143 #endif 150 nkahm_smag = 0151 #if defined key_dynldf_smag152 nkahm_smag = 1153 #endif154 155 144 ! 156 145 END SUBROUTINE ldf_dyn_init -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LDF/ldfdyn_oce.F90
r3634 r6736 23 23 REAL(wp), PUBLIC :: rn_ahm_0_blp = 0._wp !: lateral bilaplacian eddy viscosity (m4/s) 24 24 REAL(wp), PUBLIC :: ahm0, ahmb0, ahm0_blp !: OLD namelist names 25 REAL(wp), PUBLIC :: rn_cmsmag_1 = 3._wp !: constant in laplacian Smagorinsky viscosity26 REAL(wp), PUBLIC :: rn_cmsmag_2 = 3._wp !: constant in bilaplacian Smagorinsky viscosity27 REAL(wp), PUBLIC :: rn_cmsh = 1._wp !: 1 or 0 , if 0 -use only shear for Smagorinsky viscosity28 REAL(wp), PUBLIC :: rn_ahm_m_blp = -1.e12_wp !: upper limit for bilap abs(ahm) < min( dx^4/128rdt, rn_ahm_m_blp)29 REAL(wp), PUBLIC :: rn_ahm_m_lap = 40000_wp !: upper limit for lap ahm < min(dx^2/16rdt, rn_ahm_m_lap)30 INTEGER , PUBLIC :: nkahm_smag = 0 !:31 25 32 26 ! !!! eddy coeff. at U-,V-,W-pts [m2/s] -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LDF/ldftra.F90
r3634 r6736 66 66 NAMELIST/namtra_ldf/ ln_traldf_lap , ln_traldf_bilap, & 67 67 & ln_traldf_level, ln_traldf_hor , ln_traldf_iso, & 68 & ln_traldf_grif , ln_traldf_gdia ,&69 & ln_triad_iso , ln_botmix_grif ,&68 & ln_traldf_grif , ln_traldf_gdia, & 69 & ln_triad_iso , ln_botmix_grif, & 70 70 & rn_aht_0 , rn_ahtb_0 , rn_aeiv_0, & 71 & rn_slpmax , rn_chsmag , rn_smsh, & 72 & rn_aht_m 71 & rn_slpmax 73 72 !!---------------------------------------------------------------------- 74 73 … … 154 153 IF(lwp)WRITE(numout,*) ' constant eddy diffusivity coef. ahtu = ahtv = ahtw = aht0 = ', aht0 155 154 IF( lk_traldf_eiv ) THEN 155 IF(lwp)WRITE(numout,*) 156 156 IF(lwp)WRITE(numout,*) ' constant eddy induced velocity coef. aeiu = aeiv = aeiw = aeiv0 = ', aeiv0 157 158 157 ENDIF 159 158 #endif 160 161 #if defined key_traldf_smag && ! defined key_traldf_c3d162 CALL ctl_stop( 'key_traldf_smag can only be used with key_traldf_c3d' )163 #endif164 #if defined key_traldf_smag165 IF(lwp) WRITE(numout,*)' SMAGORINSKY DIFFUSION'166 IF(lwp .AND. rn_smsh < 1) WRITE(numout,*)' only shear is used '167 IF(lwp.and.ln_traldf_bilap) CALL ctl_stop(' SMAGORINSKY + BILAPLACIAN - UNSTABLE OR NON_CONSERVATIVE' )168 #endif169 170 159 ! 171 160 END SUBROUTINE ldf_tra_init -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LDF/ldftra_c3d.h90
r3634 r6736 108 108 CALL lbc_lnk( aeiv, 'V', 1. ) 109 109 CALL lbc_lnk( aeiw, 'W', 1. ) 110 !!!!!# endif jdha 111 110 112 IF(lwp .AND. ld_print ) THEN 111 113 WRITE(numout,*) … … 119 121 CALL prihre(aeiw(:,:,1),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 120 122 ENDIF 121 122 # endif 123 # endif jdha 124 ! 123 125 END SUBROUTINE ldf_tra_c3d -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LDF/ldftra_oce.F90
r3634 r6736 30 30 REAL(wp), PUBLIC :: rn_aeiv_0 = 2000._wp !: eddy induced velocity coefficient (m2/s) 31 31 REAL(wp), PUBLIC :: rn_slpmax = 0.01_wp !: slope limit 32 REAL(wp), PUBLIC :: rn_chsmag = 1._wp !: multiplicative factor in Smagorinsky diffusivity33 REAL(wp), PUBLIC :: rn_smsh = 1._wp !: Smagorinsky diffusivity: = 0 - use only sheer34 REAL(wp), PUBLIC :: rn_aht_m = 2000._wp !: upper limit or stability criteria for lateral eddy diffusivity (m2/s)35 32 36 33 REAL(wp), PUBLIC :: aht0, ahtb0, aeiv0 !!: OLD namelist names 37 38 34 LOGICAL , PUBLIC :: ln_triad_iso = .FALSE. !: calculate triads twice 39 35 LOGICAL , PUBLIC :: ln_botmix_grif = .FALSE. !: mixing on bottom -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBC/obcdyn.F90
r3680 r6736 5 5 !! Ocean dynamics: Radiation of velocities on each open boundary 6 6 !!================================================================================= 7 !! History : 3.5 ! 2012 (S. Mocavero, I. Epicoco) Updates for the 8 !! optimization of OBC communications 7 9 8 !!--------------------------------------------------------------------------------- 10 9 !! obc_dyn : call the subroutine for each open boundary … … 106 105 IF( lk_mpp ) THEN 107 106 IF( kt >= nit000+3 .AND. ln_rstart ) THEN 108 CALL lbc_ obc_lnk( ub, 'U', -1. )109 CALL lbc_ obc_lnk( vb, 'V', -1. )107 CALL lbc_lnk( ub, 'U', -1. ) 108 CALL lbc_lnk( vb, 'V', -1. ) 110 109 END IF 111 CALL lbc_ obc_lnk( ua, 'U', -1. )112 CALL lbc_ obc_lnk( va, 'V', -1. )110 CALL lbc_lnk( ua, 'U', -1. ) 111 CALL lbc_lnk( va, 'V', -1. ) 113 112 ENDIF 114 113 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBC/obcdyn_bt.F90
r3680 r6736 5 5 !!====================================================================== 6 6 !! History : 1.0 ! 2005-12 (V. Garnier) original code 7 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Updates for the8 !! optimization of OBC communications9 7 !!---------------------------------------------------------------------- 10 8 #if ( defined key_dynspg_ts || defined key_dynspg_exp ) && defined key_obc … … 67 65 IF( lk_mpp ) THEN 68 66 IF( kt >= nit000+3 .AND. ln_rstart ) THEN 69 CALL lbc_ obc_lnk( sshb, 'T', 1. )70 CALL lbc_ obc_lnk( ub , 'U', -1. )71 CALL lbc_ obc_lnk( vb , 'V', -1. )67 CALL lbc_lnk( sshb, 'T', 1. ) 68 CALL lbc_lnk( ub , 'U', -1. ) 69 CALL lbc_lnk( vb , 'V', -1. ) 72 70 END IF 73 CALL lbc_ obc_lnk( sshn, 'T', 1. )74 CALL lbc_ obc_lnk( ua , 'U', -1. )75 CALL lbc_ obc_lnk( va , 'V', -1. )71 CALL lbc_lnk( sshn, 'T', 1. ) 72 CALL lbc_lnk( ua , 'U', -1. ) 73 CALL lbc_lnk( va , 'V', -1. ) 76 74 ENDIF 77 75 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBC/obctra.F90
r3680 r6736 4 4 !! Ocean tracers: Radiation of tracers on each open boundary 5 5 !!================================================================================= 6 !! History : 3.5 ! 2012 (S. Mocavero, I. Epicoco) Updates for the7 !! optimization of OBC communications8 6 #if defined key_obc 9 7 !!--------------------------------------------------------------------------------- … … 103 101 IF( lk_mpp ) THEN !!bug ??? 104 102 IF( kt >= nit000+3 .AND. ln_rstart ) THEN 105 CALL lbc_ obc_lnk( tsb(:,:,:,jp_tem), 'T', 1. )106 CALL lbc_ obc_lnk( tsb(:,:,:,jp_sal), 'T', 1. )103 CALL lbc_lnk( tsb(:,:,:,jp_tem), 'T', 1. ) 104 CALL lbc_lnk( tsb(:,:,:,jp_sal), 'T', 1. ) 107 105 END IF 108 CALL lbc_ obc_lnk( tsa(:,:,:,jp_tem), 'T', 1. )109 CALL lbc_ obc_lnk( tsa(:,:,:,jp_sal), 'T', 1. )106 CALL lbc_lnk( tsa(:,:,:,jp_tem), 'T', 1. ) 107 CALL lbc_lnk( tsa(:,:,:,jp_sal), 'T', 1. ) 110 108 ENDIF 111 109 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90
r3651 r6736 106 106 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 107 107 & ld_velav !: Velocity data is daily averaged 108 LOGICAL, DIMENSION(:), ALLOCATABLE :: &109 & ld_sstnight !: SST observation corresponds to night mean110 108 111 109 !!---------------------------------------------------------------------- … … 739 737 ALLOCATE(sstdata(nsstsets)) 740 738 ALLOCATE(sstdatqc(nsstsets)) 741 ALLOCATE(ld_sstnight(nsstsets))742 739 sstdata(:)%nsurf=0 743 sstdatqc(:)%nsurf=0 744 ld_sstnight(:)=.false. 740 sstdatqc(:)%nsurf=0 745 741 746 742 nsstsets = 0 … … 749 745 750 746 nsstsets = nsstsets + 1 751 752 ld_sstnight(nsstsets) = .TRUE.753 747 754 748 CALL obs_rea_sst_rey( reysstname, reysstfmt, sstdata(nsstsets), & … … 763 757 764 758 nsstsets = nsstsets + 1 765 766 ld_sstnight(nsstsets) = .TRUE.767 759 768 760 CALL obs_rea_sst( 1, sstdata(nsstsets), jnumsst, & … … 782 774 783 775 nsstsets = nsstsets + 1 784 785 ld_sstnight(nsstsets) = .TRUE.786 776 787 777 CALL obs_rea_sst( 0, sstdata(nsstsets), 1, & … … 1102 1092 IF ( ln_sst ) THEN 1103 1093 DO jsstset = 1, nsstsets 1104 CALL obs_sst_opt( sstdatqc(jsstset), & 1105 & kstp, jpi, jpj, nit000, idaystp, & 1106 & tsn(:,:,1,jp_tem), tmask(:,:,1), & 1107 & n2dint, ld_sstnight(jsstset) ) 1094 CALL obs_sst_opt( sstdatqc(jsstset), & 1095 & kstp, jpi, jpj, nit000, tsn(:,:,1,jp_tem), & 1096 & tmask(:,:,1), n2dint ) 1108 1097 END DO 1109 1098 ENDIF -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/obs_oper.F90
r3651 r6736 614 614 END SUBROUTINE obs_sla_opt 615 615 616 SUBROUTINE obs_sst_opt( sstdatqc, kt, kpi, kpj, kit000, kdaystp, & 617 & psstn, psstmask, k2dint, ld_nightav ) 616 SUBROUTINE obs_sst_opt( sstdatqc, kt, kpi, kpj, kit000, & 617 & psstn, psstmask, k2dint ) 618 618 619 !!----------------------------------------------------------------------- 619 620 !! … … 646 647 !! * Modules used 647 648 USE obs_surf_def ! Definition of storage space for surface observations 648 USE sbcdcy649 649 650 650 IMPLICIT NONE … … 659 659 ! (kit000-1 = restart time) 660 660 INTEGER, INTENT(IN) :: k2dint ! Horizontal interpolation type (see header) 661 INTEGER, INTENT(IN) :: kdaystp ! Number of time steps per day662 661 REAL(KIND=wp), INTENT(IN), DIMENSION(kpi,kpj) :: & 663 662 & psstn, & ! Model SST field 664 663 & psstmask ! Land-sea mask 665 664 666 665 !! * Local declarations 667 666 INTEGER :: ji … … 671 670 INTEGER :: isst 672 671 INTEGER :: iobs 673 INTEGER :: idayend674 672 REAL(KIND=wp) :: zlam 675 673 REAL(KIND=wp) :: zphi 676 674 REAL(KIND=wp) :: zext(1), zobsmask(1) 677 REAL(KIND=wp) :: zdaystp678 INTEGER, DIMENSION(:,:), SAVE, ALLOCATABLE :: &679 & icount_sstnight, &680 & imask_night681 REAL(kind=wp), DIMENSION(:,:), SAVE, ALLOCATABLE :: &682 & zintmp, &683 & zouttmp, &684 & zmeanday ! to compute model sst in region of 24h daylight (pole)685 675 REAL(kind=wp), DIMENSION(2,2,1) :: & 686 676 & zweig … … 688 678 & zmask, & 689 679 & zsstl, & 690 & zsstm, &691 680 & zglam, & 692 681 & zgphi … … 694 683 & igrdi, & 695 684 & igrdj 696 LOGICAL, INTENT(IN) :: ld_nightav697 685 698 686 !----------------------------------------------------------------------- … … 702 690 inrc = kt - kit000 + 2 703 691 isst = sstdatqc%nsstp(inrc) 704 705 IF ( ld_nightav ) THEN706 707 ! Initialize array for night mean708 709 IF ( kt .EQ. 0 ) THEN710 ALLOCATE ( icount_sstnight(kpi,kpj) )711 ALLOCATE ( imask_night(kpi,kpj) )712 ALLOCATE ( zintmp(kpi,kpj) )713 ALLOCATE ( zouttmp(kpi,kpj) )714 ALLOCATE ( zmeanday(kpi,kpj) )715 nday_qsr = -1 ! initialisation flag for nbc_dcy716 ENDIF717 718 ! Initialize daily mean for first timestep719 idayend = MOD( kt - kit000 + 1, kdaystp )720 721 ! Added kt == 0 test to catch restart case722 IF ( idayend == 1 .OR. kt == 0) THEN723 IF (lwp) WRITE(numout,*) 'Reset sstdatqc%vdmean on time-step: ',kt724 DO jj = 1, jpj725 DO ji = 1, jpi726 sstdatqc%vdmean(ji,jj) = 0.0727 zmeanday(ji,jj) = 0.0728 icount_sstnight(ji,jj) = 0729 END DO730 END DO731 ENDIF732 733 zintmp(:,:) = 0.0734 zouttmp(:,:) = sbc_dcy( zintmp(:,:), .TRUE. )735 imask_night(:,:) = INT( zouttmp(:,:) )736 737 DO jj = 1, jpj738 DO ji = 1, jpi739 ! Increment the temperature field for computing night mean and counter740 sstdatqc%vdmean(ji,jj) = sstdatqc%vdmean(ji,jj) &741 & + psstn(ji,jj)*imask_night(ji,jj)742 zmeanday(ji,jj) = zmeanday(ji,jj) + psstn(ji,jj)743 icount_sstnight(ji,jj) = icount_sstnight(ji,jj) + imask_night(ji,jj)744 END DO745 END DO746 747 ! Compute the daily mean at the end of day748 749 zdaystp = 1.0 / REAL( kdaystp )750 751 IF ( idayend == 0 ) THEN752 DO jj = 1, jpj753 DO ji = 1, jpi754 ! Test if "no night" point755 IF ( icount_sstnight(ji,jj) .NE. 0 ) THEN756 sstdatqc%vdmean(ji,jj) = sstdatqc%vdmean(ji,jj) &757 & / icount_sstnight(ji,jj)758 ELSE759 sstdatqc%vdmean(ji,jj) = zmeanday(ji,jj) * zdaystp760 ENDIF761 END DO762 END DO763 ENDIF764 765 ENDIF766 692 767 693 ! Get the data for interpolation … … 796 722 CALL obs_int_comm_2d( 2, 2, isst, & 797 723 & igrdi, igrdj, psstn, zsstl ) 798 799 ! At the end of the day get interpolated means 800 IF ( idayend == 0 .AND. ld_nightav ) THEN 801 802 ALLOCATE( & 803 & zsstm(2,2,isst) & 804 & ) 805 806 CALL obs_int_comm_2d( 2, 2, isst, igrdi, igrdj, & 807 & sstdatqc%vdmean(:,:), zsstm ) 808 809 ENDIF 810 724 811 725 ! Loop over observations 812 726 … … 842 756 843 757 ! Interpolate the model SST to the observation point 844 845 IF ( ld_nightav ) THEN 846 847 IF ( idayend == 0 ) THEN 848 ! Daily averaged/diurnal cycle of SST data 849 CALL obs_int_h2d( 1, 1, & 850 & zweig, zsstm(:,:,iobs), zext ) 851 ELSE 852 CALL ctl_stop( ' ld_nightav is set to true: a nonzero' // & 853 & ' number of night SST data should' // & 854 & ' only occur at the end of a given day' ) 855 ENDIF 856 857 ELSE 858 859 CALL obs_int_h2d( 1, 1, & 758 CALL obs_int_h2d( 1, 1, & 860 759 & zweig, zsstl(:,:,iobs), zext ) 861 862 ENDIF863 760 864 761 sstdatqc%rmod(jobs,1) = zext(1) … … 875 772 & zsstl & 876 773 & ) 877 878 ! At the end of the day also get interpolated means879 IF ( idayend == 0 .AND. ld_nightav ) THEN880 DEALLOCATE( &881 & zsstm &882 & )883 ENDIF884 774 885 775 sstdatqc%nsurfup = sstdatqc%nsurfup + isst -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_seaice.F90
r3651 r6736 326 326 & iindx ) 327 327 328 CALL obs_surf_alloc( seaicedata, iobs, & 329 kvars, kextr, kstp, jpi, jpj ) 328 CALL obs_surf_alloc( seaicedata, iobs, kvars, kextr, kstp ) 330 329 331 330 ! * Read obs/positions, QC, all variable and assign to seaicedata -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_sla.F90
r3651 r6736 391 391 & iindx ) 392 392 393 CALL obs_surf_alloc( sladata, iobs, kvars, kextr, & 394 & jpi, jpj, kstp ) 393 CALL obs_surf_alloc( sladata, iobs, kvars, kextr, kstp ) 395 394 396 395 ! * Read obs/positions, QC, all variable and assign to sladata -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_sst.F90
r3651 r6736 326 326 & iindx ) 327 327 328 CALL obs_surf_alloc( sstdata, iobs, kvars, kextr, kstp , jpi, jpj)328 CALL obs_surf_alloc( sstdata, iobs, kvars, kextr, kstp ) 329 329 330 330 ! * Read obs/positions, QC, all variable and assign to sstdata … … 701 701 ! Allocate obs_surf data structure for time sorted data 702 702 703 CALL obs_surf_alloc( sstdata, inumobs, kvars, kextra, kstp , jpi, jpj)703 CALL obs_surf_alloc( sstdata, inumobs, kvars, kextra, kstp ) 704 704 705 705 pjul = pjulini + 1 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/obs_surf_def.F90
r3651 r6736 47 47 INTEGER :: nextra !: Number of extra fields at observation points 48 48 INTEGER :: nstp !: Number of time steps 49 INTEGER :: npi !: Number of 3D grid points50 INTEGER :: npj51 49 INTEGER :: nsurfup !: Observation counter used in obs_oper 52 50 … … 81 79 & rext !: Extra fields interpolated to observation points 82 80 83 REAL(KIND=wp), POINTER, DIMENSION(:,:) :: &84 & vdmean !: Time averaged of model field85 86 81 ! Arrays with size equal to the number of time steps in the window 87 82 … … 108 103 CONTAINS 109 104 110 SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, kextra, kstp , kpi, kpj)105 SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, kextra, kstp ) 111 106 !!---------------------------------------------------------------------- 112 107 !! *** ROUTINE obs_surf_alloc *** … … 125 120 INTEGER, INTENT(IN) :: kextra ! Number of extra fields at observation points 126 121 INTEGER, INTENT(IN) :: kstp ! Number of time steps 127 INTEGER, INTENT(IN) :: kpi ! Number of 3D grid points128 INTEGER, INTENT(IN) :: kpj129 122 130 123 !!* Local variables … … 138 131 surf%nvar = kvar 139 132 surf%nstp = kstp 140 surf%npi = kpi141 surf%npj = kpj142 133 143 134 ! Allocate arrays of number of surface data size … … 183 174 & ) 184 175 185 ! Allocate arrays of size number of grid points186 187 ALLOCATE( &188 & surf%vdmean(kpi,kpj) &189 & )190 191 176 ! Set defaults for compression indices 192 177 … … 257 242 & ) 258 243 259 ! Deallocate arrays of size number of grid points size times260 ! number of variables261 262 DEALLOCATE( &263 & surf%vdmean &264 & )265 266 244 ! Deallocate arrays of number of time step size 267 245 … … 322 300 IF ( lallocate ) THEN 323 301 CALL obs_surf_alloc( newsurf, insurf, surf%nvar, & 324 & surf%nextra, surf%nstp , surf%npi, surf%npj)302 & surf%nextra, surf%nstp ) 325 303 ENDIF 326 304 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/albedo.F90
r3625 r6736 12 12 13 13 !!---------------------------------------------------------------------- 14 !! albedo_ice 15 !! albedo_oce 16 !! albedo_init 17 !!---------------------------------------------------------------------- 18 USE phycst ! physical constants19 USE in_out_manager ! I/O manager20 USE lib_mpp ! MPP library21 USE wrk_nemo ! work arrays22 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)14 !! albedo_ice : albedo for ice (clear and overcast skies) 15 !! albedo_oce : albedo for ocean (clear and overcast skies) 16 !! albedo_init : initialisation of albedo computation 17 !!---------------------------------------------------------------------- 18 USE phycst ! physical constants 19 USE in_out_manager ! I/O manager 20 USE lib_mpp ! MPP library 21 USE wrk_nemo ! work arrays 22 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 23 23 24 24 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/fldread.F90
r3851 r6736 7 7 !! ! 05-2008 (S. Alderson) Modified for Interpolation in memory 8 8 !! ! from input grid to model grid 9 !! ! 04-2013 (J. Harle) Addition to interpolate bdy data onto 10 !! ! model grid 9 11 !!---------------------------------------------------------------------- 10 12 … … 27 29 28 30 PUBLIC fld_map ! routine called by tides_init 29 PUBLIC fld_read, fld_fill ! called by sbc... modules30 31 31 32 TYPE, PUBLIC :: FLD_N !: Namelist field informations … … 58 59 ! ! into the WGTLIST structure 59 60 CHARACTER(len = 34) :: vcomp ! symbolic name for a vector component that needs rotation 60 LOGICAL, DIMENSION(2) :: rotn ! flag to indicate whether before/after field has been rotated 61 INTEGER :: nreclast ! last record to be read in the current file 61 LOGICAL :: rotn ! flag to indicate whether field has been rotated 62 62 END TYPE FLD 63 63 … … 98 98 !$AGRIF_END_DO_NOT_TREAT 99 99 100 PUBLIC fld_read, fld_fill ! called by sbc... modules 101 100 102 !!---------------------------------------------------------------------- 101 103 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 105 107 CONTAINS 106 108 107 SUBROUTINE fld_read( kt, kn_fsbc, sd, map, kit, kt_offset)109 SUBROUTINE fld_read( kt, kn_fsbc, sd, map, jit, time_offset, jpk_1) 108 110 !!--------------------------------------------------------------------- 109 111 !! *** ROUTINE fld_read *** … … 120 122 INTEGER , INTENT(in ) :: kn_fsbc ! sbc computation period (in time step) 121 123 TYPE(FLD), INTENT(inout), DIMENSION(:) :: sd ! input field related variables 122 TYPE(MAP_POINTER),INTENT(in), OPTIONAL, DIMENSION(:) :: map ! global-to-local mapping ind ices123 INTEGER , INTENT(in ), OPTIONAL :: kit ! subcycle timestep for timesplitting option124 INTEGER , INTENT(in ), OPTIONAL :: kt_offset ! provide fields at time other than "now"125 ! kt_offset = -1 => fields at "before" time level126 ! kt_offset = +1 => fields at "after" time level127 !etc.128 !!129 INTEGER :: itmp ! temporary variable124 TYPE(MAP_POINTER),INTENT(in), OPTIONAL, DIMENSION(:) :: map ! global-to-local mapping index 125 INTEGER , INTENT(in ), OPTIONAL :: jit ! subcycle timestep for timesplitting option 126 INTEGER , INTENT(in ), OPTIONAL :: time_offset ! provide fields at time other than "now" 127 ! time_offset = -1 => fields at "before" time level 128 ! time_offset = +1 => fields at "after" time levels 129 ! etc. 130 INTEGER , INTENT(in ), OPTIONAL :: jpk_1 ! 131 !! 130 132 INTEGER :: imf ! size of the structure sd 131 133 INTEGER :: jf ! dummy indices 134 INTEGER :: ireclast ! last record to be read in the current year file 132 135 INTEGER :: isecend ! number of second since Jan. 1st 00h of nit000 year at nitend 133 136 INTEGER :: isecsbc ! number of seconds between Jan. 1st 00h of nit000 year and the middle of sbc time step 134 INTEGER :: it _offset! local time offset variable137 INTEGER :: itime_add ! local time offset variable 135 138 LOGICAL :: llnxtyr ! open next year file? 136 139 LOGICAL :: llnxtmth ! open next month file? … … 140 143 REAL(wp) :: ztintb ! ratio applied to before records when doing time interpolation 141 144 CHARACTER(LEN=1000) :: clfmt ! write format 142 TYPE(MAP_POINTER) :: imap ! global-to-local mapping indices 143 !!--------------------------------------------------------------------- 144 ll_firstcall = kt == nit000 145 IF( PRESENT(kit) ) ll_firstcall = ll_firstcall .and. kit == 1 146 147 it_offset = 0 148 IF( PRESENT(kt_offset) ) it_offset = kt_offset 149 150 imap%ptr => NULL() 151 145 !!--------------------------------------------------------------------- 146 ll_firstcall = .false. 147 IF( PRESENT(jit) ) THEN 148 IF(kt == nit000 .and. jit == 1) ll_firstcall = .true. 149 ELSE 150 IF(kt == nit000) ll_firstcall = .true. 151 ENDIF 152 153 itime_add = 0 154 IF( PRESENT(time_offset) ) itime_add = time_offset 155 152 156 ! Note that shifting time to be centrered in the middle of sbc time step impacts only nsec_* variables of the calendar 153 IF( present(kit) ) THEN ! ignore kn_fsbc in this case 154 isecsbc = nsec_year + nsec1jan000 + (kit+it_offset)*NINT( rdt/REAL(nn_baro,wp) ) 155 ELSE ! middle of sbc time step 156 isecsbc = nsec_year + nsec1jan000 + NINT(0.5 * REAL(kn_fsbc - 1,wp) * rdttra(1)) + it_offset * NINT(rdttra(1)) 157 IF( present(jit) ) THEN 158 ! ignore kn_fsbc in this case 159 isecsbc = nsec_year + nsec1jan000 + (jit+itime_add)*rdt/REAL(nn_baro,wp) 160 ELSE 161 isecsbc = nsec_year + nsec1jan000 + NINT(0.5 * REAL(kn_fsbc - 1,wp) * rdttra(1)) + itime_add * rdttra(1) ! middle of sbc time step 157 162 ENDIF 158 163 imf = SIZE( sd ) 159 164 ! 160 165 IF( ll_firstcall ) THEN ! initialization 161 DO jf = 1, imf 162 IF( PRESENT(map) ) imap = map(jf) 163 CALL fld_init( kn_fsbc, sd(jf), imap ) ! read each before field (put them in after as they will be swapped) 164 END DO 166 IF( PRESENT(map) ) THEN 167 DO jf = 1, imf 168 IF( PRESENT(jpk_1) ) THEN 169 CALL fld_init( kn_fsbc, sd(jf), map(jf)%ptr, jpk_1 ) ! read each before field (put them in after as they will be swapped) 170 ELSE 171 CALL fld_init( kn_fsbc, sd(jf), map(jf)%ptr ) ! read each before field (put them in after as they will be swapped) 172 ENDIF 173 END DO 174 ELSE 175 DO jf = 1, imf 176 CALL fld_init( kn_fsbc, sd(jf) ) ! read each before field (put them in after as they will be swapped) 177 END DO 178 ENDIF 165 179 IF( lwp ) CALL wgt_print() ! control print 180 CALL fld_rot( kt, sd ) ! rotate vector fiels if needed 166 181 ENDIF 167 182 ! ! ====================================== ! … … 171 186 DO jf = 1, imf ! --- loop over field --- ! 172 187 173 IF( isecsbc > sd(jf)%nrec_a(2) .OR. ll_firstcall ) THEN ! read/update the after data? 174 175 IF( PRESENT(map) ) imap = map(jf) ! temporary definition of map 176 177 sd(jf)%nrec_b(:) = sd(jf)%nrec_a(:) ! swap before record informations 178 sd(jf)%rotn(1) = sd(jf)%rotn(2) ! swap before rotate informations 179 IF( sd(jf)%ln_tint ) sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2) ! swap before record field 180 181 CALL fld_rec( kn_fsbc, sd(jf), kt_offset = it_offset, kit = kit ) ! update after record informations 182 183 ! if kn_fsbc*rdttra is larger than nfreqh (which is kind of odd), 184 ! it is possible that the before value is no more the good one... we have to re-read it 185 ! if before is not the last record of the file currently opened and after is the first record to be read 186 ! in a new file which means after = 1 (the file to be opened corresponds to the current time) 187 ! or after = nreclast + 1 (the file to be opened corresponds to a future time step) 188 IF( .NOT. ll_firstcall .AND. sd(jf)%ln_tint .AND. sd(jf)%nrec_b(1) /= sd(jf)%nreclast & 189 & .AND. MOD( sd(jf)%nrec_a(1), sd(jf)%nreclast ) == 1 ) THEN 190 itmp = sd(jf)%nrec_a(1) ! temporary storage 191 sd(jf)%nrec_a(1) = sd(jf)%nreclast ! read the last record of the file currently opened 192 CALL fld_get( sd(jf), imap ) ! read after data 193 sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2) ! re-swap before record field 194 sd(jf)%nrec_b(1) = sd(jf)%nrec_a(1) ! update before record informations 195 sd(jf)%nrec_b(2) = sd(jf)%nrec_a(2) - sd(jf)%nfreqh * 3600 ! assume freq to be in hours in this case 196 sd(jf)%rotn(1) = sd(jf)%rotn(2) ! update before rotate informations 197 sd(jf)%nrec_a(1) = itmp ! move back to after record 188 IF( isecsbc > sd(jf)%nrec_a(2) .OR. ll_firstcall ) THEN ! read/update the after data? 189 190 IF( sd(jf)%ln_tint ) THEN ! swap before record field and informations 191 sd(jf)%nrec_b(:) = sd(jf)%nrec_a(:) 192 !CDIR COLLAPSE 193 sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2) 198 194 ENDIF 199 195 200 CALL fld_clopn( sd(jf) ) ! Do we need to open a new year/month/week/day file? 201 196 IF( PRESENT(jit) ) THEN 197 CALL fld_rec( kn_fsbc, sd(jf), time_offset=itime_add, jit=jit ) ! update record informations 198 ELSE 199 CALL fld_rec( kn_fsbc, sd(jf), time_offset=itime_add ) ! update record informations 200 ENDIF 201 202 ! do we have to change the year/month/week/day of the forcing field?? 202 203 IF( sd(jf)%ln_tint ) THEN 203 204 ! if kn_fsbc*rdttra is larger than nfreqh (which is kind of odd),205 ! it is possible that the before value is no more the good one... we have to re-read it206 ! if before record is not just just before the after record...207 IF( .NOT. ll_firstcall .AND. MOD( sd(jf)%nrec_a(1), sd(jf)%nreclast ) /= 1 &208 & .AND. sd(jf)%nrec_b(1) /= sd(jf)%nrec_a(1) - 1 ) THEN209 sd(jf)%nrec_a(1) = sd(jf)%nrec_a(1) - 1 ! move back to before record210 CALL fld_get( sd(jf), imap ) ! read after data211 sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2) ! re-swap before record field212 sd(jf)%nrec_b(1) = sd(jf)%nrec_a(1) ! update before record informations213 sd(jf)%nrec_b(2) = sd(jf)%nrec_a(2) - sd(jf)%nfreqh * 3600 ! assume freq to be in hours in this case214 sd(jf)%rotn(1) = sd(jf)%rotn(2) ! update before rotate informations215 sd(jf)%nrec_a(1) = sd(jf)%nrec_a(1) + 1 ! move back to after record216 ENDIF217 218 ! do we have to change the year/month/week/day of the forcing field??219 204 ! if we do time interpolation we will need to open next year/month/week/day file before the end of the current 220 205 ! one. If so, we are still before the end of the year/month/week/day when calling fld_rec so sd(jf)%nrec_a(1) 221 206 ! will be larger than the record number that should be read for current year/month/week/day 207 208 ! last record to be read in the current file 209 IF ( sd(jf)%nfreqh == -12 ) THEN ; ireclast = 1 ! yearly mean 210 ELSEIF( sd(jf)%nfreqh == -1 ) THEN ! monthly mean 211 IF( sd(jf)%cltype == 'monthly' ) THEN ; ireclast = 1 212 ELSE ; ireclast = 12 213 ENDIF 214 ELSE ! higher frequency mean (in hours) 215 IF( sd(jf)%cltype == 'monthly' ) THEN ; ireclast = 24 * nmonth_len(nmonth) / sd(jf)%nfreqh 216 ELSEIF( sd(jf)%cltype(1:4) == 'week' ) THEN ; ireclast = 24 * 7 / sd(jf)%nfreqh 217 ELSEIF( sd(jf)%cltype == 'daily' ) THEN ; ireclast = 24 / sd(jf)%nfreqh 218 ELSE ; ireclast = 24 * nyear_len( 1 ) / sd(jf)%nfreqh 219 ENDIF 220 ENDIF 221 222 222 ! do we need next file data? 223 IF( sd(jf)%nrec_a(1) > sd(jf)%nreclast ) THEN224 225 sd(jf)%nrec_a(1) = sd(jf)%nrec_a(1) - sd(jf)%nreclast !226 227 IF( .NOT. ( sd(jf)%ln_clim .AND. sd(jf)%cltype == 'yearly' ) ) THEN ! close/open the current/new file228 223 IF( sd(jf)%nrec_a(1) > ireclast ) THEN 224 225 sd(jf)%nrec_a(1) = 1 ! force to read the first record of the next file 226 227 IF( .NOT. sd(jf)%ln_clim ) THEN ! close the current file and open a new one. 228 229 229 llnxtmth = sd(jf)%cltype == 'monthly' .OR. nday == nmonth_len(nmonth) ! open next month file? 230 230 llnxtyr = sd(jf)%cltype == 'yearly' .OR. (nmonth == 12 .AND. llnxtmth) ! open next year file? … … 235 235 isecend = nsec_year + nsec1jan000 + (nitend - kt) * NINT(rdttra(1)) ! second at the end of the run 236 236 llstop = isecend > sd(jf)%nrec_a(2) ! read more than 1 record of next year 237 ! we suppose that the date of next file is next day (should be ok even for weekly files...) 237 238 238 CALL fld_clopn( sd(jf), nyear + COUNT((/llnxtyr /)) , & 239 239 & nmonth + COUNT((/llnxtmth/)) - 12 * COUNT((/llnxtyr /)), & … … 243 243 CALL ctl_warn('next year/month/week/day file: '//TRIM(sd(jf)%clname)// & 244 244 & ' not present -> back to current year/month/day') 245 CALL fld_clopn( sd(jf) ) ! back to the current year/month/day246 sd(jf)%nrec_a(1) = sd(jf)%nreclast ! force to read the last record in the current year file245 CALL fld_clopn( sd(jf), nyear, nmonth, nday ) ! back to the current year/month/day 246 sd(jf)%nrec_a(1) = ireclast ! force to read the last record to be read in the current year file 247 247 ENDIF 248 248 249 249 ENDIF 250 ENDIF ! open need next file? 251 252 ENDIF ! temporal interpolation? 250 ENDIF 251 252 ELSE 253 ! if we are not doing time interpolation, we must change the year/month/week/day of the file just after 254 ! switching to the NEW year/month/week/day. If it is the case, we are at the beginning of the 255 ! year/month/week/day when calling fld_rec so sd(jf)%nrec_a(1) = 1 256 IF( sd(jf)%nrec_a(1) == 1 .AND. .NOT. ( sd(jf)%ln_clim .AND. sd(jf)%cltype == 'yearly' ) ) & 257 & CALL fld_clopn( sd(jf), nyear, nmonth, nday ) 258 ENDIF 253 259 254 260 ! read after data 255 CALL fld_get( sd(jf), imap ) 256 257 ENDIF ! read new data? 261 IF( PRESENT(map) ) THEN 262 IF( PRESENT(jpk_1) ) THEN 263 CALL fld_get( sd(jf), map(jf)%ptr, jpk_1) 264 ELSE 265 CALL fld_get( sd(jf), map(jf)%ptr) 266 ENDIF 267 ELSE 268 CALL fld_get( sd(jf) ) 269 ENDIF 270 271 ENDIF 258 272 END DO ! --- end loop over field --- ! 259 273 260 CALL fld_rot( kt, sd ) ! rotate vector before/now/after fields if needed274 CALL fld_rot( kt, sd ) ! rotate vector fiels if needed 261 275 262 276 DO jf = 1, imf ! --- loop over field --- ! … … 268 282 WRITE(numout, clfmt) TRIM( sd(jf)%clvar ), kt, REAL(isecsbc,wp)/rday, nyear, nmonth, nday, & 269 283 & sd(jf)%nrec_b(1), sd(jf)%nrec_a(1), REAL(sd(jf)%nrec_b(2),wp)/rday, REAL(sd(jf)%nrec_a(2),wp)/rday 270 WRITE(numout, *) 'it _offset is : ',it_offset284 WRITE(numout, *) 'itime_add is : ',itime_add 271 285 ENDIF 272 286 ! temporal interpolation weights … … 295 309 296 310 297 SUBROUTINE fld_init( kn_fsbc, sdjf, map )311 SUBROUTINE fld_init( kn_fsbc, sdjf, map , jpk_1 ) 298 312 !!--------------------------------------------------------------------- 299 313 !! *** ROUTINE fld_init *** … … 304 318 INTEGER , INTENT(in ) :: kn_fsbc ! sbc computation period (in time step) 305 319 TYPE(FLD), INTENT(inout) :: sdjf ! input field related variables 306 TYPE(MAP_POINTER),INTENT(in) :: map ! global-to-local mapping indices 320 INTEGER , INTENT(in), OPTIONAL, DIMENSION(:) :: map ! global-to-local mapping indices 321 INTEGER , INTENT(in), OPTIONAL :: jpk_1 ! global-to-local mapping indices 307 322 !! 308 323 LOGICAL :: llprevyr ! are we reading previous year file? … … 317 332 CHARACTER(LEN=1000) :: clfmt ! write format 318 333 !!--------------------------------------------------------------------- 334 335 ! some default definitions... 336 sdjf%num = 0 ! default definition for non-opened file 337 IF( sdjf%ln_clim ) sdjf%clname = TRIM( sdjf%clrootname ) ! file name defaut definition, never change in this case 319 338 llprevyr = .FALSE. 320 339 llprevmth = .FALSE. … … 323 342 isec_week = 0 324 343 344 IF( sdjf%cltype(1:4) == 'week' .AND. nn_leapy == 0 ) & 345 & CALL ctl_stop('fld_clopn: weekly file ('//TRIM(sdjf%clrootname)//') needs nn_leapy = 1') 346 IF( sdjf%cltype(1:4) == 'week' .AND. sdjf%ln_clim ) & 347 & CALL ctl_stop('fld_clopn: weekly file ('//TRIM(sdjf%clrootname)//') needs ln_clim = .FALSE.') 348 325 349 ! define record informations 326 350 CALL fld_rec( kn_fsbc, sdjf, ldbefore = .TRUE. ) ! return before values in sdjf%nrec_a (as we will swap it later) … … 336 360 llprevyr = .NOT. sdjf%ln_clim ! use previous year file? 337 361 ELSE 338 CALL ctl_stop( "fld_init: yearly mean file must be in a yearly type of file: "//TRIM(sdjf%cl rootname) )362 CALL ctl_stop( "fld_init: yearly mean file must be in a yearly type of file: "//TRIM(sdjf%clname) ) 339 363 ENDIF 340 364 ELSEIF( sdjf%nfreqh == -1 ) THEN ! monthly mean … … 343 367 llprevmth = .TRUE. ! use previous month file? 344 368 llprevyr = llprevmth .AND. nmonth == 1 ! use previous year file? 369 ! IF (lwp) write(numout,*) sdjf%clvar,'AFTER', sdjf%nrec_a(1), sdjf%nrec_a(2), sdjf%clname 345 370 ELSE ! yearly file 346 371 sdjf%nrec_a(1) = 12 ! force to read december mean … … 367 392 ENDIF 368 393 ENDIF 369 !370 394 IF ( sdjf%cltype(1:4) == 'week' ) THEN 371 395 isec_week = isec_week + ksec_week( sdjf%cltype(6:8) ) ! second since the beginning of the week … … 383 407 ! if previous year/month/day file does not exist, we switch to the current year/month/day 384 408 IF( llprev .AND. sdjf%num <= 0 ) THEN 385 CALL ctl_warn( 'previous year/month/week/day file: '//TRIM(sdjf%cl rootname)// &409 CALL ctl_warn( 'previous year/month/week/day file: '//TRIM(sdjf%clname)// & 386 410 & ' not present -> back to current year/month/week/day' ) 387 411 ! we force to read the first record of the current year/month/day instead of last record of previous year/month/day 388 412 llprev = .FALSE. 389 413 sdjf%nrec_a(1) = 1 390 CALL fld_clopn( sdjf )414 CALL fld_clopn( sdjf, nyear, nmonth, nday ) 391 415 ENDIF 392 416 393 IF( llprev ) THEN ! check if the record sdjf%nrec_a(1) exists in the file417 IF( llprev ) THEN ! check if the last record sdjf%nrec_n(1) exists in the file 394 418 idvar = iom_varid( sdjf%num, sdjf%clvar ) ! id of the variable sdjf%clvar 395 419 IF( idvar <= 0 ) RETURN … … 398 422 ENDIF 399 423 400 ! read before data in after arrays(as we will swap it later) 401 CALL fld_get( sdjf, map ) 424 ! read before data 425 IF( PRESENT(map) ) THEN 426 IF( PRESENT(jpk_1) ) THEN 427 CALL fld_get( sdjf, map , jpk_1) ! read before values in after arrays(as we will swap it later) 428 ELSE 429 CALL fld_get( sdjf, map ) ! read before values in after arrays(as we will swap it later) 430 ENDIF 431 ELSE 432 CALL fld_get( sdjf ) ! read before values in after arrays(as we will swap it later) 433 ENDIF 402 434 403 435 clfmt = "('fld_init : time-interpolation for ', a, ' read previous record = ', i4, ' at time = ', f7.2, ' days')" 404 436 IF(lwp) WRITE(numout, clfmt) TRIM(sdjf%clvar), sdjf%nrec_a(1), REAL(sdjf%nrec_a(2),wp)/rday 405 437 438 IF( llprev ) CALL iom_close( sdjf%num ) ! force to close previous year file (-> redefine sdjf%num to 0) 439 406 440 ENDIF 441 442 ! make sure current year/month/day file is opened 443 IF( sdjf%num <= 0 ) THEN 444 ! 445 IF ( sdjf%cltype(1:4) == 'week' ) THEN 446 isec_week = ksec_week( sdjf%cltype(6:8) ) ! second since the beginning of the week 447 llprevmth = isec_week > nsec_month ! longer time since beginning of the week than the month 448 llprevyr = llprevmth .AND. nmonth == 1 449 ELSE 450 isec_week = 0 451 llprevmth = .FALSE. 452 llprevyr = .FALSE. 453 ENDIF 454 ! 455 iyear = nyear - COUNT((/llprevyr /)) 456 imonth = nmonth - COUNT((/llprevmth/)) + 12 * COUNT((/llprevyr /)) 457 iday = nday + nmonth_len(nmonth-1) * COUNT((/llprevmth/)) - isec_week / NINT(rday) 458 ! 459 CALL fld_clopn( sdjf, iyear, imonth, iday ) 460 ENDIF 407 461 ! 408 462 END SUBROUTINE fld_init 409 463 410 464 411 SUBROUTINE fld_rec( kn_fsbc, sdjf, ldbefore, kit, kt_offset )465 SUBROUTINE fld_rec( kn_fsbc, sdjf, ldbefore, jit, time_offset ) 412 466 !!--------------------------------------------------------------------- 413 467 !! *** ROUTINE fld_rec *** … … 423 477 TYPE(FLD), INTENT(inout) :: sdjf ! input field related variables 424 478 LOGICAL , INTENT(in ), OPTIONAL :: ldbefore ! sent back before record values (default = .FALSE.) 425 INTEGER , INTENT(in ), OPTIONAL :: kit ! index of barotropic subcycle479 INTEGER , INTENT(in ), OPTIONAL :: jit ! index of barotropic subcycle 426 480 ! used only if sdjf%ln_tint = .TRUE. 427 INTEGER , INTENT(in ), OPTIONAL :: kt_offset! Offset of required time level compared to "now"428 !time level in units of time steps.481 INTEGER , INTENT(in ), OPTIONAL :: time_offset ! Offset of required time level compared to "now" 482 ! time level in units of time steps. 429 483 !! 430 484 LOGICAL :: llbefore ! local definition of ldbefore … … 433 487 INTEGER :: ifreq_sec ! frequency mean (in seconds) 434 488 INTEGER :: isec_week ! number of seconds since the start of the weekly file 435 INTEGER :: it _offset! local time offset variable489 INTEGER :: itime_add ! local time offset variable 436 490 REAL(wp) :: ztmp ! temporary variable 437 491 !!---------------------------------------------------------------------- … … 443 497 ENDIF 444 498 ! 445 it_offset = 0 446 IF( PRESENT(kt_offset) ) it_offset = kt_offset 447 IF( PRESENT(kit) ) THEN ; it_offset = ( kit + it_offset ) * NINT( rdt/REAL(nn_baro,wp) ) 448 ELSE ; it_offset = it_offset * NINT( rdttra(1) ) 449 ENDIF 499 itime_add = 0 500 IF( PRESENT(time_offset) ) itime_add = time_offset 450 501 ! 451 502 ! ! =========== ! … … 465 516 ! forcing record : 1 466 517 ! 467 ztmp = REAL( nday, wp ) / REAL( nyear_len(1), wp ) + 0.5 + REAL( it_offset, wp ) 518 ztmp = REAL( nday, wp ) / REAL( nyear_len(1), wp ) + 0.5 519 IF( PRESENT(jit) ) THEN 520 ztmp = ztmp + (jit+itime_add)*rdt/REAL(nn_baro,wp) 521 ELSE 522 ztmp = ztmp + itime_add*rdttra(1) 523 ENDIF 468 524 sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) 469 525 ! swap at the middle of the year … … 493 549 ! forcing record : nmonth 494 550 ! 495 ztmp = REAL( nday, wp ) / REAL( nmonth_len(nmonth), wp ) + 0.5 + REAL( it_offset, wp ) 551 ztmp = REAL( nday, wp ) / REAL( nmonth_len(nmonth), wp ) + 0.5 552 IF( PRESENT(jit) ) THEN 553 ztmp = ztmp + (jit+itime_add)*rdt/REAL(nn_baro,wp) / ( REAL( nmonth_len(nmonth), wp )* 86400. ) 554 ELSE 555 ztmp = ztmp + itime_add*rdttra(1) / ( REAL( nmonth_len(nmonth), wp ) * 86400. ) 556 ENDIF 496 557 imth = nmonth + INT( ztmp ) - COUNT((/llbefore/)) 497 558 IF( sdjf%cltype == 'monthly' ) THEN ; sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) … … 499 560 ENDIF 500 561 sdjf%nrec_a(2) = nmonth_half( imth ) + nsec1jan000 ! swap at the middle of the month 562 ! IF (lwp) write(numout,*) sdjf%clvar, sdjf%nrec_a(1), sdjf%nrec_a(2), nday, nmonth, itime_add, & 563 ! rdttra(1), COUNT((/llbefore/)), ztmp, nmonth_half( imth ), & 564 ! nsec1jan000, REAL( nmonth_len(nmonth), wp ) 501 565 ELSE ! no time interpolation 502 566 IF( sdjf%cltype == 'monthly' ) THEN ; sdjf%nrec_a(1) = 1 … … 519 583 ELSE ; ztmp = REAL(nsec_year ,wp) ! since 00h on Jan 1 of the current year 520 584 ENDIF 521 ztmp = ztmp + 0.5 * REAL(kn_fsbc - 1, wp) * rdttra(1) + REAL( it_offset, wp ) ! centrered in the middle of sbc time step 522 ztmp = ztmp + 0.01 * rdttra(1) ! avoid truncation error 585 ztmp = ztmp + 0.5 * REAL(kn_fsbc - 1, wp) * rdttra(1) ! shift time to be centrered in the middle of sbc time step 586 ztmp = ztmp + 0.01 * rdttra(1) ! add 0.01 time step to avoid truncation error 587 IF( PRESENT(jit) ) THEN 588 ztmp = ztmp + (jit+itime_add)*rdt/REAL(nn_baro,wp) 589 ELSE 590 ztmp = ztmp + itime_add*rdttra(1) 591 ENDIF 523 592 IF( sdjf%ln_tint ) THEN ! time interpolation, shift by 1/2 record 524 593 ! 525 ! INT( ztmp/ifreq_sec + 0.5)594 ! INT( ztmp ) 526 595 ! /|\ 527 596 ! 2 | *-----( … … 529 598 ! 0 |--( 530 599 ! |--+--|--+--|--+--|--> time 531 ! 0 /|\ 1 /|\ 2 /|\ 3 (ztmp/ifreq_sec)600 ! 0 /|\ 1 /|\ 2 /|\ 3 (nsec_year/ifreq_sec) or (nsec_month/ifreq_sec) 532 601 ! | | | 533 602 ! | | | … … 537 606 ELSE ! no time interpolation 538 607 ! 539 ! INT( ztmp/ifreq_sec)608 ! INT( ztmp ) 540 609 ! /|\ 541 610 ! 2 | *-----( … … 543 612 ! 0 |-----( 544 613 ! |--+--|--+--|--+--|--> time 545 ! 0 /|\ 1 /|\ 2 /|\ 3 (ztmp/ifreq_sec)614 ! 0 /|\ 1 /|\ 2 /|\ 3 (nsec_year/ifreq_sec) or (nsec_month/ifreq_sec) 546 615 ! | | | 547 616 ! | | | … … 550 619 ztmp= ztmp / REAL(ifreq_sec, wp) 551 620 ENDIF 552 sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) ! record n umber to be read621 sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) ! record nomber to be read 553 622 554 623 iendrec = ifreq_sec * sdjf%nrec_a(1) + nsec1jan000 ! end of this record (in second) … … 569 638 570 639 571 SUBROUTINE fld_get( sdjf, map )640 SUBROUTINE fld_get( sdjf, map, jpk_1 ) 572 641 !!--------------------------------------------------------------------- 573 642 !! *** ROUTINE fld_get *** … … 576 645 !!---------------------------------------------------------------------- 577 646 TYPE(FLD), INTENT(inout) :: sdjf ! input field related variables 578 TYPE(MAP_POINTER),INTENT(in) :: map ! global-to-local mapping indices 647 INTEGER , INTENT(in), OPTIONAL, DIMENSION(:) :: map ! global-to-local mapping indices 648 INTEGER , INTENT(in), OPTIONAL :: jpk_1 ! number of levels in bdy data 579 649 !! 580 650 INTEGER :: ipk ! number of vertical levels of sdjf%fdta ( 2D: ipk=1 ; 3D: ipk=jpk ) 581 651 INTEGER :: iw ! index into wgts array 582 INTEGER :: ipdom ! index of the domain 583 !!--------------------------------------------------------------------- 584 ! 652 !!--------------------------------------------------------------------- 653 585 654 ipk = SIZE( sdjf%fnow, 3 ) 586 ! 587 IF( ASSOCIATED(map%ptr) ) THEN 588 IF( sdjf%ln_tint ) THEN ; CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map%ptr ) 589 ELSE ; CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,: ), sdjf%nrec_a(1), map%ptr ) 655 656 IF( PRESENT(map) ) THEN 657 IF( PRESENT(jpk_1) ) THEN 658 IF( sdjf%ln_tint ) THEN ; CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map, jpk_1 ) 659 IF(lwp) WRITE(numout,*) 'in get 2' 660 CALL flush(numout) 661 ELSE ; CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,: ), sdjf%nrec_a(1), map, jpk_1 ) 662 IF(lwp) WRITE(numout,*) 'in get 1' 663 CALL flush(numout) 664 ENDIF 665 ELSE 666 IF( sdjf%ln_tint ) THEN ; CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map ) 667 ELSE ; CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,: ), sdjf%nrec_a(1), map ) 668 ENDIF 590 669 ENDIF 591 670 ELSE IF( LEN(TRIM(sdjf%wgtname)) > 0 ) THEN … … 595 674 ENDIF 596 675 ELSE 597 IF( SIZE(sdjf%fnow, 1) == jpi ) THEN ; ipdom = jpdom_data598 ELSE ; ipdom = jpdom_unknown599 ENDIF600 676 SELECT CASE( ipk ) 601 CASE(1) 602 IF( sdjf%ln_tint ) THEN ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,1,2), sdjf%nrec_a(1) )603 ELSE ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,1 ), sdjf%nrec_a(1) )677 CASE(1) 678 IF( sdjf%ln_tint ) THEN ; CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,1,2), sdjf%nrec_a(1) ) 679 ELSE ; CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fnow(:,:,1 ), sdjf%nrec_a(1) ) 604 680 ENDIF 605 681 CASE DEFAULT 606 IF( sdjf%ln_tint ) THEN ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1) )607 ELSE ; CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,: ), sdjf%nrec_a(1) )682 IF( sdjf%ln_tint ) THEN ; CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1) ) 683 ELSE ; CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fnow(:,:,: ), sdjf%nrec_a(1) ) 608 684 ENDIF 609 685 END SELECT 610 686 ENDIF 611 687 ! 612 sdjf%rotn (2)= .false. ! vector not yet rotated688 sdjf%rotn = .false. ! vector not yet rotated 613 689 614 690 END SUBROUTINE fld_get 615 691 616 SUBROUTINE fld_map( num, clvar, dta, nrec, map )617 !!--------------------------------------------------------------------- 618 !! *** ROUTINE fld_ map***692 SUBROUTINE fld_map( num, clvar, dta, nrec, map, jpk_1 ) 693 !!--------------------------------------------------------------------- 694 !! *** ROUTINE fld_get *** 619 695 !! 620 696 !! ** Purpose : read global data from file and map onto local data 621 697 !! using a general mapping (for open boundaries) 698 !! 699 !! 12-04-13 updated to include interpolation of boundary 700 !! data from non-native vertical grid 622 701 !!---------------------------------------------------------------------- 623 702 #if defined key_bdy 624 USE bdy_oce, ONLY: dta_global, dta_global 2! workspace to read in global data arrays703 USE bdy_oce, ONLY: dta_global, dta_global_1, dta_global_2, idx_bdy ! workspace to read in global data arrays 625 704 #endif 626 INTEGER , INTENT(in ) :: num ! stream number 627 CHARACTER(LEN=*) , INTENT(in ) :: clvar ! variable name 628 REAL(wp), DIMENSION(:,:,:), INTENT(out) :: dta ! output field on model grid (2 dimensional) 629 INTEGER , INTENT(in ) :: nrec ! record number to read (ie time slice) 630 INTEGER, DIMENSION(:) , INTENT(in ) :: map ! global-to-local mapping indices 631 !! 632 INTEGER :: ipi ! length of boundary data on local process 633 INTEGER :: ipj ! length of dummy dimension ( = 1 ) 634 INTEGER :: ipk ! number of vertical levels of dta ( 2D: ipk=1 ; 3D: ipk=jpk ) 635 INTEGER :: ilendta ! length of data in file 636 INTEGER :: idvar ! variable ID 637 INTEGER :: ib, ik, ji, jj ! loop counters 705 706 INTEGER , INTENT(in ) :: num ! stream number 707 CHARACTER(LEN=*) , INTENT(in ) :: clvar ! variable name 708 REAL(wp), DIMENSION(:,:,:), INTENT(out) :: dta ! output field on model grid (2 dimensional) 709 INTEGER , INTENT(in ) :: nrec ! record number to read (ie time slice) 710 INTEGER, DIMENSION(:) , INTENT(in ) :: map ! global-to-local mapping indices 711 INTEGER , INTENT(in), OPTIONAL :: jpk_1 ! number of levels in bdy data 712 INTEGER :: jpkm1_1 ! number of levels in bdy data minus 1 713 !! 714 INTEGER :: ipi ! length of boundary data on local process 715 INTEGER :: ipj ! length of dummy dimension ( = 1 ) 716 INTEGER :: ipk, ipkm1 ! number of vertical levels of dta ( 2D: ipk=1 ; 3D: ipk=jpk ) 717 INTEGER :: ilendta ! length of data in file 718 INTEGER :: idvar ! variable ID 719 INTEGER :: ib, ik, ikk! loop counters 638 720 INTEGER :: ierr 639 REAL(wp), POINTER, DIMENSION(:,:,:) :: dta_read ! work space for global data 721 INTEGER :: igrd, ib_bdy 722 REAL(wp) :: zl, zi ! tmp variable for current depth and interpolation factor 723 REAL(wp) :: fv, fv_alt ! fillvalue and alternative -ABS(fv) 724 REAL(wp), POINTER, DIMENSION(:,:,:) :: dta_read ! work space for global data 725 REAL(wp), POINTER, DIMENSION(:,:,:) :: dta_read_1 ! work space for BDY data from file 726 REAL(wp), POINTER, DIMENSION(:,:) :: dta_read_2 ! work space for BDY depth data from file 640 727 !!--------------------------------------------------------------------- 641 728 729 #if defined key_bdy 730 dta_read => dta_global 731 IF( PRESENT(jpk_1) ) THEN 732 IF( jpk_1>0 ) THEN 733 dta_read_1 => dta_global_1 734 dta_read_2 => dta_global_2 735 jpkm1_1 = jpk_1 - 1 736 ENDIF 737 ENDIF 738 igrd = 1 ! T/S only so far 739 ib_bdy = 1 ! and only one bdy file 740 #endif 741 642 742 ipi = SIZE( dta, 1 ) 643 743 ipj = 1 644 744 ipk = SIZE( dta, 3 ) 745 ipkm1 = ipk - 1 645 746 646 747 idvar = iom_varid( num, clvar ) 647 748 ilendta = iom_file(num)%dimsz(1,idvar) 648 649 #if defined key_bdy650 ipj = iom_file(num)%dimsz(2,idvar)651 IF (ipj == 1) THEN ! we assume that this is a structured open boundary file652 dta_read => dta_global653 ELSE654 dta_read => dta_global2655 ENDIF656 #endif657 658 749 IF(lwp) WRITE(numout,*) 'Dim size for ',TRIM(clvar),' is ', ilendta 659 750 IF(lwp) WRITE(numout,*) 'Number of levels for ',TRIM(clvar),' is ', ipk 751 CALL flush(numout) 660 752 661 753 SELECT CASE( ipk ) 662 CASE(1) ; CALL iom_get ( num, jpdom_unknown, clvar, dta_read(1:ilendta,1:ipj,1 ), nrec ) 663 CASE DEFAULT ; CALL iom_get ( num, jpdom_unknown, clvar, dta_read(1:ilendta,1:ipj,1:ipk), nrec ) 754 CASE(1) 755 CALL iom_get ( num, jpdom_unknown, clvar, dta_read(1:ilendta,1:ipj,1 ), nrec ) 756 CASE DEFAULT 757 #if defined key_bdy 758 IF( PRESENT(jpk_1) ) THEN ! boundary data not on model grid: veritcal interpolation 759 IF( jpk_1>0 ) THEN 760 IF( lwp )THEN 761 WRITE(numout,*) 'BDY: interpolate T & S data onto new vertical mesh' 762 ENDIF 763 ! 764 ! gather data from file along with depth and _FillValue info 765 ! 766 CALL iom_get ( num, jpdom_unknown, clvar, dta_read_1(1:ilendta,1:ipj,1:jpk_1), nrec ) 767 CALL iom_get ( num, jpdom_unknown, 'deptht', dta_read_2(1:ilendta,1:jpk_1) ) 768 CALL iom_getatt(num, '_FillValue', fv, cdvar=clvar ) 769 ! 770 fv_alt = -ABS(fv) ! set _FillValue < 0 as we make use of MAXVAL and MAXLOC later 771 ! 772 DO ib = 1, ipi 773 DO ik = 1, ipk 774 IF( ( dta_read_1(map(ib),1,ik) == fv ) ) THEN 775 dta_read_2(map(ib),ik) = fv_alt ! safety: put fillvalue into external depth field so consistent with data 776 ENDIF 777 dta_read(map(ib),1,ik) = fv_alt ! put fillvalue into new field as if all goes well all wet points will be replaced 778 ENDDO 779 ENDDO ! had to use map in this loop ?? tried looping over ib but failed !! investigate TODO 780 ! 781 DO ib = 1, ipi 782 DO ik = 1, ipk 783 zl = gdept_1(idx_bdy(ib_bdy)%nbi(ib,igrd),idx_bdy(ib_bdy)%nbj(ib,igrd),ik) ! if using in step could use fsdept instead of gdept_1? 784 IF( zl < dta_read_2(map(ib),1) ) THEN ! above the first level of external data 785 dta_read(map(ib),1,ik) = dta_read_1(map(ib),1,1) 786 ELSEIF( zl > MAXVAL(dta_read_2(map(ib),:),1) ) THEN ! below the last level of external data 787 dta_read(map(ib),1,ik) = dta_read_1(map(ib),1,MAXLOC(dta_read_2(map(ib),:),1)) 788 ELSE ! inbetween : vertical interpolation between ikk & ikk+1 789 DO ikk = 1, ipkm1 ! when gdept_1(ikk) < zl < gdept_1(ikk+1) 790 IF( ( (zl-dta_read_2(map(ib),ikk)) * (zl-dta_read_2(map(ib),ikk+1)) <= 0._wp) & 791 & .AND. (dta_read_2(map(ib),ikk+1) /= fv_alt)) THEN 792 zi = ( zl - dta_read_2(map(ib),ikk) ) / (dta_read_2(map(ib),ikk+1)-dta_read_2(map(ib),ikk)) 793 dta_read(map(ib),1,ik) = dta_read_1(map(ib),1,ikk) + & 794 & ( dta_read_1(map(ib),1,ikk+1) - dta_read_1(map(ib),1,ikk) ) * zi 795 ENDIF 796 END DO 797 ENDIF 798 END DO 799 END DO 800 ! 801 IF(lwp) WRITE(numout,*) 'BDY: finished interpolating T & S data onto new vertical mesh' 802 ! 803 ENDIF ! is jpk_1 > 0 804 ELSE ! must be on model grid already 805 CALL iom_get ( num, jpdom_unknown, clvar, dta_read(1:ilendta,1:ipj,1:ipk), nrec ) 806 ENDIF ! end PRESENT jpk_1 807 #else 808 CALL iom_get ( num, jpdom_unknown, clvar, dta_read(1:ilendta,1:ipj,1:ipk), nrec ) 809 #endif 664 810 END SELECT 665 811 ! 666 IF (ipj==1) THEN 667 DO ib = 1, ipi 668 DO ik = 1, ipk 669 dta(ib,1,ik) = dta_read(map(ib),1,ik) 670 END DO 812 DO ib = 1, ipi 813 DO ik = 1, ipk 814 dta(ib,1,ik) = dta_read(map(ib),1,ik) 671 815 END DO 672 ELSE ! we assume that this is a structured open boundary file 673 DO ib = 1, ipi 674 jj=1+floor(REAL(map(ib)-1)/REAL(ilendta)) 675 ji=map(ib)-(jj-1)*ilendta 676 DO ik = 1, ipk 677 dta(ib,1,ik) = dta_read(ji,jj,ik) 678 END DO 679 END DO 680 ENDIF 816 END DO 681 817 682 818 END SUBROUTINE fld_map … … 692 828 TYPE(FLD), INTENT(inout), DIMENSION(:) :: sd ! input field related variables 693 829 !! 694 INTEGER :: ju, jv,jk,jn! loop indices830 INTEGER :: ju, jv, jk ! loop indices 695 831 INTEGER :: imf ! size of the structure sd 696 832 INTEGER :: ill ! character length … … 707 843 DO ju = 1, imf 708 844 ill = LEN_TRIM( sd(ju)%vcomp ) 709 DO jn = 2-COUNT((/sd(ju)%ln_tint/)), 2 710 IF( ill > 0 .AND. .NOT. sd(ju)%rotn(jn) ) THEN ! find vector rotations required 711 IF( sd(ju)%vcomp(1:1) == 'U' ) THEN ! east-west component has symbolic name starting with 'U' 712 ! look for the north-south component which has same symbolic name but with 'U' replaced with 'V' 713 clcomp = 'V' // sd(ju)%vcomp(2:ill) ! works even if ill == 1 714 iv = -1 715 DO jv = 1, imf 716 IF( TRIM(sd(jv)%vcomp) == TRIM(clcomp) ) iv = jv 717 END DO 718 IF( iv > 0 ) THEN ! fields ju and iv are two components which need to be rotated together 719 DO jk = 1, SIZE( sd(ju)%fnow, 3 ) 720 IF( sd(ju)%ln_tint )THEN 721 CALL rot_rep( sd(ju)%fdta(:,:,jk,jn), sd(iv)%fdta(:,:,jk,jn), 'T', 'en->i', utmp(:,:) ) 722 CALL rot_rep( sd(ju)%fdta(:,:,jk,jn), sd(iv)%fdta(:,:,jk,jn), 'T', 'en->j', vtmp(:,:) ) 723 sd(ju)%fdta(:,:,jk,jn) = utmp(:,:) ; sd(iv)%fdta(:,:,jk,jn) = vtmp(:,:) 724 ELSE 725 CALL rot_rep( sd(ju)%fnow(:,:,jk ), sd(iv)%fnow(:,:,jk ), 'T', 'en->i', utmp(:,:) ) 726 CALL rot_rep( sd(ju)%fnow(:,:,jk ), sd(iv)%fnow(:,:,jk ), 'T', 'en->j', vtmp(:,:) ) 727 sd(ju)%fnow(:,:,jk ) = utmp(:,:) ; sd(iv)%fnow(:,:,jk ) = vtmp(:,:) 728 ENDIF 729 END DO 730 sd(ju)%rotn(jn) = .TRUE. ! vector was rotated 731 IF( lwp .AND. kt == nit000 ) WRITE(numout,*) & 732 & 'fld_read: vector pair ('//TRIM(sd(ju)%clvar)//', '//TRIM(sd(iv)%clvar)//') rotated on to model grid' 733 ENDIF 734 ENDIF 735 ENDIF 736 END DO 845 IF( ill > 0 .AND. .NOT. sd(ju)%rotn ) THEN ! find vector rotations required 846 IF( sd(ju)%vcomp(1:1) == 'U' ) THEN ! east-west component has symbolic name starting with 'U' 847 ! look for the north-south component which has same symbolic name but with 'U' replaced with 'V' 848 clcomp = 'V' // sd(ju)%vcomp(2:ill) ! works even if ill == 1 849 iv = -1 850 DO jv = 1, imf 851 IF( TRIM(sd(jv)%vcomp) == TRIM(clcomp) ) iv = jv 852 END DO 853 IF( iv > 0 ) THEN ! fields ju and iv are two components which need to be rotated together 854 DO jk = 1, SIZE( sd(ju)%fnow, 3 ) 855 IF( sd(ju)%ln_tint )THEN 856 CALL rot_rep( sd(ju)%fdta(:,:,jk,2), sd(iv)%fdta(:,:,jk,2), 'T', 'en->i', utmp(:,:) ) 857 CALL rot_rep( sd(ju)%fdta(:,:,jk,2), sd(iv)%fdta(:,:,jk,2), 'T', 'en->j', vtmp(:,:) ) 858 sd(ju)%fdta(:,:,jk,2) = utmp(:,:) ; sd(iv)%fdta(:,:,jk,2) = vtmp(:,:) 859 ELSE 860 CALL rot_rep( sd(ju)%fnow(:,:,jk ), sd(iv)%fnow(:,:,jk ), 'T', 'en->i', utmp(:,:) ) 861 CALL rot_rep( sd(ju)%fnow(:,:,jk ), sd(iv)%fnow(:,:,jk ), 'T', 'en->j', vtmp(:,:) ) 862 sd(ju)%fnow(:,:,jk ) = utmp(:,:) ; sd(iv)%fnow(:,:,jk ) = vtmp(:,:) 863 ENDIF 864 END DO 865 sd(ju)%rotn = .TRUE. ! vector was rotated 866 IF( lwp .AND. kt == nit000 ) WRITE(numout,*) & 867 & 'fld_read: vector pair ('//TRIM(sd(ju)%clvar)//', '//TRIM(sd(iv)%clvar)//') rotated on to model grid' 868 ENDIF 869 ENDIF 870 ENDIF 737 871 END DO 738 872 ! … … 749 883 !!---------------------------------------------------------------------- 750 884 TYPE(FLD) , INTENT(inout) :: sdjf ! input field related variables 751 INTEGER , OPTIONAL, INTENT(in ) :: kyear ! year value752 INTEGER , OPTIONAL, INTENT(in ) :: kmonth ! month value753 INTEGER , OPTIONAL, INTENT(in ) :: kday ! day value885 INTEGER , INTENT(in ) :: kyear ! year value 886 INTEGER , INTENT(in ) :: kmonth ! month value 887 INTEGER , INTENT(in ) :: kday ! day value 754 888 LOGICAL, OPTIONAL, INTENT(in ) :: ldstop ! stop if open to read a non-existing file (default = .TRUE.) 755 !! 756 LOGICAL :: llprevyr ! are we reading previous year file? 757 LOGICAL :: llprevmth ! are we reading previous month file? 758 INTEGER :: iyear, imonth, iday ! first day of the current file in yyyy mm dd 759 INTEGER :: isec_week ! number of seconds since start of the weekly file 760 INTEGER :: indexyr ! year undex (O/1/2: previous/current/next) 761 INTEGER :: iyear_len, imonth_len ! length (days) of iyear and imonth ! 762 CHARACTER(len = 256):: clname ! temporary file name 763 !!---------------------------------------------------------------------- 764 IF( PRESENT(kyear) ) THEN ! use given values 765 iyear = kyear 766 imonth = kmonth 767 iday = kday 768 ELSE ! use current day values 769 IF ( sdjf%cltype(1:4) == 'week' ) THEN ! find the day of the beginning of the week 770 isec_week = ksec_week( sdjf%cltype(6:8) ) ! second since the beginning of the week 771 llprevmth = isec_week > nsec_month ! longer time since beginning of the week than the month 772 llprevyr = llprevmth .AND. nmonth == 1 773 ELSE 774 isec_week = 0 775 llprevmth = .FALSE. 776 llprevyr = .FALSE. 777 ENDIF 778 iyear = nyear - COUNT((/llprevyr /)) 779 imonth = nmonth - COUNT((/llprevmth/)) + 12 * COUNT((/llprevyr /)) 780 iday = nday + nmonth_len(nmonth-1) * COUNT((/llprevmth/)) - isec_week / NINT(rday) 781 ENDIF 782 889 !!---------------------------------------------------------------------- 890 891 IF( sdjf%num /= 0 ) CALL iom_close( sdjf%num ) ! close file if already open 783 892 ! build the new filename if not climatological data 784 clname=TRIM(sdjf%clrootname)785 ! 786 ! note that sdjf%ln_clim is is only acting on the presence of the year in the file name893 sdjf%clname=TRIM(sdjf%clrootname) 894 ! 895 ! note that sdjf%ln_clim is is only acting on presence of the year in the file 787 896 IF( .NOT. sdjf%ln_clim ) THEN 788 WRITE( clname, '(a,"_y",i4.4)' ) TRIM( sdjf%clrootname ), iyear ! add year789 IF( sdjf%cltype /= 'yearly' ) WRITE( clname, '(a,"m" ,i2.2)' ) TRIM( clname ), imonth ! add month897 WRITE(sdjf%clname, '(a,"_y",i4.4)' ) TRIM( sdjf%clrootname ), kyear ! add year 898 IF( sdjf%cltype /= 'yearly' ) WRITE(sdjf%clname, '(a,"m" ,i2.2)' ) TRIM( sdjf%clname ), kmonth ! add month 790 899 ELSE 791 900 ! build the new filename if climatological data 792 IF( sdjf%cltype /= 'yearly' ) WRITE( clname, '(a,"_m",i2.2)' ) TRIM( sdjf%clrootname ), imonth ! add month901 IF( sdjf%cltype /= 'yearly' ) WRITE(sdjf%clname, '(a,"_m",i2.2)' ) TRIM( sdjf%clrootname ), kmonth ! add month 793 902 ENDIF 794 903 IF( sdjf%cltype == 'daily' .OR. sdjf%cltype(1:4) == 'week' ) & 795 & WRITE(clname, '(a,"d" ,i2.2)' ) TRIM( clname ), iday ! add day 796 ! 797 IF( TRIM(clname) /= TRIM(sdjf%clname) .OR. sdjf%num == 0 ) THEN ! new file to be open 798 799 sdjf%clname = TRIM(clname) 800 IF( sdjf%num /= 0 ) CALL iom_close( sdjf%num ) ! close file if already open 801 CALL iom_open( sdjf%clname, sdjf%num, ldstop = ldstop, ldiof = LEN(TRIM(sdjf%wgtname)) > 0 ) 802 803 ! find the last record to be read -> update sdjf%nreclast 804 indexyr = iyear - nyear + 1 805 iyear_len = nyear_len( indexyr ) 806 SELECT CASE ( indexyr ) 807 CASE ( 0 ) ; imonth_len = 31 ! previous year -> imonth = 12 808 CASE ( 1 ) ; imonth_len = nmonth_len(imonth) 809 CASE ( 2 ) ; imonth_len = 31 ! next year -> imonth = 1 810 END SELECT 811 812 ! last record to be read in the current file 813 IF ( sdjf%nfreqh == -12 ) THEN ; sdjf%nreclast = 1 ! yearly mean 814 ELSEIF( sdjf%nfreqh == -1 ) THEN ! monthly mean 815 IF( sdjf%cltype == 'monthly' ) THEN ; sdjf%nreclast = 1 816 ELSE ; sdjf%nreclast = 12 817 ENDIF 818 ELSE ! higher frequency mean (in hours) 819 IF( sdjf%cltype == 'monthly' ) THEN ; sdjf%nreclast = 24 * imonth_len / sdjf%nfreqh 820 ELSEIF( sdjf%cltype(1:4) == 'week' ) THEN ; sdjf%nreclast = 24 * 7 / sdjf%nfreqh 821 ELSEIF( sdjf%cltype == 'daily' ) THEN ; sdjf%nreclast = 24 / sdjf%nfreqh 822 ELSE ; sdjf%nreclast = 24 * iyear_len / sdjf%nfreqh 823 ENDIF 824 ENDIF 825 826 ENDIF 827 ! 904 & WRITE(sdjf%clname, '(a,"d" ,i2.2)' ) TRIM( sdjf%clname ), kday ! add day 905 ! 906 CALL iom_open( sdjf%clname, sdjf%num, ldstop = ldstop, ldiof = LEN(TRIM(sdjf%wgtname)) > 0 ) 907 ! 828 908 END SUBROUTINE fld_clopn 829 909 … … 847 927 DO jf = 1, SIZE(sdf) 848 928 sdf(jf)%clrootname = TRIM( cdir )//TRIM( sdf_n(jf)%clname ) 849 sdf(jf)%clname = "not yet defined"850 929 sdf(jf)%nfreqh = sdf_n(jf)%nfreqh 851 930 sdf(jf)%clvar = sdf_n(jf)%clvar … … 853 932 sdf(jf)%ln_clim = sdf_n(jf)%ln_clim 854 933 sdf(jf)%cltype = sdf_n(jf)%cltype 855 sdf(jf)%num = -1 856 sdf(jf)%wgtname = " " 934 sdf(jf)%wgtname = " " 857 935 IF( LEN( TRIM(sdf_n(jf)%wname) ) > 0 ) sdf(jf)%wgtname = TRIM( cdir )//TRIM( sdf_n(jf)%wname ) 858 sdf(jf)%vcomp = sdf_n(jf)%vcomp 859 sdf(jf)%rotn(:) = .TRUE. ! pretend to be rotated -> won't try to rotate data before the first call to fld_get 860 IF( sdf(jf)%cltype(1:4) == 'week' .AND. nn_leapy == 0 ) & 861 & CALL ctl_stop('fld_clopn: weekly file ('//TRIM(sdf(jf)%clrootname)//') needs nn_leapy = 1') 862 IF( sdf(jf)%cltype(1:4) == 'week' .AND. sdf(jf)%ln_clim ) & 863 & CALL ctl_stop('fld_clopn: weekly file ('//TRIM(sdf(jf)%clrootname)//') needs ln_clim = .FALSE.') 936 sdf(jf)%vcomp = sdf_n(jf)%vcomp 937 sdf(jf)%rotn = .TRUE. 864 938 END DO 865 939 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_ice.F90
r3625 r6736 94 94 ! finally, arrays corresponding to different ice categories 95 95 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_i !: category ice fraction 96 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: topmelt 97 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: botmelt 96 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: topmelt !: category topmelt 97 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: botmelt !: category botmelt 98 98 #endif 99 99 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90
r3680 r6736 39 39 LOGICAL , PUBLIC :: ln_ssr = .FALSE. !: Sea Surface restoring on SST and/or SSS 40 40 LOGICAL , PUBLIC :: ln_apr_dyn = .FALSE. !: Atmospheric pressure forcing used on dynamics (ocean & ice) 41 LOGICAL , PUBLIC :: ln_icebergs = .FALSE. !: Icebergs 42 INTEGER , PUBLIC :: nn_ice = 0 !: flag for ice in the surface boundary condition (=0/1/2/3) 43 INTEGER , PUBLIC :: nn_ice_embd = 0 !: flag for levitating/embedding sea-ice in the ocean 44 ! !: =0 levitating ice (no mass exchange, concentration/dilution effect) 45 ! !: =1 levitating ice with mass and salt exchange but no presure effect 46 ! !: =2 embedded sea-ice (full salt and mass exchanges and pressure) 41 INTEGER , PUBLIC :: nn_ice = 0 !: flag on ice in the surface boundary condition (=0/1/2/3) 47 42 INTEGER , PUBLIC :: nn_fwb = 0 !: FreshWater Budget: 48 43 ! !: = 0 unchecked 49 44 ! !: = 1 global mean of e-p-r set to zero at each nn_fsbc time step 50 45 ! !: = 2 annual global mean of e-p-r set to zero 51 LOGICAL , PUBLIC :: ln_wave = .FALSE. !: true if some coupling with wave model 52 LOGICAL , PUBLIC :: ln_cdgw = .FALSE. !: true if neutral drag coefficient from wave model 53 LOGICAL , PUBLIC :: ln_sdw = .FALSE. !: true if 3d stokes drift from wave model 46 LOGICAL , PUBLIC :: ln_cdgw = .FALSE. !: true if neutral drag coefficient read from wave model 54 47 55 48 !!---------------------------------------------------------------------- … … 68 61 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qns_tot !: total non solar heat flux (over sea and ice) [W/m2] 69 62 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp , emp_b !: freshwater budget: volume flux [Kg/m2/s] 70 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx , sfx_b !: salt flux [PSU/m2/s]63 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emps , emps_b !: freshwater budget: concentration/dillution [Kg/m2/s] 71 64 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_tot !: total E-P over ocean and ice [Kg/m2/s] 72 65 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rnf , rnf_b !: river runoff [Kg/m2/s] … … 112 105 & vtau(jpi,jpj) , vtau_b(jpi,jpj) , wndm(jpi,jpj) , STAT=ierr(1) ) 113 106 ! 114 ALLOCATE( qns_tot(jpi,jpj) , qns (jpi,jpj) , qns_b(jpi,jpj), &115 & qsr_tot(jpi,jpj) , qsr (jpi,jpj) , &116 & emp (jpi,jpj) , emp_b (jpi,jpj) , &117 & sfx (jpi,jpj) , sfx_b(jpi,jpj) , emp_tot(jpi,jpj) , STAT=ierr(2) )107 ALLOCATE( qns_tot(jpi,jpj) , qns (jpi,jpj) , qns_b(jpi,jpj), & 108 & qsr_tot(jpi,jpj) , qsr (jpi,jpj) , & 109 & emp (jpi,jpj) , emp_b (jpi,jpj) , & 110 & emps (jpi,jpj) , emps_b(jpi,jpj) , emp_tot(jpi,jpj) , STAT=ierr(2) ) 118 111 ! 119 112 ALLOCATE( rnf (jpi,jpj) , sbc_tsc (jpi,jpj,jpts) , qsr_hc (jpi,jpj,jpk) , & -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcana.F90
r3625 r6736 60 60 !! 61 61 !! ** Action : - set the ocean surface boundary condition, i.e. 62 !! utau, vtau, taum, wndm, qns, qsr, emp 62 !! utau, vtau, taum, wndm, qns, qsr, emp, emps 63 63 !!---------------------------------------------------------------------- 64 64 INTEGER, INTENT(in) :: kt ! ocean time step … … 89 89 nn_tau000 = MAX( nn_tau000, 1 ) ! must be >= 1 90 90 ! 91 qns (:,:) = rn_qns0 92 qsr (:,:) = rn_qsr0 91 93 emp (:,:) = rn_emp0 92 sfx (:,:) = 0.0_wp 93 qns (:,:) = rn_qns0 - emp(:,:) * sst_m(:,:) * rcp ! including heat content associated with mass flux at SST 94 qsr (:,:) = rn_qsr0 94 emps(:,:) = rn_emp0 95 95 ! 96 96 utau(:,:) = rn_utau0 … … 130 130 !! 131 131 !! ** Action : - set the ocean surface boundary condition, i.e. 132 !! utau, vtau, taum, wndm, qns, qsr, emp, sfx132 !! utau, vtau, taum, wndm, qns, qsr, emp, emps 133 133 !! 134 134 !! Reference : Hazeleger, W., and S. Drijfhout, JPO, 30, 677-695, 2000. … … 211 211 END DO 212 212 END DO 213 emps(:,:) = emp(:,:) 213 214 214 215 ! Compute the emp flux such as its integration on the whole domain at each time is zero … … 223 224 ENDIF 224 225 225 ! freshwater (mass flux) and update of qns with heat content of emp 226 emp (:,:) = emp(:,:) - zsumemp * tmask(:,:,1) ! freshwater flux (=0 in domain average) 227 sfx (:,:) = 0.0_wp ! no salt flux 228 qns (:,:) = qns(:,:) - emp(:,:) * sst_m(:,:) * rcp ! evap and precip are at SST 226 !salinity terms 227 emp (:,:) = emp(:,:) - zsumemp * tmask(:,:,1) 228 emps(:,:) = emp(:,:) 229 229 230 230 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcapr.F90
r3795 r6736 20 20 USE iom ! IOM library 21 21 USE lib_mpp ! MPP library 22 USE restart ! ocean restart 22 23 23 24 IMPLICIT NONE … … 26 27 PUBLIC sbc_apr ! routine called in sbcmod 27 28 28 ! !!* namsbc_apr namelist (Atmospheric PRessure) * 29 LOGICAL, PUBLIC :: ln_apr_obc = .FALSE. !: inverse barometer added to OBC ssh data 30 LOGICAL, PUBLIC :: ln_ref_apr = .FALSE. !: ref. pressure: global mean Patm (F) or a constant (F) 31 REAL(wp) :: rn_pref = 101000._wp ! reference atmospheric pressure [N/m2] 29 ! !!* namsbc_apr namelist (Atmospheric PRessure) * 30 LOGICAL, PUBLIC :: ln_apr_obc = .FALSE. !: inverse barometer added to OBC ssh data 31 LOGICAL, PUBLIC :: ln_ref_apr = .FALSE. !: ref. pressure: global mean Patm (F) or a constant (F) 32 32 33 33 REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) :: ssh_ib ! Inverse barometer now sea surface height [m] … … 35 35 REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) :: apr ! atmospheric pressure at kt [N/m2] 36 36 37 REAL(wp) :: rpref = 101000._wp ! reference atmospheric pressure [N/m2] 37 38 REAL(wp) :: tarea ! whole domain mean masked ocean surface 38 39 REAL(wp) :: r1_grau ! = 1.e0 / (grav * rau0) … … 65 66 !! 66 67 INTEGER :: ierror ! local integer 68 REAL(wp) :: zpref ! local scalar 67 69 !! 68 70 CHARACTER(len=100) :: cn_dir ! Root directory for location of ssr files 69 71 TYPE(FLD_N) :: sn_apr ! informations about the fields to be read 70 72 !! 71 NAMELIST/namsbc_apr/ cn_dir, sn_apr, ln_ref_apr , rn_pref, ln_apr_obc73 NAMELIST/namsbc_apr/ cn_dir, sn_apr, ln_ref_apr 72 74 !!---------------------------------------------------------------------- 73 75 ! … … 102 104 ! 103 105 IF( ln_ref_apr ) THEN !* Compute whole inner domain mean masked ocean surface 104 tarea = glob_sum( e1 e2t(:,:) )106 tarea = glob_sum( e1t(:,:) * e2t(:,:) ) 105 107 IF(lwp) WRITE(numout,*) ' Variable ref. Patm computed over a ocean surface of ', tarea*1e-6, 'km2' 106 108 ELSE 107 IF(lwp) WRITE(numout,*) ' Reference Patm used : ', r n_pref, ' N/m2'109 IF(lwp) WRITE(numout,*) ' Reference Patm used : ', rpref, ' N/m2' 108 110 ENDIF 109 111 ! … … 111 113 ! 112 114 ! !* control check 113 IF ( ln_apr_obc ) THEN 114 IF(lwp) WRITE(numout,*) ' Inverse barometer added to OBC ssh data' 115 ENDIF 115 IF( ln_apr_obc ) & 116 CALL ctl_stop( 'sbc_apr: inverse barometer added to OBC ssh data not yet implemented ' ) 117 IF( ln_apr_obc .AND. .NOT. lk_obc ) & 118 CALL ctl_stop( 'sbc_apr: add inverse barometer to OBC requires to use key_obc' ) 116 119 IF( ( ln_apr_obc ) .AND. .NOT. lk_dynspg_ts ) & 117 120 CALL ctl_stop( 'sbc_apr: use inverse barometer ssh at open boundary ONLY possible with time-splitting' ) … … 129 132 ! 130 133 ! !* update the reference atmospheric pressure (if necessary) 131 IF( ln_ref_apr ) r n_pref = glob_sum( sf_apr(1)%fnow(:,:,1) * e1e2t(:,:) ) / tarea134 IF( ln_ref_apr ) rpref = glob_sum( sf_apr(1)%fnow(:,:,1) * e1t(:,:) * e2t(:,:) ) / tarea 132 135 ! 133 136 ! !* Patm related forcing at kt 134 ssh_ib(:,:) = - ( sf_apr(1)%fnow(:,:,1) - r n_pref ) * r1_grau ! equivalent ssh (inverse barometer)137 ssh_ib(:,:) = - ( sf_apr(1)%fnow(:,:,1) - rpref ) * r1_grau ! equivalent ssh (inverse barometer) 135 138 apr (:,:) = sf_apr(1)%fnow(:,:,1) ! atmospheric pressure 136 139 ! -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_clio.F90
r3625 r6736 12 12 13 13 !!---------------------------------------------------------------------- 14 !! sbc_blk_clio 15 !! blk_clio_oce 16 !! blk_ice_clio 14 !! sbc_blk_clio : CLIO bulk formulation: read and update required input fields 15 !! blk_clio_oce : ocean CLIO bulk formulea: compute momentum, heat and freswater fluxes for the ocean 16 !! blk_ice_clio : ice CLIO bulk formulea: compute momentum, heat and freswater fluxes for the sea-ice 17 17 !! blk_clio_qsr_oce : shortwave radiation for ocean computed from the cloud cover 18 18 !! blk_clio_qsr_ice : shortwave radiation for ice computed from the cloud cover 19 !! flx_blk_declin : solar declination19 !! flx_blk_declin : solar declinaison 20 20 !!---------------------------------------------------------------------- 21 USE oce ! ocean dynamics and tracers 22 USE dom_oce ! ocean space and time domain 23 USE phycst ! physical constants 24 USE fldread ! read input fields 25 USE sbc_oce ! Surface boundary condition: ocean fields 26 USE iom ! I/O manager library 27 USE in_out_manager ! I/O manager 28 USE lib_mpp ! distribued memory computing library 29 USE wrk_nemo ! work arrays 30 USE timing ! Timing 31 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 32 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 21 USE oce ! ocean dynamics and tracers 22 USE dom_oce ! ocean space and time domain 23 USE phycst ! physical constants 24 USE fldread ! read input fields 25 USE sbc_oce ! Surface boundary condition: ocean fields 26 USE iom ! I/O manager library 27 USE in_out_manager ! I/O manager 28 USE lib_mpp ! distribued memory computing library 29 USE wrk_nemo ! work arrays 30 USE timing ! Timing 31 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 33 32 34 33 USE albedo 35 34 USE prtctl ! Print control 35 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 36 36 #if defined key_lim3 37 37 USE ice … … 51 51 INTEGER , PARAMETER :: jp_vtau = 2 ! index of wind stress (j-component) (N/m2) at V-point 52 52 INTEGER , PARAMETER :: jp_wndm = 3 ! index of 10m wind module (m/s) at T-point 53 INTEGER , PARAMETER :: jp_humi = 4 ! index of specific humidity ( %)54 INTEGER , PARAMETER :: jp_ccov = 5 ! index of cloud cover ( %)53 INTEGER , PARAMETER :: jp_humi = 4 ! index of specific humidity ( - ) 54 INTEGER , PARAMETER :: jp_ccov = 5 ! index of cloud cover ( - ) 55 55 INTEGER , PARAMETER :: jp_tair = 6 ! index of 10m air temperature (Kelvin) 56 56 INTEGER , PARAMETER :: jp_prec = 7 ! index of total precipitation (rain+snow) (Kg/m2/s) … … 101 101 !! the i-component of the stress (N/m2) 102 102 !! the j-component of the stress (N/m2) 103 !! the 10m wind speed module (m/s)103 !! the 10m wind pseed module (m/s) 104 104 !! the 10m air temperature (Kelvin) 105 !! the 10m specific humidity ( %)106 !! the cloud cover ( %)105 !! the 10m specific humidity (-) 106 !! the cloud cover (-) 107 107 !! the total precipitation (rain+snow) (Kg/m2/s) 108 108 !! (2) CALL blk_oce_clio 109 109 !! 110 110 !! C A U T I O N : never mask the surface stress fields 111 !! the stress is assumed to be in the (i,j) mesh referential 111 !! the stress is assumed to be in the mesh referential 112 !! i.e. the (i,j) referential 112 113 !! 113 114 !! ** Action : defined at each time-step at the air-sea interface … … 115 116 !! - taum wind stress module at T-point 116 117 !! - wndm 10m wind module at T-point 117 !! - qns non-solar heat flux including latent heat of solid 118 !! precip. melting and emp heat content 119 !! - qsr solar heat flux 120 !! - emp upward mass flux (evap. - precip) 121 !! - sfx salt flux; set to zero at nit000 but possibly non-zero 122 !! if ice is present (computed in limsbc(_2).F90) 118 !! - qns, qsr non-slor and solar heat flux 119 !! - emp, emps evaporation minus precipitation 123 120 !!---------------------------------------------------------------------- 124 INTEGER, INTENT( in) :: kt ! ocean time step121 INTEGER, INTENT(in) :: kt ! ocean time step 125 122 !! 126 123 INTEGER :: ifpr, jfpr ! dummy indices … … 175 172 ALLOCATE( sbudyko(jpi,jpj) , stauc(jpi,jpj), STAT=ierr3 ) 176 173 IF( ierr3 > 0 ) CALL ctl_stop( 'STOP', 'sbc_blk_clio: unable to allocate arrays' ) 177 !178 sfx(:,:) = 0._wp ! salt flux; zero unless ice is present (computed in limsbc(_2).F90)179 174 ! 180 175 ENDIF … … 211 206 !! - taum wind stress module at T-point 212 207 !! - wndm 10m wind module at T-point 213 !! - qns non-solar heat flux including latent heat of solid 214 !! precip. melting and emp heat content 215 !! - qsr solar heat flux 216 !! - emp suface mass flux (evap.-precip.) 208 !! - qns, qsr non-slor and solar heat flux 209 !! - emp, emps evaporation minus precipitation 217 210 !! ** Nota : sf has to be a dummy argument for AGRIF on NEC 218 211 !!---------------------------------------------------------------------- … … 231 224 REAL(wp) :: zsst, ztatm, zcco1, zpatm, zcmax, zrmax ! - - 232 225 REAL(wp) :: zrhoa, zev, zes, zeso, zqatm, zevsqr ! - - 233 REAL(wp) :: ztx2, zty2 , zcevap, zcprec! - -226 REAL(wp) :: ztx2, zty2 ! - - 234 227 REAL(wp), POINTER, DIMENSION(:,:) :: zqlw ! long-wave heat flux over ocean 235 228 REAL(wp), POINTER, DIMENSION(:,:) :: zqla ! latent heat flux over ocean … … 371 364 ! III Total FLUXES ! 372 365 ! ----------------------------------------------------------------------------- ! 373 zcevap = rcp / cevap ! convert zqla ==> evap (Kg/m2/s) ==> m/s ==> W/m2 374 zcprec = rcp / rday ! convert prec ( mm/day ==> m/s) ==> W/m2 375 376 !CDIR COLLAPSE 377 emp(:,:) = zqla(:,:) / cevap & ! freshwater flux 378 & - sf(jp_prec)%fnow(:,:,1) / rday * tmask(:,:,1) 379 ! 380 !CDIR COLLAPSE 381 qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) & ! Downward Non Solar flux 382 & - zqla(:,:) * pst(:,:) * zcevap & ! remove evap. heat content at SST in Celcius 383 & + sf(jp_prec)%fnow(:,:,1) * sf(jp_tair)%fnow(:,:,1) * zcprec ! add precip. heat content at Tair in Celcius 384 ! NB: if sea-ice model, the snow precip are computed and the associated heat is added to qns (see blk_ice_clio) 385 366 367 !CDIR COLLAPSE 368 emp (:,:) = zqla(:,:) / cevap - sf(jp_prec)%fnow(:,:,1) / rday * tmask(:,:,1) 369 qns (:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) ! Downward Non Solar flux 370 emps(:,:) = emp(:,:) 371 ! 386 372 CALL iom_put( "qlw_oce", zqlw ) ! output downward longwave heat over the ocean 387 373 CALL iom_put( "qsb_oce", - zqsb ) ! output downward sensible heat over the ocean … … 422 408 !! 423 409 !! ** Action : call albedo_oce/albedo_ice to compute ocean/ice albedo 424 !! - snow precipitation 425 !! - solar flux at the ocean and ice surfaces 426 !! - the long-wave radiation for the ocean and sea/ice 427 !! - turbulent heat fluxes over water and ice 428 !! - evaporation over water 429 !! - total heat fluxes sensitivity over ice (dQ/dT) 430 !! - latent heat flux sensitivity over ice (dQla/dT) 431 !! - qns : modified the non solar heat flux over the ocean 432 !! to take into account solid precip latent heat flux 410 !! computation of snow precipitation 411 !! computation of solar flux at the ocean and ice surfaces 412 !! computation of the long-wave radiation for the ocean and sea/ice 413 !! computation of turbulent heat fluxes over water and ice 414 !! computation of evaporation over water 415 !! computation of total heat fluxes sensitivity over ice (dQ/dT) 416 !! computation of latent heat flux sensitivity over ice (dQla/dT) 417 !! 433 418 !!---------------------------------------------------------------------- 434 419 REAL(wp), INTENT(in ), DIMENSION(:,:,:) :: pst ! ice surface temperature [Kelvin] … … 610 595 ! 611 596 ! ----------------------------------------------------------------------------- ! 612 ! Total FLUXES 597 ! Total FLUXES ! 613 598 ! ----------------------------------------------------------------------------- ! 614 599 ! … … 617 602 !CDIR COLLAPSE 618 603 p_tpr(:,:) = sf(jp_prec)%fnow(:,:,1) / rday ! total precipitation [kg/m2/s] 619 !620 ! ----------------------------------------------------------------------------- !621 ! Correct the OCEAN non solar flux with the existence of solid precipitation !622 ! ---------------=====--------------------------------------------------------- !623 !CDIR COLLAPSE624 qns(:,:) = qns(:,:) & ! update the non-solar heat flux with:625 & - p_spr(:,:) * lfus & ! remove melting solid precip626 & + p_spr(:,:) * MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow - rt0 ) * cpic & ! add solid P at least below melting627 & - p_spr(:,:) * sf(jp_tair)%fnow(:,:,1) * rcp ! remove solid precip. at Tair628 604 ! 629 605 !!gm : not necessary as all input data are lbc_lnk... -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_core.F90
r3772 r6736 29 29 USE fldread ! read input fields 30 30 USE sbc_oce ! Surface boundary condition: ocean fields 31 USE cyclone ! Cyclone 10m wind form trac of cyclone centres32 31 USE sbcdcy ! surface boundary condition: diurnal cycle 33 32 USE iom ! I/O manager library … … 53 52 INTEGER , PARAMETER :: jp_wndi = 1 ! index of 10m wind velocity (i-component) (m/s) at T-point 54 53 INTEGER , PARAMETER :: jp_wndj = 2 ! index of 10m wind velocity (j-component) (m/s) at T-point 55 INTEGER , PARAMETER :: jp_humi = 3 ! index of specific humidity ( %)54 INTEGER , PARAMETER :: jp_humi = 3 ! index of specific humidity ( - ) 56 55 INTEGER , PARAMETER :: jp_qsr = 4 ! index of solar heat (W/m2) 57 56 INTEGER , PARAMETER :: jp_qlw = 5 ! index of Long wave (W/m2) … … 70 69 REAL(wp), PARAMETER :: Stef = 5.67e-8 ! Stefan Boltzmann constant 71 70 REAL(wp), PARAMETER :: Cice = 1.63e-3 ! transfer coefficient over ice 72 REAL(wp), PARAMETER :: albo = 0.066 ! ocean albedo assumed to be con stant71 REAL(wp), PARAMETER :: albo = 0.066 ! ocean albedo assumed to be contant 73 72 74 73 ! !!* Namelist namsbc_core : CORE bulk parameters … … 97 96 !! the 10m wind velocity (i-component) (m/s) at T-point 98 97 !! the 10m wind velocity (j-component) (m/s) at T-point 99 !! the 10m or 2m specific humidity ( %)98 !! the specific humidity ( - ) 100 99 !! the solar heat (W/m2) 101 100 !! the Long wave (W/m2) 102 !! the 10m or 2m air temperature(Kelvin)101 !! the 10m air temperature (Kelvin) 103 102 !! the total precipitation (rain+snow) (Kg/m2/s) 104 103 !! the snow (solid prcipitation) (kg/m2/s) 105 !! the tau diff associated to HF tau (N/m2) at T-point (ln_taudif=T) 104 !! OPTIONAL parameter (see ln_taudif namelist flag): 105 !! the tau diff associated to HF tau (N/m2) at T-point 106 106 !! (2) CALL blk_oce_core 107 107 !! 108 108 !! C A U T I O N : never mask the surface stress fields 109 !! the stress is assumed to be in the (i,j) mesh referential 109 !! the stress is assumed to be in the mesh referential 110 !! i.e. the (i,j) referential 110 111 !! 111 112 !! ** Action : defined at each time-step at the air-sea interface 112 113 !! - utau, vtau i- and j-component of the wind stress 113 !! - taum, wndm wind stress and 10m wind modules at T-point 114 !! - qns, qsr non-solar and solar heat fluxes 115 !! - emp upward mass flux (evapo. - precip.) 116 !! - sfx salt flux due to freezing/melting (non-zero only if ice is present) 117 !! (set in limsbc(_2).F90) 114 !! - taum wind stress module at T-point 115 !! - wndm 10m wind module at T-point 116 !! - qns, qsr non-slor and solar heat flux 117 !! - emp, emps evaporation minus precipitation 118 118 !!---------------------------------------------------------------------- 119 119 INTEGER, INTENT(in) :: kt ! ocean time step … … 125 125 CHARACTER(len=100) :: cn_dir ! Root directory for location of core files 126 126 TYPE(FLD_N), DIMENSION(jpfld) :: slf_i ! array of namelist informations on the fields to read 127 TYPE(FLD_N) :: sn_wndi, sn_wndj, sn_humi, sn_qsr ! informations about the fields to be read 128 TYPE(FLD_N) :: sn_qlw , sn_tair, sn_prec, sn_snow, sn_tdif ! - - 127 TYPE(FLD_N) :: sn_wndi, sn_wndj, sn_humi, sn_qsr ! informations about the fields to be read 128 TYPE(FLD_N) :: sn_qlw , sn_tair, sn_prec, sn_snow ! " " 129 TYPE(FLD_N) :: sn_tdif ! " " 129 130 NAMELIST/namsbc_core/ cn_dir , ln_2m , ln_taudif, rn_pfac, & 130 131 & sn_wndi, sn_wndj, sn_humi , sn_qsr , & … … 180 181 CALL fld_fill( sf, slf_i, cn_dir, 'sbc_blk_core', 'flux formulation for ocean surface boundary condition', 'namsbc_core' ) 181 182 ! 182 sfx(:,:) = 0._wp ! salt flux; zero unless ice is present (computed in limsbc(_2).F90) 183 ! 184 ENDIF 185 186 CALL fld_read( kt, nn_fsbc, sf ) ! input fields provided at the current time-step 187 188 ! ! compute the surface ocean fluxes using CORE bulk formulea 189 IF( MOD( kt - 1, nn_fsbc ) == 0 ) CALL blk_oce_core( kt, sf, sst_m, ssu_m, ssv_m ) 183 ENDIF 184 185 CALL fld_read( kt, nn_fsbc, sf ) ! input fields provided at the current time-step 186 187 ! ! surface ocean fluxes computed with CLIO bulk formulea 188 IF( MOD( kt - 1, nn_fsbc ) == 0 ) CALL blk_oce_core( sf, sst_m, ssu_m, ssv_m ) 190 189 191 190 #if defined key_cice … … 205 204 206 205 207 SUBROUTINE blk_oce_core( kt,sf, pst, pu, pv )206 SUBROUTINE blk_oce_core( sf, pst, pu, pv ) 208 207 !!--------------------------------------------------------------------- 209 208 !! *** ROUTINE blk_core *** … … 222 221 !! - qns : Non Solar heat flux over the ocean (W/m2) 223 222 !! - evap : Evaporation over the ocean (kg/m2/s) 224 !! - emp 223 !! - emp(s) : evaporation minus precipitation (kg/m2/s) 225 224 !! 226 225 !! ** Nota : sf has to be a dummy argument for AGRIF on NEC 227 226 !!--------------------------------------------------------------------- 228 INTEGER , INTENT(in ) :: kt ! time step index 229 TYPE(fld), INTENT(inout), DIMENSION(:) :: sf ! input data 230 REAL(wp) , INTENT(in) , DIMENSION(:,:) :: pst ! surface temperature [Celcius] 231 REAL(wp) , INTENT(in) , DIMENSION(:,:) :: pu ! surface current at U-point (i-component) [m/s] 232 REAL(wp) , INTENT(in) , DIMENSION(:,:) :: pv ! surface current at V-point (j-component) [m/s] 227 TYPE(fld), INTENT(in), DIMENSION(:) :: sf ! input data 228 REAL(wp) , INTENT(in), DIMENSION(:,:) :: pst ! surface temperature [Celcius] 229 REAL(wp) , INTENT(in), DIMENSION(:,:) :: pu ! surface current at U-point (i-component) [m/s] 230 REAL(wp) , INTENT(in), DIMENSION(:,:) :: pv ! surface current at V-point (j-component) [m/s] 233 231 ! 234 232 INTEGER :: ji, jj ! dummy loop indices … … 254 252 zcoef_qsatw = 0.98 * 640380. / rhoa 255 253 256 zst(:,:) = pst(:,:) + rt0 ! convert SST fromCelcius to Kelvin (and set minimum value far above 0 K)254 zst(:,:) = pst(:,:) + rt0 ! converte Celcius to Kelvin (and set minimum value far above 0 K) 257 255 258 256 ! ----------------------------------------------------------------------------- ! … … 263 261 zwnd_i(:,:) = 0.e0 264 262 zwnd_j(:,:) = 0.e0 265 #if defined key_cyclone266 # if defined key_vectopt_loop267 !CDIR COLLAPSE268 # endif269 CALL wnd_cyc( kt, zwnd_i, zwnd_j ) ! add Manu !270 DO jj = 2, jpjm1271 DO ji = fs_2, fs_jpim1 ! vect. opt.272 sf(jp_wndi)%fnow(ji,jj,1) = sf(jp_wndi)%fnow(ji,jj,1) + zwnd_i(ji,jj)273 sf(jp_wndj)%fnow(ji,jj,1) = sf(jp_wndj)%fnow(ji,jj,1) + zwnd_j(ji,jj)274 END DO275 END DO276 #endif277 263 #if defined key_vectopt_loop 278 264 !CDIR COLLAPSE … … 392 378 393 379 !CDIR COLLAPSE 394 emp (:,:) = ( zevap(:,:) & ! mass flux (evap. - precip.) 395 & - sf(jp_prec)%fnow(:,:,1) * rn_pfac ) * tmask(:,:,1) 396 !CDIR COLLAPSE 397 qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) & ! Downward Non Solar flux 398 & - sf(jp_snow)%fnow(:,:,1) * rn_pfac * lfus & ! remove latent melting heat for solid precip 399 & - zevap(:,:) * pst(:,:) * rcp & ! remove evap heat content at SST 400 & + ( sf(jp_prec)%fnow(:,:,1) - sf(jp_snow)%fnow(:,:,1) ) * rn_pfac & ! add liquid precip heat content at Tair 401 & * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp & 402 & + sf(jp_snow)%fnow(:,:,1) * rn_pfac & ! add solid precip heat content at min(Tair,Tsnow) 403 & * ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic 380 qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) ! Downward Non Solar flux 381 !CDIR COLLAPSE 382 emp(:,:) = zevap(:,:) - sf(jp_prec)%fnow(:,:,1) * rn_pfac * tmask(:,:,1) 383 !CDIR COLLAPSE 384 emps(:,:) = emp(:,:) 404 385 ! 405 386 CALL iom_put( "qlw_oce", zqlw ) ! output downward longwave heat over the ocean 406 387 CALL iom_put( "qsb_oce", - zqsb ) ! output downward sensible heat over the ocean 407 388 CALL iom_put( "qla_oce", - zqla ) ! output downward latent heat over the ocean 408 CALL iom_put( "qhc_oce", qns-zqlw+zqsb+zqla ) ! output downward heat content of E-P over the ocean409 389 CALL iom_put( "qns_oce", qns ) ! output downward non solar heat over the ocean 410 390 ! -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_mfs.F90
r3625 r6736 84 84 !! - wndm 10m wind module at T-point 85 85 !! - qns, qsr non-slor and solar heat flux 86 !! - emp 86 !! - emp, emps evaporation minus precipitation 87 87 !!---------------------------------------------------------------------- 88 88 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: sh_now ! specific humidity at T-point … … 258 258 emp (:,:) = evap(:,:) - sf(jp_prec)%fnow(:,:,1) * tmask(:,:,1) 259 259 !CDIR COLLAPSE 260 emps(:,:) = emp(:,:) 260 261 261 262 CALL iom_put( "qlw_oce", qbw ) ! output downward longwave heat over the ocean -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90
r3680 r6736 41 41 #endif 42 42 USE geo2ocean ! 43 USE restart ! 43 44 USE oce , ONLY : tsn, un, vn 44 45 USE albedo ! … … 380 381 & srcv( (/jpr_otz1, jpr_otz2, jpr_itz1, jpr_itz2/) )%laction = .FALSE. 381 382 ! 382 IF( TRIM( sn_rcv_tau%clvor ) == 'local grid' ) THEN ! already on local grid -> no need of the second grid383 srcv(jpr_otx2:jpr_otz2)%laction = .FALSE.384 srcv(jpr_itx2:jpr_itz2)%laction = .FALSE.385 srcv(jpr_oty1)%clgrid = srcv(jpr_oty2)%clgrid ! not needed but cleaner...386 srcv(jpr_ity1)%clgrid = srcv(jpr_ity2)%clgrid ! not needed but cleaner...387 ENDIF388 !389 383 IF( TRIM( sn_rcv_tau%cldes ) /= 'oce and ice' ) THEN ! 'oce and ice' case ocean stress on ocean mesh used 390 384 srcv(jpr_itx1:jpr_itz2)%laction = .FALSE. ! ice components not received … … 526 520 ssnd(jps_tmix)%clname = 'O_TepMix' 527 521 SELECT CASE( TRIM( sn_snd_temp%cldes ) ) 528 CASE( 'none' ) ! nothing to do529 522 CASE( 'oce only' ) ; ssnd( jps_toce )%laction = .TRUE. 530 523 CASE( 'weighted oce and ice' ) … … 569 562 570 563 SELECT CASE ( TRIM( sn_snd_thick%cldes ) ) 571 CASE( 'none' ) ! nothing to do 572 CASE( 'ice and snow' ) 564 CASE ( 'ice and snow' ) 573 565 ssnd(jps_hice:jps_hsnw)%laction = .TRUE. 574 566 IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) THEN … … 576 568 ELSE 577 569 IF ( jpl > 1 ) THEN 578 CALL ctl_stop( 'sbc_cpl_init: use weighted ice and snow option for sn_snd_thick%cldes if not exchanging category fields' )570 CALL ctl_stop( 'sbc_cpl_init: use weighted ice and snow option for sn_snd_thick%cldes if not exchanging category fields' ) 579 571 ENDIF 580 572 ENDIF … … 672 664 !! ** Action : update utau, vtau ocean stress at U,V grid 673 665 !! taum, wndm wind stres and wind speed module at T-point 674 !! qns non solar heat fluxes including emp heat content (ocean only case) 675 !! and the latent heat flux of solid precip. melting 676 !! qsr solar ocean heat fluxes (ocean only case) 677 !! emp upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case) 666 !! qns , qsr non solar and solar ocean heat fluxes ('ocean only case) 667 !! emp = emps evap. - precip. (- runoffs) (- calving) ('ocean only case) 678 668 !!---------------------------------------------------------------------- 679 669 INTEGER, INTENT(in) :: kt ! ocean model time step index … … 787 777 ! Stress module can be negative when received (interpolation problem) 788 778 IF( llnewtau ) THEN 789 frcv(jpr_taum)%z3(:,:,1) = MAX( 0. _wp, frcv(jpr_taum)%z3(:,:,1) )779 frcv(jpr_taum)%z3(:,:,1) = MAX( 0.0e0, frcv(jpr_taum)%z3(:,:,1) ) 790 780 ENDIF 791 781 ENDIF … … 831 821 ! ! ========================= ! 832 822 ! 833 ! ! total freshwater fluxes over the ocean (emp) 823 ! ! non solar heat flux over the ocean (qns) 824 IF( srcv(jpr_qnsoce)%laction ) qns(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) 825 IF( srcv(jpr_qnsmix)%laction ) qns(:,:) = frcv(jpr_qnsmix)%z3(:,:,1) 826 ! add the latent heat of solid precip. melting 827 IF( srcv(jpr_snow )%laction ) qns(:,:) = qns(:,:) - frcv(jpr_snow)%z3(:,:,1) * lfus 828 829 ! ! solar flux over the ocean (qsr) 830 IF( srcv(jpr_qsroce)%laction ) qsr(:,:) = frcv(jpr_qsroce)%z3(:,:,1) 831 IF( srcv(jpr_qsrmix)%laction ) qsr(:,:) = frcv(jpr_qsrmix)%z3(:,:,1) 832 IF( ln_dm2dc ) qsr(:,:) = sbc_dcy( qsr ) ! modify qsr to include the diurnal cycle 833 ! 834 ! ! total freshwater fluxes over the ocean (emp, emps) 834 835 SELECT CASE( TRIM( sn_rcv_emp%cldes ) ) ! evaporation - precipitation 835 836 CASE( 'conservative' ) … … 862 863 !!gm end of internal cooking 863 864 ! 864 ! ! non solar heat flux over the ocean (qns) 865 IF( srcv(jpr_qnsoce)%laction ) qns(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) 866 IF( srcv(jpr_qnsmix)%laction ) qns(:,:) = frcv(jpr_qnsmix)%z3(:,:,1) 867 ! add the latent heat of solid precip. melting 868 IF( srcv(jpr_snow )%laction ) THEN ! update qns over the free ocean with: 869 qns(:,:) = qns(:,:) - frcv(jpr_snow)%z3(:,:,1) * lfus & ! energy for melting solid precipitation over the free ocean 870 & - emp(:,:) * sst_m(:,:) * rcp ! remove heat content due to mass flux (assumed to be at SST) 871 ENDIF 872 873 ! ! solar flux over the ocean (qsr) 874 IF( srcv(jpr_qsroce)%laction ) qsr(:,:) = frcv(jpr_qsroce)%z3(:,:,1) 875 IF( srcv(jpr_qsrmix)%laction ) qsr(:,:) = frcv(jpr_qsrmix)%z3(:,:,1) 876 IF( ln_dm2dc ) qsr(:,:) = sbc_dcy( qsr ) ! modify qsr to include the diurnal cycle 877 ! 865 emps(:,:) = emp(:,:) ! concentration/dilution = emp 878 866 879 867 ENDIF … … 1153 1141 1154 1142 zicefr(:,:) = 1.- p_frld(:,:) 1155 zcptn(:,:) = rcp * sst_m(:,:)1143 IF( lk_diaar5 ) zcptn(:,:) = rcp * tsn(:,:,1,jp_tem) 1156 1144 ! 1157 1145 ! ! ========================= ! … … 1245 1233 & + pist(:,:,1) * zicefr(:,:) ) ) 1246 1234 END SELECT 1247 ztmp(:,:) = p_frld(:,:) * sprecip(:,:) * lfus 1248 qns_tot(:,:) = qns_tot(:,:) & ! qns_tot update over free ocean with: 1249 & - ztmp(:,:) & ! remove the latent heat flux of solid precip. melting 1250 & - ( emp_tot(:,:) & ! remove the heat content of mass flux (assumed to be at SST) 1251 & - emp_ice(:,:) * zicefr(:,:) ) * zcptn(:,:) 1235 ztmp(:,:) = p_frld(:,:) * sprecip(:,:) * lfus ! add the latent heat of solid precip. melting 1236 qns_tot(:,:) = qns_tot(:,:) - ztmp(:,:) ! over free ocean 1252 1237 IF( lk_diaar5 ) CALL iom_put( 'hflx_snow_cea', ztmp + sprecip(:,:) * zcptn(:,:) ) ! heat flux from snow (cell average) 1253 1238 !!gm … … 1269 1254 ! ! ========================= ! 1270 1255 CASE( 'oce only' ) 1271 qsr_tot(:,: ) = MAX( 0._wp , frcv(jpr_qsroce)%z3(:,:,1))1256 qsr_tot(:,: ) = MAX(0.0,frcv(jpr_qsroce)%z3(:,:,1)) 1272 1257 CASE( 'conservative' ) 1273 1258 qsr_tot(:,: ) = frcv(jpr_qsrmix)%z3(:,:,1) … … 1365 1350 ! ! Surface temperature ! in Kelvin 1366 1351 ! ! ------------------------- ! 1367 IF( ssnd(jps_toce)%laction .OR. ssnd(jps_tice)%laction .OR. ssnd(jps_tmix)%laction ) THEN 1368 SELECT CASE( sn_snd_temp%cldes) 1369 CASE( 'oce only' ) ; ztmp1(:,:) = tsn(:,:,1,jp_tem) + rt0 1370 CASE( 'weighted oce and ice' ) ; ztmp1(:,:) = ( tsn(:,:,1,jp_tem) + rt0 ) * zfr_l(:,:) 1371 SELECT CASE( sn_snd_temp%clcat ) 1372 CASE( 'yes' ) 1373 ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 1374 CASE( 'no' ) 1375 ztmp3(:,:,:) = 0.0 1376 DO jl=1,jpl 1377 ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl) 1378 ENDDO 1379 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 1380 END SELECT 1381 CASE( 'mixed oce-ice' ) 1382 ztmp1(:,:) = ( tsn(:,:,1,1) + rt0 ) * zfr_l(:,:) 1352 SELECT CASE( sn_snd_temp%cldes) 1353 CASE( 'oce only' ) ; ztmp1(:,:) = tsn(:,:,1,jp_tem) + rt0 1354 CASE( 'weighted oce and ice' ) ; ztmp1(:,:) = ( tsn(:,:,1,jp_tem) + rt0 ) * zfr_l(:,:) 1355 SELECT CASE( sn_snd_temp%clcat ) 1356 CASE( 'yes' ) 1357 ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 1358 CASE( 'no' ) 1359 ztmp3(:,:,:) = 0.0 1383 1360 DO jl=1,jpl 1384 ztmp 1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl)1361 ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl) 1385 1362 ENDDO 1386 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' )1363 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 1387 1364 END SELECT 1388 IF( ssnd(jps_toce)%laction ) CALL cpl_prism_snd( jps_toce, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 1389 IF( ssnd(jps_tice)%laction ) CALL cpl_prism_snd( jps_tice, isec, ztmp3, info ) 1390 IF( ssnd(jps_tmix)%laction ) CALL cpl_prism_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 1391 ENDIF 1365 CASE( 'mixed oce-ice' ) 1366 ztmp1(:,:) = ( tsn(:,:,1,1) + rt0 ) * zfr_l(:,:) 1367 DO jl=1,jpl 1368 ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl) 1369 ENDDO 1370 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' ) 1371 END SELECT 1372 IF( ssnd(jps_toce)%laction ) CALL cpl_prism_snd( jps_toce, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 1373 IF( ssnd(jps_tice)%laction ) CALL cpl_prism_snd( jps_tice, isec, ztmp3, info ) 1374 IF( ssnd(jps_tmix)%laction ) CALL cpl_prism_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 1392 1375 ! 1393 1376 ! ! ------------------------- ! … … 1409 1392 ! ! ------------------------- ! 1410 1393 ! Send ice fraction field 1411 IF( ssnd(jps_fice)%laction ) THEN 1394 SELECT CASE( sn_snd_thick%clcat ) 1395 CASE( 'yes' ) 1396 ztmp3(:,:,1:jpl) = a_i(:,:,1:jpl) 1397 CASE( 'no' ) 1398 ztmp3(:,:,1) = fr_i(:,:) 1399 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 1400 END SELECT 1401 IF( ssnd(jps_fice)%laction ) CALL cpl_prism_snd( jps_fice, isec, ztmp3, info ) 1402 1403 ! Send ice and snow thickness field 1404 SELECT CASE( sn_snd_thick%cldes) 1405 CASE( 'weighted ice and snow' ) 1412 1406 SELECT CASE( sn_snd_thick%clcat ) 1413 CASE( 'yes' ) ; ztmp3(:,:,1:jpl) = a_i(:,:,1:jpl) 1414 CASE( 'no' ) ; ztmp3(:,:,1 ) = fr_i(:,: ) 1415 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 1407 CASE( 'yes' ) 1408 ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) * a_i(:,:,1:jpl) 1409 ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) * a_i(:,:,1:jpl) 1410 CASE( 'no' ) 1411 ztmp3(:,:,:) = 0.0 ; ztmp4(:,:,:) = 0.0 1412 DO jl=1,jpl 1413 ztmp3(:,:,1) = ztmp3(:,:,1) + ht_i(:,:,jl) * a_i(:,:,jl) 1414 ztmp4(:,:,1) = ztmp4(:,:,1) + ht_s(:,:,jl) * a_i(:,:,jl) 1415 ENDDO 1416 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 1416 1417 END SELECT 1417 CALL cpl_prism_snd( jps_fice, isec, ztmp3, info ) 1418 ENDIF 1419 1420 ! Send ice and snow thickness field 1421 IF( ssnd(jps_hice)%laction .OR. ssnd(jps_hsnw)%laction ) THEN 1422 SELECT CASE( sn_snd_thick%cldes) 1423 CASE( 'none' ) ! nothing to do 1424 CASE( 'weighted ice and snow' ) 1425 SELECT CASE( sn_snd_thick%clcat ) 1426 CASE( 'yes' ) 1427 ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) * a_i(:,:,1:jpl) 1428 ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) * a_i(:,:,1:jpl) 1429 CASE( 'no' ) 1430 ztmp3(:,:,:) = 0.0 ; ztmp4(:,:,:) = 0.0 1431 DO jl=1,jpl 1432 ztmp3(:,:,1) = ztmp3(:,:,1) + ht_i(:,:,jl) * a_i(:,:,jl) 1433 ztmp4(:,:,1) = ztmp4(:,:,1) + ht_s(:,:,jl) * a_i(:,:,jl) 1434 ENDDO 1435 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 1436 END SELECT 1437 CASE( 'ice and snow' ) 1438 ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) 1439 ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) 1440 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%cldes' ) 1441 END SELECT 1442 IF( ssnd(jps_hice)%laction ) CALL cpl_prism_snd( jps_hice, isec, ztmp3, info ) 1443 IF( ssnd(jps_hsnw)%laction ) CALL cpl_prism_snd( jps_hsnw, isec, ztmp4, info ) 1444 ENDIF 1418 CASE( 'ice and snow' ) 1419 ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) 1420 ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) 1421 CASE default ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%cldes' ) 1422 END SELECT 1423 IF( ssnd(jps_hice)%laction ) CALL cpl_prism_snd( jps_hice, isec, ztmp3, info ) 1424 IF( ssnd(jps_hsnw)%laction ) CALL cpl_prism_snd( jps_hsnw, isec, ztmp4, info ) 1445 1425 ! 1446 1426 #if defined key_cpl_carbon_cycle -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcdcy.F90
r3764 r6736 49 49 50 50 51 FUNCTION sbc_dcy( pqsrin , l_mask) RESULT( zqsrout )51 FUNCTION sbc_dcy( pqsrin ) RESULT( zqsrout ) 52 52 !!---------------------------------------------------------------------- 53 53 !! *** ROUTINE sbc_dcy *** … … 63 63 !! Part 1: a diurnally forced OGCM. Climate Dynamics 29:6, 575-590. 64 64 !!---------------------------------------------------------------------- 65 LOGICAL, OPTIONAL, INTENT(in) :: l_mask ! use the routine for night mask computation66 65 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqsrin ! input daily QSR flux 67 66 !! 68 67 INTEGER :: ji, jj ! dummy loop indices 69 INTEGER, DIMENSION(jpi,jpj) :: imask_night ! night mask70 68 REAL(wp) :: ztwopi, zinvtwopi, zconvrad 71 69 REAL(wp) :: zlo, zup, zlousd, zupusd 72 70 REAL(wp) :: zdsws, zdecrad, ztx, zsin, zcos 73 71 REAL(wp) :: ztmp, ztmp1, ztmp2, ztest 74 REAL(wp) :: ztmpm, ztmpm1, ztmpm275 72 REAL(wp), DIMENSION(jpi,jpj) :: zqsrout ! output QSR flux with diurnal cycle 76 73 !---------------------------statement functions------------------------ … … 93 90 zup = zlo + ( REAL(nn_fsbc, wp) * rdttra(1) ) / rday 94 91 ! 95 IF( nday_qsr == -1 ) THEN ! first time step only 92 IF( nday_qsr == -1 ) THEN ! first time step only 96 93 IF(lwp) THEN 97 94 WRITE(numout,*) … … 123 120 zdecrad = (-23.5_wp * zconvrad) * COS( zdsws * ztwopi / REAL(nyear_len(1),wp) ) 124 121 ! Compute A and B needed to compute the time integral of the diurnal cycle 125 122 126 123 zsin = SIN( zdecrad ) ; zcos = COS( zdecrad ) 127 124 DO jj = 1, jpj … … 132 129 END DO 133 130 END DO 131 134 132 ! Compute the time of dawn and dusk 135 133 … … 158 156 rdawn(:,:) = MOD( (rdawn(:,:) + 1._wp), 1._wp ) 159 157 rdusk(:,:) = MOD( (rdusk(:,:) + 1._wp), 1._wp ) 158 160 159 ! 2.2 Compute the scaling function: 161 160 ! S* = the inverse of the time integral of the diurnal cycle from dawn to dusk … … 193 192 ! 194 193 ENDIF 194 195 195 ! 3. update qsr with the diurnal cycle 196 196 ! ------------------------------------ 197 197 198 imask_night(:,:) = 0199 198 DO jj = 1, jpj 200 199 DO ji = 1, jpi 201 ztmpm = 0.0 202 IF( ABS(rab(ji,jj)) < 1. ) THEN ! day duration is less than 24h 200 IF( ABS(rab(ji,jj)) < 1._wp ) THEN ! day duration is less than 24h 203 201 ! 204 202 IF( rdawn(ji,jj) < rdusk(ji,jj) ) THEN ! day time in one part … … 209 207 ztmp = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 210 208 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 211 ztmpm = zupusd - zlousd212 IF ( ztmpm .EQ. 0 ) imask_night(ji,jj) = 1213 209 ! 214 210 ELSE ! day time in two parts … … 216 212 zupusd = MIN(zup, rdusk(ji,jj)) 217 213 ztmp1 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 218 ztmpm1=zupusd-zlousd219 214 zlousd = MAX(zlo, rdawn(ji,jj)) 220 215 zupusd = MAX(zup, rdawn(ji,jj)) 221 216 ztmp2 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 222 ztmpm2 =zupusd-zlousd223 217 ztmp = ztmp1 + ztmp2 224 ztmpm = ztmpm1 + ztmpm2225 218 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 226 IF (ztmpm .EQ. 0.) imask_night(ji,jj) = 1227 219 ENDIF 228 220 ELSE ! 24h light or 24h night … … 231 223 ztmp = fintegral(zlo, zup, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 232 224 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 233 imask_night(ji,jj) = 0234 225 ! 235 226 ELSE ! No day 236 227 zqsrout(ji,jj) = 0.0_wp 237 imask_night(ji,jj) = 1238 228 ENDIF 239 229 ENDIF 240 230 END DO 241 231 END DO 242 !243 IF ( PRESENT(l_mask) .AND. l_mask ) THEN244 zqsrout(:,:) = float(imask_night(:,:))245 ENDIF246 232 ! 247 233 IF( nn_timing == 1 ) CALL timing_stop('sbc_dcy') -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcflx.F90
r3625 r6736 61 61 !! 62 62 !! CAUTION : - never mask the surface stress fields 63 !! - the stress is assumed to be in the (i,j) mesh referential 63 !! - the stress is assumed to be in the mesh referential 64 !! i.e. the (i,j) referential 64 65 !! 65 66 !! ** Action : update at each time-step … … 67 68 !! - taum wind stress module at T-point 68 69 !! - wndm 10m wind module at T-point 69 !! - qns non solar heat flux including heat flux due to emp 70 !! - qsr solar heat flux 71 !! - emp upward mass flux (evap. - precip.) 72 !! - sfx salt flux; set to zero at nit000 but possibly non-zero 73 !! if ice is present (computed in limsbc(_2).F90) 70 !! - qns, qsr non-slor and solar heat flux 71 !! - emp, emps evaporation minus precipitation 74 72 !!---------------------------------------------------------------------- 75 73 INTEGER, INTENT(in) :: kt ! ocean time step … … 123 121 CALL fld_fill( sf, slf_i, cn_dir, 'sbc_flx', 'flux formulation for ocean surface boundary condition', 'namsbc_flx' ) 124 122 ! 125 sfx(:,:) = 0.0_wp ! salt flux due to freezing/melting (non-zero only if ice is present; set in limsbc(_2).F90)126 !127 123 ENDIF 128 124 … … 143 139 END DO 144 140 END DO 145 ! ! add to qns the heat due to e-p146 qns(:,:) = qns(:,:) - emp(:,:) * sst_m(:,:) * rcp ! mass flux is at SST147 !148 141 ! ! module of wind stress and wind speed at T-point 149 142 zcoef = 1. / ( zrhoa * zcdrag ) … … 161 154 CALL lbc_lnk( taum(:,:), 'T', 1. ) ; CALL lbc_lnk( wndm(:,:), 'T', 1. ) 162 155 156 emps(:,:) = emp (:,:) ! Initialization of emps (needed when no ice model) 157 163 158 IF( nitend-nit000 <= 100 .AND. lwp ) THEN ! control print (if less than 100 time-step asked) 164 159 WRITE(numout,*) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcfwb.F90
r3625 r6736 59 59 !! =3 global mean of emp set to zero at each nn_fsbc time step 60 60 !! & spread out over erp area depending its sign 61 !! Note: if sea ice is embedded it is taken into account when computing the budget62 61 !!---------------------------------------------------------------------- 63 62 INTEGER, INTENT( in ) :: kt ! ocean time-step index … … 65 64 INTEGER, INTENT( in ) :: kn_fwb ! ocean time-step index 66 65 ! 67 INTEGER :: inum, ikty, iyear ! local integers 68 REAL(wp) :: z_fwf, z_fwf_nsrf, zsum_fwf, zsum_erp ! local scalars 69 REAL(wp) :: zsurf_neg, zsurf_pos, zsurf_tospread, zcoef ! - - 70 REAL(wp), POINTER, DIMENSION(:,:) :: ztmsk_neg, ztmsk_pos, z_wgt ! 2D workspaces 71 REAL(wp), POINTER, DIMENSION(:,:) :: ztmsk_tospread, zerp_cor ! - - 66 INTEGER :: inum, ikty, iyear ! local integers 67 REAL(wp) :: z_fwf, z_fwf_nsrf, zsum_fwf, zsum_erp ! local scalars 68 REAL(wp) :: zsurf_neg, zsurf_pos, zsurf_tospread ! - - 69 REAL(wp), POINTER, DIMENSION(:,:) :: ztmsk_neg, ztmsk_pos, ztmsk_tospread, z_wgt, zerp_cor 72 70 !!---------------------------------------------------------------------- 73 71 ! … … 89 87 ! 90 88 area = glob_sum( e1e2t(:,:) ) ! interior global domain surface 91 !92 #if ! defined key_lim2 && ! defined key_lim3 && ! defined key_cice93 snwice_mass_b(:,:) = 0.e0 ! no sea-ice model is being used : no snow+ice mass94 snwice_mass (:,:) = 0.e095 #endif96 !97 89 ENDIF 98 90 … … 103 95 ! 104 96 IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN 105 z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - snwice_fmass(:,:) ) ) / area ! sum over the global domain 106 zcoef = z_fwf * rcp 107 emp(:,:) = emp(:,:) - z_fwf 108 qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) ! account for change to the heat budget due to fw correction 97 z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) ) ) / area ! sum over the global domain 98 emp (:,:) = emp (:,:) - z_fwf 99 emps(:,:) = emps(:,:) - z_fwf 109 100 ENDIF 110 101 ! 111 102 CASE ( 2 ) !== fwf budget adjusted from the previous year ==! 112 103 ! 113 IF( kt == nit000 ) THEN 104 IF( kt == nit000 ) THEN ! initialisation 114 105 ! ! Read the corrective factor on precipitations (fwfold) 115 106 CALL ctl_opn( inum, 'EMPave_old.dat', 'OLD', 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE. ) … … 126 117 ikty = 365 * 86400 / rdttra(1) !!bug use of 365 days leap year or 360d year !!!!!!! 127 118 IF( MOD( kt, ikty ) == 0 ) THEN 128 a_fwb_b = a_fwb ! mean sea level taking into account the ice+snow 129 ! sum over the global domain 130 a_fwb = glob_sum( e1e2t(:,:) * ( sshn(:,:) + snwice_mass(:,:) * r1_rau0 ) ) 119 a_fwb_b = a_fwb 120 a_fwb = glob_sum( e1e2t(:,:) * sshn(:,:) ) ! sum over the global domain 131 121 a_fwb = a_fwb * 1.e+3 / ( area * 86400. * 365. ) ! convert in Kg/m3/s = mm/s 132 122 !!gm ! !!bug 365d year … … 135 125 ENDIF 136 126 ! 137 IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN ! correct the freshwater fluxes 138 zcoef = fwfold * rcp 139 emp(:,:) = emp(:,:) + fwfold 140 qns(:,:) = qns(:,:) - zcoef * sst_m(:,:) ! account for change to the heat budget due to fw correction 141 ENDIF 142 ! 143 IF( kt == nitend .AND. lwp ) THEN ! save fwfold value in a file 127 IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN ! correct the freshwater fluxes 128 emp (:,:) = emp (:,:) + fwfold 129 emps(:,:) = emps(:,:) + fwfold 130 ENDIF 131 ! 132 IF( kt == nitend .AND. lwp ) THEN ! save fwfold value in a file 144 133 CALL ctl_opn( inum, 'EMPave.dat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE., narea ) 145 134 WRITE( inum, "(24X,I8,2ES24.16)" ) nyear, a_fwb_b, a_fwb … … 154 143 ztmsk_neg(:,:) = tmask_i(:,:) - ztmsk_pos(:,:) 155 144 ! 156 zsurf_neg = glob_sum( e1e2t(:,:)*ztmsk_neg(:,:) ) ! Area filled by <0 and >0 erp145 zsurf_neg = glob_sum( e1e2t(:,:)*ztmsk_neg(:,:) ) ! Area filled by <0 and >0 erp 157 146 zsurf_pos = glob_sum( e1e2t(:,:)*ztmsk_pos(:,:) ) 158 ! ! fwf global mean (excluding ocean to ice/snow exchanges)159 z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - snwice_fmass(:,:) ) ) / area147 ! ! fwf global mean 148 z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) ) ) / area 160 149 ! 161 150 IF( z_fwf < 0._wp ) THEN ! spread out over >0 erp area to increase evaporation … … 171 160 z_fwf_nsrf = zsum_fwf / ( zsurf_tospread + rsmall ) 172 161 ! ! weight to respect erp field 2D structure 173 zsum_erp 162 zsum_erp = glob_sum( ztmsk_tospread(:,:) * erp(:,:) * e1e2t(:,:) ) 174 163 z_wgt(:,:) = ztmsk_tospread(:,:) * erp(:,:) / ( zsum_erp + rsmall ) 175 164 ! ! final correction term to apply … … 179 168 CALL lbc_lnk( zerp_cor, 'T', 1. ) 180 169 ! 181 emp (:,:) = emp(:,:) + zerp_cor(:,:)182 qns(:,:) = qns(:,:) - zerp_cor(:,:) * rcp * sst_m(:,:) ! account for change to the heat budget due to fw correction183 erp (:,:) = erp(:,:) + zerp_cor(:,:)170 emp (:,:) = emp (:,:) + zerp_cor(:,:) 171 emps(:,:) = emps(:,:) + zerp_cor(:,:) 172 erp (:,:) = erp (:,:) + zerp_cor(:,:) 184 173 ! 185 174 IF( nprint == 1 .AND. lwp ) THEN ! control print -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_cice.F90
r3625 r6736 15 15 USE dom_oce ! ocean space and time domain 16 16 USE domvvl 17 USE phycst, only : rcp, rau0 , r1_rau0, rhosn, rhoic17 USE phycst, only : rcp, rau0 18 18 USE in_out_manager ! I/O manager 19 19 USE lib_mpp ! distributed memory computing library … … 37 37 USE ice_gather_scatter 38 38 USE ice_calendar, only: dt 39 USE ice_state, only: aice,aicen,uvel,vvel,vsno ,vsnon,vice,vicen39 USE ice_state, only: aice,aicen,uvel,vvel,vsnon,vicen 40 40 USE ice_flux, only: strax,stray,strocnx,strocny,frain,fsnow, & 41 41 sst,sss,uocn,vocn,ss_tltx,ss_tlty,fsalt_gbm, & … … 59 59 PUBLIC cice_sbc_final ! routine called by sbc_final 60 60 PUBLIC sbc_ice_cice ! routine called by sbc 61 62 INTEGER , PARAMETER :: ji_off = INT ( (jpiglo - nx_global) / 2 )63 INTEGER , PARAMETER :: jj_off = INT ( (jpjglo - ny_global) / 2 )64 61 65 62 INTEGER , PARAMETER :: jpfld = 13 ! maximum number of files to read … … 110 107 !! ** Action : - time evolution of the CICE sea-ice model 111 108 !! - update all sbc variables below sea-ice: 112 !! utau, vtau, qns , qsr, emp , sfx109 !! utau, vtau, qns , qsr, emp , emps 113 110 !!--------------------------------------------------------------------- 114 111 INTEGER, INTENT(in) :: kt ! ocean time step … … 146 143 !! ** Purpose: Initialise ice related fields for NEMO and coupling 147 144 !! 148 INTEGER, INTENT( in ) :: nsbc ! surface forcing type 149 REAL(wp), DIMENSION(:,:), POINTER :: ztmp1, ztmp2 150 REAL(wp) :: zcoefu, zcoefv, zcoeff ! local scalar 151 INTEGER :: ji, jj, jl ! dummy loop indices 152 !!--------------------------------------------------------------------- 145 INTEGER, INTENT( in ) :: nsbc ! surface forcing type 146 !!--------------------------------------------------------------------- 147 148 INTEGER :: ji, jj, jpl ! dummy loop indices 153 149 154 150 IF( nn_timing == 1 ) CALL timing_start('cice_sbc_init') 155 !156 CALL wrk_alloc( jpi,jpj, ztmp1, ztmp2 )157 151 ! 158 152 IF(lwp) WRITE(numout,*)'cice_sbc_init' … … 188 182 CALL cice2nemo(aice,fr_i, 'T', 1. ) 189 183 IF ( (nsbc == 2).OR.(nsbc == 5) ) THEN 190 DO j l=1,ncat191 CALL cice2nemo(aicen(:,:,j l,:),a_i(:,:,jl), 'T', 1. )184 DO jpl=1,ncat 185 CALL cice2nemo(aicen(:,:,jpl,:),a_i(:,:,jpl), 'T', 1. ) 192 186 ENDDO 193 187 ENDIF … … 204 198 CALL lbc_lnk ( fr_iu , 'U', 1. ) 205 199 CALL lbc_lnk ( fr_iv , 'V', 1. ) 206 207 ! ! embedded sea ice208 IF( nn_ice_embd /= 0 ) THEN ! mass exchanges between ice and ocean (case 1 or 2) set the snow+ice mass209 CALL cice2nemo(vsno(:,:,:),ztmp1,'T', 1. )210 CALL cice2nemo(vice(:,:,:),ztmp2,'T', 1. )211 snwice_mass (:,:) = ( rhosn * ztmp1(:,:) + rhoic * ztmp2(:,:) )212 snwice_mass_b(:,:) = snwice_mass(:,:)213 ELSE214 snwice_mass (:,:) = 0.0_wp ! no mass exchanges215 snwice_mass_b(:,:) = 0.0_wp ! no mass exchanges216 ENDIF217 IF( nn_ice_embd == 2 .AND. & ! full embedment (case 2) & no restart :218 & .NOT.ln_rstart ) THEN ! deplete the initial ssh belew sea-ice area219 sshn(:,:) = sshn(:,:) - snwice_mass(:,:) * r1_rau0220 sshb(:,:) = sshb(:,:) - snwice_mass(:,:) * r1_rau0221 !222 ! Note: Changed the initial values of sshb and sshn=> need to recompute ssh[u,v,f]_[b,n]223 ! which were previously set in domvvl224 IF ( lk_vvl ) THEN ! Is this necessary? embd 2 should be restricted to vvl only???225 DO jj = 1, jpjm1226 DO ji = 1, jpim1 ! caution: use of Vector Opt. not possible227 zcoefu = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )228 zcoefv = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )229 zcoeff = 0.25 * umask(ji,jj,1) * umask(ji,jj+1,1)230 sshu_b(ji,jj) = zcoefu * ( e1t(ji ,jj) * e2t(ji ,jj) * sshb(ji ,jj) &231 & + e1t(ji+1,jj) * e2t(ji+1,jj) * sshb(ji+1,jj) )232 sshv_b(ji,jj) = zcoefv * ( e1t(ji,jj ) * e2t(ji,jj ) * sshb(ji,jj ) &233 & + e1t(ji,jj+1) * e2t(ji,jj+1) * sshb(ji,jj+1) )234 sshu_n(ji,jj) = zcoefu * ( e1t(ji ,jj) * e2t(ji ,jj) * sshn(ji ,jj) &235 & + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn(ji+1,jj) )236 sshv_n(ji,jj) = zcoefv * ( e1t(ji,jj ) * e2t(ji,jj ) * sshn(ji,jj ) &237 & + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn(ji,jj+1) )238 END DO239 END DO240 CALL lbc_lnk( sshu_b, 'U', 1. ) ; CALL lbc_lnk( sshu_n, 'U', 1. )241 CALL lbc_lnk( sshv_b, 'V', 1. ) ; CALL lbc_lnk( sshv_n, 'V', 1. )242 DO jj = 1, jpjm1243 DO ji = 1, jpim1 ! NO Vector Opt.244 sshf_n(ji,jj) = 0.5 * umask(ji,jj,1) * umask(ji,jj+1,1) &245 & / ( e1f(ji,jj ) * e2f(ji,jj ) ) &246 & * ( e1u(ji,jj ) * e2u(ji,jj ) * sshu_n(ji,jj ) &247 & + e1u(ji,jj+1) * e2u(ji,jj+1) * sshu_n(ji,jj+1) )248 END DO249 END DO250 CALL lbc_lnk( sshf_n, 'F', 1. )251 ENDIF252 ENDIF253 254 CALL wrk_dealloc( jpi,jpj, ztmp1, ztmp2 )255 200 ! 256 201 IF( nn_timing == 1 ) CALL timing_stop('cice_sbc_init') … … 267 212 INTEGER, INTENT(in ) :: nsbc ! surface forcing type 268 213 269 INTEGER :: ji, jj, j l ! dummy loop indices270 REAL(wp), DIMENSION(:,:), POINTER :: ztmp , zpice214 INTEGER :: ji, jj, jpl ! dummy loop indices 215 REAL(wp), DIMENSION(:,:), POINTER :: ztmp 271 216 REAL(wp), DIMENSION(:,:,:), POINTER :: ztmpn 272 REAL(wp) :: zintb, zintn ! dummy argument273 217 !!--------------------------------------------------------------------- 274 218 275 219 IF( nn_timing == 1 ) CALL timing_start('cice_sbc_in') 276 220 ! 277 CALL wrk_alloc( jpi,jpj, ztmp , zpice)221 CALL wrk_alloc( jpi,jpj, ztmp ) 278 222 CALL wrk_alloc( jpi,jpj,ncat, ztmpn ) 279 223 … … 315 259 ! Surface downward latent heat flux (CI_5) 316 260 IF (nsbc == 2) THEN 317 DO j l=1,ncat318 ztmpn(:,:,j l)=qla_ice(:,:,1)*a_i(:,:,jl)261 DO jpl=1,ncat 262 ztmpn(:,:,jpl)=qla_ice(:,:,1)*a_i(:,:,jpl) 319 263 ENDDO 320 264 ELSE … … 325 269 DO ji=1,jpi 326 270 IF (fr_i(ji,jj).eq.0.0) THEN 327 DO j l=1,ncat328 ztmpn(ji,jj,j l)=0.0271 DO jpl=1,ncat 272 ztmpn(ji,jj,jpl)=0.0 329 273 ENDDO 330 274 ! This will then be conserved in CICE 331 275 ztmpn(ji,jj,1)=qla_ice(ji,jj,1) 332 276 ELSE 333 DO j l=1,ncat334 ztmpn(ji,jj,j l)=qla_ice(ji,jj,1)*a_i(ji,jj,jl)/fr_i(ji,jj)277 DO jpl=1,ncat 278 ztmpn(ji,jj,jpl)=qla_ice(ji,jj,1)*a_i(ji,jj,jpl)/fr_i(ji,jj) 335 279 ENDDO 336 280 ENDIF … … 338 282 ENDDO 339 283 ENDIF 340 DO j l=1,ncat341 CALL nemo2cice(ztmpn(:,:,j l),flatn_f(:,:,jl,:),'T', 1. )284 DO jpl=1,ncat 285 CALL nemo2cice(ztmpn(:,:,jpl),flatn_f(:,:,jpl,:),'T', 1. ) 342 286 343 287 ! GBM conductive flux through ice (CI_6) 344 288 ! Convert to GBM 345 289 IF (nsbc == 2) THEN 346 ztmp(:,:) = botmelt(:,:,j l)*a_i(:,:,jl)290 ztmp(:,:) = botmelt(:,:,jpl)*a_i(:,:,jpl) 347 291 ELSE 348 ztmp(:,:) = botmelt(:,:,j l)292 ztmp(:,:) = botmelt(:,:,jpl) 349 293 ENDIF 350 CALL nemo2cice(ztmp,fcondtopn_f(:,:,j l,:),'T', 1. )294 CALL nemo2cice(ztmp,fcondtopn_f(:,:,jpl,:),'T', 1. ) 351 295 352 296 ! GBM surface heat flux (CI_7) 353 297 ! Convert to GBM 354 298 IF (nsbc == 2) THEN 355 ztmp(:,:) = (topmelt(:,:,j l)+botmelt(:,:,jl))*a_i(:,:,jl)299 ztmp(:,:) = (topmelt(:,:,jpl)+botmelt(:,:,jpl))*a_i(:,:,jpl) 356 300 ELSE 357 ztmp(:,:) = (topmelt(:,:,j l)+botmelt(:,:,jl))301 ztmp(:,:) = (topmelt(:,:,jpl)+botmelt(:,:,jpl)) 358 302 ENDIF 359 CALL nemo2cice(ztmp,fsurfn_f(:,:,j l,:),'T', 1. )303 CALL nemo2cice(ztmp,fsurfn_f(:,:,jpl,:),'T', 1. ) 360 304 ENDDO 361 305 … … 439 383 CALL nemo2cice(ztmp,vocn,'F', -1. ) 440 384 441 IF( nn_ice_embd == 2 ) THEN !== embedded sea ice: compute representative ice top surface ==!442 !443 ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[n/nn_fsbc], n=0,nn_fsbc-1}444 ! = (1/nn_fsbc)^2 * {SUM[n], n=0,nn_fsbc-1}445 zintn = REAL( nn_fsbc - 1 ) / REAL( nn_fsbc ) * 0.5_wp446 !447 ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1}448 ! = (1/nn_fsbc)^2 * (nn_fsbc^2 - {SUM[n], n=0,nn_fsbc-1})449 zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp450 !451 zpice(:,:) = ssh_m(:,:) + ( zintn * snwice_mass(:,:) + zintb * snwice_mass_b(:,:) ) * r1_rau0452 !453 !454 ELSE !== non-embedded sea ice: use ocean surface for slope calculation ==!455 zpice(:,:) = ssh_m(:,:)456 ENDIF457 458 385 ! x comp and y comp of sea surface slope (on F points) 459 386 ! T point to F point 460 387 DO jj=1,jpjm1 461 388 DO ji=1,jpim1 462 ztmp(ji,jj)=0.5 * ( ( zpice(ji+1,jj )-zpice(ji,jj ))/e1u(ji,jj ) &463 + ( zpice(ji+1,jj+1)-zpice(ji,jj+1))/e1u(ji,jj+1) ) &389 ztmp(ji,jj)=0.5 * ( (ssh_m(ji+1,jj )-ssh_m(ji,jj ))/e1u(ji,jj ) & 390 + (ssh_m(ji+1,jj+1)-ssh_m(ji,jj+1))/e1u(ji,jj+1) ) & 464 391 * fmask(ji,jj,1) 465 392 ENDDO … … 470 397 DO jj=1,jpjm1 471 398 DO ji=1,jpim1 472 ztmp(ji,jj)=0.5 * ( ( zpice(ji ,jj+1)-zpice(ji ,jj))/e2v(ji ,jj) &473 + ( zpice(ji+1,jj+1)-zpice(ji+1,jj))/e2v(ji+1,jj) ) &399 ztmp(ji,jj)=0.5 * ( (ssh_m(ji ,jj+1)-ssh_m(ji ,jj))/e2v(ji ,jj) & 400 + (ssh_m(ji+1,jj+1)-ssh_m(ji+1,jj))/e2v(ji+1,jj) ) & 474 401 * fmask(ji,jj,1) 475 402 ENDDO … … 493 420 INTEGER, INTENT( in ) :: nsbc ! surface forcing type 494 421 495 INTEGER :: ji, jj, j l ! dummy loop indices496 REAL(wp), DIMENSION(:,:), POINTER :: ztmp 1, ztmp2422 INTEGER :: ji, jj, jpl ! dummy loop indices 423 REAL(wp), DIMENSION(:,:), POINTER :: ztmp 497 424 !!--------------------------------------------------------------------- 498 425 499 426 IF( nn_timing == 1 ) CALL timing_start('cice_sbc_out') 500 427 ! 501 CALL wrk_alloc( jpi,jpj, ztmp 1, ztmp2)428 CALL wrk_alloc( jpi,jpj, ztmp ) 502 429 503 430 IF( kt == nit000 ) THEN … … 506 433 507 434 ! x comp of ocean-ice stress 508 CALL cice2nemo(strocnx,ztmp 1,'F', -1. )435 CALL cice2nemo(strocnx,ztmp,'F', -1. ) 509 436 ss_iou(:,:)=0.0 510 437 ! F point to U point 511 438 DO jj=2,jpjm1 512 439 DO ji=2,jpim1 513 ss_iou(ji,jj) = 0.5 * ( ztmp 1(ji,jj-1) + ztmp1(ji,jj) ) * umask(ji,jj,1)440 ss_iou(ji,jj) = 0.5 * ( ztmp(ji,jj-1) + ztmp(ji,jj) ) * umask(ji,jj,1) 514 441 ENDDO 515 442 ENDDO … … 517 444 518 445 ! y comp of ocean-ice stress 519 CALL cice2nemo(strocny,ztmp 1,'F', -1. )446 CALL cice2nemo(strocny,ztmp,'F', -1. ) 520 447 ss_iov(:,:)=0.0 521 448 ! F point to V point … … 523 450 DO jj=1,jpjm1 524 451 DO ji=2,jpim1 525 ss_iov(ji,jj) = 0.5 * ( ztmp 1(ji-1,jj) + ztmp1(ji,jj) ) * vmask(ji,jj,1)452 ss_iov(ji,jj) = 0.5 * ( ztmp(ji-1,jj) + ztmp(ji,jj) ) * vmask(ji,jj,1) 526 453 ENDDO 527 454 ENDDO … … 546 473 emp(:,:) = (1.0-fr_i(:,:))*emp(:,:) 547 474 ELSE IF (nsbc ==5) THEN 548 ! emp_tot is set in sbc_cpl_ice_flx (called from cice_sbc_in above) 549 ! This is currently as required with the coupling fields from the UM atmosphere 475 ! emp_tot is set in sbc_cpl_ice_flx (call from cice_sbc_in above) 550 476 emp(:,:) = emp_tot(:,:)+tprecip(:,:)*fr_i(:,:) 551 477 ENDIF 552 478 553 CALL cice2nemo(fresh_gbm,ztmp1,'T', 1. ) 554 CALL cice2nemo(fsalt_gbm,ztmp2,'T', 1. ) 555 556 ! Check to avoid unphysical expression when ice is forming (ztmp1 negative) 557 ! Otherwise we are effectively allowing ice of higher salinity than the ocean to form 558 ! which has to be compensated for by the ocean salinity potentially going negative 559 ! This check breaks conservation but seems reasonable until we have prognostic ice salinity 560 ! Note the 1000.0 below is to convert from kg salt to g salt (needed for PSU) 561 WHERE (ztmp1(:,:).lt.0.0) ztmp2(:,:)=MAX(ztmp2(:,:),ztmp1(:,:)*sss_m(:,:)/1000.0) 562 sfx(:,:)=ztmp2(:,:)*1000.0 563 emp(:,:)=emp(:,:)-ztmp1(:,:) 564 479 ! Subtract fluxes from CICE to get freshwater equivalent flux used in 480 ! salinity calculation 481 CALL cice2nemo(fresh_gbm,ztmp,'T', 1. ) 482 emps(:,:)=emp(:,:)-ztmp(:,:) 483 ! Note the 1000.0 is to convert from kg salt to g salt (needed for PSU) 484 CALL cice2nemo(fsalt_gbm,ztmp,'T', 1. ) 485 DO jj=1,jpj 486 DO ji=1,jpi 487 IF (sss_m(ji,jj).gt.0.0) THEN 488 emps(ji,jj)=emps(ji,jj)+ztmp(ji,jj)*1000.0/sss_m(ji,jj) 489 ENDIF 490 ENDDO 491 ENDDO 492 493 ! No longer remove precip over ice from free surface calculation on basis that the 494 ! weight of the precip will affect the free surface even if it falls on the ice 495 ! (same to the argument that freezing / melting of ice doesn't change the free surface) 496 ! Sublimation from the ice is treated in a similar way (included in emp but not emps) 497 ! 498 ! This should not be done in the variable volume case 499 500 IF (.NOT. lk_vvl) THEN 501 502 emp(:,:) = emp(:,:) - tprecip(:,:)*fr_i(:,:) 503 504 ! Take sublimation into account 505 IF (nsbc == 5 ) THEN 506 emp(:,:) = emp(:,:) + ( emp_ice(:,:) + sprecip(:,:) ) 507 ELSE IF (nsbc == 2 ) THEN 508 emp(:,:) = emp(:,:) - qla_ice(:,:,1) / Lsub 509 ENDIF 510 511 ENDIF 512 565 513 CALL lbc_lnk( emp , 'T', 1. ) 566 CALL lbc_lnk( sfx, 'T', 1. )514 CALL lbc_lnk( emps , 'T', 1. ) 567 515 568 516 ! Solar penetrative radiation and non solar surface heat flux … … 584 532 ! Now add in ice / snow related terms 585 533 ! [fswthru will be zero unless running with calc_Tsfc=T in CICE] 586 CALL cice2nemo(fswthru_gbm,ztmp 1,'T', 1. )587 qsr(:,:)=qsr(:,:)+ztmp 1(:,:)534 CALL cice2nemo(fswthru_gbm,ztmp,'T', 1. ) 535 qsr(:,:)=qsr(:,:)+ztmp(:,:) 588 536 CALL lbc_lnk( qsr , 'T', 1. ) 589 537 … … 594 542 ENDDO 595 543 596 CALL cice2nemo(fhocn_gbm,ztmp 1,'T', 1. )597 qns(:,:)=qns(:,:)+nfrzmlt(:,:)+ztmp 1(:,:)544 CALL cice2nemo(fhocn_gbm,ztmp,'T', 1. ) 545 qns(:,:)=qns(:,:)+nfrzmlt(:,:)+ztmp(:,:) 598 546 599 547 CALL lbc_lnk( qns , 'T', 1. ) … … 603 551 CALL cice2nemo(aice,fr_i,'T', 1. ) 604 552 IF ( (nsbc == 2).OR.(nsbc == 5) ) THEN 605 DO j l=1,ncat606 CALL cice2nemo(aicen(:,:,j l,:),a_i(:,:,jl), 'T', 1. )553 DO jpl=1,ncat 554 CALL cice2nemo(aicen(:,:,jpl,:),a_i(:,:,jpl), 'T', 1. ) 607 555 ENDDO 608 556 ENDIF … … 620 568 CALL lbc_lnk ( fr_iv , 'V', 1. ) 621 569 622 ! ! embedded sea ice623 IF( nn_ice_embd /= 0 ) THEN ! mass exchanges between ice and ocean (case 1 or 2) set the snow+ice mass624 CALL cice2nemo(vsno(:,:,:),ztmp1,'T', 1. )625 CALL cice2nemo(vice(:,:,:),ztmp2,'T', 1. )626 snwice_mass (:,:) = ( rhosn * ztmp1(:,:) + rhoic * ztmp2(:,:) )627 snwice_mass_b(:,:) = snwice_mass(:,:)628 snwice_fmass (:,:) = ( snwice_mass(:,:) - snwice_mass_b(:,:) ) / dt629 ENDIF630 631 570 ! Release work space 632 571 633 CALL wrk_dealloc( jpi,jpj, ztmp 1, ztmp2)572 CALL wrk_dealloc( jpi,jpj, ztmp ) 634 573 ! 635 574 IF( nn_timing == 1 ) CALL timing_stop('cice_sbc_out') … … 648 587 !!--------------------------------------------------------------------- 649 588 650 INTEGER :: j l ! dummy loop index589 INTEGER :: jpl ! dummy loop index 651 590 INTEGER :: ierror 652 591 … … 671 610 ! Snow and ice thicknesses (CO_2 and CO_3) 672 611 673 DO j l = 1,ncat674 CALL cice2nemo(vsnon(:,:,j l,:),ht_s(:,:,jl),'T', 1. )675 CALL cice2nemo(vicen(:,:,j l,:),ht_i(:,:,jl),'T', 1. )612 DO jpl = 1,ncat 613 CALL cice2nemo(vsnon(:,:,jpl,:),ht_s(:,:,jpl),'T', 1. ) 614 CALL cice2nemo(vicen(:,:,jpl,:),ht_i(:,:,jpl),'T', 1. ) 676 615 ENDDO 677 616 ! … … 841 780 REAL(wp), DIMENSION(jpi,jpj) :: pn 842 781 #if !defined key_nemocice_decomp 843 REAL(wp), DIMENSION(jpiglo,jpjglo) :: png2844 782 REAL (kind=dbl_kind), dimension(nx_global,ny_global) :: pcg 845 783 #endif … … 860 798 ! Copy local domain data from NEMO to CICE field 861 799 pc(:,:,1)=0.0 862 DO jj=2,ny_block -1863 DO ji=2,nx_block -1864 pc(ji,jj,1)=pn(ji -1+ji_off,jj-1+jj_off)800 DO jj=2,ny_block 801 DO ji=2,nx_block 802 pc(ji,jj,1)=pn(ji,jj-1) 865 803 ENDDO 866 804 ENDDO … … 886 824 ! pcg(:,:)=0.0 887 825 DO jn=1,jpnij 888 DO jj= nldjt(jn),nlejt(jn)889 DO ji= nldit(jn),nleit(jn)890 p ng2(ji+nimppt(jn)-1,jj+njmppt(jn)-1)=png(ji,jj,jn)826 DO jj=1,nlcjt(jn)-1 827 DO ji=2,nlcit(jn)-1 828 pcg(ji+nimppt(jn)-2,jj+njmppt(jn)-1)=png(ji,jj,jn) 891 829 ENDDO 892 ENDDO893 ENDDO894 DO jj=1,ny_global895 DO ji=1,nx_global896 pcg(ji,jj)=png2(ji+ji_off,jj+jj_off)897 830 ENDDO 898 831 ENDDO … … 989 922 DO jj=1,jpjm1 990 923 DO ji=1,jpim1 991 pn(ji,jj)=pc(ji +1-ji_off,jj+1-jj_off,1)924 pn(ji,jj)=pc(ji,jj+1,1) 992 925 ENDDO 993 926 ENDDO … … 1003 936 ! Need to make sure this is robust to changes in NEMO halo rows.... 1004 937 ! (may be OK but not spent much time thinking about it) 1005 ! Note that non-existent pcg elements may be used below, but1006 ! the lbclnk call on pn will replace these with sensible values1007 938 1008 939 IF (nproc==0) THEN 1009 940 png(:,:,:)=0.0 1010 941 DO jn=1,jpnij 1011 DO jj= nldjt(jn),nlejt(jn)1012 DO ji= nldit(jn),nleit(jn)1013 png(ji,jj,jn)=pcg(ji+nimppt(jn)- 1-ji_off,jj+njmppt(jn)-1-jj_off)942 DO jj=1,nlcjt(jn)-1 943 DO ji=2,nlcit(jn)-1 944 png(ji,jj,jn)=pcg(ji+nimppt(jn)-2,jj+njmppt(jn)-1) 1014 945 ENDDO 1015 946 ENDDO -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_if.F90
r3625 r6736 5 5 !! covered area using ice-if model 6 6 !!====================================================================== 7 !! History : 3.0 ! 2006-06 (G. Madec) Original code7 !! History : 3.0 ! 2006-06 (G. Madec) Original code 8 8 !!---------------------------------------------------------------------- 9 9 10 10 !!---------------------------------------------------------------------- 11 !! sbc_ice_if : update sbc in ice-covered area11 !! sbc_ice_if : update sbc in ice-covered area 12 12 !!---------------------------------------------------------------------- 13 USE oce ! ocean dynamics and tracers14 USE dom_oce ! ocean space and time domain15 USE phycst ! physical constants16 USE eosbn2 ! equation of state17 USE sbc_oce ! surface boundary condition: ocean fields13 USE oce ! ocean dynamics and tracers 14 USE dom_oce ! ocean space and time domain 15 USE phycst ! physical constants 16 USE eosbn2 ! equation of state 17 USE sbc_oce ! surface boundary condition: ocean fields 18 18 USE sbccpl 19 USE fldread ! read input field20 USE iom ! I/O manager library21 USE in_out_manager ! I/O manager22 USE lib_mpp ! MPP library23 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)19 USE fldread ! read input field 20 USE iom ! I/O manager library 21 USE in_out_manager ! I/O manager 22 USE lib_mpp ! MPP library 23 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 24 24 25 25 IMPLICIT NONE … … 52 52 !! taum, wndm : remain unchanged 53 53 !! qns, qsr : update heat flux below sea-ice 54 !! emp, sfx: update freshwater flux below sea-ice54 !! emp, emps : update freshwater flux below sea-ice 55 55 !! fr_i : update the ice fraction 56 56 !!--------------------------------------------------------------------- -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim.F90
r3625 r6736 10 10 !! - ! 2008-04 (G. Madec) sltyle and lim_ctl routine 11 11 !! 3.3 ! 2010-11 (G. Madec) ice-ocean stress always computed at each ocean time-step 12 !! 3.4! 2011-01 (A Porter) dynamical allocation12 !! 4.0 ! 2011-01 (A Porter) dynamical allocation 13 13 !!---------------------------------------------------------------------- 14 14 #if defined key_lim3 … … 88 88 !! ** Action : - time evolution of the LIM sea-ice model 89 89 !! - update all sbc variables below sea-ice: 90 !! utau, vtau, taum, wndm, qns , qsr, emp , sfx90 !! utau, vtau, taum, wndm, qns , qsr, emp , emps 91 91 !!--------------------------------------------------------------------- 92 92 INTEGER, INTENT(in) :: kt ! ocean time step … … 170 170 171 171 ! ! intialisation to zero !!gm is it truly necessary ??? 172 d_a_i_thd (:,:,:) = 0. _wp ; d_a_i_trp (:,:,:) = 0._wp173 d_v_i_thd (:,:,:) = 0. _wp ; d_v_i_trp (:,:,:) = 0._wp174 d_e_i_thd (:,:,:,:) = 0. _wp ; d_e_i_trp (:,:,:,:) = 0._wp175 d_v_s_thd (:,:,:) = 0. _wp ; d_v_s_trp (:,:,:) = 0._wp176 d_e_s_thd (:,:,:,:) = 0. _wp ; d_e_s_trp (:,:,:,:) = 0._wp177 d_smv_i_thd(:,:,:) = 0. _wp ; d_smv_i_trp(:,:,:) = 0._wp178 d_oa_i_thd (:,:,:) = 0. _wp ; d_oa_i_trp (:,:,:) = 0._wp179 ! 180 sfx (:,:) = 0._wp181 sfx_bri(:,:) = 0._wp ; sfx_mec (:,:) = 0._wp ; sfx_res (:,:) = 0._wp182 f hbri (:,:) = 0._wp ; fheat_mec(:,:) = 0._wp ; fheat_res(:,:) = 0._wp183 fhmec (:,:) = 0._wp ;184 fmmec (:,:) = 0._wp185 f ocea2D(:,:) = 0._wp186 fsup2D (:,:) = 0._wp172 d_a_i_thd (:,:,:) = 0.e0 ; d_a_i_trp (:,:,:) = 0.e0 173 d_v_i_thd (:,:,:) = 0.e0 ; d_v_i_trp (:,:,:) = 0.e0 174 d_e_i_thd (:,:,:,:) = 0.e0 ; d_e_i_trp (:,:,:,:) = 0.e0 175 d_v_s_thd (:,:,:) = 0.e0 ; d_v_s_trp (:,:,:) = 0.e0 176 d_e_s_thd (:,:,:,:) = 0.e0 ; d_e_s_trp (:,:,:,:) = 0.e0 177 d_smv_i_thd(:,:,:) = 0.e0 ; d_smv_i_trp(:,:,:) = 0.e0 178 d_oa_i_thd (:,:,:) = 0.e0 ; d_oa_i_trp (:,:,:) = 0.e0 179 ! 180 fseqv (:,:) = 0.e0 181 fsbri (:,:) = 0.e0 ; fsalt_res(:,:) = 0.e0 182 fsalt_rpo(:,:) = 0.e0 183 fhmec (:,:) = 0.e0 ; fhbri (:,:) = 0.e0 184 fmmec (:,:) = 0.e0 ; fheat_res(:,:) = 0.e0 185 fheat_rpo(:,:) = 0.e0 ; focea2D (:,:) = 0.e0 186 fsup2D (:,:) = 0.e0 187 187 ! 188 diag_sni_gr(:,:) = 0. _wp ; diag_lat_gr(:,:) = 0._wp189 diag_bot_gr(:,:) = 0. _wp ; diag_dyn_gr(:,:) = 0._wp190 diag_bot_me(:,:) = 0. _wp ; diag_sur_me(:,:) = 0._wp188 diag_sni_gr(:,:) = 0.e0 ; diag_lat_gr(:,:) = 0.e0 189 diag_bot_gr(:,:) = 0.e0 ; diag_dyn_gr(:,:) = 0.e0 190 diag_bot_me(:,:) = 0.e0 ; diag_sur_me(:,:) = 0.e0 191 191 ! dynamical invariants 192 delta_i(:,:) = 0. _wp ; divu_i(:,:) = 0._wp ; shear_i(:,:) = 0._wp192 delta_i(:,:) = 0.e0 ; divu_i(:,:) = 0.e0 ; shear_i(:,:) = 0.e0 193 193 194 194 CALL lim_rst_opn( kt ) ! Open Ice restart file … … 196 196 IF( ln_nicep ) CALL lim_prt_state( jiindx, jjindx, 1, ' - Beginning the time step - ' ) ! control print 197 197 ! 198 IF( .NOT. lk_c1d ) THEN ! Ice dynamics & transport (except in 1D case) 198 IF( .NOT. lk_c1d ) THEN 199 ! Ice dynamics & transport (not in 1D case) 199 200 CALL lim_dyn( kt ) ! Ice dynamics ( rheology/dynamics ) 200 201 CALL lim_trp( kt ) ! Ice transport ( Advection/diffusion ) … … 209 210 CALL lim_var_bv ! bulk brine volume (diag) 210 211 CALL lim_thd( kt ) ! Ice thermodynamics 211 zcoef = rdt_ice / rday! Ice natural aging212 zcoef = rdt_ice / 86400.e0 ! Ice natural aging 212 213 oa_i(:,:,:) = oa_i(:,:,:) + a_i(:,:,:) * zcoef 213 214 CALL lim_var_glo2eqv ! this CALL is maybe not necessary (Martin) … … 267 268 268 269 inb_altests = 10 269 inb_alp(:) = 270 inb_alp(:) = 0 270 271 271 272 ! Alert if incompatible volume and concentration … … 276 277 DO jj = 1, jpj 277 278 DO ji = 1, jpi 278 IF( v_i(ji,jj,jl) /= 0. _wp .AND. a_i(ji,jj,jl) == 0._wp) THEN279 IF( v_i(ji,jj,jl) /= 0.e0 .AND. a_i(ji,jj,jl) == 0.e0 ) THEN 279 280 WRITE(numout,*) ' ALERTE 2 : Incompatible volume and concentration ' 280 281 WRITE(numout,*) ' at_i ', at_i(ji,jj) … … 296 297 DO jj = 1, jpj 297 298 DO ji = 1, jpi 298 IF( ht_i(ji,jj,jl) > 50._wp) THEN299 IF( ht_i(ji,jj,jl) .GT. 50.0 ) THEN 299 300 CALL lim_prt_state( ji, jj, 2, ' ALERTE 3 : Very thick ice ' ) 300 301 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 … … 308 309 DO jj = 1, jpj 309 310 DO ji = 1, jpi 310 IF( MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) >0.5 .AND. &311 & at_i(ji,jj) > 0._wp) THEN311 IF( MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) .GT. 0.5 .AND. & 312 & at_i(ji,jj) .GT. 0.e0 ) THEN 312 313 CALL lim_prt_state( ji, jj, 1, ' ALERTE 4 : Very fast ice ' ) 313 314 WRITE(numout,*) ' ice strength : ', strength(ji,jj) … … 331 332 DO jj = 1, jpj 332 333 DO ji = 1, jpi 333 IF( tms(ji,jj) <= 0._wp .AND. at_i(ji,jj) > 0._wp) THEN334 IF( tms(ji,jj) .LE. 0.0 .AND. at_i(ji,jj) .GT. 0.e0 ) THEN 334 335 CALL lim_prt_state( ji, jj, 1, ' ALERTE 6 : Ice on continents ' ) 335 336 WRITE(numout,*) ' masks s, u, v : ', tms(ji,jj), tmu(ji,jj), tmv(ji,jj) … … 355 356 DO ji = 1, jpi 356 357 !!gm test twice sm_i ... ???? bug? 357 IF( ( ( ABS( sm_i(ji,jj,jl) ) < 0.5 ) .OR.&358 ( ABS( sm_i(ji,jj,jl) ) < 0.5) ) .AND. &359 ( a_i(ji,jj,jl) > 0._wp) ) THEN358 IF( ( ( ABS( sm_i(ji,jj,jl) ) .LT. 0.50) .OR. & 359 ( ABS( sm_i(ji,jj,jl) ) .LT. 0.50) ) .AND. & 360 ( a_i(ji,jj,jl) .GT. 0.e0 ) ) THEN 360 361 ! CALL lim_prt_state(ji,jj,1, ' ALERTE 7 : Very fresh ice ' ) 361 362 ! WRITE(numout,*) ' sst : ', sst_m(ji,jj) … … 376 377 DO jj = 1, jpj 377 378 DO ji = 1, jpi 378 IF ( ( ( ABS( o_i(ji,jj,jl) ) >rdt_ice ) .OR. &379 ( ABS( o_i(ji,jj,jl) ) < 0._wp) ) .AND. &380 ( a_i(ji,jj,jl) > 0._wp) ) THEN379 IF ( ( ( ABS( o_i(ji,jj,jl) ) .GT. rdt_ice ) .OR. & 380 ( ABS( o_i(ji,jj,jl) ) .LT. 0.00) ) .AND. & 381 ( a_i(ji,jj,jl) .GT. 0.0 ) ) THEN 381 382 CALL lim_prt_state( ji, jj, 1, ' ALERTE 9 : Wrong ice age ') 382 383 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 … … 391 392 DO jj = 1, jpj 392 393 DO ji = 1, jpi 393 IF( ABS( sfx(ji,jj) ) .GT. 1.0e-2 ) THEN394 IF( ABS( emps(ji,jj) ) .GT. 1.0e-2 ) THEN 394 395 CALL lim_prt_state( ji, jj, 3, ' ALERTE 5 : High salt flux ' ) 395 396 DO jl = 1, jpl … … 411 412 DO jj = 1, jpj 412 413 DO ji = 1, jpi 413 IF( ABS( qns(ji,jj) ) > 1500._wp .AND. at_i(ji,jj) > 0._wp) THEN414 IF( ABS( qns(ji,jj) ) .GT. 1500.0 .AND. ( at_i(ji,jj) .GT. 0.0 ) ) THEN 414 415 ! 415 416 WRITE(numout,*) ' ALERTE 8 : Very high non-solar heat flux' … … 428 429 WRITE(numout,*) ' fdtcn : ', fdtcn(ji,jj) 429 430 WRITE(numout,*) ' fhmec : ', fhmec(ji,jj) 430 WRITE(numout,*) ' fheat_ mec : ', fheat_mec(ji,jj)431 WRITE(numout,*) ' fheat_rpo : ', fheat_rpo(ji,jj) 431 432 WRITE(numout,*) ' fheat_res : ', fheat_res(ji,jj) 432 433 WRITE(numout,*) ' fhbri : ', fhbri(ji,jj) … … 449 450 DO ji = 1, jpi 450 451 ztmelts = -tmut * s_i(ji,jj,jk,jl) + rtt 451 IF( t_i(ji,jj,jk,jl) >= ztmelts .AND. v_i(ji,jj,jl) >1.e-6 &452 & .AND. a_i(ji,jj,jl) > 0._wp) THEN452 IF( t_i(ji,jj,jk,jl) .GE. ztmelts .AND. v_i(ji,jj,jl) .GT. 1.e-6 & 453 & .AND. a_i(ji,jj,jl) .GT. 0.e0 ) THEN 453 454 WRITE(numout,*) ' ALERTE 10 : Very warm ice' 454 455 WRITE(numout,*) ' ji, jj, jk, jl : ', ji, jj, jk, jl … … 605 606 WRITE(numout,*) ' - Heat / FW fluxes ' 606 607 WRITE(numout,*) ' ~~~~~~~~~~~~~~~~ ' 607 ! WRITE(numout,*) ' sfx_bri : ', sfx_bri(ki,kj)608 ! WRITE(numout,*) ' sfx : ', sfx(ki,kj)608 ! WRITE(numout,*) ' fsbri : ', fsbri(ki,kj) 609 ! WRITE(numout,*) ' fseqv : ', fseqv(ki,kj) 609 610 ! WRITE(numout,*) ' fsalt_res : ', fsalt_res(ki,kj) 610 WRITE(numout,*) ' fmmec : ', fmmec 611 WRITE(numout,*) ' fhmec : ', fhmec 612 WRITE(numout,*) ' fhbri : ', fhbri 613 WRITE(numout,*) ' fheat_ mec : ', fheat_mec(ki,kj)611 WRITE(numout,*) ' fmmec : ', fmmec(ki,kj) 612 WRITE(numout,*) ' fhmec : ', fhmec(ki,kj) 613 WRITE(numout,*) ' fhbri : ', fhbri(ki,kj) 614 WRITE(numout,*) ' fheat_rpo : ', fheat_rpo(ki,kj) 614 615 WRITE(numout,*) 615 616 WRITE(numout,*) ' sst : ', sst_m(ki,kj) … … 620 621 WRITE(numout,*) ' utau_ice : ', utau_ice(ki,kj) 621 622 WRITE(numout,*) ' vtau_ice : ', vtau_ice(ki,kj) 622 WRITE(numout,*) ' utau : ', utau 623 WRITE(numout,*) ' vtau : ', vtau 624 WRITE(numout,*) ' oc. vel. u : ', u_oce 625 WRITE(numout,*) ' oc. vel. v : ', v_oce 623 WRITE(numout,*) ' utau : ', utau(ki,kj) 624 WRITE(numout,*) ' vtau : ', vtau(ki,kj) 625 WRITE(numout,*) ' oc. vel. u : ', u_oce(ki,kj) 626 WRITE(numout,*) ' oc. vel. v : ', v_oce(ki,kj) 626 627 ENDIF 627 628 … … 639 640 WRITE(numout,*) 640 641 WRITE(numout,*) ' - Heat fluxes at bottom interface ***' 641 WRITE(numout,*) ' qsr : ', qsr(ki,kj)642 WRITE(numout,*) ' qns : ', qns(ki,kj)642 WRITE(numout,*) ' qsr : ', qsr(ki,kj) 643 WRITE(numout,*) ' qns : ', qns(ki,kj) 643 644 WRITE(numout,*) 644 645 WRITE(numout,*) ' - Salt fluxes at bottom interface ***' 645 WRITE(numout,*) ' emp : ', emp (ki,kj) 646 WRITE(numout,*) ' sfx_bri : ', sfx_bri(ki,kj) 647 WRITE(numout,*) ' sfx : ', sfx (ki,kj) 648 WRITE(numout,*) ' sfx_res : ', sfx_res(ki,kj) 649 WRITE(numout,*) ' sfx_mec : ', sfx_mec(ki,kj) 646 WRITE(numout,*) ' emps : ', emps(ki,kj) 647 WRITE(numout,*) ' emp : ', emp(ki,kj) 648 WRITE(numout,*) ' fsbri : ', fsbri(ki,kj) 649 WRITE(numout,*) ' fseqv : ', fseqv(ki,kj) 650 WRITE(numout,*) ' fsalt_res : ', fsalt_res(ki,kj) 651 WRITE(numout,*) ' fsalt_rpo : ', fsalt_rpo(ki,kj) 650 652 WRITE(numout,*) ' - Heat fluxes at bottom interface ***' 651 WRITE(numout,*) ' fheat_res : ', fheat_res(ki,kj)653 WRITE(numout,*) ' fheat_res : ', fheat_res(ki,kj) 652 654 WRITE(numout,*) 653 655 WRITE(numout,*) ' - Momentum fluxes ' -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim_2.F90
r3680 r6736 48 48 USE in_out_manager ! I/O manager 49 49 USE prtctl ! Print control 50 51 # if defined key_agrif52 USE agrif_ice53 USE agrif_lim2_update54 # endif55 50 56 51 IMPLICIT NONE … … 87 82 !! ** Action : - time evolution of the LIM sea-ice model 88 83 !! - update all sbc variables below sea-ice: 89 !! utau, vtau, taum, wndm, qns , qsr, emp , sfx84 !! utau, vtau, taum, wndm, qns , qsr, emp , emps 90 85 !!--------------------------------------------------------------------- 91 86 INTEGER, INTENT(in) :: kt ! ocean time step … … 106 101 ! 107 102 CALL ice_init_2 108 !109 # if defined key_agrif110 IF( .NOT. Agrif_Root() ) CALL Agrif_InitValues_cont_lim2 ! AGRIF: set the meshes111 # endif112 103 ENDIF 113 104 … … 115 106 IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN ! Ice time-step only ! 116 107 ! !----------------------! 117 # if defined key_agrif118 IF( .NOT. Agrif_Root() ) lim_nbstep = MOD(lim_nbstep,Agrif_rhot()&119 &*Agrif_PArent(nn_fsbc)/REAL(nn_fsbc)) + 1120 # endif121 108 ! Bulk Formulea ! 122 109 !----------------! … … 224 211 IF( lrst_ice ) CALL lim_rst_write_2( kt ) ! Ice restart file 225 212 ! 226 # if defined key_agrif && defined key_lim2227 IF( .NOT. Agrif_Root() ) CALL agrif_update_lim2( kt )228 # endif229 !230 213 ENDIF ! End sea-ice time step only 231 214 ! -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90
r3764 r6736 12 12 !! - ! 2010-10 (J. Chanut, C. Bricaud, G. Madec) add the surface pressure forcing 13 13 !! 3.4 ! 2011-11 (C. Harris) CICE added as an option 14 !! 3.5 ! 2012-11 (A. Coward, G. Madec) Rethink of heat, mass and salt surface fluxes15 14 !!---------------------------------------------------------------------- 16 15 … … 44 43 USE bdy_par ! for lk_bdy 45 44 USE bdyice_lim2 ! unstructured open boundary data (bdy_ice_lim_2 routine) 46 USE icbstp ! Icebergs!47 45 48 46 USE prtctl ! Print control (prt_ctl routine) 47 USE restart ! ocean restart 49 48 USE iom ! IOM library 50 49 USE in_out_manager ! I/O manager … … 77 76 !! 78 77 !! ** Method : Read the namsbc namelist and set derived parameters 79 !! Call init routines for all other SBC modules that have one80 78 !! 81 79 !! ** Action : - read namsbc parameters … … 84 82 INTEGER :: icpt ! local integer 85 83 !! 86 NAMELIST/namsbc/ nn_fsbc , ln_ana , ln_flx, ln_blk_clio, ln_blk_core, ln_cpl, & 87 & ln_blk_mfs, ln_apr_dyn, nn_ice, nn_ice_embd, ln_dm2dc , ln_rnf, & 88 & ln_ssr , nn_fwb , ln_cdgw , ln_wave , ln_sdw 84 NAMELIST/namsbc/ nn_fsbc , ln_ana , ln_flx , ln_blk_clio, ln_blk_core, ln_cpl, & 85 & ln_blk_mfs, ln_apr_dyn, nn_ice , ln_dm2dc, ln_rnf, ln_ssr , nn_fwb, ln_cdgw 89 86 !!---------------------------------------------------------------------- 90 87 … … 122 119 WRITE(numout,*) ' Patm gradient added in ocean & ice Eqs. ln_apr_dyn = ', ln_apr_dyn 123 120 WRITE(numout,*) ' ice management in the sbc (=0/1/2/3) nn_ice = ', nn_ice 124 WRITE(numout,*) ' ice-ocean embedded/levitating (=0/1/2) nn_ice_embd = ', nn_ice_embd125 121 WRITE(numout,*) ' daily mean to diurnal cycle qsr ln_dm2dc = ', ln_dm2dc 126 122 WRITE(numout,*) ' runoff / runoff mouths ln_rnf = ', ln_rnf … … 138 134 IF( sbc_rnf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_rnf arrays' ) 139 135 nkrnf = 0 140 rnf (:,:) = 0. 0_wp141 rnfmsk (:,:) = 0. 0_wp142 rnfmsk_z(:) = 0. 0_wp136 rnf (:,:) = 0.e0 137 rnfmsk (:,:) = 0.e0 138 rnfmsk_z(:) = 0.e0 143 139 ENDIF 144 140 IF( nn_ice == 0 ) fr_i(:,:) = 0.e0 ! no ice in the domain, ice fraction is always zero 145 146 sfx(:,:) = 0.0_wp ! the salt flux due to freezing/melting will be computed (i.e. will be non-zero)147 ! only if sea-ice is present148 141 149 142 ! ! restartability … … 162 155 IF( nn_ice == 4 .AND. .NOT.( ln_blk_core .OR. lk_cpl ) ) & 163 156 & CALL ctl_stop( 'CICE sea-ice model requires ln_blk_core or lk_cpl' ) 164 IF( nn_ice == 4 .AND. lk_agrif ) & 165 & CALL ctl_stop( 'CICE sea-ice model not currently available with AGRIF' ) 166 IF( ( nn_ice == 3 .OR. nn_ice == 4 ) .AND. nn_ice_embd == 0 ) & 167 & CALL ctl_stop( 'LIM3 and CICE sea-ice models require nn_ice_embd = 1 or 2' ) 157 IF( nn_ice == 4 .AND. ( .NOT. ( cp_cfg == 'orca' ) .OR. lk_agrif ) ) & 158 & CALL ctl_stop( 'CICE sea-ice model currently only available in a global ORCA configuration without AGRIF' ) 168 159 169 160 IF( ln_dm2dc ) nday_qsr = -1 ! initialisation flag … … 175 166 & CALL ctl_warn( 'diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' ) 176 167 177 IF ( ln_wave ) THEN 178 !Activated wave module but neither drag nor stokes drift activated 179 IF ( .NOT.(ln_cdgw .OR. ln_sdw) ) THEN 180 CALL ctl_warn( 'Ask for wave coupling but nor drag coefficient (ln_cdgw=F) neither stokes drift activated (ln_sdw=F)' ) 181 !drag coefficient read from wave model definable only with mfs bulk formulae and core 182 ELSEIF (ln_cdgw .AND. .NOT.(ln_blk_mfs .OR. ln_blk_core) ) THEN 183 CALL ctl_stop( 'drag coefficient read from wave model definable only with mfs bulk formulae and core') 184 ENDIF 185 ELSE 186 IF ( ln_cdgw .OR. ln_sdw ) & 187 & CALL ctl_stop('Not Activated Wave Module (ln_wave=F) but & 188 & asked coupling with drag coefficient (ln_cdgw =T) or Stokes drift (ln_sdw=T) ') 189 ENDIF 168 !drag coefficient read from wave model definable only with mfs bulk formulae and core 169 IF(ln_cdgw .AND. .NOT.(ln_blk_mfs .OR. ln_blk_core) ) & 170 & CALL ctl_stop( 'drag coefficient read from wave model definable only with mfs bulk formulae and core') 190 171 191 172 ! ! Choice of the Surface Boudary Condition (set nsbc) … … 238 219 !! ** Action : - set the ocean surface boundary condition at before and now 239 220 !! time step, i.e. 240 !! utau_b, vtau_b, qns_b, qsr_b, emp_n, sfx_b, qrp_b, erp_b241 !! utau , vtau , qns , qsr , emp , sfx, qrp , erp221 !! utau_b, vtau_b, qns_b, qsr_b, emp_n, emps_b, qrp_b, erp_b 222 !! utau , vtau , qns , qsr , emp , emps , qrp , erp 242 223 !! - updte the ice fraction : fr_i 243 224 !!---------------------------------------------------------------------- … … 255 236 ! The 3D heat content due to qsr forcing is treated in traqsr 256 237 ! qsr_b (:,:) = qsr (:,:) 257 emp_b (:,:) = emp(:,:)258 sfx_b(:,:) = sfx(:,:)238 emp_b (:,:) = emp (:,:) 239 emps_b(:,:) = emps(:,:) 259 240 ENDIF 260 241 ! ! ---------------------------------------- ! 261 242 ! ! forcing field computation ! 262 243 ! ! ---------------------------------------- ! 244 245 CALL iom_setkt( kt + nn_fsbc - 1 ) ! in sbc, iom_put is called every nn_fsbc time step 263 246 ! 264 247 IF( ln_apr_dyn ) CALL sbc_apr( kt ) ! atmospheric pressure provided at kt+0.5*nn_fsbc … … 268 251 ! ! averaged over nf_sbc time-step 269 252 270 IF (ln_ wave) CALL sbc_wave( kt )253 IF (ln_cdgw) CALL sbc_wave( kt ) 271 254 !== sbc formulation ==! 272 255 273 256 SELECT CASE( nsbc ) ! Compute ocean surface boundary condition 274 ! ! (i.e. utau,vtau, qns, qsr, emp, sfx)257 ! ! (i.e. utau,vtau, qns, qsr, emp, emps) 275 258 CASE( 0 ) ; CALL sbc_gyre ( kt ) ! analytical formulation : GYRE configuration 276 259 CASE( 1 ) ; CALL sbc_ana ( kt ) ! analytical formulation : uniform sbc … … 299 282 END SELECT 300 283 301 IF( ln_icebergs ) CALL icb_stp( kt ) ! compute icebergs302 303 284 IF( ln_rnf ) CALL sbc_rnf( kt ) ! add runoffs to fresh water fluxes 304 285 … … 321 302 CALL iom_get( numror, jpdom_autoglo, 'qns_b' , qns_b ) ! before non solar heat flux (T-point) 322 303 ! The 3D heat content due to qsr forcing is treated in traqsr 323 ! CALL iom_get( numror, jpdom_autoglo, 'qsr_b' , qsr_b ) ! before solar heat flux (T-point) 324 CALL iom_get( numror, jpdom_autoglo, 'emp_b', emp_b ) ! before freshwater flux (T-point) 325 ! To ensure restart capability with 3.3x/3.4 restart files !! to be removed in v3.6 326 IF( iom_varid( numror, 'sfx_b', ldstop = .FALSE. ) > 0 ) THEN 327 CALL iom_get( numror, jpdom_autoglo, 'sfx_b', sfx_b ) ! before salt flux (T-point) 328 ELSE 329 sfx_b (:,:) = sfx(:,:) 330 ENDIF 304 ! CALL iom_get( numror, jpdom_autoglo, 'qsr_b' , qsr_b ) ! before solar heat flux (T-point) 305 CALL iom_get( numror, jpdom_autoglo, 'emp_b' , emp_b ) ! before freshwater flux (T-point) 306 CALL iom_get( numror, jpdom_autoglo, 'emps_b', emps_b ) ! before C/D freshwater flux (T-point) 331 307 ELSE !* no restart: set from nit000 values 332 308 IF(lwp) WRITE(numout,*) ' nit000-1 surface forcing fields set to nit000' … … 334 310 vtau_b(:,:) = vtau(:,:) 335 311 qns_b (:,:) = qns (:,:) 336 emp_b (:,:) = emp(:,:) 337 sfx_b (:,:) = sfx(:,:) 312 ! qsr_b (:,:) = qsr (:,:) 313 emp_b (:,:) = emp (:,:) 314 emps_b(:,:) = emps(:,:) 338 315 ENDIF 339 316 ENDIF … … 351 328 ! CALL iom_rstput( kt, nitrst, numrow, 'qsr_b' , qsr ) 352 329 CALL iom_rstput( kt, nitrst, numrow, 'emp_b' , emp ) 353 CALL iom_rstput( kt, nitrst, numrow, ' sfx_b' , sfx)330 CALL iom_rstput( kt, nitrst, numrow, 'emps_b' , emps ) 354 331 ENDIF 355 332 … … 359 336 IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN 360 337 CALL iom_put( "empmr" , emp - rnf ) ! upward water flux 361 CALL iom_put( "saltflx", sfx ) ! downward salt flux 362 ! (includes virtual salt flux beneath ice 363 ! in linear free surface case) 338 CALL iom_put( "empsmr", emps - rnf ) ! c/d water flux 364 339 CALL iom_put( "qt" , qns + qsr ) ! total heat flux 365 340 CALL iom_put( "qns" , qns ) ! solar heat flux … … 368 343 ENDIF 369 344 ! 345 CALL iom_setkt( kt ) ! iom_put outside of sbc is called at every time step 346 ! 370 347 CALL iom_put( "utau", utau ) ! i-wind stress (stress can be updated at 371 348 CALL iom_put( "vtau", vtau ) ! j-wind stress each time step in sea-ice) … … 376 353 CALL prt_ctl(tab2d_1=fr_i , clinfo1=' fr_i - : ', mask1=tmask, ovlap=1 ) 377 354 CALL prt_ctl(tab2d_1=(emp-rnf) , clinfo1=' emp-rnf - : ', mask1=tmask, ovlap=1 ) 378 CALL prt_ctl(tab2d_1=( sfx-rnf) , clinfo1=' sfx-rnf- : ', mask1=tmask, ovlap=1 )355 CALL prt_ctl(tab2d_1=(emps-rnf) , clinfo1=' emps-rnf - : ', mask1=tmask, ovlap=1 ) 379 356 CALL prt_ctl(tab2d_1=qns , clinfo1=' qns - : ', mask1=tmask, ovlap=1 ) 380 357 CALL prt_ctl(tab2d_1=qsr , clinfo1=' qsr - : ', mask1=tmask, ovlap=1 ) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90
r3832 r6736 21 21 USE closea ! closed seas 22 22 USE fldread ! read input field at current time step 23 USE restart ! restart 23 24 USE in_out_manager ! I/O manager 24 25 USE iom ! I/O module … … 53 54 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: h_rnf !: depth of runoff in m 54 55 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: nk_rnf !: depth of runoff in model levels 55 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rnf_tsc_b, rnf_tsc !: before and now T & S runoff contents [K.m/s & PSU.m/s] 56 57 TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read) 58 TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read) 59 TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read) 60 61 !! * Substitutions 62 # include "domzgr_substitute.h90" 56 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rnf_tsc_b, rnf_tsc !: before and now T & S runoff contents [K.m/s & PSU.m/s] 57 58 REAL(wp) :: r1_rau0 ! = 1 / rau0 59 60 TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read) (PUBLIC for TAM) 61 TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read) (PUBLIC for TAM) 62 TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read) (PUBLIC for TAM) 63 64 !! * Substitutions 65 # include "domzgr_substitute.h90" 63 66 !!---------------------------------------------------------------------- 64 67 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 80 83 END FUNCTION sbc_rnf_alloc 81 84 82 83 85 SUBROUTINE sbc_rnf( kt ) 84 86 !!---------------------------------------------------------------------- … … 94 96 !!---------------------------------------------------------------------- 95 97 INTEGER, INTENT(in) :: kt ! ocean time step 96 ! 97 INTEGER :: ji, jj ! dummy loop indices 98 INTEGER :: z_err = 0 ! dummy integer for error handling 98 !! 99 INTEGER :: ji, jj ! dummy loop indices 99 100 !!---------------------------------------------------------------------- 100 101 ! … … 126 127 ! 127 128 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 129 rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) 128 130 ! 129 rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) ! updated runoff value at time step kt 130 ! 131 r1_rau0 = 1._wp / rau0 131 132 ! ! set temperature & salinity content of runoffs 132 133 IF( ln_rnf_tem ) THEN ! use runoffs temperature data … … 141 142 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 142 143 ! ! else use S=0 for runoffs (done one for all in the init) 143 IF ( ANY( rnf(:,:) < 0._wp ) ) z_err=1 144 IF(lk_mpp) CALL mpp_sum(z_err) 145 IF( z_err > 0 ) CALL ctl_stop( 'sbc_rnf : negative runnoff values exist' ) 144 ! 145 IF( ln_rnf_tem .OR. ln_rnf_sal ) THEN ! runoffs as outflow: use ocean SST and SSS 146 WHERE( rnf(:,:) < 0._wp ) ! example baltic model when flow is out of domain 147 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 148 rnf_tsc(:,:,jp_sal) = sss_m(:,:) * rnf(:,:) * r1_rau0 149 END WHERE 150 ENDIF 146 151 ! 147 152 CALL iom_put( "runoffs", rnf ) ! output runoffs arrays … … 194 199 !! 195 200 INTEGER :: ji, jj, jk ! dummy loop indices 201 REAL(wp) :: r1_rau0 ! local scalar 196 202 REAL(wp) :: zfact ! local scalar 197 203 !!---------------------------------------------------------------------- … … 199 205 zfact = 0.5_wp 200 206 ! 207 r1_rau0 = 1._wp / rau0 201 208 IF( ln_rnf_depth ) THEN !== runoff distributed over several levels ==! 202 209 IF( lk_vvl ) THEN ! variable volume case … … 245 252 INTEGER :: ji, jj, jk ! dummy loop indices 246 253 INTEGER :: ierror, inum ! temporary integer 247 ! 254 !! 248 255 NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, & 249 256 & sn_rnf, sn_cnf , sn_s_rnf , sn_t_rnf , sn_dep_rnf, & 250 257 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact 251 258 !!---------------------------------------------------------------------- 252 ! 259 253 260 ! ! ============ 254 261 ! ! Namelist … … 266 273 REWIND ( numnam ) ! Read Namelist namsbc_rnf 267 274 READ ( numnam, namsbc_rnf ) 268 ! 275 269 276 ! ! Control print 270 277 IF(lwp) THEN … … 279 286 WRITE(numout,*) ' multiplicative factor for runoff rn_rfact = ', rn_rfact 280 287 ENDIF 281 ! 288 282 289 ! ! ================== 283 290 ! ! Type of runoff … … 335 342 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 336 343 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 337 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year338 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month339 ENDIF340 344 CALL iom_open ( rn_dep_file, inum ) ! open file 341 345 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array … … 352 356 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 353 357 ELSE 354 CALL ctl_stop( ' sbc_rnf_init:runoff depth not positive, and not -999 or -1, rnf value in file fort.999' )355 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj)358 CALL ctl_stop( 'runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 359 WRITE(999,*) 'ji, jj, rnf(ji,jj) :', ji, jj, rnf(ji,jj) 356 360 ENDIF 357 361 END DO … … 391 395 nkrnf = 2 392 396 DO WHILE( nkrnf /= jpkm1 .AND. gdepw_0(nkrnf+1) < rn_hrnf ) ; nkrnf = nkrnf + 1 ; END DO 393 IF( ln_sco ) CALL ctl_warn( 'sbc_rnf: number of levels over which Kz is increased is computed for zco...' ) 397 IF( ln_sco ) & 398 CALL ctl_warn( 'sbc_rnf: number of levels over which Kz is increased is computed for zco...' ) 394 399 ENDIF 395 400 IF(lwp) WRITE(numout,*) … … 409 414 nkrnf = 0 410 415 ENDIF 411 ! 416 412 417 END SUBROUTINE sbc_rnf_init 413 418 … … 433 438 !! rnfmsk_z vertical structure 434 439 !!---------------------------------------------------------------------- 440 ! 435 441 INTEGER :: inum ! temporary integers 436 442 CHARACTER(len=140) :: cl_rnfile ! runoff file name … … 440 446 IF(lwp) WRITE(numout,*) 'rnf_mouth : river mouth mask' 441 447 IF(lwp) WRITE(numout,*) '~~~~~~~~~ ' 442 ! 448 443 449 cl_rnfile = TRIM( cn_dir )//TRIM( sn_cnf%clname ) 444 450 IF( .NOT. sn_cnf%ln_clim ) THEN ; WRITE(cl_rnfile, '(a,"_y",i4)' ) TRIM( cl_rnfile ), nyear ! add year 445 451 IF( sn_cnf%cltype == 'monthly' ) WRITE(cl_rnfile, '(a,"m",i2)' ) TRIM( cl_rnfile ), nmonth ! add month 446 452 ENDIF 447 ! 453 448 454 ! horizontal mask (read in NetCDF file) 449 455 CALL iom_open ( cl_rnfile, inum ) ! open file 450 456 CALL iom_get ( inum, jpdom_data, sn_cnf%clvar, rnfmsk ) ! read the river mouth array 451 457 CALL iom_close( inum ) ! close file 452 ! 458 453 459 IF( nn_closea == 1 ) CALL clo_rnf( rnfmsk ) ! closed sea inflow set as ruver mouth 454 ! 460 455 461 rnfmsk_z(:) = 0._wp ! vertical structure 456 462 rnfmsk_z(1) = 1.0 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssm.F90
r3680 r6736 18 18 USE sbcapr ! surface boundary condition: atmospheric pressure 19 19 USE prtctl ! Print control (prt_ctl routine) 20 USE restart ! ocean restart 20 21 USE iom 21 22 USE in_out_manager ! I/O manager … … 24 25 PRIVATE 25 26 26 PUBLIC sbc_ssm ! routine called by step.F90 27 PUBLIC sbc_ssm_init ! routine called by sbcmod.F90 27 PUBLIC sbc_ssm ! routine called by step.F90 28 28 29 LOGICAL, SAVE :: l_ssm_mean = .FALSE. ! keep track of whether means have been read30 ! from restart file31 32 29 !! * Substitutions 33 30 # include "domzgr_substitute.h90" … … 57 54 !!--------------------------------------------------------------------- 58 55 ! ! ---------------------------------------- ! 59 IF( nn_fsbc == 1 ) THEN ! Instantaneous surface fields !56 IF( nn_fsbc == 1 ) THEN ! Instantaneous surface fields ! 60 57 ! ! ---------------------------------------- ! 58 IF( kt == nit000 ) THEN 59 IF(lwp) WRITE(numout,*) 60 IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields, nn_fsbc=1 : instantaneous values' 61 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 62 ENDIF 63 ! 61 64 ssu_m(:,:) = ub(:,:,1) 62 65 ssv_m(:,:) = vb(:,:,1) … … 70 73 ! 71 74 ELSE 72 ! ! ---------------------------------------- -------!73 IF( kt == nit000 .AND. .NOT. l_ssm_mean ) THEN ! Initialisation: 1st time-step, no input means!74 ! ! ---------------------------------------- -------!75 ! ! ---------------------------------------- ! 76 IF( kt == nit000) THEN ! Initialisation: 1st time-step ! 77 ! ! ---------------------------------------- ! 75 78 IF(lwp) WRITE(numout,*) 76 IF(lwp) WRITE(numout,*) '~~~~~~~ mean fields initialised to instantaneous values' 77 zcoef = REAL( nn_fsbc - 1, wp ) 78 ssu_m(:,:) = zcoef * ub(:,:,1) 79 ssv_m(:,:) = zcoef * vb(:,:,1) 80 sst_m(:,:) = zcoef * tsn(:,:,1,jp_tem) 81 sss_m(:,:) = zcoef * tsn(:,:,1,jp_sal) 82 ! ! removed inverse barometer ssh when Patm forcing is used 83 IF( ln_apr_dyn ) THEN ; ssh_m(:,:) = zcoef * ( sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) ) 84 ELSE ; ssh_m(:,:) = zcoef * sshn(:,:) 79 IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields' 80 ! 81 IF( ln_rstart .AND. iom_varid( numror, 'nn_fsbc', ldstop = .FALSE. ) > 0 ) THEN 82 CALL iom_get( numror , 'nn_fsbc', zf_sbc ) ! sbc frequency of previous run 83 CALL iom_get( numror, jpdom_autoglo, 'ssu_m' , ssu_m ) ! sea surface mean velocity (T-point) 84 CALL iom_get( numror, jpdom_autoglo, 'ssv_m' , ssv_m ) ! " " velocity (V-point) 85 CALL iom_get( numror, jpdom_autoglo, 'sst_m' , sst_m ) ! " " temperature (T-point) 86 CALL iom_get( numror, jpdom_autoglo, 'sss_m' , sss_m ) ! " " salinity (T-point) 87 CALL iom_get( numror, jpdom_autoglo, 'ssh_m' , ssh_m ) ! " " height (T-point) 88 ! 89 IF( zf_sbc /= REAL( nn_fsbc, wp ) ) THEN ! nn_fsbc has changed between 2 runs 90 IF(lwp) WRITE(numout,*) '~~~~~~~ restart with a change in the frequency of mean ', & 91 & 'from ', zf_sbc, ' to ', nn_fsbc 92 zcoef = REAL( nn_fsbc - 1, wp ) / zf_sbc 93 ssu_m(:,:) = zcoef * ssu_m(:,:) 94 ssv_m(:,:) = zcoef * ssv_m(:,:) 95 sst_m(:,:) = zcoef * sst_m(:,:) 96 sss_m(:,:) = zcoef * sss_m(:,:) 97 ssh_m(:,:) = zcoef * ssh_m(:,:) 98 ELSE 99 IF(lwp) WRITE(numout,*) '~~~~~~~ mean fields read in the ocean restart file' 100 ENDIF 101 ELSE 102 IF(lwp) WRITE(numout,*) '~~~~~~~ mean fields initialised to instantaneous values' 103 zcoef = REAL( nn_fsbc - 1, wp ) 104 ssu_m(:,:) = zcoef * ub(:,:,1) 105 ssv_m(:,:) = zcoef * vb(:,:,1) 106 sst_m(:,:) = zcoef * tsn(:,:,1,jp_tem) 107 sss_m(:,:) = zcoef * tsn(:,:,1,jp_sal) 108 ! ! removed inverse barometer ssh when Patm forcing is used 109 IF( ln_apr_dyn ) THEN ; ssh_m(:,:) = zcoef * ( sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) ) 110 ELSE ; ssh_m(:,:) = zcoef * sshn(:,:) 111 ENDIF 112 85 113 ENDIF 86 114 ! ! ---------------------------------------- ! … … 137 165 END SUBROUTINE sbc_ssm 138 166 139 SUBROUTINE sbc_ssm_init140 !!----------------------------------------------------------------------141 !! *** ROUTINE sbc_ssm_init ***142 !!143 !! ** Purpose : Initialisation of the sbc data144 !!145 !! ** Action : - read parameters146 !!----------------------------------------------------------------------147 REAL(wp) :: zcoef, zf_sbc ! local scalar148 !!----------------------------------------------------------------------149 150 IF( nn_fsbc == 1 ) THEN151 !152 IF(lwp) WRITE(numout,*)153 IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields, nn_fsbc=1 : instantaneous values'154 IF(lwp) WRITE(numout,*) '~~~~~~~ '155 !156 ELSE157 !158 IF(lwp) WRITE(numout,*)159 IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields'160 IF(lwp) WRITE(numout,*) '~~~~~~~ '161 !162 IF( ln_rstart .AND. iom_varid( numror, 'nn_fsbc', ldstop = .FALSE. ) > 0 ) THEN163 l_ssm_mean = .TRUE.164 CALL iom_get( numror , 'nn_fsbc', zf_sbc ) ! sbc frequency of previous run165 CALL iom_get( numror, jpdom_autoglo, 'ssu_m' , ssu_m ) ! sea surface mean velocity (T-point)166 CALL iom_get( numror, jpdom_autoglo, 'ssv_m' , ssv_m ) ! " " velocity (V-point)167 CALL iom_get( numror, jpdom_autoglo, 'sst_m' , sst_m ) ! " " temperature (T-point)168 CALL iom_get( numror, jpdom_autoglo, 'sss_m' , sss_m ) ! " " salinity (T-point)169 CALL iom_get( numror, jpdom_autoglo, 'ssh_m' , ssh_m ) ! " " height (T-point)170 !171 IF( zf_sbc /= REAL( nn_fsbc, wp ) ) THEN ! nn_fsbc has changed between 2 runs172 IF(lwp) WRITE(numout,*) '~~~~~~~ restart with a change in the frequency of mean ', &173 & 'from ', zf_sbc, ' to ', nn_fsbc174 zcoef = REAL( nn_fsbc - 1, wp ) / zf_sbc175 ssu_m(:,:) = zcoef * ssu_m(:,:)176 ssv_m(:,:) = zcoef * ssv_m(:,:)177 sst_m(:,:) = zcoef * sst_m(:,:)178 sss_m(:,:) = zcoef * sss_m(:,:)179 ssh_m(:,:) = zcoef * ssh_m(:,:)180 ELSE181 IF(lwp) WRITE(numout,*) '~~~~~~~ mean fields read in the ocean restart file'182 ENDIF183 ENDIF184 ENDIF185 !186 END SUBROUTINE sbc_ssm_init187 188 167 !!====================================================================== 189 168 END MODULE sbcssm -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssr.F90
r3764 r6736 9 9 10 10 !!---------------------------------------------------------------------- 11 !! sbc_ssr : add to sbc a restoring term toward SST/SSS climatology12 !!---------------------------------------------------------------------- 13 USE oce ! ocean dynamics and tracers14 USE dom_oce ! ocean space and time domain15 USE sbc_oce ! surface boundary condition16 USE phycst ! physical constants17 USE sbcrnf ! surface boundary condition : runoffs18 USE fldread ! read input fields19 USE iom ! I/O manager20 USE in_out_manager ! I/O manager21 USE lib_mpp ! distribued memory computing library22 USE lbclnk ! ocean lateral boundary conditions (or mpp link)23 USE timing ! Timing24 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)11 !! sbc_ssr : add to sbc a restoring term toward SST/SSS climatology 12 !!---------------------------------------------------------------------- 13 USE oce ! ocean dynamics and tracers 14 USE dom_oce ! ocean space and time domain 15 USE sbc_oce ! surface boundary condition 16 USE phycst ! physical constants 17 USE sbcrnf ! surface boundary condition : runoffs 18 USE fldread ! read input fields 19 USE iom ! I/O manager 20 USE in_out_manager ! I/O manager 21 USE lib_mpp ! distribued memory computing library 22 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 23 USE timing ! Timing 24 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 25 25 26 26 IMPLICIT NONE … … 65 65 !! - at each nscb time step 66 66 !! add a retroaction term on qns (nn_sstr = 1) 67 !! add a damping term on sfx(nn_sssr = 1)68 !! add a damping term on emp 67 !! add a damping term on emps (nn_sssr = 1) 68 !! add a damping term on emp & emps (nn_sssr = 2) 69 69 !!--------------------------------------------------------------------- 70 70 INTEGER, INTENT(in ) :: kt ! ocean time step … … 93 93 ! ! ========================= ! 94 94 ! 95 IF( nn_sstr == 1 ) THEN 95 IF( nn_sstr == 1 ) THEN !* Temperature restoring term 96 96 !CDIR COLLAPSE 97 97 DO jj = 1, jpj … … 105 105 ENDIF 106 106 ! 107 IF( nn_sssr == 1 ) THEN !* Salinity damping term (salt flux only (sfx))107 IF( nn_sssr == 1 ) THEN !* Salinity damping term (salt flux, emps only) 108 108 zsrp = rn_deds / rday ! from [mm/day] to [kg/m2/s] 109 109 !CDIR COLLAPSE … … 111 111 DO ji = 1, jpi 112 112 zerp = zsrp * ( 1. - 2.*rnfmsk(ji,jj) ) & ! No damping in vicinity of river mouths 113 & * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) ) 114 sfx(ji,jj) = sfx(ji,jj) + zerp ! salt flux 115 erp(ji,jj) = zerp / MAX( sss_m(ji,jj), 1.e-20 ) ! converted into an equivalent volume flux (diagnostic only) 113 & * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) ) & 114 & / ( sss_m(ji,jj) + 1.e-20 ) 115 emps(ji,jj) = emps(ji,jj) + zerp 116 erp( ji,jj) = zerp 116 117 END DO 117 118 END DO 118 119 CALL iom_put( "erp", erp ) ! freshwater flux damping 119 120 ! 120 ELSEIF( nn_sssr == 2 ) THEN !* Salinity damping term (volume flux (emp) and associated heat flux (qns)121 ELSEIF( nn_sssr == 2 ) THEN !* Salinity damping term (volume flux, emp and emps) 121 122 zsrp = rn_deds / rday ! from [mm/day] to [kg/m2/s] 122 123 zerp_bnd = rn_sssr_bnd / rday ! - - … … 126 127 zerp = zsrp * ( 1. - 2.*rnfmsk(ji,jj) ) & ! No damping in vicinity of river mouths 127 128 & * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) ) & 128 & / MAX( sss_m(ji,jj),1.e-20 )129 & / ( sss_m(ji,jj) + 1.e-20 ) 129 130 IF( ln_sssr_bnd ) zerp = SIGN( 1., zerp ) * MIN( zerp_bnd, ABS(zerp) ) 130 emp (ji,jj) = emp (ji,jj) + zerp131 qns(ji,jj) = qns(ji,jj) - zerp * rcp * sst_m(ji,jj)132 erp (ji,jj) = zerp131 emp (ji,jj) = emp (ji,jj) + zerp 132 emps(ji,jj) = emps(ji,jj) + zerp 133 erp (ji,jj) = zerp 133 134 END DO 134 135 END DO -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbctide.F90
r3651 r6736 14 14 USE daymod 15 15 USE dynspg_oce 16 USE tide ini16 USE tide_mod 17 17 USE iom 18 18 … … 21 21 22 22 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: pot_astro 23 23 LOGICAL, PUBLIC :: ln_tide_pot = .false. 24 24 #if defined key_tide 25 25 26 26 LOGICAL, PUBLIC, PARAMETER :: lk_tide = .TRUE. 27 28 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:) :: omega_tide 29 30 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:) :: & 31 v0tide, & 32 utide, & 33 ftide 34 27 35 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: amp_pot,phi_pot 36 37 INTEGER, PUBLIC :: nb_harmo 38 INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) :: ntide 39 INTEGER, PUBLIC :: nn_tide, kt_tide 40 28 41 !!--------------------------------------------------------------------------------- 29 42 !! OPA 9.0 , LODYC-IPSL (2003) … … 38 51 !! * Arguments 39 52 INTEGER, INTENT( in ) :: kt ! ocean time-step 53 !! * Local declarations 54 INTEGER :: jk,ji 55 CHARACTER(LEN=4), DIMENSION(jpmax_harmo) :: clname 40 56 !!---------------------------------------------------------------------- 41 57 42 IF ( kt == nit000 .AND. .NOT. lk_dynspg_ts ) CALL ctl_stop( 'STOP', 'sbc_tide : tidal potential use only with time splitting' )58 NAMELIST/nam_tide/ln_tide_pot,nb_harmo,clname,nn_tide 43 59 44 IF ( nsec_day == NINT(0.5 * rdttra(1)) ) THEN 45 ! 60 IF ( kt == nit000 ) THEN 61 62 IF( .NOT. lk_dynspg_ts ) CALL ctl_stop( 'STOP', 'sbc_tide : tidal potential use only with time splitting' ) 63 64 ! Read Namelist nam_tide 65 66 nn_tide=INT(rday/rdt) 67 68 CALL tide_init_Wave 69 70 REWIND ( numnam ) 71 READ ( numnam, nam_tide ) 72 73 IF(lwp) THEN 74 WRITE(numout,*) 75 WRITE(numout,*) 'sbc_tide : Initialization of the tidal components' 76 WRITE(numout,*) '~~~~~~~ ' 77 ENDIF 78 79 IF(lwp) THEN 80 WRITE(numout,*) ' Namelist nam_tide' 81 WRITE(numout,*) ' Apply astronomical potential : ln_tide_pot =', ln_tide_pot 82 WRITE(numout,*) ' nb_harmo = ', nb_harmo 83 CALL flush(numout) 84 ENDIF 85 86 ALLOCATE(ntide (nb_harmo)) 87 DO jk=1,nb_harmo 88 DO ji=1,jpmax_harmo 89 IF (TRIM(clname(jk)) .eq. Wave(ji)%cname_tide) THEN 90 ntide(jk) = ji 91 EXIT 92 END IF 93 END DO 94 END DO 95 ALLOCATE(omega_tide(nb_harmo)) 96 ALLOCATE(v0tide (nb_harmo)) 97 ALLOCATE(utide (nb_harmo)) 98 ALLOCATE(ftide (nb_harmo)) 99 ALLOCATE(amp_pot(jpi,jpj,nb_harmo)) 100 ALLOCATE(phi_pot(jpi,jpj,nb_harmo)) 101 ALLOCATE(pot_astro(jpi,jpj)) 102 ENDIF 103 104 IF ( MOD( kt - 1, nn_tide ) == 0 ) THEN 46 105 kt_tide = kt 106 CALL tide_harmo(omega_tide, v0tide, utide, ftide, ntide, nb_harmo) 107 ENDIF 47 108 48 IF(lwp) THEN 49 WRITE(numout,*) 50 WRITE(numout,*) 'sbc_tide : (re)Initialization of the tidal potential at kt=',kt 51 WRITE(numout,*) '~~~~~~~ ' 52 ENDIF 109 amp_pot(:,:,:) = 0.e0 110 phi_pot(:,:,:) = 0.e0 111 pot_astro(:,:) = 0.e0 53 112 54 IF(lwp) THEN 55 IF ( kt == nit000 ) WRITE(numout,*) 'Apply astronomical potential : ln_tide_pot =', ln_tide_pot 56 CALL flush(numout) 57 ENDIF 58 59 IF ( kt == nit000 ) ALLOCATE(amp_pot(jpi,jpj,nb_harmo)) 60 IF ( kt == nit000 ) ALLOCATE(phi_pot(jpi,jpj,nb_harmo)) 61 IF ( kt == nit000 ) ALLOCATE(pot_astro(jpi,jpj)) 62 63 amp_pot(:,:,:) = 0.e0 64 phi_pot(:,:,:) = 0.e0 65 pot_astro(:,:) = 0.e0 66 67 IF ( ln_tide_pot ) CALL tide_init_potential 68 ! 69 ENDIF 113 IF (ln_tide_pot ) CALL tide_init_potential 70 114 71 115 END SUBROUTINE sbc_tide -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90
r3680 r6736 4 4 !! Wave module 5 5 !!====================================================================== 6 !! History : 3.3.1 ! 2011-09 (Adani M) Original code: Drag Coefficient 7 !! : 3.4 ! 2012-10 (Adani M) Stokes Drift 6 !! History : 3.3.1 ! 2011-09 (Adani M) Original code 8 7 !!---------------------------------------------------------------------- 9 8 USE iom ! I/O manager library … … 11 10 USE lib_mpp ! distribued memory computing library 12 11 USE fldread ! read input fields 13 USE oce14 12 USE sbc_oce ! Surface boundary condition: ocean fields 15 USE domvvl16 13 17 14 … … 25 22 PUBLIC sbc_wave ! routine called in sbc_blk_core or sbc_blk_mfs 26 23 27 INTEGER , PARAMETER :: jpfld = 3 ! maximum number of files to read for srokes drift 28 INTEGER , PARAMETER :: jp_usd = 1 ! index of stokes drift (i-component) (m/s) at T-point 29 INTEGER , PARAMETER :: jp_vsd = 2 ! index of stokes drift (j-component) (m/s) at T-point 30 INTEGER , PARAMETER :: jp_wn = 3 ! index of wave number (1/m) at T-point 31 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_cd ! structure of input fields (file informations, fields read) Drag Coefficient 32 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_sd ! structure of input fields (file informations, fields read) Stokes Drift 24 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_wave ! structure of input fields (file informations, fields read) 33 25 REAL(wp),PUBLIC,ALLOCATABLE,DIMENSION (:,:) :: cdn_wave 34 REAL(wp),ALLOCATABLE,DIMENSION (:,:) :: usd2d,vsd2d,uwavenum,vwavenum35 REAL(wp),PUBLIC,ALLOCATABLE,DIMENSION (:,:,:) :: usd3d,vsd3d,wsd3d36 26 37 !! * Substitutions38 # include "domzgr_substitute.h90"39 27 !!---------------------------------------------------------------------- 40 28 !! NEMO/OPA 4.0 , NEMO Consortium (2011) … … 52 40 !! ** Method : - Read namelist namsbc_wave 53 41 !! - Read Cd_n10 fields in netcdf files 54 !! - Read stokes drift 2d in netcdf files55 !! - Read wave number in netcdf files56 !! - Compute 3d stokes drift using monochromatic57 42 !! ** action : 58 43 !! 59 44 !!--------------------------------------------------------------------- 60 USE oce, ONLY : un,vn,hdivn,rotn 61 USE divcur 62 USE wrk_nemo 63 #if defined key_bdy 64 USE bdy_oce, ONLY : bdytmask 65 #endif 66 INTEGER, INTENT( in ) :: kt ! ocean time step 45 INTEGER, INTENT( in ) :: kt ! ocean time step 67 46 INTEGER :: ierror ! return error code 68 INTEGER :: ifpr, jj,ji,jk 69 REAL(wp),DIMENSION(:,:,:),POINTER :: udummy,vdummy,hdivdummy,rotdummy 70 REAL :: z2dt,z1_2dt 71 TYPE(FLD_N), DIMENSION(jpfld) :: slf_i ! array of namelist informations on the fields to read 72 CHARACTER(len=100) :: cn_dir ! Root directory for location of drag coefficient files 73 TYPE(FLD_N) :: sn_cdg, sn_usd, sn_vsd, sn_wn ! informations about the fields to be read 47 CHARACTER(len=100) :: cn_dir_cdg ! Root directory for location of drag coefficient files 48 TYPE(FLD_N) :: sn_cdg ! informations about the fields to be read 74 49 !!--------------------------------------------------------------------- 75 NAMELIST/namsbc_wave/ sn_cdg, cn_dir , sn_usd, sn_vsd, sn_wn50 NAMELIST/namsbc_wave/ sn_cdg, cn_dir_cdg 76 51 !!--------------------------------------------------------------------- 77 52 … … 87 62 ! ! name ! (hours) ! name ! (T/F) ! (T/F) ! 'monthly' ! filename ! pairs ! 88 63 sn_cdg = FLD_N('cdg_wave' , 1 ,'drag_coeff', .true. , .false. , 'daily' , '' , '' ) 89 sn_usd = FLD_N('sdw_wave' , 1 ,'u_sd2d', .true. , .false. , 'daily' , '' , '' ) 90 sn_vsd = FLD_N('sdw_wave' , 1 ,'v_sd2d', .true. , .false. , 'daily' , '' , '' ) 91 sn_wn = FLD_N( 'sdw_wave' , 1 ,'wave_num', .true. , .false. , 'daily' , '' , '' ) 92 cn_dir = './' ! directory in which the wave data are 64 cn_dir_cdg = './' ! directory in which the Patm data are 93 65 94 66 … … 97 69 ! 98 70 99 IF ( ln_cdgw ) THEN 100 ALLOCATE( sf_cd(1), STAT=ierror ) !* allocate and fill sf_wave with sn_cdg 101 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 102 ! 103 ALLOCATE( sf_cd(1)%fnow(jpi,jpj,1) ) 104 IF( sn_cdg%ln_tint ) ALLOCATE( sf_cd(1)%fdta(jpi,jpj,1,2) ) 105 CALL fld_fill( sf_cd, (/ sn_cdg /), cn_dir, 'sbc_wave', 'Wave module ', 'namsbc_wave' ) 106 ALLOCATE( cdn_wave(jpi,jpj) ) 107 cdn_wave(:,:) = 0.0 108 ENDIF 109 IF ( ln_sdw ) THEN 110 slf_i(jp_usd) = sn_usd ; slf_i(jp_vsd) = sn_vsd; slf_i(jp_wn) = sn_wn 111 ALLOCATE( sf_sd(3), STAT=ierror ) !* allocate and fill sf_wave with sn_cdg 112 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 113 ! 114 DO ifpr= 1, jpfld 115 ALLOCATE( sf_sd(ifpr)%fnow(jpi,jpj,1) ) 116 IF( slf_i(ifpr)%ln_tint ) ALLOCATE( sf_sd(ifpr)%fdta(jpi,jpj,1,2) ) 117 END DO 118 CALL fld_fill( sf_sd, slf_i, cn_dir, 'sbc_wave', 'Wave module ', 'namsbc_wave' ) 119 ALLOCATE( usd2d(jpi,jpj),vsd2d(jpi,jpj),uwavenum(jpi,jpj),vwavenum(jpi,jpj) ) 120 ALLOCATE( usd3d(jpi,jpj,jpk),vsd3d(jpi,jpj,jpk),wsd3d(jpi,jpj,jpk) ) 121 usd2d(:,:) = 0.0 ; vsd2d(:,:) = 0.0 ; uwavenum(:,:) = 0.0 ; vwavenum(:,:) = 0.0 122 usd3d(:,:,:) = 0.0 ;vsd3d(:,:,:) = 0.0 ; wsd3d(:,:,:) = 0.0 123 ENDIF 71 ALLOCATE( sf_wave(1), STAT=ierror ) !* allocate and fill sf_wave with sn_cdg 72 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 73 ! 74 CALL fld_fill( sf_wave, (/ sn_cdg /), cn_dir_cdg, 'sbc_wave', 'Wave module ', 'namsbc_wave' ) 75 ALLOCATE( sf_wave(1)%fnow(jpi,jpj,1) ) 76 IF( sn_cdg%ln_tint ) ALLOCATE( sf_wave(1)%fdta(jpi,jpj,1,2) ) 77 ALLOCATE( cdn_wave(jpi,jpj) ) 78 cdn_wave(:,:) = 0.0 124 79 ENDIF 125 80 ! 126 81 ! 127 IF ( ln_cdgw ) THEN 128 CALL fld_read( kt, nn_fsbc, sf_cd ) !* read drag coefficient from external forcing 129 cdn_wave(:,:) = sf_cd(1)%fnow(:,:,1) 130 ENDIF 131 IF ( ln_sdw ) THEN 132 CALL fld_read( kt, nn_fsbc, sf_sd ) !* read drag coefficient from external forcing 82 CALL fld_read( kt, nn_fsbc, sf_wave ) !* read drag coefficient from external forcing 83 cdn_wave(:,:) = sf_wave(1)%fnow(:,:,1) 133 84 134 ! Interpolate wavenumber, stokes drift into the grid_V and grid_V135 !-------------------------------------------------136 137 DO jj = 1, jpjm1138 DO ji = 1, jpim1139 uwavenum(ji,jj)=0.5 * ( 2. - umask(ji,jj,1) ) * ( sf_sd(3)%fnow(ji,jj,1) * tmask(ji,jj,1) &140 & + sf_sd(3)%fnow(ji+1,jj,1) * tmask(ji+1,jj,1) )141 142 vwavenum(ji,jj)=0.5 * ( 2. - vmask(ji,jj,1) ) * ( sf_sd(3)%fnow(ji,jj,1) * tmask(ji,jj,1) &143 & + sf_sd(3)%fnow(ji,jj+1,1) * tmask(ji,jj+1,1) )144 145 usd2d(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( sf_sd(1)%fnow(ji,jj,1) * tmask(ji,jj,1) &146 & + sf_sd(1)%fnow(ji+1,jj,1) * tmask(ji+1,jj,1) )147 148 vsd2d(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( sf_sd(2)%fnow(ji,jj,1) * tmask(ji,jj,1) &149 & + sf_sd(2)%fnow(ji,jj+1,1) * tmask(ji,jj+1,1) )150 END DO151 END DO152 153 !Computation of the 3d Stokes Drift154 DO jk = 1, jpk155 DO jj = 1, jpj-1156 DO ji = 1, jpi-1157 usd3d(ji,jj,jk) = usd2d(ji,jj)*exp(2.0*uwavenum(ji,jj)*(-MIN( gdept(ji,jj,jk) , gdept(ji+1,jj ,jk))))158 vsd3d(ji,jj,jk) = vsd2d(ji,jj)*exp(2.0*vwavenum(ji,jj)*(-MIN( gdept(ji,jj,jk) , gdept(ji ,jj+1,jk))))159 END DO160 END DO161 usd3d(jpi,:,jk) = usd2d(jpi,:)*exp( 2.0*uwavenum(jpi,:)*(-gdept(jpi,:,jk)) )162 vsd3d(:,jpj,jk) = vsd2d(:,jpj)*exp( 2.0*vwavenum(:,jpj)*(-gdept(:,jpj,jk)) )163 END DO164 165 CALL wrk_alloc( jpi,jpj,jpk,udummy,vdummy,hdivdummy,rotdummy)166 167 udummy(:,:,:)=un(:,:,:)168 vdummy(:,:,:)=vn(:,:,:)169 hdivdummy(:,:,:)=hdivn(:,:,:)170 rotdummy(:,:,:)=rotn(:,:,:)171 un(:,:,:)=usd3d(:,:,:)172 vn(:,:,:)=vsd3d(:,:,:)173 CALL div_cur(kt)174 ! !------------------------------!175 ! ! Now Vertical Velocity !176 ! !------------------------------!177 z2dt = 2._wp * rdt ! set time step size (Euler/Leapfrog)178 179 z1_2dt = 1.e0 / z2dt180 DO jk = jpkm1, 1, -1 ! integrate from the bottom the hor. divergence181 ! - ML - need 3 lines here because replacement of fse3t by its expression yields too long lines otherwise182 wsd3d(:,:,jk) = wsd3d(:,:,jk+1) - fse3t_n(:,:,jk) * hdivn(:,:,jk) &183 & - ( fse3t_a(:,:,jk) - fse3t_b(:,:,jk) ) &184 & * tmask(:,:,jk) * z1_2dt185 #if defined key_bdy186 wsd3d(:,:,jk) = wsd3d(:,:,jk) * bdytmask(:,:)187 #endif188 END DO189 hdivn(:,:,:)=hdivdummy(:,:,:)190 rotn(:,:,:)=rotdummy(:,:,:)191 vn(:,:,:)=vdummy(:,:,:)192 un(:,:,:)=udummy(:,:,:)193 CALL wrk_dealloc( jpi,jpj,jpk,udummy,vdummy,hdivdummy,rotdummy)194 ENDIF195 85 END SUBROUTINE sbc_wave 196 86 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/tide_mod.F90
r3670 r6736 10 10 USE phycst 11 11 USE daymod 12 USE in_out_manager ! I/O units 12 13 13 14 IMPLICIT NONE … … 21 22 jpmax_harmo = 19 ! maximum number of harmonic 22 23 23 TYPE, PUBLIC ::tide24 TYPE,PUBLIC:: tide 24 25 CHARACTER(LEN=4) :: cname_tide 25 26 REAL(wp) :: equitide … … 36 37 PUBLIC nodal_factort 37 38 PUBLIC tide_init_Wave 39 PUBLIC tide_pulse 38 40 39 41 CONTAINS … … 45 47 END SUBROUTINE tide_init_Wave 46 48 47 SUBROUTINE tide_harmo( pomega, pvt, put , pcor, ktide ,kc) 49 SUBROUTINE tide_harmo( pomega, pvt, put , pcor, ktide ,kc, rdate) 50 51 INTEGER, INTENT( in ), OPTIONAL :: & 52 rdate ! Reference date for tidal data 48 53 49 54 INTEGER, DIMENSION(kc), INTENT( in ) :: & … … 61 66 pcor ! 62 67 63 CALL astronomic_angle 68 IF( PRESENT(rdate) ) THEN 69 CALL astronomic_angle(rdate) 70 ELSE 71 CALL astronomic_angle 72 ENDIF 64 73 CALL tide_pulse(pomega, ktide ,kc) 65 74 CALL tide_vuf( pvt, put, pcor, ktide ,kc) … … 67 76 END SUBROUTINE tide_harmo 68 77 69 SUBROUTINE astronomic_angle 78 SUBROUTINE astronomic_angle(rdate) 79 80 INTEGER, INTENT( in ),OPTIONAL :: & 81 rdate ! Reference Year 70 82 71 83 !!---------------------------------------------------------------------- … … 77 89 REAL(wp) :: cosI,p,q,t2,t4,sin2I,s2,tgI2,P1,sh_tgn2,at1,at2 78 90 REAL(wp) :: zqy,zsy,zday,zdj,zhfrac 79 80 zqy=AINT((nyear-1901.)/4.) 81 zsy=nyear-1900. 82 83 zdj=dayjul(nyear,nmonth,nday) 91 INTEGER :: lcl_ryear, lcl_rmonth, lcl_rday 92 93 IF( PRESENT(rdate) ) THEN 94 lcl_ryear = int(rdate / 10000 ) 95 lcl_rmonth = int((rdate - lcl_ryear * 10000 ) / 100 ) 96 lcl_rday = int(rdate - lcl_ryear * 10000 - lcl_rmonth * 100) 97 ELSE 98 lcl_ryear = nyear 99 lcl_rmonth = nmonth 100 lcl_rday = nday 101 ENDIF 102 103 zqy=AINT((lcl_ryear-1901.)/4.) 104 zsy=lcl_ryear-1900. 105 106 zdj=dayjul(lcl_ryear,lcl_rmonth,lcl_rday) 84 107 zday=zdj+zqy-1. 85 108 86 zhfrac=nsec_day/3600. 109 IF( PRESENT(rdate) ) THEN 110 zhfrac=0._wp 111 ELSE 112 zhfrac=nsec_day/3600._wp 113 ENDIF 87 114 88 115 !---------------------------------------------------------------------- … … 336 363 case ( 11 ) 337 364 zf=nodal_factort(75) 338 zf =nodal_factort(0)365 zf1=nodal_factort(0) 339 366 zf=zf*zf1 340 367 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/updtide.F90
r3651 r6736 13 13 USE sbctide 14 14 USE dynspg_oce 15 USE tideini, ONLY: ln_tide_ramp, rdttideramp16 15 17 16 IMPLICIT NONE … … 34 33 INTEGER, INTENT( in ) :: kt,kit ! ocean time-step index 35 34 INTEGER :: ji,jj,jk 36 REAL (wp) :: zramp37 35 REAL (wp), DIMENSION(nb_harmo) :: zwt 36 !............................................................................... 37 ! Potentiel astronomique 38 38 !............................................................................... 39 39 40 40 pot_astro(:,:)=0.e0 41 zramp = 1.e042 41 43 42 IF (lk_dynspg_ts) THEN 44 43 zwt(:) = omega_tide(:)* ((kt-kt_tide)*rdt + kit*(rdt/REAL(nn_baro,wp))) 45 IF (ln_tide_ramp) THEN46 zramp = MIN(MAX( ((kt-nit000)*rdt + kit*(rdt/REAL(nn_baro,wp)))/(rdttideramp*rday),0.),1.)47 ENDIF48 44 ELSE 49 45 zwt(:) = omega_tide(:)*(kt-kt_tide)*rdt 50 IF (ln_tide_ramp) THEN51 zramp = MIN(MAX( ((kt-nit000)*rdt)/(rdttideramp*rday),0.),1.)52 ENDIF53 46 ENDIF 54 47 … … 56 49 do ji=1,jpi 57 50 do jj=1,jpj 58 pot_astro(ji,jj)=pot_astro(ji,jj) + zramp*(amp_pot(ji,jj,jk)*COS(zwt(jk)+phi_pot(ji,jj,jk)))51 pot_astro(ji,jj)=pot_astro(ji,jj) + (amp_pot(ji,jj,jk)*COS(zwt(jk)+phi_pot(ji,jj,jk))) 59 52 enddo 60 53 enddo -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SOL/solmat.F90
r3609 r6736 284 284 285 285 IF( nn_solv == 2 .AND. MAX( jpr2di, jpr2dj ) > 0) THEN 286 CALL lbc_lnk_e( gcp (:,:,1), c_solver_pt, 1. , jpr2di, jpr2dj) ! lateral boundary conditions287 CALL lbc_lnk_e( gcp (:,:,2), c_solver_pt, 1. , jpr2di, jpr2dj) ! lateral boundary conditions288 CALL lbc_lnk_e( gcp (:,:,3), c_solver_pt, 1. , jpr2di, jpr2dj) ! lateral boundary conditions289 CALL lbc_lnk_e( gcp (:,:,4), c_solver_pt, 1. , jpr2di, jpr2dj) ! lateral boundary conditions290 CALL lbc_lnk_e( gcdprc(:,:) , c_solver_pt, 1. , jpr2di, jpr2dj) ! lateral boundary conditions291 CALL lbc_lnk_e( gcdmat(:,:) , c_solver_pt, 1. , jpr2di, jpr2dj) ! lateral boundary conditions286 CALL lbc_lnk_e( gcp (:,:,1), c_solver_pt, 1. ) ! lateral boundary conditions 287 CALL lbc_lnk_e( gcp (:,:,2), c_solver_pt, 1. ) ! lateral boundary conditions 288 CALL lbc_lnk_e( gcp (:,:,3), c_solver_pt, 1. ) ! lateral boundary conditions 289 CALL lbc_lnk_e( gcp (:,:,4), c_solver_pt, 1. ) ! lateral boundary conditions 290 CALL lbc_lnk_e( gcdprc(:,:) , c_solver_pt, 1. ) ! lateral boundary conditions 291 CALL lbc_lnk_e( gcdmat(:,:) , c_solver_pt, 1. ) ! lateral boundary conditions 292 292 IF( npolj /= 0 ) CALL sol_exd( gcp , c_solver_pt ) ! switch northernelements 293 293 END IF -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SOL/solsor.F90
r3609 r6736 81 81 ! ! ============== 82 82 83 IF( MOD(icount,ijpr2d+1) == 0 ) CALL lbc_lnk_e( gcx, c_solver_pt, 1. , jpr2di, jpr2dj) ! lateral boundary conditions83 IF( MOD(icount,ijpr2d+1) == 0 ) CALL lbc_lnk_e( gcx, c_solver_pt, 1. ) ! lateral boundary conditions 84 84 85 85 ! Residus … … 104 104 icount = icount + 1 105 105 106 IF( MOD(icount,ijpr2d+1) == 0 ) CALL lbc_lnk_e( gcx, c_solver_pt, 1. , jpr2di, jpr2dj) ! lateral boundary conditions106 IF( MOD(icount,ijpr2d+1) == 0 ) CALL lbc_lnk_e( gcx, c_solver_pt, 1. ) ! lateral boundary conditions 107 107 108 108 ! Guess red update … … 167 167 ! Output in gcx 168 168 ! ------------- 169 CALL lbc_lnk_e( gcx, c_solver_pt, 1. _wp, jpr2di, jpr2dj) ! boundary conditions169 CALL lbc_lnk_e( gcx, c_solver_pt, 1. ) ! boundary conditions 170 170 ! 171 171 CALL wrk_dealloc( jpi, jpj, ztab ) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90
r3625 r6736 121 121 REAL(wp) :: zd , zc , zaw, za ! - - 122 122 REAL(wp) :: zb1, za1, zkw, zk0 ! - - 123 REAL(wp) :: zrau0r ! - - 123 124 REAL(wp), POINTER, DIMENSION(:,:,:) :: zws 124 125 !!---------------------------------------------------------------------- … … 132 133 ! 133 134 CASE( 0 ) !== Jackett and McDougall (1994) formulation ==! 135 zrau0r = 1.e0 / rau0 134 136 !CDIR NOVERRCHK 135 137 zws(:,:,:) = SQRT( ABS( pts(:,:,:,jp_sal) ) ) … … 172 174 ! masked in situ density anomaly 173 175 prd(ji,jj,jk) = ( zrhop / ( 1.0_wp - zh / ( zk0 - zh * ( za - zh * zb ) ) ) & 174 & - rau0 ) * r1_rau0* tmask(ji,jj,jk)176 & - rau0 ) * zrau0r * tmask(ji,jj,jk) 175 177 END DO 176 178 END DO … … 252 254 INTEGER :: ji, jj, jk ! dummy loop indices 253 255 REAL(wp) :: zt, zs, zh, zsr, zr1, zr2, zr3, zr4, zrhop, ze, zbw ! local scalars 254 REAL(wp) :: zb, zd, zc, zaw, za, zb1, za1, zkw, zk0 256 REAL(wp) :: zb, zd, zc, zaw, za, zb1, za1, zkw, zk0, zrau0r ! - - 255 257 REAL(wp), POINTER, DIMENSION(:,:,:) :: zws 256 258 !!---------------------------------------------------------------------- … … 263 265 ! 264 266 CASE( 0 ) !== Jackett and McDougall (1994) formulation ==! 267 zrau0r = 1.e0 / rau0 265 268 !CDIR NOVERRCHK 266 269 zws(:,:,:) = SQRT( ABS( pts(:,:,:,jp_sal) ) ) … … 306 309 ! masked in situ density anomaly 307 310 prd(ji,jj,jk) = ( zrhop / ( 1.0_wp - zh / ( zk0 - zh * ( za - zh * zb ) ) ) & 308 & - rau0 ) * r1_rau0* tmask(ji,jj,jk)311 & - rau0 ) * zrau0r * tmask(ji,jj,jk) 309 312 END DO 310 313 END DO -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv.F90
r3718 r6736 44 44 LOGICAL :: ln_traadv_ubs = .FALSE. ! UBS scheme flag 45 45 LOGICAL :: ln_traadv_qck = .FALSE. ! QUICKEST scheme flag 46 LOGICAL :: ln_traadv_msc_ups= .FALSE. ! use upstream scheme within muscl47 48 46 49 47 INTEGER :: nadv ! choice of the type of advection scheme … … 106 104 CASE ( 1 ) ; CALL tra_adv_cen2 ( kt, nit000, 'TRA', zun, zvn, zwn, tsb, tsn, tsa, jpts ) ! 2nd order centered 107 105 CASE ( 2 ) ; CALL tra_adv_tvd ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb, tsn, tsa, jpts ) ! TVD 108 CASE ( 3 ) ; CALL tra_adv_muscl ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb, tsa, jpts , ln_traadv_msc_ups) ! MUSCL106 CASE ( 3 ) ; CALL tra_adv_muscl ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb, tsa, jpts ) ! MUSCL 109 107 CASE ( 4 ) ; CALL tra_adv_muscl2( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb, tsn, tsa, jpts ) ! MUSCL2 110 108 CASE ( 5 ) ; CALL tra_adv_ubs ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb, tsn, tsa, jpts ) ! UBS … … 118 116 CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv1 - Ta: ', mask1=tmask, & 119 117 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 120 CALL tra_adv_muscl ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb, tsa, jpts , ln_traadv_msc_ups)118 CALL tra_adv_muscl ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb, tsa, jpts ) 121 119 CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv3 - Ta: ', mask1=tmask, & 122 120 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) … … 154 152 NAMELIST/namtra_adv/ ln_traadv_cen2 , ln_traadv_tvd, & 155 153 & ln_traadv_muscl, ln_traadv_muscl2, & 156 & ln_traadv_ubs , ln_traadv_qck, & 157 & ln_traadv_msc_ups 154 & ln_traadv_ubs , ln_traadv_qck 158 155 !!---------------------------------------------------------------------- 159 156 … … 166 163 WRITE(numout,*) '~~~~~~~~~~~' 167 164 WRITE(numout,*) ' Namelist namtra_adv : chose a advection scheme for tracers' 168 WRITE(numout,*) ' 2nd order advection scheme ln_traadv_cen2 = ', ln_traadv_cen2 169 WRITE(numout,*) ' TVD advection scheme ln_traadv_tvd = ', ln_traadv_tvd 170 WRITE(numout,*) ' MUSCL advection scheme ln_traadv_muscl = ', ln_traadv_muscl 171 WRITE(numout,*) ' MUSCL2 advection scheme ln_traadv_muscl2 = ', ln_traadv_muscl2 172 WRITE(numout,*) ' UBS advection scheme ln_traadv_ubs = ', ln_traadv_ubs 173 WRITE(numout,*) ' QUICKEST advection scheme ln_traadv_qck = ', ln_traadv_qck 174 WRITE(numout,*) ' upstream scheme within muscl ln_traadv_msc_ups = ', ln_traadv_msc_ups 165 WRITE(numout,*) ' 2nd order advection scheme ln_traadv_cen2 = ', ln_traadv_cen2 166 WRITE(numout,*) ' TVD advection scheme ln_traadv_tvd = ', ln_traadv_tvd 167 WRITE(numout,*) ' MUSCL advection scheme ln_traadv_muscl = ', ln_traadv_muscl 168 WRITE(numout,*) ' MUSCL2 advection scheme ln_traadv_muscl2 = ', ln_traadv_muscl2 169 WRITE(numout,*) ' UBS advection scheme ln_traadv_ubs = ', ln_traadv_ubs 170 WRITE(numout,*) ' QUICKEST advection scheme ln_traadv_qck = ', ln_traadv_qck 175 171 ENDIF 176 172 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_cen2.F90
r3718 r6736 29 29 USE diaptr ! poleward transport diagnostics 30 30 USE zdf_oce ! ocean vertical physics 31 USE restart ! ocean restart 31 32 USE trc_oce ! share passive tracers/Ocean variables 32 33 USE lib_mpp ! MPP library … … 144 145 IF(lwp) WRITE(numout,*) 145 146 ! 146 IF ( .NOT. ALLOCATED( upsmsk ) )THEN147 IF (.not. ALLOCATED(upsmsk))THEN 147 148 ALLOCATE( upsmsk(jpi,jpj), STAT=ierr ) 148 149 IF( ierr /= 0 ) CALL ctl_stop('STOP', 'tra_adv_cen2: unable to allocate array') -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_muscl.F90
r3718 r6736 8 8 !! NEMO 1.0 ! 2002-06 (G. Madec) F90: Free form and module 9 9 !! 3.2 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA + switch from velocity to transport 10 !! 3.4 ! 2012-06 (P. Oddo, M. Vichi) include the upstream where needed11 10 !!---------------------------------------------------------------------- 12 11 … … 15 14 !! and vertical advection trends using MUSCL scheme 16 15 !!---------------------------------------------------------------------- 17 USE oce ! ocean dynamics and active tracers 18 USE dom_oce ! ocean space and time domain 19 USE trdmod_oce ! tracers trends 20 USE trdtra ! tracers trends 21 USE in_out_manager ! I/O manager 22 USE dynspg_oce ! choice/control of key cpp for surface pressure gradient 23 USE trabbl ! tracers: bottom boundary layer 24 USE lib_mpp ! distribued memory computing 25 USE lbclnk ! ocean lateral boundary condition (or mpp link) 26 USE diaptr ! poleward transport diagnostics 27 USE trc_oce ! share passive tracers/Ocean variables 28 USE wrk_nemo ! Memory Allocation 29 USE timing ! Timing 30 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 31 USE eosbn2 ! equation of state 32 USE sbcrnf ! river runoffs 16 USE oce ! ocean dynamics and active tracers 17 USE dom_oce ! ocean space and time domain 18 USE trdmod_oce ! tracers trends 19 USE trdtra ! tracers trends 20 USE in_out_manager ! I/O manager 21 USE dynspg_oce ! choice/control of key cpp for surface pressure gradient 22 USE trabbl ! tracers: bottom boundary layer 23 USE lib_mpp ! distribued memory computing 24 USE lbclnk ! ocean lateral boundary condition (or mpp link) 25 USE diaptr ! poleward transport diagnostics 26 USE trc_oce ! share passive tracers/Ocean variables 27 USE wrk_nemo ! Memory Allocation 28 USE timing ! Timing 29 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 33 30 34 31 IMPLICIT NONE … … 37 34 PUBLIC tra_adv_muscl ! routine called by step.F90 38 35 39 LOGICAL :: l_trd ! flag to compute trends 40 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: upsmsk !: mixed upstream/centered scheme near some straits 41 ! ! and in closed seas (orca 2 and 4 configurations) 42 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xind !: mixed upstream/centered index 36 LOGICAL :: l_trd ! flag to compute trends 37 43 38 !! * Substitutions 44 39 # include "domzgr_substitute.h90" … … 52 47 53 48 SUBROUTINE tra_adv_muscl( kt, kit000, cdtype, p2dt, pun, pvn, pwn, & 54 & ptb, pta, kjpt , ld_msc_ups)49 & ptb, pta, kjpt ) 55 50 !!---------------------------------------------------------------------- 56 51 !! *** ROUTINE tra_adv_muscl *** … … 74 69 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 75 70 INTEGER , INTENT(in ) :: kjpt ! number of tracers 76 LOGICAL , INTENT(in ) :: ld_msc_ups ! use upstream scheme within muscl77 71 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 78 72 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 79 73 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before tracer field 80 74 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 81 82 75 ! 83 76 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 86 79 REAL(wp) :: ztra, zbtr, zdt, zalpha ! - - 87 80 REAL(wp), POINTER, DIMENSION(:,:,:) :: zslpx, zslpy 88 INTEGER :: ierr89 81 !!---------------------------------------------------------------------- 90 82 ! … … 97 89 IF(lwp) WRITE(numout,*) 98 90 IF(lwp) WRITE(numout,*) 'tra_adv : MUSCL advection scheme on ', cdtype 99 IF(lwp) WRITE(numout,*) ' : mixed up-stream ', ld_msc_ups100 91 IF(lwp) WRITE(numout,*) '~~~~~~~' 101 IF(lwp) WRITE(numout,*)102 !103 !104 IF( ld_msc_ups ) THEN105 IF( .NOT. ALLOCATED( upsmsk ) ) THEN106 ALLOCATE( upsmsk(jpi,jpj), STAT=ierr )107 IF( ierr /= 0 ) CALL ctl_stop('STOP', 'tra_adv_muscl: unable to allocate upsmsk array')108 ENDIF109 upsmsk(:,:) = 0._wp ! not upstream by default110 ENDIF111 112 IF( .NOT. ALLOCATED( xind ) ) THEN113 ALLOCATE( xind(jpi,jpj,jpk), STAT=ierr )114 IF( ierr /= 0 ) CALL ctl_stop('STOP', 'tra_adv_muscl: unable to allocate zind array')115 ENDIF116 !117 92 ! 118 93 l_trd = .FALSE. 119 94 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 120 121 ! 122 ! Upstream / centered scheme indicator 123 ! ------------------------------------ 124 xind(:,:,:) = 1._wp ! set equal to 1 where up-stream is not needed 125 ! 126 IF( ld_msc_ups ) THEN 127 DO jk = 1, jpk 128 DO jj = 1, jpj 129 DO ji = 1, jpi 130 xind(ji,jj,jk) = 1 - MAX ( & 131 rnfmsk(ji,jj) * rnfmsk_z(jk), & ! near runoff mouths (& closed sea outflows) 132 upsmsk(ji,jj) ) * tmask(ji,jj,jk) ! some of some straits 133 END DO 134 END DO 135 END DO 136 ENDIF 137 ! 138 ENDIF 95 ENDIF 96 139 97 ! ! =========== 140 98 DO jn = 1, kjpt ! tracer loop … … 191 149 zalpha = 0.5 - z0u 192 150 zu = z0u - 0.5 * pun(ji,jj,jk) * zdt / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 193 zzwx = ptb(ji+1,jj,jk,jn) + xind(ji,jj,jk) * (zu * zslpx(ji+1,jj,jk))194 zzwy = ptb(ji ,jj,jk,jn) + xind(ji,jj,jk) * (zu * zslpx(ji ,jj,jk))151 zzwx = ptb(ji+1,jj,jk,jn) + zu * zslpx(ji+1,jj,jk) 152 zzwy = ptb(ji ,jj,jk,jn) + zu * zslpx(ji ,jj,jk) 195 153 zwx(ji,jj,jk) = pun(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 196 154 ! … … 198 156 zalpha = 0.5 - z0v 199 157 zv = z0v - 0.5 * pvn(ji,jj,jk) * zdt / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 200 zzwx = ptb(ji,jj+1,jk,jn) + xind(ji,jj,jk) * (zv * zslpy(ji,jj+1,jk))201 zzwy = ptb(ji,jj ,jk,jn) + xind(ji,jj,jk) * (zv * zslpy(ji,jj ,jk))158 zzwx = ptb(ji,jj+1,jk,jn) + zv * zslpy(ji,jj+1,jk) 159 zzwy = ptb(ji,jj ,jk,jn) + zv * zslpy(ji,jj ,jk) 202 160 zwy(ji,jj,jk) = pvn(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 203 161 END DO … … 273 231 zalpha = 0.5 + z0w 274 232 zw = z0w - 0.5 * pwn(ji,jj,jk+1) * zdt * zbtr 275 zzwx = ptb(ji,jj,jk+1,jn) + xind(ji,jj,jk) * (zw * zslpx(ji,jj,jk+1))276 zzwy = ptb(ji,jj,jk ,jn) + xind(ji,jj,jk) * (zw * zslpx(ji,jj,jk ))233 zzwx = ptb(ji,jj,jk+1,jn) + zw * zslpx(ji,jj,jk+1) 234 zzwy = ptb(ji,jj,jk ,jn) + zw * zslpx(ji,jj,jk ) 277 235 zwx(ji,jj,jk+1) = pwn(ji,jj,jk+1) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 278 236 END DO -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_muscl2.F90
r3625 r6736 25 25 USE wrk_nemo ! Memory Allocation 26 26 USE timing ! Timing 27 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 27 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 28 28 29 29 30 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_qck.F90
r3625 r6736 28 28 USE wrk_nemo ! Memory Allocation 29 29 USE timing ! Timing 30 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 30 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 31 31 32 32 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_tvd.F90
r3625 r6736 14 14 !! - ! 2009-11 (V. Garnier) Surface pressure gradient organization 15 15 !! 3.3 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA + switch from velocity to transport 16 !! 3.4.1! 2013-05 (H. Liu) add vertical PPM option (vppm) 16 17 !!---------------------------------------------------------------------- 17 18 18 19 !!---------------------------------------------------------------------- 19 !! tra_adv_tvd : update the tracer trend with the 3D advection trends using a TVD scheme 20 !! nonosc : compute monotonic tracer fluxes by a non-oscillatory algorithm 20 !! tra_adv_tvd : update the tracer trend with the horizontal 21 !! and vertical advection trends using a TVD scheme 22 !! nonosc : compute monotonic tracer fluxes by a nonoscillatory 23 !! algorithm 21 24 !!---------------------------------------------------------------------- 22 USE oce ! ocean dynamics and active tracers 23 USE dom_oce ! ocean space and time domain 24 USE trdmod_oce ! tracers trends 25 USE trdtra ! tracers trends 26 USE in_out_manager ! I/O manager 27 USE dynspg_oce ! choice/control of key cpp for surface pressure gradient 28 USE lib_mpp ! MPP library 29 USE lbclnk ! ocean lateral boundary condition (or mpp link) 30 USE diaptr ! poleward transport diagnostics 31 USE trc_oce ! share passive tracers/Ocean variables 32 USE wrk_nemo ! Memory Allocation 33 USE timing ! Timing 34 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 25 USE oce ! ocean dynamics and active tracers 26 USE dom_oce ! ocean space and time domain 27 USE trdmod_oce ! tracers trends 28 USE trdtra ! tracers trends 29 USE in_out_manager ! I/O manager 30 USE dynspg_oce ! choice/control of key cpp for surface pressure gradient 31 USE lib_mpp ! MPP library 32 USE lbclnk ! ocean lateral boundary condition (or mpp link) 33 USE diaptr ! poleward transport diagnostics 34 USE trc_oce ! share passive tracers/Ocean variables 35 USE wrk_nemo ! Memory Allocation 36 USE timing ! Timing 37 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 38 39 #if defined key_vppm 40 USE traadv_vppm ! vertical ppm scheme 41 !N.B. naac = 1 will not work here 42 #endif 35 43 36 44 IMPLICIT NONE … … 83 91 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwi, zwz 84 92 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdx, ztrdy, ztrdz 93 #if defined key_vppm 94 REAL(wp), POINTER, DIMENSION(:,:,:) :: hflux 95 #endif 85 96 !!---------------------------------------------------------------------- 86 97 ! … … 88 99 ! 89 100 CALL wrk_alloc( jpi, jpj, jpk, zwi, zwz ) 101 #if defined key_vppm 102 CALL wrk_alloc( jpi, jpj, jpk, hflux ) 103 #endif 90 104 ! 91 105 IF( kt == kit000 ) THEN 92 106 IF(lwp) WRITE(numout,*) 107 #if defined key_vppm 108 IF(lwp) WRITE(numout,*) 'tra_adv_tvd : TVD_vPPM advection scheme on ', cdtype 109 #else 93 110 IF(lwp) WRITE(numout,*) 'tra_adv_tvd : TVD advection scheme on ', cdtype 111 #endif 94 112 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 95 113 ! … … 152 170 DO ji = fs_2, fs_jpim1 ! vector opt. 153 171 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 172 #if defined key_vppm 173 hflux(ji,jj,jk) = - (zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 174 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk )) 175 176 ztra = zbtr * ( hflux(ji,jj,jk) - ( zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) ) 177 178 hflux(ji,jj,jk) = hflux(ji,jj,jk) * tmask(ji,jj,jk) 179 #else 154 180 ! total intermediate advective trends 155 181 ztra = - zbtr * ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 156 182 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 157 183 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) 184 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 185 #endif 186 158 187 ! update and guess with monotonic sheme 159 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra160 188 zwi(ji,jj,jk) = ( ptb(ji,jj,jk,jn) + z2dtt * ztra ) * tmask(ji,jj,jk) 161 189 END DO … … 164 192 ! ! Lateral boundary conditions on zwi (unchanged sign) 165 193 CALL lbc_lnk( zwi, 'T', 1. ) 194 !#if defined key_vppm 195 ! CALL lbc_lnk( hflux, 'T', 1. ) ! this call seems unnecessary, H.Liu 196 !#endif 166 197 167 198 ! ! trend diagnostics (contribution of upstream fluxes) … … 212 243 DO ji = fs_2, fs_jpim1 ! vector opt. 213 244 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 245 #if defined key_vppm 246 ztra = zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) + & 247 & zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) 248 hflux(ji,jj,jk) = hflux(ji,jj,jk) - ztra * tmask(ji,jj,jk) 249 #else 214 250 ! total advective trends 215 251 ztra = - zbtr * ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & … … 217 253 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) 218 254 ! add them to the general tracer trends 219 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 220 END DO 221 END DO 222 END DO 255 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 256 #endif 257 END DO 258 END DO 259 END DO 260 #if defined key_vppm 261 !CALL lbc_lnk( hflux, 'T', 1. ) ! This call seems unnecessary. H.Liu 262 CALL tra_adv_vppm(pta(:,:,:,jn), ptb(:,:,:,jn), hflux, z2dtt) ! pta has been updated during this call 263 #endif 264 223 265 224 266 ! ! trend diagnostics (contribution of upstream fluxes) … … 241 283 ! 242 284 CALL wrk_dealloc( jpi, jpj, jpk, zwi, zwz ) 285 #if defined key_vppm 286 CALL wrk_dealloc( jpi, jpj, jpk, hflux ) 287 #endif 243 288 IF( l_trd ) CALL wrk_dealloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) 244 289 ! -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_ubs.F90
r3787 r6736 12 12 !! advection trends using a third order biaised scheme 13 13 !!---------------------------------------------------------------------- 14 USE oce ! ocean dynamics and active tracers15 USE dom_oce ! ocean space and time domain16 USE trdmod_oce ! ocean space and time domain14 USE oce ! ocean dynamics and active tracers 15 USE dom_oce ! ocean space and time domain 16 USE trdmod_oce ! ocean space and time domain 17 17 USE trdtra 18 18 USE lib_mpp 19 USE lbclnk ! ocean lateral boundary condition (or mpp link)20 USE in_out_manager ! I/O manager21 USE diaptr ! poleward transport diagnostics22 USE dynspg_oce ! choice/control of key cpp for surface pressure gradient23 USE trc_oce ! share passive tracers/Ocean variables24 USE wrk_nemo ! Memory Allocation25 USE timing ! Timing26 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)19 USE lbclnk ! ocean lateral boundary condition (or mpp link) 20 USE in_out_manager ! I/O manager 21 USE diaptr ! poleward transport diagnostics 22 USE dynspg_oce ! choice/control of key cpp for surface pressure gradient 23 USE trc_oce ! share passive tracers/Ocean variables 24 USE wrk_nemo ! Memory Allocation 25 USE timing ! Timing 26 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 27 27 28 28 IMPLICIT NONE … … 51 51 !! and add it to the general trend of passive tracer equations. 52 52 !! 53 !! ** Method : The upstream biased 3rd order scheme (UBS) is based on an 53 !! ** Method : The upstream biased 3rd order scheme (UBS) is based on an 54 54 !! upstream-biased parabolic interpolation (Shchepetkin and McWilliams 2005) 55 55 !! It is only used in the horizontal direction. … … 199 199 200 200 ! Surface value 201 IF( lk_vvl ) THEN ; ztw(:,:,1) = 0.e0 ! variable volume : flux set to zero202 ELSE ; ztw(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn) ! free constant surface201 IF( lk_vvl ) THEN ; ztw(:,:,1) = 0.e0 ! variable volume : flux set to zero 202 ELSE ; ztw(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn) ! constant volume : non zero flux though z=0 203 203 ENDIF 204 204 ! upstream advection with initial mass fluxes & intermediate update -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/trabbc.F90
r3625 r6736 155 155 CASE ( 1 ) !* constant flux 156 156 IF(lwp) WRITE(numout,*) ' *** constant heat flux = ', rn_geoflx_cst 157 qgh_trd0(:,:) = r 1_rau0_rcp* rn_geoflx_cst157 qgh_trd0(:,:) = ro0cpr * rn_geoflx_cst 158 158 ! 159 159 CASE ( 2 ) !* variable geothermal heat flux : read the geothermal fluxes in mW/m2 … … 162 162 CALL iom_get ( inum, jpdom_data, 'heatflow', qgh_trd0 ) 163 163 CALL iom_close( inum ) 164 qgh_trd0(:,:) = r 1_rau0_rcp* qgh_trd0(:,:) * 1.e-3 ! conversion in W/m2164 qgh_trd0(:,:) = ro0cpr * qgh_trd0(:,:) * 1.e-3 ! conversion in W/m2 165 165 ! 166 166 CASE DEFAULT -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_iso.F90
r3805 r6736 221 221 z2d(:,:) = 0._wp 222 222 ! note sign is reversed to give down-gradient diffusive transports (#1043) 223 zztmp = -1.0_wp * rau0 * rcp 223 zztmp = -1.0_wp * rau0 * rcp 224 224 DO jk = 1, jpkm1 225 225 DO jj = 2, jpjm1 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traqsr.F90
r3680 r6736 27 27 USE iom ! I/O manager 28 28 USE fldread ! read input fields 29 USE restart ! ocean restart 29 30 USE lib_mpp ! MPP library 30 31 USE wrk_nemo ! Memory Allocation … … 129 130 IF(lwp) WRITE(numout,*) ' nit000-1 qsr tracer content forcing field red in the restart file' 130 131 zfact = 0.5e0 132 qsr_hc(:,:,:) = 0._wp 133 ! qsr_hc_b(:,:,:) = 0.e0 ! don't think this is needed 131 134 CALL iom_get( numror, jpdom_autoglo, 'qsr_hc_b', qsr_hc_b ) ! before heat content trend due to Qsr flux 132 135 ELSE ! No restart or restart not found: Euler forward time stepping 133 136 zfact = 1.e0 137 qsr_hc(:,:,:) = 0.e0 134 138 qsr_hc_b(:,:,:) = 0.e0 135 139 ENDIF … … 146 150 ! ! ============================================== ! 147 151 DO jk = 1, jpkm1 148 qsr_hc(:,:,jk) = r 1_rau0_rcp* ( etot3(:,:,jk) - etot3(:,:,jk+1) )152 qsr_hc(:,:,jk) = ro0cpr * ( etot3(:,:,jk) - etot3(:,:,jk+1) ) 149 153 END DO 150 154 ! Add to the general trend … … 218 222 ! 219 223 DO jk = 1, nksr ! compute and add qsr trend to ta 220 qsr_hc(:,:,jk) = r 1_rau0_rcp* ( zea(:,:,jk) - zea(:,:,jk+1) )221 END DO 222 zea(:,:,nksr+1:jpk) = 0. e0! below 400m set to zero224 qsr_hc(:,:,jk) = ro0cpr * ( zea(:,:,jk) - zea(:,:,jk+1) ) 225 END DO 226 zea(:,:,nksr+1:jpk) = 0._wp ! below 400m set to zero 223 227 CALL iom_put( 'qsr3d', zea ) ! Shortwave Radiation 3D distribution 224 228 ! … … 235 239 ! 236 240 IF( lk_vvl ) THEN !* variable volume 237 zz0 = rn_abs * r 1_rau0_rcp238 zz1 = ( 1. - rn_abs ) * r 1_rau0_rcp241 zz0 = rn_abs * ro0cpr 242 zz1 = ( 1. - rn_abs ) * ro0cpr 239 243 DO jk = 1, nksr ! solar heat absorbed at T-point in the top 400m 240 244 DO jj = 1, jpj … … 246 250 END DO 247 251 END DO 252 ! qsr_hc(:,:,nksr+1:jpk) = 0._wp ! below nksr set to zero 248 253 ELSE !* constant volume: coef. computed one for all 249 254 DO jk = 1, nksr … … 462 467 ! 463 468 DO jk = 1, nksr 464 etot3(:,:,jk) = r 1_rau0_rcp* ( zea(:,:,jk) - zea(:,:,jk+1) )469 etot3(:,:,jk) = ro0cpr * ( zea(:,:,jk) - zea(:,:,jk+1) ) 465 470 END DO 466 etot3(:,:,nksr+1:jpk) = 0. e0! below 400m set to zero471 etot3(:,:,nksr+1:jpk) = 0._wp ! below 400m set to zero 467 472 ENDIF 468 473 ENDIF … … 483 488 IF(lwp) WRITE(numout,*) ' key_vvl: light distribution will be computed at each time step' 484 489 ELSE ! constant volume: computes one for all 485 zz0 = rn_abs * r 1_rau0_rcp486 zz1 = ( 1. - rn_abs ) * r 1_rau0_rcp490 zz0 = rn_abs * ro0cpr 491 zz1 = ( 1. - rn_abs ) * ro0cpr 487 492 DO jk = 1, nksr !* solar heat absorbed at T-point computed once for all 488 493 DO jj = 1, jpj ! top 400 meters … … 494 499 END DO 495 500 END DO 496 etot3(:,:,nksr+1:jpk) = 0. e0! below 400m set to zero501 etot3(:,:,nksr+1:jpk) = 0._wp ! below 400m set to zero 497 502 ! 498 503 ENDIF -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/trasbc.F90
r3764 r6736 23 23 USE in_out_manager ! I/O manager 24 24 USE prtctl ! Print control 25 USE restart ! ocean restart 25 26 USE sbcrnf ! River runoff 26 27 USE sbcmod ! ln_rnf … … 59 60 !! at the surface by evaporation, precipitations and runoff (E-P-R); 60 61 !! (3) Fwe, tracer carried with the water that is exchanged. 61 !! - salinity : salt flux only due to freezing/melting62 !! sa = sa + sfx / rau0 / e3t for k=163 62 !! 64 63 !! Fext, flux through the air-sea interface for temperature and salt: … … 85 84 !! (Tp P - Te E) + SST (P-E) = 0 when Tp=Te=SST 86 85 !! - salinity : evaporation, precipitation and runoff 87 !! water has a zero salinity but there is a salt flux due to 88 !! freezing/melting, thus: 89 !! sa = sa + emp * sn / rau0 / e3t for k=1 90 !! + sfx / rau0 / e3t 86 !! water has a zero salinity (Fwe=0), thus only Fwi remains: 87 !! sa = sa + emp * sn / e3t for k=1 91 88 !! where emp, the surface freshwater budget (evaporation minus 92 89 !! precipitation minus runoff) given in kg/m2/s is divided 93 !! by rau0 = 1020 kg/m3 (density of sea water) to obtain m/s.90 !! by 1035 kg/m3 (density of ocena water) to obtain m/s. 94 91 !! Note: even though Fwe does not appear explicitly for 95 92 !! temperature in this routine, the heat carried by the water … … 112 109 !! 113 110 INTEGER :: ji, jj, jk, jn ! dummy loop indices 114 REAL(wp) :: zfact, z1_e3t, z dep111 REAL(wp) :: zfact, z1_e3t, zsrau, zdep 115 112 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdt, ztrds 116 113 !!---------------------------------------------------------------------- … … 123 120 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 124 121 ENDIF 122 123 zsrau = 1. / rau0 ! initialization 125 124 126 125 IF( l_trdtra ) THEN !* Save ta and sa trends … … 164 163 ! evaporation, precipitation and qns, but not river runoff 165 164 166 IF( lk_vvl ) THEN ! Variable Volume case ==>> heat content of mass flux is in qns165 IF( lk_vvl ) THEN ! Variable Volume case 167 166 DO jj = 1, jpj 168 167 DO ji = 1, jpi 169 sbc_tsc(ji,jj,jp_tem) = r1_rau0_rcp * qns(ji,jj) ! non solar heat flux 170 sbc_tsc(ji,jj,jp_sal) = r1_rau0 * sfx(ji,jj) ! salt flux due to freezing/melting 168 ! temperature : heat flux + cooling/heating effet of EMP flux 169 sbc_tsc(ji,jj,jp_tem) = ro0cpr * qns(ji,jj) - zsrau * emp(ji,jj) * tsn(ji,jj,1,jp_tem) 170 ! concent./dilut. effect due to sea-ice melt/formation and (possibly) SSS restoration 171 sbc_tsc(ji,jj,jp_sal) = ( emps(ji,jj) - emp(ji,jj) ) * zsrau * tsn(ji,jj,1,jp_sal) 171 172 END DO 172 173 END DO 173 ELSE ! Constant Volume case ==>> Concentration dilution effect174 ELSE ! Constant Volume case 174 175 DO jj = 2, jpj 175 176 DO ji = fs_2, fs_jpim1 ! vector opt. 176 177 ! temperature : heat flux 177 sbc_tsc(ji,jj,jp_tem) = r1_rau0_rcp * qns(ji,jj) & ! non solar heat flux 178 & + r1_rau0 * emp(ji,jj) * tsn(ji,jj,1,jp_tem) ! concent./dilut. effect 179 ! salinity : salt flux + concent./dilut. effect (both in sfx) 180 sbc_tsc(ji,jj,jp_sal) = r1_rau0 * ( sfx(ji,jj) & ! salt flux (freezing/melting) 181 & + emp(ji,jj) * tsn(ji,jj,1,jp_sal) ) ! concent./dilut. effect 178 sbc_tsc(ji,jj,jp_tem) = ro0cpr * qns(ji,jj) 179 ! salinity : salt flux + concent./dilut. effect (both in emps) 180 sbc_tsc(ji,jj,jp_sal) = zsrau * emps(ji,jj) * tsn(ji,jj,1,jp_sal) 182 181 END DO 183 182 END DO 184 CALL iom_put( "emp_x_sst", emp (:,:) * tsn(:,:,1,jp_tem) ) ! c/d term on sst185 CALL iom_put( "emp_x_sss", emp (:,:) * tsn(:,:,1,jp_sal) ) ! c/d term on sss186 183 ENDIF 187 184 ! Concentration dilution effect on (t,s) due to evapouration, precipitation and qns, but not river runoff … … 224 221 END DO 225 222 END DO 226 ENDIF 227 223 ENDIF 224 225 !jdha Running bdy vvl problems if no call to lbc_lnk 226 CALL lbc_lnk( tsa(:,:,:,jp_tem), 'T', 1. ) ; CALL lbc_lnk( tsa(:,:,:,jp_sal), 'T', 1. ) 227 228 228 IF( l_trdtra ) THEN ! save the horizontal diffusive trends for further diagnostics 229 229 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRD/trdmld.F90
r3792 r6736 36 36 USE trdmld_rst ! restart for diagnosing the ML trends 37 37 USE prtctl ! Print control 38 USE restart ! for lrst_oce 38 39 USE lib_mpp ! MPP library 39 40 USE wrk_nemo ! Memory allocation -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRD/trdmld_rst.F90
r3680 r6736 12 12 USE in_out_manager ! I/O manager 13 13 USE iom ! I/O module 14 USE restart ! only for lrst_oce 14 15 15 16 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfbfr.F90
r3820 r6736 26 26 USE timing ! Timing 27 27 28 USE phycst, ONLY: vkarmn29 30 28 IMPLICIT NONE 31 29 PRIVATE … … 34 32 PUBLIC zdf_bfr_init ! called by opa.F90 35 33 34 REAL(wp), PARAMETER :: karman = 0.41_wp ! von Karman constant 36 35 ! !!* Namelist nambfr: bottom friction namelist * 37 INTEGER , PUBLIC :: nn_bfr 38 REAL(wp), PUBLIC :: rn_bfri1 39 REAL(wp), PUBLIC :: rn_bfri2 40 REAL(wp), PUBLIC :: rn_bfeb2 41 REAL(wp), PUBLIC :: rn_bfrien 42 LOGICAL , PUBLIC :: ln_bfr2d = .false. ! logical switch for 2D enhancement (PUBLIC for TAM)43 LOGICAL , PUBLIC :: ln_ loglayer = .false. ! switch for log layer bfr coeff.(PUBLIC for TAM)44 REAL(wp), PUBLIC :: rn_bfrz0 = 0.003_wp ! bottom roughness for loglayer bfr coeff (PUBLIC for TAM)36 INTEGER , PUBLIC :: nn_bfr = 0 ! = 0/1/2/3 type of bottom friction (PUBLIC for TAM) 37 REAL(wp), PUBLIC :: rn_bfri1 = 4.0e-4_wp ! bottom drag coefficient (linear case) (PUBLIC for TAM) 38 REAL(wp), PUBLIC :: rn_bfri2 = 1.0e-3_wp ! bottom drag coefficient (non linear case) (PUBLIC for TAM) 39 REAL(wp), PUBLIC :: rn_bfeb2 = 2.5e-3_wp ! background bottom turbulent kinetic energy [m2/s2] (PUBLIC for TAM) 40 REAL(wp), PUBLIC :: rn_bfrien = 30._wp ! local factor to enhance coefficient bfri (PUBLIC for TAM) 41 REAL(wp), PUBLIC :: rn_bfrz0 = 0.003_wp ! bottom roughness for loglayer bfr coeff 42 LOGICAL , PUBLIC :: ln_bfr2d = .false. ! logical switch for 2D enhancement (PUBLIC for TAM) 43 LOGICAL , PUBLIC :: ln_loglayer = .false. ! switch for log layer bfr coeff. 45 44 LOGICAL , PUBLIC :: ln_bfrimp = .false. ! logical switch for implicit bottom friction 46 45 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), PUBLIC :: bfrcoef2d ! 2D bottom drag coefficient (PUBLIC for TAM) … … 85 84 INTEGER, INTENT( in ) :: kt ! ocean time-step index 86 85 !! 87 INTEGER :: ji, jj 88 INTEGER :: ikbu, ikbv 89 REAL(wp) :: zvu, zuv, zecu, zecv 90 REAL(wp) :: ztmp , ztmp1! temporary scalars86 INTEGER :: ji, jj ! dummy loop indices 87 INTEGER :: ikbu, ikbv ! local integers 88 REAL(wp) :: zvu, zuv, zecu, zecv ! temporary scalars 89 REAL(wp) :: ztmp ! temporary scalars 91 90 !!---------------------------------------------------------------------- 92 91 ! … … 99 98 ! where -F_h/e3U_bot = bfrUa*Ub/e3U_bot {U=[u,v]} 100 99 ! 101 102 100 IF(ln_loglayer) THEN ! "log layer" bottom friction coefficient 103 104 ! add 2D-enhancement bottom friction105 ztmp1 = 1._wp106 IF(ABS(rn_bfri2) >= 1.e-10 ) THEN107 ztmp1 = 1._wp / rn_bfri2108 ELSE109 CALL ctl_stop( 'rn_bfri2 must not be less than 1.e-10')110 END IF111 112 101 # if defined key_vectopt_loop 113 102 DO jj = 1, 1 … … 118 107 # endif 119 108 ztmp = 0.5_wp * fse3t(ji,jj,mbkt(ji,jj)) 120 ztmp = max(ztmp, rn_bfrz0 + 1.e-10) 121 bfrcoef2d(ji,jj) = bfrcoef2d(ji,jj) * ztmp1 * & 122 & ( log( ztmp / rn_bfrz0 ) / vkarmn ) ** (-2) 109 ztmp = max(ztmp, rn_bfrz0) 110 bfrcoef2d(ji,jj) = ( log( ztmp / rn_bfrz0 ) / karman ) ** (-2) 111 # if defined key_limit_bfr 112 bfrcoef2d(ji,jj) = max(bfrcoef2d(ji,jj), rn_bfri2) 113 bfrcoef2d(ji,jj) = min(bfrcoef2d(ji,jj), rn_bfri1) 114 # endif 123 115 END DO 124 116 END DO … … 150 142 END DO 151 143 END DO 152 153 144 ! 154 145 CALL lbc_lnk( bfrua, 'U', 1. ) ; CALL lbc_lnk( bfrva, 'V', 1. ) ! Lateral boundary condition … … 175 166 USE iom ! I/O module for ehanced bottom friction file 176 167 !! 177 INTEGER 178 INTEGER 179 INTEGER 180 INTEGER 181 REAL(wp) ::zminbfr, zmaxbfr ! temporary scalars182 REAL(wp) ::zfru, zfrv ! - -168 INTEGER :: inum ! logical unit for enhanced bottom friction file 169 INTEGER :: ji, jj ! dummy loop indexes 170 INTEGER :: ikbu, ikbv ! temporary integers 171 INTEGER :: ictu, ictv ! - - 172 REAL(wp) :: zminbfr, zmaxbfr ! temporary scalars 173 REAL(wp) :: zfru, zfrv ! - - 183 174 !! 184 175 NAMELIST/nambfr/ nn_bfr, rn_bfri1, rn_bfri2, rn_bfeb2, rn_bfrz0, ln_bfr2d, & … … 247 238 ENDIF 248 239 bfrcoef2d(:,:) = rn_bfri2 ! initialize bfrcoef2d to the namelist variable 249 250 240 ! 251 241 IF(ln_bfr2d) THEN … … 262 252 ! 263 253 END SELECT 264 265 IF( nn_bfr /= 2 .AND. ln_loglayer ) THEN266 IF(lwp) THEN267 WRITE(numout,*)268 WRITE(numout,*) 'Loglayer can only be by applied for quadratic bottom friction'269 WRITE(numout,*) 'but you have set: nn_bfr /= 2 and ln_loglayer=.true.!!!!'270 WRITE(ctmp1,*) 'check nn_bfr and ln_loglayer (should be 2 and true)'271 CALL ctl_stop( ctmp1 )272 END IF273 END IF274 275 276 277 254 IF(lwp) WRITE(numout,*) ' implicit bottom friction switch ln_bfrimp = ', ln_bfrimp 278 255 ! -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90
r3294 r6736 19 19 USE zdf_oce ! ocean vertical physics variables 20 20 USE zdfkpp ! KPP vertical mixing 21 USE zdfgls ! GLS vertical mixing 21 22 USE in_out_manager ! I/O manager 22 23 USE iom ! for iom_put … … 67 68 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 68 69 IF(lwp) WRITE(numout,*) 70 ! 71 IF(lwp .AND. lk_zdfgls ) CALL ctl_warn(' No need zdf_evd with GLS closures ') 72 ! 69 73 ENDIF 70 74 -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90
r3798 r6736 12 12 !! 'key_zdfgls' Generic Length Scale vertical physics 13 13 !!---------------------------------------------------------------------- 14 !! zdf_gls 15 !! zdf_gls_init 16 !! gls_rst 14 !! zdf_gls : update momentum and tracer Kz from a gls scheme 15 !! zdf_gls_init : initialization, namelist read, and parameters control 16 !! gls_rst : read/write gls restart in ocean restart file 17 17 !!---------------------------------------------------------------------- 18 18 USE oce ! ocean dynamics and active tracers … … 23 23 USE phycst ! physical constants 24 24 USE zdfmxl ! mixed layer 25 USE restart ! only for lrst_oce 25 26 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 26 27 USE lib_mpp ! MPP manager … … 30 31 USE iom ! I/O manager library 31 32 USE timing ! Timing 32 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 33 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 33 34 34 35 IMPLICIT NONE … … 180 181 ! 181 182 ! surface friction 182 ustars2(ji,jj) = r 1_rau0* taum(ji,jj) * tmask(ji,jj,1)183 ustars2(ji,jj) = rau0r * taum(ji,jj) * tmask(ji,jj,1) 183 184 ! 184 185 ! bottom friction (explicit before friction) … … 1262 1263 ! ! ------------------- 1263 1264 IF(lwp) WRITE(numout,*) '---- gls-rst ----' 1264 CALL iom_rstput( kt, nitrst, numrow, 'en' , en 1265 CALL iom_rstput( kt, nitrst, numrow, 'en' , en ) 1265 1266 CALL iom_rstput( kt, nitrst, numrow, 'avt' , avt_k ) 1266 1267 CALL iom_rstput( kt, nitrst, numrow, 'avm' , avm_k ) 1267 1268 CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k ) 1268 1269 CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 1269 CALL iom_rstput( kt, nitrst, numrow, 'mxln' , mxln 1270 CALL iom_rstput( kt, nitrst, numrow, 'mxln' , mxln ) 1270 1271 ! 1271 1272 ENDIF -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfini.F90
r3680 r6736 26 26 USE tranpc ! convection: non penetrative adjustment 27 27 USE ldfslp ! iso-neutral slopes 28 USE restart ! ocean restart 28 29 29 30 USE in_out_manager ! I/O manager -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfkpp.F90
r3792 r6736 15 15 !! 'key_zdfkpp' KPP scheme 16 16 !!---------------------------------------------------------------------- 17 !! zdf_kpp 18 !! zdf_kpp_init 19 !! tra_kpp 20 !! trc_kpp 17 !! zdf_kpp : update momentum and tracer Kz from a kpp scheme 18 !! zdf_kpp_init : initialization, namelist read, and parameters control 19 !! tra_kpp : compute and add to the T & S trend the non-local flux 20 !! trc_kpp : compute and add to the passive tracer trend the non-local flux (lk_top=T) 21 21 !!---------------------------------------------------------------------- 22 USE oce ! ocean dynamics and active tracers23 USE dom_oce ! ocean space and time domain24 USE zdf_oce ! ocean vertical physics25 USE sbc_oce ! surface boundary condition: ocean26 USE phycst ! physical constants27 USE eosbn2 ! equation of state28 USE zdfddm ! double diffusion mixing29 USE in_out_manager ! I/O manager30 USE lib_mpp ! MPP library31 USE wrk_nemo ! work arrays32 USE lbclnk ! ocean lateral boundary conditions (or mpp link)33 USE prtctl ! Print control34 USE trdmod_oce ! ocean trends definition35 USE trdtra ! tracers trends36 USE timing ! Timing37 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)22 USE oce ! ocean dynamics and active tracers 23 USE dom_oce ! ocean space and time domain 24 USE zdf_oce ! ocean vertical physics 25 USE sbc_oce ! surface boundary condition: ocean 26 USE phycst ! physical constants 27 USE eosbn2 ! equation of state 28 USE zdfddm ! double diffusion mixing 29 USE in_out_manager ! I/O manager 30 USE lib_mpp ! MPP library 31 USE wrk_nemo ! work arrays 32 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 33 USE prtctl ! Print control 34 USE trdmod_oce ! ocean trends definition 35 USE trdtra ! tracers trends 36 USE timing ! Timing 37 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 38 38 39 39 IMPLICIT NONE … … 423 423 zthermal = rn_alpha / ( rcp * zrhos + epsln ) 424 424 zhalin = rn_beta * tsn(ji,jj,1,jp_sal) * rcs 425 zbeta = rn_beta426 425 ENDIF 427 426 ! Radiative surface buoyancy force 428 427 zBosol(ji,jj) = grav * zthermal * qsr(ji,jj) 429 428 ! Non radiative surface buoyancy force 430 zBo (ji,jj) = grav * zthermal * qns(ji,jj) - grav * zhalin * ( emp(ji,jj)-rnf(ji,jj) ) & 431 & - grav * zbeta * rcs * sfx(ji,jj) 429 zBo (ji,jj) = grav * zthermal * qns(ji,jj) - grav * zhalin * ( emps(ji,jj)-rnf(ji,jj) ) 432 430 ! Surface Temperature flux for non-local term 433 wt0(ji,jj) = - ( qsr(ji,jj) + qns(ji,jj) )* r 1_rau0_rcp* tmask(ji,jj,1)431 wt0(ji,jj) = - ( qsr(ji,jj) + qns(ji,jj) )* ro0cpr * tmask(ji,jj,1) 434 432 ! Surface salinity flux for non-local term 435 ws0(ji,jj) = - ( ( emp(ji,jj)-rnf(ji,jj) ) * tsn(ji,jj,1,jp_sal) & 436 & + sfx(ji,jj) ) * rcs * tmask(ji,jj,1) 433 ws0(ji,jj) = - ( ( emps(ji,jj)-rnf(ji,jj) ) * tsn(ji,jj,1,jp_sal) * rcs ) * tmask(ji,jj,1) 437 434 ENDDO 438 435 ENDDO … … 1328 1325 DO ji = fs_2, fs_jpim1 1329 1326 ! Surface tracer flux for non-local term 1330 zflx = - ( sfx(ji,jj) * tra(ji,jj,1,jn) * rcs ) * tmask(ji,jj,1)1327 zflx = - ( emps(ji,jj) * tra(ji,jj,1,jn) * rcs ) * tmask(ji,jj,1) 1331 1328 ! compute the trend 1332 1329 ztra = - ( ghats(ji,jj,jk ) * fsavs(ji,jj,jk ) & -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfric.F90
r3625 r6736 17 17 !! 'key_zdfric' Kz = f(Ri) 18 18 !!---------------------------------------------------------------------- 19 !! zdf_ric 19 !! zdf_ric : update momentum and tracer Kz from the Richardson 20 20 !! number computation 21 !! zdf_ric_init 22 !!---------------------------------------------------------------------- 23 USE oce ! ocean dynamics and tracers variables24 USE dom_oce ! ocean space and time domain variables25 USE zdf_oce ! ocean vertical physics26 USE in_out_manager ! I/O manager27 USE lbclnk ! ocean lateral boundary condition (or mpp link)28 USE lib_mpp ! MPP library29 USE wrk_nemo ! work arrays30 USE timing ! Timing31 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)21 !! zdf_ric_init : initialization, namelist read, & parameters control 22 !!---------------------------------------------------------------------- 23 USE oce ! ocean dynamics and tracers variables 24 USE dom_oce ! ocean space and time domain variables 25 USE zdf_oce ! ocean vertical physics 26 USE in_out_manager ! I/O manager 27 USE lbclnk ! ocean lateral boundary condition (or mpp link) 28 USE lib_mpp ! MPP library 29 USE wrk_nemo ! work arrays 30 USE timing ! Timing 31 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 32 32 33 33 USE eosbn2, ONLY : nn_eos -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90
r3680 r6736 31 31 !! 'key_zdftke' TKE vertical physics 32 32 !!---------------------------------------------------------------------- 33 !! zdf_tke 34 !! tke_tke 35 !! tke_avn 36 !! zdf_tke_init 37 !! tke_rst 33 !! zdf_tke : update momentum and tracer Kz from a tke scheme 34 !! tke_tke : tke time stepping: update tke at now time step (en) 35 !! tke_avn : compute mixing length scale and deduce avm and avt 36 !! zdf_tke_init : initialization, namelist read, and parameters control 37 !! tke_rst : read/write tke restart in ocean restart file 38 38 !!---------------------------------------------------------------------- 39 39 USE oce ! ocean: dynamics and active tracers variables … … 44 44 USE zdf_oce ! vertical physics: ocean variables 45 45 USE zdfmxl ! vertical physics: mixed layer 46 USE restart ! ocean restart 46 47 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 47 48 USE prtctl ! Print control … … 51 52 USE wrk_nemo ! work arrays 52 53 USE timing ! Timing 53 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 54 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 54 55 55 56 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftmx.F90
r3625 r6736 12 12 !! 'key_zdftmx' Tidal vertical mixing 13 13 !!---------------------------------------------------------------------- 14 !! zdf_tmx 15 !! tmx_itf 16 !!---------------------------------------------------------------------- 17 USE oce ! ocean dynamics and tracers variables18 USE dom_oce ! ocean space and time domain variables19 USE zdf_oce ! ocean vertical physics variables20 USE lbclnk ! ocean lateral boundary conditions (or mpp link)21 USE eosbn2 ! ocean equation of state22 USE phycst ! physical constants23 USE prtctl ! Print control24 USE in_out_manager ! I/O manager25 USE iom ! I/O Manager26 USE lib_mpp ! MPP library27 USE wrk_nemo ! work arrays28 USE timing ! Timing29 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)14 !! zdf_tmx : global momentum & tracer Kz with tidal induced Kz 15 !! tmx_itf : Indonesian momentum & tracer Kz with tidal induced Kz 16 !!---------------------------------------------------------------------- 17 USE oce ! ocean dynamics and tracers variables 18 USE dom_oce ! ocean space and time domain variables 19 USE zdf_oce ! ocean vertical physics variables 20 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 21 USE eosbn2 ! ocean equation of state 22 USE phycst ! physical constants 23 USE prtctl ! Print control 24 USE in_out_manager ! I/O manager 25 USE iom ! I/O Manager 26 USE lib_mpp ! MPP library 27 USE wrk_nemo ! work arrays 28 USE timing ! Timing 29 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 30 30 31 31 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/lib_cray.f90
r3680 r6736 10 10 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt 11 11 !!---------------------------------------------------------------------- 12 SUBROUTINE lib_cray13 WRITE(*,*) 'lib_cray: You should not have seen this print! error?'14 END SUBROUTINE lib_cray15 16 12 SUBROUTINE wheneq ( i, x, j, t, ind, nn ) 17 13 IMPLICIT NONE -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/nemogcm.F90
r3769 r6736 46 46 USE mppini ! shared/distributed memory setting (mpp_init routine) 47 47 USE domain ! domain initialization (dom_init routine) 48 #if defined key_nemocice_decomp49 USE ice_domain_size, only: nx_global, ny_global50 #endif51 USE tideini ! tidal components initialization (tide_ini routine)52 48 USE obcini ! open boundary cond. initialization (obc_ini routine) 53 49 USE bdyini ! open boundary cond. initialization (bdy_init routine) 54 50 USE bdydta ! open boundary cond. initialization (bdy_dta_init routine) 55 USE bdytides ! open boundary cond. initialization ( bdytide_init routine)51 USE bdytides ! open boundary cond. initialization (tide_init routine) 56 52 USE istate ! initial state setting (istate_init routine) 57 53 USE ldfdyn ! lateral viscosity setting (ldfdyn_init routine) … … 60 56 USE phycst ! physical constant (par_cst routine) 61 57 USE trdmod ! momentum/tracers trends (trd_mod_init routine) 62 USE asminc ! assimilation increments63 58 USE asmbkg ! writing out state trajectory 64 59 USE diaptr ! poleward transports (dia_ptr_init routine) … … 67 62 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 68 63 USE step ! NEMO time-stepping (stp routine) 69 USE icbini ! handle bergs, initialisation70 USE icbstp ! handle bergs, calving, themodynamics and transport71 64 #if defined key_oasis3 72 65 USE cpl_oasis3 ! OASIS3 coupling … … 81 74 USE lib_mpp ! distributed memory computing 82 75 #if defined key_iomput 83 USE xios84 #endif 85 USE sbctide, ONLY: lk_tide76 USE mod_ioclient 77 #endif 78 USE tamtrj ! Output trajectory, needed for TAM 86 79 87 80 IMPLICIT NONE … … 126 119 ! !-----------------------! 127 120 #if defined key_agrif 128 CALL Agrif_Declare_Var_dom ! AGRIF: set the meshes for DOM 129 CALL Agrif_Declare_Var ! " " " " " DYN/TRA 121 CALL Agrif_Declare_Var ! AGRIF: set the meshes 130 122 # if defined key_top 131 CALL Agrif_Declare_Var_top ! " " " " " TOP 132 # endif 133 # if defined key_lim2 134 CALL Agrif_Declare_Var_lim2 ! " " " " " LIM 123 CALL Agrif_Declare_Var_Top ! AGRIF: set the meshes 135 124 # endif 136 125 #endif … … 171 160 #endif 172 161 173 IF( lk_diaobs ) CALL dia_obs_wri 174 ! 175 IF( ln_icebergs ) CALL icb_end( nitend ) 162 IF( lk_diaobs ) CALL dia_obs_wri 176 163 177 164 ! !------------------------! … … 194 181 ! 195 182 CALL nemo_closefile 196 #if defined key_iomput 197 CALL xios_finalize ! end mpp communications with xios 198 # if defined key_oasis3 || defined key_oasis4 183 #if defined key_oasis3 || defined key_oasis4 199 184 CALL cpl_prism_finalize ! end coupling and mpp communications with OASIS 200 # endif201 185 #else 202 # if defined key_oasis3 || defined key_oasis4203 CALL cpl_prism_finalize ! end coupling and mpp communications with OASIS204 # else205 186 IF( lk_mpp ) CALL mppstop ! end mpp communications 206 # endif207 187 #endif 208 188 ! … … 238 218 IF( Agrif_Root() ) THEN 239 219 # if defined key_oasis3 || defined key_oasis4 240 CALL cpl_prism_init( ilocal_comm ) ! nemo local communicator given by oasis 241 CALL xios_initialize( "oceanx",local_comm=ilocal_comm ) 242 # else 243 CALL xios_initialize( "nemo",return_comm=ilocal_comm ) 220 CALL cpl_prism_init( ilocal_comm ) ! nemo local communicator given by oasis 244 221 # endif 222 CALL init_ioclient( ilocal_comm ) ! exchange io_server nemo local communicator with the io_server 245 223 ENDIF 246 224 narea = mynode( cltxt, numnam, nstop, ilocal_comm ) ! Nodes selection … … 276 254 ! than variables 277 255 IF( Agrif_Root() ) THEN 256 jpi = ( jpiglo-2*jpreci + (jpni-1) ) / jpni + 2*jpreci ! first dim. 278 257 #if defined key_nemocice_decomp 279 jpi = ( nx_global+2-2*jpreci + (jpni-1) ) / jpni + 2*jpreci ! first dim. 280 jpj = ( ny_global+2-2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim. 258 jpj = ( jpjglo+1-2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim. 281 259 #else 282 jpi = ( jpiglo-2*jpreci + (jpni-1) ) / jpni + 2*jpreci ! first dim.283 260 jpj = ( jpjglo-2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim. 284 261 #endif … … 335 312 IF( ln_ctl ) CALL prt_ctl_init ! Print control 336 313 314 CALL sbc_init ! Forcings : surface module 337 315 IF( lk_obc ) CALL obc_init ! Open boundaries 338 339 CALL istate_init ! ocean initial state (Dynamics and tracers)340 341 IF( lk_tide ) CALL tide_init( nit000 ) ! Initialisation of the tidal harmonics342 343 316 IF( lk_bdy ) CALL bdy_init ! Open boundaries initialisation 344 317 IF( lk_bdy ) CALL bdy_dta_init ! Open boundaries initialisation of external data arrays 345 IF( lk_bdy ) CALL bdytide_init ! Open boundaries initialisation of tidal harmonic forcing 346 318 IF( lk_bdy ) CALL tide_init ! Open boundaries initialisation of tidal harmonic forcing 319 320 CALL flush(numout) 347 321 CALL dyn_nept_init ! simplified form of Neptune effect 322 CALL flush(numout) 323 324 CALL istate_init ! ocean initial state (Dynamics and tracers) 348 325 349 326 ! ! Ocean physics 350 CALL sbc_init ! Forcings : surface module327 351 328 ! ! Vertical physics 352 329 CALL zdf_init ! namelist read … … 383 360 ! ! Misc. options 384 361 IF( nn_cla == 1 ) CALL cla_init ! Cross Land Advection 385 CALL icb_init( rdt, nit000) ! initialise icebergs instance 386 362 387 363 #if defined key_top 388 364 ! ! Passive tracers … … 391 367 ! ! Diagnostics 392 368 IF( lk_floats ) CALL flo_init ! drifting Floats 369 CALL iom_init ! iom_put initialization 393 370 IF( lk_diaar5 ) CALL dia_ar5_init ! ar5 diag 394 371 CALL dia_ptr_init ! Poleward TRansports initialization … … 403 380 IF( lk_asminc ) CALL asm_inc_init ! Initialize assimilation increments 404 381 IF(lwp) WRITE(numout,*) 'Euler time step switch is ', neuler 382 CALL tam_trj_init ! Trajectory handling 405 383 ! 406 384 END SUBROUTINE nemo_init … … 539 517 USE ldftra_oce, ONLY: ldftra_oce_alloc 540 518 USE trc_oce , ONLY: trc_oce_alloc 541 #if defined key_diadct542 USE diadct , ONLY: diadct_alloc543 #endif544 519 ! 545 520 INTEGER :: ierr … … 555 530 ierr = ierr + lib_mpp_alloc (numout) ! mpp exchanges 556 531 ierr = ierr + trc_oce_alloc () ! shared TRC / TRA arrays 557 !558 #if defined key_diadct559 ierr = ierr + diadct_alloc () !560 #endif561 532 ! 562 533 IF( lk_mpp ) CALL mpp_sum( ierr ) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/oce.F90
r3625 r6736 47 47 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: gru , grv !: horizontal gradient of rd at bottom u-point 48 48 49 !! arrays relating to embedding ice in the ocean. These arrays need to be declared50 !! even if no ice model is required. In the no ice model or traditional levitating51 !! ice cases they contain only zeros52 !! ---------------------53 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: snwice_mass !: mass of snow and ice at current ice time step [Kg/m2]54 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: snwice_mass_b !: mass of snow and ice at previous ice time step [Kg/m2]55 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: snwice_fmass !: time evolution of mass of snow+ice [Kg/m2/s]56 57 49 !!---------------------------------------------------------------------- 58 50 !! NEMO/OPA 4.0 , NEMO Consortium (2011) … … 66 58 !! *** FUNCTION oce_alloc *** 67 59 !!---------------------------------------------------------------------- 68 INTEGER :: ierr( 3)60 INTEGER :: ierr(2) 69 61 !!---------------------------------------------------------------------- 70 62 ! … … 77 69 & rn2b (jpi,jpj,jpk) , rn2 (jpi,jpj,jpk) , STAT=ierr(1) ) 78 70 ! 79 ALLOCATE( rhd (jpi,jpj,jpk) , & 80 & rhop(jpi,jpj,jpk) , & 81 & sshb (jpi,jpj) , sshn (jpi,jpj) , ssha (jpi,jpj) , & 82 & sshu_b(jpi,jpj) , sshu_n(jpi,jpj) , sshu_a(jpi,jpj) , & 83 & sshv_b(jpi,jpj) , sshv_n(jpi,jpj) , sshv_a(jpi,jpj) , & 84 & sshf_n(jpi,jpj) , & 85 & spgu (jpi,jpj) , spgv(jpi,jpj) , & 86 & gtsu(jpi,jpj,jpts), gtsv(jpi,jpj,jpts), & 87 & gru(jpi,jpj) , grv(jpi,jpj) , STAT=ierr(2) ) 88 ! 89 ALLOCATE( snwice_mass(jpi,jpj) , snwice_mass_b(jpi,jpj), & 90 & snwice_fmass(jpi,jpj), STAT= ierr(3) ) 71 ALLOCATE(rhd (jpi,jpj,jpk) , & 72 & rhop(jpi,jpj,jpk) , & 73 & sshb (jpi,jpj) , sshn (jpi,jpj) , ssha (jpi,jpj) , & 74 & sshu_b(jpi,jpj) , sshu_n(jpi,jpj) , sshu_a(jpi,jpj) , & 75 & sshv_b(jpi,jpj) , sshv_n(jpi,jpj) , sshv_a(jpi,jpj) , & 76 & sshf_n(jpi,jpj) , & 77 & spgu (jpi,jpj) , spgv(jpi,jpj) , & 78 & gtsu(jpi,jpj,jpts), gtsv(jpi,jpj,jpts), & 79 & gru(jpi,jpj) , grv(jpi,jpj) , STAT=ierr(2) ) 91 80 ! 92 81 oce_alloc = MAXVAL( ierr ) -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/par_AMM_12km.h90
r3680 r6736 19 19 jpidta = 198, & !: first horizontal dimension > or = to jpi 20 20 jpjdta = 224, & !: second > or = to jpj 21 jpkdta = 51, & !: number of levels > or = to jpk21 jpkdta = 33, & !: number of levels > or = to jpk 22 22 ! total domain matrix size 23 23 jpiglo = jpidta, & !: first dimension of global domain --> i -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/par_oce.F90
r3294 r6736 86 86 !!--------------------------------------------------------------------- 87 87 # include "par_AMM_12km.h90" 88 #elif defined key_amm_60 89 !!--------------------------------------------------------------------- 90 !! 'key_amm_60' : regional basin : AMM60 91 !!--------------------------------------------------------------------- 92 # include "par_AMM60.h90" 93 #elif defined key_amm 94 !!--------------------------------------------------------------------- 95 !! 'key_amm' : Atlantic Margin Model (~7km) : AMM 96 !!--------------------------------------------------------------------- 97 # include "par_AMM.h90" 98 #elif defined key_NNA_r12 99 !!--------------------------------------------------------------------- 100 !! 'key_NNA_r12' : regional basin : NNA 101 !!--------------------------------------------------------------------- 102 # include "par_NNA_R12.h90" 88 103 #else 89 104 !!--------------------------------------------------------------------- -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/step.F90
r3769 r6736 30 30 !!---------------------------------------------------------------------- 31 31 USE step_oce ! time stepping definition modules 32 #if defined key_top 33 USE trcstp ! passive tracer time-stepping (trc_stp routine) 34 #endif 35 #if defined key_agrif 36 USE agrif_opa_sponge ! Momemtum and tracers sponges 37 #endif 32 38 33 39 IMPLICIT NONE … … 82 88 #endif 83 89 indic = 0 ! reset to no error condition 84 IF( kstp == nit000 ) CALL iom_init ! iom_put initialization (must be done after nemo_init for AGRIF+XIOS+OASIS)85 90 IF( kstp /= nit000 ) CALL day( kstp ) ! Calendar (day was already called at nit000 in day_init) 86 CALL iom_setkt( kstp - nit000 + 1) ! say to iom that we are at time step kstp91 CALL iom_setkt( kstp ) ! say to iom that we are at time step kstp 87 92 88 93 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 89 94 ! Update data, open boundaries, surface boundary condition (including sea-ice) 90 95 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 96 IF(lwp) WRITE(numout,*) 'bdy_dta' 97 CALL flush(numout) 98 IF( lk_bdy ) CALL bdy_dta( kstp, time_offset=+1 ) ! update dynamic and tracer data at open boundaries 99 IF(lwp) WRITE(numout,*) 'sbc' 100 CALL flush(numout) 91 101 CALL sbc ( kstp ) ! Sea Boundary Condition (including sea-ice) 92 IF( lk_tide.AND.(kstp /= nit000 )) CALL tide_init ( kstp )93 102 IF( lk_tide ) CALL sbc_tide( kstp ) 94 103 IF( lk_obc ) CALL obc_dta( kstp ) ! update dynamic and tracer data at open boundaries 95 104 IF( lk_obc ) CALL obc_rad( kstp ) ! compute phase velocities at open boundaries 96 IF( lk_bdy ) CALL bdy_dta( kstp, time_offset=+1 ) ! update dynamic and tracer data at open boundaries105 97 106 98 107 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> … … 148 157 ENDIF 149 158 ENDIF 159 CALL flush(numout) 150 160 #if defined key_traldf_c2d 151 161 IF( lk_traldf_eiv ) CALL ldf_eiv( kstp ) ! eddy induced velocity coefficient 152 162 #endif 153 #if defined key_traldf_c3d && key_traldf_smag154 CALL ldf_tra_smag( kstp ) ! eddy induced velocity coefficient155 # endif156 #if defined key_dynldf_c3d && key_dynldf_smag157 CALL ldf_dyn_smag( kstp ) ! eddy induced velocity coefficient158 # endif159 160 163 161 164 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> … … 182 185 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 183 186 tsa(:,:,:,:) = 0.e0 ! set tracer trends to zero 187 ! Saving non-linear trajectory at restart state 188 ! May not be exact for sbc and zdf parameters 189 IF( ( ln_trjhand ) .AND. ( kstp == nit000 ) ) CALL tam_trj_wri( kstp - 1 ) 184 190 185 191 IF( ln_asmiau .AND. & … … 190 196 IF( lk_trabbl ) CALL tra_bbl ( kstp ) ! advective (and/or diffusive) bottom boundary layer scheme 191 197 IF( ln_tradmp ) CALL tra_dmp ( kstp ) ! internal damping trends 192 IF( lk_bdy ) CALL bdy_tra_dmp( kstp ) ! bdy damping trends193 198 CALL tra_adv ( kstp ) ! horizontal & vertical advection 194 199 IF( lk_zdfkpp ) CALL tra_kpp ( kstp ) ! KPP non-local tracer fluxes … … 208 213 ELSE ! centered hpg (eos then time stepping) 209 214 CALL eos ( tsn, rhd, rhop ) ! now in situ density for hpg computation 215 ! CALL iom_put( 'rhop', rhop ) 216 ! CALL iom_put( 'rn2', rn2 ) 210 217 IF( ln_zps ) CALL zps_hde( kstp, jpts, tsn, gtsu, gtsv, & ! zps: now hor. derivative 211 218 & rhd, gru , grv ) ! of t, s, rd at the last ocean level … … 219 226 ua(:,:,:) = 0.e0 ! set dynamics trends to zero 220 227 va(:,:,:) = 0.e0 228 CALL flush(numout) 221 229 222 230 IF( ln_asmiau .AND. & … … 224 232 IF( ln_bkgwri ) CALL asm_bkg_wri( kstp ) ! output background fields 225 233 IF( ln_neptsimp ) CALL dyn_nept_cor( kstp ) ! subtract Neptune velocities (simplified) 226 IF( lk_bdy ) CALL bdy_dyn3d_dmp(kstp ) ! bdy damping trends227 234 CALL dyn_adv( kstp ) ! advection (vector or flux form) 228 235 CALL dyn_vor( kstp ) ! vorticity term including Coriolis 236 ! CALL iom_put( 'rotn', rotn) 229 237 CALL dyn_ldf( kstp ) ! lateral mixing 230 238 IF( ln_neptsimp ) CALL dyn_nept_cor( kstp ) ! add Neptune velocities (simplified) … … 266 274 267 275 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 276 ! Trajectory for TAM 277 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 278 279 IF( ln_trjhand ) CALL tam_trj_wri( kstp ) ! Output trajectory fields 280 281 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 268 282 ! Coupled mode 269 283 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 270 284 IF( lk_cpl ) CALL sbc_cpl_snd( kstp ) ! coupled mode : field exchanges 271 !272 #if defined key_iomput273 IF( kstp == nitend ) CALL xios_context_finalize() ! needed for XIOS+AGRIF274 #endif275 285 ! 276 286 IF( nn_timing == 1 .AND. kstp == nit000 ) CALL timing_reset -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/step_oce.F90
r3769 r6736 14 14 USE iom ! 15 15 USE lbclnk 16 USE restart ! restart17 #if defined key_iomput18 USE xios19 #endif20 16 21 17 USE daymod ! calendar (day routine) … … 59 55 60 56 USE bdy_par ! for lk_bdy 61 USE bdy_oce ! for dmp logical62 57 USE bdydta ! open boundary condition data (bdy_dta routine) 63 USE bdytra ! bdy cond. for tracers (bdy_tra routine)64 USE bdydyn3d ! bdy cond. for baroclinic vel. (bdy_dyn3d routine)65 58 66 59 USE sshwzv ! vertical velocity and ssh (ssh_wzv routine) … … 68 61 USE ldfslp ! iso-neutral slopes (ldf_slp routine) 69 62 USE ldfeiv ! eddy induced velocity coef. (ldf_eiv routine) 70 USE ldftra_smag ! Smagirinsky diffusion (ldftra_smag routine)71 USE ldfdyn_smag ! Smagorinsky viscosity (ldfdyn_smag routine)72 63 73 64 USE zdftmx ! tide-induced vertical mixing (zdf_tmx routine) … … 104 95 USE asmbkg 105 96 USE stpctl ! time stepping control (stp_ctl routine) 97 USE restart ! ocean restart (rst_wri routine) 106 98 USE prtctl ! Print control (prt_ctl routine) 107 99 … … 109 101 110 102 USE timing ! Timing 103 USE tamtrj ! Needed by TAM 111 104 112 105 #if defined key_agrif 113 106 USE agrif_opa_sponge ! Momemtum and tracers sponges 114 #endif115 #if defined key_top116 USE trcstp ! passive tracer time-stepping (trc_stp routine)117 107 #endif 118 108 !!---------------------------------------------------------------------- -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/stpctl.F90
r3294 r6736 67 67 ENDIF 68 68 69 IF(MOD(kt,10) == 0) THEN 69 70 IF(lwp) WRITE ( numstp, '(1x, i8)' ) kt !* save the current time step in numstp 70 71 IF(lwp) REWIND( numstp ) ! -------------------------- 72 ENDIF 71 73 72 74 ! !* Test maximum of velocity (zonal only) … … 74 76 !! zumax = MAXVAL( ABS( un(:,:,:) ) ) ! slower than the following loop on NEC SX5 75 77 zumax = 0.e0 78 IF(MOD(kt,10) == 0 .OR. MOD( kt, nwrite ) == 1 ) THEN 76 79 DO jk = 1, jpk 77 80 DO jj = 1, jpj … … 81 84 END DO 82 85 END DO 86 ENDIF 87 IF( zumax > 20.e0 ) THEN 88 WRITE(numout,*) ' stpctl: the zonal velocity is larger than 20 m/s in dom ', narea 89 ENDIF 90 IF(MOD(kt,10) == 0 .OR. MOD( kt, nwrite ) == 1 ) THEN 83 91 IF( lk_mpp ) CALL mpp_max( zumax ) ! max over the global domain 92 ENDIF 84 93 ! 85 94 IF( MOD( kt, nwrite ) == 1 .AND. lwp ) WRITE(numout,*) ' ==>> time-step= ',kt,' abs(U) max: ', zumax … … 102 111 WRITE(numout,*) ' output of last fields in numwso' 103 112 ENDIF 113 #if defined key_umax 104 114 kindic = -3 115 #endif 105 116 ENDIF 106 117 9400 FORMAT (' kt=',i6,' max abs(U): ',1pg11.4,', i j k: ',3i5) … … 109 120 ! ! ------------------------ 110 121 !! zsmin = MINVAL( tsn(:,:,1,jp_sal), mask = tmask(:,:,1) == 1.e0 ) slower than the following loop on NEC SX5 122 IF(MOD(kt,10) == 0 .OR. MOD( kt, nwrite ) == 1 ) THEN 111 123 zsmin = 100.e0 112 124 DO jj = 2, jpjm1 … … 116 128 END DO 117 129 IF( lk_mpp ) CALL mpp_min( zsmin ) ! min over the global domain 130 ENDIF 118 131 ! 119 132 IF( MOD( kt, nwrite ) == 1 .AND. lwp ) WRITE(numout,*) ' ==>> time-step= ',kt,' SSS min:', zsmin … … 165 178 ENDIF 166 179 ! 180 IF(MOD(kt,10) == 0 .OR. MOD( kt, nwrite ) == 1 ) THEN 167 181 zssh2 = SUM( sshn(:,:) * sshn(:,:) * tmask_i(:,:) ) 168 182 IF( lk_mpp ) CALL mpp_sum( zssh2 ) ! sum over the global domain 169 183 ! 170 184 IF(lwp) WRITE(numsol,9300) kt, zssh2, zumax, zsmin ! ssh statistics 185 ENDIF 171 186 ! 172 187 ENDIF -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/timing.F90
r3610 r6736 95 95 CALL timing_ini_var(cdinfo) 96 96 ELSE 97 s_timer => s_timer_root 97 s_timer => s_timer_root 98 98 DO WHILE( TRIM(s_timer%cname) /= TRIM(cdinfo) ) 99 99 IF( ASSOCIATED(s_timer%next) ) s_timer => s_timer%next -
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/trc_oce.F90
r3770 r6736 23 23 PUBLIC trc_oce_alloc ! function called by nemogcm.F90 24 24 25 INTEGER , PUBLIC :: nn_dttrc !: frequency of step on passive tracers 26 REAL(wp), PUBLIC :: r_si2 !: largest depth of extinction (blue & 0.01 mg.m-3) (RGB) 27 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: etot3 !: light absortion coefficient 28 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: facvol !: volume for degraded regions 29 30 #if defined key_top 31 !!---------------------------------------------------------------------- 32 !! 'key_top' bio-model 25 REAL(wp), PUBLIC :: r_si2 !: largest depth of extinction (blue & 0.01 mg.m-3) (RGB) 26 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: etot3 !: light absortion coefficient 27 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: facvol !: volume for degraded regions 28 29 #if defined key_top && defined key_pisces 30 !!---------------------------------------------------------------------- 31 !! 'key_top' & 'key_pisces' PISCES bio-model 33 32 !!---------------------------------------------------------------------- 34 33 LOGICAL, PUBLIC, PARAMETER :: lk_qsr_bio = .TRUE. !: bio-model light absorption flag
Note: See TracChangeset
for help on using the changeset viewer.